ZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbml0LnJzdCBiL0RvYy9jLWFwaS9pbml0LnJzdAppbmRleCA4MTgyM2JmLi40NjUxNDdjIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW5pdC5yc3QKKysrIGIvRG9jL2MtYXBpL2luaXQucnN0CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICB0cmlwbGU6IG1vZHVsZTsgc2VhcmNoOyBwYXRoCiAgICAgICBzaW5nbGU6IFB5U3lzX1NldEFyZ3YoKQogICAgICAgc2luZ2xlOiBQeVN5c19TZXRBcmd2RXgoKQotICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogCiAgICBJbml0aWFsaXplIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBJbiBhbiBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgIFB5dGhvbiwgdGhpcwogICAgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG90aGVyIFB5dGhvbi9DIEFQSSBmdW5jdGlvbnM7IHdpdGggdGhlCkBAIC0zNCw3ICszNCw3IEBACiAgICBtb2R1bGVzIDptb2Q6YGJ1aWx0aW5zYCwgOm1vZDpgX19tYWluX19gIGFuZCA6bW9kOmBzeXNgLiAgSXQgYWxzbyBpbml0aWFsaXplcwogICAgdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCAoYGBzeXMucGF0aGBgKS4gSXQgZG9lcyBub3Qgc2V0IGBgc3lzLmFyZ3ZgYDsgdXNlCiAgICA6YzpmdW5jOmBQeVN5c19TZXRBcmd2RXhgIGZvciB0aGF0LiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZCB0aW1lCi0gICAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBmaXJzdCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWU7IGl0IGlzIGEKKyAgICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCiAgICBmYXRhbCBlcnJvciBpZiB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuCiAKIApAQCAtNDgsMTkgKzQ4LDIwIEBACiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0lzSW5pdGlhbGl6ZWQoKQogCiAgICBSZXR1cm4gdHJ1ZSAobm9uemVybykgd2hlbiB0aGUgUHl0aG9uIGludGVycHJldGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLCBmYWxzZQotICAgKHplcm8pIGlmIG5vdC4gIEFmdGVyIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAorICAgKHplcm8pIGlmIG5vdC4gIEFmdGVyIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGlzIGNhbGxlZCwgdGhpcyByZXR1cm5zIGZhbHNlIHVudGlsCiAgICA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBpcyBjYWxsZWQgYWdhaW4uCiAKIAotLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRmluYWxpemUoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9GaW5hbGl6ZUV4KCkKIAogICAgVW5kbyBhbGwgaW5pdGlhbGl6YXRpb25zIG1hZGUgYnkgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kIHN1YnNlcXVlbnQgdXNlIG9mCiAgICBQeXRob24vQyBBUEkgZnVuY3Rpb25zLCBhbmQgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyAoc2VlCiAgICA6YzpmdW5jOmBQeV9OZXdJbnRlcnByZXRlcmAgYmVsb3cpIHRoYXQgd2VyZSBjcmVhdGVkIGFuZCBub3QgeWV0IGRlc3Ryb3llZCBzaW5jZQogICAgdGhlIGxhc3QgY2FsbCB0byA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYC4gIElkZWFsbHksIHRoaXMgZnJlZXMgYWxsIG1lbW9yeQogICAgYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBUaGlzIGlzIGEgbm8tb3Agd2hlbiBjYWxsZWQgZm9yIGEgc2Vjb25kCi0gICB0aW1lICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuCi0gICB2YWx1ZTsgZXJyb3JzIGR1cmluZyBmaW5hbGl6YXRpb24gYXJlIGlnbm9yZWQuCisgICB0aW1lICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgTm9ybWFsbHkgdGhlCisgICByZXR1cm4gdmFsdWUgaXMgMC4gIElmIHRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyBmaW5hbGl6YXRpb24KKyAgIChmbHVzaGluZyBidWZmZXJlZCBkYXRhKSwgLTEgaXMgcmV0dXJuZWQuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuICBBbiBlbWJlZGRpbmcgYXBwbGljYXRpb24KICAgIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBQeXRob24gd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCB0aGUgYXBwbGljYXRpb24gaXRzZWxmLgpAQCAtNzksNyArODAsMTUgQEAKICAgIGZyZWVkLiAgU29tZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIG1heSBub3QgYmUgZnJlZWQuICBTb21lCiAgICBleHRlbnNpb25zIG1heSBub3Qgd29yayBwcm9wZXJseSBpZiB0aGVpciBpbml0aWFsaXphdGlvbiByb3V0aW5lIGlzIGNhbGxlZCBtb3JlCiAgICB0aGFuIG9uY2U7IHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBhcHBsaWNhdGlvbiBjYWxscyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhbmQKLSAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBtb3JlIHRoYW4gb25jZS4KKyAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIG1vcmUgdGhhbiBvbmNlLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9GaW5hbGl6ZSgpCisKKyAgIFRoaXMgaXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIHRoYXQKKyAgIGRpc3JlZ2FyZHMgdGhlIHJldHVybiB2YWx1ZS4KIAogCiBQcm9jZXNzLXdpZGUgcGFyYW1ldGVycwpAQCAtMTA3LDcgKzExNiw3IEBACiAgICBOb3RlIHRoYXQgOmRhdGE6YHN5cy5zdGRlcnJgIGFsd2F5cyB1c2VzIHRoZSAiYmFja3NsYXNocmVwbGFjZSIgZXJyb3IKICAgIGhhbmRsZXIsIHJlZ2FyZGxlc3Mgb2YgdGhpcyAob3IgYW55IG90aGVyKSBzZXR0aW5nLgogCi0gICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgaXMgY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCB0byBiZSBjYWxsZWQKKyAgIElmIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGlzIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkCiAgICBhZ2FpbiBpbiBvcmRlciB0byBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscyB0byA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYC4KIAogICAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIGEgbm9uemVybyB2YWx1ZSBvbiBlcnJvciAoZS5nLiBjYWxsaW5nIGFmdGVyIHRoZQpAQCAtOTE4LDcgKzkyNyw3IEBACiAgICBlbnRyeS4pCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogUHlfSW5pdGlhbGl6ZSgpCiAKICAgIEV4dGVuc2lvbiBtb2R1bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiAoc3ViLSlpbnRlcnByZXRlcnMgYXMgZm9sbG93czogdGhlIGZpcnN0CkBAIC05MjgsNyArOTM3LDcgQEAKICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhpcyBjb3B5OyB0aGUgZXh0ZW5zaW9uJ3MgYGBpbml0YGAgZnVuY3Rpb24gaXMKICAgIG5vdCBjYWxsZWQuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGhhcHBlbnMgd2hlbiBhbiBleHRlbnNpb24gaXMKICAgIGltcG9ydGVkIGFmdGVyIHRoZSBpbnRlcnByZXRlciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlLWluaXRpYWxpemVkIGJ5IGNhbGxpbmcKLSAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBhbmQgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWA7IGluIHRoYXQgY2FzZSwgdGhlIGV4dGVuc2lvbidzCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBhbmQgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWA7IGluIHRoYXQgY2FzZSwgdGhlIGV4dGVuc2lvbidzCiAgICBgYGluaXRtb2R1bGVgYCBmdW5jdGlvbiAqaXMqIGNhbGxlZCBhZ2Fpbi4KIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IGNsb3NlKCkgKGluIG1vZHVsZSBvcykKQEAgLTkzNiwxNCArOTQ1LDE0IEBACiAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIAotICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKIAogICAgRGVzdHJveSB0aGUgKHN1Yi0paW50ZXJwcmV0ZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHRocmVhZCBzdGF0ZS4gVGhlIGdpdmVuCiAgICB0aHJlYWQgc3RhdGUgbXVzdCBiZSB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhyZWFkCiAgICBzdGF0ZXMgYmVsb3cuICBXaGVuIHRoZSBjYWxsIHJldHVybnMsIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSBpcyAqTlVMTCouICBBbGwKICAgIHRocmVhZCBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW50ZXJwcmV0ZXIgYXJlIGRlc3Ryb3llZC4gIChUaGUgZ2xvYmFsCiAgICBpbnRlcnByZXRlciBsb2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBpcyBzdGlsbCBoZWxkCi0gICB3aGVuIGl0IHJldHVybnMuKSAgOmM6ZnVuYzpgUHlfRmluYWxpemVgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CisgICB3aGVuIGl0IHJldHVybnMuKSAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgd2lsbCBkZXN0cm95IGFsbCBzdWItaW50ZXJwcmV0ZXJzIHRoYXQKICAgIGhhdmVuJ3QgYmVlbiBleHBsaWNpdGx5IGRlc3Ryb3llZCBhdCB0aGF0IHBvaW50LgogCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbnRyby5yc3QgYi9Eb2MvYy1hcGkvaW50cm8ucnN0CmluZGV4IGJjM2E3NTIuLjk1Y2JlZjUgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pbnRyby5yc3QKKysrIGIvRG9jL2MtYXBpL2ludHJvLnJzdApAQCAtNTc4LDkgKzU3OCw5IEBACiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0bwogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWApIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAgdXNlIG9mCiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBQeXRob24uICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLWJ5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0lzSW5pdGlhbGl6ZWRgIHJldHVybnMKK2J5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucwogdHJ1ZSBpZiBQeXRob24gaXMgY3VycmVudGx5IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZS4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYAordGhlc2UgZnVuY3Rpb25zIGlzIGdpdmVuIGluIGEgbGF0ZXIgY2hhcHRlci4gTm90aWNlIHRoYXQgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKIGRvZXMgKm5vdCogZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLCBlLmcuIG1lbW9yeQogYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIGN1cnJlbnRseSBjYW5ub3QgYmUgcmVsZWFzZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zeXMucnN0IGIvRG9jL2MtYXBpL3N5cy5yc3QKaW5kZXggM2Q4M2IyNy4uOWJhNjQ5NiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3N5cy5yc3QKKysrIGIvRG9jL2MtYXBpL3N5cy5yc3QKQEAgLTIxMiwyMCArMjEyLDI0IEBACiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FeGl0KGludCBzdGF0dXMpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogZXhpdCgpCiAKLSAgIEV4aXQgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgY2FsbHMgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGFuZCB0aGVuIGNhbGxzIHRoZQotICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuCisgICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGFuZCB0aGVuIGNhbGxzIHRoZQorICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YAorICAgaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUgZXhpdCBzdGF0dXMgaXMgc2V0IHRvIDEyMC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEVycm9ycyBmcm9tIGZpbmFsaXphdGlvbiBubyBsb25nZXIgaWdub3JlZC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0F0RXhpdCh2b2lkICgqZnVuYykgKCkpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogY2xlYW51cCBmdW5jdGlvbnMKIAotICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAuICBUaGUgY2xlYW51cAorICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YC4gIFRoZSBjbGVhbnVwCiAgICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBubyB2YWx1ZS4gIEF0IG1vc3QKICAgIDMyIGNsZWFudXAgZnVuY3Rpb25zIGNhbiBiZSByZWdpc3RlcmVkLiAgV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwsCiAgICA6YzpmdW5jOmBQeV9BdEV4aXRgIHJldHVybnMgYGAwYGA7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMgYGAtMWBgLiAgVGhlIGNsZWFudXAKZGlmZiAtLWdpdCBhL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdCBiL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdAppbmRleCBhY2Q2MGFlLi4xNTQ2YjFhIDEwMDY0NAotLS0gYS9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKKysrIGIvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CkBAIC02Nyw3ICs2Nyw5IEBACiAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOwogICAgICAgIFB5UnVuX1NpbXBsZVN0cmluZygiZnJvbSB0aW1lIGltcG9ydCB0aW1lLGN0aW1lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmludCgnVG9kYXkgaXMnLCBjdGltZSh0aW1lKCkpKVxuIik7Ci0gICAgICAgUHlfRmluYWxpemUoKTsKKyAgICAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICAgICBleGl0KDEyMCk7CisgICAgICAgfQogICAgICAgIFB5TWVtX1Jhd0ZyZWUocHJvZ3JhbSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CkBAIC03Niw3ICs3OCw3IEBACiA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCB0byBpbmZvcm0gdGhlIGludGVycHJldGVyIGFib3V0IHBhdGhzIHRvIFB5dGhvbiBydW4tdGltZQogbGlicmFyaWVzLiAgTmV4dCwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBpbml0aWFsaXplZCB3aXRoCiA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCwgZm9sbG93ZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhIGhhcmQtY29kZWQgUHl0aG9uIHNjcmlwdAotdGhhdCBwcmludHMgdGhlIGRhdGUgYW5kIHRpbWUuICBBZnRlcndhcmRzLCB0aGUgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGNhbGwgc2h1dHMKK3RoYXQgcHJpbnRzIHRoZSBkYXRlIGFuZCB0aW1lLiAgQWZ0ZXJ3YXJkcywgdGhlIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGNhbGwgc2h1dHMKIHRoZSBpbnRlcnByZXRlciBkb3duLCBmb2xsb3dlZCBieSB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLiAgSW4gYSByZWFsIHByb2dyYW0sCiB5b3UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBQeXRob24gc2NyaXB0IGZyb20gYW5vdGhlciBzb3VyY2UsIHBlcmhhcHMgYSB0ZXh0LWVkaXRvcgogcm91dGluZSwgYSBmaWxlLCBvciBhIGRhdGFiYXNlLiAgR2V0dGluZyB0aGUgUHl0aG9uIGNvZGUgZnJvbSBhIGZpbGUgY2FuIGJldHRlcgpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdCBiL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKaW5kZXggNTEwZDFkNC4uOWMxMTFiNCAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdAorKysgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CkBAIC01NDcsNyArNTQ3LDggQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAicHJvZy5weSIsIGxpbmUgMTEsIGluIDxtb2R1bGU+CiAgICAgICAgaWYgYXJncy52ZXJib3NpdHkgPj0gMjoKLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IE5vbmVUeXBlKCkgPj0gaW50KCkKKyAgIFR5cGVFcnJvcjogJz49JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdOb25lVHlwZScgYW5kICdpbnQnCisKIAogKiBGaXJzdCBvdXRwdXQgd2VudCB3ZWxsLCBhbmQgZml4ZXMgdGhlIGJ1ZyB3ZSBoYWQgYmVmb3JlLgogICBUaGF0IGlzLCB3ZSB3YW50IGFueSB2YWx1ZSA+PSAyIHRvIGJlIGFzIHZlcmJvc2UgYXMgcG9zc2libGUuCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCmluZGV4IDk4NmQ2NzAuLmVhZDdiZGQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCisrKyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCkBAIC02Myw2ICs2Myw4IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgXCIlc1wiXG4iLCBhcmd2WzFdKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDEyMDsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QgYi9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKaW5kZXggZmYyYmRkYS4uNjMyZWNmNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdApAQCAtNTIsMTMgKzUyLDE0IEBACiAgICB0aGFuIG9uZSBsaW5lIG1heSBiZSBwYXNzZWQgYXQgYSB0aW1lLgogCiAKLS4uIGZ1bmN0aW9uOjogYjJhX2Jhc2U2NChkYXRhKQorLi4gZnVuY3Rpb246OiBiMmFfYmFzZTY0KGRhdGEsIFwqLCBuZXdsaW5lPVRydWUpCiAKICAgIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gYSBsaW5lIG9mIEFTQ0lJIGNoYXJhY3RlcnMgaW4gYmFzZTY0IGNvZGluZy4gVGhlIHJldHVybgotICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIuICBUaGUgbmV3bGluZSBpcwotICAgYWRkZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgdXNlIGNhc2UgZm9yIHRoaXMgZnVuY3Rpb24gd2FzIHRvIGZlZWQgaXQgYQotICAgc2VyaWVzIG9mIDU3IGJ5dGUgaW5wdXQgbGluZXMgdG8gZ2V0IG91dHB1dCBsaW5lcyB0aGF0IGNvbmZvcm0gdG8gdGhlCi0gICBNSU1FLWJhc2U2NCBzdGFuZGFyZC4gIE90aGVyd2lzZSB0aGUgb3V0cHV0IGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIgaWYgKm5ld2xpbmUqIGlzCisgICB0cnVlLiAgVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICpuZXdsaW5lKiBwYXJhbWV0ZXIuCiAKIAogLi4gZnVuY3Rpb246OiBhMmJfcXAoZGF0YSwgaGVhZGVyPUZhbHNlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0IGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CmluZGV4IDAwZDI5MTYuLmQzYjAyNWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKQEAgLTk1NSw2ICs5NTUsOSBAQAogICAgICAgY29uc3RydWN0b3IgdGhhdCBpcyBjb252ZW5pZW50IGZvciB1c2UgY2FzZXMgd2hlcmUgbmFtZWQgdHVwbGVzIGFyZSBiZWluZwogICAgICAgc3ViY2xhc3NlZC4KIAorICAgICogOm1ldGg6YHR5cGVzLlNpbXBsZU5hbWVzcGFjZWAgZm9yIGEgbXV0YWJsZSBuYW1lc3BhY2UgYmFzZWQgb24gYW4gdW5kZXJseWluZworICAgICAgZGljdGlvbmFyeSBpbnN0ZWFkIG9mIGEgdHVwbGUuCisKIAogOmNsYXNzOmBPcmRlcmVkRGljdGAgb2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAppbmRleCBjNTczNmYyLi42NzljMmI0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdApAQCAtMTAzLDcgKzEwMyw4IEBACiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfZGlyKGRpciwgbWF4bGV2ZWxzPTEwLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xLCB3b3JrZXJzPTEpCiAKICAgIFJlY3Vyc2l2ZWx5IGRlc2NlbmQgdGhlIGRpcmVjdG9yeSB0cmVlIG5hbWVkIGJ5ICpkaXIqLCBjb21waWxpbmcgYWxsIDpmaWxlOmAucHlgCi0gICBmaWxlcyBhbG9uZyB0aGUgd2F5LgorICAgZmlsZXMgYWxvbmcgdGhlIHdheS4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBhbGwgdGhlIGZpbGVzIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwKKyAgIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KIAogICAgVGhlICptYXhsZXZlbHMqIHBhcmFtZXRlciBpcyB1c2VkIHRvIGxpbWl0IHRoZSBkZXB0aCBvZiB0aGUgcmVjdXJzaW9uOyBpdAogICAgZGVmYXVsdHMgdG8gYGAxMGBgLgpAQCAtMTU1LDcgKzE1Niw4IEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9maWxlKGZ1bGxuYW1lLCBkZGlyPU5vbmUsIGZvcmNlPUZhbHNlLCByeD1Ob25lLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xKQogCi0gICBDb21waWxlIHRoZSBmaWxlIHdpdGggcGF0aCAqZnVsbG5hbWUqLgorICAgQ29tcGlsZSB0aGUgZmlsZSB3aXRoIHBhdGggKmZ1bGxuYW1lKi4gUmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiB0aGUgZmlsZQorICAgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgYSBmYWxzZSB2YWx1ZSBvdGhlcndpc2UuCiAKICAgIElmICpkZGlyKiBpcyBnaXZlbiwgaXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGJlaW5nIGNvbXBpbGVkCiAgICBmb3IgdXNlIGluIGNvbXBpbGF0aW9uIHRpbWUgdHJhY2ViYWNrcywgYW5kIGlzIGFsc28gY29tcGlsZWQgaW4gdG8gdGhlCkBAIC0xOTEsOCArMTkzLDEwIEBACiAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPVRydWUsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwgbGVnYWN5PUZhbHNlLCBvcHRpbWl6ZT0tMSkKIAotICAgQnl0ZS1jb21waWxlIGFsbCB0aGUgOmZpbGU6YC5weWAgZmlsZXMgZm91bmQgYWxvbmcgYGBzeXMucGF0aGBgLiBJZgotICAgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKKyAgIEJ5dGUtY29tcGlsZSBhbGwgdGhlIDpmaWxlOmAucHlgIGZpbGVzIGZvdW5kIGFsb25nIGBgc3lzLnBhdGhgYC4gUmV0dXJuIGEKKyAgIHRydWUgdmFsdWUgaWYgYWxsIHRoZSBmaWxlcyBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KKworICAgSWYgKnNraXBfY3VyZGlyKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBub3QgaW5jbHVkZWQKICAgIGluIHRoZSBzZWFyY2guICBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSA6ZnVuYzpgY29tcGlsZV9kaXJgCiAgICBmdW5jdGlvbi4gIE5vdGUgdGhhdCB1bmxpa2UgdGhlIG90aGVyIGNvbXBpbGUgZnVuY3Rpb25zLCBgYG1heGxldmVsc2BgCiAgICBkZWZhdWx0cyB0byBgYDBgYC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NyeXB0LnJzdCBiL0RvYy9saWJyYXJ5L2NyeXB0LnJzdAppbmRleCBiNGM5MGNkLi4wNGZmZGIyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY3J5cHQucnN0CkBAIC02NCw3ICs2NCw3IEBACiAKICAgIEEgbGlzdCBvZiBhdmFpbGFibGUgcGFzc3dvcmQgaGFzaGluZyBhbGdvcml0aG1zLCBhcwogICAgYGBjcnlwdC5NRVRIT0RfKmBgIG9iamVjdHMuICBUaGlzIGxpc3QgaXMgc29ydGVkIGZyb20gc3Ryb25nZXN0IHRvCi0gICB3ZWFrZXN0LCBhbmQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IGBgY3J5cHQuTUVUSE9EX0NSWVBUYGAuCisgICB3ZWFrZXN0LgogCiAKIE1vZHVsZSBGdW5jdGlvbnMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdCBiL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdAppbmRleCA5NzZjZDQ5Li5jZjVkNWI4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CkBAIC0xNzM0LDEwICsxNzM0LDcgQEAKICAgb3RoZXJ3aXNlIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KIAogICBUaGUgKm5hbWUqIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkIGl0IG11c3QgYmUgYSBzdHJpbmcgdGhhdAotICBpcyB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYGB0em5hbWUoZHQpYGAgbWV0aG9kLiAgT3RoZXJ3aXNlLAotICBgYHR6bmFtZShkdClgYCByZXR1cm5zIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKLSAgYGBvZmZzZXQubWludXRlc2BgIHJlc3BlY3RpdmVseS4KKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGRhdGV0aW1lLnR6bmFtZWAgbWV0aG9kLgogCiAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCkBAIC0xNzUwLDExICsxNzQ3LDE5IEBACiAKIC4uIG1ldGhvZDo6IHRpbWV6b25lLnR6bmFtZShkdCkKIAotICBSZXR1cm4gdGhlIGZpeGVkIHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YHRpbWV6b25lYCBpbnN0YW5jZSBpcwotICBjb25zdHJ1Y3RlZCBvciBhIHN0cmluZyAnVVRDc0hIOk1NJywgd2hlcmUgcyBpcyB0aGUgc2lnbiBvZgotICAqb2Zmc2V0KiwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCisgIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlCisgIGlzIGNvbnN0cnVjdGVkLiAgSWYgKm5hbWUqIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZQorICBuYW1lIHJldHVybmVkIGJ5IGBgdHpuYW1lKGR0KWBgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUKKyAgYGBvZmZzZXRgYCBhcyBmb2xsb3dzLiAgSWYgKm9mZnNldCogaXMgYGB0aW1lZGVsdGEoMClgYCwgdGhlIG5hbWUKKyAgaXMgIlVUQyIsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZyAnVVRDwrFISDpNTScsIHdoZXJlIMKxIGlzIHRoZSBzaWduCisgIG9mIGBgb2Zmc2V0YGAsIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAogICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgogCisgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgIE5hbWUgZ2VuZXJhdGVkIGZyb20gYGBvZmZzZXQ9dGltZWRlbHRhKDApYGAgaXMgbm93IHBsYWluICdVVEMnLCBub3QKKyAgICAgJ1VUQyswMDowMCcuCisKKwogLi4gbWV0aG9kOjogdGltZXpvbmUuZHN0KGR0KQogCiAgIEFsd2F5cyByZXR1cm5zIGBgTm9uZWBgLgpAQCAtMTkwNCw2ICsxOTA5LDM0IEBACiB8IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiAKK1NldmVyYWwgYWRkaXRpb25hbCBkaXJlY3RpdmVzIG5vdCByZXF1aXJlZCBieSB0aGUgQzg5IHN0YW5kYXJkIGFyZSBpbmNsdWRlZCBmb3IKK2NvbnZlbmllbmNlLiBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBjb3JyZXNwb25kIHRvIElTTyA4NjAxIGRhdGUgdmFsdWVzLiBUaGVzZQorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyB3aGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cmZ0aW1lYAorbWV0aG9kLiBUaGUgSVNPIDg2MDEgeWVhciBhbmQgSVNPIDg2MDEgd2VlayBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlCit3aXRoIHRoZSB5ZWFyIGFuZCB3ZWVrIG51bWJlciBkaXJlY3RpdmVzIGFib3ZlLiBDYWxsaW5nIDptZXRoOmBzdHJwdGltZWAgd2l0aAoraW5jb21wbGV0ZSBvciBhbWJpZ3VvdXMgSVNPIDg2MDEgZGlyZWN0aXZlcyB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuCisKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgRGlyZWN0aXZlIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICB8IE5vdGVzIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PSsKK3wgYGAlR2BgICAgIHwgSVNPIDg2MDEgeWVhciB3aXRoIGNlbnR1cnkgICAgIHwgMDAwMSwgMDAwMiwgLi4uLCAyMDEzLCB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgcmVwcmVzZW50aW5nIHRoZSB5ZWFyIHRoYXQgICAgIHwgMjAxNCwgLi4uLCA5OTk4LCA5OTk5ICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgY29udGFpbnMgdGhlIGdyZWF0ZXIgcGFydCBvZiAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIElTTyB3ZWVrIChgYCVWYGApLiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAldWBgICAgIHwgSVNPIDg2MDEgd2Vla2RheSBhcyBhIGRlY2ltYWwgIHwgMSwgMiwgLi4uLCA3ICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdoZXJlIDEgaXMgTW9uZGF5LiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAlVmBgICAgIHwgSVNPIDg2MDEgd2VlayBhcyBhIGRlY2ltYWwgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdpdGggTW9uZGF5IGFzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgV2VlayAwMSBpcyB0aGUgd2VlayBjb250YWluaW5nIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgSmFuIDQuICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgIHdlcmUgYWRkZWQuCisKIE5vdGVzOgogCiAoMSkKQEAgLTE5NjgsNyArMjAwMSwxNCBAQAogCiAoNykKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgYGAlVWBgIGFuZCBgYCVXYGAgYXJlIG9ubHkgdXNlZAotICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlIHNwZWNpZmllZC4KKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBjYWxlbmRhciB5ZWFyIChgYCVZYGApCisgICBhcmUgc3BlY2lmaWVkLgorCisoOCkKKyAgIFNpbWlsYXIgdG8gYGAlVWBgIGFuZCBgYCVXYGAsIGBgJVZgYCBpcyBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlCisgICBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBJU08geWVhciAoYGAlR2BgKSBhcmUgc3BlY2lmaWVkIGluIGEKKyAgIDptZXRoOmBzdHJwdGltZWAgZm9ybWF0IHN0cmluZy4gQWxzbyBub3RlIHRoYXQgYGAlR2BgIGFuZCBgYCVZYGAgYXJlIG5vdAorICAgaW50ZXJjaGFuZ2FibGUuCiAKIC4uIHJ1YnJpYzo6IEZvb3Rub3RlcwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kZWNpbWFsLnJzdCBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CmluZGV4IDJkZTBlYTAuLjE0MzU2YWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CkBAIC00NDgsNiArNDQ4LDE5IEBACiAgICAgICBgYERlY2ltYWwoJzMyMWUrNScpLmFkanVzdGVkKClgYCByZXR1cm5zIHNldmVuLiAgVXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlCiAgICAgICBwb3NpdGlvbiBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCB3aXRoIHJlc3BlY3QgdG8gdGhlIGRlY2ltYWwgcG9pbnQuCiAKKyAgIC4uIG1ldGhvZDo6IGFzX2ludGVnZXJfcmF0aW8oKQorCisgICAgICBSZXR1cm4gYSBwYWlyIGBgKG4sIGQpYGAgb2YgaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGdpdmVuCisgICAgICA6Y2xhc3M6YERlY2ltYWxgIGluc3RhbmNlIGFzIGEgZnJhY3Rpb24sIGluIGxvd2VzdCB0ZXJtcyBhbmQKKyAgICAgIHdpdGggYSBwb3NpdGl2ZSBkZW5vbWluYXRvcjo6CisKKyAgICAgICAgICA+Pj4gRGVjaW1hbCgnLTMuMTQnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgICAoLTE1NywgNTApCisKKyAgICAgIFRoZSBjb252ZXJzaW9uIGlzIGV4YWN0LiAgUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBWYWx1ZUVycm9yCisgICAgICBvbiBOYU5zLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogICAgLi4gbWV0aG9kOjogYXNfdHVwbGUoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kaXMucnN0IGIvRG9jL2xpYnJhcnkvZGlzLnJzdAppbmRleCAxYmNiM2E0Li43MjIyNjM2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kaXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Rpcy5yc3QKQEAgLTk4OSw2ICs5ODksMjggQEAKICAgIGFyZ3VtZW50cy4KIAogCisuLiBvcGNvZGU6OiBGT1JNQVRfVkFMVUUgKGZsYWdzKQorCisgICBVc2VkIGZvciBpbXBsZW1lbnRpbmcgZm9ybWF0dGVkIGxpdGVyYWwgc3RyaW5ncyAoZi1zdHJpbmdzKS4gIFBvcHMKKyAgIGFuIG9wdGlvbmFsICpmbXRfc3BlYyogZnJvbSB0aGUgc3RhY2ssIHRoZW4gYSByZXF1aXJlZCAqdmFsdWUqLgorICAgKmZsYWdzKiBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwMGBgOiAqdmFsdWUqIGlzIGZvcm1hdHRlZCBhcy1pcy4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAxYGA6IGNhbGwgOmZ1bmM6YHN0cmAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAyYGA6IGNhbGwgOmZ1bmM6YHJlcHJgIG9uICp2YWx1ZSogYmVmb3JlCisgICAgIGZvcm1hdHRpbmcgaXQuCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwM2BgOiBjYWxsIDpmdW5jOmBhc2NpaWAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDA0KSA9PSAweDA0YGA6IHBvcCAqZm10X3NwZWMqIGZyb20gdGhlIHN0YWNrIGFuZCB1c2UKKyAgICAgaXQsIGVsc2UgdXNlIGFuIGVtcHR5ICpmbXRfc3BlYyouCisKKyAgIEZvcm1hdHRpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIDpjOmZ1bmM6YFB5T2JqZWN0X0Zvcm1hdGAuICBUaGUKKyAgIHJlc3VsdCBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAuLiBvcGNvZGU6OiBIQVZFX0FSR1VNRU5UCiAKICAgIFRoaXMgaXMgbm90IHJlYWxseSBhbiBvcGNvZGUuICBJdCBpZGVudGlmaWVzIHRoZSBkaXZpZGluZyBsaW5lIGJldHdlZW4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VudW0ucnN0IGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKaW5kZXggODFmOTdiMy4uYTc2ZjVhMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW51bS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgID4+PiBDb2xvci5yZWQgPCBDb2xvci5ibHVlCiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KLSAgICBUeXBlRXJyb3I6IHVub3JkZXJhYmxlIHR5cGVzOiBDb2xvcigpIDwgQ29sb3IoKQorICAgIFR5cGVFcnJvcjogJzwnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJ0NvbG9yJyBhbmQgJ0NvbG9yJwogCiBFcXVhbGl0eSBjb21wYXJpc29ucyBhcmUgZGVmaW5lZCB0aG91Z2g6OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0IGIvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdAppbmRleCAwMmIwYTExLi5kODAwODM1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKQEAgLTkyMSw2ICs5MjEsMTAgQEAKICAgICAgIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgd2hlcmUKICAgICAgIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb2FkIGlzIG9wdGlvbmFsLgogCisgICAgICAuLiBkZXByZWNhdGVkOjogMy42CisKKyAgICAgICAgIFVzZSA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGluc3RlYWQuCisKIAogLi4gY2xhc3M6OiBTb3VyY2VsZXNzRmlsZUxvYWRlcihmdWxsbmFtZSwgcGF0aCkKIApAQCAtOTYwLDYgKzk2NCwxMCBAQAogICAgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB3aGVyZQogICAgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgaXMgb3B0aW9uYWwuCiAKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKworICAgICAgVXNlIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgaW5zdGVhZC4KKwogCiAuLiBjbGFzczo6IEV4dGVuc2lvbkZpbGVMb2FkZXIoZnVsbG5hbWUsIHBhdGgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0IGIvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKaW5kZXggMjNlNTU5Yy4uODA0NWQ4NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKQEAgLTIzNCwyNCArMjM0LDYgQEAKICAgICAgIGxpc3RlZCBpbiB0aGUgbWV0YWNsYXNzJyBjdXN0b20gOm1ldGg6YF9fZGlyX19gLgogCiAKLS4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlaW5mbyhwYXRoKQotCi0gICBSZXR1cm5zIGEgOnRlcm06YG5hbWVkIHR1cGxlYCBgYE1vZHVsZUluZm8obmFtZSwgc3VmZml4LCBtb2RlLCBtb2R1bGVfdHlwZSlgYAotICAgb2YgdmFsdWVzIHRoYXQgZGVzY3JpYmUgaG93IFB5dGhvbiB3aWxsIGludGVycHJldCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5Ci0gICAqcGF0aCogaWYgaXQgaXMgYSBtb2R1bGUsIG9yIGBgTm9uZWBgIGlmIGl0IHdvdWxkIG5vdCBiZSBpZGVudGlmaWVkIGFzIGEKLSAgIG1vZHVsZS4gIEluIHRoYXQgdHVwbGUsICpuYW1lKiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgdGhlIG5hbWUgb2YKLSAgIGFueSBlbmNsb3NpbmcgcGFja2FnZSwgKnN1ZmZpeCogaXMgdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlIGZpbGUgbmFtZSAod2hpY2gKLSAgIG1heSBub3QgYmUgYSBkb3QtZGVsaW1pdGVkIGV4dGVuc2lvbiksICptb2RlKiBpcyB0aGUgOmZ1bmM6YG9wZW5gIG1vZGUgdGhhdAotICAgd291bGQgYmUgdXNlZCAoYGAncidgYCBvciBgYCdyYidgYCksIGFuZCAqbW9kdWxlX3R5cGUqIGlzIGFuIGludGVnZXIgZ2l2aW5nCi0gICB0aGUgdHlwZSBvZiB0aGUgbW9kdWxlLiAgKm1vZHVsZV90eXBlKiB3aWxsIGhhdmUgYSB2YWx1ZSB3aGljaCBjYW4gYmUKLSAgIGNvbXBhcmVkIHRvIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgOm1vZDpgaW1wYCBtb2R1bGU7IHNlZSB0aGUKLSAgIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG1vZHVsZSB0eXBlcy4KLQotICAgLi4gZGVwcmVjYXRlZDo6IDMuMwotICAgICAgWW91IG1heSBjaGVjayB0aGUgZmlsZSBwYXRoJ3Mgc3VmZml4IGFnYWluc3QgdGhlIHN1cHBvcnRlZCBzdWZmaXhlcwotICAgICAgbGlzdGVkIGluIDptb2Q6YGltcG9ydGxpYi5tYWNoaW5lcnlgIHRvIGluZmVyIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotCi0KIC4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlbmFtZShwYXRoKQogCiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBuYW1lZCBieSB0aGUgZmlsZSAqcGF0aCosIHdpdGhvdXQgaW5jbHVkaW5nIHRoZQpAQCAtMjY1LDggKzI0Nyw3IEBACiAgICBzdGlsbCByZXR1cm4gYGBOb25lYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgIHJhdGhlciB0aGFuIHRoZQotICAgICAgZGVwcmVjYXRlZCA6ZnVuYzpgZ2V0bW9kdWxlaW5mb2AuCisgICAgICBUaGUgZnVuY3Rpb24gaXMgYmFzZWQgZGlyZWN0bHkgb24gOm1vZDpgaW1wb3J0bGliYC4KIAogCiAuLiBmdW5jdGlvbjo6IGlzbW9kdWxlKG9iamVjdCkKQEAgLTgxNSwyNCArNzk2LDYgQEAKICAgIGNsYXNzZXMgdXNpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIHdpbGwgYXBwZWFyIG11bHRpcGxlCiAgICB0aW1lcy4KIAotCi0uLiBmdW5jdGlvbjo6IGdldGFyZ3NwZWMoZnVuYykKLQotICAgR2V0IHRoZSBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgb2YgYSBQeXRob24gZnVuY3Rpb24ncyBhcmd1bWVudHMuIEEKLSAgIDp0ZXJtOmBuYW1lZCB0dXBsZWAgYGBBcmdTcGVjKGFyZ3MsIHZhcmFyZ3MsIGtleXdvcmRzLCBkZWZhdWx0cylgYCBpcwotICAgcmV0dXJuZWQuICphcmdzKiBpcyBhIGxpc3Qgb2YgdGhlIGFyZ3VtZW50IG5hbWVzLiAqdmFyYXJncyogYW5kICprZXl3b3JkcyoKLSAgIGFyZSB0aGUgbmFtZXMgb2YgdGhlIGBgKmBgIGFuZCBgYCoqYGAgYXJndW1lbnRzIG9yIGBgTm9uZWBgLiAqZGVmYXVsdHMqIGlzIGEKLSAgIHR1cGxlIG9mIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIG9yIGBgTm9uZWBgIGlmIHRoZXJlIGFyZSBubyBkZWZhdWx0Ci0gICBhcmd1bWVudHM7IGlmIHRoaXMgdHVwbGUgaGFzICpuKiBlbGVtZW50cywgdGhleSBjb3JyZXNwb25kIHRvIHRoZSBsYXN0Ci0gICAqbiogZWxlbWVudHMgbGlzdGVkIGluICphcmdzKi4KLQotICAgLi4gZGVwcmVjYXRlZDo6IDMuMAotICAgICAgVXNlIDpmdW5jOmBzaWduYXR1cmVgIGFuZAotICAgICAgOnJlZjpgU2lnbmF0dXJlIE9iamVjdCA8aW5zcGVjdC1zaWduYXR1cmUtb2JqZWN0PmAsIHdoaWNoIHByb3ZpZGUgYQotICAgICAgYmV0dGVyIGludHJvc3BlY3RpbmcgQVBJIGZvciBjYWxsYWJsZXMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVtb3ZlZAotICAgICAgaW4gUHl0aG9uIDMuNi4KLQotCiAuLiBmdW5jdGlvbjo6IGdldGZ1bGxhcmdzcGVjKGZ1bmMpCiAKICAgIEdldCB0aGUgbmFtZXMgYW5kIGRlZmF1bHQgdmFsdWVzIG9mIGEgUHl0aG9uIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLiAgQQpAQCAtODQ5LDggKzgxMiw2IEBACiAgICBmcm9tIGt3b25seWFyZ3MgdG8gZGVmYXVsdHMuICAqYW5ub3RhdGlvbnMqIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50CiAgICBuYW1lcyB0byBhbm5vdGF0aW9ucy4KIAotICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gOmZ1bmM6YGdldGFyZ3NwZWNgLgotCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3cgYmFzZWQgb24gOmZ1bmM6YHNpZ25hdHVyZWAsIGJ1dCBzdGlsbCBpZ25vcmVzCiAgICAgICBgYF9fd3JhcHBlZF9fYGAgYXR0cmlidXRlcyBhbmQgaW5jbHVkZXMgdGhlIGFscmVhZHkgYm91bmQgZmlyc3QKQEAgLTg3OSw3ICs4NDAsNyBAQAogLi4gZnVuY3Rpb246OiBmb3JtYXRhcmdzcGVjKGFyZ3NbLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm5vdGF0aW9uc1ssIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBmb3JtYXRyZXR1cm5zLCBmb3JtYXRhbm5vdGF0aW9uc11dKQogCiAgICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgIDpmdW5jOmBnZXRhcmdzcGVjYCBvciA6ZnVuYzpgZ2V0ZnVsbGFyZ3NwZWNgLgorICAgOmZ1bmM6YGdldGZ1bGxhcmdzcGVjYC4KIAogICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGBgYXJnc2BgLCBgYHZhcmFyZ3NgYCwgYGB2YXJrd2BgLAogICAgYGBkZWZhdWx0c2BgLCBgYGt3b25seWFyZ3NgYCwgYGBrd29ubHlkZWZhdWx0c2BgLCBgYGFubm90YXRpb25zYGApLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAppbmRleCAwZWRjOTQyLi40NDZhMDcwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdApAQCAtMTYyLDExICsxNjIsMTkgQEAKICAgIGZpcnN0IGNhbGwgdG8gOm1ldGg6YGVtaXRgLiAgQnkgZGVmYXVsdCwgdGhlIGZpbGUgZ3Jvd3MgaW5kZWZpbml0ZWx5LgogCiAKKyAgIC4uIG1ldGhvZDo6IHJlb3BlbklmTmVlZGVkKCkKKworICAgICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMgY2hhbmdlZC4gIElmIGl0IGhhcywgdGhlIGV4aXN0aW5nIHN0cmVhbSBpcworICAgICAgZmx1c2hlZCBhbmQgY2xvc2VkIGFuZCB0aGUgZmlsZSBvcGVuZWQgYWdhaW4sIHR5cGljYWxseSBhcyBhIHByZWN1cnNvciB0bworICAgICAgb3V0cHV0dGluZyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAgICAuLiBtZXRob2Q6OiBlbWl0KHJlY29yZCkKIAotICAgICAgT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBidXQgZmlyc3QgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMKLSAgICAgIGNoYW5nZWQuICBJZiBpdCBoYXMsIHRoZSBleGlzdGluZyBzdHJlYW0gaXMgZmx1c2hlZCBhbmQgY2xvc2VkIGFuZCB0aGUKLSAgICAgIGZpbGUgb3BlbmVkIGFnYWluLCBiZWZvcmUgb3V0cHV0dGluZyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLgorICAgICAgT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBidXQgZmlyc3QgY2FsbHMgOm1ldGg6YHJlb3BlbklmTmVlZGVkYCB0bworICAgICAgcmVvcGVuIHRoZSBmaWxlIGlmIGl0IGhhcyBjaGFuZ2VkLgogCiAuLiBfYmFzZS1yb3RhdGluZy1oYW5kbGVyOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0IGIvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdAppbmRleCA4NTc1ZmI1Li4yMDM4NWYzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CisrKyBiL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKQEAgLTg2OCw4ICs4NjgsMTMgQEAKIAogLi4gZnVuY3Rpb246OiBjcHVfY291bnQoKQogCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uICBNYXkgcmFpc2UKLSAgIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgLgorICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtLgorCisgICBUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW4KKyAgIHVzZS4gIFRoZSBudW1iZXIgb2YgdXNhYmxlIENQVXMgY2FuIGJlIG9idGFpbmVkIHdpdGgKKyAgIGBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgCisKKyAgIE1heSByYWlzZSA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYC4KIAogICAgLi4gc2VlYWxzbzo6CiAgICAgICA6ZnVuYzpgb3MuY3B1X2NvdW50YApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3MucnN0IGIvRG9jL2xpYnJhcnkvb3MucnN0CmluZGV4IDE0NGQ5YjIuLjM3M2NhZmMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9vcy5yc3QKQEAgLTM1OTcsNiArMzU5NywxMSBAQAogCiAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uIFJldHVybnMgTm9uZSBpZiB1bmRldGVybWluZWQuCiAKKyAgIFRoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgorICAgdXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorICAgYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKKworCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wYXRobGliLnJzdCBiL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CmluZGV4IDJmMDY1NDQuLmZmNTE5NmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0CkBAIC0xOTUsNyArMTk1LDcgQEAKICAgID4+PiBQdXJlV2luZG93c1BhdGgoJ2ZvbycpIDwgUHVyZVBvc2l4UGF0aCgnZm9vJykKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IFB1cmVXaW5kb3dzUGF0aCgpIDwgUHVyZVBvc2l4UGF0aCgpCisgICBUeXBlRXJyb3I6ICc8JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdQdXJlV2luZG93c1BhdGgnIGFuZCAnUHVyZVBvc2l4UGF0aCcKIAogCiBPcGVyYXRvcnMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QgYi9Eb2MvbGlicmFyeS9waWNrbGUucnN0CmluZGV4IDdlMDliMDMuLjI0MTkyNzcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGlja2xlLnJzdApAQCAtNDg4LDcgKzQ4OCw3IEBACiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldG5ld2FyZ3NfZXhfXygpCiAKLSAgIEluIHByb3RvY29scyA0IGFuZCBuZXdlciwgY2xhc3NlcyB0aGF0IGltcGxlbWVudHMgdGhlCisgICBJbiBwcm90b2NvbHMgMiBhbmQgbmV3ZXIsIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnRzIHRoZQogICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBtZXRob2QgY2FuIGRpY3RhdGUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gdGhlCiAgICA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4gIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSBwYWlyCiAgICBgYChhcmdzLCBrd2FyZ3MpYGAgd2hlcmUgKmFyZ3MqIGlzIGEgdHVwbGUgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKQEAgLTUwMCwxNSArNTAwLDIyIEBACiAgICBjbGFzcyByZXF1aXJlcyBrZXl3b3JkLW9ubHkgYXJndW1lbnRzLiAgT3RoZXJ3aXNlLCBpdCBpcyByZWNvbW1lbmRlZCBmb3IKICAgIGNvbXBhdGliaWxpdHkgdG8gaW1wbGVtZW50IDptZXRoOmBfX2dldG5ld2FyZ3NfX2AuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzIG5vdyB1c2VkIGluIHByb3RvY29scyAyIGFuZCAzLgorCiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldG5ld2FyZ3NfXygpCiAKLSAgIFRoaXMgbWV0aG9kIHNlcnZlIGEgc2ltaWxhciBwdXJwb3NlIGFzIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgYnV0Ci0gICBmb3IgcHJvdG9jb2xzIDIgYW5kIG5ld2VyLiAgSXQgbXVzdCByZXR1cm4gYSB0dXBsZSBvZiBhcmd1bWVudHMgYGBhcmdzYGAKLSAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4KKyAgIFRoaXMgbWV0aG9kIHNlcnZlIGEgc2ltaWxhciBwdXJwb3NlIGFzIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AsIGJ1dAorICAgc3VwcG9ydHMgb25seSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEl0IG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgYXJndW1lbnRzCisgICBgYGFyZ3NgYCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuCiAKLSAgIEluIHByb3RvY29scyA0IGFuZCBuZXdlciwgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYKLSAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMgZGVmaW5lZC4KKyAgIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2lsbCBub3QgYmUgY2FsbGVkIGlmIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMKKyAgIGRlZmluZWQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBCZWZvcmUgUHl0aG9uIDMuNiwgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3YXMgY2FsbGVkIGluc3RlYWQgb2YKKyAgICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaW4gcHJvdG9jb2xzIDIgYW5kIDMuCiAKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0c3RhdGVfXygpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zeXMucnN0IGIvRG9jL2xpYnJhcnkvc3lzLnJzdAppbmRleCAzNmU4ZWU0Li4zNDk0N2Y4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zeXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N5cy5yc3QKQEAgLTI1NSw3ICsyNTUsNyBAQAogICAgKGRlZmF1bHRpbmcgdG8gemVybyksIG9yIGFub3RoZXIgdHlwZSBvZiBvYmplY3QuICBJZiBpdCBpcyBhbiBpbnRlZ2VyLCB6ZXJvCiAgICBpcyBjb25zaWRlcmVkICJzdWNjZXNzZnVsIHRlcm1pbmF0aW9uIiBhbmQgYW55IG5vbnplcm8gdmFsdWUgaXMgY29uc2lkZXJlZAogICAgImFibm9ybWFsIHRlcm1pbmF0aW9uIiBieSBzaGVsbHMgYW5kIHRoZSBsaWtlLiAgTW9zdCBzeXN0ZW1zIHJlcXVpcmUgaXQgdG8gYmUKLSAgIGluIHRoZSByYW5nZSAwLTEyNywgYW5kIHByb2R1Y2UgdW5kZWZpbmVkIHJlc3VsdHMgb3RoZXJ3aXNlLiAgU29tZSBzeXN0ZW1zCisgICBpbiB0aGUgcmFuZ2UgMC0tMTI3LCBhbmQgcHJvZHVjZSB1bmRlZmluZWQgcmVzdWx0cyBvdGhlcndpc2UuICBTb21lIHN5c3RlbXMKICAgIGhhdmUgYSBjb252ZW50aW9uIGZvciBhc3NpZ25pbmcgc3BlY2lmaWMgbWVhbmluZ3MgdG8gc3BlY2lmaWMgZXhpdCBjb2RlcywgYnV0CiAgICB0aGVzZSBhcmUgZ2VuZXJhbGx5IHVuZGVyZGV2ZWxvcGVkOyBVbml4IHByb2dyYW1zIGdlbmVyYWxseSB1c2UgMiBmb3IgY29tbWFuZAogICAgbGluZSBzeW50YXggZXJyb3JzIGFuZCAxIGZvciBhbGwgb3RoZXIga2luZCBvZiBlcnJvcnMuICBJZiBhbm90aGVyIHR5cGUgb2YKQEAgLTI2OCw2ICsyNjgsMTEgQEAKICAgIHRoZSBwcm9jZXNzIHdoZW4gY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBub3QKICAgIGludGVyY2VwdGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoZSBjbGVhbnVwIGFmdGVyIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKyAgICAgIGhhcyBjYXVnaHQgOmV4YzpgU3lzdGVtRXhpdGAgKHN1Y2ggYXMgYW4gZXJyb3IgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YQorICAgICAgaW4gdGhlIHN0YW5kYXJkIHN0cmVhbXMpLCB0aGUgZXhpdCBzdGF0dXMgaXMgY2hhbmdlZCB0byAxMjAuCisKIAogLi4gZGF0YTo6IGZsYWdzCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QgYi9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CmluZGV4IDQwNDBmNzIuLmNlNDA2Y2EgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdApAQCAtNDMsNiArNDMsMTcgQEAKICAgIDpleGM6YEVPRkVycm9yYCB3aGVuIHRoZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZCwgYmVjYXVzZSB0aGV5IGNhbiByZXR1cm4KICAgIGFuIGVtcHR5IHN0cmluZyBmb3Igb3RoZXIgcmVhc29ucy4gIFNlZSB0aGUgaW5kaXZpZHVhbCBkZXNjcmlwdGlvbnMgYmVsb3cuCiAKKyAgIEEgOmNsYXNzOmBUZWxuZXRgIG9iamVjdCBpcyBhIGNvbnRleHQgbWFuYWdlciBhbmQgY2FuIGJlIHVzZWQgaW4gYQorICAgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudC4gIFdoZW4gdGhlIDprZXl3b3JkOmB3aXRoYCBibG9jayBlbmRzLCB0aGUKKyAgIDptZXRoOmBjbG9zZWAgbWV0aG9kIGlzIGNhbGxlZDo6CisKKyAgICAgICA+Pj4gZnJvbSB0ZWxuZXRsaWIgaW1wb3J0IFRlbG5ldAorICAgICAgID4+PiB3aXRoIFRlbG5ldCgnbG9jYWxob3N0JywgMjMpIGFzIHRuOgorICAgICAgIC4uLiAgICAgdG4uaW50ZXJhY3QoKQorICAgICAgIC4uLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNiBDb250ZXh0IG1hbmFnZXIgc3VwcG9ydCBhZGRlZAorCiAKIC4uIHNlZWFsc286OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZXN0LnJzdCBiL0RvYy9saWJyYXJ5L3Rlc3QucnN0CmluZGV4IDg1Y2FiM2IuLjc5N2FmYTUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Rlc3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Rlc3QucnN0CkBAIC01ODAsNiArNTgwLDQ4IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAogCisuLiBmdW5jdGlvbjo6IGNoZWNrX19hbGxfXyh0ZXN0X2Nhc2UsIG1vZHVsZSwgbmFtZV9vZl9tb2R1bGU9Tm9uZSwgZXh0cmE9KCksIGJsYWNrbGlzdD0oKSkKKworICAgQXNzZXJ0IHRoYXQgdGhlIGBgX19hbGxfX2BgIHZhcmlhYmxlIG9mICptb2R1bGUqIGNvbnRhaW5zIGFsbCBwdWJsaWMgbmFtZXMuCisKKyAgIFRoZSBtb2R1bGUncyBwdWJsaWMgbmFtZXMgKGl0cyBBUEkpIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5CisgICBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgbWF0Y2ggdGhlIHB1YmxpYyBuYW1lIGNvbnZlbnRpb24gYW5kIHdlcmUgZGVmaW5lZCBpbgorICAgKm1vZHVsZSouCisKKyAgIFRoZSAqbmFtZV9vZl9tb2R1bGUqIGFyZ3VtZW50IGNhbiBzcGVjaWZ5IChhcyBhIHN0cmluZyBvciB0dXBsZSB0aGVyZW9mKSB3aGF0CisgICBtb2R1bGUocykgYW4gQVBJIGNvdWxkIGJlIGRlZmluZWQgaW4gaW4gb3JkZXIgdG8gYmUgZGV0ZWN0ZWQgYXMgYSBwdWJsaWMKKyAgIEFQSS4gT25lIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiAqbW9kdWxlKiBpbXBvcnRzIHBhcnQgb2YgaXRzIHB1YmxpYyBBUEkgZnJvbQorICAgb3RoZXIgbW9kdWxlcywgcG9zc2libHkgYSBDIGJhY2tlbmQgKGxpa2UgYGBjc3ZgYCBhbmQgaXRzIGBgX2NzdmBgKS4KKworICAgVGhlICpleHRyYSogYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgd291bGRuJ3Qgb3RoZXJ3aXNlIGJlIGF1dG9tYXRpY2FsbHkKKyAgIGRldGVjdGVkIGFzICJwdWJsaWMiLCBsaWtlIG9iamVjdHMgd2l0aG91dCBhIHByb3BlciBgYF9fbW9kdWxlX19gYAorICAgYXR0cmlidXRlLiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBvbmVzLgorCisgICBUaGUgKmJsYWNrbGlzdCogYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgbXVzdCBub3QgYmUgdHJlYXRlZCBhcyBwYXJ0IG9mCisgICB0aGUgcHVibGljIEFQSSBldmVuIHRob3VnaCB0aGVpciBuYW1lcyBpbmRpY2F0ZSBvdGhlcndpc2UuCisKKyAgIEV4YW1wbGUgdXNlOjoKKworICAgICAgaW1wb3J0IGJhcgorICAgICAgaW1wb3J0IGZvbworICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworICAgICAgY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZvbykKKworICAgICAgY2xhc3MgT3RoZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICBleHRyYSA9IHsnQkFSX0NPTlNUJywgJ0ZPT19DT05TVCd9CisgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IHsnYmF6J30gICMgVW5kb2N1bWVudGVkIG5hbWUuCisgICAgICAgICAgICAgICMgYmFyIGltcG9ydHMgcGFydCBvZiBpdHMgQVBJIGZyb20gX2Jhci4KKyAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgYmFyLCAoJ2JhcicsICdfYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBUaGUgOm1vZDpgdGVzdC5zdXBwb3J0YCBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CiAKIC4uIGNsYXNzOjogVHJhbnNpZW50UmVzb3VyY2UoZXhjLCAqKmt3YXJncykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RpbWUucnN0IGIvRG9jL2xpYnJhcnkvdGltZS5yc3QKaW5kZXggM2QzMzVjOC4uNzM0MzZjYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGltZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGltZS5yc3QKQEAgLTYzNCwxMSArNjM0LDExIEBACiAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byByZWZlciB0byBGZWJydWFyeSAyOS4KIAogICAgICAgOnNhbXA6YE17bX0ue259LntkfWAKLSAgICAgICAgIFRoZSAqZCondGggZGF5ICgwIDw9ICpkKiA8PSA2KSBvciB3ZWVrICpuKiBvZiBtb250aCAqbSogb2YgdGhlIHllYXIgKDEKKyAgICAgICAgIFRoZSAqZCondGggZGF5ICgwIDw9ICpkKiA8PSA2KSBvZiB3ZWVrICpuKiBvZiBtb250aCAqbSogb2YgdGhlIHllYXIgKDEKICAgICAgICAgIDw9ICpuKiA8PSA1LCAxIDw9ICptKiA8PSAxMiwgd2hlcmUgd2VlayA1IG1lYW5zICJ0aGUgbGFzdCAqZCogZGF5IGluCiAgICAgICAgICBtb250aCAqbSoiIHdoaWNoIG1heSBvY2N1ciBpbiBlaXRoZXIgdGhlIGZvdXJ0aCBvciB0aGUgZmlmdGgKICAgICAgICAgIHdlZWspLiBXZWVrIDEgaXMgdGhlIGZpcnN0IHdlZWsgaW4gd2hpY2ggdGhlICpkKid0aCBkYXkgb2NjdXJzLiBEYXkKLSAgICAgICAgIHplcm8gaXMgU3VuZGF5LgorICAgICAgICAgemVybyBpcyBhIFN1bmRheS4KIAogICAgICAgYGB0aW1lYGAgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBgYG9mZnNldGBgIGV4Y2VwdCB0aGF0IG5vIGxlYWRpbmcgc2lnbgogICAgICAgKCctJyBvciAnKycpIGlzIGFsbG93ZWQuIFRoZSBkZWZhdWx0LCBpZiB0aW1lIGlzIG5vdCBnaXZlbiwgaXMgMDI6MDA6MDAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0IGIvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdAppbmRleCAyMWM4MmY1Li4wMDA4NzQwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKQEAgLTExNSw4ICsxMTUsOSBAQAogICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgfCBpZiBwcmVzZW50ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotICAgU2VlIHNlY3Rpb24gOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdAotICAgb2JqZWN0LgorICAgUmVhZGluZyB0aGUgOmF0dHI6YHBvcnRgIGF0dHJpYnV0ZSB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAgaWYKKyAgIGFuIGludmFsaWQgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIFVSTC4gIFNlZSBzZWN0aW9uCisgICA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIEFkZGVkIElQdjYgVVJMIHBhcnNpbmcgY2FwYWJpbGl0aWVzLgpAQCAtMTI2LDYgKzEyNywxMCBAQAogICAgICAgZmFsc2UpLCBpbiBhY2NvcmRhbmNlIHdpdGggOnJmYzpgMzk4NmAuICBQcmV2aW91c2x5LCBhIHdoaXRlbGlzdCBvZgogICAgICAgc2NoZW1lcyB0aGF0IHN1cHBvcnQgZnJhZ21lbnRzIGV4aXN0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPdXQtb2YtcmFuZ2UgcG9ydCBudW1iZXJzIG5vdyByYWlzZSA6ZXhjOmBWYWx1ZUVycm9yYCwgaW5zdGVhZCBvZgorICAgICAgcmV0dXJuaW5nIDpjb25zdDpgTm9uZWAuCisKIAogLi4gZnVuY3Rpb246OiBwYXJzZV9xcyhxcywga2VlcF9ibGFua192YWx1ZXM9RmFsc2UsIHN0cmljdF9wYXJzaW5nPUZhbHNlLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9J3JlcGxhY2UnKQogCkBAIC0yMjgsOCArMjMzLDEzIEBACiAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICB8IGlmIHByZXNlbnQgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotICAgU2VlIHNlY3Rpb24gOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdAotICAgb2JqZWN0LgorICAgUmVhZGluZyB0aGUgOmF0dHI6YHBvcnRgIGF0dHJpYnV0ZSB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAgaWYKKyAgIGFuIGludmFsaWQgcG9ydCBpcyBzcGVjaWZpZWQgaW4gdGhlIFVSTC4gIFNlZSBzZWN0aW9uCisgICA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0IG9iamVjdC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE91dC1vZi1yYW5nZSBwb3J0IG51bWJlcnMgbm93IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpbnN0ZWFkIG9mCisgICAgICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4KIAogCiAuLiBmdW5jdGlvbjo6IHVybHVuc3BsaXQocGFydHMpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0IGIvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdAppbmRleCBmMTc5ZGUyLi5jMmUxYmVmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKQEAgLTUzLDE1ICs1Myw0MSBAQAogICAgICAgU2V0cyB0aGUgdGltZSB0aGUgYGByb2JvdHMudHh0YGAgZmlsZSB3YXMgbGFzdCBmZXRjaGVkIHRvIHRoZSBjdXJyZW50CiAgICAgICB0aW1lLgogCisgICAuLiBtZXRob2Q6OiBjcmF3bF9kZWxheSh1c2VyYWdlbnQpCiAKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNlIG9mIHRoZSBSb2JvdEZpbGVQYXJzZXIgY2xhc3MuCisgICAgICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYGBDcmF3bC1kZWxheWBgIHBhcmFtZXRlciBmcm9tIGBgcm9ib3RzLnR4dGBgCisgICAgICBmb3IgdGhlICp1c2VyYWdlbnQqIGluIHF1ZXN0aW9uLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJhbWV0ZXIgb3IgaXQKKyAgICAgIGRvZXNuJ3QgYXBwbHkgdG8gdGhlICp1c2VyYWdlbnQqIHNwZWNpZmllZCBvciB0aGUgYGByb2JvdHMudHh0YGAgZW50cnkKKyAgICAgIGZvciB0aGlzIHBhcmFtZXRlciBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBgYE5vbmVgYC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIG1ldGhvZDo6IHJlcXVlc3RfcmF0ZSh1c2VyYWdlbnQpCisKKyAgICAgIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgYFJlcXVlc3QtcmF0ZWBgIHBhcmFtZXRlciBmcm9tCisgICAgICBgYHJvYm90cy50eHRgYCBpbiB0aGUgZm9ybSBvZiBhIDpmdW5jOmB+Y29sbGVjdGlvbnMubmFtZWR0dXBsZWAKKyAgICAgIGBgKHJlcXVlc3RzLCBzZWNvbmRzKWBgLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBwYXJhbWV0ZXIgb3IgaXQgZG9lc24ndAorICAgICAgYXBwbHkgdG8gdGhlICp1c2VyYWdlbnQqIHNwZWNpZmllZCBvciB0aGUgYGByb2JvdHMudHh0YGAgZW50cnkgZm9yIHRoaXMKKyAgICAgIHBhcmFtZXRlciBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBgYE5vbmVgYC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB1c2Ugb2YgdGhlIDpjbGFzczpgUm9ib3RGaWxlUGFyc2VyYAorY2xhc3M6OgogCiAgICA+Pj4gaW1wb3J0IHVybGxpYi5yb2JvdHBhcnNlcgogICAgPj4+IHJwID0gdXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCiAgICA+Pj4gcnAuc2V0X3VybCgiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vcm9ib3RzLnR4dCIpCiAgICA+Pj4gcnAucmVhZCgpCisgICA+Pj4gcnJhdGUgPSBycC5yZXF1ZXN0X3JhdGUoIioiKQorICAgPj4+IHJyYXRlLnJlcXVlc3RzCisgICAzCisgICA+Pj4gcnJhdGUuc2Vjb25kcworICAgMjAKKyAgID4+PiBycC5jcmF3bF9kZWxheSgiKiIpCisgICA2CiAgICA+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tL2NnaS1iaW4vc2VhcmNoP2NpdHk9U2FuK0ZyYW5jaXNjbyIpCiAgICBGYWxzZQogICAgPj4+IHJwLmNhbl9mZXRjaCgiKiIsICJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS8iKQogICAgVHJ1ZQotCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdCBiL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CmluZGV4IDAxY2ZkNmQuLjAwZTY0NzYgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CkBAIC00NzEsMTAgKzQ3MSwxMCBAQAogICAgZGVjb3JhdG9yczogYGRlY29yYXRvcmArCiAgICBkZWNvcmF0b3I6ICJAIiBgZG90dGVkX25hbWVgIFsiKCIgW2BwYXJhbWV0ZXJfbGlzdGAgWyIsIl1dICIpIl0gTkVXTElORQogICAgZG90dGVkX25hbWU6IGBpZGVudGlmaWVyYCAoIi4iIGBpZGVudGlmaWVyYCkqCi0gICBwYXJhbWV0ZXJfbGlzdDogKGBkZWZwYXJhbWV0ZXJgICIsIikqCi0gICAgICAgICAgICAgICAgIDogfCAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiAiKioiIGBwYXJhbWV0ZXJgXQotICAgICAgICAgICAgICAgICA6IHwgIioqIiBgcGFyYW1ldGVyYAotICAgICAgICAgICAgICAgICA6IHwgYGRlZnBhcmFtZXRlcmAgWyIsIl0gKQorICAgcGFyYW1ldGVyX2xpc3Q6IGBkZWZwYXJhbWV0ZXJgICgiLCIgYGRlZnBhcmFtZXRlcmApKiBbIiwiIFtgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgXV0KKyAgICAgICAgICAgICAgICAgOiB8IGBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc2AKKyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzOiAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbIioqIiBgcGFyYW1ldGVyYCBbIiwiXV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAgWyIsIl0KICAgIHBhcmFtZXRlcjogYGlkZW50aWZpZXJgIFsiOiIgYGV4cHJlc3Npb25gXQogICAgZGVmcGFyYW1ldGVyOiBgcGFyYW1ldGVyYCBbIj0iIGBleHByZXNzaW9uYF0KICAgIGZ1bmNuYW1lOiBgaWRlbnRpZmllcmAKZGlmZiAtLWdpdCBhL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkgYi9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CmluZGV4IDYzMTEyODMuLjc5ODYwMTcgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKKysrIGIvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQpAQCAtMzQsNyArMzQsNyBAQAogCiAKIElTU1VFX1VSSSA9ICdodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZSVzJwotU09VUkNFX1VSSSA9ICdodHRwczovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzMuNS8lcycKK1NPVVJDRV9VUkkgPSAnaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS9kZWZhdWx0LyVzJwogCiAjIG1vbmtleS1wYXRjaCByZVNUIHBhcnNlciB0byBkaXNhYmxlIGFscGhhYmV0aWMgYW5kIHJvbWFuIGVudW1lcmF0ZWQgbGlzdHMKIGZyb20gZG9jdXRpbHMucGFyc2Vycy5yc3Quc3RhdGVzIGltcG9ydCBCb2R5CmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0IGIvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAppbmRleCBlOTY2MDg1Li4yMTVhZjAzIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKQEAgLTEsNCArMSw0IEBACi0uLiBfdHV0LXVzaW5nOgorMy42Li4gX3R1dC11c2luZzoKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogVXNpbmcgdGhlIFB5dGhvbiBJbnRlcnByZXRlcgpAQCAtMTAsMTMgKzEwLDEzIEBACiBJbnZva2luZyB0aGUgSW50ZXJwcmV0ZXIKID09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgUHl0aG9uIGludGVycHJldGVyIGlzIHVzdWFsbHkgaW5zdGFsbGVkIGFzIDpmaWxlOmAvdXNyL2xvY2FsL2Jpbi9weXRob24zLjVgCitUaGUgUHl0aG9uIGludGVycHJldGVyIGlzIHVzdWFsbHkgaW5zdGFsbGVkIGFzIDpmaWxlOmAvdXNyL2xvY2FsL2Jpbi9weXRob24zLjZgCiBvbiB0aG9zZSBtYWNoaW5lcyB3aGVyZSBpdCBpcyBhdmFpbGFibGU7IHB1dHRpbmcgOmZpbGU6YC91c3IvbG9jYWwvYmluYCBpbiB5b3VyCiBVbml4IHNoZWxsJ3Mgc2VhcmNoIHBhdGggbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQgaXQgYnkgdHlwaW5nIHRoZSBjb21tYW5kOgogCiAuLiBjb2RlLWJsb2NrOjogdGV4dAogCi0gICBweXRob24zLjUKKyAgIHB5dGhvbjMuNgogCiB0byB0aGUgc2hlbGwuIFsjXV8gU2luY2UgdGhlIGNob2ljZSBvZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbnRlcnByZXRlciBsaXZlcwogaXMgYW4gaW5zdGFsbGF0aW9uIG9wdGlvbiwgb3RoZXIgcGxhY2VzIGFyZSBwb3NzaWJsZTsgY2hlY2sgd2l0aCB5b3VyIGxvY2FsCkBAIC0yNCwxMSArMjQsMTEgQEAKIHBvcHVsYXIgYWx0ZXJuYXRpdmUgbG9jYXRpb24uKQogCiBPbiBXaW5kb3dzIG1hY2hpbmVzLCB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiBpcyB1c3VhbGx5IHBsYWNlZCBpbgotOmZpbGU6YEM6XFxQeXRob24zNWAsIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlCis6ZmlsZTpgQzpcXFB5dGhvbjM2YCwgdGhvdWdoIHlvdSBjYW4gY2hhbmdlIHRoaXMgd2hlbiB5b3UncmUgcnVubmluZyB0aGUKIGluc3RhbGxlci4gIFRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0byB5b3VyIHBhdGgsICB5b3UgY2FuIHR5cGUgdGhlIGZvbGxvd2luZwogY29tbWFuZCBpbnRvIHRoZSBjb21tYW5kIHByb21wdCBpbiBhIERPUyBib3g6OgogCi0gICBzZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzUKKyAgIHNldCBwYXRoPSVwYXRoJTtDOlxweXRob24zNgogCiBUeXBpbmcgYW4gZW5kLW9mLWZpbGUgY2hhcmFjdGVyICg6a2JkOmBDb250cm9sLURgIG9uIFVuaXgsIDprYmQ6YENvbnRyb2wtWmAgb24KIFdpbmRvd3MpIGF0IHRoZSBwcmltYXJ5IHByb21wdCBjYXVzZXMgdGhlIGludGVycHJldGVyIHRvIGV4aXQgd2l0aCBhIHplcm8gZXhpdApAQCAtOTYsOCArOTYsOCBAQAogcHJpbnRzIGEgd2VsY29tZSBtZXNzYWdlIHN0YXRpbmcgaXRzIHZlcnNpb24gbnVtYmVyIGFuZCBhIGNvcHlyaWdodCBub3RpY2UKIGJlZm9yZSBwcmludGluZyB0aGUgZmlyc3QgcHJvbXB0OjoKIAotICAgJCBweXRob24zLjUKLSAgIFB5dGhvbiAzLjUgKGRlZmF1bHQsIFNlcCAxNiAyMDE1LCAwOToyNTowNCkKKyAgICQgcHl0aG9uMy42CisgICBQeXRob24gMy42IChkZWZhdWx0LCBTZXAgMTYgMjAxNSwgMDk6MjU6MDQpCiAgICBbR0NDIDQuOC4yXSBvbiBsaW51eAogICAgVHlwZSAiaGVscCIsICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgPj4+CmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdCBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CmluZGV4IDA5NTRlYmEuLmY5ZWQ0NmQgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CkBAIC0xNSw3ICsxNSw3IEBACiAKICAgID4+PiBpbXBvcnQgb3MKICAgID4+PiBvcy5nZXRjd2QoKSAgICAgICMgUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAnQzpcXFB5dGhvbjM1JworICAgJ0M6XFxQeXRob24zNicKICAgID4+PiBvcy5jaGRpcignL3NlcnZlci9hY2Nlc3Nsb2dzJykgICAjIENoYW5nZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgICA+Pj4gb3Muc3lzdGVtKCdta2RpciB0b2RheScpICAgIyBSdW4gdGhlIGNvbW1hbmQgbWtkaXIgaW4gdGhlIHN5c3RlbSBzaGVsbAogICAgMApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0IGIvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CmluZGV4IGY3ZDJhMGEuLjcxMTk0YjAgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKQEAgLTI3Nyw3ICsyNzcsNyBAQAogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgIGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLSAgICAgRmlsZSAiQzovcHl0aG9uMzUvbGliL3dlYWtyZWYucHkiLCBsaW5lIDQ2LCBpbiBfX2dldGl0ZW1fXworICAgICBGaWxlICJDOi9weXRob24zNi9saWIvd2Vha3JlZi5weSIsIGxpbmUgNDYsIGluIF9fZ2V0aXRlbV9fCiAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKICAgIEtleUVycm9yOiAncHJpbWFyeScKIApkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuNi5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy42LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUxNjFkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL3doYXRzbmV3LzMuNi5yc3QKQEAgLTAsMCArMSwyNjIgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgV2hhdCdzIE5ldyBJbiBQeXRob24gMy42CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzpSZWxlYXNlOiB8cmVsZWFzZXwKKzpEYXRlOiB8dG9kYXl8CisKKy4uIFJ1bGVzIGZvciBtYWludGVuYW5jZToKKworICAgKiBBbnlvbmUgY2FuIGFkZCB0ZXh0IHRvIHRoaXMgZG9jdW1lbnQuICBEbyBub3Qgc3BlbmQgdmVyeSBtdWNoIHRpbWUKKyAgIG9uIHRoZSB3b3JkaW5nIG9mIHlvdXIgY2hhbmdlcywgYmVjYXVzZSB5b3VyIHRleHQgd2lsbCBwcm9iYWJseQorICAgZ2V0IHJld3JpdHRlbiB0byBzb21lIGRlZ3JlZS4KKworICAgKiBUaGUgbWFpbnRhaW5lciB3aWxsIGdvIHRocm91Z2ggTWlzYy9ORVdTIHBlcmlvZGljYWxseSBhbmQgYWRkCisgICBjaGFuZ2VzOyBpdCdzIHRoZXJlZm9yZSBtb3JlIGltcG9ydGFudCB0byBhZGQgeW91ciBjaGFuZ2VzIHRvCisgICBNaXNjL05FV1MgdGhhbiB0byB0aGlzIGZpbGUuCisKKyAgICogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBsaXN0IG9mIGV2ZXJ5IHNpbmdsZSBjaGFuZ2U7IGNvbXBsZXRlbmVzcworICAgaXMgdGhlIHB1cnBvc2Ugb2YgTWlzYy9ORVdTLiAgU29tZSBjaGFuZ2VzIEkgY29uc2lkZXIgdG9vIHNtYWxsCisgICBvciBlc290ZXJpYyB0byBpbmNsdWRlLiAgSWYgc3VjaCBhIGNoYW5nZSBpcyBhZGRlZCB0byB0aGUgdGV4dCwKKyAgIEknbGwganVzdCByZW1vdmUgaXQuICAoVGhpcyBpcyBhbm90aGVyIHJlYXNvbiB5b3Ugc2hvdWxkbid0IHNwZW5kCisgICB0b28gbXVjaCB0aW1lIG9uIHdyaXRpbmcgeW91ciBhZGRpdGlvbi4pCisKKyAgICogSWYgeW91IHdhbnQgdG8gZHJhdyB5b3VyIG5ldyB0ZXh0IHRvIHRoZSBhdHRlbnRpb24gb2YgdGhlCisgICBtYWludGFpbmVyLCBhZGQgJ1hYWCcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoIG9yCisgICBzZWN0aW9uLgorCisgICAqIEl0J3MgT0sgdG8ganVzdCBhZGQgYSBmcmFnbWVudGFyeSBub3RlIGFib3V0IGEgY2hhbmdlLiAgRm9yCisgICBleGFtcGxlOiAiWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUKKyAgIHNvY2tldCBtb2R1bGUuIiAgVGhlIG1haW50YWluZXIgd2lsbCByZXNlYXJjaCB0aGUgY2hhbmdlIGFuZAorICAgd3JpdGUgdGhlIG5lY2Vzc2FyeSB0ZXh0LgorCisgICAqIFlvdSBjYW4gY29tbWVudCBvdXQgeW91ciBhZGRpdGlvbnMgaWYgeW91IGxpa2UsIGJ1dCBpdCdzIG5vdAorICAgbmVjZXNzYXJ5IChlc3BlY2lhbGx5IHdoZW4gYSBmaW5hbCByZWxlYXNlIGlzIHNvbWUgbW9udGhzIGF3YXkpLgorCisgICAqIENyZWRpdCB0aGUgYXV0aG9yIG9mIGEgcGF0Y2ggb3IgYnVnZml4LiAgIEp1c3QgdGhlIG5hbWUgaXMKKyAgIHN1ZmZpY2llbnQ7IHRoZSBlLW1haWwgYWRkcmVzcyBpc24ndCBuZWNlc3NhcnkuCisKKyAgICogSXQncyBoZWxwZnVsIHRvIGFkZCB0aGUgYnVnL3BhdGNoIG51bWJlciBhcyBhIGNvbW1lbnQ6CisKKyAgIFhYWCBEZXNjcmliZSB0aGUgdHJhbnNtb2dyaWZ5KCkgZnVuY3Rpb24gYWRkZWQgdG8gdGhlIHNvY2tldAorICAgbW9kdWxlLgorICAgKENvbnRyaWJ1dGVkIGJ5IFAuWS4gRGV2ZWxvcGVyIGluIDppc3N1ZTpgMTIzNDVgLikKKworICAgVGhpcyBzYXZlcyB0aGUgbWFpbnRhaW5lciB0aGUgZWZmb3J0IG9mIGdvaW5nIHRocm91Z2ggdGhlIE1lcmN1cmlhbCBsb2cKKyAgIHdoZW4gcmVzZWFyY2hpbmcgYSBjaGFuZ2UuCisKK1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAzLjYsIGNvbXBhcmVkIHRvIDMuNS4KKworRm9yIGZ1bGwgZGV0YWlscywgc2VlIHRoZSA6c291cmNlOmBNaXNjL05FV1NgIGZpbGUuCisKKy4uIG5vdGU6OgorCisgICBQcmVyZWxlYXNlIHVzZXJzIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoaXMgZG9jdW1lbnQgaXMgY3VycmVudGx5IGluIGRyYWZ0CisgICBmb3JtLiBJdCB3aWxsIGJlIHVwZGF0ZWQgc3Vic3RhbnRpYWxseSBhcyBQeXRob24gMy42IG1vdmVzIHRvd2FyZHMgcmVsZWFzZSwKKyAgIHNvIGl0J3Mgd29ydGggY2hlY2tpbmcgYmFjayBldmVuIGFmdGVyIHJlYWRpbmcgZWFybGllciB2ZXJzaW9ucy4KKworCitTdW1tYXJ5IC0tIFJlbGVhc2UgaGlnaGxpZ2h0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gVGhpcyBzZWN0aW9uIHNpbmdsZXMgb3V0IHRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2VzIGluIFB5dGhvbiAzLjYuCisgICBCcmV2aXR5IGlzIGtleS4KKworKiBOb25lIHlldC4KKworLi4gUEVQLXNpemVkIGl0ZW1zIG5leHQuCisKKy4uIF9wZXAtNFhYOgorCisuLiBQRVAgNFhYOiBWaXJ0dWFsIEVudmlyb25tZW50cworLi4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisuLiAoSW1wbGVtZW50ZWQgYnkgRm9vIEJhci4pCisKKy4uIC4uIHNlZWFsc286OgorCisgICAgOnBlcDpgNFhYYCAtIFB5dGhvbiBWaXJ0dWFsIEVudmlyb25tZW50cworICAgICAgIFBFUCB3cml0dGVuIGJ5IENhcmwgTWV5ZXIKKworCitPdGhlciBMYW5ndWFnZSBDaGFuZ2VzCis9PT09PT09PT09PT09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworTmV3IE1vZHVsZXMKKz09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworSW1wcm92ZWQgTW9kdWxlcworPT09PT09PT09PT09PT09PQorCitkYXRldGltZQorLS0tLS0tLS0KKworVGhlIDptZXRoOmBkYXRldGltZS5zdHJmdGltZSgpIDxkYXRldGltZS5kYXRldGltZS5zdHJmdGltZT5gIGFuZAorOm1ldGg6YGRhdGUuc3RyZnRpbWUoKSA8ZGF0ZXRpbWUuZGF0ZS5zdHJmdGltZT5gIG1ldGhvZHMgbm93IHN1cHBvcnQgSVNPIDg2MDEgZGF0ZQorZGlyZWN0aXZlcyBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgLgorKENvbnRyaWJ1dGVkIGJ5IEFzaGxleSBBbmRlcnNvbiBpbiA6aXNzdWU6YDEyMDA2YC4pCisKKworcGlja2xlCistLS0tLS0KKworT2JqZWN0cyB0aGF0IG5lZWQgY2FsbGluZyBgYF9fbmV3X19gYCB3aXRoIGtleXdvcmQgYXJndW1lbnRzIGNhbiBub3cgYmUgcGlja2xlZAordXNpbmcgOnJlZjpgcGlja2xlIHByb3RvY29scyA8cGlja2xlLXByb3RvY29scz5gIG9sZGVyIHRoYW4gcHJvdG9jb2wgdmVyc2lvbiA0LgorUHJvdG9jb2wgdmVyc2lvbiA0IGFscmVhZHkgc3VwcG9ydHMgdGhpcyBjYXNlLiAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeQorU3RvcmNoYWthIGluIDppc3N1ZTpgMjQxNjRgLikKKworCitybGNvbXBsZXRlcgorLS0tLS0tLS0tLS0KKworUHJpdmF0ZSBhbmQgc3BlY2lhbCBhdHRyaWJ1dGUgbmFtZXMgbm93IGFyZSBvbWl0dGVkIHVubGVzcyB0aGUgcHJlZml4IHN0YXJ0cword2l0aCB1bmRlcnNjb3Jlcy4gIEEgc3BhY2Ugb3IgYSBjb2xvbiBpcyBhZGRlZCBhZnRlciBzb21lIGNvbXBsZXRlZCBrZXl3b3Jkcy4KKyhDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjUwMTFgIGFuZCA6aXNzdWU6YDI1MjA5YC4pCisKK05hbWVzIG9mIG1vc3QgYXR0cmlidXRlcyBsaXN0ZWQgYnkgOmZ1bmM6YGRpcmAgYXJlIG5vdyBjb21wbGV0ZWQuCitQcmV2aW91c2x5LCBuYW1lcyBvZiBwcm9wZXJ0aWVzIGFuZCBzbG90cyB3aGljaCB3ZXJlIG5vdCB5ZXQgY3JlYXRlZCBvbgorYW4gaW5zdGFuY2Ugd2VyZSBleGNsdWRlZC4gIChDb250cmlidXRlZCBieSBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjU1OTBgLikKKworCit0ZWxuZXRsaWIKKy0tLS0tLS0tLQorCis6Y2xhc3M6YH50ZWxuZXRsaWIuVGVsbmV0YCBpcyBub3cgYSBjb250ZXh0IG1hbmFnZXIgKGNvbnRyaWJ1dGVkIGJ5CitTdMOpcGhhbmUgV2lydGVsIGluIDppc3N1ZTpgMjU0ODVgKS4KKworCit1cmxsaWIucm9ib3RwYXJzZXIKKy0tLS0tLS0tLS0tLS0tLS0tLQorCis6Y2xhc3M6YH51cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyYCBub3cgc3VwcG9ydHMgdGhlIGBgQ3Jhd2wtZGVsYXlgYCBhbmQKK2BgUmVxdWVzdC1yYXRlYGAgZXh0ZW5zaW9ucy4KKyhDb250cmlidXRlZCBieSBOaWtvbGF5IEJvZ295Y2hldiBpbiA6aXNzdWU6YDE2MDk5YC4pCisKKworT3B0aW1pemF0aW9ucworPT09PT09PT09PT09PQorCisqIFRoZSBBU0NJSSBkZWNvZGVyIGlzIG5vdyB1cCB0byA2MCB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYGlnbm9yZWBgIGFuZCBgYHJlcGxhY2VgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNDg3MGApLgorCisqIFRoZSBBU0NJSSBhbmQgdGhlIExhdGluMSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdCBmb3IgdGhlCisgIGVycm9yIGhhbmRsZXIgYGBzdXJyb2dhdGVlc2NhcGVgYCAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTIyN2ApLgorCisqIFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUyNjdgKS4KKworKiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUzMDFgKS4KKworKiBgYGJ5dGVzICUgYXJnc2BgIGlzIG5vdyB1cCB0byAyIHRpbWVzIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyCisgIGluIDppc3N1ZTpgMjUzNDlgKS4KKworKiBgYGJ5dGVhcnJheSAlIGFyZ3NgYCBpcyBub3cgYmV0d2VlbiAyLjUgYW5kIDUgdGltZXMgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkKKyAgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTM5OWApLgorCisqIE9wdGltaXplIDptZXRoOmBieXRlcy5mcm9taGV4YCBhbmQgOm1ldGg6YGJ5dGVhcnJheS5mcm9taGV4YDogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTQwMWApLgorCisKK0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzCis9PT09PT09PT09PT09PT09PT09PT09PQorCisqIE5ldyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBBUEkgd2hpY2ggaW5kaWNhdGVzIGlmIGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEKKyAgZmFpbGVkICg6aXNzdWU6YDUzMTlgKS4KKworCitEZXByZWNhdGVkCis9PT09PT09PT09CisKK05ldyBLZXl3b3JkcworLS0tLS0tLS0tLS0tCisKK2BgYXN5bmNgYCBhbmQgYGBhd2FpdGBgIGFyZSBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBhcyB2YXJpYWJsZSwgY2xhc3MsCitmdW5jdGlvbiBvciBtb2R1bGUgbmFtZXMuICBJbnRyb2R1Y2VkIGJ5IDpwZXA6YDQ5MmAgaW4gUHl0aG9uIDMuNSwgdGhleSB3aWxsCitiZWNvbWUgcHJvcGVyIGtleXdvcmRzIGluIFB5dGhvbiAzLjcuCisKKworRGVwcmVjYXRlZCBQeXRob24gbW9kdWxlcywgZnVuY3Rpb25zIGFuZCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiA6bWV0aDpgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyYCBhbmQKKyAgOm1ldGg6YGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlbGVzc0ZpbGVMb2FkZXJgIGFyZSBub3cgZGVwcmVjYXRlZC4gVGhleQorICB3ZXJlIHRoZSBvbmx5IHJlbWFpbmluZyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCBpbiA6bW9kOmBpbXBvcnRsaWJgIHRoYXQgaGFkIG5vdAorICBiZWVuIGRlcHJlY2F0ZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uIGluIGZhdm91ciBvZgorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgLgorCisKK0RlcHJlY2F0ZWQgZnVuY3Rpb25zIGFuZCB0eXBlcyBvZiB0aGUgQyBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBOb25lIHlldC4KKworCitEZXByZWNhdGVkIGZlYXR1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIGBgcHl2ZW52YGAgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBgcHl0aG9uMyAtbSB2ZW52YGAuCisgIFRoaXMgcHJldmVudHMgY29uZnVzaW9uIGFzIHRvIHdoYXQgUHl0aG9uIGludGVycHJldGVyIGBgcHl2ZW52YGAgaXMKKyAgY29ubmVjdGVkIHRvIGFuZCB0aHVzIHdoYXQgUHl0aG9uIGludGVycHJldGVyIHdpbGwgYmUgdXNlZCBieSB0aGUgdmlydHVhbAorICBlbnZpcm9ubWVudC4gU2VlIDppc3N1ZTpgMjUxNTRgLgorCisKK1JlbW92ZWQKKz09PT09PT0KKworQVBJIGFuZCBGZWF0dXJlIFJlbW92YWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBgYGluc3BlY3QuZ2V0YXJnc3BlYygpYGAgd2FzIHJlbW92ZWQgKHdhcyBkZXByZWNhdGVkIHNpbmNlIENQeXRob24gMy4wKS4KKyAgOmZ1bmM6YGluc3BlY3QuZ2V0ZnVsbGFyZ3NwZWNgIGlzIGFuIGFsbW9zdCBkcm9wIGluIHJlcGxhY2VtZW50LgorCisqIGBgaW5zcGVjdC5nZXRtb2R1bGVpbmZvKClgYCB3YXMgcmVtb3ZlZCAod2FzIGRlcHJlY2F0ZWQgc2luY2UgQ1B5dGhvbiAzLjMpLgorICA6ZnVuYzpgaW5zcGVjdC5nZXRtb2R1bGVuYW1lYCBzaG91bGQgYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBtb2R1bGUKKyAgbmFtZSBmb3IgYSBnaXZlbiBwYXRoLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiB0aGUgUHl0aG9uIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFRoZSBmdW5jdGlvbnMgaW4gdGhlIDptb2Q6YGNvbXBpbGVhbGxgIG1vZHVsZSBub3cgcmV0dXJuIGJvb2xlYW5zIGluc3RlYWQKKyAgb2YgYGAxYGAgb3IgYGAwYGAgdG8gcmVwcmVzZW50IHN1Y2Nlc3Mgb3IgZmFpbHVyZSwgcmVzcGVjdGl2ZWx5LiBUaGFua3MgdG8KKyAgYm9vbGVhbnMgYmVpbmcgYSBzdWJjbGFzcyBvZiBpbnRlZ2VycywgdGhpcyBzaG91bGQgb25seSBiZSBhbiBpc3N1ZSBpZiB5b3UKKyAgd2VyZSBkb2luZyBpZGVudGl0eSBjaGVja3MgZm9yIGBgMWBgIG9yIGBgMGBgLiBTZWUgOmlzc3VlOmAyNTc2OGAuCisKKyogUmVhZGluZyB0aGUgOmF0dHI6YH51cmxsaWIucGFyc2UuU3BsaXRSZXN1bHQucG9ydGAgYXR0cmlidXRlIG9mCisgIDpmdW5jOmB1cmxsaWIucGFyc2UudXJsc3BsaXRgIGFuZCA6ZnVuYzpgfnVybGxpYi5wYXJzZS51cmxwYXJzZWAgcmVzdWx0cworICBub3cgcmFpc2VzIDpleGM6YFZhbHVlRXJyb3JgIGZvciBvdXQtb2YtcmFuZ2UgdmFsdWVzLCByYXRoZXIgdGhhbgorICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4gIFNlZSA6aXNzdWU6YDIwMDU5YC4KKworKiBUaGUgOm1vZDpgaW1wYCBtb2R1bGUgbm93IHJhaXNlcyBhIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AgaW5zdGVhZCBvZgorICA6ZXhjOmBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nYC4KKworKiBUaGUgZm9sbG93aW5nIG1vZHVsZXMgaGF2ZSBoYWQgbWlzc2luZyBBUElzIGFkZGVkIHRvIHRoZWlyIDphdHRyOmBfX2FsbF9fYAorICBhdHRyaWJ1dGVzIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXM6IDptb2Q6YGNzdmAsIDptb2Q6YGVudW1gLAorICA6bW9kOmBmdHBsaWJgLCA6bW9kOmBsb2dnaW5nYCwgOm1vZDpgb3B0cGFyc2VgLCA6bW9kOmB0aHJlYWRpbmdgIGFuZAorICA6bW9kOmB3YXZlYC4gIFRoaXMgbWVhbnMgdGhleSB3aWxsIGV4cG9ydCBuZXcgc3ltYm9scyB3aGVuIGBgaW1wb3J0ICpgYAorICBpcyB1c2VkLiAgU2VlIDppc3N1ZTpgMjM4ODNgLgorCisKK0NoYW5nZXMgaW4gdGhlIEMgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIDpjOmZ1bmM6YFB5X0V4aXRgIChhbmQgdGhlIG1haW4gaW50ZXJwcmV0ZXIpIG5vdyBvdmVycmlkZSB0aGUgZXhpdCBzdGF0dXMKKyAgd2l0aCAxMjAgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSBmYWlsZWQuICBTZWUgOmlzc3VlOmA1MzE5YC4KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QgYi9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CmluZGV4IGVkYjU1MDIuLjdjOTI1MjQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QKKysrIGIvRG9jL3doYXRzbmV3L2luZGV4LnJzdApAQCAtMTEsNiArMTEsNyBAQAogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDIKIAorICAgMy42LnJzdAogICAgMy41LnJzdAogICAgMy40LnJzdAogICAgMy4zLnJzdApkaWZmIC0tZ2l0IGEvR3JhbW1hci9HcmFtbWFyIGIvR3JhbW1hci9HcmFtbWFyCmluZGV4IDk5ZmNlYTAuLjE0YmRlY2QgMTAwNjQ0Ci0tLSBhL0dyYW1tYXIvR3JhbW1hcgorKysgYi9HcmFtbWFyL0dyYW1tYXIKQEAgLTI3LDEzICsyNywxOCBAQAogZnVuY2RlZjogJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZQogCiBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnCi0gICAgICAgWycqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZl1dCi0gICAgIHwgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZikKK3R5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJwotICAgICAgIFsnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWZdXQotICAgICB8ICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYpCit2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKionIHZmcGRlZiBbJywnXQorKQogdmZwZGVmOiBOQU1FCiAKIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCAyZDNlYWNiLi4xNzVlMzgwIDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtMjAxLDkgKzIwMSwxMCBAQAogICAgICAgICAgICAgICAgICAgU2V0Q29tcF9raW5kPTksIERpY3RDb21wX2tpbmQ9MTAsIEdlbmVyYXRvckV4cF9raW5kPTExLAogICAgICAgICAgICAgICAgICAgQXdhaXRfa2luZD0xMiwgWWllbGRfa2luZD0xMywgWWllbGRGcm9tX2tpbmQ9MTQsCiAgICAgICAgICAgICAgICAgICBDb21wYXJlX2tpbmQ9MTUsIENhbGxfa2luZD0xNiwgTnVtX2tpbmQ9MTcsIFN0cl9raW5kPTE4LAotICAgICAgICAgICAgICAgICAgQnl0ZXNfa2luZD0xOSwgTmFtZUNvbnN0YW50X2tpbmQ9MjAsIEVsbGlwc2lzX2tpbmQ9MjEsCi0gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yMiwgU3Vic2NyaXB0X2tpbmQ9MjMsIFN0YXJyZWRfa2luZD0yNCwKLSAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yNSwgTGlzdF9raW5kPTI2LCBUdXBsZV9raW5kPTI3fTsKKyAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2tpbmQ9MTksIEpvaW5lZFN0cl9raW5kPTIwLCBCeXRlc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgTmFtZUNvbnN0YW50X2tpbmQ9MjIsIEVsbGlwc2lzX2tpbmQ9MjMsIEF0dHJpYnV0ZV9raW5kPTI0LAorICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0X2tpbmQ9MjUsIFN0YXJyZWRfa2luZD0yNiwgTmFtZV9raW5kPTI3LAorICAgICAgICAgICAgICAgICAgTGlzdF9raW5kPTI4LCBUdXBsZV9raW5kPTI5fTsKIHN0cnVjdCBfZXhwciB7CiAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CiAgICAgdW5pb24gewpAQCAtMjk3LDYgKzI5OCwxNiBAQAogICAgICAgICB9IFN0cjsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgaW50IGNvbnZlcnNpb247CisgICAgICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworICAgICAgICB9IEZvcm1hdHRlZFZhbHVlOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGFzZGxfc2VxICp2YWx1ZXM7CisgICAgICAgIH0gSm9pbmVkU3RyOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgIGJ5dGVzIHM7CiAgICAgICAgIH0gQnl0ZXM7CiAgICAgICAgIApAQCAtNTQzLDYgKzU1NCwxMiBAQAogZXhwcl90eSBfUHlfTnVtKG9iamVjdCBuLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogI2RlZmluZSBTdHIoYTAsIGExLCBhMiwgYTMpIF9QeV9TdHIoYTAsIGExLCBhMiwgYTMpCiBleHByX3R5IF9QeV9TdHIoc3RyaW5nIHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEZvcm1hdHRlZFZhbHVlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9Gb3JtYXR0ZWRWYWx1ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfRm9ybWF0dGVkVmFsdWUoZXhwcl90eSB2YWx1ZSwgaW50IGNvbnZlcnNpb24sIGV4cHJfdHkgZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBKb2luZWRTdHIoYTAsIGExLCBhMiwgYTMpIF9QeV9Kb2luZWRTdHIoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9Kb2luZWRTdHIoYXNkbF9zZXEgKiB2YWx1ZXMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICAgICAgKmFyZW5hKTsKICNkZWZpbmUgQnl0ZXMoYTAsIGExLCBhMiwgYTMpIF9QeV9CeXRlcyhhMCwgYTEsIGEyLCBhMykKIGV4cHJfdHkgX1B5X0J5dGVzKGJ5dGVzIHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CiAjZGVmaW5lIE5hbWVDb25zdGFudChhMCwgYTEsIGEyLCBhMykgX1B5X05hbWVDb25zdGFudChhMCwgYTEsIGEyLCBhMykKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKaW5kZXggMTFkNWY0Mi4uZGJjMDMzYyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKKysrIGIvSW5jbHVkZS9ieXRlc19tZXRob2RzLmgKQEAgLTE3LDkgKzE3LDkgQEAKIC8qIFRoZXNlIHN0b3JlIHRoZWlyIGxlbiBzaXplZCBhbnN3ZXIgaW4gdGhlIGdpdmVuIHByZWFsbG9jYXRlZCAqcmVzdWx0IGFyZy4gKi8KIGV4dGVybiB2b2lkIF9QeV9ieXRlc19sb3dlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKIGV4dGVybiB2b2lkIF9QeV9ieXRlc191cHBlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CiAKIC8qIFRoZSBtYWtldHJhbnMoKSBzdGF0aWMgbWV0aG9kLiAqLwogZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfbWFrZXRyYW5zKFB5X2J1ZmZlciAqZnJtLCBQeV9idWZmZXIgKnRvKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNvYmplY3QuaCBiL0luY2x1ZGUvYnl0ZXNvYmplY3QuaAppbmRleCBlMzc5YmFjLi44NDY5MTEyIDEwMDY0NAotLS0gYS9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9ieXRlc29iamVjdC5oCkBAIC02Miw3ICs2MiwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUJ5dGVzX0NvbmNhdEFuZERlbChQeU9iamVjdCAqKiwgUHlPYmplY3QgKik7CiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9GVU5DKGludCkgX1B5Qnl0ZXNfUmVzaXplKFB5T2JqZWN0ICoqLCBQeV9zc2l6ZV90KTsKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Qnl0ZXNfRm9ybWF0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zvcm1hdEV4KAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICBQeV9zc2l6ZV90IGZvcm1hdF9sZW4sCisgICAgUHlPYmplY3QgKmFyZ3MsCisgICAgaW50IHVzZV9ieXRlYXJyYXkpOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zyb21IZXgoCisgICAgUHlPYmplY3QgKnN0cmluZywKKyAgICBpbnQgdXNlX2J5dGVhcnJheSk7CiAjZW5kaWYKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LAogCQkJCQkJICAgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LApAQCAtMTIzLDYgKzEzMCw4NyBAQAogI2RlZmluZSBGX0FMVAkoMTw8MykKICNkZWZpbmUgRl9aRVJPCSgxPDw0KQogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisvKiBUaGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlIGlzIGJpZzogaXQgY29udGFpbnMgYW4gZW1iZWRlZCAic3RhY2sgYnVmZmVyIi4KKyAgIEEgX1B5Qnl0ZXNXcml0ZXIgdmFyaWFibGUgbXVzdCBiZSBkZWNsYXJlZCBhdCB0aGUgZW5kIG9mIHZhcmlhYmxlcyBpbiBhCisgICBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIGJ5dGVzLCBieXRlYXJyYXkgb3IgTlVMTCAod2hlbiB0aGUgc21hbGwgYnVmZmVyIGlzIHVzZWQpICovCisgICAgUHlPYmplY3QgKmJ1ZmZlcjsKKworICAgIC8qIE51bWJlciBvZiBhbGxvY2F0ZWQgc2l6ZS4gKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKKworICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcywKKyAgICAgICBpbmNyZW1lbnRlZCBieSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCkgKi8KKyAgICBQeV9zc2l6ZV90IG1pbl9zaXplOworCisgICAgLyogSWYgbm9uLXplcm8sIHVzZSBhIGJ5dGVhcnJheSBpbnN0ZWFkIG9mIGEgYnl0ZXMgb2JqZWN0IGZvciBidWZmZXIuICovCisgICAgaW50IHVzZV9ieXRlYXJyYXk7CisKKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLgorICAgICAgIFRoaXMgZmxhZyBtdXN0IGJlIHplcm8gaWYgdXNlX2J5dGVhcnJheSBpcyBub24temVyby4gKi8KKyAgICBpbnQgb3ZlcmFsbG9jYXRlOworCisgICAgLyogU3RhY2sgYnVmZmVyICovCisgICAgaW50IHVzZV9zbWFsbF9idWZmZXI7CisgICAgY2hhciBzbWFsbF9idWZmZXJbNTEyXTsKK30gX1B5Qnl0ZXNXcml0ZXI7CisKKy8qIEluaXRpYWxpemUgYSBieXRlcyB3cml0ZXIKKworICAgQnkgZGVmYXVsdCwgdGhlIG92ZXJhbGxvY2F0aW9uIGlzIGRpc2FibGVkLiBTZXQgdGhlIG92ZXJhbGxvY2F0ZSBhdHRyaWJ1dGUKKyAgIHRvIGNvbnRyb2wgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGJ1ZmZlci4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5Qnl0ZXNXcml0ZXJfSW5pdChfUHlCeXRlc1dyaXRlciAqd3JpdGVyKTsKKworLyogR2V0IHRoZSBidWZmZXIgY29udGVudCBhbmQgcmVzZXQgdGhlIHdyaXRlci4KKyAgIFJldHVybiBhIGJ5dGVzIG9iamVjdCwgb3IgYSBieXRlYXJyYXkgb2JqZWN0IGlmIHVzZV9ieXRlYXJyYXkgaXMgbm9uLXplcm8uCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIpOworCisvKiBEZWFsbG9jYXRlIG1lbW9yeSBvZiBhIHdyaXRlciAoY2xlYXIgaXRzIGludGVybmFsIGJ1ZmZlcikuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcik7CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX0FsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgKnNpemUqIGJ5dGVzLgorICAgQWRkIHNpemUgdG8gdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIHN0ciBpcyB0aGUgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmV0dXJuIHRoZSB1cGRhdGVkIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIG1ha2UgaXQgbGFyZ2VyLgorICAgVGhlIG5ldyBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIHNpemUgYnl0ZXMgYmVjYXVzZSBvZiBvdmVyYWxsb2NhdGlvbi4KKyAgIFJldHVybiB0aGUgdXBkYXRlZCBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLgorCisgICBOb3RlOiBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSB3cml0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2UgdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIFNlZSBhbHNvIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoKS4KKyAgICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogV3JpdGUgYnl0ZXMuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBjb25zdCB2b2lkICpieXRlcywKKyAgICBQeV9zc2l6ZV90IHNpemUpOworI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBiNTM3M2E5Li5kMTk0MDQ0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC0yMDYsNiArMjA2LDE0IEBACiBQeUFQSV9GVU5DKHZvaWQpIF9QeUV2YWxfU2lnbmFsQXN5bmNFeGModm9pZCk7CiAjZW5kaWYKIAorLyogTWFza3MgYW5kIHZhbHVlcyB1c2VkIGJ5IEZPUk1BVF9WQUxVRSBvcGNvZGUuICovCisjZGVmaW5lIEZWQ19NQVNLICAgICAgMHgzCisjZGVmaW5lIEZWQ19OT05FICAgICAgMHgwCisjZGVmaW5lIEZWQ19TVFIgICAgICAgMHgxCisjZGVmaW5lIEZWQ19SRVBSICAgICAgMHgyCisjZGVmaW5lIEZWQ19BU0NJSSAgICAgMHgzCisjZGVmaW5lIEZWU19NQVNLICAgICAgMHg0CisjZGVmaW5lIEZWU19IQVZFX1NQRUMgMHg0CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9sb25nb2JqZWN0LmggYi9JbmNsdWRlL2xvbmdvYmplY3QuaAppbmRleCBhZWQ1OWNlLi5lYWY3YTdlIDEwMDY0NAotLS0gYS9JbmNsdWRlL2xvbmdvYmplY3QuaAorKysgYi9JbmNsdWRlL2xvbmdvYmplY3QuaApAQCAtNjUsNyArNjUsOCBAQAogIyAgZXJyb3IgInZvaWQqIGRpZmZlcmVudCBpbiBzaXplIGZyb20gaW50LCBsb25nIGFuZCBsb25nIGxvbmciCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCAqLwogCi0vKiBVc2VkIGJ5IFB5dGhvbi9teXN0cnRvdWwuYy4gKi8KKy8qIFVzZWQgYnkgUHl0aG9uL215c3RydG91bC5jLCBfUHlCeXRlc19Gcm9tSGV4KCksCisgICBfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoKSwgZXRjLiAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfREFUQSh1bnNpZ25lZCBjaGFyKSBfUHlMb25nX0RpZ2l0VmFsdWVbMjU2XTsKICNlbmRpZgpAQCAtMTgyLDYgKzE4MywxMyBAQAogICAgIGludCBiYXNlLAogICAgIGludCBhbHRlcm5hdGUpOwogCitQeUFQSV9GVU5DKGNoYXIqKSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKAorICAgIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgY2hhciAqc3RyLAorICAgIFB5T2JqZWN0ICpvYmosCisgICAgaW50IGJhc2UsCisgICAgaW50IGFsdGVybmF0ZSk7CisKIC8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQogICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkV3JpdGVyKApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vcGNvZGUuaCBiL0luY2x1ZGUvb3Bjb2RlLmgKaW5kZXggM2Y5MTdmYi4uYjI2NTM2OCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vcGNvZGUuaAorKysgYi9JbmNsdWRlL29wY29kZS5oCkBAIC0xMjIsNiArMTIyLDcgQEAKICNkZWZpbmUgQlVJTERfVFVQTEVfVU5QQUNLICAgICAgMTUyCiAjZGVmaW5lIEJVSUxEX1NFVF9VTlBBQ0sgICAgICAgIDE1MwogI2RlZmluZSBTRVRVUF9BU1lOQ19XSVRIICAgICAgICAxNTQKKyNkZWZpbmUgRk9STUFUX1ZBTFVFICAgICAgICAgICAgMTU1CiAKIC8qIEVYQ0VQVF9IQU5ETEVSIGlzIGEgc3BlY2lhbCwgaW1wbGljaXQgYmxvY2sgdHlwZSB3aGljaCBpcyBjcmVhdGVkIHdoZW4KICAgIGVudGVyaW5nIGFuIGV4Y2VwdCBoYW5kbGVyLiBJdCBpcyBub3QgYW4gb3Bjb2RlIGJ1dCB3ZSBkZWZpbmUgaXQgaGVyZQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9wYXRjaGxldmVsLmggYi9JbmNsdWRlL3BhdGNobGV2ZWwuaAppbmRleCAxMjQ5MDg2Li4yNDZlYmE4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3BhdGNobGV2ZWwuaAorKysgYi9JbmNsdWRlL3BhdGNobGV2ZWwuaApAQCAtMTcsMTMgKzE3LDEzIEBACiAvKiBWZXJzaW9uIHBhcnNlZCBvdXQgaW50byBudW1lcmljIHZhbHVlcyAqLwogLyotLXN0YXJ0IGNvbnN0YW50cy0tKi8KICNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkzCi0jZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNQotI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTEKLSNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCisjZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNgorI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTAKKyNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0FMUEhBCiAjZGVmaW5lIFBZX1JFTEVBU0VfU0VSSUFMCTAKIAogLyogVmVyc2lvbiBhcyBhIHN0cmluZyAqLwotI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIzLjUuMSsiCisjZGVmaW5lIFBZX1ZFUlNJT04gICAgICAJIjMuNi4wYTAiCiAvKi0tZW5kIGNvbnN0YW50cy0tKi8KIAogLyogVmVyc2lvbiBhcyBhIHNpbmdsZSA0LWJ5dGUgaGV4IG51bWJlciwgZS5nLiAweDAxMDUwMkIyID09IDEuNS4yYjIuCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5X2N1cnNlcy5oIGIvSW5jbHVkZS9weV9jdXJzZXMuaAppbmRleCBmMmMwOGY2Li4zYzIxNjk3IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5X2N1cnNlcy5oCisrKyBiL0luY2x1ZGUvcHlfY3Vyc2VzLmgKQEAgLTEwMyw4ICsxMDMsOCBAQAogI2VuZGlmCiAKIC8qIGdlbmVyYWwgZXJyb3IgbWVzc2FnZXMgKi8KLXN0YXRpYyBjaGFyICpjYXRjaGFsbF9FUlIgID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOwotc3RhdGljIGNoYXIgKmNhdGNoYWxsX05VTEwgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIE5VTEwiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfRVJSW10gID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfTlVMTFtdID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBOVUxMIjsKIAogLyogRnVuY3Rpb24gUHJvdG90eXBlIE1hY3JvcyAtIFRoZXkgYXJlIHVnbHkgYnV0IHZlcnksIHZlcnkgdXNlZnVsLiA7LSkKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWxpZmVjeWNsZS5oIGIvSW5jbHVkZS9weWxpZmVjeWNsZS5oCmluZGV4IGNjZGViZTIuLmU5NmViNzAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlsaWZlY3ljbGUuaAorKysgYi9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKQEAgLTI3LDYgKzI3LDcgQEAKIFB5QVBJX0ZVTkModm9pZCkgX1B5X0luaXRpYWxpemVFeF9Qcml2YXRlKGludCwgaW50KTsKICNlbmRpZgogUHlBUElfRlVOQyh2b2lkKSBQeV9GaW5hbGl6ZSh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeV9GaW5hbGl6ZUV4KHZvaWQpOwogUHlBUElfRlVOQyhpbnQpIFB5X0lzSW5pdGlhbGl6ZWQodm9pZCk7CiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlfTmV3SW50ZXJwcmV0ZXIodm9pZCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjcm8uaCBiL0luY2x1ZGUvcHltYWNyby5oCmluZGV4IDNmNmY1ZGMuLjQ5OTI5ZTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYWNyby5oCisrKyBiL0luY2x1ZGUvcHltYWNyby5oCkBAIC0zNiw2ICszNiwxMCBAQAogI2RlZmluZSBQeV9CVUlMRF9BU1NFUlRfRVhQUihjb25kKSBcCiAgICAgKHNpemVvZihjaGFyIFsxIC0gMiohKGNvbmQpXSkgLSAxKQogCisjZGVmaW5lIFB5X0JVSUxEX0FTU0VSVChjb25kKSAgZG8geyAgICAgICAgIFwKKyAgICAgICAgKHZvaWQpUHlfQlVJTERfQVNTRVJUX0VYUFIoY29uZCk7ICAgXAorICAgIH0gd2hpbGUoMCkKKwogLyogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2aXNpYmxlIGFycmF5CiAKICAgIFRoaXMgZG9lcyBub3Qgd29yayBvbiBwb2ludGVycywgb3IgYXJyYXlzIGRlY2xhcmVkIGFzIFtdLCBvciBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1hdGguaCBiL0luY2x1ZGUvcHltYXRoLmgKaW5kZXggMWVhOWFjMS4uZWQ3NjA1MyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hdGguaAorKysgYi9JbmNsdWRlL3B5bWF0aC5oCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICAgICAgI3ByYWdtYSBmbG9hdF9jb250cm9sIChwb3ApCiAgICAgICAgICNkZWZpbmUgUHlfTkFOIF9faWNjX25hbigpCiAgICAgI2Vsc2UgLyogSUNDX05BTl9SRUxBWEVEIGFzIGRlZmF1bHQgZm9yIEludGVsIENvbXBpbGVyICovCi0gICAgICAgIHN0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CisgICAgICAgIHN0YXRpYyBjb25zdCB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CiAgICAgICAgICNkZWZpbmUgUHlfTkFOIChfX25hbl9zdG9yZS5fX2ljY19uYW4pCiAgICAgI2VuZGlmIC8qIElDQ19OQU5fU1RSSUNUICovCiAjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRob25ydW4uaCBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKaW5kZXggZjkyMTQ4ZC4uM2I5M2E4MCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRob25ydW4uaAorKysgYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCkBAIC02Niw4ICs2Niw4IEBACiAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICAgICAgIC8qIGRlY29kZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyAqLwogICAgIGNvbnN0IGNoYXIqIGVuYywKICAgICBpbnQgc3RhcnQsCi0gICAgY2hhciAqcHMxLAotICAgIGNoYXIgKnBzMiwKKyAgICBjb25zdCBjaGFyICpwczEsCisgICAgY29uc3QgY2hhciAqcHMyLAogICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCiAgICAgaW50ICplcnJjb2RlLAogICAgIFB5QXJlbmEgKmFyZW5hKTsKQEAgLTc2LDggKzc2LDggQEAKICAgICBQeU9iamVjdCAqZmlsZW5hbWUsCiAgICAgY29uc3QgY2hhciogZW5jLAogICAgIGludCBzdGFydCwKLSAgICBjaGFyICpwczEsCi0gICAgY2hhciAqcHMyLAorICAgIGNvbnN0IGNoYXIgKnBzMSwKKyAgICBjb25zdCBjaGFyICpwczIsCiAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywKICAgICBpbnQgKmVycmNvZGUsCiAgICAgUHlBcmVuYSAqYXJlbmEpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRpbWUuaCBiL0luY2x1ZGUvcHl0aW1lLmgKaW5kZXggNDk0MzIyYy4uOTg2MTJlMSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRpbWUuaAorKysgYi9JbmNsdWRlL3B5dGltZS5oCkBAIC0zMCw3ICszMCwxMCBAQAogICAgIF9QeVRpbWVfUk9VTkRfRkxPT1I9MCwKICAgICAvKiBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKS4KICAgICAgICBGb3IgZXhhbXBsZSwgdXNlZCBmb3IgdGltZW91dCB0byB3YWl0ICJhdCBsZWFzdCIgTiBzZWNvbmRzLiAqLwotICAgIF9QeVRpbWVfUk9VTkRfQ0VJTElORworICAgIF9QeVRpbWVfUk9VTkRfQ0VJTElORz0xLAorICAgIC8qIFJvdW5kIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvIG5lYXJlc3QgZXZlbiBpbnRlZ2VyLgorICAgICAgIEZvciBleGFtcGxlLCB1c2VkIHRvIHJvdW5kIGZyb20gYSBQeXRob24gZmxvYXQuICovCisgICAgX1B5VGltZV9ST1VORF9IQUxGX0VWRU4KIH0gX1B5VGltZV9yb3VuZF90OwogCiAvKiBDb252ZXJ0IGEgdGltZV90IHRvIGEgUHlMb25nLiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zZXRvYmplY3QuaCBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKaW5kZXggZjE3YmMxYi4uODdlYzFjOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zZXRvYmplY3QuaAorKysgYi9JbmNsdWRlL3NldG9iamVjdC5oCkBAIC0xMCwxMiArMTAsMTMgQEAKIAogLyogVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlOgogCi0xLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTAotMi4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teQotMy4gRHVtbXk6ICAga2V5ID09IGR1bW15CisxLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTCBhbmQgaGFzaCA9PSAwCisyLiBEdW1teTogICBrZXkgPT0gZHVtbXkgYW5kIGhhc2ggPT0gLTEKKzMuIEFjdGl2ZTogIGtleSAhPSBOVUxMIGFuZCBrZXkgIT0gZHVtbXkgYW5kIGhhc2ggIT0gLTEKIAotVGhlIGhhc2ggZmllbGQgb2YgVW51c2VkIHNsb3RzIGhhdmUgbm8gbWVhbmluZy4KLVRoZSBoYXNoIGZpZWxkIG9mIER1bW1ueSBzbG90cyBhcmUgc2V0IHRvIC0xCitUaGUgaGFzaCBmaWVsZCBvZiBVbnVzZWQgc2xvdHMgaXMgYWx3YXlzIHplcm8uCisKK1RoZSBoYXNoIGZpZWxkIG9mIER1bW15IHNsb3RzIGFyZSBzZXQgdG8gLTEKIG1lYW5pbmcgdGhhdCBkdW1teSBlbnRyaWVzIGNhbiBiZSBkZXRlY3RlZCBieQogZWl0aGVyIGVudHJ5LT5rZXk9PWR1bW15IG9yIGJ5IGVudHJ5LT5oYXNoPT0tMS4KICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaCBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCmluZGV4IDA5YzliMjEuLmYwYzE5MDUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCkBAIC05MDgsNyArOTA4LDcgQEAKICAgICAvKiBtaW5pbXVtIGNoYXJhY3RlciAoZGVmYXVsdDogMTI3LCBBU0NJSSkgKi8KICAgICBQeV9VQ1M0IG1pbl9jaGFyOwogCi0gICAgLyogSWYgbm9uLXplcm8sIG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGJ5IDI1JSAoZGVmYXVsdDogMCkuICovCisgICAgLyogSWYgbm9uLXplcm8sIG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIChkZWZhdWx0OiAwKS4gKi8KICAgICB1bnNpZ25lZCBjaGFyIG92ZXJhbGxvY2F0ZTsKIAogICAgIC8qIElmIHJlYWRvbmx5IGlzIDEsIGJ1ZmZlciBpcyBhIHNoYXJlZCBzdHJpbmcgKGNhbm5vdCBiZSBtb2RpZmllZCkKQEAgLTk0Miw2ICs5NDIsMjMgQEAKIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9VQ1M0IG1heGNoYXIpOwogCisvKiBQcmVwYXJlIHRoZSBidWZmZXIgdG8gaGF2ZSBhdCBsZWFzdCB0aGUga2luZCBLSU5ELgorICAgRm9yIGV4YW1wbGUsIGtpbmQ9UHlVbmljb2RlXzJCWVRFX0tJTkQgZW5zdXJlcyB0aGF0IHRoZSB3cml0ZXIgd2lsbAorICAgc3VwcG9ydCBjaGFyYWN0ZXJzIGluIHJhbmdlIFUrMDAwLVUrRkZGRi4KKworICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCisjZGVmaW5lIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoV1JJVEVSLCBLSU5EKSAgICAgICAgICAgICAgICAgICAgXAorICAgIChhc3NlcnQoKEtJTkQpICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKEtJTkQpIDw9IChXUklURVIpLT5raW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgID8gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6IF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbCgoV1JJVEVSKSwgKEtJTkQpKSkKKworLyogRG9uJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCB1c2UgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKQorICAgbWFjcm8gaW5zdGVhZC4gKi8KK1B5QVBJX0ZVTkMoaW50KQorX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQpOworCiAvKiBBcHBlbmQgYSBVbmljb2RlIGNoYXJhY3Rlci4KICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLwogUHlBUElfRlVOQyhpbnQpCkBAIC0yMjYxLDYgKzIyNzgsMTAgQEAKIC8qIENsZWFyIGFsbCBzdGF0aWMgc3RyaW5ncy4gKi8KIFB5QVBJX0ZVTkModm9pZCkgX1B5VW5pY29kZV9DbGVhclN0YXRpY1N0cmluZ3Modm9pZCk7CiAKKy8qIEZhc3QgZXF1YWxpdHkgY2hlY2sgd2hlbiB0aGUgaW5wdXRzIGFyZSBrbm93biB0byBiZSBleGFjdCB1bmljb2RlIHR5cGVzCisgICBhbmQgd2hlcmUgdGhlIGhhc2ggdmFsdWVzIGFyZSBlcXVhbCAoaS5lLiBhIHZlcnkgcHJvYmFibGUgbWF0Y2gpICovCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9FUShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0xpYi9fcHlkZWNpbWFsLnB5IGIvTGliL19weWRlY2ltYWwucHkKaW5kZXggMDViYTRlZS4uMDIzNjVjYSAxMDA2NDQKLS0tIGEvTGliL19weWRlY2ltYWwucHkKKysrIGIvTGliL19weWRlY2ltYWwucHkKQEAgLTEwMTAsNiArMTAxMCw1NiBAQAogICAgICAgICAiIiIKICAgICAgICAgcmV0dXJuIERlY2ltYWxUdXBsZShzZWxmLl9zaWduLCB0dXBsZShtYXAoaW50LCBzZWxmLl9pbnQpKSwgc2VsZi5fZXhwKQogCisgICAgZGVmIGFzX2ludGVnZXJfcmF0aW8oc2VsZik6CisgICAgICAgICIiIkV4cHJlc3MgYSBmaW5pdGUgRGVjaW1hbCBpbnN0YW5jZSBpbiB0aGUgZm9ybSBuIC8gZC4KKworICAgICAgICBSZXR1cm5zIGEgcGFpciAobiwgZCkgb2YgaW50ZWdlcnMuICBXaGVuIGNhbGxlZCBvbiBhbiBpbmZpbml0eQorICAgICAgICBvciBOYU4sIHJhaXNlcyBPdmVyZmxvd0Vycm9yIG9yIFZhbHVlRXJyb3IgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgID4+PiBEZWNpbWFsKCczLjE0JykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgxNTcsIDUwKQorICAgICAgICA+Pj4gRGVjaW1hbCgnLTEyM2U1JykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgtMTIzMDAwMDAsIDEpCisgICAgICAgID4+PiBEZWNpbWFsKCcwLjAwJykuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICgwLCAxKQorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5pc19uYW4oKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iKQorCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIDAsIDEKKworICAgICAgICAjIEZpbmQgbiwgZCBpbiBsb3dlc3QgdGVybXMgc3VjaCB0aGF0IGFicyhzZWxmKSA9PSBuIC8gZDsKKyAgICAgICAgIyB3ZSdsbCBkZWFsIHdpdGggdGhlIHNpZ24gbGF0ZXIuCisgICAgICAgIG4gPSBpbnQoc2VsZi5faW50KQorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgICMgc2VsZiBpcyBhbiBpbnRlZ2VyLgorICAgICAgICAgICAgbiwgZCA9IG4gKiAxMCoqc2VsZi5fZXhwLCAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEZpbmQgZDIsIGQ1IHN1Y2ggdGhhdCBhYnMoc2VsZikgPSBuIC8gKDIqKmQyICogNSoqZDUpLgorICAgICAgICAgICAgZDUgPSAtc2VsZi5fZXhwCisgICAgICAgICAgICB3aGlsZSBkNSA+IDAgYW5kIG4gJSA1ID09IDA6CisgICAgICAgICAgICAgICAgbiAvLz0gNQorICAgICAgICAgICAgICAgIGQ1IC09IDEKKworICAgICAgICAgICAgIyAobiAmIC1uKS5iaXRfbGVuZ3RoKCkgLSAxIGNvdW50cyB0cmFpbGluZyB6ZXJvcyBpbiBiaW5hcnkKKyAgICAgICAgICAgICMgcmVwcmVzZW50YXRpb24gb2YgbiAocHJvdmlkZWQgbiBpcyBub256ZXJvKS4KKyAgICAgICAgICAgIGQyID0gLXNlbGYuX2V4cAorICAgICAgICAgICAgc2hpZnQyID0gbWluKChuICYgLW4pLmJpdF9sZW5ndGgoKSAtIDEsIGQyKQorICAgICAgICAgICAgaWYgc2hpZnQyOgorICAgICAgICAgICAgICAgIG4gPj49IHNoaWZ0MgorICAgICAgICAgICAgICAgIGQyIC09IHNoaWZ0MgorCisgICAgICAgICAgICBkID0gNSoqZDUgPDwgZDIKKworICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgbiA9IC1uCisgICAgICAgIHJldHVybiBuLCBkCisKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgICIiIlJlcHJlc2VudHMgdGhlIG51bWJlciBhcyBhbiBpbnN0YW5jZSBvZiBEZWNpbWFsLiIiIgogICAgICAgICAjIEludmFyaWFudDogIGV2YWwocmVwcihkKSkgPT0gZApkaWZmIC0tZ2l0IGEvTGliL19weWlvLnB5IGIvTGliL19weWlvLnB5CmluZGV4IDM3MTU3ZDUuLmMzYWQ4MWUgMTAwNjQ0Ci0tLSBhL0xpYi9fcHlpby5weQorKysgYi9MaWIvX3B5aW8ucHkKQEAgLTE4Miw4ICsxODIsOCBAQAogICAgIHRleHQgPSAidCIgaW4gbW9kZXMKICAgICBiaW5hcnkgPSAiYiIgaW4gbW9kZXMKICAgICBpZiAiVSIgaW4gbW9kZXM6Ci0gICAgICAgIGlmIGNyZWF0aW5nIG9yIHdyaXRpbmcgb3IgYXBwZW5kaW5nOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgdXNlIFUgYW5kIHdyaXRpbmcgbW9kZSBhdCBvbmNlIikKKyAgICAgICAgaWYgY3JlYXRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmcgb3IgdXBkYXRpbmc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIFUgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggJ3gnLCAndycsICdhJywgb3IgJysnIikKICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgIHdhcm5pbmdzLndhcm4oIidVJyBtb2RlIGlzIGRlcHJlY2F0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKZGlmZiAtLWdpdCBhL0xpYi9fc3RycHRpbWUucHkgYi9MaWIvX3N0cnB0aW1lLnB5CmluZGV4IGI4Y2RhNzYuLjhkYTRmY2QgMTAwNjQ0Ci0tLSBhL0xpYi9fc3RycHRpbWUucHkKKysrIGIvTGliL19zdHJwdGltZS5weQpAQCAtMTk5LDEyICsxOTksMTUgQEAKICAgICAgICAgICAgICdmJzogciIoP1A8Zj5bMC05XXsxLDZ9KSIsCiAgICAgICAgICAgICAnSCc6IHIiKD9QPEg+MlswLTNdfFswLTFdXGR8XGQpIiwKICAgICAgICAgICAgICdJJzogciIoP1A8ST4xWzAtMl18MFsxLTldfFsxLTldKSIsCisgICAgICAgICAgICAnRyc6IHIiKD9QPEc+XGRcZFxkXGQpIiwKICAgICAgICAgICAgICdqJzogciIoP1A8aj4zNlswLTZdfDNbMC01XVxkfFsxLTJdXGRcZHwwWzEtOV1cZHwwMFsxLTldfFsxLTldXGR8MFsxLTldfFsxLTldKSIsCiAgICAgICAgICAgICAnbSc6IHIiKD9QPG0+MVswLTJdfDBbMS05XXxbMS05XSkiLAogICAgICAgICAgICAgJ00nOiByIig/UDxNPlswLTVdXGR8XGQpIiwKICAgICAgICAgICAgICdTJzogciIoP1A8Uz42WzAtMV18WzAtNV1cZHxcZCkiLAogICAgICAgICAgICAgJ1UnOiByIig/UDxVPjVbMC0zXXxbMC00XVxkfFxkKSIsCiAgICAgICAgICAgICAndyc6IHIiKD9QPHc+WzAtNl0pIiwKKyAgICAgICAgICAgICd1JzogciIoP1A8dT5bMS03XSkiLAorICAgICAgICAgICAgJ1YnOiByIig/UDxWPjVbMC0zXXwwWzEtOV18WzEtNF1cZHxcZCkiLAogICAgICAgICAgICAgIyBXIGlzIHNldCBiZWxvdyBieSB1c2luZyAnVScKICAgICAgICAgICAgICd5JzogciIoP1A8eT5cZFxkKSIsCiAgICAgICAgICAgICAjWFhYOiBEb2VzICdZJyBuZWVkIHRvIHdvcnJ5IGFib3V0IGhhdmluZyBsZXNzIG9yIG1vcmUgdGhhbgpAQCAtMjk5LDYgKzMwMiwyMiBAQAogICAgICAgICByZXR1cm4gMSArIGRheXNfdG9fd2VlayArIGRheV9vZl93ZWVrCiAKIAorZGVmIF9jYWxjX2p1bGlhbl9mcm9tX1YoaXNvX3llYXIsIGlzb193ZWVrLCBpc29fd2Vla2RheSk6CisgICAgIiIiQ2FsY3VsYXRlIHRoZSBKdWxpYW4gZGF5IGJhc2VkIG9uIHRoZSBJU08gODYwMSB5ZWFyLCB3ZWVrLCBhbmQgd2Vla2RheS4KKyAgICBJU08gd2Vla3Mgc3RhcnQgb24gTW9uZGF5cywgd2l0aCB3ZWVrIDAxIGJlaW5nIHRoZSB3ZWVrIGNvbnRhaW5pbmcgNCBKYW4uCisgICAgSVNPIHdlZWsgZGF5cyByYW5nZSBmcm9tIDEgKE1vbmRheSkgdG8gNyAoU3VuZGF5KS4KKyAgICAiIiIKKyAgICBjb3JyZWN0aW9uID0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgNCkuaXNvd2Vla2RheSgpICsgMworICAgIG9yZGluYWwgPSAoaXNvX3dlZWsgKiA3KSArIGlzb193ZWVrZGF5IC0gY29ycmVjdGlvbgorICAgICMgb3JkaW5hbCBtYXkgYmUgbmVnYXRpdmUgb3IgMCBub3csIHdoaWNoIG1lYW5zIHRoZSBkYXRlIGlzIGluIHRoZSBwcmV2aW91cworICAgICMgY2FsZW5kYXIgeWVhcgorICAgIGlmIG9yZGluYWwgPCAxOgorICAgICAgICBvcmRpbmFsICs9IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgICAgIGlzb195ZWFyIC09IDEKKyAgICAgICAgb3JkaW5hbCAtPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCAxKS50b29yZGluYWwoKQorICAgIHJldHVybiBpc29feWVhciwgb3JkaW5hbAorCisKIGRlZiBfc3RycHRpbWUoZGF0YV9zdHJpbmcsIGZvcm1hdD0iJWEgJWIgJWQgJUg6JU06JVMgJVkiKToKICAgICAiIiJSZXR1cm4gYSAyLXR1cGxlIGNvbnNpc3Rpbmcgb2YgYSB0aW1lIHN0cnVjdCBhbmQgYW4gaW50IGNvbnRhaW5pbmcKICAgICB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUKQEAgLTM0NSwxNSArMzY0LDE1IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuY29udmVydGVkIGRhdGEgcmVtYWluczogJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zdHJpbmdbZm91bmQuZW5kKCk6XSkKIAotICAgIHllYXIgPSBOb25lCisgICAgaXNvX3llYXIgPSB5ZWFyID0gTm9uZQogICAgIG1vbnRoID0gZGF5ID0gMQogICAgIGhvdXIgPSBtaW51dGUgPSBzZWNvbmQgPSBmcmFjdGlvbiA9IDAKICAgICB0eiA9IC0xCiAgICAgdHpvZmZzZXQgPSBOb25lCiAgICAgIyBEZWZhdWx0IHRvIC0xIHRvIHNpZ25pZnkgdGhhdCB2YWx1ZXMgbm90IGtub3duOyBub3QgY3JpdGljYWwgdG8gaGF2ZSwKICAgICAjIHRob3VnaAotICAgIHdlZWtfb2ZfeWVhciA9IC0xCi0gICAgd2Vla19vZl95ZWFyX3N0YXJ0ID0gLTEKKyAgICBpc29fd2VlayA9IHdlZWtfb2ZfeWVhciA9IE5vbmUKKyAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSBOb25lCiAgICAgIyB3ZWVrZGF5IGFuZCBqdWxpYW4gZGVmYXVsdGVkIHRvIE5vbmUgc28gYXMgdG8gc2lnbmFsIG5lZWQgdG8gY2FsY3VsYXRlCiAgICAgIyB2YWx1ZXMKICAgICB3ZWVrZGF5ID0ganVsaWFuID0gTm9uZQpAQCAtMzc1LDYgKzM5NCw4IEBACiAgICAgICAgICAgICAgICAgeWVhciArPSAxOTAwCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdZJzoKICAgICAgICAgICAgIHllYXIgPSBpbnQoZm91bmRfZGljdFsnWSddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnRyc6CisgICAgICAgICAgICBpc29feWVhciA9IGludChmb3VuZF9kaWN0WydHJ10pCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdtJzoKICAgICAgICAgICAgIG1vbnRoID0gaW50KGZvdW5kX2RpY3RbJ20nXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ0InOgpAQCAtNDIwLDYgKzQ0MSw5IEBACiAgICAgICAgICAgICAgICAgd2Vla2RheSA9IDYKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgd2Vla2RheSAtPSAxCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICd1JzoKKyAgICAgICAgICAgIHdlZWtkYXkgPSBpbnQoZm91bmRfZGljdFsndSddKQorICAgICAgICAgICAgd2Vla2RheSAtPSAxCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdqJzoKICAgICAgICAgICAgIGp1bGlhbiA9IGludChmb3VuZF9kaWN0WydqJ10pCiAgICAgICAgIGVsaWYgZ3JvdXBfa2V5IGluICgnVScsICdXJyk6CkBAIC00MzAsNiArNDU0LDggQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBXIHN0YXJ0cyB3ZWVrIG9uIE1vbmRheS4KICAgICAgICAgICAgICAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAwCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdWJzoKKyAgICAgICAgICAgIGlzb193ZWVrID0gaW50KGZvdW5kX2RpY3RbJ1YnXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3onOgogICAgICAgICAgICAgeiA9IGZvdW5kX2RpY3RbJ3onXQogICAgICAgICAgICAgdHpvZmZzZXQgPSBpbnQoelsxOjNdKSAqIDYwICsgaW50KHpbMzo1XSkKQEAgLTQ1MCwyOCArNDc2LDU3IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICB0eiA9IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICMgRGVhbCB3aXRoIHRoZSBjYXNlcyB3aGVyZSBhbWJpZ3VpdGllcyBhcml6ZQorICAgICMgZG9uJ3QgYXNzdW1lIGRlZmF1bHQgdmFsdWVzIGZvciBJU08gd2Vlay95ZWFyCisgICAgaWYgeWVhciBpcyBOb25lIGFuZCBpc29feWVhciBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgaXNvX3dlZWsgaXMgTm9uZSBvciB3ZWVrZGF5IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJU08geWVhciBkaXJlY3RpdmUgJyVHJyBtdXN0IGJlIHVzZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgSVNPIHdlZWsgZGlyZWN0aXZlICclVicgYW5kIGEgd2Vla2RheSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RpdmUgKCclQScsICclYScsICcldycsIG9yICcldScpLiIpCisgICAgICAgIGlmIGp1bGlhbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRheSBvZiB0aGUgeWVhciBkaXJlY3RpdmUgJyVqJyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGF0aWJsZSB3aXRoIElTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgJyVZJyBpbnN0ZWFkLiIpCisgICAgZWxpZiB3ZWVrX29mX3llYXIgaXMgTm9uZSBhbmQgaXNvX3dlZWsgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHdlZWtkYXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB3ZWVrIGRpcmVjdGl2ZSAnJVYnIG11c3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBJU08geWVhciBkaXJlY3RpdmUgJyVHJyBhbmQgYSB3ZWVrZGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSAoJyVBJywgJyVhJywgJyV3Jywgb3IgJyV1JykuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB3ZWVrIGRpcmVjdGl2ZSAnJVYnIGlzIGluY29tcGF0aWJsZSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSB5ZWFyIGRpcmVjdGl2ZSAnJVknLiBVc2UgdGhlIElTTyB5ZWFyICclRycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZC4iKQorCiAgICAgbGVhcF95ZWFyX2ZpeCA9IEZhbHNlCiAgICAgaWYgeWVhciBpcyBOb25lIGFuZCBtb250aCA9PSAyIGFuZCBkYXkgPT0gMjk6CiAgICAgICAgIHllYXIgPSAxOTA0ICAjIDE5MDQgaXMgZmlyc3QgbGVhcCB5ZWFyIG9mIDIwdGggY2VudHVyeQogICAgICAgICBsZWFwX3llYXJfZml4ID0gVHJ1ZQogICAgIGVsaWYgeWVhciBpcyBOb25lOgogICAgICAgICB5ZWFyID0gMTkwMAorCisKICAgICAjIElmIHdlIGtub3cgdGhlIHdlZWsgb2YgdGhlIHllYXIgYW5kIHdoYXQgZGF5IG9mIHRoYXQgd2Vlaywgd2UgY2FuIGZpZ3VyZQogICAgICMgb3V0IHRoZSBKdWxpYW4gZGF5IG9mIHRoZSB5ZWFyLgotICAgIGlmIGp1bGlhbiBpcyBOb25lIGFuZCB3ZWVrX29mX3llYXIgIT0gLTEgYW5kIHdlZWtkYXkgaXMgbm90IE5vbmU6Ci0gICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQotICAgICAgICBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9VX29yX1coeWVhciwgd2Vla19vZl95ZWFyLCB3ZWVrZGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrX3N0YXJ0c19Nb24pCi0gICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KLSAgICAjIGNhbGN1bGF0aW9uIGFuZCB0aHVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrCi0gICAgIyBjYWxjdWxhdGlvbi4KKyAgICBpZiBqdWxpYW4gaXMgTm9uZSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla19vZl95ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCisgICAgICAgICAgICBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9VX29yX1coeWVhciwgd2Vla19vZl95ZWFyLCB3ZWVrZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uKQorICAgICAgICBlbGlmIGlzb195ZWFyIGlzIG5vdCBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHllYXIsIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1YoaXNvX3llYXIsIGlzb193ZWVrLCB3ZWVrZGF5ICsgMSkKKwogICAgIGlmIGp1bGlhbiBpcyBOb25lOgorICAgICAgICAjIENhbm5vdCBwcmUtY2FsY3VsYXRlIGRhdGV0aW1lX2RhdGUoKSBzaW5jZSBjYW4gY2hhbmdlIGluIEp1bGlhbgorICAgICAgICAjIGNhbGN1bGF0aW9uIGFuZCB0aHVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgZGF5IG9mCisgICAgICAgICMgdGhlIHdlZWsgY2FsY3VsYXRpb24uCiAgICAgICAgICMgTmVlZCB0byBhZGQgMSB0byByZXN1bHQgc2luY2UgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGlzIDEsIG5vdCAwLgogICAgICAgICBqdWxpYW4gPSBkYXRldGltZV9kYXRlKHllYXIsIG1vbnRoLCBkYXkpLnRvb3JkaW5hbCgpIC0gXAogICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSArIDEKLSAgICBlbHNlOiAgIyBBc3N1bWUgdGhhdCBpZiB0aGV5IGJvdGhlcmVkIHRvIGluY2x1ZGUgSnVsaWFuIGRheSBpdCB3aWxsCi0gICAgICAgICAgICMgYmUgYWNjdXJhdGUuCi0gICAgICAgIGRhdGV0aW1lX3Jlc3VsdCA9IGRhdGV0aW1lX2RhdGUuZnJvbW9yZGluYWwoKGp1bGlhbiAtIDEpICsgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSkKKyAgICBlbHNlOiAgIyBBc3N1bWUgdGhhdCBpZiB0aGV5IGJvdGhlcmVkIHRvIGluY2x1ZGUgSnVsaWFuIGRheSAob3IgaWYgaXQgd2FzCisgICAgICAgICAgICMgY2FsY3VsYXRlZCBhYm92ZSB3aXRoIHllYXIvd2Vlay93ZWVrZGF5KSBpdCB3aWxsIGJlIGFjY3VyYXRlLgorICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqdWxpYW4gLSAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSkKICAgICAgICAgeWVhciA9IGRhdGV0aW1lX3Jlc3VsdC55ZWFyCiAgICAgICAgIG1vbnRoID0gZGF0ZXRpbWVfcmVzdWx0Lm1vbnRoCiAgICAgICAgIGRheSA9IGRhdGV0aW1lX3Jlc3VsdC5kYXkKZGlmZiAtLWdpdCBhL0xpYi9haWZjLnB5IGIvTGliL2FpZmMucHkKaW5kZXggN2ViZGJlYi4uNjkyZDBiZiAxMDA2NDQKLS0tIGEvTGliL2FpZmMucHkKKysrIGIvTGliL2FpZmMucHkKQEAgLTI1Nyw2ICsyNTcsMTUgQEAKIF9haWZjX3BhcmFtcyA9IG5hbWVkdHVwbGUoJ19haWZjX3BhcmFtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICduY2hhbm5lbHMgc2FtcHdpZHRoIGZyYW1lcmF0ZSBuZnJhbWVzIGNvbXB0eXBlIGNvbXBuYW1lJykKIAorX2FpZmNfcGFyYW1zLm5jaGFubmVscy5fX2RvY19fID0gJ051bWJlciBvZiBhdWRpbyBjaGFubmVscyAoMSBmb3IgbW9ubywgMiBmb3Igc3RlcmVvKScKK19haWZjX3BhcmFtcy5zYW1wd2lkdGguX19kb2NfXyA9ICdTYW1wbGUgd2lkdGggaW4gYnl0ZXMnCitfYWlmY19wYXJhbXMuZnJhbWVyYXRlLl9fZG9jX18gPSAnU2FtcGxpbmcgZnJlcXVlbmN5JworX2FpZmNfcGFyYW1zLm5mcmFtZXMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gZnJhbWVzJworX2FpZmNfcGFyYW1zLmNvbXB0eXBlLl9fZG9jX18gPSAnQ29tcHJlc3Npb24gdHlwZSAoIk5PTkUiIGZvciBBSUZGIGZpbGVzKScKK19haWZjX3BhcmFtcy5jb21wbmFtZS5fX2RvY19fID0gKCIiIlwKK0EgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgY29tcHJlc3Npb24gdHlwZQorKCdub3QgY29tcHJlc3NlZCcgZm9yIEFJRkYgZmlsZXMpIiIiKQorCiAKIGNsYXNzIEFpZmNfcmVhZDoKICAgICAjIFZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY2xhc3M6CmRpZmYgLS1naXQgYS9MaWIvYXJncGFyc2UucHkgYi9MaWIvYXJncGFyc2UucHkKaW5kZXggOWEwNjcxOS4uY2M1Mzg0MSAxMDA2NDQKLS0tIGEvTGliL2FyZ3BhcnNlLnB5CisrKyBiL0xpYi9hcmdwYXJzZS5weQpAQCAtMTE4LDEwICsxMTgsMTYgQEAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHR5cGVfbmFtZSA9IHR5cGUoc2VsZikuX19uYW1lX18KICAgICAgICAgYXJnX3N0cmluZ3MgPSBbXQorICAgICAgICBzdGFyX2FyZ3MgPSB7fQogICAgICAgICBmb3IgYXJnIGluIHNlbGYuX2dldF9hcmdzKCk6CiAgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQocmVwcihhcmcpKQogICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2VsZi5fZ2V0X2t3YXJncygpOgotICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgaWYgbmFtZS5pc2lkZW50aWZpZXIoKToKKyAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyVzPSVyJyAlIChuYW1lLCB2YWx1ZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJfYXJnc1tuYW1lXSA9IHZhbHVlCisgICAgICAgIGlmIHN0YXJfYXJnczoKKyAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnKiolcycgJSByZXByKHN0YXJfYXJncykpCiAgICAgICAgIHJldHVybiAnJXMoJXMpJyAlICh0eXBlX25hbWUsICcsICcuam9pbihhcmdfc3RyaW5ncykpCiAKICAgICBkZWYgX2dldF9rd2FyZ3Moc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYmFzZTY0LnB5IGIvTGliL2Jhc2U2NC5weQppbmRleCA2NDBmNzg3Li5lYjkyNWNkIDEwMDc1NQotLS0gYS9MaWIvYmFzZTY0LnB5CisrKyBiL0xpYi9iYXNlNjQucHkKQEAgLTU4LDggKzU4LDcgQEAKIAogICAgIFRoZSBlbmNvZGVkIGJ5dGUgc3RyaW5nIGlzIHJldHVybmVkLgogICAgICIiIgotICAgICMgU3RyaXAgb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lCi0gICAgZW5jb2RlZCA9IGJpbmFzY2lpLmIyYV9iYXNlNjQocylbOi0xXQorICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMsIG5ld2xpbmU9RmFsc2UpCiAgICAgaWYgYWx0Y2hhcnMgaXMgbm90IE5vbmU6CiAgICAgICAgIGFzc2VydCBsZW4oYWx0Y2hhcnMpID09IDIsIHJlcHIoYWx0Y2hhcnMpCiAgICAgICAgIHJldHVybiBlbmNvZGVkLnRyYW5zbGF0ZShieXRlcy5tYWtldHJhbnMoYicrLycsIGFsdGNoYXJzKSkKZGlmZiAtLWdpdCBhL0xpYi9jYWxlbmRhci5weSBiL0xpYi9jYWxlbmRhci5weQppbmRleCA1MjQ0YjhkLi4xOTZhMDc1IDEwMDY0NAotLS0gYS9MaWIvY2FsZW5kYXIucHkKKysrIGIvTGliL2NhbGVuZGFyLnB5CkBAIC02MDUsNTEgKzYwNSw2MyBAQAogCiAKIGRlZiBtYWluKGFyZ3MpOgotICAgIGltcG9ydCBvcHRwYXJzZQotICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0idXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbeWVhciBbbW9udGhdXSIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgaW1wb3J0IGFyZ3BhcnNlCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHRleHRncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ3RleHQgb25seSBhcmd1bWVudHMnKQorICAgIGh0bWxncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ2h0bWwgb25seSBhcmd1bWVudHMnKQorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItdyIsICItLXdpZHRoIiwKLSAgICAgICAgZGVzdD0id2lkdGgiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTIsCi0gICAgICAgIGhlbHA9IndpZHRoIG9mIGRhdGUgY29sdW1uIChkZWZhdWx0IDIsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTIsCisgICAgICAgIGhlbHA9IndpZHRoIG9mIGRhdGUgY29sdW1uIChkZWZhdWx0IDIpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWwiLCAiLS1saW5lcyIsCi0gICAgICAgIGRlc3Q9ImxpbmVzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0xLAotICAgICAgICBoZWxwPSJudW1iZXIgb2YgbGluZXMgZm9yIGVhY2ggd2VlayAoZGVmYXVsdCAxLCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD0xLAorICAgICAgICBoZWxwPSJudW1iZXIgb2YgbGluZXMgZm9yIGVhY2ggd2VlayAoZGVmYXVsdCAxKSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1zIiwgIi0tc3BhY2luZyIsCi0gICAgICAgIGRlc3Q9InNwYWNpbmciLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTYsCi0gICAgICAgIGhlbHA9InNwYWNpbmcgYmV0d2VlbiBtb250aHMgKGRlZmF1bHQgNiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9NiwKKyAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2KSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1tIiwgIi0tbW9udGhzIiwKLSAgICAgICAgZGVzdD0ibW9udGhzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0zLAotICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzLCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD0zLAorICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzKSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgaHRtbGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1jIiwgIi0tY3NzIiwKLSAgICAgICAgZGVzdD0iY3NzIiwgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKLSAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSAoaHRtbCBvbmx5KSIKKyAgICAgICAgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKKyAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1MIiwgIi0tbG9jYWxlIiwKLSAgICAgICAgZGVzdD0ibG9jYWxlIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgIGhlbHA9ImxvY2FsZSB0byBiZSB1c2VkIGZyb20gbW9udGggYW5kIHdlZWtkYXkgbmFtZXMiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgICItZSIsICItLWVuY29kaW5nIiwKLSAgICAgICAgZGVzdD0iZW5jb2RpbmciLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgIGhlbHA9IkVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0LiIKKyAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICBoZWxwPSJlbmNvZGluZyB0byB1c2UgZm9yIG91dHB1dCIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi10IiwgIi0tdHlwZSIsCi0gICAgICAgIGRlc3Q9InR5cGUiLCBkZWZhdWx0PSJ0ZXh0IiwKKyAgICAgICAgZGVmYXVsdD0idGV4dCIsCiAgICAgICAgIGNob2ljZXM9KCJ0ZXh0IiwgImh0bWwiKSwKICAgICAgICAgaGVscD0ib3V0cHV0IHR5cGUgKHRleHQgb3IgaHRtbCkiCiAgICAgKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJ5ZWFyIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ieWVhciBudW1iZXIgKDEtOTk5OSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJtb250aCIsCisgICAgICAgIG5hcmdzPSc/JywgdHlwZT1pbnQsCisgICAgICAgIGhlbHA9Im1vbnRoIG51bWJlciAoMS0xMiwgdGV4dCBvbmx5KSIKKyAgICApCiAKLSAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzWzE6XSkKIAogICAgIGlmIG9wdGlvbnMubG9jYWxlIGFuZCBub3Qgb3B0aW9ucy5lbmNvZGluZzoKICAgICAgICAgcGFyc2VyLmVycm9yKCJpZiAtLWxvY2FsZSBpcyBzcGVjaWZpZWQgLS1lbmNvZGluZyBpcyByZXF1aXJlZCIpCkBAIC02NjcsMTAgKzY3OSwxMCBAQAogICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKICAgICAgICAgb3B0ZGljdCA9IGRpY3QoZW5jb2Rpbmc9ZW5jb2RpbmcsIGNzcz1vcHRpb25zLmNzcykKICAgICAgICAgd3JpdGUgPSBzeXMuc3Rkb3V0LmJ1ZmZlci53cml0ZQotICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWYgb3B0aW9ucy55ZWFyIGlzIE5vbmU6CiAgICAgICAgICAgICB3cml0ZShjYWwuZm9ybWF0eWVhcnBhZ2UoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkpCi0gICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6Ci0gICAgICAgICAgICB3cml0ZShjYWwuZm9ybWF0eWVhcnBhZ2UoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpKQorICAgICAgICBlbGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKKyAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShvcHRpb25zLnllYXIsICoqb3B0ZGljdCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKICAgICAgICAgICAgIHN5cy5leGl0KDEpCkBAIC02ODAsMTggKzY5MiwxNSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY2FsID0gVGV4dENhbGVuZGFyKCkKICAgICAgICAgb3B0ZGljdCA9IGRpY3Qodz1vcHRpb25zLndpZHRoLCBsPW9wdGlvbnMubGluZXMpCi0gICAgICAgIGlmIGxlbihhcmdzKSAhPSAzOgorICAgICAgICBpZiBvcHRpb25zLm1vbnRoIGlzIE5vbmU6CiAgICAgICAgICAgICBvcHRkaWN0WyJjIl0gPSBvcHRpb25zLnNwYWNpbmcKICAgICAgICAgICAgIG9wdGRpY3RbIm0iXSA9IG9wdGlvbnMubW9udGhzCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyLCAqKm9wdGRpY3QpCi0gICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6Ci0gICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0eWVhcihpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMzoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXRtb250aChpbnQoYXJnc1sxXSksIGludChhcmdzWzJdKSwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCi0gICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKG9wdGlvbnMueWVhciwgb3B0aW9ucy5tb250aCwgKipvcHRkaWN0KQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQud3JpdGUKICAgICAgICAgaWYgb3B0aW9ucy5lbmNvZGluZzoKICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5lbmNvZGUob3B0aW9ucy5lbmNvZGluZykKZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weSBiL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQppbmRleCAwOTFlNWQzLi45YTI2YTkzIDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CkBAIC05NjgsNyArOTY4LDcgQEAKICAgICAgICAgICAgIGRpY3QgPSBrd2FyZ3MucG9wKCdkaWN0JykKICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwogICAgICAgICAgICAgd2FybmluZ3Mud2FybigiUGFzc2luZyAnZGljdCcgYXMga2V5d29yZCBhcmd1bWVudCBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGRpY3QgPSBOb25lCiAgICAgICAgIHNlbGYuZGF0YSA9IHt9CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZWFsbC5weSBiL0xpYi9jb21waWxlYWxsLnB5CmluZGV4IDBjYzBjMWQuLjY3YzVmNWEgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlYWxsLnB5CisrKyBiL0xpYi9jb21waWxlYWxsLnB5CkBAIC02OCw3ICs2OCw3IEBACiAgICAgIiIiCiAgICAgZmlsZXMgPSBfd2Fsa19kaXIoZGlyLCBxdWlldD1xdWlldCwgbWF4bGV2ZWxzPW1heGxldmVscywKICAgICAgICAgICAgICAgICAgICAgICBkZGlyPWRkaXIpCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIGlmIHdvcmtlcnMgaXMgbm90IE5vbmUgYW5kIHdvcmtlcnMgIT0gMSBhbmQgUHJvY2Vzc1Bvb2xFeGVjdXRvciBpcyBub3QgTm9uZToKICAgICAgICAgaWYgd29ya2VycyA8IDA6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3b3JrZXJzIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwJykKQEAgLTgxLDEyICs4MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeT1sZWdhY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9b3B0aW1pemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcykKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD0xKQorICAgICAgICAgICAgc3VjY2VzcyA9IG1pbihyZXN1bHRzLCBkZWZhdWx0PVRydWUpCiAgICAgZWxzZToKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9maWxlKGZpbGUsIGRkaXIsIGZvcmNlLCByeCwgcXVpZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeSwgb3B0aW1pemUpOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpcj1Ob25lLCBmb3JjZT1GYWxzZSwgcng9Tm9uZSwgcXVpZXQ9MCwKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIGxlZ2FjeTogICAgaWYgVHJ1ZSwgcHJvZHVjZSBsZWdhY3kgcHljIHBhdGhzIGluc3RlYWQgb2YgUEVQIDMxNDcgcGF0aHMKICAgICBvcHRpbWl6ZTogIG9wdGltaXphdGlvbiBsZXZlbCBvciAtMSBmb3IgbGV2ZWwgb2YgdGhlIGludGVycHJldGVyCiAgICAgIiIiCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxuYW1lKQogICAgIGlmIGRkaXIgaXMgbm90IE5vbmU6CiAgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGRkaXIsIG5hbWUpCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgICAgICAgICBvayA9IHB5X2NvbXBpbGUuY29tcGlsZShmdWxsbmFtZSwgY2ZpbGUsIGRmaWxlLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKQogICAgICAgICAgICAgZXhjZXB0IHB5X2NvbXBpbGUuUHlDb21waWxlRXJyb3IgYXMgZXJyOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgaWYgcXVpZXQgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICBlbGlmIHF1aWV0OgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgbXNnID0gbXNnLmRlY29kZShzeXMuc3Rkb3V0LmVuY29kaW5nKQogICAgICAgICAgICAgICAgIHByaW50KG1zZykKICAgICAgICAgICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFVuaWNvZGVFcnJvciwgT1NFcnJvcikgYXMgZToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIHByaW50KGUuX19jbGFzc19fLl9fbmFtZV9fICsgJzonLCBlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiBvayA9PSAwOgotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICByZXR1cm4gc3VjY2VzcwogCiBkZWYgY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPTEsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIGxlZ2FjeTogYXMgZm9yIGNvbXBpbGVfZGlyKCkgKGRlZmF1bHQgRmFsc2UpCiAgICAgb3B0aW1pemU6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IC0xKQogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgogICAgICAgICBpZiAobm90IGRpciBvciBkaXIgPT0gb3MuY3VyZGlyKSBhbmQgc2tpcF9jdXJkaXI6CiAgICAgICAgICAgICBpZiBxdWlldCA8IDI6CmRpZmYgLS1naXQgYS9MaWIvY3J5cHQucHkgYi9MaWIvY3J5cHQucHkKaW5kZXggNDlhYjk2ZS4uZmJjNWY0YyAxMDA2NDQKLS0tIGEvTGliL2NyeXB0LnB5CisrKyBiL0xpYi9jcnlwdC5weQpAQCAtNTQsOSArNTQsOCBAQAogTUVUSE9EX1NIQTUxMiA9IF9NZXRob2QoJ1NIQTUxMicsICc2JywgMTYsIDEwNikKIAogbWV0aG9kcyA9IFtdCi1mb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSk6Citmb3IgX21ldGhvZCBpbiAoTUVUSE9EX1NIQTUxMiwgTUVUSE9EX1NIQTI1NiwgTUVUSE9EX01ENSwgTUVUSE9EX0NSWVBUKToKICAgICBfcmVzdWx0ID0gY3J5cHQoJycsIF9tZXRob2QpCiAgICAgaWYgX3Jlc3VsdCBhbmQgbGVuKF9yZXN1bHQpID09IF9tZXRob2QudG90YWxfc2l6ZToKICAgICAgICAgbWV0aG9kcy5hcHBlbmQoX21ldGhvZCkKLW1ldGhvZHMuYXBwZW5kKE1FVEhPRF9DUllQVCkKIGRlbCBfcmVzdWx0LCBfbWV0aG9kCmRpZmYgLS1naXQgYS9MaWIvY3N2LnB5IGIvTGliL2Nzdi5weQppbmRleCBjYTQwZTVlLi45MDQ2MWRiIDEwMDY0NAotLS0gYS9MaWIvY3N2LnB5CisrKyBiL0xpYi9jc3YucHkKQEAgLTEzLDExICsxMywxMiBAQAogCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogCi1fX2FsbF9fID0gWyAiUVVPVEVfTUlOSU1BTCIsICJRVU9URV9BTEwiLCAiUVVPVEVfTk9OTlVNRVJJQyIsICJRVU9URV9OT05FIiwKLSAgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKLSAgICAgICAgICAgICJmaWVsZF9zaXplX2xpbWl0IiwgInJlYWRlciIsICJ3cml0ZXIiLAotICAgICAgICAgICAgInJlZ2lzdGVyX2RpYWxlY3QiLCAiZ2V0X2RpYWxlY3QiLCAibGlzdF9kaWFsZWN0cyIsICJTbmlmZmVyIiwKLSAgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiBdCitfX2FsbF9fID0gWyJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAorICAgICAgICAgICAiRXJyb3IiLCAiRGlhbGVjdCIsICJfX2RvY19fIiwgImV4Y2VsIiwgImV4Y2VsX3RhYiIsCisgICAgICAgICAgICJmaWVsZF9zaXplX2xpbWl0IiwgInJlYWRlciIsICJ3cml0ZXIiLAorICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAorICAgICAgICAgICAidW5yZWdpc3Rlcl9kaWFsZWN0IiwgIl9fdmVyc2lvbl9fIiwgIkRpY3RSZWFkZXIiLCAiRGljdFdyaXRlciIsCisgICAgICAgICAgICJ1bml4X2RpYWxlY3QiXQogCiBjbGFzcyBEaWFsZWN0OgogICAgICIiIkRlc2NyaWJlIGEgQ1NWIGRpYWxlY3QuCmRpZmYgLS1naXQgYS9MaWIvZGF0ZXRpbWUucHkgYi9MaWIvZGF0ZXRpbWUucHkKaW5kZXggYjk3MTljYi4uYjczNGE3NCAxMDA2NDQKLS0tIGEvTGliL2RhdGV0aW1lLnB5CisrKyBiL0xpYi9kYXRldGltZS5weQpAQCAtMzE2LDYgKzMxNiw3IEBACiAKICAgICByZXR1cm4gcQogCisKIGNsYXNzIHRpbWVkZWx0YToKICAgICAiIiJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy4KIApAQCAtMTkxMiw2ICsxOTEzLDggQEAKIAogICAgIEBzdGF0aWNtZXRob2QKICAgICBkZWYgX25hbWVfZnJvbV9vZmZzZXQoZGVsdGEpOgorICAgICAgICBpZiBub3QgZGVsdGE6CisgICAgICAgICAgICByZXR1cm4gJ1VUQycKICAgICAgICAgaWYgZGVsdGEgPCB0aW1lZGVsdGEoMCk6CiAgICAgICAgICAgICBzaWduID0gJy0nCiAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YQpkaWZmIC0tZ2l0IGEvTGliL2Rpcy5weSBiL0xpYi9kaXMucHkKaW5kZXggYWYzN2NkZi4uMzU0MGI0NyAxMDA2NDQKLS0tIGEvTGliL2Rpcy5weQorKysgYi9MaWIvZGlzLnB5CkBAIC0xNjIsNiArMTYyLDE1IEBACiBfSW5zdHJ1Y3Rpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCJfSW5zdHJ1Y3Rpb24iLAogICAgICAib3BuYW1lIG9wY29kZSBhcmcgYXJndmFsIGFyZ3JlcHIgb2Zmc2V0IHN0YXJ0c19saW5lIGlzX2p1bXBfdGFyZ2V0IikKIAorX0luc3RydWN0aW9uLm9wbmFtZS5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIG9wZXJhdGlvbiIKK19JbnN0cnVjdGlvbi5vcGNvZGUuX19kb2NfXyA9ICJOdW1lcmljIGNvZGUgZm9yIG9wZXJhdGlvbiIKK19JbnN0cnVjdGlvbi5hcmcuX19kb2NfXyA9ICJOdW1lcmljIGFyZ3VtZW50IHRvIG9wZXJhdGlvbiAoaWYgYW55KSwgb3RoZXJ3aXNlIE5vbmUiCitfSW5zdHJ1Y3Rpb24uYXJndmFsLl9fZG9jX18gPSAiUmVzb2x2ZWQgYXJnIHZhbHVlIChpZiBrbm93biksIG90aGVyd2lzZSBzYW1lIGFzIGFyZyIKK19JbnN0cnVjdGlvbi5hcmdyZXByLl9fZG9jX18gPSAiSHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygb3BlcmF0aW9uIGFyZ3VtZW50IgorX0luc3RydWN0aW9uLm9mZnNldC5fX2RvY19fID0gIlN0YXJ0IGluZGV4IG9mIG9wZXJhdGlvbiB3aXRoaW4gYnl0ZWNvZGUgc2VxdWVuY2UiCitfSW5zdHJ1Y3Rpb24uc3RhcnRzX2xpbmUuX19kb2NfXyA9ICJMaW5lIHN0YXJ0ZWQgYnkgdGhpcyBvcGNvZGUgKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmlzX2p1bXBfdGFyZ2V0Ll9fZG9jX18gPSAiVHJ1ZSBpZiBvdGhlciBjb2RlIGp1bXBzIHRvIGhlcmUsIG90aGVyd2lzZSBGYWxzZSIKKwogY2xhc3MgSW5zdHJ1Y3Rpb24oX0luc3RydWN0aW9uKToKICAgICAiIiJEZXRhaWxzIGZvciBhIGJ5dGVjb2RlIG9wZXJhdGlvbgogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKaW5kZXggZjA1YjM0Yi4uZDYwM2Q0YSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29yZS5weQpAQCAtMjA0LDE2ICsyMDQsMTUgQEAKICAgICBnbG9iYWwgX3NldHVwX3N0b3BfYWZ0ZXIsIF9zZXR1cF9kaXN0cmlidXRpb24KICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IHN0b3BfYWZ0ZXIKIAotICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3YuY29weSgpCiAgICAgZyA9IHsnX19maWxlX18nOiBzY3JpcHRfbmFtZX0KLSAgICBsID0ge30KICAgICB0cnk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2NyaXB0X25hbWUKICAgICAgICAgICAgIGlmIHNjcmlwdF9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSA9IHNjcmlwdF9hcmdzCiAgICAgICAgICAgICB3aXRoIG9wZW4oc2NyaXB0X25hbWUsICdyYicpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZywgbCkKKyAgICAgICAgICAgICAgICBleGVjKGYucmVhZCgpLCBnKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLmFyZ3YgPSBzYXZlX2FyZ3YKICAgICAgICAgICAgIF9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQppbmRleCA2NTQyMjdjLi4yN2NlNzMyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQpAQCAtMjksNiArMjksMjEgQEAKIHNldHVwKCkKICIiIgogCitzZXR1cF9kb2VzX25vdGhpbmcgPSAiIiJcCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorc2V0dXAoKQorIiIiCisKKworc2V0dXBfZGVmaW5lc19zdWJjbGFzcyA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwgYXMgX2luc3RhbGwKKworY2xhc3MgaW5zdGFsbChfaW5zdGFsbCk6CisgICAgc3ViX2NvbW1hbmRzID0gX2luc3RhbGwuc3ViX2NvbW1hbmRzICsgWydjbWQnXQorCitzZXR1cChjbWRjbGFzcz17J2luc3RhbGwnOiBpbnN0YWxsfSkKKyIiIgogCiBjbGFzcyBDb3JlVGVzdENhc2Uoc3VwcG9ydC5FbnZpcm9uR3VhcmQsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNjcsNiArODIsMjEgQEAKICAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAogICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF91c2luZ19fX2ZpbGVfXykpCiAKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfcHJlc2VydmVzX3N5c19hcmd2KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBydW5fc2V0dXAgZG9lcyBub3QgY2xvYmJlciBzeXMuYXJndgorICAgICAgICBhcmd2X2NvcHkgPSBzeXMuYXJndi5jb3B5KCkKKyAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF9kb2VzX25vdGhpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5hcmd2LCBhcmd2X2NvcHkpCisKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfZGVmaW5lc19zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNjcmlwdCBjYW4gdXNlIF9fZmlsZV9fOyBpZiB0aGF0J3MgbWlzc2luZywgdGhlIHRlc3QKKyAgICAgICAgIyBzZXR1cC5weSBzY3JpcHQgd2lsbCByYWlzZSBOYW1lRXJyb3IuCisgICAgICAgIGRpc3QgPSBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX2RlZmluZXNfc3ViY2xhc3MpKQorICAgICAgICBpbnN0YWxsID0gZGlzdC5nZXRfY29tbWFuZF9vYmooJ2luc3RhbGwnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdjbWQnLCBpbnN0YWxsLnN1Yl9jb21tYW5kcykKKwogICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF91c2VzX2N1cnJlbnRfZGlyKHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdHMgdGhhdCB0aGUgc2V0dXAgc2NyaXB0IGlzIHJ1biB3aXRoIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogICAgICAgICAjIGFzIGl0cyBvd24gY3VycmVudCBkaXJlY3Rvcnk7IHRoaXMgd2FzIHRlbXBvcmFyaWx5IGJyb2tlbiBieSBhCmRpZmYgLS1naXQgYS9MaWIvZW51bS5weSBiL0xpYi9lbnVtLnB5CmluZGV4IGMyOGYzNDUuLjM1YTljNzcgMTAwNjQ0Ci0tLSBhL0xpYi9lbnVtLnB5CisrKyBiL0xpYi9lbnVtLnB5CkBAIC0xLDggKzEsMTQgQEAKIGltcG9ydCBzeXMKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CiBmcm9tIHR5cGVzIGltcG9ydCBNYXBwaW5nUHJveHlUeXBlLCBEeW5hbWljQ2xhc3NBdHRyaWJ1dGUKIAotX19hbGxfXyA9IFsnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCisjIHRyeSBfY29sbGVjdGlvbnMgZmlyc3QgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gX2NvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKworX19hbGxfXyA9IFsnRW51bU1ldGEnLCAnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCiAKIAogZGVmIF9pc19kZXNjcmlwdG9yKG9iaik6CkBAIC00NzYsNiArNDgyLDkgQEAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICIlcy4lcyIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWVfKQogCisgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92YWx1ZV8pCisKICAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICAgYWRkZWRfYmVoYXZpb3IgPSBbCiAgICAgICAgICAgICAgICAgbQpkaWZmIC0tZ2l0IGEvTGliL2ZyYWN0aW9ucy5weSBiL0xpYi9mcmFjdGlvbnMucHkKaW5kZXggNjBiMDcyOC4uNjRkNzQ2YiAxMDA2NDQKLS0tIGEvTGliL2ZyYWN0aW9ucy5weQorKysgYi9MaWIvZnJhY3Rpb25zLnB5CkBAIC0xMjUsMTcgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuZGVub21pbmF0b3IKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZmxvYXQobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIERlY2ltYWwpOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9kZWNpbWFsKG51bWVyYXRvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIChmbG9hdCwgRGVjaW1hbCkpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgc3RyKToKQEAgLTIxMCwxMCArMjAyLDYgQEAKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShmLCBmbG9hdCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzLmZyb21fZmxvYXQoKSBvbmx5IHRha2VzIGZsb2F0cywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBmLCB0eXBlKGYpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc25hbihmKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc2luZihmKToKLSAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTIyNiwxOSArMjE0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19pbmZpbml0ZSgpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19uYW4oKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVzIHRvICVzLiIgJSAoZGVjLCBjbHMuX19uYW1lX18pKQotICAgICAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGRlYy5hc190dXBsZSgpCi0gICAgICAgIGRpZ2l0cyA9IGludCgnJy5qb2luKG1hcChzdHIsIGRpZ2l0cykpKQotICAgICAgICBpZiBzaWduOgotICAgICAgICAgICAgZGlnaXRzID0gLWRpZ2l0cwotICAgICAgICBpZiBleHAgPj0gMDoKLSAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzICogMTAgKiogZXhwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMsIDEwICoqIC1leHApCisgICAgICAgIHJldHVybiBjbHMoKmRlYy5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBkZWYgbGltaXRfZGVub21pbmF0b3Ioc2VsZiwgbWF4X2Rlbm9taW5hdG9yPTEwMDAwMDApOgogICAgICAgICAiIiJDbG9zZXN0IEZyYWN0aW9uIHRvIHNlbGYgd2l0aCBkZW5vbWluYXRvciBhdCBtb3N0IG1heF9kZW5vbWluYXRvci4KZGlmZiAtLWdpdCBhL0xpYi9mdHBsaWIucHkgYi9MaWIvZnRwbGliLnB5CmluZGV4IGM0MTZkODUuLjJhZmExOWQgMTAwNjQ0Ci0tLSBhL0xpYi9mdHBsaWIucHkKKysrIGIvTGliL2Z0cGxpYi5weQpAQCAtNDIsNyArNDIsOCBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIHNvY2tldCBpbXBvcnQgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKIAotX19hbGxfXyA9IFsiRlRQIl0KK19fYWxsX18gPSBbIkZUUCIsICJlcnJvcl9yZXBseSIsICJlcnJvcl90ZW1wIiwgImVycm9yX3Blcm0iLCAiZXJyb3JfcHJvdG8iLAorICAgICAgICAgICAiYWxsX2Vycm9ycyJdCiAKICMgTWFnaWMgbnVtYmVyIGZyb20gPHNvY2tldC5oPgogTVNHX09PQiA9IDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHJvY2VzcyBkYXRhIG91dCBvZiBiYW5kCmRpZmYgLS1naXQgYS9MaWIvaHR0cC9jbGllbnQucHkgYi9MaWIvaHR0cC9jbGllbnQucHkKaW5kZXggODBjODBjZi4uZjY5ZTdiYSAxMDA2NDQKLS0tIGEvTGliL2h0dHAvY2xpZW50LnB5CisrKyBiL0xpYi9odHRwL2NsaWVudC5weQpAQCAtNDA1LDYgKzQwNSw3IEBACiAgICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKIAogICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgIiIiQWx3YXlzIHJldHVybnMgVHJ1ZSIiIgogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgIyBFbmQgb2YgInJhdyBzdHJlYW0iIG1ldGhvZHMKQEAgLTQ1Miw2ICs0NTMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gbGVuKGIpIGJ5dGVzIGludG8gYnl0ZWFycmF5IGIgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICAgIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgICIiIgorCiAgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAwCiAKQEAgLTY4Myw2ICs2ODgsMTcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuZnAuZmlsZW5vKCkKIAogICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBtYXRjaGluZyAqbmFtZSouCisKKyAgICAgICAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoaW5nIGhlYWRlcnMsIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIHNwYWNlcy4KKworICAgICAgICBJZiBubyBtYXRjaGluZyBoZWFkZXIgaXMgZm91bmQsIHJldHVybnMgKmRlZmF1bHQqIG9yIE5vbmUgaWYKKyAgICAgICAgdGhlICpkZWZhdWx0KiBpcyBub3Qgc3BlY2lmaWVkLgorCisgICAgICAgIElmIHRoZSBoZWFkZXJzIGFyZSB1bmtub3duLCByYWlzZXMgaHR0cC5jbGllbnQuUmVzcG9uc2VOb3RSZWFkeS4KKworICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5oZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdFJlYWR5KCkKICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycy5nZXRfYWxsKG5hbWUpIG9yIGRlZmF1bHQKQEAgLTcwNSwxMiArNzIxLDQ1IEBACiAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZC1zdHlsZSB1cmxsaWIgcmVzcG9uc2VzLgogCiAgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICcnJ1JldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1pbWV0b29scy5NZXNzYWdlIGNvbnRhaW5pbmcKKyAgICAgICAgbWV0YS1pbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVSTC4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgSFRUUCwgdGhlc2UgaGVhZGVycyBhcmUgdGhvc2UgcmV0dXJuZWQgYnkKKyAgICAgICAgdGhlIHNlcnZlciBhdCB0aGUgaGVhZCBvZiB0aGUgcmV0cmlldmVkIEhUTUwgcGFnZSAoaW5jbHVkaW5nCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGFuZCBDb250ZW50LVR5cGUpLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBGVFAsIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpbGwgYmUKKyAgICAgICAgcHJlc2VudCBpZiAoYXMgaXMgbm93IHVzdWFsKSB0aGUgc2VydmVyIHBhc3NlZCBiYWNrIGEgZmlsZQorICAgICAgICBsZW5ndGggaW4gcmVzcG9uc2UgdG8gdGhlIEZUUCByZXRyaWV2YWwgcmVxdWVzdC4gQQorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpZiB0aGUgTUlNRSB0eXBlIGNhbiBiZQorICAgICAgICBndWVzc2VkLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBsb2NhbC1maWxlLCByZXR1cm5lZCBoZWFkZXJzIHdpbGwgaW5jbHVkZQorICAgICAgICBhIERhdGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlJ3MgbGFzdC1tb2RpZmllZCB0aW1lLCBhCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGdpdmluZyBmaWxlIHNpemUsIGFuZCBhIENvbnRlbnQtVHlwZQorICAgICAgICBjb250YWluaW5nIGEgZ3Vlc3MgYXQgdGhlIGZpbGUncyB0eXBlLiBTZWUgYWxzbyB0aGUKKyAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIG1pbWV0b29scyBtb2R1bGUuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKIAogICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgICcnJ1JldHVybiB0aGUgcmVhbCBVUkwgb2YgdGhlIHBhZ2UuCisKKyAgICAgICAgSW4gc29tZSBjYXNlcywgdGhlIEhUVFAgc2VydmVyIHJlZGlyZWN0cyBhIGNsaWVudCB0byBhbm90aGVyCisgICAgICAgIFVSTC4gVGhlIHVybG9wZW4oKSBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgdHJhbnNwYXJlbnRseSwgYnV0IGluCisgICAgICAgIHNvbWUgY2FzZXMgdGhlIGNhbGxlciBuZWVkcyB0byBrbm93IHdoaWNoIFVSTCB0aGUgY2xpZW50IHdhcworICAgICAgICByZWRpcmVjdGVkIHRvLiBUaGUgZ2V0dXJsKCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBhdCB0aGlzCisgICAgICAgIHJlZGlyZWN0ZWQgVVJMLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi51cmwKIAogICAgIGRlZiBnZXRjb2RlKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSByZXNwb25zZSwKKyAgICAgICAgb3IgTm9uZSBpZiB0aGUgVVJMIGlzIG5vdCBhbiBIVFRQIFVSTC4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzCiAKIGNsYXNzIEhUVFBDb25uZWN0aW9uOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTkVXUy50eHQgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dAppbmRleCAwZWI5MzliLi5jZTZlM2E0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ORVdTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9ORVdTLnR4dApAQCAtMSw2ICsxLDYgQEAKLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTUtMTItMDYqCitXaGF0J3MgTmV3IGluIElETEUgMy42LjBhMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorKlJlbGVhc2UgZGF0ZTogMjAxNz8qCiAKIC0gSXNzdWUgMTUzNDg6IFN0b3AgdGhlIGRlYnVnZ2VyIGVuZ2luZSAobm9ybWFsbHkgaW4gYSB1c2VyIHByb2Nlc3MpCiAgIGJlZm9yZSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aW5kb3cgKHJ1bm5pbmcgaW4gdGhlIElETEUgcHJvY2VzcykuCkBAIC0yNzksNiArMjc5LDExIEBACiAtIFVzZSBvZiAnZmlsdGVyJyBpbiBrZXliaW5kaW5nRGlhbG9nLnB5IHdhcyBjYXVzaW5nIGN1c3RvbSBrZXkgYXNzaWdubWVudCB0bwogICBmYWlsLiAgUGF0Y2ggNTcwNyBhbWF1cnkuZm9yZ2VvdGRhcmMuCiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMWExPworPT09PT09PT09PT09PT09PT09PT09PT09PQorKlJlbGVhc2UgZGF0ZTogMDctTWFyLTA5KgorCiAtIElzc3VlICM0ODE1OiBPZmZlciBjb252ZXJzaW9uIHRvIFVURi04IGlmIHNvdXJjZSBmaWxlcyBoYXZlCiAgIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGFuZCBhcmUgbm90IGVuY29kZWQgaW4gVVRGLTguCiAKQEAgLTMxOCw2ICszMjMsMTEgQEAKIAogLSBJc3N1ZSAjMzU0OTogT24gTWFjT1MgdGhlIHByZWZlcmVuY2VzIG1lbnUgd2FzIG5vdCBwcmVzZW50CiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMD8KKz09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwMy1EZWMtMjAwOCoKKwogLSBJRExFIHdvdWxkIHByaW50IGEgIlVuaGFuZGxlZCBzZXJ2ZXIgZXhjZXB0aW9uISIgbWVzc2FnZSB3aGVuIGludGVybmFsCiAgIGRlYnVnZ2luZyBpcyBlbmFibGVkLgogCmRpZmYgLS1naXQgYS9MaWIvaW1wLnB5IGIvTGliL2ltcC5weQppbmRleCBmNmZmZjQ0Li5iMzM5OTUyIDEwMDY0NAotLS0gYS9MaWIvaW1wLnB5CisrKyBiL0xpYi9pbXAucHkKQEAgLTMwLDcgKzMwLDcgQEAKIAogd2FybmluZ3Mud2FybigidGhlIGltcCBtb2R1bGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaW1wb3J0bGliOyAiCiAgICAgICAgICAgICAgICJzZWUgdGhlIG1vZHVsZSdzIGRvY3VtZW50YXRpb24gZm9yIGFsdGVybmF0aXZlIHVzZXMiLAotICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogCiAjIERFUFJFQ0FURUQKIFNFQVJDSF9FUlJPUiA9IDAKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weSBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQppbmRleCA2MTZiMTdmLi5mMjc0NTAxIDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKKysrIGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CkBAIC0yMjMsMTIgKzIyMywxMyBAQAogIyAgICAgUHl0aG9uIDMuNWIxICAzMzMwIChQRVAgNDQ4OiBBZGRpdGlvbmFsIFVucGFja2luZyBHZW5lcmFsaXphdGlvbnMpCiAjICAgICBQeXRob24gMy41YjIgIDMzNDAgKGZpeCBkaWN0aW9uYXJ5IGRpc3BsYXkgZXZhbHVhdGlvbiBvcmRlciAjMTEyMDUpCiAjICAgICBQeXRob24gMy41YjIgIDMzNTAgKGFkZCBHRVRfWUlFTERfRlJPTV9JVEVSIG9wY29kZSAjMjQ0MDApCisjICAgICBQeXRob24gMy42YTAgIDMzNjAgKGFkZCBGT1JNQVRfVkFMVUUgb3Bjb2RlICMyNTQ4MykKICMKICMgTUFHSUMgbXVzdCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGJ5dGVjb2RlIGVtaXR0ZWQgYnkgdGhlIGNvbXBpbGVyIG1heSBubwogIyBsb25nZXIgYmUgdW5kZXJzdG9vZCBieSBvbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGV2YWwgbG9vcCAodXN1YWxseQogIyBkdWUgdG8gdGhlIGFkZGl0aW9uIG9mIG5ldyBvcGNvZGVzKS4KIAotTUFHSUNfTlVNQkVSID0gKDMzNTApLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKK01BR0lDX05VTUJFUiA9ICgzMzYwKS50b19ieXRlcygyLCAnbGl0dGxlJykgKyBiJ1xyXG4nCiBfUkFXX01BR0lDX05VTUJFUiA9IGludC5mcm9tX2J5dGVzKE1BR0lDX05VTUJFUiwgJ2xpdHRsZScpICAjIEZvciBpbXBvcnQuYwogCiBfUFlDQUNIRSA9ICdfX3B5Y2FjaGVfXycKQEAgLTM2MCwxNCArMzYxLDYgQEAKICAgICByZXR1cm4gbW9kZQogCiAKLWRlZiBfdmVyYm9zZV9tZXNzYWdlKG1lc3NhZ2UsICphcmdzLCB2ZXJib3NpdHk9MSk6Ci0gICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2UgdG8gc3RkZXJyIGlmIC12L1BZVEhPTlZFUkJPU0UgaXMgdHVybmVkIG9uLiIiIgotICAgIGlmIHN5cy5mbGFncy52ZXJib3NlID49IHZlcmJvc2l0eToKLSAgICAgICAgaWYgbm90IG1lc3NhZ2Uuc3RhcnRzd2l0aCgoJyMnLCAnaW1wb3J0ICcpKToKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAnIyAnICsgbWVzc2FnZQotICAgICAgICBwcmludChtZXNzYWdlLmZvcm1hdCgqYXJncyksIGZpbGU9c3lzLnN0ZGVycikKLQotCiBkZWYgX2NoZWNrX25hbWUobWV0aG9kKToKICAgICAiIiJEZWNvcmF0b3IgdG8gdmVyaWZ5IHRoYXQgdGhlIG1vZHVsZSBiZWluZyByZXF1ZXN0ZWQgbWF0Y2hlcyB0aGUgb25lIHRoZQogICAgIGxvYWRlciBjYW4gaGFuZGxlLgpAQCAtNDM3LDE1ICs0MzAsMTUgQEAKICAgICByYXdfc2l6ZSA9IGRhdGFbODoxMl0KICAgICBpZiBtYWdpYyAhPSBNQUdJQ19OVU1CRVI6CiAgICAgICAgIG1lc3NhZ2UgPSAnYmFkIG1hZ2ljIG51bWJlciBpbiB7IXJ9OiB7IXJ9Jy5mb3JtYXQobmFtZSwgbWFnaWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1lc3NhZ2UsICoqZXhjX2RldGFpbHMpCiAgICAgZWxpZiBsZW4ocmF3X3RpbWVzdGFtcCkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHRpbWVzdGFtcCBpbiB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgRU9GRXJyb3IobWVzc2FnZSkKICAgICBlbGlmIGxlbihyYXdfc2l6ZSkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHNpemUgb2Ygc291cmNlIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGlmIHNvdXJjZV9zdGF0cyBpcyBub3QgTm9uZToKICAgICAgICAgdHJ5OgpAQCAtNDU1LDcgKzQ0OCw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBfcl9sb25nKHJhd190aW1lc3RhbXApICE9IHNvdXJjZV9tdGltZToKICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ2J5dGVjb2RlIGlzIHN0YWxlIGZvciB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc291cmNlX3NpemUgPSBzb3VyY2Vfc3RhdHNbJ3NpemUnXSAmIDB4RkZGRkZGRkYKQEAgLTQ3Miw3ICs0NjUsNyBAQAogICAgICIiIkNvbXBpbGUgYnl0ZWNvZGUgYXMgcmV0dXJuZWQgYnkgX3ZhbGlkYXRlX2J5dGVjb2RlX2hlYWRlcigpLiIiIgogICAgIGNvZGUgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCiAgICAgaWYgaXNpbnN0YW5jZShjb2RlLCBfY29kZV90eXBlKToKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQogICAgICAgICBpZiBzb3VyY2VfcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIF9pbXAuX2ZpeF9jb19maWxlbmFtZShjb2RlLCBzb3VyY2VfcGF0aCkKICAgICAgICAgcmV0dXJuIGNvZGUKQEAgLTY2Miw2ICs2NTUsNyBAQAogICAgICAgICBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoZXhlYywgY29kZSwgbW9kdWxlLl9fZGljdF9fKQogCiAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgIiIiVGhpcyBtb2R1bGUgaXMgZGVwcmVjYXRlZC4iIiIKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtNzU1LDIxICs3NDksMjEgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRU9GRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30gbWF0Y2hlcyB7fScsIGJ5dGVjb2RlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9IG1hdGNoZXMge30nLCBieXRlY29kZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlX2J5dGVjb2RlKGJ5dGVzX2RhdGEsIG5hbWU9ZnVsbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVfcGF0aD1ieXRlY29kZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoPXNvdXJjZV9wYXRoKQogICAgICAgICBzb3VyY2VfYnl0ZXMgPSBzZWxmLmdldF9kYXRhKHNvdXJjZV9wYXRoKQogICAgICAgICBjb2RlX29iamVjdCA9IHNlbGYuc291cmNlX3RvX2NvZGUoc291cmNlX2J5dGVzLCBzb3VyY2VfcGF0aCkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7fScsIHNvdXJjZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20ge30nLCBzb3VyY2VfcGF0aCkKICAgICAgICAgaWYgKG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSBhbmQgYnl0ZWNvZGVfcGF0aCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBzb3VyY2VfbXRpbWUgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgZGF0YSA9IF9jb2RlX3RvX2J5dGVjb2RlKGNvZGVfb2JqZWN0LCBzb3VyY2VfbXRpbWUsCiAgICAgICAgICAgICAgICAgICAgIGxlbihzb3VyY2VfYnl0ZXMpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2J5dGVjb2RlKHNvdXJjZV9wYXRoLCBieXRlY29kZV9wYXRoLCBkYXRhKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3dyb3RlIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnd3JvdGUgeyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHJldHVybiBjb2RlX29iamVjdApAQCAtODQ5LDE0ICs4NDMsMTYgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGVybWlzc2lvbiBlcnJvciwgcmVhZC1vbmx5IGZpbGVzeXN0ZW06IGp1c3QgZm9yZ2V0CiAgICAgICAgICAgICAgICAgIyBhYm91dCB3cml0aW5nIHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhcmVudCwgZXhjKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBleGMpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF93cml0ZV9hdG9taWMocGF0aCwgZGF0YSwgX21vZGUpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAjIFNhbWUgYXMgYWJvdmU6IGp1c3QgZG9uJ3Qgd3JpdGUgdGhlIGJ5dGVjb2RlLgotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGF0aCwgZXhjKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YykKIAogCiBjbGFzcyBTb3VyY2VsZXNzRmlsZUxvYWRlcihGaWxlTG9hZGVyLCBfTG9hZGVyQmFzaWNzKToKQEAgLTkwMSwxNCArODk3LDE0IEBACiAgICAgICAgICIiIkNyZWF0ZSBhbiB1bml0aWFsaXplZCBleHRlbnNpb24gbW9kdWxlIiIiCiAgICAgICAgIG1vZHVsZSA9IF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZCgKICAgICAgICAgICAgIF9pbXAuY3JlYXRlX2R5bmFtaWMsIHNwZWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBsb2FkZWQgZnJvbSB7IXJ9JywKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gbG9hZGVkIGZyb20geyFyfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5uYW1lLCBzZWxmLnBhdGgpCiAgICAgICAgIHJldHVybiBtb2R1bGUKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuIGV4dGVuc2lvbiBtb2R1bGUiIiIKICAgICAgICAgX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKF9pbXAuZXhlY19keW5hbWljLCBtb2R1bGUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5wYXRoKQogCiAgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgpAQCAtMTAyMyw3ICsxMDE5LDggQEAKIAogICAgICAgICAiIiIKICAgICAgICAgIyBUaGUgaW1wb3J0IHN5c3RlbSBuZXZlciBjYWxscyB0aGlzIG1ldGhvZC4KLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnbmFtZXNwYWNlIG1vZHVsZSBsb2FkZWQgd2l0aCBwYXRoIHshcn0nLCBzZWxmLl9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ25hbWVzcGFjZSBtb2R1bGUgbG9hZGVkIHdpdGggcGF0aCB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhdGgpCiAgICAgICAgIHJldHVybiBfYm9vdHN0cmFwLl9sb2FkX21vZHVsZV9zaGltKHNlbGYsIGZ1bGxuYW1lKQogCiAKQEAgLTEyNDMsMTIgKzEyNDAsMTMgQEAKICAgICAgICAgIyBDaGVjayBmb3IgYSBmaWxlIHcvIGEgcHJvcGVyIHN1ZmZpeCBleGlzdHMuCiAgICAgICAgIGZvciBzdWZmaXgsIGxvYWRlcl9jbGFzcyBpbiBzZWxmLl9sb2FkZXJzOgogICAgICAgICAgICAgZnVsbF9wYXRoID0gX3BhdGhfam9pbihzZWxmLnBhdGgsIHRhaWxfbW9kdWxlICsgc3VmZml4KQotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgndHJ5aW5nIHt9Jy5mb3JtYXQoZnVsbF9wYXRoKSwgdmVyYm9zaXR5PTIpCisgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3RyeWluZyB7fScsIGZ1bGxfcGF0aCwgdmVyYm9zaXR5PTIpCiAgICAgICAgICAgICBpZiBjYWNoZV9tb2R1bGUgKyBzdWZmaXggaW4gY2FjaGU6CiAgICAgICAgICAgICAgICAgaWYgX3BhdGhfaXNmaWxlKGZ1bGxfcGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3BlYyhsb2FkZXJfY2xhc3MsIGZ1bGxuYW1lLCBmdWxsX3BhdGgsIE5vbmUsIHRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zcGVjKGxvYWRlcl9jbGFzcywgZnVsbG5hbWUsIGZ1bGxfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIHRhcmdldCkKICAgICAgICAgaWYgaXNfbmFtZXNwYWNlOgotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgncG9zc2libGUgbmFtZXNwYWNlIGZvciB7fScuZm9ybWF0KGJhc2VfcGF0aCkpCisgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3Bvc3NpYmxlIG5hbWVzcGFjZSBmb3Ige30nLCBiYXNlX3BhdGgpCiAgICAgICAgICAgICBzcGVjID0gX2Jvb3RzdHJhcC5Nb2R1bGVTcGVjKGZ1bGxuYW1lLCBOb25lKQogICAgICAgICAgICAgc3BlYy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucyA9IFtiYXNlX3BhdGhdCiAgICAgICAgICAgICByZXR1cm4gc3BlYwpkaWZmIC0tZ2l0IGEvTGliL2ltcG9ydGxpYi91dGlsLnB5IGIvTGliL2ltcG9ydGxpYi91dGlsLnB5CmluZGV4IDFkYmZmMjYuLjM5Y2IwZjcgMTAwNjQ0Ci0tLSBhL0xpYi9pbXBvcnRsaWIvdXRpbC5weQorKysgYi9MaWIvaW1wb3J0bGliL3V0aWwucHkKQEAgLTIyLDggKzIyLDggQEAKICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCcuJyk6CiAgICAgICAgIHJldHVybiBuYW1lCiAgICAgZWxpZiBub3QgcGFja2FnZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneyFyfSBpcyBub3QgYSByZWxhdGl2ZSBuYW1lICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAnKG5vIGxlYWRpbmcgZG90KScuZm9ybWF0KG5hbWUpKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGYnbm8gcGFja2FnZSBzcGVjaWZpZWQgZm9yIHtyZXByKG5hbWUpfSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyhyZXF1aXJlZCBmb3IgcmVsYXRpdmUgbW9kdWxlIG5hbWVzKScpCiAgICAgbGV2ZWwgPSAwCiAgICAgZm9yIGNoYXJhY3RlciBpbiBuYW1lOgogICAgICAgICBpZiBjaGFyYWN0ZXIgIT0gJy4nOgpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCBiNjViZWM3Li43NjE1ZTUyIDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtMTYsNyArMTYsNyBAQAogICAgIGdldG1vZHVsZSgpIC0gZGV0ZXJtaW5lIHRoZSBtb2R1bGUgdGhhdCBhbiBvYmplY3QgY2FtZSBmcm9tCiAgICAgZ2V0Y2xhc3N0cmVlKCkgLSBhcnJhbmdlIGNsYXNzZXMgc28gYXMgdG8gcmVwcmVzZW50IHRoZWlyIGhpZXJhcmNoeQogCi0gICAgZ2V0YXJnc3BlYygpLCBnZXRhcmd2YWx1ZXMoKSwgZ2V0Y2FsbGFyZ3MoKSAtIGdldCBpbmZvIGFib3V0IGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGdldGFyZ3ZhbHVlcygpLCBnZXRjYWxsYXJncygpIC0gZ2V0IGluZm8gYWJvdXQgZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgZ2V0ZnVsbGFyZ3NwZWMoKSAtIHNhbWUsIHdpdGggc3VwcG9ydCBmb3IgUHl0aG9uIDMgZmVhdHVyZXMKICAgICBmb3JtYXRhcmdzcGVjKCksIGZvcm1hdGFyZ3ZhbHVlcygpIC0gZm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMKICAgICBnZXRvdXRlcmZyYW1lcygpLCBnZXRpbm5lcmZyYW1lcygpIC0gZ2V0IGluZm8gYWJvdXQgZnJhbWVzCkBAIC02MjQsMjMgKzYyNCw2IEBACiAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgJwogICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24sIHRyYWNlYmFjaywgZnJhbWUsIG9yIGNvZGUgb2JqZWN0Jy5mb3JtYXQob2JqZWN0KSkKIAotTW9kdWxlSW5mbyA9IG5hbWVkdHVwbGUoJ01vZHVsZUluZm8nLCAnbmFtZSBzdWZmaXggbW9kZSBtb2R1bGVfdHlwZScpCi0KLWRlZiBnZXRtb2R1bGVpbmZvKHBhdGgpOgotICAgICIiIkdldCB0aGUgbW9kdWxlIG5hbWUsIHN1ZmZpeCwgbW9kZSwgYW5kIG1vZHVsZSB0eXBlIGZvciBhIGdpdmVuIGZpbGUuIiIiCi0gICAgd2FybmluZ3Mud2FybignaW5zcGVjdC5nZXRtb2R1bGVpbmZvKCkgaXMgZGVwcmVjYXRlZCcsIERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgIDIpCi0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIGltcG9ydCBpbXAKLSAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLSAgICBzdWZmaXhlcyA9IFsoLWxlbihzdWZmaXgpLCBzdWZmaXgsIG1vZGUsIG10eXBlKQotICAgICAgICAgICAgICAgICAgICBmb3Igc3VmZml4LCBtb2RlLCBtdHlwZSBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCldCi0gICAgc3VmZml4ZXMuc29ydCgpICMgdHJ5IGxvbmdlc3Qgc3VmZml4ZXMgZmlyc3QsIGluIGNhc2UgdGhleSBvdmVybGFwCi0gICAgZm9yIG5lZ2xlbiwgc3VmZml4LCBtb2RlLCBtdHlwZSBpbiBzdWZmaXhlczoKLSAgICAgICAgaWYgZmlsZW5hbWVbbmVnbGVuOl0gPT0gc3VmZml4OgotICAgICAgICAgICAgcmV0dXJuIE1vZHVsZUluZm8oZmlsZW5hbWVbOm5lZ2xlbl0sIHN1ZmZpeCwgbW9kZSwgbXR5cGUpCi0KIGRlZiBnZXRtb2R1bGVuYW1lKHBhdGgpOgogICAgICIiIlJldHVybiB0aGUgbW9kdWxlIG5hbWUgZm9yIGEgZ2l2ZW4gZmlsZSwgb3IgTm9uZS4iIiIKICAgICBmbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKQEAgLTEwMjEsMzEgKzEwMDQsNiBAQAogICAgICAgICB2YXJrdyA9IGNvLmNvX3Zhcm5hbWVzW25hcmdzXQogICAgIHJldHVybiBhcmdzLCB2YXJhcmdzLCBrd29ubHlhcmdzLCB2YXJrdwogCi0KLUFyZ1NwZWMgPSBuYW1lZHR1cGxlKCdBcmdTcGVjJywgJ2FyZ3MgdmFyYXJncyBrZXl3b3JkcyBkZWZhdWx0cycpCi0KLWRlZiBnZXRhcmdzcGVjKGZ1bmMpOgotICAgICIiIkdldCB0aGUgbmFtZXMgYW5kIGRlZmF1bHQgdmFsdWVzIG9mIGEgZnVuY3Rpb24ncyBhcmd1bWVudHMuCi0KLSAgICBBIHR1cGxlIG9mIGZvdXIgdGhpbmdzIGlzIHJldHVybmVkOiAoYXJncywgdmFyYXJncywga2V5d29yZHMsIGRlZmF1bHRzKS4KLSAgICAnYXJncycgaXMgYSBsaXN0IG9mIHRoZSBhcmd1bWVudCBuYW1lcywgaW5jbHVkaW5nIGtleXdvcmQtb25seSBhcmd1bWVudCBuYW1lcy4KLSAgICAndmFyYXJncycgYW5kICdrZXl3b3JkcycgYXJlIHRoZSBuYW1lcyBvZiB0aGUgKiBhbmQgKiogYXJndW1lbnRzIG9yIE5vbmUuCi0gICAgJ2RlZmF1bHRzJyBpcyBhbiBuLXR1cGxlIG9mIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgbGFzdCBuIGFyZ3VtZW50cy4KLQotICAgIFVzZSB0aGUgZ2V0ZnVsbGFyZ3NwZWMoKSBBUEkgZm9yIFB5dGhvbiAzIGNvZGUsIGFzIGFubm90YXRpb25zCi0gICAgYW5kIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQuIGdldGFyZ3NwZWMoKSB3aWxsIHJhaXNlIFZhbHVlRXJyb3IKLSAgICBpZiB0aGUgZnVuYyBoYXMgZWl0aGVyIGFubm90YXRpb25zIG9yIGtleXdvcmQgYXJndW1lbnRzLgotICAgICIiIgotICAgIHdhcm5pbmdzLndhcm4oImluc3BlY3QuZ2V0YXJnc3BlYygpIGlzIGRlcHJlY2F0ZWQsICIKLSAgICAgICAgICAgICAgICAgICJ1c2UgaW5zcGVjdC5zaWduYXR1cmUoKSBpbnN0ZWFkIiwgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQotICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywga3dvbmx5YXJncywga3dvbmx5ZGVmYXVsdHMsIGFubiA9IFwKLSAgICAgICAgZ2V0ZnVsbGFyZ3NwZWMoZnVuYykKLSAgICBpZiBrd29ubHlhcmdzIG9yIGFubjoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRnVuY3Rpb24gaGFzIGtleXdvcmQtb25seSBhcmd1bWVudHMgb3IgYW5ub3RhdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiwgdXNlIGdldGZ1bGxhcmdzcGVjKCkgQVBJIHdoaWNoIGNhbiBzdXBwb3J0IHRoZW0iKQotICAgIHJldHVybiBBcmdTcGVjKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cykKLQogRnVsbEFyZ1NwZWMgPSBuYW1lZHR1cGxlKCdGdWxsQXJnU3BlYycsCiAgICAgJ2FyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywga3dvbmx5YXJncywga3dvbmx5ZGVmYXVsdHMsIGFubm90YXRpb25zJykKIApAQCAtMTA2MSw4ICsxMDE5LDYgQEAKICAgICAna3dvbmx5ZGVmYXVsdHMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIGZyb20ga3dvbmx5YXJncyB0byBkZWZhdWx0cy4KICAgICAnYW5ub3RhdGlvbnMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50IG5hbWVzIHRvIGFubm90YXRpb25zLgogCi0gICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gZ2V0YXJnc3BlYygpLgotCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgaW5zcGVjdC5zaWduYXR1cmUoKSBpbnN0ZWFkLgogICAgICIiIgogCkBAIC0xMTczLDggKzExMjksNyBAQAogICAgICAgICAgICAgICAgICAgZm9ybWF0dmFsdWU9bGFtYmRhIHZhbHVlOiAnPScgKyByZXByKHZhbHVlKSwKICAgICAgICAgICAgICAgICAgIGZvcm1hdHJldHVybnM9bGFtYmRhIHRleHQ6ICcgLT4gJyArIHRleHQsCiAgICAgICAgICAgICAgICAgICBmb3JtYXRhbm5vdGF0aW9uPWZvcm1hdGFubm90YXRpb24pOgotICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXRhcmdzcGVjCi0gICAgb3IgZ2V0ZnVsbGFyZ3NwZWMuCisgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldGZ1bGxhcmdzcGVjLgogCiAgICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywKICAgICBrd29ubHlhcmdzLCBrd29ubHlkZWZhdWx0cywgYW5ub3RhdGlvbnMpLiAgVGhlIG90aGVyIGZpdmUgYXJndW1lbnRzCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKaW5kZXggZGIzNDEwNC4uMDAzMjdhNyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICAnTm90SW1wbGVtZW50ZWRUeXBlJyA6ICd0eXBlKE5vdEltcGxlbWVudGVkKScsCiAgICAgICAgICdTbGljZVR5cGUnIDogJ3NsaWNlJywKICAgICAgICAgJ1N0cmluZ1R5cGUnOiAnYnl0ZXMnLCAjIFhYWCA/Ci0gICAgICAgICdTdHJpbmdUeXBlcycgOiAnc3RyJywgIyBYWFggPworICAgICAgICAnU3RyaW5nVHlwZXMnIDogJyhzdHIsKScsICMgWFhYID8KICAgICAgICAgJ1R1cGxlVHlwZSc6ICd0dXBsZScsCiAgICAgICAgICdUeXBlVHlwZScgOiAndHlwZScsCiAgICAgICAgICdVbmljb2RlVHlwZSc6ICdzdHInLApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQppbmRleCAwNmIwMDMzLi5kZWY5YjBlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMzMyMiw2ICszMzIyLDEwIEBACiAgICAgICAgIGEgPSAiIiJ0eXBlKE5vbmUpIiIiCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAorICAgICAgICBiID0gInR5cGVzLlN0cmluZ1R5cGVzIgorICAgICAgICBhID0gIihzdHIsKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCiBjbGFzcyBUZXN0X2lkaW9tcyhGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJpZGlvbXMiCiAKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IGNlYWE2ZDguLjA3NGY2ZTAgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtMzAzLDEyICszMDMsMTYgQEAKIAogZGVmIGRlbG9jYWxpemUoc3RyaW5nKToKICAgICAiUGFyc2VzIGEgc3RyaW5nIGFzIGEgbm9ybWFsaXplZCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorCisgICAgY29udiA9IGxvY2FsZWNvbnYoKQorCiAgICAgI0ZpcnN0LCBnZXQgcmlkIG9mIHRoZSBncm91cGluZwotICAgIHRzID0gbG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKyAgICB0cyA9IGNvbnZbJ3Rob3VzYW5kc19zZXAnXQogICAgIGlmIHRzOgogICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSh0cywgJycpCisKICAgICAjbmV4dCwgcmVwbGFjZSB0aGUgZGVjaW1hbCBwb2ludCB3aXRoIGEgZG90Ci0gICAgZGQgPSBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGRkID0gY29udlsnZGVjaW1hbF9wb2ludCddCiAgICAgaWYgZGQ6CiAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGRkLCAnLicpCiAgICAgcmV0dXJuIHN0cmluZwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQppbmRleCAxMDRiMGJlLi4zNjlkMmMzIDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQorKysgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQpAQCAtMzMsOCArMzMsOSBAQAogICAgICAgICAgICAnU3RyZWFtSGFuZGxlcicsICdXQVJOJywgJ1dBUk5JTkcnLCAnYWRkTGV2ZWxOYW1lJywgJ2Jhc2ljQ29uZmlnJywKICAgICAgICAgICAgJ2NhcHR1cmVXYXJuaW5ncycsICdjcml0aWNhbCcsICdkZWJ1ZycsICdkaXNhYmxlJywgJ2Vycm9yJywKICAgICAgICAgICAgJ2V4Y2VwdGlvbicsICdmYXRhbCcsICdnZXRMZXZlbE5hbWUnLCAnZ2V0TG9nZ2VyJywgJ2dldExvZ2dlckNsYXNzJywKLSAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnd2FybicsICd3YXJuaW5nJywKLSAgICAgICAgICAgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsICdsYXN0UmVzb3J0J10KKyAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnc2h1dGRvd24nLAorICAgICAgICAgICAnd2FybicsICd3YXJuaW5nJywgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsCisgICAgICAgICAgICdsYXN0UmVzb3J0JywgJ3JhaXNlRXhjZXB0aW9ucyddCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weSBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CmluZGV4IGM2ODQwYzMuLjY0MjUzNTYgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CisrKyBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC00NDAsMTEgKzQ0MCwxMSBAQAogICAgICAgICAgICAgc3JlcyA9IG9zLmZzdGF0KHNlbGYuc3RyZWFtLmZpbGVubygpKQogICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3Jlc1tTVF9ERVZdLCBzcmVzW1NUX0lOT10KIAotICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgZGVmIHJlb3BlbklmTmVlZGVkKHNlbGYpOgogICAgICAgICAiIiIKLSAgICAgICAgRW1pdCBhIHJlY29yZC4KKyAgICAgICAgUmVvcGVuIGxvZyBmaWxlIGlmIG5lZWRlZC4KIAotICAgICAgICBGaXJzdCBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKKyAgICAgICAgQ2hlY2tzIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAogICAgICAgICBoYXMsIGNsb3NlIHRoZSBvbGQgc3RyZWFtIGFuZCByZW9wZW4gdGhlIGZpbGUgdG8gZ2V0IHRoZQogICAgICAgICBjdXJyZW50IHN0cmVhbS4KICAgICAgICAgIiIiCkBAIC00NjcsNiArNDY3LDE1IEBACiAgICAgICAgICAgICAgICAgIyBvcGVuIGEgbmV3IGZpbGUgaGFuZGxlIGFuZCBnZXQgbmV3IHN0YXQgaW5mbyBmcm9tIHRoYXQgZmQKICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCByZW9wZW4gdGhlIGZpbGUgYmVmb3JlIGVtaXR0aW5nIHRoZQorICAgICAgICByZWNvcmQgdG8gaXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlb3BlbklmTmVlZGVkKCkKICAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKIAogCmRpZmYgLS1naXQgYS9MaWIvbW9kdWxlZmluZGVyLnB5IGIvTGliL21vZHVsZWZpbmRlci5weQppbmRleCA1MGYyNDYyLi40YTJmMWI1IDEwMDY0NAotLS0gYS9MaWIvbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi9tb2R1bGVmaW5kZXIucHkKQEAgLTEwLDcgKzEwLDcgQEAKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB3YXJuaW5ncwogd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICBpbXBvcnQgaW1wCiAKICMgWFhYIENsZWFuIHVwIG9uY2Ugc3RyOCdzIGNzdG9yIG1hdGNoZXMgYnl0ZXMuCmRpZmYgLS1naXQgYS9MaWIvb3Bjb2RlLnB5IGIvTGliL29wY29kZS5weQppbmRleCA0YzgyNmE3Li43MWNlNjcyIDEwMDY0NAotLS0gYS9MaWIvb3Bjb2RlLnB5CisrKyBiL0xpYi9vcGNvZGUucHkKQEAgLTIxNCw0ICsyMTQsNiBAQAogZGVmX29wKCdCVUlMRF9UVVBMRV9VTlBBQ0snLCAxNTIpCiBkZWZfb3AoJ0JVSUxEX1NFVF9VTlBBQ0snLCAxNTMpCiAKK2RlZl9vcCgnRk9STUFUX1ZBTFVFJywgMTU1KQorCiBkZWwgZGVmX29wLCBuYW1lX29wLCBqcmVsX29wLCBqYWJzX29wCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggNDMyYTJlYi4uZDIzOWVhMiAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMzgsNyArMzgsOCBAQAogICAgICAgICAgICAnT3B0aW9uRXJyb3InLAogICAgICAgICAgICAnT3B0aW9uQ29uZmxpY3RFcnJvcicsCiAgICAgICAgICAgICdPcHRpb25WYWx1ZUVycm9yJywKLSAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJ10KKyAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJywKKyAgICAgICAgICAgJ2NoZWNrX2Nob2ljZSddCiAKIF9fY29weXJpZ2h0X18gPSAiIiIKIENvcHlyaWdodCAoYykgMjAwMS0yMDA2IEdyZWdvcnkgUC4gV2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9MaWIvcGlja2xlLnB5IGIvTGliL3BpY2tsZS5weQppbmRleCA3NTEyNzg3Li5hNjBiMWI3IDEwMDY0NAotLS0gYS9MaWIvcGlja2xlLnB5CisrKyBiL0xpYi9waWNrbGUucHkKQEAgLTI3LDYgKzI3LDcgQEAKIGZyb20gY29weXJlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKIGZyb20gY29weXJlZyBpbXBvcnQgX2V4dGVuc2lvbl9yZWdpc3RyeSwgX2ludmVydGVkX3JlZ2lzdHJ5LCBfZXh0ZW5zaW9uX2NhY2hlCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbAogaW1wb3J0IHN5cwogZnJvbSBzeXMgaW1wb3J0IG1heHNpemUKIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKQEAgLTU0NCw3ICs1NDUsNyBAQAogICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKIAogICAgICAgICBmdW5jX25hbWUgPSBnZXRhdHRyKGZ1bmMsICJfX25hbWVfXyIsICIiKQotICAgICAgICBpZiBzZWxmLnByb3RvID49IDQgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfZXhfXyI6CisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMiBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9leF9fIjoKICAgICAgICAgICAgIGNscywgYXJncywga3dhcmdzID0gYXJncwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAiX19uZXdfXyIpOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyBubyBfX25ld19fIgpAQCAtNTUyLDEwICs1NTMsMTYgQEAKICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgY2xzIGlzIG5vdCBvYmouX19jbGFzc19fOgogICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3NbMF0gZnJvbSB7fSBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZ1bmNfbmFtZSkpCi0gICAgICAgICAgICBzYXZlKGNscykKLSAgICAgICAgICAgIHNhdmUoYXJncykKLSAgICAgICAgICAgIHNhdmUoa3dhcmdzKQotICAgICAgICAgICAgd3JpdGUoTkVXT0JKX0VYKQorICAgICAgICAgICAgaWYgc2VsZi5wcm90byA+PSA0OgorICAgICAgICAgICAgICAgIHNhdmUoY2xzKQorICAgICAgICAgICAgICAgIHNhdmUoYXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGt3YXJncykKKyAgICAgICAgICAgICAgICB3cml0ZShORVdPQkpfRVgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBwYXJ0aWFsKGNscy5fX25ld19fLCBjbHMsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBzYXZlKGZ1bmMpCisgICAgICAgICAgICAgICAgc2F2ZSgoKSkKKyAgICAgICAgICAgICAgICB3cml0ZShSRURVQ0UpCiAgICAgICAgIGVsaWYgc2VsZi5wcm90byA+PSAyIGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX18iOgogICAgICAgICAgICAgIyBBIF9fcmVkdWNlX18gaW1wbGVtZW50YXRpb24gY2FuIGRpcmVjdCBwcm90b2NvbCAyIG9yIG5ld2VyIHRvCiAgICAgICAgICAgICAjIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgTkVXT0JKIG9wY29kZSwgd2hpbGUgc3RpbGwKQEAgLTEwMjQsNyArMTAzMSw3IEBACiAgICAgICAgIHNlbGYuX3VuZnJhbWVyID0gX1VuZnJhbWVyKHNlbGYuX2ZpbGVfcmVhZCwgc2VsZi5fZmlsZV9yZWFkbGluZSkKICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5fdW5mcmFtZXIucmVhZAogICAgICAgICBzZWxmLnJlYWRsaW5lID0gc2VsZi5fdW5mcmFtZXIucmVhZGxpbmUKLSAgICAgICAgc2VsZi5tYXJrID0gb2JqZWN0KCkgIyBhbnkgbmV3IHVuaXF1ZSBvYmplY3QKKyAgICAgICAgc2VsZi5tZXRhc3RhY2sgPSBbXQogICAgICAgICBzZWxmLnN0YWNrID0gW10KICAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAogICAgICAgICBzZWxmLnByb3RvID0gMApAQCAtMTA0MCwyMCArMTA0NywxMiBAQAogICAgICAgICBleGNlcHQgX1N0b3AgYXMgc3RvcGluc3Q6CiAgICAgICAgICAgICByZXR1cm4gc3RvcGluc3QudmFsdWUKIAotICAgICMgUmV0dXJuIGxhcmdlc3QgaW5kZXggayBzdWNoIHRoYXQgc2VsZi5zdGFja1trXSBpcyBzZWxmLm1hcmsuCi0gICAgIyBJZiB0aGUgc3RhY2sgZG9lc24ndCBjb250YWluIGEgbWFyaywgZXZlbnR1YWxseSByYWlzZXMgSW5kZXhFcnJvci4KLSAgICAjIFRoaXMgY291bGQgYmUgc3BlZCBieSBtYWludGFpbmluZyBhbm90aGVyIHN0YWNrLCBvZiBpbmRpY2VzIGF0IHdoaWNoCi0gICAgIyB0aGUgbWFyayBhcHBlYXJzLiAgRm9yIHRoYXQgbWF0dGVyLCB0aGUgbGF0dGVyIHN0YWNrIHdvdWxkIHN1ZmZpY2UsCi0gICAgIyBhbmQgd2Ugd291bGRuJ3QgbmVlZCB0byBwdXNoIG1hcmsgb2JqZWN0cyBvbiBzZWxmLnN0YWNrIGF0IGFsbC4KLSAgICAjIERvaW5nIHNvIGlzIHByb2JhYmx5IGEgZ29vZCB0aGluZywgdGhvdWdoLCBzaW5jZSBpZiB0aGUgcGlja2xlIGlzCi0gICAgIyBjb3JydXB0IChvciBob3N0aWxlKSB3ZSBtYXkgZ2V0IGEgY2x1ZSBmcm9tIGZpbmRpbmcgc2VsZi5tYXJrIGVtYmVkZGVkCi0gICAgIyBpbiB1bnBpY2tsZWQgb2JqZWN0cy4KLSAgICBkZWYgbWFya2VyKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFyawotICAgICAgICBrID0gbGVuKHN0YWNrKS0xCi0gICAgICAgIHdoaWxlIHN0YWNrW2tdIGlzIG5vdCBtYXJrOiBrID0gay0xCi0gICAgICAgIHJldHVybiBrCisgICAgIyBSZXR1cm4gYSBsaXN0IG9mIGl0ZW1zIHB1c2hlZCBpbiB0aGUgc3RhY2sgYWZ0ZXIgbGFzdCBNQVJLIGluc3RydWN0aW9uLgorICAgIGRlZiBwb3BfbWFyayhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBzZWxmLnN0YWNrCisgICAgICAgIHNlbGYuc3RhY2sgPSBzZWxmLm1ldGFzdGFjay5wb3AoKQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCisgICAgICAgIHJldHVybiBpdGVtcwogCiAgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzZWxmLCBwaWQpOgogICAgICAgICByYWlzZSBVbnBpY2tsaW5nRXJyb3IoInVuc3VwcG9ydGVkIHBlcnNpc3RlbnQgaWQgZW5jb3VudGVyZWQiKQpAQCAtMTIzMCw4ICsxMjI5LDggQEAKICAgICBkaXNwYXRjaFtTSE9SVF9CSU5VTklDT0RFWzBdXSA9IGxvYWRfc2hvcnRfYmludW5pY29kZQogCiAgICAgZGVmIGxvYWRfdHVwbGUoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3R1cGxlKHNlbGYuc3RhY2tbaysxOl0pXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZCh0dXBsZShpdGVtcykpCiAgICAgZGlzcGF0Y2hbVFVQTEVbMF1dID0gbG9hZF90dXBsZQogCiAgICAgZGVmIGxvYWRfZW1wdHlfdHVwbGUoc2VsZik6CkBAIC0xMjYzLDIxICsxMjYyLDIwIEBACiAgICAgZGlzcGF0Y2hbRU1QVFlfU0VUWzBdXSA9IGxvYWRfZW1wdHlfc2V0CiAKICAgICBkZWYgbG9hZF9mcm96ZW5zZXQoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW2Zyb3plbnNldChzZWxmLnN0YWNrW2srMTpdKV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoZnJvemVuc2V0KGl0ZW1zKSkKICAgICBkaXNwYXRjaFtGUk9aRU5TRVRbMF1dID0gbG9hZF9mcm96ZW5zZXQKIAogICAgIGRlZiBsb2FkX2xpc3Qoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3NlbGYuc3RhY2tbaysxOl1dCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKGl0ZW1zKQogICAgIGRpc3BhdGNoW0xJU1RbMF1dID0gbG9hZF9saXN0CiAKICAgICBkZWYgbG9hZF9kaWN0KHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2tbaysxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKICAgICAgICAgZCA9IHtpdGVtc1tpXTogaXRlbXNbaSsxXQogICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpfQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtkXQorICAgICAgICBzZWxmLmFwcGVuZChkKQogICAgIGRpc3BhdGNoW0RJQ1RbMF1dID0gbG9hZF9kaWN0CiAKICAgICAjIElOU1QgYW5kIE9CSiBkaWZmZXIgb25seSBpbiBob3cgdGhleSBnZXQgYSBjbGFzcyBvYmplY3QuICBJdCdzIG5vdApAQCAtMTI4NSw5ICsxMjgzLDcgQEAKICAgICAjIHByZXZpb3VzbHkgZGl2ZXJnZWQgYW5kIGdyZXcgZGlmZmVyZW50IGJ1Z3MuCiAgICAgIyBrbGFzcyBpcyB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUsIGFuZCBrIHBvaW50cyB0byB0aGUgdG9wbW9zdCBtYXJrCiAgICAgIyBvYmplY3QsIGZvbGxvd2luZyB3aGljaCBhcmUgdGhlIGFyZ3VtZW50cyBmb3Iga2xhc3MuX19pbml0X18uCi0gICAgZGVmIF9pbnN0YW50aWF0ZShzZWxmLCBrbGFzcywgayk6Ci0gICAgICAgIGFyZ3MgPSB0dXBsZShzZWxmLnN0YWNrW2srMTpdKQotICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBhcmdzKToKICAgICAgICAgaWYgKGFyZ3Mgb3Igbm90IGlzaW5zdGFuY2Uoa2xhc3MsIHR5cGUpIG9yCiAgICAgICAgICAgICBoYXNhdHRyKGtsYXNzLCAiX19nZXRpbml0YXJnc19fIikpOgogICAgICAgICAgICAgdHJ5OgpAQCAtMTMwMywxNCArMTI5OSwxNCBAQAogICAgICAgICBtb2R1bGUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXS5kZWNvZGUoImFzY2lpIikKICAgICAgICAgbmFtZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdLmRlY29kZSgiYXNjaWkiKQogICAgICAgICBrbGFzcyA9IHNlbGYuZmluZF9jbGFzcyhtb2R1bGUsIG5hbWUpCi0gICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLm1hcmtlcigpKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgc2VsZi5wb3BfbWFyaygpKQogICAgIGRpc3BhdGNoW0lOU1RbMF1dID0gbG9hZF9pbnN0CiAKICAgICBkZWYgbG9hZF9vYmooc2VsZik6CiAgICAgICAgICMgU3RhY2sgaXMgLi4uIG1hcmtvYmplY3QgY2xhc3NvYmplY3QgYXJnMSBhcmcyIC4uLgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBrbGFzcyA9IHNlbGYuc3RhY2sucG9wKGsrMSkKLSAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIGspCisgICAgICAgIGFyZ3MgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgY2xzID0gYXJncy5wb3AoMCkKKyAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoY2xzLCBhcmdzKQogICAgIGRpc3BhdGNoW09CSlswXV0gPSBsb2FkX29iagogCiAgICAgZGVmIGxvYWRfbmV3b2JqKHNlbGYpOgpAQCAtMTM5NSwxMiArMTM5MSwxNCBAQAogICAgIGRpc3BhdGNoW1JFRFVDRVswXV0gPSBsb2FkX3JlZHVjZQogCiAgICAgZGVmIGxvYWRfcG9wKHNlbGYpOgotICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKyAgICAgICAgaWYgc2VsZi5zdGFjazoKKyAgICAgICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wb3BfbWFyaygpCiAgICAgZGlzcGF0Y2hbUE9QWzBdXSA9IGxvYWRfcG9wCiAKICAgICBkZWYgbG9hZF9wb3BfbWFyayhzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgZGVsIHNlbGYuc3RhY2tbazpdCisgICAgICAgIHNlbGYucG9wX21hcmsoKQogICAgIGRpc3BhdGNoW1BPUF9NQVJLWzBdXSA9IGxvYWRfcG9wX21hcmsKIAogICAgIGRlZiBsb2FkX2R1cChzZWxmKToKQEAgLTE0NTYsMTcgKzE0NTQsMTQgQEAKICAgICBkaXNwYXRjaFtBUFBFTkRbMF1dID0gbG9hZF9hcHBlbmQKIAogICAgIGRlZiBsb2FkX2FwcGVuZHMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBsaXN0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgbGlzdF9vYmogPSBzZWxmLnN0YWNrWy0xXQogICAgICAgICBpZiBpc2luc3RhbmNlKGxpc3Rfb2JqLCBsaXN0KToKICAgICAgICAgICAgIGxpc3Rfb2JqLmV4dGVuZChpdGVtcykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFwcGVuZCA9IGxpc3Rfb2JqLmFwcGVuZAogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgYXBwZW5kKGl0ZW0pCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KICAgICBkaXNwYXRjaFtBUFBFTkRTWzBdXSA9IGxvYWRfYXBwZW5kcwogCiAgICAgZGVmIGxvYWRfc2V0aXRlbShzZWxmKToKQEAgLTE0NzgsMjcgKzE0NzMsMjEgQEAKICAgICBkaXNwYXRjaFtTRVRJVEVNWzBdXSA9IGxvYWRfc2V0aXRlbQogCiAgICAgZGVmIGxvYWRfc2V0aXRlbXMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBkaWN0ID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGZvciBpIGluIHJhbmdlKG1hcmsgKyAxLCBsZW4oc3RhY2spLCAyKToKLSAgICAgICAgICAgIGRpY3Rbc3RhY2tbaV1dID0gc3RhY2tbaSArIDFdCi0KLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBkaWN0ID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMik6CisgICAgICAgICAgICBkaWN0W2l0ZW1zW2ldXSA9IGl0ZW1zW2kgKyAxXQogICAgIGRpc3BhdGNoW1NFVElURU1TWzBdXSA9IGxvYWRfc2V0aXRlbXMKIAogICAgIGRlZiBsb2FkX2FkZGl0ZW1zKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2V0X29iaiA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBpdGVtcyA9IHN0YWNrW21hcmsgKyAxOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2V0X29iaiA9IHNlbGYuc3RhY2tbLTFdCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0X29iaiwgc2V0KToKICAgICAgICAgICAgIHNldF9vYmoudXBkYXRlKGl0ZW1zKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYWRkID0gc2V0X29iai5hZGQKICAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICAgICAgIGFkZChpdGVtKQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCiAgICAgZGlzcGF0Y2hbQURESVRFTVNbMF1dID0gbG9hZF9hZGRpdGVtcwogCiAgICAgZGVmIGxvYWRfYnVpbGQoc2VsZik6CkBAIC0xNTI2LDcgKzE1MTUsOSBAQAogICAgIGRpc3BhdGNoW0JVSUxEWzBdXSA9IGxvYWRfYnVpbGQKIAogICAgIGRlZiBsb2FkX21hcmsoc2VsZik6Ci0gICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWFyaykKKyAgICAgICAgc2VsZi5tZXRhc3RhY2suYXBwZW5kKHNlbGYuc3RhY2spCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCiAgICAgZGlzcGF0Y2hbTUFSS1swXV0gPSBsb2FkX21hcmsKIAogICAgIGRlZiBsb2FkX3N0b3Aoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvcGlja2xldG9vbHMucHkgYi9MaWIvcGlja2xldG9vbHMucHkKaW5kZXggMTU1YmQ1Yi4uMWM3NzMzNiAxMDA2NDQKLS0tIGEvTGliL3BpY2tsZXRvb2xzLnB5CisrKyBiL0xpYi9waWNrbGV0b29scy5weQpAQCAtMjQ0MCw2ICsyNDQwLDcgQEAKICAgICAgICAgaWYgb3Bjb2RlLm5hbWUgaW4gKCJQVVQiLCAiQklOUFVUIiwgIkxPTkdfQklOUFVUIiwgIk1FTU9JWkUiKToKICAgICAgICAgICAgIGlmIG9wY29kZS5uYW1lID09ICJNRU1PSVpFIjoKICAgICAgICAgICAgICAgICBtZW1vX2lkeCA9IGxlbihtZW1vKQorICAgICAgICAgICAgICAgIG1hcmttc2cgPSAiKGFzICVkKSIgJSBtZW1vX2lkeAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBhc3NlcnQgYXJnIGlzIG5vdCBOb25lCiAgICAgICAgICAgICAgICAgbWVtb19pZHggPSBhcmcKZGlmZiAtLWdpdCBhL0xpYi9wa2d1dGlsLnB5IGIvTGliL3BrZ3V0aWwucHkKaW5kZXggZmM0YTA3NC4uMjAzZDUxNSAxMDA2NDQKLS0tIGEvTGliL3BrZ3V0aWwucHkKKysrIGIvTGliL3BrZ3V0aWwucHkKQEAgLTE4MCw3ICsxODAsNyBAQAogZGVmIF9pbXBvcnRfaW1wKCk6CiAgICAgZ2xvYmFsIGltcAogICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICAgaW1wID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ2ltcCcpCiAKIGNsYXNzIEltcEltcG9ydGVyOgpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jLnB5IGIvTGliL3B5ZG9jLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTljMDRmMC4uYTczMjk4ZAotLS0gYS9MaWIvcHlkb2MucHkKKysrIGIvTGliL3B5ZG9jLnB5CkBAIC0yMDksNiArMjA5LDE4IEBACiAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChuYW1lLCBraW5kLCBjbHMsIHZhbHVlKSkKICAgICByZXR1cm4gcmVzdWx0cwogCitkZWYgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpOgorICAgICdTb3J0IHRoZSBhdHRycyBsaXN0IGluLXBsYWNlIGJ5IF9maWVsZHMgYW5kIHRoZW4gYWxwaGFiZXRpY2FsbHkgYnkgbmFtZScKKyAgICAjIFRoaXMgYWxsb3dzIGRhdGEgZGVzY3JpcHRvcnMgdG8gYmUgb3JkZXJlZCBhY2NvcmRpbmcKKyAgICAjIHRvIGEgX2ZpZWxkcyBhdHRyaWJ1dGUgaWYgcHJlc2VudC4KKyAgICBmaWVsZHMgPSBnZXRhdHRyKG9iamVjdCwgJ19maWVsZHMnLCBbXSkKKyAgICB0cnk6CisgICAgICAgIGZpZWxkX29yZGVyID0ge25hbWUgOiBpLWxlbihmaWVsZHMpIGZvciAoaSwgbmFtZSkgaW4gZW51bWVyYXRlKGZpZWxkcyl9CisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgZmllbGRfb3JkZXIgPSB7fQorICAgIGtleWZ1bmMgPSBsYW1iZGEgYXR0cjogKGZpZWxkX29yZGVyLmdldChhdHRyWzBdLCAwKSwgYXR0clswXSkKKyAgICBhdHRycy5zb3J0KGtleT1rZXlmdW5jKQorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBtYW5pcHVsYXRpb24KIAogZGVmIGlzcGFja2FnZShwYXRoKToKQEAgLTg2Nyw4ICs4NzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykKICAgICAgICAgICAgIHRhZyArPSAnOjxicj5cbicKIAotICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCi0gICAgICAgICAgICBhdHRycy5zb3J0KGtleT1sYW1iZGEgdDogdFswXSkKKyAgICAgICAgICAgIHNvcnRfYXR0cmlidXRlcyhhdHRycywgb2JqZWN0KQogCiAgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgogICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgnTWV0aG9kcyAlcycgJSB0YWcsIGF0dHJzLApAQCAtMTI4Niw4ICsxMjk3LDggQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgdGFnID0gImluaGVyaXRlZCBmcm9tICVzIiAlIGNsYXNzbmFtZSh0aGlzY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykKLSAgICAgICAgICAgICMgU29ydCBhdHRycyBieSBuYW1lLgotICAgICAgICAgICAgYXR0cnMuc29ydCgpCisKKyAgICAgICAgICAgIHNvcnRfYXR0cmlidXRlcyhhdHRycywgb2JqZWN0KQogCiAgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgogICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgiTWV0aG9kcyAlczpcbiIgJSB0YWcsIGF0dHJzLApkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CmluZGV4IDI1MGJmZDMuLjM4ODU3ZDIgMTAwNjQ0Ci0tLSBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQorKysgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQotIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBTYXQgRGVjICA1IDE3OjAyOjQ5IDIwMTUKKyMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gU2F0IE1heSAyMyAxNzozODo0MSAyMDE1CiB0b3BpY3MgPSB7J2Fzc2VydCc6IHUnXG5UaGUgImFzc2VydCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9uc1xuaW50byBhIHByb2dyYW06XG5cbiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1cblxuVGhlIHNpbXBsZSBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24iLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuXG5UaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCAiX19kZWJ1Z19fIiBhbmQgIkFzc2VydGlvbkVycm9yIiByZWZlclxudG8gdGhlIGJ1aWx0LWluIHZhcmlhYmxlcyB3aXRoIHRob3NlIG5hbWVzLiAgSW4gdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgIkZhbHNlIiB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgKGNvbW1hbmRcbmxpbmUgb3B0aW9uIC1PKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuXG5hc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlIHRpbWUuICBOb3RlXG50aGF0IGl0IGlzIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvblxudGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlXG5zdGFjayB0cmFjZS5cblxuQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAogICdhc3NpZ25tZW50JzogdSdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG4gICAgICAgICAgICAgIHwgIioiIHRhcmdldFxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yXG4qYXR0cmlidXRlcmVmKiwgKnN1YnNjcmlwdGlvbiosIGFuZCAqc2xpY2luZyouKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCwgb3B0aW9uYWxseSBlbmNsb3NlZCBpblxucGFyZW50aGVzZXMgb3Igc3F1YXJlIGJyYWNrZXRzLCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzIGZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldDogVGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0b1xuICB0aGF0IHRhcmdldC5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzOiBUaGVcbiAgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmVcbiAgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbVxuICBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4gICogSWYgdGhlIHRhcmdldCBsaXN0IGNvbnRhaW5zIG9uZSB0YXJnZXQgcHJlZml4ZWQgd2l0aCBhblxuICAgIGFzdGVyaXNrLCBjYWxsZWQgYSAic3RhcnJlZCIgdGFyZ2V0OiBUaGUgb2JqZWN0IG11c3QgYmUgYSBzZXF1ZW5jZVxuICAgIHdpdGggYXQgbGVhc3QgYXMgbWFueSBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0XG4gICAgbGlzdCwgbWludXMgb25lLiAgVGhlIGZpcnN0IGl0ZW1zIG9mIHRoZSBzZXF1ZW5jZSBhcmUgYXNzaWduZWQsXG4gICAgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgVGhlXG4gICAgZmluYWwgaXRlbXMgb2YgdGhlIHNlcXVlbmNlIGFyZSBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0cyBhZnRlciB0aGVcbiAgICBzdGFycmVkIHRhcmdldC4gIEEgbGlzdCBvZiB0aGUgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBpc1xuICAgIHRoZW4gYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICh0aGUgbGlzdCBjYW4gYmUgZW1wdHkpLlxuXG4gICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGEgc2VxdWVuY2Ugd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlXG4gICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgImdsb2JhbCIgb3IgIm5vbmxvY2FsIiBzdGF0ZW1lbnRcbiAgICBpbiB0aGUgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZVxuICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBnbG9iYWxcbiAgICBuYW1lc3BhY2Ugb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICJub25sb2NhbCIsXG4gICAgcmVzcGVjdGl2ZWx5LlxuXG4gIFRoZSBuYW1lIGlzIHJlYm91bmQgaWYgaXQgd2FzIGFscmVhZHkgYm91bmQuICBUaGlzIG1heSBjYXVzZSB0aGVcbiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2hcbiAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgZGVzdHJ1Y3RvciAoaWYgaXRcbiAgaGFzIG9uZSkgdG8gYmUgY2FsbGVkLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSB0YXJnZXQgbGlzdCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBvciBpblxuICBzcXVhcmUgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlclxuICBvZiBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCBpdHMgaXRlbXMgYXJlXG4gIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluXG4gIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4gIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsICJUeXBlRXJyb3IiIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAiQXR0cmlidXRlRXJyb3IiKS5cblxuICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlXG4gIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTIGV4cHJlc3Npb24sXG4gICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2VcbiAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCAiYS54IiBpcyBhbHdheXNcbiAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgVGh1cywgdGhlXG4gIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlIHNhbWVcbiAgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLCB0aGVcbiAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4gIGFzc2lnbm1lbnQ6XG5cbiAgICAgY2xhc3MgQ2xzOlxuICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuICAgICBpbnN0ID0gQ2xzKClcbiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgM1xuXG4gIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlXG4gIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWRcbiAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgSWYgdGhlXG4gIGluZGV4IGlzIG91dCBvZiByYW5nZSwgIkluZGV4RXJyb3IiIGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byBhXG4gIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4gIEZvciB1c2VyLWRlZmluZWQgb2JqZWN0cywgdGhlICJfX3NldGl0ZW1fXygpIiBtZXRob2QgaXMgY2FsbGVkIHdpdGhcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3RcbiAgKHN1Y2ggYXMgYSBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0XG4gIG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZVxuICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuICBzZXF1ZW5jZVwncyBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gSWZcbiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlXG4gIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCwgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlXG4gIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgbGVuZ3RoIG9mXG4gIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UsXG4gIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgdGFyZ2V0XG4gIHNlcXVlbmNlIGFsbG93cyBpdC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlXG5zeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCBhbmRcbmludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCBjYXVzaW5nXG5sZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuXG5BbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyBiZXR3ZWVuXG50aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlIFwnc2ltdWx0YW5lbm91c1wnIChmb3JcbmV4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlXG5jb2xsZWN0aW9uIG9mIGFzc2lnbmVkLXRvIHZhcmlhYmxlcyBvY2N1ciBsZWZ0LXRvLXJpZ2h0LCBzb21ldGltZXNcbnJlc3VsdGluZyBpbiBjb25mdXNpb24uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcmludHNcbiJbMCwgMl0iOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDIgICAgICAgICAjIGkgaXMgdXBkYXRlZCwgdGhlbiB4W2ldIGlzIHVwZGF0ZWRcbiAgIHByaW50KHgpXG5cblNlZSBhbHNvOiAqKlBFUCAzMTMyKiogLSBFeHRlbmRlZCBJdGVyYWJsZSBVbnBhY2tpbmdcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICIqdGFyZ2V0IiBmZWF0dXJlLlxuXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWxcbmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uXG5saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50XG5vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuXG5UaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzXG4ieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW4gdGhlXG5hdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsXG50aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuXG5jcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgb2JqZWN0XG5pcyBtb2RpZmllZCBpbnN0ZWFkLlxuXG5Vbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlIGxlZnQtXG5oYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldXG4rPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXNcbnRoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAiYVtpXSIuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAogICdhdG9tLWlkZW50aWZpZXJzJzogdSdcbklkZW50aWZpZXJzIChOYW1lcylcbioqKioqKioqKioqKioqKioqKipcblxuQW4gaWRlbnRpZmllciBvY2N1cnJpbmcgYXMgYW4gYXRvbSBpcyBhIG5hbWUuICBTZWUgc2VjdGlvblxuKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyogZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQgc2VjdGlvbiAqTmFtaW5nXG5hbmQgYmluZGluZyogZm9yIGRvY3VtZW50YXRpb24gb2YgbmFtaW5nIGFuZCBiaW5kaW5nLlxuXG5XaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgYXRvbSB5aWVsZHNcbnRoYXQgb2JqZWN0LiBXaGVuIGEgbmFtZSBpcyBub3QgYm91bmQsIGFuIGF0dGVtcHQgdG8gZXZhbHVhdGUgaXRcbnJhaXNlcyBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbi5cblxuKipQcml2YXRlIG5hbWUgbWFuZ2xpbmc6KiogV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgdGV4dHVhbGx5IG9jY3VycyBpblxuYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmRcbmRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlXG5uYW1lKiBvZiB0aGF0IGNsYXNzLiBQcml2YXRlIG5hbWVzIGFyZSB0cmFuc2Zvcm1lZCB0byBhIGxvbmdlciBmb3JtXG5iZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gaW5zZXJ0cyB0aGVcbmNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhIHNpbmdsZSB1bmRlcnNjb3JlXG5pbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWZpZXIgIl9fc3BhbSJcbm9jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkICJIYW0iIHdpbGwgYmUgdHJhbnNmb3JtZWQgdG8gIl9IYW1fX3NwYW0iLlxuVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWwgY29udGV4dCBpbiB3aGljaFxudGhlIGlkZW50aWZpZXIgaXMgdXNlZC4gIElmIHRoZSB0cmFuc2Zvcm1lZCBuYW1lIGlzIGV4dHJlbWVseSBsb25nXG4obG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMpLCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHRydW5jYXRpb24gbWF5XG5oYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsIG5vXG50cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuJywKQEAgLTE4LDE5ICsxOCwxOSBAQAogICdjYWxsYWJsZS10eXBlcyc6IHUnXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbiAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuJywKICAnY2FsbHMnOiB1J1xuQ2FsbHNcbioqKioqXG5cbkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgcG9zc2libHlcbmVtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjpcblxuICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdIHwgY29tcHJlaGVuc2lvbl0gIikiXG4gICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRfYXJndW1lbnRzIFsiLCIgIioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZF9hcmd1bWVudHNdIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCAiKiIgZXhwcmVzc2lvbiBbIiwiIGtleXdvcmRfYXJndW1lbnRzXSBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBleHByZXNzaW9uXG4gICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gZXhwcmVzc2lvbiAoIiwiIGV4cHJlc3Npb24pKlxuICAga2V5d29yZF9hcmd1bWVudHMgICAgOjo9IGtleXdvcmRfaXRlbSAoIiwiIGtleXdvcmRfaXRlbSkqXG4gICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvblxuXG5BbiBvcHRpb25hbCB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmRcbmtleXdvcmQgYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy5cblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG5mdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzc1xub2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBhbGwgb2JqZWN0cyBoYXZpbmcgYVxuIl9fY2FsbF9fKCkiIG1ldGhvZCBhcmUgY2FsbGFibGUpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZVxuZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbCBpcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvblxuKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuXG5cbklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpc1xuY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxua2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWxcbnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXNcbmFscmVhZHkgZmlsbGVkLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlXG52YWx1ZSBvZiB0aGUgYXJndW1lbnQgaXMgcGxhY2VkIGluIHRoZSBzbG90LCBmaWxsaW5nIGl0IChldmVuIGlmIHRoZVxuZXhwcmVzc2lvbiBpcyAiTm9uZSIsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlXG5iZWVuIHByb2Nlc3NlZCwgdGhlIHNsb3RzIHRoYXQgYXJlIHN0aWxsIHVuZmlsbGVkIGFyZSBmaWxsZWQgd2l0aCB0aGVcbmNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKERlZmF1bHRcbnZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYVxubXV0YWJsZSBvYmplY3Qgc3VjaCBhcyBhIGxpc3Qgb3IgZGljdGlvbmFyeSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUgd2lsbFxuYmUgc2hhcmVkIGJ5IGFsbCBjYWxscyB0aGF0IGRvblwndCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHZhbHVlIGZvciB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSBhbnlcbnVuZmlsbGVkIHNsb3RzIGZvciB3aGljaCBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCwgYSAiVHlwZUVycm9yIlxuZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkIHNsb3RzIGlzIHVzZWQgYXNcbnRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlblxuaWYgdGhleSBhcmUgXCduYW1lZFwnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2VcbmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSAiUHlBcmdfUGFyc2VUdXBsZSgpIiB0byBwYXJzZVxudGhlaXIgYXJndW1lbnRzLlxuXG5JZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRoZXJlIGFyZSBmb3JtYWwgcGFyYW1ldGVyXG5zbG90cywgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG51c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4ob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuXG5JZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxubmFtZSwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG51c2luZyB0aGUgc3ludGF4ICIqKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWxcbnBhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmRcbmFyZ3VtZW50cyAodXNpbmcgdGhlIGtleXdvcmRzIGFzIGtleXMgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZXMgYXNcbmNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgbm9cbmV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy5cblxuSWYgdGhlIHN5bnRheCAiKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsICJleHByZXNzaW9uIlxubXVzdCBldmFsdWF0ZSB0byBhbiBpdGVyYWJsZS4gIEVsZW1lbnRzIGZyb20gdGhpcyBpdGVyYWJsZSBhcmUgdHJlYXRlZFxuYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHM7IGlmIHRoZXJlIGFyZVxucG9zaXRpb25hbCBhcmd1bWVudHMgKngxKiwgLi4uLCAqeE4qLCBhbmQgImV4cHJlc3Npb24iIGV2YWx1YXRlcyB0byBhXG5zZXF1ZW5jZSAqeTEqLCAuLi4sICp5TSosIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGwgd2l0aCBNK05cbnBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosIC4uLiwgKnhOKiwgKnkxKiwgLi4uLCAqeU0qLlxuXG5BIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgIipleHByZXNzaW9uIiBzeW50YXggbWF5XG5hcHBlYXIgKmFmdGVyKiBzb21lIGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSogdGhlXG5rZXl3b3JkIGFyZ3VtZW50cyAoYW5kIHRoZSAiKipleHByZXNzaW9uIiBhcmd1bWVudCwgaWYgYW55IC0tIHNlZVxuYmVsb3cpLiAgU286XG5cbiAgID4+PiBkZWYgZihhLCBiKTpcbiAgIC4uLiAgcHJpbnQoYSwgYilcbiAgIC4uLlxuICAgPj4+IGYoYj0xLCAqKDIsKSlcbiAgIDIgMVxuICAgPj4+IGYoYT0xLCAqKDIsKSlcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCBcJ2FcJ1xuICAgPj4+IGYoMSwgKigyLCkpXG4gICAxIDJcblxuSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4XG50byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXMgbm90XG5hcmlzZS5cblxuSWYgdGhlIHN5bnRheCAiKipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLFxuImV4cHJlc3Npb24iIG11c3QgZXZhbHVhdGUgdG8gYSBtYXBwaW5nLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlXG50cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBJbiB0aGUgY2FzZSBvZiBhIGtleXdvcmRcbmFwcGVhcmluZyBpbiBib3RoICJleHByZXNzaW9uIiBhbmQgYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwgYVxuIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cblxuRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiXG5jYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbm5hbWVzLlxuXG5BIGNhbGwgYWx3YXlzIHJldHVybnMgc29tZSB2YWx1ZSwgcG9zc2libHkgIk5vbmUiLCB1bmxlc3MgaXQgcmFpc2VzIGFuXG5leGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZVxuY2FsbGFibGUgb2JqZWN0LlxuXG5JZiBpdCBpcy0tLVxuXG5hIHVzZXItZGVmaW5lZCBmdW5jdGlvbjpcbiAgIFRoZSBjb2RlIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlXG4gICBhcmd1bWVudCBsaXN0LiAgVGhlIGZpcnN0IHRoaW5nIHRoZSBjb2RlIGJsb2NrIHdpbGwgZG8gaXMgYmluZCB0aGVcbiAgIGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRoZSBhcmd1bWVudHM7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb25cbiAgICpGdW5jdGlvbiBkZWZpbml0aW9ucyouICBXaGVuIHRoZSBjb2RlIGJsb2NrIGV4ZWN1dGVzIGEgInJldHVybiJcbiAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cblxuYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XG4gICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlICpCdWlsdC1pbiBGdW5jdGlvbnMqIGZvclxuICAgdGhlIGRlc2NyaXB0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuXG5cbmEgY2xhc3Mgb2JqZWN0OlxuICAgQSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBpcyByZXR1cm5lZC5cblxuYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6XG4gICBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aXRoIGFuIGFyZ3VtZW50XG4gICBsaXN0IHRoYXQgaXMgb25lIGxvbmdlciB0aGFuIHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjYWxsOiB0aGVcbiAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuXG5hIGNsYXNzIGluc3RhbmNlOlxuICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgIl9fY2FsbF9fKCkiIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuIHRoZVxuICAgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLlxuJywKICAnY2xhc3MnOiB1J1xuQ2xhc3MgZGVmaW5pdGlvbnNcbioqKioqKioqKioqKioqKioqXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgbGlzdFxudXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgKkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uKlxuZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYVxuY2xhc3Mgb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZVxubGlzdCBpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcblxuICAgY2xhc3MgRm9vOlxuICAgICAgIHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb28ob2JqZWN0KTpcbiAgICAgICBwYXNzXG5cblRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlXG4qTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZVxub3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzXG5leGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gQVxuY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2VcbmNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS5cblRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxubmFtZXNwYWNlLlxuXG5DbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nICptZXRhY2xhc3NlcyouXG5cbkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucyxcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgY2xhc3MgRm9vOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vOiBwYXNzXG4gICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG5cblRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3JcbmZ1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcyBvYmplY3QsIHdoaWNoIGlzIHRoZW5cbmJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSBhdHRyaWJ1dGVzXG5jYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG5pbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICIic2VsZi5uYW1lIiIsXG5hbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZVxud2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdHNcbmZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgdG9cbnVuZXhwZWN0ZWQgcmVzdWx0cy4gICpEZXNjcmlwdG9ycyogY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4gIENsYXNzIERlY29yYXRvcnNcbicsCi0gJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblxuVmFsdWUgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lIHR5cGUuXG5cbkNoYXB0ZXIgKk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMqIHN0YXRlcyB0aGF0IG9iamVjdHMgaGF2ZSBhIHZhbHVlXG4oaW4gYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhXG5yYXRoZXIgYWJzdHJhY3Qgbm90aW9uIGluIFB5dGhvbjogRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbFxuYWNjZXNzIG1ldGhvZCBmb3IgYW4gb2JqZWN0XCdzIHZhbHVlLiAgQWxzbywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnRcbnRoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBzaG91bGQgYmUgY29uc3RydWN0ZWQgaW4gYSBwYXJ0aWN1bGFyIHdheSxcbmUuZy4gY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9yc1xuaW1wbGVtZW50IGEgcGFydGljdWxhciBub3Rpb24gb2Ygd2hhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzLiAgT25lXG5jYW4gdGhpbmsgb2YgdGhlbSBhcyBkZWZpbmluZyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGluZGlyZWN0bHksIGJ5XG5tZWFucyBvZiB0aGVpciBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLlxuXG5CZWNhdXNlIGFsbCB0eXBlcyBhcmUgKGRpcmVjdCBvciBpbmRpcmVjdCkgc3VidHlwZXMgb2YgIm9iamVjdCIsIHRoZXlcbmluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciBmcm9tICJvYmplY3QiLiAgVHlwZXMgY2FuXG5jdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggY29tcGFyaXNvblxubWV0aG9kcyogbGlrZSAiX19sdF9fKCkiLCBkZXNjcmliZWQgaW4gKkJhc2ljIGN1c3RvbWl6YXRpb24qLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgaXMgYmFzZWRcbm9uIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4gIEhlbmNlLCBlcXVhbGl0eSBjb21wYXJpc29uIG9mXG5pbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBpZGVudGl0eSByZXN1bHRzIGluIGVxdWFsaXR5LCBhbmQgZXF1YWxpdHlcbmNvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpblxuaW5lcXVhbGl0eS4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBkZXNpcmUgdGhhdFxuYWxsIG9iamVjdHMgc2hvdWxkIGJlIHJlZmxleGl2ZSAoaS5lLiAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiKS5cblxuQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90IHByb3ZpZGVkO1xuYW4gYXR0ZW1wdCByYWlzZXMgIlR5cGVFcnJvciIuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCBiZWhhdmlvclxuaXMgdGhlIGxhY2sgb2YgYSBzaW1pbGFyIGludmFyaWFudCBhcyBmb3IgZXF1YWxpdHkuXG5cblRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBlcXVhbGl0eSBjb21wYXJpc29uLCB0aGF0IGluc3RhbmNlcyB3aXRoXG5kaWZmZXJlbnQgaWRlbnRpdGllcyBhcmUgYWx3YXlzIHVuZXF1YWwsIG1heSBiZSBpbiBjb250cmFzdCB0byB3aGF0XG50eXBlcyB3aWxsIG5lZWQgdGhhdCBoYXZlIGEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiBvYmplY3QgdmFsdWUgYW5kXG52YWx1ZS1iYXNlZCBlcXVhbGl0eS4gIFN1Y2ggdHlwZXMgd2lsbCBuZWVkIHRvIGN1c3RvbWl6ZSB0aGVpclxuY29tcGFyaXNvbiBiZWhhdmlvciwgYW5kIGluIGZhY3QsIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIGhhdmUgZG9uZVxudGhhdC5cblxuVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgbW9zdFxuaW1wb3J0YW50IGJ1aWx0LWluIHR5cGVzLlxuXG4qIE51bWJlcnMgb2YgYnVpbHQtaW4gbnVtZXJpYyB0eXBlcyAoKk51bWVyaWMgVHlwZXMgLS0tIGludCwgZmxvYXQsXG4gIGNvbXBsZXgqKSBhbmQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kXG4gICJkZWNpbWFsLkRlY2ltYWwiIGNhbiBiZSBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcyxcbiAgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBjb21wbGV4IG51bWJlcnMgZG8gbm90IHN1cHBvcnQgb3JkZXJcbiAgY29tcGFyaXNvbi4gIFdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSB0eXBlcyBpbnZvbHZlZCwgdGhleSBjb21wYXJlXG4gIG1hdGhlbWF0aWNhbGx5IChhbGdvcml0aG1pY2FsbHkpIGNvcnJlY3Qgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi5cblxuICBUaGUgbm90LWEtbnVtYmVyIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlXG4gIHNwZWNpYWwuICBUaGV5IGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcyAoInggaXMgeCIgaXMgdHJ1ZSkgYnV0XG4gIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcyAoInggPT0geCIgaXMgZmFsc2UpLiAgQWRkaXRpb25hbGx5LFxuICBjb21wYXJpbmcgYW55IG51bWJlciB0byBhIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAiRmFsc2UiLlxuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8IGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbFxuICByZXR1cm4gIkZhbHNlIi5cblxuKiBCaW5hcnkgc2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgImJ5dGVzIiBvciAiYnl0ZWFycmF5IikgY2FuIGJlXG4gIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlXG4gIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVpciBlbGVtZW50cy5cblxuKiBTdHJpbmdzIChpbnN0YW5jZXMgb2YgInN0ciIpIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlXG4gIG51bWVyaWNhbCBVbmljb2RlIGNvZGUgcG9pbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAib3JkKCkiKSBvZiB0aGVpciBjaGFyYWN0ZXJzLiBbM11cblxuICBTdHJpbmdzIGFuZCBiaW5hcnkgc2VxdWVuY2VzIGNhbm5vdCBiZSBkaXJlY3RseSBjb21wYXJlZC5cblxuKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiBiZVxuICBjb21wYXJlZCBvbmx5IHdpdGhpbiBlYWNoIG9mIHRoZWlyIHR5cGVzLCB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0XG4gIHJhbmdlcyBkbyBub3Qgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uLiAgRXF1YWxpdHkgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmVzdWx0cyBpbiB1bmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmFpc2VzICJUeXBlRXJyb3IiLlxuXG4gIFNlcXVlbmNlcyBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cywgd2hlcmVieSByZWZsZXhpdml0eSBvZiB0aGUgZWxlbWVudHMgaXNcbiAgZW5mb3JjZWQuXG5cbiAgSW4gZW5mb3JjaW5nIHJlZmxleGl2aXR5IG9mIGVsZW1lbnRzLCB0aGUgY29tcGFyaXNvbiBvZiBjb2xsZWN0aW9uc1xuICBhc3N1bWVzIHRoYXQgZm9yIGEgY29sbGVjdGlvbiBlbGVtZW50ICJ4IiwgInggPT0geCIgaXMgYWx3YXlzIHRydWUuXG4gIEJhc2VkIG9uIHRoYXQgYXNzdW1wdGlvbiwgZWxlbWVudCBpZGVudGl0eSBpcyBjb21wYXJlZCBmaXJzdCwgYW5kXG4gIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgb25seSBmb3IgZGlzdGluY3QgZWxlbWVudHMuICBUaGlzXG4gIGFwcHJvYWNoIHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgYSBzdHJpY3QgZWxlbWVudCBjb21wYXJpc29uXG4gIHdvdWxkLCBpZiB0aGUgY29tcGFyZWQgZWxlbWVudHMgYXJlIHJlZmxleGl2ZS4gIEZvciBub24tcmVmbGV4aXZlXG4gIGVsZW1lbnRzLCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIGZvciBzdHJpY3QgZWxlbWVudFxuICBjb21wYXJpc29uLCBhbmQgbWF5IGJlIHN1cnByaXNpbmc6ICBUaGUgbm9uLXJlZmxleGl2ZSBub3QtYS1udW1iZXJcbiAgdmFsdWVzIGZvciBleGFtcGxlIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gYmVoYXZpb3Igd2hlblxuICB1c2VkIGluIGEgbGlzdDpcblxuICAgICA+Pj4gbmFuID0gZmxvYXQoXCdOYU5cJylcbiAgICAgPj4+IG5hbiBpcyBuYW5cbiAgICAgVHJ1ZVxuICAgICA+Pj4gbmFuID09IG5hblxuICAgICBGYWxzZSAgICAgICAgICAgICAgICAgPC0tIHRoZSBkZWZpbmVkIG5vbi1yZWZsZXhpdmUgYmVoYXZpb3Igb2YgTmFOXG4gICAgID4+PiBbbmFuXSA9PSBbbmFuXVxuICAgICBUcnVlICAgICAgICAgICAgICAgICAgPC0tIGxpc3QgZW5mb3JjZXMgcmVmbGV4aXZpdHkgYW5kIHRlc3RzIGlkZW50aXR5IGZpcnN0XG5cbiAgTGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBidWlsdC1pbiBjb2xsZWN0aW9ucyB3b3JrcyBhc1xuICBmb2xsb3dzOlxuXG4gICogRm9yIHR3byBjb2xsZWN0aW9ucyB0byBjb21wYXJlIGVxdWFsLCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgICB0eXBlLCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIGVhY2ggcGFpciBvZiBjb3JyZXNwb25kaW5nXG4gICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICgxLDIpIiBpc1xuICAgIGZhbHNlIGJlY2F1c2UgdGhlIHR5cGUgaXMgbm90IHRoZSBzYW1lKS5cblxuICAqIENvbGxlY3Rpb25zIHRoYXQgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIHRoZSBzYW1lXG4gICAgYXMgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9IFsxLDIseV0iXG4gICAgaGFzIHRoZSBzYW1lIHZhbHVlIGFzICJ4IDw9IHkiKS4gIElmIGEgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXNcbiAgICBub3QgZXhpc3QsIHRoZSBzaG9ydGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsXG4gICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuXG5cbiogTWFwcGluZ3MgKGluc3RhbmNlcyBvZiAiZGljdCIpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleVxuICBoYXZlIGVxdWFsICooa2V5LCB2YWx1ZSkqIHBhaXJzLiBFcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSBrZXlzIGFuZFxuICBlbGVtZW50cyBlbmZvcmNlcyByZWZsZXhpdml0eS5cblxuICBPcmRlciBjb21wYXJpc29ucyAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIChpbnN0YW5jZXMgb2YgInNldCIgb3IgImZyb3plbnNldCIpIGNhbiBiZSBjb21wYXJlZCB3aXRoaW5cbiAgYW5kIGFjcm9zcyB0aGVpciB0eXBlcy5cblxuICBUaGV5IGRlZmluZSBvcmRlciBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmQgc3VwZXJzZXRcbiAgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKGZvciBleGFtcGxlLFxuICB0aGUgdHdvIHNldHMgInsxLDJ9IiBhbmQgInsyLDN9IiBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZ1xuICAoZm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzKS5cblxuICBDb21wYXJpc29uIG9mIHNldHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkgb2YgaXRzIGVsZW1lbnRzLlxuXG4qIE1vc3Qgb3RoZXIgYnVpbHQtaW4gdHlwZXMgaGF2ZSBubyBjb21wYXJpc29uIG1ldGhvZHMgaW1wbGVtZW50ZWQsXG4gIHNvIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLlxuXG5Vc2VyLWRlZmluZWQgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIHNob3VsZFxuZm9sbG93IHNvbWUgY29uc2lzdGVuY3kgcnVsZXMsIGlmIHBvc3NpYmxlOlxuXG4qIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsIGlkZW50aWNhbFxuICBvYmplY3RzIHNob3VsZCBjb21wYXJlIGVxdWFsOlxuXG4gICAgICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSJcblxuKiBDb21wYXJpc29uIHNob3VsZCBiZSBzeW1tZXRyaWMuIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nXG4gIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgInkgPT0geCJcblxuICAgICAieCAhPSB5IiBhbmQgInkgIT0geCJcblxuICAgICAieCA8IHkiIGFuZCAieSA+IHgiXG5cbiAgICAgInggPD0geSIgYW5kICJ5ID49IHgiXG5cbiogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAobm9uLWV4aGF1c3RpdmUpXG4gIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhhdDpcblxuICAgICAieCA+IHkgYW5kIHkgPiB6IiBpbXBsaWVzICJ4ID4geiJcblxuICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiXG5cbiogSW52ZXJzZSBjb21wYXJpc29uIHNob3VsZCByZXN1bHQgaW4gdGhlIGJvb2xlYW4gbmVnYXRpb24uIEluIG90aGVyXG4gIHdvcmRzLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgIm5vdCB4ICE9IHkiXG5cbiAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgICAgInggPiB5IiBhbmQgIm5vdCB4IDw9IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgVGhlIGxhc3QgdHdvIGV4cHJlc3Npb25zIGFwcGx5IHRvIHRvdGFsbHkgb3JkZXJlZCBjb2xsZWN0aW9ucyAoZS5nLlxuICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZVxuICAidG90YWxfb3JkZXJpbmcoKSIgZGVjb3JhdG9yLlxuXG5QeXRob24gZG9lcyBub3QgZW5mb3JjZSB0aGVzZSBjb25zaXN0ZW5jeSBydWxlcy4gSW4gZmFjdCwgdGhlXG5ub3QtYS1udW1iZXIgdmFsdWVzIGFyZSBhbiBleGFtcGxlIGZvciBub3QgZm9sbG93aW5nIHRoZXNlIHJ1bGVzLlxuXG5cbk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG5cblxuSWRlbnRpdHkgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCBpcyB5IiBpc1xudHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgbm90IHkiXG55aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKLSAnY29tcG91bmQnOiB1J1xuQ29tcG91bmQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3Rcbm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW5cbmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlXG5pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS5cblxuVGhlICJpZiIsICJ3aGlsZSIgYW5kICJmb3IiIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsIGNvbnRyb2xcbmZsb3cgY29uc3RydWN0cy4gICJ0cnkiIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXBcbmNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cywgd2hpbGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgYWxsb3dzIHRoZVxuZXhlY3V0aW9uIG9mIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gY29kZSBhcm91bmQgYSBibG9jayBvZlxuY29kZS4gIEZ1bmN0aW9uIGFuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kXG5zdGF0ZW1lbnRzLlxuXG5BIGNvbXBvdW5kIHN0YXRlbWVudCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBcJ2NsYXVzZXMuXCcgIEEgY2xhdXNlXG5jb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBcJ3N1aXRlLlwnICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxucGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC5cbkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHNcbndpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlclwnc1xuY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnRcbmxpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2YgYSBzdWl0ZSBjYW4gY29udGFpbiBuZXN0ZWQgY29tcG91bmRcbnN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRuXCd0IGJlXG5jbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkIGJlbG9uZzpcblxuICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCh4KVxuXG5BbHNvIG5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIGJpbmRzIHRpZ2h0ZXIgdGhhbiB0aGUgY29sb24gaW4gdGhpc1xuY29udGV4dCwgc28gdGhhdCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGVcbiJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6XG5cbiAgIGlmIHggPCB5IDwgejogcHJpbnQoeCk7IHByaW50KHkpOyBwcmludCh6KVxuXG5TdW1tYXJpemluZzpcblxuICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX3dpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mdW5jZGVmXG4gICBzdWl0ZSAgICAgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IE5FV0xJTkUgSU5ERU5UIHN0YXRlbWVudCsgREVERU5UXG4gICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXRcbiAgIHN0bXRfbGlzdCAgICAgOjo9IHNpbXBsZV9zdG10ICgiOyIgc2ltcGxlX3N0bXQpKiBbIjsiXVxuXG5Ob3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFcbiJERURFTlQiLiAgQWxzbyBub3RlIHRoYXQgb3B0aW9uYWwgY29udGludWF0aW9uIGNsYXVzZXMgYWx3YXlzIGJlZ2luXG53aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhIHN0YXRlbWVudCwgdGh1cyB0aGVyZSBhcmUgbm9cbmFtYmlndWl0aWVzICh0aGUgXCdkYW5nbGluZyAiZWxzZSJcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnlcbnJlcXVpcmluZyBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cblxuVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwbGFjZXNcbmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cblxuXG5UaGUgImlmIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PVxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG5cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT1cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWRcbmFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFja1xudG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cblxuXG5UaGUgImZvciIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2VcbihzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbnByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMgKHNlZSAqQXNzaWdubWVudCBzdGF0ZW1lbnRzKiksIGFuZCB0aGVuIHRoZSBzdWl0ZSBpc1xuZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZVxuc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiksXG50aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgY29udGludWVzXG53aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dFxuaXRlbS5cblxuVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCBsaXN0LlxuVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nXG50aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG5cbiAgIGZvciBpIGluIHJhbmdlKDEwKTpcbiAgICAgICBwcmludChpKVxuICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcblxuTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLFxuYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXRcbmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyBhblxuaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbFwncyAiZm9yIGlcbjo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsIDJdIi5cblxuTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgQW5cbiAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsXG4gIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzXG4gIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnNcbiAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZVxuICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mXG4gIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG5cblxuVGhlICJ0cnkiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PVxuXG5UaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5UaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vXG5leGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuXG5leGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCBjbGF1c2VzXG5pbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuIGV4cHJlc3Npb24tXG5sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbmV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG5pcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG53aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb25cbm9iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgcmFpc2VkXG50aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZlxucHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzXG5yZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC5cbihUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLFxuYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbm91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICBmb29cblxud2FzIHRyYW5zbGF0ZWQgdG9cblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIGZvb1xuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIGRlbCBOXG5cblRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG5iZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbmN5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxudW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgdmlhXG4ic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlXG5leGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG5wcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbnJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxubm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuXG5JZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAidHJ5IlxuY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuXG5leGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmXG50aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICJmaW5hbGx5IlxuY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbmlzIGRpc2NhcmRlZDpcblxuICAgPj4+IGRlZiBmKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIDEvMFxuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4gICAuLi5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cblxuV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzXG5hbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsIGluXG50aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cblRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbiJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSB0aGVcbmxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG5cblRoZSAid2l0aCIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbm1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gKldpdGggU3RhdGVtZW50XG5Db250ZXh0IE1hbmFnZXJzKikuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG51c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbmZvbGxvd3M6XG5cbjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG5cbjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSJcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgYmVcbiAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWVcbiAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZVxuICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgcmVyYWlzZWQuXG4gICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbiAgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHNcbiAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG5cbldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG5tdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG5cblNlZSBhbHNvOiAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cblxuXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT09PT1cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBmdW5jZGVmICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW3BhcmFtZXRlcl9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgIHwgIioiIFtwYXJhbWV0ZXJdICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiAiKioiIHBhcmFtZXRlcl1cbiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgZGVmIGZ1bmMoKTogcGFzc1xuICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG5cbldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICphcmd1bWVudCogbWF5XG5iZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3MgZGVmYXVsdCB2YWx1ZSBpc1xuc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG5wYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXNcbmlzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiB0aGVcbmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzXG5ldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgInByZS1cbmNvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50XG50byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGFcbmxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieVxuYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLlxuVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgdG8gdXNlXG4iTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZVxuZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuIiIqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueVxuZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGVcbmZvcm0gIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlXG5rZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG5cblBhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiBmb2xsb3dpbmdcbnRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuIHRob3NlXG5vZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSBoYXZlXG4icmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSBwYXJhbWV0ZXJcbmxpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCBhcmVcbmV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgbWF5XG5iZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuXG5UaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc1wnIG5hbWVzIGluIHRoZSAiX19hbm5vdGF0aW9uc19fIlxuYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhXG5leHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247XG5hIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvclxuYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGFcbmV4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXRcbmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIiZGVmIiJcbnN0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWRcbmluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuXG4gICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cblxuXG5DbGFzcyBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT1cblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0XG51c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSAqQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24qXG5mb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhXG5jbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlXG5saXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuXG4gICBjbGFzcyBGb286XG4gICAgICAgcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbyhvYmplY3QpOlxuICAgICAgIHBhc3NcblxuVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbipOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG5vcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHNcbmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSBBXG5jbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZVxuY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LlxuVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG5uYW1lc3BhY2UuXG5cbkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgKm1ldGFjbGFzc2VzKi5cblxuQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLFxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBjbGFzcyBGb286IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb286IHBhc3NcbiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcblxuVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvclxuZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggaXMgdGhlblxuYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXNcbmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbmluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gIiJzZWxmLm5hbWUiIixcbmFuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lXG53aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0c1xuZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0b1xudW5leHBlY3RlZCByZXN1bHRzLiAgKkRlc2NyaXB0b3JzKiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbiAgQ2xhc3MgRGVjb3JhdG9yc1xuXG5cbkNvcm91dGluZXNcbj09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMy41LlxuXG5cbkNvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mdW5jZGVmIDo6PSBbZGVjb3JhdG9yc10gImFzeW5jIiAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG5cbkV4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0IG1hbnlcbnBvaW50cyAoc2VlICpjb3JvdXRpbmUqKS4gIEluIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLCBhbnkgImF3YWl0IiBhbmRcbiJhc3luYyIgaWRlbnRpZmllcnMgYmVjb21lIHJlc2VydmVkIGtleXdvcmRzOyAiYXdhaXQiIGV4cHJlc3Npb25zLFxuImFzeW5jIGZvciIgYW5kICJhc3luYyB3aXRoIiBjYW4gb25seSBiZSB1c2VkIGluIGNvcm91dGluZSBib2RpZXMuXG5cbkZ1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lXG5mdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiAiYXN5bmMgZGVmIlxuY29yb3V0aW5lcy5cblxuQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjpcblxuICAgYXN5bmMgZGVmIGZ1bmMocGFyYW0xLCBwYXJhbTIpOlxuICAgICAgIGRvX3N0dWZmKClcbiAgICAgICBhd2FpdCBzb21lX2Nvcm91dGluZSgpXG5cblxuVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzXG4qaXRlciogaW1wbGVtZW50YXRpb24sIGFuZCAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiBjYW4gY2FsbFxuYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG5cblRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXJcbmFzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG5cblRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOlxuICAgICAgIEJMT0NLXG4gICBlbHNlOlxuICAgICAgIEJMT0NLMlxuXG5JcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcblxuICAgaXRlciA9IChJVEVSKVxuICAgaXRlciA9IGF3YWl0IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4gICBydW5uaW5nID0gVHJ1ZVxuICAgd2hpbGUgcnVubmluZzpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpXG4gICAgICAgZXhjZXB0IFN0b3BBc3luY0l0ZXJhdGlvbjpcbiAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4gICAgICAgZWxzZTpcbiAgICAgICAgICAgQkxPQ0tcbiAgIGVsc2U6XG4gICAgICAgQkxPQ0syXG5cblNlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIGZvciIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5cblRoZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY193aXRoX3N0bXQgOjo9ICJhc3luYyIgd2l0aF9zdG10XG5cbkFuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgYWJsZVxudG8gc3VzcGVuZCBleGVjdXRpb24gaW4gaXRzICplbnRlciogYW5kICpleGl0KiBtZXRob2RzLlxuXG5UaGUgZm9sbG93aW5nIGNvZGU6XG5cbiAgIGFzeW5jIHdpdGggRVhQUiBhcyBWQVI6XG4gICAgICAgQkxPQ0tcblxuSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG5cbiAgIG1nciA9IChFWFBSKVxuICAgYWV4aXQgPSB0eXBlKG1ncikuX19hZXhpdF9fXG4gICBhZW50ZXIgPSB0eXBlKG1ncikuX19hZW50ZXJfXyhtZ3IpXG4gICBleGMgPSBUcnVlXG5cbiAgIFZBUiA9IGF3YWl0IGFlbnRlclxuICAgdHJ5OlxuICAgICAgIEJMT0NLXG4gICBleGNlcHQ6XG4gICAgICAgaWYgbm90IGF3YWl0IGFleGl0KG1nciwgKnN5cy5leGNfaW5mbygpKTpcbiAgICAgICAgICAgcmFpc2VcbiAgIGVsc2U6XG4gICAgICAgYXdhaXQgYWV4aXQobWdyLCBOb25lLCBOb25lLCBOb25lKVxuXG5TZWUgYWxzbyAiX19hZW50ZXJfXygpIiBhbmQgIl9fYWV4aXRfXygpIiBmb3IgZGV0YWlscy5cblxuSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5TZWUgYWxzbzogKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheFxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3NcbiAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4gICAgZXhjZXB0aW9uLiBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2ZcbiAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuICAgICJicmVhayIgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbiAgICBmdW5jdGlvbiBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzICJfX2RvY19fIlxuICAgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgIl9fZG9jX18iIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCisgJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuIElmIGJvdGggYXJlXG5udW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwgdGhlICI9PSIgYW5kXG4iIT0iIG9wZXJhdG9ycyAqYWx3YXlzKiBjb25zaWRlciBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0byBiZVxudW5lcXVhbCwgd2hpbGUgdGhlICI8IiwgIj4iLCAiPj0iIGFuZCAiPD0iIG9wZXJhdG9ycyByYWlzZSBhXG4iVHlwZUVycm9yIiB3aGVuIGNvbXBhcmluZyBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyB0aGF0IGRvIG5vdFxuaW1wbGVtZW50IHRoZXNlIG9wZXJhdG9ycyBmb3IgdGhlIGdpdmVuIHBhaXIgb2YgdHlwZXMuICBZb3UgY2FuXG5jb250cm9sIGNvbXBhcmlzb24gYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnlcbmRlZmluaW5nIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgIl9fZ3RfXygpIiwgZGVzY3JpYmVkIGluIHNlY3Rpb25cbipCYXNpYyBjdXN0b21pemF0aW9uKi5cblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBUaGUgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICJEZWNpbWFsKFwnTmFOXCcpIiBhcmUgc3BlY2lhbC4gVGhleVxuICBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMsICJ4IGlzIHgiIGJ1dCBhcmUgbm90IGVxdWFsIHRvXG4gIHRoZW1zZWx2ZXMsICJ4ICE9IHgiLiAgQWRkaXRpb25hbGx5LCBjb21wYXJpbmcgYW55IHZhbHVlIHRvIGFcbiAgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICJGYWxzZSIuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8XG4gIGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbCByZXR1cm4gIkZhbHNlIi5cblxuKiBCeXRlcyBvYmplY3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpY1xuICB2YWx1ZXMgb2YgdGhlaXIgZWxlbWVudHMuXG5cbiogU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWNcbiAgZXF1aXZhbGVudHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJvcmQoKSIpIG9mIHRoZWlyXG4gIGNoYXJhY3RlcnMuIFszXSBTdHJpbmcgYW5kIGJ5dGVzIG9iamVjdCBjYW5cJ3QgYmUgY29tcGFyZWQhXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvblxuICBvZiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCAiWzEsMix4XSA8PSBbMSwyLHldIiBoYXMgdGhlIHNhbWVcbiAgdmFsdWUgYXMgInggPD0geSIuICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90IGV4aXN0LCB0aGVcbiAgc2hvcnRlciBzZXF1ZW5jZSBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSwgIlsxLDJdIDwgWzEsMiwzXSIpLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZVxuICBzYW1lICIoa2V5LCB2YWx1ZSkiIHBhaXJzLiBPcmRlciBjb21wYXJpc29ucyAiKFwnPFwnLCBcJzw9XCcsIFwnPj1cJyxcbiAgXCc+XCcpIiByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIGFuZCBmcm96ZW5zZXRzIGRlZmluZSBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmRcbiAgc3VwZXJzZXQgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKHRoZVxuICB0d28gc2V0cyAiezEsMn0iIGFuZCB7MiwzfSBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZy5cbiAgRm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzLlxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXlcbiAgYXJlIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZFxuICBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0XG4gIGNvbnNpc3RlbnRseSB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiBkaWZmZXJpbmcgdHlwZXMgZGVwZW5kcyBvbiB3aGV0aGVyIGVpdGhlciBvZlxudGhlIHR5cGVzIHByb3ZpZGUgZXhwbGljaXQgc3VwcG9ydCBmb3IgdGhlIGNvbXBhcmlzb24uICBNb3N0IG51bWVyaWNcbnR5cGVzIGNhbiBiZSBjb21wYXJlZCB3aXRoIG9uZSBhbm90aGVyLiAgV2hlbiBjcm9zcy10eXBlIGNvbXBhcmlzb24gaXNcbm5vdCBzdXBwb3J0ZWQsIHRoZSBjb21wYXJpc29uIG1ldGhvZCByZXR1cm5zICJOb3RJbXBsZW1lbnRlZCIuXG5cblRoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluIHMiXG5ldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbm5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbmFuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICJpbiIgdGVzdHNcbndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxueSkiLlxuXG5Gb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGlzXG5hIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuICBFbXB0eVxuc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbnNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbmluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG5pcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkXG5kdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuImluIi5cblxuVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4IGlzIHkiIGlzXG50cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICAieCBpcyBub3QgeSJcbnlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdXG4nLAorICdjb21wb3VuZCc6IHUnXG5Db21wb3VuZCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqXG5cbkNvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5IGFmZmVjdFxub3IgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRob3NlIG90aGVyIHN0YXRlbWVudHMgaW4gc29tZSB3YXkuICBJblxuZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiBzaW1wbGVcbmluY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSBsaW5lLlxuXG5UaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgY29udHJvbFxuZmxvdyBjb25zdHJ1Y3RzLiAgInRyeSIgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cFxuY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgIndpdGgiIHN0YXRlbWVudCBhbGxvd3MgdGhlXG5leGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrIG9mXG5jb2RlLiAgRnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgY29tcG91bmRcbnN0YXRlbWVudHMuXG5cbkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIFwnY2xhdXNlcy5cJyAgQSBjbGF1c2VcbmNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhIFwnc3VpdGUuXCcgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhXG5wYXJ0aWN1bGFyIGNvbXBvdW5kIHN0YXRlbWVudCBhcmUgYWxsIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsLlxuRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kc1xud2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhXG5jbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZVxuc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVyXCdzXG5jb2xvbiwgb3IgaXQgY2FuIGJlIG9uZSBvciBtb3JlIGluZGVudGVkIHN0YXRlbWVudHMgb24gc3Vic2VxdWVudFxubGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZFxuc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG5cJ3QgYmVcbmNsZWFyIHRvIHdoaWNoICJpZiIgY2xhdXNlIGEgZm9sbG93aW5nICJlbHNlIiBjbGF1c2Ugd291bGQgYmVsb25nOlxuXG4gICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50KHgpXG5cbkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzXG5jb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZVxuInByaW50KCkiIGNhbGxzIGFyZSBleGVjdXRlZDpcblxuICAgaWYgeCA8IHkgPCB6OiBwcmludCh4KTsgcHJpbnQoeSk7IHByaW50KHopXG5cblN1bW1hcml6aW5nOlxuXG4gICBjb21wb3VuZF9zdG10IDo6PSBpZl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZm9yX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgdHJ5X3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZ1bmNkZWZcbiAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWZcbiAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfd2l0aF9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Zvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Z1bmNkZWZcbiAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgc3RhdGVtZW50KyBERURFTlRcbiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG5cbk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSAiTkVXTElORSIgcG9zc2libHkgZm9sbG93ZWQgYnkgYVxuIkRFREVOVCIuICBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMgYmVnaW5cbndpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nICJlbHNlIlwnIHByb2JsZW0gaXMgc29sdmVkIGluIFB5dGhvbiBieVxucmVxdWlyaW5nIG5lc3RlZCAiaWYiIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuXG5UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlc1xuZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuXG5cblRoZSAiaWYiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09XG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cblxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuXG5cblRoZSAiZm9yIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT1cblxuVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZVxuKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG4iZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiAgRWFjaFxuaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgcnVsZXNcbmZvciBhc3NpZ25tZW50cyAoc2VlICpBc3NpZ25tZW50IHN0YXRlbWVudHMqKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG5leGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uKSxcbnRoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXNcbndpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG5pdGVtLlxuXG5UaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0IGxpc3QuXG5UaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmdcbnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcblxuICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuICAgICAgIHByaW50KGkpXG4gICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuXG5OYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG5idXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG5pdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgaVxuOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbiAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbiAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyBtZWFuc1xuICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gdGhlXG4gIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggb2ZcbiAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmIHRoZVxuICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbiAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4gIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4gIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuXG4gICAgIGZvciB4IGluIGFbOl06XG4gICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcblxuXG5UaGUgInRyeSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cblRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm9cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCBmb3IgYW5cbmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0IGNsYXVzZXNcbmluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gZXhwcmVzc2lvbi1cbmxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0IGV4cHJlc3Npb25cbmlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzIGNvbXBhdGlibGVcbndpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvblxub2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCByYWlzZWRcbnRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmXG5wcmVzZW50LCBhbmQgdGhlIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG5jbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXNcbnJlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LlxuKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sXG5hbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxub3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbldoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG5hdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIGZvb1xuXG53YXMgdHJhbnNsYXRlZCB0b1xuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgZm9vXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgZGVsIE5cblxuVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG51bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbiJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiB0aGVcbmV4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbnByb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxucmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG5mcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG5ub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG5cbklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICJ0cnkiXG5jbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgYW5cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG5leGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWZcbnRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAiZmluYWxseSJcbmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuaXMgZGlzY2FyZGVkOlxuXG4gICA+Pj4gZGVmIGYoKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgMS8wXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gNDJcbiAgIC4uLlxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuXG5XaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4idHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXNcbmFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgaW5cbnRoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlIHRoZVxubGFzdCBvbmUgZXhlY3V0ZWQ6XG5cbiAgID4+PiBkZWYgZm9vKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ3RyeVwnXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdmaW5hbGx5XCdcbiAgIC4uLlxuICAgPj4+IGZvbygpXG4gICBcJ2ZpbmFsbHlcJ1xuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uICJ0cnkiLi4uImV4Y2VwdCIuLi4iZmluYWxseSJcbnVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICJ3aXRoX2l0ZW0iKVxuICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cblxuMi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4gICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZVxuICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCB0aHJlZVxuICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC5cbiAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4gICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIlxuICAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuXG4gICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjpcbiAgICAgICBzdWl0ZVxuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIHdpdGggQSgpIGFzIGE6XG4gICAgICAgd2l0aCBCKCkgYXMgYjpcbiAgICAgICAgICAgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286ICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cbkZ1bmN0aW9uIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PT09PVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGZ1bmNkZWYgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbcGFyYW1ldGVyX2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKiIgW3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiICIqKiIgcGFyYW1ldGVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGRlZiBmdW5jKCk6IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLiJcbkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXlcbmJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwncyBkZWZhdWx0IHZhbHVlIGlzXG5zdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbnBhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpc1xuaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuIHRoZVxuZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXNcbmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLVxuY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnRcbnRvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYVxubGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuIGJ5XG5hcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuXG5UaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyB0byB1c2VcbiJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgdGhlXG5mdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iIippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55XG5leGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZVxuZm9ybSAiIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3XG5kaWN0aW9uYXJ5IHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3XG5lbXB0eSBkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmVcbmtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiIGZvbGxvd2luZ1xudGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gdGhvc2Vcbm9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5IGhhdmVcbiJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlIHBhcmFtZXRlclxubGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kIGFyZVxuZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyBtYXlcbmJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS5cblRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG5mdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG5kaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzXCcgbmFtZXMgaW4gdGhlICJfX2Fubm90YXRpb25zX18iXG5hdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG5leHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGFcbmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjtcbmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yXG5hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYVxuZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdFxuYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIiJkZWYiIlxuc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG5mdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZFxuaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG5cbiAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuXG5cbkNsYXNzIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PVxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlIGxpc3RcbnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlICpDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbipcbmZvciBtb3JlIGFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGFcbmNsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2Vcbmxpc3QgaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG5cbiAgIGNsYXNzIEZvbzpcbiAgICAgICBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vKG9iamVjdCk6XG4gICAgICAgcGFzc1xuXG5UaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZVxuKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGVcbm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG5mdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0c1xuZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzRdIEFcbmNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSBiYXNlXG5jbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuXG5UaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWxcbm5hbWVzcGFjZS5cblxuQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyAqbWV0YWNsYXNzZXMqLlxuXG5DbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGNsYXNzIEZvbzogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbzogcGFzc1xuICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuXG5UaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yXG5mdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCBpcyB0aGVuXG5ib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgYXR0cmlidXRlc1xuY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZFxuaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAiInNlbGYubmFtZSIiLFxuYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWVcbndoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzIGRlZmF1bHRzXG5mb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvXG51bmV4cGVjdGVkIHJlc3VsdHMuICAqRGVzY3JpcHRvcnMqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuICBDbGFzcyBEZWNvcmF0b3JzXG5cblxuQ29yb3V0aW5lc1xuPT09PT09PT09PVxuXG5cbkNvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mdW5jZGVmIDo6PSAiYXN5bmMiIGZ1bmNkZWZcblxuRXhlY3V0aW9uIG9mIFB5dGhvbiBjb3JvdXRpbmVzIGNhbiBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQgYXQgbWFueVxucG9pbnRzIChzZWUgKmNvcm91dGluZSouKSAgImF3YWl0IiBleHByZXNzaW9ucywgImFzeW5jIGZvciIgYW5kICJhc3luY1xud2l0aCIgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGVpciBib2RpZXMuXG5cbkZ1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lXG5mdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiBjb3JvdXRpbmVzLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjUuXG5cblxuVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzXG4qaXRlciogaW1wbGVtZW50YXRpb24sIGFuZCAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiBjYW4gY2FsbFxuYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG5cblRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXJcbmFzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG5cblRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOlxuICAgICAgIEJMT0NLXG4gICBlbHNlOlxuICAgICAgIEJMT0NLMlxuXG5JcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcblxuICAgaXRlciA9IChJVEVSKVxuICAgaXRlciA9IGF3YWl0IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4gICBydW5uaW5nID0gVHJ1ZVxuICAgd2hpbGUgcnVubmluZzpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpXG4gICAgICAgZXhjZXB0IFN0b3BBc3luY0l0ZXJhdGlvbjpcbiAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4gICAgICAgZWxzZTpcbiAgICAgICAgICAgQkxPQ0tcbiAgIGVsc2U6XG4gICAgICAgQkxPQ0syXG5cblNlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNS5cblxuXG5UaGUgImFzeW5jIHdpdGgiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgYXN5bmNfd2l0aF9zdG10IDo6PSAiYXN5bmMiIHdpdGhfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGNvbnRleHQgbWFuYWdlciogaXMgYSAqY29udGV4dCBtYW5hZ2VyKiB0aGF0IGlzIGFibGVcbnRvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy5cblxuVGhlIGZvbGxvd2luZyBjb2RlOlxuXG4gICBhc3luYyB3aXRoIEVYUFIgYXMgVkFSOlxuICAgICAgIEJMT0NLXG5cbklzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOlxuXG4gICBtZ3IgPSAoRVhQUilcbiAgIGFleGl0ID0gdHlwZShtZ3IpLl9fYWV4aXRfX1xuICAgYWVudGVyID0gdHlwZShtZ3IpLl9fYWVudGVyX18obWdyKVxuICAgZXhjID0gVHJ1ZVxuXG4gICBWQVIgPSBhd2FpdCBhZW50ZXJcbiAgIHRyeTpcbiAgICAgICBCTE9DS1xuICAgZXhjZXB0OlxuICAgICAgIGlmIG5vdCBhd2FpdCBhZXhpdChtZ3IsICpzeXMuZXhjX2luZm8oKSk6XG4gICAgICAgICAgIHJhaXNlXG4gICBlbHNlOlxuICAgICAgIGF3YWl0IGFleGl0KG1nciwgTm9uZSwgTm9uZSwgTm9uZSlcblxuU2VlIGFsc28gIl9fYWVudGVyX18oKSIgYW5kICJfX2FleGl0X18oKSIgZm9yIGRldGFpbHMuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNS5cblxuU2VlIGFsc286ICoqUEVQIDQ5MioqIC0gQ29yb3V0aW5lcyB3aXRoIGFzeW5jIGFuZCBhd2FpdCBzeW50YXhcblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzXG4gICAgdGhlcmUgaXMgYSAiZmluYWxseSIgY2xhdXNlIHdoaWNoIGhhcHBlbnMgdG8gcmFpc2UgYW5vdGhlclxuICAgIGV4Y2VwdGlvbi4gVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LlxuXG5bMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mXG4gICAgYW4gZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSAicmV0dXJuIiwgImNvbnRpbnVlIiwgb3JcbiAgICAiYnJlYWsiIHN0YXRlbWVudC5cblxuWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgZnVuY3Rpb24gYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyAiX19kb2NfXyJcbiAgICBhdHRyaWJ1dGUgYW5kIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb25cJ3MgKmRvY3N0cmluZyouXG5cbls0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzc1xuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgbmFtZXNwYWNlXCdzICJfX2RvY19fIiBpdGVtIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgY2xhc3NcJ3MgKmRvY3N0cmluZyouXG4nLAogICdjb250ZXh0LW1hbmFnZXJzJzogdSdcbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG9cbmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlclxuaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dFxuZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseVxuaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gKlRoZSB3aXRoXG5zdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgIndpdGgiXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS5cblxub2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcblxuICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzXG4gICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlXG4gICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbFxuICAgYmUgIk5vbmUiLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOiAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cbicsCiAgJ2NvbnRpbnVlJzogdSdcblRoZSAiY29udGludWUiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGNvbnRpbnVlX3N0bXQgOjo9ICJjb250aW51ZSJcblxuImNvbnRpbnVlIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSJcbmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiBvciAiZmluYWxseSJcbmNsYXVzZSB3aXRoaW4gdGhhdCBsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUgb2YgdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBsb29wLlxuXG5XaGVuICJjb250aW51ZSIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYVxuImZpbmFsbHkiIGNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAogICdjb252ZXJzaW9ucyc6IHUnXG5Bcml0aG1ldGljIGNvbnZlcnNpb25zXG4qKioqKioqKioqKioqKioqKioqKioqXG5cbldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZVxuInRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIiB0aGlzIG1lYW5zXG50aGF0IHRoZSBvcGVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVpbHQtaW4gdHlwZXMgd29ya3MgYXMgZm9sbG93czpcblxuKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0b1xuICBjb21wbGV4O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCB0aGVcbiAgb3RoZXIgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50O1xuXG4qIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS5cblxuU29tZSBhZGRpdGlvbmFsIHJ1bGVzIGFwcGx5IGZvciBjZXJ0YWluIG9wZXJhdG9ycyAoZS5nLiwgYSBzdHJpbmcgYXMgYVxubGVmdCBhcmd1bWVudCB0byB0aGUgXCclXCcgb3BlcmF0b3IpLiAgRXh0ZW5zaW9ucyBtdXN0IGRlZmluZSB0aGVpciBvd25cbmNvbnZlcnNpb24gYmVoYXZpb3IuXG4nLAotICdjdXN0b21pemF0aW9uJzogdSdcbkJhc2ljIGN1c3RvbWl6YXRpb25cbioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICJfX25ld19fKCkiIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseSBhblxuICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuXG4gICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5XG4gICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbiAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICJfX25ld19fKCkiLlxuXG4gICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGVcbiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXRcbiAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gb3JkZXIgdG9cbiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cblxub2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuXG4gICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICJfX25ld19fKCkiKSwgYnV0XG4gICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlXG4gICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuXG4gICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgbWV0aG9kLCBpZlxuICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZVxuICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuXG4gICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiBjb25zdHJ1Y3RpbmdcbiAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byBjdXN0b21pc2VcbiAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyBkb2luZyBzb1xuICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiIG1ldGhvZCwgdGhlXG4gICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdFxuICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZS5cbiAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciB0aGVcbiAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnlcbiAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCBhIGxhdGVyXG4gICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0XG4gICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSB0aGUgZm9ybWVyXG4gICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIgaXNcbiAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWUgY29tbW9uXG4gICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCBmcm9tXG4gICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIG9iamVjdHMgKGUuZy4sXG4gICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoIHBhcmVudCBhbmRcbiAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSBvZlxuICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhIHJlZmVyZW5jZVxuICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiB1bmhhbmRsZWRcbiAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvIHRoZVxuICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSB0aGlyZCBjYW5cbiAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkIHVwIHdoZW4gdGhlXG4gICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KS4gUmVmZXJcbiAgICAgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICBhYm91dCB0aGlzIHRvcGljLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaFxuICAgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nXG4gICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkIHRvXG4gICAgICJzeXMuc3RkZXJyIiBpbnN0ZWFkLiBBbHNvLCB3aGVuICJfX2RlbF9fKCkiIGlzIGludm9rZWQgaW5cbiAgICAgcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmcgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlXG4gICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgIl9fZGVsX18oKSJcbiAgICAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nXG4gICAgIHRvcm4gZG93biAoZS5nLiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gIEZvciB0aGlzXG4gICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkXG4gICAgIHRvIG1haW50YWluIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LFxuICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzXG4gICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvXG4gICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGVcbiAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybVxuICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gVGhlIHJldHVyblxuICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAiX19yZXByX18oKSIgYnV0XG4gICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZm9ybWF0KCkiIGFuZFxuICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgb3IgbmljZWx5IHByaW50YWJsZSBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICpzdHJpbmcqXG4gICBvYmplY3QuXG5cbiAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgdGhlcmUgaXMgbm9cbiAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGFcbiAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuXG4gICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICJvYmplY3QiXG4gICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuXG5vYmplY3QuX19ieXRlc19fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuXG5vYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcblxuICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uIChhbmQgYnkgZXh0ZW5zaW9uLCB0aGVcbiAgICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBvZiBjbGFzcyAic3RyIikgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhXG4gICBzdHJpbmcgdGhhdCBjb250YWlucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnNcbiAgIGRlc2lyZWQuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0b1xuICAgdGhlIHR5cGUgaW1wbGVtZW50aW5nICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsXG4gICBlaXRoZXIgZGVsZWdhdGUgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYVxuICAgc2ltaWxhciBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG5cbiAgIFNlZSAqRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlXG4gICBzdGFuZGFyZCBmb3JtYXR0aW5nIHN5bnRheC5cblxuICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiIGl0c2VsZlxuICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAieC5fX2xlX18oeSkiLFxuICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAieD55IiBjYWxsc1xuICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuXG4gICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICJOb3RJbXBsZW1lbnRlZCJcbiAgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIHBhaXIgb2ZcbiAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCBmb3IgYVxuICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYW55IHZhbHVlLFxuICAgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhIEJvb2xlYW4gY29udGV4dCAoZS5nLixcbiAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICJib29sKCkiXG4gICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgQnkgZGVmYXVsdCwgIl9fbmVfXygpIiBkZWxlZ2F0ZXMgdG8gIl9fZXFfXygpIiBhbmQgaW52ZXJ0cyB0aGVcbiAgIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4gIFRoZXJlIGFyZSBubyBvdGhlciBpbXBsaWVkXG4gICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yIGV4YW1wbGUsIHRoZVxuICAgdHJ1dGggb2YgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gYXV0b21hdGljYWxseVxuICAgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3Qgb3BlcmF0aW9uLCBzZWVcbiAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG5cbiAgIFNlZSB0aGUgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyByZWZsZWN0aW9uLFxuICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiBJZiB0aGVcbiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYVxuICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgdHlwZSwgdGhlXG4gICByZWZsZWN0ZWQgbWV0aG9kIG9mIHRoZSByaWdodCBvcGVyYW5kIGhhcyBwcmlvcml0eSwgb3RoZXJ3aXNlIHRoZVxuICAgbGVmdCBvcGVyYW5kXCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nIGlzIG5vdFxuICAgY29uc2lkZXJlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgb24gbWVtYmVyc1xuICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAiZGljdCIuXG4gICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgcmVxdWlyZWQgcHJvcGVydHlcbiAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZTsgaXQgaXNcbiAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaFxuICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpblxuICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gb2JqZWN0XCdzXG4gICAgIGN1c3RvbSAiX19oYXNoX18oKSIgbWV0aG9kIHRvIHRoZSBzaXplIG9mIGEgIlB5X3NzaXplX3QiLiAgVGhpc1xuICAgICBpcyB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uIDMyLWJpdFxuICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0IGludGVyb3BlcmF0ZSBvbiBidWlsZHNcbiAgICAgb2YgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gYWxsXG4gICAgIHN1cHBvcnRlZCBidWlsZHMuICBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggInB5dGhvbiAtY1xuICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkIG5vdFxuICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIlxuICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kXG4gICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgY29sbGVjdGlvbnNcbiAgIHJlcXVpcmVzIHRoYXQgYSBrZXlcJ3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5XG4gICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2hcbiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLlxuXG4gICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSJcbiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlXG4gICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzXG4gICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvXG4gICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlclxuICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4gICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvIHN1cHByZXNzXG4gICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzc1xuICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXRcbiAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiIGNhbGwuXG5cbiAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgYW5kXG4gICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSByYW5kb20gdmFsdWUuXG4gICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvblxuICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZlxuICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1cbiAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZVxuICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSBjb21wbGV4aXR5LlxuICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZlxuICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlc1xuICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmRcbiAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cblxub2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdFxuICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicsCi0gJ2RlYnVnZ2VyJzogdSdcbiJwZGIiIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qKlNvdXJjZSBjb2RlOioqIExpYi9wZGIucHlcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgbW9kdWxlICJwZGIiIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yXG5QeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kXG5zaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcyxcbnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGVcbmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmdcbmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cblxuVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0gaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgY2xhc3NcbiJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5IHJlYWRpbmdcbnRoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzICJiZGIiIGFuZCAiY21kIi5cblxuVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyAiKFBkYikiLiBUeXBpY2FsIHVzYWdlIHRvIHJ1biBhIHByb2dyYW0gdW5kZXJcbmNvbnRyb2wgb2YgdGhlIGRlYnVnZ2VyIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IHBkYi5ydW4oXCdteW1vZHVsZS50ZXN0KClcJylcbiAgID4gPHN0cmluZz4oMCk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgTmFtZUVycm9yOiBcJ3NwYW1cJ1xuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYilcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSBpc1xuYXZhaWxhYmxlIGZvciBjb21tYW5kcyBhbmQgY29tbWFuZCBhcmd1bWVudHMsIGUuZy4gdGhlIGN1cnJlbnQgZ2xvYmFsXG5hbmQgbG9jYWwgbmFtZXMgYXJlIG9mZmVyZWQgYXMgYXJndW1lbnRzIG9mIHRoZSAicCIgY29tbWFuZC5cblxuInBkYi5weSIgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciBzY3JpcHRzLiAgRm9yXG5leGFtcGxlOlxuXG4gICBweXRob24zIC1tIHBkYiBteXNjcmlwdC5weVxuXG5XaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgcG9zdC1tb3J0ZW1cbmRlYnVnZ2luZyBpZiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBleGl0cyBhYm5vcm1hbGx5LiAgQWZ0ZXIgcG9zdC1cbm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGxcbnJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiXCdzIHN0YXRlIChzdWNoXG5hcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGVcbmRlYnVnZ2VyIHVwb24gcHJvZ3JhbVwncyBleGl0LlxuXG5OZXcgaW4gdmVyc2lvbiAzLjI6ICJwZGIucHkiIG5vdyBhY2NlcHRzIGEgIi1jIiBvcHRpb24gdGhhdCBleGVjdXRlc1xuY29tbWFuZHMgYXMgaWYgZ2l2ZW4gaW4gYSAiLnBkYnJjIiBmaWxlLCBzZWUgKkRlYnVnZ2VyIENvbW1hbmRzKi5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpc1xudG8gaW5zZXJ0XG5cbiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuXG5hdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuIHRoZW5cbnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nXG53aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIiBjb21tYW5kLlxuXG5UaGUgdHlwaWNhbCB1c2FnZSB0byBpbnNwZWN0IGEgY3Jhc2hlZCBwcm9ncmFtIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IG15bW9kdWxlLnRlc3QoKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3RcbiAgICAgICB0ZXN0MigpXG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDMsIGluIHRlc3QyXG4gICAgICAgcHJpbnQoc3BhbSlcbiAgIE5hbWVFcnJvcjogc3BhbVxuICAgPj4+IHBkYi5wbSgpXG4gICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4gICAtPiBwcmludChzcGFtKVxuICAgKFBkYilcblxuVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXJcbmluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcblxucGRiLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KSB1bmRlclxuICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXNcbiAgIGV4ZWN1dGVkOyB5b3UgY2FuIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSAiY29udGludWUiLCBvciB5b3UgY2FuXG4gICBzdGVwIHRocm91Z2ggdGhlIHN0YXRlbWVudCB1c2luZyAic3RlcCIgb3IgIm5leHQiIChhbGwgdGhlc2VcbiAgIGNvbW1hbmRzIGFyZSBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscypcbiAgIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnlcbiAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAoU2VlIHRoZVxuICAgZXhwbGFuYXRpb24gb2YgdGhlIGJ1aWx0LWluICJleGVjKCkiIG9yICJldmFsKCkiIGZ1bmN0aW9ucy4pXG5cbnBkYi5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpXG4gICB1bmRlciBkZWJ1Z2dlciBjb250cm9sLiAgV2hlbiAicnVuZXZhbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zIHRoZVxuICAgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvXG4gICAicnVuKCkiLlxuXG5wZGIucnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcblxuICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpXG4gICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuICJydW5jYWxsKCkiIHJldHVybnMsIGl0IHJldHVybnNcbiAgIHdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzXG4gICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLlxuXG5wZGIuc2V0X3RyYWNlKClcblxuICAgRW50ZXIgdGhlIGRlYnVnZ2VyIGF0IHRoZSBjYWxsaW5nIHN0YWNrIGZyYW1lLiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgIGhhcmQtY29kZSBhIGJyZWFrcG9pbnQgYXQgYSBnaXZlbiBwb2ludCBpbiBhIHByb2dyYW0sIGV2ZW4gaWYgdGhlXG4gICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb25cbiAgIGZhaWxzKS5cblxucGRiLnBvc3RfbW9ydGVtKHRyYWNlYmFjaz1Ob25lKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIGdpdmVuICp0cmFjZWJhY2sqIG9iamVjdC4gIElmIG5vXG4gICAqdHJhY2ViYWNrKiBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgb25lIG9mIHRoZSBleGNlcHRpb24gdGhhdCBpc1xuICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgaWYgdGhlXG4gICBkZWZhdWx0IGlzIHRvIGJlIHVzZWQpLlxuXG5wZGIucG0oKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpblxuICAgInN5cy5sYXN0X3RyYWNlYmFjayIuXG5cblRoZSAicnVuKiIgZnVuY3Rpb25zIGFuZCAic2V0X3RyYWNlKCkiIGFyZSBhbGlhc2VzIGZvciBpbnN0YW50aWF0aW5nXG50aGUgIlBkYiIgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiAgSWYgeW91IHdhbnRcbnRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzIHlvdXJzZWxmOlxuXG5jbGFzcyBjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PVwndGFiXCcsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBza2lwPU5vbmUsIG5vc2lnaW50PUZhbHNlKVxuXG4gICAiUGRiIiBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG5cbiAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGVcbiAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLlxuXG4gICBUaGUgKnNraXAqIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBnbG9iLXN0eWxlXG4gICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzIHRoYXRcbiAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiBbMV1cblxuICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggaXMgc2VudFxuICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzICJDdHJsLUMiIG9uIHRoZSBjb25zb2xlKSB3aGVuIHlvdSBnaXZlIGFcbiAgICJjb250aW51ZSIgY29tbWFuZC4gVGhpcyBhbGxvd3MgeW91IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyXG4gICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybC1DIi4gIElmIHlvdSB3YW50IFBkYiBub3QgdG8gdG91Y2ggdGhlXG4gICBTSUdJTlQgaGFuZGxlciwgc2V0ICpub3NpZ2ludCogdG90IHRydWUuXG5cbiAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjpcblxuICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVtcJ2RqYW5nby4qXCddKS5zZXRfdHJhY2UoKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjE6IFRoZSAqc2tpcCogYXJndW1lbnQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICpub3NpZ2ludCogYXJndW1lbnQuICBQcmV2aW91c2x5LCBhIFNJR0lOVFxuICAgaGFuZGxlciB3YXMgbmV2ZXIgc2V0IGJ5IFBkYi5cblxuICAgcnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbiAgIHJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbiAgIHJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4gICBzZXRfdHJhY2UoKVxuXG4gICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuXG5cbkRlYnVnZ2VyIENvbW1hbmRzXG49PT09PT09PT09PT09PT09PVxuXG5UaGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGVidWdnZXIgYXJlIGxpc3RlZCBiZWxvdy4gIE1vc3RcbmNvbW1hbmRzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBvbmUgb3IgdHdvIGxldHRlcnMgYXMgaW5kaWNhdGVkOyBlLmcuXG4iaChlbHApIiBtZWFucyB0aGF0IGVpdGhlciAiaCIgb3IgImhlbHAiIGNhbiBiZSB1c2VkIHRvIGVudGVyIHRoZSBoZWxwXG5jb21tYW5kIChidXQgbm90ICJoZSIgb3IgImhlbCIsIG5vciAiSCIgb3IgIkhlbHAiIG9yICJIRUxQIikuXG5Bcmd1bWVudHMgdG8gY29tbWFuZHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSAoc3BhY2VzIG9yXG50YWJzKS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzICgiW10iKSBpblxudGhlIGNvbW1hbmQgc3ludGF4OyB0aGUgc3F1YXJlIGJyYWNrZXRzIG11c3Qgbm90IGJlIHR5cGVkLlxuQWx0ZXJuYXRpdmVzIGluIHRoZSBjb21tYW5kIHN5bnRheCBhcmUgc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgYmFyXG4oInwiKS5cblxuRW50ZXJpbmcgYSBibGFuayBsaW5lIHJlcGVhdHMgdGhlIGxhc3QgY29tbWFuZCBlbnRlcmVkLiAgRXhjZXB0aW9uOiBpZlxudGhlIGxhc3QgY29tbWFuZCB3YXMgYSAibGlzdCIgY29tbWFuZCwgdGhlIG5leHQgMTEgbGluZXMgYXJlIGxpc3RlZC5cblxuQ29tbWFuZHMgdGhhdCB0aGUgZGVidWdnZXIgZG9lc25cJ3QgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlIFB5dGhvblxuc3RhdGVtZW50cyBhbmQgYXJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ncmFtIGJlaW5nXG5kZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gZXhjbGFtYXRpb25cbnBvaW50ICgiISIpLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtIGJlaW5nXG5kZWJ1Z2dlZDsgaXQgaXMgZXZlbiBwb3NzaWJsZSB0byBjaGFuZ2UgYSB2YXJpYWJsZSBvciBjYWxsIGEgZnVuY3Rpb24uXG5XaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gc3VjaCBhIHN0YXRlbWVudCwgdGhlIGV4Y2VwdGlvbiBuYW1lIGlzXG5wcmludGVkIGJ1dCB0aGUgZGVidWdnZXJcJ3Mgc3RhdGUgaXMgbm90IGNoYW5nZWQuXG5cblRoZSBkZWJ1Z2dlciBzdXBwb3J0cyAqYWxpYXNlcyouICBBbGlhc2VzIGNhbiBoYXZlIHBhcmFtZXRlcnMgd2hpY2hcbmFsbG93cyBvbmUgYSBjZXJ0YWluIGxldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlclxuZXhhbWluYXRpb24uXG5cbk11bHRpcGxlIGNvbW1hbmRzIG1heSBiZSBlbnRlcmVkIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieSAiOzsiLlxuKEEgc2luZ2xlICI7IiBpcyBub3QgdXNlZCBhcyBpdCBpcyB0aGUgc2VwYXJhdG9yIGZvciBtdWx0aXBsZSBjb21tYW5kc1xuaW4gYSBsaW5lIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBQeXRob24gcGFyc2VyLikgIE5vIGludGVsbGlnZW5jZSBpc1xuYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlIGlucHV0IGlzIHNwbGl0IGF0IHRoZSBmaXJzdFxuIjs7IiBwYWlyLCBldmVuIGlmIGl0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSBxdW90ZWQgc3RyaW5nLlxuXG5JZiBhIGZpbGUgIi5wZGJyYyIgZXhpc3RzIGluIHRoZSB1c2VyXCdzIGhvbWUgZGlyZWN0b3J5IG9yIGluIHRoZVxuY3VycmVudCBkaXJlY3RvcnksIGl0IGlzIHJlYWQgaW4gYW5kIGV4ZWN1dGVkIGFzIGlmIGl0IGhhZCBiZWVuIHR5cGVkXG5hdCB0aGUgZGVidWdnZXIgcHJvbXB0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBhbGlhc2VzLiAgSWZcbmJvdGggZmlsZXMgZXhpc3QsIHRoZSBvbmUgaW4gdGhlIGhvbWUgZGlyZWN0b3J5IGlzIHJlYWQgZmlyc3QgYW5kXG5hbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjI6ICIucGRicmMiIGNhbiBub3cgY29udGFpbiBjb21tYW5kcyB0aGF0XG5jb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCB0aGVzZVxuY29tbWFuZHMgaGFkIG5vIGVmZmVjdC5cblxuaChlbHApIFtjb21tYW5kXVxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuICBXaXRoIGFcbiAgICpjb21tYW5kKiBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQuICAiaGVscCBwZGIiXG4gICBkaXNwbGF5cyB0aGUgZnVsbCBkb2N1bWVudGF0aW9uICh0aGUgZG9jc3RyaW5nIG9mIHRoZSAicGRiIlxuICAgbW9kdWxlKS4gIFNpbmNlIHRoZSAqY29tbWFuZCogYXJndW1lbnQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLCAiaGVscFxuICAgZXhlYyIgbXVzdCBiZSBlbnRlcmVkIHRvIGdldCBoZWxwIG9uIHRoZSAiISIgY29tbWFuZC5cblxudyhoZXJlKVxuXG4gICBQcmludCBhIHN0YWNrIHRyYWNlLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBmcmFtZSBhdCB0aGUgYm90dG9tLiAgQW5cbiAgIGFycm93IGluZGljYXRlcyB0aGUgY3VycmVudCBmcmFtZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY29udGV4dCBvZlxuICAgbW9zdCBjb21tYW5kcy5cblxuZChvd24pIFtjb3VudF1cblxuICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIGRvd24gaW4gdGhlXG4gICBzdGFjayB0cmFjZSAodG8gYSBuZXdlciBmcmFtZSkuXG5cbnUocCkgW2NvdW50XVxuXG4gICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgdXAgaW4gdGhlIHN0YWNrXG4gICB0cmFjZSAodG8gYW4gb2xkZXIgZnJhbWUpLlxuXG5iKHJlYWspIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cblxuICAgV2l0aCBhICpsaW5lbm8qIGFyZ3VtZW50LCBzZXQgYSBicmVhayB0aGVyZSBpbiB0aGUgY3VycmVudCBmaWxlLlxuICAgV2l0aCBhICpmdW5jdGlvbiogYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCBleGVjdXRhYmxlXG4gICBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgZnVuY3Rpb24uICBUaGUgbGluZSBudW1iZXIgbWF5IGJlIHByZWZpeGVkXG4gICB3aXRoIGEgZmlsZW5hbWUgYW5kIGEgY29sb24sIHRvIHNwZWNpZnkgYSBicmVha3BvaW50IGluIGFub3RoZXJcbiAgIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0IGhhc25cJ3QgYmVlbiBsb2FkZWQgeWV0KS4gIFRoZSBmaWxlIGlzXG4gICBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLiAgTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyBhc3NpZ25lZCBhXG4gICBudW1iZXIgdG8gd2hpY2ggYWxsIHRoZSBvdGhlciBicmVha3BvaW50IGNvbW1hbmRzIHJlZmVyLlxuXG4gICBJZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhbiBleHByZXNzaW9uIHdoaWNoIG11c3RcbiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcywgaW5jbHVkaW5nIGZvciBlYWNoIGJyZWFrcG9pbnQsXG4gICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQsIHRoZSBjdXJyZW50XG4gICBpZ25vcmUgY291bnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaWYgYW55LlxuXG50YnJlYWsgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuXG4gICBUZW1wb3JhcnkgYnJlYWtwb2ludCwgd2hpY2ggaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXNcbiAgIGZpcnN0IGhpdC4gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yICJicmVhayIuXG5cbmNsKGVhcikgW2ZpbGVuYW1lOmxpbmVubyB8IGJwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBXaXRoIGEgKmZpbGVuYW1lOmxpbmVubyogYXJndW1lbnQsIGNsZWFyIGFsbCB0aGUgYnJlYWtwb2ludHMgYXRcbiAgIHRoaXMgbGluZS4gV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXJcbiAgIHRob3NlIGJyZWFrcG9pbnRzLiBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQgZmlyc3RcbiAgIGFzayBjb25maXJtYXRpb24pLlxuXG5kaXNhYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgRGlzYWJsZSB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZlxuICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgY2F1c2VcbiAgIHRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLCBidXQgdW5saWtlIGNsZWFyaW5nIGEgYnJlYWtwb2ludCwgaXRcbiAgIHJlbWFpbnMgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMgYW5kIGNhbiBiZSAocmUtKWVuYWJsZWQuXG5cbmVuYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIEVuYWJsZSB0aGUgYnJlYWtwb2ludHMgc3BlY2lmaWVkLlxuXG5pZ25vcmUgYnBudW1iZXIgW2NvdW50XVxuXG4gICBTZXQgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgSWYgY291bnQgaXNcbiAgIG9taXR0ZWQsIHRoZSBpZ25vcmUgY291bnQgaXMgc2V0IHRvIDAuICBBIGJyZWFrcG9pbnQgYmVjb21lcyBhY3RpdmVcbiAgIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywgdGhlIGNvdW50IGlzXG4gICBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCBhbmQgdGhlIGJyZWFrcG9pbnRcbiAgIGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLlxuXG5jb25kaXRpb24gYnBudW1iZXIgW2NvbmRpdGlvbl1cblxuICAgU2V0IGEgbmV3ICpjb25kaXRpb24qIGZvciB0aGUgYnJlYWtwb2ludCwgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0XG4gICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLiAgSWYgKmNvbmRpdGlvbipcbiAgIGlzIGFic2VudCwgYW55IGV4aXN0aW5nIGNvbmRpdGlvbiBpcyByZW1vdmVkOyBpLmUuLCB0aGUgYnJlYWtwb2ludFxuICAgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLlxuXG5jb21tYW5kcyBbYnBudW1iZXJdXG5cbiAgIFNwZWNpZnkgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciBicmVha3BvaW50IG51bWJlciAqYnBudW1iZXIqLiAgVGhlXG4gICBjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmVcbiAgIGNvbnRhaW5pbmcganVzdCAiZW5kIiB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOlxuXG4gICAgICAoUGRiKSBjb21tYW5kcyAxXG4gICAgICAoY29tKSBwIHNvbWVfdmFyaWFibGVcbiAgICAgIChjb20pIGVuZFxuICAgICAgKFBkYilcblxuICAgVG8gcmVtb3ZlIGFsbCBjb21tYW5kcyBmcm9tIGEgYnJlYWtwb2ludCwgdHlwZSBjb21tYW5kcyBhbmQgZm9sbG93XG4gICBpdCBpbW1lZGlhdGVseSB3aXRoICJlbmQiOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLlxuXG4gICBXaXRoIG5vICpicG51bWJlciogYXJndW1lbnQsIGNvbW1hbmRzIHJlZmVycyB0byB0aGUgbGFzdCBicmVha3BvaW50XG4gICBzZXQuXG5cbiAgIFlvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwIGFnYWluLlxuICAgU2ltcGx5IHVzZSB0aGUgY29udGludWUgY29tbWFuZCwgb3Igc3RlcCwgb3IgYW55IG90aGVyIGNvbW1hbmQgdGhhdFxuICAgcmVzdW1lcyBleGVjdXRpb24uXG5cbiAgIFNwZWNpZnlpbmcgYW55IGNvbW1hbmQgcmVzdW1pbmcgZXhlY3V0aW9uIChjdXJyZW50bHkgY29udGludWUsXG4gICBzdGVwLCBuZXh0LCByZXR1cm4sIGp1bXAsIHF1aXQgYW5kIHRoZWlyIGFiYnJldmlhdGlvbnMpIHRlcm1pbmF0ZXNcbiAgIHRoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnlcbiAgIGVuZCkuIFRoaXMgaXMgYmVjYXVzZSBhbnkgdGltZSB5b3UgcmVzdW1lIGV4ZWN1dGlvbiAoZXZlbiB3aXRoIGFcbiAgIHNpbXBsZSBuZXh0IG9yIHN0ZXApLCB5b3UgbWF5IGVuY291bnRlciBhbm90aGVyIGJyZWFrcG9pbnQtLXdoaWNoXG4gICBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvIGFtYmlndWl0aWVzIGFib3V0IHdoaWNoXG4gICBsaXN0IHRvIGV4ZWN1dGUuXG5cbiAgIElmIHlvdSB1c2UgdGhlIFwnc2lsZW50XCcgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUgdXN1YWxcbiAgIG1lc3NhZ2UgYWJvdXQgc3RvcHBpbmcgYXQgYSBicmVha3BvaW50IGlzIG5vdCBwcmludGVkLiAgVGhpcyBtYXkgYmVcbiAgIGRlc2lyYWJsZSBmb3IgYnJlYWtwb2ludHMgdGhhdCBhcmUgdG8gcHJpbnQgYSBzcGVjaWZpYyBtZXNzYWdlIGFuZFxuICAgdGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCB5b3VcbiAgIHNlZSBubyBzaWduIHRoYXQgdGhlIGJyZWFrcG9pbnQgd2FzIHJlYWNoZWQuXG5cbnModGVwKVxuXG4gICBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIG9jY2FzaW9uXG4gICAoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3Igb24gdGhlIG5leHQgbGluZSBpbiB0aGVcbiAgIGN1cnJlbnQgZnVuY3Rpb24pLlxuXG5uKGV4dClcblxuICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXNcbiAgIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4gIChUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJuZXh0IiBhbmQgInN0ZXAiXG4gICBpcyB0aGF0ICJzdGVwIiBzdG9wcyBpbnNpZGUgYSBjYWxsZWQgZnVuY3Rpb24sIHdoaWxlICJuZXh0IlxuICAgZXhlY3V0ZXMgY2FsbGVkIGZ1bmN0aW9ucyBhdCAobmVhcmx5KSBmdWxsIHNwZWVkLCBvbmx5IHN0b3BwaW5nIGF0XG4gICB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLilcblxudW50KGlsKSBbbGluZW5vXVxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGxpbmUgd2l0aCBhIG51bWJlclxuICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcyByZWFjaGVkLlxuXG4gICBXaXRoIGEgbGluZSBudW1iZXIsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCBhIGxpbmUgd2l0aCBhIG51bWJlclxuICAgZ3JlYXRlciBvciBlcXVhbCB0byB0aGF0IGlzIHJlYWNoZWQuICBJbiBib3RoIGNhc2VzLCBhbHNvIHN0b3Agd2hlblxuICAgdGhlIGN1cnJlbnQgZnJhbWUgcmV0dXJucy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogQWxsb3cgZ2l2aW5nIGFuIGV4cGxpY2l0IGxpbmUgbnVtYmVyLlxuXG5yKGV0dXJuKVxuXG4gICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucy5cblxuYyhvbnQoaW51ZSkpXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLlxuXG5qKHVtcCkgbGluZW5vXG5cbiAgIFNldCB0aGUgbmV4dCBsaW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4gIE9ubHkgYXZhaWxhYmxlIGluIHRoZVxuICAgYm90dG9tLW1vc3QgZnJhbWUuICBUaGlzIGxldHMgeW91IGp1bXAgYmFjayBhbmQgZXhlY3V0ZSBjb2RlIGFnYWluLFxuICAgb3IganVtcCBmb3J3YXJkIHRvIHNraXAgY29kZSB0aGF0IHlvdSBkb25cJ3Qgd2FudCB0byBydW4uXG5cbiAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IG5vdCBhbGwganVtcHMgYXJlIGFsbG93ZWQgLS0gZm9yIGluc3RhbmNlXG4gICBpdCBpcyBub3QgcG9zc2libGUgdG8ganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSAiZm9yIiBsb29wIG9yIG91dFxuICAgb2YgYSAiZmluYWxseSIgY2xhdXNlLlxuXG5sKGlzdCkgW2ZpcnN0WywgbGFzdF1dXG5cbiAgIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuICBXaXRob3V0IGFyZ3VtZW50cywgbGlzdCAxMVxuICAgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGludWUgdGhlIHByZXZpb3VzIGxpc3RpbmcuXG4gICBXaXRoICIuIiBhcyBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZS4gIFdpdGhcbiAgIG9uZSBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgYXQgdGhhdCBsaW5lLiAgV2l0aCB0d29cbiAgIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7IGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbGVzc1xuICAgdGhhbiB0aGUgZmlyc3QsIGl0IGlzIGludGVycHJldGVkIGFzIGEgY291bnQuXG5cbiAgIFRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW5kaWNhdGVkIGJ5ICItPiIuICBJZiBhblxuICAgZXhjZXB0aW9uIGlzIGJlaW5nIGRlYnVnZ2VkLCB0aGUgbGluZSB3aGVyZSB0aGUgZXhjZXB0aW9uIHdhc1xuICAgb3JpZ2luYWxseSByYWlzZWQgb3IgcHJvcGFnYXRlZCBpcyBpbmRpY2F0ZWQgYnkgIj4+IiwgaWYgaXQgZGlmZmVyc1xuICAgZnJvbSB0aGUgY3VycmVudCBsaW5lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAiPj4iIG1hcmtlci5cblxubGwgfCBsb25nbGlzdFxuXG4gICBMaXN0IGFsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb3IgZnJhbWUuXG4gICBJbnRlcmVzdGluZyBsaW5lcyBhcmUgbWFya2VkIGFzIGZvciAibGlzdCIuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuYShyZ3MpXG5cbiAgIFByaW50IHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLlxuXG5wIGV4cHJlc3Npb25cblxuICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiBpbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwcmludCBpdHNcbiAgIHZhbHVlLlxuXG4gICBOb3RlOiAicHJpbnQoKSIgY2FuIGFsc28gYmUgdXNlZCwgYnV0IGlzIG5vdCBhIGRlYnVnZ2VyIGNvbW1hbmRcbiAgICAgLS0tIHRoaXMgZXhlY3V0ZXMgdGhlIFB5dGhvbiAicHJpbnQoKSIgZnVuY3Rpb24uXG5cbnBwIGV4cHJlc3Npb25cblxuICAgTGlrZSB0aGUgInAiIGNvbW1hbmQsIGV4Y2VwdCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgcHJldHR5LVxuICAgcHJpbnRlZCB1c2luZyB0aGUgInBwcmludCIgbW9kdWxlLlxuXG53aGF0aXMgZXhwcmVzc2lvblxuXG4gICBQcmludCB0aGUgdHlwZSBvZiB0aGUgKmV4cHJlc3Npb24qLlxuXG5zb3VyY2UgZXhwcmVzc2lvblxuXG4gICBUcnkgdG8gZ2V0IHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBkaXNwbGF5IGl0LlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmRpc3BsYXkgW2V4cHJlc3Npb25dXG5cbiAgIERpc3BsYXkgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlmIGl0IGNoYW5nZWQsIGVhY2ggdGltZVxuICAgZXhlY3V0aW9uIHN0b3BzIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuXG4gICBXaXRob3V0IGV4cHJlc3Npb24sIGxpc3QgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50XG4gICBmcmFtZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG51bmRpc3BsYXkgW2V4cHJlc3Npb25dXG5cbiAgIERvIG5vdCBkaXNwbGF5IHRoZSBleHByZXNzaW9uIGFueSBtb3JlIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuICAgV2l0aG91dCBleHByZXNzaW9uLCBjbGVhciBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnRcbiAgIGZyYW1lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmludGVyYWN0XG5cbiAgIFN0YXJ0IGFuIGludGVyYXRpdmUgaW50ZXJwcmV0ZXIgKHVzaW5nIHRoZSAiY29kZSIgbW9kdWxlKSB3aG9zZVxuICAgZ2xvYmFsIG5hbWVzcGFjZSBjb250YWlucyBhbGwgdGhlIChnbG9iYWwgYW5kIGxvY2FsKSBuYW1lcyBmb3VuZCBpblxuICAgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuYWxpYXMgW25hbWUgW2NvbW1hbmRdXVxuXG4gICBDcmVhdGUgYW4gYWxpYXMgY2FsbGVkICpuYW1lKiB0aGF0IGV4ZWN1dGVzICpjb21tYW5kKi4gIFRoZSBjb21tYW5kXG4gICBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMgY2FuIGJlXG4gICBpbmRpY2F0ZWQgYnkgIiUxIiwgIiUyIiwgYW5kIHNvIG9uLCB3aGlsZSAiJSoiIGlzIHJlcGxhY2VkIGJ5IGFsbFxuICAgdGhlIHBhcmFtZXRlcnMuIElmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGFsaWFzIGZvclxuICAgKm5hbWUqIGlzIHNob3duLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUgbGlzdGVkLlxuXG4gICBBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlIGxlZ2FsbHlcbiAgIHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSB0aGF0IGludGVybmFsIHBkYiBjb21tYW5kcyAqY2FuKiBiZVxuICAgb3ZlcnJpZGRlbiBieSBhbGlhc2VzLiAgU3VjaCBhIGNvbW1hbmQgaXMgdGhlbiBoaWRkZW4gdW50aWwgdGhlXG4gICBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgZmlyc3RcbiAgIHdvcmQgb2YgdGhlIGNvbW1hbmQgbGluZTsgYWxsIG90aGVyIHdvcmRzIGluIHRoZSBsaW5lIGFyZSBsZWZ0XG4gICBhbG9uZS5cblxuICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gcGxhY2VkXG4gICBpbiB0aGUgIi5wZGJyYyIgZmlsZSk6XG5cbiAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IilcbiAgICAgIGFsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQoIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10pXG4gICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmXG4gICAgICBhbGlhcyBwcyBwaSBzZWxmXG5cbnVuYWxpYXMgbmFtZVxuXG4gICBEZWxldGUgdGhlIHNwZWNpZmllZCBhbGlhcy5cblxuISBzdGF0ZW1lbnRcblxuICAgRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSAqc3RhdGVtZW50KiBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudFxuICAgc3RhY2sgZnJhbWUuIFRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlIGZpcnN0XG4gICB3b3JkIG9mIHRoZSBzdGF0ZW1lbnQgcmVzZW1ibGVzIGEgZGVidWdnZXIgY29tbWFuZC4gIFRvIHNldCBhXG4gICBnbG9iYWwgdmFyaWFibGUsIHlvdSBjYW4gcHJlZml4IHRoZSBhc3NpZ25tZW50IGNvbW1hbmQgd2l0aCBhXG4gICAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjpcblxuICAgICAgKFBkYikgZ2xvYmFsIGxpc3Rfb3B0aW9uczsgbGlzdF9vcHRpb25zID0gW1wnLWxcJ11cbiAgICAgIChQZGIpXG5cbnJ1biBbYXJncyAuLi5dXG5yZXN0YXJ0IFthcmdzIC4uLl1cblxuICAgUmVzdGFydCB0aGUgZGVidWdnZWQgUHl0aG9uIHByb2dyYW0uICBJZiBhbiBhcmd1bWVudCBpcyBzdXBwbGllZCxcbiAgIGl0IGlzIHNwbGl0IHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXdcbiAgICJzeXMuYXJndiIuIEhpc3RvcnksIGJyZWFrcG9pbnRzLCBhY3Rpb25zIGFuZCBkZWJ1Z2dlciBvcHRpb25zIGFyZVxuICAgcHJlc2VydmVkLiAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLlxuXG5xKHVpdClcblxuICAgUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4gIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzIGFib3J0ZWQuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gV2hldGhlciBhIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gb3JpZ2luYXRlIGluIGEgY2VydGFpbiBtb2R1bGVcbiAgICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSAiX19uYW1lX18iIGluIHRoZSBmcmFtZSBnbG9iYWxzLlxuJywKKyAnY3VzdG9taXphdGlvbic6IHUnXG5CYXNpYyBjdXN0b21pemF0aW9uXG4qKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mICJ4PT15IiBkb2VzIG5vdCBpbXBseSB0aGF0ICJ4IT15IiBpcyBmYWxzZS5cbiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nICJfX2VxX18oKSIsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgICJfX25lX18oKSIgc28gdGhhdCB0aGUgb3BlcmF0b3JzIHdpbGwgYmVoYXZlIGFzIGV4cGVjdGVkLiAgU2VlIHRoZVxuICAgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmdcbiAgICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kXG4gICBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyByZWZsZWN0aW9uLFxuICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLlxuXG4gICBBcmd1bWVudHMgdG8gcmljaCBjb21wYXJpc29uIG1ldGhvZHMgYXJlIG5ldmVyIGNvZXJjZWQuXG5cbiAgIFRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3RcbiAgIG9wZXJhdGlvbiwgc2VlICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiJcblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkIG5vdFxuICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIlxuICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kXG4gICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgY29sbGVjdGlvbnNcbiAgIHJlcXVpcmVzIHRoYXQgYSBrZXlcJ3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5XG4gICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2hcbiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLlxuXG4gICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSJcbiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlXG4gICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzXG4gICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvXG4gICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSIpLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlclxuICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4gICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvIHN1cHByZXNzXG4gICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzc1xuICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXRcbiAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiIGNhbGwuXG5cbiAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgYW5kXG4gICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSByYW5kb20gdmFsdWUuXG4gICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvblxuICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZlxuICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1cbiAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZVxuICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSBjb21wbGV4aXR5LlxuICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZlxuICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlc1xuICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmRcbiAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cblxub2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdFxuICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicsCisgJ2RlYnVnZ2VyJzogdSdcbiJwZGIiIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qKlNvdXJjZSBjb2RlOioqIExpYi9wZGIucHlcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgbW9kdWxlICJwZGIiIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yXG5QeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kXG5zaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcyxcbnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGVcbmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmdcbmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cblxuVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0gaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgY2xhc3NcbiJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5IHJlYWRpbmdcbnRoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzICJiZGIiIGFuZCAiY21kIi5cblxuVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyAiKFBkYikiLiBUeXBpY2FsIHVzYWdlIHRvIHJ1biBhIHByb2dyYW0gdW5kZXJcbmNvbnRyb2wgb2YgdGhlIGRlYnVnZ2VyIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IHBkYi5ydW4oXCdteW1vZHVsZS50ZXN0KClcJylcbiAgID4gPHN0cmluZz4oMCk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgTmFtZUVycm9yOiBcJ3NwYW1cJ1xuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYilcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSBpc1xuYXZhaWxhYmxlIGZvciBjb21tYW5kcyBhbmQgY29tbWFuZCBhcmd1bWVudHMsIGUuZy4gdGhlIGN1cnJlbnQgZ2xvYmFsXG5hbmQgbG9jYWwgbmFtZXMgYXJlIG9mZmVyZWQgYXMgYXJndW1lbnRzIG9mIHRoZSAicCIgY29tbWFuZC5cblxuInBkYi5weSIgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciBzY3JpcHRzLiAgRm9yXG5leGFtcGxlOlxuXG4gICBweXRob24zIC1tIHBkYiBteXNjcmlwdC5weVxuXG5XaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgcG9zdC1tb3J0ZW1cbmRlYnVnZ2luZyBpZiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBleGl0cyBhYm5vcm1hbGx5LiAgQWZ0ZXIgcG9zdC1cbm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGxcbnJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiXCdzIHN0YXRlIChzdWNoXG5hcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGVcbmRlYnVnZ2VyIHVwb24gcHJvZ3JhbVwncyBleGl0LlxuXG5OZXcgaW4gdmVyc2lvbiAzLjI6ICJwZGIucHkiIG5vdyBhY2NlcHRzIGEgIi1jIiBvcHRpb24gdGhhdCBleGVjdXRlc1xuY29tbWFuZHMgYXMgaWYgZ2l2ZW4gaW4gYSAiLnBkYnJjIiBmaWxlLCBzZWUgKkRlYnVnZ2VyIENvbW1hbmRzKi5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpc1xudG8gaW5zZXJ0XG5cbiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuXG5hdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuIHRoZW5cbnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nXG53aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIiBjb21tYW5kLlxuXG5UaGUgdHlwaWNhbCB1c2FnZSB0byBpbnNwZWN0IGEgY3Jhc2hlZCBwcm9ncmFtIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IG15bW9kdWxlLnRlc3QoKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3RcbiAgICAgICB0ZXN0MigpXG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDMsIGluIHRlc3QyXG4gICAgICAgcHJpbnQoc3BhbSlcbiAgIE5hbWVFcnJvcjogc3BhbVxuICAgPj4+IHBkYi5wbSgpXG4gICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4gICAtPiBwcmludChzcGFtKVxuICAgKFBkYilcblxuVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXJcbmluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcblxucGRiLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KSB1bmRlclxuICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXNcbiAgIGV4ZWN1dGVkOyB5b3UgY2FuIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSAiY29udGludWUiLCBvciB5b3UgY2FuXG4gICBzdGVwIHRocm91Z2ggdGhlIHN0YXRlbWVudCB1c2luZyAic3RlcCIgb3IgIm5leHQiIChhbGwgdGhlc2VcbiAgIGNvbW1hbmRzIGFyZSBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscypcbiAgIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnlcbiAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAoU2VlIHRoZVxuICAgZXhwbGFuYXRpb24gb2YgdGhlIGJ1aWx0LWluICJleGVjKCkiIG9yICJldmFsKCkiIGZ1bmN0aW9ucy4pXG5cbnBkYi5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpXG4gICB1bmRlciBkZWJ1Z2dlciBjb250cm9sLiAgV2hlbiAicnVuZXZhbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zIHRoZVxuICAgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvXG4gICAicnVuKCkiLlxuXG5wZGIucnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcblxuICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpXG4gICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuICJydW5jYWxsKCkiIHJldHVybnMsIGl0IHJldHVybnNcbiAgIHdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzXG4gICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLlxuXG5wZGIuc2V0X3RyYWNlKClcblxuICAgRW50ZXIgdGhlIGRlYnVnZ2VyIGF0IHRoZSBjYWxsaW5nIHN0YWNrIGZyYW1lLiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgIGhhcmQtY29kZSBhIGJyZWFrcG9pbnQgYXQgYSBnaXZlbiBwb2ludCBpbiBhIHByb2dyYW0sIGV2ZW4gaWYgdGhlXG4gICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb25cbiAgIGZhaWxzKS5cblxucGRiLnBvc3RfbW9ydGVtKHRyYWNlYmFjaz1Ob25lKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIGdpdmVuICp0cmFjZWJhY2sqIG9iamVjdC4gIElmIG5vXG4gICAqdHJhY2ViYWNrKiBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgb25lIG9mIHRoZSBleGNlcHRpb24gdGhhdCBpc1xuICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgaWYgdGhlXG4gICBkZWZhdWx0IGlzIHRvIGJlIHVzZWQpLlxuXG5wZGIucG0oKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpblxuICAgInN5cy5sYXN0X3RyYWNlYmFjayIuXG5cblRoZSAicnVuKiIgZnVuY3Rpb25zIGFuZCAic2V0X3RyYWNlKCkiIGFyZSBhbGlhc2VzIGZvciBpbnN0YW50aWF0aW5nXG50aGUgIlBkYiIgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiAgSWYgeW91IHdhbnRcbnRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzIHlvdXJzZWxmOlxuXG5jbGFzcyBjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PVwndGFiXCcsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBza2lwPU5vbmUsIG5vc2lnaW50PUZhbHNlKVxuXG4gICAiUGRiIiBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG5cbiAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGVcbiAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLlxuXG4gICBUaGUgKnNraXAqIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBnbG9iLXN0eWxlXG4gICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzIHRoYXRcbiAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiBbMV1cblxuICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggaXMgc2VudFxuICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEN0cmwtQyBvbiB0aGUgY29uc29sZSkgd2hlbiB5b3UgZ2l2ZSBhXG4gICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlclxuICAgYWdhaW4gYnkgcHJlc3NpbmcgQ3RybC1DLiAgSWYgeW91IHdhbnQgUGRiIG5vdCB0byB0b3VjaCB0aGUgU0lHSU5UXG4gICBoYW5kbGVyLCBzZXQgKm5vc2lnaW50KiB0b3QgdHJ1ZS5cblxuICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOlxuXG4gICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKHNraXA9W1wnZGphbmdvLipcJ10pLnNldF90cmFjZSgpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMTogVGhlICpza2lwKiBhcmd1bWVudC5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgKm5vc2lnaW50KiBhcmd1bWVudC4gIFByZXZpb3VzbHksIGEgU0lHSU5UXG4gICBoYW5kbGVyIHdhcyBuZXZlciBzZXQgYnkgUGRiLlxuXG4gICBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuICAgcnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuICAgcnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcbiAgIHNldF90cmFjZSgpXG5cbiAgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9ucyBleHBsYWluZWQgYWJvdmUuXG5cblxuRGVidWdnZXIgQ29tbWFuZHNcbj09PT09PT09PT09PT09PT09XG5cblRoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBkZWJ1Z2dlciBhcmUgbGlzdGVkIGJlbG93LiAgTW9zdFxuY29tbWFuZHMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVycyBhcyBpbmRpY2F0ZWQ7IGUuZy5cbiJoKGVscCkiIG1lYW5zIHRoYXQgZWl0aGVyICJoIiBvciAiaGVscCIgY2FuIGJlIHVzZWQgdG8gZW50ZXIgdGhlIGhlbHBcbmNvbW1hbmQgKGJ1dCBub3QgImhlIiBvciAiaGVsIiwgbm9yICJIIiBvciAiSGVscCIgb3IgIkhFTFAiKS5cbkFyZ3VtZW50cyB0byBjb21tYW5kcyBtdXN0IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIChzcGFjZXMgb3JcbnRhYnMpLiAgT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgKCJbXSIpIGluXG50aGUgY29tbWFuZCBzeW50YXg7IHRoZSBzcXVhcmUgYnJhY2tldHMgbXVzdCBub3QgYmUgdHlwZWQuXG5BbHRlcm5hdGl2ZXMgaW4gdGhlIGNvbW1hbmQgc3ludGF4IGFyZSBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCBiYXJcbigifCIpLlxuXG5FbnRlcmluZyBhIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kIGVudGVyZWQuICBFeGNlcHRpb246IGlmXG50aGUgbGFzdCBjb21tYW5kIHdhcyBhICJsaXN0IiBjb21tYW5kLCB0aGUgbmV4dCAxMSBsaW5lcyBhcmUgbGlzdGVkLlxuXG5Db21tYW5kcyB0aGF0IHRoZSBkZWJ1Z2dlciBkb2VzblwndCByZWNvZ25pemUgYXJlIGFzc3VtZWQgdG8gYmUgUHl0aG9uXG5zdGF0ZW1lbnRzIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2dyYW0gYmVpbmdcbmRlYnVnZ2VkLiAgUHl0aG9uIHN0YXRlbWVudHMgY2FuIGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvblxucG9pbnQgKCIhIikuICBUaGlzIGlzIGEgcG93ZXJmdWwgd2F5IHRvIGluc3BlY3QgdGhlIHByb2dyYW0gYmVpbmdcbmRlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9yIGNhbGwgYSBmdW5jdGlvbi5cbldoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBzdWNoIGEgc3RhdGVtZW50LCB0aGUgZXhjZXB0aW9uIG5hbWUgaXNcbnByaW50ZWQgYnV0IHRoZSBkZWJ1Z2dlclwncyBzdGF0ZSBpcyBub3QgY2hhbmdlZC5cblxuVGhlIGRlYnVnZ2VyIHN1cHBvcnRzICphbGlhc2VzKi4gIEFsaWFzZXMgY2FuIGhhdmUgcGFyYW1ldGVycyB3aGljaFxuYWxsb3dzIG9uZSBhIGNlcnRhaW4gbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyXG5leGFtaW5hdGlvbi5cblxuTXVsdGlwbGUgY29tbWFuZHMgbWF5IGJlIGVudGVyZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5ICI7OyIuXG4oQSBzaW5nbGUgIjsiIGlzIG5vdCB1c2VkIGFzIGl0IGlzIHRoZSBzZXBhcmF0b3IgZm9yIG11bHRpcGxlIGNvbW1hbmRzXG5pbiBhIGxpbmUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIFB5dGhvbiBwYXJzZXIuKSAgTm8gaW50ZWxsaWdlbmNlIGlzXG5hcHBsaWVkIHRvIHNlcGFyYXRpbmcgdGhlIGNvbW1hbmRzOyB0aGUgaW5wdXQgaXMgc3BsaXQgYXQgdGhlIGZpcnN0XG4iOzsiIHBhaXIsIGV2ZW4gaWYgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHF1b3RlZCBzdHJpbmcuXG5cbklmIGEgZmlsZSAiLnBkYnJjIiBleGlzdHMgaW4gdGhlIHVzZXJcJ3MgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gdGhlXG5jdXJyZW50IGRpcmVjdG9yeSwgaXQgaXMgcmVhZCBpbiBhbmQgZXhlY3V0ZWQgYXMgaWYgaXQgaGFkIGJlZW4gdHlwZWRcbmF0IHRoZSBkZWJ1Z2dlciBwcm9tcHQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGFsaWFzZXMuICBJZlxuYm90aCBmaWxlcyBleGlzdCwgdGhlIG9uZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgcmVhZCBmaXJzdCBhbmRcbmFsaWFzZXMgZGVmaW5lZCB0aGVyZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgbG9jYWwgZmlsZS5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIi5wZGJyYyIgY2FuIG5vdyBjb250YWluIGNvbW1hbmRzIHRoYXRcbmNvbnRpbnVlIGRlYnVnZ2luZywgc3VjaCBhcyAiY29udGludWUiIG9yICJuZXh0Ii4gIFByZXZpb3VzbHksIHRoZXNlXG5jb21tYW5kcyBoYWQgbm8gZWZmZWN0LlxuXG5oKGVscCkgW2NvbW1hbmRdXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIHByaW50IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy4gIFdpdGggYVxuICAgKmNvbW1hbmQqIGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZC4gICJoZWxwIHBkYiJcbiAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiXG4gICBtb2R1bGUpLiAgU2luY2UgdGhlICpjb21tYW5kKiBhcmd1bWVudCBtdXN0IGJlIGFuIGlkZW50aWZpZXIsICJoZWxwXG4gICBleGVjIiBtdXN0IGJlIGVudGVyZWQgdG8gZ2V0IGhlbHAgb24gdGhlICIhIiBjb21tYW5kLlxuXG53KGhlcmUpXG5cbiAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uICBBblxuICAgYXJyb3cgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb250ZXh0IG9mXG4gICBtb3N0IGNvbW1hbmRzLlxuXG5kKG93bikgW2NvdW50XVxuXG4gICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiB0aGVcbiAgIHN0YWNrIHRyYWNlICh0byBhIG5ld2VyIGZyYW1lKS5cblxudShwKSBbY291bnRdXG5cbiAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyB1cCBpbiB0aGUgc3RhY2tcbiAgIHRyYWNlICh0byBhbiBvbGRlciBmcmFtZSkuXG5cbmIocmVhaykgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuXG4gICBXaXRoIGEgKmxpbmVubyogYXJndW1lbnQsIHNldCBhIGJyZWFrIHRoZXJlIGluIHRoZSBjdXJyZW50IGZpbGUuXG4gICBXaXRoIGEgKmZ1bmN0aW9uKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgYXQgdGhlIGZpcnN0IGV4ZWN1dGFibGVcbiAgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIFRoZSBsaW5lIG51bWJlciBtYXkgYmUgcHJlZml4ZWRcbiAgIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwgdG8gc3BlY2lmeSBhIGJyZWFrcG9pbnQgaW4gYW5vdGhlclxuICAgZmlsZSAocHJvYmFibHkgb25lIHRoYXQgaGFzblwndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgaXNcbiAgIHNlYXJjaGVkIG9uICJzeXMucGF0aCIuICBOb3RlIHRoYXQgZWFjaCBicmVha3BvaW50IGlzIGFzc2lnbmVkIGFcbiAgIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyIGJyZWFrcG9pbnQgY29tbWFuZHMgcmVmZXIuXG5cbiAgIElmIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdFxuICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC5cblxuICAgV2l0aG91dCBhcmd1bWVudCwgbGlzdCBhbGwgYnJlYWtzLCBpbmNsdWRpbmcgZm9yIGVhY2ggYnJlYWtwb2ludCxcbiAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmVha3BvaW50IGhhcyBiZWVuIGhpdCwgdGhlIGN1cnJlbnRcbiAgIGlnbm9yZSBjb3VudCwgYW5kIHRoZSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBpZiBhbnkuXG5cbnRicmVhayBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG5cbiAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpc1xuICAgZmlyc3QgaGl0LiBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgImJyZWFrIi5cblxuY2woZWFyKSBbZmlsZW5hbWU6bGluZW5vIHwgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIFdpdGggYSAqZmlsZW5hbWU6bGluZW5vKiBhcmd1bWVudCwgY2xlYXIgYWxsIHRoZSBicmVha3BvaW50cyBhdFxuICAgdGhpcyBsaW5lLiBXaXRoIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYnJlYWtwb2ludCBudW1iZXJzLCBjbGVhclxuICAgdGhvc2UgYnJlYWtwb2ludHMuIFdpdGhvdXQgYXJndW1lbnQsIGNsZWFyIGFsbCBicmVha3MgKGJ1dCBmaXJzdFxuICAgYXNrIGNvbmZpcm1hdGlvbikuXG5cbmRpc2FibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBEaXNhYmxlIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4gICBicmVha3BvaW50IG51bWJlcnMuICBEaXNhYmxpbmcgYSBicmVha3BvaW50IG1lYW5zIGl0IGNhbm5vdCBjYXVzZVxuICAgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24sIGJ1dCB1bmxpa2UgY2xlYXJpbmcgYSBicmVha3BvaW50LCBpdFxuICAgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBicmVha3BvaW50cyBhbmQgY2FuIGJlIChyZS0pZW5hYmxlZC5cblxuZW5hYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgRW5hYmxlIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuXG5cbmlnbm9yZSBicG51bWJlciBbY291bnRdXG5cbiAgIFNldCB0aGUgaWdub3JlIGNvdW50IGZvciB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBudW1iZXIuICBJZiBjb3VudCBpc1xuICAgb21pdHRlZCwgdGhlIGlnbm9yZSBjb3VudCBpcyBzZXQgdG8gMC4gIEEgYnJlYWtwb2ludCBiZWNvbWVzIGFjdGl2ZVxuICAgd2hlbiB0aGUgaWdub3JlIGNvdW50IGlzIHplcm8uICBXaGVuIG5vbi16ZXJvLCB0aGUgY291bnQgaXNcbiAgIGRlY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkIGFuZCB0aGUgYnJlYWtwb2ludFxuICAgaXMgbm90IGRpc2FibGVkIGFuZCBhbnkgYXNzb2NpYXRlZCBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuXG5cbmNvbmRpdGlvbiBicG51bWJlciBbY29uZGl0aW9uXVxuXG4gICBTZXQgYSBuZXcgKmNvbmRpdGlvbiogZm9yIHRoZSBicmVha3BvaW50LCBhbiBleHByZXNzaW9uIHdoaWNoIG11c3RcbiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuICBJZiAqY29uZGl0aW9uKlxuICAgaXMgYWJzZW50LCBhbnkgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSBicmVha3BvaW50XG4gICBpcyBtYWRlIHVuY29uZGl0aW9uYWwuXG5cbmNvbW1hbmRzIFticG51bWJlcl1cblxuICAgU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyICpicG51bWJlciouICBUaGVcbiAgIGNvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZVxuICAgY29udGFpbmluZyBqdXN0ICJlbmQiIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuIEFuIGV4YW1wbGU6XG5cbiAgICAgIChQZGIpIGNvbW1hbmRzIDFcbiAgICAgIChjb20pIHAgc29tZV92YXJpYWJsZVxuICAgICAgKGNvbSkgZW5kXG4gICAgICAoUGRiKVxuXG4gICBUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZCBmb2xsb3dcbiAgIGl0IGltbWVkaWF0ZWx5IHdpdGggImVuZCI7IHRoYXQgaXMsIGdpdmUgbm8gY29tbWFuZHMuXG5cbiAgIFdpdGggbm8gKmJwbnVtYmVyKiBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0IGJyZWFrcG9pbnRcbiAgIHNldC5cblxuICAgWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uXG4gICBTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIgY29tbWFuZCB0aGF0XG4gICByZXN1bWVzIGV4ZWN1dGlvbi5cblxuICAgU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSBjb250aW51ZSxcbiAgIHN0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgdGVybWluYXRlc1xuICAgdGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieVxuICAgZW5kKS4gVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uIChldmVuIHdpdGggYVxuICAgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyIGFub3RoZXIgYnJlYWtwb2ludC0td2hpY2hcbiAgIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8gYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2hcbiAgIGxpc3QgdG8gZXhlY3V0ZS5cblxuICAgSWYgeW91IHVzZSB0aGUgXCdzaWxlbnRcJyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZSB1c3VhbFxuICAgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heSBiZVxuICAgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kXG4gICB0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdVxuICAgc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC5cblxucyh0ZXApXG5cbiAgIEV4ZWN1dGUgdGhlIGN1cnJlbnQgbGluZSwgc3RvcCBhdCB0aGUgZmlyc3QgcG9zc2libGUgb2NjYXNpb25cbiAgIChlaXRoZXIgaW4gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvciBvbiB0aGUgbmV4dCBsaW5lIGluIHRoZVxuICAgY3VycmVudCBmdW5jdGlvbikuXG5cbm4oZXh0KVxuXG4gICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiBpc1xuICAgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5leHQiIGFuZCAic3RlcCJcbiAgIGlzIHRoYXQgInN0ZXAiIHN0b3BzIGluc2lkZSBhIGNhbGxlZCBmdW5jdGlvbiwgd2hpbGUgIm5leHQiXG4gICBleGVjdXRlcyBjYWxsZWQgZnVuY3Rpb25zIGF0IChuZWFybHkpIGZ1bGwgc3BlZWQsIG9ubHkgc3RvcHBpbmcgYXRcbiAgIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uKVxuXG51bnQoaWwpIFtsaW5lbm9dXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgbnVtYmVyXG4gICBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lIGlzIHJlYWNoZWQuXG5cbiAgIFdpdGggYSBsaW5lIG51bWJlciwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIGEgbGluZSB3aXRoIGEgbnVtYmVyXG4gICBncmVhdGVyIG9yIGVxdWFsIHRvIHRoYXQgaXMgcmVhY2hlZC4gIEluIGJvdGggY2FzZXMsIGFsc28gc3RvcCB3aGVuXG4gICB0aGUgY3VycmVudCBmcmFtZSByZXR1cm5zLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBbGxvdyBnaXZpbmcgYW4gZXhwbGljaXQgbGluZSBudW1iZXIuXG5cbnIoZXR1cm4pXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLlxuXG5jKG9udChpbnVlKSlcblxuICAgQ29udGludWUgZXhlY3V0aW9uLCBvbmx5IHN0b3Agd2hlbiBhIGJyZWFrcG9pbnQgaXMgZW5jb3VudGVyZWQuXG5cbmoodW1wKSBsaW5lbm9cblxuICAgU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gdGhlXG4gICBib3R0b20tbW9zdCBmcmFtZS4gIFRoaXMgbGV0cyB5b3UganVtcCBiYWNrIGFuZCBleGVjdXRlIGNvZGUgYWdhaW4sXG4gICBvciBqdW1wIGZvcndhcmQgdG8gc2tpcCBjb2RlIHRoYXQgeW91IGRvblwndCB3YW50IHRvIHJ1bi5cblxuICAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbm90IGFsbCBqdW1wcyBhcmUgYWxsb3dlZCAtLSBmb3IgaW5zdGFuY2VcbiAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhICJmb3IiIGxvb3Agb3Igb3V0XG4gICBvZiBhICJmaW5hbGx5IiBjbGF1c2UuXG5cbmwoaXN0KSBbZmlyc3RbLCBsYXN0XV1cblxuICAgTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gIFdpdGhvdXQgYXJndW1lbnRzLCBsaXN0IDExXG4gICBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZSBvciBjb250aW51ZSB0aGUgcHJldmlvdXMgbGlzdGluZy5cbiAgIFdpdGggIi4iIGFzIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lLiAgV2l0aFxuICAgb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCBhdCB0aGF0IGxpbmUuICBXaXRoIHR3b1xuICAgYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBsZXNzXG4gICB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC5cblxuICAgVGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgY3VycmVudCBmcmFtZSBpcyBpbmRpY2F0ZWQgYnkgIi0+Ii4gIElmIGFuXG4gICBleGNlcHRpb24gaXMgYmVpbmcgZGVidWdnZWQsIHRoZSBsaW5lIHdoZXJlIHRoZSBleGNlcHRpb24gd2FzXG4gICBvcmlnaW5hbGx5IHJhaXNlZCBvciBwcm9wYWdhdGVkIGlzIGluZGljYXRlZCBieSAiPj4iLCBpZiBpdCBkaWZmZXJzXG4gICBmcm9tIHRoZSBjdXJyZW50IGxpbmUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICI+PiIgbWFya2VyLlxuXG5sbCB8IGxvbmdsaXN0XG5cbiAgIExpc3QgYWxsIHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbiBvciBmcmFtZS5cbiAgIEludGVyZXN0aW5nIGxpbmVzIGFyZSBtYXJrZWQgYXMgZm9yICJsaXN0Ii5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5hKHJncylcblxuICAgUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uXG5cbnAgZXhwcmVzc2lvblxuXG4gICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIGluIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHByaW50IGl0c1xuICAgdmFsdWUuXG5cbiAgIE5vdGU6ICJwcmludCgpIiBjYW4gYWxzbyBiZSB1c2VkLCBidXQgaXMgbm90IGEgZGVidWdnZXIgY29tbWFuZFxuICAgICAtLS0gdGhpcyBleGVjdXRlcyB0aGUgUHl0aG9uICJwcmludCgpIiBmdW5jdGlvbi5cblxucHAgZXhwcmVzc2lvblxuXG4gICBMaWtlIHRoZSAicCIgY29tbWFuZCwgZXhjZXB0IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpcyBwcmV0dHktXG4gICBwcmludGVkIHVzaW5nIHRoZSAicHByaW50IiBtb2R1bGUuXG5cbndoYXRpcyBleHByZXNzaW9uXG5cbiAgIFByaW50IHRoZSB0eXBlIG9mIHRoZSAqZXhwcmVzc2lvbiouXG5cbnNvdXJjZSBleHByZXNzaW9uXG5cbiAgIFRyeSB0byBnZXQgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGRpc3BsYXkgaXQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuZGlzcGxheSBbZXhwcmVzc2lvbl1cblxuICAgRGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaWYgaXQgY2hhbmdlZCwgZWFjaCB0aW1lXG4gICBleGVjdXRpb24gc3RvcHMgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG5cbiAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgbGlzdCBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnRcbiAgIGZyYW1lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbnVuZGlzcGxheSBbZXhwcmVzc2lvbl1cblxuICAgRG8gbm90IGRpc3BsYXkgdGhlIGV4cHJlc3Npb24gYW55IG1vcmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG4gICBXaXRob3V0IGV4cHJlc3Npb24sIGNsZWFyIGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgY3VycmVudFxuICAgZnJhbWUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuaW50ZXJhY3RcblxuICAgU3RhcnQgYW4gaW50ZXJhdGl2ZSBpbnRlcnByZXRlciAodXNpbmcgdGhlICJjb2RlIiBtb2R1bGUpIHdob3NlXG4gICBnbG9iYWwgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0aGUgKGdsb2JhbCBhbmQgbG9jYWwpIG5hbWVzIGZvdW5kIGluXG4gICB0aGUgY3VycmVudCBzY29wZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5hbGlhcyBbbmFtZSBbY29tbWFuZF1dXG5cbiAgIENyZWF0ZSBhbiBhbGlhcyBjYWxsZWQgKm5hbWUqIHRoYXQgZXhlY3V0ZXMgKmNvbW1hbmQqLiAgVGhlIGNvbW1hbmRcbiAgIG11c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUgcGFyYW1ldGVycyBjYW4gYmVcbiAgIGluZGljYXRlZCBieSAiJTEiLCAiJTIiLCBhbmQgc28gb24sIHdoaWxlICIlKiIgaXMgcmVwbGFjZWQgYnkgYWxsXG4gICB0aGUgcGFyYW1ldGVycy4gSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgYWxpYXMgZm9yXG4gICAqbmFtZSogaXMgc2hvd24uIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIGFsbCBhbGlhc2VzIGFyZSBsaXN0ZWQuXG5cbiAgIEFsaWFzZXMgbWF5IGJlIG5lc3RlZCBhbmQgY2FuIGNvbnRhaW4gYW55dGhpbmcgdGhhdCBjYW4gYmUgbGVnYWxseVxuICAgdHlwZWQgYXQgdGhlIHBkYiBwcm9tcHQuICBOb3RlIHRoYXQgaW50ZXJuYWwgcGRiIGNvbW1hbmRzICpjYW4qIGJlXG4gICBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcyB0aGVuIGhpZGRlbiB1bnRpbCB0aGVcbiAgIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcyByZWN1cnNpdmVseSBhcHBsaWVkIHRvIHRoZSBmaXJzdFxuICAgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMgaW4gdGhlIGxpbmUgYXJlIGxlZnRcbiAgIGFsb25lLlxuXG4gICBBcyBhbiBleGFtcGxlLCBoZXJlIGFyZSB0d28gdXNlZnVsIGFsaWFzZXMgKGVzcGVjaWFsbHkgd2hlbiBwbGFjZWRcbiAgIGluIHRoZSAiLnBkYnJjIiBmaWxlKTpcblxuICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgKHVzYWdlICJwaSBjbGFzc0luc3QiKVxuICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiBwcmludCgiJTEuIixrLCI9IiwlMS5fX2RpY3RfX1trXSlcbiAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzIGluIHNlbGZcbiAgICAgIGFsaWFzIHBzIHBpIHNlbGZcblxudW5hbGlhcyBuYW1lXG5cbiAgIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGFsaWFzLlxuXG4hIHN0YXRlbWVudFxuXG4gICBFeGVjdXRlIHRoZSAob25lLWxpbmUpICpzdGF0ZW1lbnQqIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50XG4gICBzdGFjayBmcmFtZS4gVGhlIGV4Y2xhbWF0aW9uIHBvaW50IGNhbiBiZSBvbWl0dGVkIHVubGVzcyB0aGUgZmlyc3RcbiAgIHdvcmQgb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLiAgVG8gc2V0IGFcbiAgIGdsb2JhbCB2YXJpYWJsZSwgeW91IGNhbiBwcmVmaXggdGhlIGFzc2lnbm1lbnQgY29tbWFuZCB3aXRoIGFcbiAgICJnbG9iYWwiIHN0YXRlbWVudCBvbiB0aGUgc2FtZSBsaW5lLCBlLmcuOlxuXG4gICAgICAoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbXCctbFwnXVxuICAgICAgKFBkYilcblxucnVuIFthcmdzIC4uLl1cbnJlc3RhcnQgW2FyZ3MgLi4uXVxuXG4gICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmIGFuIGFyZ3VtZW50IGlzIHN1cHBsaWVkLFxuICAgaXQgaXMgc3BsaXQgd2l0aCAic2hsZXgiIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ld1xuICAgInN5cy5hcmd2Ii4gSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyIG9wdGlvbnMgYXJlXG4gICBwcmVzZXJ2ZWQuICJyZXN0YXJ0IiBpcyBhbiBhbGlhcyBmb3IgInJ1biIuXG5cbnEodWl0KVxuXG4gICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBXaGV0aGVyIGEgZnJhbWUgaXMgY29uc2lkZXJlZCB0byBvcmlnaW5hdGUgaW4gYSBjZXJ0YWluIG1vZHVsZVxuICAgIGlzIGRldGVybWluZWQgYnkgdGhlICJfX25hbWVfXyIgaW4gdGhlIGZyYW1lIGdsb2JhbHMuXG4nLAogICdkZWwnOiB1J1xuVGhlICJkZWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG4gICBkZWxfc3RtdCA6Oj0gImRlbCIgdGFyZ2V0X2xpc3RcblxuRGVsZXRpb24gaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHdheSBhc3NpZ25tZW50IGlzXG5kZWZpbmVkLiBSYXRoZXIgdGhhbiBzcGVsbGluZyBpdCBvdXQgaW4gZnVsbCBkZXRhaWxzLCBoZXJlIGFyZSBzb21lXG5oaW50cy5cblxuRGVsZXRpb24gb2YgYSB0YXJnZXQgbGlzdCByZWN1cnNpdmVseSBkZWxldGVzIGVhY2ggdGFyZ2V0LCBmcm9tIGxlZnRcbnRvIHJpZ2h0LlxuXG5EZWxldGlvbiBvZiBhIG5hbWUgcmVtb3ZlcyB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgZnJvbSB0aGUgbG9jYWwgb3Jcbmdsb2JhbCBuYW1lc3BhY2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuYW1lIG9jY3VycyBpbiBhICJnbG9iYWwiXG5zdGF0ZW1lbnQgaW4gdGhlIHNhbWUgY29kZSBibG9jay4gIElmIHRoZSBuYW1lIGlzIHVuYm91bmQsIGFcbiJOYW1lRXJyb3IiIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC5cblxuRGVsZXRpb24gb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHN1YnNjcmlwdGlvbnMgYW5kIHNsaWNpbmdzIGlzIHBhc3NlZFxudG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcgaXMgaW4gZ2VuZXJhbFxuZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlblxudGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzbGljZWQgb2JqZWN0KS5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogUHJldmlvdXNseSBpdCB3YXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lXG5mcm9tIHRoZSBsb2NhbCBuYW1lc3BhY2UgaWYgaXQgb2NjdXJzIGFzIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG5lc3RlZFxuYmxvY2suXG4nLAogICdkaWN0JzogdSdcbkRpY3Rpb25hcnkgZGlzcGxheXNcbioqKioqKioqKioqKioqKioqKipcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgaXMgYSBwb3NzaWJseSBlbXB0eSBzZXJpZXMgb2Yga2V5L2RhdHVtIHBhaXJzXG5lbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6XG5cbiAgIGRpY3RfZGlzcGxheSAgICAgICA6Oj0gInsiIFtrZXlfZGF0dW1fbGlzdCB8IGRpY3RfY29tcHJlaGVuc2lvbl0gIn0iXG4gICBrZXlfZGF0dW1fbGlzdCAgICAgOjo9IGtleV9kYXR1bSAoIiwiIGtleV9kYXR1bSkqIFsiLCJdXG4gICBrZXlfZGF0dW0gICAgICAgICAgOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb25cbiAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvclxuXG5BIGRpY3Rpb25hcnkgZGlzcGxheSB5aWVsZHMgYSBuZXcgZGljdGlvbmFyeSBvYmplY3QuXG5cbklmIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGtleS9kYXR1bSBwYWlycyBpcyBnaXZlbiwgdGhleSBhcmVcbmV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgdG8gZGVmaW5lIHRoZSBlbnRyaWVzIG9mIHRoZSBkaWN0aW9uYXJ5OlxuZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgZGljdGlvbmFyeSB0byBzdG9yZSB0aGVcbmNvcnJlc3BvbmRpbmcgZGF0dW0uICBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBzcGVjaWZ5IHRoZSBzYW1lIGtleVxubXVsdGlwbGUgdGltZXMgaW4gdGhlIGtleS9kYXR1bSBsaXN0LCBhbmQgdGhlIGZpbmFsIGRpY3Rpb25hcnlcJ3MgdmFsdWVcbmZvciB0aGF0IGtleSB3aWxsIGJlIHRoZSBsYXN0IG9uZSBnaXZlbi5cblxuQSBkaWN0IGNvbXByZWhlbnNpb24sIGluIGNvbnRyYXN0IHRvIGxpc3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucyxcbm5lZWRzIHR3byBleHByZXNzaW9ucyBzZXBhcmF0ZWQgd2l0aCBhIGNvbG9uIGZvbGxvd2VkIGJ5IHRoZSB1c3VhbFxuImZvciIgYW5kICJpZiIgY2xhdXNlcy4gV2hlbiB0aGUgY29tcHJlaGVuc2lvbiBpcyBydW4sIHRoZSByZXN1bHRpbmdcbmtleSBhbmQgdmFsdWUgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZSBuZXcgZGljdGlvbmFyeSBpbiB0aGUgb3JkZXJcbnRoZXkgYXJlIHByb2R1Y2VkLlxuXG5SZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpblxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Ki4gIChUbyBzdW1tYXJpemUsIHRoZSBrZXkgdHlwZVxuc2hvdWxkIGJlICpoYXNoYWJsZSosIHdoaWNoIGV4Y2x1ZGVzIGFsbCBtdXRhYmxlIG9iamVjdHMuKSAgQ2xhc2hlc1xuYmV0d2VlbiBkdXBsaWNhdGUga2V5cyBhcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5XG5yaWdodG1vc3QgaW4gdGhlIGRpc3BsYXkpIHN0b3JlZCBmb3IgYSBnaXZlbiBrZXkgdmFsdWUgcHJldmFpbHMuXG4nLAotICdkeW5hbWljLWZlYXR1cmVzJzogdSdcbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGVcbnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcblxuICAgaSA9IDEwXG4gICBkZWYgZigpOlxuICAgICAgIHByaW50KGkpXG4gICBpID0gNDJcbiAgIGYoKVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnZHluYW1pYy1mZWF0dXJlcyc6IHUnXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKICAnZWxzZSc6IHUnXG5UaGUgImlmIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAogICdleGNlcHRpb25zJzogdSdcbkV4Y2VwdGlvbnNcbioqKioqKioqKipcblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiAuLi4gImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlXG4iZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbiJTeXN0ZW1FeGl0Ii5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzXG5zZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuIGJlXG5yZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG5leGNlcHRpb25hbCBjb25kaXRpb24uXG5cbk5vdGU6IEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5XG4gICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXNcbiAgICBjb21waWxlZC5cbicsCi0gJ2V4ZWNtb2RlbCc6IHUnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cblN0cnVjdHVyZSBvZiBhIHByb2dyYW1cbj09PT09PT09PT09PT09PT09PT09PT1cblxuQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgYSBwaWVjZVxub2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgdW5pdC4gVGhlIGZvbGxvd2luZyBhcmVcbmJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MgZGVmaW5pdGlvbi4gRWFjaFxuY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgZ2l2ZW5cbmFzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWQgYXMgYSBjb21tYW5kIGxpbmVcbmFyZ3VtZW50IHRvIHRoZSBpbnRlcnByZXRlcikgaXMgYSBjb2RlIGJsb2NrLiAgQSBzY3JpcHQgY29tbWFuZCAoYVxuY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSBcJyoqLWMqKlwnXG5vcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBzdHJpbmcgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBidWlsdC1pblxuZnVuY3Rpb25zICJldmFsKCkiIGFuZCAiZXhlYygpIiBpcyBhIGNvZGUgYmxvY2suXG5cbkEgY29kZSBibG9jayBpcyBleGVjdXRlZCBpbiBhbiAqZXhlY3V0aW9uIGZyYW1lKi4gIEEgZnJhbWUgY29udGFpbnNcbnNvbWUgYWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24gKHVzZWQgZm9yIGRlYnVnZ2luZykgYW5kIGRldGVybWluZXNcbndoZXJlIGFuZCBob3cgZXhlY3V0aW9uIGNvbnRpbnVlcyBhZnRlciB0aGUgY29kZSBibG9ja1wncyBleGVjdXRpb24gaGFzXG5jb21wbGV0ZWQuXG5cblxuTmFtaW5nIGFuZCBiaW5kaW5nXG49PT09PT09PT09PT09PT09PT1cblxuXG5CaW5kaW5nIG9mIG5hbWVzXG4tLS0tLS0tLS0tLS0tLS0tXG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucyxcbiJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgb3IgYWZ0ZXJcbiJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiIHN0YXRlbWVudFxub2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbmltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm1cbm1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3JcbnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLlxuXG5FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhXG5jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWxcbmNvZGUgYmxvY2spLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLFxudW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlXG5tb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZVxuY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlXG5ibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuXG5FYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAqYmluZGluZypcbm9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiBydWxlcy5cblxuXG5SZXNvbHV0aW9uIG9mIG5hbWVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuXG5XaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3RcbmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrXG5pcyBjYWxsZWQgdGhlIGJsb2NrXCdzICplbnZpcm9ubWVudCouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gSWZcbnRoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbFxudmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlIHRoZVxubmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4iVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWZcbnRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZC4gIFRoZVxuImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uXG5pbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlIHZhcmlhYmxlXG5jb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciB0b1xucHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90XG5leGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuXG5UaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYVxubW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkXG4iX19tYWluX18iLlxuXG5DbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiBhcmVcbnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW5cbmV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSByZWZlcmVuY2VzXG5mb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uIHRoYXRcbnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZVxubmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IG9mXG50aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0b1xudGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS1cbnRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZVxuaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nXG53aWxsIGZhaWw6XG5cbiAgIGNsYXNzIEE6XG4gICAgICAgYSA9IDQyXG4gICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuXG5cbkJ1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyBnbG9iYWxcbm5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgbGF0dGVyIGNhc2VcbnRoZSBtb2R1bGVcJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlICJfX21haW5fXyJcbm1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluIGFueVxub3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlXG4iYnVpbHRpbnMiIG1vZHVsZSBpdHNlbGYuICAiX19idWlsdGluc19fIiBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG4iX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICJpbXBvcnQiXG50aGUgImJ1aWx0aW5zIiBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcyBhcHByb3ByaWF0ZWx5LlxuXG5cbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGVcbnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcblxuICAgaSA9IDEwXG4gICBkZWYgZigpOlxuICAgICAgIHByaW50KGkpXG4gICBpID0gNDJcbiAgIGYoKVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuXG5cbkV4Y2VwdGlvbnNcbj09PT09PT09PT1cblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiAuLi4gImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlXG4iZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbiJTeXN0ZW1FeGl0Ii5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzXG5zZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuIGJlXG5yZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG5leGNlcHRpb25hbCBjb25kaXRpb24uXG5cbk5vdGU6IEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5XG4gICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXNcbiAgICBjb21waWxlZC5cbicsCisgJ2V4ZWNtb2RlbCc6IHUnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxuYXMgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdG8gdGhlIGludGVycHJldGVyKSBpcyBhIGNvZGUgYmxvY2suICBBXG5zY3JpcHQgY29tbWFuZCAoYSBjb21tYW5kIHNwZWNpZmllZCBvbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lXG53aXRoIHRoZSBcJyoqLWMqKlwnIG9wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWRcbnRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImV2YWwoKSIgYW5kICJleGVjKCkiIGlzIGEgY29kZSBibG9jay5cblxuQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWluc1xuc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgZGV0ZXJtaW5lc1xud2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrXCdzIGV4ZWN1dGlvbiBoYXNcbmNvbXBsZXRlZC5cblxuQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbFxudmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmIHRoZVxuZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrc1xuY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlc1xuYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuICBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhXG5jbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZVxuY29kZSBibG9ja3Mgb2YgbWV0aG9kcyAtLSB0aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3JcbmV4cHJlc3Npb25zIHNpbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzXG5tZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLFxudW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZVxubGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZSBjb2RlXG5ibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrXG5idXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5JZiB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGhhcyBub3QgYmVlbiBib3VuZCwgYW5cbiJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gICJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYVxuc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgZmlyc3QuICBJZlxudGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzIHNlYXJjaGVkLiAgVGhlXG4iZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uXG5pbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlIHZhcmlhYmxlXG5jb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuXG5cbkV4Y2VwdGlvbnNcbj09PT09PT09PT1cblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiAuLi4gImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlXG4iZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbiJTeXN0ZW1FeGl0Ii5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzXG5zZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuIGJlXG5yZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG5leGNlcHRpb25hbCBjb25kaXRpb24uXG5cbk5vdGU6IEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5XG4gICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXNcbiAgICBjb21waWxlZC5cbicsCiAgJ2V4cHJsaXN0cyc6IHUnXG5FeHByZXNzaW9uIGxpc3RzXG4qKioqKioqKioqKioqKioqXG5cbiAgIGV4cHJlc3Npb25fbGlzdCA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG5cbkFuIGV4cHJlc3Npb24gbGlzdCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZVxubGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlXG5leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cblxuVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlIChhLmsuYS4gYVxuKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSBleHByZXNzaW9uXG53aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc25cJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgeWllbGRzIHRoZVxudmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gZW1wdHkgcGFpclxub2YgcGFyZW50aGVzZXM6ICIoKSIuKVxuJywKICAnZmxvYXRpbmcnOiB1J1xuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG5kZWZpbml0aW9uczpcblxuICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbiAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4gICBleHBvbmVudGZsb2F0IDo6PSAoaW50cGFydCB8IHBvaW50ZmxvYXQpIGV4cG9uZW50XG4gICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbiAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbiAgIGV4cG9uZW50ICAgICAgOjo9ICgiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIGRpZ2l0K1xuXG5Ob3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIGFyZSBhbHdheXMgaW50ZXJwcmV0ZWQgdXNpbmdcbnJhZGl4IDEwLiBGb3IgZXhhbXBsZSwgIjA3N2UwMTAiIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXJcbmFzICI3N2UxMCIuIFRoZSBhbGxvd2VkIHJhbmdlIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGlzXG5pbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHM6XG5cbiAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciAiLSIgYW5kIHRoZVxubGl0ZXJhbCAiMSIuXG4nLAogICdmb3InOiB1J1xuVGhlICJmb3IiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIHNlcXVlbmNlXG4oc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuXG4gICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiBpdGVyYWJsZVxub2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbiJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzIChzZWUgKkFzc2lnbm1lbnQgc3RhdGVtZW50cyopLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXNcbmV4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24pLFxudGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSBsb29wXG50ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGNvbnRpbnVlc1xud2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHRcbml0ZW0uXG5cblRoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgbGlzdC5cblRoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzIGluY2x1ZGluZ1xudGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuXG4gICBmb3IgaSBpbiByYW5nZSgxMCk6XG4gICAgICAgcHJpbnQoaSlcbiAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG5cbk5hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCxcbmJ1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0XG5hbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgYW5cbml0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgImZvciBpXG46PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAyXSIuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4gIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gIEFuXG4gIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LFxuICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhc1xuICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zXG4gIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGVcbiAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZlxuICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJywKQEAgLTQyLDE2ICs0MiwxNiBAQAogICdpZic6IHUnXG5UaGUgImlmIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAogICdpbWFnaW5hcnknOiB1J1xuSW1hZ2luYXJ5IGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKipcblxuSW1hZ2luYXJ5IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbWFnbnVtYmVyIDo6PSAoZmxvYXRudW1iZXIgfCBpbnRwYXJ0KSAoImoiIHwgIkoiKVxuXG5BbiBpbWFnaW5hcnkgbGl0ZXJhbCB5aWVsZHMgYSBjb21wbGV4IG51bWJlciB3aXRoIGEgcmVhbCBwYXJ0IG9mIDAuMC5cbkNvbXBsZXggbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnNcbmFuZCBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBvbiB0aGVpciByYW5nZS4gIFRvIGNyZWF0ZSBhIGNvbXBsZXhcbm51bWJlciB3aXRoIGEgbm9uemVybyByZWFsIHBhcnQsIGFkZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBpdCxcbmUuZy4sICIoMys0aikiLiAgU29tZSBleGFtcGxlcyBvZiBpbWFnaW5hcnkgbGl0ZXJhbHM6XG5cbiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAzLjE0ZS0xMGpcbicsCiAgJ2ltcG9ydCc6IHUnXG5UaGUgImltcG9ydCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGltcG9ydF9zdG10ICAgICA6Oj0gImltcG9ydCIgbW9kdWxlIFsiYXMiIG5hbWVdICggIiwiIG1vZHVsZSBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgbW9kdWxlICJpbXBvcnQiICIqIlxuICAgbW9kdWxlICAgICAgICAgIDo6PSAoaWRlbnRpZmllciAiLiIpKiBpZGVudGlmaWVyXG4gICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iK1xuICAgbmFtZSAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG5cblRoZSBiYXNpYyBpbXBvcnQgc3RhdGVtZW50IChubyAiZnJvbSIgY2xhdXNlKSBpcyBleGVjdXRlZCBpbiB0d29cbnN0ZXBzOlxuXG4xLiBmaW5kIGEgbW9kdWxlLCBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5XG5cbjIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlXG4gICB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cblxuV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpIHRoZVxudHdvIHN0ZXBzIGFyZSBjYXJyaWVkIG91dCBzZXBhcmF0ZWx5IGZvciBlYWNoIGNsYXVzZSwganVzdCBhcyB0aG91Z2hcbnRoZSBjbGF1c2VzIGhhZCBiZWVuIHNlcGFyYXRlZCBvdXQgaW50byBpbmRpdmlkaXVhbCBpbXBvcnQgc3RhdGVtZW50cy5cblxuVGhlIGRldGFpbHMgb2YgdGhlIGZpcnN0IHN0ZXAsIGZpbmRpbmcgYW5kIGxvYWRpbmcgbW9kdWxlcyBhcmVcbmRlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgKmltcG9ydCBzeXN0ZW0qLFxud2hpY2ggYWxzbyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgdHlwZXMgb2YgcGFja2FnZXMgYW5kIG1vZHVsZXMgdGhhdFxuY2FuIGJlIGltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0b1xuY3VzdG9taXplIHRoZSBpbXBvcnQgc3lzdGVtLiBOb3RlIHRoYXQgZmFpbHVyZXMgaW4gdGhpcyBzdGVwIG1heVxuaW5kaWNhdGUgZWl0aGVyIHRoYXQgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9jYXRlZCwgKm9yKiB0aGF0IGFuXG5lcnJvciBvY2N1cnJlZCB3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uXG5vZiB0aGUgbW9kdWxlXCdzIGNvZGUuXG5cbklmIHRoZSByZXF1ZXN0ZWQgbW9kdWxlIGlzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGl0IHdpbGwgYmUgbWFkZVxuYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6XG5cbiogSWYgdGhlIG1vZHVsZSBuYW1lIGlzIGZvbGxvd2VkIGJ5ICJhcyIsIHRoZW4gdGhlIG5hbWUgZm9sbG93aW5nXG4gICJhcyIgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS5cblxuKiBJZiBubyBvdGhlciBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgYVxuICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxlXCdzIG5hbWUgaXMgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZVxuICBhcyBhIHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlXG5cbiogSWYgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyAqbm90KiBhIHRvcCBsZXZlbCBtb2R1bGUsIHRoZW4gdGhlXG4gIG5hbWUgb2YgdGhlIHRvcCBsZXZlbCBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZSBpcyBib3VuZCBpblxuICB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSB0b3AgbGV2ZWwgcGFja2FnZS4gVGhlXG4gIGltcG9ydGVkIG1vZHVsZSBtdXN0IGJlIGFjY2Vzc2VkIHVzaW5nIGl0cyBmdWxsIHF1YWxpZmllZCBuYW1lXG4gIHJhdGhlciB0aGFuIGRpcmVjdGx5XG5cblRoZSAiZnJvbSIgZm9ybSB1c2VzIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGV4IHByb2Nlc3M6XG5cbjEuIGZpbmQgdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gdGhlICJmcm9tIiBjbGF1c2UsIGxvYWRpbmcgYW5kXG4gICBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5O1xuXG4yLiBmb3IgZWFjaCBvZiB0aGUgaWRlbnRpZmllcnMgc3BlY2lmaWVkIGluIHRoZSAiaW1wb3J0IiBjbGF1c2VzOlxuXG4gICAxLiBjaGVjayBpZiB0aGUgaW1wb3J0ZWQgbW9kdWxlIGhhcyBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lXG5cbiAgIDIuIGlmIG5vdCwgYXR0ZW1wdCB0byBpbXBvcnQgYSBzdWJtb2R1bGUgd2l0aCB0aGF0IG5hbWUgYW5kIHRoZW5cbiAgICAgIGNoZWNrIHRoZSBpbXBvcnRlZCBtb2R1bGUgYWdhaW4gZm9yIHRoYXQgYXR0cmlidXRlXG5cbiAgIDMuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kLCAiSW1wb3J0RXJyb3IiIGlzIHJhaXNlZC5cblxuICAgNC4gb3RoZXJ3aXNlLCBhIHJlZmVyZW5jZSB0byB0aGF0IHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgbG9jYWxcbiAgICAgIG5hbWVzcGFjZSwgdXNpbmcgdGhlIG5hbWUgaW4gdGhlICJhcyIgY2xhdXNlIGlmIGl0IGlzIHByZXNlbnQsXG4gICAgICBvdGhlcndpc2UgdXNpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lXG5cbkV4YW1wbGVzOlxuXG4gICBpbXBvcnQgZm9vICAgICAgICAgICAgICAgICAjIGZvbyBpbXBvcnRlZCBhbmQgYm91bmQgbG9jYWxseVxuICAgaW1wb3J0IGZvby5iYXIuYmF6ICAgICAgICAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCwgZm9vIGJvdW5kIGxvY2FsbHlcbiAgIGltcG9ydCBmb28uYmFyLmJheiBhcyBmYmIgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzIGZiYlxuICAgZnJvbSBmb28uYmFyIGltcG9ydCBiYXogICAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCBhbmQgYm91bmQgYXMgYmF6XG4gICBmcm9tIGZvbyBpbXBvcnQgYXR0ciAgICAgICAjIGZvbyBpbXBvcnRlZCBhbmQgZm9vLmF0dHIgYm91bmQgYXMgYXR0clxuXG5JZiB0aGUgbGlzdCBvZiBpZGVudGlmaWVycyBpcyByZXBsYWNlZCBieSBhIHN0YXIgKCJcJypcJyIpLCBhbGwgcHVibGljXG5uYW1lcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgYXJlIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZVxuc2NvcGUgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG5cblRoZSAqcHVibGljIG5hbWVzKiBkZWZpbmVkIGJ5IGEgbW9kdWxlIGFyZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZVxubW9kdWxlXCdzIG5hbWVzcGFjZSBmb3IgYSB2YXJpYWJsZSBuYW1lZCAiX19hbGxfXyI7IGlmIGRlZmluZWQsIGl0IG11c3RcbmJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aGljaCBhcmUgbmFtZXMgZGVmaW5lZCBvciBpbXBvcnRlZCBieSB0aGF0XG5tb2R1bGUuICBUaGUgbmFtZXMgZ2l2ZW4gaW4gIl9fYWxsX18iIGFyZSBhbGwgY29uc2lkZXJlZCBwdWJsaWMgYW5kXG5hcmUgcmVxdWlyZWQgdG8gZXhpc3QuICBJZiAiX19hbGxfXyIgaXMgbm90IGRlZmluZWQsIHRoZSBzZXQgb2YgcHVibGljXG5uYW1lcyBpbmNsdWRlcyBhbGwgbmFtZXMgZm91bmQgaW4gdGhlIG1vZHVsZVwncyBuYW1lc3BhY2Ugd2hpY2ggZG8gbm90XG5iZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyICgiXCdfXCciKS4gICJfX2FsbF9fIiBzaG91bGQgY29udGFpblxudGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZCBhY2NpZGVudGFsbHkgZXhwb3J0aW5nXG5pdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCB3ZXJlXG5pbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG5cblRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIgLS0tIGlzIG9ubHlcbmFsbG93ZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4gIEF0dGVtcHRpbmcgdG8gdXNlIGl0IGluIGNsYXNzIG9yXG5mdW5jdGlvbiBkZWZpbml0aW9ucyB3aWxsIHJhaXNlIGEgIlN5bnRheEVycm9yIi5cblxuV2hlbiBzcGVjaWZ5aW5nIHdoYXQgbW9kdWxlIHRvIGltcG9ydCB5b3UgZG8gbm90IGhhdmUgdG8gc3BlY2lmeSB0aGVcbmFic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzIGNvbnRhaW5lZFxud2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0IHdpdGhpblxudGhlIHNhbWUgdG9wIHBhY2thZ2Ugd2l0aG91dCBoYXZpbmcgdG8gbWVudGlvbiB0aGUgcGFja2FnZSBuYW1lLiBCeVxudXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgImZyb20iIHlvdVxuY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHlcbndpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50XG5wYWNrYWdlIHdoZXJlIHRoZSBtb2R1bGUgbWFraW5nIHRoZSBpbXBvcnQgZXhpc3RzLiBUd28gZG90cyBtZWFucyB1cFxub25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgZXhlY3V0ZVxuImZyb20gLiBpbXBvcnQgbW9kIiBmcm9tIGEgbW9kdWxlIGluIHRoZSAicGtnIiBwYWNrYWdlIHRoZW4geW91IHdpbGxcbmVuZCB1cCBpbXBvcnRpbmcgInBrZy5tb2QiLiBJZiB5b3UgZXhlY3V0ZSAiZnJvbSAuLnN1YnBrZzIgaW1wb3J0IG1vZCJcbmZyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGVcbnNwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXMgY29udGFpbmVkIHdpdGhpbiAqKlBFUCAzMjgqKi5cblxuImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXRcbmRldGVybWluZSBkeW5hbWljYWxseSB0aGUgbW9kdWxlcyB0byBiZSBsb2FkZWQuXG5cblxuRnV0dXJlIHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09XG5cbkEgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgcGFydGljdWxhclxubW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZVxuYXZhaWxhYmxlIGluIGEgc3BlY2lmaWVkIGZ1dHVyZSByZWxlYXNlIG9mIFB5dGhvbiB3aGVyZSB0aGUgZmVhdHVyZVxuYmVjb21lcyBzdGFuZGFyZC5cblxuVGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlIHZlcnNpb25zXG5vZiBQeXRob24gdGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlLiAgSXRcbmFsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZVxucmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLlxuXG4gICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIlxuICAgZmVhdHVyZSAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuICAgbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgbmVhciB0aGUgdG9wIG9mIHRoZSBtb2R1bGUuICBUaGUgb25seVxubGluZXMgdGhhdCBjYW4gYXBwZWFyIGJlZm9yZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlOlxuXG4qIHRoZSBtb2R1bGUgZG9jc3RyaW5nIChpZiBhbnkpLFxuXG4qIGNvbW1lbnRzLFxuXG4qIGJsYW5rIGxpbmVzLCBhbmRcblxuKiBvdGhlciBmdXR1cmUgc3RhdGVtZW50cy5cblxuVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDMuMCBhcmUgImFic29sdXRlX2ltcG9ydCIsXG4iZGl2aXNpb24iLCAiZ2VuZXJhdG9ycyIsICJ1bmljb2RlX2xpdGVyYWxzIiwgInByaW50X2Z1bmN0aW9uIixcbiJuZXN0ZWRfc2NvcGVzIiBhbmQgIndpdGhfc3RhdGVtZW50Ii4gIFRoZXkgYXJlIGFsbCByZWR1bmRhbnQgYmVjYXVzZVxudGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgcmVjb2duaXplZCBhbmQgdHJlYXRlZCBzcGVjaWFsbHkgYXQgY29tcGlsZVxudGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW5cbmltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgZGlmZmVyZW50IGNvZGUuICBJdCBtYXkgZXZlbiBiZSB0aGUgY2FzZVxudGhhdCBhIG5ldyBmZWF0dXJlIGludHJvZHVjZXMgbmV3IGluY29tcGF0aWJsZSBzeW50YXggKHN1Y2ggYXMgYSBuZXdcbnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGVcbm1vZHVsZSBkaWZmZXJlbnRseS4gIFN1Y2ggZGVjaXNpb25zIGNhbm5vdCBiZSBwdXNoZWQgb2ZmIHVudGlsXG5ydW50aW1lLlxuXG5Gb3IgYW55IGdpdmVuIHJlbGVhc2UsIHRoZSBjb21waWxlciBrbm93cyB3aGljaCBmZWF0dXJlIG5hbWVzIGhhdmVcbmJlZW4gZGVmaW5lZCwgYW5kIHJhaXNlcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZ1dHVyZSBzdGF0ZW1lbnRcbmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuXG5cblRoZSBkaXJlY3QgcnVudGltZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGZvciBhbnkgaW1wb3J0IHN0YXRlbWVudDpcbnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgd2lsbFxuYmUgaW1wb3J0ZWQgaW4gdGhlIHVzdWFsIHdheSBhdCB0aGUgdGltZSB0aGUgZnV0dXJlIHN0YXRlbWVudCBpc1xuZXhlY3V0ZWQuXG5cblRoZSBpbnRlcmVzdGluZyBydW50aW1lIHNlbWFudGljcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGZlYXR1cmVcbmVuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuXG5cbk5vdGUgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHN0YXRlbWVudDpcblxuICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdXG5cblRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXRcJ3MgYW4gb3JkaW5hcnkgaW1wb3J0IHN0YXRlbWVudCB3aXRoXG5ubyBzcGVjaWFsIHNlbWFudGljcyBvciBzeW50YXggcmVzdHJpY3Rpb25zLlxuXG5Db2RlIGNvbXBpbGVkIGJ5IGNhbGxzIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImV4ZWMoKSIgYW5kXG4iY29tcGlsZSgpIiB0aGF0IG9jY3VyIGluIGEgbW9kdWxlICJNIiBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudFxud2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggdGhlXG5mdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4gYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbiJjb21waWxlKCkiIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBmb3IgZGV0YWlscy5cblxuQSBmdXR1cmUgc3RhdGVtZW50IHR5cGVkIGF0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdCB3aWxsXG50YWtlIGVmZmVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVycHJldGVyIHNlc3Npb24uICBJZiBhblxuaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAqLWkqIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWVcbnRvIGV4ZWN1dGUsIGFuZCB0aGUgc2NyaXB0IGluY2x1ZGVzIGEgZnV0dXJlIHN0YXRlbWVudCwgaXQgd2lsbCBiZSBpblxuZWZmZWN0IGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHNjcmlwdCBpc1xuZXhlY3V0ZWQuXG5cblNlZSBhbHNvOiAqKlBFUCAyMzYqKiAtIEJhY2sgdG8gdGhlIF9fZnV0dXJlX19cblxuICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS5cbicsCi0gJ2luJzogdSdcbk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG4nLAorICdpbic6IHUnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCAieCA8IHkgPD0geiIgaXNcbmVxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgZXZhbHVhdGVkIG9ubHlcbm9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgeSIgaXNcbmZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHoiIGlzIGVxdWl2YWxlbnQgdG8gImEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6IiwgZXhjZXB0XG50aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb24gYmV0d2VlblxuKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sICJ4IDwgeSA+IHoiIGlzIHBlcmZlY3RseSBsZWdhbCAodGhvdWdoXG5wZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlIHRoZSB2YWx1ZXNcbm9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlLiBJZiBib3RoIGFyZVxubnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsIHRoZSAiPT0iIGFuZFxuIiE9IiBvcGVyYXRvcnMgKmFsd2F5cyogY29uc2lkZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdG8gYmVcbnVuZXF1YWwsIHdoaWxlIHRoZSAiPCIsICI+IiwgIj49IiBhbmQgIjw9IiBvcGVyYXRvcnMgcmFpc2UgYVxuIlR5cGVFcnJvciIgd2hlbiBjb21wYXJpbmcgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdCBkbyBub3RcbmltcGxlbWVudCB0aGVzZSBvcGVyYXRvcnMgZm9yIHRoZSBnaXZlbiBwYWlyIG9mIHR5cGVzLiAgWW91IGNhblxuY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mIG9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5XG5kZWZpbmluZyByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBsaWtlICJfX2d0X18oKSIsIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4qQmFzaWMgY3VzdG9taXphdGlvbiouXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6XG5cbiogTnVtYmVycyBhcmUgY29tcGFyZWQgYXJpdGhtZXRpY2FsbHkuXG5cbiogVGhlIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlIHNwZWNpYWwuIFRoZXlcbiAgYXJlIGlkZW50aWNhbCB0byB0aGVtc2VsdmVzLCAieCBpcyB4IiBidXQgYXJlIG5vdCBlcXVhbCB0b1xuICB0aGVtc2VsdmVzLCAieCAhPSB4Ii4gIEFkZGl0aW9uYWxseSwgY29tcGFyaW5nIGFueSB2YWx1ZSB0byBhXG4gIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAiRmFsc2UiLiAgRm9yIGV4YW1wbGUsIGJvdGggIjMgPFxuICBmbG9hdChcJ05hTlwnKSIgYW5kICJmbG9hdChcJ05hTlwnKSA8IDMiIHdpbGwgcmV0dXJuICJGYWxzZSIuXG5cbiogQnl0ZXMgb2JqZWN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWNcbiAgdmFsdWVzIG9mIHRoZWlyIGVsZW1lbnRzLlxuXG4qIFN0cmluZ3MgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljXG4gIGVxdWl2YWxlbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAib3JkKCkiKSBvZiB0aGVpclxuICBjaGFyYWN0ZXJzLiBbM10gU3RyaW5nIGFuZCBieXRlcyBvYmplY3QgY2FuXCd0IGJlIGNvbXBhcmVkIVxuXG4qIFR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb25cbiAgb2YgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoXG4gIGVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuXG4gIElmIG5vdCBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdFxuICBkaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgIlsxLDIseF0gPD0gWzEsMix5XSIgaGFzIHRoZSBzYW1lXG4gIHZhbHVlIGFzICJ4IDw9IHkiLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzIG5vdCBleGlzdCwgdGhlXG4gIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsICJbMSwyXSA8IFsxLDIsM10iKS5cblxuKiBNYXBwaW5ncyAoZGljdGlvbmFyaWVzKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGVcbiAgc2FtZSAiKGtleSwgdmFsdWUpIiBwYWlycy4gT3JkZXIgY29tcGFyaXNvbnMgIihcJzxcJywgXCc8PVwnLCBcJz49XCcsXG4gIFwnPlwnKSIgcmFpc2UgIlR5cGVFcnJvciIuXG5cbiogU2V0cyBhbmQgZnJvemVuc2V0cyBkZWZpbmUgY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gbWVhbiBzdWJzZXQgYW5kXG4gIHN1cGVyc2V0IHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzICh0aGVcbiAgdHdvIHNldHMgInsxLDJ9IiBhbmQgezIsM30gYXJlIG5vdCBlcXVhbCwgbm9yIHN1YnNldHMgb2Ygb25lXG4gIGFub3RoZXIsIG5vciBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXIpLiAgQWNjb3JkaW5nbHksIHNldHMgYXJlIG5vdFxuICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgb3JkZXJpbmcuXG4gIEZvciBleGFtcGxlLCAibWluKCkiLCAibWF4KCkiLCBhbmQgInNvcnRlZCgpIiBwcm9kdWNlIHVuZGVmaW5lZFxuICByZXN1bHRzIGdpdmVuIGEgbGlzdCBvZiBzZXRzIGFzIGlucHV0cy5cblxuKiBNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHQtaW4gdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5XG4gIGFyZSB0aGUgc2FtZSBvYmplY3Q7IHRoZSBjaG9pY2Ugd2hldGhlciBvbmUgb2JqZWN0IGlzIGNvbnNpZGVyZWRcbiAgc21hbGxlciBvciBsYXJnZXIgdGhhbiBhbm90aGVyIG9uZSBpcyBtYWRlIGFyYml0cmFyaWx5IGJ1dFxuICBjb25zaXN0ZW50bHkgd2l0aGluIG9uZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtLlxuXG5Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgZGlmZmVyaW5nIHR5cGVzIGRlcGVuZHMgb24gd2hldGhlciBlaXRoZXIgb2ZcbnRoZSB0eXBlcyBwcm92aWRlIGV4cGxpY2l0IHN1cHBvcnQgZm9yIHRoZSBjb21wYXJpc29uLiAgTW9zdCBudW1lcmljXG50eXBlcyBjYW4gYmUgY29tcGFyZWQgd2l0aCBvbmUgYW5vdGhlci4gIFdoZW4gY3Jvc3MtdHlwZSBjb21wYXJpc29uIGlzXG5ub3Qgc3VwcG9ydGVkLCB0aGUgY29tcGFyaXNvbiBtZXRob2QgcmV0dXJucyAiTm90SW1wbGVtZW50ZWQiLlxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG5cblRoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCBpcyB5IiBpc1xudHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgbm90IHkiXG55aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKICAnaW50ZWdlcnMnOiB1J1xuSW50ZWdlciBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5JbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8IGJpbmludGVnZXJcbiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuICAgZGlnaXQgICAgICAgICAgOjo9ICIwIi4uLiI5IlxuICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbiAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4gICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0K1xuICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG5cblRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSB3aGF0XG5jYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cbk5vdGUgdGhhdCBsZWFkaW5nIHplcm9zIGluIGEgbm9uLXplcm8gZGVjaW1hbCBudW1iZXIgYXJlIG5vdCBhbGxvd2VkLlxuVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob25cbnVzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuXG5Tb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6XG5cbiAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4ZGVhZGJlZWZcbicsCiAgJ2xhbWJkYSc6IHUnXG5MYW1iZGFzXG4qKioqKioqXG5cbiAgIGxhbWJkYV9leHByICAgICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuICAgbGFtYmRhX2V4cHJfbm9jb25kIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uX25vY29uZFxuXG5MYW1iZGEgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgbGFtYmRhIGZvcm1zKSBhcmUgdXNlZCB0byBjcmVhdGVcbmFub255bW91cyBmdW5jdGlvbnMuIFRoZSBleHByZXNzaW9uICJsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uIlxueWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uXG5vYmplY3QgZGVmaW5lZCB3aXRoXG5cbiAgIGRlZiA8bGFtYmRhPihhcmd1bWVudHMpOlxuICAgICAgIHJldHVybiBleHByZXNzaW9uXG5cblNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyIGxpc3RzLlxuTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluXG5zdGF0ZW1lbnRzIG9yIGFubm90YXRpb25zLlxuJywKICAnbGlzdHMnOiB1J1xuTGlzdCBkaXNwbGF5c1xuKioqKioqKioqKioqKlxuXG5BIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCBpblxuc3F1YXJlIGJyYWNrZXRzOlxuXG4gICBsaXN0X2Rpc3BsYXkgOjo9ICJbIiBbZXhwcmVzc2lvbl9saXN0IHwgY29tcHJlaGVuc2lvbl0gIl0iXG5cbkEgbGlzdCBkaXNwbGF5IHlpZWxkcyBhIG5ldyBsaXN0IG9iamVjdCwgdGhlIGNvbnRlbnRzIGJlaW5nIHNwZWNpZmllZFxuYnkgZWl0aGVyIGEgbGlzdCBvZiBleHByZXNzaW9ucyBvciBhIGNvbXByZWhlbnNpb24uICBXaGVuIGEgY29tbWEtXG5zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWRcbmZyb20gbGVmdCB0byByaWdodCBhbmQgcGxhY2VkIGludG8gdGhlIGxpc3Qgb2JqZWN0IGluIHRoYXQgb3JkZXIuXG5XaGVuIGEgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGVcbmVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLlxuJywKLSAnbmFtaW5nJzogdSdcbk5hbWluZyBhbmQgYmluZGluZ1xuKioqKioqKioqKioqKioqKioqXG5cblxuQmluZGluZyBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZVxubW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGVcbmNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZVxuYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgKmJpbmRpbmcqXG5vZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG5cblxuUmVzb2x1dGlvbiBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PT09PVxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmXG50aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWxcbnZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSB0aGVcbm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCBmaXJzdC4gIElmXG50aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICBUaGVcbiJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbiJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdFxuZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlXG5zcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuXG5leGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgcmVmZXJlbmNlc1xuZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0XG51bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBUaGVcbm5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSBvZlxudGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG9cbnRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tXG50aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSBhcmVcbmltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZ1xud2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuXG5CdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCisgJ25hbWluZyc6IHUnXG5OYW1pbmcgYW5kIGJpbmRpbmdcbioqKioqKioqKioqKioqKioqKlxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuIEVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG9cbnRoZSAqYmluZGluZyogb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGluIHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gYmxvY2tcbmNvbnRhaW5pbmcgdGhlIHVzZS5cblxuQSAqYmxvY2sqIGlzIGEgcGllY2Ugb2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGFcbnVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlIGJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3NcbmRlZmluaXRpb24uIEVhY2ggY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdFxuZmlsZSAoYSBmaWxlIGdpdmVuIGFzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWRcbmFzIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHRoZSBpbnRlcnByZXRlcikgaXMgYSBjb2RlIGJsb2NrLiAgQVxuc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgXCcqKi1jKipcJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBzdHJpbmcgYXJndW1lbnQgcGFzc2VkXG50byB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJldmFsKCkiIGFuZCAiZXhlYygpIiBpcyBhIGNvZGUgYmxvY2suXG5cbkEgY29kZSBibG9jayBpcyBleGVjdXRlZCBpbiBhbiAqZXhlY3V0aW9uIGZyYW1lKi4gIEEgZnJhbWUgY29udGFpbnNcbnNvbWUgYWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24gKHVzZWQgZm9yIGRlYnVnZ2luZykgYW5kIGRldGVybWluZXNcbndoZXJlIGFuZCBob3cgZXhlY3V0aW9uIGNvbnRpbnVlcyBhZnRlciB0aGUgY29kZSBibG9ja1wncyBleGVjdXRpb24gaGFzXG5jb21wbGV0ZWQuXG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLiAgVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYVxuY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0byB0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGVcbmNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS0gdGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yXG5leHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpc1xubWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZSBtb2R1bGVcbmxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGUgY29kZVxuYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9ja1xuYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuSWYgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQsIGFuXG4iVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuICAiVW5ib3VuZExvY2FsRXJyb3IiIGlzIGFcbnN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuImltcG9ydCIgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZVxuY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0IGFyZVxuaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsICJmb3IiIGxvb3AgaGVhZGVyLCBvciBhZnRlclxuImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQgb3IgImV4Y2VwdCIgY2xhdXNlLiBUaGUgImltcG9ydCIgc3RhdGVtZW50XG5vZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZVxuaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybVxubWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSAiZGVsIiBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWZcbnRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZC4gIFRoZVxuImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2tcbmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzIGdsb2JhbFxubmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSBsYXR0ZXIgY2FzZVxudGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIl9fbWFpbl9fIlxubW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gaW4gYW55XG5vdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGVcbiJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbiJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgImltcG9ydCJcbnRoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbiJfX21haW5fXyIuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmVcbm5hbWVzLiBUaGVzZSByZWZlcmVuY2VzIGZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24uXG5UaGUgbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5XG5vZiB0aGUgY2xhc3MuICBOYW1lcyBkZWZpbmVkIGF0IHRoZSBjbGFzcyBzY29wZSBhcmUgbm90IHZpc2libGUgaW5cbm1ldGhvZHMuXG5cblxuSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCiAgJ25vbmxvY2FsJzogdSdcblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIG5vbmxvY2FsX3N0bXQgOjo9ICJub25sb2NhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBleGNsdWRpbmdcbmdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGJpbmRpbmcgaXNcbnRvIHNlYXJjaCB0aGUgbG9jYWwgbmFtZXNwYWNlIGZpcnN0LiAgVGhlIHN0YXRlbWVudCBhbGxvd3NcbmVuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgbG9jYWwgc2NvcGVcbmJlc2lkZXMgdGhlIGdsb2JhbCAobW9kdWxlKSBzY29wZS5cblxuTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQsIHVubGlrZSB0aG9zZSBsaXN0ZWQgaW4gYVxuImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhblxuZW5jbG9zaW5nIHNjb3BlICh0aGUgc2NvcGUgaW4gd2hpY2ggYSBuZXcgYmluZGluZyBzaG91bGQgYmUgY3JlYXRlZFxuY2Fubm90IGJlIGRldGVybWluZWQgdW5hbWJpZ3VvdXNseSkuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50IG11c3Qgbm90IGNvbGxpZGUgd2l0aCBwcmUtXG5leGlzdGluZyBiaW5kaW5ncyBpbiB0aGUgbG9jYWwgc2NvcGUuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA0KiogLSBBY2Nlc3MgdG8gTmFtZXMgaW4gT3V0ZXIgU2NvcGVzXG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC5cbicsCiAgJ251bWJlcnMnOiB1J1xuTnVtZXJpYyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8gY29tcGxleCBsaXRlcmFsc1xuKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhblxuaW1hZ2luYXJ5IG51bWJlcikuXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBcJyItIlwnIGFuZCB0aGVcbmxpdGVyYWwgIjEiLlxuJywKICAnbnVtZXJpYy10eXBlcyc6IHUnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJywKICAnb2JqZWN0cyc6IHUnXG5PYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbipPYmplY3RzKiBhcmUgUHl0aG9uXCdzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSBQeXRob25cbnByb2dyYW0gaXMgcmVwcmVzZW50ZWQgYnkgb2JqZWN0cyBvciBieSByZWxhdGlvbnMgYmV0d2VlbiBvYmplY3RzLiAoSW5cbmEgc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFublwncyBtb2RlbCBvZiBhICJzdG9yZWRcbnByb2dyYW0gY29tcHV0ZXIsIiBjb2RlIGlzIGFsc28gcmVwcmVzZW50ZWQgYnkgb2JqZWN0cy4pXG5cbkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdFwnc1xuKmlkZW50aXR5KiBuZXZlciBjaGFuZ2VzIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZDsgeW91IG1heSB0aGluayBvZiBpdFxuYXMgdGhlIG9iamVjdFwncyBhZGRyZXNzIGluIG1lbW9yeS4gIFRoZSBcJyJpcyJcJyBvcGVyYXRvciBjb21wYXJlcyB0aGVcbmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxucmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgbWVtb3J5XG5hZGRyZXNzIHdoZXJlICJ4IiBpcyBzdG9yZWQuXG5cbkFuIG9iamVjdFwncyB0eXBlIGRldGVybWluZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0IHN1cHBvcnRzXG4oZS5nLiwgImRvZXMgaXQgaGF2ZSBhIGxlbmd0aD8iKSBhbmQgYWxzbyBkZWZpbmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXNcbmZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdFwnc1xudHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gb2JqZWN0XCdzXG4qdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXVxuXG5UaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHMgd2hvc2UgdmFsdWUgY2FuXG5jaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzIHVuY2hhbmdlYWJsZVxub25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGUgdmFsdWUgb2YgYW5cbmltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlXG5vYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXJcJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlciB0aGVcbmNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZlxub2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG5zdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlIHN1YnRsZS4pXG5BbiBvYmplY3RcJ3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG5udW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZFxubGlzdHMgYXJlIG11dGFibGUuXG5cbk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG5hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzXG5hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbmltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxucmVhY2hhYmxlLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSByZWZlcmVuY2UtXG5jb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkXG5nYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImdjIiBtb2R1bGUgZm9yXG5pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXJcbmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZFxub24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgKHNvXG55b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS5cblxuTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uXCdzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG5mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS5cbkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCcidHJ5Ii4uLiJleGNlcHQiXCdcbnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgb3BlblxuZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkXG53aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG9cbnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgImNsb3NlKCkiIG1ldGhvZC4gUHJvZ3JhbXNcbmFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuXCcidHJ5Ii4uLiJmaW5hbGx5IlwnIHN0YXRlbWVudCBhbmQgdGhlIFwnIndpdGgiXCcgc3RhdGVtZW50IHByb3ZpZGVcbmNvbnZlbmllbnQgd2F5cyB0byBkbyB0aGlzLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSBjYWxsZWRcbipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyXCdzIHZhbHVlLiAgSW5cbm1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZVxudmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlXG50YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZVxuaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG5jb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzXG52YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cblxuVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZVxudHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG5yZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZVxuZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgImEgPSAxOyBiID0gMSIsXG4iYSIgYW5kICJiIiBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUgdmFsdWVcbm9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyICJjID0gW107IGQgPSBbXSIsICJjIlxuYW5kICJkIiBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5XG5jcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0ICJjID0gZCA9IFtdIiBhc3NpZ25zIHRoZSBzYW1lIG9iamVjdFxudG8gYm90aCAiYyIgYW5kICJkIi4pXG4nLAotICdvcGVyYXRvci1zdW1tYXJ5JzogdSdcbk9wZXJhdG9yIHByZWNlZGVuY2VcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIGluIFB5dGhvbiwgZnJvbVxubG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdFxuYmluZGluZykuICBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzc1xudGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpblxudGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgZXhwb25lbnRpYXRpb24sIHdoaWNoXG5ncm91cHMgZnJvbSByaWdodCB0byBsZWZ0KS5cblxuTm90ZSB0aGF0IGNvbXBhcmlzb25zLCBtZW1iZXJzaGlwIHRlc3RzLCBhbmQgaWRlbnRpdHkgdGVzdHMsIGFsbCBoYXZlXG50aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyBmZWF0dXJlIGFzXG5kZXNjcmliZWQgaW4gdGhlICpDb21wYXJpc29ucyogc2VjdGlvbi5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xufCAibGFtYmRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhbWJkYSBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaWYiIC0tICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAibm90IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaW4iLCAibm90IGluIiwgImlzIiwgImlzIG5vdCIsICI8IiwgIjw9IiwgIj4iLCB8IENvbXBhcmlzb25zLCBpbmNsdWRpbmcgbWVtYmVyc2hpcCAgICAgfFxufCAiPj0iLCAiIT0iLCAiPT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiXiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiJiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiPDwiLCAiPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKyIsICItIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIgICAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBtYXRyaXggbXVsdGlwbGljYXRpb24gfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpdmlzaW9uLCByZW1haW5kZXIgWzVdICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiK3giLCAiLXgiLCAifngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKioiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4cG9uZW50aWF0aW9uIFs2XSAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYXdhaXQiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEF3YWl0IGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAieFtpbmRleF0iLCAieFtpbmRleDppbmRleF0iLCAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfFxufCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKGV4cHJlc3Npb25zLi4uKSIsICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6ICB8IEJpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgbGlzdCAgICAgICAgfFxufCB2YWx1ZS4uLn0iLCAie2V4cHJlc3Npb25zLi4ufSIgICAgICAgICAgICAgICAgICB8IGRpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0ICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFdoaWxlICJhYnMoeCV5KSA8IGFicyh5KSIgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0c1xuICAgIGl0IG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCAiLTFlLTEwMCAlIDFlMTAwIiBoYXZlIHRoZSBzYW1lXG4gICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgMWUxMDAiLCB3aGljaFxuICAgIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gIjFlMTAwIi4gIFRoZSBmdW5jdGlvblxuICAgICJtYXRoLmZtb2QoKSIgcmV0dXJucyBhIHJlc3VsdCB3aG9zZSBzaWduIG1hdGNoZXMgdGhlIHNpZ24gb2YgdGhlXG4gICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluIHRoaXMgY2FzZS5cbiAgICBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlIGFwcGxpY2F0aW9uLlxuXG5bMl0gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgeSwgaXRcJ3NcbiAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAiKHgteCV5KS8veSIgZHVlIHRvXG4gICAgcm91bmRpbmcuICBJbiBzdWNoIGNhc2VzLCBQeXRob24gcmV0dXJucyB0aGUgbGF0dGVyIHJlc3VsdCwgaW5cbiAgICBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0ICJkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeSIgYmUgdmVyeSBjbG9zZVxuICAgIHRvICJ4Ii5cblxuWzNdIFRoZSBVbmljb2RlIHN0YW5kYXJkIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAqY29kZSBwb2ludHMqIChlLmcuXG4gICAgVSswMDQxKSBhbmQgKmFic3RyYWN0IGNoYXJhY3RlcnMqIChlLmcuICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIikuXG4gICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgcmVwcmVzZW50ZWRcbiAgICB1c2luZyBvbmUgY29kZSBwb2ludCwgdGhlcmUgaXMgYSBudW1iZXIgb2YgYWJzdHJhY3QgY2hhcmFjdGVyc1xuICAgIHRoYXQgY2FuIGluIGFkZGl0aW9uIGJlIHJlcHJlc2VudGVkIHVzaW5nIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuXG4gICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciAiTEFUSU5cbiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSIgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlXG4gICAgKnByZWNvbXBvc2VkIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwQzcsIG9yIGFzIGEgc2VxdWVuY2VcbiAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOIENBUElUQUxcbiAgICBMRVRURVIgQyksIGZvbGxvd2VkIGJ5IGEgKmNvbWJpbmluZyBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb25cbiAgICBVKzAzMjcgKENPTUJJTklORyBDRURJTExBKS5cblxuICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlIGxldmVsIG9mXG4gICAgVW5pY29kZSBjb2RlIHBvaW50cy4gVGhpcyBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gaHVtYW5zLiAgRm9yXG4gICAgZXhhbXBsZSwgIiJcXHUwMEM3IiA9PSAiXFx1MDA0M1xcdTAzMjciIiBpcyAiRmFsc2UiLCBldmVuIHRob3VnaCBib3RoXG4gICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTiBDQVBJVEFMXG4gICAgTEVUVEVSIEMgV0lUSCBDRURJTExBIi5cblxuICAgIFRvIGNvbXBhcmUgc3RyaW5ncyBhdCB0aGUgbGV2ZWwgb2YgYWJzdHJhY3QgY2hhcmFjdGVycyAodGhhdCBpcyxcbiAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICJ1bmljb2RlZGF0YS5ub3JtYWxpemUoKSIuXG5cbls0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZVxuICAgIGR5bmFtaWMgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbFxuICAgIGJlaGF2aW91ciBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlICJpcyIgb3BlcmF0b3IsIGxpa2UgdGhvc2VcbiAgICBpbnZvbHZpbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciBjb25zdGFudHMuXG4gICAgQ2hlY2sgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bNV0gVGhlICIlIiBvcGVyYXRvciBpcyBhbHNvIHVzZWQgZm9yIHN0cmluZyBmb3JtYXR0aW5nOyB0aGUgc2FtZVxuICAgIHByZWNlZGVuY2UgYXBwbGllcy5cblxuWzZdIFRoZSBwb3dlciBvcGVyYXRvciAiKioiIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuIGFyaXRobWV0aWNcbiAgICBvciBiaXR3aXNlIHVuYXJ5IG9wZXJhdG9yIG9uIGl0cyByaWdodCwgdGhhdCBpcywgIjIqKi0xIiBpcyAiMC41Ii5cbicsCisgJ29wZXJhdG9yLXN1bW1hcnknOiB1J1xuT3BlcmF0b3IgcHJlY2VkZW5jZVxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgaW4gUHl0aG9uLCBmcm9tXG5sb3dlc3QgcHJlY2VkZW5jZSAobGVhc3QgYmluZGluZykgdG8gaGlnaGVzdCBwcmVjZWRlbmNlIChtb3N0XG5iaW5kaW5nKS4gIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLiAgVW5sZXNzXG50aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgT3BlcmF0b3JzIGluXG50aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2hcbmdyb3VwcyBmcm9tIHJpZ2h0IHRvIGxlZnQpLlxuXG5Ob3RlIHRoYXQgY29tcGFyaXNvbnMsIG1lbWJlcnNoaXAgdGVzdHMsIGFuZCBpZGVudGl0eSB0ZXN0cywgYWxsIGhhdmVcbnRoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGhhdmUgYSBsZWZ0LXRvLXJpZ2h0IGNoYWluaW5nIGZlYXR1cmUgYXNcbmRlc2NyaWJlZCBpbiB0aGUgKkNvbXBhcmlzb25zKiBzZWN0aW9uLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJsYW1iZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJpZiIgLS0gImVsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJvciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJub3QiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJpbiIsICJub3QgaW4iLCAiaXMiLCAiaXMgbm90IiwgIjwiLCAiPD0iLCAiPiIsIHwgQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgICB8XG58ICI+PSIsICIhPSIsICI9PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGVzdHMgYW5kIGlkZW50aXR5IHRlc3RzICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJ8IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICImIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICI8PCIsICI+PiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hpZnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIrIiwgIi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiAgICAgICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpb24sIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGl2aXNpb24sIHJlbWFpbmRlciBbNV0gICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIreCIsICIteCIsICJ+eCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIqKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhwb25lbnRpYXRpb24gWzZdICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJhd2FpdCIgIngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXdhaXQgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJ4W2luZGV4XSIsICJ4W2luZGV4OmluZGV4XSIsICAgICAgICAgICAgICAgICAgIHwgU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8XG58ICJ4KGFyZ3VtZW50cy4uLikiLCAieC5hdHRyaWJ1dGUiICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlIHJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIoZXhwcmVzc2lvbnMuLi4pIiwgIltleHByZXNzaW9ucy4uLl0iLCAie2tleTogIHwgQmluZGluZyBvciB0dXBsZSBkaXNwbGF5LCBsaXN0ICAgICAgICB8XG58IHZhbHVlLi4ufSIsICJ7ZXhwcmVzc2lvbnMuLi59IiAgICAgICAgICAgICAgICAgIHwgZGlzcGxheSwgZGljdGlvbmFyeSBkaXNwbGF5LCBzZXQgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gV2hpbGUgImFicyh4JXkpIDwgYWJzKHkpIiBpcyB0cnVlIG1hdGhlbWF0aWNhbGx5LCBmb3IgZmxvYXRzXG4gICAgaXQgbWF5IG5vdCBiZSB0cnVlIG51bWVyaWNhbGx5IGR1ZSB0byByb3VuZG9mZi4gIEZvciBleGFtcGxlLCBhbmRcbiAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuIElFRUUgNzU0IGRvdWJsZS1cbiAgICBwcmVjaXNpb24gbnVtYmVyLCBpbiBvcmRlciB0aGF0ICItMWUtMTAwICUgMWUxMDAiIGhhdmUgdGhlIHNhbWVcbiAgICBzaWduIGFzICIxZTEwMCIsIHRoZSBjb21wdXRlZCByZXN1bHQgaXMgIi0xZS0xMDAgKyAxZTEwMCIsIHdoaWNoXG4gICAgaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byAiMWUxMDAiLiAgVGhlIGZ1bmN0aW9uXG4gICAgIm1hdGguZm1vZCgpIiByZXR1cm5zIGEgcmVzdWx0IHdob3NlIHNpZ24gbWF0Y2hlcyB0aGUgc2lnbiBvZiB0aGVcbiAgICBmaXJzdCBhcmd1bWVudCBpbnN0ZWFkLCBhbmQgc28gcmV0dXJucyAiLTFlLTEwMCIgaW4gdGhpcyBjYXNlLlxuICAgIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgYXBwbGljYXRpb24uXG5cblsyXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdFwnc1xuICAgIHBvc3NpYmxlIGZvciAieC8veSIgdG8gYmUgb25lIGxhcmdlciB0aGFuICIoeC14JXkpLy95IiBkdWUgdG9cbiAgICByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LCBpblxuICAgIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgImRpdm1vZCh4LHkpWzBdICogeSArIHggJSB5IiBiZSB2ZXJ5IGNsb3NlXG4gICAgdG8gIngiLlxuXG5bM10gV2hpbGUgY29tcGFyaXNvbnMgYmV0d2VlbiBzdHJpbmdzIG1ha2Ugc2Vuc2UgYXQgdGhlIGJ5dGVcbiAgICBsZXZlbCwgdGhleSBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gdXNlcnMuICBGb3IgZXhhbXBsZSwgdGhlXG4gICAgc3RyaW5ncyAiIlxcdTAwQzciIiBhbmQgIiJcXHUwMzI3XFx1MDA0MyIiIGNvbXBhcmUgZGlmZmVyZW50bHksIGV2ZW5cbiAgICB0aG91Z2ggdGhleSBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSB1bmljb2RlIGNoYXJhY3RlciAoTEFUSU5cbiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSkuICBUbyBjb21wYXJlIHN0cmluZ3MgaW4gYSBodW1hblxuICAgIHJlY29nbml6YWJsZSB3YXksIGNvbXBhcmUgdXNpbmcgInVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgpIi5cblxuWzRdIER1ZSB0byBhdXRvbWF0aWMgZ2FyYmFnZS1jb2xsZWN0aW9uLCBmcmVlIGxpc3RzLCBhbmQgdGhlXG4gICAgZHluYW1pYyBuYXR1cmUgb2YgZGVzY3JpcHRvcnMsIHlvdSBtYXkgbm90aWNlIHNlZW1pbmdseSB1bnVzdWFsXG4gICAgYmVoYXZpb3VyIGluIGNlcnRhaW4gdXNlcyBvZiB0aGUgImlzIiBvcGVyYXRvciwgbGlrZSB0aG9zZVxuICAgIGludm9sdmluZyBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yIGNvbnN0YW50cy5cbiAgICBDaGVjayB0aGVpciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG5cbls1XSBUaGUgIiUiIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lXG4gICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuXG5bNl0gVGhlIHBvd2VyIG9wZXJhdG9yICIqKiIgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gYW4gYXJpdGhtZXRpY1xuICAgIG9yIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCAiMioqLTEiIGlzICIwLjUiLlxuJywKICAncGFzcyc6IHUnXG5UaGUgInBhc3MiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuICAgcGFzc19zdG10IDo6PSAicGFzcyJcblxuInBhc3MiIGlzIGEgbnVsbCBvcGVyYXRpb24gLS0tIHdoZW4gaXQgaXMgZXhlY3V0ZWQsIG5vdGhpbmcgaGFwcGVucy5cbkl0IGlzIHVzZWZ1bCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWRcbnN5bnRhY3RpY2FsbHksIGJ1dCBubyBjb2RlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBmb3IgZXhhbXBsZTpcblxuICAgZGVmIGYoYXJnKTogcGFzcyAgICAjIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgKHlldClcblxuICAgY2xhc3MgQzogcGFzcyAgICAgICAjIGEgY2xhc3Mgd2l0aCBubyBtZXRob2RzICh5ZXQpXG4nLAogICdwb3dlcic6IHUnXG5UaGUgcG93ZXIgb3BlcmF0b3JcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0c1xubGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gIFRoZVxuc3ludGF4IGlzOlxuXG4gICBwb3dlciA6Oj0gYXdhaXQgWyIqKiIgdV9leHByXVxuXG5UaHVzLCBpbiBhbiB1bnBhcmVudGhlc2l6ZWQgc2VxdWVuY2Ugb2YgcG93ZXIgYW5kIHVuYXJ5IG9wZXJhdG9ycywgdGhlXG5vcGVyYXRvcnMgYXJlIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQgKHRoaXMgZG9lcyBub3QgY29uc3RyYWluXG50aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogIi0xKioyIiByZXN1bHRzIGluICItMSIuXG5cblRoZSBwb3dlciBvcGVyYXRvciBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBidWlsdC1pbiAicG93KCkiXG5mdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgYXJndW1lbnRcbnJhaXNlZCB0byB0aGUgcG93ZXIgb2YgaXRzIHJpZ2h0IGFyZ3VtZW50LiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZVxuZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIGFuZCB0aGUgcmVzdWx0IGlzIG9mIHRoYXQgdHlwZS5cblxuRm9yIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgdW5sZXNzXG50aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlOyBpbiB0aGF0IGNhc2UsIGFsbCBhcmd1bWVudHMgYXJlXG5jb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsXG4iMTAqKjIiIHJldHVybnMgIjEwMCIsIGJ1dCAiMTAqKi0yIiByZXR1cm5zICIwLjAxIi5cblxuUmFpc2luZyAiMC4wIiB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYSAiWmVyb0RpdmlzaW9uRXJyb3IiLlxuUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXIgcmVzdWx0cyBpbiBhICJjb21wbGV4IlxubnVtYmVyLiAoSW4gZWFybGllciB2ZXJzaW9ucyBpdCByYWlzZWQgYSAiVmFsdWVFcnJvciIuKVxuJywKICAncmFpc2UnOiB1J1xuVGhlICJyYWlzZSIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbImZyb20iIGV4cHJlc3Npb25dXVxuXG5JZiBubyBleHByZXNzaW9ucyBhcmUgcHJlc2VudCwgInJhaXNlIiByZS1yYWlzZXMgdGhlIGxhc3QgZXhjZXB0aW9uXG50aGF0IHdhcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBubyBleGNlcHRpb24gaXMgYWN0aXZlIGluXG50aGUgY3VycmVudCBzY29wZSwgYSAiUnVudGltZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmdcbnRoYXQgdGhpcyBpcyBhbiBlcnJvci5cblxuT3RoZXJ3aXNlLCAicmFpc2UiIGV2YWx1YXRlcyB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhcyB0aGUgZXhjZXB0aW9uXG5vYmplY3QuICBJdCBtdXN0IGJlIGVpdGhlciBhIHN1YmNsYXNzIG9yIGFuIGluc3RhbmNlIG9mXG4iQmFzZUV4Y2VwdGlvbiIuIElmIGl0IGlzIGEgY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2Ugd2lsbCBiZVxub2J0YWluZWQgd2hlbiBuZWVkZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3Mgd2l0aCBubyBhcmd1bWVudHMuXG5cblRoZSAqdHlwZSogb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGluc3RhbmNlXCdzIGNsYXNzLCB0aGVcbip2YWx1ZSogaXMgdGhlIGluc3RhbmNlIGl0c2VsZi5cblxuQSB0cmFjZWJhY2sgb2JqZWN0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuIGV4Y2VwdGlvblxuaXMgcmFpc2VkIGFuZCBhdHRhY2hlZCB0byBpdCBhcyB0aGUgIl9fdHJhY2ViYWNrX18iIGF0dHJpYnV0ZSwgd2hpY2hcbmlzIHdyaXRhYmxlLiBZb3UgY2FuIGNyZWF0ZSBhbiBleGNlcHRpb24gYW5kIHNldCB5b3VyIG93biB0cmFjZWJhY2sgaW5cbm9uZSBzdGVwIHVzaW5nIHRoZSAid2l0aF90cmFjZWJhY2soKSIgZXhjZXB0aW9uIG1ldGhvZCAod2hpY2ggcmV0dXJuc1xudGhlIHNhbWUgZXhjZXB0aW9uIGluc3RhbmNlLCB3aXRoIGl0cyB0cmFjZWJhY2sgc2V0IHRvIGl0cyBhcmd1bWVudCksXG5saWtlIHNvOlxuXG4gICByYWlzZSBFeGNlcHRpb24oImZvbyBvY2N1cnJlZCIpLndpdGhfdHJhY2ViYWNrKHRyYWNlYmFja29iailcblxuVGhlICJmcm9tIiBjbGF1c2UgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGNoYWluaW5nOiBpZiBnaXZlbiwgdGhlIHNlY29uZFxuKmV4cHJlc3Npb24qIG11c3QgYmUgYW5vdGhlciBleGNlcHRpb24gY2xhc3Mgb3IgaW5zdGFuY2UsIHdoaWNoIHdpbGxcbnRoZW4gYmUgYXR0YWNoZWQgdG8gdGhlIHJhaXNlZCBleGNlcHRpb24gYXMgdGhlICJfX2NhdXNlX18iIGF0dHJpYnV0ZVxuKHdoaWNoIGlzIHdyaXRhYmxlKS4gIElmIHRoZSByYWlzZWQgZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkLCBib3RoXG5leGNlcHRpb25zIHdpbGwgYmUgcHJpbnRlZDpcblxuICAgPj4+IHRyeTpcbiAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4gICAuLi4gZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6XG4gICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gZXhjXG4gICAuLi5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbiAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cblxuICAgVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG5cbkEgc2ltaWxhciBtZWNoYW5pc20gd29ya3MgaW1wbGljaXRseSBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluc2lkZVxuYW4gZXhjZXB0aW9uIGhhbmRsZXIgb3IgYSAiZmluYWxseSIgY2xhdXNlOiB0aGUgcHJldmlvdXMgZXhjZXB0aW9uIGlzXG50aGVuIGF0dGFjaGVkIGFzIHRoZSBuZXcgZXhjZXB0aW9uXCdzICJfX2NvbnRleHRfXyIgYXR0cmlidXRlOlxuXG4gICA+Pj4gdHJ5OlxuICAgLi4uICAgICBwcmludCgxIC8gMClcbiAgIC4uLiBleGNlcHQ6XG4gICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpXG4gICAuLi5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbiAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cblxuICAgRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkOlxuXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4gICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb25cbipUaGUgdHJ5IHN0YXRlbWVudCouXG4nLApAQCAtNjAsMTkgKzYwLDE5IEBACiAgJ3NoaWZ0aW5nJzogdSdcblNoaWZ0aW5nIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIHNoaWZ0aW5nIG9wZXJhdGlvbnMgaGF2ZSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBhcml0aG1ldGljXG5vcGVyYXRpb25zOlxuXG4gICBzaGlmdF9leHByIDo6PSBhX2V4cHIgfCBzaGlmdF9leHByICggIjw8IiB8ICI+PiIgKSBhX2V4cHJcblxuVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBpbnRlZ2VycyBhcyBhcmd1bWVudHMuICBUaGV5IHNoaWZ0IHRoZSBmaXJzdFxuYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZVxuc2Vjb25kIGFyZ3VtZW50LlxuXG5BIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgZmxvb3IgZGl2aXNpb24gYnkgInBvdygyLG4pIi5cbkEgbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggInBvdygyLG4pIi5cblxuTm90ZTogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbiAgcmVxdWlyZWQgdG8gYmUgYXQgbW9zdCAic3lzLm1heHNpemUiLiAgSWYgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpc1xuICBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFuICJPdmVyZmxvd0Vycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKICAnc2xpY2luZ3MnOiB1J1xuU2xpY2luZ3NcbioqKioqKioqXG5cbkEgc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sIGFcbnN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciBhc1xudGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yICJkZWwiIHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhIHNsaWNpbmc6XG5cbiAgIHNsaWNpbmcgICAgICA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSJcbiAgIHNsaWNlX2xpc3QgICA6Oj0gc2xpY2VfaXRlbSAoIiwiIHNsaWNlX2l0ZW0pKiBbIiwiXVxuICAgc2xpY2VfaXRlbSAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlXG4gICBwcm9wZXJfc2xpY2UgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0gWyAiOiIgW3N0cmlkZV0gXVxuICAgbG93ZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4gICB1cHBlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb25cbiAgIHN0cmlkZSAgICAgICA6Oj0gZXhwcmVzc2lvblxuXG5UaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlXG5hbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55IHN1YnNjcmlwdGlvblxuY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2xpY2luZy4gIFJhdGhlciB0aGFuIGZ1cnRoZXIgY29tcGxpY2F0aW5nIHRoZVxuc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0XG5jb250YWlucyBubyBwcm9wZXIgc2xpY2UpLlxuXG5UaGUgc2VtYW50aWNzIGZvciBhIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBpcyBpbmRleGVkXG4odXNpbmcgdGhlIHNhbWUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZCBhcyBub3JtYWwgc3Vic2NyaXB0aW9uKSB3aXRoIGFcbmtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNsaWNlIGxpc3QsIGFzIGZvbGxvd3MuICBJZiB0aGUgc2xpY2Vcbmxpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGVcbmNvbnZlcnNpb24gb2YgdGhlIHNsaWNlIGl0ZW1zOyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBsb25lXG5zbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0gdGhhdCBpcyBhblxuZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhIHByb3BlciBzbGljZSBpcyBhXG5zbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSB3aG9zZVxuInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGVcbmV4cHJlc3Npb25zIGdpdmVuIGFzIGxvd2VyIGJvdW5kLCB1cHBlciBib3VuZCBhbmQgc3RyaWRlLFxucmVzcGVjdGl2ZWx5LCBzdWJzdGl0dXRpbmcgIk5vbmUiIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLlxuJywKICAnc3BlY2lhbGF0dHJzJzogdSdcblNwZWNpYWwgQXR0cmlidXRlc1xuKioqKioqKioqKioqKioqKioqXG5cblRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gc2V2ZXJhbFxub2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZFxuYnkgdGhlICJkaXIoKSIgYnVpbHQtaW4gZnVuY3Rpb24uXG5cbm9iamVjdC5fX2RpY3RfX1xuXG4gICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3RcJ3NcbiAgICh3cml0YWJsZSkgYXR0cmlidXRlcy5cblxuaW5zdGFuY2UuX19jbGFzc19fXG5cbiAgIFRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuXG5cbmNsYXNzLl9fYmFzZXNfX1xuXG4gICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LlxuXG5jbGFzcy5fX25hbWVfX1xuXG4gICBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgb3IgdHlwZS5cblxuY2xhc3MuX19xdWFsbmFtZV9fXG5cbiAgIFRoZSAqcXVhbGlmaWVkIG5hbWUqIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjMuXG5cbmNsYXNzLl9fbXJvX19cblxuICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlblxuICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cblxuY2xhc3MubXJvKClcblxuICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplIHRoZVxuICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3NcbiAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiAiX19tcm9fXyIuXG5cbmNsYXNzLl9fc3ViY2xhc3Nlc19fKClcblxuICAgRWFjaCBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbW1lZGlhdGVcbiAgIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgcmVmZXJlbmNlc1xuICAgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG5cbiAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuICAgICAgWzxjbGFzcyBcJ2Jvb2xcJz5dXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzcGVjaWFsIG1ldGhvZHMgbWF5IGJlIGZvdW5kXG4gICAgaW4gdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsICgqQmFzaWMgY3VzdG9taXphdGlvbiopLlxuXG5bMl0gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGxpc3QgIlsxLCAyXSIgaXMgY29uc2lkZXJlZCBlcXVhbCB0b1xuICAgICJbMS4wLCAyLjBdIiwgYW5kIHNpbWlsYXJseSBmb3IgdHVwbGVzLlxuXG5bM10gVGhleSBtdXN0IGhhdmUgc2luY2UgdGhlIHBhcnNlciBjYW5cJ3QgdGVsbCB0aGUgdHlwZSBvZiB0aGVcbiAgICBvcGVyYW5kcy5cblxuWzRdIENhc2VkIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSBwcm9wZXJ0eVxuICAgIGJlaW5nIG9uZSBvZiAiTHUiIChMZXR0ZXIsIHVwcGVyY2FzZSksICJMbCIgKExldHRlciwgbG93ZXJjYXNlKSxcbiAgICBvciAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbls1XSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYVxuICAgIHNpbmdsZXRvbiB0dXBsZSB3aG9zZSBvbmx5IGVsZW1lbnQgaXMgdGhlIHR1cGxlIHRvIGJlIGZvcm1hdHRlZC5cbicsCi0gJ3NwZWNpYWxuYW1lcyc6IHUnXG5TcGVjaWFsIG1ldGhvZCBuYW1lc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IHNwZWNpYWxcbnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieVxuZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uXCdzIGFwcHJvYWNoIHRvXG4qb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3JcbndpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgY2xhc3MgZGVmaW5lc1xuYSBtZXRob2QgbmFtZWQgIl9fZ2V0aXRlbV9fKCkiLCBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsXG50aGVuICJ4W2ldIiBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gInR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSkiLlxuRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb24gcmFpc2UgYW5cbmV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbiJBdHRyaWJ1dGVFcnJvciIgb3IgIlR5cGVFcnJvciIpLlxuXG5XaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzXG5pbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0XG5tYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lXG5zZXF1ZW5jZXMgbWF5IHdvcmsgd2VsbCB3aXRoIHJldHJpZXZhbCBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLCBidXRcbmV4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGVcbiJOb2RlTGlzdCIgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcblxuXG5CYXNpYyBjdXN0b21pemF0aW9uXG49PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlXG4gICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZFxuICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciBleGFtcGxlLCB0aGVcbiAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvIGF1dG9tYXRpY2FsbHlcbiAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlXG4gICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuXG4gICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXJcJ3NcbiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgcmVmbGVjdGlvbixcbiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlXG4gICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGFcbiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kXCdzIHR5cGUsIHRoZVxuICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGVcbiAgIGxlZnQgb3BlcmFuZFwncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3RcbiAgIGNvbnNpZGVyZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3RcbiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSJcbiAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBhcyBpdGVtcyBpblxuICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZFxuICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnRcbiAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlIGNvbGxlY3Rpb25zXG4gICByZXF1aXJlcyB0aGF0IGEga2V5XCdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cblxuICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgbWV0aG9kcyBieVxuICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoXG4gICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSBoYXNoKHkpIi5cblxuICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiXG4gICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICBXaGVuIHRoZVxuICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzc1xuICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0b1xuICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgaW50ZXJwcmV0ZXJcbiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzc1xuICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3NcbiAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiB0aGF0XG4gICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiBjYWxsLlxuXG4gICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzIGFuZFxuICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLlxuICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob25cbiAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2ZcbiAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwtXG4gICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGVcbiAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgY29tcGxleGl0eS5cbiAgICAgU2VlIGh0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3JcbiAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gb3JkZXIgb2ZcbiAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXNcbiAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kXG4gICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cbm9iamVjdC5fX2Jvb2xfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3RcbiAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG5cblxuQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSBtZWFuaW5nIG9mXG5hdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICJ4Lm5hbWUiKSBmb3JcbmNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgYXR0cmlidXRlIG5hbWUuIFRoaXNcbiAgIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgZG9uZSBib3RoIGZvclxuICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAiX19nZXRhdHRyX18oKSIgd291bGQgaGF2ZVxuICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGUgdGhhdCBhdFxuICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkgbm90XG4gICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbFxuICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgIl9fZ2V0YXR0cl9fKCkiLFxuICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICJfX2dldGF0dHJpYnV0ZV9fKCkiIGVpdGhlclxuICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gVGhpcyBtZXRob2RcbiAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluXG4gICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzc1xuICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvclxuICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsXG4gICAgIG1ldGhvZHMgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXhcbiAgICAgb3IgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCouXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICp2YWx1ZSogaXMgdGhlXG4gICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cblxuICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2ZcbiAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgb2JqLm5hbWUiIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5vYmplY3QuX19kaXJfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBIHNlcXVlbmNlIG11c3QgYmVcbiAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhIGxpc3QgYW5kXG4gICBzb3J0cyBpdC5cblxuXG5JbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzc1xuY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW5cbipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lclwncyBjbGFzc1xuZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyBwYXJlbnRzKS4gIEluIHRoZVxuZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzXG50aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3NcJyAiX19kaWN0X18iLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgIk5vbmUiIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAiQXR0cmlidXRlRXJyb3IiXG4gICBleGNlcHRpb24uXG5cbm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyXG4gICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cblxub2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZVxuICAgb3duZXIgY2xhc3MuXG5cblRoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICJpbnNwZWN0IiBtb2R1bGUgYXNcbnNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXNcbmFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzc1xuYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuIGluc3RhbmNlIG9mIHRoZVxuZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgdGhlIGZpcnN0XG5wb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgYXR0cmlidXRlIGZvclxudW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsIGFuZFxuIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0XG5pcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICJhLngiIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4idHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbiJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICJhLngiLiBIb3dcbnRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcblxuRGlyZWN0IENhbGxcbiAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgZGlyZWN0bHlcbiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuXG5DbGFzcyBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGNhbGw6XG4gICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICJzdXBlcihCLFxuICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgYmFzZSBjbGFzcyAiQSJcbiAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZVxuICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKSIuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGwgcmV0dXJuXG50aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSBvYmplY3RcJ3Ncbmluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICJfX3NldF9fKCkiIGFuZC9vclxuIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzIG5laXRoZXIsIGl0IGlzXG5hIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUgYm90aFxuIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlXG4iX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgYW5kICJfX2dldF9fKCkiXG5kZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW5cbmNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgInN0YXRpY21ldGhvZCgpIiBhbmQgImNsYXNzbWV0aG9kKCkiKSBhcmVcbmltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5cbnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG9cbmFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzLlxuXG5UaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG4tLS0tLS0tLS1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZVxuc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZVxudmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWUgYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZVxubnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgY2xhc3NcbmRlZmluaXRpb24uIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlIG9mIGluc3RhbmNlXG52YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggaW5zdGFuY2UgdG8gaG9sZCBhXG52YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpcyBub3RcbmNyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG5cbm9iamVjdC5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgKl9fc2xvdHNfXypcbiAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGVcbiAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qIGZvciBlYWNoXG4gICBpbnN0YW5jZS5cblxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxufn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5cblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIuIElmXG4gIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkXG4gICJcJ19fZGljdF9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3Nlc1xuICBkZWZpbmluZyAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzXG4gIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkXG4gICJcJ19fd2Vha3JlZl9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nXG4gIGRlc2NyaXB0b3JzICgqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKikgZm9yIGVhY2ggdmFyaWFibGUgbmFtZS4gIEFzXG4gIGEgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3JcbiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzXG4gIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cblxuKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3NcbiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICpfX2RpY3RfXypcbiAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSBjb250YWluIG5hbWVzXG4gIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuXG4qIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgdGhlXG4gIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGVcbiAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLlxuICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlIGZ1dHVyZSwgYVxuICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuXG4qIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tXG4gICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICJieXRlcyIgYW5kICJ0dXBsZSIuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5nc1xuICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cblxuQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkJ5IGRlZmF1bHQsIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nICJ0eXBlKCkiLiBUaGUgY2xhc3MgYm9keSBpc1xuZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZVxucmVzdWx0IG9mICJ0eXBlKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpIi5cblxuVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWlzZWQgYnkgcGFzc2luZyB0aGVcbiJtZXRhY2xhc3MiIGtleXdvcmQgYXJndW1lbnQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gbGluZSwgb3IgYnlcbmluaGVyaXRpbmcgZnJvbSBhbiBleGlzdGluZyBjbGFzcyB0aGF0IGluY2x1ZGVkIHN1Y2ggYW4gYXJndW1lbnQuIEluXG50aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlIGluc3RhbmNlc1xub2YgIk1ldGEiOlxuXG4gICBjbGFzcyBNZXRhKHR5cGUpOlxuICAgICAgIHBhc3NcblxuICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6XG4gICAgICAgcGFzc1xuXG4gICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOlxuICAgICAgIHBhc3NcblxuQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvblxuYXJlIHBhc3NlZCB0aHJvdWdoIHRvIGFsbCBtZXRhY2xhc3Mgb3BlcmF0aW9ucyBkZXNjcmliZWQgYmVsb3cuXG5cbldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzIG9jY3VyOlxuXG4qIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZFxuXG4qIHRoZSBjbGFzcyBuYW1lc3BhY2UgaXMgcHJlcGFyZWRcblxuKiB0aGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZFxuXG4qIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZFxuXG5cbkRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3Ncbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBmb3IgYSBjbGFzcyBkZWZpbml0aW9uIGlzIGRldGVybWluZWQgYXNcbmZvbGxvd3M6XG5cbiogaWYgbm8gYmFzZXMgYW5kIG5vIGV4cGxpY2l0IG1ldGFjbGFzcyBhcmUgZ2l2ZW4sIHRoZW4gInR5cGUoKSIgaXNcbiAgdXNlZFxuXG4qIGlmIGFuIGV4cGxpY2l0IG1ldGFjbGFzcyBpcyBnaXZlbiBhbmQgaXQgaXMgKm5vdCogYW4gaW5zdGFuY2Ugb2ZcbiAgInR5cGUoKSIsIHRoZW4gaXQgaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgbWV0YWNsYXNzXG5cbiogaWYgYW4gaW5zdGFuY2Ugb2YgInR5cGUoKSIgaXMgZ2l2ZW4gYXMgdGhlIGV4cGxpY2l0IG1ldGFjbGFzcywgb3JcbiAgYmFzZXMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgdXNlZFxuXG5UaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBzZWxlY3RlZCBmcm9tIHRoZSBleHBsaWNpdGx5IHNwZWNpZmllZFxubWV0YWNsYXNzIChpZiBhbnkpIGFuZCB0aGUgbWV0YWNsYXNzZXMgKGkuZS4gInR5cGUoY2xzKSIpIG9mIGFsbFxuc3BlY2lmaWVkIGJhc2UgY2xhc3Nlcy4gVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgb25lIHdoaWNoIGlzIGFcbnN1YnR5cGUgb2YgKmFsbCogb2YgdGhlc2UgY2FuZGlkYXRlIG1ldGFjbGFzc2VzLiBJZiBub25lIG9mIHRoZVxuY2FuZGlkYXRlIG1ldGFjbGFzc2VzIG1lZXRzIHRoYXQgY3JpdGVyaW9uLCB0aGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uXG53aWxsIGZhaWwgd2l0aCAiVHlwZUVycm9yIi5cblxuXG5QcmVwYXJpbmcgdGhlIGNsYXNzIG5hbWVzcGFjZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuT25jZSB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGhhcyBiZWVuIGlkZW50aWZpZWQsIHRoZW4gdGhlIGNsYXNzXG5uYW1lc3BhY2UgaXMgcHJlcGFyZWQuIElmIHRoZSBtZXRhY2xhc3MgaGFzIGEgIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsXG5pdCBpcyBjYWxsZWQgYXMgIm5hbWVzcGFjZSA9IG1ldGFjbGFzcy5fX3ByZXBhcmVfXyhuYW1lLCBiYXNlcyxcbioqa3dkcykiICh3aGVyZSB0aGUgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgaWYgYW55LCBjb21lIGZyb21cbnRoZSBjbGFzcyBkZWZpbml0aW9uKS5cblxuSWYgdGhlIG1ldGFjbGFzcyBoYXMgbm8gIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsIHRoZW4gdGhlIGNsYXNzXG5uYW1lc3BhY2UgaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgImRpY3QoKSIgaW5zdGFuY2UuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMFxuXG4gICAgIEludHJvZHVjZWQgdGhlICJfX3ByZXBhcmVfXyIgbmFtZXNwYWNlIGhvb2tcblxuXG5FeGVjdXRpbmcgdGhlIGNsYXNzIGJvZHlcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZCAoYXBwcm94aW1hdGVseSkgYXMgImV4ZWMoYm9keSwgZ2xvYmFscygpLFxubmFtZXNwYWNlKSIuIFRoZSBrZXkgZGlmZmVyZW5jZSBmcm9tIGEgbm9ybWFsIGNhbGwgdG8gImV4ZWMoKSIgaXMgdGhhdFxubGV4aWNhbCBzY29waW5nIGFsbG93cyB0aGUgY2xhc3MgYm9keSAoaW5jbHVkaW5nIGFueSBtZXRob2RzKSB0b1xucmVmZXJlbmNlIG5hbWVzIGZyb20gdGhlIGN1cnJlbnQgYW5kIG91dGVyIHNjb3BlcyB3aGVuIHRoZSBjbGFzc1xuZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIGEgZnVuY3Rpb24uXG5cbkhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIHRoZSBmdW5jdGlvbixcbm1ldGhvZHMgZGVmaW5lZCBpbnNpZGUgdGhlIGNsYXNzIHN0aWxsIGNhbm5vdCBzZWUgbmFtZXMgZGVmaW5lZCBhdCB0aGVcbmNsYXNzIHNjb3BlLiBDbGFzcyB2YXJpYWJsZXMgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBmaXJzdFxucGFyYW1ldGVyIG9mIGluc3RhbmNlIG9yIGNsYXNzIG1ldGhvZHMsIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgYXQgYWxsXG5mcm9tIHN0YXRpYyBtZXRob2RzLlxuXG5cbkNyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3Rcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuT25jZSB0aGUgY2xhc3MgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBleGVjdXRpbmcgdGhlIGNsYXNzXG5ib2R5LCB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyAibWV0YWNsYXNzKG5hbWUsIGJhc2VzLFxubmFtZXNwYWNlLCAqKmt3ZHMpIiAodGhlIGFkZGl0aW9uYWwga2V5d29yZHMgcGFzc2VkIGhlcmUgYXJlIHRoZSBzYW1lXG5hcyB0aG9zZSBwYXNzZWQgdG8gIl9fcHJlcGFyZV9fIikuXG5cblRoaXMgY2xhc3Mgb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHplcm8tXG5hcmd1bWVudCBmb3JtIG9mICJzdXBlcigpIi4gIl9fY2xhc3NfXyIgaXMgYW4gaW1wbGljaXQgY2xvc3VyZVxucmVmZXJlbmNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGlmIGFueSBtZXRob2RzIGluIGEgY2xhc3MgYm9keSByZWZlclxudG8gZWl0aGVyICJfX2NsYXNzX18iIG9yICJzdXBlciIuIFRoaXMgYWxsb3dzIHRoZSB6ZXJvIGFyZ3VtZW50IGZvcm1cbm9mICJzdXBlcigpIiB0byBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgYmFzZWQgb25cbmxleGljYWwgc2NvcGluZywgd2hpbGUgdGhlIGNsYXNzIG9yIGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgdG8gbWFrZSB0aGVcbmN1cnJlbnQgY2FsbCBpcyBpZGVudGlmaWVkIGJhc2VkIG9uIHRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gdGhlXG5tZXRob2QuXG5cbkFmdGVyIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSBjbGFzc1xuZGVjb3JhdG9ycyBpbmNsdWRlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAoaWYgYW55KSBhbmQgdGhlIHJlc3VsdGluZ1xub2JqZWN0IGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgdGhlIGRlZmluZWQgY2xhc3MuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTM1KiogLSBOZXcgc3VwZXJcblxuICAgICBEZXNjcmliZXMgdGhlIGltcGxpY2l0ICJfX2NsYXNzX18iIGNsb3N1cmUgcmVmZXJlbmNlXG5cblxuTWV0YWNsYXNzIGV4YW1wbGVcbi0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBwb3RlbnRpYWwgdXNlcyBmb3IgbWV0YWNsYXNzZXMgYXJlIGJvdW5kbGVzcy4gU29tZSBpZGVhcyB0aGF0IGhhdmVcbmJlZW4gZXhwbG9yZWQgaW5jbHVkZSBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpY1xuZGVsZWdhdGlvbiwgYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmRcbmF1dG9tYXRpYyByZXNvdXJjZSBsb2NraW5nL3N5bmNocm9uaXphdGlvbi5cblxuSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgbWV0YWNsYXNzIHRoYXQgdXNlcyBhblxuImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0IiB0byByZW1lbWJlciB0aGUgb3JkZXIgdGhhdCBjbGFzcyB2YXJpYWJsZXNcbmFyZSBkZWZpbmVkOlxuXG4gICBjbGFzcyBPcmRlcmVkQ2xhc3ModHlwZSk6XG5cbiAgICAgICAgQGNsYXNzbWV0aG9kXG4gICAgICAgIGRlZiBfX3ByZXBhcmVfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgKiprd2RzKTpcbiAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KClcblxuICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UsICoqa3dkcyk6XG4gICAgICAgICAgIHJlc3VsdCA9IHR5cGUuX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0KG5hbWVzcGFjZSkpXG4gICAgICAgICAgIHJlc3VsdC5tZW1iZXJzID0gdHVwbGUobmFtZXNwYWNlKVxuICAgICAgICAgICByZXR1cm4gcmVzdWx0XG5cbiAgIGNsYXNzIEEobWV0YWNsYXNzPU9yZGVyZWRDbGFzcyk6XG4gICAgICAgZGVmIG9uZShzZWxmKTogcGFzc1xuICAgICAgIGRlZiB0d28oc2VsZik6IHBhc3NcbiAgICAgICBkZWYgdGhyZWUoc2VsZik6IHBhc3NcbiAgICAgICBkZWYgZm91cihzZWxmKTogcGFzc1xuXG4gICA+Pj4gQS5tZW1iZXJzXG4gICAoXCdfX21vZHVsZV9fXCcsIFwnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJywgXCdmb3VyXCcpXG5cbldoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yICpBKiBnZXRzIGV4ZWN1dGVkLCB0aGUgcHJvY2VzcyBiZWdpbnNcbndpdGggY2FsbGluZyB0aGUgbWV0YWNsYXNzXCdzICJfX3ByZXBhcmVfXygpIiBtZXRob2Qgd2hpY2ggcmV0dXJucyBhblxuZW1wdHkgImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0Ii4gIFRoYXQgbWFwcGluZyByZWNvcmRzIHRoZSBtZXRob2RzIGFuZFxuYXR0cmlidXRlcyBvZiAqQSogYXMgdGhleSBhcmUgZGVmaW5lZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIGNsYXNzXG5zdGF0ZW1lbnQuIE9uY2UgdGhvc2UgZGVmaW5pdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgb3JkZXJlZCBkaWN0aW9uYXJ5XG5pcyBmdWxseSBwb3B1bGF0ZWQgYW5kIHRoZSBtZXRhY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIGdldHNcbmludm9rZWQuICBUaGF0IG1ldGhvZCBidWlsZHMgdGhlIG5ldyB0eXBlIGFuZCBpdCBzYXZlcyB0aGUgb3JkZXJlZFxuZGljdGlvbmFyeSBrZXlzIGluIGFuIGF0dHJpYnV0ZSBjYWxsZWQgIm1lbWJlcnMiLlxuXG5cbkN1c3RvbWl6aW5nIGluc3RhbmNlIGFuZCBzdWJjbGFzcyBjaGVja3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZVxuImlzaW5zdGFuY2UoKSIgYW5kICJpc3N1YmNsYXNzKCkiIGJ1aWx0LWluIGZ1bmN0aW9ucy5cblxuSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyAiYWJjLkFCQ01ldGEiIGltcGxlbWVudHMgdGhlc2UgbWV0aG9kcyBpblxub3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgYXNcbiJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pblxudHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cblxuY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudFxuICAgImlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKSIuXG5cbmNsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICAiaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpIi5cblxuTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAobWV0YWNsYXNzKSBvZiBhXG5jbGFzcy4gIFRoZXkgY2Fubm90IGJlIGRlZmluZWQgYXMgY2xhc3MgbWV0aG9kcyBpbiB0aGUgYWN0dWFsIGNsYXNzLlxuVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkXG5vbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSBjbGFzcy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTkqKiAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3Nlc1xuXG4gICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyAiaXNpbnN0YW5jZSgpIiBhbmRcbiAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgYW5kXG4gICAgICJfX3N1YmNsYXNzY2hlY2tfXygpIiwgd2l0aCBtb3RpdmF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgaW5cbiAgICAgdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSAiYWJjIlxuICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cblxuXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbiAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuXG5cbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayA8IE4iIHdoZXJlXG4qTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhXG5yYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlIHRoZVxubWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAiY2xlYXIoKSIsXG4ic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgInVwZGF0ZSgpIlxuYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uXCdzIHN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy5cblRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgYWJzdHJhY3QgYmFzZVxuY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgIl9fZ2V0aXRlbV9fKCkiLFxuIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSBzZXF1ZW5jZXNcbnNob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICJleHRlbmQoKSIsXG4iaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsIGxpa2UgUHl0aG9uXG5zdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50XG5hZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmdcbnJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAiX19yYWRkX18oKSIsXG4iX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiBkZXNjcmliZWRcbmJlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpc1xucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiBvcGVyYXRvcjtcbmZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0XG5zaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgdGhhdCBib3RoXG5tYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byBhbGxvd1xuZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiXG5zaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlXG50aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gb2JqZWN0IHRoYXRcbiAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICJfX2xlbl9fKCkiIG1ldGhvZFxuICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCByZXR1cm4gYW5cbiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhblxuICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuIFRoaXNcbiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3JcbiAgIGNvcnJlY3RuZXNzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbk5vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcy5cbiAgQSBjYWxsIGxpa2VcblxuICAgICBhWzE6Ml0gPSBiXG5cbiAgaXMgdHJhbnNsYXRlZCB0b1xuXG4gICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuXG4gIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yIHNlcXVlbmNlIHR5cGVzLFxuICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgTm90ZSB0aGF0XG4gICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgY2xhc3Mgd2lzaGVzXG4gICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuIElmXG4gICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSByYWlzZWQ7IGlmIG9mXG4gICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueVxuICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgc2hvdWxkIGJlXG4gICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlXG4gICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiBmb3IgZGljdFxuICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgInJldmVyc2VkKCkiXG4gICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKCJfX2xlbl9fKCkiXG4gICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbFxuICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW5cbiAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5XG4gICAicmV2ZXJzZWQoKSIuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3RcbiAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgc2VxdWVuY2VcbiAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgKnRoaXMgc2VjdGlvbiBpbiB0aGVcbiAgIGxhbmd1YWdlIHJlZmVyZW5jZSouXG5cblxuRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy5cbk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlXG5wYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yXG5ub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuXG5vYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIixcbiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggKyB5Iiwgd2hlcmUgKngqIGlzIGFuIGluc3RhbmNlIG9mIGFcbiAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInguX19hZGRfXyh5KSIgaXMgY2FsbGVkLlxuICAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gdXNpbmdcbiAgICJfX2Zsb29yZGl2X18oKSIgYW5kICJfX21vZF9fKCkiOyBpdCBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG9cbiAgICJfX3RydWVkaXZfXygpIi4gIE5vdGUgdGhhdCAiX19wb3dfXygpIiBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHRcbiAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluXG4gICAicG93KCkiIGZ1bmN0aW9uIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi5cblxub2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgKHN3YXBwZWQpXG4gICBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGxlZnQgb3BlcmFuZCBkb2VzXG4gICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kIHRoZSBvcGVyYW5kcyBhcmUgb2ZcbiAgIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gInggLVxuICAgeSIsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuICJfX3JzdWJfXygpIlxuICAgbWV0aG9kLCAieS5fX3JzdWJfXyh4KSIgaXMgY2FsbGVkIGlmICJ4Ll9fc3ViX18oeSkiIHJldHVybnNcbiAgICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5ICJwb3coKSIgd2lsbCBub3QgdHJ5IGNhbGxpbmcgIl9fcnBvd19fKCkiICh0aGVcbiAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuXG4gICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kXG4gICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnRcbiAgICAgb3BlcmFuZFwncyBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXNcbiAgICAgdG8gb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzXCcgb3BlcmF0aW9ucy5cblxub2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpY1xuICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAiKio9IixcbiAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCBhdHRlbXB0IHRvXG4gICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuIHRoZSByZXN1bHRcbiAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhIHNwZWNpZmljXG4gICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZVxuICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzXG4gICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggPVxuICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAieS5fX3JhZGRfXyh4KSIgYXJlXG4gICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluIGNlcnRhaW5cbiAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCBlcnJvcnNcbiAgIChzZWUgKldoeSBkb2VzIGFfdHVwbGVbaV0gKz0gW1wnaXRlbVwnXSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGVcbiAgIGFkZGl0aW9uIHdvcmtzPyopLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgdGhlIGRhdGFcbiAgIG1vZGVsLlxuXG5vYmplY3QuX19uZWdfXyhzZWxmKVxub2JqZWN0Ll9fcG9zX18oc2VsZilcbm9iamVjdC5fX2Fic19fKHNlbGYpXG5vYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgIisiLFxuICAgImFicygpIiBhbmQgIn4iKS5cblxub2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG5vYmplY3QuX19pbnRfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxub2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgImludCgpIixcbiAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSBhcHByb3ByaWF0ZVxuICAgdHlwZS5cblxub2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyIFB5dGhvbiBuZWVkc1xuICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaFxuICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICJvY3QoKSJcbiAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBudW1lcmljXG4gICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cblxuICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgd2hlblxuICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgZGVmaW5lZCwgYW5kXG4gICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cblxuXG5XaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXJcbmhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lIGNvbnRleHRcbmZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUgbm9ybWFsbHlcbmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uICpUaGUgd2l0aFxuc3RhdGVtZW50KiksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIlxuICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZFwncyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKVxuICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlICJOb25lIi5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW5cbiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyXCdzIHJlc3BvbnNpYmlsaXR5LlxuXG5TZWUgYWxzbzogKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwXG49PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIGN1c3RvbSBjbGFzc2VzLCBpbXBsaWNpdCBpbnZvY2F0aW9ucyBvZiBzcGVjaWFsIG1ldGhvZHMgYXJlIG9ubHlcbmd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkgaWYgZGVmaW5lZCBvbiBhbiBvYmplY3RcJ3MgdHlwZSwgbm90IGluXG50aGUgb2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgcmVhc29uIHdoeVxudGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb246XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gbGVuKGMpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlIFwnQ1wnIGhhcyBubyBsZW4oKVxuXG5UaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbFxubWV0aG9kcyBzdWNoIGFzICJfX2hhc2hfXygpIiBhbmQgIl9fcmVwcl9fKCkiIHRoYXQgYXJlIGltcGxlbWVudGVkIGJ5XG5hbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCBvZiB0aGVzZVxubWV0aG9kcyB1c2VkIHRoZSBjb252ZW50aW9uYWwgbG9va3VwIHByb2Nlc3MsIHRoZXkgd291bGQgZmFpbCB3aGVuXG5pbnZva2VkIG9uIHRoZSB0eXBlIG9iamVjdCBpdHNlbGY6XG5cbiAgID4+PiAxIC5fX2hhc2hfXygpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciBcJ19faGFzaF9fXCcgb2YgXCdpbnRcJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcblxuSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSBjbGFzcyBpbiB0aGlzXG53YXkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFwnbWV0YWNsYXNzIGNvbmZ1c2lvblwnLCBhbmQgaXMgYXZvaWRlZFxuYnkgYnlwYXNzaW5nIHRoZSBpbnN0YW5jZSB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzOlxuXG4gICA+Pj4gdHlwZSgxKS5fX2hhc2hfXygxKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gdHlwZShpbnQpLl9faGFzaF9fKGludCkgPT0gaGFzaChpbnQpXG4gICBUcnVlXG5cbkluIGFkZGl0aW9uIHRvIGJ5cGFzc2luZyBhbnkgaW5zdGFuY2UgYXR0cmlidXRlcyBpbiB0aGUgaW50ZXJlc3Qgb2ZcbmNvcnJlY3RuZXNzLCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgZ2VuZXJhbGx5IGFsc28gYnlwYXNzZXNcbnRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzIG1ldGFjbGFzczpcblxuICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50KCJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuICAgLi4uICAgICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6XG4gICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50KCJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4gICAuLi4gICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fKCkgICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSBpbnN0YW5jZVxuICAgQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbiAgIDEwXG4gICA+Pj4gdHlwZShjKS5fX2xlbl9fKGMpICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSB0eXBlXG4gICBNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbiAgIDEwXG4gICA+Pj4gbGVuKGMpICAgICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXQgbG9va3VwXG4gICAxMFxuXG5CeXBhc3NpbmcgdGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb24gcHJvdmlkZXNcbnNpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGUgaW50ZXJwcmV0ZXIsIGF0XG50aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBzcGVjaWFsIG1ldGhvZHMgKHRoZVxuc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0IGl0c2VsZiBpbiBvcmRlciB0byBiZVxuY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cbicsCi0gJ3N0cmluZy1tZXRob2RzJzogdSdcblN0cmluZyBNZXRob2RzXG4qKioqKioqKioqKioqKlxuXG5TdHJpbmdzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMsIGFsb25nIHdpdGhcbnRoZSBhZGRpdGlvbmFsIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LlxuXG5TdHJpbmdzIGFsc28gc3VwcG9ydCB0d28gc3R5bGVzIG9mIHN0cmluZyBmb3JtYXR0aW5nLCBvbmUgcHJvdmlkaW5nIGFcbmxhcmdlIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9taXphdGlvbiAoc2VlICJzdHIuZm9ybWF0KCkiLFxuKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBhbmQgKlN0cmluZyBGb3JtYXR0aW5nKikgYW5kIHRoZSBvdGhlciBiYXNlZCBvblxuQyAicHJpbnRmIiBzdHlsZSBmb3JtYXR0aW5nIHRoYXQgaGFuZGxlcyBhIG5hcnJvd2VyIHJhbmdlIG9mIHR5cGVzIGFuZFxuaXMgc2xpZ2h0bHkgaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHksIGJ1dCBpcyBvZnRlbiBmYXN0ZXIgZm9yIHRoZSBjYXNlc1xuaXQgY2FuIGhhbmRsZSAoKnByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZyopLlxuXG5UaGUgKlRleHQgUHJvY2Vzc2luZyBTZXJ2aWNlcyogc2VjdGlvbiBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBjb3ZlcnNcbmEgbnVtYmVyIG9mIG90aGVyIG1vZHVsZXMgdGhhdCBwcm92aWRlIHZhcmlvdXMgdGV4dCByZWxhdGVkIHV0aWxpdGllc1xuKGluY2x1ZGluZyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBpbiB0aGUgInJlIiBtb2R1bGUpLlxuXG5zdHIuY2FwaXRhbGl6ZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBjaGFyYWN0ZXIgY2FwaXRhbGl6ZWRcbiAgIGFuZCB0aGUgcmVzdCBsb3dlcmNhc2VkLlxuXG5zdHIuY2FzZWZvbGQoKVxuXG4gICBSZXR1cm4gYSBjYXNlZm9sZGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gQ2FzZWZvbGRlZCBzdHJpbmdzIG1heSBiZVxuICAgdXNlZCBmb3IgY2FzZWxlc3MgbWF0Y2hpbmcuXG5cbiAgIENhc2Vmb2xkaW5nIGlzIHNpbWlsYXIgdG8gbG93ZXJjYXNpbmcgYnV0IG1vcmUgYWdncmVzc2l2ZSBiZWNhdXNlXG4gICBpdCBpcyBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGNhc2UgZGlzdGluY3Rpb25zIGluIGEgc3RyaW5nLiBGb3JcbiAgIGV4YW1wbGUsIHRoZSBHZXJtYW4gbG93ZXJjYXNlIGxldHRlciAiXCdceGRmXCciIGlzIGVxdWl2YWxlbnQgdG8gIiJzcyIiLlxuICAgU2luY2UgaXQgaXMgYWxyZWFkeSBsb3dlcmNhc2UsICJsb3dlcigpIiB3b3VsZCBkbyBub3RoaW5nIHRvICJcJ1x4ZGZcJyI7XG4gICAiY2FzZWZvbGQoKSIgY29udmVydHMgaXQgdG8gIiJzcyIiLlxuXG4gICBUaGUgY2FzZWZvbGRpbmcgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjMuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUkgc3BhY2UpLiBUaGVcbiAgIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgImxlbihzKSIuXG5cbnN0ci5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpzdWIqXG4gICBpbiB0aGUgcmFuZ2UgWypzdGFydCosICplbmQqXS4gIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZFxuICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXG5zdHIuZW5jb2RlKGVuY29kaW5nPSJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IilcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIGFzIGEgYnl0ZXMgb2JqZWN0LiBEZWZhdWx0XG4gICBlbmNvZGluZyBpcyAiXCd1dGYtOFwnIi4gKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudFxuICAgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXMgIlwnc3RyaWN0XCciLFxuICAgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhICJVbmljb2RlRXJyb3IiLiBPdGhlciBwb3NzaWJsZVxuICAgdmFsdWVzIGFyZSAiXCdpZ25vcmVcJyIsICJcJ3JlcGxhY2VcJyIsICJcJ3htbGNoYXJyZWZyZXBsYWNlXCciLFxuICAgIlwnYmFja3NsYXNocmVwbGFjZVwnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWFcbiAgICJjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKSIsIHNlZSBzZWN0aW9uICpFcnJvciBIYW5kbGVycyouIEZvciBhIGxpc3RcbiAgIG9mIHBvc3NpYmxlIGVuY29kaW5ncywgc2VlIHNlY3Rpb24gKlN0YW5kYXJkIEVuY29kaW5ncyouXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzIGFkZGVkLlxuXG5zdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiAiRmFsc2UiLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBzdWZmaXhlc1xuICAgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdCBwb3NpdGlvbi5cblxuc3RyLmV4cGFuZHRhYnModGFic2l6ZT04KVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVyc1xuICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLlxuICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlXG4gICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYVxuICAgdGFiICgiXFx0IiksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZSByZXN1bHRcbiAgIHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uIChUaGVcbiAgIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhIG5ld2xpbmVcbiAgICgiXFxuIikgb3IgcmV0dXJuICgiXFxyIiksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzXG4gICByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkIGFuZCB0aGVcbiAgIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGVcbiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuXG5cbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicygpXG4gICBcJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0XCdcbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicyg0KVxuICAgXCcwMSAgMDEyIDAxMjMgICAgMDEyMzRcJ1xuXG5zdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgaW4gdGhlIHNsaWNlICJzW3N0YXJ0OmVuZF0iLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBpZiAqc3ViKiBpcyBub3QgZm91bmQuXG5cbiAgIE5vdGU6IFRoZSAiZmluZCgpIiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93XG4gICAgIHRoZSBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCxcbiAgICAgdXNlIHRoZSAiaW4iIG9wZXJhdG9yOlxuXG4gICAgICAgID4+PiBcJ1B5XCcgaW4gXCdQeXRob25cJ1xuICAgICAgICBUcnVlXG5cbnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKVxuXG4gICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzXG4gICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHNcbiAgIGRlbGltaXRlZCBieSBicmFjZXMgInt9Ii4gIEVhY2ggcmVwbGFjZW1lbnQgZmllbGQgY29udGFpbnMgZWl0aGVyXG4gICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGFcbiAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2hcbiAgIHJlcGxhY2VtZW50IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG5cbiAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4gICBcJ1RoZSBzdW0gb2YgMSArIDIgaXMgM1wnXG5cbiAgIFNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzXG4gICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCBzdHJpbmdzLlxuXG5zdHIuZm9ybWF0X21hcChtYXBwaW5nKVxuXG4gICBTaW1pbGFyIHRvICJzdHIuZm9ybWF0KCoqbWFwcGluZykiLCBleGNlcHQgdGhhdCAibWFwcGluZyIgaXMgdXNlZFxuICAgZGlyZWN0bHkgYW5kIG5vdCBjb3BpZWQgdG8gYSAiZGljdCIuICBUaGlzIGlzIHVzZWZ1bCBpZiBmb3IgZXhhbXBsZVxuICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczpcblxuICAgPj4+IGNsYXNzIERlZmF1bHQoZGljdCk6XG4gICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIGtleVxuICAgLi4uXG4gICA+Pj4gXCd7bmFtZX0gd2FzIGJvcm4gaW4ge2NvdW50cnl9XCcuZm9ybWF0X21hcChEZWZhdWx0KG5hbWU9XCdHdWlkb1wnKSlcbiAgIFwnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeVwnXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIExpa2UgImZpbmQoKSIsIGJ1dCByYWlzZSAiVmFsdWVFcnJvciIgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSBjaGFyYWN0ZXIgImMiXG4gICBpcyBhbHBoYW51bWVyaWMgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJucyAiVHJ1ZSI6XG4gICAiYy5pc2FscGhhKCkiLCAiYy5pc2RlY2ltYWwoKSIsICJjLmlzZGlnaXQoKSIsIG9yICJjLmlzbnVtZXJpYygpIi5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQWxwaGFiZXRpY1xuICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuICAgZGF0YWJhc2UgYXMgIkxldHRlciIsIGkuZS4sIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSBwcm9wZXJ0eVxuICAgYmVpbmcgb25lIG9mICJMbSIsICJMdCIsICJMdSIsICJMbCIsIG9yICJMbyIuICBOb3RlIHRoYXQgdGhpcyBpc1xuICAgZGlmZmVyZW50IGZyb20gdGhlICJBbHBoYWJldGljIiBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBVbmljb2RlXG4gICBTdGFuZGFyZC5cblxuc3RyLmlzZGVjaW1hbCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRlY2ltYWwgY2hhcmFjdGVyc1xuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gRGVjaW1hbFxuICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgZnJvbSBnZW5lcmFsIGNhdGVnb3J5ICJOZCIuIFRoaXMgY2F0ZWdvcnlcbiAgIGluY2x1ZGVzIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICBmb3JtIGRlY2ltYWwtcmFkaXggbnVtYmVycywgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLlxuXG5zdHIuaXNkaWdpdCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyBhbmQgdGhlcmUgaXNcbiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIERpZ2l0cyBpbmNsdWRlIGRlY2ltYWxcbiAgIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCBhcyB0aGVcbiAgIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgYSBjaGFyYWN0ZXJcbiAgIHRoYXQgaGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQgb3JcbiAgIE51bWVyaWNfVHlwZT1EZWNpbWFsLlxuXG5zdHIuaXNpZGVudGlmaWVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgc2VjdGlvbiAqSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzKi5cblxuICAgVXNlICJrZXl3b3JkLmlza2V5d29yZCgpIiB0byB0ZXN0IGZvciByZXNlcnZlZCBpZGVudGlmaWVycyBzdWNoIGFzXG4gICAiZGVmIiBhbmQgImNsYXNzIi5cblxuc3RyLmlzbG93ZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgbG93ZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuaXNudW1lcmljKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gTnVtZXJpY1xuICAgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGhhdmVcbiAgIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksIGUuZy4gVSsyMTU1LCBWVUxHQVIgRlJBQ1RJT05cbiAgIE9ORSBGSUZUSC4gIEZvcm1hbGx5LCBudW1lcmljIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggdGhlXG4gICBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQsIE51bWVyaWNfVHlwZT1EZWNpbWFsIG9yXG4gICBOdW1lcmljX1R5cGU9TnVtZXJpYy5cblxuc3RyLmlzcHJpbnRhYmxlKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgcHJpbnRhYmxlIG9yIHRoZVxuICAgc3RyaW5nIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuICBOb25wcmludGFibGUgY2hhcmFjdGVycyBhcmVcbiAgIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UgYXNcbiAgICJPdGhlciIgb3IgIlNlcGFyYXRvciIsIGV4Y2VwdGluZyB0aGUgQVNDSUkgc3BhY2UgKDB4MjApIHdoaWNoIGlzXG4gICBjb25zaWRlcmVkIHByaW50YWJsZS4gIChOb3RlIHRoYXQgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhpc1xuICAgY29udGV4dCBhcmUgdGhvc2Ugd2hpY2ggc2hvdWxkIG5vdCBiZSBlc2NhcGVkIHdoZW4gInJlcHIoKSIgaXNcbiAgIGludm9rZWQgb24gYSBzdHJpbmcuICBJdCBoYXMgbm8gYmVhcmluZyBvbiB0aGUgaGFuZGxpbmcgb2Ygc3RyaW5nc1xuICAgd3JpdHRlbiB0byAic3lzLnN0ZG91dCIgb3IgInN5cy5zdGRlcnIiLilcblxuc3RyLmlzc3BhY2UoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZ1xuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIFdoaXRlc3BhY2VcbiAgIGNoYXJhY3RlcnMgIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG4gICBkYXRhYmFzZSBhcyAiT3RoZXIiIG9yICJTZXBhcmF0b3IiIGFuZCB0aG9zZSB3aXRoIGJpZGlyZWN0aW9uYWxcbiAgIHByb3BlcnR5IGJlaW5nIG9uZSBvZiAiV1MiLCAiQiIsIG9yICJTIi5cblxuc3RyLmlzdGl0bGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0XG4gICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxuICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlxuICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuam9pbihpdGVyYWJsZSlcblxuICAgUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIGluIHRoZVxuICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgQSAiVHlwZUVycm9yIiB3aWxsIGJlIHJhaXNlZCBpZiB0aGVyZSBhcmVcbiAgIGFueSBub24tc3RyaW5nIHZhbHVlcyBpbiAqaXRlcmFibGUqLCBpbmNsdWRpbmcgImJ5dGVzIiBvYmplY3RzLlxuICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIGlzIHRoZSBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLlxuXG5zdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byAibGVuKHMpIi5cblxuc3RyLmxvd2VyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cblxuICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG5zdHIubHN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlXG4gICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICAgICBcJ3NwYWNpb3VzICAgXCdcbiAgICAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgICAgXCdleGFtcGxlLmNvbVwnXG5cbnN0YXRpYyBzdHIubWFrZXRyYW5zKHhbLCB5Wywgel1dKVxuXG4gICBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIHRyYW5zbGF0aW9uIHRhYmxlIHVzYWJsZSBmb3JcbiAgICJzdHIudHJhbnNsYXRlKCkiLlxuXG4gICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZ1xuICAgVW5pY29kZSBvcmRpbmFscyAoaW50ZWdlcnMpIG9yIGNoYXJhY3RlcnMgKHN0cmluZ3Mgb2YgbGVuZ3RoIDEpIHRvXG4gICBVbmljb2RlIG9yZGluYWxzLCBzdHJpbmdzIChvZiBhcmJpdHJhcnkgbGVuZ3Rocykgb3IgTm9uZS5cbiAgIENoYXJhY3RlciBrZXlzIHdpbGwgdGhlbiBiZSBjb252ZXJ0ZWQgdG8gb3JkaW5hbHMuXG5cbiAgIElmIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzLCB0aGV5IG11c3QgYmUgc3RyaW5ncyBvZiBlcXVhbCBsZW5ndGgsXG4gICBhbmQgaW4gdGhlIHJlc3VsdGluZyBkaWN0aW9uYXJ5LCBlYWNoIGNoYXJhY3RlciBpbiB4IHdpbGwgYmUgbWFwcGVkXG4gICB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHkuICBJZiB0aGVyZSBpcyBhIHRoaXJkXG4gICBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hvc2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hcHBlZCB0b1xuICAgTm9uZSBpbiB0aGUgcmVzdWx0LlxuXG5zdHIucGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnlcbiAgIHR3byBlbXB0eSBzdHJpbmdzLlxuXG5zdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqb2xkKlxuICAgcmVwbGFjZWQgYnkgKm5ldyouICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmNvdW50KiBpcyBnaXZlbiwgb25seVxuICAgdGhlIGZpcnN0ICpjb3VudCogb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLlxuXG5zdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gInNbc3RhcnQ6ZW5kXSIuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiAiLTEiIG9uIGZhaWx1cmUuXG5cbnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSAicmZpbmQoKSIgYnV0IHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byAibGVuKHMpIi5cblxuc3RyLnJwYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5XG4gICB0aGUgc3RyaW5nIGl0c2VsZi5cblxuc3RyLnJzcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgIk5vbmUiLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgZm9yIHNwbGl0dGluZ1xuICAgZnJvbSB0aGUgcmlnaHQsICJyc3BsaXQoKSIgYmVoYXZlcyBsaWtlICJzcGxpdCgpIiB3aGljaCBpc1xuICAgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuc3RyLnJzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG9cbiAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSBzdWZmaXg7IHJhdGhlcixcbiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcucnN0cmlwKClcbiAgICAgIFwnICAgc3BhY2lvdXNcJ1xuICAgICAgPj4+IFwnbWlzc2lzc2lwcGlcJy5yc3RyaXAoXCdpcHpcJylcbiAgICAgIFwnbWlzc2lzc1wnXG5cbnN0ci5zcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCAibWF4c3BsaXQrMSJcbiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciAiLTEiLCB0aGVuIHRoZXJlIGlzXG4gICBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuXG5cbiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclxuICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbiAgICJcJzEsLDJcJy5zcGxpdChcJyxcJykiIHJldHVybnMgIltcJzFcJywgXCdcJywgXCcyXCddIikuICBUaGUgKnNlcCogYXJndW1lbnRcbiAgIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgIlwnMTw+Mjw+M1wnLnNwbGl0KFwnPD5cJykiIHJldHVybnMgIltcJzFcJywgXCcyXCcsIFwnM1wnXSIpLiBTcGxpdHRpbmcgYW5cbiAgIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zICJbXCdcJ10iLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnMSwyLDNcJy5zcGxpdChcJyxcJylcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuICAgICAgPj4+IFwnMSwyLDNcJy5zcGxpdChcJyxcJywgbWF4c3BsaXQ9MSlcbiAgICAgIFtcJzFcJywgXCcyLDNcJ11cbiAgICAgID4+PiBcJzEsMiwsMyxcJy5zcGxpdChcJyxcJylcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnXCcsIFwnM1wnLCBcJ1wnXVxuXG4gICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiwgYSBkaWZmZXJlbnQgc3BsaXR0aW5nXG4gICBhbGdvcml0aG0gaXMgYXBwbGllZDogcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSByZWdhcmRlZFxuICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5nc1xuICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yIHRyYWlsaW5nXG4gICB3aGl0ZXNwYWNlLiAgQ29uc2VxdWVudGx5LCBzcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nXG4gICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgIk5vbmUiIHNlcGFyYXRvciByZXR1cm5zICJbXSIuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCcxIDIgM1wnLnNwbGl0KClcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuICAgICAgPj4+IFwnMSAyIDNcJy5zcGxpdChtYXhzcGxpdD0xKVxuICAgICAgW1wnMVwnLCBcJzIgM1wnXVxuICAgICAgPj4+IFwnICAgMSAgIDIgICAzICAgXCcuc3BsaXQoKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG5cbnN0ci5zcGxpdGxpbmVzKFtrZWVwZW5kc10pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmVcbiAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbiAgIFRoaXMgbWV0aG9kIHNwbGl0cyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgYm91bmRhcmllcy4gIEluXG4gICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsIG5ld2xpbmVzKi5cblxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgUmVwcmVzZW50YXRpb24gICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXFxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lIEZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxyXFxuIiAgICAgICAgICAgICAgICAgIHwgQ2FycmlhZ2UgUmV0dXJuICsgTGluZSBGZWVkICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdiIgb3IgIlxceDBiIiAgICAgICAgICB8IExpbmUgVGFidWxhdGlvbiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXGYiIG9yICJcXHgwYyIgICAgICAgICAgfCBGb3JtIEZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWMiICAgICAgICAgICAgICAgICAgfCBGaWxlIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCBTZXBhcmF0b3IgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgU2VwYXJhdG9yICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4ODUiICAgICAgICAgICAgICAgICAgfCBOZXh0IExpbmUgKEMxIENvbnRyb2wgQ29kZSkgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggU2VwYXJhdG9yICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXFx2IiBhbmQgIlxcZiIgYWRkZWQgdG8gbGlzdCBvZiBsaW5lXG4gICBib3VuZGFyaWVzLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKClcbiAgICAgIFtcJ2FiIGNcJywgXCdcJywgXCdkZSBmZ1wnLCBcJ2tsXCddXG4gICAgICA+Pj4gXCdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcblwnLnNwbGl0bGluZXMoa2VlcGVuZHM9VHJ1ZSlcbiAgICAgIFtcJ2FiIGNcXG5cJywgXCdcXG5cJywgXCdkZSBmZ1xcclwnLCBcJ2tsXFxyXFxuXCddXG5cbiAgIFVubGlrZSAic3BsaXQoKSIgd2hlbiBhIGRlbGltaXRlciBzdHJpbmcgKnNlcCogaXMgZ2l2ZW4sIHRoaXNcbiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsXG4gICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lOlxuXG4gICAgICA+Pj4gIiIuc3BsaXRsaW5lcygpXG4gICAgICBbXVxuICAgICAgPj4+ICJPbmUgbGluZVxcbiIuc3BsaXRsaW5lcygpXG4gICAgICBbXCdPbmUgbGluZVwnXVxuXG4gICBGb3IgY29tcGFyaXNvbiwgInNwbGl0KFwnXFxuXCcpIiBnaXZlczpcblxuICAgICAgPj4+IFwnXCcuc3BsaXQoXCdcXG5cJylcbiAgICAgIFtcJ1wnXVxuICAgICAgPj4+IFwnVHdvIGxpbmVzXFxuXCcuc3BsaXQoXCdcXG5cJylcbiAgICAgIFtcJ1R3byBsaW5lc1wnLCBcJ1wnXVxuXG5zdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gIlRydWUiIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZSByZXR1cm5cbiAgICJGYWxzZSIuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gbG9vayBmb3IuXG4gICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuICAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgc3RyaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cbnN0ci5zdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmdcbiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKlxuICAgYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycyogYXJndW1lbnQgaXNcbiAgIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZVxuICAgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcuc3RyaXAoKVxuICAgICAgXCdzcGFjaW91c1wnXG4gICAgICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5zdHJpcChcJ2Ntb3d6LlwnKVxuICAgICAgXCdleGFtcGxlXCdcblxuICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50IHZhbHVlcyBhcmVcbiAgIHN0cmlwcGVkIGZyb20gdGhlIHN0cmluZy4gQ2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBsZWFkaW5nXG4gICBlbmQgdW50aWwgcmVhY2hpbmcgYSBzdHJpbmcgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgcGxhY2Ugb24gdGhlXG4gICB0cmFpbGluZyBlbmQuIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gY29tbWVudF9zdHJpbmcgPSBcJyMuLi4uLi4uIFNlY3Rpb24gMy4yLjEgSXNzdWUgIzMyIC4uLi4uLi5cJ1xuICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nLnN0cmlwKFwnLiMhIFwnKVxuICAgICAgXCdTZWN0aW9uIDMuMi4xIElzc3VlICMzMlwnXG5cbnN0ci5zd2FwY2FzZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0b1xuICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLiBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUgdGhhdFxuICAgInMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpID09IHMiLlxuXG5zdHIudGl0bGUoKVxuXG4gICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuXG4gICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJ0hlbGxvIHdvcmxkXCcudGl0bGUoKVxuICAgICAgXCdIZWxsbyBXb3JsZFwnXG5cbiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGFcbiAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiB3b3JrcyBpblxuICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kXG4gICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZFxuICAgcmVzdWx0OlxuXG4gICAgICA+Pj4gInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKVxuICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcblxuICAgQSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgcmVndWxhclxuICAgZXhwcmVzc2lvbnM6XG5cbiAgICAgID4+PiBpbXBvcnQgcmVcbiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKFwnW0EtWmEtel0rKT8iLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuICAgICAgLi4uXG4gICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbiAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuXG5zdHIudHJhbnNsYXRlKHRhYmxlKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgaW4gd2hpY2ggZWFjaCBjaGFyYWN0ZXIgaGFzIGJlZW4gbWFwcGVkXG4gICB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGJlIGFuIG9iamVjdFxuICAgdGhhdCBpbXBsZW1lbnRzIGluZGV4aW5nIHZpYSAiX19nZXRpdGVtX18oKSIsIHR5cGljYWxseSBhICptYXBwaW5nKlxuICAgb3IgKnNlcXVlbmNlKi4gIFdoZW4gaW5kZXhlZCBieSBhIFVuaWNvZGUgb3JkaW5hbCAoYW4gaW50ZWdlciksIHRoZVxuICAgdGFibGUgb2JqZWN0IGNhbiBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzogcmV0dXJuIGEgVW5pY29kZSBvcmRpbmFsXG4gICBvciBhIHN0cmluZywgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgY2hhcmFjdGVycztcbiAgIHJldHVybiAiTm9uZSIsIHRvIGRlbGV0ZSB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHJldHVybiBzdHJpbmc7IG9yXG4gICByYWlzZSBhICJMb29rdXBFcnJvciIgZXhjZXB0aW9uLCB0byBtYXAgdGhlIGNoYXJhY3RlciB0byBpdHNlbGYuXG5cbiAgIFlvdSBjYW4gdXNlICJzdHIubWFrZXRyYW5zKCkiIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uIG1hcCBmcm9tXG4gICBjaGFyYWN0ZXItdG8tY2hhcmFjdGVyIG1hcHBpbmdzIGluIGRpZmZlcmVudCBmb3JtYXRzLlxuXG4gICBTZWUgYWxzbyB0aGUgImNvZGVjcyIgbW9kdWxlIGZvciBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggdG8gY3VzdG9tXG4gICBjaGFyYWN0ZXIgbWFwcGluZ3MuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgInN0ci51cHBlcigpLmlzdXBwZXIoKSIgbWlnaHQgYmVcbiAgICJGYWxzZSIgaWYgInMiIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICJcJzBcJyIgZGlnaXRzIHRvXG4gICBtYWtlIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBBIGxlYWRpbmcgc2lnbiBwcmVmaXhcbiAgICgiXCcrXCciLyJcJy1cJyIpIGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nIHRoZSBwYWRkaW5nICphZnRlciogdGhlIHNpZ25cbiAgIGNoYXJhY3RlciByYXRoZXIgdGhhbiBiZWZvcmUuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWZcbiAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+ICI0MiIuemZpbGwoNSlcbiAgICAgIFwnMDAwNDJcJ1xuICAgICAgPj4+ICItNDIiLnpmaWxsKDUpXG4gICAgICBcJy0wMDQyXCdcbicsCisgJ3NwZWNpYWxuYW1lcyc6IHUnXG5TcGVjaWFsIG1ldGhvZCBuYW1lc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IHNwZWNpYWxcbnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieVxuZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uXCdzIGFwcHJvYWNoIHRvXG4qb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3JcbndpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgY2xhc3MgZGVmaW5lc1xuYSBtZXRob2QgbmFtZWQgIl9fZ2V0aXRlbV9fKCkiLCBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsXG50aGVuICJ4W2ldIiBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gInR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSkiLlxuRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb24gcmFpc2UgYW5cbmV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbiJBdHRyaWJ1dGVFcnJvciIgb3IgIlR5cGVFcnJvciIpLlxuXG5XaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzXG5pbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0XG5tYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lXG5zZXF1ZW5jZXMgbWF5IHdvcmsgd2VsbCB3aXRoIHJldHJpZXZhbCBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLCBidXRcbmV4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGVcbiJOb2RlTGlzdCIgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcblxuXG5CYXNpYyBjdXN0b21pemF0aW9uXG49PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mICJ4PT15IiBkb2VzIG5vdCBpbXBseSB0aGF0ICJ4IT15IiBpcyBmYWxzZS5cbiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nICJfX2VxX18oKSIsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgICJfX25lX18oKSIgc28gdGhhdCB0aGUgb3BlcmF0b3JzIHdpbGwgYmVoYXZlIGFzIGV4cGVjdGVkLiAgU2VlIHRoZVxuICAgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmdcbiAgICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kXG4gICBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyByZWZsZWN0aW9uLFxuICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLlxuXG4gICBBcmd1bWVudHMgdG8gcmljaCBjb21wYXJpc29uIG1ldGhvZHMgYXJlIG5ldmVyIGNvZXJjZWQuXG5cbiAgIFRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3RcbiAgIG9wZXJhdGlvbiwgc2VlICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiJcblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkIG5vdFxuICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIlxuICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kXG4gICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgY29sbGVjdGlvbnNcbiAgIHJlcXVpcmVzIHRoYXQgYSBrZXlcJ3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5XG4gICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2hcbiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLlxuXG4gICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSJcbiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlXG4gICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzXG4gICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvXG4gICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSIpLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlclxuICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4gICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvIHN1cHByZXNzXG4gICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzc1xuICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXRcbiAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiIGNhbGwuXG5cbiAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgYW5kXG4gICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSByYW5kb20gdmFsdWUuXG4gICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvblxuICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZlxuICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1cbiAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZVxuICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSBjb21wbGV4aXR5LlxuICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZlxuICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlc1xuICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmRcbiAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cblxub2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdFxuICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cblxuXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgIngubmFtZSIpIGZvclxuY2xhc3MgaW5zdGFuY2VzLlxuXG5vYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlXG4gICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmRcbiAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4gVGhpc1xuICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cblxuICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSxcbiAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyBkb25lIGJvdGggZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlXG4gICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSB0aGF0IGF0XG4gICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieSBub3RcbiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cblxub2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvclxuICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAiX19nZXRhdHRyX18oKSIsXG4gICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4gICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzIG1ldGhvZFxuICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW5cbiAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzXG4gICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yXG4gICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWxcbiAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheFxuICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwKi5cblxub2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlXG4gICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXRcbiAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLFxuICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXNcbiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG5cbm9iamVjdC5fX2Rpcl9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgc2VxdWVuY2UgbXVzdCBiZVxuICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgbGlzdCBhbmRcbiAgIHNvcnRzIGl0LlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG5cbm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcblxuICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlXG4gICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZVxuICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAqaW5zdGFuY2UqIGlzIHRoZVxuICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAiTm9uZSIgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciJcbiAgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZSBhc1xuc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgdGhpc1xuYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljIGNsYXNzXG5hdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlXG5naXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgZmlyc3RcbnBvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyBhdHRyaWJ1dGUgZm9yXG51bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG5cblxuSW52b2tpbmcgRGVzY3JpcHRvcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmdcbmJlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzXG5pbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kXG4iX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwgaXRcbmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlXG50aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0XCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgImEueCIgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbiJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZlxuInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuXG5cblRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgImEueCIuIEhvd1xudGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cblxuSW5zdGFuY2UgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlXG4gICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDpcbiAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cblxuU3VwZXIgQmluZGluZ1xuICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgInN1cGVyKEIsXG4gICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSBiYXNlIGNsYXNzICJBIlxuICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlXG4gICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pIi5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAiX19kZWxldGVfXygpIi4gIElmIGl0XG5kb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbnRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlIG9iamVjdFwnc1xuaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgYW5kL29yXG4iX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgbmVpdGhlciwgaXQgaXNcbmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoXG4iX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGVcbiJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgIl9fZ2V0X18oKSJcbmRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJblxuY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy5cblxuUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAiY2xhc3NtZXRob2QoKSIpIGFyZVxuaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuXG5BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS5cblxuXG5fX3Nsb3RzX19cbi0tLS0tLS0tLVxuXG5CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlXG5zdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlXG52YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuIGNyZWF0aW5nIGxhcmdlXG5udW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBjbGFzc1xuZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbnZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byBob2xkIGFcbnZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzIG5vdFxuY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxub2JqZWN0Ll9fc2xvdHNfX1xuXG4gICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4gICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAqX19zbG90c19fKlxuICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZVxuICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2hcbiAgIGluc3RhbmNlLlxuXG5cbk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzXG4gIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHNcbiAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbiAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGVcbiAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZVxuICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuXG4gIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgImJ5dGVzIiBhbmQgInR1cGxlIi5cblxuKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4gIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyBtYXkgYmVcbiAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuXG4qICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZVxuICAqX19zbG90c19fKi5cblxuXG5DdXN0b21pemluZyBjbGFzcyBjcmVhdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQnkgZGVmYXVsdCwgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgInR5cGUoKSIuIFRoZSBjbGFzcyBib2R5IGlzXG5leGVjdXRlZCBpbiBhIG5ldyBuYW1lc3BhY2UgYW5kIHRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIGxvY2FsbHkgdG8gdGhlXG5yZXN1bHQgb2YgInR5cGUobmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkiLlxuXG5UaGUgY2xhc3MgY3JlYXRpb24gcHJvY2VzcyBjYW4gYmUgY3VzdG9taXNlZCBieSBwYXNzaW5nIHRoZVxuIm1ldGFjbGFzcyIga2V5d29yZCBhcmd1bWVudCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBsaW5lLCBvciBieVxuaW5oZXJpdGluZyBmcm9tIGFuIGV4aXN0aW5nIGNsYXNzIHRoYXQgaW5jbHVkZWQgc3VjaCBhbiBhcmd1bWVudC4gSW5cbnRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgYm90aCAiTXlDbGFzcyIgYW5kICJNeVN1YmNsYXNzIiBhcmUgaW5zdGFuY2VzXG5vZiAiTWV0YSI6XG5cbiAgIGNsYXNzIE1ldGEodHlwZSk6XG4gICAgICAgcGFzc1xuXG4gICBjbGFzcyBNeUNsYXNzKG1ldGFjbGFzcz1NZXRhKTpcbiAgICAgICBwYXNzXG5cbiAgIGNsYXNzIE15U3ViY2xhc3MoTXlDbGFzcyk6XG4gICAgICAgcGFzc1xuXG5Bbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uXG5hcmUgcGFzc2VkIHRocm91Z2ggdG8gYWxsIG1ldGFjbGFzcyBvcGVyYXRpb25zIGRlc2NyaWJlZCBiZWxvdy5cblxuV2hlbiBhIGNsYXNzIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQsIHRoZSBmb2xsb3dpbmcgc3RlcHMgb2NjdXI6XG5cbiogdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBpcyBkZXRlcm1pbmVkXG5cbiogdGhlIGNsYXNzIG5hbWVzcGFjZSBpcyBwcmVwYXJlZFxuXG4qIHRoZSBjbGFzcyBib2R5IGlzIGV4ZWN1dGVkXG5cbiogdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkXG5cblxuRGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGZvciBhIGNsYXNzIGRlZmluaXRpb24gaXMgZGV0ZXJtaW5lZCBhc1xuZm9sbG93czpcblxuKiBpZiBubyBiYXNlcyBhbmQgbm8gZXhwbGljaXQgbWV0YWNsYXNzIGFyZSBnaXZlbiwgdGhlbiAidHlwZSgpIiBpc1xuICB1c2VkXG5cbiogaWYgYW4gZXhwbGljaXQgbWV0YWNsYXNzIGlzIGdpdmVuIGFuZCBpdCBpcyAqbm90KiBhbiBpbnN0YW5jZSBvZlxuICAidHlwZSgpIiwgdGhlbiBpdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBtZXRhY2xhc3NcblxuKiBpZiBhbiBpbnN0YW5jZSBvZiAidHlwZSgpIiBpcyBnaXZlbiBhcyB0aGUgZXhwbGljaXQgbWV0YWNsYXNzLCBvclxuICBiYXNlcyBhcmUgZGVmaW5lZCwgdGhlbiB0aGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyB1c2VkXG5cblRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHNlbGVjdGVkIGZyb20gdGhlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG5tZXRhY2xhc3MgKGlmIGFueSkgYW5kIHRoZSBtZXRhY2xhc3NlcyAoaS5lLiAidHlwZShjbHMpIikgb2YgYWxsXG5zcGVjaWZpZWQgYmFzZSBjbGFzc2VzLiBUaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBvbmUgd2hpY2ggaXMgYVxuc3VidHlwZSBvZiAqYWxsKiBvZiB0aGVzZSBjYW5kaWRhdGUgbWV0YWNsYXNzZXMuIElmIG5vbmUgb2YgdGhlXG5jYW5kaWRhdGUgbWV0YWNsYXNzZXMgbWVldHMgdGhhdCBjcml0ZXJpb24sIHRoZW4gdGhlIGNsYXNzIGRlZmluaXRpb25cbndpbGwgZmFpbCB3aXRoICJUeXBlRXJyb3IiLlxuXG5cblByZXBhcmluZyB0aGUgY2xhc3MgbmFtZXNwYWNlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5PbmNlIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaGFzIGJlZW4gaWRlbnRpZmllZCwgdGhlbiB0aGUgY2xhc3Ncbm5hbWVzcGFjZSBpcyBwcmVwYXJlZC4gSWYgdGhlIG1ldGFjbGFzcyBoYXMgYSAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSxcbml0IGlzIGNhbGxlZCBhcyAibmFtZXNwYWNlID0gbWV0YWNsYXNzLl9fcHJlcGFyZV9fKG5hbWUsIGJhc2VzLFxuKiprd2RzKSIgKHdoZXJlIHRoZSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLCBpZiBhbnksIGNvbWUgZnJvbVxudGhlIGNsYXNzIGRlZmluaXRpb24pLlxuXG5JZiB0aGUgbWV0YWNsYXNzIGhhcyBubyAiX19wcmVwYXJlX18iIGF0dHJpYnV0ZSwgdGhlbiB0aGUgY2xhc3Ncbm5hbWVzcGFjZSBpcyBpbml0aWFsaXNlZCBhcyBhbiBlbXB0eSAiZGljdCgpIiBpbnN0YW5jZS5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzMDAwXG5cbiAgICAgSW50cm9kdWNlZCB0aGUgIl9fcHJlcGFyZV9fIiBuYW1lc3BhY2UgaG9va1xuXG5cbkV4ZWN1dGluZyB0aGUgY2xhc3MgYm9keVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBjbGFzcyBib2R5IGlzIGV4ZWN1dGVkIChhcHByb3hpbWF0ZWx5KSBhcyAiZXhlYyhib2R5LCBnbG9iYWxzKCksXG5uYW1lc3BhY2UpIi4gVGhlIGtleSBkaWZmZXJlbmNlIGZyb20gYSBub3JtYWwgY2FsbCB0byAiZXhlYygpIiBpcyB0aGF0XG5sZXhpY2FsIHNjb3BpbmcgYWxsb3dzIHRoZSBjbGFzcyBib2R5IChpbmNsdWRpbmcgYW55IG1ldGhvZHMpIHRvXG5yZWZlcmVuY2UgbmFtZXMgZnJvbSB0aGUgY3VycmVudCBhbmQgb3V0ZXIgc2NvcGVzIHdoZW4gdGhlIGNsYXNzXG5kZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgYSBmdW5jdGlvbi5cblxuSG93ZXZlciwgZXZlbiB3aGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9jY3VycyBpbnNpZGUgdGhlIGZ1bmN0aW9uLFxubWV0aG9kcyBkZWZpbmVkIGluc2lkZSB0aGUgY2xhc3Mgc3RpbGwgY2Fubm90IHNlZSBuYW1lcyBkZWZpbmVkIGF0IHRoZVxuY2xhc3Mgc2NvcGUuIENsYXNzIHZhcmlhYmxlcyBtdXN0IGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGZpcnN0XG5wYXJhbWV0ZXIgb2YgaW5zdGFuY2Ugb3IgY2xhc3MgbWV0aG9kcywgYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBhdCBhbGxcbmZyb20gc3RhdGljIG1ldGhvZHMuXG5cblxuQ3JlYXRpbmcgdGhlIGNsYXNzIG9iamVjdFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5PbmNlIHRoZSBjbGFzcyBuYW1lc3BhY2UgaGFzIGJlZW4gcG9wdWxhdGVkIGJ5IGV4ZWN1dGluZyB0aGUgY2xhc3NcbmJvZHksIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCBieSBjYWxsaW5nICJtZXRhY2xhc3MobmFtZSwgYmFzZXMsXG5uYW1lc3BhY2UsICoqa3dkcykiICh0aGUgYWRkaXRpb25hbCBrZXl3b3JkcyBwYXNzZWQgaGVyZSBhcmUgdGhlIHNhbWVcbmFzIHRob3NlIHBhc3NlZCB0byAiX19wcmVwYXJlX18iKS5cblxuVGhpcyBjbGFzcyBvYmplY3QgaXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgcmVmZXJlbmNlZCBieSB0aGUgemVyby1cbmFyZ3VtZW50IGZvcm0gb2YgInN1cGVyKCkiLiAiX19jbGFzc19fIiBpcyBhbiBpbXBsaWNpdCBjbG9zdXJlXG5yZWZlcmVuY2UgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaWYgYW55IG1ldGhvZHMgaW4gYSBjbGFzcyBib2R5IHJlZmVyXG50byBlaXRoZXIgIl9fY2xhc3NfXyIgb3IgInN1cGVyIi4gVGhpcyBhbGxvd3MgdGhlIHplcm8gYXJndW1lbnQgZm9ybVxub2YgInN1cGVyKCkiIHRvIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgY2xhc3MgYmVpbmcgZGVmaW5lZCBiYXNlZCBvblxubGV4aWNhbCBzY29waW5nLCB3aGlsZSB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UgdGhhdCB3YXMgdXNlZCB0byBtYWtlIHRoZVxuY3VycmVudCBjYWxsIGlzIGlkZW50aWZpZWQgYmFzZWQgb24gdGhlIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byB0aGVcbm1ldGhvZC5cblxuQWZ0ZXIgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkLCBpdCBpcyBwYXNzZWQgdG8gdGhlIGNsYXNzXG5kZWNvcmF0b3JzIGluY2x1ZGVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIChpZiBhbnkpIGFuZCB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyB0aGUgZGVmaW5lZCBjbGFzcy5cblxuU2VlIGFsc286ICoqUEVQIDMxMzUqKiAtIE5ldyBzdXBlclxuXG4gICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2VcblxuXG5NZXRhY2xhc3MgZXhhbXBsZVxuLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZVxuYmVlbiBleHBsb3JlZCBpbmNsdWRlIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgYXV0b21hdGljXG5kZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsIGZyYW1ld29ya3MsIGFuZFxuYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLlxuXG5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRhY2xhc3MgdGhhdCB1c2VzIGFuXG4iY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiIHRvIHJlbWVtYmVyIHRoZSBvcmRlciB0aGF0IGNsYXNzIHZhcmlhYmxlc1xuYXJlIGRlZmluZWQ6XG5cbiAgIGNsYXNzIE9yZGVyZWRDbGFzcyh0eXBlKTpcblxuICAgICAgICBAY2xhc3NtZXRob2RcbiAgICAgICAgZGVmIF9fcHJlcGFyZV9fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCAqKmt3ZHMpOlxuICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKVxuXG4gICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2RzKTpcbiAgICAgICAgICAgcmVzdWx0ID0gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3QobmFtZXNwYWNlKSlcbiAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMgPSB0dXBsZShuYW1lc3BhY2UpXG4gICAgICAgICAgIHJldHVybiByZXN1bHRcblxuICAgY2xhc3MgQShtZXRhY2xhc3M9T3JkZXJlZENsYXNzKTpcbiAgICAgICBkZWYgb25lKHNlbGYpOiBwYXNzXG4gICAgICAgZGVmIHR3byhzZWxmKTogcGFzc1xuICAgICAgIGRlZiB0aHJlZShzZWxmKTogcGFzc1xuICAgICAgIGRlZiBmb3VyKHNlbGYpOiBwYXNzXG5cbiAgID4+PiBBLm1lbWJlcnNcbiAgIChcJ19fbW9kdWxlX19cJywgXCdvbmVcJywgXCd0d29cJywgXCd0aHJlZVwnLCBcJ2ZvdXJcJylcblxuV2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBmb3IgKkEqIGdldHMgZXhlY3V0ZWQsIHRoZSBwcm9jZXNzIGJlZ2luc1xud2l0aCBjYWxsaW5nIHRoZSBtZXRhY2xhc3NcJ3MgIl9fcHJlcGFyZV9fKCkiIG1ldGhvZCB3aGljaCByZXR1cm5zIGFuXG5lbXB0eSAiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLiAgVGhhdCBtYXBwaW5nIHJlY29yZHMgdGhlIG1ldGhvZHMgYW5kXG5hdHRyaWJ1dGVzIG9mICpBKiBhcyB0aGV5IGFyZSBkZWZpbmVkIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgY2xhc3NcbnN0YXRlbWVudC4gT25jZSB0aG9zZSBkZWZpbml0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBvcmRlcmVkIGRpY3Rpb25hcnlcbmlzIGZ1bGx5IHBvcHVsYXRlZCBhbmQgdGhlIG1ldGFjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgZ2V0c1xuaW52b2tlZC4gIFRoYXQgbWV0aG9kIGJ1aWxkcyB0aGUgbmV3IHR5cGUgYW5kIGl0IHNhdmVzIHRoZSBvcmRlcmVkXG5kaWN0aW9uYXJ5IGtleXMgaW4gYW4gYXR0cmlidXRlIGNhbGxlZCAibWVtYmVycyIuXG5cblxuQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlXG4iaXNpbnN0YW5jZSgpIiBhbmQgImlzc3ViY2xhc3MoKSIgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5JbiBwYXJ0aWN1bGFyLCB0aGUgbWV0YWNsYXNzICJhYmMuQUJDTWV0YSIgaW1wbGVtZW50cyB0aGVzZSBtZXRob2RzIGluXG5vcmRlciB0byBhbGxvdyB0aGUgYWRkaXRpb24gb2YgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBhc1xuInZpcnR1YWwgYmFzZSBjbGFzc2VzIiB0byBhbnkgY2xhc3Mgb3IgdHlwZSAoaW5jbHVkaW5nIGJ1aWx0LWluXG50eXBlcyksIGluY2x1ZGluZyBvdGhlciBBQkNzLlxuXG5jbGFzcy5fX2luc3RhbmNlY2hlY2tfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgUmV0dXJuIHRydWUgaWYgKmluc3RhbmNlKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3JcbiAgIGluZGlyZWN0KSBpbnN0YW5jZSBvZiAqY2xhc3MqLiBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICAiaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpIi5cblxuY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpXG5cbiAgIFJldHVybiB0cnVlIGlmICpzdWJjbGFzcyogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgICJpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcykiLlxuXG5Ob3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgbG9va2VkIHVwIG9uIHRoZSB0eXBlIChtZXRhY2xhc3MpIG9mIGFcbmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuXG5UaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWRcbm9uIGluc3RhbmNlcywgb25seSBpbiB0aGlzIGNhc2UgdGhlIGluc3RhbmNlIGlzIGl0c2VsZiBhIGNsYXNzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG5cbiAgICAgSW5jbHVkZXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIGN1c3RvbWl6aW5nICJpc2luc3RhbmNlKCkiIGFuZFxuICAgICAiaXNzdWJjbGFzcygpIiBiZWhhdmlvciB0aHJvdWdoICJfX2luc3RhbmNlY2hlY2tfXygpIiBhbmRcbiAgICAgIl9fc3ViY2xhc3NjaGVja19fKCkiLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpblxuICAgICB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlICJhYmMiXG4gICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLlxuXG5cbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG5cblxuRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLlxuQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSBvciBtYXBwaW5nc1xuKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLiAgVGhlXG5maXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG9cbmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGVcbmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSBrIDwgTiIgd2hlcmVcbipOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggZGVmaW5lIGFcbnJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGUgdGhlXG5tZXRob2RzICJrZXlzKCkiLCAidmFsdWVzKCkiLCAiaXRlbXMoKSIsICJnZXQoKSIsICJjbGVhcigpIixcbiJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAidXBkYXRlKCkiXG5iZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLlxuVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiBhYnN0cmFjdCBiYXNlXG5jbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAiX19nZXRpdGVtX18oKSIsXG4iX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlIHNlcXVlbmNlc1xuc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgImV4dGVuZCgpIixcbiJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgbGlrZSBQeXRob25cbnN0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnRcbmFkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZ1xucmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICJfX3JhZGRfXygpIixcbiJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiIGRlc2NyaWJlZFxuYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4iX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iIG9wZXJhdG9yO1xuZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yIHNlcXVlbmNlcywgaXRcbnNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGhcbm1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvIGFsbG93XG5lZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAiX19pdGVyX18oKSJcbnNob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGVcbnRocm91Z2ggdGhlIHZhbHVlcy5cblxub2JqZWN0Ll9fbGVuX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdFxuICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kXG4gICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkIHJldHVybiBhblxuICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuXG4gICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhpc1xuICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkIGZvclxuICAgY29ycmVjdG5lc3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLlxuICBBIGNhbGwgbGlrZVxuXG4gICAgIGFbMToyXSA9IGJcblxuICBpcyB0cmFuc2xhdGVkIHRvXG5cbiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG5cbiAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiB3aXRoICJOb25lIi5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3Igc2VxdWVuY2UgdHlwZXMsXG4gICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICBOb3RlIHRoYXRcbiAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSBjbGFzcyB3aXNoZXNcbiAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4gSWZcbiAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlIHJhaXNlZDsgaWYgb2ZcbiAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55XG4gICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiBzaG91bGQgYmVcbiAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGVcbiAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iIGZvciBkaWN0XG4gICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSJcbiAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAoIl9fbGVuX18oKSJcbiAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sXG4gICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhblxuICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnlcbiAgICJyZXZlcnNlZCgpIi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlIG1lbWJlcnNoaXAgdGVzdFxuICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZVxuICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSAqdGhpcyBzZWN0aW9uIGluIHRoZVxuICAgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cblxuXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuXG5cbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG9cbmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlclxuaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dFxuZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseVxuaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gKlRoZSB3aXRoXG5zdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgIndpdGgiXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS5cblxub2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcblxuICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzXG4gICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlXG4gICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbFxuICAgYmUgIk5vbmUiLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOiAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cblxuXG5TcGVjaWFsIG1ldGhvZCBsb29rdXBcbj09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3IgY3VzdG9tIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmUgb25seVxuZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdFwncyB0eXBlLCBub3QgaW5cbnRoZSBvYmplY3RcJ3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSByZWFzb24gd2h5XG50aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbjpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18gPSBsYW1iZGE6IDVcbiAgID4+PiBsZW4oYylcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIFR5cGVFcnJvcjogb2JqZWN0IG9mIHR5cGUgXCdDXCcgaGFzIG5vIGxlbigpXG5cblRoZSByYXRpb25hbGUgYmVoaW5kIHRoaXMgYmVoYXZpb3VyIGxpZXMgd2l0aCBhIG51bWJlciBvZiBzcGVjaWFsXG5tZXRob2RzIHN1Y2ggYXMgIl9faGFzaF9fKCkiIGFuZCAiX19yZXByX18oKSIgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnlcbmFsbCBvYmplY3RzLCBpbmNsdWRpbmcgdHlwZSBvYmplY3RzLiBJZiB0aGUgaW1wbGljaXQgbG9va3VwIG9mIHRoZXNlXG5tZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsIHdoZW5cbmludm9rZWQgb24gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjpcblxuICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IGludC5fX2hhc2hfXygpID09IGhhc2goaW50KVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBkZXNjcmlwdG9yIFwnX19oYXNoX19cJyBvZiBcJ2ludFwnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFxuXG5JbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhIGNsYXNzIGluIHRoaXNcbndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgXCdtZXRhY2xhc3MgY29uZnVzaW9uXCcsIGFuZCBpcyBhdm9pZGVkXG5ieSBieXBhc3NpbmcgdGhlIGluc3RhbmNlIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHM6XG5cbiAgID4+PiB0eXBlKDEpLl9faGFzaF9fKDEpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiB0eXBlKGludCkuX19oYXNoX18oaW50KSA9PSBoYXNoKGludClcbiAgIFRydWVcblxuSW4gYWRkaXRpb24gdG8gYnlwYXNzaW5nIGFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGluIHRoZSBpbnRlcmVzdCBvZlxuY29ycmVjdG5lc3MsIGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBnZW5lcmFsbHkgYWxzbyBieXBhc3Nlc1xudGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBldmVuIG9mIHRoZSBvYmplY3RcJ3MgbWV0YWNsYXNzOlxuXG4gICA+Pj4gY2xhc3MgTWV0YSh0eXBlKTpcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQoIk1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4gICAuLi4gICAgICAgICByZXR1cm4gdHlwZS5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gY2xhc3MgQyhvYmplY3QsIG1ldGFjbGFzcz1NZXRhKTpcbiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gMTBcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQoIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbiAgIC4uLiAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18oKSAgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIGluc3RhbmNlXG4gICBDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiB0eXBlKGMpLl9fbGVuX18oYykgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIHR5cGVcbiAgIE1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiBsZW4oYykgICAgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdCBsb29rdXBcbiAgIDEwXG5cbkJ5cGFzc2luZyB0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWFjaGluZXJ5IGluIHRoaXMgZmFzaGlvbiBwcm92aWRlc1xuc2lnbmlmaWNhbnQgc2NvcGUgZm9yIHNwZWVkIG9wdGltaXNhdGlvbnMgd2l0aGluIHRoZSBpbnRlcnByZXRlciwgYXRcbnRoZSBjb3N0IG9mIHNvbWUgZmxleGliaWxpdHkgaW4gdGhlIGhhbmRsaW5nIG9mIHNwZWNpYWwgbWV0aG9kcyAodGhlXG5zcGVjaWFsIG1ldGhvZCAqbXVzdCogYmUgc2V0IG9uIHRoZSBjbGFzcyBvYmplY3QgaXRzZWxmIGluIG9yZGVyIHRvIGJlXG5jb25zaXN0ZW50bHkgaW52b2tlZCBieSB0aGUgaW50ZXJwcmV0ZXIpLlxuJywKKyAnc3RyaW5nLW1ldGhvZHMnOiB1J1xuU3RyaW5nIE1ldGhvZHNcbioqKioqKioqKioqKioqXG5cblN0cmluZ3MgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogc2VxdWVuY2Ugb3BlcmF0aW9ucywgYWxvbmcgd2l0aFxudGhlIGFkZGl0aW9uYWwgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cuXG5cblN0cmluZ3MgYWxzbyBzdXBwb3J0IHR3byBzdHlsZXMgb2Ygc3RyaW5nIGZvcm1hdHRpbmcsIG9uZSBwcm92aWRpbmcgYVxubGFyZ2UgZGVncmVlIG9mIGZsZXhpYmlsaXR5IGFuZCBjdXN0b21pemF0aW9uIChzZWUgInN0ci5mb3JtYXQoKSIsXG4qRm9ybWF0IFN0cmluZyBTeW50YXgqIGFuZCAqU3RyaW5nIEZvcm1hdHRpbmcqKSBhbmQgdGhlIG90aGVyIGJhc2VkIG9uXG5DICJwcmludGYiIHN0eWxlIGZvcm1hdHRpbmcgdGhhdCBoYW5kbGVzIGEgbmFycm93ZXIgcmFuZ2Ugb2YgdHlwZXMgYW5kXG5pcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuIGZhc3RlciBmb3IgdGhlIGNhc2VzXG5pdCBjYW4gaGFuZGxlICgqcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKikuXG5cblRoZSAqVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzKiBzZWN0aW9uIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGNvdmVyc1xuYSBudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgdmFyaW91cyB0ZXh0IHJlbGF0ZWQgdXRpbGl0aWVzXG4oaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiIG1vZHVsZSkuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbnN0ci5jYXNlZm9sZCgpXG5cbiAgIFJldHVybiBhIGNhc2Vmb2xkZWQgY29weSBvZiB0aGUgc3RyaW5nLiBDYXNlZm9sZGVkIHN0cmluZ3MgbWF5IGJlXG4gICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy5cblxuICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSBhZ2dyZXNzaXZlIGJlY2F1c2VcbiAgIGl0IGlzIGludGVuZGVkIHRvIHJlbW92ZSBhbGwgY2FzZSBkaXN0aW5jdGlvbnMgaW4gYSBzdHJpbmcuIEZvclxuICAgZXhhbXBsZSwgdGhlIEdlcm1hbiBsb3dlcmNhc2UgbGV0dGVyICJcJ1x4ZGZcJyIgaXMgZXF1aXZhbGVudCB0byAiInNzIiIuXG4gICBTaW5jZSBpdCBpcyBhbHJlYWR5IGxvd2VyY2FzZSwgImxvd2VyKCkiIHdvdWxkIGRvIG5vdGhpbmcgdG8gIlwnXHhkZlwnIjtcbiAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuXG5cbiAgIFRoZSBjYXNlZm9sZGluZyBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cblxuc3RyLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nIGlzIGRvbmVcbiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSBzcGFjZSkuIFRoZVxuICAgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAibGVuKHMpIi5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5lbmNvZGUoZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJzdHJpY3QiKVxuXG4gICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgYSBieXRlcyBvYmplY3QuIERlZmF1bHRcbiAgIGVuY29kaW5nIGlzICJcJ3V0Zi04XCciLiAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgZGlmZmVyZW50XG4gICBlcnJvciBoYW5kbGluZyBzY2hlbWUuIFRoZSBkZWZhdWx0IGZvciAqZXJyb3JzKiBpcyAiXCdzdHJpY3RcJyIsXG4gICBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEgIlVuaWNvZGVFcnJvciIuIE90aGVyIHBvc3NpYmxlXG4gICB2YWx1ZXMgYXJlICJcJ2lnbm9yZVwnIiwgIlwncmVwbGFjZVwnIiwgIlwneG1sY2hhcnJlZnJlcGxhY2VcJyIsXG4gICAiXCdiYWNrc2xhc2hyZXBsYWNlXCciIGFuZCBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYVxuICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIiwgc2VlIHNlY3Rpb24gKkVycm9yIEhhbmRsZXJzKi4gRm9yIGEgbGlzdFxuICAgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWUgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gIlRydWUiIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgKnN1ZmZpeCosXG4gICBvdGhlcndpc2UgcmV0dXJuICJGYWxzZSIuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN1ZmZpeGVzXG4gICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXG5zdHIuZXhwYW5kdGFicyh0YWJzaXplPTgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkXG4gICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gYW5kIHRoZVxuICAgZ2l2ZW4gdGFiIHNpemUuICBUYWIgcG9zaXRpb25zIG9jY3VyIGV2ZXJ5ICp0YWJzaXplKiBjaGFyYWN0ZXJzXG4gICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2IGFuZCBzbyBvbikuXG4gICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvIGFuZCB0aGVcbiAgIHN0cmluZyBpcyBleGFtaW5lZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICB0YWIgKCJcXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIHJlc3VsdFxuICAgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4gKFRoZVxuICAgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgbmV3bGluZVxuICAgKCJcXG4iKSBvciByZXR1cm4gKCJcXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXNcbiAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgYW5kIHRoZVxuICAgY3VycmVudCBjb2x1bW4gaXMgaW5jcmVtZW50ZWQgYnkgb25lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZVxuICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC5cblxuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKClcbiAgIFwnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzRcJ1xuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKDQpXG4gICBcJzAxICAwMTIgMDEyMyAgICAwMTIzNFwnXG5cbnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCBpbiB0aGUgc2xpY2UgInNbc3RhcnQ6ZW5kXSIuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiAiLTEiIGlmICpzdWIqIGlzIG5vdCBmb3VuZC5cblxuICAgTm90ZTogVGhlICJmaW5kKCkiIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSBuZWVkIHRvIGtub3dcbiAgICAgdGhlIHBvc2l0aW9uIG9mICpzdWIqLiAgVG8gY2hlY2sgaWYgKnN1YiogaXMgYSBzdWJzdHJpbmcgb3Igbm90LFxuICAgICB1c2UgdGhlICJpbiIgb3BlcmF0b3I6XG5cbiAgICAgICAgPj4+IFwnUHlcJyBpbiBcJ1B5dGhvblwnXG4gICAgICAgIFRydWVcblxuc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG5cbiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXNcbiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkc1xuICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyAie30iLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXJcbiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYVxuICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaFxuICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZVxuICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cblxuICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMilcbiAgIFwnVGhlIHN1bSBvZiAxICsgMiBpcyAzXCdcblxuICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXNcbiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuXG5cbnN0ci5mb3JtYXRfbWFwKG1hcHBpbmcpXG5cbiAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICJtYXBwaW5nIiBpcyB1c2VkXG4gICBkaXJlY3RseSBhbmQgbm90IGNvcGllZCB0byBhICJkaWN0Ii4gIFRoaXMgaXMgdXNlZnVsIGlmIGZvciBleGFtcGxlXG4gICAibWFwcGluZyIgaXMgYSBkaWN0IHN1YmNsYXNzOlxuXG4gICA+Pj4gY2xhc3MgRGVmYXVsdChkaWN0KTpcbiAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4gICAuLi4gICAgICAgICByZXR1cm4ga2V5XG4gICAuLi5cbiAgID4+PiBcJ3tuYW1lfSB3YXMgYm9ybiBpbiB7Y291bnRyeX1cJy5mb3JtYXRfbWFwKERlZmF1bHQobmFtZT1cJ0d1aWRvXCcpKVxuICAgXCdHdWlkbyB3YXMgYm9ybiBpbiBjb3VudHJ5XCdcblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSAiZmluZCgpIiwgYnV0IHJhaXNlICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90XG4gICBmb3VuZC5cblxuc3RyLmlzYWxudW0oKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBIGNoYXJhY3RlciAiYyJcbiAgIGlzIGFscGhhbnVtZXJpYyBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyByZXR1cm5zICJUcnVlIjpcbiAgICJjLmlzYWxwaGEoKSIsICJjLmlzZGVjaW1hbCgpIiwgImMuaXNkaWdpdCgpIiwgb3IgImMuaXNudW1lcmljKCkiLlxuXG5zdHIuaXNhbHBoYSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBbHBoYWJldGljXG4gICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG4gICBkYXRhYmFzZSBhcyAiTGV0dGVyIiwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5IHByb3BlcnR5XG4gICBiZWluZyBvbmUgb2YgIkxtIiwgIkx0IiwgIkx1IiwgIkxsIiwgb3IgIkxvIi4gIE5vdGUgdGhhdCB0aGlzIGlzXG4gICBkaWZmZXJlbnQgZnJvbSB0aGUgIkFscGhhYmV0aWMiIHByb3BlcnR5IGRlZmluZWQgaW4gdGhlIFVuaWNvZGVcbiAgIFN0YW5kYXJkLlxuXG5zdHIuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGVjaW1hbCBjaGFyYWN0ZXJzXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiBEZWNpbWFsXG4gICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBmcm9tIGdlbmVyYWwgY2F0ZWdvcnkgIk5kIi4gVGhpcyBjYXRlZ29yeVxuICAgaW5jbHVkZXMgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbiAgIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG5cbnN0ci5pc2RpZ2l0KClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGlnaXRzIGFuZCB0aGVyZSBpc1xuICAgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgRGlnaXRzIGluY2x1ZGUgZGVjaW1hbFxuICAgY2hhcmFjdGVycyBhbmQgZGlnaXRzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoIGFzIHRoZVxuICAgY29tcGF0aWJpbGl0eSBzdXBlcnNjcmlwdCBkaWdpdHMuICBGb3JtYWxseSwgYSBkaWdpdCBpcyBhIGNoYXJhY3RlclxuICAgdGhhdCBoYXMgdGhlIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvclxuICAgTnVtZXJpY19UeXBlPURlY2ltYWwuXG5cbnN0ci5pc2lkZW50aWZpZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciBhY2NvcmRpbmcgdG8gdGhlXG4gICBsYW5ndWFnZSBkZWZpbml0aW9uLCBzZWN0aW9uICpJZGVudGlmaWVycyBhbmQga2V5d29yZHMqLlxuXG4gICBVc2UgImtleXdvcmQuaXNrZXl3b3JkKCkiIHRvIHRlc3QgZm9yIHJlc2VydmVkIGlkZW50aWZpZXJzIHN1Y2ggYXNcbiAgICJkZWYiIGFuZCAiY2xhc3MiLlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljIGNoYXJhY3RlcnMsXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiBOdW1lcmljXG4gICBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZVxuICAgdGhlIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZSBwcm9wZXJ0eSwgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTlxuICAgT05FIEZJRlRILiAgRm9ybWFsbHksIG51bWVyaWMgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCB0aGVcbiAgIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCwgTnVtZXJpY19UeXBlPURlY2ltYWwgb3JcbiAgIE51bWVyaWNfVHlwZT1OdW1lcmljLlxuXG5zdHIuaXNwcmludGFibGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBwcmludGFibGUgb3IgdGhlXG4gICBzdHJpbmcgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4gIE5vbnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZVxuICAgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZSBhc1xuICAgIk90aGVyIiBvciAiU2VwYXJhdG9yIiwgZXhjZXB0aW5nIHRoZSBBU0NJSSBzcGFjZSAoMHgyMCkgd2hpY2ggaXNcbiAgIGNvbnNpZGVyZWQgcHJpbnRhYmxlLiAgKE5vdGUgdGhhdCBwcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGlzXG4gICBjb250ZXh0IGFyZSB0aG9zZSB3aGljaCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2hlbiAicmVwcigpIiBpc1xuICAgaW52b2tlZCBvbiBhIHN0cmluZy4gIEl0IGhhcyBubyBiZWFyaW5nIG9uIHRoZSBoYW5kbGluZyBvZiBzdHJpbmdzXG4gICB3cml0dGVuIHRvICJzeXMuc3Rkb3V0IiBvciAic3lzLnN0ZGVyciIuKVxuXG5zdHIuaXNzcGFjZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgV2hpdGVzcGFjZVxuICAgY2hhcmFjdGVycyAgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcbiAgIGRhdGFiYXNlIGFzICJPdGhlciIgb3IgIlNlcGFyYXRvciIgYW5kIHRob3NlIHdpdGggYmlkaXJlY3Rpb25hbFxuICAgcHJvcGVydHkgYmVpbmcgb25lIG9mICJXUyIsICJCIiwgb3IgIlMiLlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuaXN1cHBlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSB1cHBlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5qb2luKGl0ZXJhYmxlKVxuXG4gICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlXG4gICAqaXRlcmFibGUqICppdGVyYWJsZSouICBBICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmIHRoZXJlIGFyZVxuICAgYW55IG5vbi1zdHJpbmcgdmFsdWVzIGluICppdGVyYWJsZSosIGluY2x1ZGluZyAiYnl0ZXMiIG9iamVjdHMuXG4gICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuXG5cbnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvICJsZW4ocykiLlxuXG5zdHIubG93ZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBUaGUgbG93ZXJjYXNpbmcgYWxnb3JpdGhtIHVzZWQgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbnN0ci5sc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG9cbiAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXg7IHJhdGhlcixcbiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcubHN0cmlwKClcbiAgICAgIFwnc3BhY2lvdXMgICBcJ1xuICAgICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcubHN0cmlwKFwnY21vd3ouXCcpXG4gICAgICBcJ2V4YW1wbGUuY29tXCdcblxuc3RhdGljIHN0ci5tYWtldHJhbnMoeFssIHlbLCB6XV0pXG5cbiAgIFRoaXMgc3RhdGljIG1ldGhvZCByZXR1cm5zIGEgdHJhbnNsYXRpb24gdGFibGUgdXNhYmxlIGZvclxuICAgInN0ci50cmFuc2xhdGUoKSIuXG5cbiAgIElmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nXG4gICBVbmljb2RlIG9yZGluYWxzIChpbnRlZ2Vycykgb3IgY2hhcmFjdGVycyAoc3RyaW5ncyBvZiBsZW5ndGggMSkgdG9cbiAgIFVuaWNvZGUgb3JkaW5hbHMsIHN0cmluZ3MgKG9mIGFyYml0cmFyeSBsZW5ndGhzKSBvciBOb25lLlxuICAgQ2hhcmFjdGVyIGtleXMgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBvcmRpbmFscy5cblxuICAgSWYgdGhlcmUgYXJlIHR3byBhcmd1bWVudHMsIHRoZXkgbXVzdCBiZSBzdHJpbmdzIG9mIGVxdWFsIGxlbmd0aCxcbiAgIGFuZCBpbiB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnksIGVhY2ggY2hhcmFjdGVyIGluIHggd2lsbCBiZSBtYXBwZWRcbiAgIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4geS4gIElmIHRoZXJlIGlzIGEgdGhpcmRcbiAgIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aG9zZSBjaGFyYWN0ZXJzIHdpbGwgYmUgbWFwcGVkIHRvXG4gICBOb25lIGluIHRoZSByZXN1bHQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbnN0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqXG4gICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzIGdpdmVuLCBvbmx5XG4gICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cbnN0ci5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiAic1tzdGFydDplbmRdIi5cbiAgIE9wdGlvbmFsIGFyZ3VtZW50cyAqc3RhcnQqIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2VcbiAgIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlICJyZmluZCgpIiBidXQgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuIHRoZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIG5vdCBmb3VuZC5cblxuc3RyLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvICJsZW4ocykiLlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG5zdHIucnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlXG4gICBkZWxpbWl0ZXIgc3RyaW5nLiBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCogc3BsaXRzXG4gICBhcmUgZG9uZSwgdGhlICpyaWdodG1vc3QqIG9uZXMuICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yXG4gICAiTm9uZSIsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3Igc3BsaXR0aW5nXG4gICBmcm9tIHRoZSByaWdodCwgInJzcGxpdCgpIiBiZWhhdmVzIGxpa2UgInNwbGl0KCkiIHdoaWNoIGlzXG4gICBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5yc3RyaXAoKVxuICAgICAgXCcgICBzcGFjaW91c1wnXG4gICAgICA+Pj4gXCdtaXNzaXNzaXBwaVwnLnJzdHJpcChcJ2lwelwnKVxuICAgICAgXCdtaXNzaXNzXCdcblxuc3RyLnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogYXMgdGhlXG4gICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqXG4gICBzcGxpdHMgYXJlIGRvbmUgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0ICJtYXhzcGxpdCsxIlxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yICItMSIsIHRoZW4gdGhlcmUgaXNcbiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS5cblxuICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXG4gICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuICAgIlwnMSwsMlwnLnNwbGl0KFwnLFwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJ1wnLCBcJzJcJ10iKS4gIFRoZSAqc2VwKiBhcmd1bWVudFxuICAgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4gICAiXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJzJcJywgXCczXCddIikuIFNwbGl0dGluZyBhblxuICAgZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgIltcJ1wnXSIuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCcxLDIsM1wnLnNwbGl0KFwnLFwnKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG4gICAgICA+Pj4gXCcxLDIsM1wnLnNwbGl0KFwnLFwnLCBtYXhzcGxpdD0xKVxuICAgICAgW1wnMVwnLCBcJzIsM1wnXVxuICAgICAgPj4+IFwnMSwyLCwzLFwnLnNwbGl0KFwnLFwnKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCdcJywgXCczXCcsIFwnXCddXG5cbiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgIk5vbmUiLCBhIGRpZmZlcmVudCBzcGxpdHRpbmdcbiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkXG4gICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzXG4gICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmdcbiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmdcbiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSAiTm9uZSIgc2VwYXJhdG9yIHJldHVybnMgIltdIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJzEgMiAzXCcuc3BsaXQoKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG4gICAgICA+Pj4gXCcxIDIgM1wnLnNwbGl0KG1heHNwbGl0PTEpXG4gICAgICBbXCcxXCcsIFwnMiAzXCddXG4gICAgICA+Pj4gXCcgICAxICAgMiAgIDMgICBcJy5zcGxpdCgpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cblxuc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZVxuICAgYm91bmRhcmllcy4gIExpbmUgYnJlYWtzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0XG4gICB1bmxlc3MgKmtlZXBlbmRzKiBpcyBnaXZlbiBhbmQgdHJ1ZS5cblxuICAgVGhpcyBtZXRob2Qgc3BsaXRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBib3VuZGFyaWVzLiAgSW5cbiAgIHBhcnRpY3VsYXIsIHRoZSBib3VuZGFyaWVzIGFyZSBhIHN1cGVyc2V0IG9mICp1bml2ZXJzYWwgbmV3bGluZXMqLlxuXG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBSZXByZXNlbnRhdGlvbiAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcXG4iICAgICAgICAgICAgICAgICAgICB8IExpbmUgRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHIiICAgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHJcXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lIEZlZWQgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx2IiBvciAiXFx4MGIiICAgICAgICAgIHwgTGluZSBUYWJ1bGF0aW9uICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcZiIgb3IgIlxceDBjIiAgICAgICAgICB8IEZvcm0gRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxYyIgICAgICAgICAgICAgICAgICB8IEZpbGUgU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxZCIgICAgICAgICAgICAgICAgICB8IEdyb3VwIFNlcGFyYXRvciAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHgxZSIgICAgICAgICAgICAgICAgICB8IFJlY29yZCBTZXBhcmF0b3IgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHg4NSIgICAgICAgICAgICAgICAgICB8IE5leHQgTGluZSAoQzEgQ29udHJvbCBDb2RlKSAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHUyMDI4IiAgICAgICAgICAgICAgICB8IExpbmUgU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHUyMDI5IiAgICAgICAgICAgICAgICB8IFBhcmFncmFwaCBTZXBhcmF0b3IgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6ICJcXHYiIGFuZCAiXFxmIiBhZGRlZCB0byBsaXN0IG9mIGxpbmVcbiAgIGJvdW5kYXJpZXMuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcblwnLnNwbGl0bGluZXMoKVxuICAgICAgW1wnYWIgY1wnLCBcJ1wnLCBcJ2RlIGZnXCcsIFwna2xcJ11cbiAgICAgID4+PiBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcyhrZWVwZW5kcz1UcnVlKVxuICAgICAgW1wnYWIgY1xcblwnLCBcJ1xcblwnLCBcJ2RlIGZnXFxyXCcsIFwna2xcXHJcXG5cJ11cblxuICAgVW5saWtlICJzcGxpdCgpIiB3aGVuIGEgZGVsaW1pdGVyIHN0cmluZyAqc2VwKiBpcyBnaXZlbiwgdGhpc1xuICAgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdCBmb3IgdGhlIGVtcHR5IHN0cmluZywgYW5kIGEgdGVybWluYWxcbiAgIGxpbmUgYnJlYWsgZG9lcyBub3QgcmVzdWx0IGluIGFuIGV4dHJhIGxpbmU6XG5cbiAgICAgID4+PiAiIi5zcGxpdGxpbmVzKClcbiAgICAgIFtdXG4gICAgICA+Pj4gIk9uZSBsaW5lXFxuIi5zcGxpdGxpbmVzKClcbiAgICAgIFtcJ09uZSBsaW5lXCddXG5cbiAgIEZvciBjb21wYXJpc29uLCAic3BsaXQoXCdcXG5cJykiIGdpdmVzOlxuXG4gICAgICA+Pj4gXCdcJy5zcGxpdChcJ1xcblwnKVxuICAgICAgW1wnXCddXG4gICAgICA+Pj4gXCdUd28gbGluZXNcXG5cJy5zcGxpdChcJ1xcblwnKVxuICAgICAgW1wnVHdvIGxpbmVzXCcsIFwnXCddXG5cbnN0ci5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlIHJldHVyblxuICAgIkZhbHNlIi4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rIGZvci5cbiAgIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG4gICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCBwb3NpdGlvbi5cblxuc3RyLnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgY2hhcmFjdGVycyByZW1vdmVkLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqXG4gICBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpc1xuICAgbm90IGEgcHJlZml4IG9yIHN1ZmZpeDsgcmF0aGVyLCBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlXG4gICBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5zdHJpcCgpXG4gICAgICBcJ3NwYWNpb3VzXCdcbiAgICAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLnN0cmlwKFwnY21vd3ouXCcpXG4gICAgICBcJ2V4YW1wbGVcJ1xuXG4gICBUaGUgb3V0ZXJtb3N0IGxlYWRpbmcgYW5kIHRyYWlsaW5nICpjaGFycyogYXJndW1lbnQgdmFsdWVzIGFyZVxuICAgc3RyaXBwZWQgZnJvbSB0aGUgc3RyaW5nLiBDaGFyYWN0ZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlIGxlYWRpbmdcbiAgIGVuZCB1bnRpbCByZWFjaGluZyBhIHN0cmluZyBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgaW4gKmNoYXJzKi4gQSBzaW1pbGFyIGFjdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGVcbiAgIHRyYWlsaW5nIGVuZC4gRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBjb21tZW50X3N0cmluZyA9IFwnIy4uLi4uLi4gU2VjdGlvbiAzLjIuMSBJc3N1ZSAjMzIgLi4uLi4uLlwnXG4gICAgICA+Pj4gY29tbWVudF9zdHJpbmcuc3RyaXAoXCcuIyEgXCcpXG4gICAgICBcJ1NlY3Rpb24gMy4yLjEgSXNzdWUgIzMyXCdcblxuc3RyLnN3YXBjYXNlKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvXG4gICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuIE5vdGUgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSB0aGF0XG4gICAicy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkgPT0gcyIuXG5cbnN0ci50aXRsZSgpXG5cbiAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzIHN0YXJ0IHdpdGggYW5cbiAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgbG93ZXJjYXNlLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnSGVsbG8gd29ybGRcJy50aXRsZSgpXG4gICAgICBcJ0hlbGxvIFdvcmxkXCdcblxuICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYVxuICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluXG4gICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluIGNvbnRyYWN0aW9ucyBhbmRcbiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkXG4gICByZXN1bHQ6XG5cbiAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4gICAgICAiVGhleVwnUmUgQmlsbFwnUyBGcmllbmRzIEZyb20gVGhlIFVrIlxuXG4gICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyXG4gICBleHByZXNzaW9uczpcblxuICAgICAgPj4+IGltcG9ydCByZVxuICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4gICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICtcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4gICAgICAuLi5cbiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcy4iKVxuICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG5cbnN0ci50cmFuc2xhdGUobWFwKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSAqcyogd2hlcmUgYWxsIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZFxuICAgdGhyb3VnaCB0aGUgKm1hcCogd2hpY2ggbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgVW5pY29kZSBvcmRpbmFsc1xuICAgKGludGVnZXJzKSB0byBVbmljb2RlIG9yZGluYWxzLCBzdHJpbmdzIG9yICJOb25lIi4gIFVubWFwcGVkXG4gICBjaGFyYWN0ZXJzIGFyZSBsZWZ0IHVudG91Y2hlZC4gQ2hhcmFjdGVycyBtYXBwZWQgdG8gIk5vbmUiIGFyZVxuICAgZGVsZXRlZC5cblxuICAgWW91IGNhbiB1c2UgInN0ci5tYWtldHJhbnMoKSIgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gbWFwIGZyb21cbiAgIGNoYXJhY3Rlci10by1jaGFyYWN0ZXIgbWFwcGluZ3MgaW4gZGlmZmVyZW50IGZvcm1hdHMuXG5cbiAgIE5vdGU6IEFuIGV2ZW4gbW9yZSBmbGV4aWJsZSBhcHByb2FjaCBpcyB0byBjcmVhdGUgYSBjdXN0b21cbiAgICAgY2hhcmFjdGVyIG1hcHBpbmcgY29kZWMgdXNpbmcgdGhlICJjb2RlY3MiIG1vZHVsZSAoc2VlXG4gICAgICJlbmNvZGluZ3MuY3AxMjUxIiBmb3IgYW4gZXhhbXBsZSkuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgInN0ci51cHBlcigpLmlzdXBwZXIoKSIgbWlnaHQgYmVcbiAgICJGYWxzZSIgaWYgInMiIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICJcJzBcJyIgZGlnaXRzIHRvXG4gICBtYWtlIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBBIGxlYWRpbmcgc2lnbiBwcmVmaXhcbiAgICgiXCcrXCciLyJcJy1cJyIpIGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nIHRoZSBwYWRkaW5nICphZnRlciogdGhlIHNpZ25cbiAgIGNoYXJhY3RlciByYXRoZXIgdGhhbiBiZWZvcmUuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWZcbiAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+ICI0MiIuemZpbGwoNSlcbiAgICAgIFwnMDAwNDJcJ1xuICAgICAgPj4+ICItNDIiLnpmaWxsKDUpXG4gICAgICBcJy0wMDQyXCdcbicsCiAgJ3N0cmluZ3MnOiB1J1xuU3RyaW5nIGFuZCBCeXRlcyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5TdHJpbmcgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIHN0cmluZ2xpdGVyYWwgICA6Oj0gW3N0cmluZ3ByZWZpeF0oc2hvcnRzdHJpbmcgfCBsb25nc3RyaW5nKVxuICAgc3RyaW5ncHJlZml4ICAgIDo6PSAiciIgfCAidSIgfCAiUiIgfCAiVSJcbiAgIHNob3J0c3RyaW5nICAgICA6Oj0gIlwnIiBzaG9ydHN0cmluZ2l0ZW0qICJcJyIgfCBcJyJcJyBzaG9ydHN0cmluZ2l0ZW0qIFwnIlwnXG4gICBsb25nc3RyaW5nICAgICAgOjo9ICJcJ1wnXCciIGxvbmdzdHJpbmdpdGVtKiAiXCdcJ1wnIiB8IFwnIiIiXCcgbG9uZ3N0cmluZ2l0ZW0qIFwnIiIiXCdcbiAgIHNob3J0c3RyaW5naXRlbSA6Oj0gc2hvcnRzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4gICBsb25nc3RyaW5naXRlbSAgOjo9IGxvbmdzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4gICBzaG9ydHN0cmluZ2NoYXIgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciBuZXdsaW5lIG9yIHRoZSBxdW90ZT5cbiAgIGxvbmdzdHJpbmdjaGFyICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuICAgc3RyaW5nZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgc291cmNlIGNoYXJhY3Rlcj5cblxuICAgYnl0ZXNsaXRlcmFsICAgOjo9IGJ5dGVzcHJlZml4KHNob3J0Ynl0ZXMgfCBsb25nYnl0ZXMpXG4gICBieXRlc3ByZWZpeCAgICA6Oj0gImIiIHwgIkIiIHwgImJyIiB8ICJCciIgfCAiYlIiIHwgIkJSIiB8ICJyYiIgfCAickIiIHwgIlJiIiB8ICJSQiJcbiAgIHNob3J0Ynl0ZXMgICAgIDo6PSAiXCciIHNob3J0Ynl0ZXNpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRieXRlc2l0ZW0qIFwnIlwnXG4gICBsb25nYnl0ZXMgICAgICA6Oj0gIlwnXCdcJyIgbG9uZ2J5dGVzaXRlbSogIlwnXCdcJyIgfCBcJyIiIlwnIGxvbmdieXRlc2l0ZW0qIFwnIiIiXCdcbiAgIHNob3J0Ynl0ZXNpdGVtIDo6PSBzaG9ydGJ5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4gICBsb25nYnl0ZXNpdGVtICA6Oj0gbG9uZ2J5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4gICBzaG9ydGJ5dGVzY2hhciA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+XG4gICBsb25nYnl0ZXNjaGFyICA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBieXRlc2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj5cblxuT25lIHN5bnRhY3RpYyByZXN0cmljdGlvbiBub3QgaW5kaWNhdGVkIGJ5IHRoZXNlIHByb2R1Y3Rpb25zIGlzIHRoYXRcbndoaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgInN0cmluZ3ByZWZpeCIgb3IgImJ5dGVzcHJlZml4IlxuYW5kIHRoZSByZXN0IG9mIHRoZSBsaXRlcmFsLiBUaGUgc291cmNlIGNoYXJhY3RlciBzZXQgaXMgZGVmaW5lZCBieVxudGhlIGVuY29kaW5nIGRlY2xhcmF0aW9uOyBpdCBpcyBVVEYtOCBpZiBubyBlbmNvZGluZyBkZWNsYXJhdGlvbiBpc1xuZ2l2ZW4gaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiAqRW5jb2RpbmcgZGVjbGFyYXRpb25zKi5cblxuSW4gcGxhaW4gRW5nbGlzaDogQm90aCB0eXBlcyBvZiBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gbWF0Y2hpbmdcbnNpbmdsZSBxdW90ZXMgKCJcJyIpIG9yIGRvdWJsZSBxdW90ZXMgKCIiIikuICBUaGV5IGNhbiBhbHNvIGJlIGVuY2xvc2VkXG5pbiBtYXRjaGluZyBncm91cHMgb2YgdGhyZWUgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKHRoZXNlIGFyZVxuZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSBiYWNrc2xhc2hcbigiXFwiKSBjaGFyYWN0ZXIgaXMgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG90aGVyd2lzZSBoYXZlIGFcbnNwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGVcbmNoYXJhY3Rlci5cblxuQnl0ZXMgbGl0ZXJhbHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoICJcJ2JcJyIgb3IgIlwnQlwnIjsgdGhleSBwcm9kdWNlXG5hbiBpbnN0YW5jZSBvZiB0aGUgImJ5dGVzIiB0eXBlIGluc3RlYWQgb2YgdGhlICJzdHIiIHR5cGUuICBUaGV5IG1heVxub25seSBjb250YWluIEFTQ0lJIGNoYXJhY3RlcnM7IGJ5dGVzIHdpdGggYSBudW1lcmljIHZhbHVlIG9mIDEyOCBvclxuZ3JlYXRlciBtdXN0IGJlIGV4cHJlc3NlZCB3aXRoIGVzY2FwZXMuXG5cbkFzIG9mIFB5dGhvbiAzLjMgaXQgaXMgcG9zc2libGUgYWdhaW4gdG8gcHJlZml4IHN0cmluZyBsaXRlcmFscyB3aXRoIGFcbiJ1IiBwcmVmaXggdG8gc2ltcGxpZnkgbWFpbnRlbmFuY2Ugb2YgZHVhbCAyLnggYW5kIDMueCBjb2RlYmFzZXMuXG5cbkJvdGggc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGFcbmxldHRlciAiXCdyXCciIG9yICJcJ1JcJyI7IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkICpyYXcgc3RyaW5ncyogYW5kIHRyZWF0XG5iYWNrc2xhc2hlcyBhcyBsaXRlcmFsIGNoYXJhY3RlcnMuICBBcyBhIHJlc3VsdCwgaW4gc3RyaW5nIGxpdGVyYWxzLFxuIlwnXFxVXCciIGFuZCAiXCdcXHVcJyIgZXNjYXBlcyBpbiByYXcgc3RyaW5ncyBhcmUgbm90IHRyZWF0ZWQgc3BlY2lhbGx5LlxuR2l2ZW4gdGhhdCBQeXRob24gMi54XCdzIHJhdyB1bmljb2RlIGxpdGVyYWxzIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGFuXG5QeXRob24gMy54XCdzIHRoZSAiXCd1clwnIiBzeW50YXggaXMgbm90IHN1cHBvcnRlZC5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgIlwncmJcJyIgcHJlZml4IG9mIHJhdyBieXRlcyBsaXRlcmFscyBoYXMgYmVlblxuYWRkZWQgYXMgYSBzeW5vbnltIG9mICJcJ2JyXCciLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIHRoZSB1bmljb2RlIGxlZ2FjeSBsaXRlcmFsXG4oInVcJ3ZhbHVlXCciKSB3YXMgcmVpbnRyb2R1Y2VkIHRvIHNpbXBsaWZ5IHRoZSBtYWludGVuYW5jZSBvZiBkdWFsXG5QeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLiBTZWUgKipQRVAgNDE0KiogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbkluIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbHMsIHVuZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGVzIGFyZSBhbGxvd2VkXG4oYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3dcbnRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gdGhlXG5saXRlcmFsLCBpLmUuIGVpdGhlciAiXCciIG9yICIiIi4pXG5cblVubGVzcyBhbiAiXCdyXCciIG9yICJcJ1JcJyIgcHJlZml4IGlzIHByZXNlbnQsIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nXG5hbmQgYnl0ZXMgbGl0ZXJhbHMgYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byBydWxlcyBzaW1pbGFyIHRvIHRob3NlXG51c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCAiXFxuZXdsaW5lIiAgICAgICAgfCBCYWNrc2xhc2ggYW5kIG5ld2xpbmUgaWdub3JlZCAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcXFwiICAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoIlxcIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcXCciICAgICAgICAgICAgICB8IFNpbmdsZSBxdW90ZSAoIlwnIikgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcIiIgICAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlICgiIiIpICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXGEiICAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxiIiAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcZiIgICAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXG4iICAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxyIiAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcdCIgICAgICAgICAgICAgIHwgQVNDSUkgSG9yaXpvbnRhbCBUYWIgKFRBQikgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHYiICAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxvb28iICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMSwzKSAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxceGhoIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgKDIsMykgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG5cbkVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgIlxcTntuYW1lfSIgICAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgKDQpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHV4eHh4IiAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIDE2LWJpdCBoZXggdmFsdWUgICB8ICg1KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxVeHh4eHh4eHgiICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAzMi1iaXQgaGV4IHZhbHVlICAgfCAoNikgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCAqeHh4eHh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuXG5cbjIuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cblxuMy4gSW4gYSBieXRlcyBsaXRlcmFsLCBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgZXNjYXBlcyBkZW5vdGUgdGhlXG4gICBieXRlIHdpdGggdGhlIGdpdmVuIHZhbHVlLiBJbiBhIHN0cmluZyBsaXRlcmFsLCB0aGVzZSBlc2NhcGVzXG4gICBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblxuNC4gQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgbmFtZSBhbGlhc2VzIFsxXSBoYXMgYmVlblxuICAgYWRkZWQuXG5cbjUuIEluZGl2aWR1YWwgY29kZSB1bml0cyB3aGljaCBmb3JtIHBhcnRzIG9mIGEgc3Vycm9nYXRlIHBhaXIgY2FuXG4gICBiZSBlbmNvZGVkIHVzaW5nIHRoaXMgZXNjYXBlIHNlcXVlbmNlLiAgRXhhY3RseSBmb3VyIGhleCBkaWdpdHMgYXJlXG4gICByZXF1aXJlZC5cblxuNi4gQW55IFVuaWNvZGUgY2hhcmFjdGVyIGNhbiBiZSBlbmNvZGVkIHRoaXMgd2F5LiAgRXhhY3RseSBlaWdodFxuICAgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cblVubGlrZSBTdGFuZGFyZCBDLCBhbGwgdW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGxlZnQgaW4gdGhlXG5zdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSByZXN1bHQqLiAgKFRoaXNcbmJlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzIG1pc3R5cGVkLFxudGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgbW9yZSBlYXNpbHkgcmVjb2duaXplZCBhcyBicm9rZW4uKSAgSXQgaXMgYWxzb1xuaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gc3RyaW5nXG5saXRlcmFscyBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciBieXRlc1xubGl0ZXJhbHMuXG5cbkV2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGVcbmJhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCAiciJcXCIiIiBpcyBhIHZhbGlkXG5zdHJpbmcgbGl0ZXJhbCBjb25zaXN0aW5nIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBkb3VibGVcbnF1b3RlOyAiciJcXCIiIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIChldmVuIGEgcmF3IHN0cmluZyBjYW5ub3RcbmVuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3IGxpdGVyYWxcbmNhbm5vdCBlbmQgaW4gYSBzaW5nbGUgYmFja3NsYXNoKiAoc2luY2UgdGhlIGJhY2tzbGFzaCB3b3VsZCBlc2NhcGVcbnRoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlIGJhY2tzbGFzaFxuZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzIGFzIHBhcnRcbm9mIHRoZSBsaXRlcmFsLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLlxuJywKICAnc3Vic2NyaXB0aW9ucyc6IHUnXG5TdWJzY3JpcHRpb25zXG4qKioqKioqKioqKioqXG5cbkEgc3Vic2NyaXB0aW9uIHNlbGVjdHMgYW4gaXRlbSBvZiBhIHNlcXVlbmNlIChzdHJpbmcsIHR1cGxlIG9yIGxpc3QpXG5vciBtYXBwaW5nIChkaWN0aW9uYXJ5KSBvYmplY3Q6XG5cbiAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIHN1YnNjcmlwdGlvblxuKGxpc3RzIG9yIGRpY3Rpb25hcmllcyBmb3IgZXhhbXBsZSkuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gc3VwcG9ydFxuc3Vic2NyaXB0aW9uIGJ5IGRlZmluaW5nIGEgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxuRm9yIGJ1aWx0LWluIG9iamVjdHMsIHRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IHN1cHBvcnRcbnN1YnNjcmlwdGlvbjpcblxuSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgZXZhbHVhdGUgdG8gYW5cbm9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcsIGFuZCB0aGVcbnN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXRcbmtleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyBleGFjdGx5IG9uZVxuaXRlbS4pXG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0IGV2YWx1YXRlIHRvXG5hbiBpbnRlZ2VyIG9yIGEgc2xpY2UgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24pLlxuXG5UaGUgZm9ybWFsIHN5bnRheCBtYWtlcyBubyBzcGVjaWFsIHByb3Zpc2lvbiBmb3IgbmVnYXRpdmUgaW5kaWNlcyBpblxuc2VxdWVuY2VzOyBob3dldmVyLCBidWlsdC1pbiBzZXF1ZW5jZXMgYWxsIHByb3ZpZGUgYSAiX19nZXRpdGVtX18oKSJcbm1ldGhvZCB0aGF0IGludGVycHJldHMgbmVnYXRpdmUgaW5kaWNlcyBieSBhZGRpbmcgdGhlIGxlbmd0aCBvZiB0aGVcbnNlcXVlbmNlIHRvIHRoZSBpbmRleCAoc28gdGhhdCAieFstMV0iIHNlbGVjdHMgdGhlIGxhc3QgaXRlbSBvZiAieCIpLlxuVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gdGhlIG51bWJlclxub2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSBpdGVtIHdob3NlXG5pbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLiBTaW5jZSB0aGUgc3VwcG9ydCBmb3Jcbm5lZ2F0aXZlIGluZGljZXMgYW5kIHNsaWNpbmcgb2NjdXJzIGluIHRoZSBvYmplY3RcJ3MgIl9fZ2V0aXRlbV9fKCkiXG5tZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBhZGRcbnRoYXQgc3VwcG9ydC5cblxuQSBzdHJpbmdcJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhXG50eXBlIGJ1dCBhIHN0cmluZyBvZiBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuXG4nLAogICd0cnV0aCc6IHUnXG5UcnV0aCBWYWx1ZSBUZXN0aW5nXG4qKioqKioqKioqKioqKioqKioqXG5cbkFueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gImlmIiBvclxuIndoaWxlIiBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LiBUaGVcbmZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG5cbiogIk5vbmUiXG5cbiogIkZhbHNlIlxuXG4qIHplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsICIwIiwgIjAuMCIsICIwaiIuXG5cbiogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgIlwnXCciLCAiKCkiLCAiW10iLlxuXG4qIGFueSBlbXB0eSBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgInt9Ii5cblxuKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbiAgIl9fYm9vbF9fKCkiIG9yICJfX2xlbl9fKCkiIG1ldGhvZCwgd2hlbiB0aGF0IG1ldGhvZCByZXR1cm5zIHRoZVxuICBpbnRlZ2VyIHplcm8gb3IgImJvb2wiIHZhbHVlICJGYWxzZSIuIFsxXVxuXG5BbGwgb3RoZXIgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRydWUgLS0tIHNvIG9iamVjdHMgb2YgbWFueSB0eXBlcyBhcmVcbmFsd2F5cyB0cnVlLlxuXG5PcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgYWx3YXlzXG5yZXR1cm4gIjAiIG9yICJGYWxzZSIgZm9yIGZhbHNlIGFuZCAiMSIgb3IgIlRydWUiIGZvciB0cnVlLCB1bmxlc3Ncbm90aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zICJvciJcbmFuZCAiYW5kIiBhbHdheXMgcmV0dXJuIG9uZSBvZiB0aGVpciBvcGVyYW5kcy4pXG4nLAogICd0cnknOiB1J1xuVGhlICJ0cnkiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5UaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vXG5leGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuXG5leGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCBjbGF1c2VzXG5pbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuIGV4cHJlc3Npb24tXG5sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbmV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG5pcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG53aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb25cbm9iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgcmFpc2VkXG50aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZlxucHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzXG5yZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC5cbihUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLFxuYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbm91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICBmb29cblxud2FzIHRyYW5zbGF0ZWQgdG9cblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIGZvb1xuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIGRlbCBOXG5cblRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG5iZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbmN5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxudW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgdmlhXG4ic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlXG5leGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG5wcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbnJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxubm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuXG5JZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAidHJ5IlxuY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuXG5leGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmXG50aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICJmaW5hbGx5IlxuY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbmlzIGRpc2NhcmRlZDpcblxuICAgPj4+IGRlZiBmKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIDEvMFxuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4gICAuLi5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cblxuV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzXG5hbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsIGluXG50aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cblRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbiJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSB0aGVcbmxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuJywKLSAndHlwZXMnOiB1J1xuVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gIEV4dGVuc2lvblxubW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcblB5dGhvbiBtYXkgYWRkIHR5cGVzIHRvIHRoZSB0eXBlIGhpZXJhcmNoeSAoZS5nLiwgcmF0aW9uYWwgbnVtYmVycyxcbmVmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLCBhbHRob3VnaCBzdWNoIGFkZGl0aW9uc1xud2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC5cblxuU29tZSBvZiB0aGUgdHlwZSBkZXNjcmlwdGlvbnMgYmVsb3cgY29udGFpbiBhIHBhcmFncmFwaCBsaXN0aW5nXG5cJ3NwZWNpYWwgYXR0cmlidXRlcy5cJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGVcbmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb25cbm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxuTm9uZVxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lICJOb25lIi4gSXRcbiAgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucywgZS5nLixcbiAgIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuXG4gICBhbnl0aGluZy4gSXRzIHRydXRoIHZhbHVlIGlzIGZhbHNlLlxuXG5Ob3RJbXBsZW1lbnRlZFxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4gICAiTm90SW1wbGVtZW50ZWQiLiBOdW1lcmljIG1ldGhvZHMgYW5kIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzXG4gICBzaG91bGQgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yXG4gICB0aGUgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlXG4gICByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlXG4gICBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuICAgU2VlICpJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyogZm9yIG1vcmUgZGV0YWlscy5cblxuRWxsaXBzaXNcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCAiLi4uIiBvciB0aGVcbiAgIGJ1aWx0LWluIG5hbWUgIkVsbGlwc2lzIi4gIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG4ibnVtYmVycy5OdW1iZXIiXG4gICBUaGVzZSBhcmUgY3JlYXRlZCBieSBudW1lcmljIGxpdGVyYWxzIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzIGJ5XG4gICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICBOdW1lcmljXG4gICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuICAgbnVtYmVycywgYnV0IHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIG9mIG51bWVyaWNhbCByZXByZXNlbnRhdGlvblxuICAgaW4gY29tcHV0ZXJzLlxuXG4gICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmRcbiAgIGNvbXBsZXggbnVtYmVyczpcblxuICAgIm51bWJlcnMuSW50ZWdyYWwiXG4gICAgICBUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2Vyc1xuICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG5cbiAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6XG5cbiAgICAgIEludGVnZXJzICgiaW50IilcblxuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4gICAgICAgICBhdmFpbGFibGUgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0XG4gICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCBhbmRcbiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyXCdzXG4gICAgICAgICBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZiBhbiBpbmZpbml0ZSBzdHJpbmcgb2ZcbiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG5cbiAgICAgIEJvb2xlYW5zICgiYm9vbCIpXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbiAgICAgICAgIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSB0aGVcbiAgICAgICAgIG9ubHkgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGVcbiAgICAgICAgIGludGVnZXIgdHlwZSwgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmRcbiAgICAgICAgIDEsIHJlc3BlY3RpdmVseSwgaW4gYWxtb3N0IGFsbCBjb250ZXh0cywgdGhlIGV4Y2VwdGlvbiBiZWluZ1xuICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgIiJGYWxzZSIiIG9yXG4gICAgICAgICAiIlRydWUiIiBhcmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlIHRoZVxuICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2Vycy5cblxuICAgIm51bWJlcnMuUmVhbCIgKCJmbG9hdCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50XG4gICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4gICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbiAgICAgIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4gUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLVxuICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciBhbmRcbiAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGFyZVxuICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlIGlzXG4gICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmdcbiAgICAgIHBvaW50IG51bWJlcnMuXG5cbiAgICJudW1iZXJzLkNvbXBsZXgiICgiY29tcGxleCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgY29tcGxleCBudW1iZXJzIGFzIGEgcGFpciBvZiBtYWNoaW5lLWxldmVsXG4gICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5XG4gICAgICBhcyBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhXG4gICAgICBjb21wbGV4IG51bWJlciAieiIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbiAgICAgIGF0dHJpYnV0ZXMgInoucmVhbCIgYW5kICJ6LmltYWciLlxuXG5TZXF1ZW5jZXNcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlXG4gICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXNcbiAgIG9mIGEgc2VxdWVuY2UuIFdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzICpuKiwgdGhlIGluZGV4IHNldFxuICAgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mIHNlcXVlbmNlICphKiBpc1xuICAgc2VsZWN0ZWQgYnkgImFbaV0iLlxuXG4gICBTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6ICJhW2k6al0iIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGhcbiAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqICI8PSIgKmsqICI8IiAqaiouICBXaGVuIHVzZWQgYXMgYW5cbiAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzXG4gICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuXG4gICBTb21lIHNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgImV4dGVuZGVkIHNsaWNpbmciIHdpdGggYSB0aGlyZCAic3RlcCJcbiAgIHBhcmFtZXRlcjogImFbaTpqOmtdIiBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCogd2hlcmVcbiAgICJ4ID0gaSArIG4qayIsICpuKiAiPj0iICIwIiBhbmQgKmkqICI8PSIgKngqICI8IiAqaiouXG5cbiAgIFNlcXVlbmNlcyBhcmUgZGlzdGluZ3Vpc2hlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbXV0YWJpbGl0eTpcblxuICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpc1xuICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cyxcbiAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyBob3dldmVyLFxuICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZVxuICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuXG4gICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuXG4gICAgICBTdHJpbmdzXG4gICAgICAgICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlIGNvZGVcbiAgICAgICAgIHBvaW50cy4gQWxsIHRoZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgIlUrMDAwMCAtIFUrMTBGRkZGIlxuICAgICAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEgc3RyaW5nLiAgUHl0aG9uIGRvZXNuXCd0IGhhdmUgYSAiY2hhciJcbiAgICAgICAgIHR5cGU7IGluc3RlYWQsIGV2ZXJ5IGNvZGUgcG9pbnQgaW4gdGhlIHN0cmluZyBpcyByZXByZXNlbnRlZFxuICAgICAgICAgYXMgYSBzdHJpbmcgb2JqZWN0IHdpdGggbGVuZ3RoICIxIi4gIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgICAgICAgIm9yZCgpIiBjb252ZXJ0cyBhIGNvZGUgcG9pbnQgZnJvbSBpdHMgc3RyaW5nIGZvcm0gdG8gYW5cbiAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIjsgImNocigpIiBjb252ZXJ0cyBhblxuICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aFxuICAgICAgICAgIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYVxuICAgICAgICAgInN0ciIgdG8gImJ5dGVzIiB1c2luZyB0aGUgZ2l2ZW4gdGV4dCBlbmNvZGluZywgYW5kXG4gICAgICAgICAiYnl0ZXMuZGVjb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIG9wcG9zaXRlLlxuXG4gICAgICBUdXBsZXNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZlxuICAgICAgICAgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2ZcbiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBcJ3NpbmdsZXRvblwnKSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnlcbiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZVxuICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLlxuXG4gICAgICBCeXRlc1xuICAgICAgICAgQSBieXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIGFycmF5LiAgVGhlIGl0ZW1zIGFyZSA4LWJpdFxuICAgICAgICAgYnl0ZXMsIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzIGluIHRoZSByYW5nZSAwIDw9IHggPCAyNTYuXG4gICAgICAgICBCeXRlcyBsaXRlcmFscyAobGlrZSAiYlwnYWJjXCciKSBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICAgICAgICAiYnl0ZXMoKSIgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGJ5dGVzIG9iamVjdHMuICBBbHNvLFxuICAgICAgICAgYnl0ZXMgb2JqZWN0cyBjYW4gYmUgZGVjb2RlZCB0byBzdHJpbmdzIHZpYSB0aGUgImRlY29kZSgpIlxuICAgICAgICAgbWV0aG9kLlxuXG4gICBNdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZVxuICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mXG4gICAgICBhc3NpZ25tZW50IGFuZCAiZGVsIiAoZGVsZXRlKSBzdGF0ZW1lbnRzLlxuXG4gICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcblxuICAgICAgTGlzdHNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZVxuICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpblxuICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAoTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBzcGVjaWFsIGNhc2VzIG5lZWRlZFxuICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcblxuICAgICAgQnl0ZSBBcnJheXNcbiAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnlcbiAgICAgICAgIHRoZSBidWlsdC1pbiAiYnl0ZWFycmF5KCkiIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgcHJvdmlkZVxuICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuICAgICAgICAgb2JqZWN0cy5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgImFycmF5IiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2YgYVxuICAgICAgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS5cblxuU2V0IHR5cGVzXG4gICBUaGVzZSByZXByZXNlbnQgdW5vcmRlcmVkLCBmaW5pdGUgc2V0cyBvZiB1bmlxdWUsIGltbXV0YWJsZVxuICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLFxuICAgdGhleSBjYW4gYmUgaXRlcmF0ZWQgb3ZlciwgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiXG4gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSBmYXN0XG4gICBtZW1iZXJzaGlwIHRlc3RpbmcsIHJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmRcbiAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4gICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG5cbiAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbiAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvclxuICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kXG4gICAiMS4wIiksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cblxuICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcblxuICAgU2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic2V0KCkiIGNvbnN0cnVjdG9yIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyBieSBzZXZlcmFsXG4gICAgICBtZXRob2RzLCBzdWNoIGFzICJhZGQoKSIuXG5cbiAgIEZyb3plbiBzZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4gICAgICBidWlsdC1pbiAiZnJvemVuc2V0KCkiIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMgaW1tdXRhYmxlXG4gICAgICBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZiBhbm90aGVyXG4gICAgICBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG5cbk1hcHBpbmdzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleFxuICAgc2V0cy4gVGhlIHN1YnNjcmlwdCBub3RhdGlvbiAiYVtrXSIgc2VsZWN0cyB0aGUgaXRlbSBpbmRleGVkIGJ5ICJrIlxuICAgZnJvbSB0aGUgbWFwcGluZyAiYSI7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIGFzIHRoZVxuICAgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBtYXBwaW5nLlxuXG4gICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcblxuICAgRGljdGlvbmFyaWVzXG4gICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuICAgICAgYXJiaXRyYXJ5IHZhbHVlcy4gIFRoZSBvbmx5IHR5cGVzIG9mIHZhbHVlcyBub3QgYWNjZXB0YWJsZSBhc1xuICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4gICAgICBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mXG4gICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXlcJ3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4gICAgICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljXG4gICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICIxLjAiKVxuICAgICAgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuICAgICAgZGljdGlvbmFyeSBlbnRyeS5cblxuICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSAiey4uLn0iXG4gICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gKkRpY3Rpb25hcnkgZGlzcGxheXMqKS5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGVzICJkYm0ubmRibSIgYW5kICJkYm0uZ251IiBwcm92aWRlXG4gICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyJcbiAgICAgIG1vZHVsZS5cblxuQ2FsbGFibGUgdHlwZXNcbiAgIFRoZXNlIGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW9uIChzZWVcbiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6XG5cbiAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb25cbiAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyopLiAgSXQgc2hvdWxkIGJlXG4gICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICBhcyB0aGUgZnVuY3Rpb25cJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuXG4gICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6XG5cbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbiAgICAgIHwgIl9fZG9jX18iICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlOyBub3QgaW5oZXJpdGVkIGJ5ICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJjbGFzc2VzICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fbmFtZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBuYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fcXVhbG5hbWVfXyIgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAqcXVhbGlmaWVkIG5hbWUqIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmV3IGluIHZlcnNpb24gMy4zLiAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX21vZHVsZV9fIiAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4sIG9yICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19kZWZhdWx0c19fIiAgICAgICAgICAgIHwgQSB0dXBsZSBjb250YWluaW5nIGRlZmF1bHQgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3IgIk5vbmUiIGlmIG5vIGFyZ3VtZW50cyBoYXZlICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19jb2RlX18iICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19nbG9iYWxzX18iICAgICAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlIGRpY3Rpb25hcnkgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uXCdzICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZGljdF9fIiAgICAgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fY2xvc3VyZV9fIiAgICAgICAgICAgICB8ICJOb25lIiBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb250YWluIGJpbmRpbmdzIGZvciB0aGUgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25cJ3MgZnJlZSB2YXJpYWJsZXMuICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19hbm5vdGF0aW9uc19fIiAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mIHBhcmFtZXRlcnMuICBUaGUga2V5cyBvZiB0aGUgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kICJcJ3JldHVyblwnIiBmb3IgdGhlIHJldHVybiAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5ub3RhdGlvbiwgaWYgcHJvdmlkZWQuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2t3ZGVmYXVsdHNfXyIgICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3IgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG5cbiAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiB0aGVcbiAgICAgIGFzc2lnbmVkIHZhbHVlLlxuXG4gICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeVxuICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGFcbiAgICAgIHRvIGZ1bmN0aW9ucy4gIFJlZ3VsYXIgYXR0cmlidXRlIGRvdC1ub3RhdGlvbiBpcyB1c2VkIHRvIGdldCBhbmRcbiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seVxuICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvblxuICAgICAgYXR0cmlidXRlcyBvbiBidWlsdC1pbiBmdW5jdGlvbnMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGVcbiAgICAgIGZ1dHVyZS4qXG5cbiAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvblwncyBkZWZpbml0aW9uIGNhbiBiZVxuICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGludGVybmFsXG4gICAgICB0eXBlcyBiZWxvdy5cblxuICAgSW5zdGFuY2UgbWV0aG9kc1xuICAgICAgQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlIGFuZFxuICAgICAgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24pLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiX19zZWxmX18iIGlzIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgb2JqZWN0LCAiX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7ICJfX2RvY19fIiBpcyB0aGVcbiAgICAgIG1ldGhvZFwncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICJfX2Z1bmNfXy5fX2RvY19fIik7ICJfX25hbWVfXyJcbiAgICAgIGlzIHRoZSBtZXRob2QgbmFtZSAoc2FtZSBhcyAiX19mdW5jX18uX19uYW1lX18iKTsgIl9fbW9kdWxlX18iXG4gICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBtZXRob2Qgd2FzIGRlZmluZWQgaW4sIG9yICJOb25lIlxuICAgICAgaWYgdW5hdmFpbGFibGUuXG5cbiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5XG4gICAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3MgKHBlcmhhcHMgdmlhIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MpLCBpZlxuICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgY2xhc3NcbiAgICAgIG1ldGhvZCBvYmplY3QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSB1c2VyLVxuICAgICAgZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcyxcbiAgICAgIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UsIGFuZCB0aGUgbWV0aG9kIG9iamVjdFxuICAgICAgaXMgc2FpZCB0byBiZSBib3VuZC4gIFRoZSBuZXcgbWV0aG9kXCdzICJfX2Z1bmNfXyIgYXR0cmlidXRlIGlzXG4gICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nXG4gICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyIGlzXG4gICAgICB0aGUgc2FtZSBhcyBmb3IgYSBmdW5jdGlvbiBvYmplY3QsIGV4Y2VwdCB0aGF0IHRoZSAiX19mdW5jX18iXG4gICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3RcbiAgICAgIGJ1dCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSBjbGFzc1xuICAgICAgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZVxuICAgICAgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGVcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nXG4gICAgICBmdW5jdGlvbiAoIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICAoIl9fc2VsZl9fIikgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3IgaW5zdGFuY2UsIHdoZW5cbiAgICAgICJDIiBpcyBhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiAiZigpIixcbiAgICAgIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgIGNhbGxpbmcgIkMuZih4LCAxKSIuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBkZXJpdmVkIGZyb20gYSBjbGFzcyBtZXRob2RcbiAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCBhY3R1YWxseVxuICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAiQy5mKDEpIlxuICAgICAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nICJmKEMsMSkiIHdoZXJlICJmIiBpcyB0aGUgdW5kZXJseWluZ1xuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gaW5zdGFuY2VcbiAgICAgIG1ldGhvZCBvYmplY3QgaGFwcGVucyBlYWNoIHRpbWUgdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAgdGhlIGluc3RhbmNlLiAgSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bCBvcHRpbWl6YXRpb24gaXMgdG9cbiAgICAgIGFzc2lnbiB0aGUgYXR0cmlidXRlIHRvIGEgbG9jYWwgdmFyaWFibGUgYW5kIGNhbGwgdGhhdCBsb2NhbFxuICAgICAgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgZm9yXG4gICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb25zOyBvdGhlciBjYWxsYWJsZSBvYmplY3RzIChhbmQgYWxsIG5vbi1cbiAgICAgIGNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzXG4gICAgICBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyB3aGljaCBhcmVcbiAgICAgIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZFxuICAgICAgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbiBhdHRyaWJ1dGVcbiAgICAgIG9mIHRoZSBjbGFzcy5cblxuICAgR2VuZXJhdG9yIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZVxuICAgICAgc2VjdGlvbiAqVGhlIHlpZWxkIHN0YXRlbWVudCopIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgZnVuY3Rpb24qLlxuICAgICAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0XG4gICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmdcbiAgICAgIHRoZSBpdGVyYXRvclwncyAiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlXG4gICAgICBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICJ5aWVsZCJcbiAgICAgIHN0YXRlbWVudC4gIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgInJldHVybiIgc3RhdGVtZW50IG9yXG4gICAgICBmYWxscyBvZmYgdGhlIGVuZCwgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlXG4gICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvIGJlXG4gICAgICByZXR1cm5lZC5cblxuICAgQ29yb3V0aW5lIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpc1xuICAgICAgY2FsbGVkIGEgKmNvcm91dGluZSBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLFxuICAgICAgcmV0dXJucyBhICpjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCJcbiAgICAgIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzICJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgc3RhdGVtZW50cy5cbiAgICAgIFNlZSBhbHNvIHRoZSAqQ29yb3V0aW5lIE9iamVjdHMqIHNlY3Rpb24uXG5cbiAgIEJ1aWx0LWluIGZ1bmN0aW9uc1xuICAgICAgQSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEMgZnVuY3Rpb24uXG4gICAgICBFeGFtcGxlcyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlICJsZW4oKSIgYW5kICJtYXRoLnNpbigpIlxuICAgICAgKCJtYXRoIiBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgb2ZcbiAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgcmVhZC1cbiAgICAgIG9ubHkgYXR0cmlidXRlczogIl9fZG9jX18iIGlzIHRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uXG4gICAgICBzdHJpbmcsIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZTsgIl9fbmFtZV9fIiBpcyB0aGUgZnVuY3Rpb25cJ3NcbiAgICAgIG5hbWU7ICJfX3NlbGZfXyIgaXMgc2V0IHRvICJOb25lIiAoYnV0IHNlZSB0aGUgbmV4dCBpdGVtKTtcbiAgICAgICJfX21vZHVsZV9fIiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZFxuICAgICAgaW4gb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLlxuXG4gICBCdWlsdC1pbiBtZXRob2RzXG4gICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzXG4gICAgICB0aW1lIGNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhblxuICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4gICAgICAiYWxpc3QuYXBwZW5kKCkiLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXNcbiAgICAgIGNhc2UsIHRoZSBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGUgIl9fc2VsZl9fIiBpcyBzZXQgdG8gdGhlXG4gICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLlxuXG4gICBDbGFzc2VzXG4gICAgICBDbGFzc2VzIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzIGZhY3Rvcmllc1xuICAgICAgZm9yIG5ldyBpbnN0YW5jZXMgb2YgdGhlbXNlbHZlcywgYnV0IHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlIGZvclxuICAgICAgY2xhc3MgdHlwZXMgdGhhdCBvdmVycmlkZSAiX19uZXdfXygpIi4gIFRoZSBhcmd1bWVudHMgb2YgdGhlXG4gICAgICBjYWxsIGFyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0b1xuICAgICAgIl9faW5pdF9fKCkiIHRvIGluaXRpYWxpemUgdGhlIG5ldyBpbnN0YW5jZS5cblxuICAgQ2xhc3MgSW5zdGFuY2VzXG4gICAgICBJbnN0YW5jZXMgb2YgYXJiaXRyYXJ5IGNsYXNzZXMgY2FuIGJlIG1hZGUgY2FsbGFibGUgYnkgZGVmaW5pbmdcbiAgICAgIGEgIl9fY2FsbF9fKCkiIG1ldGhvZCBpbiB0aGVpciBjbGFzcy5cblxuTW9kdWxlc1xuICAgTW9kdWxlcyBhcmUgYSBiYXNpYyBvcmdhbml6YXRpb25hbCB1bml0IG9mIFB5dGhvbiBjb2RlLCBhbmQgYXJlXG4gICBjcmVhdGVkIGJ5IHRoZSAqaW1wb3J0IHN5c3RlbSogYXMgaW52b2tlZCBlaXRoZXIgYnkgdGhlICJpbXBvcnQiXG4gICBzdGF0ZW1lbnQgKHNlZSAiaW1wb3J0IiksIG9yIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXNcbiAgICJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBhbmQgYnVpbHQtaW4gIl9faW1wb3J0X18oKSIuICBBIG1vZHVsZVxuICAgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzIGlzXG4gICB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZSAiX19nbG9iYWxzX18iIGF0dHJpYnV0ZSBvZlxuICAgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSkuICBBdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmVcbiAgIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJtLngiIGlzIGVxdWl2YWxlbnRcbiAgIHRvICJtLl9fZGljdF9fWyJ4Il0iLiBBIG1vZHVsZSBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZVxuICAgb2JqZWN0IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlIChzaW5jZSBpdCBpc25cJ3QgbmVlZGVkIG9uY2VcbiAgIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lKS5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZSBkaWN0aW9uYXJ5LFxuICAgZS5nLiwgIm0ueCA9IDEiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSA9IDEiLlxuXG4gICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGU6ICJfX2RpY3RfXyIgaXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2VcbiAgIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuXG5cbiAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQmVjYXVzZSBvZiB0aGUgd2F5IENQeXRob25cbiAgIGNsZWFycyBtb2R1bGUgZGljdGlvbmFyaWVzLCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgd2lsbCBiZSBjbGVhcmVkXG4gICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzXG4gICBsaXZlIHJlZmVyZW5jZXMuICBUbyBhdm9pZCB0aGlzLCBjb3B5IHRoZSBkaWN0aW9uYXJ5IG9yIGtlZXAgdGhlXG4gICBtb2R1bGUgYXJvdW5kIHdoaWxlIHVzaW5nIGl0cyBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgbW9kdWxlXCdzIG5hbWU7XG4gICAiX19kb2NfXyIgaXMgdGhlIG1vZHVsZVwncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmXG4gICB1bmF2YWlsYWJsZTsgIl9fZmlsZV9fIiBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGVcbiAgIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdCB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGUgIl9fZmlsZV9fIlxuICAgYXR0cmlidXRlIG1heSBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMgQ1xuICAgbW9kdWxlcyB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCBpbnRvIHRoZSBpbnRlcnByZXRlcjsgZm9yXG4gICBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBpc1xuICAgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBmaWxlLlxuXG5DdXN0b20gY2xhc3Nlc1xuICAgQ3VzdG9tIGNsYXNzIHR5cGVzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucyAoc2VlXG4gICBzZWN0aW9uICpDbGFzcyBkZWZpbml0aW9ucyopLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWRcbiAgIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QuIENsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSB0cmFuc2xhdGVkXG4gICB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIkMueCIgaXMgdHJhbnNsYXRlZCB0b1xuICAgIkMuX19kaWN0X19bIngiXSIgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvd1xuICAgZm9yIG90aGVyIG1lYW5zIG9mIGxvY2F0aW5nIGF0dHJpYnV0ZXMpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpc1xuICAgbm90IGZvdW5kIHRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2VcbiAgIGNsYXNzZXMuIFRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kXG4gICByZXNvbHV0aW9uIG9yZGVyIHdoaWNoIGJlaGF2ZXMgY29ycmVjdGx5IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mXG4gICBcJ2RpYW1vbmRcJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uIGFuY2VzdG9yLiBBZGRpdGlvbmFsXG4gICBkZXRhaWxzIG9uIHRoZSBDMyBNUk8gdXNlZCBieSBQeXRob24gY2FuIGJlIGZvdW5kIGluIHRoZVxuICAgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuMyByZWxlYXNlIGF0XG4gICBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vLlxuXG4gICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzICJDIiwgc2F5KSB3b3VsZCB5aWVsZCBhXG4gICBjbGFzcyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGluc3RhbmNlIG1ldGhvZFxuICAgb2JqZWN0IHdob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlcyBpcyAiQyIuICBXaGVuIGl0IHdvdWxkIHlpZWxkIGFcbiAgIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBvYmplY3Qgd3JhcHBlZCBieVxuICAgdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKlxuICAgZm9yIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcyBtYXlcbiAgIGRpZmZlciBmcm9tIHRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgIl9fZGljdF9fIi5cblxuICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3NcJ3MgZGljdGlvbmFyeSwgbmV2ZXJcbiAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cblxuICAgQSBjbGFzcyBvYmplY3QgY2FuIGJlIGNhbGxlZCAoc2VlIGFib3ZlKSB0byB5aWVsZCBhIGNsYXNzIGluc3RhbmNlXG4gICAoc2VlIGJlbG93KS5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19uYW1lX18iIGlzIHRoZSBjbGFzcyBuYW1lOyAiX19tb2R1bGVfXyIgaXNcbiAgIHRoZSBtb2R1bGUgbmFtZSBpbiB3aGljaCB0aGUgY2xhc3Mgd2FzIGRlZmluZWQ7ICJfX2RpY3RfXyIgaXMgdGhlXG4gICBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgIl9fYmFzZXNfXyIgaXMgYSB0dXBsZVxuICAgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluIHRoZVxuICAgb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0OyAiX19kb2NfXyIgaXMgdGhlXG4gICBjbGFzc1wncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgTm9uZSBpZiB1bmRlZmluZWQuXG5cbkNsYXNzIGluc3RhbmNlc1xuICAgQSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgYSBjbGFzcyBvYmplY3QgKHNlZSBhYm92ZSkuXG4gICBBIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgd2hpY2hcbiAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuXG4gICBXaGVuIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MgaGFzXG4gICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzc1xuICAgYXR0cmlidXRlcy4gIElmIGEgY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kIHRoYXQgaXMgYSB1c2VyLWRlZmluZWRcbiAgIGZ1bmN0aW9uIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0XG4gICB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UuICBTdGF0aWMgbWV0aG9kIGFuZFxuICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGFsc28gdHJhbnNmb3JtZWQ7IHNlZSBhYm92ZSB1bmRlclxuICAgIkNsYXNzZXMiLiAgU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyogZm9yIGFub3RoZXIgd2F5XG4gICBpbiB3aGljaCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgcmV0cmlldmVkIHZpYSBpdHMgaW5zdGFuY2VzIG1heVxuICAgZGlmZmVyIGZyb20gdGhlIG9iamVjdHMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSBjbGFzc1wncyAiX19kaWN0X18iLlxuICAgSWYgbm8gY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kLCBhbmQgdGhlIG9iamVjdFwncyBjbGFzcyBoYXMgYVxuICAgIl9fZ2V0YXR0cl9fKCkiIG1ldGhvZCwgdGhhdCBpcyBjYWxsZWQgdG8gc2F0aXNmeSB0aGUgbG9va3VwLlxuXG4gICBBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNlXCdzXG4gICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzXCdzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGFcbiAgICJfX3NldGF0dHJfXygpIiBvciAiX19kZWxhdHRyX18oKSIgbWV0aG9kLCB0aGlzIGlzIGNhbGxlZCBpbnN0ZWFkXG4gICBvZiB1cGRhdGluZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgbWFwcGluZ3NcbiAgIGlmIHRoZXkgaGF2ZSBtZXRob2RzIHdpdGggY2VydGFpbiBzcGVjaWFsIG5hbWVzLiAgU2VlIHNlY3Rpb25cbiAgICpTcGVjaWFsIG1ldGhvZCBuYW1lcyouXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fZGljdF9fIiBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7XG4gICAiX19jbGFzc19fIiBpcyB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MuXG5cbkkvTyBvYmplY3RzIChhbHNvIGtub3duIGFzIGZpbGUgb2JqZWN0cylcbiAgIEEgKmZpbGUgb2JqZWN0KiByZXByZXNlbnRzIGFuIG9wZW4gZmlsZS4gIFZhcmlvdXMgc2hvcnRjdXRzIGFyZVxuICAgYXZhaWxhYmxlIHRvIGNyZWF0ZSBmaWxlIG9iamVjdHM6IHRoZSAib3BlbigpIiBidWlsdC1pbiBmdW5jdGlvbixcbiAgIGFuZCBhbHNvICJvcy5wb3BlbigpIiwgIm9zLmZkb3BlbigpIiwgYW5kIHRoZSAibWFrZWZpbGUoKSIgbWV0aG9kXG4gICBvZiBzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHNcbiAgIHByb3ZpZGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzKS5cblxuICAgVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZVxuICAgaW5pdGlhbGl6ZWQgdG8gZmlsZSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVycHJldGVyXCdzXG4gICBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zOyB0aGV5IGFyZSBhbGwgb3BlbiBpbiB0ZXh0XG4gICBtb2RlIGFuZCB0aGVyZWZvcmUgZm9sbG93IHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGVcbiAgICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy5cblxuSW50ZXJuYWwgdHlwZXNcbiAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gdGhlXG4gICB1c2VyLiBUaGVpciBkZWZpbml0aW9ucyBtYXkgY2hhbmdlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoZVxuICAgaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLlxuXG4gICBDb2RlIG9iamVjdHNcbiAgICAgIENvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsXG4gICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGFcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4gZXhwbGljaXRcbiAgICAgIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb25cJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCB3YXNcbiAgICAgIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUgb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlXG4gICAgICBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBmdW5jdGlvbiBvYmplY3QsIG5vdFxuICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkIGF0XG4gICAgICBydW4tdGltZSkuICBVbmxpa2UgZnVuY3Rpb24gb2JqZWN0cywgY29kZSBvYmplY3RzIGFyZSBpbW11dGFibGVcbiAgICAgIGFuZCBjb250YWluIG5vIHJlZmVyZW5jZXMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvIG11dGFibGVcbiAgICAgIG9iamVjdHMuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJjb19uYW1lIiBnaXZlcyB0aGUgZnVuY3Rpb24gbmFtZTtcbiAgICAgICJjb19hcmdjb3VudCIgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAoaW5jbHVkaW5nXG4gICAgICBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7ICJjb19ubG9jYWxzIiBpcyB0aGUgbnVtYmVyIG9mXG4gICAgICBsb2NhbCB2YXJpYWJsZXMgdXNlZCBieSB0aGUgZnVuY3Rpb24gKGluY2x1ZGluZyBhcmd1bWVudHMpO1xuICAgICAgImNvX3Zhcm5hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBsb2NhbFxuICAgICAgdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7ICJjb19jZWxsdmFycyIgaXMgYVxuICAgICAgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlXG4gICAgICByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7ICJjb19mcmVldmFycyIgaXMgYSB0dXBsZVxuICAgICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgZnJlZSB2YXJpYWJsZXM7ICJjb19jb2RlIiBpcyBhIHN0cmluZ1xuICAgICAgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnM7ICJjb19jb25zdHMiXG4gICAgICBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGxpdGVyYWxzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuICAgICAgImNvX25hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuICAgICAgImNvX2ZpbGVuYW1lIiBpcyB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgY29tcGlsZWQ7XG4gICAgICAiY29fZmlyc3RsaW5lbm8iIGlzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBvZiB0aGUgZnVuY3Rpb247XG4gICAgICAiY29fbG5vdGFiIiBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4gICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGVcbiAgICAgIGludGVycHJldGVyKTsgImNvX3N0YWNrc2l6ZSIgaXMgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemVcbiAgICAgIChpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKTsgImNvX2ZsYWdzIiBpcyBhbiBpbnRlZ2VyIGVuY29kaW5nIGFcbiAgICAgIG51bWJlciBvZiBmbGFncyBmb3IgdGhlIGludGVycHJldGVyLlxuXG4gICAgICBUaGUgZm9sbG93aW5nIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBmb3IgImNvX2ZsYWdzIjogYml0ICIweDA0IlxuICAgICAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKmFyZ3VtZW50cyIgc3ludGF4IHRvIGFjY2VwdCBhblxuICAgICAgYXJiaXRyYXJ5IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgaWZcbiAgICAgIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKiprZXl3b3JkcyIgc3ludGF4IHRvIGFjY2VwdCBhcmJpdHJhcnlcbiAgICAgIGtleXdvcmQgYXJndW1lbnRzOyBiaXQgIjB4MjAiIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gaXMgYVxuICAgICAgZ2VuZXJhdG9yLlxuXG4gICAgICBGdXR1cmUgZmVhdHVyZSBkZWNsYXJhdGlvbnMgKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIilcbiAgICAgIGFsc28gdXNlIGJpdHMgaW4gImNvX2ZsYWdzIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgY29kZSBvYmplY3RcbiAgICAgIHdhcyBjb21waWxlZCB3aXRoIGEgcGFydGljdWxhciBmZWF0dXJlIGVuYWJsZWQ6IGJpdCAiMHgyMDAwIiBpc1xuICAgICAgc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmUgZGl2aXNpb24gZW5hYmxlZDtcbiAgICAgIGJpdHMgIjB4MTAiIGFuZCAiMHgxMDAwIiB3ZXJlIHVzZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZlxuICAgICAgUHl0aG9uLlxuXG4gICAgICBPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuXG5cbiAgICAgIElmIGEgY29kZSBvYmplY3QgcmVwcmVzZW50cyBhIGZ1bmN0aW9uLCB0aGUgZmlyc3QgaXRlbSBpblxuICAgICAgImNvX2NvbnN0cyIgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbiAgICAgICJOb25lIiBpZiB1bmRlZmluZWQuXG5cbiAgIEZyYW1lIG9iamVjdHNcbiAgICAgIEZyYW1lIG9iamVjdHMgcmVwcmVzZW50IGV4ZWN1dGlvbiBmcmFtZXMuICBUaGV5IG1heSBvY2N1ciBpblxuICAgICAgdHJhY2ViYWNrIG9iamVjdHMgKHNlZSBiZWxvdykuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJmX2JhY2siIGlzIHRvIHRoZSBwcmV2aW91cyBzdGFja1xuICAgICAgZnJhbWUgKHRvd2FyZHMgdGhlIGNhbGxlciksIG9yICJOb25lIiBpZiB0aGlzIGlzIHRoZSBib3R0b21cbiAgICAgIHN0YWNrIGZyYW1lOyAiZl9jb2RlIiBpcyB0aGUgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gdGhpc1xuICAgICAgZnJhbWU7ICJmX2xvY2FscyIgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwIGxvY2FsXG4gICAgICB2YXJpYWJsZXM7ICJmX2dsb2JhbHMiIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4gICAgICAiZl9idWlsdGlucyIgaXMgdXNlZCBmb3IgYnVpbHQtaW4gKGludHJpbnNpYykgbmFtZXM7ICJmX2xhc3RpIlxuICAgICAgZ2l2ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGVcbiAgICAgIGJ5dGVjb2RlIHN0cmluZyBvZiB0aGUgY29kZSBvYmplY3QpLlxuXG4gICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6ICJmX3RyYWNlIiwgaWYgbm90ICJOb25lIiwgaXMgYVxuICAgICAgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBjb2RlIGxpbmUgKHRoaXMgaXNcbiAgICAgIHVzZWQgYnkgdGhlIGRlYnVnZ2VyKTsgImZfbGluZW5vIiBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBvZlxuICAgICAgdGhlIGZyYW1lIC0tLSB3cml0aW5nIHRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiBqdW1wc1xuICAgICAgdG8gdGhlIGdpdmVuIGxpbmUgKG9ubHkgZm9yIHRoZSBib3R0b20tbW9zdCBmcmFtZSkuICBBIGRlYnVnZ2VyXG4gICAgICBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSB3cml0aW5nXG4gICAgICB0byBmX2xpbmVuby5cblxuICAgICAgRnJhbWUgb2JqZWN0cyBzdXBwb3J0IG9uZSBtZXRob2Q6XG5cbiAgICAgIGZyYW1lLmNsZWFyKClcblxuICAgICAgICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkIGJ5XG4gICAgICAgICB0aGUgZnJhbWUuICBBbHNvLCBpZiB0aGUgZnJhbWUgYmVsb25nZWQgdG8gYSBnZW5lcmF0b3IsIHRoZVxuICAgICAgICAgZ2VuZXJhdG9yIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlIGN5Y2xlc1xuICAgICAgICAgaW52b2x2aW5nIGZyYW1lIG9iamVjdHMgKGZvciBleGFtcGxlIHdoZW4gY2F0Y2hpbmcgYW5cbiAgICAgICAgIGV4Y2VwdGlvbiBhbmQgc3RvcmluZyBpdHMgdHJhY2ViYWNrIGZvciBsYXRlciB1c2UpLlxuXG4gICAgICAgICAiUnVudGltZUVycm9yIiBpcyByYWlzZWQgaWYgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuXG5cbiAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuICAgVHJhY2ViYWNrIG9iamVjdHNcbiAgICAgIFRyYWNlYmFjayBvYmplY3RzIHJlcHJlc2VudCBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gIEFcbiAgICAgIHRyYWNlYmFjayBvYmplY3QgaXMgY3JlYXRlZCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIHRoZVxuICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssIGF0XG4gICAgICBlYWNoIHVud291bmQgbGV2ZWwgYSB0cmFjZWJhY2sgb2JqZWN0IGlzIGluc2VydGVkIGluIGZyb250IG9mXG4gICAgICB0aGUgY3VycmVudCB0cmFjZWJhY2suICBXaGVuIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGVudGVyZWQsXG4gICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgc2VjdGlvblxuICAgICAgKlRoZSB0cnkgc3RhdGVtZW50Ki4pIEl0IGlzIGFjY2Vzc2libGUgYXMgdGhlIHRoaXJkIGl0ZW0gb2YgdGhlXG4gICAgICB0dXBsZSByZXR1cm5lZCBieSAic3lzLmV4Y19pbmZvKCkiLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zIG5vXG4gICAgICBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiAobmljZWx5IGZvcm1hdHRlZClcbiAgICAgIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW07IGlmIHRoZSBpbnRlcnByZXRlciBpcyBpbnRlcmFjdGl2ZSxcbiAgICAgIGl0IGlzIGFsc28gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgInN5cy5sYXN0X3RyYWNlYmFjayIuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiB0aGVcbiAgICAgIHN0YWNrIHRyYWNlICh0b3dhcmRzIHRoZSBmcmFtZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkKSwgb3JcbiAgICAgICJOb25lIiBpZiB0aGVyZSBpcyBubyBuZXh0IGxldmVsOyAidGJfZnJhbWUiIHBvaW50cyB0byB0aGVcbiAgICAgIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDsgInRiX2xpbmVubyIgZ2l2ZXMgdGhlIGxpbmVcbiAgICAgIG51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkOyAidGJfbGFzdGkiIGluZGljYXRlcyB0aGVcbiAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24uICBUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gaW5cbiAgICAgIHRoZSB0cmFjZWJhY2sgbWF5IGRpZmZlciBmcm9tIHRoZSBsaW5lIG51bWJlciBvZiBpdHMgZnJhbWVcbiAgICAgIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgInRyeSIgc3RhdGVtZW50IHdpdGggbm9cbiAgICAgIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLlxuXG4gICBTbGljZSBvYmplY3RzXG4gICAgICBTbGljZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzbGljZXMgZm9yICJfX2dldGl0ZW1fXygpIlxuICAgICAgbWV0aG9kcy4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4gInNsaWNlKCkiXG4gICAgICBmdW5jdGlvbi5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInN0YXJ0IiBpcyB0aGUgbG93ZXIgYm91bmQ7ICJzdG9wIlxuICAgICAgaXMgdGhlIHVwcGVyIGJvdW5kOyAic3RlcCIgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMgIk5vbmUiIGlmXG4gICAgICBvbWl0dGVkLiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS5cblxuICAgICAgU2xpY2Ugb2JqZWN0cyBzdXBwb3J0IG9uZSBtZXRob2Q6XG5cbiAgICAgIHNsaWNlLmluZGljZXMoc2VsZiwgbGVuZ3RoKVxuXG4gICAgICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZFxuICAgICAgICAgY29tcHV0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNsaWNlIHRoYXQgdGhlIHNsaWNlIG9iamVjdFxuICAgICAgICAgd291bGQgZGVzY3JpYmUgaWYgYXBwbGllZCB0byBhIHNlcXVlbmNlIG9mICpsZW5ndGgqIGl0ZW1zLlxuICAgICAgICAgSXQgcmV0dXJucyBhIHR1cGxlIG9mIHRocmVlIGludGVnZXJzOyByZXNwZWN0aXZlbHkgdGhlc2UgYXJlXG4gICAgICAgICB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlXG4gICAgICAgICBsZW5ndGggb2YgdGhlIHNsaWNlLiBNaXNzaW5nIG9yIG91dC1vZi1ib3VuZHMgaW5kaWNlcyBhcmVcbiAgICAgICAgIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuXG4gICBTdGF0aWMgbWV0aG9kIG9iamVjdHNcbiAgICAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBwcm92aWRlIGEgd2F5IG9mIGRlZmVhdGluZyB0aGVcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9mIGZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgZGVzY3JpYmVkXG4gICAgICBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFueSBvdGhlclxuICAgICAgb2JqZWN0LCB1c3VhbGx5IGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QuIFdoZW4gYSBzdGF0aWNcbiAgICAgIG1ldGhvZCBvYmplY3QgaXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcyBvciBhIGNsYXNzIGluc3RhbmNlLCB0aGVcbiAgICAgIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsIHdoaWNoIGlzIG5vdFxuICAgICAgc3ViamVjdCB0byBhbnkgZnVydGhlciB0cmFuc2Zvcm1hdGlvbi4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZVxuICAgICAgbm90IHRoZW1zZWx2ZXMgY2FsbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3RzIHRoZXkgd3JhcCB1c3VhbGx5XG4gICAgICBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgICJzdGF0aWNtZXRob2QoKSIgY29uc3RydWN0b3IuXG5cbiAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4gICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyXG4gICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0IG9iamVjdFxuICAgICAgaXMgcmV0cmlldmVkIGZyb20gY2xhc3NlcyBhbmQgY2xhc3MgaW5zdGFuY2VzLiBUaGUgYmVoYXZpb3VyIG9mXG4gICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbiAgICAgIHVuZGVyICJVc2VyLWRlZmluZWQgbWV0aG9kcyIuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkXG4gICAgICBieSB0aGUgYnVpbHQtaW4gImNsYXNzbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuJywKKyAndHlwZXMnOiB1J1xuVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gIEV4dGVuc2lvblxubW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcblB5dGhvbiBtYXkgYWRkIHR5cGVzIHRvIHRoZSB0eXBlIGhpZXJhcmNoeSAoZS5nLiwgcmF0aW9uYWwgbnVtYmVycyxcbmVmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLCBhbHRob3VnaCBzdWNoIGFkZGl0aW9uc1xud2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC5cblxuU29tZSBvZiB0aGUgdHlwZSBkZXNjcmlwdGlvbnMgYmVsb3cgY29udGFpbiBhIHBhcmFncmFwaCBsaXN0aW5nXG5cJ3NwZWNpYWwgYXR0cmlidXRlcy5cJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGVcbmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb25cbm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxuTm9uZVxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lICJOb25lIi4gSXRcbiAgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucywgZS5nLixcbiAgIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuXG4gICBhbnl0aGluZy4gSXRzIHRydXRoIHZhbHVlIGlzIGZhbHNlLlxuXG5Ob3RJbXBsZW1lbnRlZFxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4gICAiTm90SW1wbGVtZW50ZWQiLiBOdW1lcmljIG1ldGhvZHMgYW5kIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzXG4gICBzaG91bGQgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yXG4gICB0aGUgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlXG4gICByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlXG4gICBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuICAgU2VlICpJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyogZm9yIG1vcmUgZGV0YWlscy5cblxuRWxsaXBzaXNcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCAiLi4uIiBvciB0aGVcbiAgIGJ1aWx0LWluIG5hbWUgIkVsbGlwc2lzIi4gIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG4ibnVtYmVycy5OdW1iZXIiXG4gICBUaGVzZSBhcmUgY3JlYXRlZCBieSBudW1lcmljIGxpdGVyYWxzIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzIGJ5XG4gICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICBOdW1lcmljXG4gICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuICAgbnVtYmVycywgYnV0IHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIG9mIG51bWVyaWNhbCByZXByZXNlbnRhdGlvblxuICAgaW4gY29tcHV0ZXJzLlxuXG4gICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmRcbiAgIGNvbXBsZXggbnVtYmVyczpcblxuICAgIm51bWJlcnMuSW50ZWdyYWwiXG4gICAgICBUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2Vyc1xuICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG5cbiAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6XG5cbiAgICAgIEludGVnZXJzICgiaW50IilcblxuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4gICAgICAgICBhdmFpbGFibGUgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0XG4gICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCBhbmRcbiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyXCdzXG4gICAgICAgICBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZiBhbiBpbmZpbml0ZSBzdHJpbmcgb2ZcbiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG5cbiAgICAgIEJvb2xlYW5zICgiYm9vbCIpXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbiAgICAgICAgIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSB0aGVcbiAgICAgICAgIG9ubHkgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGVcbiAgICAgICAgIGludGVnZXIgdHlwZSwgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmRcbiAgICAgICAgIDEsIHJlc3BlY3RpdmVseSwgaW4gYWxtb3N0IGFsbCBjb250ZXh0cywgdGhlIGV4Y2VwdGlvbiBiZWluZ1xuICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgIiJGYWxzZSIiIG9yXG4gICAgICAgICAiIlRydWUiIiBhcmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlIHRoZVxuICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2Vycy5cblxuICAgIm51bWJlcnMuUmVhbCIgKCJmbG9hdCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50XG4gICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4gICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbiAgICAgIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4gUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLVxuICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciBhbmRcbiAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGFyZVxuICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlIGlzXG4gICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmdcbiAgICAgIHBvaW50IG51bWJlcnMuXG5cbiAgICJudW1iZXJzLkNvbXBsZXgiICgiY29tcGxleCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgY29tcGxleCBudW1iZXJzIGFzIGEgcGFpciBvZiBtYWNoaW5lLWxldmVsXG4gICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5XG4gICAgICBhcyBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhXG4gICAgICBjb21wbGV4IG51bWJlciAieiIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbiAgICAgIGF0dHJpYnV0ZXMgInoucmVhbCIgYW5kICJ6LmltYWciLlxuXG5TZXF1ZW5jZXNcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlXG4gICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXNcbiAgIG9mIGEgc2VxdWVuY2UuIFdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzICpuKiwgdGhlIGluZGV4IHNldFxuICAgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mIHNlcXVlbmNlICphKiBpc1xuICAgc2VsZWN0ZWQgYnkgImFbaV0iLlxuXG4gICBTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6ICJhW2k6al0iIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGhcbiAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqICI8PSIgKmsqICI8IiAqaiouICBXaGVuIHVzZWQgYXMgYW5cbiAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzXG4gICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuXG4gICBTb21lIHNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgImV4dGVuZGVkIHNsaWNpbmciIHdpdGggYSB0aGlyZCAic3RlcCJcbiAgIHBhcmFtZXRlcjogImFbaTpqOmtdIiBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCogd2hlcmVcbiAgICJ4ID0gaSArIG4qayIsICpuKiAiPj0iICIwIiBhbmQgKmkqICI8PSIgKngqICI8IiAqaiouXG5cbiAgIFNlcXVlbmNlcyBhcmUgZGlzdGluZ3Vpc2hlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbXV0YWJpbGl0eTpcblxuICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpc1xuICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cyxcbiAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyBob3dldmVyLFxuICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZVxuICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuXG4gICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuXG4gICAgICBTdHJpbmdzXG4gICAgICAgICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlIGNvZGVcbiAgICAgICAgIHBvaW50cy4gQWxsIHRoZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgIlUrMDAwMCAtIFUrMTBGRkZGIlxuICAgICAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEgc3RyaW5nLiAgUHl0aG9uIGRvZXNuXCd0IGhhdmUgYSAiY2hhciJcbiAgICAgICAgIHR5cGU7IGluc3RlYWQsIGV2ZXJ5IGNvZGUgcG9pbnQgaW4gdGhlIHN0cmluZyBpcyByZXByZXNlbnRlZFxuICAgICAgICAgYXMgYSBzdHJpbmcgb2JqZWN0IHdpdGggbGVuZ3RoICIxIi4gIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgICAgICAgIm9yZCgpIiBjb252ZXJ0cyBhIGNvZGUgcG9pbnQgZnJvbSBpdHMgc3RyaW5nIGZvcm0gdG8gYW5cbiAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIjsgImNocigpIiBjb252ZXJ0cyBhblxuICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aFxuICAgICAgICAgIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYVxuICAgICAgICAgInN0ciIgdG8gImJ5dGVzIiB1c2luZyB0aGUgZ2l2ZW4gdGV4dCBlbmNvZGluZywgYW5kXG4gICAgICAgICAiYnl0ZXMuZGVjb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIG9wcG9zaXRlLlxuXG4gICAgICBUdXBsZXNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZlxuICAgICAgICAgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2ZcbiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBcJ3NpbmdsZXRvblwnKSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnlcbiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZVxuICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLlxuXG4gICAgICBCeXRlc1xuICAgICAgICAgQSBieXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIGFycmF5LiAgVGhlIGl0ZW1zIGFyZSA4LWJpdFxuICAgICAgICAgYnl0ZXMsIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzIGluIHRoZSByYW5nZSAwIDw9IHggPCAyNTYuXG4gICAgICAgICBCeXRlcyBsaXRlcmFscyAobGlrZSAiYlwnYWJjXCciKSBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICAgICAgICAiYnl0ZXMoKSIgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGJ5dGVzIG9iamVjdHMuICBBbHNvLFxuICAgICAgICAgYnl0ZXMgb2JqZWN0cyBjYW4gYmUgZGVjb2RlZCB0byBzdHJpbmdzIHZpYSB0aGUgImRlY29kZSgpIlxuICAgICAgICAgbWV0aG9kLlxuXG4gICBNdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZVxuICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mXG4gICAgICBhc3NpZ25tZW50IGFuZCAiZGVsIiAoZGVsZXRlKSBzdGF0ZW1lbnRzLlxuXG4gICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcblxuICAgICAgTGlzdHNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZVxuICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpblxuICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAoTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBzcGVjaWFsIGNhc2VzIG5lZWRlZFxuICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcblxuICAgICAgQnl0ZSBBcnJheXNcbiAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnlcbiAgICAgICAgIHRoZSBidWlsdC1pbiAiYnl0ZWFycmF5KCkiIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgcHJvdmlkZVxuICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuICAgICAgICAgb2JqZWN0cy5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgImFycmF5IiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2YgYVxuICAgICAgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS5cblxuU2V0IHR5cGVzXG4gICBUaGVzZSByZXByZXNlbnQgdW5vcmRlcmVkLCBmaW5pdGUgc2V0cyBvZiB1bmlxdWUsIGltbXV0YWJsZVxuICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLFxuICAgdGhleSBjYW4gYmUgaXRlcmF0ZWQgb3ZlciwgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiXG4gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSBmYXN0XG4gICBtZW1iZXJzaGlwIHRlc3RpbmcsIHJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmRcbiAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4gICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG5cbiAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbiAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvclxuICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kXG4gICAiMS4wIiksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cblxuICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcblxuICAgU2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic2V0KCkiIGNvbnN0cnVjdG9yIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyBieSBzZXZlcmFsXG4gICAgICBtZXRob2RzLCBzdWNoIGFzICJhZGQoKSIuXG5cbiAgIEZyb3plbiBzZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4gICAgICBidWlsdC1pbiAiZnJvemVuc2V0KCkiIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMgaW1tdXRhYmxlXG4gICAgICBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZiBhbm90aGVyXG4gICAgICBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG5cbk1hcHBpbmdzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleFxuICAgc2V0cy4gVGhlIHN1YnNjcmlwdCBub3RhdGlvbiAiYVtrXSIgc2VsZWN0cyB0aGUgaXRlbSBpbmRleGVkIGJ5ICJrIlxuICAgZnJvbSB0aGUgbWFwcGluZyAiYSI7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIGFzIHRoZVxuICAgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBtYXBwaW5nLlxuXG4gICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcblxuICAgRGljdGlvbmFyaWVzXG4gICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuICAgICAgYXJiaXRyYXJ5IHZhbHVlcy4gIFRoZSBvbmx5IHR5cGVzIG9mIHZhbHVlcyBub3QgYWNjZXB0YWJsZSBhc1xuICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4gICAgICBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mXG4gICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXlcJ3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4gICAgICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljXG4gICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICIxLjAiKVxuICAgICAgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuICAgICAgZGljdGlvbmFyeSBlbnRyeS5cblxuICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSAiey4uLn0iXG4gICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gKkRpY3Rpb25hcnkgZGlzcGxheXMqKS5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGVzICJkYm0ubmRibSIgYW5kICJkYm0uZ251IiBwcm92aWRlXG4gICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyJcbiAgICAgIG1vZHVsZS5cblxuQ2FsbGFibGUgdHlwZXNcbiAgIFRoZXNlIGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW9uIChzZWVcbiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6XG5cbiAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb25cbiAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyopLiAgSXQgc2hvdWxkIGJlXG4gICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICBhcyB0aGUgZnVuY3Rpb25cJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuXG4gICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6XG5cbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbiAgICAgIHwgIl9fZG9jX18iICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlOyBub3QgaW5oZXJpdGVkIGJ5ICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJjbGFzc2VzICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fbmFtZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBuYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fcXVhbG5hbWVfXyIgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAqcXVhbGlmaWVkIG5hbWUqIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmV3IGluIHZlcnNpb24gMy4zLiAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX21vZHVsZV9fIiAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4sIG9yICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19kZWZhdWx0c19fIiAgICAgICAgICAgIHwgQSB0dXBsZSBjb250YWluaW5nIGRlZmF1bHQgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3IgIk5vbmUiIGlmIG5vIGFyZ3VtZW50cyBoYXZlICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19jb2RlX18iICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19nbG9iYWxzX18iICAgICAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlIGRpY3Rpb25hcnkgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uXCdzICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZGljdF9fIiAgICAgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fY2xvc3VyZV9fIiAgICAgICAgICAgICB8ICJOb25lIiBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb250YWluIGJpbmRpbmdzIGZvciB0aGUgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25cJ3MgZnJlZSB2YXJpYWJsZXMuICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19hbm5vdGF0aW9uc19fIiAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mIHBhcmFtZXRlcnMuICBUaGUga2V5cyBvZiB0aGUgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kICJcJ3JldHVyblwnIiBmb3IgdGhlIHJldHVybiAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5ub3RhdGlvbiwgaWYgcHJvdmlkZWQuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2t3ZGVmYXVsdHNfXyIgICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3IgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG5cbiAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiB0aGVcbiAgICAgIGFzc2lnbmVkIHZhbHVlLlxuXG4gICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeVxuICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGFcbiAgICAgIHRvIGZ1bmN0aW9ucy4gIFJlZ3VsYXIgYXR0cmlidXRlIGRvdC1ub3RhdGlvbiBpcyB1c2VkIHRvIGdldCBhbmRcbiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seVxuICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvblxuICAgICAgYXR0cmlidXRlcyBvbiBidWlsdC1pbiBmdW5jdGlvbnMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGVcbiAgICAgIGZ1dHVyZS4qXG5cbiAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvblwncyBkZWZpbml0aW9uIGNhbiBiZVxuICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGludGVybmFsXG4gICAgICB0eXBlcyBiZWxvdy5cblxuICAgSW5zdGFuY2UgbWV0aG9kc1xuICAgICAgQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlIGFuZFxuICAgICAgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24pLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiX19zZWxmX18iIGlzIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgb2JqZWN0LCAiX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7ICJfX2RvY19fIiBpcyB0aGVcbiAgICAgIG1ldGhvZFwncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICJfX2Z1bmNfXy5fX2RvY19fIik7ICJfX25hbWVfXyJcbiAgICAgIGlzIHRoZSBtZXRob2QgbmFtZSAoc2FtZSBhcyAiX19mdW5jX18uX19uYW1lX18iKTsgIl9fbW9kdWxlX18iXG4gICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBtZXRob2Qgd2FzIGRlZmluZWQgaW4sIG9yICJOb25lIlxuICAgICAgaWYgdW5hdmFpbGFibGUuXG5cbiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5XG4gICAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3MgKHBlcmhhcHMgdmlhIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MpLCBpZlxuICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgY2xhc3NcbiAgICAgIG1ldGhvZCBvYmplY3QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSB1c2VyLVxuICAgICAgZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcyxcbiAgICAgIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UsIGFuZCB0aGUgbWV0aG9kIG9iamVjdFxuICAgICAgaXMgc2FpZCB0byBiZSBib3VuZC4gIFRoZSBuZXcgbWV0aG9kXCdzICJfX2Z1bmNfXyIgYXR0cmlidXRlIGlzXG4gICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nXG4gICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyIGlzXG4gICAgICB0aGUgc2FtZSBhcyBmb3IgYSBmdW5jdGlvbiBvYmplY3QsIGV4Y2VwdCB0aGF0IHRoZSAiX19mdW5jX18iXG4gICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3RcbiAgICAgIGJ1dCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSBjbGFzc1xuICAgICAgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZVxuICAgICAgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGVcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nXG4gICAgICBmdW5jdGlvbiAoIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICAoIl9fc2VsZl9fIikgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3IgaW5zdGFuY2UsIHdoZW5cbiAgICAgICJDIiBpcyBhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiAiZigpIixcbiAgICAgIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgIGNhbGxpbmcgIkMuZih4LCAxKSIuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBkZXJpdmVkIGZyb20gYSBjbGFzcyBtZXRob2RcbiAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCBhY3R1YWxseVxuICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAiQy5mKDEpIlxuICAgICAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nICJmKEMsMSkiIHdoZXJlICJmIiBpcyB0aGUgdW5kZXJseWluZ1xuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gaW5zdGFuY2VcbiAgICAgIG1ldGhvZCBvYmplY3QgaGFwcGVucyBlYWNoIHRpbWUgdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAgdGhlIGluc3RhbmNlLiAgSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bCBvcHRpbWl6YXRpb24gaXMgdG9cbiAgICAgIGFzc2lnbiB0aGUgYXR0cmlidXRlIHRvIGEgbG9jYWwgdmFyaWFibGUgYW5kIGNhbGwgdGhhdCBsb2NhbFxuICAgICAgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgZm9yXG4gICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb25zOyBvdGhlciBjYWxsYWJsZSBvYmplY3RzIChhbmQgYWxsIG5vbi1cbiAgICAgIGNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzXG4gICAgICBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyB3aGljaCBhcmVcbiAgICAgIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZFxuICAgICAgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbiBhdHRyaWJ1dGVcbiAgICAgIG9mIHRoZSBjbGFzcy5cblxuICAgR2VuZXJhdG9yIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZVxuICAgICAgc2VjdGlvbiAqVGhlIHlpZWxkIHN0YXRlbWVudCopIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgZnVuY3Rpb24qLlxuICAgICAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0XG4gICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmdcbiAgICAgIHRoZSBpdGVyYXRvclwncyAiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlXG4gICAgICBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICJ5aWVsZCJcbiAgICAgIHN0YXRlbWVudC4gIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgInJldHVybiIgc3RhdGVtZW50IG9yXG4gICAgICBmYWxscyBvZmYgdGhlIGVuZCwgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlXG4gICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvIGJlXG4gICAgICByZXR1cm5lZC5cblxuICAgQ29yb3V0aW5lIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpc1xuICAgICAgY2FsbGVkIGEgKmNvcm91dGluZSBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLFxuICAgICAgcmV0dXJucyBhICpjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCJcbiAgICAgIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzICJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgc3RhdGVtZW50cy5cbiAgICAgIFNlZSBhbHNvICpDb3JvdXRpbmVzKiBzZWN0aW9uLlxuXG4gICBCdWlsdC1pbiBmdW5jdGlvbnNcbiAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSJcbiAgICAgICgibWF0aCIgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mXG4gICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtXG4gICAgICBvbmx5IGF0dHJpYnV0ZXM6ICJfX2RvY19fIiBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuICAgICAgc3RyaW5nLCBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGU7ICJfX25hbWVfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzXG4gICAgICBuYW1lOyAiX19zZWxmX18iIGlzIHNldCB0byAiTm9uZSIgKGJ1dCBzZWUgdGhlIG5leHQgaXRlbSk7XG4gICAgICAiX19tb2R1bGVfXyIgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWRcbiAgICAgIGluIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS5cblxuICAgQnVpbHQtaW4gbWV0aG9kc1xuICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpc1xuICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbiAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuICAgICAgImFsaXN0LmFwcGVuZCgpIiwgYXNzdW1pbmcgKmFsaXN0KiBpcyBhIGxpc3Qgb2JqZWN0LiBJbiB0aGlzXG4gICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlICJfX3NlbGZfXyIgaXMgc2V0IHRvIHRoZVxuICAgICAgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki5cblxuICAgQ2xhc3Nlc1xuICAgICAgQ2xhc3NlcyBhcmUgY2FsbGFibGUuICBUaGVzZSBvYmplY3RzIG5vcm1hbGx5IGFjdCBhcyBmYWN0b3JpZXNcbiAgICAgIGZvciBuZXcgaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3JcbiAgICAgIGNsYXNzIHR5cGVzIHRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZVxuICAgICAgY2FsbCBhcmUgcGFzc2VkIHRvICJfX25ld19fKCkiIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG9cbiAgICAgICJfX2luaXRfXygpIiB0byBpbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuXG5cbiAgIENsYXNzIEluc3RhbmNlc1xuICAgICAgSW5zdGFuY2VzIG9mIGFyYml0cmFyeSBjbGFzc2VzIGNhbiBiZSBtYWRlIGNhbGxhYmxlIGJ5IGRlZmluaW5nXG4gICAgICBhICJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuXG5cbk1vZHVsZXNcbiAgIE1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZVxuICAgY3JlYXRlZCBieSB0aGUgKmltcG9ydCBzeXN0ZW0qIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IlxuICAgc3RhdGVtZW50IChzZWUgImltcG9ydCIpLCBvciBieSBjYWxsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzXG4gICAiaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgYW5kIGJ1aWx0LWluICJfX2ltcG9ydF9fKCkiLiAgQSBtb2R1bGVcbiAgIG9iamVjdCBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnkgYSBkaWN0aW9uYXJ5IG9iamVjdCAodGhpcyBpc1xuICAgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUgIl9fZ2xvYmFsc19fIiBhdHRyaWJ1dGUgb2ZcbiAgIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLiAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlXG4gICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyBlcXVpdmFsZW50XG4gICB0byAibS5fX2RpY3RfX1sieCJdIi4gQSBtb2R1bGUgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvZGVcbiAgIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSAoc2luY2UgaXQgaXNuXCd0IG5lZWRlZCBvbmNlXG4gICB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiAgIGUuZy4sICJtLnggPSAxIiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0gPSAxIi5cblxuICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlXG4gICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LlxuXG4gICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4gICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZFxuICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsIGhhc1xuICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwIHRoZVxuICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIG1vZHVsZVwncyBuYW1lO1xuICAgIl9fZG9jX18iIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZlxuICAgdW5hdmFpbGFibGU7ICJfX2ZpbGVfXyIgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlXG4gICBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlICJfX2ZpbGVfXyJcbiAgIGF0dHJpYnV0ZSBtYXkgYmUgbWlzc2luZyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtb2R1bGVzLCBzdWNoIGFzIENcbiAgIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvclxuICAgZXh0ZW5zaW9uIG1vZHVsZXMgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXNcbiAgIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS5cblxuQ3VzdG9tIGNsYXNzZXNcbiAgIEN1c3RvbSBjbGFzcyB0eXBlcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnMgKHNlZVxuICAgc2VjdGlvbiAqQ2xhc3MgZGVmaW5pdGlvbnMqKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkXG4gICBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZFxuICAgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJDLngiIGlzIHRyYW5zbGF0ZWQgdG9cbiAgICJDLl9fZGljdF9fWyJ4Il0iIChhbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggYWxsb3dcbiAgIGZvciBvdGhlciBtZWFucyBvZiBsb2NhdGluZyBhdHRyaWJ1dGVzKS4gV2hlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXNcbiAgIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlXG4gICBjbGFzc2VzLiBUaGlzIHNlYXJjaCBvZiB0aGUgYmFzZSBjbGFzc2VzIHVzZXMgdGhlIEMzIG1ldGhvZFxuICAgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZlxuICAgXCdkaWFtb25kXCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGVcbiAgIGluaGVyaXRhbmNlIHBhdGhzIGxlYWRpbmcgYmFjayB0byBhIGNvbW1vbiBhbmNlc3Rvci4gQWRkaXRpb25hbFxuICAgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGVcbiAgIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMgcmVsZWFzZSBhdFxuICAgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvLy5cblxuICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyAiQyIsIHNheSkgd291bGQgeWllbGQgYVxuICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZXMgaXMgIkMiLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCBhXG4gICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgYnlcbiAgIHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycypcbiAgIGZvciBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5XG4gICBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseSBjb250YWluZWQgaW4gaXRzICJfX2RpY3RfXyIuXG5cbiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzXCdzIGRpY3Rpb25hcnksIG5ldmVyXG4gICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG5cbiAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZVxuICAgKHNlZSBiZWxvdykuXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgY2xhc3MgbmFtZTsgIl9fbW9kdWxlX18iIGlzXG4gICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyAiX19kaWN0X18iIGlzIHRoZVxuICAgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzc1wncyBuYW1lc3BhY2U7ICJfX2Jhc2VzX18iIGlzIGEgdHVwbGVcbiAgIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLCBpbiB0aGVcbiAgIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDsgIl9fZG9jX18iIGlzIHRoZVxuICAgY2xhc3NcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLlxuXG5DbGFzcyBpbnN0YW5jZXNcbiAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgYWJvdmUpLlxuICAgQSBjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoXG4gICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuICAgV2hlbiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIHRoZXJlLCBhbmQgdGhlIGluc3RhbmNlXCdzIGNsYXNzIGhhc1xuICAgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgd2l0aCB0aGUgY2xhc3NcbiAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkXG4gICBmdW5jdGlvbiBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdFxuICAgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLiAgU3RhdGljIG1ldGhvZCBhbmRcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBhbHNvIHRyYW5zZm9ybWVkOyBzZWUgYWJvdmUgdW5kZXJcbiAgICJDbGFzc2VzIi4gIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqIGZvciBhbm90aGVyIHdheVxuICAgaW4gd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXlcbiAgIGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3NcJ3MgIl9fZGljdF9fIi5cbiAgIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZSBvYmplY3RcJ3MgY2xhc3MgaGFzIGFcbiAgICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZVwnc1xuICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzc1wncyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhXG4gICAiX19zZXRhdHRyX18oKSIgb3IgIl9fZGVsYXR0cl9fKCkiIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgaW5zdGVhZFxuICAgb2YgdXBkYXRpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yIG1hcHBpbmdzXG4gICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4gICAqU3BlY2lhbCBtZXRob2QgbmFtZXMqLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6ICJfX2RpY3RfXyIgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5O1xuICAgIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuXG5JL08gb2JqZWN0cyAoYWxzbyBrbm93biBhcyBmaWxlIG9iamVjdHMpXG4gICBBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmVcbiAgIGF2YWlsYWJsZSB0byBjcmVhdGUgZmlsZSBvYmplY3RzOiB0aGUgIm9wZW4oKSIgYnVpbHQtaW4gZnVuY3Rpb24sXG4gICBhbmQgYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiIG1ldGhvZFxuICAgb2Ygc29ja2V0IG9iamVjdHMgKGFuZCBwZXJoYXBzIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBtZXRob2RzXG4gICBwcm92aWRlZCBieSBleHRlbnNpb24gbW9kdWxlcykuXG5cbiAgIFRoZSBvYmplY3RzICJzeXMuc3RkaW4iLCAic3lzLnN0ZG91dCIgYW5kICJzeXMuc3RkZXJyIiBhcmVcbiAgIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcnByZXRlclwnc1xuICAgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtczsgdGhleSBhcmUgYWxsIG9wZW4gaW4gdGV4dFxuICAgbW9kZSBhbmQgdGhlcmVmb3JlIGZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlXG4gICAiaW8uVGV4dElPQmFzZSIgYWJzdHJhY3QgY2xhc3MuXG5cbkludGVybmFsIHR5cGVzXG4gICBBIGZldyB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGludGVycHJldGVyIGFyZSBleHBvc2VkIHRvIHRoZVxuICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbiAgIGludGVycHJldGVyLCBidXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy5cblxuICAgQ29kZSBvYmplY3RzXG4gICAgICBDb2RlIG9iamVjdHMgcmVwcmVzZW50ICpieXRlLWNvbXBpbGVkKiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlLFxuICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4gICAgICBmdW5jdGlvbiBvYmplY3QgaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0XG4gICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uXCdzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzXG4gICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuICAgICAgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBub3RcbiAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdFxuICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgaW1tdXRhYmxlXG4gICAgICBhbmQgY29udGFpbiBubyByZWZlcmVuY2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBtdXRhYmxlXG4gICAgICBvYmplY3RzLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiY29fbmFtZSIgZ2l2ZXMgdGhlIGZ1bmN0aW9uIG5hbWU7XG4gICAgICAiY29fYXJnY291bnQiIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgKGluY2x1ZGluZ1xuICAgICAgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyAiY29fbmxvY2FscyIgaXMgdGhlIG51bWJlciBvZlxuICAgICAgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgYXJndW1lbnRzKTtcbiAgICAgICJjb192YXJuYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWxcbiAgICAgIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpOyAiY29fY2VsbHZhcnMiIGlzIGFcbiAgICAgIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZVxuICAgICAgcmVmZXJlbmNlZCBieSBuZXN0ZWQgZnVuY3Rpb25zOyAiY29fZnJlZXZhcnMiIGlzIGEgdHVwbGVcbiAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWUgdmFyaWFibGVzOyAiY29fY29kZSIgaXMgYSBzdHJpbmdcbiAgICAgIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zOyAiY29fY29uc3RzIlxuICAgICAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19uYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19maWxlbmFtZSIgaXMgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzIGNvbXBpbGVkO1xuICAgICAgImNvX2ZpcnN0bGluZW5vIiBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuICAgICAgImNvX2xub3RhYiIgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuICAgICAgb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgKGZvciBkZXRhaWxzIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlXG4gICAgICBpbnRlcnByZXRlcik7ICJjb19zdGFja3NpemUiIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4gICAgICAoaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7ICJjb19mbGFncyIgaXMgYW4gaW50ZWdlciBlbmNvZGluZyBhXG4gICAgICBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cblxuICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yICJjb19mbGFncyI6IGJpdCAiMHgwNCJcbiAgICAgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIiphcmd1bWVudHMiIHN5bnRheCB0byBhY2NlcHQgYW5cbiAgICAgIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdCAiMHgwOCIgaXMgc2V0IGlmXG4gICAgICB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIioqa2V5d29yZHMiIHN5bnRheCB0byBhY2NlcHQgYXJiaXRyYXJ5XG4gICAgICBrZXl3b3JkIGFyZ3VtZW50czsgYml0ICIweDIwIiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGFcbiAgICAgIGdlbmVyYXRvci5cblxuICAgICAgRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zICgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIpXG4gICAgICBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgb2JqZWN0XG4gICAgICB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgIjB4MjAwMCIgaXNcbiAgICAgIHNldCBpZiB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlIGRpdmlzaW9uIGVuYWJsZWQ7XG4gICAgICBiaXRzICIweDEwIiBhbmQgIjB4MTAwMCIgd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2ZcbiAgICAgIFB5dGhvbi5cblxuICAgICAgT3RoZXIgYml0cyBpbiAiY29fZmxhZ3MiIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuXG4gICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAgICJjb19jb25zdHMiIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4gICAgICAiTm9uZSIgaWYgdW5kZWZpbmVkLlxuXG4gICBGcmFtZSBvYmplY3RzXG4gICAgICBGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW5cbiAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiZl9iYWNrIiBpcyB0byB0aGUgcHJldmlvdXMgc3RhY2tcbiAgICAgIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciAiTm9uZSIgaWYgdGhpcyBpcyB0aGUgYm90dG9tXG4gICAgICBzdGFjayBmcmFtZTsgImZfY29kZSIgaXMgdGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXNcbiAgICAgIGZyYW1lOyAiZl9sb2NhbHMiIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cCBsb2NhbFxuICAgICAgdmFyaWFibGVzOyAiZl9nbG9iYWxzIiBpcyB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzO1xuICAgICAgImZfYnVpbHRpbnMiIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOyAiZl9sYXN0aSJcbiAgICAgIGdpdmVzIHRoZSBwcmVjaXNlIGluc3RydWN0aW9uICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlXG4gICAgICBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS5cblxuICAgICAgU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzOiAiZl90cmFjZSIsIGlmIG5vdCAiTm9uZSIsIGlzIGFcbiAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzXG4gICAgICB1c2VkIGJ5IHRoZSBkZWJ1Z2dlcik7ICJmX2xpbmVubyIgaXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2ZcbiAgICAgIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHNcbiAgICAgIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSBkZWJ1Z2dlclxuICAgICAgY2FuIGltcGxlbWVudCBhIEp1bXAgY29tbWFuZCAoYWthIFNldCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZ1xuICAgICAgdG8gZl9saW5lbm8uXG5cbiAgICAgIEZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBmcmFtZS5jbGVhcigpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaGVsZCBieVxuICAgICAgICAgdGhlIGZyYW1lLiAgQWxzbywgaWYgdGhlIGZyYW1lIGJlbG9uZ2VkIHRvIGEgZ2VuZXJhdG9yLCB0aGVcbiAgICAgICAgIGdlbmVyYXRvciBpcyBmaW5hbGl6ZWQuICBUaGlzIGhlbHBzIGJyZWFrIHJlZmVyZW5jZSBjeWNsZXNcbiAgICAgICAgIGludm9sdmluZyBmcmFtZSBvYmplY3RzIChmb3IgZXhhbXBsZSB3aGVuIGNhdGNoaW5nIGFuXG4gICAgICAgICBleGNlcHRpb24gYW5kIHN0b3JpbmcgaXRzIHRyYWNlYmFjayBmb3IgbGF0ZXIgdXNlKS5cblxuICAgICAgICAgIlJ1bnRpbWVFcnJvciIgaXMgcmFpc2VkIGlmIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXG4gICAgICAgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbiAgIFRyYWNlYmFjayBvYmplY3RzXG4gICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICBBXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiB0aGVcbiAgICAgIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdW53aW5kcyB0aGUgZXhlY3V0aW9uIHN0YWNrLCBhdFxuICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZlxuICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyBlbnRlcmVkLFxuICAgICAgdGhlIHN0YWNrIHRyYWNlIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtLiAoU2VlIHNlY3Rpb25cbiAgICAgICpUaGUgdHJ5IHN0YXRlbWVudCouKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIHRoZSB0aGlyZCBpdGVtIG9mIHRoZVxuICAgICAgdHVwbGUgcmV0dXJuZWQgYnkgInN5cy5leGNfaW5mbygpIi4gV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBub1xuICAgICAgc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSBmb3JtYXR0ZWQpXG4gICAgICB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsXG4gICAgICBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzICJzeXMubGFzdF90cmFjZWJhY2siLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAidGJfbmV4dCIgaXMgdGhlIG5leHQgbGV2ZWwgaW4gdGhlXG4gICAgICBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCksIG9yXG4gICAgICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgInRiX2ZyYW1lIiBwb2ludHMgdG8gdGhlXG4gICAgICBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7ICJ0Yl9saW5lbm8iIGdpdmVzIHRoZSBsaW5lXG4gICAgICBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZDsgInRiX2xhc3RpIiBpbmRpY2F0ZXMgdGhlXG4gICAgICBwcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIGFuZCBsYXN0IGluc3RydWN0aW9uIGluXG4gICAgICB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lXG4gICAgICBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIG5vXG4gICAgICBtYXRjaGluZyBleGNlcHQgY2xhdXNlIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cblxuICAgU2xpY2Ugb2JqZWN0c1xuICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAiX19nZXRpdGVtX18oKSJcbiAgICAgIG1ldGhvZHMuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluICJzbGljZSgpIlxuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJzdGFydCIgaXMgdGhlIGxvd2VyIGJvdW5kOyAic3RvcCJcbiAgICAgIGlzIHRoZSB1cHBlciBib3VuZDsgInN0ZXAiIGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzICJOb25lIiBpZlxuICAgICAgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG5cbiAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBzbGljZS5pbmRpY2VzKHNlbGYsIGxlbmd0aClcblxuICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbiAgICAgICAgIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzbGljZSB0aGF0IHRoZSBzbGljZSBvYmplY3RcbiAgICAgICAgIHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiBpdGVtcy5cbiAgICAgICAgIEl0IHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZVxuICAgICAgICAgdGhlICpzdGFydCogYW5kICpzdG9wKiBpbmRpY2VzIGFuZCB0aGUgKnN0ZXAqIG9yIHN0cmlkZVxuICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzbGljZS4gTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlXG4gICAgICAgICBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcy5cblxuICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4gICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZFxuICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbiAgICAgIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljXG4gICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlXG4gICAgICBvYmplY3QgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHdyYXBwZWQgb2JqZWN0LCB3aGljaCBpcyBub3RcbiAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmVcbiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseVxuICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic3RhdGljbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuXG4gICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlclxuICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3RcbiAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZlxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsXG4gICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZFxuICAgICAgYnkgdGhlIGJ1aWx0LWluICJjbGFzc21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cbicsCiAgJ3R5cGVzZnVuY3Rpb25zJzogdSdcbkZ1bmN0aW9uc1xuKioqKioqKioqXG5cbkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seVxub3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICJmdW5jKGFyZ3VtZW50LWxpc3QpIi5cblxuVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiBmdW5jdGlvbnNcbmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbFxudGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZVxuZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cblxuU2VlICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAotICd0eXBlc21hcHBpbmcnOiB1J1xuTWFwcGluZyBUeXBlcyAtLS0gImRpY3QiXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqbWFwcGluZyogb2JqZWN0IG1hcHMgKmhhc2hhYmxlKiB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuXG5NYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkXG5tYXBwaW5nIHR5cGUsIHRoZSAqZGljdGlvbmFyeSouICAoRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdC1cbmluICJsaXN0IiwgInNldCIsIGFuZCAidHVwbGUiIGNsYXNzZXMsIGFuZCB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuKVxuXG5BIGRpY3Rpb25hcnlcJ3Mga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyB0aGF0IGFyZVxubm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCBkaWN0aW9uYXJpZXMgb3Jcbm90aGVyIG11dGFibGUgdHlwZXMgKHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXlcbnRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbFxuKHN1Y2ggYXMgIjEiIGFuZCAiMS4wIikgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleFxudGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgY29tcHV0ZXJzIHN0b3JlXG5mbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgdW53aXNlIHRvIHVzZVxudGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuXG5EaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mICJrZXk6XG52YWx1ZSIgcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6ICJ7XCdqYWNrXCc6IDQwOTgsIFwnc2pvZXJkXCc6XG40MTI3fSIgb3IgIns0MDk4OiBcJ2phY2tcJywgNDEyNzogXCdzam9lcmRcJ30iLCBvciBieSB0aGUgImRpY3QiXG5jb25zdHJ1Y3Rvci5cblxuY2xhc3MgY2xhc3MgZGljdCgqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChtYXBwaW5nLCAqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChpdGVyYWJsZSwgKiprd2FyZylcblxuICAgUmV0dXJuIGEgbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhbiBvcHRpb25hbCBwb3NpdGlvbmFsXG4gICBhcmd1bWVudCBhbmQgYSBwb3NzaWJseSBlbXB0eSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMuXG5cbiAgIElmIG5vIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4sIGFuIGVtcHR5IGRpY3Rpb25hcnkgaXMgY3JlYXRlZC5cbiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYVxuICAgZGljdGlvbmFyeSBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlIHBhaXJzIGFzIHRoZSBtYXBwaW5nXG4gICBvYmplY3QuICBPdGhlcndpc2UsIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gKml0ZXJhYmxlKlxuICAgb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoXG4gICBleGFjdGx5IHR3byBvYmplY3RzLiAgVGhlIGZpcnN0IG9iamVjdCBvZiBlYWNoIGl0ZW0gYmVjb21lcyBhIGtleVxuICAgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LCBhbmQgdGhlIHNlY29uZCBvYmplY3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAgIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXlcbiAgIGJlY29tZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LlxuXG4gICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXJcbiAgIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgY3JlYXRlZCBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC4gIElmIGEga2V5IGJlaW5nIGFkZGVkIGlzIGFscmVhZHkgcHJlc2VudCwgdGhlIHZhbHVlIGZyb21cbiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC5cblxuICAgVG8gaWxsdXN0cmF0ZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbFxuICAgdG8gInsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9IjpcblxuICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MylcbiAgICAgID4+PiBiID0ge1wnb25lXCc6IDEsIFwndHdvXCc6IDIsIFwndGhyZWVcJzogM31cbiAgICAgID4+PiBjID0gZGljdCh6aXAoW1wnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJ10sIFsxLCAyLCAzXSkpXG4gICAgICA+Pj4gZCA9IGRpY3QoWyhcJ3R3b1wnLCAyKSwgKFwnb25lXCcsIDEpLCAoXCd0aHJlZVwnLCAzKV0pXG4gICAgICA+Pj4gZSA9IGRpY3Qoe1wndGhyZWVcJzogMywgXCdvbmVcJzogMSwgXCd0d29cJzogMn0pXG4gICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlXG4gICAgICBUcnVlXG5cbiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvclxuICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzXG4gICBjYW4gYmUgdXNlZC5cblxuICAgVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25zIHRoYXQgZGljdGlvbmFyaWVzIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUsXG4gICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOlxuXG4gICBsZW4oZClcblxuICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRpY3Rpb25hcnkgKmQqLlxuXG4gICBkW2tleV1cblxuICAgICAgUmV0dXJuIHRoZSBpdGVtIG9mICpkKiB3aXRoIGtleSAqa2V5Ki4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWZcbiAgICAgICprZXkqIGlzIG5vdCBpbiB0aGUgbWFwLlxuXG4gICAgICBJZiBhIHN1YmNsYXNzIG9mIGRpY3QgZGVmaW5lcyBhIG1ldGhvZCAiX19taXNzaW5nX18oKSIgYW5kICprZXkqXG4gICAgICBpcyBub3QgcHJlc2VudCwgdGhlICJkW2tleV0iIG9wZXJhdGlvbiBjYWxscyB0aGF0IG1ldGhvZCB3aXRoXG4gICAgICB0aGUga2V5ICprZXkqIGFzIGFyZ3VtZW50LiAgVGhlICJkW2tleV0iIG9wZXJhdGlvbiB0aGVuIHJldHVybnNcbiAgICAgIG9yIHJhaXNlcyB3aGF0ZXZlciBpcyByZXR1cm5lZCBvciByYWlzZWQgYnkgdGhlXG4gICAgICAiX19taXNzaW5nX18oa2V5KSIgY2FsbC4gTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZVxuICAgICAgIl9fbWlzc2luZ19fKCkiLiBJZiAiX19taXNzaW5nX18oKSIgaXMgbm90IGRlZmluZWQsICJLZXlFcnJvciJcbiAgICAgIGlzIHJhaXNlZC4gIl9fbWlzc2luZ19fKCkiIG11c3QgYmUgYSBtZXRob2Q7IGl0IGNhbm5vdCBiZSBhblxuICAgICAgaW5zdGFuY2UgdmFyaWFibGU6XG5cbiAgICAgICAgID4+PiBjbGFzcyBDb3VudGVyKGRpY3QpOlxuICAgICAgICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbiAgICAgICAgIC4uLiAgICAgICAgIHJldHVybiAwXG4gICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKVxuICAgICAgICAgPj4+IGNbXCdyZWRcJ11cbiAgICAgICAgIDBcbiAgICAgICAgID4+PiBjW1wncmVkXCddICs9IDFcbiAgICAgICAgID4+PiBjW1wncmVkXCddXG4gICAgICAgICAxXG5cbiAgICAgIFRoZSBleGFtcGxlIGFib3ZlIHNob3dzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICAiY29sbGVjdGlvbnMuQ291bnRlciIuICBBIGRpZmZlcmVudCAiX19taXNzaW5nX18iIG1ldGhvZCBpcyB1c2VkXG4gICAgICBieSAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLlxuXG4gICBkW2tleV0gPSB2YWx1ZVxuXG4gICAgICBTZXQgImRba2V5XSIgdG8gKnZhbHVlKi5cblxuICAgZGVsIGRba2V5XVxuXG4gICAgICBSZW1vdmUgImRba2V5XSIgZnJvbSAqZCouICBSYWlzZXMgYSAiS2V5RXJyb3IiIGlmICprZXkqIGlzIG5vdFxuICAgICAgaW4gdGhlIG1hcC5cblxuICAga2V5IGluIGRcblxuICAgICAgUmV0dXJuICJUcnVlIiBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlICJGYWxzZSIuXG5cbiAgIGtleSBub3QgaW4gZFxuXG4gICAgICBFcXVpdmFsZW50IHRvICJub3Qga2V5IGluIGQiLlxuXG4gICBpdGVyKGQpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBhXG4gICAgICBzaG9ydGN1dCBmb3IgIml0ZXIoZC5rZXlzKCkpIi5cblxuICAgY2xlYXIoKVxuXG4gICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNvcHkoKVxuXG4gICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNsYXNzbWV0aG9kIGZyb21rZXlzKHNlcVssIHZhbHVlXSlcblxuICAgICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gKnNlcSogYW5kIHZhbHVlcyBzZXQgdG9cbiAgICAgICp2YWx1ZSouXG5cbiAgICAgICJmcm9ta2V5cygpIiBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS5cbiAgICAgICp2YWx1ZSogZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICBnZXQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlXG4gICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvICJOb25lIiwgc29cbiAgICAgIHRoYXQgdGhpcyBtZXRob2QgbmV2ZXIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBpdGVtcyAoIihrZXksIHZhbHVlKSJcbiAgICAgIHBhaXJzKS4gU2VlIHRoZSAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBrZXlzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIHBvcChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIHBvcGl0ZW0oKVxuXG4gICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgIihrZXksIHZhbHVlKSIgcGFpciBmcm9tIHRoZVxuICAgICAgZGljdGlvbmFyeS5cblxuICAgICAgInBvcGl0ZW0oKSIgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbiAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydFxuICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICpkZWZhdWx0KlxuICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICB1cGRhdGUoW290aGVyXSlcblxuICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICpvdGhlciosXG4gICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuICJOb25lIi5cblxuICAgICAgInVwZGF0ZSgpIiBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuXG4gICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciBpdGVyYWJsZXMgb2ZcbiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogImQudXBkYXRlKHJlZD0xLFxuICAgICAgYmx1ZT0yKSIuXG5cbiAgIHZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIERpY3Rpb25hcmllcyBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSAiKGtleSxcbiAgIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zIChcJzxcJywgXCc8PVwnLCBcJz49XCcsIFwnPlwnKSByYWlzZVxuICAgIlR5cGVFcnJvciIuXG5cblNlZSBhbHNvOiAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVhZC1vbmx5XG4gIHZpZXcgb2YgYSAiZGljdCIuXG5cblxuRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvYmplY3RzIHJldHVybmVkIGJ5ICJkaWN0LmtleXMoKSIsICJkaWN0LnZhbHVlcygpIiBhbmRcbiJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgdmlldyBvbiB0aGVcbmRpY3Rpb25hcnlcJ3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5IGNoYW5nZXMsXG50aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuXG5EaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSxcbmFuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG5cbmxlbihkaWN0dmlldylcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cblxuaXRlcihkaWN0dmlldylcblxuICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXNcbiAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXNcbiAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb25cbiAgIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBJZiBrZXlzLFxuICAgdmFsdWVzIGFuZCBpdGVtcyB2aWV3cyBhcmUgaXRlcmF0ZWQgb3ZlciB3aXRoIG5vIGludGVydmVuaW5nXG4gICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseVxuICAgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiAiKHZhbHVlLCBrZXkpIiBwYWlycyB1c2luZ1xuICAgInppcCgpIjogInBhaXJzID0gemlwKGQudmFsdWVzKCksIGQua2V5cygpKSIuICBBbm90aGVyIHdheSB0b1xuICAgY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgInBhaXJzID0gWyh2LCBrKSBmb3IgKGssIHYpIGluIGQuaXRlbXMoKV0iLlxuXG4gICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnlcbiAgIG1heSByYWlzZSBhICJSdW50aW1lRXJyb3IiIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzLlxuXG54IGluIGRpY3R2aWV3XG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgKngqIGlzIGluIHRoZSB1bmRlcmx5aW5nIGRpY3Rpb25hcnlcJ3Mga2V5cywgdmFsdWVzXG4gICBvciBpdGVtcyAoaW4gdGhlIGxhdHRlciBjYXNlLCAqeCogc2hvdWxkIGJlIGEgIihrZXksIHZhbHVlKSJcbiAgIHR1cGxlKS5cblxuS2V5cyB2aWV3cyBhcmUgc2V0LWxpa2Ugc2luY2UgdGhlaXIgZW50cmllcyBhcmUgdW5pcXVlIGFuZCBoYXNoYWJsZS5cbklmIGFsbCB2YWx1ZXMgYXJlIGhhc2hhYmxlLCBzbyB0aGF0ICIoa2V5LCB2YWx1ZSkiIHBhaXJzIGFyZSB1bmlxdWVcbmFuZCBoYXNoYWJsZSwgdGhlbiB0aGUgaXRlbXMgdmlldyBpcyBhbHNvIHNldC1saWtlLiAgKFZhbHVlcyB2aWV3cyBhcmVcbm5vdCB0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pXG5Gb3Igc2V0LWxpa2Ugdmlld3MsIGFsbCBvZiB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciB0aGUgYWJzdHJhY3RcbmJhc2UgY2xhc3MgImNvbGxlY3Rpb25zLmFiYy5TZXQiIGFyZSBhdmFpbGFibGUgKGZvciBleGFtcGxlLCAiPT0iLFxuIjwiLCBvciAiXiIpLlxuXG5BbiBleGFtcGxlIG9mIGRpY3Rpb25hcnkgdmlldyB1c2FnZTpcblxuICAgPj4+IGRpc2hlcyA9IHtcJ2VnZ3NcJzogMiwgXCdzYXVzYWdlXCc6IDEsIFwnYmFjb25cJzogMSwgXCdzcGFtXCc6IDUwMH1cbiAgID4+PiBrZXlzID0gZGlzaGVzLmtleXMoKVxuICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52YWx1ZXMoKVxuXG4gICA+Pj4gIyBpdGVyYXRpb25cbiAgID4+PiBuID0gMFxuICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuICAgLi4uICAgICBuICs9IHZhbFxuICAgPj4+IHByaW50KG4pXG4gICA1MDRcblxuICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lIG9yZGVyXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2F1c2FnZVwnLCBcJ3NwYW1cJ11cbiAgID4+PiBsaXN0KHZhbHVlcylcbiAgIFsyLCAxLCAxLCA1MDBdXG5cbiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbiAgID4+PiBkZWwgZGlzaGVzW1wnZWdnc1wnXVxuICAgPj4+IGRlbCBkaXNoZXNbXCdzYXVzYWdlXCddXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnc3BhbVwnLCBcJ2JhY29uXCddXG5cbiAgID4+PiAjIHNldCBvcGVyYXRpb25zXG4gICA+Pj4ga2V5cyAmIHtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhbGFkXCd9XG4gICB7XCdiYWNvblwnfVxuICAgPj4+IGtleXMgXiB7XCdzYXVzYWdlXCcsIFwnanVpY2VcJ31cbiAgIHtcJ2p1aWNlXCcsIFwnc2F1c2FnZVwnLCBcJ2JhY29uXCcsIFwnc3BhbVwnfVxuJywKKyAndHlwZXNtYXBwaW5nJzogdSdcbk1hcHBpbmcgVHlwZXMgLS0tICJkaWN0IlxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkEgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSBvYmplY3RzLlxuTWFwcGluZ3MgYXJlIG11dGFibGUgb2JqZWN0cy4gIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSBzdGFuZGFyZFxubWFwcGluZyB0eXBlLCB0aGUgKmRpY3Rpb25hcnkqLiAgKEZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQtXG5pbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLilcblxuQSBkaWN0aW9uYXJ5XCdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmVcbm5vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgZGljdGlvbmFyaWVzIG9yXG5vdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5XG50aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWxcbihzdWNoIGFzICIxIiBhbmQgIjEuMCIpIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXhcbnRoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuICAoTm90ZSBob3dldmVyLCB0aGF0IHNpbmNlIGNvbXB1dGVycyBzdG9yZVxuZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcyBhcHByb3hpbWF0aW9ucyBpdCBpcyB1c3VhbGx5IHVud2lzZSB0byB1c2VcbnRoZW0gYXMgZGljdGlvbmFyeSBrZXlzLilcblxuRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAia2V5OlxudmFsdWUiIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiAie1wnamFja1wnOiA0MDk4LCBcJ3Nqb2VyZFwnOlxuNDEyN30iIG9yICJ7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9Iiwgb3IgYnkgdGhlICJkaWN0IlxuY29uc3RydWN0b3IuXG5cbmNsYXNzIGNsYXNzIGRpY3QoKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG5cbiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbFxuICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuXG4gICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuXG4gICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyBvYmplY3QsIGFcbiAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyB0aGUgbWFwcGluZ1xuICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYWJsZSpcbiAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gaXRlcmFibGUgd2l0aFxuICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtIGJlY29tZXMgYSBrZXlcbiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nXG4gICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgZm9yIHRoYXQga2V5XG4gICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cblxuICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZWlyXG4gICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tXG4gICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuXG5cbiAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhIGRpY3Rpb25hcnkgZXF1YWxcbiAgIHRvICJ7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfSI6XG5cbiAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpXG4gICAgICA+Pj4gYiA9IHtcJ29uZVwnOiAxLCBcJ3R3b1wnOiAyLCBcJ3RocmVlXCc6IDN9XG4gICAgICA+Pj4gYyA9IGRpY3QoemlwKFtcJ29uZVwnLCBcJ3R3b1wnLCBcJ3RocmVlXCddLCBbMSwgMiwgM10pKVxuICAgICAgPj4+IGQgPSBkaWN0KFsoXCd0d29cJywgMiksIChcJ29uZVwnLCAxKSwgKFwndGhyZWVcJywgMyldKVxuICAgICAgPj4+IGUgPSBkaWN0KHtcJ3RocmVlXCc6IDMsIFwnb25lXCc6IDEsIFwndHdvXCc6IDJ9KVxuICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZVxuICAgICAgVHJ1ZVxuXG4gICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3JcbiAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgdmFsaWQga2V5c1xuICAgY2FuIGJlIHVzZWQuXG5cbiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLFxuICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcblxuICAgbGVuKGQpXG5cbiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cblxuICAgZFtrZXldXG5cbiAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSAiS2V5RXJyb3IiIGlmXG4gICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC5cblxuICAgICAgSWYgYSBzdWJjbGFzcyBvZiBkaWN0IGRlZmluZXMgYSBtZXRob2QgIl9fbWlzc2luZ19fKCkiIGFuZCAqa2V5KlxuICAgICAgaXMgbm90IHByZXNlbnQsIHRoZSAiZFtrZXldIiBvcGVyYXRpb24gY2FsbHMgdGhhdCBtZXRob2Qgd2l0aFxuICAgICAgdGhlIGtleSAqa2V5KiBhcyBhcmd1bWVudC4gIFRoZSAiZFtrZXldIiBvcGVyYXRpb24gdGhlbiByZXR1cm5zXG4gICAgICBvciByYWlzZXMgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZVxuICAgICAgIl9fbWlzc2luZ19fKGtleSkiIGNhbGwuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgbWV0aG9kcyBpbnZva2VcbiAgICAgICJfX21pc3NpbmdfXygpIi4gSWYgIl9fbWlzc2luZ19fKCkiIGlzIG5vdCBkZWZpbmVkLCAiS2V5RXJyb3IiXG4gICAgICBpcyByYWlzZWQuICJfX21pc3NpbmdfXygpIiBtdXN0IGJlIGEgbWV0aG9kOyBpdCBjYW5ub3QgYmUgYW5cbiAgICAgIGluc3RhbmNlIHZhcmlhYmxlOlxuXG4gICAgICAgICA+Pj4gY2xhc3MgQ291bnRlcihkaWN0KTpcbiAgICAgICAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4gICAgICAgICAuLi4gICAgICAgICByZXR1cm4gMFxuICAgICAgICAgPj4+IGMgPSBDb3VudGVyKClcbiAgICAgICAgID4+PiBjW1wncmVkXCddXG4gICAgICAgICAwXG4gICAgICAgICA+Pj4gY1tcJ3JlZFwnXSArPSAxXG4gICAgICAgICA+Pj4gY1tcJ3JlZFwnXVxuICAgICAgICAgMVxuXG4gICAgICBUaGUgZXhhbXBsZSBhYm92ZSBzaG93cyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiAgQSBkaWZmZXJlbnQgIl9fbWlzc2luZ19fIiBtZXRob2QgaXMgdXNlZFxuICAgICAgYnkgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0Ii5cblxuICAgZFtrZXldID0gdmFsdWVcblxuICAgICAgU2V0ICJkW2tleV0iIHRvICp2YWx1ZSouXG5cbiAgIGRlbCBkW2tleV1cblxuICAgICAgUmVtb3ZlICJkW2tleV0iIGZyb20gKmQqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZiAqa2V5KiBpcyBub3RcbiAgICAgIGluIHRoZSBtYXAuXG5cbiAgIGtleSBpbiBkXG5cbiAgICAgIFJldHVybiAiVHJ1ZSIgaWYgKmQqIGhhcyBhIGtleSAqa2V5KiwgZWxzZSAiRmFsc2UiLlxuXG4gICBrZXkgbm90IGluIGRcblxuICAgICAgRXF1aXZhbGVudCB0byAibm90IGtleSBpbiBkIi5cblxuICAgaXRlcihkKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gIFRoaXMgaXMgYVxuICAgICAgc2hvcnRjdXQgZm9yICJpdGVyKGQua2V5cygpKSIuXG5cbiAgIGNsZWFyKClcblxuICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBjb3B5KClcblxuICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBjbGFzc21ldGhvZCBmcm9ta2V5cyhzZXFbLCB2YWx1ZV0pXG5cbiAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCB2YWx1ZXMgc2V0IHRvXG4gICAgICAqdmFsdWUqLlxuXG4gICAgICAiZnJvbWtleXMoKSIgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3IGRpY3Rpb25hcnkuXG4gICAgICAqdmFsdWUqIGRlZmF1bHRzIHRvICJOb25lIi5cblxuICAgZ2V0KGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZVxuICAgICAgKmRlZmF1bHQqLiBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byAiTm9uZSIsIHNvXG4gICAgICB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhICJLZXlFcnJvciIuXG5cbiAgIGl0ZW1zKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgaXRlbXMgKCIoa2V5LCB2YWx1ZSkiXG4gICAgICBwYWlycykuIFNlZSB0aGUgKmRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzKi5cblxuICAga2V5cygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGtleXMuICBTZWUgdGhlXG4gICAgICAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBwb3Aoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZW1vdmUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICBlbHNlIHJldHVybiAqZGVmYXVsdCouICBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuIGFuZCAqa2V5KiBpc1xuICAgICAgbm90IGluIHRoZSBkaWN0aW9uYXJ5LCBhICJLZXlFcnJvciIgaXMgcmFpc2VkLlxuXG4gICBwb3BpdGVtKClcblxuICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5ICIoa2V5LCB2YWx1ZSkiIHBhaXIgZnJvbSB0aGVcbiAgICAgIGRpY3Rpb25hcnkuXG5cbiAgICAgICJwb3BpdGVtKCkiIGlzIHVzZWZ1bCB0byBkZXN0cnVjdGl2ZWx5IGl0ZXJhdGUgb3ZlciBhXG4gICAgICBkaWN0aW9uYXJ5LCBhcyBvZnRlbiB1c2VkIGluIHNldCBhbGdvcml0aG1zLiAgSWYgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIGVtcHR5LCBjYWxsaW5nICJwb3BpdGVtKCkiIHJhaXNlcyBhICJLZXlFcnJvciIuXG5cbiAgIHNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIHZhbHVlLiAgSWYgbm90LCBpbnNlcnRcbiAgICAgICprZXkqIHdpdGggYSB2YWx1ZSBvZiAqZGVmYXVsdCogYW5kIHJldHVybiAqZGVmYXVsdCouICAqZGVmYXVsdCpcbiAgICAgIGRlZmF1bHRzIHRvICJOb25lIi5cblxuICAgdXBkYXRlKFtvdGhlcl0pXG5cbiAgICAgIFVwZGF0ZSB0aGUgZGljdGlvbmFyeSB3aXRoIHRoZSBrZXkvdmFsdWUgcGFpcnMgZnJvbSAqb3RoZXIqLFxuICAgICAgb3ZlcndyaXRpbmcgZXhpc3Rpbmcga2V5cy4gIFJldHVybiAiTm9uZSIuXG5cbiAgICAgICJ1cGRhdGUoKSIgYWNjZXB0cyBlaXRoZXIgYW5vdGhlciBkaWN0aW9uYXJ5IG9iamVjdCBvciBhblxuICAgICAgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzIChhcyB0dXBsZXMgb3Igb3RoZXIgaXRlcmFibGVzIG9mXG4gICAgICBsZW5ndGggdHdvKS4gIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyB0aGVuIHVwZGF0ZWQgd2l0aCB0aG9zZSBrZXkvdmFsdWUgcGFpcnM6ICJkLnVwZGF0ZShyZWQ9MSxcbiAgICAgIGJsdWU9MikiLlxuXG4gICB2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyB2YWx1ZXMuICBTZWUgdGhlXG4gICAgICAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG5TZWUgYWxzbzogInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIHJlYWQtb25seVxuICB2aWV3IG9mIGEgImRpY3QiLlxuXG5cbkRpY3Rpb25hcnkgdmlldyBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSAiZGljdC5rZXlzKCkiLCAiZGljdC52YWx1ZXMoKSIgYW5kXG4iZGljdC5pdGVtcygpIiBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljIHZpZXcgb24gdGhlXG5kaWN0aW9uYXJ5XCdzIGVudHJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiB0aGUgZGljdGlvbmFyeSBjaGFuZ2VzLFxudGhlIHZpZXcgcmVmbGVjdHMgdGhlc2UgY2hhbmdlcy5cblxuRGljdGlvbmFyeSB2aWV3cyBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB0byB5aWVsZCB0aGVpciByZXNwZWN0aXZlIGRhdGEsXG5hbmQgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzOlxuXG5sZW4oZGljdHZpZXcpXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbml0ZXIoZGljdHZpZXcpXG5cbiAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgKHJlcHJlc2VudGVkIGFzXG4gICB0dXBsZXMgb2YgIihrZXksIHZhbHVlKSIpIGluIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBLZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzXG4gICBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uXG4gICB0aGUgZGljdGlvbmFyeVwncyBoaXN0b3J5IG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gSWYga2V5cyxcbiAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyBpbnRlcnZlbmluZ1xuICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIG9yZGVyIG9mIGl0ZW1zIHdpbGwgZGlyZWN0bHlcbiAgIGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgIih2YWx1ZSwga2V5KSIgcGFpcnMgdXNpbmdcbiAgICJ6aXAoKSI6ICJwYWlycyA9IHppcChkLnZhbHVlcygpLCBkLmtleXMoKSkiLiAgQW5vdGhlciB3YXkgdG9cbiAgIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzICJwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbiBkLml0ZW1zKCldIi5cblxuICAgSXRlcmF0aW5nIHZpZXdzIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5XG4gICBtYXkgcmFpc2UgYSAiUnVudGltZUVycm9yIiBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcy5cblxueCBpbiBkaWN0dmlld1xuXG4gICBSZXR1cm4gIlRydWUiIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzIGtleXMsIHZhbHVlc1xuICAgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhICIoa2V5LCB2YWx1ZSkiXG4gICB0dXBsZSkuXG5cbktleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgaGFzaGFibGUuXG5JZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAiKGtleSwgdmFsdWUpIiBwYWlycyBhcmUgdW5pcXVlXG5hbmQgaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlXG5ub3QgdHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCB1bmlxdWUuKVxuRm9yIHNldC1saWtlIHZpZXdzLCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBmb3IgdGhlIGFic3RyYWN0XG5iYXNlIGNsYXNzICJjb2xsZWN0aW9ucy5hYmMuU2V0IiBhcmUgYXZhaWxhYmxlIChmb3IgZXhhbXBsZSwgIj09IixcbiI8Iiwgb3IgIl4iKS5cblxuQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG5cbiAgID4+PiBkaXNoZXMgPSB7XCdlZ2dzXCc6IDIsIFwnc2F1c2FnZVwnOiAxLCBcJ2JhY29uXCc6IDEsIFwnc3BhbVwnOiA1MDB9XG4gICA+Pj4ga2V5cyA9IGRpc2hlcy5rZXlzKClcbiAgID4+PiB2YWx1ZXMgPSBkaXNoZXMudmFsdWVzKClcblxuICAgPj4+ICMgaXRlcmF0aW9uXG4gICA+Pj4gbiA9IDBcbiAgID4+PiBmb3IgdmFsIGluIHZhbHVlczpcbiAgIC4uLiAgICAgbiArPSB2YWxcbiAgID4+PiBwcmludChuKVxuICAgNTA0XG5cbiAgID4+PiAjIGtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgc2FtZSBvcmRlclxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhdXNhZ2VcJywgXCdzcGFtXCddXG4gICA+Pj4gbGlzdCh2YWx1ZXMpXG4gICBbMiwgMSwgMSwgNTAwXVxuXG4gICA+Pj4gIyB2aWV3IG9iamVjdHMgYXJlIGR5bmFtaWMgYW5kIHJlZmxlY3QgZGljdCBjaGFuZ2VzXG4gICA+Pj4gZGVsIGRpc2hlc1tcJ2VnZ3NcJ11cbiAgID4+PiBkZWwgZGlzaGVzW1wnc2F1c2FnZVwnXVxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ3NwYW1cJywgXCdiYWNvblwnXVxuXG4gICA+Pj4gIyBzZXQgb3BlcmF0aW9uc1xuICAgPj4+IGtleXMgJiB7XCdlZ2dzXCcsIFwnYmFjb25cJywgXCdzYWxhZFwnfVxuICAge1wnYmFjb25cJ31cbiAgID4+PiBrZXlzIF4ge1wnc2F1c2FnZVwnLCBcJ2p1aWNlXCd9XG4gICB7XCdqdWljZVwnLCBcJ3NhdXNhZ2VcJywgXCdiYWNvblwnLCBcJ3NwYW1cJ31cbicsCiAgJ3R5cGVzbWV0aG9kcyc6IHUnXG5NZXRob2RzXG4qKioqKioqXG5cbk1ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbi5cblRoZXJlIGFyZSB0d28gZmxhdm9yczogYnVpbHQtaW4gbWV0aG9kcyAoc3VjaCBhcyAiYXBwZW5kKCkiIG9uIGxpc3RzKVxuYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWQgd2l0aCB0aGVcbnR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuXG5JZiB5b3UgYWNjZXNzIGEgbWV0aG9kIChhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBjbGFzcyBuYW1lc3BhY2UpXG50aHJvdWdoIGFuIGluc3RhbmNlLCB5b3UgZ2V0IGEgc3BlY2lhbCBvYmplY3Q6IGEgKmJvdW5kIG1ldGhvZCogKGFsc29cbmNhbGxlZCAqaW5zdGFuY2UgbWV0aG9kKikgb2JqZWN0LiBXaGVuIGNhbGxlZCwgaXQgd2lsbCBhZGQgdGhlICJzZWxmIlxuYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBCb3VuZCBtZXRob2RzIGhhdmUgdHdvIHNwZWNpYWwgcmVhZC1cbm9ubHkgYXR0cmlidXRlczogIm0uX19zZWxmX18iIGlzIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGhvZFxub3BlcmF0ZXMsIGFuZCAibS5fX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgbWV0aG9kLlxuQ2FsbGluZyAibShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIiBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG9cbmNhbGxpbmcgIm0uX19mdW5jX18obS5fX3NlbGZfXywgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIuXG5cbkxpa2UgZnVuY3Rpb24gb2JqZWN0cywgYm91bmQgbWV0aG9kIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeVxuYXR0cmlidXRlcy4gIEhvd2V2ZXIsIHNpbmNlIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBhY3R1YWxseSBzdG9yZWQgb25cbnRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoIm1ldGguX19mdW5jX18iKSwgc2V0dGluZyBtZXRob2RcbmF0dHJpYnV0ZXMgb24gYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byBzZXQgYW5cbmF0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluIGFuICJBdHRyaWJ1dGVFcnJvciIgYmVpbmcgcmFpc2VkLiAgSW5cbm9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IG9uIHRoZVxudW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuICAgLi4uICAgICAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMubWV0aG9kLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJyAgIyBjYW5cJ3Qgc2V0IG9uIHRoZSBtZXRob2RcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIEF0dHJpYnV0ZUVycm9yOiBcJ21ldGhvZFwnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlIFwnd2hvYW1pXCdcbiAgID4+PiBjLm1ldGhvZC5fX2Z1bmNfXy53aG9hbWkgPSBcJ215IG5hbWUgaXMgbWV0aG9kXCdcbiAgID4+PiBjLm1ldGhvZC53aG9hbWlcbiAgIFwnbXkgbmFtZSBpcyBtZXRob2RcJ1xuXG5TZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAogICd0eXBlc21vZHVsZXMnOiB1J1xuTW9kdWxlc1xuKioqKioqKlxuXG5UaGUgb25seSBzcGVjaWFsIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBpcyBhdHRyaWJ1dGUgYWNjZXNzOiAibS5uYW1lIixcbndoZXJlICptKiBpcyBhIG1vZHVsZSBhbmQgKm5hbWUqIGFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkIGluICptKlwnc1xuc3ltYm9sIHRhYmxlLiBNb2R1bGUgYXR0cmlidXRlcyBjYW4gYmUgYXNzaWduZWQgdG8uICAoTm90ZSB0aGF0IHRoZVxuImltcG9ydCIgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiBvbiBhIG1vZHVsZVxub2JqZWN0OyAiaW1wb3J0IGZvbyIgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3QgbmFtZWQgKmZvbyogdG9cbmV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbiogZm9yIGEgbW9kdWxlXG5uYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuXG5BIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyAiX19kaWN0X18iLiBUaGlzIGlzIHRoZVxuZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGVcJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpc1xuZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlXCdzIHN5bWJvbCB0YWJsZSwgYnV0IGRpcmVjdFxuYXNzaWdubWVudCB0byB0aGUgIl9fZGljdF9fIiBhdHRyaWJ1dGUgaXMgbm90IHBvc3NpYmxlICh5b3UgY2FuIHdyaXRlXG4ibS5fX2RpY3RfX1tcJ2FcJ10gPSAxIiwgd2hpY2ggZGVmaW5lcyAibS5hIiB0byBiZSAiMSIsIGJ1dCB5b3UgY2FuXCd0XG53cml0ZSAibS5fX2RpY3RfXyA9IHt9IikuICBNb2RpZnlpbmcgIl9fZGljdF9fIiBkaXJlY3RseSBpcyBub3RcbnJlY29tbWVuZGVkLlxuXG5Nb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxtb2R1bGVcblwnc3lzXCcgKGJ1aWx0LWluKT4iLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzXG4iPG1vZHVsZSBcJ29zXCcgZnJvbSBcJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWNcJz4iLlxuJywKLSAndHlwZXNzZXEnOiB1J1xuU2VxdWVuY2UgVHlwZXMgLS0tICJsaXN0IiwgInR1cGxlIiwgInJhbmdlIlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgdGhyZWUgYmFzaWMgc2VxdWVuY2UgdHlwZXM6IGxpc3RzLCB0dXBsZXMsIGFuZCByYW5nZVxub2JqZWN0cy4gQWRkaXRpb25hbCBzZXF1ZW5jZSB0eXBlcyB0YWlsb3JlZCBmb3IgcHJvY2Vzc2luZyBvZiAqYmluYXJ5XG5kYXRhKiBhbmQgKnRleHQgc3RyaW5ncyogYXJlIGRlc2NyaWJlZCBpbiBkZWRpY2F0ZWQgc2VjdGlvbnMuXG5cblxuQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIHN1cHBvcnRlZCBieSBtb3N0IHNlcXVlbmNlXG50eXBlcywgYm90aCBtdXRhYmxlIGFuZCBpbW11dGFibGUuIFRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkNcbmlzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9uc1xub24gY3VzdG9tIHNlcXVlbmNlIHR5cGVzLlxuXG5UaGlzIHRhYmxlIGxpc3RzIHRoZSBzZXF1ZW5jZSBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkuXG5JbiB0aGUgdGFibGUsICpzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwgKm4qLCAqaSosXG4qaiogYW5kICprKiBhcmUgaW50ZWdlcnMgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55XG50eXBlIGFuZCB2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyouXG5cblRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyB0aGVcbmNvbXBhcmlzb24gb3BlcmF0aW9ucy4gVGhlICIrIiAoY29uY2F0ZW5hdGlvbikgYW5kICIqIiAocmVwZXRpdGlvbilcbm9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUgY29ycmVzcG9uZGluZyBudW1lcmljXG5vcGVyYXRpb25zLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rXG58ICJ4IGluIHMiICAgICAgICAgICAgICAgICAgIHwgIlRydWUiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIkZhbHNlIiAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJ4IG5vdCBpbiBzIiAgICAgICAgICAgICAgIHwgIkZhbHNlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgfCAoMSkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIlRydWUiICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzICsgdCIgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogfCAoNikoNykgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicyAqIG4iIG9yICJuICogcyIgICAgICAgICB8IGVxdWl2YWxlbnQgdG8gYWRkaW5nICpzKiB0byAgICAgIHwgKDIpKDcpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRzZWxmICpuKiB0aW1lcyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpXSIgICAgICAgICAgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgIHwgKDMpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg0KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNSkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aXRoIHN0ZXAgKmsqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJsZW4ocykiICAgICAgICAgICAgICAgICAgIHwgbGVuZ3RoIG9mICpzKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibWluKHMpIiAgICAgICAgICAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgIm1heChzKSIgICAgICAgICAgICAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzLmluZGV4KHhbLCBpWywgal1dKSIgICAgIHwgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgfCAoOCkgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqIChhdCBvciBhZnRlciBpbmRleCAgICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICppKiBhbmQgYmVmb3JlIGluZGV4ICpqKikgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMuY291bnQoeCkiICAgICAgICAgICAgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcblxuU2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUgYWxzbyBzdXBwb3J0IGNvbXBhcmlzb25zLiAgSW4gcGFydGljdWxhcixcbnR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZ1xuY29ycmVzcG9uZGluZyBlbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5XG5lbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZVxudHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgKkNvbXBhcmlzb25zKiBpblxudGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pXG5cbk5vdGVzOlxuXG4xLiBXaGlsZSB0aGUgImluIiBhbmQgIm5vdCBpbiIgb3BlcmF0aW9ucyBhcmUgdXNlZCBvbmx5IGZvciBzaW1wbGVcbiAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCBzZXF1ZW5jZXNcbiAgIChzdWNoIGFzICJzdHIiLCAiYnl0ZXMiIGFuZCAiYnl0ZWFycmF5IikgYWxzbyB1c2UgdGhlbSBmb3JcbiAgIHN1YnNlcXVlbmNlIHRlc3Rpbmc6XG5cbiAgICAgID4+PiAiZ2ciIGluICJlZ2dzIlxuICAgICAgVHJ1ZVxuXG4yLiBWYWx1ZXMgb2YgKm4qIGxlc3MgdGhhbiAiMCIgYXJlIHRyZWF0ZWQgYXMgIjAiICh3aGljaCB5aWVsZHMgYW5cbiAgIGVtcHR5IHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnMqKS4gIE5vdGUgdGhhdCBpdGVtcyBpbiB0aGVcbiAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSB0aW1lcy5cbiAgIFRoaXMgb2Z0ZW4gaGF1bnRzIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuXG4gICAgICA+Pj4gbGlzdHMgPSBbW11dICogM1xuICAgICAgPj4+IGxpc3RzXG4gICAgICBbW10sIFtdLCBbXV1cbiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1szXSwgWzNdLCBbM11dXG5cbiAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgIltbXV0iIGlzIGEgb25lLWVsZW1lbnQgbGlzdCBjb250YWluaW5nXG4gICBhbiBlbXB0eSBsaXN0LCBzbyBhbGwgdGhyZWUgZWxlbWVudHMgb2YgIltbXV0gKiAzIiBhcmUgcmVmZXJlbmNlc1xuICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mXG4gICAibGlzdHMiIG1vZGlmaWVzIHRoaXMgc2luZ2xlIGxpc3QuIFlvdSBjYW4gY3JlYXRlIGEgbGlzdCBvZlxuICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuXG4gICAgICA+Pj4gbGlzdHMgPSBbW10gZm9yIGkgaW4gcmFuZ2UoMyldXG4gICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4gICAgICA+Pj4gbGlzdHNbMl0uYXBwZW5kKDcpXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbM10sIFs1XSwgWzddXVxuXG4gICBGdXJ0aGVyIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRkFRIGVudHJ5ICpIb3cgZG8gSSBjcmVhdGVcbiAgIGEgbXVsdGlkaW1lbnNpb25hbCBsaXN0PyouXG5cbjMuIElmICppKiBvciAqaiogaXMgbmVnYXRpdmUsIHRoZSBpbmRleCBpcyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mXG4gICB0aGUgc3RyaW5nOiAibGVuKHMpICsgaSIgb3IgImxlbihzKSArIGoiIGlzIHN1YnN0aXR1dGVkLiAgQnV0IG5vdGVcbiAgIHRoYXQgIi0wIiBpcyBzdGlsbCAiMCIuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgImkgPD0gayA8IGoiLiAgSWYgKmkqIG9yICpqKiBpc1xuICAgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMgb21pdHRlZCBvciAiTm9uZSIsXG4gICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXNcbiAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAqaiosIHRoZSBzbGljZSBpcyBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiA8XG4gICAoai1pKS9rIi4gIEluIG90aGVyIHdvcmRzLCB0aGUgaW5kaWNlcyBhcmUgImkiLCAiaStrIiwgImkrMiprIixcbiAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXJcbiAgIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZVxuICAgImxlbihzKSIuICBJZiAqaSogb3IgKmoqIGFyZSBvbWl0dGVkIG9yICJOb25lIiwgdGhleSBiZWNvbWUgImVuZCJcbiAgIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKiBjYW5ub3QgYmVcbiAgIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0IGlzIHRyZWF0ZWQgbGlrZSAiMSIuXG5cbjYuIENvbmNhdGVuYXRpbmcgaW1tdXRhYmxlIHNlcXVlbmNlcyBhbHdheXMgcmVzdWx0cyBpbiBhIG5ld1xuICAgb2JqZWN0LiBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZFxuICAgY29uY2F0ZW5hdGlvbiB3aWxsIGhhdmUgYSBxdWFkcmF0aWMgcnVudGltZSBjb3N0IGluIHRoZSB0b3RhbFxuICAgc2VxdWVuY2UgbGVuZ3RoLiBUbyBnZXQgYSBsaW5lYXIgcnVudGltZSBjb3N0LCB5b3UgbXVzdCBzd2l0Y2ggdG9cbiAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGJlbG93OlxuXG4gICAqIGlmIGNvbmNhdGVuYXRpbmcgInN0ciIgb2JqZWN0cywgeW91IGNhbiBidWlsZCBhIGxpc3QgYW5kIHVzZVxuICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGFuICJpby5TdHJpbmdJTyJcbiAgICAgaW5zdGFuY2UgYW5kIHJldHJpZXZlIGl0cyB2YWx1ZSB3aGVuIGNvbXBsZXRlXG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAiYnl0ZXMiIG9iamVjdHMsIHlvdSBjYW4gc2ltaWxhcmx5IHVzZVxuICAgICAiYnl0ZXMuam9pbigpIiBvciAiaW8uQnl0ZXNJTyIsIG9yIHlvdSBjYW4gZG8gaW4tcGxhY2VcbiAgICAgY29uY2F0ZW5hdGlvbiB3aXRoIGEgImJ5dGVhcnJheSIgb2JqZWN0LiAgImJ5dGVhcnJheSIgb2JqZWN0cyBhcmVcbiAgICAgbXV0YWJsZSBhbmQgaGF2ZSBhbiBlZmZpY2llbnQgb3ZlcmFsbG9jYXRpb24gbWVjaGFuaXNtXG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAidHVwbGUiIG9iamVjdHMsIGV4dGVuZCBhICJsaXN0IiBpbnN0ZWFkXG5cbiAgICogZm9yIG90aGVyIHR5cGVzLCBpbnZlc3RpZ2F0ZSB0aGUgcmVsZXZhbnQgY2xhc3MgZG9jdW1lbnRhdGlvblxuXG43LiBTb21lIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzICJyYW5nZSIpIG9ubHkgc3VwcG9ydCBpdGVtXG4gICBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgc3BlY2lmaWMgcGF0dGVybnMsIGFuZCBoZW5jZSBkb25cJ3Qgc3VwcG9ydFxuICAgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLlxuXG44LiAiaW5kZXgiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlblxuICAgc3VwcG9ydGVkLCB0aGUgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gdGhlIGluZGV4IG1ldGhvZCBhbGxvd1xuICAgZWZmaWNpZW50IHNlYXJjaGluZyBvZiBzdWJzZWN0aW9ucyBvZiB0aGUgc2VxdWVuY2UuIFBhc3NpbmcgdGhlXG4gICBleHRyYSBhcmd1bWVudHMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHVzaW5nICJzW2k6al0uaW5kZXgoeCkiLFxuICAgb25seSB3aXRob3V0IGNvcHlpbmcgYW55IGRhdGEgYW5kIHdpdGggdGhlIHJldHVybmVkIGluZGV4IGJlaW5nXG4gICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGVcbiAgIHNsaWNlLlxuXG5cbkltbXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBnZW5lcmFsbHkgaW1wbGVtZW50XG50aGF0IGlzIG5vdCBhbHNvIGltcGxlbWVudGVkIGJ5IG11dGFibGUgc2VxdWVuY2UgdHlwZXMgaXMgc3VwcG9ydCBmb3JcbnRoZSAiaGFzaCgpIiBidWlsdC1pbi5cblxuVGhpcyBzdXBwb3J0IGFsbG93cyBpbW11dGFibGUgc2VxdWVuY2VzLCBzdWNoIGFzICJ0dXBsZSIgaW5zdGFuY2VzLCB0b1xuYmUgdXNlZCBhcyAiZGljdCIga2V5cyBhbmQgc3RvcmVkIGluICJzZXQiIGFuZCAiZnJvemVuc2V0IiBpbnN0YW5jZXMuXG5cbkF0dGVtcHRpbmcgdG8gaGFzaCBhbiBpbW11dGFibGUgc2VxdWVuY2UgdGhhdCBjb250YWlucyB1bmhhc2hhYmxlXG52YWx1ZXMgd2lsbCByZXN1bHQgaW4gIlR5cGVFcnJvciIuXG5cblxuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuPT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlXG5pdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZVxudHlwZXMuXG5cbkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnlcbml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmRcbnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHlcbmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gW10iICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTpqOmtdIiBmcm9tIHRoZSBsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9IFt4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAiZGVsIHNbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY29weSgpIiAgICAgICAgICAgICAgICAgICAgIHwgY3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAic1s6XSIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicyAqPSBuIiAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGVzICpzKiB3aXRoIGl0cyBjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCB0aGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTppXSA9IFt4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnBvcChbaV0pIiAgICAgICAgICAgICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gKnMqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0geCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLlxuXG4yLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLlxuXG40LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2Vyc1xuICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSByZXZlcnNlZFxuICAgc2VxdWVuY2UuXG5cbjUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZVxuICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nXG4gICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuXG42LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbiAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSBzZXF1ZW5jZS5cbiAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZVxuICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciAqQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnMqLlxuXG5cbkxpc3RzXG49PT09PVxuXG5MaXN0cyBhcmUgbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mXG5ob21vZ2VuZW91cyBpdGVtcyAod2hlcmUgdGhlIHByZWNpc2UgZGVncmVlIG9mIHNpbWlsYXJpdHkgd2lsbCB2YXJ5IGJ5XG5hcHBsaWNhdGlvbikuXG5cbmNsYXNzIGNsYXNzIGxpc3QoW2l0ZXJhYmxlXSlcblxuICAgTGlzdHMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIHNldmVyYWwgd2F5czpcblxuICAgKiBVc2luZyBhIHBhaXIgb2Ygc3F1YXJlIGJyYWNrZXRzIHRvIGRlbm90ZSB0aGUgZW1wdHkgbGlzdDogIltdIlxuXG4gICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogIlthXSIsXG4gICAgICJbYSwgYiwgY10iXG5cbiAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iXG5cbiAgICogVXNpbmcgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJsaXN0KCkiIG9yICJsaXN0KGl0ZXJhYmxlKSJcblxuICAgVGhlIGNvbnN0cnVjdG9yIGJ1aWxkcyBhIGxpc3Qgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCBpbiB0aGVcbiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKlwncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciBhXG4gICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yXG4gICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmRcbiAgIHJldHVybmVkLCBzaW1pbGFyIHRvICJpdGVyYWJsZVs6XSIuIEZvciBleGFtcGxlLCAibGlzdChcJ2FiY1wnKSJcbiAgIHJldHVybnMgIltcJ2FcJywgXCdiXCcsIFwnY1wnXSIgYW5kICJsaXN0KCAoMSwgMiwgMykgKSIgcmV0dXJucyAiWzEsIDIsXG4gICAzXSIuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eVxuICAgbGlzdCwgIltdIi5cblxuICAgTWFueSBvdGhlciBvcGVyYXRpb25zIGFsc28gcHJvZHVjZSBsaXN0cywgaW5jbHVkaW5nIHRoZSAic29ydGVkKCkiXG4gICBidWlsdC1pbi5cblxuICAgTGlzdHMgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogYW5kICptdXRhYmxlKiBzZXF1ZW5jZVxuICAgb3BlcmF0aW9ucy4gTGlzdHMgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2Q6XG5cbiAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9Tm9uZSlcblxuICAgICAgVGhpcyBtZXRob2Qgc29ydHMgdGhlIGxpc3QgaW4gcGxhY2UsIHVzaW5nIG9ubHkgIjwiIGNvbXBhcmlzb25zXG4gICAgICBiZXR3ZWVuIGl0ZW1zLiBFeGNlcHRpb25zIGFyZSBub3Qgc3VwcHJlc3NlZCAtIGlmIGFueSBjb21wYXJpc29uXG4gICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgdGhlXG4gICAgICBsaXN0IHdpbGwgbGlrZWx5IGJlIGxlZnQgaW4gYSBwYXJ0aWFsbHkgbW9kaWZpZWQgc3RhdGUpLlxuXG4gICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnlcbiAgICAgIGtleXdvcmQgKCprZXl3b3JkLW9ubHkgYXJndW1lbnRzKik6XG5cbiAgICAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG9cbiAgICAgIGV4dHJhY3QgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50IChmb3IgZXhhbXBsZSxcbiAgICAgICJrZXk9c3RyLmxvd2VyIikuIFRoZSBrZXkgY29ycmVzcG9uZGluZyB0byBlYWNoIGl0ZW0gaW4gdGhlIGxpc3RcbiAgICAgIGlzIGNhbGN1bGF0ZWQgb25jZSBhbmQgdGhlbiB1c2VkIGZvciB0aGUgZW50aXJlIHNvcnRpbmcgcHJvY2Vzcy5cbiAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJOb25lIiBtZWFucyB0aGF0IGxpc3QgaXRlbXMgYXJlIHNvcnRlZFxuICAgICAgZGlyZWN0bHkgd2l0aG91dCBjYWxjdWxhdGluZyBhIHNlcGFyYXRlIGtleSB2YWx1ZS5cblxuICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byBjb252ZXJ0IGFcbiAgICAgIDIueCBzdHlsZSAqY21wKiBmdW5jdGlvbiB0byBhICprZXkqIGZ1bmN0aW9uLlxuXG4gICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgbGlzdFxuICAgICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cblxuICAgICAgVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvciBlY29ub215IG9mIHNwYWNlXG4gICAgICB3aGVuIHNvcnRpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0IG9wZXJhdGVzXG4gICAgICBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSBzb3J0ZWQgc2VxdWVuY2UgKHVzZVxuICAgICAgInNvcnRlZCgpIiB0byBleHBsaWNpdGx5IHJlcXVlc3QgYSBuZXcgc29ydGVkIGxpc3QgaW5zdGFuY2UpLlxuXG4gICAgICBUaGUgInNvcnQoKSIgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3RhYmxlLiAgQSBzb3J0IGlzXG4gICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciBvZlxuICAgICAgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWwgZm9yIHNvcnRpbmcgaW5cbiAgICAgIG11bHRpcGxlIHBhc3NlcyAoZm9yIGV4YW1wbGUsIHNvcnQgYnkgZGVwYXJ0bWVudCwgdGhlbiBieSBzYWxhcnlcbiAgICAgIGdyYWRlKS5cblxuICAgICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLFxuICAgICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpc1xuICAgICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIG1ha2VzIHRoZSBsaXN0IGFwcGVhclxuICAgICAgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyAiVmFsdWVFcnJvciIgaWYgaXQgY2FuIGRldGVjdFxuICAgICAgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuXG5cblxuVHVwbGVzXG49PT09PT1cblxuVHVwbGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZlxuaGV0ZXJvZ2VuZW91cyBkYXRhIChzdWNoIGFzIHRoZSAyLXR1cGxlcyBwcm9kdWNlZCBieSB0aGUgImVudW1lcmF0ZSgpIlxuYnVpbHQtaW4pLiBUdXBsZXMgYXJlIGFsc28gdXNlZCBmb3IgY2FzZXMgd2hlcmUgYW4gaW1tdXRhYmxlIHNlcXVlbmNlXG5vZiBob21vZ2VuZW91cyBkYXRhIGlzIG5lZWRlZCAoc3VjaCBhcyBhbGxvd2luZyBzdG9yYWdlIGluIGEgInNldCIgb3JcbiJkaWN0IiBpbnN0YW5jZSkuXG5cbmNsYXNzIGNsYXNzIHR1cGxlKFtpdGVyYWJsZV0pXG5cbiAgIFR1cGxlcyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gYSBudW1iZXIgb2Ygd2F5czpcblxuICAgKiBVc2luZyBhIHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gZGVub3RlIHRoZSBlbXB0eSB0dXBsZTogIigpIlxuXG4gICAqIFVzaW5nIGEgdHJhaWxpbmcgY29tbWEgZm9yIGEgc2luZ2xldG9uIHR1cGxlOiAiYSwiIG9yICIoYSwpIlxuXG4gICAqIFNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJhLCBiLCBjIiBvciAiKGEsIGIsIGMpIlxuXG4gICAqIFVzaW5nIHRoZSAidHVwbGUoKSIgYnVpbHQtaW46ICJ0dXBsZSgpIiBvciAidHVwbGUoaXRlcmFibGUpIlxuXG4gICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgdHVwbGUgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCBpbiB0aGVcbiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKlwncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciBhXG4gICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yXG4gICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSB0dXBsZSwgaXQgaXMgcmV0dXJuZWRcbiAgIHVuY2hhbmdlZC4gRm9yIGV4YW1wbGUsICJ0dXBsZShcJ2FiY1wnKSIgcmV0dXJucyAiKFwnYVwnLCBcJ2JcJywgXCdjXCcpIlxuICAgYW5kICJ0dXBsZSggWzEsIDIsIDNdICkiIHJldHVybnMgIigxLCAyLCAzKSIuIElmIG5vIGFyZ3VtZW50IGlzXG4gICBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkgdHVwbGUsICIoKSIuXG5cbiAgIE5vdGUgdGhhdCBpdCBpcyBhY3R1YWxseSB0aGUgY29tbWEgd2hpY2ggbWFrZXMgYSB0dXBsZSwgbm90IHRoZVxuICAgcGFyZW50aGVzZXMuIFRoZSBwYXJlbnRoZXNlcyBhcmUgb3B0aW9uYWwsIGV4Y2VwdCBpbiB0aGUgZW1wdHlcbiAgIHR1cGxlIGNhc2UsIG9yIHdoZW4gdGhleSBhcmUgbmVlZGVkIHRvIGF2b2lkIHN5bnRhY3RpYyBhbWJpZ3VpdHkuXG4gICBGb3IgZXhhbXBsZSwgImYoYSwgYiwgYykiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIHRocmVlIGFyZ3VtZW50cyxcbiAgIHdoaWxlICJmKChhLCBiLCBjKSkiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgMy10dXBsZSBhcyB0aGUgc29sZVxuICAgYXJndW1lbnQuXG5cbiAgIFR1cGxlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuXG5Gb3IgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9ucyBvZiBkYXRhIHdoZXJlIGFjY2VzcyBieSBuYW1lIGlzIGNsZWFyZXJcbnRoYW4gYWNjZXNzIGJ5IGluZGV4LCAiY29sbGVjdGlvbnMubmFtZWR0dXBsZSgpIiBtYXkgYmUgYSBtb3JlXG5hcHByb3ByaWF0ZSBjaG9pY2UgdGhhbiBhIHNpbXBsZSB0dXBsZSBvYmplY3QuXG5cblxuUmFuZ2VzXG49PT09PT1cblxuVGhlICJyYW5nZSIgdHlwZSByZXByZXNlbnRzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBudW1iZXJzIGFuZCBpc1xuY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZyBhIHNwZWNpZmljIG51bWJlciBvZiB0aW1lcyBpbiAiZm9yIiBsb29wcy5cblxuY2xhc3MgY2xhc3MgcmFuZ2Uoc3RvcClcbmNsYXNzIGNsYXNzIHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXG5cbiAgIFRoZSBhcmd1bWVudHMgdG8gdGhlIHJhbmdlIGNvbnN0cnVjdG9yIG11c3QgYmUgaW50ZWdlcnMgKGVpdGhlclxuICAgYnVpbHQtaW4gImludCIgb3IgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlICJfX2luZGV4X18iXG4gICBzcGVjaWFsIG1ldGhvZCkuICBJZiB0aGUgKnN0ZXAqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvXG4gICAiMSIuIElmIHRoZSAqc3RhcnQqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICIwIi4gSWZcbiAgICpzdGVwKiBpcyB6ZXJvLCAiVmFsdWVFcnJvciIgaXMgcmFpc2VkLlxuXG4gICBGb3IgYSBwb3NpdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiBhIHJhbmdlICJyIiBhcmUgZGV0ZXJtaW5lZFxuICAgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIgd2hlcmUgImkgPj0gMCIgYW5kICJyW2ldIDxcbiAgIHN0b3AiLlxuXG4gICBGb3IgYSBuZWdhdGl2ZSAqc3RlcCosIHRoZSBjb250ZW50cyBvZiB0aGUgcmFuZ2UgYXJlIHN0aWxsXG4gICBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtdWxhICJyW2ldID0gc3RhcnQgKyBzdGVwKmkiLCBidXQgdGhlXG4gICBjb25zdHJhaW50cyBhcmUgImkgPj0gMCIgYW5kICJyW2ldID4gc3RvcCIuXG5cbiAgIEEgcmFuZ2Ugb2JqZWN0IHdpbGwgYmUgZW1wdHkgaWYgInJbMF0iIGRvZXMgbm90IG1lZXQgdGhlIHZhbHVlXG4gICBjb25zdHJhaW50LiBSYW5nZXMgZG8gc3VwcG9ydCBuZWdhdGl2ZSBpbmRpY2VzLCBidXQgdGhlc2UgYXJlXG4gICBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIGRldGVybWluZWQgYnlcbiAgIHRoZSBwb3NpdGl2ZSBpbmRpY2VzLlxuXG4gICBSYW5nZXMgY29udGFpbmluZyBhYnNvbHV0ZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhcmVcbiAgIHBlcm1pdHRlZCBidXQgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyAibGVuKCkiKSBtYXkgcmFpc2VcbiAgICJPdmVyZmxvd0Vycm9yIi5cblxuICAgUmFuZ2UgZXhhbXBsZXM6XG5cbiAgICAgID4+PiBsaXN0KHJhbmdlKDEwKSlcbiAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMTEpKVxuICAgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMzAsIDUpKVxuICAgICAgWzAsIDUsIDEwLCAxNSwgMjAsIDI1XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMTAsIDMpKVxuICAgICAgWzAsIDMsIDYsIDldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAtMTAsIC0xKSlcbiAgICAgIFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCkpXG4gICAgICBbXVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMCkpXG4gICAgICBbXVxuXG4gICBSYW5nZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogc2VxdWVuY2Ugb3BlcmF0aW9ucyBleGNlcHRcbiAgIGNvbmNhdGVuYXRpb24gYW5kIHJlcGV0aXRpb24gKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJhbmdlIG9iamVjdHNcbiAgIGNhbiBvbmx5IHJlcHJlc2VudCBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgYSBzdHJpY3QgcGF0dGVybiBhbmRcbiAgIHJlcGV0aXRpb24gYW5kIGNvbmNhdGVuYXRpb24gd2lsbCB1c3VhbGx5IHZpb2xhdGUgdGhhdCBwYXR0ZXJuKS5cblxuVGhlIGFkdmFudGFnZSBvZiB0aGUgInJhbmdlIiB0eXBlIG92ZXIgYSByZWd1bGFyICJsaXN0IiBvciAidHVwbGUiIGlzXG50aGF0IGEgInJhbmdlIiBvYmplY3Qgd2lsbCBhbHdheXMgdGFrZSB0aGUgc2FtZSAoc21hbGwpIGFtb3VudCBvZlxubWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMgKGFzIGl0IG9ubHlcbnN0b3JlcyB0aGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgdmFsdWVzLCBjYWxjdWxhdGluZyBpbmRpdmlkdWFsXG5pdGVtcyBhbmQgc3VicmFuZ2VzIGFzIG5lZWRlZCkuXG5cblJhbmdlIG9iamVjdHMgaW1wbGVtZW50IHRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkMsIGFuZFxucHJvdmlkZSBmZWF0dXJlcyBzdWNoIGFzIGNvbnRhaW5tZW50IHRlc3RzLCBlbGVtZW50IGluZGV4IGxvb2t1cCxcbnNsaWNpbmcgYW5kIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgKHNlZSAqU2VxdWVuY2UgVHlwZXMgLS0tXG5saXN0LCB0dXBsZSwgcmFuZ2UqKTpcblxuPj4+IHIgPSByYW5nZSgwLCAyMCwgMilcbj4+PiByXG5yYW5nZSgwLCAyMCwgMilcbj4+PiAxMSBpbiByXG5GYWxzZVxuPj4+IDEwIGluIHJcblRydWVcbj4+PiByLmluZGV4KDEwKVxuNVxuPj4+IHJbNV1cbjEwXG4+Pj4gcls6NV1cbnJhbmdlKDAsIDEwLCAyKVxuPj4+IHJbLTFdXG4xOFxuXG5UZXN0aW5nIHJhbmdlIG9iamVjdHMgZm9yIGVxdWFsaXR5IHdpdGggIj09IiBhbmQgIiE9IiBjb21wYXJlcyB0aGVtIGFzXG5zZXF1ZW5jZXMuICBUaGF0IGlzLCB0d28gcmFuZ2Ugb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5XG5yZXByZXNlbnQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzLiAgKE5vdGUgdGhhdCB0d28gcmFuZ2Ugb2JqZWN0c1xudGhhdCBjb21wYXJlIGVxdWFsIG1pZ2h0IGhhdmUgZGlmZmVyZW50ICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiXG5hdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZSAicmFuZ2UoMCkgPT0gcmFuZ2UoMiwgMSwgMykiIG9yICJyYW5nZSgwLCAzLFxuMikgPT0gcmFuZ2UoMCwgNCwgMikiLilcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogSW1wbGVtZW50IHRoZSBTZXF1ZW5jZSBBQkMuIFN1cHBvcnQgc2xpY2luZ1xuYW5kIG5lZ2F0aXZlIGluZGljZXMuIFRlc3QgImludCIgb2JqZWN0cyBmb3IgbWVtYmVyc2hpcCBpbiBjb25zdGFudFxudGltZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpdGVtcy5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogRGVmaW5lIFwnPT1cJyBhbmQgXCchPVwnIHRvIGNvbXBhcmUgcmFuZ2Ugb2JqZWN0c1xuYmFzZWQgb24gdGhlIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGV5IGRlZmluZSAoaW5zdGVhZCBvZiBjb21wYXJpbmdcbmJhc2VkIG9uIG9iamVjdCBpZGVudGl0eSkuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMuXG4nLAotICd0eXBlc3NlcS1tdXRhYmxlJzogdSdcbk11dGFibGUgU2VxdWVuY2UgVHlwZXNcbioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlXG50eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gbWFrZVxuaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gc2VxdWVuY2VcbnR5cGVzLlxuXG5JbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogaXMgYW55XG5pdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55IHR5cGUgYW5kXG52YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAiYnl0ZWFycmF5IiBvbmx5XG5hY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAyNTUiKS5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCAic1tpXSA9IHgiICAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgInNbaTpqXSA9IFtdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmo6a10gPSB0IiAgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgInNbaTpqOmtdIiBhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgZW5kIG9mIHRoZSAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlIChzYW1lIGFzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSBbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNsZWFyKCkiICAgICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gInMiIChzYW1lIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCBzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgInMiICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmV4dGVuZCh0KSIgb3IgInMgKz0gdCIgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9IHQiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogdGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleCBnaXZlbiBieSAqaSogKHNhbWUgYXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSBbeF0iKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgKmkqIGFuZCAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFsc28gcmVtb3ZlcyBpdCBmcm9tICpzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZW1vdmUoeCkiICAgICAgICAgICAgICAgICAgfCByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSAqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoZXJlICJzW2ldID09IHgiICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZXZlcnNlKCkiICAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqIGluICAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIHJlcGxhY2luZy5cblxuMi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byAiLTEiLCBzbyB0aGF0IGJ5IGRlZmF1bHRcbiAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi5cblxuNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yXG4gICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgdXNlcnNcbiAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgcmV2ZXJzZWRcbiAgIHNlcXVlbmNlLlxuXG41LiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIGFyZSBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGVcbiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uXCd0IHN1cHBvcnQgc2xpY2luZ1xuICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjM6ICJjbGVhcigpIiBhbmQgImNvcHkoKSIgbWV0aG9kcy5cblxuNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4gICAiX19pbmRleF9fKCkiLiAgWmVybyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9mICpuKiBjbGVhciB0aGUgc2VxdWVuY2UuXG4gICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGVcbiAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgKkNvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zKi5cbicsCisgJ3R5cGVzc2VxJzogdSdcblNlcXVlbmNlIFR5cGVzIC0tLSAibGlzdCIsICJ0dXBsZSIsICJyYW5nZSJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIHRocmVlIGJhc2ljIHNlcXVlbmNlIHR5cGVzOiBsaXN0cywgdHVwbGVzLCBhbmQgcmFuZ2Vcbm9iamVjdHMuIEFkZGl0aW9uYWwgc2VxdWVuY2UgdHlwZXMgdGFpbG9yZWQgZm9yIHByb2Nlc3Npbmcgb2YgKmJpbmFyeVxuZGF0YSogYW5kICp0ZXh0IHN0cmluZ3MqIGFyZSBkZXNjcmliZWQgaW4gZGVkaWNhdGVkIHNlY3Rpb25zLlxuXG5cbkNvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCBzZXF1ZW5jZVxudHlwZXMsIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDXG5pcyBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnNcbm9uIGN1c3RvbSBzZXF1ZW5jZSB0eXBlcy5cblxuVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5LlxuSW4gdGhlIHRhYmxlLCAqcyogYW5kICp0KiBhcmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUsICpuKiwgKmkqLFxuKmoqIGFuZCAqayogYXJlIGludGVnZXJzIGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueVxudHlwZSBhbmQgdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqLlxuXG5UaGUgImluIiBhbmQgIm5vdCBpbiIgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXRpZXMgYXMgdGhlXG5jb21wYXJpc29uIG9wZXJhdGlvbnMuIFRoZSAiKyIgKGNvbmNhdGVuYXRpb24pIGFuZCAiKiIgKHJlcGV0aXRpb24pXG5vcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY1xub3BlcmF0aW9ucy5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xufCAieCBpbiBzIiAgICAgICAgICAgICAgICAgICB8ICJUcnVlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJGYWxzZSIgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAieCBub3QgaW4gcyIgICAgICAgICAgICAgICB8ICJGYWxzZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJUcnVlIiAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicyArIHQiICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb25jYXRlbmF0aW9uIG9mICpzKiBhbmQgKnQqIHwgKDYpKDcpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMgKiBuIiBvciAibiAqIHMiICAgICAgICAgfCAqbiogc2hhbGxvdyBjb3BpZXMgb2YgKnMqICAgICAgICB8ICgyKSg3KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbmNhdGVuYXRlZCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaV0iICAgICAgICAgICAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICB8ICgzKSAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNCkgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2l0aCBzdGVwICprKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibGVuKHMpIiAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgIm1pbihzKSIgICAgICAgICAgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJtYXgocykiICAgICAgICAgICAgICAgICAgIHwgbGFyZ2VzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicy5pbmRleCh4WywgaVssIGpdXSkiICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHwgKDgpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAoYXQgb3IgYWZ0ZXIgaW5kZXggICAgfCAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqaSogYW5kIGJlZm9yZSBpbmRleCAqaiopICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzLmNvdW50KHgpIiAgICAgICAgICAgICAgIHwgdG90YWwgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICAgfCAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG5cblNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluIHBhcnRpY3VsYXIsXG50dXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSBieSBjb21wYXJpbmdcbmNvcnJlc3BvbmRpbmcgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBldmVyeVxuZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbnR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKEZvciBmdWxsIGRldGFpbHMgc2VlICpDb21wYXJpc29ucyogaW5cbnRoZSBsYW5ndWFnZSByZWZlcmVuY2UuKVxuXG5Ob3RlczpcblxuMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3Igc2ltcGxlXG4gICBjb250YWlubWVudCB0ZXN0aW5nIGluIHRoZSBnZW5lcmFsIGNhc2UsIHNvbWUgc3BlY2lhbGlzZWQgc2VxdWVuY2VzXG4gICAoc3VjaCBhcyAic3RyIiwgImJ5dGVzIiBhbmQgImJ5dGVhcnJheSIpIGFsc28gdXNlIHRoZW0gZm9yXG4gICBzdWJzZXF1ZW5jZSB0ZXN0aW5nOlxuXG4gICAgICA+Pj4gImdnIiBpbiAiZWdncyJcbiAgICAgIFRydWVcblxuMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gIjAiIGFyZSB0cmVhdGVkIGFzICIwIiAod2hpY2ggeWllbGRzIGFuXG4gICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIGFsc28gdGhhdCB0aGUgY29waWVzXG4gICBhcmUgc2hhbGxvdzsgbmVzdGVkIHN0cnVjdHVyZXMgYXJlIG5vdCBjb3BpZWQuICBUaGlzIG9mdGVuIGhhdW50c1xuICAgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXV0gKiAzXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbXSwgW10sIFtdXVxuICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuICAgICAgPj4+IGxpc3RzXG4gICAgICBbWzNdLCBbM10sIFszXV1cblxuICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCAiW1tdXSIgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiAiW1tdXSAqIDMiIGFyZSAocG9pbnRlcnNcbiAgIHRvKSB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbiAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mXG4gICBkaWZmZXJlbnQgbGlzdHMgdGhpcyB3YXk6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV1cbiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgICAgID4+PiBsaXN0c1sxXS5hcHBlbmQoNSlcbiAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNylcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1szXSwgWzVdLCBbN11dXG5cbjMuIElmICppKiBvciAqaiogaXMgbmVnYXRpdmUsIHRoZSBpbmRleCBpcyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mXG4gICB0aGUgc3RyaW5nOiAibGVuKHMpICsgaSIgb3IgImxlbihzKSArIGoiIGlzIHN1YnN0aXR1dGVkLiAgQnV0IG5vdGVcbiAgIHRoYXQgIi0wIiBpcyBzdGlsbCAiMCIuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgImkgPD0gayA8IGoiLiAgSWYgKmkqIG9yICpqKiBpc1xuICAgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMgb21pdHRlZCBvciAiTm9uZSIsXG4gICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXNcbiAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAqaiosIHRoZSBzbGljZSBpcyBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiA8XG4gICAoai1pKS9rIi4gIEluIG90aGVyIHdvcmRzLCB0aGUgaW5kaWNlcyBhcmUgImkiLCAiaStrIiwgImkrMiprIixcbiAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXJcbiAgIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZVxuICAgImxlbihzKSIuICBJZiAqaSogb3IgKmoqIGFyZSBvbWl0dGVkIG9yICJOb25lIiwgdGhleSBiZWNvbWUgImVuZCJcbiAgIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKiBjYW5ub3QgYmVcbiAgIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0IGlzIHRyZWF0ZWQgbGlrZSAiMSIuXG5cbjYuIENvbmNhdGVuYXRpbmcgaW1tdXRhYmxlIHNlcXVlbmNlcyBhbHdheXMgcmVzdWx0cyBpbiBhIG5ld1xuICAgb2JqZWN0LiBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZFxuICAgY29uY2F0ZW5hdGlvbiB3aWxsIGhhdmUgYSBxdWFkcmF0aWMgcnVudGltZSBjb3N0IGluIHRoZSB0b3RhbFxuICAgc2VxdWVuY2UgbGVuZ3RoLiBUbyBnZXQgYSBsaW5lYXIgcnVudGltZSBjb3N0LCB5b3UgbXVzdCBzd2l0Y2ggdG9cbiAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGJlbG93OlxuXG4gICAqIGlmIGNvbmNhdGVuYXRpbmcgInN0ciIgb2JqZWN0cywgeW91IGNhbiBidWlsZCBhIGxpc3QgYW5kIHVzZVxuICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGEgImlvLlN0cmluZ0lPIiBpbnN0YW5jZVxuICAgICBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGVcblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJieXRlcyIgb2JqZWN0cywgeW91IGNhbiBzaW1pbGFybHkgdXNlXG4gICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZVxuICAgICBjb25jYXRlbmF0aW9uIHdpdGggYSAiYnl0ZWFycmF5IiBvYmplY3QuICAiYnl0ZWFycmF5IiBvYmplY3RzIGFyZVxuICAgICBtdXRhYmxlIGFuZCBoYXZlIGFuIGVmZmljaWVudCBvdmVyYWxsb2NhdGlvbiBtZWNoYW5pc21cblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWRcblxuICAgKiBmb3Igb3RoZXIgdHlwZXMsIGludmVzdGlnYXRlIHRoZSByZWxldmFudCBjbGFzcyBkb2N1bWVudGF0aW9uXG5cbjcuIFNvbWUgc2VxdWVuY2UgdHlwZXMgKHN1Y2ggYXMgInJhbmdlIikgb25seSBzdXBwb3J0IGl0ZW1cbiAgIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvblwndCBzdXBwb3J0XG4gICBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG5cbjguICJpbmRleCIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuXG4gICBzdXBwb3J0ZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgaW5kZXggbWV0aG9kIGFsbG93XG4gICBlZmZpY2llbnQgc2VhcmNoaW5nIG9mIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZS4gUGFzc2luZyB0aGVcbiAgIGV4dHJhIGFyZ3VtZW50cyBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdXNpbmcgInNbaTpqXS5pbmRleCh4KSIsXG4gICBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUgcmV0dXJuZWQgaW5kZXggYmVpbmdcbiAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZVxuICAgc2xpY2UuXG5cblxuSW1tdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9ubHkgb3BlcmF0aW9uIHRoYXQgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGdlbmVyYWxseSBpbXBsZW1lbnRcbnRoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyBzdXBwb3J0IGZvclxudGhlICJoYXNoKCkiIGJ1aWx0LWluLlxuXG5UaGlzIHN1cHBvcnQgYWxsb3dzIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHN1Y2ggYXMgInR1cGxlIiBpbnN0YW5jZXMsIHRvXG5iZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiIGluc3RhbmNlcy5cblxuQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHVuaGFzaGFibGVcbnZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMuIFRoZSAiY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSIgQUJDIGlzIHByb3ZpZGVkIHRvIG1ha2Vcbml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlXG50eXBlcy5cblxuSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueVxuaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSB0eXBlIGFuZFxudmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgb25seVxuYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICJzIiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5leHRlbmQodCkiICAgICAgICAgICAgICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoc2FtZSBhcyAic1tsZW4ocyk6bGVuKHMpXSA9IHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqIChzYW1lIGFzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSB4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG5cbjIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG4zLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG5cbjQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzXG4gICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkXG4gICBzZXF1ZW5jZS5cblxuNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4gICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvblwndCBzdXBwb3J0IHNsaWNpbmdcbiAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcblxuICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG5cblxuTGlzdHNcbj09PT09XG5cbkxpc3RzIGFyZSBtdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2ZcbmhvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsIHZhcnkgYnlcbmFwcGxpY2F0aW9uKS5cblxuY2xhc3MgY2xhc3MgbGlzdChbaXRlcmFibGVdKVxuXG4gICBMaXN0cyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gc2V2ZXJhbCB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMgdG8gZGVub3RlIHRoZSBlbXB0eSBsaXN0OiAiW10iXG5cbiAgICogVXNpbmcgc3F1YXJlIGJyYWNrZXRzLCBzZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiAiW2FdIixcbiAgICAgIlthLCBiLCBjXSJcblxuICAgKiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbjogIlt4IGZvciB4IGluIGl0ZXJhYmxlXSJcblxuICAgKiBVc2luZyB0aGUgdHlwZSBjb25zdHJ1Y3RvcjogImxpc3QoKSIgb3IgImxpc3QoaXRlcmFibGUpIlxuXG4gICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIGxpc3QsIGEgY29weSBpcyBtYWRlIGFuZFxuICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICJsaXN0KFwnYWJjXCcpIlxuICAgcmV0dXJucyAiW1wnYVwnLCBcJ2JcJywgXCdjXCddIiBhbmQgImxpc3QoICgxLCAyLCAzKSApIiByZXR1cm5zICJbMSwgMixcbiAgIDNdIi4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5XG4gICBsaXN0LCAiW10iLlxuXG4gICBNYW55IG90aGVyIG9wZXJhdGlvbnMgYWxzbyBwcm9kdWNlIGxpc3RzLCBpbmNsdWRpbmcgdGhlICJzb3J0ZWQoKSJcbiAgIGJ1aWx0LWluLlxuXG4gICBMaXN0cyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBhbmQgKm11dGFibGUqIHNlcXVlbmNlXG4gICBvcGVyYXRpb25zLiBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDpcblxuICAgc29ydCgqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1Ob25lKVxuXG4gICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgY29tcGFyaXNvbnNcbiAgICAgIGJldHdlZW4gaXRlbXMuIEV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIC0gaWYgYW55IGNvbXBhcmlzb25cbiAgICAgIG9wZXJhdGlvbnMgZmFpbCwgdGhlIGVudGlyZSBzb3J0IG9wZXJhdGlvbiB3aWxsIGZhaWwgKGFuZCB0aGVcbiAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuXG5cbiAgICAgICJzb3J0KCkiIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyB0aGF0IGNhbiBvbmx5IGJlIHBhc3NlZCBieVxuICAgICAga2V5d29yZCAoKmtleXdvcmQtb25seSBhcmd1bWVudHMqKTpcblxuICAgICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0b1xuICAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQgKGZvciBleGFtcGxlLFxuICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdFxuICAgICAgaXMgY2FsY3VsYXRlZCBvbmNlIGFuZCB0aGVuIHVzZWQgZm9yIHRoZSBlbnRpcmUgc29ydGluZyBwcm9jZXNzLlxuICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgIk5vbmUiIG1lYW5zIHRoYXQgbGlzdCBpdGVtcyBhcmUgc29ydGVkXG4gICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLlxuXG4gICAgICBUaGUgImZ1bmN0b29scy5jbXBfdG9fa2V5KCkiIHV0aWxpdHkgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgYVxuICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uXG5cbiAgICAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gIlRydWUiLCB0aGVuIHRoZSBsaXN0XG4gICAgICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICAgICBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkgb2Ygc3BhY2VcbiAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgb3BlcmF0ZXNcbiAgICAgIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHNvcnRlZCBzZXF1ZW5jZSAodXNlXG4gICAgICAic29ydGVkKCkiIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIG5ldyBzb3J0ZWQgbGlzdCBpbnN0YW5jZSkuXG5cbiAgICAgIFRoZSAic29ydCgpIiBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBBIHNvcnQgaXNcbiAgICAgIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyIG9mXG4gICAgICBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bCBmb3Igc29ydGluZyBpblxuICAgICAgbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LCB0aGVuIGJ5IHNhbGFyeVxuICAgICAgZ3JhZGUpLlxuXG4gICAgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSBsaXN0IGlzXG4gICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgYXBwZWFyXG4gICAgICBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzICJWYWx1ZUVycm9yIiBpZiBpdCBjYW4gZGV0ZWN0XG4gICAgICB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cblxuXG5UdXBsZXNcbj09PT09PVxuXG5UdXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mXG5oZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAiZW51bWVyYXRlKCkiXG5idWlsdC1pbikuIFR1cGxlcyBhcmUgYWxzbyB1c2VkIGZvciBjYXNlcyB3aGVyZSBhbiBpbW11dGFibGUgc2VxdWVuY2Vcbm9mIGhvbW9nZW5lb3VzIGRhdGEgaXMgbmVlZGVkIChzdWNoIGFzIGFsbG93aW5nIHN0b3JhZ2UgaW4gYSAic2V0IiBvclxuImRpY3QiIGluc3RhbmNlKS5cblxuY2xhc3MgY2xhc3MgdHVwbGUoW2l0ZXJhYmxlXSlcblxuICAgVHVwbGVzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBhIG51bWJlciBvZiB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAiKCkiXG5cbiAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgIihhLCkiXG5cbiAgICogU2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogImEsIGIsIGMiIG9yICIoYSwgYiwgYykiXG5cbiAgICogVXNpbmcgdGhlICJ0dXBsZSgpIiBidWlsdC1pbjogInR1cGxlKCkiIG9yICJ0dXBsZShpdGVyYWJsZSkiXG5cbiAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSB0dXBsZSB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIHR1cGxlLCBpdCBpcyByZXR1cm5lZFxuICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKFwnYWJjXCcpIiByZXR1cm5zICIoXCdhXCcsIFwnYlwnLCBcJ2NcJykiXG4gICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgaXNcbiAgIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSB0dXBsZSwgIigpIi5cblxuICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgdGhlXG4gICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSBlbXB0eVxuICAgdHVwbGUgY2FzZSwgb3Igd2hlbiB0aGV5IGFyZSBuZWVkZWQgdG8gYXZvaWQgc3ludGFjdGljIGFtYmlndWl0eS5cbiAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgYXJndW1lbnRzLFxuICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSBzb2xlXG4gICBhcmd1bWVudC5cblxuICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG5cbkZvciBoZXRlcm9nZW5lb3VzIGNvbGxlY3Rpb25zIG9mIGRhdGEgd2hlcmUgYWNjZXNzIGJ5IG5hbWUgaXMgY2xlYXJlclxudGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmVcbmFwcHJvcHJpYXRlIGNob2ljZSB0aGFuIGEgc2ltcGxlIHR1cGxlIG9iamVjdC5cblxuXG5SYW5nZXNcbj09PT09PVxuXG5UaGUgInJhbmdlIiB0eXBlIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIG51bWJlcnMgYW5kIGlzXG5jb21tb25seSB1c2VkIGZvciBsb29waW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzIGluICJmb3IiIGxvb3BzLlxuXG5jbGFzcyBjbGFzcyByYW5nZShzdG9wKVxuY2xhc3MgY2xhc3MgcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcblxuICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAoZWl0aGVyXG4gICBidWlsdC1pbiAiaW50IiBvciBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgIl9faW5kZXhfXyJcbiAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG9cbiAgICIxIi4gSWYgdGhlICpzdGFydCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIjAiLiBJZlxuICAgKnN0ZXAqIGlzIHplcm8sICJWYWx1ZUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIEZvciBhIHBvc2l0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIGEgcmFuZ2UgInIiIGFyZSBkZXRlcm1pbmVkXG4gICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgInJbaV0gPFxuICAgc3RvcCIuXG5cbiAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGxcbiAgIGRldGVybWluZWQgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIsIGJ1dCB0aGVcbiAgIGNvbnN0cmFpbnRzIGFyZSAiaSA+PSAwIiBhbmQgInJbaV0gPiBzdG9wIi5cblxuICAgQSByYW5nZSBvYmplY3Qgd2lsbCBiZSBlbXB0eSBpZiAiclswXSIgZG9lcyBub3QgbWVldCB0aGUgdmFsdWVcbiAgIGNvbnN0cmFpbnQuIFJhbmdlcyBkbyBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMsIGJ1dCB0aGVzZSBhcmVcbiAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgZGV0ZXJtaW5lZCBieVxuICAgdGhlIHBvc2l0aXZlIGluZGljZXMuXG5cbiAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFyZVxuICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZVxuICAgIk92ZXJmbG93RXJyb3IiLlxuXG4gICBSYW5nZSBleGFtcGxlczpcblxuICAgICAgPj4+IGxpc3QocmFuZ2UoMTApKVxuICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAxMSkpXG4gICAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpXG4gICAgICBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAxMCwgMykpXG4gICAgICBbMCwgMywgNiwgOV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIC0xMCwgLTEpKVxuICAgICAgWzAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCwgLTldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwKSlcbiAgICAgIFtdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAwKSlcbiAgICAgIFtdXG5cbiAgIFJhbmdlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zIGV4Y2VwdFxuICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2Ugb2JqZWN0c1xuICAgY2FuIG9ubHkgcmVwcmVzZW50IHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBhIHN0cmljdCBwYXR0ZXJuIGFuZFxuICAgcmVwZXRpdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiB3aWxsIHVzdWFsbHkgdmlvbGF0ZSB0aGF0IHBhdHRlcm4pLlxuXG5UaGUgYWR2YW50YWdlIG9mIHRoZSAicmFuZ2UiIHR5cGUgb3ZlciBhIHJlZ3VsYXIgImxpc3QiIG9yICJ0dXBsZSIgaXNcbnRoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50IG9mXG5tZW1vcnksIG5vIG1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cyAoYXMgaXQgb25seVxuc3RvcmVzIHRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiB2YWx1ZXMsIGNhbGN1bGF0aW5nIGluZGl2aWR1YWxcbml0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS5cblxuUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kXG5wcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggbG9va3VwLFxuc2xpY2luZyBhbmQgc3VwcG9ydCBmb3IgbmVnYXRpdmUgaW5kaWNlcyAoc2VlICpTZXF1ZW5jZSBUeXBlcyAtLS1cbmxpc3QsIHR1cGxlLCByYW5nZSopOlxuXG4+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKVxuPj4+IHJcbnJhbmdlKDAsIDIwLCAyKVxuPj4+IDExIGluIHJcbkZhbHNlXG4+Pj4gMTAgaW4gclxuVHJ1ZVxuPj4+IHIuaW5kZXgoMTApXG41XG4+Pj4gcls1XVxuMTBcbj4+PiByWzo1XVxucmFuZ2UoMCwgMTAsIDIpXG4+Pj4gclstMV1cbjE4XG5cblRlc3RpbmcgcmFuZ2Ugb2JqZWN0cyBmb3IgZXF1YWxpdHkgd2l0aCAiPT0iIGFuZCAiIT0iIGNvbXBhcmVzIHRoZW0gYXNcbnNlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXlcbnJlcHJlc2VudCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiB2YWx1ZXMuICAoTm90ZSB0aGF0IHR3byByYW5nZSBvYmplY3RzXG50aGF0IGNvbXBhcmUgZXF1YWwgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCJcbmF0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgInJhbmdlKDAsIDMsXG4yKSA9PSByYW5nZSgwLCA0LCAyKSIuKVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCBzbGljaW5nXG5hbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluIGNvbnN0YW50XG50aW1lIGluc3RlYWQgb2YgaXRlcmF0aW5nIHRocm91Z2ggYWxsIGl0ZW1zLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUgXCc9PVwnIGFuZCBcJyE9XCcgdG8gY29tcGFyZSByYW5nZSBvYmplY3RzXG5iYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mIGNvbXBhcmluZ1xuYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5KS5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcy5cbicsCisgJ3R5cGVzc2VxLW11dGFibGUnOiB1J1xuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlXG5pdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZVxudHlwZXMuXG5cbkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnlcbml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmRcbnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHlcbmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gW10iICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTpqOmtdIiBmcm9tIHRoZSBsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9IFt4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAiZGVsIHNbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY29weSgpIiAgICAgICAgICAgICAgICAgICAgIHwgY3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAic1s6XSIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuZXh0ZW5kKHQpIiAgICAgICAgICAgICAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKHNhbWUgYXMgInNbbGVuKHMpOmxlbihzKV0gPSB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHQiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCB0aGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTppXSA9IFt4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnBvcChbaV0pIiAgICAgICAgICAgICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gKnMqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0geCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLlxuXG4yLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLlxuXG40LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2Vyc1xuICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSByZXZlcnNlZFxuICAgc2VxdWVuY2UuXG5cbjUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZVxuICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nXG4gICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuJywKICAndW5hcnknOiB1J1xuVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OlxuXG4gICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG5cblRoZSB1bmFyeSAiLSIgKG1pbnVzKSBvcGVyYXRvciB5aWVsZHMgdGhlIG5lZ2F0aW9uIG9mIGl0cyBudW1lcmljXG5hcmd1bWVudC5cblxuVGhlIHVuYXJ5ICIrIiAocGx1cykgb3BlcmF0b3IgeWllbGRzIGl0cyBudW1lcmljIGFyZ3VtZW50IHVuY2hhbmdlZC5cblxuVGhlIHVuYXJ5ICJ+IiAoaW52ZXJ0KSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGl0c1xuaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy5cblxuSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsIGFcbiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAogICd3aGlsZSc6IHUnXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKICAnd2l0aCc6IHUnXG5UaGUgIndpdGgiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxudXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuXG4gICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbiAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG5cblRoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cblxuMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cblxuICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlXG4gICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmdcbiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cblxuNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuXG42LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsIHRocmVlXG4gICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLlxuICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmRcbiAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4gICBzdGF0ZW1lbnQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGVcbiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzogKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLApkaWZmIC0tZ2l0IGEvTGliL3JsY29tcGxldGVyLnB5IGIvTGliL3JsY29tcGxldGVyLnB5CmluZGV4IDM3OGY1YWEuLjMxOWU4MjYgMTAwNjQ0Ci0tLSBhL0xpYi9ybGNvbXBsZXRlci5weQorKysgYi9MaWIvcmxjb21wbGV0ZXIucHkKQEAgLTEwOCw2ICsxMDgsMTIgQEAKICAgICAgICAgZm9yIHdvcmQgaW4ga2V5d29yZC5rd2xpc3Q6CiAgICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSB0ZXh0OgogICAgICAgICAgICAgICAgIHNlZW4uYWRkKHdvcmQpCisgICAgICAgICAgICAgICAgaWYgd29yZCBpbiB7J2ZpbmFsbHknLCAndHJ5J306CisgICAgICAgICAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgJzonCisgICAgICAgICAgICAgICAgZWxpZiB3b3JkIG5vdCBpbiB7J0ZhbHNlJywgJ05vbmUnLCAnVHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ3Bhc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbHNlJ306CisgICAgICAgICAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgJyAnCiAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKICAgICAgICAgZm9yIG5zcGFjZSBpbiBbc2VsZi5uYW1lc3BhY2UsIGJ1aWx0aW5zLl9fZGljdF9fXToKICAgICAgICAgICAgIGZvciB3b3JkLCB2YWwgaW4gbnNwYWNlLml0ZW1zKCk6CkBAIC0xNDcsMTQgKzE1MywzMCBAQAogICAgICAgICAgICAgd29yZHMudXBkYXRlKGdldF9jbGFzc19tZW1iZXJzKHRoaXNvYmplY3QuX19jbGFzc19fKSkKICAgICAgICAgbWF0Y2hlcyA9IFtdCiAgICAgICAgIG4gPSBsZW4oYXR0cikKLSAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6Ci0gICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSBhdHRyOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cih0aGlzb2JqZWN0LCB3b3JkKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIEV4Y2x1ZGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc2V0Ci0gICAgICAgICAgICAgICAgd29yZCA9IHNlbGYuX2NhbGxhYmxlX3Bvc3RmaXgodmFsLCAiJXMuJXMiICUgKGV4cHIsIHdvcmQpKQotICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHdvcmQpCisgICAgICAgIGlmIGF0dHIgPT0gJyc6CisgICAgICAgICAgICBub3ByZWZpeCA9ICdfJworICAgICAgICBlbGlmIGF0dHIgPT0gJ18nOgorICAgICAgICAgICAgbm9wcmVmaXggPSAnX18nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub3ByZWZpeCA9IE5vbmUKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgICAgIGlmICh3b3JkWzpuXSA9PSBhdHRyIGFuZAorICAgICAgICAgICAgICAgICAgICBub3QgKG5vcHJlZml4IGFuZCB3b3JkWzpuKzFdID09IG5vcHJlZml4KSk6CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gIiVzLiVzIiAlIChleHByLCB3b3JkKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHRoaXNvYmplY3QsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAjIEluY2x1ZGUgZXZlbiBpZiBhdHRyaWJ1dGUgbm90IHNldAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLl9jYWxsYWJsZV9wb3N0Zml4KHZhbCwgbWF0Y2gpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKG1hdGNoKQorICAgICAgICAgICAgaWYgbWF0Y2hlcyBvciBub3Qgbm9wcmVmaXg6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vcHJlZml4ID09ICdfJzoKKyAgICAgICAgICAgICAgICBub3ByZWZpeCA9ICdfXycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbm9wcmVmaXggPSBOb25lCiAgICAgICAgIG1hdGNoZXMuc29ydCgpCiAgICAgICAgIHJldHVybiBtYXRjaGVzCiAKZGlmZiAtLWdpdCBhL0xpYi9zY2hlZC5weSBiL0xpYi9zY2hlZC5weQppbmRleCBiNDc2NDhkLi5iZDdjMGYxIDEwMDY0NAotLS0gYS9MaWIvc2NoZWQucHkKKysrIGIvTGliL3NjaGVkLnB5CkBAIC00Niw2ICs0NiwxNyBAQAogICAgIGRlZiBfX2d0X18ocywgbyk6IHJldHVybiAocy50aW1lLCBzLnByaW9yaXR5KSA+ICAoby50aW1lLCBvLnByaW9yaXR5KQogICAgIGRlZiBfX2dlX18ocywgbyk6IHJldHVybiAocy50aW1lLCBzLnByaW9yaXR5KSA+PSAoby50aW1lLCBvLnByaW9yaXR5KQogCitFdmVudC50aW1lLl9fZG9jX18gPSAoJycnTnVtZXJpYyB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQordGltZWZ1bmMgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4nJycpCitFdmVudC5wcmlvcml0eS5fX2RvY19fID0gKCcnJ0V2ZW50cyBzY2hlZHVsZWQgZm9yIHRoZSBzYW1lIHRpbWUgd2lsbCBiZSBleGVjdXRlZAoraW4gdGhlIG9yZGVyIG9mIHRoZWlyIHByaW9yaXR5LicnJykKK0V2ZW50LmFjdGlvbi5fX2RvY19fID0gKCcnJ0V4ZWN1dGluZyB0aGUgZXZlbnQgbWVhbnMgZXhlY3V0aW5nCithY3Rpb24oKmFyZ3VtZW50LCAqKmt3YXJncyknJycpCitFdmVudC5hcmd1bWVudC5fX2RvY19fID0gKCcnJ2FyZ3VtZW50IGlzIGEgc2VxdWVuY2UgaG9sZGluZyB0aGUgcG9zaXRpb25hbAorYXJndW1lbnRzIGZvciB0aGUgYWN0aW9uLicnJykKK0V2ZW50Lmt3YXJncy5fX2RvY19fID0gKCcnJ2t3YXJncyBpcyBhIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUga2V5d29yZAorYXJndW1lbnRzIGZvciB0aGUgYWN0aW9uLicnJykKKwogX3NlbnRpbmVsID0gb2JqZWN0KCkKIAogY2xhc3Mgc2NoZWR1bGVyOgpkaWZmIC0tZ2l0IGEvTGliL3NlbGVjdG9ycy5weSBiL0xpYi9zZWxlY3RvcnMucHkKaW5kZXggNmQ1NjljMy4uZWNkODYzMiAxMDA2NDQKLS0tIGEvTGliL3NlbGVjdG9ycy5weQorKysgYi9MaWIvc2VsZWN0b3JzLnB5CkBAIC00Myw5ICs0MywxNyBAQAogCiAKIFNlbGVjdG9yS2V5ID0gbmFtZWR0dXBsZSgnU2VsZWN0b3JLZXknLCBbJ2ZpbGVvYmonLCAnZmQnLCAnZXZlbnRzJywgJ2RhdGEnXSkKLSIiIk9iamVjdCB1c2VkIHRvIGFzc29jaWF0ZSBhIGZpbGUgb2JqZWN0IHRvIGl0cyBiYWNraW5nIGZpbGUgZGVzY3JpcHRvciwKLXNlbGVjdGVkIGV2ZW50IG1hc2sgYW5kIGF0dGFjaGVkIGRhdGEuIiIiCiAKK1NlbGVjdG9yS2V5Ll9fZG9jX18gPSAiIiJTZWxlY3RvcktleShmaWxlb2JqLCBmZCwgZXZlbnRzLCBkYXRhKQorCisgICAgT2JqZWN0IHVzZWQgdG8gYXNzb2NpYXRlIGEgZmlsZSBvYmplY3QgdG8gaXRzIGJhY2tpbmcKKyAgICBmaWxlIGRlc2NyaXB0b3IsIHNlbGVjdGVkIGV2ZW50IG1hc2ssIGFuZCBhdHRhY2hlZCBkYXRhLgorIiIiCitTZWxlY3RvcktleS5maWxlb2JqLl9fZG9jX18gPSAnRmlsZSBvYmplY3QgcmVnaXN0ZXJlZC4nCitTZWxlY3RvcktleS5mZC5fX2RvY19fID0gJ1VuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yLicKK1NlbGVjdG9yS2V5LmV2ZW50cy5fX2RvY19fID0gJ0V2ZW50cyB0aGF0IG11c3QgYmUgd2FpdGVkIGZvciBvbiB0aGlzIGZpbGUgb2JqZWN0LicKK1NlbGVjdG9yS2V5LmRhdGEuX19kb2NfXyA9ICgnJydPcHRpb25hbCBvcGFxdWUgZGF0YSBhc3NvY2lhdGVkIHRvIHRoaXMgZmlsZSBvYmplY3QuCitGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIHN0b3JlIGEgcGVyLWNsaWVudCBzZXNzaW9uIElELicnJykKIAogY2xhc3MgX1NlbGVjdG9yTWFwcGluZyhNYXBwaW5nKToKICAgICAiIiJNYXBwaW5nIG9mIGZpbGUgb2JqZWN0cyB0byBzZWxlY3RvciBrZXlzLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3NodXRpbC5weSBiL0xpYi9zaHV0aWwucHkKaW5kZXggM2Y0YjZiZi4uZjQ3YTc2MyAxMDA2NDQKLS0tIGEvTGliL3NodXRpbC5weQorKysgYi9MaWIvc2h1dGlsLnB5CkBAIC05NzQsNiArOTc0LDkgQEAKIAogICAgIF9fYWxsX18uYXBwZW5kKCdkaXNrX3VzYWdlJykKICAgICBfbnR1cGxlX2Rpc2t1c2FnZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3VzYWdlJywgJ3RvdGFsIHVzZWQgZnJlZScpCisgICAgX250dXBsZV9kaXNrdXNhZ2UudG90YWwuX19kb2NfXyA9ICdUb3RhbCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS51c2VkLl9fZG9jX18gPSAnVXNlZCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS5mcmVlLl9fZG9jX18gPSAnRnJlZSBzcGFjZSBpbiBieXRlcycKIAogICAgIGRlZiBkaXNrX3VzYWdlKHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gZGlzayB1c2FnZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBnaXZlbiBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dCBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZjYyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBleGlzdHMgc28gdGhhdCAzcmQgcGFydHkgcGFja2FnZXMgY2FuIGJlIGluc3RhbGxlZAoraGVyZS4gIFJlYWQgdGhlIHNvdXJjZSBmb3Igc2l0ZS5weSBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvTGliL3NuZGhkci5weSBiL0xpYi9zbmRoZHIucHkKaW5kZXggZTU5MDFlYy4uN2VjYWZiNCAxMDA2NDQKLS0tIGEvTGliL3NuZGhkci5weQorKysgYi9MaWIvc25kaGRyLnB5CkBAIC0zNyw2ICszNywxOCBAQAogU25kSGVhZGVycyA9IG5hbWVkdHVwbGUoJ1NuZEhlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGV0eXBlIGZyYW1lcmF0ZSBuY2hhbm5lbHMgbmZyYW1lcyBzYW1wd2lkdGgnKQogCitTbmRIZWFkZXJzLmZpbGV0eXBlLl9fZG9jX18gPSAoIiIiVGhlIHZhbHVlIGZvciB0eXBlIGluZGljYXRlcyB0aGUgZGF0YSB0eXBlCithbmQgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgJ2FpZmMnLCAnYWlmZicsICdhdScsJ2hjb20nLAorJ3NuZHInLCAnc25kdCcsICd2b2MnLCAnd2F2JywgJzhzdngnLCAnc2InLCAndWInLCBvciAndWwnLiIiIikKK1NuZEhlYWRlcnMuZnJhbWVyYXRlLl9fZG9jX18gPSAoIiIiVGhlIHNhbXBsaW5nX3JhdGUgd2lsbCBiZSBlaXRoZXIgdGhlIGFjdHVhbAordmFsdWUgb3IgMCBpZiB1bmtub3duIG9yIGRpZmZpY3VsdCB0byBkZWNvZGUuIiIiKQorU25kSGVhZGVycy5uY2hhbm5lbHMuX19kb2NfXyA9ICgiIiJUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIDAgaWYgaXQgY2Fubm90IGJlCitkZXRlcm1pbmVkIG9yIGlmIHRoZSB2YWx1ZSBpcyBkaWZmaWN1bHQgdG8gZGVjb2RlLiIiIikKK1NuZEhlYWRlcnMubmZyYW1lcy5fX2RvY19fID0gKCIiIlRoZSB2YWx1ZSBmb3IgZnJhbWVzIHdpbGwgYmUgZWl0aGVyIHRoZSBudW1iZXIKK29mIGZyYW1lcyBvciAtMS4iIiIpCitTbmRIZWFkZXJzLnNhbXB3aWR0aC5fX2RvY19fID0gKCIiIkVpdGhlciB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBvcgorJ0EnIGZvciBBLUxBVyBvciAnVScgZm9yIHUtTEFXLiIiIikKKwogZGVmIHdoYXQoZmlsZW5hbWUpOgogICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgc291bmQgZmlsZS4iIiIKICAgICByZXMgPSB3aGF0aGRyKGZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3NyZV9jb21waWxlLnB5IGIvTGliL3NyZV9jb21waWxlLnB5CmluZGV4IDUwMmIwNjEuLjRlZGIwM2YgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfY29tcGlsZS5weQorKysgYi9MaWIvc3JlX2NvbXBpbGUucHkKQEAgLTQwOSw1NyArNDA5LDM5IEBACiAgICAgICAgICAgICB0YWJsZVtpXSA9IGlkeCArIDEKICAgICByZXR1cm4gdGFibGUKIAotZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgotICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYW4gaW5mbyBibG9jay4gIGluIHRoZSBjdXJyZW50IHZlcnNpb24sCi0gICAgIyB0aGlzIGNvbnRhaW5zIG1pbi9tYXggcGF0dGVybiB3aWR0aCwgYW5kIGFuIG9wdGlvbmFsIGxpdGVyYWwKLSAgICAjIHByZWZpeCBvciBhIGNoYXJhY3RlciBtYXAKLSAgICBsbywgaGkgPSBwYXR0ZXJuLmdldHdpZHRoKCkKLSAgICBpZiBoaSA+IE1BWENPREU6Ci0gICAgICAgIGhpID0gTUFYQ09ERQotICAgIGlmIGxvID09IDA6Ci0gICAgICAgIGNvZGUuZXh0ZW5kKFtJTkZPLCA0LCAwLCBsbywgaGldKQotICAgICAgICByZXR1cm4KLSAgICAjIGxvb2sgZm9yIGEgbGl0ZXJhbCBwcmVmaXgKK2RlZiBfZ2V0X2xpdGVyYWxfcHJlZml4KHBhdHRlcm4pOgorICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKICAgICBwcmVmaXggPSBbXQogICAgIHByZWZpeGFwcGVuZCA9IHByZWZpeC5hcHBlbmQKLSAgICBwcmVmaXhfc2tpcCA9IDAKKyAgICBwcmVmaXhfc2tpcCA9IE5vbmUKKyAgICBnb3RfYWxsID0gVHJ1ZQorICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybi5kYXRhOgorICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQorICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk46CisgICAgICAgICAgICBwcmVmaXgxLCBwcmVmaXhfc2tpcDEsIGdvdF9hbGwgPSBfZ2V0X2xpdGVyYWxfcHJlZml4KGF2WzFdKQorICAgICAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBhdlswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBsZW4ocHJlZml4KQorICAgICAgICAgICAgICAgIGVsaWYgcHJlZml4X3NraXAxIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IGxlbihwcmVmaXgpICsgcHJlZml4X3NraXAxCisgICAgICAgICAgICBwcmVmaXguZXh0ZW5kKHByZWZpeDEpCisgICAgICAgICAgICBpZiBub3QgZ290X2FsbDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ290X2FsbCA9IEZhbHNlCisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBwcmVmaXgsIHByZWZpeF9za2lwLCBnb3RfYWxsCisKK2RlZiBfZ2V0X2NoYXJzZXRfcHJlZml4KHBhdHRlcm4pOgogICAgIGNoYXJzZXQgPSBbXSAjIG5vdCB1c2VkCiAgICAgY2hhcnNldGFwcGVuZCA9IGNoYXJzZXQuYXBwZW5kCi0gICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0UpOgotICAgICAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4Ci0gICAgICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybi5kYXRhOgorICAgIGlmIHBhdHRlcm4uZGF0YToKKyAgICAgICAgb3AsIGF2ID0gcGF0dGVybi5kYXRhWzBdCisgICAgICAgIGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGF2WzFdOgorICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXA6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gcHJlZml4X3NraXAgKyAxCi0gICAgICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQotICAgICAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBsZW4oYXZbMV0pID09IDE6Ci0gICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KLSAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4Ci0gICAgICAgIGlmIG5vdCBwcmVmaXggYW5kIHBhdHRlcm4uZGF0YToKLSAgICAgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQotICAgICAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06Ci0gICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KLSAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0YXBwZW5kKChvcCwgYXYpKQotICAgICAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgotICAgICAgICAgICAgICAgICAgICBjID0gW10KLSAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCi0gICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCgob3AsIGF2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgICAgICAgICAgY2hhcnNldGFwcGVuZCgob3AsIGF2KSkKICAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgogICAgICAgICAgICAgICAgIGMgPSBbXQogICAgICAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZApAQCAtNDczLDggKzQ1NSw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYwotICAgICAgICAgICAgZWxpZiBvcCBpcyBJTjoKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYXYKKyAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICBjID0gW10KKyAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZAorICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgaWYgbm90IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQorICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgIGNhcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKKyAgICAgICAgZWxpZiBvcCBpcyBJTjoKKyAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorICAgIHJldHVybiBjaGFyc2V0CisKK2RlZiBfY29tcGlsZV9pbmZvKGNvZGUsIHBhdHRlcm4sIGZsYWdzKToKKyAgICAjIGludGVybmFsOiBjb21waWxlIGFuIGluZm8gYmxvY2suICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLAorICAgICMgdGhpcyBjb250YWlucyBtaW4vbWF4IHBhdHRlcm4gd2lkdGgsIGFuZCBhbiBvcHRpb25hbCBsaXRlcmFsCisgICAgIyBwcmVmaXggb3IgYSBjaGFyYWN0ZXIgbWFwCisgICAgbG8sIGhpID0gcGF0dGVybi5nZXR3aWR0aCgpCisgICAgaWYgaGkgPiBNQVhDT0RFOgorICAgICAgICBoaSA9IE1BWENPREUKKyAgICBpZiBsbyA9PSAwOgorICAgICAgICBjb2RlLmV4dGVuZChbSU5GTywgNCwgMCwgbG8sIGhpXSkKKyAgICAgICAgcmV0dXJuCisgICAgIyBsb29rIGZvciBhIGxpdGVyYWwgcHJlZml4CisgICAgcHJlZml4ID0gW10KKyAgICBwcmVmaXhfc2tpcCA9IDAKKyAgICBjaGFyc2V0ID0gW10gIyBub3QgdXNlZAorICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19JR05PUkVDQVNFKToKKyAgICAgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAorICAgICAgICBwcmVmaXgsIHByZWZpeF9za2lwLCBnb3RfYWxsID0gX2dldF9saXRlcmFsX3ByZWZpeChwYXR0ZXJuKQorICAgICAgICAjIGlmIG5vIHByZWZpeCwgbG9vayBmb3IgY2hhcnNldCBwcmVmaXgKKyAgICAgICAgaWYgbm90IHByZWZpeDoKKyAgICAgICAgICAgIGNoYXJzZXQgPSBfZ2V0X2NoYXJzZXRfcHJlZml4KHBhdHRlcm4pCiAjIyAgICAgaWYgcHJlZml4OgogIyMgICAgICAgICBwcmludCgiKioqIFBSRUZJWCIsIHByZWZpeCwgcHJlZml4X3NraXApCiAjIyAgICAgaWYgY2hhcnNldDoKQEAgLTQ4Nyw3ICs1MDQsNyBAQAogICAgIG1hc2sgPSAwCiAgICAgaWYgcHJlZml4OgogICAgICAgICBtYXNrID0gU1JFX0lORk9fUFJFRklYCi0gICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwID09IGxlbihwYXR0ZXJuLmRhdGEpOgorICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lIGFuZCBnb3RfYWxsOgogICAgICAgICAgICAgbWFzayA9IG1hc2sgfCBTUkVfSU5GT19MSVRFUkFMCiAgICAgZWxpZiBjaGFyc2V0OgogICAgICAgICBtYXNrID0gbWFzayB8IFNSRV9JTkZPX0NIQVJTRVQKQEAgLTUwMiw2ICs1MTksOCBAQAogICAgICMgYWRkIGxpdGVyYWwgcHJlZml4CiAgICAgaWYgcHJlZml4OgogICAgICAgICBlbWl0KGxlbihwcmVmaXgpKSAjIGxlbmd0aAorICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lOgorICAgICAgICAgICAgcHJlZml4X3NraXAgPSAgbGVuKHByZWZpeCkKICAgICAgICAgZW1pdChwcmVmaXhfc2tpcCkgIyBza2lwCiAgICAgICAgIGNvZGUuZXh0ZW5kKHByZWZpeCkKICAgICAgICAgIyBnZW5lcmF0ZSBvdmVybGFwIHRhYmxlCmRpZmYgLS1naXQgYS9MaWIvc3RyaW5nLnB5IGIvTGliL3N0cmluZy5weQppbmRleCA2MmU4ZjJmLi4xYWRkNDRiIDEwMDY0NAotLS0gYS9MaWIvc3RyaW5nLnB5CisrKyBiL0xpYi9zdHJpbmcucHkKQEAgLTExMiwxMCArMTEyLDcgQEAKICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG1vc3QgY29tbW9uIHBhdGggZmlyc3QuCiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KLSAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKLSAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKHZhbCwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihtYXBwaW5nW25hbWVkXSkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgpAQCAtMTQyLDkgKzEzOSw3IEBACiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyCi0gICAgICAgICAgICAgICAgICAgICMgd2lsbCBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1tuYW1lZF0sKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG1hcHBpbmdbbmFtZWRdKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vLmdyb3VwKCkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvdGFyZmlsZS5weSBiL0xpYi90YXJmaWxlLnB5CmluZGV4IDlkMjJjOGUuLjgwYjZlMzUgMTAwNzU1Ci0tLSBhL0xpYi90YXJmaWxlLnB5CisrKyBiL0xpYi90YXJmaWxlLnB5CkBAIC0yMzcyLDkgKzIzNzIsMzIgQEAKICAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6Ci0gICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQorICAgICAgICAgICAgeWllbGQgZnJvbSBzZWxmLm1lbWJlcnMKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgWWllbGQgaXRlbXMgdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCisgICAgICAgICMgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgorICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKKyAgICAgICAgIyB3aGljaCB3aWxsIGhhdmUgYWxyZWFkeSBleGhhdXN0ZWQgdGhlIG5leHQoKSBtZXRob2QuCisgICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgaW5kZXggPCBsZW4oc2VsZi5tZW1iZXJzKToKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5tZW1iZXJzW2luZGV4XQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5fbG9hZGVkOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KIAogICAgIGRlZiBfZGJnKHNlbGYsIGxldmVsLCBtc2cpOgogICAgICAgICAiIiJXcml0ZSBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCkBAIC0yMzk1LDQ1ICsyNDE4LDYgQEAKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKLSMgY2xhc3MgVGFyRmlsZQotCi1jbGFzcyBUYXJJdGVyOgotICAgICIiIkl0ZXJhdG9yIENsYXNzLgotCi0gICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgotICAgICAgICAgICBzdWl0ZS4uLgotICAgICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKLSAgICAgICAgc2VsZi5pbmRleCA9IDAKLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBpdGVyYXRvciBvYmplY3QuCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IGl0ZW0gdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCi0gICAgICAgICAgIFdoZW4gYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQsIHNldCBUYXJGaWxlIGFzIF9sb2FkZWQuCi0gICAgICAgICIiIgotICAgICAgICAjIEZpeCBmb3IgU0YgIzExMDA0Mjk6IFVuZGVyIHJhcmUgY2lyY3Vtc3RhbmNlcyBpdCBjYW4KLSAgICAgICAgIyBoYXBwZW4gdGhhdCBnZXRtZW1iZXJzKCkgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24sCi0gICAgICAgICMgd2hpY2ggd2lsbCBjYXVzZSBUYXJJdGVyIHRvIHN0b3AgcHJlbWF0dXJlbHkuCi0KLSAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwIGFuZCBzZWxmLnRhcmZpbGUuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICBlbGlmIHNlbGYuaW5kZXggPCBsZW4oc2VsZi50YXJmaWxlLm1lbWJlcnMpOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCi0gICAgICAgIGVsaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKLSAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgotICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgc2VsZi5pbmRleCArPSAxCi0gICAgICAgIHJldHVybiB0YXJpbmZvCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBleHBvcnRlZCBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL0xpYi90ZWxuZXRsaWIucHkgYi9MaWIvdGVsbmV0bGliLnB5CmluZGV4IDcyZGFiYzcuLmIwODYzYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZWxuZXRsaWIucHkKKysrIGIvTGliL3RlbG5ldGxpYi5weQpAQCAtNjM3LDYgKzYzNywxMiBAQAogICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKICAgICAgICAgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkKIAorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCiAKIGRlZiB0ZXN0KCk6CiAgICAgIiIiVGVzdCBwcm9ncmFtIGZvciB0ZWxuZXRsaWIuCkBAIC02NjAsMTEgKzY2NiwxMCBAQAogICAgICAgICAgICAgcG9ydCA9IGludChwb3J0c3RyKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShwb3J0c3RyLCAndGNwJykKLSAgICB0biA9IFRlbG5ldCgpCi0gICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKLSAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQotICAgIHRuLmludGVyYWN0KCkKLSAgICB0bi5jbG9zZSgpCisgICAgd2l0aCBUZWxuZXQoKSBhcyB0bjoKKyAgICAgICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKKyAgICAgICAgdG4ub3Blbihob3N0LCBwb3J0LCB0aW1lb3V0PTAuNSkKKyAgICAgICAgdG4uaW50ZXJhY3QoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZGF0ZXRpbWV0ZXN0ZXIucHkgYi9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQppbmRleCA2MzY1YzYwLi43Mzc0NjA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weQpAQCAtMjgxLDcgKzI4MSw4IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKTogc2VsZi5FU1QuZHN0KDUpCiAKICAgICBkZWYgdGVzdF90em5hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQyswMDowMCcsIHRpbWV6b25lKFpFUk8pLnR6bmFtZShOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDJywgdGltZXpvbmUudXRjLnR6bmFtZShOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDJywgdGltZXpvbmUoWkVSTykudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMtMDU6MDAnLCB0aW1lem9uZSgtNSAqIEhPVVIpLnR6bmFtZShOb25lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDKzA5OjMwJywgdGltZXpvbmUoOS41ICogSE9VUikudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMtMDA6MDEnLCB0aW1lem9uZSh0aW1lZGVsdGEobWludXRlcz0tMSkpLnR6bmFtZShOb25lKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CmluZGV4IGUzYzM2ZjkuLmUxZWQzZGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQpAQCAtOSw2ICs5LDcgQEAKICIiIgogCiBpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGZhdWx0aGFuZGxlcgogaW1wb3J0IGlvCiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKQEAgLTUwLDYgKzUxLDEwIEBACiAgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2lnbmFsLklUSU1FUl9SRUFMLCBjbHMuc2lnbmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5zaWduYWxfcGVyaW9kKQogCisgICAgICAgICMgSXNzdWUgIzI1Mjc3OiBVc2UgZmF1bHRoYW5kbGVyIHRvIHRyeSB0byBkZWJ1ZyBhIGhhbmcgb24gRnJlZUJTRAorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIoMTAgKiA2MCwgZXhpdD1UcnVlKQorCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHN0b3BfYWxhcm0oY2xzKToKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIDAsIDApCkBAIC01OCw2ICs2Myw4IEBACiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnN0b3BfYWxhcm0oKQogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbHMub3JpZ19oYW5kbGVyKQorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2NhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCiAKICAgICBkZWYgc3VicHJvY2VzcyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgIGNtZF9hcmdzID0gKHN5cy5leGVjdXRhYmxlLCAnLWMnKSArIGFyZ3MKQEAgLTMzOCw2ICszNDUsNyBAQAogICAgICAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19XUk9OTFkpCiAgICAgICAgIG9zLmNsb3NlKGZkKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gImRhcndpbiIsICJoYW5ncyB1bmRlciBPUyBYOyBzZWUgaXNzdWUgIzI1MjM0IikKICAgICBkZWYgdGVzdF9vc19vcGVuKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X29wZW4oImZkID0gb3Mub3BlbihwYXRoLCBvcy5PX1JET05MWSlcbm9zLmNsb3NlKGZkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9zX29wZW4pCkBAIC0zNzAsMTAgKzM3OCwxMCBAQAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc2lnbmFsLCAnc2lnd2FpdGluZm8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVlZCBzaWduYWwuc2lnd2FpdGluZm8oKScpCiAgICAgZGVmIHRlc3Rfc2lnd2FpdGluZm8oc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzI1Mjc3OiBUaGUgc2xlZXAgaXMgYSB3ZWFrIHN5bmNocm9uaXphdGlvbiBiZXR3ZWVuIHRoZSBwYXJlbnQKLSAgICAgICAgIyBhbmQgdGhlIGNoaWxkIHByb2Nlc3MuIElmIHRoZSBzbGVlcCBpcyB0b28gbG93LCB0aGUgdGVzdCBoYW5ncyBvbgotICAgICAgICAjIHNsb3cgb3IgaGlnaGx5IGxvYWRlZCBzeXN0ZW1zLgotICAgICAgICBzZWxmLnNsZWVwX3RpbWUgPSAyLjAKKyAgICAgICAgIyBJc3N1ZSAjMjUyNzcsICMyNTg2ODogZ2l2ZSBhIGZldyBtaWxpc2Vjb25kcyB0byB0aGUgcGFyZW50IHByb2Nlc3MKKyAgICAgICAgIyBiZXR3ZWVuIG9zLndyaXRlKCkgYW5kIHNpZ25hbC5zaWd3YWl0aW5mbygpIHRvIHdvcmtzIGFyb3VuZCBhIHJhY2UKKyAgICAgICAgIyBjb25kaXRpb24KKyAgICAgICAgc2VsZi5zbGVlcF90aW1lID0gMC4xMDAKIAogICAgICAgICBzaWdudW0gPSBzaWduYWwuU0lHVVNSMQogICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQpAQCAtMzgxLDE4ICszODksMjggQEAKICAgICAgICAgb2xkX2hhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNpZ251bSwgbGFtYmRhICphcmdzOiBOb25lKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc2lnbmFsLnNpZ25hbCwgc2lnbnVtLCBvbGRfaGFuZGxlcikKIAorICAgICAgICBycGlwZSwgd3BpcGUgPSBvcy5waXBlKCkKKwogICAgICAgICBjb2RlID0gJ1xuJy5qb2luKCgKICAgICAgICAgICAgICdpbXBvcnQgb3MsIHRpbWUnLAogICAgICAgICAgICAgJ3BpZCA9ICVzJyAlIG9zLmdldHBpZCgpLAogICAgICAgICAgICAgJ3NpZ251bSA9ICVzJyAlIGludChzaWdudW0pLAogICAgICAgICAgICAgJ3NsZWVwX3RpbWUgPSAlcicgJSBzZWxmLnNsZWVwX3RpbWUsCisgICAgICAgICAgICAncnBpcGUgPSAlcicgJSBycGlwZSwKKyAgICAgICAgICAgICdvcy5yZWFkKHJwaXBlLCAxKScsCisgICAgICAgICAgICAnb3MuY2xvc2UocnBpcGUpJywKICAgICAgICAgICAgICd0aW1lLnNsZWVwKHNsZWVwX3RpbWUpJywKICAgICAgICAgICAgICdvcy5raWxsKHBpZCwgc2lnbnVtKScsCiAgICAgICAgICkpCiAKICAgICAgICAgdDAgPSB0aW1lLm1vbm90b25pYygpCi0gICAgICAgIHByb2MgPSBzZWxmLnN1YnByb2Nlc3MoY29kZSkKKyAgICAgICAgcHJvYyA9IHNlbGYuc3VicHJvY2Vzcyhjb2RlLCBwYXNzX2Zkcz0ocnBpcGUsKSkKKyAgICAgICAgb3MuY2xvc2UocnBpcGUpCiAgICAgICAgIHdpdGgga2lsbF9vbl9lcnJvcihwcm9jKToKKyAgICAgICAgICAgICMgc3luYyBjaGlsZC1wYXJlbnQKKyAgICAgICAgICAgIG9zLndyaXRlKHdwaXBlLCBiJ3gnKQorICAgICAgICAgICAgb3MuY2xvc2Uod3BpcGUpCisKICAgICAgICAgICAgICMgcGFyZW50CiAgICAgICAgICAgICBzaWduYWwuc2lnd2FpdGluZm8oW3NpZ251bV0pCiAgICAgICAgICAgICBkdCA9IHRpbWUubW9ub3RvbmljKCkgLSB0MApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjdiMWMxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSwyIEBACitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MsIFJFU09VUkNFX05BTUVTCitmcm9tIHRlc3QubGlicmVncnRlc3QubWFpbiBpbXBvcnQgbWFpbiwgbWFpbl9pbl90ZW1wX2N3ZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlOTkwZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKQEAgLTAsMCArMSwzNDQgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworCitVU0FHRSA9ICIiIlwKK3B5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQorcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCisiIiIKKworREVTQ1JJUFRJT04gPSAiIiJcCitSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCisKK0lmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCit0aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCit0aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCisKK0ZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZworY29tbWFuZCBsaW5lOgorCitweXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KKyIiIgorCitFUElMT0cgPSAiIiJcCitBZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgorCistciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCitpbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQordGVzdCBvcmRlcnMuCisKKy1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCitvciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKK3RoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKK1B5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCitvdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCit0aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgorV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKK2lzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCitkb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bworY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KKworLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAorbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KK1RoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKK3JlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKK3RoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgorCistZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQorb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCitsaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgord2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KKworLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KK2xlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCitGcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KKworLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bworc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAorYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCit0ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgorb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCityZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKKyJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCisKKy1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKK3R5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KKzIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCit0ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCitzZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCit3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQordGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKK3Nob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91CitzaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKK3RoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Cit0YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKK2xpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKK3RvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKK2dlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgorCistdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAorc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgorVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKK3Jlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKKworICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCisKKyAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCisKKyAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgorICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgorICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCisKKyAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCisgICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KKworICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQorICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQorICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgorCisgICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yaworICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCisKKyAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAorICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCisKKyAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KKworICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KKworICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KKworICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KKworVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKK2V4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKK29wdGlvbiAnLXVhbGwsLWd1aScuCisiIiIKKworCitSRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCisKK2NsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQorCisKK2RlZiBfY3JlYXRlX3BhcnNlcigpOgorICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgorICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KKyAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQorCisgICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KKyAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KKyAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJworCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQorICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tbGlzdC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgd3JpdGUgdGhlIG5hbWUgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBleGVjdXRlIHRoZW0iKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wZ28nLCBkZXN0PSdwZ28nLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdlbmFibGUgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIHRyYWluaW5nJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3MnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorCisgICAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgorICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKKyAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKKworCitkZWYgaHVudHJsZWFrcyhzdHJpbmcpOgorICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQorICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0CisgICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKKyAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCisKKworZGVmIHJlc291cmNlc19saXN0KHN0cmluZyk6CisgICAgdSA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KCcsJyldCisgICAgZm9yIHIgaW4gdToKKyAgICAgICAgaWYgciA9PSAnYWxsJyBvciByID09ICdub25lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgIGlmIHIgbm90IGluIFJFU09VUkNFX05BTUVTOgorICAgICAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoJ2ludmFsaWQgcmVzb3VyY2U6ICcgKyByKQorICAgIHJldHVybiB1CisKKworZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKKyAgICAjIERlZmF1bHRzCisgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCisgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKKyAgICAgICAgc2V0YXR0cihucywgaywgdikKKyAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQorCisgICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQorCisgICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLmZhaWxmYXN0IGFuZCBub3QgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XIikKKyAgICBpZiBucy5wZ28gYW5kIChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UyIG9yIG5zLnZlcmJvc2UzKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItLXBnby8tdiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgaWYgbnMubm93aW5kb3dzOgorICAgICAgICBwcmludCgiV2FybmluZzogdGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICAgICAgICAgIlVzZSAtdnYgdG8gZGlzcGxheSBhc3NlcnRpb25zIGluIHN0ZGVyci4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBpZiBucy5xdWlldDoKKyAgICAgICAgbnMudmVyYm9zZSA9IDAKKyAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6CisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6CisgICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAorICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQorICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKKyAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKKyAgICBpZiBucy51c2U6CisgICAgICAgIGZvciBhIGluIG5zLnVzZToKKyAgICAgICAgICAgIGZvciByIGluIGE6CisgICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKKyAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6CisgICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KKyAgICAgICAgICAgICAgICBpZiByZW1vdmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCisgICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQorICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgorICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCisKKyAgICByZXR1cm4gbnMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzg4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9tYWluLnB5CkBAIC0wLDAgKzEsNDU1IEBACitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LmNtZGxpbmUgaW1wb3J0IF9wYXJzZV9hcmdzCitmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdCBpbXBvcnQgKAorICAgIGZpbmR0ZXN0cywgcnVudGVzdCwKKyAgICBTVERURVNUUywgTk9UVEVTVFMsIFBBU1NFRCwgRkFJTEVELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVELAorICAgIElOVEVSUlVQVEVELCBDSElMRF9FUlJPUikKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5zZXR1cCBpbXBvcnQgc2V0dXBfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCBnYworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdjID0gTm9uZQorCisKKyMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKKyMgdG8ga2VlcCB0aGUgdGVzdCBmaWxlcyBpbiBhIHN1YmZvbGRlci4gIFRoaXMgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKKyMgZmlsZXMgdXNpbmcgdGhlICJtYWtlIGRpc3RjbGVhbiIgY29tbWFuZC4KK2lmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICBURU1QRElSID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdidWlsZCcpCitlbHNlOgorICAgIFRFTVBESVIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKK1RFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoVEVNUERJUikKKworCitjbGFzcyBSZWdydGVzdDoKKyAgICAiIiJFeGVjdXRlIGEgdGVzdCBzdWl0ZS4KKworICAgIFRoaXMgYWxzbyBwYXJzZXMgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIG1vZGlmaWVzIGl0cyBiZWhhdmlvcgorICAgIGFjY29yZGluZ2x5LgorCisgICAgdGVzdHMgLS0gYSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0ZXN0IG5hbWVzIChvcHRpb25hbCkKKyAgICB0ZXN0ZGlyIC0tIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGVzdHMgKG9wdGlvbmFsKQorCisgICAgVXNlcnMgb3RoZXIgdGhhbiB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2lsbCBjZXJ0YWlubHkgd2FudCB0bworICAgIHNwZWNpZnkgdGVzdGRpcjsgaWYgaXQncyBvbWl0dGVkLCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCisgICAgUHl0aG9uIHRlc3Qgc3VpdGUgaXMgc2VhcmNoZWQgZm9yLgorCisgICAgSWYgdGhlIHRlc3RzIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSB0ZXN0cyBsaXN0ZWQgb24gdGhlCisgICAgY29tbWFuZC1saW5lIHdpbGwgYmUgdXNlZC4gIElmIHRoYXQncyBlbXB0eSwgdG9vLCB0aGVuIGFsbCAqLnB5CisgICAgZmlsZXMgYmVnaW5uaW5nIHdpdGggdGVzdF8gd2lsbCBiZSB1c2VkLgorCisgICAgVGhlIG90aGVyIGRlZmF1bHQgYXJndW1lbnRzICh2ZXJib3NlLCBxdWlldCwgZXhjbHVkZSwKKyAgICBzaW5nbGUsIHJhbmRvbWl6ZSwgZmluZGxlYWtzLCB1c2VfcmVzb3VyY2VzLCB0cmFjZSwgY292ZXJkaXIsCisgICAgcHJpbnRfc2xvdywgYW5kIHJhbmRvbV9zZWVkKSBhbGxvdyBwcm9ncmFtbWVycyBjYWxsaW5nIG1haW4oKQorICAgIGRpcmVjdGx5IHRvIHNldCB0aGUgdmFsdWVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgc2V0IGJ5IGZsYWdzCisgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgTmFtZXNwYWNlIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zCisgICAgICAgIHNlbGYubnMgPSBOb25lCisKKyAgICAgICAgIyB0ZXN0cworICAgICAgICBzZWxmLnRlc3RzID0gW10KKyAgICAgICAgc2VsZi5zZWxlY3RlZCA9IFtdCisKKyAgICAgICAgIyB0ZXN0IHJlc3VsdHMKKyAgICAgICAgc2VsZi5nb29kID0gW10KKyAgICAgICAgc2VsZi5iYWQgPSBbXQorICAgICAgICBzZWxmLnNraXBwZWQgPSBbXQorICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMgPSBbXQorICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQgPSBbXQorICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKKworICAgICAgICAjIHVzZWQgYnkgLS1zbG93CisgICAgICAgIHNlbGYudGVzdF90aW1lcyA9IFtdCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tY292ZXJhZ2UsIHRyYWNlLlRyYWNlIGluc3RhbmNlCisgICAgICAgIHNlbGYudHJhY2VyID0gTm9uZQorCisgICAgICAgICMgdXNlZCBieSAtLWZpbmRsZWFrcywgc3RvcmUgZm9yIGdjLmdhcmJhZ2UKKyAgICAgICAgc2VsZi5mb3VuZF9nYXJiYWdlID0gW10KKworICAgICAgICAjIHVzZWQgdG8gZGlzcGxheSB0aGUgcHJvZ3Jlc3MgYmFyICJbIDMvMTAwXSIKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMQorCisgICAgICAgICMgdXNlZCBieSAtLXNpbmdsZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6CisgICAgICAgICAgICBzZWxmLnRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBzZWxmLmdvb2QuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgorICAgICAgICAgICAgc2VsZi5iYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNlbGYuc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgZGlzcGxheV9wcm9ncmVzcyhzZWxmLCB0ZXN0X2luZGV4LCB0ZXN0KToKKyAgICAgICAgaWYgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJhZCBhbmQgbm90IHNlbGYubnMucGdvOgorICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9XSB7NH0iCisgICAgICAgIHByaW50KGZtdC5mb3JtYXQoc2VsZi50ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudCwgbGVuKHNlbGYuYmFkKSwgdGVzdCksCisgICAgICAgICAgICAgIGZsdXNoPVRydWUpCisKKyAgICBkZWYgcGFyc2VfYXJncyhzZWxmLCBrd2FyZ3MpOgorICAgICAgICBucyA9IF9wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgKiprd2FyZ3MpCisKKyAgICAgICAgaWYgbnMudGltZW91dCBhbmQgbm90IGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBUaGUgdGltZW91dCBvcHRpb24gcmVxdWlyZXMgIgorICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlciIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIG5zLnRpbWVvdXQgPSBOb25lCisKKyAgICAgICAgaWYgbnMudGhyZXNob2xkIGlzIG5vdCBOb25lIGFuZCBnYyBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgaWdub3JlIC0tdGhyZXNob2xkLicsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIG5zLnRocmVzaG9sZCA9IE5vbmUKKworICAgICAgICBpZiBucy5maW5kbGVha3M6CisgICAgICAgICAgICBpZiBnYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byByZXBvcnQgZ2FyYmFnZSB0aGF0IGlzIG5vdAorICAgICAgICAgICAgICAgICMgZnJlZWFibGUgYnkgcmVmZXJlbmNlIGNvdW50aW5nIGFsb25lLiAgQnkgZGVmYXVsdCBvbmx5CisgICAgICAgICAgICAgICAgIyBnYXJiYWdlIHRoYXQgaXMgbm90IGNvbGxlY3RhYmxlIGJ5IHRoZSBHQyBpcyByZXBvcnRlZC4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgI2djLnNldF9kZWJ1ZyhnYy5ERUJVR19TQVZFQUxMKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgnTm8gR0MgYXZhaWxhYmxlLCBkaXNhYmxpbmcgLS1maW5kbGVha3MnLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICBucy5maW5kbGVha3MgPSBGYWxzZQorCisgICAgICAgICMgU3RyaXAgLnB5IGV4dGVuc2lvbnMuCisgICAgICAgIHJlbW92ZXB5KG5zLmFyZ3MpCisKKyAgICAgICAgcmV0dXJuIG5zCisKKyAgICBkZWYgZmluZF90ZXN0cyhzZWxmLCB0ZXN0cyk6CisgICAgICAgIHNlbGYudGVzdHMgPSB0ZXN0cworCisgICAgICAgIGlmIHNlbGYubnMuc2luZ2xlOgorICAgICAgICAgICAgc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAncHluZXh0dGVzdCcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUsICdyJykgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdHMgPSBbbmV4dF90ZXN0XQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHNlbGYubnMuZnJvbWZpbGU6CisgICAgICAgICAgICBzZWxmLnRlc3RzID0gW10KKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc2VsZi5ucy5mcm9tZmlsZSkpIGFzIGZwOgorICAgICAgICAgICAgICAgIGNvdW50X3BhdCA9IHJlLmNvbXBpbGUocidcW1xzKlxkKy9ccypcZCtcXScpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZnA6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBjb3VudF9wYXQuc3ViKCcnLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQorICAgICAgICAgICAgICAgICAgICBpZiBndXRzIGFuZCBub3QgZ3V0c1swXS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RzLmV4dGVuZChndXRzKQorCisgICAgICAgIHJlbW92ZXB5KHNlbGYudGVzdHMpCisKKyAgICAgICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQorICAgICAgICBub3R0ZXN0cyA9IE5PVFRFU1RTLmNvcHkoKQorICAgICAgICBpZiBzZWxmLm5zLmV4Y2x1ZGU6CisgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYubnMuYXJnczoKKyAgICAgICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCisgICAgICAgICAgICAgICAgbm90dGVzdHMuYWRkKGFyZykKKyAgICAgICAgICAgIHNlbGYubnMuYXJncyA9IFtdCisKKyAgICAgICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KKyAgICAgICAgIyBkb24ndCBhZGQgZGVmYXVsdCB0ZXN0cyB0byBiZSBleGVjdXRlZCBvciBza2lwcGVkIChwYXNzIGVtcHR5IHZhbHVlcykKKyAgICAgICAgaWYgc2VsZi5ucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBsaXN0KCksIHNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCisKKyAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYudGVzdHMgb3Igc2VsZi5ucy5hcmdzIG9yIGFsbHRlc3RzCisgICAgICAgIGlmIHNlbGYubnMuc2luZ2xlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYuc2VsZWN0ZWRbOjFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zID0gYWxsdGVzdHMuaW5kZXgoc2VsZi5zZWxlY3RlZFswXSkKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1twb3MgKyAxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgorICAgICAgICBpZiBzZWxmLm5zLnN0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnNlbGVjdGVkWzpzZWxmLnNlbGVjdGVkLmluZGV4KHNlbGYubnMuc3RhcnQpXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiCisgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLm5zLnN0YXJ0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5yYW5kb21pemU6CisgICAgICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5ucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCisgICAgICAgICAgICByYW5kb20uc2VlZChzZWxmLm5zLnJhbmRvbV9zZWVkKQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZi5zZWxlY3RlZCkKKworICAgIGRlZiBsaXN0X3Rlc3RzKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgcHJpbnQobmFtZSkKKworICAgIGRlZiByZXJ1bl9mYWlsZWRfdGVzdHMoc2VsZik6CisgICAgICAgIHNlbGYubnMudmVyYm9zZSA9IFRydWUKKyAgICAgICAgc2VsZi5ucy5mYWlsZmFzdCA9IEZhbHNlCisgICAgICAgIHNlbGYubnMudmVyYm9zZTMgPSBGYWxzZQorICAgICAgICBzZWxmLm5zLm1hdGNoX3Rlc3RzID0gTm9uZQorCisgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUiKQorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLmJhZFs6XToKKyAgICAgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICAgICAgICAgIG9rID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIHNlcGFyYXRlIGZyb20gdGhlIF5DCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG9rWzBdIGluIHtQQVNTRUQsIEVOVl9DSEFOR0VELCBTS0lQUEVELCBSRVNPVVJDRV9ERU5JRUR9OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJhZC5yZW1vdmUodGVzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFkOgorICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICd0ZXN0JyksICJmYWlsZWQgYWdhaW46IikKKyAgICAgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5iYWQpCisKKyAgICBkZWYgZGlzcGxheV9yZXN1bHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQworICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoIlRlc3Qgc3VpdGUgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIFNJR0lOVC4iKQorICAgICAgICAgICAgZXhlY3V0ZWQgPSBzZXQoc2VsZi5nb29kKSB8IHNldChzZWxmLmJhZCkgfCBzZXQoc2VsZi5za2lwcGVkKQorICAgICAgICAgICAgb21pdHRlZCA9IHNldChzZWxmLnNlbGVjdGVkKSAtIGV4ZWN1dGVkCisgICAgICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qob21pdHRlZCkKKworICAgICAgICAjIElmIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIFBHTyB0aGVuIG5vIG9uZSBjYXJlcyBhYm91dAorICAgICAgICAjIHJlc3VsdHMuCisgICAgICAgIGlmIHNlbGYubnMucGdvOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5nb29kIGFuZCBub3Qgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIGlmIChub3Qgc2VsZi5iYWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuc2tpcHBlZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5pbnRlcnJ1cHRlZAorICAgICAgICAgICAgICAgIGFuZCBsZW4oc2VsZi5nb29kKSA+IDEpOgorICAgICAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuZ29vZCksICJ0ZXN0IiksICJPSy4iKQorCisgICAgICAgIGlmIHNlbGYubnMucHJpbnRfc2xvdzoKKyAgICAgICAgICAgIHNlbGYudGVzdF90aW1lcy5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCisgICAgICAgICAgICBmb3IgdGltZSwgdGVzdCBpbiBzZWxmLnRlc3RfdGltZXNbOjEwXToKKyAgICAgICAgICAgICAgICBwcmludCgiJXM6ICUuMWZzIiAlICh0ZXN0LCB0aW1lKSkKKworICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgICAgICBpZiBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQ6CisgICAgICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgY291bnQobGVuKHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCkKKworICAgICAgICBpZiBzZWxmLnNraXBwZWQgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5za2lwcGVkKQorCisgICAgZGVmIHJ1bl90ZXN0c19zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5zLnRyYWNlOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlCisgICAgICAgICAgICBzZWxmLnRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQorCisgICAgICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQorCisgICAgICAgIGZvciB0ZXN0X2luZGV4LCB0ZXN0IGluIGVudW1lcmF0ZShzZWxmLnRlc3RzLCAxKToKKyAgICAgICAgICAgIHNlbGYuZGlzcGxheV9wcm9ncmVzcyh0ZXN0X2luZGV4LCB0ZXN0KQorICAgICAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSB0cmFjaW5nIGNvZGUgY292ZXJhZ2UsIHRoZW4gd2UgZG9uJ3QgZXhpdCB3aXRoIHN0YXR1cworICAgICAgICAgICAgICAgICMgaWYgb24gYSBmYWxzZSByZXR1cm4gdmFsdWUgZnJvbSBtYWluLgorICAgICAgICAgICAgICAgIGNtZCA9ICgncmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KTsgJworICAgICAgICAgICAgICAgICAgICAgICAnc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpJykKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlci5ydW5jdHgoY21kLCBnbG9iYWxzPWdsb2JhbHMoKSwgbG9jYWxzPXZhcnMoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KHNlbGYubnMsIHRlc3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIChJTlRFUlJVUFRFRCwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCisKKyAgICAgICAgICAgIGlmIHNlbGYubnMuZmluZGxlYWtzOgorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGlmIGdjLmdhcmJhZ2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiB0ZXN0IGNyZWF0ZWQiLCBsZW4oZ2MuZ2FyYmFnZSksIGVuZD0nICcpCisgICAgICAgICAgICAgICAgICAgIHByaW50KCJ1bmNvbGxlY3RhYmxlIG9iamVjdChzKS4iKQorICAgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHVuY29sbGVjdGFibGUgb2JqZWN0cyBzb21ld2hlcmUgc28gd2UgZG9uJ3Qgc2VlCisgICAgICAgICAgICAgICAgICAgICMgdGhlbSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvdW5kX2dhcmJhZ2UuZXh0ZW5kKGdjLmdhcmJhZ2UpCisgICAgICAgICAgICAgICAgICAgIGRlbCBnYy5nYXJiYWdlWzpdCisKKyAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKKworICAgIGRlZiBfdGVzdF9mb3JldmVyKHNlbGYsIHRlc3RzKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgIHlpZWxkIHRlc3QKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgorICAgICAgICAjIEZvciBhIHBhcnRpYWwgcnVuLCB3ZSBkbyBub3QgbmVlZCB0byBjbHV0dGVyIHRoZSBvdXRwdXQuCisgICAgICAgIGlmIChzZWxmLm5zLnZlcmJvc2UKKyAgICAgICAgICAgIG9yIHNlbGYubnMuaGVhZGVyCisgICAgICAgICAgICBvciBub3QgKHNlbGYubnMucGdvIG9yIHNlbGYubnMucXVpZXQgb3Igc2VsZi5ucy5zaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi50ZXN0cyBvciBzZWxmLm5zLmFyZ3MpKToKKyAgICAgICAgICAgICMgUHJpbnQgYmFzaWMgcGxhdGZvcm0gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHByaW50KCI9PSIsIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLCAqc3lzLnZlcnNpb24uc3BsaXQoKSkKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLWVuZGlhbiIgJSBzeXMuYnl0ZW9yZGVyKQorICAgICAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAiNjRiaXQiIGlmIHN5cy5tYXhzaXplID4gMioqMzIgZWxzZSAiMzJiaXQiKQorICAgICAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgICAgIHByaW50KCJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzKQorCisgICAgICAgIGlmIHNlbGYubnMucmFuZG9taXplOgorICAgICAgICAgICAgcHJpbnQoIlVzaW5nIHJhbmRvbSBzZWVkIiwgc2VsZi5ucy5yYW5kb21fc2VlZCkKKworICAgICAgICBpZiBzZWxmLm5zLmZvcmV2ZXI6CisgICAgICAgICAgICBzZWxmLnRlc3RzID0gc2VsZi5fdGVzdF9mb3JldmVyKGxpc3Qoc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnQgPSAnJworICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IGl0ZXIoc2VsZi5zZWxlY3RlZCkKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnRfd2lkdGggPSBsZW4oc2VsZi50ZXN0X2NvdW50KSAtIDEKKworICAgICAgICBpZiBzZWxmLm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfbXVsdGlwcm9jZXNzCisgICAgICAgICAgICBydW5fdGVzdHNfbXVsdGlwcm9jZXNzKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0c19zZXF1ZW50aWFsKCkKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZToKKyAgICAgICAgICAgIGlmIHNlbGYubmV4dF9zaW5nbGVfdGVzdDoKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5uZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICByID0gc2VsZi50cmFjZXIucmVzdWx0cygpCisgICAgICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmRpcj1zZWxmLm5zLmNvdmVyZGlyKQorCisgICAgICAgIGlmIHNlbGYubnMucnVubGVha3M6CisgICAgICAgICAgICBvcy5zeXN0ZW0oImxlYWtzICVkIiAlIG9zLmdldHBpZCgpKQorCisgICAgZGVmIG1haW4oc2VsZiwgdGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLm5zID0gc2VsZi5wYXJzZV9hcmdzKGt3YXJncykKKworICAgICAgICBpZiBzZWxmLm5zLnNsYXZlYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfc2xhdmUKKyAgICAgICAgICAgIHJ1bl90ZXN0c19zbGF2ZShzZWxmLm5zLnNsYXZlYXJncykKKworICAgICAgICBpZiBzZWxmLm5zLndhaXQ6CisgICAgICAgICAgICBpbnB1dCgiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4uLiIpCisKKyAgICAgICAgc2V0dXBfdGVzdHMoc2VsZi5ucykKKworICAgICAgICBzZWxmLmZpbmRfdGVzdHModGVzdHMpCisKKyAgICAgICAgaWYgc2VsZi5ucy5saXN0X3Rlc3RzOgorICAgICAgICAgICAgc2VsZi5saXN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorICAgICAgICBzZWxmLmRpc3BsYXlfcmVzdWx0KCkKKworICAgICAgICBpZiBzZWxmLm5zLnZlcmJvc2UyIGFuZCBzZWxmLmJhZDoKKyAgICAgICAgICAgIHNlbGYucmVydW5fZmFpbGVkX3Rlc3RzKCkKKworICAgICAgICBzZWxmLmZpbmFsaXplKCkKKyAgICAgICAgc3lzLmV4aXQobGVuKHNlbGYuYmFkKSA+IDAgb3Igc2VsZi5pbnRlcnJ1cHRlZCkKKworCitkZWYgcmVtb3ZlcHkobmFtZXMpOgorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBleHQgPT0gJy5weSc6CisgICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKKworCitkZWYgY291bnQobiwgd29yZCk6CisgICAgaWYgbiA9PSAxOgorICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQorCisKK2RlZiBwcmludGxpc3QoeCwgd2lkdGg9NzAsIGluZGVudD00KToKKyAgICAiIiJQcmludCB0aGUgZWxlbWVudHMgb2YgaXRlcmFibGUgeCB0byBzdGRvdXQuCisKKyAgICBPcHRpb25hbCBhcmcgd2lkdGggKGRlZmF1bHQgNzApIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorICAgIE9wdGlvbmFsIGFyZyBpbmRlbnQgKGRlZmF1bHQgNCkgaXMgdGhlIG51bWJlciBvZiBibGFua3Mgd2l0aCB3aGljaCB0bworICAgIGJlZ2luIGVhY2ggbGluZS4KKyAgICAiIiIKKworICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAorICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKKyAgICBwcmludCh0ZXh0d3JhcC5maWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCisKKworZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgIFJlZ3J0ZXN0KCkubWFpbih0ZXN0cz10ZXN0cywgKiprd2FyZ3MpCisKKworZGVmIG1haW5faW5fdGVtcF9jd2QoKToKKyAgICAiIiJSdW4gbWFpbigpIGluIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5LiIiIgorICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKKyAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKKyAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCisgICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCisgICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKKyAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKKworICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCisgICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgorICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcworICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KKyAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgorICAgICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3JlZmxlYWsucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGM0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5CkBAIC0wLDAgKzEsMjAyIEBACitpbXBvcnQgZXJybm8KK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gaW5zcGVjdCBpbXBvcnQgaXNhYnN0cmFjdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKwordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICBNQVhGRCA9IDI1NgorCisKK2RlZiBmZF9jb3VudCgpOgorICAgICIiIkNvdW50IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlIGRlc2NyaXB0b3JzIiIiCisgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCdsaW51eCcsICdmcmVlYnNkJykpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoIi9wcm9jL3NlbGYvZmQiKQorICAgICAgICAgICAgcmV0dXJuIGxlbihuYW1lcykKKyAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgY291bnQgPSAwCisgICAgZm9yIGZkIGluIHJhbmdlKE1BWEZEKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQcmVmZXIgZHVwKCkgb3ZlciBmc3RhdCgpLiBmc3RhdCgpIGNhbiByZXF1aXJlIGlucHV0L291dHB1dAorICAgICAgICAgICAgIyB3aGVyZWFzIGR1cCgpIGRvZXNuJ3QuCisgICAgICAgICAgICBmZDIgPSBvcy5kdXAoZmQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVCQURGOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5jbG9zZShmZDIpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKKyAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgorICAgICIiIgorICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCisgICAgaW1wb3J0IGNvcHlyZWcKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCisKKyAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCisKKyAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KKyAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCisgICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCisgICAgYWJjcyA9IHt9CisgICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKKyAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKKyAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQorCisgICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcworICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQorICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCisgICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKKyAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorICAgIGZkX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisKKyAgICBwcmludCgiYmVnaW5uaW5nIiwgcmVwY291bnQsICJyZXBldGl0aW9ucyIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICBwcmludCgoIjEyMzQ1Njc4OTAiKihyZXBjb3VudC8vMTAgKyAxKSlbOnJlcGNvdW50XSwgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgIGZsdXNoPVRydWUpCisgICAgIyBpbml0aWFsaXplIHZhcmlhYmxlcyB0byBtYWtlIHB5Zmxha2VzIHF1aWV0CisgICAgcmNfYmVmb3JlID0gYWxsb2NfYmVmb3JlID0gZmRfYmVmb3JlID0gMAorICAgIGZvciBpIGluIHJhbmdlKHJlcGNvdW50KToKKyAgICAgICAgaW5kaXJlY3RfdGVzdCgpCisgICAgICAgIGFsbG9jX2FmdGVyLCByY19hZnRlciwgZmRfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJjcykKKyAgICAgICAgcHJpbnQoJy4nLCBlbmQ9JycsIGZsdXNoPVRydWUpCisgICAgICAgIGlmIGkgPj0gbndhcm11cDoKKyAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCisgICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQorICAgICAgICAgICAgZmRfZGVsdGFzW2ldID0gZmRfYWZ0ZXIgLSBmZF9iZWZvcmUKKyAgICAgICAgYWxsb2NfYmVmb3JlID0gYWxsb2NfYWZ0ZXIKKyAgICAgICAgcmNfYmVmb3JlID0gcmNfYWZ0ZXIKKyAgICAgICAgZmRfYmVmb3JlID0gZmRfYWZ0ZXIKKyAgICBwcmludChmaWxlPXN5cy5zdGRlcnIpCisgICAgIyBUaGVzZSBjaGVja2VycyByZXR1cm4gRmFsc2Ugb24gc3VjY2VzcywgVHJ1ZSBvbiBmYWlsdXJlCisgICAgZGVmIGNoZWNrX3JjX2RlbHRhcyhkZWx0YXMpOgorICAgICAgICByZXR1cm4gYW55KGRlbHRhcykKKyAgICBkZWYgY2hlY2tfYWxsb2NfZGVsdGFzKGRlbHRhcyk6CisgICAgICAgICMgQXQgbGVhc3QgMS8zcmQgb2YgMHMKKyAgICAgICAgaWYgMyAqIGRlbHRhcy5jb3VudCgwKSA8IGxlbihkZWx0YXMpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBOb3RoaW5nIGVsc2UgdGhhbiAxcywgMHMgYW5kIC0xcworICAgICAgICBpZiBub3Qgc2V0KGRlbHRhcykgPD0gezEsMCwtMX06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBmYWlsZWQgPSBGYWxzZQorICAgIGZvciBkZWx0YXMsIGl0ZW1fbmFtZSwgY2hlY2tlciBpbiBbCisgICAgICAgIChyY19kZWx0YXMsICdyZWZlcmVuY2VzJywgY2hlY2tfcmNfZGVsdGFzKSwKKyAgICAgICAgKGFsbG9jX2RlbHRhcywgJ21lbW9yeSBibG9ja3MnLCBjaGVja19hbGxvY19kZWx0YXMpLAorICAgICAgICAoZmRfZGVsdGFzLCAnZmlsZSBkZXNjcmlwdG9ycycsIGNoZWNrX3JjX2RlbHRhcyldOgorICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6CisgICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAorICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCisgICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIHdpdGggb3BlbihmbmFtZSwgImEiKSBhcyByZWZyZXA6CisgICAgICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXJlZnJlcCkKKyAgICAgICAgICAgICAgICByZWZyZXAuZmx1c2goKQorICAgICAgICAgICAgZmFpbGVkID0gVHJ1ZQorICAgIHJldHVybiBmYWlsZWQKKworCitkZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6CisgICAgaW1wb3J0IGdjLCBjb3B5cmVnCisgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCisgICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAorICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYworICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCisgICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0CisKKyAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCisgICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6CisgICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KKworICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KKyAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKKyAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKKyAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKKyAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAorICAgIGVsc2U6CisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQorCisgICAgIyBjbGVhciB0eXBlIGNhY2hlCisgICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKKworICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgorICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106CisgICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKKyAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKKworICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCisgICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCisgICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKKyAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKKworICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KKyAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKKyAgICByZS5wdXJnZSgpCisgICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCisgICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKKyAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKKyAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQorICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKKyAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQorICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKKworICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCisgICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCisgICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAorICAgIGdjLmNvbGxlY3QoKQorICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpLCBmZF9jb3VudCgpCisKKworZGVmIHdhcm1fY2FjaGVzKCk6CisgICAgIyBjaGFyIGNhY2hlCisgICAgcyA9IGJ5dGVzKHJhbmdlKDI1NikpCisgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgc1tpOmkrMV0KKyAgICAjIHVuaWNvZGUgY2FjaGUKKyAgICBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildCisgICAgIyBpbnQgY2FjaGUKKyAgICBsaXN0KHJhbmdlKC01LCAyNTcpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzZjIzYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkKQEAgLTAsMCArMSwyNDIgQEAKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBpbXBvcnRsaWIKK2ltcG9ydCBpbworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5yZWZsZWFrIGltcG9ydCBkYXNoX1IKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5zYXZlX2VudiBpbXBvcnQgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudAorCisKKyMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgorUEFTU0VEID0gMQorRkFJTEVEID0gMAorRU5WX0NIQU5HRUQgPSAtMQorU0tJUFBFRCA9IC0yCitSRVNPVVJDRV9ERU5JRUQgPSAtMworSU5URVJSVVBURUQgPSAtNAorQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCisKKworIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKKyMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQorU1REVEVTVFMgPSBbCisgICAgJ3Rlc3RfZ3JhbW1hcicsCisgICAgJ3Rlc3Rfb3Bjb2RlcycsCisgICAgJ3Rlc3RfZGljdCcsCisgICAgJ3Rlc3RfYnVpbHRpbicsCisgICAgJ3Rlc3RfZXhjZXB0aW9ucycsCisgICAgJ3Rlc3RfdHlwZXMnLAorICAgICd0ZXN0X3VuaXR0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0MicsCisgICAgJ3Rlc3Rfc3VwcG9ydCcKK10KKworIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKK05PVFRFU1RTID0gc2V0KCkKKworCitkZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKKyAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKKyAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKKyAgICB0ZXN0cyA9IFtdCisgICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBtb2RbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCBpbiAoIi5weSIsICIiKSBhbmQgbW9kIG5vdCBpbiBvdGhlcnM6CisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kKQorICAgIHJldHVybiBzdGR0ZXN0cyArIHNvcnRlZCh0ZXN0cykKKworCitkZWYgcnVudGVzdChucywgdGVzdCk6CisgICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCisKKyAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0CisgICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCisgICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCisgICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKKyAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCisgICAgb3V0cHV0X29uX2ZhaWx1cmUgLS0gaWYgdHJ1ZSwgZGlzcGxheSB0ZXN0IG91dHB1dCBvbiBmYWlsdXJlCisgICAgdGltZW91dCAtLSBkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzIG1vcmUgdGhhbgorICAgICAgICAgICAgICAgdGltZW91dCBzZWNvbmRzCisgICAgZmFpbGZhc3QsIG1hdGNoX3Rlc3RzIC0tIFNlZSByZWdydGVzdCBjb21tYW5kLWxpbmUgZmxhZ3MgZm9yIHRoZXNlLgorICAgIHBnbyAtLSBpZiB0cnVlLCBzdXBwcmVzcyBhbnkgaW5mbyBpcnJlbGV2YW50IHRvIGEgZ2VuZXJhdGluZyBhIFBHTyBidWlsZAorCisgICAgUmV0dXJucyB0aGUgdHVwbGUgcmVzdWx0LCB0ZXN0X3RpbWUsIHdoZXJlIHJlc3VsdCBpcyBvbmUgb2YgdGhlIGNvbnN0YW50czoKKyAgICAgICAgSU5URVJSVVBURUQgICAgICBLZXlib2FyZEludGVycnVwdCB3aGVuIHJ1biB1bmRlciAtagorICAgICAgICBSRVNPVVJDRV9ERU5JRUQgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAorICAgICAgICBTS0lQUEVEICAgICAgICAgIHRlc3Qgc2tpcHBlZCBmb3Igc29tZSBvdGhlciByZWFzb24KKyAgICAgICAgRU5WX0NIQU5HRUQgICAgICB0ZXN0IGZhaWxlZCBiZWNhdXNlIGl0IGNoYW5nZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAorICAgICAgICBGQUlMRUQgICAgICAgICAgIHRlc3QgZmFpbGVkCisgICAgICAgIFBBU1NFRCAgICAgICAgICAgdGVzdCBwYXNzZWQKKyAgICAiIiIKKworICAgIHZlcmJvc2UgPSBucy52ZXJib3NlCisgICAgcXVpZXQgPSBucy5xdWlldAorICAgIGh1bnRybGVha3MgPSBucy5odW50cmxlYWtzCisgICAgb3V0cHV0X29uX2ZhaWx1cmUgPSBucy52ZXJib3NlMworICAgIGZhaWxmYXN0ID0gbnMuZmFpbGZhc3QKKyAgICBtYXRjaF90ZXN0cyA9IG5zLm1hdGNoX3Rlc3RzCisgICAgdGltZW91dCA9IG5zLnRpbWVvdXQKKyAgICBwZ28gPSBucy5wZ28KKworICAgIHVzZV90aW1lb3V0ID0gKHRpbWVvdXQgaXMgbm90IE5vbmUpCisgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcih0aW1lb3V0LCBleGl0PVRydWUpCisgICAgdHJ5OgorICAgICAgICBzdXBwb3J0Lm1hdGNoX3Rlc3RzID0gbWF0Y2hfdGVzdHMKKyAgICAgICAgaWYgZmFpbGZhc3Q6CisgICAgICAgICAgICBzdXBwb3J0LmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICBpZiBvdXRwdXRfb25fZmFpbHVyZToKKyAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IFRydWUKKworICAgICAgICAgICAgIyBSZXVzZSB0aGUgc2FtZSBpbnN0YW5jZSB0byBhbGwgY2FsbHMgdG8gcnVudGVzdCgpLiBTb21lCisgICAgICAgICAgICAjIHRlc3RzIGtlZXAgYSByZWZlcmVuY2UgdG8gc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyCisgICAgICAgICAgICAjIChlZy4gdGVzdF9hcmdwYXJzZSkuCisgICAgICAgICAgICBpZiBydW50ZXN0LnN0cmluZ2lvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gaW8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHJ1bnRlc3Quc3RyaW5naW8gPSBzdHJlYW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gcnVudGVzdC5zdHJpbmdpbworICAgICAgICAgICAgICAgIHN0cmVhbS5zZWVrKDApCisgICAgICAgICAgICAgICAgc3RyZWFtLnRydW5jYXRlKCkKKworICAgICAgICAgICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBvcmlnX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3RyZWFtCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHN0cmVhbQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9RmFsc2UsIHBnbz1wZ28pCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IEZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIud3JpdGUob3V0cHV0KQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvcmlnX3N0ZG91dAorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBvcmlnX3N0ZGVycgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VwcG9ydC52ZXJib3NlID0gdmVyYm9zZSAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKKyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1ub3QgdmVyYm9zZSwgcGdvPXBnbykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCisgICAgICAgIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdCwgdmVyYm9zZSkKK3J1bnRlc3Quc3RyaW5naW8gPSBOb25lCisKKworZGVmIHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsCisgICAgICAgICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCBkaXNwbGF5X2ZhaWx1cmU9VHJ1ZSwgKiwgcGdvPUZhbHNlKToKKyAgICBzdXBwb3J0LnVubG9hZCh0ZXN0KQorCisgICAgdGVzdF90aW1lID0gMC4wCisgICAgcmVmbGVhayA9IEZhbHNlICAjIFRydWUgaWYgdGhlIHRlc3QgbGVha2VkIHJlZmVyZW5jZXMuCisgICAgdHJ5OgorICAgICAgICBpZiB0ZXN0LnN0YXJ0c3dpdGgoJ3Rlc3QuJyk6CisgICAgICAgICAgICBhYnN0ZXN0ID0gdGVzdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBbHdheXMgaW1wb3J0IGl0IGZyb20gdGhlIHRlc3QgcGFja2FnZQorICAgICAgICAgICAgYWJzdGVzdCA9ICd0ZXN0LicgKyB0ZXN0CisgICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwgcGdvPXBnbykgYXMgZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHRoZV9tb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShhYnN0ZXN0KQorICAgICAgICAgICAgIyBJZiB0aGUgdGVzdCBoYXMgYSB0ZXN0X21haW4sIHRoYXQgd2lsbCBydW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAjIHRlc3RzLiAgSWYgbm90LCB1c2Ugbm9ybWFsIHVuaXR0ZXN0IHRlc3QgbG9hZGluZy4KKyAgICAgICAgICAgIHRlc3RfcnVubmVyID0gZ2V0YXR0cih0aGVfbW9kdWxlLCAidGVzdF9tYWluIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHRlc3RfcnVubmVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVubmVyKCk6CisgICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoZV9tb2R1bGUpCisgICAgICAgICAgICAgICAgICAgIGZvciBlcnJvciBpbiBsb2FkZXIuZXJyb3JzOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZXJyb3IsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGVzdHMiKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0cykKKyAgICAgICAgICAgIHRlc3RfcnVubmVyKCkKKyAgICAgICAgICAgIGlmIGh1bnRybGVha3M6CisgICAgICAgICAgICAgICAgcmVmbGVhayA9IGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCB0ZXN0X3J1bm5lciwgaHVudHJsZWFrcykKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQorICAgIGV4Y2VwdCBzdXBwb3J0LlJlc291cmNlRGVuaWVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IHF1aWV0IGFuZCBub3QgcGdvOgorICAgICAgICAgICAgcHJpbnQodGVzdCwgInNraXBwZWQgLS0iLCBtc2csIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBSRVNPVVJDRV9ERU5JRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgorICAgICAgICBpZiBub3QgcGdvOgorICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgIGZsdXNoPVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCIsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0OgorICAgICAgICBtc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisgICAgICAgIGlmIG5vdCBwZ286CisgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJjcmFzaGVkIC0tIiwgbXNnLCBmaWxlPXN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKKyAgICBlbHNlOgorICAgICAgICBpZiByZWZsZWFrOgorICAgICAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgICAgIGlmIGVudmlyb25tZW50LmNoYW5nZWQ6CisgICAgICAgICAgICByZXR1cm4gRU5WX0NIQU5HRUQsIHRlc3RfdGltZQorICAgICAgICByZXR1cm4gUEFTU0VELCB0ZXN0X3RpbWUKKworCitkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6CisgICAgaW1wb3J0IHNodXRpbAorICAgIGltcG9ydCBzdGF0CisgICAgaW1wb3J0IGdjCisKKyAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCisgICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0CisgICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgorICAgIGdjLmNvbGxlY3QoKQorCisgICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQorICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cworICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCisgICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQorICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKKyAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCisgICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKKyAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKKyAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6CisgICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQorICAgICAgICAgICAgbnVrZXIobmFtZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6CisgICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKKworCitkZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKKyAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkgb3Igb3MuY3VyZGlyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0X21wLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E3ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpAQCAtMCwwICsxLDIyNCBAQAoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHF1ZXVlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIk11bHRpcHJvY2VzcyBvcHRpb24gcmVxdWlyZXMgdGhyZWFkIHN1cHBvcnQiKQorICAgIHN5cy5leGl0KDIpCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCBydW50ZXN0LCBJTlRFUlJVUFRFRCwgQ0hJTERfRVJST1IKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5zZXR1cCBpbXBvcnQgc2V0dXBfdGVzdHMKKworCisjIE1pbmltdW0gZHVyYXRpb24gb2YgYSB0ZXN0IHRvIGRpc3BsYXkgaXRzIGR1cmF0aW9uIG9yIHRvIG1lbnRpb24gdGhhdAorIyB0aGUgdGVzdCBpcyBydW5uaW5nIGluIGJhY2tncm91bmQKK1BST0dSRVNTX01JTl9USU1FID0gMzAuMCAgICMgc2Vjb25kcworCisjIERpc3BsYXkgdGhlIHJ1bm5pbmcgdGVzdHMgaWYgbm90aGluZyBoYXBwZW5lZCBsYXN0IE4gc2Vjb25kcworUFJPR1JFU1NfVVBEQVRFID0gMzAuMCAgICMgc2Vjb25kcworCisKK2RlZiBydW5fdGVzdF9pbl9zdWJwcm9jZXNzKHRlc3RuYW1lLCBucyk6CisgICAgIiIiUnVuIHRoZSBnaXZlbiB0ZXN0IGluIGEgc3VicHJvY2VzcyB3aXRoIC0tc2xhdmVhcmdzLgorCisgICAgbnMgaXMgdGhlIG9wdGlvbiBOYW1lc3BhY2UgcGFyc2VkIGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gcmVncnRlc3QKKyAgICBpcyBpbnZva2VkIGluIGEgc3VicHJvY2VzcyB3aXRoIHRoZSAtLXNsYXZlYXJncyBhcmd1bWVudDsgd2hlbiB0aGUKKyAgICBzdWJwcm9jZXNzIGV4aXRzLCBpdHMgcmV0dXJuIGNvZGUsIHN0ZG91dCBhbmQgc3RkZXJyIGFyZSByZXR1cm5lZCBhcyBhCisgICAgMy10dXBsZS4KKyAgICAiIiIKKyAgICBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0IFBvcGVuLCBQSVBFCisKKyAgICBuc19kaWN0ID0gdmFycyhucykKKyAgICBzbGF2ZWFyZ3MgPSAobnNfZGljdCwgdGVzdG5hbWUpCisgICAgc2xhdmVhcmdzID0ganNvbi5kdW1wcyhzbGF2ZWFyZ3MpCisKKyAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsICpzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpLAorICAgICAgICAgICAnLVgnLCAnZmF1bHRoYW5kbGVyJywKKyAgICAgICAgICAgJy1tJywgJ3Rlc3QucmVncnRlc3QnLAorICAgICAgICAgICAnLS1zbGF2ZWFyZ3MnLCBzbGF2ZWFyZ3NdCisgICAgaWYgbnMucGdvOgorICAgICAgICBjbWQgKz0gWyctLXBnbyddCisKKyAgICAjIFJ1bm5pbmcgdGhlIGNoaWxkIGZyb20gdGhlIHNhbWUgd29ya2luZyBkaXJlY3RvcnkgYXMgcmVncnRlc3QncyBvcmlnaW5hbAorICAgICMgaW52b2NhdGlvbiBlbnN1cmVzIHRoYXQgVEVNUERJUiBmb3IgdGhlIGNoaWxkIGlzIHRoZSBzYW1lIHdoZW4KKyAgICAjIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSBpcyB0cnVlLiBTZWUgaXNzdWUgMTUzMDAuCisgICAgcG9wZW4gPSBQb3BlbihjbWQsCisgICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCisgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKKyAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQorICAgIHdpdGggcG9wZW46CisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQorICAgICAgICByZXRjb2RlID0gcG9wZW4ud2FpdCgpCisgICAgcmV0dXJuIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyCisKKworZGVmIHJ1bl90ZXN0c19zbGF2ZShzbGF2ZWFyZ3MpOgorICAgIG5zX2RpY3QsIHRlc3RuYW1lID0ganNvbi5sb2FkcyhzbGF2ZWFyZ3MpCisgICAgbnMgPSB0eXBlcy5TaW1wbGVOYW1lc3BhY2UoKipuc19kaWN0KQorCisgICAgc2V0dXBfdGVzdHMobnMpCisKKyAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QobnMsIHRlc3RuYW1lKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmVzdWx0ID0gSU5URVJSVVBURUQsICcnCisgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIHJlc3VsdCA9IENISUxEX0VSUk9SLCBzdHIoZSkKKworICAgIHByaW50KCkgICAjIEZvcmNlIGEgbmV3bGluZSAoanVzdCBpbiBjYXNlKQorICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSwgZmx1c2g9VHJ1ZSkKKyAgICBzeXMuZXhpdCgwKQorCisKKyMgV2UgZG8gbm90IHVzZSBhIGdlbmVyYXRvciBzbyBtdWx0aXBsZSB0aHJlYWRzIGNhbiBjYWxsIG5leHQoKS4KK2NsYXNzIE11bHRpcHJvY2Vzc0l0ZXJhdG9yOgorCisgICAgIiIiQSB0aHJlYWQtc2FmZSBpdGVyYXRvciBvdmVyIHRlc3RzIGZvciBtdWx0aXByb2Nlc3MgbW9kZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0cyk6CisgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYudGVzdHMgPSB0ZXN0cworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYubG9jazoKKyAgICAgICAgICAgIGlmIHNlbGYuaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigndGVzdHMgaW50ZXJydXB0ZWQnKQorICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi50ZXN0cykKKworCitjbGFzcyBNdWx0aXByb2Nlc3NUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBlbmRpbmcsIG91dHB1dCwgbnMpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5wZW5kaW5nID0gcGVuZGluZworICAgICAgICBzZWxmLm91dHB1dCA9IG91dHB1dAorICAgICAgICBzZWxmLm5zID0gbnMKKyAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IE5vbmUKKworICAgIGRlZiBfcnVudGVzdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdCA9IG5leHQoc2VsZi5wZW5kaW5nKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gdGVzdAorCisgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgc2VsZi5ucykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gTm9uZQorCisgICAgICAgIHN0ZG91dCwgXywgcmVzdWx0ID0gc3Rkb3V0LnN0cmlwKCkucnBhcnRpdGlvbigiXG4iKQorICAgICAgICBpZiByZXRjb2RlICE9IDA6CisgICAgICAgICAgICByZXN1bHQgPSAoQ0hJTERfRVJST1IsICJFeGl0IGNvZGUgJXMiICUgcmV0Y29kZSkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgodGVzdCwgc3Rkb3V0LnJzdHJpcCgpLCBzdGRlcnIucnN0cmlwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBzZWxmLm91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXN1bHQgPSBqc29uLmxvYWRzKHJlc3VsdCkKKyAgICAgICAgc2VsZi5vdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0b3AgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgbm90IHN0b3A6CisgICAgICAgICAgICAgICAgc3RvcCA9IHNlbGYuX3J1bnRlc3QoKQorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByYWlzZQorCisKK2RlZiBydW5fdGVzdHNfbXVsdGlwcm9jZXNzKHJlZ3J0ZXN0KToKKyAgICBvdXRwdXQgPSBxdWV1ZS5RdWV1ZSgpCisgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc0l0ZXJhdG9yKHJlZ3J0ZXN0LnRlc3RzKQorCisgICAgd29ya2VycyA9IFtNdWx0aXByb2Nlc3NUaHJlYWQocGVuZGluZywgb3V0cHV0LCByZWdydGVzdC5ucykKKyAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHJlZ3J0ZXN0Lm5zLnVzZV9tcCldCisgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICB3b3JrZXIuc3RhcnQoKQorCisgICAgZGVmIGdldF9ydW5uaW5nKHdvcmtlcnMpOgorICAgICAgICBydW5uaW5nID0gW10KKyAgICAgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICAgICAgY3VycmVudF90ZXN0ID0gd29ya2VyLmN1cnJlbnRfdGVzdAorICAgICAgICAgICAgaWYgbm90IGN1cnJlbnRfdGVzdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZHQgPSB0aW1lLm1vbm90b25pYygpIC0gd29ya2VyLnN0YXJ0X3RpbWUKKyAgICAgICAgICAgIGlmIGR0ID49IFBST0dSRVNTX01JTl9USU1FOgorICAgICAgICAgICAgICAgIHJ1bm5pbmcuYXBwZW5kKCclcyAoJS4wZiBzZWMpJyAlIChjdXJyZW50X3Rlc3QsIGR0KSkKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmcKKworICAgIGZpbmlzaGVkID0gMAorICAgIHRlc3RfaW5kZXggPSAxCisgICAgdGltZW91dCA9IG1heChQUk9HUkVTU19VUERBVEUsIFBST0dSRVNTX01JTl9USU1FKQorICAgIHRyeToKKyAgICAgICAgd2hpbGUgZmluaXNoZWQgPCByZWdydGVzdC5ucy51c2VfbXA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlbSA9IG91dHB1dC5nZXQodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBnZXRfcnVubmluZyh3b3JrZXJzKQorICAgICAgICAgICAgICAgIGlmIHJ1bm5pbmcgYW5kIG5vdCByZWdydGVzdC5ucy5wZ286CisgICAgICAgICAgICAgICAgICAgIHByaW50KCdydW5uaW5nOiAlcycgJSAnLCAnLmpvaW4ocnVubmluZykpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdGVzdCwgc3Rkb3V0LCBzdGRlcnIsIHJlc3VsdCA9IGl0ZW0KKyAgICAgICAgICAgIGlmIHRlc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJlZ3J0ZXN0LmFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCkKKworICAgICAgICAgICAgIyBEaXNwbGF5IHByb2dyZXNzCisgICAgICAgICAgICB0ZXh0ID0gdGVzdAorICAgICAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICAgICAgaWYgKG9rIG5vdCBpbiAoQ0hJTERfRVJST1IsIElOVEVSUlVQVEVEKQorICAgICAgICAgICAgICAgIGFuZCB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUUKKyAgICAgICAgICAgICAgICBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbyk6CisgICAgICAgICAgICAgICAgdGV4dCArPSAnICglLjBmIHNlYyknICUgdGVzdF90aW1lCisgICAgICAgICAgICBydW5uaW5nID0gZ2V0X3J1bm5pbmcod29ya2VycykKKyAgICAgICAgICAgIGlmIHJ1bm5pbmcgYW5kIG5vdCByZWdydGVzdC5ucy5wZ286CisgICAgICAgICAgICAgICAgdGV4dCArPSAnIC0tIHJ1bm5pbmc6ICVzJyAlICcsICcuam9pbihydW5uaW5nKQorICAgICAgICAgICAgcmVncnRlc3QuZGlzcGxheV9wcm9ncmVzcyh0ZXN0X2luZGV4LCB0ZXh0KQorCisgICAgICAgICAgICAjIENvcHkgc3Rkb3V0IGFuZCBzdGRlcnIgZnJvbSB0aGUgY2hpbGQgcHJvY2VzcworICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgIHByaW50KHN0ZG91dCwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICBwcmludChzdGRlcnIsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKworICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gQ0hJTERfRVJST1I6CisgICAgICAgICAgICAgICAgbXNnID0gIkNoaWxkIGVycm9yIG9uIHt9OiB7fSIuZm9ybWF0KHRlc3QsIHJlc3VsdFsxXSkKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQorICAgICAgICAgICAgdGVzdF9pbmRleCArPSAxCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByZWdydGVzdC5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgcGVuZGluZy5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgcHJpbnQoKQorCisgICAgcnVubmluZyA9IFt3b3JrZXIuY3VycmVudF90ZXN0IGZvciB3b3JrZXIgaW4gd29ya2Vyc10KKyAgICBydW5uaW5nID0gbGlzdChmaWx0ZXIoYm9vbCwgcnVubmluZykpCisgICAgaWYgcnVubmluZzoKKyAgICAgICAgcHJpbnQoIldhaXRpbmcgZm9yICVzIiAlICcsICcuam9pbihydW5uaW5nKSkKKyAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgIHdvcmtlci5qb2luKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5MDBhOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5CkBAIC0wLDAgKzEsMjg1IEBACitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCisKKworIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAorIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCisjIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCisjIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cworIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KKyMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKKyMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCisKK2NsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6CisgICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KKworICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKKyAgICAgICAgICAgICNzdHVmZgorCisgICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKKyAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJworICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAorICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KKyAgICAiIiIKKworICAgIGNoYW5nZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgorICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKKyAgICAgICAgc2VsZi5wZ28gPSBwZ28KKworICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKKyAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCisgICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCisgICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0CisgICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKKyAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KKyAgICAjCisgICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCisgICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCisKKyAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKKyAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCisgICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAorICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKKyAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCisgICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKKyAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgorICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAorICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCisgICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgorICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCisKKyAgICBkZWYgZ2V0X2N3ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCisgICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKKworICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKKworICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKKworICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KKworICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCisgICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKKyAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKKyAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQorCisgICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgorICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCisgICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KKworICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKKyAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKKworICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KKyAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgorICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XworCisgICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQorCisgICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCisgICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KKyAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKKworICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQorICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAorICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQorICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQorCisgICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCisKKyAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKKyAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKKyAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6CisgICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycworICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6CisgICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgorICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCisgICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KKworICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKKyAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KKyAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQorICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IHRocmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKKyAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCisKKyAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cworICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cworICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCisgICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCisgICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQorCisgICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAorICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCisgICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKKyAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKKworICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6CisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCisgICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQorICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKKyAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKKworICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQorICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KKyAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKKyAgICAgICAgcGFpcmluZ3MgPSBbXQorICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBwYWlyaW5ncworICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6CisgICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgorICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgorCisgICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgorICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKKyAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgZm9yIG5hbWUsIGdldCwgcmVzdG9yZSBpbiBzZWxmLnJlc291cmNlX2luZm8oKToKKyAgICAgICAgICAgIGN1cnJlbnQgPSBnZXQoKQorICAgICAgICAgICAgb3JpZ2luYWwgPSBzYXZlZF92YWx1ZXMucG9wKG5hbWUpCisgICAgICAgICAgICAjIENoZWNrIGZvciBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSdzIHZhbHVlCisgICAgICAgICAgICBpZiBjdXJyZW50ICE9IG9yaWdpbmFsOgorICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXN0b3JlKG9yaWdpbmFsKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnF1aWV0IGFuZCBub3Qgc2VsZi5wZ286CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJXYXJuaW5nIC0tIHt9IHdhcyBtb2RpZmllZCBieSB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNlbGYudGVzdG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCIgIEJlZm9yZToge31cbiAgQWZ0ZXI6ICB7fSAiLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwsIGN1cnJlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA1YzdlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkKQEAgLTAsMCArMSwxMTYgQEAKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJlZmxlYWsgaW1wb3J0IHdhcm1fY2FjaGVzCisKKworZGVmIHNldHVwX3Rlc3RzKG5zKToKKyAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzIChlLmcuIHNlZ2ZhdWx0KQorICAgIGZhdWx0aGFuZGxlci5lbmFibGUoYWxsX3RocmVhZHM9VHJ1ZSkKKworICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBTSUdBTFJNIG9yIFNJR1VTUjEgc2lnbmFsCisgICAgc2lnbmFscyA9IFtdCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdBTFJNJyk6CisgICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdBTFJNKQorICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpOgorICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHVVNSMSkKKyAgICBmb3Igc2lnbnVtIGluIHNpZ25hbHM6CisgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWdudW0sIGNoYWluPVRydWUpCisKKyAgICByZXBsYWNlX3N0ZG91dCgpCisgICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCisKKyAgICAjIFNvbWUgdGltZXMgX19wYXRoX18gYW5kIF9fZmlsZV9fIGFyZSBub3QgYWJzb2x1dGUgKGUuZy4gd2hpbGUgcnVubmluZyBmcm9tCisgICAgIyBMaWIvKSBhbmQsIGlmIHdlIGNoYW5nZSB0aGUgQ1dEIHRvIHJ1biB0aGUgdGVzdHMgaW4gYSB0ZW1wb3JhcnkgZGlyLCBzb21lCisgICAgIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KKyAgICAjIFRoZXNlIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGZpcnN0IGluIHN5cy5wYXRoWzBdIChzbyAnJyAtLSB0aGUgQ1dEKSBhbmQgaWYKKyAgICAjIHRoZXkgYXJlIGZvdW5kIGluIHRoZSBDV0QgdGhlaXIgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgcmVsYXRpdmUgKHRoaXMKKyAgICAjIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKKyAgICAjIG5vdCBmb3VuZCBpbiB0aGUgQ1dELCBhbmQgc2luY2UgdGhlIG90aGVyIHBhdGhzIGluIHN5cy5wYXRoWzE6XSBhcmUgYWJzb2x1dGUKKyAgICAjIChzaXRlLnB5IGFic29sdXRpemUgdGhlbSksIHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSBhYnNvbHV0ZSB0b28uCisgICAgIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgorICAgICMgdGhlIHBhY2thZ2VzIHRvIHByZXZlbnQgbGF0ZXIgaW1wb3J0cyB0byBmYWlsIHdoZW4gdGhlIENXRCBpcyBkaWZmZXJlbnQuCisgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW29zLnBhdGguYWJzcGF0aChwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgbW9kdWxlLl9fZmlsZV9fID0gb3MucGF0aC5hYnNwYXRoKG1vZHVsZS5fX2ZpbGVfXykKKworICAgICMgTWFjT1NYIChhLmsuYS4gRGFyd2luKSBoYXMgYSBkZWZhdWx0IHN0YWNrIHNpemUgdGhhdCBpcyB0b28gc21hbGwKKyAgICAjIGZvciBkZWVwbHkgcmVjdXJzaXZlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXZSBzZWUgdGhpcyBhcyBjcmFzaGVzIGluCisgICAgIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCisgICAgIyBmaXggaXMgdG8gc2V0IHRoZSBzdGFjayBsaW1pdCB0byAyMDQ4LgorICAgICMgVGhpcyBhcHByb2FjaCBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIG90aGVyIFVuaXh5IHBsYXRmb3JtcyB0aGF0CisgICAgIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCByZXNvdXJjZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzb2Z0LCBoYXJkID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSykKKyAgICAgICAgICAgIG5ld3NvZnQgPSBtaW4oaGFyZCwgbWF4KHNvZnQsIDEwMjQqMjA0OCkpCisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCisKKyAgICBpZiBucy5odW50cmxlYWtzOgorICAgICAgICB1bml0dGVzdC5CYXNlVGVzdFN1aXRlLl9jbGVhbnVwID0gRmFsc2UKKworICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKKyAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgorICAgICAgICB3YXJtX2NhY2hlcygpCisKKyAgICBpZiBucy5tZW1saW1pdCBpcyBub3QgTm9uZToKKyAgICAgICAgc3VwcG9ydC5zZXRfbWVtbGltaXQobnMubWVtbGltaXQpCisKKyAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmU6CisgICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQorCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgbXN2Y3J0LlNldEVycm9yTW9kZShtc3ZjcnQuU0VNX0ZBSUxDUklUSUNBTEVSUk9SU3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT0dQRkFVTFRFUlJPUkJPWHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PT1BFTkZJTEVFUlJPUkJPWCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyByZWxlYXNlIGJ1aWxkCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06CisgICAgICAgICAgICAgICAgaWYgbnMudmVyYm9zZSBhbmQgbnMudmVyYm9zZSA+PSAyOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCBtc3ZjcnQuQ1JUREJHX01PREVfRklMRSkKKyAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydEZpbGUobSwgbXN2Y3J0LkNSVERCR19GSUxFX1NUREVSUikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gbnMudXNlX3Jlc291cmNlcworCisKK2RlZiByZXBsYWNlX3N0ZG91dCgpOgorICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgorICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCisgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAorICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCisgICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCisgICAgICAgIGNsb3NlZmQ9RmFsc2UsCisgICAgICAgIG5ld2xpbmU9J1xuJykKKworICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgorICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkgYi9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CmluZGV4IGFmZDY4NzMuLjA1NWJmMjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbG9ja190ZXN0cy5weQpAQCAtNyw2ICs3LDcgQEAKIGZyb20gX3RocmVhZCBpbXBvcnQgc3RhcnRfbmV3X3RocmVhZCwgVElNRU9VVF9NQVgKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKQEAgLTE5OCw2ICsxOTksMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRzWzBdKQogICAgICAgICBzZWxmLmFzc2VydFRpbWVvdXQocmVzdWx0c1sxXSwgMC41KQogCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9leGlzdHMoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobG9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocmVmKCkpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmX2RlbGV0ZWQoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobG9jaykKKyAgICAgICAgZGVsIGxvY2sKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVmKCkpCisKIAogY2xhc3MgTG9ja1Rlc3RzKEJhc2VMb2NrVGVzdHMpOgogICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGQzNzM5Y2UuLjIxN2FhM2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgICAgICAgICBiJzAnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1AKICAgICAgICAgICAgIGInMScsICAgICAgICAgICAgICAgICAgICAgICAjIFBPUF9NQVJLCiAgICAgICAgICAgICBiJzInLCAgICAgICAgICAgICAgICAgICAgICAgIyBEVVAKLSAgICAgICAgICAgICMgYicoMicsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKDInLAogICAgICAgICAgICAgYidSJywgICAgICAgICAgICAgICAgICAgICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJylSJywKICAgICAgICAgICAgIGInYScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgIGInTmInLAogICAgICAgICAgICAgYidkJywgICAgICAgICAgICAgICAgICAgICAgICMgRElDVAogICAgICAgICAgICAgYidlJywgICAgICAgICAgICAgICAgICAgICAgICMgQVBQRU5EUwotICAgICAgICAgICAgIyBiJyhlJywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhlJywKICAgICAgICAgICAgIGInaWJ1aWx0aW5zXG5saXN0XG4nLCAgICAgICAjIElOU1QKICAgICAgICAgICAgIGInbCcsICAgICAgICAgICAgICAgICAgICAgICAjIExJU1QKICAgICAgICAgICAgIGInbycsICAgICAgICAgICAgICAgICAgICAgICAjIE9CSgpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgIGInTk5zJywKICAgICAgICAgICAgIGIndCcsICAgICAgICAgICAgICAgICAgICAgICAjIFRVUExFCiAgICAgICAgICAgICBiJ3UnLCAgICAgICAgICAgICAgICAgICAgICAgIyBTRVRJVEVNUwotICAgICAgICAgICAgIyBiJyh1JywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgZG9lc24ndCByYWlzZQorICAgICAgICAgICAgYicodScsCiAgICAgICAgICAgICBiJ30oTnUnLAogICAgICAgICAgICAgYidceDgxJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKCiAgICAgICAgICAgICBiJylceDgxJywKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBiJ05ceDg3JywKICAgICAgICAgICAgIGInTk5ceDg3JywKICAgICAgICAgICAgIGInXHg5MCcsICAgICAgICAgICAgICAgICAgICAjIEFERElURU1TCi0gICAgICAgICAgICAjIGInKFx4OTAnLCAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGInKFx4OTAnLAogICAgICAgICAgICAgYidceDkxJywgICAgICAgICAgICAgICAgICAgICMgRlJPWkVOU0VUCiAgICAgICAgICAgICBiJ1x4OTInLCAgICAgICAgICAgICAgICAgICAgIyBORVdPQkpfRVgKICAgICAgICAgICAgIGInKX1ceDkyJywKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKICAgICBkZWYgdGVzdF9iYWRfbWFyayhzZWxmKToKICAgICAgICAgYmFkcGlja2xlcyA9IFsKLSAgICAgICAgICAgICMgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAorICAgICAgICAgICAgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAogICAgICAgICAgICAgYidOKDInLCAgICAgICAgICAgICAgICAgICAgICMgRFVQCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKShSJywgICAgIyBSRURVQ0UKICAgICAgICAgICAgIGInY2J1aWx0aW5zXG5saXN0XG4oKVInLApAQCAtMTA4MSw3ICsxMDgxLDcgQEAKICAgICAgICAgICAgIGInTihceDk0JywgICAgICAgICAgICAgICAgICAjIE1FTU9JWkUKICAgICAgICAgXQogICAgICAgICBmb3IgcCBpbiBiYWRwaWNrbGVzOgotICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX21hcmtfZXJyb3JzLCBwKQorICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX3N0YWNrX2Vycm9ycywgcCkKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9kYXRhKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VucGlja2xpbmdfZXJyb3IoRU9GRXJyb3IsIGInJykKQEAgLTE4NTUsMTYgKzE4NTUsMTQgQEAKICAgICAgICAgeC5hYmMgPSA2NjYKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHByb3RvPXByb3RvKToKLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgeCwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgaWYgcHJvdG8gPCAxOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInXG5MNjQyMDYnLCBzKSAgIyBMT05HCiAgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNXHhjZVx4ZmEnLCBzKSAgIyBCSU5JTlQyCisgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidYXHgwNFx4MDBceDAwXHgwMEZBQ0UnLCBzKSAgIyBCSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHByb3RvID49IDQKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1x4OGNceDA0RkFDRScsIHMpICAjIFNIT1JUX0JJTlVOSUNPREUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkpfRVgsIHMpLApAQCAtMjU4MywxMSArMjU4MSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGluZ0Vycm9yLCBCYWRQaWNrbGVyKCkuZHVtcCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGlja2xlLlVucGlja2xpbmdFcnJvciwgQmFkVW5waWNrbGVyKCkubG9hZCkKIAotICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKLSAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAotICAgICAgICBzID0gYnl0ZXMoWzB4NTgsIDAsIDAsIDAsIDB4NTRdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgcGlja2xlLmxvYWRzLCBzKQotCiAKIGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA0MzEwNDJlLi5mY2MzOTM3Ci0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC02LDE1ODkgKzYsMTIgQEAKIFJ1biB0aGlzIHNjcmlwdCB3aXRoIC1oIG9yIC0taGVscCBmb3IgZG9jdW1lbnRhdGlvbi4KICIiIgogCi1VU0FHRSA9ICIiIlwKLXB5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCi0iIiIKLQotREVTQ1JJUFRJT04gPSAiIiJcCi1SdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCi0KLUlmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCi10aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCi10aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCi0KLUZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZwotY29tbWFuZCBsaW5lOgotCi1weXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KLSIiIgotCi1FUElMT0cgPSAiIiJcCi1BZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgotCi0tciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCi1pbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQotdGVzdCBvcmRlcnMuCi0KLS1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCi1vciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKLVB5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCi1vdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCi10aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgotV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKLWlzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCi1kb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bwotY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KLQotLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAotbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KLVRoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKLXJlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKLXRoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgotCi0tZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQotb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCi1saW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgotd2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KLQotLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KLWxlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCi1GcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KLQotLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bwotc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAotYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi10ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgotb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCi1yZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKLSJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCi0KLS1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKLXR5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KLTIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCi10ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCi1zZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCi13aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQotdGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKLXNob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91Ci1zaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKLXRoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Ci10YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKLWxpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKLXRvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKLWdlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgotCi0tdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAotc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgotVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKLXJlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKLQotICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCi0KLSAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCi0KLSAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgotICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgotICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCi0KLSAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCi0gICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KLQotICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQotICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQotICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgotCi0gICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yawotICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCi0KLSAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAotICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCi0KLSAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KLQotICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KLQotICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KLQotICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KLQotVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKLWV4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKLW9wdGlvbiAnLXVhbGwsLWd1aScuCi0iIiIKLQogIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgogaW1wb3J0IGltcG9ydGxpYgogCi1pbXBvcnQgYXJncGFyc2UKLWltcG9ydCBidWlsdGlucwotaW1wb3J0IGZhdWx0aGFuZGxlcgotaW1wb3J0IGlvCi1pbXBvcnQganNvbgotaW1wb3J0IGxvY2FsZQotaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKLWltcG9ydCBzeXNjb25maWcKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCi1mcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKLQotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICB0aHJlYWRpbmcgPSBOb25lCi10cnk6Ci0gICAgaW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcsIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZQotCi0KLSMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KLSMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQotIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KLSMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgotIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCi0jIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKLSMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQotIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgotIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgotIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KLWZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgotICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbb3MucGF0aC5hYnNwYXRoKHBhdGgpIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KLSAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCi0KLQotIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAotIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgotIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCi0jIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCi0jIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAotIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KLWlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCByZXNvdXJjZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQotICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQotICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCi0KLSMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgotUEFTU0VEID0gMQotRkFJTEVEID0gMAotRU5WX0NIQU5HRUQgPSAtMQotU0tJUFBFRCA9IC0yCi1SRVNPVVJDRV9ERU5JRUQgPSAtMwotSU5URVJSVVBURUQgPSAtNAotQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCi0KLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCi1SRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKLSAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCi0KLSMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKLSMgdG8ga2VlcCB0aGUgdGVzdCBmaWxlcyBpbiBhIHN1YmZvbGRlci4gIFRoaXMgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKLSMgZmlsZXMgdXNpbmcgdGhlICJtYWtlIGRpc3RjbGVhbiIgY29tbWFuZC4KLWlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICBURU1QRElSID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdidWlsZCcpCi1lbHNlOgotICAgIFRFTVBESVIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKLVRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoVEVNUERJUikKLQotY2xhc3MgX0FyZ1BhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6Ci0KLSAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSArICJcblBhc3MgLWggb3IgLS1oZWxwIGZvciBjb21wbGV0ZSBoZWxwLiIpCi0KLWRlZiBfY3JlYXRlX3BhcnNlcigpOgotICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgotICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KLSAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQotCi0gICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KLSAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KLSAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJwotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQotICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1QJywgJy0tcGdvJywgZGVzdD0ncGdvJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZW5hYmxlIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiB0cmFpbmluZycpCi0KLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmdzJywgbmFyZ3M9YXJncGFyc2UuUkVNQUlOREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKLQotICAgIHJldHVybiBwYXJzZXIKLQotZGVmIHJlbGF0aXZlX2ZpbGVuYW1lKHN0cmluZyk6Ci0gICAgIyBDV0QgaXMgcmVwbGFjZWQgd2l0aCBhIHRlbXBvcmFyeSBkaXIgYmVmb3JlIGNhbGxpbmcgbWFpbigpLCBzbyB3ZQotICAgICMgam9pbiBpdCB3aXRoIHRoZSBzYXZlZCBDV0Qgc28gaXQgZW5kcyB1cCB3aGVyZSB0aGUgdXNlciBleHBlY3RzLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc3RyaW5nKQotCi1kZWYgaHVudHJsZWFrcyhzdHJpbmcpOgotICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQotICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgotICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKLSAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCi0gICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQotICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0Ci0gICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKLSAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCi0KLWRlZiByZXNvdXJjZXNfbGlzdChzdHJpbmcpOgotICAgIHUgPSBbeC5sb3dlcigpIGZvciB4IGluIHN0cmluZy5zcGxpdCgnLCcpXQotICAgIGZvciByIGluIHU6Ci0gICAgICAgIGlmIHIgPT0gJ2FsbCcgb3IgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgIHIgPSByWzE6XQotICAgICAgICBpZiByIG5vdCBpbiBSRVNPVVJDRV9OQU1FUzoKLSAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKCdpbnZhbGlkIHJlc291cmNlOiAnICsgcikKLSAgICByZXR1cm4gdQotCi1kZWYgX3BhcnNlX2FyZ3MoYXJncywgKiprd2FyZ3MpOgotICAgICMgRGVmYXVsdHMKLSAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSh0ZXN0ZGlyPU5vbmUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsCi0gICAgICAgICBleGNsdWRlPUZhbHNlLCBzaW5nbGU9RmFsc2UsIHJhbmRvbWl6ZT1GYWxzZSwgZnJvbWZpbGU9Tm9uZSwKLSAgICAgICAgIGZpbmRsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLCB0cmFjZT1GYWxzZSwgY292ZXJkaXI9J2NvdmVyYWdlJywKLSAgICAgICAgIHJ1bmxlYWtzPUZhbHNlLCBodW50cmxlYWtzPUZhbHNlLCB2ZXJib3NlMj1GYWxzZSwgcHJpbnRfc2xvdz1GYWxzZSwKLSAgICAgICAgIHJhbmRvbV9zZWVkPU5vbmUsIHVzZV9tcD1Ob25lLCB2ZXJib3NlMz1GYWxzZSwgZm9yZXZlcj1GYWxzZSwKLSAgICAgICAgIGhlYWRlcj1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsIHBnbz1GYWxzZSkKLSAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobnMsIGspOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclciBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBmdW5jdGlvbicgJSBrKQotICAgICAgICBzZXRhdHRyKG5zLCBrLCB2KQotICAgIGlmIG5zLnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKLSAgICAgICAgbnMudXNlX3Jlc291cmNlcyA9IFtdCi0KLSAgICBwYXJzZXIgPSBfY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1hcmdzLCBuYW1lc3BhY2U9bnMpCi0KLSAgICBpZiBucy5zaW5nbGUgYW5kIG5zLmZyb21maWxlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMudHJhY2U6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5maW5kbGVha3M6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLWwgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5tZW1saW1pdDoKLSAgICAgICAgcGFyc2VyLmVycm9yKCItTSBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy5mYWlsZmFzdCBhbmQgbm90IChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UzKToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItRy8tLWZhaWxmYXN0IG5lZWRzIGVpdGhlciAtdiBvciAtVyIpCi0KLSAgICBpZiBucy5xdWlldDoKLSAgICAgICAgbnMudmVyYm9zZSA9IDAKLSAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgotICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6Ci0gICAgICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6Ci0gICAgICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBUaGUgdGltZW91dCBvcHRpb24gcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlciIpCi0gICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQotICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6Ci0gICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAotICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQotICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKLSAgICBpZiBucy51c2U6Ci0gICAgICAgIGZvciBhIGluIG5zLnVzZToKLSAgICAgICAgICAgIGZvciByIGluIGE6Ci0gICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKLSAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgICAgICAgICBpZiByZW1vdmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCi0gICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgotICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQotICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgotICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCi0KLSAgICByZXR1cm4gbnMKLQotCi1kZWYgcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0bmFtZSwgbnMpOgotICAgICIiIlJ1biB0aGUgZ2l2ZW4gdGVzdCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCAtLXNsYXZlYXJncy4KLQotICAgIG5zIGlzIHRoZSBvcHRpb24gTmFtZXNwYWNlIHBhcnNlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIHJlZ3J0ZXN0Ci0gICAgaXMgaW52b2tlZCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgLS1zbGF2ZWFyZ3MgYXJndW1lbnQ7IHdoZW4gdGhlCi0gICAgc3VicHJvY2VzcyBleGl0cywgaXRzIHJldHVybiBjb2RlLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmV0dXJuZWQgYXMgYQotICAgIDMtdHVwbGUuCi0gICAgIiIiCi0gICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQotICAgIGJhc2VfY21kID0gKFtzeXMuZXhlY3V0YWJsZV0gKyBzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpICsKLSAgICAgICAgICAgICAgICBbJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctbScsICd0ZXN0LnJlZ3J0ZXN0J10pCi0gICAgIyByZXF1aXJlZCB0byBzcGF3biBhIG5ldyBwcm9jZXNzIHdpdGggUEdPIGZsYWcgb24vb2ZmCi0gICAgaWYgbnMucGdvOgotICAgICAgICBiYXNlX2NtZCA9IGJhc2VfY21kICsgWyctLXBnbyddCi0gICAgc2xhdmVhcmdzID0gKAotICAgICAgICAgICAgKHRlc3RuYW1lLCBucy52ZXJib3NlLCBucy5xdWlldCksCi0gICAgICAgICAgICBkaWN0KGh1bnRybGVha3M9bnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlcz1ucy51c2VfcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgbWF0Y2hfdGVzdHM9bnMubWF0Y2hfdGVzdHMsIHBnbz1ucy5wZ28pKQotICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCi0gICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgotICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KLSAgICBwb3BlbiA9IFBvcGVuKGJhc2VfY21kICsgWyctLXNsYXZlYXJncycsIGpzb24uZHVtcHMoc2xhdmVhcmdzKV0sCi0gICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCi0gICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKLSAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQotICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQotICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKLSAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKLQotCi1kZWYgbWFpbih0ZXN0cz1Ob25lLCAqKmt3YXJncyk6Ci0gICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCi0KLSAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKLSAgICBhY2NvcmRpbmdseS4KLQotICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCi0gICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKLQotICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KLSAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQotICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KLQotICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQotICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQotICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KLQotICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCi0gICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAotICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKLSAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncwotICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgIiIiCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycyAoZS5nLiBzZWdmYXVsdCkKLSAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKGFsbF90aHJlYWRzPVRydWUpCi0KLSAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gU0lHQUxSTSBvciBTSUdVU1IxIHNpZ25hbAotICAgIHNpZ25hbHMgPSBbXQotICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpOgotICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHQUxSTSkKLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR1VTUjEpCi0gICAgZm9yIHNpZ251bSBpbiBzaWduYWxzOgotICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbnVtLCBjaGFpbj1UcnVlKQotCi0gICAgcmVwbGFjZV9zdGRvdXQoKQotCi0gICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCi0KLSAgICBucyA9IF9wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgKiprd2FyZ3MpCi0KLSAgICBpZiBucy5odW50cmxlYWtzOgotICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKLSAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgotICAgICAgICB3YXJtX2NhY2hlcygpCi0gICAgaWYgbnMubWVtbGltaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQuc2V0X21lbWxpbWl0KG5zLm1lbWxpbWl0KQotICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKLSAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQotICAgIGlmIG5zLm5vd2luZG93czoKLSAgICAgICAgcHJpbnQoJ1RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAnCi0gICAgICAgICAgICAgICdVc2UgLXZ2IHRvIGRpc3BsYXkgYXNzZXJ0aW9ucyBpbiBzdGRlcnIuJykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBtc3ZjcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKLSAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCi0gICAgaWYgbnMud2FpdDoKLSAgICAgICAgaW5wdXQoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKQotCi0gICAgaWYgbnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgotICAgICAgICBhcmdzLCBrd2FyZ3MgPSBqc29uLmxvYWRzKG5zLnNsYXZlYXJncykKLSAgICAgICAgaWYga3dhcmdzLmdldCgnaHVudHJsZWFrcycpOgotICAgICAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKLSAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKLSAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQotICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCi0gICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgIGdvb2QgPSBbXQotICAgIGJhZCA9IFtdCi0gICAgc2tpcHBlZCA9IFtdCi0gICAgcmVzb3VyY2VfZGVuaWVkcyA9IFtdCi0gICAgZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCi0gICAgaW50ZXJydXB0ZWQgPSBGYWxzZQotCi0gICAgaWYgbnMuZmluZGxlYWtzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGZpbmRsZWFrcy4nKQotICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQotICAgICAgICAgICAgIyBnYXJiYWdlIHRoYXQgaXMgbm90IGNvbGxlY3RhYmxlIGJ5IHRoZSBHQyBpcyByZXBvcnRlZC4KLSAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKLSAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UgPSBbXQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGZwOgotICAgICAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgdGVzdHMgPSBbbmV4dF90ZXN0XQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgIGlmIG5zLmZyb21maWxlOgotICAgICAgICB0ZXN0cyA9IFtdCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgbnMuZnJvbWZpbGUpKSBhcyBmcDoKLSAgICAgICAgICAgIGNvdW50X3BhdCA9IHJlLmNvbXBpbGUocidcW1xzKlxkKy9ccypcZCtcXScpCi0gICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKLSAgICAgICAgICAgICAgICBsaW5lID0gY291bnRfcGF0LnN1YignJywgbGluZSkKLSAgICAgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGlmIGd1dHMgYW5kIG5vdCBndXRzWzBdLnN0YXJ0c3dpdGgoJyMnKToKLSAgICAgICAgICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKGd1dHMpCi0KLSAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgotICAgIHJlbW92ZXB5KG5zLmFyZ3MpCi0gICAgcmVtb3ZlcHkodGVzdHMpCi0KLSAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCi0gICAgbm90dGVzdHMgPSBOT1RURVNUUy5jb3B5KCkKLSAgICBpZiBucy5leGNsdWRlOgotICAgICAgICBmb3IgYXJnIGluIG5zLmFyZ3M6Ci0gICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6Ci0gICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKLSAgICAgICAgICAgIG5vdHRlc3RzLmFkZChhcmcpCi0gICAgICAgIG5zLmFyZ3MgPSBbXQotCi0gICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgotICAgIGlmIChucy52ZXJib3NlIG9yIG5zLmhlYWRlciBvcgotICAgICAgICAgICAgbm90IChucy5wZ28gb3IgbnMucXVpZXQgb3IgbnMuc2luZ2xlIG9yIHRlc3RzIG9yIG5zLmFyZ3MpKToKLSAgICAgICAgIyBQcmludCBiYXNpYyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgotICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCi0gICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKLSAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKLSAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKLSAgICAgICAgcHJpbnQoIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MpCi0KLSAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbwotICAgICMgZG9uJ3QgYWRkIGRlZmF1bHQgdGVzdHMgdG8gYmUgZXhlY3V0ZWQgb3Igc2tpcHBlZCAocGFzcyBlbXB0eSB2YWx1ZXMpCi0gICAgaWYgbnMudGVzdGRpcjoKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgbGlzdCgpLCBzZXQoKSkKLSAgICBlbHNlOgotICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCi0KLSAgICBzZWxlY3RlZCA9IHRlc3RzIG9yIG5zLmFyZ3Mgb3IgYWxsdGVzdHMKLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWRbOjFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1thbGx0ZXN0cy5pbmRleChzZWxlY3RlZFswXSkrMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQotICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgotICAgIGlmIG5zLnN0YXJ0OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZWwgc2VsZWN0ZWRbOnNlbGVjdGVkLmluZGV4KG5zLnN0YXJ0KV0KLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIgJSBucy5zdGFydCkKLSAgICBpZiBucy5yYW5kb21pemU6Ci0gICAgICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6Ci0gICAgICAgICAgICBucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCi0gICAgICAgIHJhbmRvbS5zZWVkKG5zLnJhbmRvbV9zZWVkKQotICAgICAgICBwcmludCgiVXNpbmcgcmFuZG9tIHNlZWQiLCBucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZWN0ZWQpCi0gICAgaWYgbnMudHJhY2U6Ci0gICAgICAgIGltcG9ydCB0cmFjZSwgdGVtcGZpbGUKLSAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuZ2V0dGVtcGRpcigpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCi0KLSAgICB0ZXN0X3RpbWVzID0gW10KLSAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAgICAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKLSAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCi0gICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCi0KLSAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KToKLSAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAotICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6Ci0gICAgICAgICAgICB0ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKLSAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgotICAgICAgICAgICAgZ29vZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBGQUlMRUQ6Ci0gICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6Ci0gICAgICAgICAgICBlbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFJFU09VUkNFX0RFTklFRDoKLSAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCi0gICAgICAgICAgICByZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQotCi0gICAgaWYgbnMuZm9yZXZlcjoKLSAgICAgICAgZGVmIHRlc3RfZm9yZXZlcih0ZXN0cz1saXN0KHNlbGVjdGVkKSk6Ci0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICB0ZXN0cyA9IHRlc3RfZm9yZXZlcigpCi0gICAgICAgIHRlc3RfY291bnQgPSAnJwotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gMwotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzID0gaXRlcihzZWxlY3RlZCkKLSAgICAgICAgdGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZWN0ZWQpKQotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gbGVuKHRlc3RfY291bnQpIC0gMQotCi0gICAgaWYgbnMudXNlX21wOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKLSAgICAgICAgICAgIHN5cy5leGl0KDIpCi0gICAgICAgIGZyb20gcXVldWUgaW1wb3J0IFF1ZXVlCi0gICAgICAgIGRlYnVnX291dHB1dF9wYXQgPSByZS5jb21waWxlKHIiXFtcZCsgcmVmcywgXGQrIGJsb2Nrc1xdJCIpCi0gICAgICAgIG91dHB1dCA9IFF1ZXVlKCkKLSAgICAgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc1Rlc3RzKHRlc3RzKQotICAgICAgICBkZWYgd29yaygpOgotICAgICAgICAgICAgIyBBIHdvcmtlciB0aHJlYWQuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IG5leHQocGVuZGluZykKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgbnMpCi0gICAgICAgICAgICAgICAgICAgICMgU3RyaXAgbGFzdCByZWZjb3VudCBvdXRwdXQgbGluZSBpZiBpdCBleGlzdHMsIHNpbmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICMgY29tZXMgZnJvbSB0aGUgc2h1dGRvd24gb2YgdGhlIGludGVycHJldGVyIGluIHRoZSBzdWJjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBkZWJ1Z19vdXRwdXRfcGF0LnN1YigiIiwgc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKLSAgICAgICAgICAgICAgICAgICAgaWYgcmV0Y29kZSAhPSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKENISUxEX0VSUk9SLCAiRXhpdCBjb2RlICVzIiAlIHJldGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLCByZXN1bHQpKQotICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgd29ya2VycyA9IFtUaHJlYWQodGFyZ2V0PXdvcmspIGZvciBpIGluIHJhbmdlKG5zLnVzZV9tcCldCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5zdGFydCgpCi0gICAgICAgIGZpbmlzaGVkID0gMAotICAgICAgICB0ZXN0X2luZGV4ID0gMQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IG5zLnVzZV9tcDoKLSAgICAgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gb3V0cHV0LmdldCgpCi0gICAgICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICAgICAgaWYgYmFkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9XSB7NH0iCi0gICAgICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGJhZCksIHRlc3QpKQotICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0KQotICAgICAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3RkZXJyLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDaGlsZCBlcnJvciBvbiB7fToge30iLmZvcm1hdCh0ZXN0LCByZXN1bHRbMV0pKQotICAgICAgICAgICAgICAgIHRlc3RfaW5kZXggKz0gMQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgIHBlbmRpbmcuaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5qb2luKCkKLSAgICBlbHNlOgotICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgotICAgICAgICAgICAgaWYgbm90IG5zLnF1aWV0OgotICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnRfd2lkdGgsIHRlc3RfaW5kZXgsIHRlc3RfY291bnQsIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgICAgIGlmIG5zLnRyYWNlOgotICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKLSAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KLSAgICAgICAgICAgICAgICB0cmFjZXIucnVuY3R4KCdydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LCB0aW1lb3V0PW5zLnRpbWVvdXQpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9dmFycygpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIGZhaWxmYXN0PW5zLmZhaWxmYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKQotICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgotICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKLSAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQotICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKLSAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KLSAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCi0gICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKLSAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKLQotICAgIGlmIGludGVycnVwdGVkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQwotICAgICAgICBwcmludCgpCi0gICAgICAgIHByaW50KCJUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuIikKLSAgICAgICAgb21pdHRlZCA9IHNldChzZWxlY3RlZCkgLSBzZXQoZ29vZCkgLSBzZXQoYmFkKSAtIHNldChza2lwcGVkKQotICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCi0gICAgICAgIHByaW50bGlzdChvbWl0dGVkKQotICAgIGlmIGdvb2QgYW5kIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgaWYgbm90IGJhZCBhbmQgbm90IHNraXBwZWQgYW5kIG5vdCBpbnRlcnJ1cHRlZCBhbmQgbGVuKGdvb2QpID4gMToKLSAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjb3VudChsZW4oZ29vZCksICJ0ZXN0IiksICJPSy4iKQotICAgIGlmIG5zLnByaW50X3Nsb3c6Ci0gICAgICAgIHRlc3RfdGltZXMuc29ydChyZXZlcnNlPVRydWUpCi0gICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCi0gICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHRlc3RfdGltZXNbOjEwXToKLSAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQotICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KGJhZCkKLSAgICBpZiBlbnZpcm9ubWVudF9jaGFuZ2VkIGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAotICAgICAgICAgICAgICAgICBjb3VudChsZW4oZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQotICAgICAgICBwcmludGxpc3QoZW52aXJvbm1lbnRfY2hhbmdlZCkKLSAgICBpZiBza2lwcGVkIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihza2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KHNraXBwZWQpCi0KLSAgICBpZiBucy52ZXJib3NlMiBhbmQgYmFkOgotICAgICAgICBwcmludCgiUmUtcnVubmluZyBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlIikKLSAgICAgICAgZm9yIHRlc3QgaW4gYmFkWzpdOgotICAgICAgICAgICAgaWYgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICBwcmludCgiUmUtcnVubmluZyB0ZXN0ICVyIGluIHZlcmJvc2UgbW9kZSIgJSB0ZXN0KQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbnMudmVyYm9zZSA9IFRydWUKLSAgICAgICAgICAgICAgICBvayA9IHJ1bnRlc3QodGVzdCwgVHJ1ZSwgbnMucXVpZXQsIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgcGdvPW5zLnBnbykKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBzZXBhcmF0ZSBmcm9tIHRoZSBeQwotICAgICAgICAgICAgICAgIHByaW50KCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBva1swXSBpbiB7UEFTU0VELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVEfToKLSAgICAgICAgICAgICAgICAgICAgYmFkLnJlbW92ZSh0ZXN0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgYmFkOgotICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAndGVzdCcpLCAiZmFpbGVkIGFnYWluOiIpCi0gICAgICAgICAgICAgICAgcHJpbnRsaXN0KGJhZCkKLQotICAgIGlmIG5zLnNpbmdsZToKLSAgICAgICAgaWYgbmV4dF9zaW5nbGVfdGVzdDoKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBmcC53cml0ZShuZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICByID0gdHJhY2VyLnJlc3VsdHMoKQotICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9bnMuY292ZXJkaXIpCi0KLSAgICBpZiBucy5ydW5sZWFrczoKLSAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKLQotICAgIHN5cy5leGl0KGxlbihiYWQpID4gMCBvciBpbnRlcnJ1cHRlZCkKLQotCi0jIHNtYWxsIHNldCBvZiB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIGJhc2ljYWxseSBmdW5jdGlvbmluZyBpbnRlcnByZXRlcgotIyAoaS5lLiBpZiBhbnkgb2YgdGhlc2UgZmFpbCwgdGhlbiBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBmb2xsb3cpCi1TVERURVNUUyA9IFsKLSAgICAndGVzdF9ncmFtbWFyJywKLSAgICAndGVzdF9vcGNvZGVzJywKLSAgICAndGVzdF9kaWN0JywKLSAgICAndGVzdF9idWlsdGluJywKLSAgICAndGVzdF9leGNlcHRpb25zJywKLSAgICAndGVzdF90eXBlcycsCi0gICAgJ3Rlc3RfdW5pdHRlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QyJywKLSAgICAndGVzdF9zdXBwb3J0JwotXQotCi0jIHNldCBvZiB0ZXN0cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB1c2luZyByZWdydGVzdAotTk9UVEVTVFMgPSBzZXQoKQotCi1kZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKLSAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKLSAgICB0ZXN0cyA9IFtdCi0gICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBtb2RbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCBpbiAoIi5weSIsICIiKSBhbmQgbW9kIG5vdCBpbiBvdGhlcnM6Ci0gICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kKQotICAgIHJldHVybiBzdGR0ZXN0cyArIHNvcnRlZCh0ZXN0cykKLQotIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgotY2xhc3MgTXVsdGlwcm9jZXNzVGVzdHMob2JqZWN0KToKLQotICAgICIiIkEgdGhyZWFkLXNhZmUgaXRlcmF0b3Igb3ZlciB0ZXN0cyBmb3IgbXVsdGlwcm9jZXNzIG1vZGUuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMpOgotICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQotICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmxvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLmludGVycnVwdGVkOgotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oJ3Rlc3RzIGludGVycnVwdGVkJykKLSAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYudGVzdHMpCi0KLWRlZiByZXBsYWNlX3N0ZG91dCgpOgotICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgotICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCi0gICAgaW1wb3J0IGF0ZXhpdAotCi0gICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAotICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCi0gICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCi0gICAgICAgIGNsb3NlZmQ9RmFsc2UsCi0gICAgICAgIG5ld2xpbmU9J1xuJykKLQotICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgotICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKLSAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAotICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKLQotZGVmIHJ1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQsCi0gICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCB1c2VfcmVzb3VyY2VzPU5vbmUsCi0gICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsCi0gICAgICAgICAgICB0aW1lb3V0PU5vbmUsICosIHBnbz1GYWxzZSk6Ci0gICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCi0KLSAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCi0gICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCi0gICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKLSAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCi0gICAgdXNlX3Jlc291cmNlcyAtLSBsaXN0IG9mIGV4dHJhIHJlc291cmNlcyB0byB1c2UKLSAgICBvdXRwdXRfb25fZmFpbHVyZSAtLSBpZiB0cnVlLCBkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUKLSAgICB0aW1lb3V0IC0tIGR1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICB0aW1lb3V0IHNlY29uZHMKLSAgICBmYWlsZmFzdCwgbWF0Y2hfdGVzdHMgLS0gU2VlIHJlZ3J0ZXN0IGNvbW1hbmQtbGluZSBmbGFncyBmb3IgdGhlc2UuCi0gICAgcGdvIC0tIGlmIHRydWUsIGRvIG5vdCBwcmludCB1bm5lY2Vzc2FyeSBpbmZvIHdoZW4gcnVubmluZyB0aGUgdGVzdAotICAgICAgICAgICBmb3IgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIGJ1aWxkCi0KLSAgICBSZXR1cm5zIHRoZSB0dXBsZSByZXN1bHQsIHRlc3RfdGltZSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzOgotICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCi0gICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCi0gICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgotICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50Ci0gICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKLSAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAotICAgICIiIgotICAgIGlmIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IHVzZV9yZXNvdXJjZXMKLSAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQotICAgIGlmIHVzZV90aW1lb3V0OgotICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQotICAgIHRyeToKLSAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCi0gICAgICAgIGlmIGZhaWxmYXN0OgotICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKLSAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCi0KLSAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQotICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgotICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgotICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KLSAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQotICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCi0KLSAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPUZhbHNlLCBwZ289cGdvKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBGQUlMRUQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLndyaXRlKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gb3JpZ19zdGRlcnIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IHZlcmJvc2UgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9bm90IHZlcmJvc2UsIHBnbz1wZ28pCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICBmaW5hbGx5OgotICAgICAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQotICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCi1ydW50ZXN0LnN0cmluZ2lvID0gTm9uZQotCi0jIFVuaXQgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGxlYXZlIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdW5jaGFuZ2VkCi0jIG9uY2UgdGhleSBjb21wbGV0ZS4gIEJ1dCBzb21ldGltZXMgdGVzdHMgaGF2ZSBidWdzLCBlc3BlY2lhbGx5IHdoZW4KLSMgdGVzdHMgZmFpbCwgYW5kIHRoZSBjaGFuZ2VzIHRvIGVudmlyb25tZW50IGdvIG9uIHRvIG1lc3MgdXAgb3RoZXIKLSMgdGVzdHMuICBUaGlzIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBidWlsZGJvdCBzdGFiaWxpdHksIHNpbmNlIHRlc3RzCi0jIGFyZSBydW4gaW4gcmFuZG9tIG9yZGVyIGFuZCBzbyBwcm9ibGVtcyBtYXkgYXBwZWFyIHRvIGNvbWUgYW5kIGdvLgotIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHdlIGNhbiBzYXZlIGFuZCByZXN0b3JlIHRvIG1pdGlnYXRlIHRoaXMsIGFuZAotIyB0aGUgZm9sbG93aW5nIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoaXMgdGFzay4KLQotY2xhc3Mgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudDoKLSAgICAiIiJTYXZlIGJpdHMgb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIHJlc3RvcmUgdGhlbSBhdCBibG9jayBleGl0LgotCi0gICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0bmFtZSwgdmVyYm9zZSwgcXVpZXQpOgotICAgICAgICAgICAgI3N0dWZmCi0KLSAgICBVbmxlc3MgcXVpZXQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyIGlmIGFueSBvZgotICAgIHRoZSBzYXZlZCBpdGVtcyB3YXMgY2hhbmdlZCBieSB0aGUgdGVzdC4gIFRoZSBhdHRyaWJ1dGUgJ2NoYW5nZWQnCi0gICAgaXMgaW5pdGlhbGx5IEZhbHNlLCBidXQgaXMgc2V0IHRvIFRydWUgaWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuCi0KLSAgICBJZiB2ZXJib3NlIGlzIG1vcmUgdGhhbiAxLCB0aGUgYmVmb3JlIGFuZCBhZnRlciBzdGF0ZSBvZiBjaGFuZ2VkCi0gICAgaXRlbXMgaXMgYWxzbyBwcmludGVkLgotICAgICIiIgotCi0gICAgY2hhbmdlZCA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdG5hbWUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsICosIHBnbz1GYWxzZSk6Ci0gICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQotICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCi0gICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAotICAgICAgICBzZWxmLnBnbyA9IHBnbwotCi0gICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAotICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKLSAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKLSAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKLSAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgotICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgotICAgICMKLSAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKLSAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KLQotICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAotICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdzeXMucGF0aF9ob29rcycsICdfX2ltcG9ydF9fJywKLSAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzLmZpbHRlcnMnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCi0gICAgICAgICAgICAgICAgICdsb2dnaW5nLl9oYW5kbGVycycsICdsb2dnaW5nLl9oYW5kbGVyTGlzdCcsICdzeXMuZ2V0dHJhY2UnLAotICAgICAgICAgICAgICAgICAnc3lzLndhcm5vcHRpb25zJywKLSAgICAgICAgICAgICAgICAgIyBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpIG1heSByZWxlYXNlIHJlZgotICAgICAgICAgICAgICAgICAjIHRvIGEgdGhyZWFkLCBzbyBjaGVjayBwcm9jZXNzZXMgZmlyc3QuCi0gICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcnLCAndGhyZWFkaW5nLl9kYW5nbGluZycsCi0gICAgICAgICAgICAgICAgICdzeXNjb25maWcuX0NPTkZJR19WQVJTJywgJ3N5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTJywKLSAgICAgICAgICAgICAgICAgJ2ZpbGVzJywgJ2xvY2FsZScsICd3YXJuaW5ncy5zaG93d2FybmluZycsCi0gICAgICAgICAgICAgICAgKQotCi0gICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6Ci0gICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQotICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KLQotICAgIGRlZiBnZXRfY3dkKHNlbGYpOgotICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKLSAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKLSAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQotCi0gICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAotICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKLSAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAotCi0gICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgotICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKLSAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgotCi0gICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuc3RkaW4KLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgotICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgotCi0gICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKLSAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgotICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQotICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKLSAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKLQotICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQotICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgotICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KLSAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoX2hvb2tzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGhfaG9va3MpLCBzeXMucGF0aF9ob29rcywgc3lzLnBhdGhfaG9va3NbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aF9ob29rcyhzZWxmLCBzYXZlZF9ob29rcyk6Ci0gICAgICAgIHN5cy5wYXRoX2hvb2tzID0gc2F2ZWRfaG9va3NbMV0KLSAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzYXZlZF9ob29rc1syXQotCi0gICAgZGVmIGdldF9zeXNfZ2V0dHJhY2Uoc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuZ2V0dHJhY2UoKQotICAgIGRlZiByZXN0b3JlX3N5c19nZXR0cmFjZShzZWxmLCB0cmFjZV9meG4pOgotICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VfZnhuKQotCi0gICAgZGVmIGdldF9fX2ltcG9ydF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gYnVpbHRpbnMuX19pbXBvcnRfXwotICAgIGRlZiByZXN0b3JlX19faW1wb3J0X18oc2VsZiwgaW1wb3J0Xyk6Ci0gICAgICAgIGJ1aWx0aW5zLl9faW1wb3J0X18gPSBpbXBvcnRfCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX2ZpbHRlcnMoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZCh3YXJuaW5ncy5maWx0ZXJzKSwgd2FybmluZ3MuZmlsdGVycywgd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX2ZpbHRlcnMoc2VsZiwgc2F2ZWRfZmlsdGVycyk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBzYXZlZF9maWx0ZXJzWzFdCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlZF9maWx0ZXJzWzJdCi0KLSAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KLSAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQotICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKLSAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKLSAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQotICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQotCi0gICAgZGVmIGdldF9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgotICAgICAgICAjIHdlIGNvdWxkIGNhbGwgZ2V0X2FyY2hpdmVzX2Zvcm1hdHMoKSBidXQgdGhhdCBvbmx5IHJldHVybnMgdGhlCi0gICAgICAgICMgcmVnaXN0cnkga2V5czsgd2Ugd2FudCB0byBjaGVjayB0aGUgdmFsdWVzIHRvbyAodGhlIGZ1bmN0aW9ucyB0aGF0Ci0gICAgICAgICMgYXJlIHJlZ2lzdGVyZWQpCi0gICAgICAgIHJldHVybiBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUywgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTID0gc2F2ZWRbMF0KLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMsIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlcnMoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJzIGlzIGEgV2Vha1ZhbHVlRGljdGlvbmFyeQotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlcnMpLCBsb2dnaW5nLl9oYW5kbGVycywgbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlcnMoc2VsZiwgc2F2ZWRfaGFuZGxlcnMpOgotICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmKToKLSAgICAgICAgIyBfaGFuZGxlckxpc3QgaXMgYSBsaXN0IG9mIHdlYWtyZWZzIHRvIGhhbmRsZXJzCi0gICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVyTGlzdCksIGxvZ2dpbmcuX2hhbmRsZXJMaXN0LCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYsIHNhdmVkX2hhbmRsZXJMaXN0KToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfc3lzX3dhcm5vcHRpb25zKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLndhcm5vcHRpb25zKSwgc3lzLndhcm5vcHRpb25zLCBzeXMud2Fybm9wdGlvbnNbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfd2Fybm9wdGlvbnMoc2VsZiwgc2F2ZWRfb3B0aW9ucyk6Ci0gICAgICAgIHN5cy53YXJub3B0aW9ucyA9IHNhdmVkX29wdGlvbnNbMV0KLSAgICAgICAgc3lzLndhcm5vcHRpb25zWzpdID0gc2F2ZWRfb3B0aW9uc1syXQotCi0gICAgIyBDb250cm9sbGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIFRocmVhZCBvYmplY3RzIGNhbiBtYWtlIGl0IGVhc2llcgotICAgICMgdG8gdHJhY2sgcmVmZXJlbmNlIGxlYWtzLgotICAgIGRlZiBnZXRfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiB0aHJlYWRpbmcuX2RhbmdsaW5nLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKLQotICAgICMgU2FtZSBmb3IgUHJvY2VzcyBvYmplY3RzCi0gICAgZGVmIGdldF9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFVuam9pbmVkIHByb2Nlc3Mgb2JqZWN0cyBjYW4gc3Vydml2ZSBhZnRlciBwcm9jZXNzIGV4aXRzCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkKLSAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKLSAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jbGVhcigpCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZik6Ci0gICAgICAgICMgbWFrZSBzdXJlIHRoZSBkaWN0IGlzIGluaXRpYWxpemVkCi0gICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHJlZml4JykKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0NPTkZJR19WQVJTKSwgc3lzY29uZmlnLl9DT05GSUdfVkFSUywKLSAgICAgICAgICAgICAgICBkaWN0KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpKQotICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy5jbGVhcigpCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyksIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLAotICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNvcHkoKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy51cGRhdGUoc2F2ZWRbMl0pCi0KLSAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICByZXR1cm4gc29ydGVkKGZuICsgKCcvJyBpZiBvcy5wYXRoLmlzZGlyKGZuKSBlbHNlICcnKQotICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKCkpCi0gICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZiwgc2F2ZWRfdmFsdWUpOgotICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCi0gICAgICAgIGlmIGZuIG5vdCBpbiBzYXZlZF92YWx1ZSBhbmQgKGZuICsgJy8nKSBub3QgaW4gc2F2ZWRfdmFsdWU6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoZm4pCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQucm10cmVlKGZuKQotCi0gICAgX2xjID0gW2dldGF0dHIobG9jYWxlLCBsYykgZm9yIGxjIGluIGRpcihsb2NhbGUpCi0gICAgICAgICAgIGlmIGxjLnN0YXJ0c3dpdGgoJ0xDXycpXQotICAgIGRlZiBnZXRfbG9jYWxlKHNlbGYpOgotICAgICAgICBwYWlyaW5ncyA9IFtdCi0gICAgICAgIGZvciBsYyBpbiBzZWxmLl9sYzoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwYWlyaW5ncy5hcHBlbmQoKGxjLCBsb2NhbGUuc2V0bG9jYWxlKGxjLCBOb25lKSkpCi0gICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcmV0dXJuIHBhaXJpbmdzCi0gICAgZGVmIHJlc3RvcmVfbG9jYWxlKHNlbGYsIHNhdmVkKToKLSAgICAgICAgZm9yIGxjLCBzZXR0aW5nIGluIHNhdmVkOgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsYywgc2V0dGluZykKLQotICAgIGRlZiBnZXRfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiB3YXJuaW5ncy5zaG93d2FybmluZwotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYsIGZ4bik6Ci0gICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gZnhuCi0KLSAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKLSAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6Ci0gICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQotICAgICAgICAgICAgZ2V0X25hbWUgPSAnZ2V0XycgKyBtZXRob2Rfc3VmZml4Ci0gICAgICAgICAgICByZXN0b3JlX25hbWUgPSAncmVzdG9yZV8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgeWllbGQgbmFtZSwgZ2V0YXR0cihzZWxmLCBnZXRfbmFtZSksIGdldGF0dHIoc2VsZiwgcmVzdG9yZV9uYW1lKQotCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zYXZlZF92YWx1ZXMgPSBkaWN0KChuYW1lLCBnZXQoKSkgZm9yIG5hbWUsIGdldCwgcmVzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCkpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6Ci0gICAgICAgIHNhdmVkX3ZhbHVlcyA9IHNlbGYuc2F2ZWRfdmFsdWVzCi0gICAgICAgIGRlbCBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgotICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCi0gICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKLSAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKLSAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6Ci0gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxIGFuZCBub3Qgc2VsZi5wZ286Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwKLSAgICAgICAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIGRpc3BsYXlfZmFpbHVyZT1UcnVlLCBwZ289RmFsc2UpOgotICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCi0KLSAgICB0ZXN0X3RpbWUgPSAwLjAKLSAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KLSAgICB0cnk6Ci0gICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKToKLSAgICAgICAgICAgIGFic3Rlc3QgPSB0ZXN0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEFsd2F5cyBpbXBvcnQgaXQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlCi0gICAgICAgICAgICBhYnN0ZXN0ID0gJ3Rlc3QuJyArIHRlc3QKLSAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBwZ289cGdvKSBhcyBlbnZpcm9ubWVudDoKLSAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgICAgICAgdGhlX21vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGFic3Rlc3QpCi0gICAgICAgICAgICAjIElmIHRoZSB0ZXN0IGhhcyBhIHRlc3RfbWFpbiwgdGhhdCB3aWxsIHJ1biB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICMgdGVzdHMuICBJZiBub3QsIHVzZSBub3JtYWwgdW5pdHRlc3QgdGVzdCBsb2FkaW5nLgotICAgICAgICAgICAgdGVzdF9ydW5uZXIgPSBnZXRhdHRyKHRoZV9tb2R1bGUsICJ0ZXN0X21haW4iLCBOb25lKQotICAgICAgICAgICAgaWYgdGVzdF9ydW5uZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW5uZXIoKToKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgIHRlc3RzID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGhlX21vZHVsZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIGxvYWRlci5lcnJvcnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludChlcnJvciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIuZXJyb3JzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvcnMgd2hpbGUgbG9hZGluZyB0ZXN0cyIpCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3RzKQotICAgICAgICAgICAgdGVzdF9ydW5uZXIoKQotICAgICAgICAgICAgaWYgaHVudHJsZWFrczoKLSAgICAgICAgICAgICAgICByZWZsZWFrID0gZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIHRlc3RfcnVubmVyLCBodW50cmxlYWtzKQotICAgICAgICAgICAgdGVzdF90aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgZXhjZXB0IHN1cHBvcnQuUmVzb3VyY2VEZW5pZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcGdvOgotICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgotICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQ6Ci0gICAgICAgIG1zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKLSAgICAgICAgaWYgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImNyYXNoZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgIGVsc2U6Ci0gICAgICAgIGlmIHJlZmxlYWs6Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICAgICAgaWYgZW52aXJvbm1lbnQuY2hhbmdlZDoKLSAgICAgICAgICAgIHJldHVybiBFTlZfQ0hBTkdFRCwgdGVzdF90aW1lCi0gICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQotCi1kZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6Ci0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCBzdGF0Ci0gICAgaW1wb3J0IGdjCi0KLSAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCi0gICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0Ci0gICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgotICAgIGdjLmNvbGxlY3QoKQotCi0gICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQotICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cwotICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCi0gICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQotICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKLSAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCi0gICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCi0gICAgICAgICAgICAgICAgKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQotCi0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKLSAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKLSAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6Ci0gICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQotICAgICAgICAgICAgbnVrZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCi0gICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKLQotZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKLSAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgotICAgICIiIgotICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCi0gICAgaW1wb3J0IGNvcHlyZWcKLSAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi0KLSAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCi0KLSAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KLSAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCi0gICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgemlwaW1wb3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKLSAgICBlbHNlOgotICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCi0gICAgYWJjcyA9IHt9Ci0gICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKLSAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKLSAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQotCi0gICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcwotICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQotICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCi0gICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKLSAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAotCi0gICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6Ci0gICAgICAgIGluZGlyZWN0X3Rlc3QoKQotICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIGlmIGkgPj0gbndhcm11cDoKLSAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCi0gICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQotICAgICAgICBhbGxvY19iZWZvcmUsIHJjX2JlZm9yZSA9IGFsbG9jX2FmdGVyLCByY19hZnRlcgotICAgIHByaW50KGZpbGU9c3lzLnN0ZGVycikKLSAgICAjIFRoZXNlIGNoZWNrZXJzIHJldHVybiBGYWxzZSBvbiBzdWNjZXNzLCBUcnVlIG9uIGZhaWx1cmUKLSAgICBkZWYgY2hlY2tfcmNfZGVsdGFzKGRlbHRhcyk6Ci0gICAgICAgIHJldHVybiBhbnkoZGVsdGFzKQotICAgIGRlZiBjaGVja19hbGxvY19kZWx0YXMoZGVsdGFzKToKLSAgICAgICAgIyBBdCBsZWFzdCAxLzNyZCBvZiAwcwotICAgICAgICBpZiAzICogZGVsdGFzLmNvdW50KDApIDwgbGVuKGRlbHRhcyk6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAjIE5vdGhpbmcgZWxzZSB0aGFuIDFzLCAwcyBhbmQgLTFzCi0gICAgICAgIGlmIG5vdCBzZXQoZGVsdGFzKSA8PSB7MSwwLC0xfToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZhaWxlZCA9IEZhbHNlCi0gICAgZm9yIGRlbHRhcywgaXRlbV9uYW1lLCBjaGVja2VyIGluIFsKLSAgICAgICAgKHJjX2RlbHRhcywgJ3JlZmVyZW5jZXMnLCBjaGVja19yY19kZWx0YXMpLAotICAgICAgICAoYWxsb2NfZGVsdGFzLCAnbWVtb3J5IGJsb2NrcycsIGNoZWNrX2FsbG9jX2RlbHRhcyldOgotICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6Ci0gICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAotICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCi0gICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKLSAgICAgICAgICAgICAgICBwcmludChtc2csIGZpbGU9cmVmcmVwKQotICAgICAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCi0gICAgICAgICAgICBmYWlsZWQgPSBUcnVlCi0gICAgcmV0dXJuIGZhaWxlZAotCi1kZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6Ci0gICAgaW1wb3J0IGdjLCBjb3B5cmVnCi0gICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCi0gICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAotICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYwotICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCi0gICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0Ci0KLSAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCi0gICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKLSAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6Ci0gICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KLQotICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KLSAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKLSAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB6aXBpbXBvcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAotICAgIGVsc2U6Ci0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCi0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQotCi0gICAgIyBjbGVhciB0eXBlIGNhY2hlCi0gICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKLQotICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgotICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106Ci0gICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106Ci0gICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKLSAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKLSAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKLQotICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCi0gICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCi0gICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKLSAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKLQotICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KLSAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKLSAgICByZS5wdXJnZSgpCi0gICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCi0gICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKLSAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKLSAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCi0gICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQotICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKLSAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQotICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IGN0eXBlcwotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKLQotICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCi0gICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCi0gICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAotICAgIGdjLmNvbGxlY3QoKQotICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpCi0KLWRlZiB3YXJtX2NhY2hlcygpOgotICAgICMgY2hhciBjYWNoZQotICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQotICAgIGZvciBpIGluIHJhbmdlKDI1Nik6Ci0gICAgICAgIHNbaTppKzFdCi0gICAgIyB1bmljb2RlIGNhY2hlCi0gICAgeCA9IFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0KLSAgICAjIGludCBjYWNoZQotICAgIHggPSBsaXN0KHJhbmdlKC01LCAyNTcpKQotCi1kZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKLSAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgotCi1kZWYgcmVtb3ZlcHkobmFtZXMpOgotICAgIGlmIG5vdCBuYW1lczoKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgotICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBleHQgPT0gJy5weSc6Ci0gICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKLQotZGVmIGNvdW50KG4sIHdvcmQpOgotICAgIGlmIG4gPT0gMToKLSAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKLQotZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgotICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KLQotICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCi0gICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCi0gICAgYmVnaW4gZWFjaCBsaW5lLgotICAgICIiIgotCi0gICAgZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZmlsbAotICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAotICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKLSAgICBwcmludChmaWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCi0gICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCi0KLQotZGVmIG1haW5faW5fdGVtcF9jd2QoKToKLSAgICAiIiJSdW4gbWFpbigpIGluIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5LiIiIgotICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKLSAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKLSAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCi0gICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCi0gICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKLSAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKLQotICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCi0gICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgotICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcwotICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KLSAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgotICAgICAgICBtYWluKCkKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbiwgbWFpbl9pbl90ZW1wX2N3ZAogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5IGIvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQppbmRleCBkZmI0YzI1Li4yOTY5YjM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBzeXNjb25maWcKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKK2ltcG9ydCB0eXBlcwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJsbGliLmVycm9yCiBpbXBvcnQgd2FybmluZ3MKQEAgLTg5LDYgKzkwLDcgQEAKICAgICAiYmlnbWVtdGVzdCIsICJiaWdhZGRyc3BhY2V0ZXN0IiwgImNweXRob25fb25seSIsICJnZXRfYXR0cmlidXRlIiwKICAgICAicmVxdWlyZXNfSUVFRV83NTQiLCAic2tpcF91bmxlc3NfeGF0dHIiLCAicmVxdWlyZXNfemxpYiIsCiAgICAgImFudGljaXBhdGVfZmFpbHVyZSIsICJsb2FkX3BhY2thZ2VfdGVzdHMiLCAiZGV0ZWN0X2FwaV9taXNtYXRjaCIsCisgICAgImNoZWNrX19hbGxfXyIsCiAgICAgIyBzeXMKICAgICAiaXNfanl0aG9uIiwgImNoZWNrX2ltcGxfZGV0YWlsIiwKICAgICAjIG5ldHdvcmsKQEAgLTIyMDIsNiArMjIwNCw2NSBAQAogICAgIHJldHVybiBtaXNzaW5nX2l0ZW1zCiAKIAorZGVmIGNoZWNrX19hbGxfXyh0ZXN0X2Nhc2UsIG1vZHVsZSwgbmFtZV9vZl9tb2R1bGU9Tm9uZSwgZXh0cmE9KCksCisgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD0oKSk6CisgICAgIiIiQXNzZXJ0IHRoYXQgdGhlIF9fYWxsX18gdmFyaWFibGUgb2YgJ21vZHVsZScgY29udGFpbnMgYWxsIHB1YmxpYyBuYW1lcy4KKworICAgIFRoZSBtb2R1bGUncyBwdWJsaWMgbmFtZXMgKGl0cyBBUEkpIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uCisgICAgd2hldGhlciB0aGV5IG1hdGNoIHRoZSBwdWJsaWMgbmFtZSBjb252ZW50aW9uIGFuZCB3ZXJlIGRlZmluZWQgaW4KKyAgICAnbW9kdWxlJy4KKworICAgIFRoZSAnbmFtZV9vZl9tb2R1bGUnIGFyZ3VtZW50IGNhbiBzcGVjaWZ5IChhcyBhIHN0cmluZyBvciB0dXBsZSB0aGVyZW9mKQorICAgIHdoYXQgbW9kdWxlKHMpIGFuIEFQSSBjb3VsZCBiZSBkZWZpbmVkIGluIGluIG9yZGVyIHRvIGJlIGRldGVjdGVkIGFzIGEKKyAgICBwdWJsaWMgQVBJLiBPbmUgY2FzZSBmb3IgdGhpcyBpcyB3aGVuICdtb2R1bGUnIGltcG9ydHMgcGFydCBvZiBpdHMgcHVibGljCisgICAgQVBJIGZyb20gb3RoZXIgbW9kdWxlcywgcG9zc2libHkgYSBDIGJhY2tlbmQgKGxpa2UgJ2NzdicgYW5kIGl0cyAnX2NzdicpLgorCisgICAgVGhlICdleHRyYScgYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgd291bGRuJ3Qgb3RoZXJ3aXNlIGJlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhcyAicHVibGljIiwgbGlrZSBvYmplY3RzIHdpdGhvdXQgYSBwcm9wZXIKKyAgICAnX19tb2R1bGVfXycgYXR0cml1YnV0ZS4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBvbmVzLgorCisgICAgVGhlICdibGFja2xpc3QnIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IG11c3Qgbm90IGJlIHRyZWF0ZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGV2ZW4gdGhvdWdoIHRoZWlyIG5hbWVzIGluZGljYXRlIG90aGVyd2lzZS4KKworICAgIFVzYWdlOgorICAgICAgICBpbXBvcnQgYmFyCisgICAgICAgIGltcG9ydCBmb28KKyAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisgICAgICAgIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZm9vKQorCisgICAgICAgIGNsYXNzIE90aGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGV4dHJhID0geydCQVJfQ09OU1QnLCAnRk9PX0NPTlNUJ30KKyAgICAgICAgICAgICAgICBibGFja2xpc3QgPSB7J2Jheid9ICAjIFVuZG9jdW1lbnRlZCBuYW1lLgorICAgICAgICAgICAgICAgICMgYmFyIGltcG9ydHMgcGFydCBvZiBpdHMgQVBJIGZyb20gX2Jhci4KKyAgICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBiYXIsICgnYmFyJywgJ19iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICIiIgorCisgICAgaWYgbmFtZV9vZl9tb2R1bGUgaXMgTm9uZToKKyAgICAgICAgbmFtZV9vZl9tb2R1bGUgPSAobW9kdWxlLl9fbmFtZV9fLCApCisgICAgZWxpZiBpc2luc3RhbmNlKG5hbWVfb2ZfbW9kdWxlLCBzdHIpOgorICAgICAgICBuYW1lX29mX21vZHVsZSA9IChuYW1lX29mX21vZHVsZSwgKQorCisgICAgZXhwZWN0ZWQgPSBzZXQoZXh0cmEpCisKKyAgICBmb3IgbmFtZSBpbiBkaXIobW9kdWxlKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfJykgb3IgbmFtZSBpbiBibGFja2xpc3Q6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKyAgICAgICAgaWYgKGdldGF0dHIob2JqLCAnX19tb2R1bGVfXycsIE5vbmUpIGluIG5hbWVfb2ZfbW9kdWxlIG9yCisgICAgICAgICAgICAgICAgKG5vdCBoYXNhdHRyKG9iaiwgJ19fbW9kdWxlX18nKSBhbmQKKyAgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5Nb2R1bGVUeXBlKSkpOgorICAgICAgICAgICAgZXhwZWN0ZWQuYWRkKG5hbWUpCisgICAgdGVzdF9jYXNlLmFzc2VydENvdW50RXF1YWwobW9kdWxlLl9fYWxsX18sIGV4cGVjdGVkKQorCisKIGNsYXNzIFN1cHByZXNzQ3Jhc2hSZXBvcnQ6CiAgICAgIiIiVHJ5IHRvIHByZXZlbnQgYSBjcmFzaCByZXBvcnQgZnJvbSBwb3BwaW5nIHVwLgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQppbmRleCBmNDhlODVjLi4zMWRiMDkwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKQEAgLTQ1MTIsNiArNDUxMiwyMSBAQAogICAgICAgICBzdHJpbmcgPSAiTmFtZXNwYWNlKGJhcj0nc3BhbScsIGZvbz00MikiCiAgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKIAorICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9zdGFya3dhcmdzX25vdGlkZW50aWZpZXIoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKCoqeyciJzogJ3F1b3RlJ30pCisgICAgICAgIHN0cmluZyA9ICIiIk5hbWVzcGFjZSgqKnsnIic6ICdxdW90ZSd9KSIiIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfa3dhcmdzX2FuZF9zdGFya3dhcmdzX25vdGlkZW50aWZpZXIoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKGE9MSwgKip7JyInOiAncXVvdGUnfSkKKyAgICAgICAgc3RyaW5nID0gIiIiTmFtZXNwYWNlKGE9MSwgKip7JyInOiAncXVvdGUnfSkiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX3N0YXJrd2FyZ3NfaWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKip7J3ZhbGlkJzogVHJ1ZX0pCisgICAgICAgIHN0cmluZyA9ICJOYW1lc3BhY2UodmFsaWQ9VHJ1ZSkiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKwogICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKICAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCiAgICAgICAgIHN0cmluZyA9ICgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CmluZGV4IDgzNjdhZmUuLmZiYzkzM2U0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKQEAgLTE1OSwxMSArMTU5LDI1IEBACiAgICAgICAgICMgVGhlbiBjYWxjdWxhdGUgdGhlIGhleGJpbjQgYmluYXJ5LXRvLUFTQ0lJIHRyYW5zbGF0aW9uCiAgICAgICAgIHJsZSA9IGJpbmFzY2lpLnJsZWNvZGVfaHF4KHNlbGYuZGF0YSkKICAgICAgICAgYSA9IGJpbmFzY2lpLmIyYV9ocXgoc2VsZi50eXBlMnRlc3QocmxlKSkKKwogICAgICAgICBiLCBfID0gYmluYXNjaWkuYTJiX2hxeChzZWxmLnR5cGUydGVzdChhKSkKICAgICAgICAgcmVzID0gYmluYXNjaWkucmxlZGVjb2RlX2hxeChiKQotCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZWxmLnJhd2RhdGEpCiAKKyAgICBkZWYgdGVzdF9ybGUoc2VsZik6CisgICAgICAgICMgdGVzdCByZXBldGl0aW9uIHdpdGggYSByZXBldGl0aW9uIGxvbmdlciB0aGFuIHRoZSBsaW1pdCBvZiAyNTUKKyAgICAgICAgZGF0YSA9IChiJ2EnICogMTAwICsgYidiJyArIGInYycgKiAzMDApCisKKyAgICAgICAgZW5jb2RlZCA9IGJpbmFzY2lpLnJsZWNvZGVfaHF4KGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYidhXHg5MGQnICAgICAgIyAnYScgKiAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYidiJyAgICAgICAgICAgIyAnYicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYidjXHg5MFx4ZmYnICAgIyAnYycgKiAyNTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYidjXHg5MC0nKSkgICAgIyAnYycgKiA0NQorCisgICAgICAgIGRlY29kZWQgPSBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KGVuY29kZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZCwgZGF0YSkKKwogICAgIGRlZiB0ZXN0X2hleChzZWxmKToKICAgICAgICAgIyB0ZXN0IGhleGxpZmljYXRpb24KICAgICAgICAgcyA9IGIne3NcMDA1XDAwMFwwMDBcMDAwd29ybGRpXDAwMlwwMDBcMDAwXDAwMHNcMDA1XDAwMFwwMDBcMDAwaGVsbG9pXDAwMVwwMDBcMDAwXDAwMDAnCkBAIC0yNjIsNiArMjc2LDE2IEBACiAgICAgICAgICAgICAjIG5vbi1BU0NJSSBzdHJpbmcKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEyYiwgIlx4ODAiKQogCisgICAgZGVmIHRlc3RfYjJhX2Jhc2U2NF9uZXdsaW5lKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyNTM1NzogdGVzdCBuZXdsaW5lIHBhcmFtZXRlcgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FHVnNiRzg9XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9iYXNlNjQoYiwgbmV3bGluZT1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FHVnNiRzg9XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9iYXNlNjQoYiwgbmV3bGluZT1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhR1ZzYkc4PScpCisKIAogY2xhc3MgQXJyYXlCaW5BU0NJSVRlc3QoQmluQVNDSUlUZXN0KToKICAgICBkZWYgdHlwZTJ0ZXN0KHNlbGYsIHMpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weSBiL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKaW5kZXggY2FmMjhmZC4uZTgxMzE5MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CkBAIC0zMDEsNiArMzAxLDIwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsICdceDAwJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCwgJzEyICAgXHgwMCAgIDM0JykKIAorICAgICAgICBmb3IgZGF0YSwgcG9zIGluICgKKyAgICAgICAgICAgICMgaW52YWxpZCBmaXJzdCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICgnMTIgeDQgNTYnLCAzKSwKKyAgICAgICAgICAgICMgaW52YWxpZCBzZWNvbmQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyCisgICAgICAgICAgICAoJzEyIDN4IDU2JywgNCksCisgICAgICAgICAgICAjIHR3byBpbnZhbGlkIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICgnMTIgeHkgNTYnLCAzKSwKKyAgICAgICAgICAgICMgdGVzdCBub24tQVNDSUkgc3RyaW5nCisgICAgICAgICAgICAoJzEyIDNceGZmIDU2JywgNCksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2F0IHBvc2l0aW9uICVzJyAlIHBvcywgc3RyKGNtLmV4Y2VwdGlvbikpCisKICAgICBkZWYgdGVzdF9oZXgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuaGV4KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmhleCwgMSkKQEAgLTc5NiwyNiArODEwLDEwNyBAQAogCiAgICAgIyBUZXN0IFB5Qnl0ZXNfRnJvbUZvcm1hdCgpCiAgICAgZGVmIHRlc3RfZnJvbV9mb3JtYXQoc2VsZik6Ci0gICAgICAgIHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjdHlwZXMnKQotICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBweV9vYmplY3QsIGNfaW50LCBjX2NoYXJfcAorICAgICAgICBjdHlwZXMgPSB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKKyAgICAgICAgX3Rlc3RjYXBpID0gdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190ZXN0Y2FwaScpCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBweXRob25hcGksIHB5X29iamVjdAorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgKAorICAgICAgICAgICAgY19pbnQsIGNfdWludCwKKyAgICAgICAgICAgIGNfbG9uZywgY191bG9uZywKKyAgICAgICAgICAgIGNfc2l6ZV90LCBjX3NzaXplX3QsCisgICAgICAgICAgICBjX2NoYXJfcCkKKwogICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQgPSBweXRob25hcGkuUHlCeXRlc19Gcm9tRm9ybWF0CiAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdC5yZXN0eXBlID0gcHlfb2JqZWN0CiAKKyAgICAgICAgIyBiYXNpYyB0ZXN0cwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Zvcm1hdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGInZm9ybWF0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidIZWxsbyAlcyAhJywgYid3b3JsZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInSGVsbG8gd29ybGQgIScpCiAKKyAgICAgICAgIyB0ZXN0IGZvcm1hdHRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1cMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KG9yZCgnQCcpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPUAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludCgyNTUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9XHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInZD0lZCBsZD0lbGQgemQ9JXpkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQoMSksIGNfbG9uZygyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInZD0xIGxkPTIgemQ9MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInZD0lZCBsZD0lbGQgemQ9JXpkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQoLTEpLCBjX2xvbmcoLTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3NpemVfdCgtMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInZD0tMSBsZD0tMiB6ZD0tMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIndT0ldSBsdT0lbHUgenU9JXp1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY191aW50KDEyMyksIGNfdWxvbmcoNDU2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoNzg5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYid1PTEyMyBsdT00NTYgenU9Nzg5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidpPSVpJywgY19pbnQoMTIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidpPTEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInaT0laScsIGNfaW50KC0xMjMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2k9LTEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIneD0leCcsIGNfaW50KDB4YWJjKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYid4PWFiYycpCisKKyAgICAgICAgc2l6ZW9mX3B0ciA9IGN0eXBlcy5zaXplb2YoY19jaGFyX3ApCisKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgIyBXaW5kb3dzIChNU0NSVCkKKyAgICAgICAgICAgIHB0cl9mb3JtYXQgPSAnMHglMHt9WCcuZm9ybWF0KDIgKiBzaXplb2ZfcHRyKQorICAgICAgICAgICAgZGVmIHB0cl9mb3JtYXR0ZXIocHRyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHB0cl9mb3JtYXQgJSBwdHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVOSVggKGdsaWJjKQorICAgICAgICAgICAgZGVmIHB0cl9mb3JtYXR0ZXIocHRyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJyUjeCcgJSBwdHIKKworICAgICAgICBwdHIgPSAweGFiY2RlZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3B0cj0lcCcsIGNfY2hhcl9wKHB0cikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgncHRyPScgKyBwdHJfZm9ybWF0dGVyKHB0cikpLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidzPSVzJywgY19jaGFyX3AoYidjc3RyJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIncz1jc3RyJykKKworICAgICAgICAjIHRlc3QgbWluaW11bSBhbmQgbWF4aW11bSBpbnRlZ2VyIHZhbHVlcworICAgICAgICBzaXplX21heCA9IGNfc2l6ZV90KC0xKS52YWx1ZQorICAgICAgICBmb3IgZm9ybWF0c3RyLCBjdHlwZXNfdHlwZSwgdmFsdWUsIHB5X2Zvcm1hdHRlciBpbiAoCisgICAgICAgICAgICAoYiclZCcsIGNfaW50LCBfdGVzdGNhcGkuSU5UX01JTiwgc3RyKSwKKyAgICAgICAgICAgIChiJyVkJywgY19pbnQsIF90ZXN0Y2FwaS5JTlRfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJWxkJywgY19sb25nLCBfdGVzdGNhcGkuTE9OR19NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclbGQnLCBjX2xvbmcsIF90ZXN0Y2FwaS5MT05HX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsdScsIGNfdWxvbmcsIF90ZXN0Y2FwaS5VTE9OR19NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclemQnLCBjX3NzaXplX3QsIF90ZXN0Y2FwaS5QWV9TU0laRV9UX01JTiwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6ZCcsIGNfc3NpemVfdCwgX3Rlc3RjYXBpLlBZX1NTSVpFX1RfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJXp1JywgY19zaXplX3QsIHNpemVfbWF4LCBzdHIpLAorICAgICAgICAgICAgKGInJXAnLCBjX2NoYXJfcCwgc2l6ZV9tYXgsIHB0cl9mb3JtYXR0ZXIpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoZm9ybWF0c3RyLCBjdHlwZXNfdHlwZSh2YWx1ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9mb3JtYXR0ZXIodmFsdWUpLmVuY29kZSgnYXNjaWknKSksCisKKyAgICAgICAgIyB3aWR0aCBhbmQgcHJlY2lzaW9uICh3aWR0aCBpcyBjdXJyZW50bHkgaWdub3JlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclNXMnLCBiJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUuM3MnLCBiJ2FiY2RlZicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYWJjJykKKworICAgICAgICAjICclJScgZm9ybWF0dGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJyUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ1slJV0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1slXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUlYycsIGNfaW50KG9yZCgnXycpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclXycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSVzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclcycpCisKKyAgICAgICAgIyBJbnZhbGlkIGZvcm1hdHMgYW5kIHBhcnRpYWwgZm9ybWF0dGluZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUnKSwgYiclJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJScpLCBiJyUnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlcycpLCBiJyVzJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidbJSVdJyksIGInWyVdJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJSVjJywgY19pbnQob3JkKCdfJykpKSwgYiclXycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIneD0laSB5PSUnLCBjX2ludCgyKSwgY19pbnQoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIneD0yIHk9JScpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjOiVjJywgY19pbnQoMjU1KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYidjOlx4ZmYnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3M6JXMnLCBjX2NoYXJfcChiJ2NzdHInKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYidzOmNzdHInKQotCi0gICAgICAgICMgSXNzdWUgIzE5OTY5CisgICAgICAgICMgSXNzdWUgIzE5OTY5OiAlYyBtdXN0IHJhaXNlIE92ZXJmbG93RXJyb3IgZm9yIHZhbHVlcworICAgICAgICAjIG5vdCBpbiB0aGUgcmFuZ2UgWzA7IDI1NV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0LCBiJyVjJywgY19pbnQoLTEpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weSBiL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKaW5kZXggODBlZDYzMi4uZDlkMzEyOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CkBAIC03MDIsMTkgKzcwMiwxOSBAQAogCiAgICAgZGVmIGFzc2VydEZhaWx1cmUoc2VsZiwgKmFyZ3MpOgogICAgICAgICByYywgc3Rkb3V0LCBzdGRlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1tJywgJ2NhbGVuZGFyJywgKmFyZ3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVc2FnZTonLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYid1c2FnZTonLCBzdGRlcnIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDIpCiAKICAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgogICAgICAgICBzdGRvdXQgPSBzZWxmLnJ1bl9vaygnLWgnKQotICAgICAgICBzZWxmLmFzc2VydEluKGInVXNhZ2U6Jywgc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydEluKGIndXNhZ2U6Jywgc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydEluKGInY2FsZW5kYXIucHknLCBzdGRvdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYictLWhlbHAnLCBzdGRvdXQpCiAKICAgICBkZWYgdGVzdF9pbGxlZ2FsX2FyZ3VtZW50cyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCcteicpCi0gICAgICAgICNzZWxmLmFzc2VydEZhaWx1cmUoJ3NwYW0nKQotICAgICAgICAjc2VsZi5hc3NlcnRGYWlsdXJlKCcyMDA0JywgJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJzIwMDQnLCAnc3BhbScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnLXQnLCAnaHRtbCcsICcyMDA0JywgJzEnKQogCiAgICAgZGVmIHRlc3Rfb3V0cHV0X2N1cnJlbnRfeWVhcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IGRjZTQxOGIuLjhmYWE4ZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMzQ4LDggKzM0OCw5IEBACiAgICAgICAgICAgICB0ZXN0LnN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpLl9fZW50ZXJfXygpCiAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4JykKICAgICAgICAgICAgIG9zLmNsb3NlKHN5cy5zdGRvdXQuZmlsZW5vKCkpIiIiCi0gICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1jJywgY29kZSkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctYycsIGNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIwLCByYykKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnIuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnRXhjZXB0aW9uIGlnbm9yZWQgaW4uKlxuT1NFcnJvcjogLionKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IGI5M2UwYWIuLjQ3NDBiNjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0yNyw2ICsyNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKICAgICByZXR1cm4gY2hlY2sKIAorCiBjbGFzcyBRdWV1ZShvYmplY3QpOgogICAgICIiIgogICAgIHF1ZXVlOiB3cml0ZSBieXRlcyBhdCBvbmUgZW5kLCByZWFkIGJ5dGVzIGZyb20gdGhlIG90aGVyIGVuZApAQCAtNDcsNiArNDgsNyBAQAogICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gc2VsZi5fYnVmZmVyW3NpemU6XQogICAgICAgICAgICAgcmV0dXJuIHMKIAorCiBjbGFzcyBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZzoKICAgICBkZWYgY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKHNlbGYsIGVuY29kaW5nLCB1LCBzKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgpAQCAtODAsNiArODIsNyBAQAogICAgICAgICAgICAgcGFydDIgPSBkLmVuY29kZSh1W2k6XSwgVHJ1ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGFydDErcGFydDIpCiAKKwogY2xhc3MgUmVhZFRlc3QoTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiBjaGVja19wYXJ0aWFsKHNlbGYsIGlucHV0LCBwYXJ0aWFscmVzdWx0cyk6CiAgICAgICAgICMgZ2V0IGEgU3RyZWFtUmVhZGVyIGZvciB0aGUgZW5jb2RpbmcgYW5kIGZlZWQgdGhlIGJ5dGVzdHJpbmcgdmVyc2lvbgpAQCAtMzU4LDYgKzM2MSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIls/XSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQogCisgICAgICAgICMgc2VxdWVudGlhbCBzdXJyb2dhdGUgY2hhcmFjdGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJpZ25vcmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1RDgwMFx1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbPz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisKICAgICAgICAgYm9tID0gIiIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIGZvciBiZWZvcmUsIGFmdGVyIGluIFsoIlxVMDAwMTBmZmYiLCAiQSIpLCAoIlsiLCAiXSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJBIiwgIlxVMDAwMTBmZmYiKV06CkBAIC0zODMsNiArMzkyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9zZXF1ZW5jZS5kZWNvZGUoc2VsZi5lbmNvZGluZywgImJhY2tzbGFzaHJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlICsgYmFja3NsYXNocmVwbGFjZSArIGFmdGVyKQogCisKIGNsYXNzIFVURjMyVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMiIKICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgpAQCAtNDc4LDYgKzQ4OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2JlKVswXSkKIAorCiBjbGFzcyBVVEYzMkxFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1sZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDgwXHhkY1x4MDBceDAwIgpAQCAtNTIzLDYgKzUzNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2xlX2RlY29kZShlbmNvZGVkKVswXSkKIAorCiBjbGFzcyBVVEYzMkJFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1iZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDAwXHgwMFx4ZGNceDgwIgpAQCAtNzQ3LDYgKzc1OSw3IEBACiAgICAgZW5jb2RpbmcgPSAidXRmLTgiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZSA9IGIiXHhlZFx4YjJceDgwIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2VfcmVwbGFjZSA9ICJcdWZmZmQiICogMworICAgIEJPTSA9IGInJwogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKApAQCAtNzc1LDI3ICs3ODgsNDkgQEAKICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZi5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSwgdS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZShzZWxmLmVuY29kaW5nLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCiAgICAgZGVmIHRlc3RfbG9uZV9zdXJyb2dhdGVzKHNlbGYpOgogICAgICAgICBzdXBlcigpLnRlc3RfbG9uZV9zdXJyb2dhdGVzKCkKICAgICAgICAgIyBub3Qgc3VyZSBpZiB0aGlzIGlzIG1ha2luZyBzZW5zZSBmb3IKICAgICAgICAgIyBVVEYtMTYgYW5kIFVURi0zMgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKCd1dGYtOCcsICJzdXJyb2dhdGVlc2NhcGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ1tceDgwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYidbXHg4MF0nKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICJbXHVEQzgwXHVEODAwXHVERkZGXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQorICAgICAgICBleGMgPSBjbS5leGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSwgJ1x1RDgwMFx1REZGRicpCiAKICAgICBkZWYgdGVzdF9zdXJyb2dhdGVwYXNzX2hhbmRsZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImFiY1x1ZDgwMGRlZiIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiYWJjXHhlZFx4YTBceDgwZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceGVkXHhhMFx4ODBceGVkXHhiMlx4ODBdJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjXHVkODAwZGVmIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlxVMDAwMTBmZmZcdUQ4MDAiKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlY3MubG9va3VwX2Vycm9yKCJzdXJyb2dhdGVwYXNzIikpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpCisgICAgICAgICAgICBiImFiY1x4ZWRceGEwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBiImFiY1x4ZWRceGEweiIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAogICAgICAgICAgICAgICAgICAgICAgJ2NwNjUwMDEgaXMgYSBXaW5kb3dzLW9ubHkgY29kZWMnKQpAQCAtMTA1OSw2ICsxMDk0LDcgQEAKIAogY2xhc3MgVVRGOFNpZ1Rlc3QoVVRGOFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBlbmNvZGluZyA9ICJ1dGYtOC1zaWciCisgICAgQk9NID0gY29kZWNzLkJPTV9VVEY4CiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCkBAIC0xMTk0LDYgKzEyMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJpZ25vcmUiKSwgKGIiW10iLCA4KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4MF1ceDAiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgOCkpCiAKKwogY2xhc3MgUmVjb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZWNvZGluZyhzZWxmKToKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTMxMyw2ICsxMzUwLDcgQEAKICAgICBpZiBsZW4oaSkhPTI6CiAgICAgICAgIHByaW50KHJlcHIoaSkpCiAKKwogY2xhc3MgUHVueWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CiAgICAgICAgIGZvciB1bmksIHB1bnkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgpAQCAtMTMzMiw2ICsxMzcwLDcgQEAKICAgICAgICAgICAgIHB1bnkgPSBwdW55LmRlY29kZSgiYXNjaWkiKS5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pLCBwdW55LmRlY29kZSgicHVueWNvZGUiKSkKIAorCiBjbGFzcyBVbmljb2RlSW50ZXJuYWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhTSVpFT0ZfV0NIQVJfVCA9PSA0LCAnc3BlY2lmaWMgdG8gMzItYml0IHdjaGFyX3QnKQogICAgIGRlZiB0ZXN0X2J1ZzEyNTEzMDAoc2VsZik6CkBAIC0xNTg2LDYgKzE2MjUsNyBAQAogICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKIAorCiBjbGFzcyBJRE5BQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9idWlsdGluX2RlY29kZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYiJweXRob24ub3JnIiwgImlkbmEiKSwgInB5dGhvbi5vcmciKQpAQCAtMTY3Miw2ICsxNzEyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICBiInB5dGhvbi5vcmciLmRlY29kZSwgImlkbmEiLCBlcnJvcnMpCiAKKwogY2xhc3MgQ29kZWNzTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CkBAIC0xNzgwLDYgKzE4MjEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLAogICAgICAgICAgICAgICAgIGNvZGVjcy5kZWNvZGUsIGInYWJjJywgJ3VuZGVmaW5lZCcsIGVycm9ycykKIAorCiBjbGFzcyBTdHJlYW1SZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE3OTAsNiArMTgzMiw3IEBACiAgICAgICAgIGYgPSBzZWxmLnJlYWRlcihzZWxmLnN0cmVhbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbJ1x1ZDU1Y1xuJywgJ1x1YWUwMCddKQogCisKIGNsYXNzIEVuY29kZWRGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTE5MjAsNiArMTk2Myw3IEBACiAgICAgInVuaWNvZGVfaW50ZXJuYWwiCiBdCiAKKwogY2xhc3MgQmFzaWNVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKICAgICAgICAgcyA9ICJhYmMxMjMiICAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCkBAIC0yMDgyLDYgKzIxMjYsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKGVuY29kaW5nLCB1LCB1LmVuY29kZShlbmNvZGluZykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19lbmNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKIAorCiBjbGFzcyBDaGFybWFwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3dpdGhfc3RyaW5nX21hcChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTIzMzIsNiArMjM3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXdyaXRlciwgJ3N0cmljdCcpIGFzIHNydzoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3J3LnJlYWQoKSwgIlx4ZmMiKQogCisKIGNsYXNzIFR5cGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgTW9zdCBkZWNvZGVycyBkb24ndCBhY2NlcHQgdW5pY29kZSBpbnB1dApAQCAtMjYyMiw2ICsyNjY4LDcgQEAKICAgICBieXRlc190cmFuc2Zvcm1fZW5jb2RpbmdzLmFwcGVuZCgiYnoyX2NvZGVjIikKICAgICB0cmFuc2Zvcm1fYWxpYXNlc1siYnoyX2NvZGVjIl0gPSBbImJ6MiJdCiAKKwogY2xhc3MgVHJhbnNmb3JtQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKQEAgLTMwOTksNSArMzE0Niw4MSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsICgnYWJjJywgMykpCiAKIAorY2xhc3MgQVNDSUlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYzEyMycuZW5jb2RlKCdhc2NpaScpLCBiJ2FiYzEyMycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAnaWdub3JlJywgYidbXScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNdJywgJ3JlcGxhY2UnLCBiJ1s/Pz9dJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzEyODsmIzI1NTsmIzgzNjQ7XScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNcVTAwMGFiY2RlXScsICdiYWNrc2xhc2hyZXBsYWNlJywKKyAgICAgICAgICAgICBiJ1tcXHg4MFxceGZmXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHVkYzgwXHVkY2ZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCBiJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHhmZicuZW5jb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJy5kZWNvZGUoJ2FzY2lpJyksICdhYmMnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdpZ25vcmUnLCAnW10nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAncmVwbGFjZScsICdbXHVmZmZkXHVmZmZkXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCAnW1x1ZGM4MFx1ZGNmZl0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnYmFja3NsYXNocmVwbGFjZScsICdbXFx4ODBcXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworCitjbGFzcyBMYXRpbjFUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ2FiYycsIGInYWJjJyksCisgICAgICAgICAgICAoJ1x4ODBceGU5XHhmZicsIGInXHg4MFx4ZTlceGZmJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ3JlcGxhY2UnLCBiJ1s/P10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xcdTIwYWNcXFUwMDBhYmNkZV0nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzgzNjQ7JiM1NjQ0ODtdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnbGF0aW4xJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHUyMGFjJy5lbmNvZGUoJ2xhdGluMScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInYWJjJywgJ2FiYycpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQppbmRleCAyY2U4YTYxLi40MzljMTI1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHN5cwogaW1wb3J0IGNvbXBpbGVhbGwKIGltcG9ydCBpbXBvcnRsaWIudXRpbAoraW1wb3J0IHRlc3QudGVzdF9pbXBvcnRsaWIudXRpbAogaW1wb3J0IG9zCiBpbXBvcnQgcGF0aGxpYgogaW1wb3J0IHB5X2NvbXBpbGUKQEAgLTQwLDYgKzQxLDExIEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyZWN0b3J5KQogCisgICAgZGVmIGFkZF9iYWRfc291cmNlX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYmFkX3NvdXJjZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuZGlyZWN0b3J5LCAnX3Rlc3RfYmFkLnB5JykKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmFkX3NvdXJjZV9wYXRoLCAndycpIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKCd4IChcbicpCisKICAgICBkZWYgZGF0YShzZWxmKToKICAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmNfcGF0aCwgJ3JiJykgYXMgZmlsZToKICAgICAgICAgICAgIGRhdGEgPSBmaWxlLnJlYWQoOCkKQEAgLTc4LDE1ICs4NCwzMSBAQAogICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9maWxlKHNlbGYuc291cmNlX3BhdGgsIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCi0gICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0PVRydWUpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aDIpKQogICAgICAgICBvcy51bmxpbmsoc2VsZi5iY19wYXRoKQogICAgICAgICBvcy51bmxpbmsoc2VsZi5iY19wYXRoMikKKyAgICAgICAgIyBUZXN0IGFnYWluc3QgYmFkIGZpbGVzCisgICAgICAgIHNlbGYuYWRkX2JhZF9zb3VyY2VfZmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5iYWRfc291cmNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PTIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9MikpCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3BhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfcGF0aChxdWlldD0yKSkKKworICAgICAgICB3aXRoIHRlc3QudGVzdF9pbXBvcnRsaWIudXRpbC5pbXBvcnRfc3RhdGUocGF0aD1bc2VsZi5kaXJlY3RvcnldKToKKyAgICAgICAgICAgIHNlbGYuYWRkX2JhZF9zb3VyY2VfZmlsZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbXBpbGVhbGwuY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBxdWlldD0yKSkKIAogICAgIGRlZiB0ZXN0X25vX3B5Y2FjaGVfaW5fbm9uX3BhY2thZ2Uoc2VsZik6CiAgICAgICAgICMgQnVnIDg1NjMgcmVwb3J0ZWQgdGhhdCBfX3B5Y2FjaGVfXyBkaXJlY3RvcmllcyBnb3QgY3JlYXRlZCBieQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jc3YucHkgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQppbmRleCBhOTBjN2IyLi45MjFmZDRhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Nzdi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nzdi5weQpAQCAtMTA5Nyw1ICsxMDk3LDExIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7J19fZG9jX18nLCAnX192ZXJzaW9uX18nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjc3YsICgnY3N2JywgJ19jc3YnKSwgZXh0cmE9ZXh0cmEpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCAxMzdhYWE1Li5mNmQ1OGZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0yMDQ3LDYgKzIwNDcsMzkgQEAKICAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMiwgNywgMSksICdGJykgKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksICdGJykpCiAKKyAgICBkZWYgdGVzdF9hc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKKworICAgICAgICAjIGV4Y2VwdGlvbmFsIGNhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLWluZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdzbmFuMTIzJykpCisKKyAgICAgICAgZm9yIGV4cCBpbiByYW5nZSgtNCwgMik6CisgICAgICAgICAgICBmb3IgY29lZmYgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgZm9yIHNpZ24gaW4gJysnLCAnLSc6CisgICAgICAgICAgICAgICAgICAgIGQgPSBEZWNpbWFsKCclcyVkRSVkJyAlIChzaWduLCBjb2VmZiwgZXhwKSkKKyAgICAgICAgICAgICAgICAgICAgcHEgPSBkLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICAgICAgICAgICBwLCBxID0gcHEKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHJldHVybiB0eXBlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwcSwgdHVwbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwLCBpbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShxLCBpbnQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBub3JtYWxpemF0aW9uOiAgcSBzaG91bGQgYmUgcG9zaXRpdmU7CisgICAgICAgICAgICAgICAgICAgICMgcCBzaG91bGQgYmUgcmVsYXRpdmVseSBwcmltZSB0byBxLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIocSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmdjZChwLCBxKSwgMSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgcC9xIGFjdHVhbGx5IGdpdmVzIHRoZSBjb3JyZWN0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChwKSAvIERlY2ltYWwocSksIGQpCisKICAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgIyBEaWZmZXJlbnQgYmVoYXZpb3VycyB3aGVuIHN1YmNsYXNzaW5nIERlY2ltYWwKICAgICAgICAgRGVjaW1hbCA9IHNlbGYuZGVjaW1hbC5EZWNpbWFsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCA4NzE4NzE2Li5jNjFlODBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTY1NCw2ICs2NTQsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvciBtYXhsZW4gaW4gcmFuZ2UoLTEsIDYpOgorICAgICAgICAgICAgICAgIHMgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBqIGluIHJhbmdlKGkpXQorICAgICAgICAgICAgICAgIGQgPSBkZXF1ZShzKSBpZiBtYXhsZW4gPT0gLTEgZWxzZSBkZXF1ZShzLCBtYXhsZW4pCisgICAgICAgICAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tYXhsZW4sIGUubWF4bGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoeCBpcyB5IGZvciB4LCB5IGluIHppcChkLCBlKSkpCisKICAgICBkZWYgdGVzdF9jb3B5X21ldGhvZChzZWxmKToKICAgICAgICAgbXV0ID0gWzEwXQogICAgICAgICBkID0gZGVxdWUoW211dF0pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCBmNWU0YjAyLi4wNmQ2NjBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTQ3MzgsMTEgKzQ3MzgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoYXJncywga3dhcmdzKQogICAgICAgICBvYmogPSBDMygpCiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6Ci0gICAgICAgICAgICBpZiBwcm90byA+PSA0OgorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1Y2UocHJvdG8sIG9iaiwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxpZiBwcm90byA+PSAyOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIG9iai5fX3JlZHVjZV9leF9fKHByb3RvKQogCiAgICAgICAgIGNsYXNzIEM0OgogICAgICAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgpAQCAtNTA2MSwxMCArNTA1OCw2IEBACiAgICAgICAgICAgICAgICAga3dhcmdzID0gZ2V0YXR0cihjbHMsICdLV0FSR1MnLCB7fSkKICAgICAgICAgICAgICAgICBvYmogPSBjbHMoKmNscy5BUkdTLCAqKmt3YXJncykKICAgICAgICAgICAgICAgICBwcm90byA9IHBpY2tsZV9jb3BpZXIucHJvdG8KLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNCBhbmQgaGFzYXR0cihjbHMsICdfX2dldG5ld2FyZ3NfZXhfXycpOgotICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvcGllci5kdW1wcyhvYmosIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIG9iamNvcHkgPSBwaWNrbGVfY29waWVyLmNvcHkob2JqKQogICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9pc19jb3B5KG9iaiwgb2JqY29weSkKICAgICAgICAgICAgICAgICAjIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBzdXBwb3J0cyB0aGlzLCBtYWtlIHN1cmUgd2UgZGlkbid0IGdvCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3R2aWV3cy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CmluZGV4IDc4N2VmMjAuLjI0NWY4YzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CkBAIC0xLDMgKzEsNCBAQAoraW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHVuaXR0ZXN0CkBAIC0yMTUsNiArMjE2LDI3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBwaWNrbGUuUGlja2xpbmdFcnJvciksCiAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzLCBkLml0ZW1zKCksIHByb3RvKQogCisgICAgZGVmIHRlc3RfYWJjX3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBkID0gZGljdChhPTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5LZXlzVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuSXRlcmFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5WYWx1ZXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC52YWx1ZXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVtc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNpemVkKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5IGIvTGliL3Rlc3QvdGVzdF9laW50ci5weQppbmRleCBhYWJhZDgzLi43NTQ1MmYyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKQEAgLTE2LDE0ICsxNiw4IEBACiAgICAgICAgICMgUnVuIHRoZSB0ZXN0ZXIgaW4gYSBzdWItcHJvY2VzcywgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lCiAgICAgICAgICMgdGhyZWFkIChmb3IgcmVsaWFibGUgc2lnbmFsIGRlbGl2ZXJ5KS4KICAgICAgICAgdGVzdGVyID0gc3VwcG9ydC5maW5kZmlsZSgiZWludHJfdGVzdGVyLnB5Iiwgc3ViZGlyPSJlaW50cmRhdGEiKQotCi0gICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHRlc3Rlcl0KLSAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihhcmdzKSBhcyBwcm9jOgotICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gcHJvYy53YWl0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhpdGNvZGUsIDApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sodGVzdGVyKQorICAgICAgICAjIHVzZSAtdSB0byB0cnkgdG8gZ2V0IHRoZSBmdWxsIG91dHB1dCBpZiB0aGUgdGVzdCBoYW5ncyBvciBjcmFzaAorICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soIi11IiwgdGVzdGVyKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VudW0ucHkgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKaW5kZXggNGI1ZDBkMC4uZTRlNmMyYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW51bS5weQpAQCAtNiw2ICs2LDcgQEAKIGZyb20gZW51bSBpbXBvcnQgRW51bSwgSW50RW51bSwgRW51bU1ldGEsIHVuaXF1ZQogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gcGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMsIFBpY2tsaW5nRXJyb3IsIEhJR0hFU1RfUFJPVE9DT0wKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAjIGZvciBwaWNrbGUgdGVzdHMKIHRyeToKQEAgLTI3MCw2ICsyNzEsMTMgQEAKICAgICAgICAgICAgIGNsYXNzIFdyb25nKEVudW0pOgogICAgICAgICAgICAgICAgIF9hbnlfbmFtZV8gPSA5CiAKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBjbGFzcyBMb2dpYyhFbnVtKToKKyAgICAgICAgICAgIHRydWUgPSBUcnVlCisgICAgICAgICAgICBmYWxzZSA9IEZhbHNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKExvZ2ljLmZhbHNlKQorCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIFNlYXNvbiA9IHNlbGYuU2Vhc29uCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oU2Vhc29uLkFVVFVNTiwgU2Vhc29uKQpAQCAtMTcwMSw1ICsxNzA5LDExIEBACiAgICAgICAgIGlmIGZhaWxlZDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVzdWx0IGRvZXMgbm90IGVxdWFsIGV4cGVjdGVkLCBzZWUgcHJpbnQgYWJvdmUiKQogCisKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBlbnVtKQorCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggNGUzOTJiNy4uNjdjM2Q4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTM5LDcgKzEzOSw3IEBACiAKICAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCi0gICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIpOgorICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiLCAiVSsiLCAiK1UiLCAiclUrIik6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sIG1vZGUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKaW5kZXggOWIxMzYzMi4uOTkyNGZkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCA3LCBiIlx4MDciKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBiIloiLCBiIloiKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBieXRlYXJyYXkoYiJaIiksIGIiWiIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlNWMiLCA2NSwgYiIgICAgQSIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlLTVjIiwgNjUsIGIiQSAgICAiKQogICAgICAgICAjICViIHdpbGwgaW5zZXJ0IGEgc2VyaWVzIG9mIGJ5dGVzLCBlaXRoZXIgZnJvbSBhIHR5cGUgdGhhdCBzdXBwb3J0cwogICAgICAgICAjIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wsIG9yIHNvbWV0aGluZyB0aGF0IGhhcyBhIF9fYnl0ZXNfXyBtZXRob2QKICAgICAgICAgY2xhc3MgRmFrZUJ5dGVzKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CmluZGV4IDE2OTk4NTIuLjczZDJkZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CkBAIC0yNjMsMTMgKzI2MywxMyBAQAogICAgICAgICBuYW4gPSBpbmYgLSBpbmYKICAgICAgICAgIyBidWcgMTY0Njk6IGVycm9yIHR5cGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZmxvYXQgLT4gaW50CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCBpbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgaW5mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgLWluZiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCAtaW5mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBWYWx1ZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgbmFuIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCBuYW4pCiAKICAgICBkZWYgdGVzdEZyb21EZWNpbWFsKHNlbGYpOgpAQCAtMjg0LDE2ICsyODQsMTYgQEAKIAogICAgICAgICAjIGJ1ZyAxNjQ2OTogZXJyb3IgdHlwZXMgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBkZWNpbWFsIC0+IGludAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJpbmYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1JbmZpbml0eSB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoIi1pbmYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IE5hTiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJuYW4iKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IHNOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgic25hbiIpKQogCiAgICAgZGVmIHRlc3RMaW1pdERlbm9taW5hdG9yKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Zjc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2ZzdHJpbmcucHkKQEAgLTAsMCArMSw3MzQgQEAKK2ltcG9ydCBhc3QKK2ltcG9ydCB0eXBlcworaW1wb3J0IGRlY2ltYWwKK2ltcG9ydCB1bml0dGVzdAorCithX2dsb2JhbCA9ICdnbG9iYWwgdmFyaWFibGUnCisKKyMgWW91IGNvdWxkIGFyZ3VlIHRoYXQgSSdtIHRvbyBzdHJpY3QgaW4gbG9va2luZyBmb3Igc3BlY2lmaWMgZXJyb3IKKyMgIHZhbHVlcyB3aXRoIGFzc2VydFJhaXNlc1JlZ2V4LCBidXQgd2l0aG91dCBpdCBpdCdzIHdheSB0b28gZWFzeSB0bworIyAgbWFrZSBhIHN5bnRheCBlcnJvciBpbiB0aGUgdGVzdCBzdHJpbmdzLiBFc3BlY2lhbGx5IHdpdGggYWxsIG9mIHRoZQorIyAgdHJpcGxlIHF1b3RlcywgcmF3IHN0cmluZ3MsIGJhY2tzbGFzaGVzLCBldGMuIEkgdGhpbmsgaXQncyBhCisjICB3b3J0aHdoaWxlIHRyYWRlb2ZmLiBXaGVuIEkgc3dpdGNoZWQgdG8gdGhpcyBtZXRob2QsIEkgZm91bmQgbWFueQorIyAgZXhhbXBsZXMgd2hlcmUgSSB3YXNuJ3QgdGVzdGluZyB3aGF0IEkgdGhvdWdodCBJIHdhcy4KKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRBbGxSYWlzZShzZWxmLCBleGNlcHRpb25fdHlwZSwgcmVnZXgsIGVycm9yX3N0cmluZ3MpOgorICAgICAgICBmb3Igc3RyIGluIGVycm9yX3N0cmluZ3M6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzdHI9c3RyKToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoZXhjZXB0aW9uX3R5cGUsIHJlZ2V4KToKKyAgICAgICAgICAgICAgICAgICAgZXZhbChzdHIpCisKKyAgICBkZWYgdGVzdF9fZm9ybWF0X19sb29rdXAoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIF9fZm9ybWF0X18gaXMgbG9va2VkIHVwIG9uIHRoZSB0eXBlLCBub3QgdGhlIGluc3RhbmNlLgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICdjbGFzcycKKworICAgICAgICB4ID0gWCgpCisKKyAgICAgICAgIyBBZGQgYSBib3VuZCBfX2Zvcm1hdF9fIG1ldGhvZCB0byB0aGUgJ3knIGluc3RhbmNlLCBidXQgbm90CisgICAgICAgICMgIHRoZSAneCcgaW5zdGFuY2UuCisgICAgICAgIHkgPSBYKCkKKyAgICAgICAgeS5fX2Zvcm1hdF9fID0gdHlwZXMuTWV0aG9kVHlwZShsYW1iZGEgc2VsZiwgc3BlYzogJ2luc3RhbmNlJywgeSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3l9JywgZm9ybWF0KHkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3l9JywgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeCksIGZvcm1hdCh5KSkKKworICAgICAgICAjIF9fZm9ybWF0X18gaXMgbm90IGNhbGxlZCB0aGlzIHdheSwgYnV0IHN0aWxsIG1ha2Ugc3VyZSBpdAorICAgICAgICAjICByZXR1cm5zIHdoYXQgd2UgZXhwZWN0IChzbyB3ZSBjYW4gbWFrZSBzdXJlIHdlJ3JlIGJ5cGFzc2luZworICAgICAgICAjICBpdCkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2Zvcm1hdF9fKCcnKSwgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fZm9ybWF0X18oJycpLCAnaW5zdGFuY2UnKQorCisgICAgICAgICMgVGhpcyBpcyBob3cgX19mb3JtYXRfXyBpcyBhY3R1YWxseSBjYWxsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh4KS5fX2Zvcm1hdF9fKHgsICcnKSwgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHkpLl9fZm9ybWF0X18oeSwgJycpLCAnY2xhc3MnKQorCisgICAgZGVmIHRlc3RfYXN0KHNlbGYpOgorICAgICAgICAjIEluc3BpcmVkIGJ5IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDk3NQorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gNAorICAgICAgICB4ID0gWCgpCisgICAgICAgIGV4cHIgPSAiIiIKK2EgPSAxMAorZid7YSAqIHgoKX0nIiIiCisgICAgICAgIHQgPSBhc3QucGFyc2UoZXhwcikKKyAgICAgICAgYyA9IGNvbXBpbGUodCwgJycsICdleGVjJykKKworICAgICAgICAjIE1ha2Ugc3VyZSB4IHdhcyBub3QgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHguY2FsbGVkKQorCisgICAgICAgICMgQWN0dWFsbHkgcnVuIHRoZSBjb2RlLgorICAgICAgICBleGVjKGMpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgeCB3YXMgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWwoc2VsZik6CisgICAgICAgICMgV2l0aCBubyBleHByZXNzaW9ucywgYW4gZi1zdHJpbmcgaXMgb2theS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCJmJ3gnIiksICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCJmJ3gnICd5JyIpLCAneHknKQorCisgICAgICAgICMgQnV0IHRoaXMgc2hvdWxkIHJhaXNlIGFuIGVycm9yLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ21hbGZvcm1lZCBub2RlIG9yIHN0cmluZycpOgorICAgICAgICAgICAgYXN0LmxpdGVyYWxfZXZhbCgiZid4ezN9JyIpCisKKyAgICAgICAgIyBBcyBzaG91bGQgdGhpcywgd2hpY2ggdXNlcyBhIGRpZmZlcmVudCBhc3Qgbm9kZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ21hbGZvcm1lZCBub2RlIG9yIHN0cmluZycpOgorICAgICAgICAgICAgYXN0LmxpdGVyYWxfZXZhbCgiZid7M30nIikKKworICAgIGRlZiB0ZXN0X2FzdF9jb21waWxlX3RpbWVfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gWycnXQorCisgICAgICAgIGV4cHIgPSAiIiJ4WzBdID0gJ2ZvbycgZid7M30nIiIiCisgICAgICAgIHQgPSBhc3QucGFyc2UoZXhwcikKKyAgICAgICAgYyA9IGNvbXBpbGUodCwgJycsICdleGVjJykKKyAgICAgICAgZXhlYyhjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sICdmb28zJykKKworICAgIGRlZiB0ZXN0X2xpdGVyYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2EnLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicgJywgJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDM5NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidcTntUcnVlfScsICdcdTIyYTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJmJ1xOe1RydWV9JywgcidcTlRydWUnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX29yZGVyKHNlbGYpOgorICAgICAgICAjIG5vdGUgdGhhdCBoZXgob3JkKCd7JykpID09IDB4N2IsIHNvIHRoaXMKKyAgICAgICAgIyAgc3RyaW5nIGJlY29tZXMgZidhezQqMTB9YicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2FcdTAwN2I0KjEwfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHg3YjQqMTB9YicsICdhNDBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2FceDdiNCoxMFxOe1JJR0hUIENVUkxZIEJSQUNLRVR9YicsICdhNDBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSIhXE57TEFUSU4gU01BTEwgTEVUVEVSIFJ9fScsICInYSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwXHgzYTAyWH0nLCAnMEEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOjAyXE57TEFUSU4gQ0FQSVRBTCBMRVRURVIgWH19JywgJzBBJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZidhe1x1MDA3YjQqMTB9YiciIiIsICAgICMgbWlzLW1hdGNoZWQgYnJhY2tldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiIiJmJ3siYSJcIXJ9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYne2FcIXJ9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3VudGVybWluYXRlZF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiIiJmJ3sieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3sieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7KCJ4JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbWlzbWF0Y2hlZF9wYXJlbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogbWlzbWF0Y2hlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3soKH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9icmFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eycsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7eycsICdheycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7e2InLCAne2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYXt7YicsICdhe2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX0nLCAnYX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1iJywgJ31iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F9fWInLCAnYX1iJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3t7MTB9JywgJ3sxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXsxMH0nLCAnfTEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319e3t7MTB9JywgJ317MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1he3t7MTB9JywgJ31hezEwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfXt7JywgJzEweycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX0nLCAnMTB9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fXt7JywgJzEwfXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19YXt7JyAnfScsICcxMH1he30nKQorCisgICAgICAgICMgSW5zaWRlIG9mIHN0cmluZ3MsIGRvbid0IGludGVycHJldCBkb3VibGVkIGJyYWNrZXRzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ7e319In0nLCAne3t9fScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShUeXBlRXJyb3IsICd1bmhhc2hhYmxlIHR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7IHt7fX0gfSciLCAjIGRpY3QgaW4gYSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfdGltZV9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSAnZGVmJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYnIyMge3h9Z2hpJywgJ2FiYyMjIGRlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaGknLCAnYWJjZGVmZ2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJ3t4fScgJ2doJyBmJ2l7eDo0fScsICdhYmNkZWZnaGlkZWYgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eCcgZid7eH0nLCAne3hkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eH0nIGYne3h9JywgJ3t4fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eH19JyBmJ3t4fScsICd7e3h9fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eCcgZid7eH0nLCAne3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneH19JyBmJ3t4fScsICd4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAneH19JywgJ2RlZnh9fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScgJycsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYne3h9JywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcyJywgJ2RlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScgJzInLCAnMWRlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScsICcxZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgZicte3h9JywgJ2RlZi1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycgJycgZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJyAnJywgJycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMnIGYnfSciLCAgIyBjYW4ndCBjb25jYXQgdG8gZ2V0IGEgdmFsaWQgZi1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICAjIFRoZXNlIGFyZW4ndCBjb21tZW50cywgc2luY2UgdGhleSdyZSBpbiBzdHJpbmdzLgorICAgICAgICBkID0geycjJzogJ2hhc2gnfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIjIn0nLCAnIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiIyJdfScsICdoYXNoJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezEjfSciLCAgICMgZXJyb3IgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiBiZWNvbWVzICIoMSMpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MygjKX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21hbnlfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgc3RyaW5nIHdpdGggbWFueSBleHByZXNzaW9ucyBpbiBpdC4gTm90ZSB0aGF0CisgICAgICAgICMgIGJlY2F1c2Ugd2UgaGF2ZSBhIHNwYWNlIGluIGhlcmUgYXMgYSBsaXRlcmFsLCB3ZSdyZSBhY3R1YWxseQorICAgICAgICAjICBnb2luZyB0byB1c2UgdHdpY2UgYXMgbWFueSBhc3Qgbm9kZXM6IG9uZSBmb3IgZWFjaCBsaXRlcmFsCisgICAgICAgICMgIHBsdXMgb25lIGZvciBlYWNoIGV4cHJlc3Npb24uCisgICAgICAgIGRlZiBidWlsZF9mc3RyKG4sIGV4dHJhPScnKToKKyAgICAgICAgICAgIHJldHVybiAiZiciICsgKCd7eH0gJyAqIG4pICsgZXh0cmEgKyAiJyIKKworICAgICAgICB4ID0gJ1gnCisgICAgICAgIHdpZHRoID0gMQorCisgICAgICAgICMgVGVzdCBhcm91bmQgMjU2LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTAsIDI2MCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cihpKSksICh4KycgJykqaSkKKworICAgICAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyAyIGxhcmdzIGZzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cigyNTUpKjI1NiksICh4KycgJykqKDI1NSoyNTYpKQorCisgICAgICAgIHMgPSBidWlsZF9mc3RyKDI1MywgJ3t4Ont3aWR0aH19ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgKHgrJyAnKSoyNTQpCisKKyAgICAgICAgIyBUZXN0IGxvdHMgb2YgZXhwcmVzc2lvbnMgYW5kIGNvbnN0YW50cywgY29uY2F0ZW5hdGVkLgorICAgICAgICBzID0gImYnezF9JyAneCcgJ3knIiAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHMpLCAnMXh5JyAqIDEwMjQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfc3BlY2lmaWVyX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICB3aWR0aCA9IDEwCisgICAgICAgIHByZWNpc2lvbiA9IDQKKyAgICAgICAgdmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwoJzEyLjM0NTY3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aH0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGghcn0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGg6MH0ue3ByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnsxfXswOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7IDF9eyAwOjB9LnsgcHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MX0weH0nLCAnICAgICAgIDB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6eyIjIn0xezB9eyJ4In19JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDoteyIjIn0xezB9eH0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7LTEwOnsiLSJ9I3sxfTB7IngifX0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6I3szICE9IHs0OjV9IGFuZCB3aWR0aH14fScsICcgICAgICAgMHhhJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiIiJmJ3sicyIhcnsiOjEwIn19JyIiIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbG9va3MgbGlrZSBhIG5lc3RlZCBmb3JtYXQgc3BlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiaW52YWxpZCBzeW50YXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIEludmFsaWQgc3l0YXggaW5zaWRlIGEgbmVzdGVkIHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s0OnsvNX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHByZXNzaW9ucyBuZXN0ZWQgdG9vIGRlZXBseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyMgQ2FuJ3QgbmVzdCBmb3JtYXQgc3BlY2lmaWVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYncmVzdWx0OiB7dmFsdWU6e3dpZHRoOnswfX0ue3ByZWNpc2lvbjoxfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIE5vIGV4cGFuc2lvbiBpbnNpZGUgY29udmVyc2lvbiBvciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgdGhlIDogb3IgISBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiImYneyJzIiF7InIifX0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3Rfc2lkZV9lZmZlY3Rfb3JkZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5pID0gMAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYuaSkKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0ge3h9JywgJzEgMicpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogZW1wdHkgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgfSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJyB7fSAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyFyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICFyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MTA6eyB9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZicgeyB9ICciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne1xuIFxufSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2F0Y2ggdGhlIGVtcHR5IGV4cHJlc3Npb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBpbnZhbGlkIGNvbnZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHJ9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheDp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheDphfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cjp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyOmF9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s6fSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgZmluZCB0aGUgZW1wdHkgZXhwcmVzc2lvbiBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIG1pc3NpbmcgY2xvc2luZyBicmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyFzOiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7OiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7OngnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3BhcmVuc19pbl9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLH0nLCAnKDMsKScpCisKKyAgICAgICAgIyBBZGQgdGhlc2UgYmVjYXVzZSB3aGVuIGFuIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBwYXJlbnMKKyAgICAgICAgIyAgYXJlIGFkZGVkIGFyb3VuZCBpdC4gQnV0IHdlIHNob3VsZG4ndCBnbyBmcm9tIGFuIGludmFsaWQKKyAgICAgICAgIyAgZXhwcmVzc2lvbiB0byBhIHZhbGlkIG9uZS4gVGhlIGFkZGVkIHBhcmVucyBhcmUganVzdAorICAgICAgICAjICBzdXBwb3NlZCB0byBhbGxvdyB3aGl0ZXNwYWNlIChpbmNsdWRpbmcgbmV3bGluZXMpLgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7LH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyx9JyIsICAjIHRoaXMgaXMgKCwpLCB3aGljaCBpcyBhbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szKSsoNH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnRU9MIHdoaWxlIHNjYW5uaW5nIHN0cmluZyBsaXRlcmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MH0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MFxufScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3swXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMFxufScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tccjBccn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XG4wXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMH0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MytcbjR9JywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMrXFxcbjR9JywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJmJycnezMrCis0fScnJywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyd7MytcCis0fScnJywgJzcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogZW1wdHkgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7XG59JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CisgICAgICAgIHggPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyfScsICInODg4ODgnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpIXI6MTB9JywgIic4ODg4OCcgICAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iik6MTB9JywgIjg4ODg4ICAgICAiKQorCisgICAgICAgICMgbGFtYmRhIGRvZXNuJ3Qgd29yayB3aXRob3V0IHBhcmVucywgYmVjYXVzZSB0aGUgY29sb24KKyAgICAgICAgIyAgbWFrZXMgdGhlIHBhcnNlciB0aGluayBpdCdzIGEgZm9ybWF0X3NwZWMKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgRU9GIHdoaWxlIHBhcnNpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7bGFtYmRhIHg6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3lpZWxkKHNlbGYpOgorICAgICAgICAjIE5vdCB0ZXJyaWJseSB1c2VmdWwsIGJ1dCBtYWtlIHN1cmUgdGhlIHlpZWxkIHR1cm5zCisgICAgICAgICMgIGEgZnVuY3Rpb24gaW50byBhIGdlbmVyYXRvcgorICAgICAgICBkZWYgZm4oeSk6CisgICAgICAgICAgICBmJ3k6e3lpZWxkIHkqMn0nCisKKyAgICAgICAgZyA9IGZuKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgOCkKKworICAgIGRlZiB0ZXN0X3lpZWxkX3NlbmQoc2VsZik6CisgICAgICAgIGRlZiBmbih4KToKKyAgICAgICAgICAgIHlpZWxkIGYneDp7eWllbGQgKGxhbWJkYSBpOiB4ICogaSl9JworCisgICAgICAgIGcgPSBmbigxMCkKKyAgICAgICAgdGhlX2xhbWJkYSA9IG5leHQoZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVfbGFtYmRhKDQpLCA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLnNlbmQoJ3N0cmluZycpLCAneDpzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfZXhwcmVzc2lvbnNfd2l0aF90cmlwbGVfcXVvdGVkX3N0cmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycneCcnJ30iLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycnZXJpYydzJycnfSIsICJlcmljJ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiImVyaWNcJ3MiIiJ9JywgImVyaWMncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycnZXJpY1wicycnJ30iLCAnZXJpYyJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljInMiIiJ9JywgJ2VyaWMicycpCisKKyAgICAgICAgIyBUZXN0IGNvbmNhdGVuYXRpb24gd2l0aGluIGFuIGV4cHJlc3Npb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieCIgIiIiZXJpYyJzIiIiICJ5In0nLCAneGVyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ4IiAiIiJlcmljInMiIiJ9JywgJ3hlcmljInMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiImVyaWMicyIiIiAieSJ9JywgJ2VyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiIngiIiIgIiIiZXJpYyJzIiIiICJ5In0nLCAneGVyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiIngiIiIgIiIiZXJpYyJzIiIiICIiInkiIiJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tyIiIieCIiIiAiIiJlcmljInMiIiIgIiIieSIiIn0nLCAneGVyaWMic3knKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfdmFycyhzZWxmKToKKyAgICAgICAgeCA9IDk4CisgICAgICAgIHkgPSAnYWJjJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9e3l9JywgJzk4YWJjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fXt5fScsICdYOThhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9WHt5fScsICc5OFhhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9e3l9WCcsICc5OGFiY1gnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9WXt5fScsICdYOThZYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH17eX1ZJywgJ1g5OGFiY1knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9WHt5fVknLCAnOThYYWJjWScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH1Ze3l9WicsICdYOThZYWJjWicpCisKKyAgICBkZWYgdGVzdF9jbG9zdXJlKHNlbGYpOgorICAgICAgICBkZWYgb3V0ZXIoeCk6CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZid4Ont4fScKKyAgICAgICAgICAgIHJldHVybiBpbm5lcgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXIoJzk4NycpKCksICd4Ojk4NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXIoNykoKSwgJ3g6NycpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHkgPSAyCisgICAgICAgIGRlZiBmKHgsIHdpZHRoKToKKyAgICAgICAgICAgIHJldHVybiBmJ3g9e3gqeTp7d2lkdGh9fScKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoJ2ZvbycsIDEwKSwgJ3g9Zm9vZm9vICAgICcpCisgICAgICAgIHggPSAnYmFyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMTAsIDEwKSwgJ3g9ICAgICAgICAyMCcpCisKKyAgICBkZWYgdGVzdF9sb2NhbHMoc2VsZik6CisgICAgICAgIHZhbHVlID0gMTIzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid2Ont2YWx1ZX0nLCAndjoxMjMnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ192YXJpYWJsZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpOgorICAgICAgICAgICAgZid2Ont2YWx1ZX0nCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2Zvcm1hdF9zcGVjKHNlbGYpOgorICAgICAgICBjbGFzcyBPOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNwZWM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKicKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7TygpOnh9JywgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKX0nLCAnKicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7TygpOn0nLCAnKicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szOn0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyFzOn0nLCAnMycpCisKKyAgICBkZWYgdGVzdF9nbG9iYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0nLCAnZzpnbG9iYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLCAiZzonZ2xvYmFsIHZhcmlhYmxlJyIpCisKKyAgICAgICAgYV9sb2NhbCA9ICdsb2NhbCB2YXJpYWJsZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2c6Z2xvYmFsIHZhcmlhYmxlIGw6bG9jYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOidnbG9iYWwgdmFyaWFibGUnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzpnbG9iYWwgdmFyaWFibGUgbDonbG9jYWwgdmFyaWFibGUnIikKKworICAgICAgICBzZWxmLmFzc2VydEluKCJtb2R1bGUgJ3VuaXR0ZXN0JyBmcm9tIiwgZid7dW5pdHRlc3R9JykKKworICAgIGRlZiB0ZXN0X3NoYWRvd2VkX2dsb2JhbChzZWxmKToKKyAgICAgICAgYV9nbG9iYWwgPSAncmVhbGx5IGEgbG9jYWwnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0nLCAnZzpyZWFsbHkgYSBsb2NhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbCFyfScsICJnOidyZWFsbHkgYSBsb2NhbCciKQorCisgICAgICAgIGFfbG9jYWwgPSAnbG9jYWwgdmFyaWFibGUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnOnJlYWxseSBhIGxvY2FsIGw6bG9jYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOidyZWFsbHkgYSBsb2NhbCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOnJlYWxseSBhIGxvY2FsIGw6J2xvY2FsIHZhcmlhYmxlJyIpCisKKyAgICBkZWYgdGVzdF9jYWxsKHNlbGYpOgorICAgICAgICBkZWYgZm9vKHgpOgorICAgICAgICAgICAgcmV0dXJuICd4PScgKyBzdHIoeCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2ZvbygxMCl9JywgJ3g9MTAnKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICB5ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2YiezB9IiozfScsICcwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2Yie3l9IiozfScsICc1NTUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2Yie1wneFwnfSIqM30nLCAneHh4JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie3IneCcgZid7XCJzXCJ9J30iLCAneHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie3IneCdyZid7XCJzXCJ9J30iLCAneHMnKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9zdHJpbmdfcHJlZml4ZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImZ1JyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZVJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1RicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVmcicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1cicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZydScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1ZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZVUicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1cicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2xlYWRpbmdfdHJhaWxpbmdfc3BhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyAzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sgIDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1x0M30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XHRcdDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMgfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szICB9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezNcdH0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7M1x0XHR9JywgJzMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidleHByPXsge3g6IHkgZm9yIHgsIHkgaW4gWygxLCAyKSwgXX19JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcj17MTogMn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZXhwcj17IHt4OiB5IGZvciB4LCB5IGluIFsoMSwgMiksIF19IH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdleHByPXsxOiAyfScpCisKKyAgICBkZWYgdGVzdF9jaGFyYWN0ZXJfbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3s0fVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfXszfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJzRcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t7fX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICd7fVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfTMnKQorCisgICAgZGVmIHRlc3Rfbm90X2VxdWFsKHNlbGYpOgorICAgICAgICAjIFRoZXJlJ3MgYSBzcGVjaWFsIHRlc3QgZm9yIHRoaXMgYmVjYXVzZSB0aGVyZSdzIGEgc3BlY2lhbAorICAgICAgICAjICBjYXNlIGluIHRoZSBmLXN0cmluZyBwYXJzZXIgdG8gbG9vayBmb3IgIT0gYXMgbm90IGVuZGluZyBhbgorICAgICAgICAjICBleHByZXNzaW9uLiBOb3JtYWxseSBpdCB3b3VsZCwgd2hpbGUgbG9va2luZyBmb3IgIXMgb3IgIXIuCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00fScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00On0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzfScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00IXM6LjN9JywgJ1RydScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OjEwLjEwfScsICcgICAgICAzLjE0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXM6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhcjoxMC4xMH0nLCAnMy4xNCAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFhOjEwLjEwfScsICczLjE0ICAgICAgJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIn0nLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIXJ9JywgIidhJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIWF9JywgIidhJyIpCisKKyAgICAgICAgIyBOb3QgYSBjb252ZXJzaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIXIifScsICJhIXIiKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbiwgYnV0IHNob3cgdGhhdCAhIGlzIGFsbG93ZWQgaW4gYSBmb3JtYXQgc3BlYy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OiE8MTAuMTB9JywgJzMuMTQhISEhISEnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IlxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSJ9JywgJ1x1MDM5NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IlxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSIhcn0nLCAiJ1x1MDM5NCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0iIWF9JywgIidcXHUwMzk0JyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMhZ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhIX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhOn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEgc30nIiwgICMgbm8gc3BhY2UgYmVmb3JlIGNvbnZlcnNpb24gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7eCFcXHgwMDouPDEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t4IXN7eX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzczp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzOnN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZicnID0gMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3swfScgPSB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3h9JyA9IHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZGVsIGYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWwgJycgZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7e30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t9fX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fXgnIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbid0IGhhdmUgeyBvciB9IGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7MzpcXH0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn19PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szOnt7PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczozJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7eCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MzpzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e319eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3szOlxcez4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIEJ1dCB0aGVzZSBhcmUganVzdCBub3JtYWwgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieyJ9JywgJ3snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ9In0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp7In0ifT4xMH0nLCAnfX19fX19fX19MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mjp7InsifT4xMH0nLCAne3t7e3t7e3t7MicpCisKKyAgICBkZWYgdGVzdF9pZl9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIHNwZWNpYWwgbG9naWMgaW4gY29tcGlsZS5jIHRvIHRlc3QgaWYgdGhlCisgICAgICAgICMgIGNvbmRpdGlvbmFsIGZvciBhbiBpZiAoYW5kIHdoaWxlKSBhcmUgY29uc3RhbnRzLiBFeGVyY2lzZQorICAgICAgICAjICB0aGF0IGNvZGUuCisKKyAgICAgICAgZGVmIHRlc3RfZnN0cmluZyh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9lbXB0eSh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgJycgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcgJyBmJ3t4fSc6CisgICAgICAgICAgICAgICAgZmxhZyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmxhZyA9IDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgZXhwZWN0ZWQpCisKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcnLCAyKQorICAgICAgICB0ZXN0X2ZzdHJpbmcoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X2VtcHR5KCcnLCAyKQorICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnICcsIDEpCisKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcnLCAxKQorICAgICAgICB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoJyAnLCAxKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZm9ybWF0X3NwZWNpZmllcihzZWxmKToKKyAgICAgICAgeCA9ICd0ZXN0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3g6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXM6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXI6fScsICIndGVzdCciKQorCisgICAgZGVmIHRlc3Rfc3RyX2Zvcm1hdF9kaWZmZXJlbmNlcyhzZWxmKToKKyAgICAgICAgZCA9IHsnYSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgIDA6ICdpbnRlZ2VyJywKKyAgICAgICAgICAgICB9CisgICAgICAgIGEgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFswXX0nLCAnaW50ZWdlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiYSJdfScsICdzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbYV19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7ZFthXX0nLmZvcm1hdChkPWQpLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbMF19Jy5mb3JtYXQoZD1kKSwgJ2ludGVnZXInKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3thWzQpfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne2EoNF19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2xvb3Aoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2k6e2l9JywgJ2k6JyArIHN0cihpKSkKKworICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CisgICAgICAgIGQgPSB7JyInOiAnZHF1b3RlJywKKyAgICAgICAgICAgICAiJyI6ICdzcXVvdGUnLAorICAgICAgICAgICAgICdmb28nOiAnYmFyJywKKyAgICAgICAgICAgICB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiXCciXX0nLCAnc3F1b3RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntkWydcIiddfSIsICdkcXVvdGUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnJ3tkWyInIl19JycnLCAnc3F1b3RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIiIie2RbJyInXX0iIiIsICdkcXVvdGUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiZm9vIl19JywgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7ZFsnZm9vJ119IiwgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFtcJ2Zvb1wnXX0nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntkW1wiZm9vXCJdfSIsICdiYXInKQorCisgICAgZGVmIHRlc3RfZXNjYXBlZF9xdW90ZXMoc2VsZik6CisgICAgICAgIGQgPSB7JyInOiAnYScsCisgICAgICAgICAgICAgIiciOiAnYid9CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmciJ7ZFsnXCInXX0iLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnIne2RbIlwnIl19JywgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyInsnXCInfSIsICciJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcid7IlwnIn0nLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IlxcIjMifScsICciMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiB1bnRlcm1pbmF0ZWQgc3RyaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcicnJ2YneyIiIlxcfScgJycnLCAgIyBCYWNrc2xhc2ggYXQgZW5kIG9mIGV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJyZid7M1x9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKaW5kZXggYWVmNjZkYS4uOWQ4ZGUyMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkKQEAgLTEwNDksMTAgKzEwNDksMTkgQEAKICAgICAgICAgZnRwLmNsb3NlKCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydNU0dfT09CJywgJ0ZUUF9QT1JUJywgJ01BWExJTkUnLCAnQ1JMRicsICdCX0NSTEYnLAorICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yJywgJ3BhcnNlMTUwJywgJ3BhcnNlMjI3JywgJ3BhcnNlMjI5JywgJ3BhcnNlMjU3JywKKyAgICAgICAgICAgICAgICAgICAgICdwcmludF9saW5lJywgJ2Z0cGNwJywgJ3Rlc3QnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmdHBsaWIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gW1Rlc3RGVFBDbGFzcywgVGVzdFRpbWVvdXRzLAogICAgICAgICAgICAgIFRlc3RJUHY2RW52aXJvbm1lbnQsCi0gICAgICAgICAgICAgVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzXQorICAgICAgICAgICAgIFRlc3RUTFNfRlRQQ2xhc3NNaXhpbiwgVGVzdFRMU19GVFBDbGFzcywKKyAgICAgICAgICAgICBNaXNjVGVzdENhc2VdCiAKICAgICB0aHJlYWRfaW5mbyA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkgYi9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKaW5kZXggZGU2MTBjNy4uM2E5NDM4MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQpAQCAtNDQwLDYgKzQ0MCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19jbGFzc19fLCBEdW1teUdOVVRyYW5zbGF0aW9ucykKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydjMnB5JywgJ0VOT0VOVCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGdldHRleHQsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKaW5kZXggZWMzZDc4My4uOGY4ZDcxYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtMjk1LDYgKzI5NSwxMCBAQAogICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLGsyPTEwMCx0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwKQogICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDAsIGsyPTEwMCkKIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImRlZiBmKCopOiBwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqLCk6IHBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImRlZiBmKCosICoqa3dkcyk6IHBhc3MiKQorCiAgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgYWZ0ZXIgKmFyZ2xpc3QKICAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKQEAgLTM1Miw2ICszNTYsMjMgQEAKICAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCpnKDE9MikpIikKICAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCoqZygxPTIpKSIpCiAKKyAgICAgICAgIyBDaGVjayB0cmFpbGluZyBjb21tYXMgYXJlIHBlcm1pdHRlZCBpbiBmdW5jZGVmIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgZGVmIGYoYSwpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKCosIGIsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsIGIsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCBiLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqLCBiLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqYXJncywgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiwgYiwgKiprd2RzLCk6IHBhc3MKKwogICAgIGRlZiB0ZXN0X2xhbWJkZWYoc2VsZik6CiAgICAgICAgICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CiAgICAgICAgIGwxID0gbGFtYmRhIDogMApAQCAtMzcwLDYgKzM5MSwyMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGw2KDEsMiksIDErMisyMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNigxLDIsaz0xMCksIDErMisxMCkKIAorICAgICAgICAjIGNoZWNrIHRoYXQgdHJhaWxpbmcgY29tbWFzIGFyZSBwZXJtaXR0ZWQKKyAgICAgICAgbDEwID0gbGFtYmRhIGEsOiAwCisgICAgICAgIGwxMSA9IGxhbWJkYSAqYXJncyw6IDAKKyAgICAgICAgbDEyID0gbGFtYmRhICoqa3dkcyw6IDAKKyAgICAgICAgbDEzID0gbGFtYmRhIGEsICphcmdzLDogMAorICAgICAgICBsMTQgPSBsYW1iZGEgYSwgKiprd2RzLDogMAorICAgICAgICBsMTUgPSBsYW1iZGEgKmFyZ3MsIGIsOiAwCisgICAgICAgIGwxNiA9IGxhbWJkYSAqLCBiLDogMAorICAgICAgICBsMTcgPSBsYW1iZGEgKmFyZ3MsICoqa3dkcyw6IDAKKyAgICAgICAgbDE4ID0gbGFtYmRhIGEsICphcmdzLCBiLDogMAorICAgICAgICBsMTkgPSBsYW1iZGEgYSwgKiwgYiw6IDAKKyAgICAgICAgbDIwID0gbGFtYmRhIGEsICphcmdzLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyMSA9IGxhbWJkYSAqYXJncywgYiwgKiprd2RzLDogMAorICAgICAgICBsMjIgPSBsYW1iZGEgKiwgYiwgKiprd2RzLDogMAorICAgICAgICBsMjMgPSBsYW1iZGEgYSwgKmFyZ3MsIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDI0ID0gbGFtYmRhIGEsICosIGIsICoqa3dkcyw6IDAKKwogCiAgICAgIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAogICAgICMgVGVzdGVkIGJlbG93CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CmluZGV4IGVlOWVlMWEuLmVmYjAzODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CkBAIC0xMiw3ICsxMiw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICBpbXBvcnQgaW1wCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDY5ZGRiNTEuLmE4OGU3ZmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTM4LDcgKzM4LDcgQEAKICMgaXNtb2R1bGUsIGlzY2xhc3MsIGlzbWV0aG9kLCBpc2Z1bmN0aW9uLCBpc3RyYWNlYmFjaywgaXNmcmFtZSwgaXNjb2RlLAogIyBpc2J1aWx0aW4sIGlzcm91dGluZSwgaXNnZW5lcmF0b3IsIGlzZ2VuZXJhdG9yZnVuY3Rpb24sIGdldG1lbWJlcnMsCiAjIGdldGRvYywgZ2V0ZmlsZSwgZ2V0bW9kdWxlLCBnZXRzb3VyY2VmaWxlLCBnZXRjb21tZW50cywgZ2V0c291cmNlLAotIyBnZXRjbGFzc3RyZWUsIGdldGFyZ3NwZWMsIGdldGFyZ3ZhbHVlcywgZm9ybWF0YXJnc3BlYywgZm9ybWF0YXJndmFsdWVzLAorIyBnZXRjbGFzc3RyZWUsIGdldGFyZ3ZhbHVlcywgZm9ybWF0YXJnc3BlYywgZm9ybWF0YXJndmFsdWVzLAogIyBjdXJyZW50ZnJhbWUsIHN0YWNrLCB0cmFjZSwgaXNkYXRhZGVzY3JpcHRvcgogCiAjIE5PVEU6IFRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdGVzdHMgcmVsYXRpbmcgdG8gaW50ZXJhY3Rpb24gd2l0aApAQCAtNjI4LDE4ICs2MjgsNiBAQAogICAgICAgICBnb3QgPSBpbnNwZWN0LmdldG1ybyhEKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCiAKLSAgICBkZWYgYXNzZXJ0QXJnU3BlY0VxdWFscyhzZWxmLCByb3V0aW5lLCBhcmdzX2UsIHZhcmFyZ3NfZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmt3X2U9Tm9uZSwgZGVmYXVsdHNfZT1Ob25lLCBmb3JtYXR0ZWQ9Tm9uZSk6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gaW5zcGVjdC5nZXRhcmdzcGVjKHJvdXRpbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgYXJnc19lKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmFyZ3MsIHZhcmFyZ3NfZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJrdywgdmFya3dfZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWZhdWx0cywgZGVmYXVsdHNfZSkKLSAgICAgICAgaWYgZm9ybWF0dGVkIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmZvcm1hdGFyZ3NwZWMoYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKQotCiAgICAgZGVmIGFzc2VydEZ1bGxBcmdTcGVjRXF1YWxzKHNlbGYsIHJvdXRpbmUsIGFyZ3NfZSwgdmFyYXJnc19lPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJrd19lPU5vbmUsIGRlZmF1bHRzX2U9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seWFyZ3NfZT1bXSwga3dvbmx5ZGVmYXVsdHNfZT1Ob25lLApAQCAtNjU4LDIzICs2NDYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpCiAKLSAgICBkZWYgdGVzdF9nZXRhcmdzcGVjKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMobW9kLmVnZ3MsIFsneCcsICd5J10sIGZvcm1hdHRlZD0nKHgsIHkpJykKLQotICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMobW9kLnNwYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycsICdoJywgKDMsIDQsIDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhhLCBiLCBjLCBkPTMsIGU9NCwgZj01LCAqZywgKipoKScpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QyLmtleXdvcmRlZCwgW10pCi0KLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QyLmFubm90YXRlZCwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kMi5rZXl3b3JkX29ubHlfYXJnLCBbXSkKLQotCiAgICAgZGVmIHRlc3RfZ2V0ZnVsbGFyZ3NwZWMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RnVsbEFyZ1NwZWNFcXVhbHMobW9kMi5rZXl3b3JkZWQsIFtdLCB2YXJhcmdzX2U9J2FyZzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3b25seWFyZ3NfZT1bJ2FyZzInXSwKQEAgLTY4OCwyMCArNjU5LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dvbmx5YXJnc19lPVsnYXJnJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkPScoKiwgYXJnKScpCiAKLSAgICBkZWYgdGVzdF9hcmdzcGVjX2FwaV9pZ25vcmVzX3dyYXBwZWQoc2VsZik6CisgICAgZGVmIHRlc3RfZnVsbGFyZ3NwZWNfYXBpX2lnbm9yZXNfd3JhcHBlZChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAyMDY4NDogbG93IGxldmVsIGludHJvc3BlY3Rpb24gQVBJIG11c3QgaWdub3JlIF9fd3JhcHBlZF9fCiAgICAgICAgIEBmdW5jdG9vbHMud3JhcHMobW9kLnNwYW0pCiAgICAgICAgIGRlZiBoYW0oeCwgeSk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgQmFzaWMgY2hlY2sKLSAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKGhhbSwgWyd4JywgJ3knXSwgZm9ybWF0dGVkPScoeCwgeSknKQogICAgICAgICBzZWxmLmFzc2VydEZ1bGxBcmdTcGVjRXF1YWxzKGhhbSwgWyd4JywgJ3knXSwgZm9ybWF0dGVkPScoeCwgeSknKQogICAgICAgICBzZWxmLmFzc2VydEZ1bGxBcmdTcGVjRXF1YWxzKGZ1bmN0b29scy5wYXJ0aWFsKGhhbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd4JywgJ3knXSwgZm9ybWF0dGVkPScoeCwgeSknKQogICAgICAgICAjIE90aGVyIHZhcmlhbnRzCiAgICAgICAgIGRlZiBjaGVja19tZXRob2QoZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoZiwgWydzZWxmJywgJ3gnLCAneSddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZD0nKHNlbGYsIHgsIHkpJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RnVsbEFyZ1NwZWNFcXVhbHMoZiwgWydzZWxmJywgJ3gnLCAneSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQ9JyhzZWxmLCB4LCB5KScpCiAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKG1vZC5zcGFtKQogICAgICAgICAgICAgZGVmIGhhbShzZWxmLCB4LCB5KToKQEAgLTc3OSwxMSArNzQ5LDExIEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIGluc3BlY3QuZ2V0ZnVsbGFyZ3NwZWMoYnVpbHRpbikKIAotICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfbWV0aG9kKHNlbGYpOgorICAgIGRlZiB0ZXN0X2dldGZ1bGxhcmdzcGVjX21ldGhvZChzZWxmKToKICAgICAgICAgY2xhc3MgQShvYmplY3QpOgogICAgICAgICAgICAgZGVmIG0oc2VsZik6CiAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGdWxsQXJnU3BlY0VxdWFscyhBLm0sIFsnc2VsZiddKQogCiAgICAgZGVmIHRlc3RfY2xhc3NpZnlfbmV3c3R5bGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKaW5kZXggNWIzYmE3ZS4uOWU1NWIyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKQEAgLTYxMyw2ICs2MTMsNTYgQEAKICAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CiAgICAgICAgICAgICBzZWxmLnBpY2tsZXRlc3QocHJvdG8sIGN5Y2xlKCdhYmMnKSkKIAorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICMgdGVzdCB3aXRoIHBhcnRpYWwgY29uc3VtZWQgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgIGl0ID0gaXRlcignYWJjZGUnKQorICAgICAgICAgICAgYyA9IGN5Y2xlKGl0KQorICAgICAgICAgICAgXyA9IFtuZXh0KGMpIGZvciBpIGluIHJhbmdlKDIpXSAgICAgICMgY29uc3VtZSAyIG9mIDUgaW5wdXRzCisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKGMsIHByb3RvKQorICAgICAgICAgICAgZCA9IHBpY2tsZS5sb2FkcyhwKSAgICAgICAgICAgICAgICAgICMgcmVidWlsZCB0aGUgY3ljbGUgb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGQpLCBsaXN0KCdjZGVhYmNkZWFiY2RlYWJjZGVhYicpKQorCisgICAgICAgICAgICAjIHRlc3Qgd2l0aCBjb21wbGV0ZWx5IGNvbnN1bWVkIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICBpdCA9IGl0ZXIoJ2FiY2RlJykKKyAgICAgICAgICAgIGMgPSBjeWNsZShpdCkKKyAgICAgICAgICAgIF8gPSBbbmV4dChjKSBmb3IgaSBpbiByYW5nZSg3KV0gICAgICAjIGNvbnN1bWUgNyBvZiA1IGlucHV0cworICAgICAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhjLCBwcm90bykKKyAgICAgICAgICAgIGQgPSBwaWNrbGUubG9hZHMocCkgICAgICAgICAgICAgICAgICAjIHJlYnVpbGQgdGhlIGN5Y2xlIG9iamVjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBkKSwgbGlzdCgnY2RlYWJjZGVhYmNkZWFiY2RlYWInKSkKKworICAgIGRlZiB0ZXN0X2N5Y2xlX3NldHN0YXRlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSBib3RoIG1vZGVzIGZvciByZXN0b3Jpbmcgc3RhdGUKKworICAgICAgICAjIE1vZGUgMCBpcyBlZmZpY2llbnQuICBJdCB1c2VzIGFuIGluY29tcGxldGVseSBjb25zdW1lZCBpbnB1dAorICAgICAgICAjIGl0ZXJhdG9yIHRvIGJ1aWxkIGEgY3ljbGUgb2JqZWN0IGFuZCB0aGVuIHBhc3NlcyBpbiBzdGF0ZSB3aXRoCisgICAgICAgICMgYSBsaXN0IG9mIHByZXZpb3VzbHkgY29uc3VtZWQgdmFsdWVzLiAgVGhlcmUgaXMgbm8gZGF0YQorICAgICAgICAjIG92ZXJsYXAgYmV3dGVlbiB0aGUgdHdvLgorICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICBjLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjJyksIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGMpLCBsaXN0KCdkZWZnYWJjZGVmZ2FiY2RlZmdhYicpKQorCisgICAgICAgICMgTW9kZSAxIGlzIGluZWZmaWNpZW50LiAgSXQgc3RhcnRzIHdpdGggYSBjeWNsZSBvYmplY3QgYnVpbHQKKyAgICAgICAgIyBmcm9tIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiBhIHBhcnRpYWwKKyAgICAgICAgIyBjeWNsZSBhbmQgdGhlbiBwYXNzZXMgaW4gc3RhdGUgd2l0aCBhbGwgb2YgdGhlIHByZXZpb3VzbHkKKyAgICAgICAgIyBzZWVuIHZhbHVlcyAodGhpcyBvdmVybGFwcyB2YWx1ZXMgaW5jbHVkZWQgaW4gdGhlIGl0ZXJhdG9yKS4KKyAgICAgICAgYyA9IGN5Y2xlKCdkZWZnJykKKyAgICAgICAgYy5fX3NldHN0YXRlX18oKGxpc3QoJ2FiY2RlZmcnKSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgYyksIGxpc3QoJ2RlZmdhYmNkZWZnYWJjZGVmZ2FiJykpCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgdG8gc2V0c3RhdGUgbmVlZHMgdG8gYmUgYSB0dXBsZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yKToKKyAgICAgICAgICAgIGN5Y2xlKCdkZWZnJykuX19zZXRzdGF0ZV9fKFtsaXN0KCdhYmNkZWZnJyksIDBdKQorCisgICAgICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBzZXRzdGF0ZSB0dXBsZSBtdXN0IGJlIGEgbGlzdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICAgICAgYy5fX3NldHN0YXRlX18oKGRpY3QuZnJvbWtleXMoJ2RlZmcnKSwgMCkpCisgICAgICAgICAgICB0YWtlKDIwLCBjKQorCisgICAgICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGluIHRoZSBzZXRzdGF0ZSB0dXBsZSBtdXN0IGJlIGEgbGlzdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBjeWNsZSgnZGVmZycpLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjZGVmZycpLCAneCcpKQorCiAgICAgZGVmIHRlc3RfZ3JvdXBieShzZWxmKToKICAgICAgICAgIyBDaGVjayB3aGV0aGVyIGl0IGFjY2VwdHMgYXJndW1lbnRzIGNvcnJlY3RseQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBsaXN0KGdyb3VwYnkoW10pKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5IGIvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKaW5kZXggMjFlZjczOC4uMjQwZGI3ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKQEAgLTMsNiArMyw4IEBACiBpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcy5wYXRoCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0b2tlbml6ZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIApAQCAtMTAsOCArMTIsNiBAQAogTk9ORVhJU1RFTlRfRklMRU5BTUUgPSBGSUxFTkFNRSArICcubWlzc2luZycKIElOVkFMSURfTkFNRSA9ICchQCQpKCFAI18xJwogRU1QVFkgPSAnJwotVEVTVFMgPSAnaW5zcGVjdF9mb2RkZXIgaW5zcGVjdF9mb2RkZXIyIG1hcHBpbmdfdGVzdHMnCi1URVNUUyA9IFRFU1RTLnNwbGl0KCkKIFRFU1RfUEFUSCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKIE1PRFVMRVMgPSAibGluZWNhY2hlIGFiYyIuc3BsaXQoKQogTU9EVUxFX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUoRklMRU5BTUUpCkBAIC0zNyw2ICszNyw2NSBAQAogICAgIHJldHVybiAzJycnICMgTm8gZW5kaW5nIG5ld2xpbmUKIAogCitjbGFzcyBUZW1wRmlsZToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisgICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRlbGV0ZT1GYWxzZSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmZpbGVfbmFtZSA9IGZwLm5hbWUKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZmlsZV9ieXRlX3N0cmluZykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZpbGVfbmFtZSkKKworCitjbGFzcyBHZXRMaW5lVGVzdHNHb29kRGF0YShUZW1wRmlsZSk6CisgICAgIyBmaWxlX2xpc3QgICA9IFsnbGlzdFxuJywgJ29mXG4nLCAnZ29vZFxuJywgJ3N0cmluZ3NcbiddCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZV9ieXRlX3N0cmluZyA9ICcnLmpvaW4oc2VsZi5maWxlX2xpc3QpLmVuY29kZSgndXRmLTgnKQorICAgICAgICBzdXBlcigpLnNldFVwKCkKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggdG9rZW5pemUub3BlbihzZWxmLmZpbGVfbmFtZSkgYXMgZnA6CisgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGZwKToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSAnXG4nCisKKyAgICAgICAgICAgICAgICBjYWNoZWRfbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKHNlbGYuZmlsZV9uYW1lLCBpbmRleCArIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBjYWNoZWRfbGluZSkKKworICAgIGRlZiB0ZXN0X2dldGxpbmVzKHNlbGYpOgorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgc2VsZi5maWxlX2xpc3QpCisKKworY2xhc3MgR2V0TGluZVRlc3RzQmFkRGF0YShUZW1wRmlsZSk6CisgICAgIyBmaWxlX2J5dGVfc3RyaW5nID0gYidCYWQgZGF0YSBnb2VzIGhlcmUnCisKKyAgICBkZWYgdGVzdF9nZXRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoU3ludGF4RXJyb3IsIFVuaWNvZGVEZWNvZGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lLCBzZWxmLmZpbGVfbmFtZSwgMSkKKworICAgIGRlZiB0ZXN0X2dldGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoU3ludGF4RXJyb3IsIFVuaWNvZGVEZWNvZGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcywgc2VsZi5maWxlX25hbWUpCisKKworY2xhc3MgRW1wdHlGaWxlKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gW10KKworCitjbGFzcyBTaW5nbGVFbXB0eUxpbmUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbJ1xuJ10KKworCitjbGFzcyBHb29kVW5pY29kZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFsnw6FcbicsICdiXG4nLCAnYWJjZGVmXG4nLCAnw6HDocOhw6HDoVxuJ10KKworCitjbGFzcyBCYWRVbmljb2RlKEdldExpbmVUZXN0c0JhZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2J5dGVfc3RyaW5nID0gYidceDgwYWJjJworCisKIGNsYXNzIExpbmVDYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CkBAIC01MywxMyArMTEyLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKEVNUFRZLCAxKSwgRU1QVFkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0bGluZShJTlZBTElEX05BTUUsIDEpLCBFTVBUWSkKIAotICAgICAgICAjIENoZWNrIHdoZXRoZXIgbGluZXMgY29ycmVzcG9uZCB0byB0aG9zZSBmcm9tIGZpbGUgaXRlcmF0aW9uCi0gICAgICAgIGZvciBlbnRyeSBpbiBURVNUUzoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFU1RfUEFUSCwgZW50cnkpICsgJy5weScKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZmlsZToKLSAgICAgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGZpbGUpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoZmlsZW5hbWUsIGluZGV4ICsgMSkpCi0KICAgICAgICAgIyBDaGVjayBtb2R1bGUgbG9hZGluZwogICAgICAgICBmb3IgZW50cnkgaW4gTU9EVUxFUzoKICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKE1PRFVMRV9QQVRILCBlbnRyeSkgKyAnLnB5JwpAQCAtODAsMTIgKzEzMiwxMyBAQAogCiAgICAgZGVmIHRlc3RfY2xlYXJjYWNoZShzZWxmKToKICAgICAgICAgY2FjaGVkID0gW10KLSAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JworICAgICAgICBmb3IgZW50cnkgaW4gTU9EVUxFUzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKE1PRFVMRV9QQVRILCBlbnRyeSkgKyAnLnB5JwogICAgICAgICAgICAgY2FjaGVkLmFwcGVuZChmaWxlbmFtZSkKICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCAxKQogCiAgICAgICAgICMgQXJlIGFsbCBmaWxlcyBjYWNoZWQ/CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2FjaGVkLCBbXSkKICAgICAgICAgY2FjaGVkX2VtcHR5ID0gW2ZuIGZvciBmbiBpbiBjYWNoZWQgaWYgZm4gbm90IGluIGxpbmVjYWNoZS5jYWNoZV0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZWRfZW1wdHksIFtdKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKaW5kZXggOTU1NzViZi4uOWM0MzQ0ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQpAQCAtNDE1OSw2ICs0MTU5LDE3IEBACiAgICAgICAgIG1zZyA9ICdSZWNvcmQgbm90IGZvdW5kIGluIGV2ZW50IGxvZywgd2VudCBiYWNrICVkIHJlY29yZHMnICUgR09fQkFDSwogICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsIG1zZz1tc2cpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbG9nVGhyZWFkcycsICdsb2dNdWx0aXByb2Nlc3NpbmcnLAorICAgICAgICAgICAgICAgICAgICAgJ2xvZ1Byb2Nlc3NlcycsICdjdXJyZW50ZnJhbWUnLAorICAgICAgICAgICAgICAgICAgICAgJ1BlcmNlbnRTdHlsZScsICdTdHJGb3JtYXRTdHlsZScsICdTdHJpbmdUZW1wbGF0ZVN0eWxlJywKKyAgICAgICAgICAgICAgICAgICAgICdGaWx0ZXJlcicsICdQbGFjZUhvbGRlcicsICdNYW5hZ2VyJywgJ1Jvb3RMb2dnZXInLAorICAgICAgICAgICAgICAgICAgICAgJ3Jvb3QnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBsb2dnaW5nLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKICMgU2V0IHRoZSBsb2NhbGUgdG8gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0LiAgSSBoYXZlIG5vIGlkZWEKICMgd2h5IHRoZSB0ZXN0IGRvZXMgdGhpcywgYnV0IGluIGFueSBjYXNlIHdlIHNhdmUgdGhlIGN1cnJlbnQgbG9jYWxlCiAjIGZpcnN0IGFuZCByZXN0b3JlIGl0IGF0IHRoZSBlbmQuCkBAIC00MTc1LDcgKzQxODYsOCBAQAogICAgICAgICBSb3RhdGluZ0ZpbGVIYW5kbGVyVGVzdCwgIExhc3RSZXNvcnRUZXN0LCBMb2dSZWNvcmRUZXN0LAogICAgICAgICBFeGNlcHRpb25UZXN0LCBTeXNMb2dIYW5kbGVyVGVzdCwgSFRUUEhhbmRsZXJUZXN0LAogICAgICAgICBOVEV2ZW50TG9nSGFuZGxlclRlc3QsIFRpbWVkUm90YXRpbmdGaWxlSGFuZGxlclRlc3QsCi0gICAgICAgIFVuaXhTb2NrZXRIYW5kbGVyVGVzdCwgVW5peERhdGFncmFtSGFuZGxlclRlc3QsIFVuaXhTeXNMb2dIYW5kbGVyVGVzdCkKKyAgICAgICAgVW5peFNvY2tldEhhbmRsZXJUZXN0LCBVbml4RGF0YWdyYW1IYW5kbGVyVGVzdCwgVW5peFN5c0xvZ0hhbmRsZXJUZXN0LAorICAgICAgICBNaXNjVGVzdENhc2UpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CmluZGV4IGRhOWM4ZWYuLjU0ZmQxZjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQpAQCAtMTIwLDYzICsxMjAsNjMgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hZGQoMywgNCkgPT0gNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hZGQoMywgNCksIDcpCiAKICAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpID09IDB4YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSwgMHhhKQogCiAgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpID09ICdweXRob24nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFsxLCAyXSwgWzMsIDRdKSA9PSBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpID09IFs1LCA2LCA3XSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSkgPT0gWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpLCAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSwgWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSksIFs1LCA2LCA3XSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKIAogICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgNSksIDApCiAKICAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSBbNCwgMywgMiwgMV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob3BlcmF0b3IuZGVsaXRlbShhLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbNCwgMiwgMV0pCiAKICAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5mbG9vcmRpdig1LCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci50cnVlZGl2KDUsIDIpLCAyLjUpCiAKICAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSByYW5nZSgxMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRpdGVtKGEsIDIpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuZ2V0aXRlbShhLCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X2luZGV4T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKIAogICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKQEAgLTE4OSwyMSArMTg5LDIxIEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubHNoaWZ0KDUsIDApLCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIDIsIC0xKQogCiAgICAgZGVmIHRlc3RfbW9kKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tb2QoNSwgMikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5tb2QoNSwgMiksIDEpCiAKICAgICBkZWYgdGVzdF9tdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm11bCg1LCAyKSwgMTApCiAKICAgICBkZWYgdGVzdF9tYXRtdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm9yXygweGEsIDB4NSkgPT0gMHhmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm9yXygweGEsIDB4NSksIDB4ZikKIAogICAgIGRlZiB0ZXN0X3BvcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjUwLDggKzI1MCw4IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJzaGlmdCg1LCAxKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IucnNoaWZ0KDUsIDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKICAgICAgICAgYSA9IGxpc3QocmFuZ2UoMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG9wZXJhdG9yLnNldGl0ZW0oYSwgMCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzIsIDEsIDJdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCA0LCAyKQogCiAgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnN1Yig1LCAyKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnN1Yig1LCAyKSwgMykKIAogICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvcikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci54b3IoMHhiLCAweGMpID09IDB4NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci54b3IoMHhiLCAweGMpLCAweDcpCiAKICAgICBkZWYgdGVzdF9pcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggNzYyMWMyNC4uOTFhMDMxOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xNiw2ICsxNiw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCitpbXBvcnQgb3B0cGFyc2UKIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uLCBPcHRpb24sIFwKICAgICAgVGl0bGVkSGVscEZvcm1hdHRlciwgT3B0aW9uUGFyc2VyLCBPcHRpb25Hcm91cCwgXAogICAgICBTVVBQUkVTU19VU0FHRSwgT3B0aW9uRXJyb3IsIE9wdGlvbkNvbmZsaWN0RXJyb3IsIFwKQEAgLTE2NTAsNiArMTY1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICcweDEyeCciKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2NoZWNrX2J1aWx0aW4nLCAnQW1iaWd1b3VzT3B0aW9uRXJyb3InLCAnTk9fREVGQVVMVCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG9wdHBhcnNlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQppbmRleCA5ZDZjNmZmLi45Zjk5MjJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQpAQCAtNDAxLDYgKzQwMSwxNCBAQAogICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCoqZCkKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHN5cy5nZXRzaXplb2Yob2QpLCBzeXMuZ2V0c2l6ZW9mKGQpKQogCisgICAgZGVmIHRlc3Rfdmlld3Moc2VsZik6CisgICAgICAgIE9yZGVyZWREaWN0ID0gc2VsZi5PcmRlcmVkRGljdAorICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQyODYKKyAgICAgICAgcyA9ICd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIGEgbGF6eSBkb2cgeWVzdGVyZGF5IGJlZm9yZSBkYXduJy5zcGxpdCgpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QuZnJvbWtleXMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5rZXlzKCksIGRpY3Qob2QpLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5pdGVtcygpLCBkaWN0KG9kKS5pdGVtcygpKQorCiAgICAgZGVmIHRlc3Rfb3ZlcnJpZGVfdXBkYXRlKHNlbGYpOgogICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKICAgICAgICAgIyBWZXJpZnkgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB1cGRhdGUoKSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IGFkZTc1YTUuLjVlYzkxMWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMjI2LDE1ICsyMjYsMTAgQEAKICMgVGVzdCBhdHRyaWJ1dGVzIG9uIHJldHVybiB2YWx1ZXMgZnJvbSBvcy4qc3RhdCogZmFtaWx5LgogY2xhc3MgU3RhdEF0dHJpYnV0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuVEVTVEZOLCAiZjEiKQotICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lLCAnd2InKQotICAgICAgICBmLndyaXRlKGIiQUJDIikKLSAgICAgICAgZi5jbG9zZSgpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIG9zLnVubGluayhzZWxmLmZuYW1lKQotICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5mbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5mbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZm5hbWUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoYiJBQkMiKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N0YXQnKSwgJ3Rlc3QgbmVlZHMgb3Muc3RhdCgpJykKICAgICBkZWYgY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKHNlbGYsIGZuYW1lKToKQEAgLTQyNiw3ICs0MjEsMTEgQEAKICAgICAgICAgICAgIDApCiAKICAgICAgICAgIyB0ZXN0IGRpcmVjdG9yeSBzdF9maWxlX2F0dHJpYnV0ZXMgKEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSBzZXQpCi0gICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGRpcm5hbWUgPSBzdXBwb3J0LlRFU1RGTiArICJkaXIiCisgICAgICAgIG9zLm1rZGlyKGRpcm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5ybWRpciwgZGlybmFtZSkKKworICAgICAgICByZXN1bHQgPSBvcy5zdGF0KGRpcm5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9hdHRyaWJ1dGVzKHJlc3VsdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHJlc3VsdC5zdF9maWxlX2F0dHJpYnV0ZXMgJiBzdGF0LkZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQppbmRleCAxYzUzYWI3Li44MGNiOTdlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CkBAIC0xNDM3LDEzICsxNDM3LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHAuZ2xvYigiZGlyQS8uLi9maWxlKiIpKSwgeyBQKEJBU0UsICJkaXJBLy4uL2ZpbGVBIikgfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocC5nbG9iKCIuLi94eXp6eSIpKSwgc2V0KCkpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfcmVsYXRpdmUoc2VsZiwgcCwgZXhwZWN0ZWQpOgorCisgICAgZGVmIF9jaGVja19yZXNvbHZlKHNlbGYsIHAsIGV4cGVjdGVkKToKICAgICAgICAgcSA9IHAucmVzb2x2ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgZXhwZWN0ZWQpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfYWJzb2x1dGUoc2VsZiwgcCwgZXhwZWN0ZWQpOgotICAgICAgICBxID0gcC5yZXNvbHZlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBleHBlY3RlZCkKKyAgICAjIHRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYm90aCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcmVzb2x1dGlvbnMKKyAgICBfY2hlY2tfcmVzb2x2ZV9yZWxhdGl2ZSA9IF9jaGVja19yZXNvbHZlX2Fic29sdXRlID0gX2NoZWNrX3Jlc29sdmUKIAogICAgIEB3aXRoX3N5bWxpbmtzCiAgICAgZGVmIHRlc3RfcmVzb2x2ZV9jb21tb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CmluZGV4IGJkMzhjZmIuLjZiOTczMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0zMyw4ICszMyw2IEBACiAKICAgICB1bnBpY2tsZXIgPSBwaWNrbGUuX1VucGlja2xlcgogICAgIGJhZF9zdGFja19lcnJvcnMgPSAoSW5kZXhFcnJvciwpCi0gICAgYmFkX21hcmtfZXJyb3JzID0gKEluZGV4RXJyb3IsIHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKQogICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvciwgSW5kZXhFcnJvciwgSW1wb3J0RXJyb3IpCkBAIC02OSw4ICs2Nyw2IEBACiAgICAgcGlja2xlciA9IHBpY2tsZS5fUGlja2xlcgogICAgIHVucGlja2xlciA9IHBpY2tsZS5fVW5waWNrbGVyCiAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yKQotICAgIGJhZF9tYXJrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBFT0ZFcnJvcikKICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXJyb3IsIEluZGV4RXJyb3IsIEltcG9ydEVycm9yKQpAQCAtMTMyLDcgKzEyOCw2IEBACiAgICAgY2xhc3MgQ1VucGlja2xlclRlc3RzKFB5VW5waWNrbGVyVGVzdHMpOgogICAgICAgICB1bnBpY2tsZXIgPSBfcGlja2xlLlVucGlja2xlcgogICAgICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsKQotICAgICAgICBiYWRfbWFya19lcnJvcnMgPSAoRU9GRXJyb3IsKQogICAgICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQppbmRleCBiYmU2ODc1Li44MDIyMWYwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKQEAgLTQsNiArNCw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlVGVzdHMKIGZyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMKK2ltcG9ydCB1bml0dGVzdAogCiBjbGFzcyBPcHRpbWl6ZWRQaWNrbGVUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKToKIApAQCAtNTksOCArNjAsNDAgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihwaWNrbGUuQklOUFVULCBwaWNrbGVkMikKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydieXRlc190eXBlcycsCisgICAgICAgICAgICAgICAgICAgICAnVVBfVE9fTkVXTElORScsICdUQUtFTl9GUk9NX0FSR1VNRU5UMScsCisgICAgICAgICAgICAgICAgICAgICAnVEFLRU5fRlJPTV9BUkdVTUVOVDQnLCAnVEFLRU5fRlJPTV9BUkdVTUVOVDRVJywKKyAgICAgICAgICAgICAgICAgICAgICdUQUtFTl9GUk9NX0FSR1VNRU5UOFUnLCAnQXJndW1lbnREZXNjcmlwdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VpbnQxJywgJ3JlYWRfdWludDInLCAncmVhZF9pbnQ0JywgJ3JlYWRfdWludDQnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdWludDgnLCAncmVhZF9zdHJpbmdubCcsICdyZWFkX3N0cmluZ25sX25vZXNjYXBlJywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3N0cmluZ25sX25vZXNjYXBlX3BhaXInLCAncmVhZF9zdHJpbmcxJywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3N0cmluZzQnLCAncmVhZF9ieXRlczEnLCAncmVhZF9ieXRlczQnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfYnl0ZXM4JywgJ3JlYWRfdW5pY29kZXN0cmluZ25sJywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VuaWNvZGVzdHJpbmcxJywgJ3JlYWRfdW5pY29kZXN0cmluZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdW5pY29kZXN0cmluZzgnLCAncmVhZF9kZWNpbWFsbmxfc2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfZGVjaW1hbG5sX2xvbmcnLCAncmVhZF9mbG9hdG5sJywgJ3JlYWRfZmxvYXQ4JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2xvbmcxJywgJ3JlYWRfbG9uZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ3VpbnQxJywgJ3VpbnQyJywgJ2ludDQnLCAndWludDQnLCAndWludDgnLCAnc3RyaW5nbmwnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ25sX25vZXNjYXBlJywgJ3N0cmluZ25sX25vZXNjYXBlX3BhaXInLCAnc3RyaW5nMScsCisgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nNCcsICdieXRlczEnLCAnYnl0ZXM0JywgJ2J5dGVzOCcsCisgICAgICAgICAgICAgICAgICAgICAndW5pY29kZXN0cmluZ25sJywgJ3VuaWNvZGVzdHJpbmcxJywgJ3VuaWNvZGVzdHJpbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICd1bmljb2Rlc3RyaW5nOCcsICdkZWNpbWFsbmxfc2hvcnQnLCAnZGVjaW1hbG5sX2xvbmcnLAorICAgICAgICAgICAgICAgICAgICAgJ2Zsb2F0bmwnLCAnZmxvYXQ4JywgJ2xvbmcxJywgJ2xvbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICdTdGFja09iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAncHlpbnQnLCAncHlsb25nJywgJ3B5aW50ZWdlcl9vcl9ib29sJywgJ3B5Ym9vbCcsICdweWZsb2F0JywKKyAgICAgICAgICAgICAgICAgICAgICdweWJ5dGVzX29yX3N0cicsICdweXN0cmluZycsICdweWJ5dGVzJywgJ3B5dW5pY29kZScsCisgICAgICAgICAgICAgICAgICAgICAncHlub25lJywgJ3B5dHVwbGUnLCAncHlsaXN0JywgJ3B5ZGljdCcsICdweXNldCcsCisgICAgICAgICAgICAgICAgICAgICAncHlmcm96ZW5zZXQnLCAnYW55b2JqZWN0JywgJ21hcmtvYmplY3QnLCAnc3RhY2tzbGljZScsCisgICAgICAgICAgICAgICAgICAgICAnT3Bjb2RlSW5mbycsICdvcGNvZGVzJywgJ2NvZGUyb3AnLAorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBwaWNrbGV0b29scywgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoT3B0aW1pemVkUGlja2xlVGVzdHMpCisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWlzY1Rlc3RDYXNlKQogICAgIHN1cHBvcnQucnVuX2RvY3Rlc3QocGlja2xldG9vbHMpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQppbmRleCA2ZmZiYmJkLi4wNmMxMGMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgICMgVGhlc2Ugd2VyZSBvbmNlIGFib3V0IHRoZSAxMCBsb25nZXN0IG1vZHVsZXMKICAgICAgICAgY20oJ3JhbmRvbScsIGlnbm9yZT0oJ1JhbmRvbScsKSkgICMgZnJvbSBfcmFuZG9tIGltcG9ydCBSYW5kb20gYXMgQ29yZUdlbmVyYXRvcgogICAgICAgICBjbSgnY2dpJywgaWdub3JlPSgnbG9nJywpKSAgICAgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKLSAgICAgICAgY20oJ3BpY2tsZScpCisgICAgICAgIGNtKCdwaWNrbGUnLCBpZ25vcmU9KCdwYXJ0aWFsJywpKQogICAgICAgICBjbSgnYWlmYycsIGlnbm9yZT0oJ29wZW5mcCcsICdfYWlmY19wYXJhbXMnKSkgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKICAgICAgICAgY20oJ3NyZV9wYXJzZScsIGlnbm9yZT0oJ2R1bXAnLCAnZ3JvdXBzJykpICMgZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqOyBwcm9wZXJ0eQogICAgICAgICBjbSgncGRiJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CmluZGV4IDhhZDU3MDYuLmNkYzEyZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQpAQCAtODQxLDYgKzg0MSwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdW1tYXJ5X2xpbmUodC53cmFwKSwKICAgICAgICAgICAgICJ3cmFwKHRleHQpIG1ldGhvZCBvZiB0ZXh0d3JhcC5UZXh0V3JhcHBlciBpbnN0YW5jZSIpCiAKKyAgICBkZWYgdGVzdF9maWVsZF9vcmRlcl9mb3JfbmFtZWRfdHVwbGVzKHNlbGYpOgorICAgICAgICBQZXJzb24gPSBuYW1lZHR1cGxlKCdQZXJzb24nLCBbJ25pY2tuYW1lJywgJ2ZpcnN0bmFtZScsICdhZ2Vncm91cCddKQorICAgICAgICBzID0gcHlkb2MucmVuZGVyX2RvYyhQZXJzb24pCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzLmluZGV4KCduaWNrbmFtZScpLCBzLmluZGV4KCdmaXJzdG5hbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHMuaW5kZXgoJ2ZpcnN0bmFtZScpLCBzLmluZGV4KCdhZ2Vncm91cCcpKQorCisgICAgICAgIGNsYXNzIE5vbkl0ZXJhYmxlRmllbGRzOgorICAgICAgICAgICAgX2ZpZWxkcyA9IE5vbmUKKworICAgICAgICBjbGFzcyBOb25IYXNoYWJsZUZpZWxkczoKKyAgICAgICAgICAgIF9maWVsZHMgPSBbW11dCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlc2UgZG9lc24ndCBmYWlsCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSXRlcmFibGVGaWVsZHMpCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSGFzaGFibGVGaWVsZHMpCisKICAgICBAcmVxdWlyZXNfZG9jc3RyaW5ncwogICAgIGRlZiB0ZXN0X2JvdW5kX2J1aWx0aW5fbWV0aG9kKHNlbGYpOgogICAgICAgICBzID0gU3RyaW5nSU8oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKaW5kZXggYTM5OGE0Zi4uNTlmOGM5ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CkBAIC0xLDIxICsxLDQ5IEBACiAiIiIKIFRlc3RzIG9mIHJlZ3J0ZXN0LnB5LgorCitOb3RlOiB0ZXN0X3JlZ3J0ZXN0IGNhbm5vdCBiZSBydW4gdHdpY2UgaW4gcGFyYWxsZWwuCiAiIiIKIAogaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGZhdWx0aGFuZGxlcgogaW1wb3J0IGdldG9wdAoraW1wb3J0IGlvCiBpbXBvcnQgb3MucGF0aAoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCByZWdydGVzdCwgc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCBsaWJyZWdydGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKworUHlfREVCVUcgPSBoYXNhdHRyKHN5cywgJ2dldG9iamVjdHMnKQorUk9PVF9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgJy4uJykKK1JPT1RfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoUk9PVF9ESVIpKQorCitURVNUX0lOVEVSUlVQVEVEID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgIGZyb20gc2lnbmFsIGltcG9ydCBTSUdJTlQKKyAgICB0cnk6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCByYWlzZV9zaWduYWwKKyAgICAgICAgcmFpc2Vfc2lnbmFsKFNJR0lOVCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBvcy5raWxsKG9zLmdldHBpZCgpLCBTSUdJTlQpCisgICAgIiIiKQorCiAKIGNsYXNzIFBhcnNlQXJnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgICIiIlRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLiIiIgorICAgICIiIgorICAgIFRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLCBmdW5jdGlvbiBfcGFyc2VfYXJncygpLgorICAgICIiIgogCiAgICAgZGVmIGNoZWNrRXJyb3Ioc2VsZiwgYXJncywgbXNnKToKICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZGVycigpIGFzIGVyciwgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICByZWdydGVzdC5fcGFyc2VfYXJncyhhcmdzKQorICAgICAgICAgICAgbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoYXJncykKICAgICAgICAgc2VsZi5hc3NlcnRJbihtc2csIGVyci5nZXR2YWx1ZSgpKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKQEAgLTIzLDgyICs1MSw4MiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6CiAgICAgICAgICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dCwgXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICAgICAgICAgIHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgICAgICBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuJywgb3V0LmdldHZhbHVlKCkpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigpIHJlcXVpcmVkIikKICAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnRpbWVvdXQsIDQuMikKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10aW1lb3V0J10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRpbWVvdXQnLCAnZm9vJ10sICdpbnZhbGlkIGZsb2F0IHZhbHVlJykKIAogICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXdhaXQnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0td2FpdCddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMud2FpdCkKIAogICAgIGRlZiB0ZXN0X3NsYXZlYXJncyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc2xhdmVhcmdzJywgJ1tbXSwge31dJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXNsYXZlYXJncycsICdbW10sIHt9XSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnNsYXZlYXJncywgJ1tbXSwge31dJykKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1zbGF2ZWFyZ3MnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9zdGFydChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVMnLCAnLS1zdGFydCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnZm9vJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy12J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDEpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMykKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMSkKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAzKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF92ZXJib3NlMihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXcnLCAnLS12ZXJib3NlMic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnZlcmJvc2UyKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZTMoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1XJywgJy0tdmVyYm9zZTMnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy52ZXJib3NlMykKIAogICAgIGRlZiB0ZXN0X3F1aWV0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcScsICctLXF1aWV0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3Rfc2xvdyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW8nLCAnLS1zbG93JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucHJpbnRfc2xvdykKIAogICAgIGRlZiB0ZXN0X2hlYWRlcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0taGVhZGVyJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLWhlYWRlciddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuaGVhZGVyKQogCiAgICAgZGVmIHRlc3RfcmFuZG9taXplKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcicsICctLXJhbmRvbWl6ZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKIAogICAgIGRlZiB0ZXN0X3JhbmRzZWVkKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnJhbmRvbV9zZWVkLCAxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1yYW5kc2VlZCddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKQEAgLTEwNyw3ICsxMzUsNyBAQAogICAgIGRlZiB0ZXN0X2Zyb21maWxlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctZicsICctLWZyb21maWxlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuZnJvbWZpbGUsICdmb28nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nLCAnLXMnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKQEAgLTExNSw0MiArMTQzLDQyIEBACiAgICAgZGVmIHRlc3RfZXhjbHVkZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXgnLCAnLS1leGNsdWRlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X3NpbmdsZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXMnLCAnLS1zaW5nbGUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5zaW5nbGUpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICctZicsICdmb28nXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKIAogICAgIGRlZiB0ZXN0X21hdGNoKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbScsICctLW1hdGNoJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ3BhdHRlcm4nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdwYXR0ZXJuJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tYXRjaF90ZXN0cywgJ3BhdHRlcm4nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9mYWlsZmFzdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUcnLCAnLS1mYWlsZmFzdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctdiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy12J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZhaWxmYXN0KQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy1XJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLVcnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZmFpbGZhc3QpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVcnKQogCiAgICAgZGVmIHRlc3RfdXNlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdScsICctLXVzZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxuZXR3b3JrJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBbJ2d1aScsICduZXR3b3JrJ10pCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5vbmUsbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxub25lLG5ldHdvcmsnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIFsnbmV0d29yayddKQotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdChyZWdydGVzdC5SRVNPVVJDRV9OQU1FUykKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QobGlicmVncnRlc3QuUkVTT1VSQ0VfTkFNRVMpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucmVtb3ZlKCdndWknKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2FsbCwtZ3VpJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnYWxsLC1ndWknXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgcmVzb3VyY2UnKQpAQCAtMTU4LDMxICsxODYsMzEgQEAKICAgICBkZWYgdGVzdF9tZW1saW1pdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLU0nLCAnLS1tZW1saW1pdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc0RyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzRHJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tZW1saW1pdCwgJzRHJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdGVzdGRpcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50ZXN0ZGlyLCBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRlc3RkaXInXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9ydW5sZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUwnLCAnLS1ydW5sZWFrcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJ1bmxlYWtzKQogCiAgICAgZGVmIHRlc3RfaHVudHJsZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVInLCAnLS1odW50cmxlYWtzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzonXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNiwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6MyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzozJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgMywgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OjM6bGVha3MubG9nJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjozOmxlYWtzLmxvZyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDYsIDMsICdsZWFrcy5sb2cnKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnNiddLApAQCAtMTkzLDI0ICsyMjEsMjMgQEAKICAgICBkZWYgdGVzdF9tdWx0aXByb2Nlc3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1qJywgJy0tbXVsdGlwcm9jZXNzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzInXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcyJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfbXAsIDIpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctVCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctbCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctTScsICc0RyddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogCiAgICAgZGVmIHRlc3RfY292ZXJhZ2Uoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1UJywgJy0tY292ZXJhZ2UnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy50cmFjZSkKIAogICAgIGRlZiB0ZXN0X2NvdmVyZGlyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctRCcsICctLWNvdmVyZGlyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuY292ZXJkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCkBAIC0yMTgsMTMgKzI0NSwxMyBAQAogICAgIGRlZiB0ZXN0X25vY292ZXJkaXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1OJywgJy0tbm9jb3ZlcmRpcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobnMuY292ZXJkaXIpCiAKICAgICBkZWYgdGVzdF90aHJlc2hvbGQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy10JywgJy0tdGhyZXNob2xkJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzEwMDAnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcxMDAwJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50aHJlc2hvbGQsIDEwMDApCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQpAQCAtMjMyLDEzICsyNTksMTYgQEAKICAgICBkZWYgdGVzdF9ub3dpbmRvd3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1uJywgJy0tbm93aW5kb3dzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZGVycihpby5TdHJpbmdJTygpKSBhcyBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLm5vd2luZG93cykKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkJywgZXJyKQogCiAgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUYnLCAnLS1mb3JldmVyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZm9yZXZlcikKIAogCkBAIC0yNDYsMzAgKzI3Niw0NzggQEAKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS14eHgnXSwgJ3VzYWdlOicpCiAKICAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9fcGFydGlhbChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aSddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3R3b19vcHRpb25zKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICctLWV4Y2x1ZGUnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnLS1leGNsdWRlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl93aXRoX2VtcHR5X3N0cmluZ192YWx1ZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc3RhcnQnLCAnJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXN0YXJ0JywgJyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnJykKIAogICAgIGRlZiB0ZXN0X2FyZyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJ2ZvbyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYXJncywgWydmb28nXSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl9hbmRfYXJnKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmFyZ3MsIFsnZm9vJ10pCiAKIAorY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBURVNUX1VOSVFVRV9JRCA9IDEKKyAgICBURVNUTkFNRV9QUkVGSVggPSAndGVzdF9yZWdydGVzdF8nCisgICAgVEVTVE5BTUVfUkVHRVggPSByJ3Rlc3RfW2EtejAtOV9dKycKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisgICAgICAgICMgV2hlbiB0ZXN0X3JlZ3J0ZXN0IGlzIGludGVycnVwdGVkIGJ5IENUUkwrYywgaXQgY2FuIGxlYXZlCisgICAgICAgICMgdGVtcG9yYXJ5IHRlc3QgZmlsZXMKKyAgICAgICAgcmVtb3ZlID0gW2VudHJ5LnBhdGgKKyAgICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5zY2FuZGlyKHNlbGYudGVzdGRpcikKKyAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5uYW1lLnN0YXJ0c3dpdGgoc2VsZi5URVNUTkFNRV9QUkVGSVgpCisgICAgICAgICAgICAgICAgICAgICAgYW5kIGVudHJ5Lm5hbWUuZW5kc3dpdGgoIi5weSIpKV0KKyAgICAgICAgZm9yIHBhdGggaW4gcmVtb3ZlOgorICAgICAgICAgICAgcHJpbnQoIldBUk5JTkc6IHRlc3RfcmVncnRlc3Q6IHJlbW92ZSAlcyIgJSBwYXRoKQorICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsocGF0aCkKKworICAgIGRlZiBjcmVhdGVfdGVzdChzZWxmLCBuYW1lPU5vbmUsIGNvZGU9JycpOgorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAnbm9vcCVzJyAlIEJhc2VUZXN0Q2FzZS5URVNUX1VOSVFVRV9JRAorICAgICAgICAgICAgQmFzZVRlc3RDYXNlLlRFU1RfVU5JUVVFX0lEICs9IDEKKworICAgICAgICAjIHRlc3RfcmVncnRlc3QgY2Fubm90IGJlIHJ1biB0d2ljZSBpbiBwYXJhbGxlbCBiZWNhdXNlCisgICAgICAgICMgb2Ygc2V0VXAoKSBhbmQgY3JlYXRlX3Rlc3QoKQorICAgICAgICBuYW1lID0gc2VsZi5URVNUTkFNRV9QUkVGSVggKyAiJXNfJXMiICUgKG9zLmdldHBpZCgpLCBuYW1lKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRpciwgbmFtZSArICcucHknKQorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgcGF0aCkKKyAgICAgICAgIyBVc2UgJ3gnIG1vZGUgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IG92ZXJyaWRlIGV4aXN0aW5nIHRlc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAneCcsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKGNvZGUpCisgICAgICAgIGV4Y2VwdCBQZXJtaXNzaW9uRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgbm90IHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3Qgd3JpdGUgJXM6ICVzIiAlIChwYXRoLCBleGMpKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiByZWdleF9zZWFyY2goc2VsZiwgcmVnZXgsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHJlZ2V4LCBvdXRwdXQsIHJlLk1VTFRJTElORSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBub3QgZm91bmQgaW4gJXIiICUgKHJlZ2V4LCBvdXRwdXQpKQorICAgICAgICByZXR1cm4gbWF0Y2gKKworICAgIGRlZiBjaGVja19saW5lKHNlbGYsIG91dHB1dCwgcmVnZXgpOgorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocideJyArIHJlZ2V4LCByZS5NVUxUSUxJTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0cHV0LCByZWdleCkKKworICAgIGRlZiBwYXJzZV9leGVjdXRlZF90ZXN0cyhzZWxmLCBvdXRwdXQpOgorICAgICAgICByZWdleCA9IHInXlxbICpbMC05XSsoPzovICpbMC05XSspP1xdICglcykkJyAlIHNlbGYuVEVTVE5BTUVfUkVHRVgKKyAgICAgICAgcGFyc2VyID0gcmUuZmluZGl0ZXIocmVnZXgsIG91dHB1dCwgcmUuTVVMVElMSU5FKQorICAgICAgICByZXR1cm4gbGlzdChtYXRjaC5ncm91cCgxKSBmb3IgbWF0Y2ggaW4gcGFyc2VyKQorCisgICAgZGVmIGNoZWNrX2V4ZWN1dGVkX3Rlc3RzKHNlbGYsIG91dHB1dCwgdGVzdHMsIHNraXBwZWQ9KCksIGZhaWxlZD0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZD0oKSwgcmFuZG9taXplPUZhbHNlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgc3RyKToKKyAgICAgICAgICAgIHRlc3RzID0gW3Rlc3RzXQorICAgICAgICBpZiBpc2luc3RhbmNlKHNraXBwZWQsIHN0cik6CisgICAgICAgICAgICBza2lwcGVkID0gW3NraXBwZWRdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbGVkLCBzdHIpOgorICAgICAgICAgICAgZmFpbGVkID0gW2ZhaWxlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvbWl0dGVkLCBzdHIpOgorICAgICAgICAgICAgb21pdHRlZCA9IFtvbWl0dGVkXQorICAgICAgICBudGVzdCA9IGxlbih0ZXN0cykKKyAgICAgICAgbnNraXBwZWQgPSBsZW4oc2tpcHBlZCkKKyAgICAgICAgbmZhaWxlZCA9IGxlbihmYWlsZWQpCisgICAgICAgIG5vbWl0dGVkID0gbGVuKG9taXR0ZWQpCisKKyAgICAgICAgZXhlY3V0ZWQgPSBzZWxmLnBhcnNlX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCkKKyAgICAgICAgaWYgcmFuZG9taXplOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZXhlY3V0ZWQpLCBzZXQodGVzdHMpLCBvdXRwdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4ZWN1dGVkLCB0ZXN0cywgb3V0cHV0KQorCisgICAgICAgIGRlZiBwbHVyYWwoY291bnQpOgorICAgICAgICAgICAgcmV0dXJuICdzJyBpZiBjb3VudCAhPSAxIGVsc2UgJycKKworICAgICAgICBkZWYgbGlzdF9yZWdleChsaW5lX2Zvcm1hdCwgdGVzdHMpOgorICAgICAgICAgICAgY291bnQgPSBsZW4odGVzdHMpCisgICAgICAgICAgICBuYW1lcyA9ICcgJy5qb2luKHNvcnRlZCh0ZXN0cykpCisgICAgICAgICAgICByZWdleCA9IGxpbmVfZm9ybWF0ICUgKGNvdW50LCBwbHVyYWwoY291bnQpKQorICAgICAgICAgICAgcmVnZXggPSByJyVzOlxuICAgICVzJCcgJSAocmVnZXgsIG5hbWVzKQorICAgICAgICAgICAgcmV0dXJuIHJlZ2V4CisKKyAgICAgICAgaWYgc2tpcHBlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIHNraXBwZWQnLCBza2lwcGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgZmFpbGVkJywgZmFpbGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgb21pdHRlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIG9taXR0ZWQnLCBvbWl0dGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgZ29vZCA9IG50ZXN0IC0gbnNraXBwZWQgLSBuZmFpbGVkIC0gbm9taXR0ZWQKKyAgICAgICAgaWYgZ29vZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gciclcyB0ZXN0JXMgT0tcLiQnICUgKGdvb2QsIHBsdXJhbChnb29kKSkKKyAgICAgICAgICAgIGlmIG5vdCBza2lwcGVkIGFuZCBub3QgZmFpbGVkIGFuZCBnb29kID4gMToKKyAgICAgICAgICAgICAgICByZWdleCA9ICdBbGwgJXMnICUgcmVnZXgKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHBhcnNlX3JhbmRvbV9zZWVkKHNlbGYsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidVc2luZyByYW5kb20gc2VlZCAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgcmFuZHNlZWQgPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHJhbmRzZWVkIDw9IDEwMDAwMDAwLCByYW5kc2VlZCkKKyAgICAgICAgcmV0dXJuIHJhbmRzZWVkCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgYXJncywgaW5wdXQ9Tm9uZSwgZXhpdGNvZGU9MCwgKiprdyk6CisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIGlucHV0ID0gJycKKyAgICAgICAgaWYgJ3N0ZGVycicgbm90IGluIGt3OgorICAgICAgICAgICAga3dbJ3N0ZGVyciddID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLnJ1bihhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dD1pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3KQorICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgIT0gZXhpdGNvZGU6CisgICAgICAgICAgICBtc2cgPSAoIkNvbW1hbmQgJXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVzXG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJzdGRvdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICIlc1xuIgorICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAlIChzdHIoYXJncyksIHByb2MucmV0dXJuY29kZSwgcHJvYy5zdGRvdXQpKQorICAgICAgICAgICAgaWYgcHJvYy5zdGRlcnI6CisgICAgICAgICAgICAgICAgbXNnICs9ICgiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAic3RkZXJyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBwcm9jLnN0ZGVycikKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCisgICAgICAgIHJldHVybiBwcm9jCisKKworICAgIGRlZiBydW5fcHl0aG9uKHNlbGYsIGFyZ3MsICoqa3cpOgorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLVgnLCAnZmF1bHRoYW5kbGVyJywgJy1JJywgKmFyZ3NdCisgICAgICAgIHByb2MgPSBzZWxmLnJ1bl9jb21tYW5kKGFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiBwcm9jLnN0ZG91dAorCisKK2NsYXNzIFByb2dyYW1zVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHZhcmlvdXMgd2F5cyB0byBydW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlLiBVc2Ugb3B0aW9ucyBjbG9zZQorICAgIHRvIG9wdGlvbnMgdXNlZCBvbiB0aGUgYnVpbGRib3QuCisgICAgIiIiCisKKyAgICBOVEVTVCA9IDQKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisKKyAgICAgICAgIyBDcmVhdGUgTlRFU1QgdGVzdHMgZG9pbmcgbm90aGluZworICAgICAgICBzZWxmLnRlc3RzID0gW3NlbGYuY3JlYXRlX3Rlc3QoKSBmb3IgaW5kZXggaW4gcmFuZ2Uoc2VsZi5OVEVTVCldCisKKyAgICAgICAgc2VsZi5weXRob25fYXJncyA9IFsnLVdkJywgJy1FJywgJy1iYiddCisgICAgICAgIHNlbGYucmVncnRlc3RfYXJncyA9IFsnLXVhbGwnLCAnLXJ3VyddCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIHNlbGYucmVncnRlc3RfYXJncy5leHRlbmQoKCctLXRpbWVvdXQnLCAnMzYwMCcsICctajQnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MuYXBwZW5kKCctbicpCisKKyAgICBkZWYgY2hlY2tfb3V0cHV0KHNlbGYsIG91dHB1dCk6CisgICAgICAgIHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgc2VsZi50ZXN0cywgcmFuZG9taXplPVRydWUpCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYsIGFyZ3MpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9weXRob24oYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQob3V0cHV0KQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIExpYi90ZXN0L3JlZ3J0ZXN0LnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkaXIsICdyZWdydGVzdC5weScpCisKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3JlZ3J0ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QucmVncnRlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QucmVncnRlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIC1tIHRlc3QuYXV0b3Rlc3QKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1tJywgJ3Rlc3QuYXV0b3Rlc3QnLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2Zyb21fdGVzdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0CisgICAgICAgIGNvZGUgPSAnZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdCcKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgJy1jJywgY29kZSwKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyBMaWIvdGVzdC9hdXRvdGVzdC5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGlyLCAnYXV0b3Rlc3QucHknKQorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCBzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdydW5fdGVzdHMucHkgc2NyaXB0IGlzIG5vdCBpbnN0YWxsZWQnKQorICAgIGRlZiB0ZXN0X3Rvb2xzX3NjcmlwdF9ydW5fdGVzdHMoc2VsZik6CisgICAgICAgICMgVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAnVG9vbHMnLCAnc2NyaXB0cycsICdydW5fdGVzdHMucHknKQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhbc2NyaXB0LCAqc2VsZi50ZXN0c10pCisKKyAgICBkZWYgcnVuX2JhdGNoKHNlbGYsICphcmdzKToKKyAgICAgICAgcHJvYyA9IHNlbGYucnVuX2NvbW1hbmQoYXJncykKKyAgICAgICAgc2VsZi5jaGVja19vdXRwdXQocHJvYy5zdGRvdXQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuYmF0IHNjcmlwdCBpcyBub3QgaW5zdGFsbGVkJykKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfdG9vbHNfYnVpbGRib3RfdGVzdChzZWxmKToKKyAgICAgICAgIyBUb29sc1xidWlsZGJvdFx0ZXN0LmJhdAorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdUb29scycsICdidWlsZGJvdCcsICd0ZXN0LmJhdCcpCisgICAgICAgIHRlc3RfYXJncyA9IFtdCisgICAgICAgIGlmIHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdID09ICc2NGJpdCc6CisgICAgICAgICAgICB0ZXN0X2FyZ3MuYXBwZW5kKCcteDY0JykgICAjIDY0LWJpdCBidWlsZAorICAgICAgICBpZiBub3QgUHlfREVCVUc6CisgICAgICAgICAgICB0ZXN0X2FyZ3MuYXBwZW5kKCcrZCcpICAgICAjIFJlbGVhc2UgYnVpbGQsIHVzZSBweXRob24uZXhlCisgICAgICAgIHNlbGYucnVuX2JhdGNoKHNjcmlwdCwgKnRlc3RfYXJncywgKnNlbGYudGVzdHMpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfcGNidWlsZF9ydChzZWxmKToKKyAgICAgICAgIyBQQ2J1aWxkXHJ0LmJhdAorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsIHInUENidWlsZFxydC5iYXQnKQorICAgICAgICBydF9hcmdzID0gWyItcSJdICAgICAgICAgICAgICMgUXVpY2ssIGRvbid0IHJ1biB0ZXN0cyB0d2ljZQorICAgICAgICBpZiBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSA9PSAnNjRiaXQnOgorICAgICAgICAgICAgcnRfYXJncy5hcHBlbmQoJy14NjQnKSAgICMgNjQtYml0IGJ1aWxkCisgICAgICAgIGlmIFB5X0RFQlVHOgorICAgICAgICAgICAgcnRfYXJncy5hcHBlbmQoJy1kJykgICAgICMgRGVidWcgYnVpbGQsIHVzZSBweXRob25fZC5leGUKKyAgICAgICAgc2VsZi5ydW5fYmF0Y2goc2NyaXB0LCAqcnRfYXJncywgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHMpCisKKworY2xhc3MgQXJnc1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCBhcmd1bWVudHMgb2YgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlLgorICAgICIiIgorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9weXRob24oWyctbScsICd0ZXN0JywgKmFyZ3NdLCAqKmt3KQorCisgICAgZGVmIHRlc3RfZmFpbGluZ190ZXN0KHNlbGYpOgorICAgICAgICAjIHRlc3QgYSBmYWlsaW5nIHRlc3QKKyAgICAgICAgY29kZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICBjbGFzcyBGYWlsaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfZmFpbGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJidWciKQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3Rfb2sgPSBzZWxmLmNyZWF0ZV90ZXN0KCkKKyAgICAgICAgdGVzdF9mYWlsaW5nID0gc2VsZi5jcmVhdGVfdGVzdChjb2RlPWNvZGUpCisgICAgICAgIHRlc3RzID0gW3Rlc3Rfb2ssIHRlc3RfZmFpbGluZ10KKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygqdGVzdHMsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cywgZmFpbGVkPXRlc3RfZmFpbGluZykKKworICAgIGRlZiB0ZXN0X3Jlc291cmNlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC11IGNvbW1hbmQgbGluZSBvcHRpb24KKyAgICAgICAgdGVzdHMgPSB7fQorICAgICAgICBmb3IgcmVzb3VyY2UgaW4gKCdhdWRpbycsICduZXR3b3JrJyk6CisgICAgICAgICAgICBjb2RlID0gJ2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydFxuc3VwcG9ydC5yZXF1aXJlcyglciknICUgcmVzb3VyY2UKKyAgICAgICAgICAgIHRlc3RzW3Jlc291cmNlXSA9IHNlbGYuY3JlYXRlX3Rlc3QocmVzb3VyY2UsIGNvZGUpCisgICAgICAgIHRlc3RfbmFtZXMgPSBzb3J0ZWQodGVzdHMudmFsdWVzKCkpCisKKyAgICAgICAgIyAtdSBhbGw6IDIgcmVzb3VyY2VzIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy11JywgJ2FsbCcsICp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcykKKworICAgICAgICAjIC11IGF1ZGlvOiAxIHJlc291cmNlIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy11YXVkaW8nLCAqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZD10ZXN0c1snbmV0d29yayddKQorCisgICAgICAgICMgbm8gb3B0aW9uOiAwIHJlc291cmNlcyBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkPXRlc3RfbmFtZXMpCisKKyAgICBkZWYgdGVzdF9yYW5kb20oc2VsZik6CisgICAgICAgICMgdGVzdCAtciBhbmQgLS1yYW5kc2VlZCBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgICAgICBwcmludCgiVEVTVFJBTkRPTTogJXMiICUgcmFuZG9tLnJhbmRpbnQoMSwgMTAwMCkpCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ3JhbmRvbScsIGNvZGUpCisKKyAgICAgICAgIyBmaXJzdCBydW4gdG8gZ2V0IHRoZSBvdXRwdXQgd2l0aCB0aGUgcmFuZG9tIHNlZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy1yJywgdGVzdCkKKyAgICAgICAgcmFuZHNlZWQgPSBzZWxmLnBhcnNlX3JhbmRvbV9zZWVkKG91dHB1dCkKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnJlZ2V4X3NlYXJjaChyJ1RFU1RSQU5ET006IChbMC05XSspJywgb3V0cHV0KQorICAgICAgICB0ZXN0X3JhbmRvbSA9IGludChtYXRjaC5ncm91cCgxKSkKKworICAgICAgICAjIHRyeSB0byByZXByb2R1Y2Ugd2l0aCB0aGUgcmFuZG9tIHNlZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy1yJywgJy0tcmFuZHNlZWQ9JXMnICUgcmFuZHNlZWQsIHRlc3QpCisgICAgICAgIHJhbmRzZWVkMiA9IHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmRzZWVkMiwgcmFuZHNlZWQpCisKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnJlZ2V4X3NlYXJjaChyJ1RFU1RSQU5ET006IChbMC05XSspJywgb3V0cHV0KQorICAgICAgICB0ZXN0X3JhbmRvbTIgPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9yYW5kb20yLCB0ZXN0X3JhbmRvbSkKKworICAgIGRlZiB0ZXN0X2Zyb21maWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1mcm9tZmlsZQorICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGluZGV4IGluIHJhbmdlKDUpXQorCisgICAgICAgICMgV3JpdGUgdGhlIGxpc3Qgb2YgZmlsZXMgdXNpbmcgYSBmb3JtYXQgc2ltaWxhciB0byByZWdydGVzdCBvdXRwdXQ6CisgICAgICAgICMgWzEvMl0gdGVzdF8xCisgICAgICAgICMgWzIvMl0gdGVzdF8yCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZSh0ZXN0cywgMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIlslcy8lc10gJXMiICUgKGluZGV4LCBsZW4odGVzdHMpLCBuYW1lKSwgZmlsZT1mcCkKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlZChzZWxmKToKKyAgICAgICAgY29kZSA9IFRFU1RfSU5URVJSVVBURUQKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoInNpZ2ludCIsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHModGVzdCwgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3QsIG9taXR0ZWQ9dGVzdCkKKworICAgIGRlZiB0ZXN0X3Nsb3coc2VsZik6CisgICAgICAgICMgdGVzdCAtLXNsb3cKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSgzKV0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tc2xvdyIsICp0ZXN0cykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJyg/OiVzOiBbMC05XStcLlswLTldK3Ncbil7JXN9JworICAgICAgICAgICAgICAgICAlIChzZWxmLlRFU1ROQU1FX1JFR0VYLCBsZW4odGVzdHMpKSkKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9zbG93X2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyNTM3MzogdGVzdCAtLXNsb3cgd2l0aCBhbiBpbnRlcnJ1cHRlZCB0ZXN0CisgICAgICAgIGNvZGUgPSBURVNUX0lOVEVSUlVQVEVECisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCJzaWdpbnQiLCBjb2RlPWNvZGUpCisKKyAgICAgICAgZm9yIG11bHRpcHJvY2Vzc2luZyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgaWYgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgICAgIGFyZ3MgPSAoIi0tc2xvdyIsICItajIiLCB0ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzID0gKCItLXNsb3ciLCB0ZXN0KQorICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKmFyZ3MsIGV4aXRjb2RlPTEpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdCwgb21pdHRlZD10ZXN0KQorICAgICAgICAgICAgcmVnZXggPSAoJzEwIHNsb3dlc3QgdGVzdHM6XG4nKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULicpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tY292ZXJhZ2UKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygiLS1jb3ZlcmFnZSIsIHRlc3QpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0pCisgICAgICAgIHJlZ2V4ID0gKCdsaW5lcyArY292JSArbW9kdWxlICtcKHBhdGhcKVxuJworICAgICAgICAgICAgICAgICAnKD86ICpbMC05XSsgKlswLTldezEsMn0lICpbXiBdKyArXChbXildK1wpKykrJykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICAjIHRlc3QgLS13YWl0CisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0td2FpdCIsIHRlc3QsIGlucHV0PSdrZXknKQorICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnUHJlc3MgYW55IGtleSB0byBjb250aW51ZScpCisKKyAgICBkZWYgdGVzdF9mb3JldmVyKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1mb3JldmVyCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRm9yZXZlclRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgUlVOID0gMQorCisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBGb3JldmVyVGVzdGVyLlJVTiArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIEZvcmV2ZXJUZXN0ZXIuUlVOID4gMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbCBhdCB0aGUgM3JkIHJ1bnMiKQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZm9yZXZlcicsIHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0qMywgZmFpbGVkPXRlc3QpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgYSBkZWJ1ZyBidWlsZCcpCisgICAgZGVmIHRlc3RfaHVudHJsZWFrc19mZF9sZWFrKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1odW50cmxlYWtzIGZvciBmaWxlIGRlc2NyaXB0b3IgbGVhaworICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgIyBJc3N1ZSAjMjUzMDY6IERpc2FibGUgcG9wdXBzIGFuZCBsb2dzIHRvIHN0ZGVyciBvbiBhc3NlcnRpb24KKyAgICAgICAgICAgICMgZmFpbHVyZXMgaW4gTVNDUlQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICAjIG5vIFdpbmRvd3MsIG8gcmVsZWFzZSBidWlsZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gW21zdmNydC5DUlRfV0FSTiwgbXN2Y3J0LkNSVF9FUlJPUiwgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgICAgICAgICBjbGFzcyBGRExlYWtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9sZWFrKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4oX19maWxlX18sIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgICAgICAgICAjIGJ1ZzogbmV2ZXIgY2xvZXMgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KGNvZGU9Y29kZSkKKworICAgICAgICBmaWxlbmFtZSA9ICdyZWZsb2cudHh0JworICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1odW50cmxlYWtzJywgJzM6MzonLCB0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0Y29kZT0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0sIGZhaWxlZD10ZXN0KQorCisgICAgICAgIGxpbmUgPSAnYmVnaW5uaW5nIDYgcmVwZXRpdGlvbnNcbjEyMzQ1NlxuLi4uLi4uXG4nCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlLmVzY2FwZShsaW5lKSkKKworICAgICAgICBsaW5lMiA9ICclcyBsZWFrZWQgWzEsIDEsIDFdIGZpbGUgZGVzY3JpcHRvcnMsIHN1bT0zXG4nICUgdGVzdAorICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZS5lc2NhcGUobGluZTIpKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZnA6CisgICAgICAgICAgICByZWZsb2cgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmbG9nLCBsaW5lMikKKworICAgIGRlZiB0ZXN0X2xpc3RfdGVzdHMoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWxpc3QtdGVzdHMKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpIGluIHJhbmdlKDUpXQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1saXN0LXRlc3RzJywgKnRlc3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5yc3RyaXAoKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQppbmRleCAxNTgyY2FhLi41ODcyOWE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CkBAIC0yNTMsNiArMjUzLDMxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICE9IGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDwgYikKIAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9tZXNzYWdlKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBOb25lLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogTm9uZSA8IDQyLCByIic8JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPiBOb25lLCByIic+JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPCBOb25lLCByIic8JyAuKiBvZiAnc3RyJyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPj0gNjY2LCByIic+PScgLiogb2YgJ3N0cicgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8PSBOb25lLCByIic8PScgLiogb2YgJ2ludCcgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyID49IE5vbmUsIHIiJz49JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBbXSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdsaXN0JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogKCkgPiBbXSwgciInPicgLiogb2YgJ3R1cGxlJyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lID49IE5vbmUsIHIiJz49JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBTcGFtKCkgPCA0MiwgciInPCcgLiogb2YgJ1NwYW0nIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBTcGFtKCksIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnU3BhbSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8PSBTcGFtKCksIHIiJzw9JyAuKiBvZiAnU3BhbScgYW5kICdTcGFtJyIpLAorICAgICAgICBdCisgICAgICAgIGZvciBpLCB0ZXN0IGluIGVudW1lcmF0ZSh0ZXN0cyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIHRlc3RbMV0pOgorICAgICAgICAgICAgICAgICAgICB0ZXN0WzBdKCkKKworCiBjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kaWN0cyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CmluZGV4IDJkNWQ5YzEuLjIwOGMwNTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQpAQCAtMSwxMCArMSwxMiBAQAogaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCiBpbXBvcnQgYnVpbHRpbnMKIGltcG9ydCBybGNvbXBsZXRlcgogCiBjbGFzcyBDb21wbGV0ZU1lOgogICAgICIiIiBUcml2aWFsIGNsYXNzIHVzZWQgaW4gdGVzdGluZyBybGNvbXBsZXRlci5Db21wbGV0ZXIuICIiIgogICAgIHNwYW0gPSAxCisgICAgX2hhbSA9IDIKIAogCiBjbGFzcyBUZXN0Umxjb21wbGV0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTEsMTggKzUzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWydzdHIue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygndHVwbGUuZm9vc3BhbWVnZycpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBzb3J0ZWQoeydOb25lLiVzJXMnICUgKHgsICcoJyBpZiB4ICE9ICdfX2RvY19fJyBlbHNlICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gZGlyKE5vbmUpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fXycpLCBleHBlY3RlZCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBhIGN1c3RvbWl6ZWQgbmFtZXNwYWNlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLnNwJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLnNwYW0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlbWUuZWdnJyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubXJvKCcsICdDb21wbGV0ZU1lLnNwYW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5faGFtJ10pCisgICAgICAgIG1hdGNoZXMgPSBzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuX18nKQorICAgICAgICBmb3IgeCBpbiBtYXRjaGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnQ29tcGxldGVNZS5fXycpLCB4KQorICAgICAgICBzZWxmLmFzc2VydEluKCdDb21wbGV0ZU1lLl9fbmFtZV9fJywgbWF0Y2hlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25ld19fKCcsIG1hdGNoZXMpCiAKLSAgICAgICAgQ29tcGxldGVNZS5tZSA9IENvbXBsZXRlTWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUubWUubWUuc3AnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ2VnZy57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisgICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KENvbXBsZXRlTWUsICJtZSIsIENvbXBsZXRlTWUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5tZS5tZS5zcGFtJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKIAogICAgIGRlZiB0ZXN0X2V4Y2Vzc2l2ZV9nZXRhdHRyKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSBnZXRhdHRyKCkgaXMgaW52b2tlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgYXR0cmlidXRlCkBAIC03NywxMyArOTMsMjYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuYicsIDApLCAnZi5iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2FsbHMsIDEpCiAKKyAgICBkZWYgdGVzdF91bmNyZWF0ZWRfYXR0cihzZWxmKToKKyAgICAgICAgIyBBdHRyaWJ1dGVzIGxpa2UgcHJvcGVydGllcyBhbmQgc2xvdHMgc2hvdWxkIGJlIGNvbXBsZXRlZCBldmVuIHdoZW4KKyAgICAgICAgIyB0aGV5IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIG9uIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICgiYmFyIiwpCisgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihkaWN0KGY9Rm9vKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZi4nLCAwKSwgJ2YuYmFyJykKKwogICAgIGRlZiB0ZXN0X2NvbXBsZXRlKHNlbGYpOgogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnJywgMCksICdcdCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMCksICdhbmQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhbicsIDApLCAnYW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FzJywgMiksICdhc3NlcnQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3BhJywgMCksICdwYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ0ZhJywgMCksICdGYWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDApLCAnZWxpZiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZWwnLCAxKSwgJ2Vsc2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHInLCAwKSwgJ3RyeTonKQogCiAgICAgZGVmIHRlc3RfZHVwbGljYXRlX2dsb2JhbHMoc2VsZik6CiAgICAgICAgIG5hbWVzcGFjZSA9IHsKQEAgLTk2LDkgKzEyNSwxMCBAQAogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIobmFtZXNwYWNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmFsc2UnLCAwKSwgJ0ZhbHNlJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDEpKSAgIyBObyBkdXBsaWNhdGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCcpCisgICAgICAgICMgU3BhY2Ugb3IgY29sb24gYWRkZWQgZHVlIHRvIGJlaW5nIGEgcmVzZXJ2ZWQga2V5d29yZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXNzZXJ0JywgMCksICdhc3NlcnQgJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5OicpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMSkpCiAgICAgICAgICMgTm8gb3BlbmluZyBicmFja2V0ICIoIiBiZWNhdXNlIHdlIG92ZXJyb2RlIHRoZSBidWlsdC1pbiBjbGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnbWVtb3J5dmlldycsIDApLCAnbWVtb3J5dmlldycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQppbmRleCBkMDEyNjZmLi45MGIzMDcyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKQEAgLTEsNiArMSw3IEBACiBpbXBvcnQgaW8KIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5yb2JvdHBhcnNlcgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IFVSTEVycm9yLCBIVFRQRXJyb3IKIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydApAQCAtMTIsNyArMTMsOCBAQAogCiAKIGNsYXNzIFJvYm90VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleD1Ob25lLCBwYXJzZXI9Tm9uZSwgdXJsPU5vbmUsIGdvb2Q9Tm9uZSwgYWdlbnQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLAorICAgICAgICAgICAgICAgICBhZ2VudD1Ob25lLCByZXF1ZXN0X3JhdGU9Tm9uZSwgY3Jhd2xfZGVsYXk9Tm9uZSk6CiAgICAgICAgICMgd29ya2Fyb3VuZCB0byBtYWtlIHVuaXR0ZXN0IGRpc2NvdmVyeSB3b3JrIChzZWUgIzE3MDY2KQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmRleCwgaW50KToKICAgICAgICAgICAgIHJldHVybgpAQCAtMjUsNiArMjcsOCBAQAogICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgICBzZWxmLmdvb2QgPSBnb29kCiAgICAgICAgIHNlbGYuYWdlbnQgPSBhZ2VudAorICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZSA9IHJlcXVlc3RfcmF0ZQorICAgICAgICBzZWxmLmNyYXdsX2RlbGF5ID0gY3Jhd2xfZGVsYXkKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudXJsLCB0dXBsZSk6CkBAIC0zNCw2ICszOCwxOCBAQAogICAgICAgICAgICAgYWdlbnQgPSBzZWxmLmFnZW50CiAgICAgICAgIGlmIHNlbGYuZ29vZDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmNyYXdsX2RlbGF5KGFnZW50KSwgc2VsZi5jcmF3bF9kZWxheSkKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhY3R1YWwgdmFsdWVzIGZvciByZXF1ZXN0IHJhdGUKKyAgICAgICAgICAgIGlmIHNlbGYucmVxdWVzdF9yYXRlIGFuZCBzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkucmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlLnJlcXVlc3RzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkuc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUuc2Vjb25kcworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KSwgc2VsZi5yZXF1ZXN0X3JhdGUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKIApAQCAtNDMsMTUgKzU5LDE3IEBACiB0ZXN0cyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCiAKIGRlZiBSb2JvdFRlc3QoaW5kZXgsIHJvYm90c190eHQsIGdvb2RfdXJscywgYmFkX3VybHMsCi0gICAgICAgICAgICAgIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CisgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CiAKICAgICBsaW5lcyA9IGlvLlN0cmluZ0lPKHJvYm90c190eHQpLnJlYWRsaW5lcygpCiAgICAgcGFyc2VyID0gdXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCiAgICAgcGFyc2VyLnBhcnNlKGxpbmVzKQogICAgIGZvciB1cmwgaW4gZ29vZF91cmxzOgotICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAxLCBhZ2VudCkpCisgICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50LAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpKQogICAgIGZvciB1cmwgaW4gYmFkX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDAsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAKICMgRXhhbXBsZXMgZnJvbSBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvd2Mvbm9yb2JvdHMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCkBAIC02NSwxNCArODMsMTggQEAKIAogZ29vZCA9IFsnLycsJy90ZXN0Lmh0bWwnXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy90bXAveHh4JywnL2Zvby5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUKK2NyYXdsX2RlbGF5ID0gTm9uZQogCi1Sb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMi4KIGRvYyA9ICIiIgogIyByb2JvdHMudHh0IGZvciBodHRwOi8vd3d3LmV4YW1wbGUuY29tLwogCiBVc2VyLWFnZW50OiAqCitDcmF3bC1kZWxheTogMQorUmVxdWVzdC1yYXRlOiAzLzE1CiBEaXNhbGxvdzogL2N5YmVyd29ybGQvbWFwLyAjIFRoaXMgaXMgYW4gaW5maW5pdGUgdmlydHVhbCBVUkwgc3BhY2UKIAogIyBDeWJlcm1hcHBlciBrbm93cyB3aGVyZSB0byBnby4KQEAgLTgzLDggKzEwNSwxMCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCcsKCdjeWJlcm1hcHBlcicsJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJyldCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgVGhlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVxdWFsIHRvIE5vbmUgc2luY2UgdGhleQorY3Jhd2xfZGVsYXkgPSBOb25lICAgIyBkb24ndCBhcHBseSB0byB0aGUgY3liZXJtYXBwZXIgdXNlciBhZ2VudAogCi1Sb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMy4KIGRvYyA9ICIiIgpAQCAtOTUsMTQgKzExOSwxOCBAQAogCiBnb29kID0gW10KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnLCcvJywnL3RtcC8nXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy1yZmMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCiAjIDQuCiBkb2MgPSAiIiIKIFVzZXItYWdlbnQ6IGZpZ3RyZWUKK0NyYXdsLWRlbGF5OiAzCitSZXF1ZXN0LXJhdGU6IDkvMzAKIERpc2FsbG93OiAvdG1wCiBEaXNhbGxvdzogL2ElM2NkLmh0bWwKIERpc2FsbG93OiAvYSUyZmIuaHRtbApAQCAtMTE1LDggKzE0MywxNyBAQAogICAgICAgICcvfmpvZS9pbmRleC5odG1sJwogICAgICAgIF0KIAotUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCAnZmlndHJlZScpCi1Sb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsICdGaWdUcmVlIFJvYm90IGxpYnd3dy1wZXJsLzUuMDQnKQorcmVxdWVzdF9yYXRlID0gbmFtZWR0dXBsZSgncmVxX3JhdGUnLCAncmVxdWVzdHMgc2Vjb25kcycpCityZXF1ZXN0X3JhdGUucmVxdWVzdHMgPSA5CityZXF1ZXN0X3JhdGUuc2Vjb25kcyA9IDMwCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZV9iYWQgPSBOb25lICAjIG5vdCBhY3R1YWxseSB0ZXN0ZWQsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHBhcnNlIGl0CitjcmF3bF9kZWxheV9iYWQgPSBOb25lICAjIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisKKworUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5LCAnZmlndHJlZScgKQorUm9ib3RUZXN0KDUsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGVfYmFkLCBjcmF3bF9kZWxheV9iYWQsCisgICAgICAgICAgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCiAKICMgNi4KIGRvYyA9ICIiIgpAQCAtMTI1LDE0ICsxNjIsMTggQEAKIERpc2FsbG93OiAvYSUzQ2QuaHRtbAogRGlzYWxsb3c6IC9hL2IuaHRtbAogRGlzYWxsb3c6IC8lN2Vqb2UvaW5kZXguaHRtbAorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvdG1wJyxdICMgWEZBSUw6ICcvYSUyZmIuaHRtbCcKIGJhZCA9IFsnL3RtcC8nLCcvdG1wL2EuaHRtbCcsCiAgICAgICAgJy9hJTNjZC5odG1sJywnL2ElM0NkLmh0bWwnLCIvYS9iLmh0bWwiLAogICAgICAgICcvJTdFam9lL2luZGV4Lmh0bWwnXQorY3Jhd2xfZGVsYXkgPSAzCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIHNpbmNlIHJlcXVlc3QgcmF0ZSBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBOb25lCiAKLVJvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyBGcm9tIGJ1ZyByZXBvcnQgIzUyMzA0MQogCkBAIC0xNDAsMTIgKzE4MSwxNiBAQAogZG9jID0gIiIiCiBVc2VyLUFnZW50OiAqCiBEaXNhbGxvdzogLy4KK0NyYXdsLWRlbGF5OiBwZWFycwogIiIiCiAKIGdvb2QgPSBbJy9mb28uaHRtbCddCi1iYWQgPSBbXSAjIEJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKK2JhZCA9IFtdICAjIGJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKIAotUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkKQorY3Jhd2xfZGVsYXkgPSBOb25lICAjIHNpbmNlIGNyYXdsIGRlbGF5IGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUKKworUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlKQogCiAjIEZyb20gR29vZ2xlOiBodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC93ZWJtYXN0ZXJzL2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW5zd2VyPTQwMzY0CiAKQEAgLTE1NCwxMiArMTk5LDE1IEBACiBVc2VyLWFnZW50OiBHb29nbGVib3QKIEFsbG93OiAvZm9sZGVyMS9teWZpbGUuaHRtbAogRGlzYWxsb3c6IC9mb2xkZXIxLworUmVxdWVzdC1yYXRlOiB3aGFsZS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQorY3Jhd2xfZGVsYXkgPSBOb25lCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIGludmFsaWQgc3ludGF4LCByZXR1cm4gbm9uZQogCi1Sb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDgsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlLCBhZ2VudD0iR29vZ2xlYm90IikKIAogIyA5LiAgVGhpcyBmaWxlIGlzIGluY29ycmVjdCBiZWNhdXNlICJHb29nbGVib3QiIGlzIGEgc3Vic3RyaW5nIG9mCiAjICAgICAiR29vZ2xlYm90LU1vYmlsZSIsIHNvIHRlc3QgMTAgd29ya3MganVzdCBsaWtlIHRlc3QgOS4KQEAgLTE3NCwxMiArMjIyLDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDksIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAjIDExLiAgR2V0IHRoZSBvcmRlciBjb3JyZWN0LgogZG9jID0gIiIiCkBAIC0xOTMsMTIgKzI0MSwxMiBAQAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDExLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogYmFkID0gW10KIAotUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAKICMgMTMuICBHb29nbGUgYWxzbyBnb3QgdGhlIG9yZGVyIHdyb25nIGluICM4LiAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUKQEAgLTIxMiw3ICsyNjAsNyBAQAogZ29vZCA9IFsnL2ZvbGRlcjEvbXlmaWxlLmh0bWwnXQogYmFkID0gWycvZm9sZGVyMS9hbm90aGVyZmlsZS5odG1sJ10KIAotUm9ib3RUZXN0KDEzLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Imdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iZ29vZ2xlYm90IikKIAogCiAjIDE0LiBGb3IgaXNzdWUgIzYzMjUgKHF1ZXJ5IHN0cmluZyBzdXBwb3J0KQpAQCAtMjI0LDcgKzI3Miw3IEBACiBnb29kID0gWycvc29tZS9wYXRoJ10KIGJhZCA9IFsnL3NvbWUvcGF0aD9uYW1lPXZhbHVlJ10KIAotUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNCwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTUuIEZvciBpc3N1ZSAjNDEwOCAob2JleSBmaXJzdCAqIGVudHJ5KQogZG9jID0gIiIiCkBAIC0yMzgsNyArMjg2LDcgQEAKIGdvb2QgPSBbJy9hbm90aGVyL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoJ10KIAotUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTYuIEVtcHR5IHF1ZXJ5IChpc3N1ZSAjMTc0MDMpLiBOb3JtYWxpemluZyB0aGUgdXJsIGZpcnN0LgogZG9jID0gIiIiCkBAIC0yNTAsNyArMjk4LDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGg/J10KIGJhZCA9IFsnL2Fub3RoZXIvcGF0aD8nXQogCi1Sb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogCiBjbGFzcyBSb2JvdEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDU0ZGU1MDguLmFkZTM5ZmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0xMCw2ICsxMCw4IEBACiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHN0cmluZwogCiBjbGFzcyBQYXNzVGhydShFeGNlcHRpb24pOgogICAgIHBhc3MKQEAgLTcxMSw2ICs3MTMsMjggQEAKICAgICAgICAgICAgIGFkZGhhc2h2YWx1ZShoYXNoKGZyb3plbnNldChbZSBmb3IgZSwgbSBpbiBlbGVtbWFza3MgaWYgbSZpXSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihoYXNodmFsdWVzKSwgMioqbikKIAorICAgICAgICBkZWYgbGV0dGVyX3JhbmdlKG4pOgorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5hc2NpaV9sZXR0ZXJzWzpuXQorCisgICAgICAgIGRlZiB6Zl9yYW5nZShuKToKKyAgICAgICAgICAgICMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2V0LXRoZW9yZXRpY19kZWZpbml0aW9uX29mX25hdHVyYWxfbnVtYmVycworICAgICAgICAgICAgbnVtcyA9IFtmcm96ZW5zZXQoKV0KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4tMSk6CisgICAgICAgICAgICAgICAgbnVtID0gZnJvemVuc2V0KG51bXMpCisgICAgICAgICAgICAgICAgbnVtcy5hcHBlbmQobnVtKQorICAgICAgICAgICAgcmV0dXJuIG51bXNbOm5dCisKKyAgICAgICAgZGVmIHBvd2Vyc2V0KHMpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gbWFwKGZyb3plbnNldCwgaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhzLCBpKSkKKworICAgICAgICBmb3IgbiBpbiByYW5nZSgxOCk6CisgICAgICAgICAgICB0ID0gMiAqKiBuCisgICAgICAgICAgICBtYXNrID0gdCAtIDEKKyAgICAgICAgICAgIGZvciBudW1zIGluIChyYW5nZSwgbGV0dGVyX3JhbmdlLCB6Zl9yYW5nZSk6CisgICAgICAgICAgICAgICAgdSA9IGxlbih7aCAmIG1hc2sgZm9yIGggaW4gbWFwKGhhc2gsIHBvd2Vyc2V0KG51bXMobikpKX0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDQqdSwgdCkKKwogY2xhc3MgRnJvemVuU2V0U3ViY2xhc3MoZnJvemVuc2V0KToKICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKaW5kZXggMWUzNTVlYS4uOTk3MDdjZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTI4MDksNiArMjgwOSw3IEBACiAgICAgICAgICAgICBuYnl0ZXMgPSBzZWxmLnNlbmRtc2dUb1NlcnZlcihbbXNnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihtc2cpKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gImRhcndpbiIsICJzZWUgaXNzdWUgIzI0NzI1IikKICAgICBkZWYgdGVzdEZEUGFzc0VtcHR5KHNlbGYpOgogICAgICAgICAjIFRyeSB0byBwYXNzIGFuIGVtcHR5IEZEIGFycmF5LiAgQ2FuIHJlY2VpdmUgZWl0aGVyIG5vIGFycmF5CiAgICAgICAgICMgb3IgYW4gZW1wdHkgYXJyYXkuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CmluZGV4IDU0OGZlZWIuLmQxYTkwODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC0xMzQyLDYgKzEzNDIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpby53cml0ZSwgMSkKIAogCitAdW5pdHRlc3Quc2tpcElmKFRydWUsICJ0ZW1wb3JhcmlseSBkaXNhYmxlZDogc2VlICMyNTk0MCIpCiBjbGFzcyBOZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgpAQCAtMTcxMSw2ICsxNzEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoY291bnQsIGZ1bmMuX19uYW1lX18pKQogICAgICAgICByZXR1cm4gcmV0CiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKFRydWUsICJ0ZW1wb3JhcmlseSBkaXNhYmxlZDogc2VlICMyNTk0MCIpCiAgICAgZGVmIHRlc3RfaGFuZHNoYWtlKHNlbGYpOgogICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgogICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKaW5kZXggMDA4OWFlOC4uOWE1NGZlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQpAQCAtNjk5LDYgKzY5OSw3IEBACiAgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKHgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIG51bS9kZW4pCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKFRydWUsICJ0ZW1wb3JhcmlseSBkaXNhYmxlZDogc2VlICMyNTkyOCIpCiAgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKICAgICAgICAgRCA9IERlY2ltYWwKICAgICAgICAgX2V4YWN0X3JhdGlvID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8KQEAgLTczMCw2ICs3MzEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhyYXRpb1sxXSwgTm9uZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyYXRpb1swXSksIHR5cGUobmFuKSkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoVHJ1ZSwgInRlbXBvcmFyaWx5IGRpc2FibGVkOiBzZWUgIzI1OTI4IikKICAgICBkZWYgdGVzdF9kZWNpbWFsX25hbihzZWxmKToKICAgICAgICAgTkFOID0gRGVjaW1hbCgiTkFOIikKICAgICAgICAgc05BTiA9IERlY2ltYWwoInNOQU4iKQpAQCAtMTI1OCw2ICsxMjYwLDcgQEAKICAgICAgICAgd2l0aCBkZWNpbWFsLmxvY2FsY29udGV4dChkZWNpbWFsLkJhc2ljQ29udGV4dCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkZWNpbWFsLkludmFsaWRPcGVyYXRpb24sIHN0YXRpc3RpY3MuX3N1bSwgZGF0YSkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoVHJ1ZSwgInRlbXBvcmFyaWx5IGRpc2FibGVkOiBzZWUgIzI1OTI4IikKICAgICBkZWYgdGVzdF9kZWNpbWFsX3NuYW5fcmFpc2VzKHNlbGYpOgogICAgICAgICAjIEFkZGluZyBzTkFOIHNob3VsZCByYWlzZSBJbnZhbGlkT3BlcmF0aW9uLgogICAgICAgICBzTkFOID0gRGVjaW1hbCgnc05BTicpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQppbmRleCAxYmYxNzQ4Li5lODhlM2VjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKQEAgLTE1Myw4ICsxNTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIHVzaW5nICclcyc7IGdyb3VwICdhJyA9ICclcycsIGdyb3VwICdiJyA9ICVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChmb3VuZC5zdHJpbmcsIGZvdW5kLnJlLnBhdHRlcm4sIGZvdW5kLmdyb3VwKCdhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmdyb3VwKCdiJykpKQotICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsJ0EnLCdiJywnQicsJ2MnLCdkJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywnUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdVJywndycsJ1cnLCd4JywnWCcsJ3knLCdZJywnWicsJyUnKToKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0cnLCdIJywnSScsJ2onLCdtJywnTScsJ3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsJ3UnLCdVJywnVicsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CiAgICAgICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKCIlIiArIGRpcmVjdGl2ZSkKICAgICAgICAgICAgIGZvdW5kID0gY29tcGlsZWQubWF0Y2godGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiTWF0Y2hpbmcgZmFpbGVkIG9uICclcycgdXNpbmcgJyVzJyByZWdleCIgJQpAQCAtMjE5LDYgKzIxOSwyNiBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiclcycgZGlkIG5vdCByYWlzZSBWYWx1ZUVycm9yIiAlIGJhZF9mb3JtYXQpCiAKKyAgICAgICAgIyBBbWJpZ3VvdXMgb3IgaW5jb21wbGV0ZSBjYXNlcyB1c2luZyBJU08geWVhci93ZWVrL3dlZWtkYXkgZGlyZWN0aXZlcworICAgICAgICAjIDEuIElTTyB3ZWVrICglVikgaXMgc3BlY2lmaWVkLCBidXQgdGhlIHllYXIgaXMgc3BlY2lmaWVkIHdpdGggJVkKKyAgICAgICAgIyBpbnN0ZWFkIG9mICVHCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUwIiwgIiVZICVWIikKKyAgICAgICAgIyAyLiBJU08geWVhciAoJUcpIGFuZCBJU08gd2VlayAoJVYpIGFyZSBzcGVjaWZpZWQsIGJ1dCB3ZWVrZGF5IGlzIG5vdAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MSIsICIlRyAlViIpCisgICAgICAgICMgMy4gSVNPIHllYXIgKCVHKSBhbmQgd2Vla2RheSBhcmUgc3BlY2lmaWVkLCBidXQgSVNPIHdlZWsgKCVWKSBpcyBub3QKKyAgICAgICAgZm9yIHcgaW4gKCdBJywgJ2EnLCAndycsICd1Jyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTEiLCIlRyAle30iLmZvcm1hdCh3KSkKKyAgICAgICAgIyA0LiBJU08geWVhciBpcyBzcGVjaWZpZWQgYWxvbmUgKGUuZy4gdGltZS5zdHJwdGltZSgnMjAxNScsICclRycpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMjAxNSIsICIlRyIpCisgICAgICAgICMgNS4gSnVsaWFuL29yZGluYWwgZGF5ICglaikgaXMgc3BlY2lmaWVkIHdpdGggJUcsIGJ1dCBub3QgJVkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgMjU2IiwgIiVHICVqIikKKworCiAgICAgZGVmIHRlc3Rfc3RycHRpbWVfZXhjZXB0aW9uX2NvbnRleHQoc2VsZik6CiAgICAgICAgICMgY2hlY2sgdGhhdCB0aGlzIGRvZXNuJ3QgY2hhaW4gZXhjZXB0aW9ucyBuZWVkbGVzc2x5IChzZWUgIzE3NTcyKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGU6CkBAIC0yOTAsNyArMzEwLDcgQEAKIAogICAgIGRlZiB0ZXN0X3dlZWtkYXkoc2VsZik6CiAgICAgICAgICMgVGVzdCB3ZWVrZGF5IGRpcmVjdGl2ZXMKLSAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ0EnLCAnYScsICd3Jyk6CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdBJywgJ2EnLCAndycsICd1Jyk6CiAgICAgICAgICAgICBzZWxmLmhlbHBlcihkaXJlY3RpdmUsNikKIAogICAgIGRlZiB0ZXN0X2p1bGlhbihzZWxmKToKQEAgLTQ1NywxNiArNDc3LDIwIEBACiAgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gaW5mZXIgZGF0ZSBpZiBnaXZlbiB5ZWFyLCB3ZWVrIG9mIHllYXIgKCVVIG9yICVXKQogICAgICAgICAjIGFuZCBkYXkgb2YgdGhlIHdlZWsKICAgICAgICAgZGVmIHRlc3RfaGVscGVyKHltZF90dXBsZSwgdGVzdF9yZWFzb24pOgotICAgICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ1cnLCAnVScpOgotICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJSVZICUlJXMgJSV3IiAlIGRpcmVjdGl2ZQotICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCi0gICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKLSAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LCBmb3JtYXRfc3RyaW5nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSB0ZXN0IGZhaWxlZCB3LyAnJXMnOiAlcyAhPSAlcyAoJXMgIT0gJXMpIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfcmVhc29uLCBkaXJlY3RpdmUsIHN0cnBfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs3XSwgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkpCisgICAgICAgICAgICBmb3IgeWVhcl93ZWVrX2Zvcm1hdCBpbiAoJyVZICVXJywgJyVZICVVJywgJyVHICVWJyk6CisgICAgICAgICAgICAgICAgZm9yIHdlZWtkYXlfZm9ybWF0IGluICgnJXcnLCAnJXUnLCAnJWEnLCAnJUEnKToKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZyA9IHllYXJfd2Vla19mb3JtYXQgKyAnICcgKyB3ZWVrZGF5X2Zvcm1hdAorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0X3JlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT15bWRfdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD1mb3JtYXRfc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX2lucHV0ID0gZHRfZGF0ZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiJXI6ICVzICE9ICVzIiAlIChzdHJwX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdF9kYXRlLnRpbWV0dXBsZSgpWzddKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwgbXNnKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMyksICJ3ZWVrIDAiKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgOCksICJjb21tb24gY2FzZSIpCiAgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAxMyksICJkYXkgb24gU3VuZGF5IikKQEAgLTQ5OCwxOCArNTIyLDI1IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh2YWx1ZSwgZm9ybWF0KVs6LTFdLCBleHBlY3RlZCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAwJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDI4LCAwLCAwLCAwLCA2LCAtMykKICAgICAgICAgY2hlY2soJzIwMTUgMCAwJywgJyVZICVXICV3JywgMjAxNSwgMSwgNCwgMCwgMCwgMCwgNiwgNCkKKyAgICAgICAgY2hlY2soJzIwMTUgMSAxJywgJyVHICVWICV1JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMScsICclWSAlVSAldycsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgLTIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMScsICclWSAlVyAldycsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgLTIpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgMicsICclRyAlViAldScsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQogICAgICAgICBjaGVjaygnMjAxNSAwIDInLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIC0xKQogICAgICAgICBjaGVjaygnMjAxNSAwIDInLCAnJVkgJVcgJXcnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIC0xKQorICAgICAgICBjaGVjaygnMjAxNSAxIDMnLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMTUgMCAzJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAwKQogICAgICAgICBjaGVjaygnMjAxNSAwIDMnLCAnJVkgJVcgJXcnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDApCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNCcsICclRyAlViAldScsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVSAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNCcsICclWSAlVyAldycsIDIwMTUsIDEsIDEsIDAsIDAsIDAsIDMsIDEpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNScsICclRyAlViAldScsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVSAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNScsICclWSAlVyAldycsIDIwMTUsIDEsIDIsIDAsIDAsIDAsIDQsIDIpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNicsICclRyAlViAldScsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVSAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgNicsICclWSAlVyAldycsIDIwMTUsIDEsIDMsIDAsIDAsIDAsIDUsIDMpCisgICAgICAgIGNoZWNrKCcyMDE1IDEgNycsICclRyAlViAldScsIDIwMTUsIDEsIDQsIDAsIDAsIDAsIDYsIDQpCiAKIAogY2xhc3MgQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggMmMwMDQxNy4uZjg2ZWE5MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtOSwxMyArOSwxMSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIFRFU1RGTiA9IHN1cHBvcnQuVEVTVEZOCi1URVNURElSTiA9IG9zLnBhdGguYmFzZW5hbWUodGVtcGZpbGUubWtkdGVtcChkaXI9Jy4nKSkKIAogCiBjbGFzcyBUZXN0U3VwcG9ydCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCi0gICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQogICAgIHRlYXJEb3duID0gc2V0VXAKIAogICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGUoc2VsZik6CkBAIC00OCw2ICs0NiwxMCBAQAogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCiAKICAgICBkZWYgdGVzdF9ybXRyZWUoc2VsZik6CisgICAgICAgIFRFU1RESVJOID0gb3MucGF0aC5iYXNlbmFtZSh0ZW1wZmlsZS5ta2R0ZW1wKGRpcj0nLicpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIFRFU1RESVJOKQorICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKKwogICAgICAgICBvcy5ta2RpcihURVNURElSTikKICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKFRFU1RESVJOLCBURVNURElSTikpCiAgICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQpAQCAtMzEyLDYgKzMxNCwyOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuT3RoZXJDbGFzcywgc2VsZi5SZWZDbGFzcywgaWdub3JlPWlnbm9yZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoKSwgbWlzc2luZ19pdGVtcykKIAorICAgIGRlZiB0ZXN0X2NoZWNrX19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7J3RlbXBkaXInfQorICAgICAgICBibGFja2xpc3QgPSB7J3RlbXBsYXRlJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgICAgIGV4dHJhID0geydUZXh0VGVzdFJlc3VsdCcsICdpbnN0YWxsSGFuZGxlcid9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbG9hZF90ZXN0cycsICJUZXN0UHJvZ3JhbSIsICJCYXNlVGVzdFN1aXRlIn0KKworICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ1bml0dGVzdC5yZXN1bHQiLCAidW5pdHRlc3QuY2FzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc3VpdGUiLCAidW5pdHRlc3QubG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5tYWluIiwgInVuaXR0ZXN0LnJ1bm5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc2lnbmFscyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc3VwcG9ydC5jaGVja19fYWxsX18sIHNlbGYsIHVuaXR0ZXN0KQorCiAgICAgIyBYWFggLWZvbGxvd3MgYSBsaXN0IG9mIHVudGVzdGVkIEFQSQogICAgICMgbWFrZV9sZWdhY3lfcHljCiAgICAgIyBpc19yZXNvdXJjZV9lbmFibGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2I5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weQpAQCAtMCwwICsxLDU1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IGZpbGVjbXAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN1YnByb2Nlc3MKKworCitTWU1CT0xfRklMRSAgICAgICAgICAgICAgPSBzdXBwb3J0LmZpbmRmaWxlKCdzeW1ib2wucHknKQorR1JBTU1BUl9GSUxFICAgICAgICAgICAgID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uJywgJy4uJywgJ0luY2x1ZGUnLCAnZ3JhbWluaXQuaCcpCitURVNUX1BZX0ZJTEUgICAgICAgICAgICAgPSAnc3ltYm9sX3Rlc3QucHknCisKKworY2xhc3MgVGVzdFN5bWJvbEdlbmVyYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9jb3B5X2ZpbGVfd2l0aG91dF9nZW5lcmF0ZWRfc3ltYm9scyhzZWxmLCBzb3VyY2VfZmlsZSwgZGVzdF9maWxlKToKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgd2l0aCBvcGVuKGRlc3RfZmlsZSwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlbGluZXMobGluZXNbOmxpbmVzLmluZGV4KCIjLS1zdGFydCBjb25zdGFudHMtLVxuIikgKyAxXSkKKyAgICAgICAgICAgIGZwLndyaXRlbGluZXMobGluZXNbbGluZXMuaW5kZXgoIiMtLWVuZCBjb25zdGFudHMtLVxuIik6XSkKKworICAgIGRlZiBfZ2VuZXJhdGVfc3ltYm9scyhzZWxmLCBncmFtbWFyX2ZpbGUsIHRhcmdldF9zeW1ib2xfcHlfZmlsZSk6CisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZTUJPTF9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hcl9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3N5bWJvbF9weV9maWxlXSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3RkZXJyID0gcHJvYy5jb21tdW5pY2F0ZSgpWzFdCisgICAgICAgIHJldHVybiBwcm9jLnJldHVybmNvZGUsIHN0ZGVycgorCisgICAgZGVmIGNvbXBhcmVfZmlsZXMoc2VsZiwgZmlsZTEsIGZpbGUyKToKKyAgICAgICAgd2l0aCBvcGVuKGZpbGUxKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzMSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHdpdGggb3BlbihmaWxlMikgYXMgZnA6CisgICAgICAgICAgICBsaW5lczIgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzMSwgbGluZXMyKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3Qgb3MucGF0aC5leGlzdHMoR1JBTU1BUl9GSUxFKSwKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG9ubHkgd29ya3MgZnJvbSBzb3VyY2UgYnVpbGQgZGlyZWN0b3J5JykKKyAgICBkZWYgdGVzdF9yZWFsX2dyYW1tYXJfYW5kX3N5bWJvbF9maWxlKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIG91dHB1dCkKKworICAgICAgICBzZWxmLl9jb3B5X2ZpbGVfd2l0aG91dF9nZW5lcmF0ZWRfc3ltYm9scyhTWU1CT0xfRklMRSwgb3V0cHV0KQorCisgICAgICAgIGV4aXRjb2RlLCBzdGRlcnIgPSBzZWxmLl9nZW5lcmF0ZV9zeW1ib2xzKEdSQU1NQVJfRklMRSwgb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4aXRjb2RlKQorCisgICAgICAgIHNlbGYuY29tcGFyZV9maWxlcyhTWU1CT0xfRklMRSwgb3V0cHV0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CmluZGV4IDZjMjdjMTYuLjYxMDM3N2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CkBAIC00Miw2ICs0MiwxMSBAQAogICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKICAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQogCisgICAgZGVmIHRlc3RDb250ZXh0TWFuYWdlcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkgYXMgdG46CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZSh0bi5nZXRfc29ja2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHRuLmdldF9zb2NrZXQoKSkKKwogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CmluZGV4IDNiMTFiZjYuLjQ1NTY0ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3VicHJvY2VzcwogCiBmcm9tIHRlc3QgaW1wb3J0IGxvY2tfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKICMgQmV0d2VlbiBmb3JrKCkgYW5kIGV4ZWMoKSwgb25seSBhc3luYy1zYWZlIGZ1bmN0aW9ucyBhcmUgYWxsb3dlZCAoaXNzdWVzCkBAIC0xMDk4LDUgKzEwOTksMTIgQEAKIGNsYXNzIEJhcnJpZXJUZXN0cyhsb2NrX3Rlc3RzLkJhcnJpZXJUZXN0cyk6CiAgICAgYmFycmllcnR5cGUgPSBzdGF0aWNtZXRob2QodGhyZWFkaW5nLkJhcnJpZXIpCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsiVGhyZWFkRXJyb3IifQorICAgICAgICBibGFja2xpc3QgPSB7J2N1cnJlbnRUaHJlYWQnLCAnYWN0aXZlQ291bnQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB0aHJlYWRpbmcsICgndGhyZWFkaW5nJywgJ190aHJlYWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKaW5kZXggNzZiODk0ZS4uZjg4M2M0NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMSw2ICsxLDggQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IGRlY2ltYWwKIGltcG9ydCBlbnVtCiBpbXBvcnQgbG9jYWxlCitpbXBvcnQgbWF0aAogaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3lzY29uZmlnCkBAIC0yMSwxNyArMjMsMjcgQEAKIFRJTUVfTUFYWUVBUiA9ICgxIDw8IDggKiBTSVpFT0ZfSU5UIC0gMSkgLSAxCiBUSU1FX01JTllFQVIgPSAtVElNRV9NQVhZRUFSIC0gMQogCitTRUNfVE9fVVMgPSAxMCAqKiA2CiBVU19UT19OUyA9IDEwICoqIDMKIE1TX1RPX05TID0gMTAgKiogNgogU0VDX1RPX05TID0gMTAgKiogOQorTlNfVE9fU0VDID0gMTAgKiogOQogCiBjbGFzcyBfUHlUaW1lKGVudW0uSW50RW51bSk6CiAgICAgIyBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKQogICAgIFJPVU5EX0ZMT09SID0gMAogICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKICAgICBST1VORF9DRUlMSU5HID0gMQorICAgICMgUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIKKyAgICBST1VORF9IQUxGX0VWRU4gPSAyCiAKLUFMTF9ST1VORElOR19NRVRIT0RTID0gKF9QeVRpbWUuUk9VTkRfRkxPT1IsIF9QeVRpbWUuUk9VTkRfQ0VJTElORykKKyMgUm91bmRpbmcgbW9kZXMgc3VwcG9ydGVkIGJ5IFB5VGltZQorUk9VTkRJTkdfTU9ERVMgPSAoCisgICAgIyAoUHlUaW1lIHJvdW5kaW5nIG1ldGhvZCwgZGVjaW1hbCByb3VuZGluZyBtZXRob2QpCisgICAgKF9QeVRpbWUuUk9VTkRfRkxPT1IsIGRlY2ltYWwuUk9VTkRfRkxPT1IpLAorICAgIChfUHlUaW1lLlJPVU5EX0NFSUxJTkcsIGRlY2ltYWwuUk9VTkRfQ0VJTElORyksCisgICAgKF9QeVRpbWUuUk9VTkRfSEFMRl9FVkVOLCBkZWNpbWFsLlJPVU5EX0hBTEZfRVZFTiksCispCiAKIAogY2xhc3MgVGltZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTYwNyw3OSArNjE5LDYgQEAKIAogCiBjbGFzcyBUZXN0UHl0aW1lKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuaW52YWxpZF92YWx1ZXMgPSAoCi0gICAgICAgICAgICAtKDIgKiogMTAwKSwgMiAqKiAxMDAsCi0gICAgICAgICAgICAtKDIuMCAqKiAxMDAuMCksIDIuMCAqKiAxMDAuMCwKLSAgICAgICAgKQotCi0gICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5Ci0gICAgZGVmIHRlc3RfdGltZV90KHNlbGYpOgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lX3QKLSAgICAgICAgZm9yIG9iaiwgdGltZV90LCBybmQgaW4gKAotICAgICAgICAgICAgIyBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKQotICAgICAgICAgICAgKDAsIDAsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAtMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMCwgLTEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjksIC0yLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjAsIDEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuOSwgMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpCi0gICAgICAgICAgICAoMCwgMCwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMCwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuOSwgLTEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS4wLCAxLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuOSwgMiwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aW1lX29iamVjdF90b190aW1lX3Qob2JqLCBybmQpLCB0aW1lX3QpCi0KLSAgICAgICAgcm5kID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBmb3IgaW52YWxpZCBpbiBzZWxmLmludmFsaWRfdmFsdWVzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dGltZV9vYmplY3RfdG9fdGltZV90LCBpbnZhbGlkLCBybmQpCi0KLSAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKLSAgICBkZWYgdGVzdF90aW1lc3BlYyhzZWxmKToKLSAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMKLSAgICAgICAgZm9yIG9iaiwgdGltZXNwZWMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCi0gICAgICAgICAgICAoMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMCwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMWUtOSwgKDAsIDEpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxZS0xMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMWUtOSwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMWUtMTAsICgtMSwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMiwgKC0yLCA4MDAwMDAwMDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgwLjk5OTk5OTk5OTksICgwLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTAsICgxLCAxMjM0NTY3ODkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTksICgxLCAxMjM0NTY3ODkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkwLCAoLTIsIDg3NjU0MzIxMSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTEsICgtMiwgODc2NTQzMjEwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpCi0gICAgICAgICAgICAoMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjAsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMWUtOSwgKDAsIDEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDFlLTEwLCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTFlLTksICgtMSwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtMTAsICgwLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4yLCAoLTIsIDgwMDAwMDAwMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMC45OTk5OTk5OTk5LCAoMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS4xMjM0NTY3ODkwLCAoMSwgMTIzNDU2NzkwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTksICgxLCAxMjM0NTY3OTApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTAsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkxLCAoLTIsIDg3NjU0MzIxMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzcGVjPXRpbWVzcGVjKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMob2JqLCBybmQpLCB0aW1lc3BlYykKLQotICAgICAgICBybmQgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIGZvciBpbnZhbGlkIGluIHNlbGYuaW52YWxpZF92YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aW1lX29iamVjdF90b190aW1lc3BlYywgaW52YWxpZCwgcm5kKQotCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGltZS5fU1RSVUNUX1RNX0lURU1TID09IDExLCAibmVlZHMgdG1fem9uZSBzdXBwb3J0IikKICAgICBkZWYgdGVzdF9sb2NhbHRpbWVfdGltZXpvbmUoc2VsZik6CiAKQEAgLTczNCwyNjYgKzY3MywyOTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJcyhsdC50bV96b25lLCBOb25lKQogCiAKLUB1bml0dGVzdC5za2lwVW5sZXNzKF90ZXN0Y2FwaSBpcyBub3QgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICduZWVkIHRoZSBfdGVzdGNhcGkgbW9kdWxlJykKLWNsYXNzIFRlc3RQeVRpbWVfdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitAdW5pdHRlc3Quc2tpcElmKF90ZXN0Y2FwaSBpcyBOb25lLCAnbmVlZCB0aGUgX3Rlc3RjYXBpIG1vZHVsZScpCitjbGFzcyBDUHlUaW1lVGVzdENhc2U6CisgICAgIiIiCisgICAgQmFzZSBjbGFzcyB0byB0ZXN0IHRoZSBDIF9QeVRpbWVfdCBBUEkuCisgICAgIiIiCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFNJWkVPRl9USU1FX1QKKyAgICAgICAgYml0cyA9IFNJWkVPRl9USU1FX1QgKiA4IC0gMQorICAgICAgICBzZWxmLnRpbWVfdF9taW4gPSAtMiAqKiBiaXRzCisgICAgICAgIHNlbGYudGltZV90X21heCA9IDIgKiogYml0cyAtIDEKKworICAgIGRlZiB0aW1lX3RfZmlsdGVyKHNlbGYsIHNlY29uZHMpOgorICAgICAgICByZXR1cm4gKHNlbGYudGltZV90X21pbiA8PSBzZWNvbmRzIDw9IHNlbGYudGltZV90X21heCkKKworICAgIGRlZiBfcm91bmRpbmdfdmFsdWVzKHNlbGYsIHVzZV9mbG9hdCk6CisgICAgICAgICJCdWlsZCB0aW1lc3RhbXBzIHVzZWQgdG8gdGVzdCByb3VuZGluZy4iCisKKyAgICAgICAgdW5pdHMgPSBbMSwgVVNfVE9fTlMsIE1TX1RPX05TLCBTRUNfVE9fTlNdCisgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICMgcGljb3NlY29uZHMgYXJlIG9ubHkgdGVzdGVkIHRvIHB5dGltZV9jb252ZXJ0ZXIgYWNjZXB0aW5nIGZsb2F0cworICAgICAgICAgICAgdW5pdHMuYXBwZW5kKDFlLTMpCisKKyAgICAgICAgdmFsdWVzID0gKAorICAgICAgICAgICAgIyBzbWFsbCB2YWx1ZXMKKyAgICAgICAgICAgIDEsIDIsIDUsIDcsIDEyMywgNDU2LCAxMjM0LAorICAgICAgICAgICAgIyAxMF5rIC0gMQorICAgICAgICAgICAgOSwKKyAgICAgICAgICAgIDk5LAorICAgICAgICAgICAgOTk5LAorICAgICAgICAgICAgOTk5OSwKKyAgICAgICAgICAgIDk5OTk5LAorICAgICAgICAgICAgOTk5OTk5LAorICAgICAgICAgICAgIyB0ZXN0IGhhbGYgZXZlbiByb3VuZGluZyBuZWFyIDAuNSwgMS41LCAyLjUsIDMuNSwgNC41CisgICAgICAgICAgICA0OTksIDUwMCwgNTAxLAorICAgICAgICAgICAgMTQ5OSwgMTUwMCwgMTUwMSwKKyAgICAgICAgICAgIDI1MDAsCisgICAgICAgICAgICAzNTAwLAorICAgICAgICAgICAgNDUwMCwKKyAgICAgICAgKQorCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSBbMF0KKyAgICAgICAgZm9yIHVuaXQgaW4gdW5pdHM6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgIG5zID0gdmFsdWUgKiB1bml0CisgICAgICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorICAgICAgICBmb3IgcG93MiBpbiAoMCwgNSwgMTAsIDE1LCAyMiwgMjMsIDI0LCAzMCwgMzMpOgorICAgICAgICAgICAgbnMgPSAoMiAqKiBwb3cyKSAqIFNFQ19UT19OUworICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKAorICAgICAgICAgICAgICAgIC1ucy0xLCAtbnMsIC1ucysxLAorICAgICAgICAgICAgICAgIG5zLTEsIG5zLCBucysxCisgICAgICAgICAgICApKQorICAgICAgICBmb3Igc2Vjb25kcyBpbiAoX3Rlc3RjYXBpLklOVF9NSU4sIF90ZXN0Y2FwaS5JTlRfTUFYKToKKyAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuYXBwZW5kKHNlY29uZHMgKiBTRUNfVE9fTlMpCisgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICMgbnVtYmVycyB3aXRoIGFuIGV4dHJhY3QgcmVwcmVzZW50YXRpb24gaW4gSUVFRSA3NTQgKGJhc2UgMikKKyAgICAgICAgICAgIGZvciBwb3cyIGluICgzLCA3LCAxMCwgMTUpOgorICAgICAgICAgICAgICAgIG5zID0gMi4wICoqICgtcG93MikKKyAgICAgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisKKyAgICAgICAgIyBzZWNvbmRzIGNsb3NlIHRvIF9QeVRpbWVfdCB0eXBlIGxpbWl0CisgICAgICAgIG5zID0gKDIgKiogNjMgLy8gU0VDX1RPX05TKSAqIFNFQ19UT19OUworICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisKKyAgICAgICAgcmV0dXJuIG5zX3RpbWVzdGFtcHMKKworICAgIGRlZiBfY2hlY2tfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9mbG9hdCwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKworICAgICAgICBkZWYgY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcyk6CisgICAgICAgICAgICBpZiB1c2VfZmxvYXQ6CisgICAgICAgICAgICAgICAgdW5pdF90b19ucyA9IFNFQ19UT19OUyAvIGZsb2F0KHVuaXRfdG9fc2VjKQorICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtucyAvIHVuaXRfdG9fbnMgZm9yIG5zIGluIG5zX3RpbWVzdGFtcHNdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuaXRfdG9fbnMgPSBTRUNfVE9fTlMgLy8gdW5pdF90b19zZWMKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbbnMgLy8gdW5pdF90b19ucyBmb3IgbnMgaW4gbnNfdGltZXN0YW1wc10KKworICAgICAgICAgICAgaWYgdmFsdWVfZmlsdGVyOgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IGZpbHRlcih2YWx1ZV9maWx0ZXIsIHZhbHVlcykKKworICAgICAgICAgICAgIyByZW1vdmUgZHVwbGljYXRlcyBhbmQgc29ydAorICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChzZXQodmFsdWVzKSkKKworICAgICAgICAjIHRlc3Qgcm91bmRpbmcKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9IHNlbGYuX3JvdW5kaW5nX3ZhbHVlcyh1c2VfZmxvYXQpCisgICAgICAgIHZhbGlkX3ZhbHVlcyA9IGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpCisgICAgICAgIGZvciB0aW1lX3JuZCwgZGVjaW1hbF9ybmQgaW4gUk9VTkRJTkdfTU9ERVMgOgorICAgICAgICAgICAgY29udGV4dCA9IGRlY2ltYWwuZ2V0Y29udGV4dCgpCisgICAgICAgICAgICBjb250ZXh0LnJvdW5kaW5nID0gZGVjaW1hbF9ybmQKKworICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbGlkX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvID0geyd2YWx1ZSc6IHZhbHVlLCAncm91bmRpbmcnOiBkZWNpbWFsX3JuZH0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHB5dGltZV9jb252ZXJ0ZXIodmFsdWUsIHRpbWVfcm5kKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkX2Z1bmModmFsdWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3Igb24gdGltZXN0YW1wIGNvbnZlcnNpb246ICVzIiAlIGRlYnVnX2luZm8pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2luZm8pCisKKyAgICAgICAgIyB0ZXN0IG92ZXJmbG93CisgICAgICAgIG5zID0gc2VsZi5PVkVSRkxPV19TRUNPTkRTICogU0VDX1RPX05TCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSAoLW5zLCBucykKKyAgICAgICAgb3ZlcmZsb3dfdmFsdWVzID0gY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcykKKyAgICAgICAgZm9yIHRpbWVfcm5kLCBfIGluIFJPVU5ESU5HX01PREVTIDoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBvdmVyZmxvd192YWx1ZXM6CisgICAgICAgICAgICAgICAgZGVidWdfaW5mbyA9IHsndmFsdWUnOiB2YWx1ZSwgJ3JvdW5kaW5nJzogdGltZV9ybmR9CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtc2c9ZGVidWdfaW5mbyk6CisgICAgICAgICAgICAgICAgICAgIHB5dGltZV9jb252ZXJ0ZXIodmFsdWUsIHRpbWVfcm5kKQorCisgICAgZGVmIGNoZWNrX2ludF9yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90b19zZWM9MSwgdmFsdWVfZmlsdGVyPU5vbmUpOgorICAgICAgICBzZWxmLl9jaGVja19yb3VuZGluZyhweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcikKKworICAgIGRlZiBjaGVja19mbG9hdF9yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3RvX3NlYz0xLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3JvdW5kaW5nKHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXIpCisKKyAgICBkZWYgZGVjaW1hbF9yb3VuZChzZWxmLCB4KToKKyAgICAgICAgZCA9IGRlY2ltYWwuRGVjaW1hbCh4KQorICAgICAgICBkID0gZC5xdWFudGl6ZSgxKQorICAgICAgICByZXR1cm4gaW50KGQpCisKKworY2xhc3MgVGVzdENQeVRpbWUoQ1B5VGltZVRlc3RDYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgQyBfUHlUaW1lX3QgQVBJLgorICAgICIiIgorICAgICMgX1B5VGltZV90IGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IG1hdGguY2VpbCgoMioqNjMgKyAxKSAvIFNFQ19UT19OUykKKwogICAgIGRlZiB0ZXN0X0Zyb21TZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0Zyb21TZWNvbmRzCi0gICAgICAgIGZvciBzZWNvbmRzIGluICgwLCAzLCAtNDU2LCBfdGVzdGNhcGkuSU5UX01BWCwgX3Rlc3RjYXBpLklOVF9NSU4pOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc2Vjb25kcz1zZWNvbmRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kcyhzZWNvbmRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKiBTRUNfVE9fTlMpCisKKyAgICAgICAgIyBQeVRpbWVfRnJvbVNlY29uZHMoKSBleHBlY3RzIGEgQyBpbnQsIHJlamVjdCB2YWx1ZXMgb3V0IG9mIHJhbmdlCisgICAgICAgIGRlZiBjX2ludF9maWx0ZXIoc2Vjcyk6CisgICAgICAgICAgICByZXR1cm4gKF90ZXN0Y2FwaS5JTlRfTUlOIDw9IHNlY3MgPD0gX3Rlc3RjYXBpLklOVF9NQVgpCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIHNlY3MsIHJuZDogUHlUaW1lX0Zyb21TZWNvbmRzKHNlY3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcyAqIFNFQ19UT19OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPWNfaW50X2ZpbHRlcikKIAogICAgIGRlZiB0ZXN0X0Zyb21TZWNvbmRzT2JqZWN0KHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0CiAKLSAgICAgICAgIyBDb252ZXJzaW9uIGdpdmluZyB0aGUgc2FtZSByZXN1bHQgZm9yIGFsbCByb3VuZGluZyBtZXRob2RzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3Igb2JqLCB0cyBpbiAoCi0gICAgICAgICAgICAgICAgIyBpbnRlZ2VycwotICAgICAgICAgICAgICAgICgwLCAwKSwKLSAgICAgICAgICAgICAgICAoMSwgU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTMsIC0zICogU0VDX1RPX05TKSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoCisgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QsCisgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcyAqIFNFQ19UT19OUykKIAotICAgICAgICAgICAgICAgICMgZmxvYXQ6IHN1YnNlY29uZHMKLSAgICAgICAgICAgICAgICAoMC4wLCAwKSwKLSAgICAgICAgICAgICAgICAoMWUtOSwgMSksCi0gICAgICAgICAgICAgICAgKDFlLTYsIDEwICoqIDMpLAotICAgICAgICAgICAgICAgICgxZS0zLCAxMCAqKiA2KSwKLQotICAgICAgICAgICAgICAgICMgZmxvYXQ6IHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMi4wLCAyICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoMTIzLjAsIDEyMyAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC03LjAsIC03ICogU0VDX1RPX05TKSwKLQotICAgICAgICAgICAgICAgICMgbmFub3NlY29uZCBhcmUga2VwdCBmb3IgdmFsdWUgPD0gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjIyIC0gMWUtOSwgIDQxOTQzMDM5OTk5OTk5OTkpLAotICAgICAgICAgICAgICAgICgyKioyMiwgICAgICAgICA0MTk0MzA0MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjIgKyAxZS05LCAgNDE5NDMwNDAwMDAwMDAwMSksCi0gICAgICAgICAgICAgICAgKDIqKjIzIC0gMWUtOSwgIDgzODg2MDc5OTk5OTk5OTkpLAotICAgICAgICAgICAgICAgICgyKioyMywgICAgICAgICA4Mzg4NjA4MDAwMDAwMDAwKSwKLQotICAgICAgICAgICAgICAgICMgc3RhcnQgbG9zaW5nIHByZWNpc2lvbiBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjMgKyAxZS05LCAgODM4ODYwODAwMDAwMDAwMiksCi0KLSAgICAgICAgICAgICAgICAjIG5hbm9zZWNvbmRzIGFyZSBsb3N0IGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyNCAtIDFlLTksIDE2Nzc3MjE1OTk5OTk5OTk4KSwKLSAgICAgICAgICAgICAgICAoMioqMjQsICAgICAgICAxNjc3NzIxNjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI0ICsgMWUtOSwgMTY3NzcyMTYwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSAtIDFlLTksIDMzNTU0NDMyMDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgICAgICAgLCAzMzU1NDQzMjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1ICsgMWUtOSwgMzM1NTQ0MzIwMDAwMDAwMDApLAotCi0gICAgICAgICAgICAgICAgIyBjbG9zZSB0byAyXjYzIG5hbm9zZWNvbmRzIChfUHlUaW1lX3QgbGltaXQpCi0gICAgICAgICAgICAgICAgKDkyMjMzNzIwMzYsIDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICg5MjIzMzcyMDM2LjAsIDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtOTIyMzM3MjAzNiwgLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtOTIyMzM3MjAzNi4wLCAtOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXN0YW1wPXRzKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHNPYmplY3Qob2JqLCBybmQpLCB0cykKLQotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qocm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoOTIyMzM3MjAzNywgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoOTIyMzM3MjAzNy4wLCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCgtOTIyMzM3MjAzNywgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoLTkyMjMzNzIwMzcuMCwgcm5kKQotCi0gICAgICAgICMgQ29udmVyc2lvbiBnaXZpbmcgZGlmZmVyZW50IHJlc3VsdHMgZGVwZW5kaW5nIG9uIHRoZSByb3VuZGluZyBtZXRob2QKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG9iaiwgdHMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIGNsb3NlIHRvIHplcm8KLSAgICAgICAgICAgICggMWUtMTAsICAwLCBGTE9PUiksCi0gICAgICAgICAgICAoIDFlLTEwLCAgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTFlLTEwLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xZS0xMCwgIDAsIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIHRlc3Qgcm91bmRpbmcgb2YgdGhlIGxhc3QgbmFub3NlY29uZAotICAgICAgICAgICAgKCAxLjEyMzQ1Njc4OTksICAxMTIzNDU2Nzg5LCBGTE9PUiksCi0gICAgICAgICAgICAoIDEuMTIzNDU2Nzg5OSwgIDExMjM0NTY3OTAsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTksIC0xMTIzNDU2NzkwLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5OSwgLTExMjM0NTY3ODksIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIGNsb3NlIHRvIDEgc2Vjb25kCi0gICAgICAgICAgICAoIDAuOTk5OTk5OTk5OSwgICA5OTk5OTk5OTksIEZMT09SKSwKLSAgICAgICAgICAgICggMC45OTk5OTk5OTk5LCAgMTAwMDAwMDAwMCwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTAuOTk5OTk5OTk5OSwgLTEwMDAwMDAwMDAsIEZMT09SKSwKLSAgICAgICAgICAgICgtMC45OTk5OTk5OTk5LCAgLTk5OTk5OTk5OSwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzdGFtcD10cyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHNPYmplY3Qob2JqLCBybmQpLCB0cykKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZygKKyAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCwKKyAgICAgICAgICAgIGxhbWJkYSBuczogc2VsZi5kZWNpbWFsX3JvdW5kKG5zICogU0VDX1RPX05TKSkKIAogICAgIGRlZiB0ZXN0X0FzU2Vjb25kc0RvdWJsZShzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1NlY29uZHNEb3VibGUKIAotICAgICAgICBmb3IgbmFub3NlY29uZHMsIHNlY29uZHMgaW4gKAotICAgICAgICAgICAgIyBuZWFyIDEgbmFub3NlY29uZAotICAgICAgICAgICAgKCAwLCAgMC4wKSwKLSAgICAgICAgICAgICggMSwgIDFlLTkpLAotICAgICAgICAgICAgKC0xLCAtMWUtOSksCisgICAgICAgIGRlZiBmbG9hdF9jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgaWYgYWJzKG5zKSAlIFNFQ19UT19OUyA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChucyAvLyBTRUNfVE9fTlMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChucykgLyBTRUNfVE9fTlMKIAotICAgICAgICAgICAgIyBuZWFyIDEgc2Vjb25kCi0gICAgICAgICAgICAoU0VDX1RPX05TICsgMSwgMS4wICsgMWUtOSksCi0gICAgICAgICAgICAoU0VDX1RPX05TLCAgICAgMS4wKSwKLSAgICAgICAgICAgIChTRUNfVE9fTlMgLSAxLCAxLjAgLSAxZS05KSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIG5zLCBybmQ6IFB5VGltZV9Bc1NlY29uZHNEb3VibGUobnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICAgICAgIyBhIGZldyBzZWNvbmRzCi0gICAgICAgICAgICAoMTIzICogU0VDX1RPX05TLCAxMjMuMCksCi0gICAgICAgICAgICAoLTU2NyAqIFNFQ19UT19OUywgLTU2Ny4wKSwKKyAgICBkZWYgY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKHNlbGYsIGRlbm9taW5hdG9yKToKKyAgICAgICAgZGVub20gPSBkZWNpbWFsLkRlY2ltYWwoZGVub21pbmF0b3IpCiAKLSAgICAgICAgICAgICMgbmFub3NlY29uZCBhcmUga2VwdCBmb3IgdmFsdWUgPD0gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoNDE5NDMwMzk5OTk5OTk5OSwgMioqMjIgLSAxZS05KSwKLSAgICAgICAgICAgICg0MTk0MzA0MDAwMDAwMDAwLCAyKioyMiksCi0gICAgICAgICAgICAoNDE5NDMwNDAwMDAwMDAwMSwgMioqMjIgKyAxZS05KSwKKyAgICAgICAgZGVmIGNvbnZlcnRlcih2YWx1ZSk6CisgICAgICAgICAgICBkID0gZGVjaW1hbC5EZWNpbWFsKHZhbHVlKSAvIGRlbm9tCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWNpbWFsX3JvdW5kKGQpCiAKLSAgICAgICAgICAgICMgc3RhcnQgbG9zaW5nIHByZWNpc2lvbiBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICg4Mzg4NjA4MDAwMDAwMDAyLCAyKioyMyArIDFlLTkpLAorICAgICAgICByZXR1cm4gY29udmVydGVyCiAKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMgYXJlIGxvc3QgZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoMTY3NzcyMTU5OTk5OTk5OTgsIDIqKjI0IC0gMWUtOSksCi0gICAgICAgICAgICAoMTY3NzcyMTU5OTk5OTk5OTksIDIqKjI0IC0gMWUtOSksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDAsIDIqKjI0ICAgICAgICksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDEsIDIqKjI0ICAgICAgICksCi0gICAgICAgICAgICAoMTY3NzcyMTYwMDAwMDAwMDIsIDIqKjI0ICsgMmUtOSksCi0KLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwMCwgMioqMjUgICAgICAgKSwKLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwMiwgMioqMjUgICAgICAgKSwKLSAgICAgICAgICAgICgzMzU1NDQzMjAwMDAwMDAwNCwgMioqMjUgKyA0ZS05KSwKLQotICAgICAgICAgICAgIyBjbG9zZSB0byAyXjYzIG5hbm9zZWNvbmRzIChfUHlUaW1lX3QgbGltaXQpCi0gICAgICAgICAgICAoOTIyMzM3MjAzNiAqIFNFQ19UT19OUywgOTIyMzM3MjAzNi4wKSwKLSAgICAgICAgICAgICgtOTIyMzM3MjAzNiAqIFNFQ19UT19OUywgLTkyMjMzNzIwMzYuMCksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1uYW5vc2Vjb25kcywgc2Vjb25kcz1zZWNvbmRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1NlY29uZHNEb3VibGUobmFub3NlY29uZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcykKLQotICAgIGRlZiB0ZXN0X3RpbWV2YWwoc2VsZik6CisgICAgZGVmIHRlc3RfQXNUaW1ldmFsKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzVGltZXZhbAotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAoMCwgKDAsIDApKSwKLSAgICAgICAgICAgICAgICAoMTAwMCwgKDAsIDEpKSwKLSAgICAgICAgICAgICAgICAoLTEwMDAsICgtMSwgOTk5OTk5KSksCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgKDIsIDApKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsICgtMywgMCkpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1ldmFsKG5zLCBybmQpLCB0dikKKyAgICAgICAgdXNfY29udmVydGVyID0gc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoVVNfVE9fTlMpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCB0diwgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAoMCwgMCksIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAoMCwgMSksIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDk5OTk5OSksIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgKDAsIDApLCBDRUlMSU5HKSwKKyAgICAgICAgZGVmIHRpbWV2YWxfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIHVzID0gdXNfY29udmVydGVyKG5zKQorICAgICAgICAgICAgcmV0dXJuIGRpdm1vZCh1cywgU0VDX1RPX1VTKQogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQ1NjcwMDEsICgxLCAyMzQ1NjcpLCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNDU2NzAwMSwgKDEsIDIzNDU2OCksIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0NTY3MDAxLCAoLTIsIDc2NTQzMiksIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNDU2NzAwMSwgKC0yLCA3NjU0MzMpLCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXZhbChucywgcm5kKSwgdHYpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IExPTkdfTUlOLCBMT05HX01BWAorCisgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHRpbWV2YWwudHZfc2VjIHR5cGUgaXMgYSBDIGxvbmcKKyAgICAgICAgICAgIGRlZiBzZWNvbmRzX2ZpbHRlcihzZWNzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9OR19NSU4gPD0gc2VjcyA8PSBMT05HX01BWAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Vjb25kc19maWx0ZXIgPSBzZWxmLnRpbWVfdF9maWx0ZXIKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNUaW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFsX2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2Vjb25kc19maWx0ZXIpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKF90ZXN0Y2FwaSwgJ1B5VGltZV9Bc1RpbWVzcGVjJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZWQgX3Rlc3RjYXBpLlB5VGltZV9Bc1RpbWVzcGVjJykKLSAgICBkZWYgdGVzdF90aW1lc3BlYyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc1RpbWVzcGVjKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzVGltZXNwZWMKLSAgICAgICAgZm9yIG5zLCB0cyBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMCwgKDAsIDApKSwKLSAgICAgICAgICAgICgxLCAoMCwgMSkpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDk5OTk5OTk5OSkpLAogCi0gICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAoMiwgMCkpLAotICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAoLTMsIDApKSwKKyAgICAgICAgZGVmIHRpbWVzcGVjX2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICByZXR1cm4gZGl2bW9kKG5zLCBTRUNfVE9fTlMpCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNDU2Nzg5MCwgKDEsIDIzNDU2Nzg5MCkpLAotICAgICAgICAgICAgKC0xMjM0NTY3ODkwLCAoLTIsIDc2NTQzMjExMCkpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWVzcGVjPXRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWVzcGVjKG5zKSwgdHMpCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBucywgcm5kOiBQeVRpbWVfQXNUaW1lc3BlYyhucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzcGVjX2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQogCi0gICAgZGVmIHRlc3RfbWlsbGlzZWNvbmRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzTWlsbGlzZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzTWlsbGlzZWNvbmRzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pbGxpc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogTVNfVE9fTlMsIDEpLAotICAgICAgICAgICAgICAgICgtMiAqIE1TX1RPX05TLCAtMiksCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgMjAwMCksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAtMzAwMCksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pbGxpc2Vjb25kcyhucywgcm5kKSwgdHYpCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc01pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoTVNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCBtcywgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAwLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsIDAsIENFSUxJTkcpLAotCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQgKiBNU19UT19OUyArIDEsIDEyMzQsIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0ICogTVNfVE9fTlMgKyAxLCAxMjM1LCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNCAqIE1TX1RPX05TIC0gMSwgLTEyMzUsIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNCAqIE1TX1RPX05TIC0gMSwgLTEyMzQsIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIG1pbGxpc2Vjb25kcz1tcywgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pbGxpc2Vjb25kcyhucywgcm5kKSwgbXMpCi0KLSAgICBkZWYgdGVzdF9taWNyb3NlY29uZHMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNNaWNyb3NlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNNaWNyb3NlY29uZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBVU19UT19OUywgMSksCi0gICAgICAgICAgICAgICAgKC0yICogVVNfVE9fTlMsIC0yKSwKIAotICAgICAgICAgICAgICAgICMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBNU19UT19OUywgMTAwMCksCi0gICAgICAgICAgICAgICAgKC0yICogTVNfVE9fTlMsIC0yMDAwKSwKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzTWljcm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihVU19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAyMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsIC0zMDAwMDAwKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWljcm9zZWNvbmRzKG5zLCBybmQpLCB0dikKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIG1zLCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsIDAsIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgMCwgQ0VJTElORyksCitjbGFzcyBUZXN0T2xkUHlUaW1lKENQeVRpbWVUZXN0Q2FzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdGhlIG9sZCBDIF9QeVRpbWVfdCBBUEk6IF9QeVRpbWVfT2JqZWN0VG9YWFgoKSBmdW5jdGlvbnMuCisgICAgIiIiCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNCAqIFVTX1RPX05TICsgMSwgMTIzNCwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQgKiBVU19UT19OUyArIDEsIDEyMzUsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0ICogVVNfVE9fTlMgLSAxLCAtMTIzNSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0ICogVVNfVE9fTlMgLSAxLCAtMTIzNCwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgbWlsbGlzZWNvbmRzPW1zLCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWljcm9zZWNvbmRzKG5zLCBybmQpLCBtcykKKyAgICAjIHRpbWVfdCBpcyBhIDMyLWJpdCBvciA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gMiAqKiA2NAorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWVfdChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZV90CisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNpbWFsX3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICBkZWYgY3JlYXRlX2NvbnZlcnRlcihzZWxmLCBzZWNfdG9fdW5pdCk6CisgICAgICAgIGRlZiBjb252ZXJ0ZXIoc2Vjcyk6CisgICAgICAgICAgICBmbG9hdHBhcnQsIGludHBhcnQgPSBtYXRoLm1vZGYoc2VjcykKKyAgICAgICAgICAgIGludHBhcnQgPSBpbnQoaW50cGFydCkKKyAgICAgICAgICAgIGZsb2F0cGFydCAqPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgZmxvYXRwYXJ0ID0gc2VsZi5kZWNpbWFsX3JvdW5kKGZsb2F0cGFydCkKKyAgICAgICAgICAgIGlmIGZsb2F0cGFydCA8IDA6CisgICAgICAgICAgICAgICAgZmxvYXRwYXJ0ICs9IHNlY190b191bml0CisgICAgICAgICAgICAgICAgaW50cGFydCAtPSAxCisgICAgICAgICAgICBlbGlmIGZsb2F0cGFydCA+PSBzZWNfdG9fdW5pdDoKKyAgICAgICAgICAgICAgICBmbG9hdHBhcnQgLT0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgICAgICBpbnRwYXJ0ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoaW50cGFydCwgZmxvYXRwYXJ0KQorICAgICAgICByZXR1cm4gY29udmVydGVyCisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZXZhbChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXZhbAorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IChzZWNzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9jb252ZXJ0ZXIoU0VDX1RPX1VTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWVzcGVjKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lc3BlYworCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiAoc2VjcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2NvbnZlcnRlcihTRUNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CmluZGV4IDNiMTdjYTYuLjkwNDM4ZTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQpAQCAtMjQsOCArMjQsNyBAQAogICAgICAgICAgICAgaWYgdHlwZSA9PSBFTkRNQVJLRVI6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIHR5cGUgPSB0b2tfbmFtZVt0eXBlXQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICUodHlwZSktMTAuMTBzICUodG9rZW4pLTEzLjEzciAlKHN0YXJ0KXMgJShlbmQpcyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMoKSkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZiIgICAge3R5cGU6MTB9IHt0b2tlbiFyOjEzfSB7c3RhcnR9IHtlbmR9IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyIgICAgRU5DT0RJTkcgICAndXRmLTgnICAgICAgICgwLCAwKSAoMCwgMCkiXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucnN0cmlwKCkuc3BsaXRsaW5lcygpKQpAQCAtMTMyLDE4ICsxMzEsMTggQEAKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IDB4ZmZmZmZmZmZmZmYiLCAiIiJcCiAgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKICAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQotICAgIE5VTUJFUiAgICAgJzB4ZmZmZmZmZmZmZiAoMSwgNCkgKDEsIDE3KQorICAgIE5VTUJFUiAgICAgJzB4ZmZmZmZmZmZmZmYnICgxLCA0KSAoMSwgMTcpCiAgICAgIiIiKQogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJ4ID0gMTIzMTQxMjQyMTUxMjUxNjE2MTEwIiwgIiIiXAogICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKLSAgICBOVU1CRVIgICAgICcxMjMxNDEyNDIxNTEgKDEsIDQpICgxLCAyNSkKKyAgICBOVU1CRVIgICAgICcxMjMxNDEyNDIxNTEyNTE2MTYxMTAnICgxLCA0KSAoMSwgMjUpCiAgICAgIiIiKQogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJ4ID0gLTE1OTIxNTkwMjE1MDEyNTkxIiwgIiIiXAogICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKICAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDQpICgxLCA1KQotICAgIE5VTUJFUiAgICAgJzE1OTIxNTkwMjE1MCAoMSwgNSkgKDEsIDIyKQorICAgIE5VTUJFUiAgICAgJzE1OTIxNTkwMjE1MDEyNTkxJyAoMSwgNSkgKDEsIDIyKQogICAgICIiIikKIAogICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgpAQCAtMzA3LDYgKzMwNiw1MCBAQAogICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjgpICgxLCAyOSkKICAgICBTVFJJTkcgICAgICdSQiJhYmMiJyAgICAgKDEsIDMwKSAoMSwgMzcpCiAgICAgIiIiKQorICAgICAgICAjIENoZWNrIDAsIDEsIGFuZCAyIGNoYXJhY3RlciBzdHJpbmcgcHJlZml4ZXMuCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUociciYVwKK2RlXAorZmciJywgIiIiXAorICAgIFNUUklORyAgICAgJyJhXFxcXFxcbmRlXFxcXFxcbmZnIlwnICgxLCAwKSAoMywgMykKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocid1ImFcCitkZSInLCAiIiJcCisgICAgU1RSSU5HICAgICAndSJhXFxcXFxcbmRlIlwnICAoMSwgMCkgKDIsIDMpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIncmIiYVwKK2QiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3JiImFcXFxcXFxuZCJcJyAgKDEsIDApICgyLCAyKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJyIiImFcCitiIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ1wiXCIiYVxcXFxcXG5iXCJcIiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocid1IiIiYVwKK2IiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAndVwiXCIiYVxcXFxcXG5iXCJcIiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidyYiIiImFcCitiXAorYyIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdyYiJcIiJhXFxcXFxcbmJcXFxcXFxuYyJcIiInICgxLCAwKSAoMywgNCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2YiYWJjIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmImFiYyInICAgICAgKDEsIDApICgxLCA2KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZlIiYXtifWMiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2ZSImF7Yn1jIicgICAoMSwgMCkgKDEsIDkpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmIiIiYWJjIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2ZcIlwiXCJhYmNcIlwiXCInICAoMSwgMCkgKDEsIDEwKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ2YiYWJjXAorZGVmIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmImFiY1xcXFxcXG5kZWYiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInUmYiYWJjXAorZGVmIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdSZiJhYmNcXFxcXFxuZGVmIicgKDEsIDApICgyLCA0KQorICAgICIiIikKIAogICAgIGRlZiB0ZXN0X2Z1bmN0aW9uKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJkZWYgZDIyKGEsIGIsIGM9MiwgZD0yLCAqayk6IHBhc3MiLCAiIiJcCkBAIC01MDUsNyArNTQ4LDcgQEAKICAgICAgICAgIyBNZXRob2RzCiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoIkBzdGF0aWNtZXRob2RcbmRlZiBmb28oeCx5KTogcGFzcyIsICIiIlwKICAgICBPUCAgICAgICAgICdAJyAgICAgICAgICAgKDEsIDApICgxLCAxKQotICAgIE5BTUUgICAgICAgJ3N0YXRpY21ldGhvZCAoMSwgMSkgKDEsIDEzKQorICAgIE5BTUUgICAgICAgJ3N0YXRpY21ldGhvZCcgKDEsIDEpICgxLCAxMykKICAgICBORVdMSU5FICAgICdcXG4nICAgICAgICAgICgxLCAxMykgKDEsIDE0KQogICAgIE5BTUUgICAgICAgJ2RlZicgICAgICAgICAoMiwgMCkgKDIsIDMpCiAgICAgTkFNRSAgICAgICAnZm9vJyAgICAgICAgICgyLCA0KSAoMiwgNykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKaW5kZXggOTc2YTZjNS4uNGI0NzkxNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKQEAgLTEzNCw2ICsxMzQsMTUgQEAKIGNsYXNzIFVucGFyc2VUZXN0Q2FzZShBU1RUZXN0Q2FzZSk6CiAgICAgIyBUZXN0cyBmb3Igc3BlY2lmaWMgYnVncyBmb3VuZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHVucGFyc2UKIAorICAgIGRlZiB0ZXN0X2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTE4MAorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7MH0iKjN9JyIiIikKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2Yie3l9IiozfSciIiIpCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHIiIiJmJ3tmIntcJ3hcJ30iKjN9JyIiIikKKworICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyJycnZiJ7cid4JyBmJ3tcInNcIn0nfSInJycpCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHInJydmIntyJ3gncmYne1wic1wifSd9IicnJykKKwogICAgIGRlZiB0ZXN0X2RlbF9zdGF0ZW1lbnQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKCJkZWwgeCwgeSwgeiIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CmluZGV4IDA1NTJmOTAuLmZjZjUwODIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtNTU0LDI5ICs1NTQsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKIAotICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgaXMgcmV0dXJuZWQgYXMgTm9uZQorICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgcmFpc2VzIFZhbHVlRXJyb3IKICAgICAgICAgdXJsID0gYiJIVFRQOi8vV1dXLlBZVEhPTi5PUkc6NjU1MzYvZG9jLyNmcmFnIgogICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAib3V0IG9mIHJhbmdlIik6CisgICAgICAgICAgICBwLnBvcnQKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6Ci0gICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgICMgT25jZSBhZ2FpbiwgcmVwZWF0IG91cnNlbHZlcyB0byB0ZXN0IGJ5dGVzCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBpbnZhbGlkIHBvcnRzLiIiIgorICAgICAgICBmb3IgYnl0ZXMgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZvciBwYXJzZSBpbiAodXJsbGliLnBhcnNlLnVybHNwbGl0LCB1cmxsaWIucGFyc2UudXJscGFyc2UpOgorICAgICAgICAgICAgICAgIGZvciBwb3J0IGluICgiZm9vIiwgIjEuNSIsICItMSIsICIweDEwIik6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGJ5dGVzPWJ5dGVzLCBwYXJzZT1wYXJzZSwgcG9ydD1wb3J0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9ICJ3d3cuZXhhbXBsZS5uZXQ6IiArIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICJodHRwOi8vIiArIG5ldGxvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwYXJzZSh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCBuZXRsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc193aXRob3V0X25ldGxvYyhzZWxmKToKICAgICAgICAgIyBUaGlzIGV4YW1wbGUgaXMgc3RyYWlnaHQgZnJvbSBSRkMgMzI2MS4gIEl0IGxvb2tzIGxpa2UgaXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CmluZGV4IDgzNTdmOGIuLmY0NDQ1NmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KG9uZT0xLCB0d289MiksIGQyKQogICAgICAgICAjIGl0ZW0gc2VxdWVuY2UgY29uc3RydWN0b3IKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9Wygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQogICAgICAgICAjIGJvdGggdG9nZXRoZXIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildLCB0d289MywgdGhyZWU9NSksIGQzKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWygnZGljdCcsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb2xsZWN0aW9ucy5Vc2VyRGljdCh7fSwgZGljdD1Ob25lKS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgTm9uZSldKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9eydhJzogNDJ9KS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29sbGVjdGlvbnMuVXNlckRpY3QsIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9kYXRhL2ltcG9ydF93YXJuaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9kYXRhL2ltcG9ydF93YXJuaW5nLnB5CmluZGV4IGQ2ZWEyY2UuLjMyZGFlYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvZGF0YS9pbXBvcnRfd2FybmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL2RhdGEvaW1wb3J0X3dhcm5pbmcucHkKQEAgLTEsMyArMSwzIEBACiBpbXBvcnQgd2FybmluZ3MKIAotd2FybmluZ3Mud2FybignbW9kdWxlLWxldmVsIHdhcm5pbmcnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit3YXJuaW5ncy53YXJuKCdtb2R1bGUtbGV2ZWwgd2FybmluZycsIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5IGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CmluZGV4IDNlZmY3NzMuLmE2N2E4YjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTEsNiArMSw3IEBACiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCiBpbXBvcnQgc3lzCiBpbXBvcnQgd2F2ZQpAQCAtMTAzLDUgKzEwNCwxMSBAQAogICAgICAgICBmcmFtZXMgPSBieXRlc3dhcChmcmFtZXMsIDQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnV0FWRV9GT1JNQVRfUENNJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgd2F2ZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCAzNTg0ODRkLi4zOWU2MDhiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtMTgyLDEwICsxODIsMTIgQEAKIAogICAgICAgICBkZWYgY2hlY2tfZWxlbWVudChlbGVtZW50KToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShFVC5pc2VsZW1lbnQoZWxlbWVudCksIG1zZz0ibm90IGFuIGVsZW1lbnQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZWxlbWVudCwgInRhZyIpLCBtc2c9Im5vIHRhZyBtZW1iZXIiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpLCBtc2c9Im5vIGF0dHJpYiBtZW1iZXIiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZWxlbWVudCwgInRleHQiKSwgbXNnPSJubyB0ZXh0IG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGFpbCIpLCBtc2c9Im5vIHRhaWwgbWVtYmVyIikKKyAgICAgICAgICAgIGRpcmVsZW0gPSBkaXIoZWxlbWVudCkKKyAgICAgICAgICAgIGZvciBhdHRyIGluICd0YWcnLCAnYXR0cmliJywgJ3RleHQnLCAndGFpbCc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZWxlbWVudCwgYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J25vICVzIG1lbWJlcicgJSBhdHRyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYXR0ciwgZGlyZWxlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nbm8gJXMgdmlzaWJsZSBieSBkaXInICUgYXR0cikKIAogICAgICAgICAgICAgY2hlY2tfc3RyaW5nKGVsZW1lbnQudGFnKQogICAgICAgICAgICAgY2hlY2tfbWFwcGluZyhlbGVtZW50LmF0dHJpYikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKaW5kZXggYTk3YTc3OC4uNGYxOTUzNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKQEAgLTIxNCw3ICsyMTQsOCBAQAogICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKICAgICAgICAgZmlsZXMgPSB7cGFja2RpciArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCiAgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKLSAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgICJzcGFtIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KIAogICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQogICAgICAgICB0cnk6CkBAIC0yMjgsNiArMjI5LDE0IEBACiAgICAgICAgICAgICB6aSA9IHppcGltcG9ydC56aXBpbXBvcnRlcihURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuYXJjaGl2ZSwgVEVNUF9aSVApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UoVEVTVFBBQ0spLCBUcnVlKQorCisgICAgICAgICAgICBmaW5kX21vZCA9IHppLmZpbmRfbW9kdWxlKCdzcGFtJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbmRfbW9kLmlzX3BhY2thZ2UoJ3NwYW0nKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2QubG9hZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX21vZC5nZXRfZmlsZW5hbWUoJ3NwYW0nKSwgbG9hZF9tb2QuX19maWxlX18pCisKICAgICAgICAgICAgIG1vZCA9IHppLmxvYWRfbW9kdWxlKFRFU1RQQUNLKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUoVEVTVFBBQ0spLCBtb2QuX19maWxlX18pCiAKQEAgLTI4Nyw2ICsyOTYsMTYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgemkuaXNfcGFja2FnZShURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9EKSwgRmFsc2UpCiAKKyAgICAgICAgICAgIHBrZ19wYXRoID0gVEVNUF9aSVAgKyBvcy5zZXAgKyBwYWNrZGlyICsgVEVTVFBBQ0syCisgICAgICAgICAgICB6aTIgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGtnX3BhdGgpCisgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQgPSB6aTIuZmluZF9tb2R1bGUoVEVTVE1PRCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kX2RvdHRlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaW5kX21vZF9kb3R0ZWQsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemkyLmlzX3BhY2thZ2UoVEVTVE1PRCkpCisgICAgICAgICAgICBsb2FkX21vZCA9IGZpbmRfbW9kX2RvdHRlZC5sb2FkX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQuZ2V0X2ZpbGVuYW1lKFRFU1RNT0QpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kX3BhdGggPSBURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9ECiAgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZHVsZV9wYXRoX3RvX2RvdHRlZF9uYW1lKG1vZF9wYXRoKQogICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90aHJlYWRpbmcucHkgYi9MaWIvdGhyZWFkaW5nLnB5CmluZGV4IDgyODAxOWQuLjJiZjMzYzEgMTAwNjQ0Ci0tLSBhL0xpYi90aHJlYWRpbmcucHkKKysrIGIvTGliL3RocmVhZGluZy5weQpAQCAtMjIsOSArMjIsMTEgQEAKICMgd2l0aCB0aGUgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSwgd2hpY2ggZG9lc24ndCBwcm92aWRlIHRoZSBvbGQKICMgSmF2YSBpbnNwaXJlZCBuYW1lcy4KIAotX19hbGxfXyA9IFsnYWN0aXZlX2NvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50X3RocmVhZCcsICdlbnVtZXJhdGUnLCAnRXZlbnQnLAotICAgICAgICAgICAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdUaHJlYWQnLCAnQmFycmllcicsCi0gICAgICAgICAgICdUaW1lcicsICdUaHJlYWRFcnJvcicsICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJywgJ3N0YWNrX3NpemUnXQorX19hbGxfXyA9IFsnZ2V0X2lkZW50JywgJ2FjdGl2ZV9jb3VudCcsICdDb25kaXRpb24nLCAnY3VycmVudF90aHJlYWQnLAorICAgICAgICAgICAnZW51bWVyYXRlJywgJ21haW5fdGhyZWFkJywgJ1RJTUVPVVRfTUFYJywKKyAgICAgICAgICAgJ0V2ZW50JywgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnVGhyZWFkJywKKyAgICAgICAgICAgJ0JhcnJpZXInLCAnQnJva2VuQmFycmllckVycm9yJywgJ1RpbWVyJywgJ1RocmVhZEVycm9yJywKKyAgICAgICAgICAgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCiAKICMgUmVuYW1lIHNvbWUgc3R1ZmYgc28gImZyb20gdGhyZWFkaW5nIGltcG9ydCAqIiBpcyBzYWZlCiBfc3RhcnRfbmV3X3RocmVhZCA9IF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZApkaWZmIC0tZ2l0IGEvTGliL3RpbWVpdC5weSBiL0xpYi90aW1laXQucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyZGU4OGY3Li45OGNiM2ViCi0tLSBhL0xpYi90aW1laXQucHkKKysrIGIvTGliL3RpbWVpdC5weQpAQCAtMzE3LDIwICszMTcsMjYgQEAKICAgICBwcmludCgiJWQgbG9vcHMsIiAlIG51bWJlciwgZW5kPScgJykKICAgICB1c2VjID0gYmVzdCAqIDFlNiAvIG51bWJlcgogICAgIGlmIHRpbWVfdW5pdCBpcyBub3QgTm9uZToKLSAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgJXMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlYy91bml0c1t0aW1lX3VuaXRdLCB0aW1lX3VuaXQpKQorICAgICAgICBzY2FsZSA9IHVuaXRzW3RpbWVfdW5pdF0KICAgICBlbHNlOgotICAgICAgICBpZiB1c2VjIDwgMTAwMDoKLSAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIHVzZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLCB1c2VjKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG1zZWMgPSB1c2VjIC8gMTAwMAotICAgICAgICAgICAgaWYgbXNlYyA8IDEwMDA6Ci0gICAgICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgbXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiwgbXNlYykpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlYyA9IG1zZWMgLyAxMDAwCi0gICAgICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgc2VjIHBlciBsb29wIiAlIChyZXBlYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sIHNlYykpCisgICAgICAgIHNjYWxlcyA9IFsoc2NhbGUsIHVuaXQpIGZvciB1bml0LCBzY2FsZSBpbiB1bml0cy5pdGVtcygpXQorICAgICAgICBzY2FsZXMuc29ydChyZXZlcnNlPVRydWUpCisgICAgICAgIGZvciBzY2FsZSwgdGltZV91bml0IGluIHNjYWxlczoKKyAgICAgICAgICAgIGlmIHVzZWMgPj0gc2NhbGU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyAlcyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWMvc2NhbGUsIHRpbWVfdW5pdCkpCisgICAgYmVzdCA9IG1pbihyKQorICAgIHVzZWMgPSBiZXN0ICogMWU2IC8gbnVtYmVyCisgICAgd29yc3QgPSBtYXgocikKKyAgICBpZiB3b3JzdCA+PSBiZXN0ICogNDoKKyAgICAgICAgdXNlYyA9IHdvcnN0ICogMWU2IC8gbnVtYmVyCisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuX2V4cGxpY2l0KAorICAgICAgICAgICAgIlRoZSB0ZXN0IHJlc3VsdHMgYXJlIGxpa2VseSB1bnJlbGlhYmxlLiBUaGUgd29yc3RcbiIKKyAgICAgICAgICAgICJ0aW1lICglLipnICVzKSB3YXMgbW9yZSB0aGFuIGZvdXIgdGltZXMgc2xvd2VyIHRoYW4gdGhlIGJlc3QgdGltZS4iICUKKyAgICAgICAgICAgIChwcmVjaXNpb24sIHVzZWMvc2NhbGUsIHRpbWVfdW5pdCksCisgICAgICAgICAgICAgVXNlcldhcm5pbmcsICcnLCAwKQogICAgIHJldHVybiBOb25lCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci9fX2luaXRfXy5weSBiL0xpYi90a2ludGVyL19faW5pdF9fLnB5CmluZGV4IDEyMDg1YTkuLjQ2Zjg2ZjkgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL19faW5pdF9fLnB5CisrKyBiL0xpYi90a2ludGVyL19faW5pdF9fLnB5CkBAIC04NDUsOCArODQ1LDcgQEAKICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaGVpZ2h0Jywgc2VsZi5fdykpCiAgICAgZGVmIHdpbmZvX2lkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gaWRlbnRpZmllciBJRCBmb3IgdGhpcyB3aWRnZXQuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmdldGludCgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSkKKyAgICAgICAgcmV0dXJuIGludChzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2lkJywgc2VsZi5fdyksIDApCiAgICAgZGVmIHdpbmZvX2ludGVycHMoc2VsZiwgZGlzcGxheW9mPTApOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgYWxsIFRjbCBpbnRlcnByZXRlcnMgZm9yIHRoaXMgZGlzcGxheS4iIiIKICAgICAgICAgYXJncyA9ICgnd2luZm8nLCAnaW50ZXJwcycpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCA3MTcxNjY3Li41YTAxYTVhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CkBAIC05MSw5ICs5MSwxMCBAQAogICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wyd1c2UnXSwgJycpCiAgICAgICAgIHBhcmVudCA9IHNlbGYuY3JlYXRlKGNvbnRhaW5lcj1UcnVlKQotICAgICAgICB3aWQgPSBwYXJlbnQud2luZm9faWQoKQotICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQod2lkZ2V0MlsndXNlJ10pLCB3aWQpCisgICAgICAgIHdpZCA9IGhleChwYXJlbnQud2luZm9faWQoKSkKKyAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qod2lkPXdpZCk6CisgICAgICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0MlsndXNlJ10sIHdpZCkKIAogCiBAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90dGsucHkgYi9MaWIvdGtpbnRlci90dGsucHkKaW5kZXggMjQ0ZmIzZC4uYjcyYzA5MCAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdHRrLnB5CisrKyBiL0xpYi90a2ludGVyL3R0ay5weQpAQCAtMzgxLDcgKzM4MSw5IEBACiAgICAgICAgIGEgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbi4iIiIKICAgICAgICAgaWYgcXVlcnlfb3B0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAga3dbcXVlcnlfb3B0XSA9IE5vbmUKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorICAgICAgICByZXN1bHQgPSBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX25hbWUsICJjb25maWd1cmUiLCBzdHlsZSkKKyAgICAgICAgaWYgcmVzdWx0IG9yIHF1ZXJ5X29wdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKIAogCiAgICAgZGVmIG1hcChzZWxmLCBzdHlsZSwgcXVlcnlfb3B0PU5vbmUsICoqa3cpOgpAQCAtNDY2LDEyICs0NjgsMTQgQEAKIAogICAgIGRlZiBlbGVtZW50X25hbWVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgdGhlbWUuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG4ubHN0cmlwKCctJykgZm9yIG4gaW4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkpCiAKIAogICAgIGRlZiBlbGVtZW50X29wdGlvbnMoc2VsZiwgZWxlbWVudG5hbWUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgZWxlbWVudG5hbWUncyBvcHRpb25zLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpCisgICAgICAgIHJldHVybiB0dXBsZShvLmxzdHJpcCgnLScpIGZvciBvIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpKQogCiAKICAgICBkZWYgdGhlbWVfY3JlYXRlKHNlbGYsIHRoZW1lbmFtZSwgcGFyZW50PU5vbmUsIHNldHRpbmdzPU5vbmUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rva2VuaXplLnB5IGIvTGliL3Rva2VuaXplLnB5CmluZGV4IDlmZDY3NmMuLjdhMDAzNTggMTAwNjQ0Ci0tLSBhL0xpYi90b2tlbml6ZS5weQorKysgYi9MaWIvdG9rZW5pemUucHkKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSBpbyBpbXBvcnQgVGV4dElPV3JhcHBlcgogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCitpbXBvcnQgaXRlcnRvb2xzIGFzIF9pdGVydG9vbHMKIGltcG9ydCByZQogaW1wb3J0IHN5cwogZnJvbSB0b2tlbiBpbXBvcnQgKgpAQCAtMTMxLDcgKzEzMiwyOCBAQAogSW1hZ251bWJlciA9IGdyb3VwKHInWzAtOV0rW2pKXScsIEZsb2F0bnVtYmVyICsgcidbakpdJykKIE51bWJlciA9IGdyb3VwKEltYWdudW1iZXIsIEZsb2F0bnVtYmVyLCBJbnRudW1iZXIpCiAKLVN0cmluZ1ByZWZpeCA9IHInKD86W2JCXVtyUl0/fFtyUl1bYkJdP3xbdVVdKT8nCisjIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nLCBwbHVzIGFsbCBvZiB0aGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLgorZGVmIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgIyBUaGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLiBPbmx5IGNvbnRhaW4gdGhlIGxvd2VyIGNhc2UgdmVyc2lvbnMsCisgICAgIyAgYW5kIGRvbid0IGNvbnRhaW4gYW55IHBlcm11YXRpb25zIChpbmNsdWRlICdmcicsIGJ1dCBub3QKKyAgICAjICAncmYnKS4gVGhlIHZhcmlvdXMgcGVybXV0YXRpb25zIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgIF92YWxpZF9zdHJpbmdfcHJlZml4ZXMgPSBbJ2InLCAncicsICd1JywgJ2YnLCAnYnInLCAnZnInXQorICAgICMgaWYgd2UgYWRkIGJpbmFyeSBmLXN0cmluZ3MsIGFkZDogWydmYicsICdmYnInXQorICAgIHJlc3VsdCA9IHNldChbJyddKQorICAgIGZvciBwcmVmaXggaW4gX3ZhbGlkX3N0cmluZ19wcmVmaXhlczoKKyAgICAgICAgZm9yIHQgaW4gX2l0ZXJ0b29scy5wZXJtdXRhdGlvbnMocHJlZml4KToKKyAgICAgICAgICAgICMgY3JlYXRlIGEgbGlzdCB3aXRoIHVwcGVyIGFuZCBsb3dlciB2ZXJzaW9ucyBvZiBlYWNoCisgICAgICAgICAgICAjICBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGZvciB1IGluIF9pdGVydG9vbHMucHJvZHVjdCgqWyhjLCBjLnVwcGVyKCkpIGZvciBjIGluIHRdKToKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCcnLmpvaW4odSkpCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgX2NvbXBpbGUoZXhwcik6CisgICAgcmV0dXJuIHJlLmNvbXBpbGUoZXhwciwgcmUuVU5JQ09ERSkKKworIyBOb3RlIHRoYXQgc2luY2UgX2FsbF9zdHJpbmdfcHJlZml4ZXMgaW5jbHVkZXMgdGhlIGVtcHR5IHN0cmluZywKKyMgIFN0cmluZ1ByZWZpeCBjYW4gYmUgdGhlIGVtcHR5IHN0cmluZyAobWFraW5nIGl0IG9wdGlvbmFsKS4KK1N0cmluZ1ByZWZpeCA9IGdyb3VwKCpfYWxsX3N0cmluZ19wcmVmaXhlcygpKQogCiAjIFRhaWwgZW5kIG9mICcgc3RyaW5nLgogU2luZ2xlID0gciJbXidcXF0qKD86XFwuW14nXFxdKikqJyIKQEAgLTE2OSw1MCArMTkxLDI1IEBACiBQc2V1ZG9FeHRyYXMgPSBncm91cChyJ1xcXHI/XG58XFonLCBDb21tZW50LCBUcmlwbGUpCiBQc2V1ZG9Ub2tlbiA9IFdoaXRlc3BhY2UgKyBncm91cChQc2V1ZG9FeHRyYXMsIE51bWJlciwgRnVubnksIENvbnRTdHIsIE5hbWUpCiAKLWRlZiBfY29tcGlsZShleHByKToKLSAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorIyBGb3IgYSBnaXZlbiBzdHJpbmcgcHJlZml4IHBsdXMgcXVvdGVzLCBlbmRwYXRzIG1hcHMgaXQgdG8gYSByZWdleAorIyAgdG8gbWF0Y2ggdGhlIHJlbWFpbmRlciBvZiB0aGF0IHN0cmluZy4gX3ByZWZpeCBjYW4gYmUgZW1wdHksIGZvcgorIyAgYSBub3JtYWwgc2luZ2xlIG9yIHRyaXBsZSBxdW90ZWQgc3RyaW5nICh3aXRoIG5vIHByZWZpeCkuCitlbmRwYXRzID0ge30KK2ZvciBfcHJlZml4IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZW5kcGF0c1tfcHJlZml4ICsgIiciXSA9IFNpbmdsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICciJ10gPSBEb3VibGUKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJycnIl0gPSBTaW5nbGUzCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyIiIiddID0gRG91YmxlMwogCi1lbmRwYXRzID0geyInIjogU2luZ2xlLCAnIic6IERvdWJsZSwKLSAgICAgICAgICAgIicnJyI6IFNpbmdsZTMsICciIiInOiBEb3VibGUzLAotICAgICAgICAgICAicicnJyI6IFNpbmdsZTMsICdyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImInJyciOiBTaW5nbGUzLCAnYiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJSJycnIjogU2luZ2xlMywgJ1IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQicnJyI6IFNpbmdsZTMsICdCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJyJycnIjogU2luZ2xlMywgJ2JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJSJycnIjogU2luZ2xlMywgJ2JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJyJycnIjogU2luZ2xlMywgJ0JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJSJycnIjogU2luZ2xlMywgJ0JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJiJycnIjogU2luZ2xlMywgJ3JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJiJycnIjogU2luZ2xlMywgJ1JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJCJycnIjogU2luZ2xlMywgJ3JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJCJycnIjogU2luZ2xlMywgJ1JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInUnJyciOiBTaW5nbGUzLCAndSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJVJycnIjogU2luZ2xlMywgJ1UiIiInOiBEb3VibGUzLAotICAgICAgICAgICAncic6IE5vbmUsICdSJzogTm9uZSwgJ2InOiBOb25lLCAnQic6IE5vbmUsCi0gICAgICAgICAgICd1JzogTm9uZSwgJ1UnOiBOb25lfQotCi10cmlwbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJycnIiwgJyIiIicsCi0gICAgICAgICAgInInJyciLCAnciIiIicsICJSJycnIiwgJ1IiIiInLAotICAgICAgICAgICJiJycnIiwgJ2IiIiInLCAiQicnJyIsICdCIiIiJywKLSAgICAgICAgICAiYnInJyciLCAnYnIiIiInLCAiQnInJyciLCAnQnIiIiInLAotICAgICAgICAgICJiUicnJyIsICdiUiIiIicsICJCUicnJyIsICdCUiIiIicsCi0gICAgICAgICAgInJiJycnIiwgJ3JiIiIiJywgInJCJycnIiwgJ3JCIiIiJywKLSAgICAgICAgICAiUmInJyciLCAnUmIiIiInLCAiUkInJyciLCAnUkIiIiInLAotICAgICAgICAgICJ1JycnIiwgJ3UiIiInLCAiVScnJyIsICdVIiIiJywKLSAgICAgICAgICApOgotICAgIHRyaXBsZV9xdW90ZWRbdF0gPSB0Ci1zaW5nbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJyIsICciJywKLSAgICAgICAgICAiciciLCAnciInLCAiUiciLCAnUiInLAotICAgICAgICAgICJiJyIsICdiIicsICJCJyIsICdCIicsCi0gICAgICAgICAgImJyJyIsICdiciInLCAiQnInIiwgJ0JyIicsCi0gICAgICAgICAgImJSJyIsICdiUiInLCAiQlInIiwgJ0JSIicgLAotICAgICAgICAgICJyYiciLCAncmIiJywgInJCJyIsICdyQiInLAotICAgICAgICAgICJSYiciLCAnUmIiJywgIlJCJyIsICdSQiInICwKLSAgICAgICAgICAidSciLCAndSInLCAiVSciLCAnVSInLAotICAgICAgICAgICk6Ci0gICAgc2luZ2xlX3F1b3RlZFt0XSA9IHQKKyMgQSBzZXQgb2YgYWxsIG9mIHRoZSBzaW5nbGUgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5nIHByZWZpeGVzLAorIyAgaW5jbHVkaW5nIHRoZSBvcGVuaW5nIHF1b3Rlcy4KK3NpbmdsZV9xdW90ZWQgPSBzZXQoKQordHJpcGxlX3F1b3RlZCA9IHNldCgpCitmb3IgdCBpbiBfYWxsX3N0cmluZ19wcmVmaXhlcygpOgorICAgIGZvciB1IGluICh0ICsgJyInLCB0ICsgIiciKToKKyAgICAgICAgc2luZ2xlX3F1b3RlZC5hZGQodSkKKyAgICBmb3IgdSBpbiAodCArICciIiInLCB0ICsgIicnJyIpOgorICAgICAgICB0cmlwbGVfcXVvdGVkLmFkZCh1KQogCiB0YWJzaXplID0gOAogCkBAIC02MjYsNiArNjIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YXNoZWQKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoZWQgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhDT01NRU5ULCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gaW4gdHJpcGxlX3F1b3RlZDoKICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSwgcG9zKQpAQCAtNjM4LDE5ICs2MzYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBsaW5lW3N0YXJ0Ol0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvciBcCi0gICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQ6CisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHVwIHRvIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZSB0b2tlbiB0byBzZWUgaWYKKyAgICAgICAgICAgICAgICAjICB0aGV5J3JlIGluIHRoZSBzaW5nbGVfcXVvdGVkIHNldC4gSWYgc28sIHRoZXkgc3RhcnQKKyAgICAgICAgICAgICAgICAjICBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAjIFdlJ3JlIHVzaW5nIHRoZSBmaXJzdCAzLCBiZWNhdXNlIHdlJ3JlIGxvb2tpbmcgZm9yCisgICAgICAgICAgICAgICAgIyAgInJiJyIgKGZvciBleGFtcGxlKSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRva2VuLiBJZgorICAgICAgICAgICAgICAgICMgIHdlIHN3aXRjaCB0byBsb25nZXIgcHJlZml4ZXMsIHRoaXMgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgICAgICAjICBhZGp1c3RlZC4KKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCBpbml0aWFsID09IHRva2VuWzoxXS4KKyAgICAgICAgICAgICAgICAjIEFsc28gbm90ZSB0aGF0IHNpbmdsZSBxdW90ZSBjaGVja2luZyBtdXN0IGNvbWUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAjICB0cmlwbGUgcXVvdGUgY2hlY2tpbmcgKGFib3ZlKS4KKyAgICAgICAgICAgICAgICBlbGlmIChpbml0aWFsIGluIHNpbmdsZV9xdW90ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICB0b2tlbls6Ml0gaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzozXSBpbiBzaW5nbGVfcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bLTFdID09ICdcbic6ICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCA9IChsbnVtLCBzdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzW2luaXRpYWxdIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0c1t0b2tlblsxXV0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzJdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQWdhaW4sIHVzaW5nIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgdG9rZW4uIFRoaXMgaXMgbG9va2luZyBmb3IgdGhlIG1hdGNoaW5nIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgIyAgcmVnZXggZm9yIHRoZSBjb3JyZWN0IHR5cGUgb2YgcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGNoYXJhY3Rlci4gU28gaXQncyByZWFsbHkgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGVuZHBhdHNbIiciXSBvciBlbmRwYXRzWyciJ10sIGJ5IHRyeWluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIyAgc2tpcCBzdHJpbmcgcHJlZml4IGNoYXJhY3RlcnMsIGlmIGFueS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzLmdldChpbml0aWFsKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzFdKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gbGluZVtzdGFydDpdLCAxCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JkaW5hcnkgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBUb2tlbkluZm8oU1RSSU5HLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbC5pc2lkZW50aWZpZXIoKTogICAgICAgICAgICAgICAjIG9yZGluYXJ5IG5hbWUKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4gaW4gKCdhc3luYycsICdhd2FpdCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXN5bmNfZGVmOgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggOWI2OWRhMC4uMWJhYzZlYiAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC00ODcsMTAgKzQ4Nyw5IEBACiAgICAgICAgICAgICBzZWxmLl9sb2FkX2xpbmVzKCkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBmcm9tX2V4Y2VwdGlvbihzZWxmLCBleGMsICphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIGZyb21fZXhjZXB0aW9uKGNscywgZXhjLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJDcmVhdGUgYSBUcmFjZWJhY2tFeGNlcHRpb24gZnJvbSBhbiBleGNlcHRpb24uIiIiCi0gICAgICAgIHJldHVybiBUcmFjZWJhY2tFeGNlcHRpb24oCi0gICAgICAgICAgICB0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGNscyh0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiBfbG9hZF9saW5lcyhzZWxmKToKICAgICAgICAgIiIiUHJpdmF0ZSBBUEkuIGZvcmNlIGFsbCBsaW5lcyBpbiB0aGUgc3RhY2sgdG8gYmUgbG9hZGVkLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9wYXJzZS5weSBiL0xpYi91cmxsaWIvcGFyc2UucHkKaW5kZXggMDFjOWU1OC4uNWUyMTU1YyAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9wYXJzZS5weQorKysgYi9MaWIvdXJsbGliL3BhcnNlLnB5CkBAIC0xNTYsOSArMTU2LDggQEAKICAgICAgICAgcG9ydCA9IHNlbGYuX2hvc3RpbmZvWzFdCiAgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQsIDEwKQotICAgICAgICAgICAgIyBSZXR1cm4gTm9uZSBvbiBhbiBpbGxlZ2FsIHBvcnQKICAgICAgICAgICAgIGlmIG5vdCAoIDAgPD0gcG9ydCA8PSA2NTUzNSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQb3J0IG91dCBvZiByYW5nZSAwLTY1NTM1IikKICAgICAgICAgcmV0dXJuIHBvcnQKIAogCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3JlcXVlc3QucHkgYi9MaWIvdXJsbGliL3JlcXVlc3QucHkKaW5kZXggYTdmZDAxNy4uODgzMjZmOCAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9yZXF1ZXN0LnB5CisrKyBiL0xpYi91cmxsaWIvcmVxdWVzdC5weQpAQCAtMTM4LDYgKzEzOCw2NiBAQAogX29wZW5lciA9IE5vbmUKIGRlZiB1cmxvcGVuKHVybCwgZGF0YT1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICosIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkZWZhdWx0PUZhbHNlLCBjb250ZXh0PU5vbmUpOgorICAgICcnJ09wZW4gdGhlIFVSTCB1cmwsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBSZXF1ZXN0IG9iamVjdC4KKworICAgICpkYXRhKiBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlCisgICAgc2VydmVyLCBvciBOb25lIGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIGRhdGEgbWF5IGFsc28gYmUgYW4gaXRlcmFibGUKKyAgICBvYmplY3QgYW5kIGluIHRoYXQgY2FzZSBDb250ZW50LUxlbmd0aCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICBoZWFkZXJzLiBDdXJyZW50bHkgSFRUUCByZXF1ZXN0cyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSBkYXRhOyB0aGUgSFRUUAorICAgIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBkYXRhIHBhcmFtZXRlciBpcworICAgIHByb3ZpZGVkLgorCisgICAgKmRhdGEqIHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCisgICAgZm9ybWF0LiBUaGUgdXJsbGliLnBhcnNlLnVybGVuY29kZSgpIGZ1bmN0aW9uIHRha2VzIGEgbWFwcGluZyBvciBzZXF1ZW5jZQorICAgIG9mIDItdHVwbGVzIGFuZCByZXR1cm5zIGFuIEFTQ0lJIHRleHQgc3RyaW5nIGluIHRoaXMgZm9ybWF0LiBJdCBzaG91bGQgYmUKKyAgICBlbmNvZGVkIHRvIGJ5dGVzIGJlZm9yZSBiZWluZyB1c2VkIGFzIHRoZSBkYXRhIHBhcmFtZXRlci4KKworICAgIHVybGxpYi5yZXF1ZXN0IG1vZHVsZSB1c2VzIEhUVFAvMS4xIGFuZCBpbmNsdWRlcyBhICJDb25uZWN0aW9uOmNsb3NlIgorICAgIGhlYWRlciBpbiBpdHMgSFRUUCByZXF1ZXN0cy4KKworICAgIFRoZSBvcHRpb25hbCAqdGltZW91dCogcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IKKyAgICBibG9ja2luZyBvcGVyYXRpb25zIGxpa2UgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuIFRoaXMgb25seSB3b3JrcyBmb3IgSFRUUCwKKyAgICBIVFRQUyBhbmQgRlRQIGNvbm5lY3Rpb25zLgorCisgICAgSWYgKmNvbnRleHQqIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBhIHNzbC5TU0xDb250ZXh0IGluc3RhbmNlIGRlc2NyaWJpbmcKKyAgICB0aGUgdmFyaW91cyBTU0wgb3B0aW9ucy4gU2VlIEhUVFBTQ29ubmVjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgVGhlIG9wdGlvbmFsICpjYWZpbGUqIGFuZCAqY2FwYXRoKiBwYXJhbWV0ZXJzIHNwZWNpZnkgYSBzZXQgb2YgdHJ1c3RlZCBDQQorICAgIGNlcnRpZmljYXRlcyBmb3IgSFRUUFMgcmVxdWVzdHMuIGNhZmlsZSBzaG91bGQgcG9pbnQgdG8gYSBzaW5nbGUgZmlsZQorICAgIGNvbnRhaW5pbmcgYSBidW5kbGUgb2YgQ0EgY2VydGlmaWNhdGVzLCB3aGVyZWFzIGNhcGF0aCBzaG91bGQgcG9pbnQgdG8gYQorICAgIGRpcmVjdG9yeSBvZiBoYXNoZWQgY2VydGlmaWNhdGUgZmlsZXMuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICAgc3NsLlNTTENvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKCkuCisKKyAgICBUaGUgKmNhZGVmYXVsdCogcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisKKyAgICBGb3IgaHR0cCBhbmQgaHR0cHMgdXJscywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgaHR0cC5jbGllbnQuSFRUUFJlc3BvbnNlCisgICAgb2JqZWN0IHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIEhUVFBSZXNwb25zZSBPYmplY3RzIG1ldGhvZHMuCisKKyAgICBGb3IgZnRwLCBmaWxlLCBhbmQgZGF0YSB1cmxzIGFuZCByZXF1ZXN0cyBleHBsaWNpdGx5IGhhbmRsZWQgYnkgbGVnYWN5CisgICAgVVJMb3BlbmVyIGFuZCBGYW5jeVVSTG9wZW5lciBjbGFzc2VzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYQorICAgIHVybGxpYi5yZXNwb25zZS5hZGRpbmZvdXJsIG9iamVjdCB3aGljaCBjYW4gd29yayBhcyBjb250ZXh0IG1hbmFnZXIgYW5kIGhhcworICAgIG1ldGhvZHMgc3VjaCBhczoKKworICAgICogZ2V0dXJsKCkgLSByZXR1cm4gdGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgcmV0cmlldmVkLCBjb21tb25seSB1c2VkIHRvCisgICAgICBkZXRlcm1pbmUgaWYgYSByZWRpcmVjdCB3YXMgZm9sbG93ZWQKKworICAgICogaW5mbygpIC0gcmV0dXJuIHRoZSBtZXRhLWluZm9ybWF0aW9uIG9mIHRoZSBwYWdlLCBzdWNoIGFzIGhlYWRlcnMsIGluIHRoZQorICAgICAgZm9ybSBvZiBhbiBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCkgaW5zdGFuY2UgKHNlZSBRdWljayBSZWZlcmVuY2UgdG8KKyAgICAgIEhUVFAgSGVhZGVycykKKworICAgICogZ2V0Y29kZSgpIC0gcmV0dXJuIHRoZSBIVFRQIHN0YXR1cyBjb2RlIG9mIHRoZSByZXNwb25zZS4gIFJhaXNlcyBVUkxFcnJvcgorICAgICAgb24gZXJyb3JzLgorCisgICAgTm90ZSB0aGF0ICpOb25lJiBtYXkgYmUgcmV0dXJuZWQgaWYgbm8gaGFuZGxlciBoYW5kbGVzIHRoZSByZXF1ZXN0ICh0aG91Z2gKKyAgICB0aGUgZGVmYXVsdCBpbnN0YWxsZWQgZ2xvYmFsIE9wZW5lckRpcmVjdG9yIHVzZXMgVW5rbm93bkhhbmRsZXIgdG8gZW5zdXJlCisgICAgdGhpcyBuZXZlciBoYXBwZW5zKS4KKworICAgIEluIGFkZGl0aW9uLCBpZiBwcm94eSBzZXR0aW5ncyBhcmUgZGV0ZWN0ZWQgKGZvciBleGFtcGxlLCB3aGVuIGEgKl9wcm94eQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGxpa2UgaHR0cF9wcm94eSBpcyBzZXQpLCBQcm94eUhhbmRsZXIgaXMgZGVmYXVsdAorICAgIGluc3RhbGxlZCBhbmQgbWFrZXMgc3VyZSB0aGUgcmVxdWVzdHMgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgcHJveHkuCisKKyAgICAnJycKICAgICBnbG9iYWwgX29wZW5lcgogICAgIGlmIGNhZmlsZSBvciBjYXBhdGggb3IgY2FkZWZhdWx0OgogICAgICAgICBpZiBjb250ZXh0IGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weSBiL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKaW5kZXggNGZiYjBjYi4uNGFjNTUzYSAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQorKysgYi9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CkBAIC0xMCw3ICsxMCw5IEBACiAgICAgaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL25vcm9ib3RzLXJmYy50eHQKICIiIgogCi1pbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdXJsbGliLnBhcnNlCitpbXBvcnQgdXJsbGliLnJlcXVlc3QKIAogX19hbGxfXyA9IFsiUm9ib3RGaWxlUGFyc2VyIl0KIApAQCAtMTIwLDEwICsxMjIsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJ1bGVsaW5lcy5hcHBlbmQoUnVsZUxpbmUobGluZVsxXSwgVHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gImNyYXdsLWRlbGF5IjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVmb3JlIHRyeWluZyB0byBjb252ZXJ0IHRvIGludCB3ZSBuZWVkIHRvIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VyZSB0aGF0IHJvYm90cy50eHQgaGFzIHZhbGlkIHN5bnRheCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaXQgd2lsbCBjcmFzaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsxXS5zdHJpcCgpLmlzZGlnaXQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZWxheSA9IGludChsaW5lWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJyZXF1ZXN0LXJhdGUiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycyA9IGxpbmVbMV0uc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBhbGwgdmFsdWVzIGFyZSBzYW5lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKG51bWJlcnMpID09IDIgYW5kIG51bWJlcnNbMF0uc3RyaXAoKS5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbnVtYmVyc1sxXS5zdHJpcCgpLmlzZGlnaXQoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3JhdGUgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdyZXFfcmF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1ZXN0cyBzZWNvbmRzJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZSA9IHJlcV9yYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVxX3JhdGUucmVxdWVzdHMgPSBpbnQobnVtYmVyc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZS5zZWNvbmRzID0gaW50KG51bWJlcnNbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKICAgICAgICAgaWYgc3RhdGUgPT0gMjoKICAgICAgICAgICAgIHNlbGYuX2FkZF9lbnRyeShlbnRyeSkKIAotCiAgICAgZGVmIGNhbl9mZXRjaChzZWxmLCB1c2VyYWdlbnQsIHVybCk6CiAgICAgICAgICIiInVzaW5nIHRoZSBwYXJzZWQgcm9ib3RzLnR4dCBkZWNpZGUgaWYgdXNlcmFnZW50IGNhbiBmZXRjaCB1cmwiIiIKICAgICAgICAgaWYgc2VsZi5kaXNhbGxvd19hbGw6CkBAIC0xNTMsNiArMTc0LDE4IEBACiAgICAgICAgICMgYWdlbnQgbm90IGZvdW5kID09PiBhY2Nlc3MgZ3JhbnRlZAogICAgICAgICByZXR1cm4gVHJ1ZQogCisgICAgZGVmIGNyYXdsX2RlbGF5KHNlbGYsIHVzZXJhZ2VudCk6CisgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CisgICAgICAgICAgICBpZiBlbnRyeS5hcHBsaWVzX3RvKHVzZXJhZ2VudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmRlbGF5CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVxdWVzdF9yYXRlKHNlbGYsIHVzZXJhZ2VudCk6CisgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CisgICAgICAgICAgICBpZiBlbnRyeS5hcHBsaWVzX3RvKHVzZXJhZ2VudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnJlcV9yYXRlCisgICAgICAgIHJldHVybiBOb25lCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICcnLmpvaW4oW3N0cihlbnRyeSkgKyAiXG4iIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXNdKQogCkBAIC0xODAsNiArMjEzLDggQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYudXNlcmFnZW50cyA9IFtdCiAgICAgICAgIHNlbGYucnVsZWxpbmVzID0gW10KKyAgICAgICAgc2VsZi5kZWxheSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXFfcmF0ZSA9IE5vbmUKIAogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXQgPSBbXQpkaWZmIC0tZ2l0IGEvTGliL3dhdmUucHkgYi9MaWIvd2F2ZS5weQppbmRleCA4YTEwMWUzLi5mNzFmN2U1IDEwMDY0NAotLS0gYS9MaWIvd2F2ZS5weQorKysgYi9MaWIvd2F2ZS5weQpAQCAtNzMsNyArNzMsNyBAQAogCiBpbXBvcnQgYnVpbHRpbnMKIAotX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiXQorX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiLCAiV2F2ZV9yZWFkIiwgIldhdmVfd3JpdGUiXQogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CmluZGV4IGI0ZTExMGQuLmI5MmZiNTIgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtOTUsNiArOTUsNyBAQAogaW1wb3J0IHJlCiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBpbworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29udGV4dGxpYgogCiBmcm9tIC4gaW1wb3J0IEVsZW1lbnRQYXRoCkBAIC0xMjAwLDE2ICsxMjAxLDM3IEBACiAgICAgUmV0dXJucyBhbiBpdGVyYXRvciBwcm92aWRpbmcgKGV2ZW50LCBlbGVtKSBwYWlycy4KIAogICAgICIiIgorICAgICMgVXNlIHRoZSBpbnRlcm5hbCwgdW5kb2N1bWVudGVkIF9wYXJzZXIgYXJndW1lbnQgZm9yIG5vdzsgV2hlbiB0aGUKKyAgICAjIHBhcnNlciBhcmd1bWVudCBvZiBpdGVycGFyc2UgaXMgcmVtb3ZlZCwgdGhpcyBjYW4gYmUga2lsbGVkLgorICAgIHB1bGxwYXJzZXIgPSBYTUxQdWxsUGFyc2VyKGV2ZW50cz1ldmVudHMsIF9wYXJzZXI9cGFyc2VyKQorICAgIGRlZiBpdGVyYXRvcigpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gcHVsbHBhcnNlci5yZWFkX2V2ZW50cygpCisgICAgICAgICAgICAgICAgIyBsb2FkIGV2ZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZCgxNiAqIDEwMjQpCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcHVsbHBhcnNlci5mZWVkKGRhdGEpCisgICAgICAgICAgICByb290ID0gcHVsbHBhcnNlci5fY2xvc2VfYW5kX3JldHVybl9yb290KCkKKyAgICAgICAgICAgIHlpZWxkIGZyb20gcHVsbHBhcnNlci5yZWFkX2V2ZW50cygpCisgICAgICAgICAgICBpdC5yb290ID0gcm9vdAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgY2xvc2Vfc291cmNlOgorICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCisKKyAgICBjbGFzcyBJdGVyUGFyc2VJdGVyYXRvcihjb2xsZWN0aW9ucy5JdGVyYXRvcik6CisgICAgICAgIF9fbmV4dF9fID0gaXRlcmF0b3IoKS5fX25leHRfXworICAgIGl0ID0gSXRlclBhcnNlSXRlcmF0b3IoKQorICAgIGl0LnJvb3QgPSBOb25lCisgICAgZGVsIGl0ZXJhdG9yLCBJdGVyUGFyc2VJdGVyYXRvcgorCiAgICAgY2xvc2Vfc291cmNlID0gRmFsc2UKICAgICBpZiBub3QgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CiAgICAgICAgIHNvdXJjZSA9IG9wZW4oc291cmNlLCAicmIiKQogICAgICAgICBjbG9zZV9zb3VyY2UgPSBUcnVlCi0gICAgdHJ5OgotICAgICAgICByZXR1cm4gX0l0ZXJQYXJzZUl0ZXJhdG9yKHNvdXJjZSwgZXZlbnRzLCBwYXJzZXIsIGNsb3NlX3NvdXJjZSkKLSAgICBleGNlcHQ6Ci0gICAgICAgIGlmIGNsb3NlX3NvdXJjZToKLSAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCi0gICAgICAgIHJhaXNlCisKKyAgICByZXR1cm4gaXQKIAogCiBjbGFzcyBYTUxQdWxsUGFyc2VyOgpAQCAtMTIxOSw5ICsxMjQxLDcgQEAKICAgICAgICAgIyB1cG9uIGluIHVzZXIgY29kZS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNzc0MSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICAgICAgICMgX2VsZW1lbnR0cmVlLmMgZXhwZWN0cyBhIGxpc3QsIG5vdCBhIGRlcXVlCi0gICAgICAgIHNlbGYuX2V2ZW50c19xdWV1ZSA9IFtdCi0gICAgICAgIHNlbGYuX2luZGV4ID0gMAorICAgICAgICBzZWxmLl9ldmVudHNfcXVldWUgPSBjb2xsZWN0aW9ucy5kZXF1ZSgpCiAgICAgICAgIHNlbGYuX3BhcnNlciA9IF9wYXJzZXIgb3IgWE1MUGFyc2VyKHRhcmdldD1UcmVlQnVpbGRlcigpKQogICAgICAgICAjIHdpcmUgdXAgdGhlIHBhcnNlciBmb3IgZXZlbnQgcmVwb3J0aW5nCiAgICAgICAgIGlmIGV2ZW50cyBpcyBOb25lOgpAQCAtMTI1OSw2NCArMTI3OSwxNCBAQAogICAgICAgICByZXRyaWV2ZWQgZnJvbSB0aGUgaXRlcmF0b3IuCiAgICAgICAgICIiIgogICAgICAgICBldmVudHMgPSBzZWxmLl9ldmVudHNfcXVldWUKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGluZGV4ID0gc2VsZi5faW5kZXgKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50c1tzZWxmLl9pbmRleF0KLSAgICAgICAgICAgICAgICAjIEF2b2lkIHJldGFpbmluZyByZWZlcmVuY2VzIHRvIHBhc3QgZXZlbnRzCi0gICAgICAgICAgICAgICAgZXZlbnRzW3NlbGYuX2luZGV4XSA9IE5vbmUKLSAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpbmRleCArPSAxCi0gICAgICAgICAgICAjIENvbXBhY3QgdGhlIGxpc3QgaW4gYSBPKDEpIGFtb3J0aXplZCBmYXNoaW9uCi0gICAgICAgICAgICAjIEFzIG5vdGVkIGFib3ZlLCBfZWxlbWVudHJlZS5jIG5lZWRzIGEgbGlzdCwgbm90IGEgZGVxdWUKLSAgICAgICAgICAgIGlmIGluZGV4ICogMiA+PSBsZW4oZXZlbnRzKToKLSAgICAgICAgICAgICAgICBldmVudHNbOmluZGV4XSA9IFtdCi0gICAgICAgICAgICAgICAgc2VsZi5faW5kZXggPSAwCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ID0gaW5kZXgKKyAgICAgICAgd2hpbGUgZXZlbnRzOgorICAgICAgICAgICAgZXZlbnQgPSBldmVudHMucG9wbGVmdCgpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgIHJhaXNlIGV2ZW50CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHlpZWxkIGV2ZW50CiAKIAotY2xhc3MgX0l0ZXJQYXJzZUl0ZXJhdG9yOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgZXZlbnRzLCBwYXJzZXIsIGNsb3NlX3NvdXJjZT1GYWxzZSk6Ci0gICAgICAgICMgVXNlIHRoZSBpbnRlcm5hbCwgdW5kb2N1bWVudGVkIF9wYXJzZXIgYXJndW1lbnQgZm9yIG5vdzsgV2hlbiB0aGUKLSAgICAgICAgIyBwYXJzZXIgYXJndW1lbnQgb2YgaXRlcnBhcnNlIGlzIHJlbW92ZWQsIHRoaXMgY2FuIGJlIGtpbGxlZC4KLSAgICAgICAgc2VsZi5fcGFyc2VyID0gWE1MUHVsbFBhcnNlcihldmVudHM9ZXZlbnRzLCBfcGFyc2VyPXBhcnNlcikKLSAgICAgICAgc2VsZi5fZmlsZSA9IHNvdXJjZQotICAgICAgICBzZWxmLl9jbG9zZV9maWxlID0gY2xvc2Vfc291cmNlCi0gICAgICAgIHNlbGYucm9vdCA9IHNlbGYuX3Jvb3QgPSBOb25lCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuX3BhcnNlci5yZWFkX2V2ZW50cygpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQKLSAgICAgICAgICAgICAgICBpZiBzZWxmLl9wYXJzZXIuX3BhcnNlciBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICMgbG9hZCBldmVudCBidWZmZXIKLSAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKDE2ICogMTAyNCkKLSAgICAgICAgICAgICAgICBpZiBkYXRhOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZXIuZmVlZChkYXRhKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBzZWxmLl9wYXJzZXIuX2Nsb3NlX2FuZF9yZXR1cm5fcm9vdCgpCi0gICAgICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLl9yb290Ci0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGU6Ci0gICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCi0gICAgICAgICAgICByYWlzZQotICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlOgotICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCi0gICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotCiBkZWYgWE1MKHRleHQsIHBhcnNlcj1Ob25lKToKICAgICAiIiJQYXJzZSBYTUwgZG9jdW1lbnQgZnJvbSBzdHJpbmcgY29uc3RhbnQuCiAKZGlmZiAtLWdpdCBhL01ha2VmaWxlLnByZS5pbiBiL01ha2VmaWxlLnByZS5pbgppbmRleCA5MWZhMDZlLi41NzE2N2U2IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5wcmUuaW4KKysrIGIvTWFrZWZpbGUucHJlLmluCkBAIC0xMTcxLDYgKzExNzEsNyBAQAogCQl0ZXN0L2Nqa2VuY29kaW5ncyB0ZXN0L2RlY2ltYWx0ZXN0ZGF0YSB0ZXN0L3htbHRlc3RkYXRhIFwKIAkJdGVzdC9laW50cmRhdGEgXAogCQl0ZXN0L2ltZ2hkcmRhdGEgXAorCQl0ZXN0L2xpYnJlZ3J0ZXN0IFwKIAkJdGVzdC9zdWJwcm9jZXNzZGF0YSB0ZXN0L3NuZGhkcmRhdGEgdGVzdC9zdXBwb3J0IFwKIAkJdGVzdC90cmFjZWRtb2R1bGVzIHRlc3QvZW5jb2RlZF9tb2R1bGVzIFwKIAkJdGVzdC90ZXN0X2ltcG9ydCBcCmRpZmYgLS1naXQgYS9NaXNjL0FDS1MgYi9NaXNjL0FDS1MKaW5kZXggMWFmNGI2Ny4uYzFiZjVkMSAxMDA2NDQKLS0tIGEvTWlzYy9BQ0tTCisrKyBiL01pc2MvQUNLUwpAQCAtMTUxLDYgKzE1MSw3IEBACiBQYXVsIEJvZGRpZQogTWF0dGhldyBCb2VkaWNrZXIKIFJvYmluIEJvZXJkaWprCitOaWtvbGF5IEJvZ295Y2hldgogRGF2aWQgQm9sZW4KIFdvdXRlciBCb2xzdGVybGVlCiBHYXdhaW4gQm9sdG9uCkBAIC0yMzQsNiArMjM1LDcgQEAKIE1pY2hhZWwgQ2V0cnVsbwogRGF2ZSBDaGFtYmVycwogUGFzY2FsIENoYW1ib24KK05pY2hvbGFzIENoYW1tYXMKIEpvaG4gQ2hhbmRsZXIKIEh5ZS1TaGlrIENoYW5nCiBKZWZmcmV5IENoYW5nCkBAIC0zNTAsNiArMzUyLDcgQEAKIFl2ZXMgRGlvbm5lCiBEYW5pZWwgRGl0dG1hcgogSm9zaXAgRGpvbG9uZ2EKK1dhbHRlciBEw7Zyd2FsZAogSmFyb21pciBEb2xlY2VrCiBJc21haWwgRG9ubWV6CiBSb2JlcnQgRG9ub2h1ZQpAQCAtMzc3LDcgKzM4MCw2IEBACiBLYXJtZW4gRHlrc3RyYQogSm9zaXAgRHpvbG9uZ2EKIE1heGltIER6dW1hbmVua28KLVdhbHRlciBEw7Zyd2FsZAogSGFucyBFY2thcmR0CiBSb2RvbHBobyBFY2toYXJkdAogVWxyaWNoIEVja2hhcmR0CkBAIC03NjYsNiArNzY4LDcgQEAKIE1hcmtvIEtvaHRhbGEKIFZhanJhc2t5IEtvawogR3VpZG8gS29sbGVyaWUKK0phY2VrIEtvxYJvZHppZWoKIEphY2VrIEtvbmllY3pueQogQXJrYWR5IEtvcGx5YXJvdgogUGV0ZXIgQS4gS29yZW4KQEAgLTg2OSw2ICs4NzIsNyBAQAogTWlya28gTGlzcwogTmljayBMb2Nrd29vZAogU3RlcGhhbmllIExvY2t3b29kCitNYXJ0aW4gdm9uIEzDtndpcwogSHVnbyBMb3BlcyBUYXZhcmVzCiBHdWlsbGVybW8gTMOzcGV6LUFuZ2xhZGEKIEFubmUgTG9yZApAQCAtODc4LDEzICs4ODIsMTMgQEAKIFBldGVyIExvdmV0dAogQ2hhbG1lciBMb3dlCiBKYXNvbiBMb3dlCi1NYXJ0aW4gdm9uIEzDtndpcwogVG9ueSBMb3duZHMKIFJheSBMb3l6YWdhCiBLYW5nLUhhbyAoS2VubnkpIEx1CiBMdWthcyBMdWVnCiBMb3JlbiBMdWtlCiBGcmVkcmlrIEx1bmRoCitNaWtlIEx1bmR5CiBaaG9uZ3l1ZSBMdW8KIE1hcmsgTHV0egogVGFyYXMgTHlhcHVuCkBAIC0xNDIzLDYgKzE0MjcsNyBAQAogQ2hyaXN0aWFuIFRhbnplcgogU3RldmVuIFRhc2NodWsKIEFteSBUYXlsb3IKK0p1bGlhbiBUYXlsb3IKIE1vbnR5IFRheWxvcgogQW5hdG9seSBUZWNodG9uaWsKIEd1c3Rhdm8gVGVtcGxlCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggMDQyMWMwYS4uNjMzMzQwMSAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtMiw4ICsyLDggQEAKIFB5dGhvbiBOZXdzCiArKysrKysrKysrKwogCi1XaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMiByZWxlYXNlIGNhbmRpZGF0ZSAxPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBSZWxlYXNlIGRhdGU6IHRiYQogCkBAIC0yOSw2ICsyOSwxMSBAQAogCiAtIElzc3VlICMyNTcwOTogRml4ZWQgcHJvYmxlbSB3aXRoIGluLXBsYWNlIHN0cmluZyBjb25jYXRlbmF0aW9uIGFuZCB1dGYtOCBjYWNoZS4KIAorLSBJc3N1ZSAjNTMxOTogTmV3IFB5X0ZpbmFsaXplRXgoKSBBUEkgYWxsb3dpbmcgUHl0aG9uIHRvIHNldCBhbiBleGl0IHN0YXR1cworICBvZiAxMjAgb24gZmFpbHVyZSB0byBmbHVzaCBidWZmZXJlZCBzdHJlYW1zLgorCistIElzc3VlICMyNTQ4NTogdGVsbmV0bGliLlRlbG5ldCBpcyBub3cgYSBjb250ZXh0IG1hbmFnZXIuCisKIC0gSXNzdWUgIzI0MDk3OiBGaXhlZCBjcmFzaCBpbiBvYmplY3QuX19yZWR1Y2VfXygpIGlmIHNsb3QgbmFtZSBpcyBmcmVlZCBpbnNpZGUKICAgX19nZXRhdHRyX18uCiAKQEAgLTM2LDEzICs0MSwxMDYgQEAKICAgX19ieXRlc19fLCBfX3RydW5jX18sIGFuZCBfX2Zsb2F0X18gcmV0dXJuaW5nIGluc3RhbmNlcyBvZiBzdWJjbGFzc2VzIG9mCiAgIGJ5dGVzLCBpbnQsIGFuZCBmbG9hdCB0byBzdWJjbGFzc2VzIG9mIGJ5dGVzLCBpbnQsIGFuZCBmbG9hdCBjb3JyZXNwb25kaW5nbHkuCiAKKy0gSXNzdWUgIzI1NjMwOiBGaXggYSBwb3NzaWJsZSBzZWdmYXVsdCBkdXJpbmcgYXJndW1lbnQgcGFyc2luZyBpbiBmdW5jdGlvbnMKKyAgdGhhdCBhY2NlcHQgZmlsZXN5c3RlbSBwYXRocy4KKworLSBJc3N1ZSAjMjM1NjQ6IEZpeGVkIGEgcGFydGlhbGx5IGJyb2tlbiBzYW5pdHkgY2hlY2sgaW4gdGhlIF9wb3NpeHN1YnByb2Nlc3MKKyAgaW50ZXJuYWxzIHJlZ2FyZGluZyBob3cgZmRzX3RvX3Bhc3Mgd2VyZSBwYXNzZWQgdG8gdGhlIGNoaWxkLiAgVGhlIGJ1ZyBoYWQKKyAgbm8gYWN0dWFsIGltcGFjdCBhcyBzdWJwcm9jZXNzLnB5IGFscmVhZHkgYXZvaWRlZCBpdC4KKworLSBJc3N1ZSAjMjUzODg6IEZpeGVkIHRva2VuaXplciBjcmFzaCB3aGVuIHByb2Nlc3NpbmcgdW5kZWNvZGFibGUgc291cmNlIGNvZGUKKyAgd2l0aCBhIG51bGwgYnl0ZS4KKworLSBJc3N1ZSAjMjU0NjI6IFRoZSBoYXNoIG9mIHRoZSBrZXkgbm93IGlzIGNhbGN1bGF0ZWQgb25seSBvbmNlIGluIG1vc3QKKyAgb3BlcmF0aW9ucyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0LgorCistIElzc3VlICMyMjk5NTogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBfX3JlZHVjZV9fIGFuZCBfX3JlZHVjZV9leF9fIG5vdworICByZWplY3RzIGJ1aWx0aW4gdHlwZXMgd2l0aCBub3QgZGVmaW5lZCBfX25ld19fLgorCistIElzc3VlICMyNDgwMjogQXZvaWQgYnVmZmVyIG92ZXJyZWFkcyB3aGVuIGludCgpLCBmbG9hdCgpLCBjb21waWxlKCksIGV4ZWMoKQorICBhbmQgZXZhbCgpIGFyZSBwYXNzZWQgYnl0ZXMtbGlrZSBvYmplY3RzLiAgVGhlc2Ugb2JqZWN0cyBhcmUgbm90CisgIG5lY2Vzc2FyaWx5IHRlcm1pbmF0ZWQgYnkgYSBudWxsIGJ5dGUsIGJ1dCB0aGUgZnVuY3Rpb25zIGFzc3VtZWQgdGhleSB3ZXJlLgorCistIElzc3VlICMyNTU1NTogRml4IHBhcnNlciBhbmQgQVNUOiBmaWxsIGxpbmVubyBhbmQgY29sX29mZnNldCBvZiAiYXJnIiBub2RlCisgIHdoZW4gY29tcGlsaW5nIEFTVCBmcm9tIFB5dGhvbiBvYmplY3RzLgorCistIElzc3VlICMyNDcyNjogRml4ZWQgYSBjcmFzaCBhbmQgbGVha2luZyBOVUxMIGluIHJlcHIoKSBvZiBPcmRlcmVkRGljdCB0aGF0CisgIHdhcyBtdXRhdGVkIGJ5IGRpcmVjdCBjYWxscyBvZiBkaWN0IG1ldGhvZHMuCisKKy0gSXNzdWUgIzI1NDQ5OiBJdGVyYXRpbmcgT3JkZXJlZERpY3Qgd2l0aCBrZXlzIHdpdGggdW5zdGFibGUgaGFzaCBub3cgcmFpc2VzCisgIEtleUVycm9yIGluIEMgaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgaW4gUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCistIElzc3VlICMyNTM5NTogRml4ZWQgY3Jhc2ggd2hlbiBoaWdobHkgbmVzdGVkIE9yZGVyZWREaWN0IHN0cnVjdHVyZXMgd2VyZQorICBnYXJiYWdlIGNvbGxlY3RlZC4KKworLSBJc3N1ZSAjMjU0MDE6IE9wdGltaXplIGJ5dGVzLmZyb21oZXgoKSBhbmQgYnl0ZWFycmF5LmZyb21oZXgoKTogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLgorCistIElzc3VlICMyNTM5OTogT3B0aW1pemUgYnl0ZWFycmF5ICUgYXJncyB1c2luZyB0aGUgbmV3IHByaXZhdGUgX1B5Qnl0ZXNXcml0ZXIKKyAgQVBJLiBGb3JtYXR0aW5nIGlzIG5vdyBiZXR3ZWVuIDIuNSBhbmQgNSB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1Mjc0OiBzeXMuc2V0cmVjdXJzaW9ubGltaXQoKSBub3cgcmFpc2VzIGEgUmVjdXJzaW9uRXJyb3IgaWYgdGhlIG5ldworICByZWN1cnNpb24gbGltaXQgaXMgdG9vIGxvdyBkZXBlbmRpbmcgYXQgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLiBNb2RpZnkKKyAgYWxzbyB0aGUgImxvd2VyLXdhdGVyIG1hcmsiIGZvcm11bGEgdG8gbWFrZSBpdCBtb25vdG9uaWMuIFRoaXMgbWFyayBpcyB1c2VkCisgIHRvIGRlY2lkZSB3aGVuIHRoZSBvdmVyZmxvd2VkIGZsYWcgb2YgdGhlIHRocmVhZCBzdGF0ZSBpcyByZXNldC4KKworLSBJc3N1ZSAjMjQ0MDI6IEZpeCBpbnB1dCgpIHRvIHByb21wdCB0byB0aGUgcmVkaXJlY3RlZCBzdGRvdXQgd2hlbgorICBzeXMuc3Rkb3V0LmZpbGVubygpIGZhaWxzLgorCistIElzc3VlICMyNTM0OTogT3B0aW1pemUgYnl0ZXMgJSBhcmdzIHVzaW5nIHRoZSBuZXcgcHJpdmF0ZSBfUHlCeXRlc1dyaXRlciBBUEkuCisgIEZvcm1hdHRpbmcgaXMgbm93IHVwIHRvIDIgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNDgwNjogUHJldmVudCBidWlsdGluIHR5cGVzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIHN1YmNsYXNzZWQgZnJvbQorICBiZWluZyBzdWJjbGFzc2VkIHRocm91Z2ggbXVsdGlwbGUgaW5oZXJpdGFuY2UuCisKKy0gSXNzdWUgIzI1MzAxOiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IKKyAgaGFuZGxlcnM6IGBgaWdub3JlYGAsIGBgcmVwbGFjZWBgIGFuZCBgYHN1cnJvZ2F0ZWVzY2FwZWBgLgorCistIElzc3VlICMyNDg0ODogRml4ZWQgYSBudW1iZXIgb2YgYnVncyBpbiBVVEYtNyBkZWNvZGluZyBvZiBtaXNmb3JtZWQgZGF0YS4KKworLSBJc3N1ZSAjMjUyNjc6IFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvcgorICBoYW5kbGVyczogYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAsIGBgc3Vycm9nYXRlZXNjYXBlYGAsIGBgc3Vycm9nYXRlcGFzc2BgLgorICBQYXRjaCBjby13cml0dGVuIHdpdGggU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjUyODA6IEltcG9ydCB0cmFjZSBtZXNzYWdlcyBlbWl0dGVkIGluIHZlcmJvc2UgKC12KSBtb2RlIGFyZSBubworICBsb25nZXIgZm9ybWF0dGVkIHR3aWNlLgorCistIElzc3VlICMyNTIyNzogT3B0aW1pemUgQVNDSUkgYW5kIGxhdGluMSBlbmNvZGVycyB3aXRoIHRoZSBgYHN1cnJvZ2F0ZWVzY2FwZWBgCisgIGVycm9yIGhhbmRsZXI6IHRoZSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdC4gSW5pdGlhbCBwYXRjaAorICB3cml0dGVuIGJ5IFNlcmhpeSBTdG9yY2hha2EuCisKKy0gSXNzdWUgIzI1MDAzOiBPbiBTb2xhcmlzIDExLjMgb3IgbmV3ZXIsIG9zLnVyYW5kb20oKSBub3cgdXNlcyB0aGUKKyAgZ2V0cmFuZG9tKCkgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZ2V0ZW50cm9weSgpIGZ1bmN0aW9uLiBUaGUgZ2V0ZW50cm9weSgpCisgIGZ1bmN0aW9uIGlzIGJsb2NraW5nIHRvIGdlbmVyYXRlIHZlcnkgZ29vZCBxdWFsaXR5IGVudHJvcHksIG9zLnVyYW5kb20oKQorICBkb2Vzbid0IG5lZWQgc3VjaCBoaWdoLXF1YWxpdHkgZW50cm9weS4KKworLSBJc3N1ZSAjOTIzMjogTW9kaWZ5IFB5dGhvbidzIGdyYW1tYXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWFzIGluIHRoZQorICBhcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uICBGb3IgZXhhbXBsZSwgImRlZiBmKFwqLCBhID0KKyAgMywpOiBwYXNzIiBpcyBub3cgbGVnYWwuIFBhdGNoIGZyb20gTWFyayBEaWNraW5zb24uCisKKy0gSXNzdWUgIzI0OTY1OiBJbXBsZW1lbnQgUEVQIDQ5OCAiTGl0ZXJhbCBTdHJpbmcgSW50ZXJwb2xhdGlvbiIuIFRoaXMKKyAgYWxsb3dzIHlvdSB0byBlbWJlZCBleHByZXNzaW9ucyBpbnNpZGUgZi1zdHJpbmdzLCB3aGljaCBhcmUKKyAgY29udmVydGVkIHRvIG5vcm1hbCBzdHJpbmdzIGF0IHJ1biB0aW1lLiBHaXZlbiB4PTMsIHRoZW4KKyAgZid2YWx1ZT17eH0nID09ICd2YWx1ZT0zJy4gUGF0Y2ggYnkgRXJpYyBWLiBTbWl0aC4KKwogTGlicmFyeQogLS0tLS0tLQogCistIElzc3VlICMyNTk3MTogT3B0aW1pemVkIGNyZWF0aW5nIEZyYWN0aW9ucyBmcm9tIGZsb2F0cyBieSAyIHRpbWVzIGFuZCBmcm9tCisgIERlY2ltYWxzIGJ5IDMgdGltZXMuCisKKy0gSXNzdWUgIzI1ODAyOiBEb2N1bWVudCBhcyBkZXByZWNhdGVkIHRoZSByZW1haW5pbmcgaW1wbGVtZW50YXRpb25zIG9mCisgIGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlKCkuCisKKy0gSXNzdWUgIzI1OTI4OiBBZGQgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkuCisKIC0gSXNzdWUgIzI1NDQ3OiBDb3B5aW5nIHRoZSBscnVfY2FjaGUoKSB3cmFwcGVyIG9iamVjdCBub3cgYWx3YXlzIHdvcmtzLAotICBpbmRlcGVuZGVkbHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgd3JhcHBlZCBvYmplY3QgKGJ5IHJldHVybmluZyB0aGUgb3JpZ2luYWwKKyAgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG9iamVjdCAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbAogICBvYmplY3QgdW5jaGFuZ2VkKS4KIAorLSBJc3N1ZSAjMjU3Njg6IEhhdmUgdGhlIGZ1bmN0aW9ucyBpbiBjb21waWxlYWxsIHJldHVybiBib29sZWFucyBpbnN0ZWFkIG9mCisgIGludHMgYW5kIGFkZCBwcm9wZXIgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdHMgZm9yIHRoZSByZXR1cm4gdmFsdWVzLgorCiAtIElzc3VlICMyNDEwMzogRml4ZWQgcG9zc2libGUgdXNlIGFmdGVyIGZyZWUgaW4gRWxlbWVudFRyZWUuWE1MUHVsbFBhcnNlci4KIAogLSBJc3N1ZSAjMjU4NjA6IG9zLmZ3YWxrKCkgbm8gbG9uZ2VyIHNraXBzIHJlbWFpbmluZyBkaXJlY3RvcmllcyB3aGVuIGVycm9yCkBAIC01MCw4ICsxNDgsMjIgQEAKIAogLSBJc3N1ZSAjMjU5MTQ6IEZpeGVkIGFuZCBzaW1wbGlmaWVkIE9yZGVyZWREaWN0Ll9fc2l6ZW9mX18uCiAKKy0gSXNzdWUgIzI1ODY5OiBPcHRpbWl6ZWQgZGVlcGNvcHlpbmcgRWxlbWVudFRyZWU7IGl0IGlzIG5vdyAyMCB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1ODczOiBPcHRpbWl6ZWQgaXRlcmF0aW5nIEVsZW1lbnRUcmVlLiAgSXRlcmF0aW5nIGVsZW1lbnRzCisgIEVsZW1lbnQuaXRlcigpIGlzIG5vdyA0MCUgZmFzdGVyLCBpdGVyYXRpbmcgdGV4dCBFbGVtZW50Lml0ZXJ0ZXh0KCkKKyAgaXMgbm93IHVwIHRvIDIuNSB0aW1lcyBmYXN0ZXIuCisKIC0gSXNzdWUgIzI1OTAyOiBGaXhlZCB2YXJpb3VzIHJlZmNvdW50IGlzc3VlcyBpbiBFbGVtZW50VHJlZSBpdGVyYXRpb24uCiAKKy0gSXNzdWUgIzIyMjI3OiBUaGUgVGFyRmlsZSBpdGVyYXRvciBpcyByZWltcGxlbWVudGVkIHVzaW5nIGdlbmVyYXRvci4KKyAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzaW1wbGVyIHRoYXQgdXNpbmcgY2xhc3MuCisKKy0gSXNzdWUgIzI1NjM4OiBPcHRpbWl6ZWQgRWxlbWVudFRyZWUuaXRlcnBhcnNlKCk7IGl0IGlzIG5vdyAyeCBmYXN0ZXIuCisgIE9wdGltaXplZCBFbGVtZW50VHJlZSBwYXJzaW5nOyBpdCBpcyBub3cgMTAlIGZhc3Rlci4KKworLSBJc3N1ZSAjMjU3NjE6IEltcHJvdmVkIGRldGVjdGluZyBlcnJvcnMgaW4gYnJva2VuIHBpY2tsZSBkYXRhLgorCiAtIElzc3VlICMyNTcxNzogUmVzdG9yZSB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIG9mIHRvbGVyYXRpbmcgbW9zdCBmc3RhdCgpCiAgIGVycm9ycyB3aGVuIG9wZW5pbmcgZmlsZXMuICBUaGlzIHdhcyBhIHJlZ3Jlc3Npb24gaW4gMy41YTEsIGFuZCBzdG9wcGVkCiAgIGFub255bW91cyB0ZW1wb3JhcnkgZmlsZXMgZnJvbSB3b3JraW5nIGluIHNwZWNpYWwgY2FzZXMuCkBAIC02Myw2ICsxNzUsOSBAQAogLSBJc3N1ZSAjMjU3NjQ6IEluIHRoZSBzdWJwcm9jZXNzIG1vZHVsZSwgcHJlc2VydmUgYW55IGV4Y2VwdGlvbiBjYXVzZWQgYnkKICAgZm9yaygpIGZhaWx1cmUgd2hlbiBwcmVleGVjX2ZuIGlzIHVzZWQuCiAKKy0gSXNzdWUgIzI1NzcxOiBUd2VhayB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgZm9yIGltcG9ydGxpYi51dGlsLnJlc29sdmVfbmFtZSgpCisgIHdoZW4gJ3BhY2thZ2UnIGlzbid0IHNwZWNpZmllZCBidXQgbmVjZXNzYXJ5LgorCiAtIElzc3VlICM2NDc4OiBfc3RycHRpbWUncyByZWdleHAgY2FjaGUgbm93IGlzIHJlc2V0IGFmdGVyIGNoYW5naW5nIHRpbWV6b25lCiAgIHdpdGggdGltZS50enNldCgpLgogCkBAIC04NCw2ICsxOTksOSBAQAogLSBJc3N1ZSAjMTAxMzE6IEZpeGVkIGRlZXAgY29weWluZyBvZiBtaW5pZG9tIGRvY3VtZW50cy4gIEJhc2VkIG9uIHBhdGNoCiAgIGJ5IE1hcmlhbiBHYW5pc2luLgogCistIElzc3VlICM3OTkwOiBkaXIoKSBvbiBFbGVtZW50VHJlZS5FbGVtZW50IG5vdyBsaXN0cyBwcm9wZXJ0aWVzOiAidGFnIiwKKyAgInRleHQiLCAidGFpbCIgYW5kICJhdHRyaWIiLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FudG9zbyBXaWpheWEuCisKIC0gSXNzdWUgIzI1NzI1OiBGaXhlZCBhIHJlZmVyZW5jZSBsZWFrIGluIHBpY2tsZS5sb2FkcygpIHdoZW4gdW5waWNrbGluZwogICBpbnZhbGlkIGRhdGEgaW5jbHVkaW5nIHR1cGxlIGluc3RydWN0aW9ucy4KIApAQCAtOTksMTEgKzIxNywzMDQgQEAKIC0gSXNzdWUgIzI1NjI0OiBaaXBGaWxlIG5vdyBhbHdheXMgd3JpdGVzIGEgWklQX1NUT1JFRCBoZWFkZXIgZm9yIGRpcmVjdG9yeQogICBlbnRyaWVzLiAgUGF0Y2ggYnkgRGluZ3l1YW4gV2FuZy4KIAorLSBJc3N1ZSAjMjU2MjY6IENoYW5nZSB0aHJlZSB6bGliIGZ1bmN0aW9ucyB0byBhY2NlcHQgc2l6ZXMgdGhhdCBmaXQgaW4KKyAgUHlfc3NpemVfdCwgYnV0IGludGVybmFsbHkgY2FwIHRob3NlIHNpemVzIHRvIFVJTlRfTUFYLiAgVGhpcyByZXNvbHZlcyBhCisgIHJlZ3Jlc3Npb24gaW4gMy41IHdoZXJlIEd6aXBGaWxlLnJlYWQoKSBmYWlsZWQgdG8gcmVhZCBjaHVua3MgbGFyZ2VyIHRoYW4gMgorICBvciA0IEdpQi4gIFRoZSBjaGFuZ2UgYWZmZWN0cyB0aGUgemxpYi5EZWNvbXByZXNzLmRlY29tcHJlc3MoKSBtYXhfbGVuZ3RoCisgIHBhcmFtZXRlciwgdGhlIHpsaWIuZGVjb21wcmVzcygpIGJ1ZnNpemUgcGFyYW1ldGVyLCBhbmQgdGhlCisgIHpsaWIuRGVjb21wcmVzcy5mbHVzaCgpIGxlbmd0aCBwYXJhbWV0ZXIuCisKKy0gSXNzdWUgIzI1NTgzOiBBdm9pZCBpbmNvcnJlY3QgZXJyb3JzIHJhaXNlZCBieSBvcy5tYWtlZGlycyhleGlzdF9vaz1UcnVlKQorICB3aGVuIHRoZSBPUyBnaXZlcyBwcmlvcml0eSB0byBlcnJvcnMgc3VjaCBhcyBFQUNDRVMgb3ZlciBFRVhJU1QuCisKKy0gSXNzdWUgIzI1NTkzOiBDaGFuZ2Ugc2VtYW50aWNzIG9mIEV2ZW50TG9vcC5zdG9wKCkgaW4gYXN5bmNpby4KKworLSBJc3N1ZSAjNjk3MzogV2hlbiB3ZSBrbm93IGEgc3VicHJvY2Vzcy5Qb3BlbiBwcm9jZXNzIGhhcyBkaWVkLCBkbworICBub3QgYWxsb3cgdGhlIHNlbmRfc2lnbmFsKCksIHRlcm1pbmF0ZSgpLCBvciBraWxsKCkgbWV0aG9kcyB0byBkbworICBhbnl0aGluZyBhcyB0aGV5IGNvdWxkIHBvdGVudGlhbGx5IHNpZ25hbCBhIGRpZmZlcmVudCBwcm9jZXNzLgorCistIElzc3VlICMyMzg4MzogQWRkZWQgbWlzc2luZyBBUElzIHRvIF9fYWxsX18gdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJcworICBmb3IgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBjc3YsIGVudW0sIGZ0cGxpYiwgbG9nZ2luZywgb3B0cGFyc2UsIHRocmVhZGluZworICBhbmQgd2F2ZS4gIEFsc28gYWRkZWQgYSB0ZXN0LnN1cHBvcnQuY2hlY2tfX2FsbF9fKCkgaGVscGVyLiAgUGF0Y2hlcyBieQorICBKYWNlayBLb8WCb2R6aWVqLgorCistIElzc3VlICMyNTU5MDogSW4gdGhlIFJlYWRsaW5lIGNvbXBsZXRlciwgb25seSBjYWxsIGdldGF0dHIoKSBvbmNlIHBlcgorICBhdHRyaWJ1dGUuICBBbHNvIGNvbXBsZXRlIG5hbWVzIG9mIGF0dHJpYnV0ZXMgc3VjaCBhcyBwcm9wZXJ0aWVzIGFuZCBzbG90cworICB3aGljaCBhcmUgbGlzdGVkIGJ5IGRpcigpIGJ1dCBub3QgeWV0IGNyZWF0ZWQgb24gYW4gaW5zdGFuY2UuCisKKy0gSXNzdWUgIzI1NDk4OiBGaXggYSBjcmFzaCB3aGVuIGdhcmJhZ2UtY29sbGVjdGluZyBjdHlwZXMgb2JqZWN0cyBjcmVhdGVkCisgIGJ5IHdyYXBwaW5nIGEgbWVtb3J5dmlldy4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBtYWRlIGluIDMuNWExLiAgQmFzZWQKKyAgb24gcGF0Y2ggYnkgRXJ5a3N1bi4KKworLSBJc3N1ZSAjMjU1ODQ6IEFkZGVkICJlc2NhcGUiIHRvIHRoZSBfX2FsbF9fIGxpc3QgaW4gdGhlIGdsb2IgbW9kdWxlLgorCistIElzc3VlICMyNTU4NDogRml4ZWQgcmVjdXJzaXZlIGdsb2IoKSB3aXRoIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggJ1wqXConLgorCistIElzc3VlICMyNTQ0NjogRml4IHJlZ3Jlc3Npb24gaW4gc210cGxpYidzIEFVVEggTE9HSU4gc3VwcG9ydC4KKworLSBJc3N1ZSAjMTgwMTA6IEZpeCB0aGUgcHlkb2Mgd2ViIHNlcnZlcidzIG1vZHVsZSBzZWFyY2ggZnVuY3Rpb24gdG8gaGFuZGxlCisgIGV4Y2VwdGlvbnMgZnJvbSBpbXBvcnRpbmcgcGFja2FnZXMuCisKKy0gSXNzdWUgIzI1NTU0OiBHb3QgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcuCisKKy0gSXNzdWUgIzE4OTczOiBDb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9mIHRoZSBjYWxlbmRhciBtb2R1bGUgbm93IHVzZXMgYXJncGFyc2UKKyAgaW5zdGVhZCBvZiBvcHRwYXJzZS4KKworLSBJc3N1ZSAjMjU1MTA6IGZpbGVpbnB1dC5GaWxlSW5wdXQucmVhZGxpbmUoKSBub3cgcmV0dXJucyBiJycgaW5zdGVhZCBvZiAnJworICBhdCB0aGUgZW5kIGlmIHRoZSBGaWxlSW5wdXQgd2FzIG9wZW5lZCB3aXRoIGJpbmFyeSBtb2RlLgorICBQYXRjaCBieSBSeW9zdWtlIEl0by4KKworLSBJc3N1ZSAjMjU1MDM6IEZpeGVkIGluc3BlY3QuZ2V0ZG9jKCkgZm9yIGluaGVyaXRlZCBkb2NzdHJpbmdzIG9mIHByb3BlcnRpZXMuCisgIE9yaWdpbmFsIHBhdGNoIGJ5IEpvaG4gTWFyayBWYW5kZW5iZXJnLgorCistIElzc3VlICMyNTUxNTogQWx3YXlzIHVzZSBvcy51cmFuZG9tIGFzIGEgc291cmNlIG9mIHJhbmRvbW5lc3MgaW4gdXVpZC51dWlkNC4KKworLSBJc3N1ZSAjMjE4Mjc6IEZpeGVkIHRleHR3cmFwLmRlZGVudCgpIGZvciB0aGUgY2FzZSB3aGVuIGxhcmdlc3QgY29tbW9uCisgIHdoaXRlc3BhY2UgaXMgYSBzdWJzdHJpbmcgb2Ygc21hbGxlc3QgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBCYXNlZCBvbiBwYXRjaCBieSBSb2JlcnQgTGkuCisKKy0gSXNzdWUgIzI1NDQ3OiBUaGUgbHJ1X2NhY2hlKCkgd3JhcHBlciBvYmplY3RzIG5vdyBjYW4gYmUgY29waWVkIGFuZCBwaWNrbGVkCisgIChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIG9iamVjdCB1bmNoYW5nZWQpLgorCistIElzc3VlICMyNTM5MDogdHlwaW5nOiBEb24ndCBjcmFzaCBvbiBVbmlvbltzdHIsIFBhdHRlcm5dLgorCistIElzc3VlICMyNTQ0MTogYXN5bmNpbzogUmFpc2UgZXJyb3IgZnJvbSBkcmFpbigpIHdoZW4gc29ja2V0IGlzIGNsb3NlZC4KKworLSBJc3N1ZSAjMjU0MTA6IENsZWFuZWQgdXAgYW5kIGZpeGVkIG1pbm9yIGJ1Z3MgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZgorICBPcmRlcmVkRGljdC4KKworLSBJc3N1ZSAjMjU0MTE6IEltcHJvdmVkIFVuaWNvZGUgc3VwcG9ydCBpbiBTTVRQSGFuZGxlciB0aHJvdWdoIGJldHRlciB1c2Ugb2YKKyAgdGhlIGVtYWlsIHBhY2thZ2UuIFRoYW5rcyB0byB1c2VyIHNpbW9uMDQgZm9yIHRoZSBwYXRjaC4KKworLSBNb3ZlIHRoZSBpbXAgbW9kdWxlIGZyb20gYSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4KKworLSBJc3N1ZSAjMjU0MDc6IFJlbW92ZSBtZW50aW9ucyBvZiB0aGUgZm9ybWF0dGVyIG1vZHVsZSBiZWluZyByZW1vdmVkIGluCisgIFB5dGhvbiAzLjYuCisKKy0gSXNzdWUgIzI1NDA2OiBGaXhlZCBhIGJ1ZyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0Lm1vdmVfdG9fZW5kKCkKKyAgdGhhdCBjYXVzZWQgc2VnbWVudGF0aW9uIGZhdWx0IG9yIGhhbmcgaW4gaXRlcmF0aW5nIGFmdGVyIG1vdmluZyBzZXZlcmFsCisgIGl0ZW1zIHRvIHRoZSBzdGFydCBvZiBvcmRlcmVkIGRpY3QuCisKKy0gSXNzdWUgIzI1MzgyOiBwaWNrbGV0b29scy5kaXMoKSBub3cgb3V0cHV0cyBpbXBsaWNpdCBtZW1vIGluZGV4IGZvciB0aGUKKyAgTUVNT0laRSBvcGNvZGUuCisKKy0gSXNzdWUgIzI1MzU3OiBBZGQgYW4gb3B0aW9uYWwgbmV3bGluZSBwYXJhbWVyIHRvIGJpbmFzY2lpLmIyYV9iYXNlNjQoKS4KKyAgYmFzZTY0LmI2NGVuY29kZSgpIHVzZXMgaXQgdG8gYXZvaWQgYSBtZW1vcnkgY29weS4KKworLSBJc3N1ZSAjMjQxNjQ6IE9iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cywKKyAgY2FuIG5vdyBiZSBwaWNrbGVkIHVzaW5nIHBpY2tsZSBwcm90b2NvbHMgb2xkZXIgdGhhbiBwcm90b2NvbCB2ZXJzaW9uIDQuCisKKy0gSXNzdWUgIzI1MzY0OiB6aXBmaWxlIG5vdyB3b3JrcyBpbiB0aHJlYWRzIGRpc2FibGVkIGJ1aWxkcy4KKworLSBJc3N1ZSAjMjUzMjg6IHNtdHBkJ3MgU01UUENoYW5uZWwgbm93IGNvcnJlY3RseSByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGJvdGgKKyAgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBhcmUgc2V0IHRvIHRydWUuCisKKy0gSXNzdWUgIzE2MDk5OiBSb2JvdEZpbGVQYXJzZXIgbm93IHN1cHBvcnRzIENyYXdsLWRlbGF5IGFuZCBSZXF1ZXN0LXJhdGUKKyAgZXh0ZW5zaW9ucy4gIFBhdGNoIGJ5IE5pa29sYXkgQm9nb3ljaGV2LgorCistIElzc3VlICMyNTMxNjogZGlzdHV0aWxzIHJhaXNlcyBPU0Vycm9yIGluc3RlYWQgb2YgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorICB3aGVuIE1TVkMgaXMgbm90IGluc3RhbGxlZC4KKworLSBJc3N1ZSAjMjUzODA6IEZpeGVkIHByb3RvY29sIGZvciB0aGUgU1RBQ0tfR0xPQkFMIG9wY29kZSBpbgorICBwaWNrbGV0b29scy5vcGNvZGVzLgorCistIElzc3VlICMyMzk3MjogVXBkYXRlcyBhc3luY2lvIGRhdGFncmFtIGNyZWF0ZSBtZXRob2QgYWxsb3dpbmcgcmV1c2Vwb3J0CisgIGFuZCByZXVzZWFkZHIgc29ja2V0IG9wdGlvbnMgdG8gYmUgc2V0IHByaW9yIHRvIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgTWlycm9yaW5nIHRoZSBleGlzdGluZyBhc3luY2lvIGNyZWF0ZV9zZXJ2ZXIgbWV0aG9kIHRoZSByZXVzZWFkZHIgb3B0aW9uCisgIGZvciBkYXRhZ3JhbSBzb2NrZXRzIGRlZmF1bHRzIHRvIFRydWUgaWYgdGhlIE8vUyBpcyAncG9zaXgnIChleGNlcHQgaWYgdGhlCisgIHBsYXRmb3JtIGlzIEN5Z3dpbikuIFBhdGNoIGJ5IENocmlzIExhd3MuCisKKy0gSXNzdWUgIzI1MzA0OiBBZGQgYXN5bmNpby5ydW5fY29yb3V0aW5lX3RocmVhZHNhZmUoKS4gIFRoaXMgbGV0cyB5b3UKKyAgc3VibWl0IGEgY29yb3V0aW5lIHRvIGEgbG9vcCBmcm9tIGFub3RoZXIgdGhyZWFkLCByZXR1cm5pbmcgYQorICBjb25jdXJyZW50LmZ1dHVyZXMuRnV0dXJlLiAgQnkgVmluY2VudCBNaWNoZWwuCisKKy0gSXNzdWUgIzI1MjMyOiBGaXggQ0dJUmVxdWVzdEhhbmRsZXIgdG8gc3BsaXQgdGhlIHF1ZXJ5IGZyb20gdGhlIFVSTCBhdCB0aGUKKyAgZmlyc3QgcXVlc3Rpb24gbWFyayAoPykgcmF0aGVyIHRoYW4gdGhlIGxhc3QuIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI0NjU3OiBQcmV2ZW50IENHSVJlcXVlc3RIYW5kbGVyIGZyb20gY29sbGFwc2luZyBzbGFzaGVzIGluIHRoZQorICBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwgYXMgaWYgaXQgd2VyZSBhIHBhdGguIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI1Mjg3OiBEb24ndCBhZGQgY3J5cHQuTUVUSE9EX0NSWVBUIHRvIGNyeXB0Lm1ldGhvZHMgaWYgaXQncyBub3QKKyAgc3VwcG9ydGVkLiBDaGVjayBpZiBpdCBpcyBzdXBwb3J0ZWQsIGl0IG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIE9wZW5CU0QgZm9yCisgIGV4YW1wbGUuCisKKy0gSXNzdWUgIzIzNjAwOiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby5mcm9tdXRjKCkgd2FzIHJldHVybmluZworICB3cm9uZyByZXN1bHRzIGluIHNvbWUgY2FzZXMuCisKKy0gSXNzdWUgIzI1MjAzOiBGYWlsZWQgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcl9kZWxpbXMoKSBubyBsb25nZXIgbGVmdCB0aGUKKyAgbW9kdWxlIGluIGluY29uc2lzdGVudCBzdGF0ZS4KKworLSBJc3N1ZSAjMjUwMTE6IHJsY29tcGxldGVyIG5vdyBvbWl0cyBwcml2YXRlIGFuZCBzcGVjaWFsIGF0dHJpYnV0ZSBuYW1lcyB1bmxlc3MKKyAgdGhlIHByZWZpeCBzdGFydHMgd2l0aCB1bmRlcnNjb3Jlcy4KKworLSBJc3N1ZSAjMjUyMDk6IHJsY29tcGxldGVyIG5vdyBjYW4gYWRkIGEgc3BhY2Ugb3IgYSBjb2xvbiBhZnRlciBjb21wbGV0ZWQga2V5d29yZC4KKworLSBJc3N1ZSAjMjIyNDE6IHRpbWV6b25lLnV0YyBuYW1lIGlzIG5vdyBwbGFpbiAnVVRDJywgbm90ICdVVEMtMDA6MDAnLgorCistIElzc3VlICMyMzUxNzogZnJvbXRpbWVzdGFtcCgpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgbWV0aG9kcyBvZgorICBkYXRldGltZS5kYXRldGltZSBub3cgcm91bmQgbWljcm9zZWNvbmRzIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvCisgIG5lYXJlc3QgZXZlbiBpbnRlZ2VyIChST1VORF9IQUxGX0VWRU4pLCBhcyByb3VuZChmbG9hdCksIGluc3RlYWQgb2Ygcm91bmRpbmcKKyAgdG93YXJkcyAtSW5maW5pdHkgKFJPVU5EX0ZMT09SKS4KKworLSBJc3N1ZSAjMjM1NTI6IFRpbWVpdCBub3cgd2FybnMgd2hlbiB0aGVyZSBpcyBzdWJzdGFudGlhbCAoNHgpIHZhcmlhbmNlCisgIGJldHdlZW4gYmVzdCBhbmQgd29yc3QgdGltZXMuIFBhdGNoIGZyb20gU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ2MzM6IHNpdGUtcGFja2FnZXMvUkVBRE1FIC0+IFJFQURNRS50eHQuCisKKy0gSXNzdWUgIzI0ODc5OiBoZWxwKCkgYW5kIHB5ZG9jIGNhbiBub3cgbGlzdCBuYW1lZCB0dXBsZSBmaWVsZHMgaW4gdGhlCisgIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5LiAgVGhlIG9yZGVyaW5nIGlzCisgIGRldGVybWluZWQgYnkgdGhlIF9maWVsZHMgYXR0cmlidXRlIGlmIHByZXNlbnQuCisKKy0gSXNzdWUgIzI0ODc0OiBJbXByb3ZlIHNwZWVkIG9mIGl0ZXJ0b29scy5jeWNsZSgpIGFuZCBtYWtlIGl0cworICBwaWNrbGUgbW9yZSBjb21wYWN0LgorCistIEZpeCBjcmFzaCBpbiBpdGVydG9vbHMuY3ljbGUuX19zZXRzdGF0ZV9fKCkgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgd2Fzbid0CisgIGEgbGlzdC4KKworLSBJc3N1ZSAjMjAwNTk6IHVybGxpYi5wYXJzZSByYWlzZXMgVmFsdWVFcnJvciBvbiBhbGwgaW52YWxpZCBwb3J0cy4KKyAgUGF0Y2ggYnkgTWFydGluIFBhbnRlci4KKworLSBJc3N1ZSAjMjQzNjA6IEltcHJvdmUgX19yZXByX18gb2YgYXJncGFyc2UuTmFtZXNwYWNlKCkgZm9yIGludmFsaWQKKyAgaWRlbnRpZmllcnMuICBQYXRjaCBieSBNYXR0aGlhcyBCdXNzb25uaWVyLgorCistIElzc3VlICMyMzQyNjogcnVuX3NldHVwIHdhcyBicm9rZW4gaW4gZGlzdHV0aWxzLgorICBQYXRjaCBmcm9tIEFsZXhhbmRlciBCZWxvcG9sc2t5LgorCistIElzc3VlICMxMzkzODogMnRvMyBjb252ZXJ0cyBTdHJpbmdUeXBlcyB0byBhIHR1cGxlLiBQYXRjaCBmcm9tIE1hcmsgSGFtbW9uZC4KKworLSBJc3N1ZSAjMjA5MTogb3BlbigpIGFjY2VwdGVkIGEgJ1UnIG1vZGUgc3RyaW5nIGNvbnRhaW5pbmcgJysnLCBidXQgJ1UnIGNhbgorICBvbmx5IGJlIHVzZWQgd2l0aCAncicuIFBhdGNoIGZyb20gSmVmZiBCYWxvZ2ggYW5kIEpvaG4gTydDb25ub3IuCisKKy0gSXNzdWUgIzg1ODU6IGltcHJvdmVkIHRlc3RzIGZvciB6aXBpbXBvcnRlcjIuIFBhdGNoIGZyb20gTWFyayBMYXdyZW5jZS4KKworLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCisgIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCisKKy0gSXNzdWUgIzI0NDI2OiBGYXN0IHNlYXJjaGluZyBvcHRpbWl6YXRpb24gaW4gcmVndWxhciBleHByZXNzaW9ucyBub3cgd29ya3MKKyAgZm9yIHBhdHRlcm5zIHRoYXQgc3RhcnRzIHdpdGggY2FwdHVyaW5nIGdyb3Vwcy4gIEZhc3Qgc2VhcmNoaW5nIG9wdGltaXphdGlvbgorICBub3cgY2FuJ3QgYmUgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgorCistIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCisgIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCisKKy0gSXNzdWUgIzEzMjQ4OiBSZW1vdmUgZGVwcmVjYXRlZCBpbnNwZWN0LmdldGFyZ3NwZWMgYW5kIGluc3BlY3QuZ2V0bW9kdWxlaW5mbworICBmdW5jdGlvbnMuCisKKy0gSXNzdWUgIzI1NTc4OiBGaXggKGFub3RoZXIpIG1lbW9yeSBsZWFrIGluIFNTTFNvY2tldC5nZXRwZWVyY2VyKCkuCisKKy0gSXNzdWUgIzI1NTMwOiBEaXNhYmxlIHRoZSB2dWxuZXJhYmxlIFNTTHYzIHByb3RvY29sIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZworICBzc2wuU1NMQ29udGV4dC4KKworLSBJc3N1ZSAjMjU1Njk6IEZpeCBtZW1vcnkgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKS4KKworLSBJc3N1ZSAjMjU0NzE6IFNvY2tldHMgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKSBzaG91bGRuJ3QgYXBwZWFyIHRvIGJlCisgIG5vbmJsb2NraW5nLgorCistIElzc3VlICMyNTMxOTogV2hlbiB0aHJlYWRpbmcuRXZlbnQgaXMgcmVpbml0aWFsaXplZCwgdGhlIHVuZGVybHlpbmcgY29uZGl0aW9uCisgIHNob3VsZCB1c2UgYSByZWd1bGFyIGxvY2sgcmF0aGVyIHRoYW4gYSByZWN1cnNpdmUgbG9jay4KKworSURMRQorLS0tLQorCistIElzc3VlIDE1MzQ4OiBTdG9wIHRoZSBkZWJ1Z2dlciBlbmdpbmUgKG5vcm1hbGx5IGluIGEgdXNlciBwcm9jZXNzKQorICBiZWZvcmUgY2xvc2luZyB0aGUgZGVidWdnZXIgd2luZG93IChydW5uaW5nIGluIHRoZSBJRExFIHByb2Nlc3MpLgorICBUaGlzIHByZXZlbnRzIHRoZSBSdW50aW1lRXJyb3JzIHRoYXQgd2VyZSBiZWluZyBjYXVnaHQgYW5kIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI0NDU1OiBQcmV2ZW50IElETEUgZnJvbSBoYW5naW5nIHdoZW4gYSkgY2xvc2luZyB0aGUgc2hlbGwgd2hpbGUgdGhlCisgIGRlYnVnZ2VyIGlzIGFjdGl2ZSAoMTUzNDcpOyBiKSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aXRoIHRoZSBbWF0gYnV0dG9uCisgICgxNTM0OCk7IGFuZCBjKSBhY3RpdmF0aW5nIHRoZSBkZWJ1Z2dlciB3aGVuIGFscmVhZHkgYWN0aXZlICgyNDQ1NSkuCisgIFRoZSBwYXRjaCBieSBNYXJrIFJvc2VtYW4gZG9lcyB0aGlzIGJ5IG1ha2luZyB0d28gY2hhbmdlcy4KKyAgMS4gU3VzcGVuZCBhbmQgcmVzdW1lIHRoZSBndWkuaW50ZXJhY3Rpb24gbWV0aG9kIHdpdGggdGhlIHRjbCB2d2FpdAorICBtZWNoYW5pc20gaW50ZW5kZWQgZm9yIHRoaXMgcHVycG9zZSAoaW5zdGVhZCBvZiByb290Lm1haW5sb29wICYgLnF1aXQpLgorICAyLiBJbiBndWkucnVuLCBhbGxvdyBhbnkgZXhpc3RpbmcgaW50ZXJhY3Rpb24gdG8gdGVybWluYXRlIGZpcnN0LgorCistIENoYW5nZSAnVGhlIHByb2dyYW0nIHRvICdZb3VyIHByb2dyYW0nIGluIGFuIElETEUgJ2tpbGwgcHJvZ3JhbT8nIG1lc3NhZ2UKKyAgdG8gbWFrZSBpdCBjbGVhcmVyIHRoYXQgdGhlIHByb2dyYW0gcmVmZXJyZWQgdG8gaXMgdGhlIGN1cnJlbnRseSBydW5uaW5nCisgIHVzZXIgcHJvZ3JhbSwgbm90IElETEUgaXRzZWxmLgorCistIElzc3VlICMyNDc1MDogSW1wcm92ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgSURMRSBlZGl0b3Igd2luZG93IHN0YXR1cyBiYXIuCisgIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUzMTM6IENoYW5nZSB0aGUgaGFuZGxpbmcgb2YgbmV3IGJ1aWx0LWluIHRleHQgY29sb3IgdGhlbWVzIHRvIGJldHRlcgorICBhZGRyZXNzIHRoZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gaW50cm9kdWNlZCBieSB0aGUgYWRkaXRpb24gb2YgSURMRSBEYXJrLgorICBDb25zaXN0ZW50bHkgdXNlIHRoZSByZXZpc2VkIGlkbGVDb25mLkN1cnJlbnRUaGVtZSBldmVyeXdoZXJlIGluIGlkbGVsaWIuCisKKy0gSXNzdWUgIzI0NzgyOiBFeHRlbnNpb24gY29uZmlndXJhdGlvbiBpcyBub3cgYSB0YWIgaW4gdGhlIElETEUgUHJlZmVyZW5jZXMKKyAgZGlhbG9nIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgZGlhbG9nLiAgVGhlIGZvcm1lciB0YWJzIGFyZSBub3cgYSBzb3J0ZWQKKyAgbGlzdC4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjI3MjY6IFJlLWFjdGl2YXRlIHRoZSBjb25maWcgZGlhbG9nIGhlbHAgYnV0dG9uIHdpdGggc29tZSBjb250ZW50CisgIGFib3V0IHRoZSBvdGhlciBidXR0b25zIGFuZCB0aGUgbmV3IElETEUgRGFyayB0aGVtZS4KKworLSBJc3N1ZSAjMjQ4MjA6IElETEUgbm93IGhhcyBhbiAnSURMRSBEYXJrJyBidWlsdC1pbiB0ZXh0IGNvbG9yIHRoZW1lLgorICBJdCBpcyBtb3JlIG9yIGxlc3MgSURMRSBDbGFzc2ljIGludmVydGVkLCB3aXRoIGEgY29iYWx0IGJsdWUgYmFja2dyb3VuZC4KKyAgU3RyaW5ncywgY29tbWVudHMsIGtleXdvcmRzLCAuLi4gYXJlIHN0aWxsIGdyZWVuLCByZWQsIG9yYW5nZSwgLi4uIC4KKyAgVG8gdXNlIGl0IHdpdGggSURMRXMgcmVsZWFzZWQgYmVmb3JlIE5vdmVtYmVyIDIwMTUsIGhpdCB0aGUKKyAgJ1NhdmUgYXMgTmV3IEN1c3RvbSBUaGVtZScgYnV0dG9uIGFuZCBlbnRlciBhIG5ldyBuYW1lLAorICBzdWNoIGFzICdDdXN0b20gRGFyaycuICBUaGUgY3VzdG9tIHRoZW1lIHdpbGwgd29yayB3aXRoIGFueSBJRExFCisgIHJlbGVhc2UsIGFuZCBjYW4gYmUgbW9kaWZpZWQuCisKKy0gSXNzdWUgIzI1MjI0OiBSRUFETUUudHh0IGlzIG5vdyBhbiBpZGxlbGliIGluZGV4IGZvciBJRExFIGRldmVsb3BlcnMgYW5kCisgIGN1cmlvdXMgdXNlcnMuICBUaGUgcHJldmlvdXMgdXNlciBjb250ZW50IGlzIG5vdyBpbiB0aGUgSURMRSBkb2MgY2hhcHRlci4KKyAgJ0lETEUnIG5vdyBtZWFucyAnSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBhbmQgTGVhcm5pbmcgRW52aXJvbm1lbnQnLgorCistIElzc3VlICMyNDgyMDogVXNlcnMgY2FuIG5vdyBzZXQgYnJlYWtwb2ludCBjb2xvcnMgaW4KKyAgU2V0dGluZ3MgLT4gQ3VzdG9tIEhpZ2hsaWdodGluZy4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ5NzI6IEluYWN0aXZlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIG5vdyBtYXRjaGVzIGFjdGl2ZSBzZWxlY3Rpb24KKyAgYmFja2dyb3VuZCwgYXMgY29uZmlndXJlZCBieSB1c2Vycywgb24gYWxsIHN5c3RlbXMuICBGb3VuZCBpdGVtcyBhcmUgbm93CisgIGFsd2F5cyBoaWdobGlnaHRlZCBvbiBXaW5kb3dzLiAgSW5pdGlhbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0NTcwOiBJZGxlOiBtYWtlIGNhbGx0aXAgYW5kIGNvbXBsZXRpb24gYm94ZXMgYXBwZWFyIG9uIE1hY3MKKyAgYWZmZWN0ZWQgYnkgYSB0ayByZWdyZXNzaW9uLiAgSW5pdGlhbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0OTg4OiBJZGxlIFNjcm9sbGVkTGlzdCBjb250ZXh0IG1lbnVzICh1c2VkIGluIGRlYnVnZ2VyKQorICBub3cgd29yayBvbiBNYWMgQXF1YS4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ4MDE6IE1ha2UgcmlnaHQtY2xpY2sgZm9yIGNvbnRleHQgbWVudSB3b3JrIG9uIE1hYyBBcXVhLgorICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MTczOiBBc3NvY2lhdGUgdGtpbnRlciBtZXNzYWdlYm94ZXMgd2l0aCBhIHNwZWNpZmljIHdpZGdldC4KKyAgRm9yIE1hYyBPU1gsIG1ha2UgdGhlbSBhICdzaGVldCcuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MTk4OiBFbmhhbmNlIHRoZSBpbml0aWFsIGh0bWwgdmlld2VyIG5vdyB1c2VkIGZvciBJZGxlIEhlbHAuCisgICogUHJvcGVybHkgaW5kZW50IGZpeGVkLXBpdGNoIHRleHQgKHBhdGNoIGJ5IE1hcmsgUm9zZW1hbikuCisgICogR2l2ZSBjb2RlIHNuaXBwZXQgYSB2ZXJ5IFNwaGlueC1saWtlIGxpZ2h0IGJsdWVpc2gtZ3JheSBiYWNrZ3JvdW5kLgorICAqIFJlLXVzZSBpbml0aWFsIHdpZHRoIGFuZCBoZWlnaHQgc2V0IGJ5IHVzZXJzIGZvciBzaGVsbCBhbmQgZWRpdG9yLgorICAqIFdoZW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzIChUT0MpIG1lbnUgaXMgdXNlZCwgcHV0IHRoZSBzZWN0aW9uIGhlYWRlcgorICBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uCisKKy0gSXNzdWUgIzI1MjI1OiBDb25kZW5zZSBhbmQgcmV3cml0ZSBJZGxlIGRvYyBzZWN0aW9uIG9uIHRleHQgY29sb3JzLgorCistIElzc3VlICMyMTk5NTogRXhwbGFpbiBzb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gSURMRSBhbmQgY29uc29sZSBQeXRob24uCisKKy0gSXNzdWUgIzIyODIwOiBFeHBsYWluIG5lZWQgZm9yICpwcmludCogd2hlbiBydW5uaW5nIGZpbGUgZnJvbSBJZGxlIGVkaXRvci4KKworLSBJc3N1ZSAjMjUyMjQ6IERvYzogYXVnbWVudCBJZGxlIGZlYXR1cmUgbGlzdCBhbmQgbm8tc3VicHJvY2VzcyBzZWN0aW9uLgorCistIElzc3VlICMyNTIxOTogVXBkYXRlIGRvYyBmb3IgSWRsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgU29tZSB3ZXJlIG1pc3NpbmcgYW5kIG5vdGVzIHdlcmUgbm90IGNvcnJlY3QuCisKKy0gSXNzdWUgIzI0ODYxOiBNb3N0IG9mIGlkbGVsaWIgaXMgcHJpdmF0ZSBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCisgIFVzZSBpZGxlaWIuaWRsZS4qIHRvIHN0YXJ0IElkbGUuIFNlZSBpZGxlbGliLl9faW5pdF9fLl9fZG9jX18uCisKKy0gSXNzdWUgIzI1MTk5OiBJZGxlOiBhZGQgc3luY2hyb25pemF0aW9uIGNvbW1lbnRzIGZvciBmdXR1cmUgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzE2ODkzOiBSZXBsYWNlIGhlbHAudHh0IHdpdGggaGVscC5odG1sIGZvciBJZGxlIGRvYyBkaXNwbGF5LgorICBUaGUgbmV3IGlkbGVsaWIvaGVscC5odG1sIGlzIHJzdHJpcHBlZCBEb2MvYnVpbGQvaHRtbC9saWJyYXJ5L2lkbGUuaHRtbC4KKyAgSXQgbG9va3MgYmV0dGVyIHRoYW4gaGVscC50eHQgYW5kIHdpbGwgYmV0dGVyIGRvY3VtZW50IElkbGUgYXMgcmVsZWFzZWQuCisgIFRoZSB0a2ludGVyIGh0bWwgdmlld2VyIHRoYXQgd29ya3MgZm9yIHRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb3NlIFJvc2VtYW4uCisgIFRoZSBub3cgdW51c2VkIEVkaXRvcldpbmRvdy5IZWxwRGlhbG9nIGNsYXNzIGFuZCBoZWx0LnR4dCBmaWxlIGFyZSBkZXByZWNhdGVkLgorCistIElzc3VlICMyNDE5OTogRGVwcmVjYXRlIHVudXNlZCBpZGxlbGliLmlkbGV2ZXIgd2l0aCBwb3NzaWJsZSByZW1vdmFsIGluIDMuNi4KKworLSBJc3N1ZSAjMjQ3OTA6IFJlbW92ZSBleHRyYW5lb3VzIGNvZGUgKHdoaWNoIGFsc28gY3JlYXRlIDIgJiAzIGNvbmZsaWN0cykuCisKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMjU1MDA6IEZpeCBkb2N1bWVudGF0aW9uIHRvIG5vdCBjbGFpbSB0aGF0IF9faW1wb3J0X18gaXMgc2VhcmNoZWQgZm9yCi0gIGluIHRoZSBnbG9iYWwgc2NvcGUuCistIElzc3VlICMyNDk1MjogQ2xhcmlmeSB0aGUgZGVmYXVsdCBzaXplIGFyZ3VtZW50IG9mIHN0YWNrX3NpemUoKSBpbgorICB0aGUgInRocmVhZGluZyIgYW5kICJfdGhyZWFkIiBtb2R1bGVzLiBQYXRjaCBmcm9tIE1hdHRpcC4KIAogVGVzdHMKIC0tLS0tCkBAIC0xMTEsNiArNTIyLDIzIEBACiAtIElzc3VlICMyNTYxNjogVGVzdHMgZm9yIE9yZGVyZWREaWN0IGFyZSBleHRyYWN0ZWQgZnJvbSB0ZXN0X2NvbGxlY3Rpb25zCiAgIGludG8gc2VwYXJhdGUgZmlsZSB0ZXN0X29yZGVyZWRfZGljdC4KIAorLSBJc3N1ZSAjMjU0NDk6IEFkZGVkIHRlc3RzIGZvciBPcmRlcmVkRGljdCBzdWJjbGFzc2VzLgorCistIElzc3VlICMyNTE4ODogQWRkIC1QLy0tcGdvIHRvIHRlc3QucmVncnRlc3QgdG8gc3VwcHJlc3MgZXJyb3Igb3V0cHV0IHdoZW4KKyAgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGEgUEdPIGJ1aWxkLiBJbml0aWFsIHBhdGNoIGJ5CisgIEFsZWNzYW5kcnUgUGF0cmFzY3UuCisKKy0gSXNzdWUgIzIyODA2OiBBZGQgYGBweXRob24gLW0gdGVzdCAtLWxpc3QtdGVzdHNgYCBjb21tYW5kIHRvIGxpc3QgdGVzdHMuCisKKy0gSXNzdWUgIzE4MTc0OiBgYHB5dGhvbiAtbSB0ZXN0IC0taHVudHJsZWFrcyAuLi5gYCBub3cgYWxzbyBjaGVja3MgZm9yIGxlYWsgb2YKKyAgZmlsZSBkZXNjcmlwdG9ycy4gUGF0Y2ggd3JpdHRlbiBieSBSaWNoYXJkIE91ZGtlcmsuCisKKy0gSXNzdWUgIzI1MjYwOiBGaXggYGBweXRob24gLW0gdGVzdCAtLWNvdmVyYWdlYGAgb24gV2luZG93cy4gUmVtb3ZlIHRoZQorICBsaXN0IG9mIGlnbm9yZWQgZGlyZWN0b3JpZXMuCisKKy0gYGBQQ2J1aWxkXHJ0LmJhdGBgIG5vdyBhY2NlcHRzIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHBhc3MgYWxvbmcKKyAgdG8gcmVncnRlc3QucHkuICBQcmV2aW91c2x5IHRoZXJlIHdhcyBhIGxpbWl0IG9mIDkuCisKIEJ1aWxkCiAtLS0tLQogCkBAIC0xMTksOCArNTQ3LDI0IEBACiAKIC0gSXNzdWUgIzI1Njk2OiBGaXggaW5zdGFsbGF0aW9uIG9mIFB5dGhvbiBvbiBVTklYIHdpdGggbWFrZSAtajkuCiAKKy0gSXNzdWUgIzI0OTg2OiBJdCBpcyBub3cgcG9zc2libGUgdG8gYnVpbGQgUHl0aG9uIG9uIFdpbmRvd3Mgd2l0aG91dCBlcnJvcnMKKyAgd2hlbiBleHRlcm5hbCBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUuCisKIC0gSXNzdWUgIzI1Nzk4OiBVcGRhdGUgT1MgWCAxMC41IGluc3RhbGxlciB0byB1c2UgT3BlblNTTCAxLjAuMmUuCiAKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjUwMjI6IFJlbW92ZWQgdmVyeSBvdXRkYXRlZCBQQy9leGFtcGxlX250LyBkaXJlY3RvcnkuCisKK1Rvb2xzL0RlbW9zCistLS0tLS0tLS0tLQorCistIElzc3VlICMyNTQ0MDogRml4IG91dHB1dCBvZiBweXRob24tY29uZmlnIC0tZXh0ZW5zaW9uLXN1ZmZpeC4KKworLSBJc3N1ZSAjMjUxNTQ6IFRoZSBweXZlbnYgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mCisgIGBweXRob24zIC1tIHZlbnZgLgorCiAKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4xIGZpbmFsPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC04NzAsMTIgKzEzMTQsNiBAQAogCiAtIElzc3VlICMyNDYzMTogRml4ZWQgcmVncmVzc2lvbiBpbiB0aGUgdGltZWl0IG1vZHVsZSB3aXRoIG11bHRpbGluZSBzZXR1cC4KIAotLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCi0gIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCi0KLS0gSXNzdWUgIzIzNjYxOiB1bml0dGVzdC5tb2NrIHNpZGVfZWZmZWN0cyBjYW4gbm93IGJlIGV4Y2VwdGlvbnMgYWdhaW4uIFRoaXMKLSAgd2FzIGEgcmVncmVzc2lvbiB2cyBQeXRob24gMy40LiBQYXRjaCBmcm9tIElnbmFjaW8gUm9zc2kKLQogLSBJc3N1ZSAjMjQ2MDg6IGNodW5rLkNodW5rLnJlYWQoKSBub3cgYWx3YXlzIHJldHVybnMgYnl0ZXMsIG5vdCBzdHIuCiAKIC0gSXNzdWUgIzE4Njg0OiBGaXhlZCByZWFkaW5nIG91dCBvZiB0aGUgYnVmZmVyIGluIHRoZSByZSBtb2R1bGUuCkBAIC04ODYsNiArMTMyNCw5IEBACiAtIElzc3VlICMxNTAxNDogU01UUC5hdXRoKCkgYW5kIFNNVFAubG9naW4oKSBub3cgc3VwcG9ydCBSRkMgNDk1NCdzIG9wdGlvbmFsCiAgIGluaXRpYWwtcmVzcG9uc2UgYXJndW1lbnQgdG8gdGhlIFNNVFAgQVVUSCBjb21tYW5kLgogCistIElzc3VlICM2NTQ5OiBSZW1vdmUgaHlwaGVuIGZyb20gdHRrLlN0eWxlKCkuZWxlbWVudCBvcHRpb25zLiAgT25seSByZXR1cm4gcmVzdWx0CisgIGZyb20gdHRrLlN0eWxlKCkuY29uZmlndXJlIGlmIGEgcmVzdWx0IHdhcyBnZW5lcmF0ZWQgb3IgYSBxdWVyeSBzdWJtaXR0ZWQuCisKIC0gSXNzdWUgIzI0NjY5OiBGaXggaW5zcGVjdC5nZXRzb3VyY2UoKSBmb3IgJ2FzeW5jIGRlZicgZnVuY3Rpb25zLgogICBQYXRjaCBieSBLYWkgR3JvbmVyLgogCkBAIC04OTcsNyArMTMzOCw2IEBACiAtIElzc3VlICMyNDYwMzogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIGFuZCBPUyBYIDEwLjUgaW5zdGFsbGVyIHRvIHVzZSBPcGVuU1NMCiAgIDEuMC4yZC4KIAotCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMCBiZXRhIDM/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTEwNTgsNiArMTQ5OCw5IEBACiAtIElzc3VlICMyNDI2ODogUEVQIDQ4OTogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbi4KICAgUGF0Y2ggYnkgUGV0ciBWaWt0b3Jpbi4KIAorLSBJc3N1ZSAjMjMzNTk6IE9wdGltaXplIHNldCBvYmplY3QgaW50ZXJuYWxzIGJ5IHNwZWNpYWxpemluZyB0aGUKKyAgaGFzaCB0YWJsZSBzZWFyY2ggaW50byBhIGxvb2t1cCBmdW5jdGlvbiBhbmQgYW4gaW5zZXJ0IGZ1bmN0aW9uLgorCiAtIElzc3VlICMyMzk1NTogQWRkIHB5dmVudi5jZmcgb3B0aW9uIHRvIHN1cHByZXNzIHJlZ2lzdHJ5L2Vudmlyb25tZW50CiAgIGxvb2t1cCBmb3IgZ2VuZXJhdGluZyBzeXMucGF0aCBvbiBXaW5kb3dzLgogCmRpZmYgLS1naXQgYS9NaXNjL1NwZWNpYWxCdWlsZHMudHh0IGIvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAppbmRleCAzMDA0MTc0Li40YjY3M2ZkIDEwMDY0NAotLS0gYS9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CisrKyBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKQEAgLTY1LDkgKzY1LDkgQEAKICAgICBzaW1wbHkgYnkgdmlydHVlIG9mIGJlaW5nIGluIHRoZSBsaXN0LgogCiBlbnZ2YXIgUFlUSE9ORFVNUFJFRlMKLSAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIFB5X0ZpbmFsaXplKCkgYXJyYW5nZXMgdG8gcHJpbnQgYSBsaXN0IG9mIGFsbAorICAgIElmIHRoaXMgZW52dmFyIGV4aXN0cywgUHlfRmluYWxpemVFeCgpIGFycmFuZ2VzIHRvIHByaW50IGEgbGlzdCBvZiBhbGwKICAgICBzdGlsbC1saXZlIGhlYXAgb2JqZWN0cy4gIFRoaXMgaXMgcHJpbnRlZCB0d2ljZSwgaW4gZGlmZmVyZW50IGZvcm1hdHMsCi0gICAgYmVmb3JlIGFuZCBhZnRlciBQeV9GaW5hbGl6ZSBoYXMgY2xlYW5lZCB1cCBldmVyeXRoaW5nIGl0IGNhbiBjbGVhbiB1cC4gIFRoZQorICAgIGJlZm9yZSBhbmQgYWZ0ZXIgUHlfRmluYWxpemVFeCBoYXMgY2xlYW5lZCB1cCBldmVyeXRoaW5nIGl0IGNhbiBjbGVhbiB1cC4gIFRoZQogICAgIGZpcnN0IG91dHB1dCBibG9jayBwcm9kdWNlcyB0aGUgcmVwcigpIG9mIGVhY2ggb2JqZWN0IHNvIGlzIG1vcmUKICAgICBpbmZvcm1hdGl2ZTsgaG93ZXZlciwgYSBsb3Qgb2Ygc3R1ZmYgZGVzdGluZWQgdG8gZGllIGlzIHN0aWxsIGFsaXZlIHRoZW4uCiAgICAgVGhlIHNlY29uZCBvdXRwdXQgYmxvY2sgaXMgbXVjaCBoYXJkZXIgdG8gd29yayB3aXRoIChyZXByKCkgY2FuJ3QgYmUgaW52b2tlZApAQCAtMTQ0LDcgKzE0NCw3IEBACiAKIGVudnZhciBQWVRIT05NQUxMT0NTVEFUUwogICAgIElmIHRoaXMgZW52dmFyIGV4aXN0cywgYSByZXBvcnQgb2YgcHltYWxsb2Mgc3VtbWFyeSBzdGF0aXN0aWNzIGlzIHByaW50ZWQgdG8KLSAgICBzdGRlcnIgd2hlbmV2ZXIgYSBuZXcgYXJlbmEgaXMgYWxsb2NhdGVkLCBhbmQgYWxzbyBieSBQeV9GaW5hbGl6ZSgpLgorICAgIHN0ZGVyciB3aGVuZXZlciBhIG5ldyBhcmVuYSBpcyBhbGxvY2F0ZWQsIGFuZCBhbHNvIGJ5IFB5X0ZpbmFsaXplRXgoKS4KIAogQ2hhbmdlZCBpbiAyLjU6ICBUaGUgbnVtYmVyIG9mIGV4dHJhIGJ5dGVzIGFsbG9jYXRlZCBpcyA0KnNpemVvZihzaXplX3QpLgogQmVmb3JlIGl0IHdhcyAxNiBvbiBhbGwgYm94ZXMsIHJlZmxlY3RpbmcgdGhhdCBQeXRob24gY291bGRuJ3QgbWFrZSB1c2Ugb2YKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAqLwogICAgIGludCB0cF9tYXhhbGxvYzsKIAotQWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGNvZGUga2VlcHMgdGhlc2UgY291bnRzIHVwIHRvIGRhdGUuICBQeV9GaW5hbGl6ZSgpCitBbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gY29kZSBrZWVwcyB0aGVzZSBjb3VudHMgdXAgdG8gZGF0ZS4gIFB5X0ZpbmFsaXplRXgoKQogZGlzcGxheXMgYSBzdW1tYXJ5IG9mIHRoZSBpbmZvIHJldHVybmVkIGJ5IHN5cy5nZXRjb3VudHMoKSAoc2VlIGJlbG93KSwgYWxvbmcKIHdpdGggYXNzb3J0ZWQgb3RoZXIgc3BlY2lhbCBhbGxvY2F0aW9uIGNvdW50cyAobGlrZSB0aGUgbnVtYmVyIG9mIHR1cGxlCiBhbGxvY2F0aW9ucyBzYXRpc2ZpZWQgYnkgYSB0dXBsZSBmcmVlLWxpc3QsIHRoZSBudW1iZXIgb2YgMS1jaGFyYWN0ZXIgc3RyaW5ncwpkaWZmIC0tZ2l0IGEvTWlzYy9jb3Zlcml0eV9tb2RlbC5jIGIvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCmluZGV4IDQ5M2U3YzEuLmY3NzZkNzYgMTAwNjQ0Ci0tLSBhL01pc2MvY292ZXJpdHlfbW9kZWwuYworKysgYi9NaXNjL2NvdmVyaXR5X21vZGVsLmMKQEAgLTk0LDcgKzk0LDcgQEAKIH0KIAogLyogUGFyc2VyL3BnZW5tYWluLmMgKi8KLWdyYW1tYXIgKmdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpCitncmFtbWFyICpnZXRncmFtbWFyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogICAgIGdyYW1tYXIgKmc7CiAgICAgX19jb3Zlcml0eV90YWludGVkX2RhdGFfc2lua19fKGZpbGVuYW1lKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMgYi9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCmluZGV4IDRmZmZlMDEuLjZhNTM1ODQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwpAQCAtMTEwLDI5ICsxMTAsMTggQEAKICNkZWZpbmUgQ0hFQ0tfTk9UX0VORChsaW5rKQogI2VuZGlmCiAKLS8qIFRvIHByZXZlbnQgbGVuIGZyb20gb3ZlcmZsb3dpbmcgUFlfU1NJWkVfVF9NQVgsIHdlIHJlZnVzZSB0bwotICAgYWxsb2NhdGUgbmV3IGJsb2NrcyBpZiB0aGUgY3VycmVudCBsZW4gaXMgbmVhcmluZyBvdmVyZmxvdy4KLSovCi0KLSNkZWZpbmUgTUFYX0RFUVVFX0xFTiAoUFlfU1NJWkVfVF9NQVggLSAzKkJMT0NLTEVOKQotCiAvKiBBIHNpbXBsZSBmcmVlbGlzdGluZyBzY2hlbWUgaXMgdXNlZCB0byBtaW5pbWl6ZSBjYWxscyB0byB0aGUgbWVtb3J5CiAgICBhbGxvY2F0b3IuICBJdCBhY2NvbW1vZGF0ZXMgY29tbW9uIHVzZSBjYXNlcyB3aGVyZSBuZXcgYmxvY2tzIGFyZSBiZWluZwogICAgYWRkZWQgYXQgYWJvdXQgdGhlIHNhbWUgcmF0ZSBhcyBvbGQgYmxvY2tzIGFyZSBiZWluZyBmcmVlZC4KICAqLwogCi0jZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTAKKyNkZWZpbmUgTUFYRlJFRUJMT0NLUyAxNgogc3RhdGljIFB5X3NzaXplX3QgbnVtZnJlZWJsb2NrcyA9IDA7CiBzdGF0aWMgYmxvY2sgKmZyZWVibG9ja3NbTUFYRlJFRUJMT0NLU107CiAKIHN0YXRpYyBibG9jayAqCi1uZXdibG9jayhQeV9zc2l6ZV90IGxlbikgeworbmV3YmxvY2sodm9pZCkgewogICAgIGJsb2NrICpiOwotICAgIGlmIChsZW4gPj0gTUFYX0RFUVVFX0xFTikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgYmxvY2tzIHRvIHRoZSBkZXF1ZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAgICAgaWYgKG51bWZyZWVibG9ja3MpIHsKICAgICAgICAgbnVtZnJlZWJsb2Nrcy0tOwogICAgICAgICByZXR1cm4gZnJlZWJsb2Nrc1tudW1mcmVlYmxvY2tzXTsKQEAgLTE1NiwxMiArMTQ1LDYgQEAKICAgICB9CiB9CiAKLS8qIFhYWCBUb2RvOgotICAgSWYgYWxpZ25lZCBtZW1vcnkgYWxsb2NhdGlvbnMgYmVjb21lIGF2YWlsYWJsZSwgbWFrZSB0aGUKLSAgIGRlcXVlIG9iamVjdCA2NCBieXRlIGFsaWduZWQgc28gdGhhdCBhbGwgb2YgdGhlIGZpZWxkcwotICAgY2FuIGJlIHJldHJpZXZlZCBvciB1cGRhdGVkIGluIGEgc2luZ2xlIGNhY2hlIGxpbmUuCi0qLwotCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpAQCAtMTczLDcgKzE1Niw3IEBACiAgICAgaWYgKGRlcXVlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgYiA9IG5ld2Jsb2NrKDApOworICAgIGIgPSBuZXdibG9jaygpOwogICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yMDksNyArMTkyLDcgQEAKICAgICBQeV9TSVpFKGRlcXVlKS0tOwogICAgIGRlcXVlLT5zdGF0ZSsrOwogCi0gICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IC0xKSB7CisgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4IDwgMCkgewogICAgICAgICBpZiAoUHlfU0laRShkZXF1ZSkpIHsKICAgICAgICAgICAgIHByZXZibG9jayA9IGRlcXVlLT5yaWdodGJsb2NrLT5sZWZ0bGluazsKICAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKQEAgLTI3Miw0MCArMjU1LDIyIEBACiAvKiBUaGUgZGVxdWUncyBzaXplIGxpbWl0IGlzIGQubWF4bGVuLiAgVGhlIGxpbWl0IGNhbiBiZSB6ZXJvIG9yIHBvc2l0aXZlLgogICogSWYgdGhlcmUgaXMgbm8gbGltaXQsIHRoZW4gZC5tYXhsZW4gPT0gLTEuCiAgKgotICogQWZ0ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byBhIGRlcXVlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaGFzIGdyb3duIHBhc3QKLSAqIHRoZSBsaW1pdC4gSWYgaXQgaGFzLCB3ZSBnZXQgdGhlIHNpemUgYmFjayBkb3duIHRvIHRoZSBsaW1pdCBieSBwb3BwaW5nIGFuCi0gKiBpdGVtIG9mZiBvZiB0aGUgb3Bwb3NpdGUgZW5kLiAgVGhlIG1ldGhvZHMgdGhhdCBjYW4gdHJpZ2dlciB0aGlzIGFyZSBhcHBlbmQoKSwKLSAqIGFwcGVuZGxlZnQoKSwgZXh0ZW5kKCksIGFuZCBleHRlbmRsZWZ0KCkuCisgKiBBZnRlciBhbiBpdGVtIGlzIGFkZGVkIHRvIGEgZGVxdWUsIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2l6ZSBoYXMKKyAqIGdyb3duIHBhc3QgdGhlIGxpbWl0LiBJZiBpdCBoYXMsIHdlIGdldCB0aGUgc2l6ZSBiYWNrIGRvd24gdG8gdGhlIGxpbWl0CisgKiBieSBwb3BwaW5nIGFuIGl0ZW0gb2ZmIG9mIHRoZSBvcHBvc2l0ZSBlbmQuICBUaGUgbWV0aG9kcyB0aGF0IGNhbgorICogdHJpZ2dlciB0aGlzIGFyZSBhcHBlbmQoKSwgYXBwZW5kbGVmdCgpLCBleHRlbmQoKSwgYW5kIGV4dGVuZGxlZnQoKS4KKyAqCisgKiBUaGUgbWFjcm8gdG8gY2hlY2sgd2hldGhlciBhIGRlcXVlIG5lZWRzIHRvIGJlIHRyaW1tZWQgdXNlcyBhIHNpbmdsZQorICogdW5zaWduZWQgdGVzdCB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciAwIDw9IG1heGxlbiA8IFB5X1NJWkUoZGVxdWUpLgogICovCiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV90cmltX3JpZ2h0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKLSAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KHJ2ICE9IE5VTEwpOwotICAgICAgICBhc3NlcnQoUHlfU0laRShkZXF1ZSkgPD0gZGVxdWUtPm1heGxlbik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGVxdWVfdHJpbV9sZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKLSAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KKyNkZWZpbmUgTkVFRFNfVFJJTShkZXF1ZSwgbWF4bGVuKSAoKHNpemVfdCkobWF4bGVuKSA8IChzaXplX3QpKFB5X1NJWkUoZGVxdWUpKSkKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQogewotICAgIGRlcXVlLT5zdGF0ZSsrOwogICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKLSAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgaWYgKGIgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOwpAQCAtMzE1LDExICsyODAsMTYgQEAKICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CisgICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CiAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOworICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBkZXF1ZS0+bWF4bGVuKSkgeworICAgICAgICBQeU9iamVjdCAqb2xkaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgfQogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCkBAIC0zMjgsOSArMjk4LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0gICAgZGVxdWUtPnN0YXRlKys7CiAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jaygpOwogICAgICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGItPnJpZ2h0bGluayA9IGRlcXVlLT5sZWZ0YmxvY2s7CkBAIC0zNDAsMzcgKzMwOSw1NyBAQAogICAgICAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CiAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CisgICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKKyAgICBpZiAoTkVFRFNfVFJJTShkZXF1ZSwgZGVxdWUtPm1heGxlbikpIHsKKyAgICAgICAgUHlPYmplY3QgKm9sZGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgfQogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kbGVmdF9kb2MsICJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS4iKTsKIAorc3RhdGljIFB5T2JqZWN0KgorZmluYWxpemVfaXRlcmF0b3IoUHlPYmplY3QgKml0KQoreworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KIAogLyogUnVuIGFuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICBTaG9ydGN1dCBmb3IKICAgIHRoZSBleHRlbmQvZXh0ZW5kbGVmdCBtZXRob2RzIHdoZW4gbWF4bGVuID09IDAuICovCiBzdGF0aWMgUHlPYmplY3QqCiBjb25zdW1lX2l0ZXJhdG9yKFB5T2JqZWN0ICppdCkKIHsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAgICAgUHlPYmplY3QgKml0ZW07CiAKLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeV9zc2l6ZV90IG1heGxlbiA9IGRlcXVlLT5tYXhsZW47CiAKICAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCiAgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CkBAIC0zOTUsMTMgKzM4NCwxMyBAQAogICAgIGlmIChpdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IDApCisgICAgaWYgKG1heGxlbiA9PSAwKQogICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CiAKLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgewogICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7Ci0gICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKQEAgLTQxNywxNCArNDA2LDE0IEBACiAgICAgICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CiAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIGRlcXVlX3RyaW1fbGVmdChkZXF1ZSk7CisgICAgICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBtYXhsZW4pKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqb2xkaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4dGVuZF9kb2MsCkBAIC00MzQsNiArNDIzLDggQEAKIGRlcXVlX2V4dGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7CiAgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlfc3NpemVfdCBtYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwogCiAgICAgLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwogICAgIGlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewpAQCAtNDU4LDEzICs0NDksMTMgQEAKICAgICBpZiAoaXQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQorICAgIGlmIChtYXhsZW4gPT0gMCkKICAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOwogCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKICAgICAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CkBAIC00ODAsMTQgKzQ3MSwxNCBAQAogICAgICAgICBQeV9TSVpFKGRlcXVlKSsrOwogICAgICAgICBkZXF1ZS0+bGVmdGluZGV4LS07CiAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotICAgICAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKKyAgICAgICAgaWYgKE5FRURTX1RSSU0oZGVxdWUsIG1heGxlbikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRsZWZ0X2RvYywKQEAgLTUwNiw3ICs0OTcsNDAgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpOworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKQoreworICAgIGRlcXVlb2JqZWN0ICpvbGRfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZTsKKyAgICBpZiAoUHlfVFlQRShkZXF1ZSkgPT0gJmRlcXVlX3R5cGUpIHsKKyAgICAgICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworCisgICAgICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX25ldygmZGVxdWVfdHlwZSwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIGlmIChuZXdfZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuZXdfZGVxdWUtPm1heGxlbiA9IG9sZF9kZXF1ZS0+bWF4bGVuOworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHRoZSBkZXF1ZV9yZXBlYXQoKSBjb21tb24gY2FzZSB3aGVyZSBsZW4oZGVxdWUpID09IDEgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gb2xkX2RlcXVlLT5sZWZ0YmxvY2stPmRhdGFbb2xkX2RlcXVlLT5sZWZ0aW5kZXhdOworICAgICAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmQobmV3X2RlcXVlLCBpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ2ID0gZGVxdWVfZXh0ZW5kKG5ld19kZXF1ZSwgZGVxdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChydiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld19kZXF1ZTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbGRfZGVxdWUtPm1heGxlbiA8IDApCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk8iLCBkZXF1ZSwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPaSIsCisgICAgICAgICAgICBkZXF1ZSwgb2xkX2RlcXVlLT5tYXhsZW4sIE5VTEwpOworfQorCitQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2NvbmNhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICpvdGhlcikKQEAgLTUzNiwzOCArNTYwLDkzIEBACiAgICAgcmV0dXJuIG5ld19kZXF1ZTsKIH0KIAotc3RhdGljIHZvaWQgZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKTsKK3N0YXRpYyB2b2lkCitkZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpCit7CisgICAgYmxvY2sgKmI7CisgICAgYmxvY2sgKnByZXZibG9jazsKKyAgICBibG9jayAqbGVmdGJsb2NrOworICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OworICAgIFB5X3NzaXplX3QgbjsKKyAgICBQeU9iamVjdCAqaXRlbTsKKworICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCisgICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCisgICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCisgICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQorICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKKworICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCisgICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgorICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKKyAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgorICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgorICAgICovCisKKyAgICBiID0gbmV3YmxvY2soKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGdvdG8gYWx0ZXJuYXRlX21ldGhvZDsKKyAgICB9CisKKyAgICAvKiBSZW1lbWJlciB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCAqLworICAgIGxlZnRibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKKyAgICBuID0gUHlfU0laRShkZXF1ZSk7CisKKyAgICAvKiBTZXQgdGhlIGRlcXVlIHRvIGJlIGVtcHR5IHVzaW5nIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KKyAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CisgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKKyAgICBQeV9TSVpFKGRlcXVlKSA9IDA7CisgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQ0VOVEVSOworICAgIGRlcXVlLT5zdGF0ZSsrOworCisgICAgLyogTm93IHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4IGFyZSBkaXNjb25uZWN0ZWQgZnJvbQorICAgICAgIHRoZSBlbXB0eSBkZXF1ZSBhbmQgd2UgY2FuIHVzZSB0aGVtIHRvIGRlY3JlZiB0aGUgcG9pbnRlcnMuCisgICAgKi8KKyAgICB3aGlsZSAobi0tKSB7CisgICAgICAgIGl0ZW0gPSBsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBsZWZ0aW5kZXgrKzsKKyAgICAgICAgaWYgKGxlZnRpbmRleCA9PSBCTE9DS0xFTiAmJiBuKSB7CisgICAgICAgICAgICBDSEVDS19OT1RfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgIHByZXZibG9jayA9IGxlZnRibG9jazsKKyAgICAgICAgICAgIGxlZnRibG9jayA9IGxlZnRibG9jay0+cmlnaHRsaW5rOworICAgICAgICAgICAgbGVmdGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZyZWVibG9jayhwcmV2YmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIENIRUNLX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7CisgICAgZnJlZWJsb2NrKGxlZnRibG9jayk7CisgICAgcmV0dXJuOworCisgIGFsdGVybmF0ZV9tZXRob2Q6CisgICAgd2hpbGUgKFB5X1NJWkUoZGVxdWUpKSB7CisgICAgICAgIGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOworICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCitkZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgLyogWFhYIGFkZCBhIHNwZWNpYWwgY2FzZSBmb3Igd2hlbiBtYXhsZW4gaXMgZGVmaW5lZCAqLwotICAgIGlmIChuIDwgMCkKLSAgICAgICAgbiA9IDA7Ci0gICAgZWxzZSBpZiAobiA+IDAgJiYgUHlfU0laRShkZXF1ZSkgPiBNQVhfREVRVUVfTEVOIC8gbikKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0KLSAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9uZXcoJmRlcXVlX3R5cGUsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOwotICAgIG5ld19kZXF1ZS0+bWF4bGVuID0gZGVxdWUtPm1heGxlbjsKLQotICAgIGZvciAoIDsgbiA7IG4tLSkgewotICAgICAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQobmV3X2RlcXVlLCAoUHlPYmplY3QgKilkZXF1ZSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld19kZXF1ZTsKKyAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKK1B5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLiIpOworCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfaW5wbGFjZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBzaXplOworICAgIFB5X3NzaXplX3QgaSwgbSwgc2l6ZTsKICAgICBQeU9iamVjdCAqc2VxOwogICAgIFB5T2JqZWN0ICpydjsKIApAQCAtNTgzLDI3ICs2NjIsNDcgQEAKICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogICAgIH0KIAotICAgIGlmIChzaXplID4gTUFYX0RFUVVFX0xFTiAvIG4pIHsKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgfQotCiAgICAgaWYgKHNpemUgPT0gMSkgewogICAgICAgICAvKiBjb21tb24gY2FzZSwgcmVwZWF0aW5nIGEgc2luZ2xlIGVsZW1lbnQgKi8KICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdOwogCi0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuICE9IC0xICYmIG4gPiBkZXF1ZS0+bWF4bGVuKQorICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA+PSAwICYmIG4gPiBkZXF1ZS0+bWF4bGVuKQogICAgICAgICAgICAgbiA9IGRlcXVlLT5tYXhsZW47CiAKLSAgICAgICAgZm9yIChpID0gMCA7IGkgPCBuLTEgOyBpKyspIHsKLSAgICAgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChydiA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIGZvciAoaSA9IDAgOyBpIDwgbi0xIDsgKSB7CisgICAgICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7CisgICAgICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jaygpOworICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfU0laRShkZXF1ZSkgKz0gaTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGItPmxlZnRsaW5rID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmspOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgICAgICAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtID0gbiAtIDEgLSBpOworICAgICAgICAgICAgaWYgKG0gPiBCTE9DS0xFTiAtIDEgLSBkZXF1ZS0+cmlnaHRpbmRleCkKKyAgICAgICAgICAgICAgICBtID0gQkxPQ0tMRU4gLSAxIC0gZGVxdWUtPnJpZ2h0aW5kZXg7CisgICAgICAgICAgICBpICs9IG07CisgICAgICAgICAgICB3aGlsZSAobS0tKSB7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXgrKzsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBQeV9TSVpFKGRlcXVlKSArPSBpOwogICAgICAgICBQeV9JTkNSRUYoZGVxdWUpOwogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiAgICAgfQogCisgICAgaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gKHNpemVfdCluKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKwogICAgIHNlcSA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7CiAgICAgaWYgKHNlcSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gc2VxOwpAQCAtNjIxLDYgKzcyMCwyMCBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKIH0KIAorc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKK3sKKyAgICBkZXF1ZW9iamVjdCAqbmV3X2RlcXVlOworICAgIFB5T2JqZWN0ICpydjsKKworICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX2NvcHkoKFB5T2JqZWN0ICopIGRlcXVlKTsKKyAgICBpZiAobmV3X2RlcXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gZGVxdWVfaW5wbGFjZV9yZXBlYXQobmV3X2RlcXVlLCBuKTsKKyAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKKyAgICByZXR1cm4gcnY7Cit9CisKIC8qIFRoZSByb3RhdGUoKSBtZXRob2QgaXMgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgaXMgdXNlZCBpbnRlcm5hbGx5CiBhcyBhIHByaW1pdGl2ZSBmb3Igb3RoZXIgbWV0aG9kcy4KIApAQCAtNjczLDcgKzc4Niw3IEBACiAgICAgd2hpbGUgKG4gPiAwKSB7CiAgICAgICAgIGlmIChsZWZ0aW5kZXggPT0gMCkgewogICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jayhsZW4pOworICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0KQEAgLTcwNCw3ICs4MTcsNyBAQAogICAgICAgICAgICAgICAgICooZGVzdCsrKSA9ICooc3JjKyspOwogICAgICAgICAgICAgfSB3aGlsZSAoLS1tKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmlnaHRpbmRleCA9PSAtMSkgeworICAgICAgICBpZiAocmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgICAgIGFzc2VydChsZWZ0YmxvY2sgIT0gcmlnaHRibG9jayk7CiAgICAgICAgICAgICBhc3NlcnQoYiA9PSBOVUxMKTsKICAgICAgICAgICAgIGIgPSByaWdodGJsb2NrOwpAQCAtNzE3LDcgKzgzMCw3IEBACiAgICAgd2hpbGUgKG4gPCAwKSB7CiAgICAgICAgIGlmIChyaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgewogICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jayhsZW4pOworICAgICAgICAgICAgICAgIGIgPSBuZXdibG9jaygpOwogICAgICAgICAgICAgICAgIGlmIChiID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0KQEAgLTc5MiwxMSArOTA1LDEwIEBACiAgICAgYmxvY2sgKnJpZ2h0YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICBQeV9zc2l6ZV90IGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgUHlfc3NpemVfdCByaWdodGluZGV4ID0gZGVxdWUtPnJpZ2h0aW5kZXg7Ci0gICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSkgLyAyOwotICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKSA+PiAxOwogICAgIFB5T2JqZWN0ICp0bXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIHdoaWxlIChuLS0gPiAwKSB7CiAgICAgICAgIC8qIFZhbGlkYXRlIHRoYXQgcG9pbnRlcnMgaGF2ZW4ndCBtZXQgaW4gdGhlIG1pZGRsZSAqLwogICAgICAgICBhc3NlcnQobGVmdGJsb2NrICE9IHJpZ2h0YmxvY2sgfHwgbGVmdGluZGV4IDwgcmlnaHRpbmRleCk7CiAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrKTsKQEAgLTgxNiw3ICs5MjgsNyBAQAogCiAgICAgICAgIC8qIFN0ZXAgYmFja3dhcmRzIHdpdGggdGhlIHJpZ2h0IGJsb2NrL2luZGV4IHBhaXIgKi8KICAgICAgICAgcmlnaHRpbmRleC0tOwotICAgICAgICBpZiAocmlnaHRpbmRleCA9PSAtMSkgeworICAgICAgICBpZiAocmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgICAgIHJpZ2h0YmxvY2sgPSByaWdodGJsb2NrLT5sZWZ0bGluazsKICAgICAgICAgICAgIHJpZ2h0aW5kZXggPSBCTE9DS0xFTiAtIDE7CiAgICAgICAgIH0KQEAgLTgzMywyMCArOTQ1LDE4IEBACiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpOwotICAgIFB5X3NzaXplX3QgaTsKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKICAgICBzaXplX3Qgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7CiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgaW50IGNtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgd2hpbGUgKG4tLSkgewogICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7Ci0gICAgICAgIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY291bnQgKz0gY21wOwogCiAgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC04NzMsMTIgKzk4MywxMSBAQAogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKTsKLSAgICBQeV9zc2l6ZV90IGk7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIGludCBjbXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIHdoaWxlIChuLS0pIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwogICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwpAQCAtOTA4LDExICsxMDE3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfaW5kZXgoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IGksIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShkZXF1ZSk7CisgICAgUHlfc3NpemVfdCBpLCBuLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoZGVxdWUpOwogICAgIFB5T2JqZWN0ICp2LCAqaXRlbTsKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOworICAgIGludCBjbXA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKQEAgLTkzMCwyMiArMTA0MCwzMiBAQAogICAgIH0KICAgICBpZiAoc3RvcCA+IFB5X1NJWkUoZGVxdWUpKQogICAgICAgICBzdG9wID0gUHlfU0laRShkZXF1ZSk7CisgICAgaWYgKHN0YXJ0ID4gc3RvcCkKKyAgICAgICAgc3RhcnQgPSBzdG9wOworICAgIGFzc2VydCgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IHN0b3AgJiYgc3RvcCA8PSBQeV9TSVpFKGRlcXVlKSk7CiAKLSAgICBmb3IgKGk9MCA7IGk8c3RvcCA7IGkrKykgewotICAgICAgICBpZiAoaSA+PSBzdGFydCkgewotICAgICAgICAgICAgaW50IGNtcDsKLSAgICAgICAgICAgIENIRUNLX05PVF9FTkQoYik7Ci0gICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0gICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwotICAgICAgICAgICAgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgIC8qIFhYWCBSZXBsYWNlIHRoaXMgbG9vcCB3aXRoIGZhc3RlciBjb2RlIGZyb20gZGVxdWVfaXRlbSgpICovCisgICAgZm9yIChpPTAgOyBpPHN0YXJ0IDsgaSsrKSB7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIGlmIChpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG4gPSBzdG9wIC0gaSArIDE7CisgICAgd2hpbGUgKC0tbikgeworICAgICAgICBDSEVDS19OT1RfRU5EKGIpOworICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChzdG9wIC0gbik7CisgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgaWYgKGluZGV4ID09IEJMT0NLTEVOKSB7CkBAIC0xMDM1LDg0ICsxMTU1LDEwIEBACiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKICJELnJlbW92ZSh2YWx1ZSkgLS0gcmVtb3ZlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdmFsdWUuIik7CiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgYmxvY2sgKmI7Ci0gICAgYmxvY2sgKnByZXZibG9jazsKLSAgICBibG9jayAqbGVmdGJsb2NrOwotICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OwotICAgIFB5X3NzaXplX3QgbjsKLSAgICBQeU9iamVjdCAqaXRlbTsKLQotICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCi0gICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCi0gICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCi0gICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQotICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKLQotICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCi0gICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgotICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKLSAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgotICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgotICAgICovCi0KLSAgICBiID0gbmV3YmxvY2soMCk7Ci0gICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBnb3RvIGFsdGVybmF0ZV9tZXRob2Q7Ci0gICAgfQotCi0gICAgLyogUmVtZW1iZXIgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggKi8KLSAgICBsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgIGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0gICAgbiA9IFB5X1NJWkUoZGVxdWUpOwotCi0gICAgLyogU2V0IHRoZSBkZXF1ZSB0byBiZSBlbXB0eSB1c2luZyB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCi0gICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwotICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7Ci0gICAgUHlfU0laRShkZXF1ZSkgPSAwOwotICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKLSAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLSAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKLQotICAgIC8qIE5vdyB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCBhcmUgZGlzY29ubmVjdGVkIGZyb20KLSAgICAgICB0aGUgZW1wdHkgZGVxdWUgYW5kIHdlIGNhbiB1c2UgdGhlbSB0byBkZWNyZWYgdGhlIHBvaW50ZXJzLgotICAgICovCi0gICAgd2hpbGUgKG4tLSkgewotICAgICAgICBpdGVtID0gbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgbGVmdGluZGV4Kys7Ci0gICAgICAgIGlmIChsZWZ0aW5kZXggPT0gQkxPQ0tMRU4gJiYgbikgewotICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBwcmV2YmxvY2sgPSBsZWZ0YmxvY2s7Ci0gICAgICAgICAgICBsZWZ0YmxvY2sgPSBsZWZ0YmxvY2stPnJpZ2h0bGluazsKLSAgICAgICAgICAgIGxlZnRpbmRleCA9IDA7Ci0gICAgICAgICAgICBmcmVlYmxvY2socHJldmJsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDSEVDS19FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOwotICAgIGZyZWVibG9jayhsZWZ0YmxvY2spOwotICAgIHJldHVybjsKLQotICBhbHRlcm5hdGVfbWV0aG9kOgotICAgIHdoaWxlIChQeV9TSVpFKGRlcXVlKSkgewotICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgfQotfQotCiBzdGF0aWMgaW50CiB2YWxpZF9pbmRleChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgbGltaXQpCiB7Ci0gICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldCB1cyB1c2UganVzdCBhIHNpbmdsZSBjb21wYXJpc29uCisgICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldHMgdXMgdXNlIGp1c3QgYSBzaW5nbGUgY29tcGFyaXNvbgogICAgICAgIHRvIGNoZWNrIHdoZXRoZXIgaSBpcyBpbiB0aGUgcmFuZ2U6IDAgPD0gaSA8IGxpbWl0ICovCiAgICAgcmV0dXJuIChzaXplX3QpIGkgPCAoc2l6ZV90KSBsaW1pdDsKIH0KQEAgLTExNzYsNyArMTIyMiw2IEBACiBzdGF0aWMgaW50CiBkZXF1ZV9hc3NfaXRlbShkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0gICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKICAgICBibG9jayAqYjsKICAgICBQeV9zc2l6ZV90IG4sIGxlbj1QeV9TSVpFKGRlcXVlKSwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOwogCkBAIC0xMjAzLDIxICsxMjQ4LDEwIEBACiAgICAgICAgICAgICBiID0gYi0+bGVmdGxpbms7CiAgICAgfQogICAgIFB5X0lOQ1JFRih2KTsKLSAgICBvbGRfdmFsdWUgPSBiLT5kYXRhW2ldOwotICAgIGItPmRhdGFbaV0gPSB2OwotICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X1NFVFJFRihiLT5kYXRhW2ldLCB2KTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2NsZWFybWV0aG9kKGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLiIpOwotCiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7CkBAIC0xMjQxLDYgKzEyNzUsNyBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIFB5X3NzaXplX3QgaW5kZXg7CiAgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4aGlnaDsKIAogICAgIGZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gZGVxdWUtPnJpZ2h0YmxvY2s7IGIgPSBiLT5yaWdodGxpbmspIHsKICAgICAgICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDwgQkxPQ0tMRU4gOyBpbmRleCsrKSB7CkBAIC0xMjQ5LDcgKzEyODQsOCBAQAogICAgICAgICB9CiAgICAgICAgIGluZGV4bG8gPSAwOwogICAgIH0KLSAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gZGVxdWUtPnJpZ2h0aW5kZXg7IGluZGV4KyspIHsKKyAgICBpbmRleGhpZ2ggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gaW5kZXhoaWdoOyBpbmRleCsrKSB7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgUHlfVklTSVQoaXRlbSk7CiAgICAgfQpAQCAtMTI1NywxOCArMTI5Myw2IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAotICAgICAgICAgICAgZGVxdWUsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiwgTlVMTCk7Ci19Ci0KLVB5RG9jX1NUUlZBUihjb3B5X2RvYywgIlJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIGRlcXVlLiIpOwotCi1zdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmVkdWNlKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKICAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKQEAgLTEyODMsMTIgKzEzMDcsMTIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChkaWN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuIDwgMCkKICAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oTykiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbikiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBkZXF1ZS0+bWF4bGVuKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPCAwKQogICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOwpAQCAtMTMxOCw3ICsxMzQyLDcgQEAKICAgICAgICAgUHlfUmVwckxlYXZlKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gIT0gLTEpCisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA+PSAwKQogICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiZGVxdWUoJVIsIG1heGxlbj0lemQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsaXN0LCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4pOwogICAgIGVsc2UKQEAgLTEzNzksNyArMTQwMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKHgpOwogICAgICAgICBQeV9ERUNSRUYoeSk7Ci0gICAgICAgIGlmIChiID09IC0xKQorICAgICAgICBpZiAoYiA8IDApCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogICAgIC8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBvbmUgZGVxdWUgb3IgYm90aCAqLwpAQCAtMTQxNCw4ICsxNDM4LDE0IEBACiAgICAgUHlfc3NpemVfdCBtYXhsZW4gPSAtMTsKICAgICBjaGFyICprd2xpc3RbXSA9IHsiaXRlcmFibGUiLCAibWF4bGVuIiwgMH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RhcmdzLCAifE9POmRlcXVlIiwga3dsaXN0LCAmaXRlcmFibGUsICZtYXhsZW5vYmopKQotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGt3ZGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkZXF1ZSgpIiwgMCwgMiwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RhcmdzLCAifE9POmRlcXVlIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmFibGUsICZtYXhsZW5vYmopKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICBpZiAobWF4bGVub2JqICE9IE5VTEwgJiYgbWF4bGVub2JqICE9IFB5X05vbmUpIHsKICAgICAgICAgbWF4bGVuID0gUHlMb25nX0FzU3NpemVfdChtYXhsZW5vYmopOwogICAgICAgICBpZiAobWF4bGVuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0xNDQ0LDcgKzE0NzQsNyBAQAogICAgIFB5X3NzaXplX3QgYmxvY2tzOwogCiAgICAgcmVzID0gX1B5T2JqZWN0X1NJWkUoUHlfVFlQRShkZXF1ZSkpOwotICAgIGJsb2NrcyA9IChkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgKyBCTE9DS0xFTiAtIDEpIC8gQkxPQ0tMRU47CisgICAgYmxvY2tzID0gKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpICsgQkxPQ0tMRU4gLSAxKSAvIEJMT0NLTEVOOwogICAgIGFzc2VydChkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxID09CiAgICAgICAgICAgIChibG9ja3MgLSAxKSAqIEJMT0NLTEVOICsgZGVxdWUtPnJpZ2h0aW5kZXgpOwogICAgIHJlcyArPSBibG9ja3MgKiBzaXplb2YoYmxvY2spOwpAQCAtMTQ2Myw3ICsxNDkzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9nZXRfbWF4bGVuKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKKyAgICBpZiAoZGVxdWUtPm1heGxlbiA8IDApCiAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QoZGVxdWUtPm1heGxlbik7CiB9CkBAIC0xODA0LDcgKzE4MzQsNyBAQAogICAgIGl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOwogICAgIGl0LT5pbmRleC0tOwogICAgIGl0LT5jb3VudGVyLS07Ci0gICAgaWYgKGl0LT5pbmRleCA9PSAtMSAmJiBpdC0+Y291bnRlciA+IDApIHsKKyAgICBpZiAoaXQtPmluZGV4IDwgMCAmJiBpdC0+Y291bnRlciA+IDApIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChpdC0+Yi0+bGVmdGxpbmspOwogICAgICAgICBpdC0+YiA9IGl0LT5iLT5sZWZ0bGluazsKICAgICAgICAgaXQtPmluZGV4ID0gQkxPQ0tMRU4gLSAxOwpAQCAtMjIzMywxMyArMjI2MywxMyBAQAogCiAgICAgICAgICAgICBvbGR2YWwgPSBfUHlEaWN0X0dldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgaGFzaCk7CiAgICAgICAgICAgICBpZiAob2xkdmFsID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG9uZSwgaGFzaCkgPT0gLTEpCisgICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBvbmUsIGhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuZXd2YWwgPSBQeU51bWJlcl9BZGQob2xkdmFsLCBvbmUpOwogICAgICAgICAgICAgICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgbmV3dmFsLCBoYXNoKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG5ld3ZhbCwgaGFzaCkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICAgICAgUHlfQ0xFQVIobmV3dmFsKTsKICAgICAgICAgICAgIH0KQEAgLTIyNjUsNyArMjI5NSw3IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYob2xkdmFsKTsKICAgICAgICAgICAgIGlmIChuZXd2YWwgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKG1hcHBpbmcsIGtleSwgbmV3dmFsKSA9PSAtMSkKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKG1hcHBpbmcsIGtleSwgbmV3dmFsKSA8IDApCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBQeV9DTEVBUihuZXd2YWwpOwogICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jc3YuYyBiL01vZHVsZXMvX2Nzdi5jCmluZGV4IGZlODUwNjkuLmMwYmU3MzkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2Nzdi5jCisrKyBiL01vZHVsZXMvX2Nzdi5jCkBAIC02MCwxMCArNjAsMTAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFF1b3RlU3R5bGUgc3R5bGU7Ci0gICAgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOwogfSBTdHlsZURlc2M7CiAKLXN0YXRpYyBTdHlsZURlc2MgcXVvdGVfc3R5bGVzW10gPSB7CitzdGF0aWMgY29uc3QgU3R5bGVEZXNjIHF1b3RlX3N0eWxlc1tdID0gewogICAgIHsgUVVPVEVfTUlOSU1BTCwgICAgIlFVT1RFX01JTklNQUwiIH0sCiAgICAgeyBRVU9URV9BTEwsICAgICAgICAiUVVPVEVfQUxMIiB9LAogICAgIHsgUVVPVEVfTk9OTlVNRVJJQywgIlFVT1RFX05PTk5VTUVSSUMiIH0sCkBAIC0yODYsNyArMjg2LDcgQEAKIHN0YXRpYyBpbnQKIGRpYWxlY3RfY2hlY2tfcXVvdGluZyhpbnQgcXVvdGluZykKIHsKLSAgICBTdHlsZURlc2MgKnFzOworICAgIGNvbnN0IFN0eWxlRGVzYyAqcXM7CiAKICAgICBmb3IgKHFzID0gcXVvdGVfc3R5bGVzOyBxcy0+bmFtZTsgcXMrKykgewogICAgICAgICBpZiAoKGludClxcy0+c3R5bGUgPT0gcXVvdGluZykKQEAgLTE2MzMsNyArMTYzMyw3IEBACiBQeUluaXRfX2Nzdih2b2lkKQogewogICAgIFB5T2JqZWN0ICptb2R1bGU7Ci0gICAgU3R5bGVEZXNjICpzdHlsZTsKKyAgICBjb25zdCBTdHlsZURlc2MgKnN0eWxlOwogCiAgICAgaWYgKFB5VHlwZV9SZWFkeSgmRGlhbGVjdF9UeXBlKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggNWNmMmI4Yi4uYzUzOGVjNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC00MzUsNyArNDM1LDcgQEAKICAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYWRkcmVzc19kb2NbXSA9CiAiQy5mcm9tX2FkZHJlc3MoaW50ZWdlcikgLT4gQyBpbnN0YW5jZVxuYWNjZXNzIGEgQyBpbnN0YW5jZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDUzLDcgKzQ1Myw3IEBACiAgICAgcmV0dXJuIFB5Q0RhdGFfQXRBZGRyZXNzKHR5cGUsIGJ1Zik7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYnVmZmVyX2RvY1tdID0KICJDLmZyb21fYnVmZmVyKG9iamVjdCwgb2Zmc2V0PTApIC0+IEMgaW5zdGFuY2VcbmNyZWF0ZSBhIEMgaW5zdGFuY2UgZnJvbSBhIHdyaXRlYWJsZSBidWZmZXIiOwogCiBzdGF0aWMgaW50CkBAIC01MjQsNyArNTI0LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9jb3B5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQogIkMuZnJvbV9idWZmZXJfY29weShvYmplY3QsIG9mZnNldD0wKSAtPiBDIGluc3RhbmNlXG5jcmVhdGUgYSBDIGluc3RhbmNlIGZyb20gYSByZWFkYWJsZSBidWZmZXIiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgaW5fZGxsX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGluX2RsbF9kb2NbXSA9CiAiQy5pbl9kbGwoZGxsLCBuYW1lKSAtPiBDIGluc3RhbmNlXG5hY2Nlc3MgYSBDIGluc3RhbmNlIGluIGEgZGxsIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTYyMyw3ICs2MjMsNyBAQAogICAgIHJldHVybiBQeUNEYXRhX0F0QWRkcmVzcyh0eXBlLCBhZGRyZXNzKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9wYXJhbV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX3BhcmFtX2RvY1tdID0KICJDb252ZXJ0IGEgUHl0aG9uIG9iamVjdCBpbnRvIGEgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAKICovCiAKLXN0YXRpYyBjaGFyICpTSU1QTEVfVFlQRV9DSEFSUyA9ICJjYkJoSGlJbExkZnV6WnFRUFhPdj9nIjsKK3N0YXRpYyBjb25zdCBjaGFyIFNJTVBMRV9UWVBFX0NIQVJTW10gPSAiY2JCaEhpSWxMZGZ1elpxUVBYT3Y/ZyI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3djaGFyX3BfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQpAQCAtMjM5OSw3ICsyMzk5LDcgQEAKICAgICBjaGFyICpjcCA9IHN0cmluZzsKICAgICBzaXplX3QgYnl0ZXNfbGVmdDsKIAotICAgIGFzc2VydChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CiAgICAgY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CiAgICAgd2hpbGUgKHRhcmdldC0+Yl9iYXNlKSB7CiAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2Yoc3RyaW5nKSAtIChjcCAtIHN0cmluZykgLSAxOwpAQCAtMzE5NCw3ICszMTk0LDcgQEAKIH0KIAogc3RhdGljIGludAotX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNoYXIgKipwbmFtZSkKK19nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICoqcG5hbWUpCiB7CiAjaWZkZWYgTVNfV0lOMzIKICAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKQEAgLTMyMjIsNyArMzIyMiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDRnVuY1B0cl9Gcm9tRGxsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CiAgICAgUHlPYmplY3QgKmZ0dXBsZTsKICAgICBQeU9iamVjdCAqZGxsOwpAQCAtNTExNywyOSArNTExNywyOCBAQAogCiAjaWZkZWYgTVNfV0lOMzIKIAotc3RhdGljIGNoYXIgY29tZXJyb3JfZG9jW10gPSAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiI7CitzdGF0aWMgY29uc3QgY2hhciBjb21lcnJvcl9kb2NbXSA9ICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIjsKIAogaW50CiBjb21lcnJvcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgUHlPYmplY3QgKmhyZXN1bHQsICp0ZXh0LCAqZGV0YWlsczsKLSAgICBQeUJhc2VFeGNlcHRpb25PYmplY3QgKmJzZWxmOwogICAgIFB5T2JqZWN0ICphOwogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT086Q09NRXJyb3IiLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAgICAgc3RhdHVzID0gUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiYXJncyIsIGEpOwogICAgIFB5X0RFQ1JFRihhKTsKICAgICBpZiAoc3RhdHVzIDwgMCkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJocmVzdWx0IiwgaHJlc3VsdCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC01MTUwLDkgKzUxNDksOCBAQAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJkZXRhaWxzIiwgZGV0YWlscykgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBic2VsZiA9IChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmOwogICAgIFB5X0lOQ1JFRihhcmdzKTsKLSAgICBQeV9TRVRSRUYoYnNlbGYtPmFyZ3MsIGFyZ3MpOworICAgIFB5X1NFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5hcmdzLCBhcmdzKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCmluZGV4IDdjZDYxNjQuLjAwZThlNjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLVByaW50RXJyb3IoY2hhciAqbXNnLCAuLi4pCitQcmludEVycm9yKGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewogICAgIGNoYXIgYnVmWzUxMl07CiAgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwppbmRleCAwM2E5MTFmLi44NzBhMGQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYwpAQCAtOTI4LDcgKzkyOCw3IEBACiAgKiBSYWlzZSBhIG5ldyBleGNlcHRpb24gJ2V4Y19jbGFzcycsIGFkZGluZyBhZGRpdGlvbmFsIHRleHQgdG8gdGhlIG9yaWdpbmFsCiAgKiBleGNlcHRpb24gc3RyaW5nLgogICovCi12b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKQordm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhcmdzOwogICAgIFB5T2JqZWN0ICp0cCwgKnYsICp0YiwgKnMsICpjbHNfc3RyLCAqbXNnX3N0cjsKQEAgLTEyMDEsNyArMTIwMSw3IEBACiAKICNpZmRlZiBNU19XSU4zMgogCi1zdGF0aWMgY2hhciBmb3JtYXRfZXJyb3JfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0X2Vycm9yX2RvY1tdID0KICJGb3JtYXRFcnJvcihbaW50ZWdlcl0pIC0+IHN0cmluZ1xuXAogXG5cCiBDb252ZXJ0IGEgd2luMzIgZXJyb3IgY29kZSBpbnRvIGEgc3RyaW5nLiBJZiB0aGUgZXJyb3IgY29kZSBpcyBub3RcblwKQEAgLTEyMjUsNyArMTIyNSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgbG9hZF9saWJyYXJ5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGxvYWRfbGlicmFyeV9kb2NbXSA9CiAiTG9hZExpYnJhcnkobmFtZSkgLT4gaGFuZGxlXG5cCiBcblwKIExvYWQgYW4gZXhlY3V0YWJsZSAodXN1YWxseSBhIERMTCksIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gaXQuXG5cCkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBjaGFyIGZyZWVfbGlicmFyeV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcmVlX2xpYnJhcnlfZG9jW10gPQogIkZyZWVMaWJyYXJ5KGhhbmRsZSkgLT4gdm9pZFxuXAogXG5cCiBGcmVlIHRoZSBoYW5kbGUgb2YgYW4gZXhlY3V0YWJsZSBwcmV2aW91c2x5IGxvYWRlZCBieSBMb2FkTGlicmFyeS5cbiI7CkBAIC0xMjY5LDcgKzEyNjksNyBAQAogICAgIHJldHVybiBQeV9Ob25lOwogfQogCi1zdGF0aWMgY2hhciBjb3B5X2NvbV9wb2ludGVyX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQogIkNvcHlDb21Qb2ludGVyKHNyYywgZHN0KSAtPiBIUkVTVUxUIHZhbHVlXG4iOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQzOSw3ICsxNDM5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBjaGFyIHNpemVvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBzaXplb2ZfZG9jW10gPQogInNpemVvZihDIHR5cGUpIC0+IGludGVnZXJcbiIKICJzaXplb2YoQyBpbnN0YW5jZSkgLT4gaW50ZWdlclxuIgogIlJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIEMgaW5zdGFuY2UiOwpAQCAtMTQ2MCw3ICsxNDYwLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIgYWxpZ25tZW50X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFsaWdubWVudF9kb2NbXSA9CiAiYWxpZ25tZW50KEMgdHlwZSkgLT4gaW50ZWdlclxuIgogImFsaWdubWVudChDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIGEgQyBpbnN0YW5jZSI7CkBAIC0xNDgzLDcgKzE0ODMsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY2hhciBieXJlZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBieXJlZl9kb2NbXSA9CiAiYnlyZWYoQyBpbnN0YW5jZVssIG9mZnNldD0wXSkgLT4gYnlyZWYtb2JqZWN0XG4iCiAiUmV0dXJuIGEgcG9pbnRlciBsb29rYWxpa2UgdG8gYSBDIGluc3RhbmNlLCBvbmx5IHVzYWJsZVxuIgogImFzIGZ1bmN0aW9uIGFyZ3VtZW50IjsKQEAgLTE1MjcsNyArMTUyNyw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CiB9CiAKLXN0YXRpYyBjaGFyIGFkZHJlc3NvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzb2ZfZG9jW10gPQogImFkZHJlc3NvZihDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBDIGluc3RhbmNlIGludGVybmFsIGJ1ZmZlciI7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCAwZDNmNzI0Li5iMDZiYThhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0zMjcsNyArMzI3LDcgQEAKIFB5Q0RhdGFfc2V0KFB5T2JqZWN0ICpkc3QsIFB5T2JqZWN0ICp0eXBlLCBTRVRGVU5DIHNldGZ1bmMsIFB5T2JqZWN0ICp2YWx1ZSwKICAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cik7CiAKLWV4dGVybiB2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiB2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IGJhc2VzcGVjIHsKICAgICBDRGF0YU9iamVjdCAqYmFzZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jIGIvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKaW5kZXggNzU5YjczMS4uMjZiZjA5NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKKysrIGIvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKQEAgLTYsNyArNiw3IEBACiAKIC8qIFJlbGVhc2UgTnVtYmVyICovCiAKLXN0YXRpYyBjaGFyICpQeUN1cnNlc1ZlcnNpb24gPSAiMi4xIjsKK3N0YXRpYyBjb25zdCBjaGFyIFB5Q3Vyc2VzVmVyc2lvbltdID0gIjIuMSI7CiAKIC8qIEluY2x1ZGVzICovCiAKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotUHlDdXJzZXNDaGVja0VSUihpbnQgY29kZSwgY2hhciAqZm5hbWUpCitQeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjb25zdCBjaGFyICpmbmFtZSkKIHsKICAgICBpZiAoY29kZSAhPSBFUlIpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggZTNkZTUzNy4uM2U1ZTE5NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCkBAIC0xODQsMTIgKzE4NCwxMiBAQAogICogYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgdGhhdCBtb250aCBpbiB0aGUgc2FtZSB5ZWFyLiAgVGhlc2UKICAqIGFyZSBjb3JyZWN0IGZvciBub24tbGVhcCB5ZWFycyBvbmx5LgogICovCi1zdGF0aWMgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CiAgICAgMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KICAgICAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCiB9OwogCi1zdGF0aWMgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0geworc3RhdGljIGNvbnN0IGludCBfZGF5c19iZWZvcmVfbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CiB9OwpAQCAtODczLDcgKzg3Myw3IEBACiAgKiB0aGlzIHJldHVybnMgTlVMTC4gIEVsc2UgcmVzdWx0IGlzIHJldHVybmVkLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF90emluZm9fbWV0aG9kKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcpCitjYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKICAgICBQeU9iamVjdCAqb2Zmc2V0OwogCkBAIC0xMDA5LDEwICsxMDA5LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0X2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqZGF0ZSwgaW50IGhvdXJzLCBpbnQgbWludXRlcywgaW50IHNlY29uZHMpCiB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKkRheU5hbWVzW10gPSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBEYXlOYW1lc1tdID0gewogICAgICAgICAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIgogICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKk1vbnRoTmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IE1vbnRoTmFtZXNbXSA9IHsKICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgogICAgIH07CkBAIC0yMzA3LDcgKzIzMDcsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAotc3RhdGljIGNoYXIgZGVsdGFfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGVsdGFfZG9jW10gPQogUHlEb2NfU1RSKCJEaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGV0aW1lIHZhbHVlcy4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkZWx0YV9hc19udW1iZXIgPSB7CkBAIC0yODg2LDcgKzI4ODYsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBkYXRlX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGRhdGVfZG9jW10gPQogUHlEb2NfU1RSKCJkYXRlKHllYXIsIG1vbnRoLCBkYXkpIC0tPiBkYXRlIG9iamVjdCIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRhdGVfYXNfbnVtYmVyID0gewpAQCAtMzE1NSw3ICszMTU1LDcgQEAKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHR6aW5mb19kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0emluZm9fZG9jW10gPQogUHlEb2NfU1RSKCJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aW1lIHpvbmUgaW5mbyBvYmplY3RzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVFpJbmZvVHlwZSA9IHsKQEAgLTMyODcsNiArMzI4NywxMSBAQAogICAgICAgICBQeV9JTkNSRUYoc2VsZi0+bmFtZSk7CiAgICAgICAgIHJldHVybiBzZWxmLT5uYW1lOwogICAgIH0KKyAgICBpZiAoKFB5T2JqZWN0ICopc2VsZiA9PSBQeURhdGVUaW1lX1RpbWVab25lX1VUQyB8fAorICAgICAgICAgICAoR0VUX1REX0RBWVMoc2VsZi0+b2Zmc2V0KSA9PSAwICYmCisgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmLT5vZmZzZXQpID09IDAgJiYKKyAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZi0+b2Zmc2V0KSA9PSAwKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJVVEMiKTsKICAgICAvKiBPZmZzZXQgaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgbmVnYXRpdmUgaWYgZGF5cyA8IDAgKi8KICAgICBpZiAoR0VUX1REX0RBWVMoc2VsZi0+b2Zmc2V0KSA8IDApIHsKICAgICAgICAgc2lnbiA9ICctJzsKQEAgLTMzODIsNyArMzM4Nyw3IEBACiAgICAge05VTEwsIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciB0aW1lem9uZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0aW1lem9uZV9kb2NbXSA9CiBQeURvY19TVFIoIkZpeGVkIG9mZnNldCBmcm9tIFVUQyBpbXBsZW1lbnRhdGlvbiBvZiB0emluZm8uIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9UaW1lWm9uZVR5cGUgPSB7CkBAIC0zODcyLDcgKzM4NzcsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciB0aW1lX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHRpbWVfZG9jW10gPQogUHlEb2NfU1RSKCJ0aW1lKFtob3VyWywgbWludXRlWywgc2Vjb25kWywgbWljcm9zZWNvbmRbLCB0emluZm9dXV1dXSkgLS0+IGEgdGltZSBvYmplY3RcblwKIFxuXAogQWxsIGFyZ3VtZW50cyBhcmUgb3B0aW9uYWwuIHR6aW5mbyBtYXkgYmUgTm9uZSwgb3IgYW4gaW5zdGFuY2Ugb2ZcblwKQEAgLTQwODMsNDQgKzQwODgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKIH0KIAotc3RhdGljIHRpbWVfdAotX1B5VGltZV9Eb3VibGVUb1RpbWV0KGRvdWJsZSB4KQotewotICAgIHRpbWVfdCByZXN1bHQ7Ci0gICAgZG91YmxlIGRpZmY7Ci0KLSAgICByZXN1bHQgPSAodGltZV90KXg7Ci0gICAgLyogSG93IG11Y2ggaW5mbyBkaWQgd2UgbG9zZT8gIHRpbWVfdCBtYXkgYmUgYW4gaW50ZWdyYWwgb3IKLSAgICAgKiBmbG9hdGluZyB0eXBlLCBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaC4gIElmIGl0J3MgaW50ZWdyYWwsCi0gICAgICogd2UgZG9uJ3Qga25vdyB3aGV0aGVyIEMgdHJ1bmNhdGVzLCByb3VuZHMsIHJldHVybnMgdGhlIGZsb29yLAotICAgICAqIGV0Yy4gIElmIHdlIGxvc3QgYSBzZWNvbmQgb3IgbW9yZSwgdGhlIEMgcm91bmRpbmcgaXMKLSAgICAgKiB1bnJlYXNvbmFibGUsIG9yIHRoZSBpbnB1dCBqdXN0IGRvZXNuJ3QgZml0IGluIGEgdGltZV90OwotICAgICAqIGNhbGwgaXQgYW4gZXJyb3IgcmVnYXJkbGVzcy4gIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgY2FzdCB0bwotICAgICAqIHRpbWVfdCBjYW4gY2F1c2UgYSBDIGVycm9yIHRvbywgYnV0IG5vdGhpbmcgd2UgY2FuIGRvIHRvCi0gICAgICogd29ybSBhcm91bmQgdGhhdC4KLSAgICAgKi8KLSAgICBkaWZmID0geCAtIChkb3VibGUpcmVzdWx0OwotICAgIGlmIChkaWZmIDw9IC0xLjAgfHwgZGlmZiA+PSAxLjApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgcGxhdGZvcm0gdGltZV90Iik7Ci0gICAgICAgIHJlc3VsdCA9ICh0aW1lX3QpLTE7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFJvdW5kIGEgZG91YmxlIHRvIHRoZSBuZWFyZXN0IGxvbmcuICB8eHwgbXVzdCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0Ci0gKiBpbiBhIEMgbG9uZzsgdGhpcyBpcyBub3QgY2hlY2tlZC4KLSAqLwotc3RhdGljIGRvdWJsZQotX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGRvdWJsZSB4KQotewotICAgIGRvdWJsZSByb3VuZGVkID0gcm91bmQoeCk7Ci0gICAgaWYgKGZhYnMoeC1yb3VuZGVkKSA9PSAwLjUpCi0gICAgICAgIC8qIGhhbGZ3YXkgY2FzZTogcm91bmQgdG8gZXZlbiAqLwotICAgICAgICByb3VuZGVkID0gMi4wKnJvdW5kKHgvMi4wKTsKLSAgICByZXR1cm4gcm91bmRlZDsKLX0KLQogLyogSW50ZXJuYWwgaGVscGVyLgogICogQnVpbGQgZGF0ZXRpbWUgZnJvbSBhIFB5dGhvbiB0aW1lc3RhbXAuICBQYXNzIGxvY2FsdGltZSBvciBnbXRpbWUgZm9yIGYsCiAgKiB0byBjb250cm9sIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgdGltZXN0YW1wLiAgU2luY2UgYSBkb3VibGUgZG9lc24ndApAQCAtNDEyOSwzMiArNDA5NiwxNyBAQAogICogdG8gZ2V0IHRoYXQgbXVjaCBwcmVjaXNpb24gKGUuZy4sIEMgdGltZSgpIGlzbid0IGdvb2QgZW5vdWdoKS4KICAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFRNX0ZVTkMgZiwgZG91YmxlIHRpbWVzdGFtcCwKK2RhdGV0aW1lX2Zyb21fdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFRNX0ZVTkMgZiwgUHlPYmplY3QgKnRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8pCiB7CiAgICAgdGltZV90IHRpbWV0OwotICAgIGRvdWJsZSBmcmFjdGlvbjsKLSAgICBpbnQgdXM7CisgICAgbG9uZyB1czsKIAotICAgIHRpbWV0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHRpbWVzdGFtcCk7Ci0gICAgaWYgKHRpbWV0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoX1B5VGltZV9PYmplY3RUb1RpbWV2YWwodGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXQsICZ1cywgX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBmcmFjdGlvbiA9IHRpbWVzdGFtcCAtIChkb3VibGUpdGltZXQ7Ci0gICAgdXMgPSAoaW50KV9QeVRpbWVfUm91bmRIYWxmRXZlbihmcmFjdGlvbiAqIDFlNik7Ci0gICAgaWYgKHVzIDwgMCkgewotICAgICAgICAvKiBUcnVuY2F0aW9uIHRvd2FyZHMgemVybyBpcyBub3Qgd2hhdCB3ZSB3YW50ZWQKLSAgICAgICAgICAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKFB5dGhvbidzIG1vZCBzZW1hbnRpY3MpICovCi0gICAgICAgIHRpbWV0IC09IDE7Ci0gICAgICAgIHVzICs9IDEwMDAwMDA7Ci0gICAgfQotICAgIC8qIElmIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gb25lIG1pY3Jvc2Vjb25kIHNtYWxsZXIgdGhhbiBhCi0gICAgICogZnVsbCBzZWNvbmQsIHJvdW5kIHVwLiBPdGhlcndpc2UsIFZhbHVlRXJyb3JzIGFyZSByYWlzZWQKLSAgICAgKiBmb3Igc29tZSBmbG9hdHMuICovCi0gICAgaWYgKHVzID09IDEwMDAwMDApIHsKLSAgICAgICAgdGltZXQgKz0gMTsKLSAgICAgICAgdXMgPSAwOwotICAgIH0KLSAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0aW1ldCwgdXMsIHR6aW5mbyk7CisKKyAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0aW1ldCwgKGludCl1cywgdHppbmZvKTsKIH0KIAogLyogSW50ZXJuYWwgaGVscGVyLgpAQCAtNDIyNywxMSArNDE3OSwxMSBAQAogZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIFB5T2JqZWN0ICpzZWxmOwotICAgIGRvdWJsZSB0aW1lc3RhbXA7CisgICAgUHlPYmplY3QgKnRpbWVzdGFtcDsKICAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidGltZXN0YW1wIiwgInR6IiwgTlVMTH07CiAKLSAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJkfE86ZnJvbXRpbWVzdGFtcCIsCisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xPOmZyb210aW1lc3RhbXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkcywgJnRpbWVzdGFtcCwgJnR6aW5mbykpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCkBAIC00MjU1LDEwICs0MjA3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDp1dGNmcm9tdGltZXN0YW1wIiwgJnRpbWVzdGFtcCkpCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQogICAgICAgICByZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDc2MSw3ICs0NzEzLDcgQEAKICAgICBpZiAoc2Vjb25kcyA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIFB5X0RFQ1JFRihkZWx0YSk7Ci0gICAgdGltZXN0YW1wID0gUHlMb25nX0FzTG9uZyhzZWNvbmRzKTsKKyAgICB0aW1lc3RhbXAgPSBfUHlMb25nX0FzVGltZV90KHNlY29uZHMpOwogICAgIFB5X0RFQ1JFRihzZWNvbmRzKTsKICAgICBpZiAodGltZXN0YW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTExMyw3ICs1MDY1LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgZGF0ZXRpbWVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGF0ZXRpbWVfZG9jW10gPQogUHlEb2NfU1RSKCJkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWyx0emluZm9dXV1dXSlcblwKIFxuXAogVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhblxuXApAQCAtNTM3NywxOSArNTMyOSwxOSBAQAogICAgIC8qIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbQogICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgNCBzaW5nbGUgeWVhcnMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJNFkgPT0gNCAqIDM2NSArIDEpOworICAgIFB5X0JVSUxEX0FTU0VSVChESTRZID09IDQgKiAzNjUgKyAxKTsKICAgICBhc3NlcnQoREk0WSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQrMSkpOwogCiAgICAgLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAogICAgICAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CiAgICAgYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CiAKICAgICAvKiBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tCiAgICAgICogcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLgogICAgICAqLwotICAgIGFzc2VydChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKICAgICBhc3NlcnQoREkxMDBZID09IGRheXNfYmVmb3JlX3llYXIoMTAwKzEpKTsKIAogICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RibW1vZHVsZS5jIGIvTW9kdWxlcy9fZGJtbW9kdWxlLmMKaW5kZXggMDI4OTllNC4uNWU3ZWMxYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGJtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZGJtbW9kdWxlLmMKQEAgLTE0LDE2ICsxNCwxNiBAQAogICovCiAjaWYgZGVmaW5lZChIQVZFX05EQk1fSCkKICNpbmNsdWRlIDxuZGJtLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkdOVSBnZGJtIjsgIC8qIEVNWCBwb3J0IG9mIEdEQk0gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkdOVSBnZGJtIjsgIC8qIEVNWCBwb3J0IG9mIEdEQk0gKi8KICNlbGlmIGRlZmluZWQoSEFWRV9HREJNX05EQk1fSCkKICNpbmNsdWRlIDxnZGJtL25kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOwogI2VsaWYgZGVmaW5lZChIQVZFX0dEQk1fREFTSF9OREJNX0gpCiAjaW5jbHVkZSA8Z2RibS1uZGJtLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkdOVSBnZGJtIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkdOVSBnZGJtIjsKICNlbGlmIGRlZmluZWQoSEFWRV9CRVJLREJfSCkKICNpbmNsdWRlIDxkYi5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJCZXJrZWxleSBEQiI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJCZXJrZWxleSBEQiI7CiAjZWxzZQogI2Vycm9yICJObyBuZGJtLmggYXZhaWxhYmxlISIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCmluZGV4IDExMmI0NGYuLjNjMmFkODUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKQEAgLTMzODAsNiArMzM4MCwxMDYgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHB5bG9uZzsKIH0KIAorLyogQ29udmVydCBhIERlY2ltYWwgdG8gaXRzIGV4YWN0IGludGVnZXIgcmF0aW8gcmVwcmVzZW50YXRpb24uICovCitzdGF0aWMgUHlPYmplY3QgKgorZGVjX2FzX2ludGVnZXJfcmF0aW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzIFVOVVNFRCkKK3sKKyAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpleHBvbmVudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBtcGRfc3NpemVfdCBleHA7CisgICAgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgdWludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBQeU51bWJlck1ldGhvZHMgKmxvbmdfbWV0aG9kcyA9IFB5TG9uZ19UeXBlLnRwX2FzX251bWJlcjsKKworICAgIGlmIChtcGRfaXNzcGVjaWFsKE1QRChzZWxmKSkpIHsKKyAgICAgICAgaWYgKG1wZF9pc25hbihNUEQoc2VsZikpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ1VSUkVOVF9DT05URVhUKGNvbnRleHQpOworCisgICAgdG1wID0gZGVjX2FsbG9jKCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbXBkX3Fjb3B5KE1QRCh0bXApLCBNUEQoc2VsZiksICZzdGF0dXMpKSB7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBleHAgPSBtcGRfaXN6ZXJvKE1QRCh0bXApKSA/IDAgOiBNUEQodG1wKS0+ZXhwOworICAgIE1QRCh0bXApLT5leHAgPSAwOworCisgICAgLyogY29udGV4dCBhbmQgcm91bmRpbmcgYXJlIHVudXNlZCBoZXJlOiB0aGUgY29udmVyc2lvbiBpcyBleGFjdCAqLworICAgIG51bWVyYXRvciA9IGRlY19hc19sb25nKHRtcCwgY29udGV4dCwgTVBEX1JPVU5EX0ZMT09SKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBleHBvbmVudCA9IFB5TG9uZ19Gcm9tU3NpemVfdChleHAgPCAwID8gLWV4cCA6IGV4cCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB0bXAgPSBQeUxvbmdfRnJvbUxvbmcoMTApOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIFB5X1NFVFJFRihleHBvbmVudCwgbG9uZ19tZXRob2RzLT5uYl9wb3dlcih0bXAsIGV4cG9uZW50LCBQeV9Ob25lKSk7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoZXhwID49IDApIHsKKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwgbG9uZ19tZXRob2RzLT5uYl9tdWx0aXBseShudW1lcmF0b3IsIGV4cG9uZW50KSk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRlbm9taW5hdG9yID0gZXhwb25lbnQ7CisgICAgICAgIGV4cG9uZW50ID0gTlVMTDsKKyAgICAgICAgdG1wID0gX1B5TG9uZ19HQ0QobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9TRVRSRUYobnVtZXJhdG9yLCBsb25nX21ldGhvZHMtPm5iX2Zsb29yX2RpdmlkZShudW1lcmF0b3IsIHRtcCkpOworICAgICAgICBQeV9TRVRSRUYoZGVub21pbmF0b3IsIGxvbmdfbWV0aG9kcy0+bmJfZmxvb3JfZGl2aWRlKGRlbm9taW5hdG9yLCB0bXApKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCB8fCBkZW5vbWluYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworCisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoZXhwb25lbnQpOworICAgIFB5X1hERUNSRUYoZGVub21pbmF0b3IpOworICAgIFB5X1hERUNSRUYobnVtZXJhdG9yKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEZWNfVG9JbnRlZ3JhbFZhbHVlKFB5T2JqZWN0ICpkZWMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTQ2ODgsNiArNDc4OCw3IEBACiAgIC8qIE1pc2NlbGxhbmVvdXMgKi8KICAgeyAiZnJvbV9mbG9hdCIsIGRlY19mcm9tX2Zsb2F0LCBNRVRIX098TUVUSF9DTEFTUywgZG9jX2Zyb21fZmxvYXQgfSwKICAgeyAiYXNfdHVwbGUiLCBQeURlY19Bc1R1cGxlLCBNRVRIX05PQVJHUywgZG9jX2FzX3R1cGxlIH0sCisgIHsgImFzX2ludGVnZXJfcmF0aW8iLCBkZWNfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsIGRvY19hc19pbnRlZ2VyX3JhdGlvIH0sCiAKICAgLyogU3BlY2lhbCBtZXRob2RzICovCiAgIHsgIl9fY29weV9fIiwgZGVjX2NvcHksIE1FVEhfTk9BUkdTLCBOVUxMIH0sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaCBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCmluZGV4IDcxMDI5YTkuLmY3ZmQ2ZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCkBAIC03MCw2ICs3MCwxNSBAQAogUmV0dXJuIGEgdHVwbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci5cblwKIFxuIik7CiAKK1B5RG9jX1NUUlZBUihkb2NfYXNfaW50ZWdlcl9yYXRpbywKKyJhc19pbnRlZ2VyX3JhdGlvKCRzZWxmLCAvKVxuLS1cblxuXAorRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkgLT4gKGludCwgaW50KVxuXAorXG5cCitSZXR1cm4gYSBwYWlyIG9mIGludGVnZXJzLCB3aG9zZSByYXRpbyBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBvcmlnaW5hbFxuXAorRGVjaW1hbCBhbmQgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yLiBUaGUgcmF0aW8gaXMgaW4gbG93ZXN0IHRlcm1zLlxuXAorUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBhIFZhbHVlRXJyb3Igb24gTmFOcy5cblwKK1xuIik7CisKIFB5RG9jX1NUUlZBUihkb2NfY2Fub25pY2FsLAogImNhbm9uaWNhbCgkc2VsZiwgLylcbi0tXG5cblwKIFJldHVybiB0aGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIHRoZSBhcmd1bWVudC4gIEN1cnJlbnRseSwgdGhlIGVuY29kaW5nXG5cCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5IGIvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQppbmRleCBhYjdkNWJkLi5mOTA3NTMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CisrKyBiL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKQEAgLTUwLDggKzUwLDggQEAKICAgICAgICAgJ19fYWJzX18nLCAnX19ib29sX18nLCAnX19jZWlsX18nLCAnX19jb21wbGV4X18nLCAnX19jb3B5X18nLAogICAgICAgICAnX19mbG9vcl9fJywgJ19fZmxvYXRfXycsICdfX2hhc2hfXycsICdfX2ludF9fJywgJ19fbmVnX18nLAogICAgICAgICAnX19wb3NfXycsICdfX3JlZHVjZV9fJywgJ19fcmVwcl9fJywgJ19fc3RyX18nLCAnX190cnVuY19fJywKLSAgICAgICAgJ2FkanVzdGVkJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLCAnY29weV9hYnMnLAotICAgICAgICAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCisgICAgICAgICdhZGp1c3RlZCcsICdhc19pbnRlZ2VyX3JhdGlvJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLAorICAgICAgICAnY29weV9hYnMnLCAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCiAgICAgICAgICdpc19uYW4nLCAnaXNfcW5hbicsICdpc19zaWduZWQnLCAnaXNfc25hbicsICdpc196ZXJvJywgJ3JhZGl4JwogICAgICksCiAgICAgIyBVbmFyeSB3aXRoIG9wdGlvbmFsIGNvbnRleHQ6CkBAIC0xMjgsNyArMTI4LDcgQEAKICMgRnVuY3Rpb25zIHRoYXQgcmVxdWlyZSBhIHJlc3RyaWN0ZWQgZXhwb25lbnQgcmFuZ2UgZm9yIHJlYXNvbmFibGUgcnVudGltZXMuCiBVbmFyeVJlc3RyaWN0ZWQgPSBbCiAgICdfX2NlaWxfXycsICdfX2Zsb29yX18nLCAnX19pbnRfXycsICdfX3RydW5jX18nLAotICAndG9faW50ZWdyYWwnLCAndG9faW50ZWdyYWxfdmFsdWUnCisgICdhc19pbnRlZ2VyX3JhdGlvJywgJ3RvX2ludGVncmFsJywgJ3RvX2ludGVncmFsX3ZhbHVlJwogXQogCiBCaW5hcnlSZXN0cmljdGVkID0gWydfX3JvdW5kX18nXQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKaW5kZXggMTFkMWFlYy4uNTgwYzUzYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYworKysgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCkBAIC0xMjksMzAgKzEyOSw2IEBACiAvKiBoZWxwZXJzICovCiAKIExPQ0FMKFB5T2JqZWN0KikKLWRlZXBjb3B5KFB5T2JqZWN0KiBvYmplY3QsIFB5T2JqZWN0KiBtZW1vKQotewotICAgIC8qIGRvIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3QgKi8KLSAgICBQeU9iamVjdCogYXJnczsKLSAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIGVsZW1lbnR0cmVlc3RhdGUgKnN0ID0gRVRfU1RBVEVfR0xPQkFMOwotCi0gICAgaWYgKCFzdC0+ZGVlcGNvcHlfb2JqKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZygKLSAgICAgICAgICAgIFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICJkZWVwY29weSBoZWxwZXIgbm90IGZvdW5kIgotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCBvYmplY3QsIG1lbW8pOwotICAgIGlmICghYXJncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdC0+ZGVlcGNvcHlfb2JqLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTE9DQUwoUHlPYmplY3QqKQogbGlzdF9qb2luKFB5T2JqZWN0KiBsaXN0KQogewogICAgIC8qIGpvaW4gbGlzdCBlbGVtZW50cyAoZGVzdHJveWluZyB0aGUgbGlzdCBpbiB0aGUgcHJvY2VzcykgKi8KQEAgLTc0OCw2ICs3MjQsOSBAQAogICAgIHJldHVybiAoUHlPYmplY3QqKSBlbGVtZW50OwogfQogCisvKiBIZWxwZXIgZm9yIGEgZGVlcCBjb3B5LiAqLworTE9DQUwoUHlPYmplY3QgKikgZGVlcGNvcHkoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5FbGVtZW50Ll9fZGVlcGNvcHlfXwogCkBAIC04MzgsNiArODE3LDU3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK0xPQ0FMKFB5T2JqZWN0ICopCitkZWVwY29weShQeU9iamVjdCAqb2JqZWN0LCBQeU9iamVjdCAqbWVtbykKK3sKKyAgICAvKiBkbyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICovCisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBlbGVtZW50dHJlZXN0YXRlICpzdDsKKworICAgIC8qIEZhc3QgcGF0aHMgKi8KKyAgICBpZiAob2JqZWN0ID09IFB5X05vbmUgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICBQeV9JTkNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICBpZiAoUHlfUkVGQ05UKG9iamVjdCkgPT0gMSkgeworICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICAgICAgaW50IHNpbXBsZSA9IDE7CisgICAgICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQob2JqZWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8ICFQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbXBsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlEaWN0X0NvcHkob2JqZWN0KTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBnZW5lcmFsIGNhc2UgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChFbGVtZW50X0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50dHJlZV9FbGVtZW50X19fZGVlcGNvcHlfXygoRWxlbWVudE9iamVjdCAqKW9iamVjdCwgbWVtbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZW5lcmFsIGNhc2UgKi8KKyAgICBzdCA9IEVUX1NUQVRFX0dMT0JBTDsKKyAgICBpZiAoIXN0LT5kZWVwY29weV9vYmopIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWVwY29weSBoZWxwZXIgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgb2JqZWN0LCBtZW1vKTsKKyAgICBpZiAoIWFyZ3MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3QtPmRlZXBjb3B5X29iaiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLkVsZW1lbnQuX19zaXplb2ZfXyAtPiBQeV9zc2l6ZV90CiAKQEAgLTE4NzksOTIgKzE5MDksOTAgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotZWxlbWVudF9nZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaikKK2VsZW1lbnRfdGFnX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIFB5T2JqZWN0KiByZXM7Ci0gICAgY2hhciAqbmFtZSA9ICIiOwotCi0gICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lb2JqKSkKLSAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZW9iaik7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIGhhbmRsZSBjb21tb24gYXR0cmlidXRlcyBmaXJzdCAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhZyIpID09IDApIHsKLSAgICAgICAgcmVzID0gc2VsZi0+dGFnOwotICAgICAgICBQeV9JTkNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKLSAgICAgICAgUHlfWElOQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8qIG1ldGhvZHMgKi8KLSAgICByZXMgPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QqKSBzZWxmLCBuYW1lb2JqKTsKLSAgICBpZiAocmVzKQotICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgLyogbGVzcyBjb21tb24gYXR0cmlidXRlcyAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X3RhaWwoc2VsZik7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImF0dHJpYiIpID09IDApIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKCFzZWxmLT5leHRyYSkgewotICAgICAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfYXR0cmliKHNlbGYpOwotICAgIH0KLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLQorICAgIFB5T2JqZWN0ICpyZXMgPSBzZWxmLT50YWc7CiAgICAgUHlfSU5DUkVGKHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludAotZWxlbWVudF9zZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaiwgUHlPYmplY3QqIHZhbHVlKQorc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF90ZXh0X2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIGNoYXIgKm5hbWUgPSAiIjsKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KIAotICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtMTsKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfdGFpbF9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGFpbChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF9hdHRyaWJfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpZiAoIXNlbGYtPmV4dHJhKSB7CisgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZW9iaikpCi0gICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzU3RyaW5nKG5hbWVvYmopOwotICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBlbGVtZW50X2dldF9hdHRyaWIoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CiAKLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWciKSA9PSAwKSB7Ci0gICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgIFB5X1NFVFJFRihzZWxmLT50YWcsIHZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRleHQpKTsKLSAgICAgICAgc2VsZi0+dGV4dCA9IHZhbHVlOwotICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dGV4dCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50YWlsKSk7Ci0gICAgICAgIHNlbGYtPnRhaWwgPSB2YWx1ZTsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRhaWwpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJhdHRyaWIiKSA9PSAwKSB7Ci0gICAgICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICBQeV9TRVRSRUYoc2VsZi0+ZXh0cmEtPmF0dHJpYiwgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJDYW4ndCBzZXQgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgb24gRWxlbWVudCIpOwotICAgICAgICByZXR1cm4gLTE7CisvKiBtYWNybyBmb3Igc2V0dGVyIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgX1ZBTElEQVRFX0FUVFJfVkFMVUUoVikgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChWKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeUVycl9TZXRTdHJpbmcoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGVsZW1lbnQgYXR0cmlidXRlIik7ICAgICAgXAorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGFnX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPnRhZywgdmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X3RleHRfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGV4dCkpOworICAgIHNlbGYtPnRleHQgPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF90YWlsX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRhaWwpKTsKKyAgICBzZWxmLT50YWlsID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfYXR0cmliX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKKyAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPmV4dHJhLT5hdHRyaWIsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTk4NCwyMiArMjAxMiwyMiBAQAogICogcHJlLW9yZGVyIHRyYXZlcnNhbC4gVG8ga2VlcCB0cmFjayBvZiB3aGljaCBzdWItZWxlbWVudCBzaG91bGQgYmUgcmV0dXJuZWQKICAqIG5leHQsIGEgc3RhY2sgb2YgcGFyZW50cyBpcyBtYWludGFpbmVkLiBUaGlzIGlzIGEgc3RhbmRhcmQgc3RhY2stYmFzZWQKICAqIGl0ZXJhdGl2ZSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIGEgdHJlZS4KLSAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgc2luZ2xlLWxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHBhcmVudF9zdGFjay4KLSAqIEVhY2ggc3RhY2sgbm9kZSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKKyAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgY29udGludW91cyBhcnJheS4KKyAqIEVhY2ggc3RhY2sgaXRlbSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKICAqIHRoZSBjdXJyZW50IG9uZSBpcyBleGhhdXN0ZWQsIGFuZCB0aGUgbmV4dCBjaGlsZCB0byBleGFtaW5lIGluIHRoYXQgcGFyZW50LgogICovCiB0eXBlZGVmIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgewogICAgIEVsZW1lbnRPYmplY3QgKnBhcmVudDsKICAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4OwotICAgIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgKm5leHQ7CiB9IFBhcmVudExvY2F0b3I7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUGFyZW50TG9jYXRvciAqcGFyZW50X3N0YWNrOworICAgIFB5X3NzaXplX3QgcGFyZW50X3N0YWNrX3VzZWQ7CisgICAgUHlfc3NpemVfdCBwYXJlbnRfc3RhY2tfc2l6ZTsKICAgICBFbGVtZW50T2JqZWN0ICpyb290X2VsZW1lbnQ7CiAgICAgUHlPYmplY3QgKnNvdWdodF90YWc7Ci0gICAgaW50IHJvb3RfZG9uZTsKICAgICBpbnQgZ2V0dGV4dDsKIH0gRWxlbWVudEl0ZXJPYmplY3Q7CiAKQEAgLTIwMDcsMTMgKzIwMzUsMTEgQEAKIHN0YXRpYyB2b2lkCiBlbGVtZW50aXRlcl9kZWFsbG9jKEVsZW1lbnRJdGVyT2JqZWN0ICppdCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpwID0gaXQtPnBhcmVudF9zdGFjazsKLSAgICB3aGlsZSAocCkgewotICAgICAgICBQYXJlbnRMb2NhdG9yICp0ZW1wID0gcDsKLSAgICAgICAgUHlfWERFQ1JFRihwLT5wYXJlbnQpOwotICAgICAgICBwID0gcC0+bmV4dDsKLSAgICAgICAgUHlPYmplY3RfRnJlZSh0ZW1wKTsKLSAgICB9CisgICAgUHlfc3NpemVfdCBpID0gaXQtPnBhcmVudF9zdGFja191c2VkOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgUHlfWERFQ1JFRihpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CisgICAgUHlNZW1fRnJlZShpdC0+cGFyZW50X3N0YWNrKTsKIAogICAgIFB5X1hERUNSRUYoaXQtPnNvdWdodF90YWcpOwogICAgIFB5X1hERUNSRUYoaXQtPnJvb3RfZWxlbWVudCk7CkBAIC0yMDI1LDExICsyMDUxLDkgQEAKIHN0YXRpYyBpbnQKIGVsZW1lbnRpdGVyX3RyYXZlcnNlKEVsZW1lbnRJdGVyT2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqcCA9IGl0LT5wYXJlbnRfc3RhY2s7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgUHlfVklTSVQocC0+cGFyZW50KTsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQorICAgIFB5X3NzaXplX3QgaSA9IGl0LT5wYXJlbnRfc3RhY2tfdXNlZDsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBQeV9WSVNJVChpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CiAKICAgICBQeV9WSVNJVChpdC0+cm9vdF9lbGVtZW50KTsKICAgICBQeV9WSVNJVChpdC0+c291Z2h0X3RhZyk7CkBAIC0yMDM4LDE3ICsyMDYyLDI1IEBACiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgZWxlbWVudGl0ZXJfbmV4dC4gQWRkIGEgbmV3IHBhcmVudCB0byB0aGUgcGFyZW50IHN0YWNrLgogICovCi1zdGF0aWMgUGFyZW50TG9jYXRvciAqCi1wYXJlbnRfc3RhY2tfcHVzaF9uZXcoUGFyZW50TG9jYXRvciAqc3RhY2ssIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKK3N0YXRpYyBpbnQKK3BhcmVudF9zdGFja19wdXNoX25ldyhFbGVtZW50SXRlck9iamVjdCAqaXQsIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpuZXdfbm9kZSA9IFB5T2JqZWN0X01hbGxvYyhzaXplb2YoUGFyZW50TG9jYXRvcikpOwotICAgIGlmIChuZXdfbm9kZSkgewotICAgICAgICBuZXdfbm9kZS0+cGFyZW50ID0gcGFyZW50OwotICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKLSAgICAgICAgbmV3X25vZGUtPmNoaWxkX2luZGV4ID0gMDsKLSAgICAgICAgbmV3X25vZGUtPm5leHQgPSBzdGFjazsKKyAgICBQYXJlbnRMb2NhdG9yICppdGVtOworCisgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA+PSBpdC0+cGFyZW50X3N0YWNrX3NpemUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSAqIDI7ICAvKiBuZXZlciBvdmVyZmxvdyAqLworICAgICAgICBQYXJlbnRMb2NhdG9yICpwYXJlbnRfc3RhY2sgPSBpdC0+cGFyZW50X3N0YWNrOworICAgICAgICBQeU1lbV9SZXNpemUocGFyZW50X3N0YWNrLCBQYXJlbnRMb2NhdG9yLCBuZXdfc2l6ZSk7CisgICAgICAgIGlmIChwYXJlbnRfc3RhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFjazsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gbmV3X3NpemU7CiAgICAgfQotICAgIHJldHVybiBuZXdfbm9kZTsKKyAgICBpdGVtID0gaXQtPnBhcmVudF9zdGFjayArIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCsrOworICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgIGl0ZW0tPnBhcmVudCA9IHBhcmVudDsKKyAgICBpdGVtLT5jaGlsZF9pbmRleCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMDY1LDE1MSArMjA5Nyw5MSBAQAogICAgICAqICAgLSBpdGVydGV4dCgpIGFsc28gaGFzIHRvIGhhbmRsZSB0YWlsLCBhZnRlciBmaW5pc2hpbmcgd2l0aCBhbGwgdGhlCiAgICAgICogICAgIGNoaWxkcmVuIG9mIGEgbm9kZS4KICAgICAgKi8KLSAgICBFbGVtZW50T2JqZWN0ICpjdXJfcGFyZW50OwotICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXg7CiAgICAgaW50IHJjOwogICAgIEVsZW1lbnRPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKnRleHQ7CiAKICAgICB3aGlsZSAoMSkgewogICAgICAgICAvKiBIYW5kbGUgdGhlIGNhc2UgcmVhY2hlZCBpbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaXRlcmF0aW9uLCB3aGVyZQotICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBUaGUgcm9vdF9kb25lIGZsYWcgZ2l2ZXMgdXMgaW5kaWNhdGlvbgotICAgICAgICAgKiB3aGV0aGVyIHdlJ3ZlIGp1c3Qgc3RhcnRlZCBpdGVyYXRpbmcgKHNvIHJvb3RfZG9uZSBpcyAwKSwgaW4gd2hpY2gKLSAgICAgICAgICogY2FzZSB0aGUgcm9vdCBpcyByZXR1cm5lZC4gSWYgcm9vdF9kb25lIGlzIDEgYW5kIHdlJ3JlIGhlcmUsIHRoZQorICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBJZiByb290X2VsZW1lbnQgaXMgTlVMTCBhbmQgd2UncmUgaGVyZSwgdGhlCiAgICAgICAgICAqIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZC4KICAgICAgICAgICovCi0gICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnJvb3RfZG9uZSkgeworICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2tfdXNlZCkgeworICAgICAgICAgICAgaWYgKCFpdC0+cm9vdF9lbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbSA9IGl0LT5yb290X2VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFja19wdXNoX25ldyhpdC0+cGFyZW50X3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICBpdC0+cm9vdF9kb25lID0gMTsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKLSAgICAgICAgICogeWVzLCB2aXNpdCB0aGUgbmV4dCBjaGlsZC4gSWYgbm90LCBwb3AgdGhlIHN0YWNrIGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAqLwotICAgICAgICBjdXJfcGFyZW50ID0gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50OwotICAgICAgICBjaGlsZF9pbmRleCA9IGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4OwotICAgICAgICBpZiAoY3VyX3BhcmVudC0+ZXh0cmEgJiYgY2hpbGRfaW5kZXggPCBjdXJfcGFyZW50LT5leHRyYS0+bGVuZ3RoKSB7Ci0gICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKiljdXJfcGFyZW50LT5leHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXgrKzsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQtPnBhcmVudF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2spIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtID0gaXQtPnJvb3RfZWxlbWVudDsgIC8qIHN0ZWFscyBhIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgaXQtPnJvb3RfZWxlbWVudCA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdGFpbDsKLSAgICAgICAgICAgIFBhcmVudExvY2F0b3IgKm5leHQ7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IGVsZW1lbnRfZ2V0X3RhaWwoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0YWlsKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWlsID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0ID0gaXQtPnBhcmVudF9zdGFjay0+bmV4dDsKLSAgICAgICAgICAgIGN1cl9wYXJlbnQgPSBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQ7Ci0gICAgICAgICAgICBQeU9iamVjdF9GcmVlKGl0LT5wYXJlbnRfc3RhY2spOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IG5leHQ7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKGN1cl9wYXJlbnQpOwotCi0gICAgICAgICAgICAvKiBOb3RlIHRoYXQgZXh0cmEgY29uZGl0aW9uIG9uIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCBoZXJlOwotICAgICAgICAgICAgICogdGhpcyBpcyBiZWNhdXNlIGl0ZXJ0ZXh0KCkgaXMgc3VwcG9zZWQgdG8gb25seSByZXR1cm4gKmlubmVyKgotICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKKyAgICAgICAgICAgICAqIHllcywgdmlzaXQgdGhlIG5leHQgY2hpbGQuIElmIG5vdCwgcG9wIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGFpbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWw7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUGFyZW50TG9jYXRvciAqaXRlbSA9ICZpdC0+cGFyZW50X3N0YWNrW2l0LT5wYXJlbnRfc3RhY2tfdXNlZCAtIDFdOworICAgICAgICAgICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleCA9IGl0ZW0tPmNoaWxkX2luZGV4OworICAgICAgICAgICAgRWxlbWVudE9iamVjdEV4dHJhICpleHRyYTsKKyAgICAgICAgICAgIGVsZW0gPSBpdGVtLT5wYXJlbnQ7CisgICAgICAgICAgICBleHRyYSA9IGVsZW0tPmV4dHJhOworICAgICAgICAgICAgaWYgKCFleHRyYSB8fCBjaGlsZF9pbmRleCA+PSBleHRyYS0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFja191c2VkLS07CisgICAgICAgICAgICAgICAgLyogTm90ZSB0aGF0IGV4dHJhIGNvbmRpdGlvbiBvbiBpdC0+cGFyZW50X3N0YWNrX3VzZWQgaGVyZTsKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGJlY2F1c2UgaXRlcnRleHQoKSBpcyBzdXBwb3NlZCB0byBvbmx5IHJldHVybiAqaW5uZXIqCisgICAgICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCAmJiBpdC0+cGFyZW50X3N0YWNrX3VzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RhaWwoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2V0dGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKilleHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOworICAgICAgICAgICAgaXRlbS0+Y2hpbGRfaW5kZXgrKzsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQsIGVsZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgeworICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGdldHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb250aW51ZTsKKworZ2V0dGV4dDoKKyAgICAgICAgaWYgKCF0ZXh0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZXh0KTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgICAgICBQeV9ERUNSRUYodGV4dCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjYxLDYgKzIyMzMsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCisjZGVmaW5lIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUgOAogCiBzdGF0aWMgUHlPYmplY3QgKgogY3JlYXRlX2VsZW1lbnRpdGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWcsIGludCBnZXR0ZXh0KQpAQCAtMjI3MywyMiArMjI0NiwyMCBAQAogCiAgICAgUHlfSU5DUkVGKHRhZyk7CiAgICAgaXQtPnNvdWdodF90YWcgPSB0YWc7Ci0gICAgaXQtPnJvb3RfZG9uZSA9IDA7CiAgICAgaXQtPmdldHRleHQgPSBnZXR0ZXh0OwogICAgIFB5X0lOQ1JFRihzZWxmKTsKICAgICBpdC0+cm9vdF9lbGVtZW50ID0gc2VsZjsKIAogICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKIAotICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFBhcmVudExvY2F0b3IpKTsKKyAgICBpdC0+cGFyZW50X3N0YWNrID0gUHlNZW1fTmV3KFBhcmVudExvY2F0b3IsIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUpOwogICAgIGlmIChpdC0+cGFyZW50X3N0YWNrID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCA9IE5VTEw7Ci0gICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXggPSAwOwotICAgIGl0LT5wYXJlbnRfc3RhY2stPm5leHQgPSBOVUxMOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gSU5JVF9QQVJFTlRfU1RBQ0tfU0laRTsKIAogICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KQEAgLTIzMTMsNyArMjI4NCw3IEBACiAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeTsKIAogICAgIC8qIGVsZW1lbnQgdHJhY2luZyAqLwotICAgIFB5T2JqZWN0ICpldmVudHM7IC8qIGxpc3Qgb2YgZXZlbnRzLCBvciBOVUxMIGlmIG5vdCBjb2xsZWN0aW5nICovCisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQ7IC8qIHRoZSBhcHBlbmQgbWV0aG9kIG9mIHRoZSBsaXN0IG9mIGV2ZW50cywgb3IgTlVMTCAqLwogICAgIFB5T2JqZWN0ICpzdGFydF9ldmVudF9vYmo7IC8qIGV2ZW50IG9iamVjdHMgKE5VTEwgdG8gaWdub3JlKSAqLwogICAgIFB5T2JqZWN0ICplbmRfZXZlbnRfb2JqOwogICAgIFB5T2JqZWN0ICpzdGFydF9uc19ldmVudF9vYmo7CkBAIC0yMzQ4LDcgKzIzMTksNyBAQAogICAgICAgICB9CiAgICAgICAgIHQtPmluZGV4ID0gMDsKIAotICAgICAgICB0LT5ldmVudHMgPSBOVUxMOworICAgICAgICB0LT5ldmVudHNfYXBwZW5kID0gTlVMTDsKICAgICAgICAgdC0+c3RhcnRfZXZlbnRfb2JqID0gdC0+ZW5kX2V2ZW50X29iaiA9IE5VTEw7CiAgICAgICAgIHQtPnN0YXJ0X25zX2V2ZW50X29iaiA9IHQtPmVuZF9uc19ldmVudF9vYmogPSBOVUxMOwogICAgIH0KQEAgLTIzNjcsMTMgKzIzMzgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MWNmYTc1NTg5NzBlZTk2IGlucHV0PTFiNDI0ZWVlZmMzNTI0OWNdKi8KIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKGVsZW1lbnRfZmFjdG9yeSkgewogICAgICAgICBQeV9JTkNSRUYoZWxlbWVudF9mYWN0b3J5KTsKLSAgICAgICAgdG1wID0gc2VsZi0+ZWxlbWVudF9mYWN0b3J5OwotICAgICAgICBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgPSBlbGVtZW50X2ZhY3Rvcnk7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgUHlfU0VUUkVGKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgZWxlbWVudF9mYWN0b3J5KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTIzOTgsNyArMjM2NSw3IEBACiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhcnRfbnNfZXZlbnRfb2JqKTsKICAgICBQeV9DTEVBUihzZWxmLT5lbmRfZXZlbnRfb2JqKTsKICAgICBQeV9DTEVBUihzZWxmLT5zdGFydF9ldmVudF9vYmopOwotICAgIFB5X0NMRUFSKHNlbGYtPmV2ZW50cyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZXZlbnRzX2FwcGVuZCk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhY2spOwogICAgIFB5X0NMRUFSKHNlbGYtPmRhdGEpOwogICAgIFB5X0NMRUFSKHNlbGYtPmxhc3QpOwpAQCAtMjQ3OSwxMyArMjQ0NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlKQogewogICAgIGlmIChhY3Rpb24gIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlUdXBsZV9QYWNrKDIsIGFjdGlvbiwgbm9kZSk7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5T2JqZWN0ICpldmVudCA9IFB5VHVwbGVfUGFjaygyLCBhY3Rpb24sIG5vZGUpOworICAgICAgICBpZiAoZXZlbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzZWxmLT5ldmVudHNfYXBwZW5kLCBldmVudCwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihldmVudCk7CiAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+ZXZlbnRzLCByZXMpIDwgMCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtMjUxNCwxMCArMjQ4MiwxNyBAQAogICAgICAgICBzZWxmLT5kYXRhID0gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoc2VsZi0+ZWxlbWVudF9mYWN0b3J5ICYmIHNlbGYtPmVsZW1lbnRfZmFjdG9yeSAhPSBQeV9Ob25lKSB7Ci0gICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIXNlbGYtPmVsZW1lbnRfZmFjdG9yeSB8fCBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgPT0gUHlfTm9uZSkgewogICAgICAgICBub2RlID0gY3JlYXRlX25ld19lbGVtZW50KHRhZywgYXR0cmliKTsKKyAgICB9IGVsc2UgaWYgKGF0dHJpYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKCFhdHRyaWIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKKyAgICAgICAgUHlfREVDUkVGKGF0dHJpYik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOwogICAgIH0KICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTc2LDEyICsyOTUxLDggQEAKICAgICAgICAgICAgIGF0dHJpYl9pbiArPSAyOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogUGFzcyBhbiBlbXB0eSBkaWN0aW9uYXJ5IG9uICovCi0gICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgaWYgKCFhdHRyaWIpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0YWcpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgYXR0cmliID0gUHlfTm9uZTsKICAgICB9CiAKICAgICBpZiAoVHJlZUJ1aWxkZXJfQ2hlY2tFeGFjdChzZWxmLT50YXJnZXQpKSB7CkBAIC0yOTkwLDYgKzI5NjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgYXR0cmliKTsKICAgICB9CiAgICAgZWxzZSBpZiAoc2VsZi0+aGFuZGxlX3N0YXJ0KSB7CisgICAgICAgIGlmIChhdHRyaWIgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGF0dHJpYik7CisgICAgICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoIWF0dHJpYikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+aGFuZGxlX3N0YXJ0LCAiT08iLCB0YWcsIGF0dHJpYik7CiAgICAgfSBlbHNlCiAgICAgICAgIHJlcyA9IE5VTEw7CkBAIC0zMDYzLDcgKzMwNDIsNyBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXRhcmdldC0+ZXZlbnRzIHx8ICF0YXJnZXQtPnN0YXJ0X25zX2V2ZW50X29iaikKKyAgICBpZiAoIXRhcmdldC0+ZXZlbnRzX2FwcGVuZCB8fCAhdGFyZ2V0LT5zdGFydF9uc19ldmVudF9vYmopCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmICghdXJpKQpAQCAtMzA4Niw3ICszMDY1LDcgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCF0YXJnZXQtPmV2ZW50cykKKyAgICBpZiAoIXRhcmdldC0+ZXZlbnRzX2FwcGVuZCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgdHJlZWJ1aWxkZXJfYXBwZW5kX2V2ZW50KHRhcmdldCwgdGFyZ2V0LT5lbmRfbnNfZXZlbnRfb2JqLCBQeV9Ob25lKTsKQEAgLTM1NzUsNyArMzU1NCw3IEBACiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuWE1MUGFyc2VyLl9zZXRldmVudHMKIAotICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0KHN1YmNsYXNzX29mPScmUHlMaXN0X1R5cGUnKQorICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0CiAgICAgZXZlbnRzX3RvX3JlcG9ydDogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMzU4NSwxMiArMzU2NCwxMiBAQAogX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fc2V0ZXZlbnRzX2ltcGwoWE1MUGFyc2VyT2JqZWN0ICpzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV2ZW50c19xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpldmVudHNfdG9fcmVwb3J0KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9NTlkYjk3NDI5MTBjNjE3NF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9YWJmOTA4MzBhMWMzYjBmY10qLwogewogICAgIC8qIGFjdGl2YXRlIGVsZW1lbnQgZXZlbnQgcmVwb3J0aW5nICovCiAgICAgUHlfc3NpemVfdCBpOwogICAgIFRyZWVCdWlsZGVyT2JqZWN0ICp0YXJnZXQ7Ci0gICAgUHlPYmplY3QgKmV2ZW50c19zZXE7CisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQsICpldmVudHNfc2VxOwogCiAgICAgaWYgKCFUcmVlQnVpbGRlcl9DaGVja0V4YWN0KHNlbGYtPnRhcmdldCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKApAQCAtMzYwMyw4ICszNTgyLDEwIEBACiAKICAgICB0YXJnZXQgPSAoVHJlZUJ1aWxkZXJPYmplY3QqKSBzZWxmLT50YXJnZXQ7CiAKLSAgICBQeV9JTkNSRUYoZXZlbnRzX3F1ZXVlKTsKLSAgICBQeV9TRVRSRUYodGFyZ2V0LT5ldmVudHMsIGV2ZW50c19xdWV1ZSk7CisgICAgZXZlbnRzX2FwcGVuZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXZlbnRzX3F1ZXVlLCAiYXBwZW5kIik7CisgICAgaWYgKGV2ZW50c19hcHBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfU0VUUkVGKHRhcmdldC0+ZXZlbnRzX2FwcGVuZCwgZXZlbnRzX2FwcGVuZCk7CiAKICAgICAvKiBjbGVhciBvdXQgZXhpc3RpbmcgZXZlbnRzICovCiAgICAgUHlfQ0xFQVIodGFyZ2V0LT5zdGFydF9ldmVudF9vYmopOwpAQCAtMzczNyw2ICszNzE4LDI2IEBACiAgICAgKG9iam9iamFyZ3Byb2MpIGVsZW1lbnRfYXNzX3N1YnNjciwKIH07CiAKK3N0YXRpYyBQeUdldFNldERlZiBlbGVtZW50X2dldHNldGxpc3RbXSA9IHsKKyAgICB7InRhZyIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90YWdfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGFnX3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIn0sCisgICAgeyJ0ZXh0IiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RleHRfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGV4dF9zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBvZiB0ZXh0IGRpcmVjdGx5IGFmdGVyIHRoZSBzdGFydCB0YWcsIG9yIE5vbmUifSwKKyAgICB7InRhaWwiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGFpbF9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90YWlsX3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIG9mIHRleHQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGVuZCB0YWcsIG9yIE5vbmUifSwKKyAgICB7ImF0dHJpYiIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF9hdHRyaWJfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfYXR0cmliX3NldHRlciwKKyAgICAgICAgIkEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyJ9LAorICAgIHtOVUxMfSwKK307CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgRWxlbWVudF9UeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJ4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudCIsIHNpemVvZihFbGVtZW50T2JqZWN0KSwgMCwKQEAgLTM3NTMsOCArMzc1NCw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLSAgICAoZ2V0YXR0cm9mdW5jKWVsZW1lbnRfZ2V0YXR0cm8sICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotICAgIChzZXRhdHRyb2Z1bmMpZWxlbWVudF9zZXRhdHRybywgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KQEAgLTM3NjcsNyArMzc2OCw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBlbGVtZW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIGVsZW1lbnRfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19nZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKaW5kZXggZjA3MGExNC4uYmY3YjAzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2dkYm1tb2R1bGUuYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOwogfQogCi1zdGF0aWMgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCitzdGF0aWMgY29uc3QgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCiAjaWZkZWYgR0RCTV9GQVNUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCmluZGV4IGMzNDM4NjIuLjFjMzdjNzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwpAQCAtNjYsNyArNjYsNyBAQAogCiAgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwogICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7Ci0gICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KKyAgICBsaW1pdCA9IGVuZHBvcyA+PiAxOyAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLwogICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgewogICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCkBAIC03OCw2ICs3OCw3IEBACiAgICAgICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBjaGlsZHBvcyArPSAoKHVuc2lnbmVkKWNtcCBeIDEpOyAgIC8qIGluY3JlbWVudCB3aGVuIGNtcD09MCAqLworICAgICAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsgICAgICAgICAvKiBhcnIgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwpAQCAtODUsNyArODYsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0gICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7CiAgICAgICAgIHRtcDEgPSBhcnJbY2hpbGRwb3NdOwogICAgICAgICB0bXAyID0gYXJyW3Bvc107CiAgICAgICAgIGFycltjaGlsZHBvc10gPSB0bXAyOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LAogICAgICAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgogICAgICovCi0gICAgZm9yIChpID0gbi8yIC0gMSA7IGkgPj0gMCA7IGktLSkKKyAgICBmb3IgKGkgPSAobiA+PiAxKSAtIDEgOyBpID49IDAgOyBpLS0pCiAgICAgICAgIGlmIChzaWZ0dXBfZnVuYygoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCiAgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwogICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7Ci0gICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KKyAgICBsaW1pdCA9IGVuZHBvcyA+PiAxOyAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLwogICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgewogICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCkBAIC00MzIsNiArNDMyLDcgQEAKICAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIGNoaWxkcG9zICs9ICgodW5zaWduZWQpY21wIF4gMSk7ICAgLyogaW5jcmVtZW50IHdoZW4gY21wPT0wICovCisgICAgICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOyAgICAgICAgIC8qIGFyciBtYXkgaGF2ZSBjaGFuZ2VkICovCiAgICAgICAgICAgICBpZiAoZW5kcG9zICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CkBAIC00MzksNyArNDQwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwotICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwogICAgICAgICB0bXAxID0gYXJyW2NoaWxkcG9zXTsKICAgICAgICAgdG1wMiA9IGFycltwb3NdOwogICAgICAgICBhcnJbY2hpbGRwb3NdID0gdG1wMjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5jIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKaW5kZXggZWM2ODE3MC4uZDhhYTFkZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKQEAgLTIzOCw3ICsyMzgsOCBAQAogICAgIGludCB0ZXh0ID0gMCwgYmluYXJ5ID0gMCwgdW5pdmVyc2FsID0gMDsKIAogICAgIGNoYXIgcmF3bW9kZVs2XSwgKm07Ci0gICAgaW50IGxpbmVfYnVmZmVyaW5nLCBpc2F0dHk7CisgICAgaW50IGxpbmVfYnVmZmVyaW5nOworICAgIGxvbmcgaXNhdHR5OwogCiAgICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTI0OCw4ICsyNDksOCBAQAogICAgIF9QeV9JREVOVElGSUVSKGNsb3NlKTsKIAogICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGZpbGUpICYmCi0JIVB5Qnl0ZXNfQ2hlY2soZmlsZSkgJiYKLQkhUHlOdW1iZXJfQ2hlY2soZmlsZSkpIHsKKyAgICAgICAgIVB5Qnl0ZXNfQ2hlY2soZmlsZSkgJiYKKyAgICAgICAgIVB5TnVtYmVyX0NoZWNrKGZpbGUpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbnZhbGlkIGZpbGU6ICVSIiwgZmlsZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMwNyw5ICszMDgsOSBAQAogCiAgICAgLyogUGFyYW1ldGVycyB2YWxpZGF0aW9uICovCiAgICAgaWYgKHVuaXZlcnNhbCkgewotICAgICAgICBpZiAod3JpdGluZyB8fCBhcHBlbmRpbmcpIHsKKyAgICAgICAgaWYgKGNyZWF0aW5nIHx8IHdyaXRpbmcgfHwgYXBwZW5kaW5nIHx8IHVwZGF0aW5nKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIFUgYW5kIHdyaXRpbmcgbW9kZSBhdCBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB4JywgJ3cnLCAnYScsIG9yICcrJyIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCkBAIC00MzcsMTAgKzQzOCwxMCBAQAogCiAgICAgLyogd3JhcHMgaW50byBhIFRleHRJT1dyYXBwZXIgKi8KICAgICB3cmFwcGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKSZQeVRleHRJT1dyYXBwZXJfVHlwZSwKLQkJCQkgICAgIk9zc3NpIiwKLQkJCQkgICAgYnVmZmVyLAotCQkJCSAgICBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLAotCQkJCSAgICBsaW5lX2J1ZmZlcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3Nzc2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfYnVmZmVyaW5nKTsKICAgICBpZiAod3JhcHBlciA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIHJlc3VsdCA9IHdyYXBwZXI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuaCBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCmluZGV4IDBjNmVhZTIuLjNjNDhmZjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5oCkBAIC02MCw3ICs2MCw3IEBACiAgICAqIE90aGVyd2lzZSwgdGhlIGxpbmUgZW5kaW5nIGlzIHNwZWNpZmllZCBieSByZWFkbmwsIGEgc3RyIG9iamVjdCAqLwogZXh0ZXJuIFB5X3NzaXplX3QgX1B5SU9fZmluZF9saW5lX2VuZGluZygKICAgICBpbnQgdHJhbnNsYXRlZCwgaW50IHVuaXZlcnNhbCwgUHlPYmplY3QgKnJlYWRubCwKLSAgICBpbnQga2luZCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpOworICAgIGludCBraW5kLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCk7CiAKIC8qIFJldHVybiAxIGlmIGFuIEVudmlyb25tZW50RXJyb3Igd2l0aCBlcnJubyA9PSBFSU5UUiBpcyBzZXQgKGFuZCB0aGVuCiAgICBjbGVhcnMgdGhlIGVycm9yIGluZGljYXRvciksIDAgb3RoZXJ3aXNlLgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCmluZGV4IGFlNGFmOWQuLmY1NjQ5YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYworKysgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKQEAgLTY1OSw3ICs2NTksNyBAQAogCiAvKiBTZXRzIHRoZSBjdXJyZW50IGVycm9yIHRvIEJsb2NraW5nSU9FcnJvciAqLwogc3RhdGljIHZvaWQKLV9zZXRfQmxvY2tpbmdJT0Vycm9yKGNoYXIgKm1zZywgUHlfc3NpemVfdCB3cml0dGVuKQorX3NldF9CbG9ja2luZ0lPRXJyb3IoY29uc3QgY2hhciAqbXNnLCBQeV9zc2l6ZV90IHdyaXR0ZW4pCiB7CiAgICAgUHlPYmplY3QgKmVycjsKICAgICBQeUVycl9DbGVhcigpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vYnl0ZXNpby5jIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCmluZGV4IDk5ZTcxYmMuLjYzMzNlNDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYworKysgYi9Nb2R1bGVzL19pby9ieXRlc2lvLmMKQEAgLTg3LDcgKzg3LDcgQEAKIHN0YXRpYyBpbnQKIHVuc2hhcmVfYnVmZmVyKGJ5dGVzaW8gKnNlbGYsIHNpemVfdCBzaXplKQogewotICAgIFB5T2JqZWN0ICpuZXdfYnVmLCAqb2xkX2J1ZjsKKyAgICBQeU9iamVjdCAqbmV3X2J1ZjsKICAgICBhc3NlcnQoU0hBUkVEX0JVRihzZWxmKSk7CiAgICAgYXNzZXJ0KHNlbGYtPmV4cG9ydHMgPT0gMCk7CiAgICAgYXNzZXJ0KHNpemUgPj0gKHNpemVfdClzZWxmLT5zdHJpbmdfc2l6ZSk7CkBAIC05Niw5ICs5Niw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBtZW1jcHkoUHlCeXRlc19BU19TVFJJTkcobmV3X2J1ZiksIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYtPmJ1ZiksCiAgICAgICAgICAgIHNlbGYtPnN0cmluZ19zaXplKTsKLSAgICBvbGRfYnVmID0gc2VsZi0+YnVmOwotICAgIHNlbGYtPmJ1ZiA9IG5ld19idWY7Ci0gICAgUHlfREVDUkVGKG9sZF9idWYpOworICAgIFB5X1NFVFJFRihzZWxmLT5idWYsIG5ld19idWYpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9maWxlaW8uYyBiL01vZHVsZXMvX2lvL2ZpbGVpby5jCmluZGV4IGRiZDYwNGEuLjhiZjM5MjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2ZpbGVpby5jCisrKyBiL01vZHVsZXMvX2lvL2ZpbGVpby5jCkBAIC01NDAsNyArNTQwLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWVycl9tb2RlKGNoYXIgKmFjdGlvbikKK2Vycl9tb2RlKGNvbnN0IGNoYXIgKmFjdGlvbikKIHsKICAgICBfUHlJT19TdGF0ZSAqc3RhdGUgPSBJT19TVEFURSgpOwogICAgIGlmIChzdGF0ZSAhPSBOVUxMKQpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIH0KICNlbmRpZiAvKiBIQVZFX0ZUUlVOQ0FURSAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBtb2RlX3N0cmluZyhmaWxlaW8gKnNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmNyZWF0ZWQpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3RleHRpby5jIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKaW5kZXggYjFkMmI2Zi4uOGM5NzMyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vdGV4dGlvLmMKKysrIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKQEAgLTc3Miw3ICs3NzIsNyBAQAogICAgIGVuY29kZWZ1bmNfdCBlbmNvZGVmdW5jOwogfSBlbmNvZGVmdW5jZW50cnk7CiAKLXN0YXRpYyBlbmNvZGVmdW5jZW50cnkgZW5jb2RlZnVuY3NbXSA9IHsKK3N0YXRpYyBjb25zdCBlbmNvZGVmdW5jZW50cnkgZW5jb2RlZnVuY3NbXSA9IHsKICAgICB7ImFzY2lpIiwgICAgICAgKGVuY29kZWZ1bmNfdCkgYXNjaWlfZW5jb2RlfSwKICAgICB7Imlzbzg4NTktMSIsICAgKGVuY29kZWZ1bmNfdCkgbGF0aW4xX2VuY29kZX0sCiAgICAgeyJ1dGYtOCIsICAgICAgIChlbmNvZGVmdW5jX3QpIHV0ZjhfZW5jb2RlfSwKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgewotICAgICAgICAgICAgZW5jb2RlZnVuY2VudHJ5ICplID0gZW5jb2RlZnVuY3M7CisgICAgICAgICAgICBjb25zdCBlbmNvZGVmdW5jZW50cnkgKmUgPSBlbmNvZGVmdW5jczsKICAgICAgICAgICAgIHdoaWxlIChlLT5uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKHJlcywgZS0+bmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZW5jb2RlZnVuYyA9IGUtPmVuY29kZWZ1bmM7CkBAIC0xNjQ0LDggKzE2NDQsOCBAQAogLyogTk9URTogYGVuZGAgbXVzdCBwb2ludCB0byB0aGUgcmVhbCBlbmQgb2YgdGhlIFB5X1VDUzQgc3RvcmFnZSwKICAgIHRoYXQgaXMgdG8gdGhlIE5VTCBjaGFyYWN0ZXIuIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gd2lsbCBwcm9kdWNlCiAgICBpbmNvcnJlY3QgcmVzdWx0cy4gKi8KLXN0YXRpYyBjaGFyICoKLWZpbmRfY29udHJvbF9jaGFyKGludCBraW5kLCBjaGFyICpzLCBjaGFyICplbmQsIFB5X1VDUzQgY2gpCitzdGF0aWMgY29uc3QgY2hhciAqCitmaW5kX2NvbnRyb2xfY2hhcihpbnQga2luZCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZW5kLCBQeV9VQ1M0IGNoKQogewogICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgIGFzc2VydChjaCA8IDI1Nik7CkBAIC0xNjY1LDEzICsxNjY1LDEzIEBACiBQeV9zc2l6ZV90CiBfUHlJT19maW5kX2xpbmVfZW5kaW5nKAogICAgIGludCB0cmFuc2xhdGVkLCBpbnQgdW5pdmVyc2FsLCBQeU9iamVjdCAqcmVhZG5sLAotICAgIGludCBraW5kLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKKyAgICBpbnQga2luZCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpCiB7CiAgICAgUHlfc3NpemVfdCBsZW4gPSAoKGNoYXIqKWVuZCAtIChjaGFyKilzdGFydCkva2luZDsKIAogICAgIGlmICh0cmFuc2xhdGVkKSB7CiAgICAgICAgIC8qIE5ld2xpbmVzIGFyZSBhbHJlYWR5IHRyYW5zbGF0ZWQsIG9ubHkgc2VhcmNoIGZvciBcbiAqLwotICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCAnXG4nKTsKKyAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgJ1xuJyk7CiAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAocG9zIC0gc3RhcnQpL2tpbmQgKyAxOwogICAgICAgICBlbHNlIHsKQEAgLTE2ODMsNyArMTY4Myw3IEBACiAgICAgICAgIC8qIFVuaXZlcnNhbCBuZXdsaW5lIHNlYXJjaC4gRmluZCBhbnkgb2YgXHIsIFxyXG4sIFxuCiAgICAgICAgICAqIFRoZSBkZWNvZGVyIGVuc3VyZXMgdGhhdCBcclxuIGFyZSBub3Qgc3BsaXQgaW4gdHdvIHBpZWNlcwogICAgICAgICAgKi8KLSAgICAgICAgY2hhciAqcyA9IHN0YXJ0OworICAgICAgICBjb25zdCBjaGFyICpzID0gc3RhcnQ7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIFB5X1VDUzQgY2g7CiAgICAgICAgICAgICAvKiBGYXN0IHBhdGggZm9yIG5vbi1jb250cm9sIGNoYXJzLiBUaGUgbG9vcCBhbHdheXMgZW5kcwpAQCAtMTcxMywyMSArMTcxMywyMSBAQAogICAgICAgICAvKiBBc3N1bWUgdGhhdCByZWFkbmwgaXMgYW4gQVNDSUkgY2hhcmFjdGVyLiAqLwogICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVhZG5sKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CiAgICAgICAgIGlmIChyZWFkbmxfbGVuID09IDEpIHsKLSAgICAgICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsIG5sWzBdKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsIG5sWzBdKTsKICAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gKHBvcyAtIHN0YXJ0KS9raW5kICsgMTsKICAgICAgICAgICAgICpjb25zdW1lZCA9IGxlbjsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBzdGFydDsKLSAgICAgICAgICAgIGNoYXIgKmUgPSBlbmQgLSAocmVhZG5sX2xlbiAtIDEpKmtpbmQ7Ci0gICAgICAgICAgICBjaGFyICpwb3M7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gc3RhcnQ7CisgICAgICAgICAgICBjb25zdCBjaGFyICplID0gZW5kIC0gKHJlYWRubF9sZW4gLSAxKSpraW5kOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zOwogICAgICAgICAgICAgaWYgKGUgPCBzKQogICAgICAgICAgICAgICAgIGUgPSBzOwogICAgICAgICAgICAgd2hpbGUgKHMgPCBlKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICAgICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHMsIGVuZCwgbmxbMF0pOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHMsIGVuZCwgbmxbMF0pOwogICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gTlVMTCB8fCBwb3MgPj0gZSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJlYWRubF9sZW47IGkrKykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fanNvbi5jIGIvTW9kdWxlcy9fanNvbi5jCmluZGV4IGY2M2Q3NTguLjNjODU3YWUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2pzb24uYworKysgYi9Nb2R1bGVzL19qc29uLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9lbmNvZGVkX2NvbnN0KFB5T2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQKLXJhaXNlX2Vycm1zZyhjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCk7CityYWlzZV9lcnJtc2coY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpOwogc3RhdGljIFB5T2JqZWN0ICoKIGVuY29kZXJfZW5jb2RlX3N0cmluZyhQeUVuY29kZXJPYmplY3QgKnMsIFB5T2JqZWN0ICpvYmopOwogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTMyMyw3ICszMjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcmFpc2VfZXJybXNnKGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQorcmFpc2VfZXJybXNnKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQogewogICAgIC8qIFVzZSBKU09ORGVjb2RlRXJyb3IgZXhjZXB0aW9uIHRvIHJhaXNlIGEgbmljZSBsb29raW5nIFZhbHVlRXJyb3Igc3ViY2xhc3MgKi8KICAgICBzdGF0aWMgUHlPYmplY3QgKkpTT05EZWNvZGVFcnJvciA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGIxZDZhZGQuLmE5MmZiMTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIC8qIHRoZSBncm91cGluZyBpcyB0ZXJtaW5hdGVkIGJ5IGVpdGhlciAwIG9yIENIQVJfTUFYICovCiBzdGF0aWMgUHlPYmplY3QqCi1jb3B5X2dyb3VwaW5nKGNoYXIqIHMpCitjb3B5X2dyb3VwaW5nKGNvbnN0IGNoYXIqIHMpCiB7CiAgICAgaW50IGk7CiAgICAgUHlPYmplY3QgKnJlc3VsdCwgKnZhbCA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19waWNrbGUuYyBiL01vZHVsZXMvX3BpY2tsZS5jCmluZGV4IDJhMDcwZTIuLmI0MmY0ZjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3BpY2tsZS5jCisrKyBiL01vZHVsZXMvX3BpY2tsZS5jCkBAIC0xNTMsNiArMTUzLDkgQEAKICAgICBQeU9iamVjdCAqY29kZWNzX2VuY29kZTsKICAgICAvKiBidWlsdGlucy5nZXRhdHRyLCB1c2VkIGZvciBzYXZpbmcgbmVzdGVkIG5hbWVzIHdpdGggcHJvdG9jb2wgPCA0ICovCiAgICAgUHlPYmplY3QgKmdldGF0dHI7CisgICAgLyogZnVuY3Rvb2xzLnBhcnRpYWwsIHVzZWQgZm9yIGltcGxlbWVudGluZyBfX25ld29ial9leF9fIHdpdGggcHJvdG9jb2xzCisgICAgICAgMiBhbmQgMyAqLworICAgIFB5T2JqZWN0ICpwYXJ0aWFsOwogfSBQaWNrbGVTdGF0ZTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgX3BpY2tsZSBtb2R1bGUgZGVmaW5pdGlvbi4gKi8KQEAgLTE5MCw2ICsxOTMsNyBAQAogICAgIFB5X0NMRUFSKHN0LT5pbXBvcnRfbWFwcGluZ18zdG8yKTsKICAgICBQeV9DTEVBUihzdC0+Y29kZWNzX2VuY29kZSk7CiAgICAgUHlfQ0xFQVIoc3QtPmdldGF0dHIpOworICAgIFB5X0NMRUFSKHN0LT5wYXJ0aWFsKTsKIH0KIAogLyogSW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gcGlja2xlIG1vZHVsZSBzdGF0ZS4gKi8KQEAgLTIwMCw2ICsyMDQsNyBAQAogICAgIFB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29tcGF0X3BpY2tsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmNvZGVjcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmN0b29scyA9IE5VTEw7CiAKICAgICBidWlsdGlucyA9IFB5RXZhbF9HZXRCdWlsdGlucygpOwogICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQpAQCAtMzE0LDEyICszMTksMjEgQEAKICAgICB9CiAgICAgUHlfQ0xFQVIoY29kZWNzKTsKIAorICAgIGZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7CisgICAgaWYgKCFmdW5jdG9vbHMpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3QtPnBhcnRpYWwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInBhcnRpYWwiKTsKKyAgICBpZiAoIXN0LT5wYXJ0aWFsKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CisKICAgICByZXR1cm4gMDsKIAogICBlcnJvcjoKICAgICBQeV9DTEVBUihjb3B5cmVnKTsKICAgICBQeV9DTEVBUihjb21wYXRfcGlja2xlKTsKICAgICBQeV9DTEVBUihjb2RlY3MpOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CiAgICAgX1BpY2tsZV9DbGVhclN0YXRlKHN0KTsKICAgICByZXR1cm4gLTE7CiB9CkBAIC0zNTYsMTggKzM3MCwxMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotc3RhY2tfdW5kZXJmbG93KHZvaWQpCi17Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qIEludGVybmFsIGRhdGEgdHlwZSB1c2VkIGFzIHRoZSB1bnBpY2tsaW5nIHN0YWNrLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgUHlPYmplY3QgKipkYXRhOworICAgIGludCBtYXJrX3NldDsgICAgICAgICAgLyogaXMgTUFSSyBzZXQ/ICovCisgICAgUHlfc3NpemVfdCBmZW5jZTsgICAgICAvKiBwb3NpdGlvbiBvZiB0b3AgTUFSSyBvciAwICovCiAgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7ICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KIH0gUGRhdGE7CiAKQEAgLTM5OCw2ICs0MDYsOCBAQAogICAgIGlmICghKHNlbGYgPSBQeU9iamVjdF9OZXcoUGRhdGEsICZQZGF0YV9UeXBlKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1NJWkUoc2VsZikgPSAwOworICAgIHNlbGYtPm1hcmtfc2V0ID0gMDsKKyAgICBzZWxmLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+YWxsb2NhdGVkID0gODsKICAgICBzZWxmLT5kYXRhID0gUHlNZW1fTUFMTE9DKHNlbGYtPmFsbG9jYXRlZCAqIHNpemVvZihQeU9iamVjdCAqKSk7CiAgICAgaWYgKHNlbGYtPmRhdGEpCkBAIC00MTUsOCArNDI1LDcgQEAKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBQeV9TSVpFKHNlbGYpOwogCi0gICAgaWYgKGNsZWFydG8gPCAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgYXNzZXJ0KGNsZWFydG8gPj0gc2VsZi0+ZmVuY2UpOwogICAgIGlmIChjbGVhcnRvID49IGkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC00NTIsNiArNDYxLDE3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50CitQZGF0YV9zdGFja191bmRlcmZsb3coUGRhdGEgKnNlbGYpCit7CisgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXJrX3NldCA/CisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE1BUksgZm91bmQiIDoKKyAgICAgICAgICAgICAgICAgICAgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOworfQorCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4KQEAgLTQ1OSw5ICs0NzksOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcChQZGF0YSAqc2VsZikKIHsKLSAgICBpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5mZW5jZSkgeworICAgICAgICBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc2VsZi0+ZGF0YVstLVB5X1NJWkUoc2VsZildOwpAQCAtNDkzLDYgKzUxMiwxMCBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKICAgICBQeV9zc2l6ZV90IGxlbiwgaSwgajsKIAorICAgIGlmIChzdGFydCA8IHNlbGYtPmZlbmNlKSB7CisgICAgICAgIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGxlbiA9IFB5X1NJWkUoc2VsZikgLSBzdGFydDsKICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC04NjAsNyArODgzLDcgQEAKIHsKICAgICBzaXplX3QgaTsKIAotICAgIGFzc2VydChzaXplb2Yoc2l6ZV90KSA8PSA4KTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPD0gOCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpemVfdCk7IGkrKykgewogICAgICAgICBvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+ICg4ICogaSkpICYgMHhmZik7CkBAIC0yMDk2LDM4ICsyMTE5LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmF3X3VuaWNvZGVfZXNjYXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7Ci0gICAgc2l6ZV90IGV4cGFuZHNpemU7CiAgICAgdm9pZCAqZGF0YTsKICAgICB1bnNpZ25lZCBpbnQga2luZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKG9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShvYmopOwogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChvYmopOwotICAgIGlmIChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKQotICAgICAgICBleHBhbmRzaXplID0gMTA7Ci0gICAgZWxzZQotICAgICAgICBleHBhbmRzaXplID0gNjsKIAotICAgIGlmICgoc2l6ZV90KXNpemUgPiAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIHNpemUpOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHJldHVybiByZXByOwotICAgIGFzc2VydChQeV9SRUZDTlQocmVwcikgPT0gMSk7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwogICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtMjEzOSw4ICsyMTU5LDEzIEBACiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMTVdOwogICAgICAgICB9Ci0gICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLworICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMsICdcXCcgYW5kICdcbicgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMjU2IHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA2LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweGZdOwpAQCAtMjE1MiwxNCArMjE3NywxNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KLSAgICBzaXplID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcHIsIHNpemUpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHApOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50Ci13cml0ZV91dGY4KFBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKmRhdGEsIFB5X3NzaXplX3Qgc2l6ZSkKK3dyaXRlX3V0ZjgoUGlja2xlck9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqZGF0YSwgUHlfc3NpemVfdCBzaXplKQogewogICAgIGNoYXIgaGVhZGVyWzldOwogICAgIFB5X3NzaXplX3QgbGVuOwpAQCAtMzUzMSwxMSArMzU1OCw5IEBACiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotICAgICAgICAgICAgaWYgKHNlbGYtPnByb3RvID49IDQpIHsKLSAgICAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKLSAgICAgICAgICAgICAgICB1c2VfbmV3b2JqX2V4ID0gUHlVbmljb2RlX0NvbXBhcmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOworICAgICAgICAgICAgdXNlX25ld29ial9leCA9IFB5VW5pY29kZV9Db21wYXJlKAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKICAgICAgICAgICAgIGlmICghdXNlX25ld29ial9leCkgewogICAgICAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX18pOwogICAgICAgICAgICAgICAgIHVzZV9uZXdvYmogPSBQeVVuaWNvZGVfQ29tcGFyZSgKQEAgLTM1NzksMTEgKzM2MDQsNTggQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJm5ld29ial9leF9vcCwgMSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT5wcm90byA+PSA0KSB7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZuZXdvYmpfZXhfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdhcmdzOworICAgICAgICAgICAgUHlPYmplY3QgKmNsc19uZXc7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld19fKTsKKworICAgICAgICAgICAgbmV3YXJncyA9IFB5VHVwbGVfTmV3KFB5X1NJWkUoYXJncykgKyAyKTsKKyAgICAgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBjbHNfbmV3ID0gX1B5T2JqZWN0X0dldEF0dHJJZChjbHMsICZQeUlkX19fbmV3X18pOworICAgICAgICAgICAgaWYgKGNsc19uZXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIGNsc19uZXcpOworICAgICAgICAgICAgUHlfSU5DUkVGKGNscyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDEsIGNscyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhcmdzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIGkgKyAyLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FsbGFibGUgPSBQeU9iamVjdF9DYWxsKHN0LT5wYXJ0aWFsLCBuZXdhcmdzLCBrd2FyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGNhbGxhYmxlLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIG5ld2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZyZWR1Y2Vfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAodXNlX25ld29iaikgewpAQCAtNDUyMCwxMyArNDU5MiwxOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1hcmtlcihVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5X3NzaXplX3QgbWFyazsKKwogICAgIGlmIChzZWxmLT5udW1fbWFya3MgPCAxKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJjb3VsZCBub3QgZmluZCBNQVJLIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIG1hcmsgPSBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CisgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gc2VsZi0+bnVtX21hcmtzICE9IDA7CisgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gc2VsZi0+bnVtX21hcmtzID8KKyAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICByZXR1cm4gbWFyazsKIH0KIAogc3RhdGljIGludApAQCAtNDk4Nyw3ICs1MDY1LDcgQEAKICAgICBQeU9iamVjdCAqdHVwbGU7CiAKICAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCBsZW4pCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICB0dXBsZSA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC01MDY5LDYgKzUxNDcsMTMgQEAKICAgICBpZiAoKGRpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKIAorICAgIGlmICgoaiAtIGkpICUgMiAhPSAwKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJvZGQgbnVtYmVyIG9mIGl0ZW1zIGZvciBESUNUIik7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGZvciAoayA9IGkgKyAxOyBrIDwgajsgayArPSAyKSB7CiAgICAgICAgIGtleSA9IHNlbGYtPnN0YWNrLT5kYXRhW2sgLSAxXTsKICAgICAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtrXTsKQEAgLTUxMzYsNyArNTIyMSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGkgPCAxKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogCiAgICAgYXJncyA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBpICsgMSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKQEAgLTU0NTMsMTIgKzU1MzgsMTUgQEAKICAgICAgKi8KICAgICBpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKICAgICAgICAgc2VsZi0+bnVtX21hcmtzLS07Ci0gICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IHNlbGYtPm51bV9tYXJrcyAhPSAwOworICAgICAgICBzZWxmLT5zdGFjay0+ZmVuY2UgPSBzZWxmLT5udW1fbWFya3MgPworICAgICAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICB9IGVsc2UgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOworICAgIGVsc2UgewogICAgICAgICBsZW4tLTsKICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YWNrLT5kYXRhW2xlbl0pOwogICAgICAgICBQeV9TSVpFKHNlbGYtPnN0YWNrKSA9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNTQ4MCwxMCArNTU2OCwxMCBAQAogbG9hZF9kdXAoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7CiAKLSAgICBpZiAoKGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGxhc3QgPSBzZWxmLT5zdGFjay0+ZGF0YVtsZW4gLSAxXTsKICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIGxhc3QsIC0xKTsKICAgICByZXR1cm4gMDsKQEAgLTU2NjYsOCArNTc1NCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAobGVuIDwgMikKICAgICAgICAgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAga2V5ID0gUHlMb25nX0Zyb21TdHJpbmcocywgTlVMTCwgMTApOwpAQCAtNTY5NSw4ICs1NzgzLDggQEAKICAgICBpZiAoX1VucGlja2xlcl9SZWFkKHNlbGYsICZzLCAxKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgaWR4ID0gUHlfQ0hBUk1BU0soc1swXSk7CkBAIC01NzE0LDggKzU4MDIsOCBAQAogICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDQpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBpZHggPSBjYWxjX2JpbnNpemUocywgNCk7CkBAIC01NzMzLDggKzU4MjEsOCBAQAogewogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgcmV0dXJuIF9VbnBpY2tsZXJfTWVtb1B1dChzZWxmLCBzZWxmLT5tZW1vX2xlbiwgdmFsdWUpOwpAQCAtNTc0OCw4ICs1ODM2LDggQEAKICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKIAogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmICh4ID4gbGVuIHx8IHggPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmICh4ID4gbGVuIHx8IHggPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IHgpICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01Nzk4LDggKzU4ODYsOCBAQAogc3RhdGljIGludAogbG9hZF9hcHBlbmQoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSk7CiB9CiAKQEAgLTU4MjEsOCArNTkwOSw4IEBACiAgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKLSAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgaWYgKGxlbiA9PSB4KSAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoKGxlbiAtIHgpICUgMiAhPSAwKSB7CkBAIC01ODc1LDggKzU5NjMsOCBAQAogICAgIGlmIChtYXJrIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IG1hcmspICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01OTMxLDggKzYwMTksOCBAQAogICAgIC8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0CiAgICAgICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KICAgICAgKi8KLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCAyKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMiA8IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHN0YXRlKTsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkKQEAgLTYwNjgsNyArNjE1Niw4IEBACiAgICAgICAgIHNlbGYtPm1hcmtzX3NpemUgPSAoUHlfc3NpemVfdClhbGxvYzsKICAgICB9CiAKLSAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAxOworICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IHNlbGYtPnN0YWNrLT5mZW5jZSA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC02MTUxLDYgKzYyNDAsOCBAQAogICAgIGNoYXIgKnMgPSBOVUxMOwogCiAgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAwOworICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+cHJvdG8gPSAwOwogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSkKICAgICAgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwppbmRleCA4YmVkYWI1Li5hMDEwOWZiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYworKysgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwpAQCAtNzIsNyArNzIsNyBAQAogCiAvKiBDb252ZXJ0IEFTQ0lJIHRvIGEgcG9zaXRpdmUgaW50LCBubyBsaWJjIGNhbGwuIG5vIG92ZXJmbG93LiAtMSBvbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLV9wb3NfaW50X2Zyb21fYXNjaWkoY2hhciAqbmFtZSkKK19wb3NfaW50X2Zyb21fYXNjaWkoY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBpbnQgbnVtID0gMDsKICAgICB3aGlsZSAoKm5hbWUgPj0gJzAnICYmICpuYW1lIDw9ICc5JykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwppbmRleCA5NWFkNGE0Li5hODVkOTA1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYworKysgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwpAQCAtOTksNyArOTksNyBAQAogZ2VucmFuZF9pbnQzMihSYW5kb21PYmplY3QgKnNlbGYpCiB7CiAgICAgUFlfVUlOVDMyX1QgeTsKLSAgICBzdGF0aWMgUFlfVUlOVDMyX1QgbWFnMDFbMl09ezB4MFUsIE1BVFJJWF9BfTsKKyAgICBzdGF0aWMgY29uc3QgUFlfVUlOVDMyX1QgbWFnMDFbMl0gPSB7MHgwVSwgTUFUUklYX0F9OwogICAgIC8qIG1hZzAxW3hdID0geCAqIE1BVFJJWF9BICBmb3IgeD0wLDEgKi8KICAgICBQWV9VSU5UMzJfVCAqbXQ7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NjcHJveHkuYyBiL01vZHVsZXMvX3NjcHJveHkuYwppbmRleCA2NmI2ZTM0Li42OGJlNDU4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zY3Byb3h5LmMKKysrIGIvTW9kdWxlcy9fc2Nwcm94eS5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIH0KIAogc3RhdGljIGludAotc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKK3NldF9wcm94eShQeU9iamVjdCogcHJveGllcywgY29uc3QgY2hhciogcHJvdG8sIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QsCiAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwKICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBob3N0S2V5LCBDRlN0cmluZ1JlZiBwb3J0S2V5KQogewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNzAxOGY5Zi4uNzVlZDFmOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0xNjIyLDcgKzE2MjIsNyBAQAogICAgIFB5X1JFVFVSTl9GQUxTRTsKIH0KIAotc3RhdGljIGNoYXIgY29ubmVjdGlvbl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwppbmRleCBjMGM4NzQ2Li5jZGI5MWVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQocHlzcWxpdGVfQ3Vyc29yKiBzZWxmKTsKIAotc3RhdGljIGNoYXIqIGVycm1zZ19mZXRjaF9hY3Jvc3Nfcm9sbGJhY2sgPSAiQ3Vyc29yIG5lZWRlZCB0byBiZSByZXNldCBiZWNhdXNlIG9mIGNvbW1pdC9yb2xsYmFjayBhbmQgY2FuIG5vIGxvbmdlciBiZSBmZXRjaGVkIGZyb20uIjsKK3N0YXRpYyBjb25zdCBjaGFyIGVycm1zZ19mZXRjaF9hY3Jvc3Nfcm9sbGJhY2tbXSA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOwogCiBzdGF0aWMgcHlzcWxpdGVfU3RhdGVtZW50S2luZCBkZXRlY3Rfc3RhdGVtZW50X3R5cGUoY29uc3QgY2hhciogc3RhdGVtZW50KQogewpAQCAtMTA1MCw3ICsxMDUwLDcgQEAKICAgICB7TlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIGN1cnNvcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjdXJzb3JfZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY3Vyc29yIGNsYXNzLiIpOwogCiBQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ3Vyc29yVHlwZSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwppbmRleCA3YTdlODYwLi5mZjJlM2E1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0yNjEsMTMgKzI2MSwxMyBAQAogfTsKIAogc3RydWN0IF9JbnRDb25zdGFudFBhaXIgewotICAgIGNoYXIqIGNvbnN0YW50X25hbWU7CisgICAgY29uc3QgY2hhciAqY29uc3RhbnRfbmFtZTsKICAgICBpbnQgY29uc3RhbnRfdmFsdWU7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIEludENvbnN0YW50UGFpcjsKIAotc3RhdGljIEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0geworc3RhdGljIGNvbnN0IEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0gewogICAgIHsiUEFSU0VfREVDTFRZUEVTIiwgUEFSU0VfREVDTFRZUEVTfSwKICAgICB7IlBBUlNFX0NPTE5BTUVTIiwgUEFSU0VfQ09MTkFNRVN9LAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcmUuYyBiL01vZHVsZXMvX3NyZS5jCmluZGV4IDE1MDIyOWQuLmZiMGFiMDMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NyZS5jCisrKyBiL01vZHVsZXMvX3NyZS5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCiAgKi8KIAotc3RhdGljIGNoYXIgY29weXJpZ2h0W10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQogICAgICIgU1JFIDIuMi4yIENvcHlyaWdodCAoYykgMTk5Ny0yMDAyIGJ5IFNlY3JldCBMYWJzIEFCICI7CiAKICNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgpAQCAtNjIsOSArNjIsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIG9wdGlvbmFsIGZlYXR1cmVzICovCiAKLS8qIGVuYWJsZXMgZmFzdCBzZWFyY2hpbmcgKi8KLSNkZWZpbmUgVVNFX0ZBU1RfU0VBUkNICi0KIC8qIGVuYWJsZXMgY29weS9kZWVwY29weSBoYW5kbGluZyAod29yayBpbiBwcm9ncmVzcykgKi8KICN1bmRlZiBVU0VfQlVJTFRJTl9DT1BZCiAKQEAgLTcxNyw3ICs3MTQsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1jYWxsKGNoYXIqIG1vZHVsZSwgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBhcmdzKQorY2FsbChjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogYXJncykKIHsKICAgICBQeU9iamVjdCogbmFtZTsKICAgICBQeU9iamVjdCogbW9kOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3NsLmMgYi9Nb2R1bGVzL19zc2wuYwppbmRleCA4ODE4ZDI2Li41OTY4ZWQ1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zc2wuYworKysgYi9Nb2R1bGVzL19zc2wuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QeVNTTF9TZXRFcnJvcihQeVNTTFNvY2tldCAqb2JqLCBpbnQgcmV0LCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKK1B5U1NMX1NldEVycm9yKFB5U1NMU29ja2V0ICpvYmosIGludCByZXQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewogICAgIFB5T2JqZWN0ICp0eXBlID0gUHlTU0xFcnJvck9iamVjdDsKICAgICBjaGFyICplcnJzdHIgPSBOVUxMOwpAQCAtNDYwLDcgKzQ2MCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1fc2V0U1NMRXJyb3IgKGNoYXIgKmVycnN0ciwgaW50IGVycmNvZGUsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKSB7Citfc2V0U1NMRXJyb3IgKGNvbnN0IGNoYXIgKmVycnN0ciwgaW50IGVycmNvZGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKSB7CiAKICAgICBpZiAoZXJyc3RyID09IE5VTEwpCiAgICAgICAgIGVycmNvZGUgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zdHJ1Y3QuYyBiL01vZHVsZXMvX3N0cnVjdC5jCmluZGV4IDFmMWJiOTMuLjAyZGI4NGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3N0cnVjdC5jCisrKyBiL01vZHVsZXMvX3N0cnVjdC5jCkBAIC03MjMsNyArNzIzLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7CiAgICAgeyd4JywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBOVUxMfSwKICAgICB7J2InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBucF9ieXRlfSwKICAgICB7J0InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBucF91Ynl0ZX0sCkBAIC0xMTg5LDcgKzExODksNyBAQAogCiAKIHN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgotd2hpY2h0YWJsZShjaGFyICoqcGZtdCkKK3doaWNodGFibGUoY29uc3QgY2hhciAqKnBmbXQpCiB7CiAgICAgY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLwogICAgIHN3aXRjaCAoKmZtdCkgewpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAogICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYtPnNfZm9ybWF0KTsKIAotICAgIGYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOworICAgIGYgPSB3aGljaHRhYmxlKCZmbXQpOwogCiAgICAgcyA9IGZtdDsKICAgICBzaXplID0gMDsKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjaGFyICpzdGFydGZyb20pIHsKK3NfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNvbnN0IGNoYXIgKnN0YXJ0ZnJvbSkgewogICAgIGZvcm1hdGNvZGUgKmNvZGU7CiAgICAgUHlfc3NpemVfdCBpID0gMDsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoc29zZWxmLT5zX2xlbik7CkBAIC0yMjc5LDcgKzIyNzksNyBAQAogCiAgICAgLyogQ2hlY2sgZW5kaWFuIGFuZCBzd2FwIGluIGZhc3RlciBmdW5jdGlvbnMgKi8KICAgICB7Ci0gICAgICAgIGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKICAgICAgICAgZm9ybWF0ZGVmICpvdGhlciwgKnB0cjsKICNpZiBQWV9MSVRUTEVfRU5ESUFOCiAgICAgICAgIG90aGVyID0gbGlsZW5kaWFuX3RhYmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jIGIvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCmluZGV4IDQzZGI4YTguLjEzZDNjY2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RidWZmZXIuYworKysgYi9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKQEAgLTEzLDcgKzEzLDcgQEAKIFB5T2JqZWN0ICpjYWxjc2l6ZSA9IE5VTEw7CiAKIC8qIGNhY2hlIHNpbXBsZSBmb3JtYXQgc3RyaW5nICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltcGxlX2ZtdCA9ICJCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNpbXBsZV9mbXRbXSA9ICJCIjsKIFB5T2JqZWN0ICpzaW1wbGVfZm9ybWF0ID0gTlVMTDsKICNkZWZpbmUgU0lNUExFX0ZPUk1BVChmbXQpIChmbXQgPT0gTlVMTCB8fCBzdHJjbXAoZm10LCAiQiIpID09IDApCiAjZGVmaW5lIEZJWF9GT1JNQVQoZm10KSAoZm10ID09IE5VTEwgPyAiQiIgOiBmbXQpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwppbmRleCA5YTAzNjQ4Li5jYzNmNTJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKQEAgLTg4Nyw3ICs4ODcsNyBAQAogZ2V0YXJnc19rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1IiwgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdD0iKGlpKWl8KGkoaWkpKShpaWkpaSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiKGlpKWl8KGkoaWkpKShpaWkpaSI7CiAgICAgaW50IGludF9hcmdzWzEwXT17LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLApAQCAtMjY0Niw3ICsyNjQ2LDkgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX3RpbWVfcm91bmRpbmcoaW50IHJvdW5kKQogewotICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgeworICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SCisgICAgICAgICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORworICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgcm91bmRpbmciKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTM3NjcsNyArMzc2OSw3IEBACiAgICAgICAgICJUX0xPTkdMT05HIiwgIlRfVUxPTkdMT05HIiwKICNlbmRpZgogICAgICAgICBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gInxiYkJoSGlJbGtuZmRzIyIKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJ8YmJCaEhpSWxrbmZkcyMiCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgIkxLIgogI2VuZGlmCkBAIC00MTIyLDYgKzQxMjQsNyBAQAogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUxvbmdfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUlOIiwgUHlMb25nX0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfUFlHQ19IRUFEIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfVElNRV9UIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZih0aW1lX3QpKSk7CiAgICAgUHlfSU5DUkVGKCZQeUluc3RhbmNlTWV0aG9kX1R5cGUpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaW5zdGFuY2VtZXRob2QiLCAoUHlPYmplY3QgKikmUHlJbnN0YW5jZU1ldGhvZF9UeXBlKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYyBiL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKaW5kZXggMjAwNTIwNS4uMDNlZGEyNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYworKysgYi9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLUV4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK0V4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGtpbnRlci5jIGIvTW9kdWxlcy9fdGtpbnRlci5jCmluZGV4IDQxYWQ1ZjkuLjc2OGRmODEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RraW50ZXIuYworKysgYi9Nb2R1bGVzL190a2ludGVyLmMKQEAgLTg0MSw3ICs4NDEsNyBAQAogICAgIFB5X0RFQ1JFRih0cCk7CiB9CiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIgKgogUHlUY2xPYmplY3RfVGNsU3RyaW5nKFB5T2JqZWN0ICpzZWxmKQogewogICAgIHJldHVybiBUY2xfR2V0U3RyaW5nKCgoUHlUY2xPYmplY3QqKXNlbGYpLT52YWx1ZSk7CkBAIC0xNzI2LDcgKzE3MjYsNyBAQAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewogICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKKyAgICBjb25zdCBjaGFyICoqb3V0ID0gKGNvbnN0IGNoYXIqKilfb3V0OwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKGluKSkgewogICAgICAgICBpZiAoUHlCeXRlc19TaXplKGluKSA+IElOVF9NQVgpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiYnl0ZXMgb2JqZWN0IGlzIHRvbyBsb25nIik7CkBAIC0xODQ2LDcgKzE4NDYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncykKIHsKLSAgICBjaGFyICpuYW1lMSwgKm5hbWUyOworICAgIGNvbnN0IGNoYXIgKm5hbWUxLCAqbmFtZTI7CiAgICAgUHlPYmplY3QgKm5ld1ZhbHVlOwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFRjbF9PYmogKm5ld3ZhbCwgKm9rOwpAQCAtMTkxNSw3ICsxOTE1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0gICAgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOworICAgIGNvbnN0IGNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBUY2xfT2JqICp0cmVzOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL193aW5hcGkuYyBiL01vZHVsZXMvX3dpbmFwaS5jCmluZGV4IDNlN2YxODcuLmM0ZDQyNjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3dpbmFwaS5jCisrKyBiL01vZHVsZXMvX3dpbmFwaS5jCkBAIC02NzUsNyArNjc1LDcgQEAKIC8qIGhlbHBlcnMgZm9yIGNyZWF0ZXByb2Nlc3MgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHVsb25nKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCitnZXR1bG9uZyhQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICB1bnNpZ25lZCBsb25nIHJldDsKQEAgLTY5MSw3ICs2OTEsNyBAQAogfQogCiBzdGF0aWMgSEFORExFCi1nZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKK2dldGhhbmRsZShQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICBIQU5ETEUgcmV0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IDZhZjc1YTQuLjFiMGEyODIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBpbnQgaXRlbXNpemU7CiAgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICAgICBpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7Ci0gICAgY2hhciAqZm9ybWF0czsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRzOwogICAgIGludCBpc19pbnRlZ2VyX3R5cGU7CiAgICAgaW50IGlzX3NpZ25lZDsKIH07CkBAIC00MCw3ICs0MCw3IEBACiAgICAgUHlPYmplY3RfVkFSX0hFQUQKICAgICBjaGFyICpvYl9pdGVtOwogICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogICAgIGludCBvYl9leHBvcnRzOyAgLyogTnVtYmVyIG9mIGV4cG9ydGVkIGJ1ZmZlcnMgKi8KIH0gYXJyYXlvYmplY3Q7CkBAIC01MTEsNyArNTExLDcgQEAKICAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgdHlwZWNvZGVfdG9fbWZvcm1hdF9jb2RlKCkgaWYgeW91IGFkZCBhIG5ldwogICogdHlwZWNvZGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyIGRlc2NyaXB0b3JzW10gPSB7CiAgICAgeydiJywgMSwgYl9nZXRpdGVtLCBiX3NldGl0ZW0sICJiIiwgMSwgMX0sCiAgICAgeydCJywgMSwgQkJfZ2V0aXRlbSwgQkJfc2V0aXRlbSwgIkIiLCAxLCAwfSwKICAgICB7J3UnLCBzaXplb2YoUHlfVU5JQ09ERSksIHVfZ2V0aXRlbSwgdV9zZXRpdGVtLCAidSIsIDAsIDB9LApAQCAtNTM5LDcgKzUzOSw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD1hZDQzZDM3ZTk0MmE4ODU0XSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1uZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQorbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKIHsKICAgICBhcnJheW9iamVjdCAqb3A7CiAgICAgc2l6ZV90IG5ieXRlczsKQEAgLTE5NDYsNyArMTk0Niw3IEBACiB7CiAgICAgUHlPYmplY3QgKmNvbnZlcnRlZF9pdGVtczsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICBpZiAoIVB5VHlwZV9DaGVjayhhcnJheXR5cGUpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0yMDg0LDcgKzIwODQsNyBAQAogICAgICAgICBQeV9zc2l6ZV90IGl0ZW1jb3VudCA9IFB5X1NJWkUoaXRlbXMpIC8gbWZfZGVzY3Iuc2l6ZTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtc3RyID0KICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcoaXRlbXMpOwotICAgICAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgICAgICAvKiBJZiBwb3NzaWJsZSwgdHJ5IHRvIHBhY2sgYXJyYXkncyBpdGVtcyB1c2luZyBhIGRhdGEgdHlwZQogICAgICAgICAgKiB0aGF0IGZpdHMgYmV0dGVyLiBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXJyYXkgd2l0aCBuYXJyb3dlcgpAQCAtMjU1NCw3ICsyNTU0LDcgQEAKICAgICB2aWV3LT5mb3JtYXQgPSBOVUxMOwogICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKICAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpIHsKLSAgICAgICAgdmlldy0+Zm9ybWF0ID0gc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CisgICAgICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgPT0gJ3UnKSB7CiAgICAgICAgICAgICB2aWV3LT5mb3JtYXQgPSAidyI7CkBAIC0yNTk1LDcgKzI1OTUsNyBAQAogewogICAgIGludCBjOwogICAgIFB5T2JqZWN0ICppbml0aWFsID0gTlVMTCwgKml0ID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKHR5cGUgPT0gJkFycmF5dHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImFycmF5LmFycmF5KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTg3LDcgKzI5ODcsNyBAQAogICAgIGNoYXIgYnVmZmVyW1B5X0FSUkFZX0xFTkdUSChkZXNjcmlwdG9ycyldLCAqcDsKICAgICBQeU9iamVjdCAqdHlwZWNvZGVzOwogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5dHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2F1ZGlvb3AuYyBiL01vZHVsZXMvYXVkaW9vcC5jCmluZGV4IDNiMDVhZWMuLmQ5N2EzNjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXVkaW9vcC5jCisrKyBiL01vZHVsZXMvYXVkaW9vcC5jCkBAIC01MSwxMyArNTEsMTUgQEAKICNkZWZpbmUgU0VHX1NISUZUICAgICAgICg0KSAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0IGZvciBzZWdtZW50IG51bWJlci4gKi8KICNkZWZpbmUgU0VHX01BU0sgICAgICAgICgweDcwKSAgICAgICAgICAvKiBTZWdtZW50IGZpZWxkIG1hc2suICovCiAKLXN0YXRpYyBQeUludDE2IHNlZ19hZW5kWzhdID0gezB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRn07Ci1zdGF0aWMgUHlJbnQxNiBzZWdfdWVuZFs4XSA9IHsweDNGLCAweDdGLCAweEZGLCAweDFGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRn07CitzdGF0aWMgY29uc3QgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsKKyAgICAweDFGLCAweDNGLCAweDdGLCAweEZGLCAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRgorfTsKK3N0YXRpYyBjb25zdCBQeUludDE2IHNlZ191ZW5kWzhdID0geworICAgIDB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkYKK307CiAKIHN0YXRpYyBQeUludDE2Ci1zZWFyY2goUHlJbnQxNiB2YWwsIFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKK3NlYXJjaChQeUludDE2IHZhbCwgY29uc3QgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQogewogICAgIGludCBpOwogCkBAIC03MCw3ICs3Miw3IEBACiAjZGVmaW5lIHN0X3VsYXcybGluZWFyMTYodWMpIChfc3RfdWxhdzJsaW5lYXIxNlt1Y10pCiAjZGVmaW5lIHN0X2FsYXcybGluZWFyMTYodWMpIChfc3RfYWxhdzJsaW5lYXIxNlt1Y10pCiAKLXN0YXRpYyBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0gewogICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKICAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCiAgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LApAQCAtMTc2LDcgKzE3OCw3IEBACiAKIH0KIAotc3RhdGljIFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCBQeUludDE2IF9zdF9hbGF3MmxpbmVhcjE2WzI1Nl0gPSB7CiAgICAgIC01NTA0LCAgIC01MjQ4LCAgIC02MDE2LCAgIC01NzYwLCAgIC00NDgwLCAgIC00MjI0LCAgIC00OTkyLAogICAgICAtNDczNiwgICAtNzU1MiwgICAtNzI5NiwgICAtODA2NCwgICAtNzgwOCwgICAtNjUyOCwgICAtNjI3MiwKICAgICAgLTcwNDAsICAgLTY3ODQsICAgLTI3NTIsICAgLTI2MjQsICAgLTMwMDgsICAgLTI4ODAsICAgLTIyNDAsCkBAIC0yNzAsMTIgKzI3MiwxMiBAQAogLyogRW5kIG9mIGNvZGUgdGFrZW4gZnJvbSBzb3ggKi8KIAogLyogSW50ZWwgQURQQ00gc3RlcCB2YXJpYXRpb24gdGFibGUgKi8KLXN0YXRpYyBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IGluZGV4VGFibGVbMTZdID0gewogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogfTsKIAotc3RhdGljIGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7CiAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCiAgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCiAgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKZGlmZiAtLWdpdCBhL01vZHVsZXMvYmluYXNjaWkuYyBiL01vZHVsZXMvYmluYXNjaWkuYwppbmRleCBkOTIwZDIzLi5hMzA2YWNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2JpbmFzY2lpLmMKKysrIGIvTW9kdWxlcy9iaW5hc2NpaS5jCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIFNLSVAgMHg3RQogI2RlZmluZSBGQUlMIDB4N0QKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwogLyogMCovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXGIgICAgXHQgICAgXG4gICAgXksgICAgXkwgICAgXHIgICAgXk4gICAgXk8gICAqLwpAQCAtMTI1LDEwICsxMjUsMTAgQEAKICAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2hxeFtdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCi1zdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogLyogTWF4IGJpbmFyeSBjaHVuayBzaXplOyBsaW1pdGVkIG9ubHkgYnkgYXZhaWxhYmxlIG1lbW9yeSAqLwogI2RlZmluZSBCQVNFNjRfTUFYQklOICgoUFlfU1NJWkVfVF9NQVggLSAzKSAvIDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9iYXNlNjRbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyY3RhYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CiAgICAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBhNSwgMHg2MGM2LCAweDcwZTcsCiAgICAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCiAgICAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCkBAIC0yNTYsNyArMjU2LDggQEAKIGJpbmFzY2lpX2EyYl91dV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01Nzc5ZjM5YjBiNDg0NTlmIGlucHV0PTdjYWZlYWY3M2RmNjNkMWNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwpAQCAtMzQyLDEzICszNDMsMTUgQEAKIGJpbmFzY2lpX2IyYV91dV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xODEwMjFiNjliYjlhNDE0IGlucHV0PTAwZmRmNDU4Y2U4YjQ2NWJdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAgICAgYmluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgYmluX2xlbiA9IGRhdGEtPmxlbjsKICAgICBpZiAoIGJpbl9sZW4gPiA0NSApIHsKQEAgLTM1OCw5ICszNjEsMTAgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKKyAgICBvdXRfbGVuID0gMiArIChiaW5fbGVuICsgMikgLyAzICogNDsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgLyogU3RvcmUgdGhlIGxlbmd0aCAqLwogICAgICphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CkBAIC0zODIsMTcgKzM4NiwxMiBAQAogICAgIH0KICAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIAogc3RhdGljIGludAotYmluYXNjaWlfZmluZF92YWxpZCh1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCitiaW5hc2NpaV9maW5kX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIFB5X3NzaXplX3Qgc2xlbiwgaW50IG51bSkKIHsKICAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAogICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgpAQCAtNDI5LDEzICs0MjgsMTQgQEAKIGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2UzNTFiNzAyYmVkNTZkMiBpbnB1dD01ODcyYWNmNmUxY2FjMjQzXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CiAgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CiAgICAgaW50IHF1YWRfcG9zID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGFzY2lpX2xlbiA9IGRhdGEtPmxlbjsKQEAgLTQ0NywxMSArNDQ3LDEyIEBACiAKICAgICBiaW5fbGVuID0gKChhc2NpaV9sZW4rMykvNCkqMzsgLyogVXBwZXIgYm91bmQsIGNvcnJlY3RlZCBsYXRlciAqLwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGJpbl9sZW4pOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwotICAgIGJpbl9sZW4gPSAwOwogCiAgICAgZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKICAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhOwpAQCAtNDk2LDMxICs0OTcsMTcgQEAKICAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewogICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKICAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0gICAgICAgICAgICBiaW5fbGVuKys7CiAgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobGVmdGJpdHMgIT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvKiBBbmQgc2V0IHN0cmluZyBzaXplIGNvcnJlY3RseS4gSWYgdGhlIHJlc3VsdCBzdHJpbmcgaXMgZW1wdHkKLSAgICAqKiAoYmVjYXVzZSB0aGUgaW5wdXQgd2FzIGFsbCBpbnZhbGlkKSByZXR1cm4gdGhlIHNoYXJlZCBlbXB0eQotICAgICoqIHN0cmluZyBpbnN0ZWFkOyBfUHlCeXRlc19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KLSAgICAqLwotICAgIGlmIChiaW5fbGVuID4gMCkgewotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKIH0KIAogCkBAIC01MjgsMjQgKzUxNSwyNyBAQAogYmluYXNjaWkuYjJhX2Jhc2U2NAogCiAgICAgZGF0YTogUHlfYnVmZmVyCi0gICAgLworICAgICoKKyAgICBuZXdsaW5lOiBpbnQoY19kZWZhdWx0PSIxIikgPSBUcnVlCiAKIEJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2NkNjFmYmVlMjkxMzI4NSBpbnB1dD0xNGVjNGU0NzM3MTE3NGE5XSovCitiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbmV3bGluZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOWUxZGQ3MTlhODkwYjUwIGlucHV0PTdiMmVhNmZhMzhkODkyNGNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCkBAIC01NTUsMTEgKzU0NSwxNCBAQAogICAgIH0KIAogICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCi0gICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCi0gICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApCisgICAgICAgIisyIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzLgorICAgICAgIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgb3V0X2xlbiA9IGJpbl9sZW4qMiArIDI7CisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgIG91dF9sZW4rKzsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCB0aGUgZGF0YSBpbnRvIG91ciBidWZmZXIgKi8KQEAgLTU4MSwxNCArNTc0LDEwIEBACiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0WyhsZWZ0Y2hhciYweGYpIDw8IDJdOwogICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKICAgICB9Ci0gICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KKyAgICBpZiAobmV3bGluZSkKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC02MDQsMTYgKzU5MywxOSBAQAogYmluYXNjaWlfYTJiX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MGJjZGJiZDI4YjEwNWNkIGlucHV0PTBkOTE0YzY4MGUwZWVkNTVdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGludCBkb25lID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNjIzLDkgKzYxNSw5IEBACiAgICAgLyogQWxsb2NhdGUgYSBzdHJpbmcgdGhhdCBpcyB0b28gYmlnIChmaXhlZCBsYXRlcikKICAgICAgICBBZGQgdHdvIHRvIHRoZSBpbml0aWFsIGxlbmd0aCB0byBwcmV2ZW50IGludGVybmluZyB3aGljaAogICAgICAgIHdvdWxkIHByZWNsdWRlIHN1YnNlcXVlbnQgcmVzaXppbmcuICAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiArIDIpOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgewogICAgICAgICAvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KQEAgLTYzNCw3ICs2MjYsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBGQUlMICkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBET05FICkgewpAQCAtNjU2LDIxICs2NDgsMTQgQEAKICAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJpbl9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIHJydjsKLSAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYmluX2RhdGEpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5pIiwgcmVzLCBkb25lKTsKIH0KIAogCkBAIC02ODcsMTEgKzY3MiwxMyBAQAogYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDkwNWRhMzQ0ZGJmMDY0OCBpbnB1dD1lMWYxNzEyNDQ3YTgyYjA5XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKm91dF9kYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgY2g7CiAgICAgUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgbGVuID0gZGF0YS0+bGVuOwogCkBAIC03MDEsOSArNjg4LDkgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBXb3JzdCBjYXNlOiBvdXRwdXQgaXMgdHdpY2UgYXMgYmlnIGFzIGlucHV0IChmaXhlZCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggaW49MDsgaW48bGVuOyBpbisrKSB7CiAgICAgICAgIGNoID0gaW5fZGF0YVtpbl07CkBAIC03MjksMTIgKzcxNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOwogfQogCiAKQEAgLTc1MSwxNSArNzM0LDE3IEBACiBiaW5hc2NpaV9iMmFfaHF4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVhOTg3ODEwZDVlM2NkYmIgaW5wdXQ9OTU5NmViZTAxOWZlMTJiYV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNzY3LDkgKzc1Miw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuICogMiArIDIpOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CiAgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KQEAgLTc4NiwxMiArNzcxLDggQEAKICAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogCkBAIC04MDgsMTMgKzc4OSwxNSBAQAogYmluYXNjaWlfcmxlZGVjb2RlX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mN2FmZDg5Yjc4OTk0NmFiIGlucHV0PTU0Y2RkNDlmYzAxNDQwMmNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIGluX3JlcGVhdDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBpbl9sZW4sIG91dF9sZW4sIG91dF9sZW5fbGVmdDsKKyAgICBQeV9zc2l6ZV90IGluX2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGluX2xlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGluX2xlbiA+PSAwKTsKIApAQCAtODI1LDU5ICs4MDgsNDggQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KLSAgICBvdXRfbGVuID0gaW5fbGVuKjI7Ci0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBvdXRfbGVuKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBpbl9sZW4pOworICAgIGlmIChvdXRfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CisKKyAgICAvKiBVc2Ugb3ZlcmFsbG9jYXRpb24gKi8KKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIC8qCiAgICAgKiogV2UgbmVlZCB0d28gbWFjcm9zIGhlcmUgdG8gZ2V0L3B1dCBieXRlcyBhbmQgaGFuZGxlCiAgICAgKiogZW5kLW9mLWJ1ZmZlciBmb3IgaW5wdXQgYW5kIG91dHB1dCBzdHJpbmdzLgogICAgICovCi0jZGVmaW5lIElOQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLWluX2xlbiA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAotICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgYiA9ICppbl9kYXRhKys7IFwKKyNkZWZpbmUgSU5CWVRFKGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgT1VUQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB7IFB5X1hERUNSRUYocnYpOyByZXR1cm4gTlVMTDsgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRfbGVuOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgKm91dF9kYXRhKysgPSBiOyBcCi0gICAgfSB3aGlsZSgwKQotCi0gICAgICAgIC8qCi0gICAgICAgICoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5Ci0gICAgICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgotICAgICAgICAqLwotICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CisgICAgLyoKKyAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQorICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgorICAgICovCisgICAgSU5CWVRFKGluX2J5dGUpOwogCiAgICAgaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewogICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgc3Vic3RyYWN0IDEgYnl0ZSB0byBwcmV2ZW50IG92ZXJhbGxvY2F0aW9uICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgewogICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKICAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICB9IGVsc2UgewotICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgfQogCiAgICAgd2hpbGUoIGluX2xlbiA+IDAgKSB7CkBAIC04ODUsMjYgKzg1NywzOSBAQAogCiAgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgICAgIHN1YnN0cmFjdCAxIGJ5dGUgdG8gcHJldmVudCBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplLS07CisKICAgICAgICAgICAgIGlmICggaW5fcmVwZWF0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgLyogSnVzdCBhbiBlc2NhcGVkIFJVTkNIQVIgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBPVVRCWVRFKFJVTkNIQVIpOworICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogUGljayB1cCB2YWx1ZSBhbmQgb3V0cHV0IGEgc2VxdWVuY2Ugb2YgaXQgKi8KICAgICAgICAgICAgICAgICBpbl9ieXRlID0gb3V0X2RhdGFbLTFdOworCisgICAgICAgICAgICAgICAgLyogZW5sYXJnZSB0aGUgYnVmZmVyIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGlmIChpbl9yZXBlYXQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIC0xIGJlY2F1c2Ugd2UgYWxyZWFkeSBwcmVhbGxvY2F0ZWQgMSBieXRlICovCisgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3JlcGVhdCAtIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgd2hpbGUgKCAtLWluX3JlcGVhdCA+IDAgKQotICAgICAgICAgICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBOb3JtYWwgYnl0ZSAqLwotICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgICAgICpvdXRfZGF0YSsrID0gaW5fYnl0ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKG91dF9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTkyMiw3ICs5MDcsNyBAQAogYmluYXNjaWlfY3JjX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgdW5zaWduZWQgaW50IGNyYykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNjdjMmRhYzYyNjI1NzE3IGlucHV0PWFkZDhjNTM3MTJjY2NlZGFdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGNyYyAmPSAweGZmZmY7CkBAIC0xMDAwLDcgKzk4NSw3IEBACiAgICAgIHVzaW5nIGJ5dGUtc3dhcCBpbnN0cnVjdGlvbnMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBjcmNfMzJfdGFiWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyY18zMl90YWJbMjU2XSA9IHsKIDB4MDAwMDAwMDBVLCAweDc3MDczMDk2VSwgMHhlZTBlNjEyY1UsIDB4OTkwOTUxYmFVLCAweDA3NmRjNDE5VSwKIDB4NzA2YWY0OGZVLCAweGU5NjNhNTM1VSwgMHg5ZTY0OTVhM1UsIDB4MGVkYjg4MzJVLCAweDc5ZGNiOGE0VSwKIDB4ZTBkNWU5MWVVLCAweDk3ZDJkOTg4VSwgMHgwOWI2NGMyYlUsIDB4N2ViMTdjYmRVLCAweGU3YjgyZDA3VSwKQEAgLTEwNzMsNyArMTA1OCw3IEBACiAjaWZkZWYgVVNFX1pMSUJfQ1JDMzIKIC8qIFRoaXMgd2FzIHRha2VuIGZyb20gemxpYm1vZHVsZS5jIFB5WmxpYl9jcmMzMiAoYnV0IGlzIFBZX1NTSVpFX1RfQ0xFQU4pICovCiB7Ci0gICAgQnl0ZSAqYnVmOworICAgIGNvbnN0IEJ5dGUgKmJ1ZjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBpbnQgc2lnbmVkX3ZhbDsKIApAQCAtMTA4NCw3ICsxMDY5LDcgQEAKIH0KICNlbHNlICAvKiBVU0VfWkxJQl9DUkMzMiAqLwogeyAvKiBCeSBKaW0gQWhsc3Ryb207IEFsbCByaWdodHMgdHJhbnNmZXJyZWQgdG8gQ05SSSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIHVuc2lnbmVkIGludCByZXN1bHQ7CiAKQEAgLTExNjcsNyArMTE1Miw3IEBACiBiaW5hc2NpaV9hMmJfaGV4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpoZXhzdHIpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDYxZGE0NTJiNWM2ZDI5MCBpbnB1dD05ZTFlN2YyZjk0ZGIyNGZkXSovCiB7Ci0gICAgY2hhciogYXJnYnVmOworICAgIGNvbnN0IGNoYXIqIGFyZ2J1ZjsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbjsKICAgICBQeU9iamVjdCAqcmV0dmFsOwogICAgIGNoYXIqIHJldGJ1ZjsKQEAgLTEyMjQsNyArMTIwOSw3IEBACiAgICAgcmV0dXJuIGJpbmFzY2lpX2EyYl9oZXhfaW1wbChtb2R1bGUsIGhleHN0cik7CiB9CiAKLXN0YXRpYyBpbnQgdGFibGVfaGV4WzEyOF0gPSB7CitzdGF0aWMgY29uc3QgaW50IHRhYmxlX2hleFsxMjhdID0gewogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLApAQCAtMTI1NSw3ICsxMjQwLDggQEAKIHsKICAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CiAgICAgY2hhciBjaDsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwOwogICAgIFB5T2JqZWN0ICpydjsKIApAQCAtMTM2MSwxMyArMTM0NywxNCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE4N2NhOWNjYjk0ZTJhOWYgaW5wdXQ9N2YyYTlhYWEwMDhlOTJiMl0qLwogewogICAgIFB5X3NzaXplX3QgaW4sIG91dDsKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhYnVmLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YWJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7CiAgICAgUHlPYmplY3QgKnJ2OwogICAgIHVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIGNoOwogICAgIGludCBjcmxmID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAKICAgICBkYXRhYnVmID0gZGF0YS0+YnVmOwogICAgIGRhdGFsZW4gPSBkYXRhLT5sZW47CkBAIC0xMzc2LDcgKzEzNjMsNyBAQAogICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCiAgICAgICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KICAgICAgKiBoZXJlICovCi0gICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhYnVmLCAnXG4nLCBkYXRhbGVuKTsKKyAgICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGFidWYsICdcbicsIGRhdGFsZW4pOwogICAgIGlmICgocCAhPSBOVUxMKSAmJiAocCA+IGRhdGFidWYpICYmICgqKHAtMSkgPT0gJ1xyJykpCiAgICAgICAgIGNybGYgPSAxOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaAppbmRleCA4NmI0YzRjLi45MmU5OGNmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKQEAgLTY2OCwxMiArNjY4LDEzIEBACiAgICAgUHlPYmplY3QgKmV2ZW50c19xdWV1ZTsKICAgICBQeU9iamVjdCAqZXZlbnRzX3RvX3JlcG9ydCA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86X3NldGV2ZW50cyIsCi0gICAgICAgICZQeUxpc3RfVHlwZSwgJmV2ZW50c19xdWV1ZSwgJmV2ZW50c190b19yZXBvcnQpKQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIl9zZXRldmVudHMiLAorICAgICAgICAxLCAyLAorICAgICAgICAmZXZlbnRzX3F1ZXVlLCAmZXZlbnRzX3RvX3JlcG9ydCkpCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19zZXRldmVudHNfaW1wbChzZWxmLCBldmVudHNfcXVldWUsIGV2ZW50c190b19yZXBvcnQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjViOGJmN2U3ZjIxNTFjYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTlkOTRlMmQyNzI2ZDNhYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKaW5kZXggZTM0OGJlZS4uNDZjZmI4ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaApAQCAtOTMsMjYgKzkzLDI5IEBACiB9CiAKIFB5RG9jX1NUUlZBUihiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfXywKLSJiMmFfYmFzZTY0KCRtb2R1bGUsIGRhdGEsIC8pXG4iCisiYjJhX2Jhc2U2NCgkbW9kdWxlLCAvLCBkYXRhLCAqLCBuZXdsaW5lPVRydWUpXG4iCiAiLS1cbiIKICJcbiIKICJCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEuIik7CiAKICNkZWZpbmUgQklOQVNDSUlfQjJBX0JBU0U2NF9NRVRIT0RERUYgICAgXAotICAgIHsiYjJhX2Jhc2U2NCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX08sIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKKyAgICB7ImIyYV9iYXNlNjQiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpOworYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IG5ld2xpbmUpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYmluYXNjaWlfYjJhX2Jhc2U2NChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqYXJnKQorYmluYXNjaWlfYjJhX2Jhc2U2NChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImRhdGEiLCAibmV3bGluZSIsIE5VTEx9OwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OworICAgIGludCBuZXdsaW5lID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2Jhc2U2NCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnwkaTpiMmFfYmFzZTY0IiwgX2tleXdvcmRzLAorICAgICAgICAmZGF0YSwgJm5ld2xpbmUpKQogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEpOworICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChtb2R1bGUsICZkYXRhLCBuZXdsaW5lKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCkBAIC01MTYsNCArNTE5LDQgQEAKIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjFhM2NiZjc2NjBlYmFhNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjE1YTI0MzUwZDEwNTI1MSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKaW5kZXggOWVmNzAyYS4uYTQ4ZGU2YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaApAQCAtMjExNiw3ICsyMTE2LDcgQEAKICJzY2hlZF9nZXRhZmZpbml0eSgkbW9kdWxlLCBwaWQsIC8pXG4iCiAiLS1cbiIKICJcbiIKLSJSZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkLlxuIgorIlJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQgKG9yIHRoZSBjdXJyZW50IHByb2Nlc3MgaWYgemVybykuXG4iCiAiXG4iCiAiVGhlIGFmZmluaXR5IGlzIHJldHVybmVkIGFzIGEgc2V0IG9mIENQVSBpZGVudGlmaWVycy4iKTsKIApAQCAtNTE3OCw3ICs1MTc4LDExIEBACiAiY3B1X2NvdW50KCRtb2R1bGUsIC8pXG4iCiAiLS1cbiIKICJcbiIKLSJSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW07IHJldHVybiBOb25lIGlmIGluZGV0ZXJtaW5hYmxlLiIpOworIlJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuXG4iCisiXG4iCisiVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuXG4iCisidXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aFxuIgorImBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgIik7CiAKICNkZWZpbmUgT1NfQ1BVX0NPVU5UX01FVEhPRERFRiAgICBcCiAgICAgeyJjcHVfY291bnQiLCAoUHlDRnVuY3Rpb24pb3NfY3B1X2NvdW50LCBNRVRIX05PQVJHUywgb3NfY3B1X2NvdW50X19kb2NfX30sCkBAIC01Nzg4LDQgKzU3OTIsNCBAQAogI2lmbmRlZiBPU19TRVRfSEFORExFX0lOSEVSSVRBQkxFX01FVEhPRERFRgogICAgICNkZWZpbmUgT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChPU19TRVRfSEFORExFX0lOSEVSSVRBQkxFX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NTgyNGM1MmZkMDM0NjU0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNWM5YmVmOWFkMTFhMjBiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCBjYjcyMjJkLi4wYzZmNDQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC03MzgsNyArNzM4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQorZGVidWdfY3ljbGUoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlTeXNfRm9ybWF0U3RkZXJyKCJnYzogJXMgPCVzICVwPlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBQeV9UWVBFKG9wKS0+dHBfbmFtZSwgb3ApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IGUyYTJlZGYuLjEzYTllNDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICosIGludCk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlcihjb25zdCBjaGFyICopOwogCi1zdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaV9lcnJsaXN0W10gPSB7CiAgICAgInN1Y2Nlc3MuIiwKICAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KICAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIEVSUihlcnIpIHsgZXJyb3IgPSAoZXJyKTsgZ290byBiYWQ7IH0KIAotY2hhciAqCitjb25zdCBjaGFyICoKIGdhaV9zdHJlcnJvcihpbnQgZWNvZGUpCiB7CiAgICAgaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDAzZDI5MmMuLjMwYTBlOTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC00NzcsOCArNDc3LDggQEAKIHsKICAgICBleHRlcm4gd2NoYXJfdCAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKLSAgICBzdGF0aWMgd2NoYXJfdCBkZWxpbWl0ZXJbMl0gPSB7REVMSU0sICdcMCd9OwotICAgIHN0YXRpYyB3Y2hhcl90IHNlcGFyYXRvclsyXSA9IHtTRVAsICdcMCd9OworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CiAgICAgY2hhciAqX3J0cHlwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7IC8qIFhYWCB1c2Ugd2lkZSB2ZXJzaW9uIG9uIFdpbmRvd3MgKi8KICAgICB3Y2hhcl90ICpydHB5cGF0aCA9IE5VTEw7CiAgICAgd2NoYXJfdCAqaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IGNjZDY5YmUuLmE0ZmZhMDYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMSwxNSArMSwxNiBAQAogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogLyogSXRlcnRvb2xzIG1vZHVsZSB3cml0dGVuIGFuZCBtYWludGFpbmVkCiAgICBieSBSYXltb25kIEQuIEhldHRpbmdlciA8cHl0aG9uQHJjbi5jb20+Ci0gICBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyAgIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICovCiAKIAotLyogZ3JvdXBieSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBncm91cGJ5IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC03Niw3ICs3Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ3JvdXBieV9uZXh0KGdyb3VwYnlvYmplY3QgKmdibykKIHsKLSAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlciwgKnRtcDsKKyAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlcjsKIAogICAgIC8qIHNraXAgdG8gbmV4dCBpdGVyYXRpb24gZ3JvdXAgKi8KICAgICBmb3IgKDs7KSB7CkBAIC04Nyw4ICs4OCw3IEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaW50IHJjbXA7CiAKLSAgICAgICAgICAgIHJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZ2JvLT50Z3RrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdiby0+Y3VycmtleSwgUHlfRVEpOworICAgICAgICAgICAgcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwgZ2JvLT5jdXJya2V5LCBQeV9FUSk7CiAgICAgICAgICAgICBpZiAocmNtcCA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGVsc2UgaWYgKHJjbXAgPT0gMCkKQEAgLTEwMywyNyArMTAzLDE5IEBACiAgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsIG5ld3ZhbHVlLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChuZXdrZXkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB0bXAgPSBnYm8tPmN1cnJrZXk7Ci0gICAgICAgIGdiby0+Y3VycmtleSA9IG5ld2tleTsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOwotCi0gICAgICAgIHRtcCA9IGdiby0+Y3VycnZhbHVlOwotICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIFB5X1NFVFJFRihnYm8tPmN1cnJrZXksIG5ld2tleSk7CisgICAgICAgIFB5X1NFVFJFRihnYm8tPmN1cnJ2YWx1ZSwgbmV3dmFsdWUpOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihnYm8tPmN1cnJrZXkpOwotICAgIHRtcCA9IGdiby0+dGd0a2V5OwotICAgIGdiby0+dGd0a2V5ID0gZ2JvLT5jdXJya2V5OwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9TRVRSRUYoZ2JvLT50Z3RrZXksIGdiby0+Y3VycmtleSk7CiAKICAgICBncm91cGVyID0gX2dyb3VwZXJfY3JlYXRlKGdibywgZ2JvLT50Z3RrZXkpOwogICAgIGlmIChncm91cGVyID09IE5VTEwpCkBAIC0xNzUsNyArMTY3LDcgQEAKICAgICAgcmVkdWNlX2RvY30sCiAgICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pZ3JvdXBieV9zZXRzdGF0ZSwgICAgTUVUSF9PLAogICAgICBzZXRzdGF0ZV9kb2N9LAotICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoZ3JvdXBieV9kb2MsCkBAIC0yOTgsOCArMjkwLDcgQEAKICAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOwogICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywgbmV3dmFsdWUsIE5VTEwpOwogICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMyNyw4ICszMTgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX3JlZHVjZShfZ3JvdXBlcm9iamVjdCAqbHopCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICBsei0+cGFyZW50LCBsei0+dGd0a2V5KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwgbHotPnBhcmVudCwgbHotPnRndGtleSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBfZ3JvdXBlcl9tZXRob2RzW10gPSB7CkBAIC0zNjEsNyArMzUxLDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKV9ncm91cGVyX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylfZ3JvdXBlcl90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTM4Miw4ICszNzIsNyBAQAogfTsKIAogCi0KLS8qIHRlZSBvYmplY3QgYW5kIHdpdGggc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgb2JqZWN0cyAqKioqKioqKioqKioqKiovCisvKiB0ZWUgb2JqZWN0IGFuZCB3aXRoIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIG9iamVjdHMgKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFRoZSB0ZWVkYXRhb2JqZWN0IHByZS1hbGxvY2F0ZXMgc3BhY2UgZm9yIExJTktDRUxMUyBudW1iZXIgb2Ygb2JqZWN0cy4KICAgIFRvIGhlbHAgdGhlIG9iamVjdCBmaXQgbmVhdGx5IGluc2lkZSBjYWNoZSBsaW5lcyAoc3BhY2UgZm9yIDE2IHRvIDMyCkBAIC0zOTgsNyArMzg3LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKml0OwotICAgIGludCBudW1yZWFkOyAgLyogMCA8PSBudW1yZWFkIDw9IExJTktDRUxMUyAqLworICAgIGludCBudW1yZWFkOyAgICAgICAgICAgICAgICAvKiAwIDw9IG51bXJlYWQgPD0gTElOS0NFTExTICovCiAgICAgUHlPYmplY3QgKm5leHRsaW5rOwogICAgIFB5T2JqZWN0ICoodmFsdWVzW0xJTktDRUxMU10pOwogfSB0ZWVkYXRhb2JqZWN0OwpAQCAtNDA2LDcgKzM5NSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIHRlZWRhdGFvYmplY3QgKmRhdGFvYmo7Ci0gICAgaW50IGluZGV4OyAgICAvKiAwIDw9IGluZGV4IDw9IExJTktDRUxMUyAqLworICAgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAvKiAwIDw9IGluZGV4IDw9IExJTktDRUxMUyAqLwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKIH0gdGVlb2JqZWN0OwogCkBAIC00NjMsNiArNDUyLDcgQEAKIHRlZWRhdGFvYmplY3RfdHJhdmVyc2UodGVlZGF0YW9iamVjdCAqdGRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKiBhcmcpCiB7CiAgICAgaW50IGk7CisKICAgICBQeV9WSVNJVCh0ZG8tPml0KTsKICAgICBmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCiAgICAgICAgIFB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKQEAgLTUxMiw2ICs1MDIsNyBAQAogICAgIGludCBpOwogICAgIC8qIGNyZWF0ZSBhIHRlbXBvcmFyeSBsaXN0IG9mIGFscmVhZHkgaXRlcmF0ZWQgdmFsdWVzICovCiAgICAgUHlPYmplY3QgKnZhbHVlcyA9IFB5TGlzdF9OZXcodGRvLT5udW1yZWFkKTsKKwogICAgIGlmICghdmFsdWVzKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmb3IgKGk9MCA7IGk8dGRvLT5udW1yZWFkIDsgaSsrKSB7CkBAIC01NzksNyArNTcwLDcgQEAKIFB5RG9jX1NUUlZBUih0ZWVkYXRhb2JqZWN0X2RvYywgIkRhdGEgY29udGFpbmVyIGNvbW1vbiB0byBtdWx0aXBsZSB0ZWUgb2JqZWN0cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVkYXRhb2JqZWN0X3R5cGUgPSB7Ci0gICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApICAgICAgICAgLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCiAgICAgIml0ZXJ0b29scy5fdGVlX2RhdGFvYmplY3QiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgc2l6ZW9mKHRlZWRhdGFvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCkBAIC01OTksNyArNTkwLDcgQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAvKiB0cF9mbGFncyAqLwogICAgIHRlZWRhdGFvYmplY3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgKHRyYXZlcnNlcHJvYyl0ZWVkYXRhb2JqZWN0X3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXRlZWRhdGFvYmplY3RfY2xlYXIsICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTc1NCw5ICs3NDUsOSBAQAogIkl0ZXJhdG9yIHdyYXBwZWQgdG8gbWFrZSBpdCBjb3B5YWJsZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdGVlX21ldGhvZHNbXSA9IHsKLSAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbil0ZWVfY29weSwgIE1FVEhfTk9BUkdTLCB0ZWVjb3B5X2RvY30sCi0gICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pdGVlX3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywgcmVkdWNlX2RvY30sCi0gICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pdGVlX3NldHN0YXRlLCAgICBNRVRIX08sIHNldHN0YXRlX2RvY30sCisgICAgeyJfX2NvcHlfXyIsICAgICAgICAoUHlDRnVuY3Rpb24pdGVlX2NvcHksICAgICBNRVRIX05PQVJHUywgdGVlY29weV9kb2N9LAorICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9yZWR1Y2UsICAgTUVUSF9OT0FSR1MsIHJlZHVjZV9kb2N9LAorICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKXRlZV9zZXRzdGF0ZSwgTUVUSF9PLCAgICAgIHNldHN0YXRlX2RvY30sCiAgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTc4Niw3ICs3NzcsNyBAQAogICAgICh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgKGlucXVpcnkpdGVlX2NsZWFyLCAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIG9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKXRlZV9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIHRlZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KQEAgLTg1MiwxMiArODQzLDEzIEBACiAidGVlKGl0ZXJhYmxlLCBuPTIpIC0tPiB0dXBsZSBvZiBuIGluZGVwZW5kZW50IGl0ZXJhdG9ycy4iKTsKIAogCi0vKiBjeWNsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGN5Y2xlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqaXQ7CiAgICAgUHlPYmplY3QgKnNhdmVkOworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAgICAgaW50IGZpcnN0cGFzczsKIH0gY3ljbGVvYmplY3Q7CiAKQEAgLTg5Nyw2ICs4ODksNyBAQAogICAgIH0KICAgICBsei0+aXQgPSBpdDsKICAgICBsei0+c2F2ZWQgPSBzYXZlZDsKKyAgICBsei0+aW5kZXggPSAwOwogICAgIGx6LT5maXJzdHBhc3MgPSAwOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwpAQCAtOTA2LDE1ICs4OTksMTYgQEAKIGN5Y2xlX2RlYWxsb2MoY3ljbGVvYmplY3QgKmx6KQogewogICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotICAgIFB5X1hERUNSRUYobHotPnNhdmVkKTsKICAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOwogICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogY3ljbGVfdHJhdmVyc2UoY3ljbGVvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLSAgICBQeV9WSVNJVChsei0+aXQpOworICAgIGlmIChsei0+aXQpCisgICAgICAgIFB5X1ZJU0lUKGx6LT5pdCk7CiAgICAgUHlfVklTSVQobHotPnNhdmVkKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTkyMyw1NiArOTE3LDY5IEBACiBjeWNsZV9uZXh0KGN5Y2xlb2JqZWN0ICpseikKIHsKICAgICBQeU9iamVjdCAqaXRlbTsKLSAgICBQeU9iamVjdCAqaXQ7Ci0gICAgUHlPYmplY3QgKnRtcDsKIAotICAgIHdoaWxlICgxKSB7CisgICAgaWYgKGx6LT5pdCAhPSBOVUxMKSB7CiAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+aXQpOwogICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIWx6LT5maXJzdHBhc3MgJiYgUHlMaXN0X0FwcGVuZChsei0+c2F2ZWQsIGl0ZW0pKSB7CisgICAgICAgICAgICBpZiAobHotPmZpcnN0cGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSkpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoUHlMaXN0X1NpemUobHotPnNhdmVkKSA9PSAwKQorICAgICAgICAvKiBOb3RlOiAgU3RvcEl0ZXJhdGlvbiBpcyBhbHJlYWR5IGNsZWFyZWQgYnkgUHlJdGVyX05leHQoKSAqLworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKLSAgICAgICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgdG1wID0gbHotPml0OwotICAgICAgICBsei0+aXQgPSBpdDsKLSAgICAgICAgbHotPmZpcnN0cGFzcyA9IDE7Ci0gICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBQeV9DTEVBUihsei0+aXQpOwogICAgIH0KKyAgICBpZiAoUHlfU0laRShsei0+c2F2ZWQpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0obHotPnNhdmVkLCBsei0+aW5kZXgpOworICAgIGx6LT5pbmRleCsrOworICAgIGlmIChsei0+aW5kZXggPj0gUHlfU0laRShsei0+c2F2ZWQpKQorICAgICAgICBsei0+aW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX3JlZHVjZShjeWNsZW9iamVjdCAqbHopCiB7Ci0gICAgLyogQ3JlYXRlIGEgbmV3IGN5Y2xlIHdpdGggdGhlIGl0ZXJhdG9yIHR1cGxlLCB0aGVuIHNldAotICAgICAqIHRoZSBzYXZlZCBzdGF0ZSBvbiBpdC4KLSAgICAgKi8KLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPKShPaSkiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgbHotPml0LCBsei0+c2F2ZWQsIGx6LT5maXJzdHBhc3MpOworICAgIC8qIENyZWF0ZSBhIG5ldyBjeWNsZSB3aXRoIHRoZSBpdGVyYXRvciB0dXBsZSwgdGhlbiBzZXQgdGhlIHNhdmVkIHN0YXRlICovCisgICAgaWYgKGx6LT5pdCA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGx6LT5pbmRleCAhPSAwKSB7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX3NldHN0YXRlX18pOworICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoaXQsICZQeUlkX19fc2V0c3RhdGVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuIiwgbHotPmluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhOKShPaSkiLCBQeV9UWVBFKGx6KSwgaXQsIGx6LT5zYXZlZCwgMSk7CiAgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pKE9pKSIsIFB5X1RZUEUobHopLCBsei0+aXQsIGx6LT5zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsei0+Zmlyc3RwYXNzKTsKK30KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX3NldHN0YXRlKGN5Y2xlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5T2JqZWN0ICpzYXZlZD1OVUxMOwogICAgIGludCBmaXJzdHBhc3M7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiT2kiLCAmc2F2ZWQsICZmaXJzdHBhc3MpKQorCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiTyFpIiwgJlB5TGlzdF9UeXBlLCAmc2F2ZWQsICZmaXJzdHBhc3MpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBQeV9YSU5DUkVGKHNhdmVkKTsKKyAgICBQeV9JTkNSRUYoc2F2ZWQpOwogICAgIFB5X1NFVFJFRihsei0+c2F2ZWQsIHNhdmVkKTsKICAgICBsei0+Zmlyc3RwYXNzID0gZmlyc3RwYXNzICE9IDA7CisgICAgbHotPmluZGV4ID0gMDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtMTA0MSw3ICsxMDQ4LDcgQEAKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKmZ1bmM7CiAgICAgUHlPYmplY3QgKml0OwotICAgIGxvbmcgICAgICAgICBzdGFydDsKKyAgICBsb25nIHN0YXJ0OwogfSBkcm9wd2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGU7CkBAIC0xMTMxLDggKzExMzgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9yZWR1Y2UoZHJvcHdoaWxlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0YXJ0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdGFydCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMTgzLDEzICsxMTg5LDEzIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIGRyb3B3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpZHJvcHdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpZHJvcHdoaWxlX25leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZHJvcHdoaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkcm9wd2hpbGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KQEAgLTEyMTAsNyArMTIxNiw3IEBACiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICpmdW5jOwogICAgIFB5T2JqZWN0ICppdDsKLSAgICBsb25nICAgICAgICAgc3RvcDsKKyAgICBsb25nIHN0b3A7CiB9IHRha2V3aGlsZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0YWtld2hpbGVfdHlwZTsKQEAgLTEyODUsNyArMTI5MSw3IEBACiAgICAgfQogICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwogICAgIFB5X0RFQ1JFRihnb29kKTsKLSAgICBpZiAob2sgPT0gMSkKKyAgICBpZiAob2sgPiAwKQogICAgICAgICByZXR1cm4gaXRlbTsKICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgaWYgKG9rID09IDApCkBAIC0xMjk2LDE0ICsxMzAyLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX3JlZHVjZSh0YWtld2hpbGVvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0LCBsei0+c3RvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfcmVkdWNlX3NldHN0YXRlKHRha2V3aGlsZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBpbnQgc3RvcCA9IFB5T2JqZWN0X0lzVHJ1ZShzdGF0ZSk7CisKICAgICBpZiAoc3RvcCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5zdG9wID0gc3RvcDsKQEAgLTEzNDcsNyArMTM1Myw3IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIHRha2V3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC0xMzY4LDcgKzEzNzQsNyBAQAogfTsKIAogCi0vKiBpc2xpY2Ugb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGlzbGljZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTE0MDQsNyArMTQxMCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciAiCisgICAgICAgICAgICAgICAgICAgImFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTQxOSwxNCArMTQyNiwxNiBAQAogICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOworICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXJ0PDAgfHwgc3RvcDwtMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAiYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTE1MjMsNiArMTUzMiw3IEBACiAgICAgICogdGhlbiAnc2V0c3RhdGUnIHdpdGggdGhlIG5leHQgYW5kIGNvdW50CiAgICAgICovCiAgICAgUHlPYmplY3QgKnN0b3A7CisKICAgICBpZiAobHotPml0ID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKmVtcHR5X2xpc3Q7CiAgICAgICAgIFB5T2JqZWN0ICplbXB0eV9pdDsKQEAgLTE1NTIsNiArMTU2Miw3IEBACiBpc2xpY2Vfc2V0c3RhdGUoaXNsaWNlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5X3NzaXplX3QgY250ID0gUHlMb25nX0FzU3NpemVfdChzdGF0ZSk7CisKICAgICBpZiAoY250ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGx6LT5jbnQgPSBjbnQ7CkBAIC0xNzY2LDcgKzE3NzcsNyBAQAogfTsKIAogCi0vKiBjaGFpbiBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY2hhaW4gb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMTg0MiwzMiArMTg1MywzMiBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogCiAgICAgaWYgKGx6LT5zb3VyY2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgLyogYWxyZWFkeSBzdG9wcGVkICovCiAKICAgICBpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IFB5SXRlcl9OZXh0KGx6LT5zb3VyY2UpOwogICAgICAgICBpZiAoaXRlcmFibGUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLwogICAgICAgICB9CiAgICAgICAgIGx6LT5hY3RpdmUgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKICAgICAgICAgUHlfREVDUkVGKGl0ZXJhYmxlKTsKICAgICAgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGlucHV0IG5vdCBpdGVyYWJsZSAqLwogICAgICAgICB9CiAgICAgfQotICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+YWN0aXZlKTsKKyAgICBpdGVtID0gKCpQeV9UWVBFKGx6LT5hY3RpdmUpLT50cF9pdGVybmV4dCkobHotPmFjdGl2ZSk7CiAgICAgaWYgKGl0ZW0gIT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBpbnB1dCByYWlzZWQgYW4gZXhjZXB0aW9uICovCiAgICAgfQogICAgIFB5X0NMRUFSKGx6LT5hY3RpdmUpOwotICAgIHJldHVybiBjaGFpbl9uZXh0KGx6KTsgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCisgICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xODkzLDYgKzE5MDQsNyBAQAogY2hhaW5fc2V0c3RhdGUoY2hhaW5vYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlPYmplY3QgKnNvdXJjZSwgKmFjdGl2ZT1OVUxMOworCiAgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgIk98TyIsICZzb3VyY2UsICZhY3RpdmUpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTkxNywxMyArMTkyOSwxMyBAQAogdGhhdCBldmFsdWF0ZXMgbGF6aWx5LiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgY2hhaW5fbWV0aG9kc1tdID0gewotICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsICAgICAgICAgICAgTUVUSF9PIHwgTUVUSF9DTEFTUywKLSAgICAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAorICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCisgICAgIGNoYWluX2Zyb21faXRlcmFibGVfZG9jfSwKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbiljaGFpbl9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCiAgICAgIHJlZHVjZV9kb2N9LAogICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKWNoYWluX3NldHN0YXRlLCAgICBNRVRIX08sCiAgICAgIHNldHN0YXRlX2RvY30sCi0gICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZSA9IHsKQEAgLTE5NzUsMTAgKzE5ODcsMTAgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcHJvZHVjdCBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbHM7ICAgICAgICAvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHByb2R1Y3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlOwpAQCAtMTk5Nyw3ICsyMDA5LDggQEAKICAgICAgICAgUHlPYmplY3QgKnRtcGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKICAgICAgICAgaWYgKHRtcGFyZ3MgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsIGt3bGlzdCwgJnJlcGVhdCkpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZyZXBlYXQpKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wYXJncyk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMjI4Niw3ICsyMjk5LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMucHJvZHVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLSAgICBzaXplb2YocHJvZHVjdG9iamVjdCksICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgc2l6ZW9mKHByb2R1Y3RvYmplY3QpLCAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpcHJvZHVjdF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLwpAQCAtMjMyOCwxNSArMjM0MSwxNSBAQAogfTsKIAogCi0vKiBjb21iaW5hdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWJpbmF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGNvbWJpbmF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGNvbWJpbmF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb21iaW5hdGlvbnNfdHlwZTsKQEAgLTI1NDYsMTcgKzI1NTksMTYgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShsei0+cG9vbCk7CiAKLSAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKQotICAgIHsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpIHx8IFB5VHVwbGVfR0VUX1NJWkUoc3RhdGUpICE9IGx6LT5yKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBhcmd1bWVudHMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICBQeV9zc2l6ZV90IG1heDsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBub3QgYW4gaW50ZWdlciAqLwogICAgICAgICBtYXggPSBpICsgbiAtIGx6LT5yOwpAQCAtMjY0Miw3ICsyNjU0LDcgQEAKIH07CiAKIAotLyogY29tYmluYXRpb25zIHdpdGggcmVwbGFjZW1lbnQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb21iaW5hdGlvbnMgd2l0aCByZXBsYWNlbWVudCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEVxdWl2YWxlbnQgdG86CiAKQEAgLTI2NzIsMTEgKzI2ODQsMTEgQEAKICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KICAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCiAgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGN3ciBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY3dyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGN3cl90eXBlOwpAQCAtMjY5Myw4ICsyNzA1LDkgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLCBrd2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT246Y29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJncywgJml0ZXJhYmxlLCAmcikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOwpAQCAtMjg1OSw4ICsyODcyLDcgQEAKICAgICAgICAgaW5kaWNlcyA9IFB5VHVwbGVfTmV3KGx6LT5yKTsKICAgICAgICAgaWYgKCFpbmRpY2VzKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QqIGluZGV4ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGx6LT5pbmRpY2VzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW5kaWNlcyk7CkBAIC0yODg2LDEwICsyODk4LDEwIEBACiAgICAgfQogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobHotPnBvb2wpOwotICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKKwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbm90IGFuIGludGVnZXIgKi8KICAgICAgICAgLyogY2xhbXAgdGhlIGluZGV4ICovCkBAIC0yOTczLDcgKzI5ODUsNyBAQAogfTsKIAogCi0vKiBwZXJtdXRhdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyogcGVybXV0YXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiBkZWYgcGVybXV0YXRpb25zKGl0ZXJhYmxlLCByPU5vbmUpOgogICAgICdwZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSAoMCwyKSAoMSwwKSAoMSwyKSAoMiwwKSAoMiwxKScKQEAgLTMwMDAsMTIgKzMwMTIsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBlbGVtZW50IGluIHRoZSBwb29sICovCi0gICAgUHlfc3NpemVfdCAqY3ljbGVzOyAgICAgICAgICAgICAgICAgLyogb25lIHJvbGxvdmVyIGNvdW50ZXIgcGVyIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHBlcm11dGF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLworICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHBlcm11dGF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZTsKQEAgLTMyMjAsNyArMzIzMiw3IEBACiAgICAgICAgIGluZGljZXMgPSBQeVR1cGxlX05ldyhuKTsKICAgICAgICAgaWYgKGluZGljZXMgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspeworICAgICAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+aW5kaWNlc1tpXSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwpAQCAtMzIzMCw4ICszMjQyLDcgQEAKICAgICAgICAgY3ljbGVzID0gUHlUdXBsZV9OZXcocG8tPnIpOwogICAgICAgICBpZiAoY3ljbGVzID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgZm9yIChpPTA7IGk8cG8tPnI7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGk9MCA7IGk8cG8tPnIgOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChwby0+Y3ljbGVzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0zMjU5LDE1ICszMjcwLDEyIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG8tPnBvb2wpOwotICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGluZGljZXMpICE9IG4gfHwKLSAgICAgICAgUHlUdXBsZV9HRVRfU0laRShjeWNsZXMpICE9IHBvLT5yKQotICAgIHsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShpbmRpY2VzKSAhPSBuIHx8IFB5VHVwbGVfR0VUX1NJWkUoY3ljbGVzKSAhPSBwby0+cikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oaW5kaWNlcywgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMzI4MCw4ICszMjg4LDcgQEAKICAgICAgICAgcG8tPmluZGljZXNbaV0gPSBpbmRleDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oY3ljbGVzLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0zMzIyLDExICszMzI5LDExIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcGVybXV0YXRpb25zX3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgIml0ZXJ0b29scy5wZXJtdXRhdGlvbnMiLCAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZihwZXJtdXRhdGlvbnNvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKXBlcm11dGF0aW9uc19kZWFsbG9jLCAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zMzQzLDEzICszMzUwLDEzIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylwZXJtdXRhdGlvbnNfdHJhdmVyc2UsICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIHBlcm11dGF0aW9uc19kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIHBlcm11YXRpb25zX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCkBAIC0zMzYwLDExICszMzY3LDExIEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgcGVybXV0YXRpb25zX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYWNjdW11bGF0ZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0zNDMxLDkgKzM0MzgsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfbmV4dChhY2N1bXVsYXRlb2JqZWN0ICpseikKIHsKLSAgICBQeU9iamVjdCAqdmFsLCAqb2xkdG90YWwsICpuZXd0b3RhbDsKKyAgICBQeU9iamVjdCAqdmFsLCAqbmV3dG90YWw7CiAKLSAgICB2YWwgPSBQeUl0ZXJfTmV4dChsei0+aXQpOworICAgIHZhbCA9ICgqUHlfVFlQRShsei0+aXQpLT50cF9pdGVybmV4dCkobHotPml0KTsKICAgICBpZiAodmFsID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0zNDUxLDExICszNDU4LDggQEAKICAgICBpZiAobmV3dG90YWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBvbGR0b3RhbCA9IGx6LT50b3RhbDsKLSAgICBsei0+dG90YWwgPSBuZXd0b3RhbDsKLSAgICBQeV9ERUNSRUYob2xkdG90YWwpOwotCiAgICAgUHlfSU5DUkVGKG5ld3RvdGFsKTsKKyAgICBQeV9TRVRSRUYobHotPnRvdGFsLCBuZXd0b3RhbCk7CiAgICAgcmV0dXJuIG5ld3RvdGFsOwogfQogCkBAIC0zNDY1LDcgKzM0NjksNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGx6KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+aXQsIGx6LT5iaW5vcD9sei0+Ymlub3A6UHlfTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+dG90YWw/bHotPnRvdGFsOlB5X05vbmUpOwotIH0KK30KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFjY3VtdWxhdGVfc2V0c3RhdGUoYWNjdW11bGF0ZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKQEAgLTM2MjcsNyArMzYzMSw3IEBACiAKICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoc2VsZWN0b3IpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZWN0b3IpOwotICAgICAgICBpZiAob2sgPT0gMSkKKyAgICAgICAgaWYgKG9rID4gMCkKICAgICAgICAgICAgIHJldHVybiBkYXR1bTsKICAgICAgICAgUHlfREVDUkVGKGRhdHVtKTsKICAgICAgICAgaWYgKG9rIDwgMCkKQEAgLTM2NDAsNyArMzY0NCw3IEBACiB7CiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCiAgICAgICAgIGx6LT5kYXRhLCBsei0+c2VsZWN0b3JzKTsKLSAgICB9Cit9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wcmVzc19tZXRob2RzW10gPSB7CiAgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pY29tcHJlc3NfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLApAQCAtMzY1OSw0NCArMzY2Myw0NCBAQAogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJpdGVydG9vbHMuY29tcHJlc3MiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YoY29tcHJlc3NvYmplY3QpLCAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKWNvbXByZXNzX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXNlcnZlZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb21wcmVzc190cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb21wcmVzc19kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvbXByZXNzX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvbXByZXNzX25leHQsICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvbXByZXNzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICBjb21wcmVzc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCi0gICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBjb21wcmVzc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvbXByZXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzc3Nyw4ICszNzgxLDcgQEAKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7Ci0gICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwogICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM3OTcsOSArMzgwMCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVyZmFsc2VfcmVkdWNlKGZpbHRlcmZhbHNlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCk7Ci0gICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0KTsKK30KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZpbHRlcmZhbHNlX21ldGhvZHNbXSA9IHsKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilmaWx0ZXJmYWxzZV9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCkBAIC0zODE5LDcgKzM4MjEsNyBAQAogICAgIHNpemVvZihmaWx0ZXJmYWxzZW9iamVjdCksICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC0zODM3LDcgKzM4MzksNyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBmaWx0ZXJmYWxzZV9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWZpbHRlcmZhbHNlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylmaWx0ZXJmYWxzZV90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTQwNzYsMTUgKzQwNzgsMTUgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0gICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgY291bnRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNvdW50X3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWNvdW50X25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvdW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwpAQCAtNDI1MCw5ICs0MjUyLDcgQEAKICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0vKiB6aXBsb25nZXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKKy8qIHppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTQyOTEsNyArNDI5MSw3IEBACiAgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CiAgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgIGZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOwogICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewpAQCAtNDQzMiw2ICs0NDMyLDcgQEAKICAgICAgKi8KICAgICBpbnQgaTsKICAgICBQeU9iamVjdCAqYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpKTsKKwogICAgIGlmIChhcmdzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGZvciAoaT0wOyBpPFB5VHVwbGVfR0VUX1NJWkUobHotPml0dHVwbGUpOyBpKyspIHsKQEAgLTQ0ODIsNyArNDQ4Myw3IEBACiAgICAgc2l6ZW9mKHppcGxvbmdlc3RvYmplY3QpLCAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKGRlc3RydWN0b3IpemlwX2xvbmdlc3RfZGVhbGxvYywgICAgLyogdHBfZGVhbGxvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KQEAgLTQ0OTksOCArNDUwMCw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIHppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICB6aXBfbG9uZ2VzdF9kb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXppcF9sb25nZXN0X3RyYXZlcnNlLCAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtNDUxNiw3ICs0NTE3LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0gICAgemlwX2xvbmdlc3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICB6aXBfbG9uZ2VzdF9uZXcsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IDJhOWVhMjguLjM1ZDA3ZmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC00MiwxMSArNDIsMTEgQEAKICNkZWZpbmUgUFJPR1JBTV9PUFRTIEJBU0VfT1BUUwogCiAvKiBTaG9ydCB1c2FnZSBtZXNzYWdlICh3aXRoICVzIGZvciBhcmd2MCkgKi8KLXN0YXRpYyBjaGFyICp1c2FnZV9saW5lID0KK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX2xpbmVbXSA9CiAidXNhZ2U6ICVscyBbb3B0aW9uXSAuLi4gWy1jIGNtZCB8IC1tIG1vZCB8IGZpbGUgfCAtXSBbYXJnXSAuLi5cbiI7CiAKIC8qIExvbmcgdXNhZ2UgbWVzc2FnZSwgc3BsaXQgaW50byBwYXJ0cyA8IDUxMiBieXRlcyAqLwotc3RhdGljIGNoYXIgKnVzYWdlXzEgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMVtdID0gIlwKIE9wdGlvbnMgYW5kIGFyZ3VtZW50cyAoYW5kIGNvcnJlc3BvbmRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzKTpcblwKIC1iICAgICA6IGlzc3VlIHdhcm5pbmdzIGFib3V0IHN0cihieXRlc19pbnN0YW5jZSksIHN0cihieXRlYXJyYXlfaW5zdGFuY2UpXG5cCiAgICAgICAgICBhbmQgY29tcGFyaW5nIGJ5dGVzL2J5dGVhcnJheSB3aXRoIHN0ci4gKC1iYjogaXNzdWUgZXJyb3JzKVxuXApAQCAtNTYsNyArNTYsNyBAQAogLUUgICAgIDogaWdub3JlIFBZVEhPTiogZW52aXJvbm1lbnQgdmFyaWFibGVzIChzdWNoIGFzIFBZVEhPTlBBVEgpXG5cCiAtaCAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdCAoYWxzbyAtLWhlbHApXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzIgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfMltdID0gIlwKIC1pICAgICA6IGluc3BlY3QgaW50ZXJhY3RpdmVseSBhZnRlciBydW5uaW5nIHNjcmlwdDsgZm9yY2VzIGEgcHJvbXB0IGV2ZW5cblwKICAgICAgICAgIGlmIHN0ZGluIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHRlcm1pbmFsOyBhbHNvIFBZVEhPTklOU1BFQ1Q9eFxuXAogLUkgICAgIDogaXNvbGF0ZSBQeXRob24gZnJvbSB0aGUgdXNlcidzIGVudmlyb25tZW50IChpbXBsaWVzIC1FIGFuZCAtcylcblwKQEAgLTY3LDcgKzY3LDcgQEAKIC1zICAgICA6IGRvbid0IGFkZCB1c2VyIHNpdGUgZGlyZWN0b3J5IHRvIHN5cy5wYXRoOyBhbHNvIFBZVEhPTk5PVVNFUlNJVEVcblwKIC1TICAgICA6IGRvbid0IGltcGx5ICdpbXBvcnQgc2l0ZScgb24gaW5pdGlhbGl6YXRpb25cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfMyA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV8zW10gPSAiXAogLXUgICAgIDogdW5idWZmZXJlZCBiaW5hcnkgc3Rkb3V0IGFuZCBzdGRlcnIsIHN0ZGluIGFsd2F5cyBidWZmZXJlZDtcblwKICAgICAgICAgIGFsc28gUFlUSE9OVU5CVUZGRVJFRD14XG5cCiAgICAgICAgICBzZWUgbWFuIHBhZ2UgZm9yIGRldGFpbHMgb24gaW50ZXJuYWwgYnVmZmVyaW5nIHJlbGF0aW5nIHRvICctdSdcblwKQEAgLTc5LDcgKzc5LDcgQEAKIC14ICAgICA6IHNraXAgZmlyc3QgbGluZSBvZiBzb3VyY2UsIGFsbG93aW5nIHVzZSBvZiBub24tVW5peCBmb3JtcyBvZiAjIWNtZFxuXAogLVggb3B0IDogc2V0IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG9wdGlvblxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV80ID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzRbXSA9ICJcCiBmaWxlICAgOiBwcm9ncmFtIHJlYWQgZnJvbSBzY3JpcHQgZmlsZVxuXAogLSAgICAgIDogcHJvZ3JhbSByZWFkIGZyb20gc3RkaW4gKGRlZmF1bHQ7IGludGVyYWN0aXZlIG1vZGUgaWYgYSB0dHkpXG5cCiBhcmcgLi4uOiBhcmd1bWVudHMgcGFzc2VkIHRvIHByb2dyYW0gaW4gc3lzLmFyZ3ZbMTpdXG5cblwKQEAgLTg4LDE0ICs4OCwxNCBAQAogUFlUSE9OUEFUSCAgIDogJyVjJy1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBwcmVmaXhlZCB0byB0aGVcblwKICAgICAgICAgICAgICAgIGRlZmF1bHQgbW9kdWxlIHNlYXJjaCBwYXRoLiAgVGhlIHJlc3VsdCBpcyBzeXMucGF0aC5cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfNSA9CitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV81W10gPQogIlBZVEhPTkhPTUUgICA6IGFsdGVybmF0ZSA8cHJlZml4PiBkaXJlY3RvcnkgKG9yIDxwcmVmaXg+JWM8ZXhlY19wcmVmaXg+KS5cbiIKICIgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBtb2R1bGUgc2VhcmNoIHBhdGggdXNlcyAlcy5cbiIKICJQWVRIT05DQVNFT0sgOiBpZ25vcmUgY2FzZSBpbiAnaW1wb3J0JyBzdGF0ZW1lbnRzIChXaW5kb3dzKS5cbiIKICJQWVRIT05JT0VOQ09ESU5HOiBFbmNvZGluZ1s6ZXJyb3JzXSB1c2VkIGZvciBzdGRpbi9zdGRvdXQvc3RkZXJyLlxuIgogIlBZVEhPTkZBVUxUSEFORExFUjogZHVtcCB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMuXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzYgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfNltdID0gIlwKIFBZVEhPTkhBU0hTRUVEOiBpZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAncmFuZG9tJywgYSByYW5kb20gdmFsdWUgaXMgdXNlZFxuXAogICAgdG8gc2VlZCB0aGUgaGFzaGVzIG9mIHN0ciwgYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZVxuXAogICAgc2V0IHRvIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLDQyOTQ5NjcyOTVdIHRvIGdldCBoYXNoIHZhbHVlcyB3aXRoIGFcblwKQEAgLTEwMyw3ICsxMDMsNyBAQAogIjsKIAogc3RhdGljIGludAotdXNhZ2UoaW50IGV4aXRjb2RlLCB3Y2hhcl90KiBwcm9ncmFtKQordXNhZ2UoaW50IGV4aXRjb2RlLCBjb25zdCB3Y2hhcl90KiBwcm9ncmFtKQogewogICAgIEZJTEUgKmYgPSBleGl0Y29kZSA/IHN0ZGVyciA6IHN0ZG91dDsKIApAQCAtNjU0LDcgKzY1NCw3IEBACiAgICAgICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZSh3YnVmKTsKIAogICAgICAgICAgICAgLyogRG9uJ3QgZnJlZSB3YnVmLCB0aGUgYXJndW1lbnQgdG8gUHlfU2V0UHJvZ3JhbU5hbWUKLSAgICAgICAgICAgICAqIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBQeV9GaW5hbGl6ZSBpcyBjYWxsZWQuCisgICAgICAgICAgICAgKiBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCBQeV9GaW5hbGl6ZUV4IGlzIGNhbGxlZC4KICAgICAgICAgICAgICAqLwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CkBAIC03ODUsNyArNzg1LDExIEBACiAgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7CiAgICAgfQogCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICAvKiBWYWx1ZSB1bmxpa2VseSB0byBiZSBjb25mdXNlZCB3aXRoIGEgbm9uLWVycm9yIGV4aXQgc3RhdHVzIG9yCisgICAgICAgIG90aGVyIHNwZWNpYWwgbWVhbmluZyAqLworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiAjaWZkZWYgX19JTlNVUkVfXwogICAgIC8qIEluc3VyZSsrIGlzIGEgbWVtb3J5IGFuYWx5c2lzIHRvb2wgdGhhdCBhaWRzIGluIGRpc2NvdmVyaW5nCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21hdGhtb2R1bGUuYyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCmluZGV4IDkzNTllYjIuLjZiM2UxMzkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCkBAIC04NzYsNyArODc2LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLW1hdGhfMihQeU9iamVjdCAqYXJncywgZG91YmxlICgqZnVuYykgKGRvdWJsZSwgZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCittYXRoXzIoUHlPYmplY3QgKmFyZ3MsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUsIGRvdWJsZSksIGNvbnN0IGNoYXIgKmZ1bmNuYW1lKQogewogICAgIFB5T2JqZWN0ICpveCwgKm95OwogICAgIGRvdWJsZSB4LCB5LCByOwpAQCAtMTY3Myw3ICsxNjczLDcgQEAKICAgIGluIHRoYXQgaW50IGlzIGxhcmdlciB0aGFuIFBZX1NTSVpFX1RfTUFYLiAqLwogCiBzdGF0aWMgUHlPYmplY3QqCi1sb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCitsb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY29uc3QgY2hhciAqZnVuY25hbWUpCiB7CiAgICAgLyogSWYgaXQgaXMgaW50LCBkbyBpdCBvdXJzZWx2ZXMuICovCiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL25pc21vZHVsZS5jIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwppbmRleCA2NGViNWRiLi5iNmE4NTVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL25pc21vZHVsZS5jCisrKyBiL01vZHVsZXMvbmlzbW9kdWxlLmMKQEAgLTc2LDExICs3Niw3IEBACiAKICAgICAqcGZpeCA9IDA7CiAgICAgZm9yIChpPTA7IGFsaWFzZXNbaV0uYWxpYXMgIT0gMEw7IGkrKykgewotICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSkgewotICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKLSAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0uYWxpYXMsIG1hcCkgfHwgIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKICAgICAgICAgICAgICpwZml4ID0gYWxpYXNlc1tpXS5maXg7CiAgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpXS5tYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCmluZGV4IDY0NzFiOGUuLmRlYWUwNDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogIFN0cmluZyBjb25zdGFudHMgdXNlZCB0byBpbml0aWFsaXplIG1vZHVsZSBhdHRyaWJ1dGVzLgogICoKICAqLwotc3RhdGljIGNoYXIgcGFyc2VyX2NvcHlyaWdodF9zdHJpbmdbXSA9CitzdGF0aWMgY29uc3QgY2hhciBwYXJzZXJfY29weXJpZ2h0X3N0cmluZ1tdID0KICJDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IFZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSAmIFN0YXRlXG5cCiBVbml2ZXJzaXR5LCBCbGFja3NidXJnLCBWaXJnaW5pYSwgVVNBLCBhbmQgRnJlZCBMLiBEcmFrZSwgSnIuLCBSZXN0b24sXG5cCiBWaXJnaW5pYSwgVVNBLiAgUG9ydGlvbnMgY29weXJpZ2h0IDE5OTEtMTk5NSBieSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoXG5cCkBAIC02Myw3ICs2Myw3IEBACiBQeURvY19TVFJWQVIocGFyc2VyX2RvY19zdHJpbmcsCiAiVGhpcyBpcyBhbiBpbnRlcmZhY2UgdG8gUHl0aG9uJ3MgaW50ZXJuYWwgcGFyc2VyLiIpOwogCi1zdGF0aWMgY2hhciBwYXJzZXJfdmVyc2lvbl9zdHJpbmdbXSA9ICIwLjUiOworc3RhdGljIGNvbnN0IGNoYXIgcGFyc2VyX3ZlcnNpb25fc3RyaW5nW10gPSAiMC41IjsKIAogCiB0eXBlZGVmIFB5T2JqZWN0KiAoKlNlcU1ha2VyKSAoUHlfc3NpemVfdCBsZW5ndGgpOwpAQCAtNTc4LDEzICs1NzgsMTMgQEAKIH0KIAogCi0vKiAgZXJyX3N0cmluZyhjaGFyKiBtZXNzYWdlKQorLyogIGVycl9zdHJpbmcoY29uc3QgY2hhciogbWVzc2FnZSkKICAqCiAgKiAgU2V0cyB0aGUgZXJyb3Igc3RyaW5nIGZvciBhbiBleGNlcHRpb24gb2YgdHlwZSBQYXJzZXJFcnJvci4KICAqCiAgKi8KIHN0YXRpYyB2b2lkCi1lcnJfc3RyaW5nKGNoYXIgKm1lc3NhZ2UpCitlcnJfc3RyaW5nKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7CiAgICAgUHlFcnJfU2V0U3RyaW5nKHBhcnNlcl9lcnJvciwgbWVzc2FnZSk7CiB9CkBAIC01OTcsNyArNTk3LDcgQEAKICAqCiAgKi8KIHN0YXRpYyBQeU9iamVjdCoKLXBhcnNlcl9kb19wYXJzZShQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3LCBjaGFyICphcmdzcGVjLCBpbnQgdHlwZSkKK3BhcnNlcl9kb19wYXJzZShQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3LCBjb25zdCBjaGFyICphcmdzcGVjLCBpbnQgdHlwZSkKIHsKICAgICBjaGFyKiAgICAgc3RyaW5nID0gMDsKICAgICBQeU9iamVjdCogcmVzICAgID0gMDsKQEAgLTk4NCw3ICs5ODQsNyBAQAogLyoKICAqICBWYWxpZGF0aW9uIHJvdXRpbmVzIHVzZWQgd2l0aGluIHRoZSB2YWxpZGF0aW9uIHNlY3Rpb246CiAgKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfdGVybWluYWwobm9kZSAqdGVybWluYWwsIGludCB0eXBlLCBjaGFyICpzdHJpbmcpOworc3RhdGljIGludCB2YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnN0cmluZyk7CiAKICNkZWZpbmUgdmFsaWRhdGVfYW1wZXJzYW5kKGNoKSAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgQU1QRVIsICImIikKICNkZWZpbmUgdmFsaWRhdGVfY2lyY3VtZmxleChjaCkgdmFsaWRhdGVfdGVybWluYWwoY2gsIENJUkNVTUZMRVgsICJeIikKQEAgLTEwODIsNyArMTA4Miw3IEBACiAKIAogc3RhdGljIGludAotdmFsaWRhdGVfdGVybWluYWwobm9kZSAqdGVybWluYWwsIGludCB0eXBlLCBjaGFyICpzdHJpbmcpCit2YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIHsKICAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRlcm1pbmFsLCB0eXBlKQogICAgICAgICAgICAgICAgJiYgKChzdHJpbmcgPT0gMCkgfHwgKHN0cmNtcChzdHJpbmcsIFNUUih0ZXJtaW5hbCkpID09IDApKSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggZTRiMjdhNy4uMzY3ZTRmMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtOTQ5LDcgKzk0OSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1hcmd1bWVudF91bmF2YWlsYWJsZV9lcnJvcihjaGFyICpmdW5jdGlvbl9uYW1lLCBjaGFyICphcmd1bWVudF9uYW1lKSB7Cithcmd1bWVudF91bmF2YWlsYWJsZV9lcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBjb25zdCBjaGFyICphcmd1bWVudF9uYW1lKQorewogICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAogICAgICAgICAiJXMlcyVzIHVuYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0iLAogICAgICAgICAoZnVuY3Rpb25fbmFtZSAhPSBOVUxMKSA/IGZ1bmN0aW9uX25hbWUgOiAiIiwKQEAgLTk3Miw3ICs5NzMsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1mZF9zcGVjaWZpZWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkKSB7CitmZF9zcGVjaWZpZWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkKQorewogICAgIGlmIChmZCA9PSAtMSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTk4MSw3ICs5ODMsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1mb2xsb3dfc3ltbGlua3Nfc3BlY2lmaWVkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2ZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoZm9sbG93X3N5bWxpbmtzKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtOTkwLDcgKzk5Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBhdGhfYW5kX2Rpcl9mZF9pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwgaW50IGRpcl9mZCkgeworcGF0aF9hbmRfZGlyX2ZkX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLCBpbnQgZGlyX2ZkKQorewogICAgIGlmICghcGF0aC0+bmFycm93ICYmICFwYXRoLT53aWRlICYmIChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW4ndCBzcGVjaWZ5IGRpcl9mZCB3aXRob3V0IG1hdGNoaW5nIHBhdGgiLApAQCAtMTAwMSw3ICsxMDA1LDggQEAKIH0KIAogc3RhdGljIGludAotZGlyX2ZkX2FuZF9mZF9pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsIGludCBmZCkgeworZGlyX2ZkX2FuZF9mZF9pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsIGludCBmZCkKK3sKICAgICBpZiAoKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkgJiYgKGZkICE9IC0xKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICIlczogY2FuJ3Qgc3BlY2lmeSBib3RoIGRpcl9mZCBhbmQgZmQiLApAQCAtMTAxMiw4ICsxMDE3LDkgQEAKIH0KIAogc3RhdGljIGludAotZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKSB7CitmZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpCit7CiAgICAgaWYgKChmZCA+IDApICYmICghZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICIlczogY2Fubm90IHVzZSBmZCBhbmQgZm9sbG93X3N5bWxpbmtzIHRvZ2V0aGVyIiwKQEAgLTEwMjQsOCArMTAzMCw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpcl9mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykgeworZGlyX2ZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmICgoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKSAmJiAoIWZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCB1c2UgZGlyX2ZkIGFuZCBmb2xsb3dfc3ltbGlua3MgdG9nZXRoZXIiLApAQCAtMTIyMCw3ICsxMjI3LDcgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKIHN0YXRpYyBQeU9iamVjdCAqCi13aW4zMl9lcnJvcihjaGFyKiBmdW5jdGlvbiwgY29uc3QgY2hhciogZmlsZW5hbWUpCit3aW4zMl9lcnJvcihjb25zdCBjaGFyKiBmdW5jdGlvbiwgY29uc3QgY2hhciogZmlsZW5hbWUpCiB7CiAgICAgLyogWFhYIFdlIHNob3VsZCBwYXNzIHRoZSBmdW5jdGlvbiBuYW1lIGFsb25nIGluIHRoZSBmdXR1cmUuCiAgICAgICAgKHdpbnJlZy5jIGFsc28gd2FudHMgdG8gcGFzcyB0aGUgZnVuY3Rpb24gbmFtZS4pCkBAIC0xMjM1LDcgKzEyNDIsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotd2luMzJfZXJyb3Jfb2JqZWN0KGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogZmlsZW5hbWUpCit3aW4zMl9lcnJvcl9vYmplY3QoY29uc3QgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBmaWxlbmFtZSkKIHsKICAgICAvKiBYWFggLSBzZWUgd2luMzJfZXJyb3IgZm9yIGNvbW1lbnRzIG9uICdmdW5jdGlvbicgKi8KICAgICBlcnJubyA9IEdldExhc3RFcnJvcigpOwpAQCAtMjEwMCw3ICsyMTA3LDcgQEAKIAogCiBzdGF0aWMgUHlPYmplY3QgKgotcG9zaXhfZG9fc3RhdChjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsCitwb3NpeF9kb19zdGF0KGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwKICAgICAgICAgICAgICAgaW50IGRpcl9mZCwgaW50IGZvbGxvd19zeW1saW5rcykKIHsKICAgICBTVFJVQ1RfU1RBVCBzdDsKQEAgLTM0NjAsMTAgKzM0NjcsOCBAQAogICAgIEJPT0wgcmVzdWx0OwogICAgIFdJTjMyX0ZJTkRfREFUQSBGaWxlRGF0YTsKICAgICBjaGFyIG5hbWVidWZbTUFYX1BBVEgrNF07IC8qIE92ZXJhbGxvY2F0ZSBmb3IgIlwqLioiICovCi0gICAgY2hhciAqYnVmcHRyID0gbmFtZWJ1ZjsKICAgICAvKiBvbmx5IGNsYWltIHRvIGhhdmUgc3BhY2UgZm9yIE1BWF9QQVRIICovCiAgICAgUHlfc3NpemVfdCBsZW4gPSBQeV9BUlJBWV9MRU5HVEgobmFtZWJ1ZiktNDsKLSAgICBQeU9iamVjdCAqcG8gPSBOVUxMOwogICAgIHdjaGFyX3QgKnduYW1lYnVmID0gTlVMTDsKIAogICAgIGlmICghcGF0aC0+bmFycm93KSB7CkBAIC00NTYzLDcgKzQ1NjgsNyBAQAogI2lmIGRlZmluZWQoSEFWRV9GVVRJTUVTQVQpIHx8IGRlZmluZWQoSEFWRV9VVElNRU5TQVQpCiAKIHN0YXRpYyBpbnQKLXV0aW1lX2Rpcl9mZCh1dGltZV90ICp1dCwgaW50IGRpcl9mZCwgY2hhciAqcGF0aCwgaW50IGZvbGxvd19zeW1saW5rcykKK3V0aW1lX2Rpcl9mZCh1dGltZV90ICp1dCwgaW50IGRpcl9mZCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGZvbGxvd19zeW1saW5rcykKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIGludCBmbGFncyA9IGZvbGxvd19zeW1saW5rcyA/IDAgOiBBVF9TWU1MSU5LX05PRk9MTE9XOwpAQCAtNDYwNSwxNCArNDYxMCwxNCBAQAogICAgICNkZWZpbmUgUEFUSF9VVElNRV9IQVZFX0ZEIDAKICNlbmRpZgogCisjaWYgZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpCisjICBkZWZpbmUgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2VuZGlmCiAKLSNkZWZpbmUgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUyBcCi0gICAgICAgIChkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKSB8fCBkZWZpbmVkKEhBVkVfTFVUSU1FUykpCi0KLSNpZiBVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCisjaWZkZWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUwogCiBzdGF0aWMgaW50Ci11dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY2hhciAqcGF0aCkKK3V0aW1lX25vZm9sbG93X3N5bWxpbmtzKHV0aW1lX3QgKnV0LCBjb25zdCBjaGFyICpwYXRoKQogewogI2lmZGVmIEhBVkVfVVRJTUVOU0FUCiAgICAgVVRJTUVfVE9fVElNRVNQRUM7CkBAIC00NjI4LDcgKzQ2MzMsNyBAQAogI2lmbmRlZiBNU19XSU5ET1dTCiAKIHN0YXRpYyBpbnQKLXV0aW1lX2RlZmF1bHQodXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjb25zdCBjaGFyICpwYXRoKQogewogI2lmZGVmIEhBVkVfVVRJTUVOU0FUCiAgICAgVVRJTUVfVE9fVElNRVNQRUM7CkBAIC00NzcxLDcgKzQ3NzYsNyBAQAogICAgICAgICB1dGltZS5ub3cgPSAxOwogICAgIH0KIAotI2lmICFVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCisjaWYgIWRlZmluZWQoVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUykKICAgICBpZiAoZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZCgidXRpbWUiLCBmb2xsb3dfc3ltbGlua3MpKQogICAgICAgICBnb3RvIGV4aXQ7CiAjZW5kaWYKQEAgLTQ4MjUsNyArNDgzMCw3IEBACiAjZWxzZSAvKiBNU19XSU5ET1dTICovCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKICAgICBpZiAoKCFmb2xsb3dfc3ltbGlua3MpICYmIChkaXJfZmQgPT0gREVGQVVMVF9ESVJfRkQpKQogICAgICAgICByZXN1bHQgPSB1dGltZV9ub2ZvbGxvd19zeW1saW5rcygmdXRpbWUsIHBhdGgtPm5hcnJvdyk7CiAgICAgZWxzZQpAQCAtNTc1NiwxNCArNTc2MSwxNCBAQAogICAgIHBpZDogcGlkX3QKICAgICAvCiAKLVJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuCitSZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkIChvciB0aGUgY3VycmVudCBwcm9jZXNzIGlmIHplcm8pLgogCiBUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Nfc2NoZWRfZ2V0YWZmaW5pdHlfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBwaWRfdCBwaWQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjQzMWE4ZjMxMGUzNjllNyBpbnB1dD1lYWYxNjE5MzY4NzRiOGExXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YjQzMWE4ZjMxMGUzNjllNyBpbnB1dD05ODNjZTdjYjRhNTY1OTgwXSovCiB7CiAgICAgaW50IGNwdSwgbmNwdXMsIGNvdW50OwogICAgIHNpemVfdCBzZXRzaXplOwpAQCAtNzMyNSw3ICs3MzMwLDcgQEAKIAogLyogUmV0dXJuIFRydWUgaWYgdGhlIHBhdGggYXQgc3JjIHJlbGF0aXZlIHRvIGRlc3QgaXMgYSBkaXJlY3RvcnkgKi8KIHN0YXRpYyBpbnQKLV9jaGVja19kaXJBKGNoYXIgKnNyYywgY2hhciAqZGVzdCkKK19jaGVja19kaXJBKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZGVzdCkKIHsKICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHNyY19pbmZvOwogICAgIGNoYXIgZGVzdF9wYXJlbnRbTUFYX1BBVEhdOwpAQCAtOTQ4MSw4ICs5NDg2LDggQEAKICAqIHN1ZmZpY2llbnRseSBwZXJ2YXNpdmUgdGhhdCBpdCdzIG5vdCB3b3J0aCB0aGUgbG9zcyBvZiByZWFkYWJpbGl0eS4KICAqLwogc3RydWN0IGNvbnN0ZGVmIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGxvbmcgdmFsdWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7CiB9OwogCiBzdGF0aWMgaW50CkBAIC05NDkwLDcgKzk0OTUsMTAgQEAKICAgICAgICAgICAgICAgc2l6ZV90IHRhYmxlc2l6ZSkKIHsKICAgICBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKLSAgICAgICAgKnZhbHVlcCA9IFB5TG9uZ19BU19MT05HKGFyZyk7CisgICAgICAgIGludCB2YWx1ZSA9IF9QeUxvbmdfQXNJbnQoYXJnKTsKKyAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnZhbHVlcCA9IHZhbHVlOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgZWxzZSB7CkBAIC0xMDgyMSw3ICsxMDgyOSw3IEBACiAgICAgZm9yIChpID0gMDsgOyBpKyspIHsKICAgICAgICAgdm9pZCAqcHRyOwogICAgICAgICBzc2l6ZV90IHJlc3VsdDsKLSAgICAgICAgc3RhdGljIFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7MTI4LCBYQVRUUl9TSVpFX01BWCwgMH07CisgICAgICAgIHN0YXRpYyBjb25zdCBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0gezEyOCwgWEFUVFJfU0laRV9NQVgsIDB9OwogICAgICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemVzW2ldOwogICAgICAgICBpZiAoIWJ1ZmZlcl9zaXplKSB7CiAgICAgICAgICAgICBwYXRoX2Vycm9yKHBhdGgpOwpAQCAtMTA5ODcsNyArMTA5OTUsNyBAQAogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgIGNoYXIgKnN0YXJ0LCAqdHJhY2UsICplbmQ7CiAgICAgICAgIHNzaXplX3QgbGVuZ3RoOwotICAgICAgICBzdGF0aWMgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsgMjU2LCBYQVRUUl9MSVNUX01BWCwgMCB9OworICAgICAgICBzdGF0aWMgY29uc3QgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsgMjU2LCBYQVRUUl9MSVNUX01BWCwgMCB9OwogICAgICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemVzW2ldOwogICAgICAgICBpZiAoIWJ1ZmZlcl9zaXplKSB7CiAgICAgICAgICAgICAvKiBFUkFOR0UgKi8KQEAgLTExMTk5LDExICsxMTIwNywxNSBAQAogb3MuY3B1X2NvdW50CiAKIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuCisKK1RoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgordXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX2NwdV9jb3VudF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzU5ZWU3ZjZiY2U4MzJiOCBpbnB1dD1kNTVlMmY4ZjM4MjNhNjI4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzU5ZWU3ZjZiY2U4MzJiOCBpbnB1dD1lN2M4ZjRiYTZkYmJhZGQzXSovCiB7CiAgICAgaW50IG5jcHUgPSAwOwogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTExODMwLDcgKzExODQyLDcgQEAKICNlbHNlIC8qIFBPU0lYICovCiAKIHN0YXRpYyBjaGFyICoKLWpvaW5fcGF0aF9maWxlbmFtZShjaGFyICpwYXRoX25hcnJvdywgY2hhciogZmlsZW5hbWUsIFB5X3NzaXplX3QgZmlsZW5hbWVfbGVuKQoram9pbl9wYXRoX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnBhdGhfbmFycm93LCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgUHlfc3NpemVfdCBmaWxlbmFtZV9sZW4pCiB7CiAgICAgUHlfc3NpemVfdCBwYXRoX2xlbjsKICAgICBQeV9zc2l6ZV90IHNpemU7CkBAIC0xMTg2Miw3ICsxMTg3NCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1EaXJFbnRyeV9mcm9tX3Bvc2l4X2luZm8ocGF0aF90ICpwYXRoLCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG5hbWVfbGVuLAorRGlyRW50cnlfZnJvbV9wb3NpeF9pbmZvKHBhdGhfdCAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSwgUHlfc3NpemVfdCBuYW1lX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbm9fdCBkX2lubwogI2lmZGVmIEhBVkVfRElSRU5UX0RfVFlQRQogICAgICAgICAgICAgICAgICAgICAgICAgICwgdW5zaWduZWQgY2hhciBkX3R5cGUKQEAgLTEyMzczLDcgKzEyMzg1LDYgQEAKICAgICBIQU5ETEUgdG9rOwogICAgIFRPS0VOX1BSSVZJTEVHRVMgdG9rX3ByaXY7CiAgICAgTFVJRCBsdWlkOwotICAgIGludCBtZXRoX2lkeCA9IDA7CiAKICAgICBpZiAoIU9wZW5Qcm9jZXNzVG9rZW4oR2V0Q3VycmVudFByb2Nlc3MoKSwgVE9LRU5fQUxMX0FDQ0VTUywgJnRvaykpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTI4MTcsNyArMTI4MjgsNyBAQAogfTsKIAogCi1zdGF0aWMgY2hhciAqaGF2ZV9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGF2ZV9mdW5jdGlvbnNbXSA9IHsKIAogI2lmZGVmIEhBVkVfRkFDQ0VTU0FUCiAgICAgIkhBVkVfRkFDQ0VTU0FUIiwKQEAgLTEyOTUyLDcgKzEyOTYzLDcgQEAKIHsKICAgICBQeU9iamVjdCAqbSwgKnY7CiAgICAgUHlPYmplY3QgKmxpc3Q7Ci0gICAgY2hhciAqKnRyYWNlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdHJhY2U7CiAKICNpZiBkZWZpbmVkKEhBVkVfU1lNTElOSykgJiYgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIHdpbjMyX2Nhbl9zeW1saW5rID0gZW5hYmxlX3N5bWxpbmsoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvcHlleHBhdC5jIGIvTW9kdWxlcy9weWV4cGF0LmMKaW5kZXggOWE2ZGE3My4uYzZkMzUxNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9weWV4cGF0LmMKKysrIGIvTW9kdWxlcy9weWV4cGF0LmMKQEAgLTkxLDcgKzkxLDcgQEAKICAqIGZhbHNlIG9uIGFuIGV4Y2VwdGlvbi4KICAqLwogc3RhdGljIGludAotc2V0X2Vycm9yX2F0dHIoUHlPYmplY3QgKmVyciwgY2hhciAqbmFtZSwgaW50IHZhbHVlKQorc2V0X2Vycm9yX2F0dHIoUHlPYmplY3QgKmVyciwgY29uc3QgY2hhciAqbmFtZSwgaW50IHZhbHVlKQogewogICAgIFB5T2JqZWN0ICp2ID0gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKIApAQCAtMjE4LDcgKzIxOCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWNhbGxfd2l0aF9mcmFtZShjaGFyICpmdW5jbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QqIGZ1bmMsIFB5T2JqZWN0KiBhcmdzLAorY2FsbF93aXRoX2ZyYW1lKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCogZnVuYywgUHlPYmplY3QqIGFyZ3MsCiAgICAgICAgICAgICAgICAgeG1scGFyc2VvYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKQEAgLTc0Nyw3ICs3NDcsOCBAQAogICAgICAgICBzICs9IE1BWF9DSFVOS19TSVpFOwogICAgICAgICBzbGVuIC09IE1BWF9DSFVOS19TSVpFOwogICAgIH0KLSAgICBhc3NlcnQoTUFYX0NIVU5LX1NJWkUgPCBJTlRfTUFYICYmIHNsZW4gPCBJTlRfTUFYKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoTUFYX0NIVU5LX1NJWkUgPD0gSU5UX01BWCk7CisgICAgYXNzZXJ0KHNsZW4gPD0gSU5UX01BWCk7CiAgICAgcmMgPSBYTUxfUGFyc2Uoc2VsZi0+aXRzZWxmLCBzLCAoaW50KXNsZW4sIGlzZmluYWwpOwogCiBkb25lOgpAQCAtNzY1LDcgKzc2Niw3IEBACiB7CiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBQeV9zc2l6ZV90IGxlbjsKLSAgICBjaGFyICpwdHI7CisgICAgY29uc3QgY2hhciAqcHRyOwogCiAgICAgc3RyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKG1ldGgsICJuIiwgYnVmX3NpemUpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKQEAgLTEyMjUsMTIgKzEyMjYsOCBAQAogICAgIHNlbGYtPml0c2VsZiA9IE5VTEw7CiAKICAgICBpZiAoc2VsZi0+aGFuZGxlcnMgIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqdGVtcDsKLSAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0gICAgICAgICAgICB0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaV07Ci0gICAgICAgICAgICBzZWxmLT5oYW5kbGVyc1tpXSA9IE5VTEw7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIFB5X0NMRUFSKHNlbGYtPmhhbmRsZXJzW2ldKTsKICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5oYW5kbGVycyk7CiAgICAgICAgIHNlbGYtPmhhbmRsZXJzID0gTlVMTDsKICAgICB9CkBAIC0xMzQ0LDcgKzEzNDEsNiBAQAogICAgIGludCBoYW5kbGVybnVtID0gaGFuZGxlcm5hbWUyaW50KG5hbWUpOwogICAgIGlmIChoYW5kbGVybnVtID49IDApIHsKICAgICAgICAgeG1saGFuZGxlciBjX2hhbmRsZXIgPSBOVUxMOwotICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dOwogCiAgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKICAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIsIGFuZCBhIGNoYXJhY3RlcgpAQCAtMTM2Niw4ICsxMzYyLDcgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKICAgICAgICAgICAgIGNfaGFuZGxlciA9IGhhbmRsZXJfaW5mb1toYW5kbGVybnVtXS5oYW5kbGVyOwogICAgICAgICB9Ci0gICAgICAgIHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dID0gdjsKLSAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgUHlfU0VUUkVGKHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dLCB2KTsKICAgICAgICAgaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLnNldHRlcihzZWxmLT5pdHNlbGYsIGNfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE4OTcsMTUgKzE4OTIsMTIgQEAKIGNsZWFyX2hhbmRsZXJzKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBpbnQgaW5pdGlhbCkKIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgUHlPYmplY3QgKnRlbXA7CiAKICAgICBmb3IgKDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGlmIChpbml0aWFsKQogICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggYTY1ODFiMC4uOTM5ZmYxYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtODQxLDcgKzg0MSw3IEBACiAgICAgICAgIGlmIChyID09IFB5X05vbmUpCiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmcocik7CisgICAgICAgICAgICByZXN1bHQgPSBfUHlMb25nX0FzSW50KHIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCmluZGV4IGIzYWM4MDcuLjcwZjJkYjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwpAQCAtMTg0Miw3ICsxODQyLDcgQEAKICAgICBQeU9iamVjdCAqcGZkOwogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaWRlbnQiLCAiZmlsdGVyIiwgImZsYWdzIiwgImZmbGFncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiwgInVkYXRhIiwgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJPfGhISSIgREFUQV9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiT3xoSEkiIERBVEFfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOwogCiAgICAgRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwppbmRleCBiYWU5NjM0Li43YWI1MzRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKQEAgLTkwNCw3ICs5MDQsNyBAQAogICAgYW4gZXJyb3Igb2NjdXJyZWQ7IHRoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKi8KIAogc3RhdGljIGludAotc2V0aXBhZGRyKGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCitzZXRpcGFkZHIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICphZGRyX3JldCwgc2l6ZV90IGFkZHJfcmV0X3NpemUsIGludCBhZikKIHsKICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CiAgICAgaW50IGVycm9yOwpAQCAtMTA4NSw3ICsxMDg1LDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkLiAqLwogCiBzdGF0aWMgaW50Ci1zZXRiZGFkZHIoY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKK3NldGJkYWRkcihjb25zdCBjaGFyICpuYW1lLCBiZGFkZHJfdCAqYmRhZGRyKQogewogICAgIHVuc2lnbmVkIGludCBiMCwgYjEsIGIyLCBiMywgYjQsIGI1OwogICAgIGNoYXIgY2g7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NyZV9saWIuaCBiL01vZHVsZXMvc3JlX2xpYi5oCmluZGV4IDEyOGM3MWUuLjc4ZjdhYzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3JlX2xpYi5oCisrKyBiL01vZHVsZXMvc3JlX2xpYi5oCkBAIC0zNjcsMTQgKzM2NywxMiBAQAogI2RlZmluZSBSRVRVUk5fT05fRkFJTFVSRShpKSBcCiAgICAgZG8geyBSRVRVUk5fT05fRVJST1IoaSk7IGlmIChpID09IDApIFJFVFVSTl9GQUlMVVJFOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNGWSh4KSAjeAotCiAjZGVmaW5lIERBVEFfU1RBQ0tfQUxMT0Moc3RhdGUsIHR5cGUsIHB0cikgXAogZG8geyBcCiAgICAgYWxsb2NfcG9zID0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZTsgXAogICAgIFRSQUNFKCgiYWxsb2NhdGluZyAlcyBpbiAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAogICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCi0gICAgICAgICAgIFNGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAorICAgICAgICAgICBQeV9TVFJJTkdJRlkodHlwZSksIGFsbG9jX3Bvcywgc2l6ZW9mKHR5cGUpKSk7IFwKICAgICBpZiAoc2l6ZW9mKHR5cGUpID4gc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZSAtIGFsbG9jX3BvcykgeyBcCiAgICAgICAgIGludCBqID0gZGF0YV9zdGFja19ncm93KHN0YXRlLCBzaXplb2YodHlwZSkpOyBcCiAgICAgICAgIGlmIChqIDwgMCkgcmV0dXJuIGo7IFwKQEAgLTM4Nyw3ICszODUsNyBAQAogCiAjZGVmaW5lIERBVEFfU1RBQ0tfTE9PS1VQX0FUKHN0YXRlLCB0eXBlLCBwdHIsIHBvcykgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIFNGWSh0eXBlKSwgcG9zKSk7IFwKKyAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgUHlfU1RSSU5HSUZZKHR5cGUpLCBwb3MpKTsgXAogICAgIHB0ciA9ICh0eXBlKikoc3RhdGUtPmRhdGFfc3RhY2srcG9zKTsgXAogfSB3aGlsZSAoMCkKIApAQCAtMTI1Niw3ICsxMjU0LDMyIEBACiAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgcHJlZml4X3NraXApKTsKICAgICBUUkFDRSgoImNoYXJzZXQgPSAlcFxuIiwgY2hhcnNldCkpOwogCi0jaWYgZGVmaW5lZChVU0VfRkFTVF9TRUFSQ0gpCisgICAgaWYgKHByZWZpeF9sZW4gPT0gMSkgeworICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgU1JFX0NIQVIgYyA9IChTUkVfQ0hBUikgcHJlZml4WzBdOworI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKKyAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwcmVmaXhbMF0pCisgICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLworI2VuZGlmCisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CisgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKKyAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBwdHIgKyBwcmVmaXhfc2tpcDsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyKnByZWZpeF9za2lwLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgKytwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgaWYgKHByZWZpeF9sZW4gPiAxKSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBrbm93biBwcmVmaXguICB1c2UgdGhlIG92ZXJsYXAKICAgICAgICAgICAgdGFibGUgdG8gc2tpcCBmb3J3YXJkIGFzIGZhc3QgYXMgd2UgcG9zc2libHkgY2FuICovCkBAIC0xMzA1LDMyICsxMzI4LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jZW5kaWYKIAotICAgIGlmIChwYXR0ZXJuWzBdID09IFNSRV9PUF9MSVRFUkFMKSB7Ci0gICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3Rlci4gIHRoaXMgaXMgdXNlZAotICAgICAgICAgICBmb3Igc2hvcnQgcHJlZml4ZXMsIGFuZCBpZiBmYXN0IHNlYXJjaCBpcyBkaXNhYmxlZCAqLwotICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwYXR0ZXJuWzFdOwotI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKLSAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwYXR0ZXJuWzFdKQotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGxpdGVyYWwgY2FuJ3QgbWF0Y2g6IGRvZXNuJ3QgZml0IGluIGNoYXIgd2lkdGggKi8KLSNlbmRpZgotICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKnB0ciAhPSBjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrcHRyID49IGVuZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxTRUFSQ0ggTElURVJBTFxuIiwgcGF0dGVybiwgcHRyKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+c3RhcnQgPSBwdHI7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0gKytwdHI7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBTUkVfSU5GT19MSVRFUkFMKQotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiB3ZSBnb3QgYWxsIG9mIGl0ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBTUkUobWF0Y2gpKHN0YXRlLCBwYXR0ZXJuICsgMiwgMCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNoYXJzZXQpIHsKKyAgICBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KICAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBkMmNhYWNkLi4wYjZkNDYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICBSZXR1cm5zIG5vbi16ZXJvIG9uIHN1Y2Nlc3MgKHBhcmFsbGVscyBQeUFyZ19QYXJzZVR1cGxlKS4KICovCiBzdGF0aWMgaW50Ci1wYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQorcGFyc2VfdGltZV90X2FyZ3MoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdGltZV90ICpwd2hlbikKIHsKICAgICBQeU9iamVjdCAqb3QgPSBOVUxMOwogICAgIHRpbWVfdCB3aGVudDsKQEAgLTczMiwxMCArNzMyLDEwIEBACiB7CiAgICAgLyogSW5zcGlyZWQgYnkgT3BlbiBHcm91cCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGF0CiAgICAgICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvYXNjdGltZS5odG1sICovCi0gICAgc3RhdGljIGNoYXIgd2RheV9uYW1lWzddWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIHdkYXlfbmFtZVs3XVs0XSA9IHsKICAgICAgICAgIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKICAgICB9OwotICAgIHN0YXRpYyBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb25fbmFtZVsxMl1bNF0gPSB7CiAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCiAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKICAgICB9OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IGZlNGU5MDguLjdkNTE4ZmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTg4NCw3ICs4ODQsNyBAQAogICAgIHJldHVybiBoOwogfQogCi1zdGF0aWMgY2hhciAqaGFuZ3VsX3N5bGxhYmxlc1tdWzNdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CiAgICAgeyAiRyIsICAiQSIsICAgIiIgICB9LAogICAgIHsgIkdHIiwgIkFFIiwgICJHIiAgfSwKICAgICB7ICJOIiwgICJZQSIsICAiR0ciIH0sCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogICAgIGludCBpLCBsZW4xOwogICAgICpsZW4gPSAtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBjaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOworICAgICAgICBjb25zdCBjaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwogICAgICAgICBsZW4xID0gUHlfU0FGRV9ET1dOQ0FTVChzdHJsZW4ocyksIHNpemVfdCwgaW50KTsKICAgICAgICAgaWYgKGxlbjEgPD0gKmxlbikKICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eGxpbWl0ZWQuYyBiL01vZHVsZXMveHhsaW1pdGVkLmMKaW5kZXggNDBjMTc2MC4uYzFhOWJlOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eGxpbWl0ZWQuYworKysgYi9Nb2R1bGVzL3h4bGltaXRlZC5jCkBAIC04OSw3ICs4OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bW9kdWxlLmMgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKaW5kZXggODUyMzBkOS4uMDc2NDQwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eG1vZHVsZS5jCisrKyBiL01vZHVsZXMveHhtb2R1bGUuYwpAQCAtNzYsNyArNzYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1YeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQorWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96aXBpbXBvcnQuYyBiL01vZHVsZXMvemlwaW1wb3J0LmMKaW5kZXggNzIyMGZhZi4uODdjOGNmYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96aXBpbXBvcnQuYworKysgYi9Nb2R1bGVzL3ppcGltcG9ydC5jCkBAIC04MTUsNyArODE1LDcgQEAKICAgIDQgYnl0ZXMsIGVuY29kZWQgYXMgbGl0dGxlIGVuZGlhbi4gVGhpcyBwYXJ0aWFsbHkgcmVpbXBsZW1lbnRzCiAgICBtYXJzaGFsLmM6cl9sb25nKCkgKi8KIHN0YXRpYyBsb25nCi1nZXRfbG9uZyh1bnNpZ25lZCBjaGFyICpidWYpIHsKK2dldF9sb25nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZikgewogICAgIGxvbmcgeDsKICAgICB4ID0gIGJ1ZlswXTsKICAgICB4IHw9IChsb25nKWJ1ZlsxXSA8PCAgODsKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggZDVhNmU1My4uZWQ0NDM5ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTUzLDcgKzUzLDcgQEAKIH0gY29tcG9iamVjdDsKIAogc3RhdGljIHZvaWQKLXpsaWJfZXJyb3Ioel9zdHJlYW0genN0LCBpbnQgZXJyLCBjaGFyICptc2cpCit6bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY29uc3QgY2hhciAqbXNnKQogewogICAgIGNvbnN0IGNoYXIgKnptc2cgPSBaX05VTEw7CiAgICAgLyogSW4gY2FzZSBvZiBhIHZlcnNpb24gbWlzbWF0Y2gsIHpzdC5tc2cgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggYTAzNjJlNy4uM2UxZmY5NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtMTQxLDggKzE0MSwxMSBAQAogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7Ci0gICAgaWYgKG0gJiYgbS0+bXBfc3Vic2NyaXB0KQotICAgICAgICByZXR1cm4gbS0+bXBfc3Vic2NyaXB0KG8sIGtleSk7CisgICAgaWYgKG0gJiYgbS0+bXBfc3Vic2NyaXB0KSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gbS0+bXBfc3Vic2NyaXB0KG8sIGtleSk7CisgICAgICAgIGFzc2VydCgoaXRlbSAhPSBOVUxMKSBeIChQeUVycl9PY2N1cnJlZCgpICE9IE5VTEwpKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCiAgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CiAgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKQEAgLTE1NDQsOCArMTU0NywxMCBAQAogICAgICAgICBpZiAoaSA8IDApIHsKICAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0gICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgIGlmIChsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpICs9IGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMgYi9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCmluZGV4IGM1OWFkMjQuLjllOGJhMzkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwpAQCAtMjgyLDI2ICsyODIsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfZm9ybWF0KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqYnl0ZXNfaW4sICpieXRlc19vdXQsICpyZXM7Ci0gICAgY2hhciAqYnl0ZXN0cmluZzsKLQotICAgIGlmIChzZWxmID09IE5VTEwgfHwgIVB5Qnl0ZUFycmF5X0NoZWNrKHNlbGYpIHx8IGFyZ3MgPT0gTlVMTCkgeworICAgIGlmIChzZWxmID09IE5VTEwgfHwgIVB5Qnl0ZUFycmF5X0NoZWNrKHNlbGYpKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgYnl0ZXN0cmluZyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBieXRlc19pbiA9IFB5Qnl0ZXNfRnJvbVN0cmluZyhieXRlc3RyaW5nKTsKLSAgICBpZiAoYnl0ZXNfaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnl0ZXNfb3V0ID0gX1B5Qnl0ZXNfRm9ybWF0KGJ5dGVzX2luLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYnl0ZXNfaW4pOwotICAgIGlmIChieXRlc19vdXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzID0gUHlCeXRlQXJyYXlfRnJvbU9iamVjdChieXRlc19vdXQpOwotICAgIFB5X0RFQ1JFRihieXRlc19vdXQpOwotICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlczsKKworICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXRFeChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAxKTsKIH0KIAogLyogRnVuY3Rpb25zIHN0dWZmZWQgaW50byB0aGUgdHlwZSBvYmplY3QgKi8KQEAgLTExNzEsMTYgKzExNTksMTUgQEAKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwogICAgIGlmIChlbmQgLSBzdGFydCA8IHN1Yl9sZW4pCiAgICAgICAgIHJlcyA9IC0xOwotICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMQotI2lmbmRlZiBIQVZFX01FTVJDSFIKLSAgICAgICAgICAgICYmIGRpciA+IDAKLSNlbmRpZgotICAgICkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZSA9ICpzdWI7Ci0gICAgICAgIGludCBtb2RlID0gKGRpciA+IDApID8gRkFTVF9TRUFSQ0ggOiBGQVNUX1JTRUFSQ0g7Ci0gICAgICAgIHJlcyA9IHN0cmluZ2xpYl9mYXN0c2VhcmNoX21lbWNocl8xY2hhcigKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKLSAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlLCBtb2RlKTsKKyAgICBlbHNlIGlmIChzdWJfbGVuID09IDEpIHsKKyAgICAgICAgaWYgKGRpciA+IDApCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9jaGFyKAorICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAqc3ViKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX3JmaW5kX2NoYXIoCisgICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOwogICAgICAgICBpZiAocmVzID49IDApCiAgICAgICAgICAgICByZXMgKz0gc3RhcnQ7CiAgICAgfQpAQCAtMjU4OSw4ICsyNTc2LDggQEAKIC8qIFhYWCBUaGVzZSB0d28gaGVscGVycyBjb3VsZCBiZSBvcHRpbWl6ZWQgaWYgYXJnc2l6ZSA9PSAxICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1sc3RyaXBfaGVscGVyKGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCitsc3RyaXBfaGVscGVyKGNvbnN0IGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCiB7CiAgICAgUHlfc3NpemVfdCBpID0gMDsKICAgICB3aGlsZSAoaSA8IG15c2l6ZSAmJiBtZW1jaHIoYXJncHRyLCAodW5zaWduZWQgY2hhcikgbXlwdHJbaV0sIGFyZ3NpemUpKQpAQCAtMjU5OSw4ICsyNTg2LDggQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLXJzdHJpcF9oZWxwZXIoY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAotICAgICAgICAgICAgICB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKK3JzdHJpcF9oZWxwZXIoY29uc3QgY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAorICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBteXNpemUgLSAxOwogICAgIHdoaWxlIChpID49IDAgJiYgbWVtY2hyKGFyZ3B0ciwgKHVuc2lnbmVkIGNoYXIpIG15cHRyW2ldLCBhcmdzaXplKSkKQEAgLTI4MDEsMjIgKzI3ODgsNiBAQAogICAgICAgICApOwogfQogCi1zdGF0aWMgaW50Ci1oZXhfZGlnaXRfdG9faW50KFB5X1VDUzQgYykKLXsKLSAgICBpZiAoYyA+PSAxMjgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgcmV0dXJuIGMgLSAnMCc7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChQeV9JU1VQUEVSKGMpKQotICAgICAgICAgICAgYyA9IFB5X1RPTE9XRVIoYyk7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLSAgICAgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQogLypbY2xpbmljIGlucHV0XQogQGNsYXNzbWV0aG9kCiBieXRlYXJyYXkuZnJvbWhleApAQCAtMjgzNSw0OCArMjgwNiw3IEBACiBieXRlYXJyYXlfZnJvbWhleF9pbXBsKFB5T2JqZWN0KmNscywgUHlPYmplY3QgKnN0cmluZykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kZjNkYTYwMTI5YjM3MDBjIGlucHV0PTkwN2JiZDJkMzRkOTM2N2FdKi8KIHsKLSAgICBQeU9iamVjdCAqbmV3Ynl0ZXM7Ci0gICAgY2hhciAqYnVmOwotICAgIFB5X3NzaXplX3QgaGV4bGVuLCBieXRlc2xlbiwgaSwgajsKLSAgICBpbnQgdG9wLCBib3Q7Ci0gICAgdm9pZCAqZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQga2luZDsKLQotICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2soc3RyaW5nKSk7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKLSAgICBoZXhsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJpbmcpOwotCi0gICAgYnl0ZXNsZW4gPSBoZXhsZW4vMjsgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KLSAgICBuZXdieXRlcyA9IFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzbGVuKTsKLSAgICBpZiAoIW5ld2J5dGVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBidWYgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcobmV3Ynl0ZXMpOwotICAgIGZvciAoaSA9IGogPSAwOyBpIDwgaGV4bGVuOyBpICs9IDIpIHsKLSAgICAgICAgLyogc2tpcCBvdmVyIHNwYWNlcyBpbiB0aGUgaW5wdXQgKi8KLSAgICAgICAgd2hpbGUgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID09ICcgJykKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaWYgKGkgPj0gaGV4bGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRvcCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICBib3QgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkrMSkpOwotICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGkpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7Ci0gICAgfQotICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUobmV3Ynl0ZXMsIGopIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICByZXR1cm4gbmV3Ynl0ZXM7Ci0KLSAgZXJyb3I6Ci0gICAgUHlfREVDUkVGKG5ld2J5dGVzKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUhleChzdHJpbmcsIDEpOwogfQogCiBQeURvY19TVFJWQVIoaGV4X19kb2NfXywKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKaW5kZXggYTI5OTkxNS4uZDAyNTM1MSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKKysrIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKQEAgLTI3Nyw3ICsyNzcsNyBAQAogY2hhcmFjdGVycywgYWxsIHJlbWFpbmluZyBjYXNlZCBjaGFyYWN0ZXJzIGhhdmUgbG93ZXJjYXNlLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKICAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwpAQCAtMzA2LDcgKzMwNiw3IEBACiBhbmQgdGhlIHJlc3QgbG93ZXItY2FzZWQuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKIApAQCAtMzM2LDcgKzMzNiw3IEBACiB0byBsb3dlcmNhc2UgQVNDSUkgYW5kIHZpY2UgdmVyc2EuIik7CiAKIHZvaWQKLV9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlfc3NpemVfdCBpOwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVzb2JqZWN0LmMgYi9PYmplY3RzL2J5dGVzb2JqZWN0LmMKaW5kZXggNTFkMDg3MS4uNjAyZGVhNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc29iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZXNvYmplY3QuYwpAQCAtMzAsNiArMzAsMTAgQEAKICovCiAjZGVmaW5lIFB5Qnl0ZXNPYmplY3RfU0laRSAob2Zmc2V0b2YoUHlCeXRlc09iamVjdCwgb2Jfc3ZhbCkgKyAxKQogCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkgX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKTsKKwogLyoKICAgIEZvciBQeUJ5dGVzX0Zyb21TdHJpbmcoKSwgdGhlIHBhcmFtZXRlciBgc3RyJyBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQKICAgIHN0cmluZyBjb250YWluaW5nIGV4YWN0bHkgYHNpemUnIGJ5dGVzLgpAQCAtMTc0LDE5MCArMTc4LDE4NCBAQAogUHlPYmplY3QgKgogUHlCeXRlc19Gcm9tRm9ybWF0Vihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCiB7Ci0gICAgdmFfbGlzdCBjb3VudDsKLSAgICBQeV9zc2l6ZV90IG4gPSAwOwotICAgIGNvbnN0IGNoYXIqIGY7CiAgICAgY2hhciAqczsKLSAgICBQeU9iamVjdCogc3RyaW5nOworICAgIGNvbnN0IGNoYXIgKmY7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IHByZWM7CisgICAgaW50IGxvbmdmbGFnOworICAgIGludCBzaXplX3RmbGFnOworICAgIC8qIExvbmdlc3QgNjQtYml0IGZvcm1hdHRlZCBudW1iZXJzOgorICAgICAgIC0gIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XDAiICgyMSBieXRlcykKKyAgICAgICAtICItOTIyMzM3MjAzNjg1NDc3NTgwOFwwIiAoMjEgYnl0ZXMpCisgICAgICAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZSAoaXQgaXNuJ3QgZW5vdWdoIGZvciBvY3RhbC4pCiAKLSAgICBQeV9WQV9DT1BZKGNvdW50LCB2YXJncyk7Ci0gICAgLyogc3RlcCAxOiBmaWd1cmUgb3V0IGhvdyBsYXJnZSBhIGJ1ZmZlciB3ZSBuZWVkICovCi0gICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0gICAgICAgIGlmICgqZiA9PSAnJScpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmOwotICAgICAgICAgICAgd2hpbGUgKCorK2YgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKLSAgICAgICAgICAgICAgICA7CisgICAgICAgTG9uZ2VzdCA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKKyAgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmXDAiICgxOSBieXRlcykuICovCisgICAgY2hhciBidWZmZXJbMjFdOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAotICAgICAgICAgICAgLyogc2tpcCB0aGUgJ2wnIG9yICd6JyBpbiB7JWxkLCAlemQsICVsdSwgJXp1fSBzaW5jZQotICAgICAgICAgICAgICogdGhleSBkb24ndCBhZmZlY3QgdGhlIGFtb3VudCBvZiBzcGFjZSB3ZSByZXNlcnZlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKCpmID09ICdsJyB8fCAqZiA9PSAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkKLSAgICAgICAgICAgICAgICArK2Y7CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IGMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdHMgYW4gaW50ZWdlciBpbiByYW5nZSBbMDsgMjU1XSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ3UnOiBjYXNlICdpJzogY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICAvKiAyMCBieXRlcyBpcyBlbm91Z2ggdG8gaG9sZCBhIDY0LWJpdAotICAgICAgICAgICAgICAgICAgIGludGVnZXIuICBEZWNpbWFsIHRha2VzIHRoZSBtb3N0IHNwYWNlLgotICAgICAgICAgICAgICAgICAgIFRoaXMgaXNuJ3QgZW5vdWdoIGZvciBvY3RhbC4gKi8KLSAgICAgICAgICAgICAgICBuICs9IDIwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgcyA9IHZhX2FyZyhjb3VudCwgY2hhciopOwotICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIDY0LWJpdCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOgotICAgICAgICAgICAgICAgICAqIDB4ZmZmZmZmZmZmZmZmZmZmZgotICAgICAgICAgICAgICAgICAqIHNvIDE5IGNoYXJhY3RlcnMgaXMgZW5vdWdoLgotICAgICAgICAgICAgICAgICAqIFhYWCBJIGNvdW50IDE4IC0tIHdoYXQncyB0aGUgZXh0cmEgZm9yPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG4gKz0gMTk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIGlmIHdlIHN0dW1ibGUgdXBvbiBhbiB1bmtub3duCi0gICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZyBjb2RlLCBjb3B5IHRoZSByZXN0IG9mCi0gICAgICAgICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgIHN0cmluZy4gKHdlIGNhbm5vdCBqdXN0IHNraXAgdGhlCi0gICAgICAgICAgICAgICAgICAgY29kZSwgc2luY2UgdGhlcmUncyBubyB3YXkgdG8ga25vdwotICAgICAgICAgICAgICAgICAgIHdoYXQncyBpbiB0aGUgYXJndW1lbnQgbGlzdCkgKi8KLSAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihwKTsKLSAgICAgICAgICAgICAgICBnb3RvIGV4cGFuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuKys7Ci0gICAgfQotIGV4cGFuZDoKLSAgICAvKiBzdGVwIDI6IGZpbGwgdGhlIGJ1ZmZlciAqLwotICAgIC8qIFNpbmNlIHdlJ3ZlIGFuYWx5emVkIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQgZm9yIHRoZSB3b3JzdCBjYXNlLAotICAgICAgIHVzZSBzcHJpbnRmIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhlIHNsb3dlciBQeU9TX3NucHJpbnRmLiAqLwotICAgIHN0cmluZyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0gICAgaWYgKCFzdHJpbmcpCisgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHN0cmxlbihmb3JtYXQpKTsKKyAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAotICAgIHMgPSBQeUJ5dGVzX0FzU3RyaW5nKHN0cmluZyk7CisjZGVmaW5lIFdSSVRFX0JZVEVTKHN0cikgXAorICAgIGRvIHsgXAorICAgICAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzLCAoc3RyKSwgc3RybGVuKHN0cikpOyBcCisgICAgICAgIGlmIChzID09IE5VTEwpIFwKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7IFwKKyAgICB9IHdoaWxlICgwKQogCiAgICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0gICAgICAgIGlmICgqZiA9PSAnJScpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmKys7CisgICAgICAgIGlmICgqZiAhPSAnJScpIHsKKyAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcCA9IGYrKzsKKworICAgICAgICAvKiBpZ25vcmUgdGhlIHdpZHRoIChleDogMTAgaW4gIiUxMHMiKSAqLworICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCisgICAgICAgICAgICBmKys7CisKKyAgICAgICAgLyogcGFyc2UgdGhlIHByZWNpc2lvbiAoZXg6IDEwIGluICIlLjEwcyIpICovCisgICAgICAgIHByZWMgPSAwOworICAgICAgICBpZiAoKmYgPT0gJy4nKSB7CisgICAgICAgICAgICBmKys7CisgICAgICAgICAgICBmb3IgKDsgUHlfSVNESUdJVCgqZik7IGYrKykgeworICAgICAgICAgICAgICAgIHByZWMgPSAocHJlYyAqIDEwKSArICgqZiAtICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKKyAgICAgICAgICAgIGYrKzsKKworICAgICAgICAvKiBoYW5kbGUgdGhlIGxvbmcgZmxhZyAoJ2wnKSwgYnV0IG9ubHkgZm9yICVsZCBhbmQgJWx1LgorICAgICAgICAgICBvdGhlcnMgY2FuIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5LiAqLworICAgICAgICBsb25nZmxhZyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAnbCcgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgbG9uZ2ZsYWcgPSAxOworICAgICAgICAgICAgKytmOworICAgICAgICB9CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZyAoJ3onKS4gKi8KKyAgICAgICAgc2l6ZV90ZmxhZyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgc2l6ZV90ZmxhZyA9IDE7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdWJzdHJhY3QgYnl0ZXMgcHJlYWxsb2NhdGVkIGZvciB0aGUgZm9ybWF0IHN0cmluZworICAgICAgICAgICAoZXg6IDIgZm9yICIlcyIpICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoZiAtIHAgKyAxKTsKKworICAgICAgICBzd2l0Y2ggKCpmKSB7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyh2YXJncywgaW50KTsKKyAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID4gMjU1KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeUJ5dGVzX0Zyb21Gb3JtYXRWKCk6ICVjIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RzIGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDI1NV0iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplKys7CisgICAgICAgICAgICAqcysrID0gKHVuc2lnbmVkIGNoYXIpYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlbHUiLAorICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiV1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWkiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIHsKICAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgICAgIGludCBsb25nZmxhZyA9IDA7Ci0gICAgICAgICAgICBpbnQgc2l6ZV90ZmxhZyA9IDA7Ci0gICAgICAgICAgICAvKiBwYXJzZSB0aGUgd2lkdGgucHJlY2lzaW9uIHBhcnQgKHdlJ3JlIG9ubHkKLSAgICAgICAgICAgICAgIGludGVyZXN0ZWQgaW4gdGhlIHByZWNpc2lvbiB2YWx1ZSwgaWYgYW55KSAqLwotICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7Ci0gICAgICAgICAgICBpZiAoKmYgPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpmKSkKLSAgICAgICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7CisKKyAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNvbnN0IGNoYXIqKTsKKyAgICAgICAgICAgIGkgPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBpZiAocHJlYyA+IDAgJiYgaSA+IHByZWMpCisgICAgICAgICAgICAgICAgaSA9IHByZWM7CisgICAgICAgICAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzLCBwLCBpKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgLyogJXAgaXMgaWxsLWRlZmluZWQ6ICBlbnN1cmUgbGVhZGluZyAweC4gKi8KKyAgICAgICAgICAgIGlmIChidWZmZXJbMV0gPT0gJ1gnKQorICAgICAgICAgICAgICAgIGJ1ZmZlclsxXSA9ICd4JzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlclsxXSAhPSAneCcpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKGJ1ZmZlcisyLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKzEpOworICAgICAgICAgICAgICAgIGJ1ZmZlclswXSA9ICcwJzsKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKLSAgICAgICAgICAgICAgICBmKys7Ci0gICAgICAgICAgICAvKiBoYW5kbGUgdGhlIGxvbmcgZmxhZywgYnV0IG9ubHkgZm9yICVsZCBhbmQgJWx1LgotICAgICAgICAgICAgICAgb3RoZXJzIGNhbiBiZSBhZGRlZCB3aGVuIG5lY2Vzc2FyeS4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAnbCcgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIGxvbmdmbGFnID0gMTsKLSAgICAgICAgICAgICAgICArK2Y7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBoYW5kbGUgdGhlIHNpemVfdCBmbGFnLiAqLwotICAgICAgICAgICAgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90ZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplKys7CisgICAgICAgICAgICAqcysrID0gJyUnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgqZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogZml4IG1pbl9zaXplIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKCpmKSB7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyh2YXJncywgaW50KTsKLSAgICAgICAgICAgICAgICAvKiBjIGhhcyBiZWVuIGNoZWNrZWQgZm9yIG92ZXJmbG93IGluIHRoZSBmaXJzdCBzdGVwICovCi0gICAgICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWkiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgcCA9IHZhX2FyZyh2YXJncywgY2hhciopOwotICAgICAgICAgICAgICAgIGkgPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPiAwICYmIGkgPiBuKQotICAgICAgICAgICAgICAgICAgICBpID0gbjsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocywgcCwgaSk7Ci0gICAgICAgICAgICAgICAgcyArPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXAiLCB2YV9hcmcodmFyZ3MsIHZvaWQqKSk7Ci0gICAgICAgICAgICAgICAgLyogJXAgaXMgaWxsLWRlZmluZWQ6ICBlbnN1cmUgbGVhZGluZyAweC4gKi8KLSAgICAgICAgICAgICAgICBpZiAoc1sxXSA9PSAnWCcpCi0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc1sxXSAhPSAneCcpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShzKzIsIHMsIHN0cmxlbihzKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgc1swXSA9ICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc1sxXSA9ICd4JzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAqcysrID0gJyUnOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdHJjcHkocywgcCk7Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgKnMrKyA9ICpmOworICAgICAgICAgICAgLyogaW52YWxpZCBmb3JtYXQgc3RyaW5nOiBjb3B5IHVuZm9ybWF0dGVkIHN0cmluZyBhbmQgZXhpdCAqLworICAgICAgICAgICAgV1JJVEVfQllURVMocCk7CisgICAgICAgICAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHMpOworICAgICAgICB9CiAgICAgfQogCi0gZW5kOgotICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmc3RyaW5nLCBzIC0gUHlCeXRlc19BU19TVFJJTkcoc3RyaW5nKSk7Ci0gICAgcmV0dXJuIHN0cmluZzsKKyN1bmRlZiBXUklURV9CWVRFUworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKworIGVycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTQwOSwxMiArNDA3LDE0IEBACiAKIC8qIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIGEgUHlCeXRlcyBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZS4gKi8KIAotc3RhdGljIFB5T2JqZWN0ICoKLWZvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSkKK3N0YXRpYyBjaGFyKgorZm9ybWF0ZmxvYXQoUHlPYmplY3QgKnYsIGludCBmbGFncywgaW50IHByZWMsIGludCB0eXBlLAorICAgICAgICAgICAgUHlPYmplY3QgKipwX3Jlc3VsdCwgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyKQogewogICAgIGNoYXIgKnA7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBkb3VibGUgeDsKKyAgICBzaXplX3QgbGVuOwogCiAgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CiAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CkBAIC00MzEsOSArNDMxLDIxIEBACiAKICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIHN0cmxlbihwKSk7CisKKyAgICBsZW4gPSBzdHJsZW4ocCk7CisgICAgaWYgKHdyaXRlciAhPSBOVUxMKSB7CisgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIGxlbik7CisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9NRU1DUFkoc3RyLCBwLCBsZW4pOworICAgICAgICBzdHIgKz0gbGVuOworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocCwgbGVuKTsKICAgICBQeU1lbV9GcmVlKHApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgKnBfcmVzdWx0ID0gcmVzdWx0OworICAgIHJldHVybiBzdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01NTcsMzYgKzU2OSwzNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi0vKiBmbXQlKHYxLHYyLC4uLikgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHNwcmludGYoZm10LCB2MSwgdjIsIC4uLikKLQotICAgRk9STUFUQlVGTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB3aGljaCB0aGUgaW50cyAmCi0gICBjaGFycyBhcmUgZm9ybWF0dGVkLiBYWFggVGhpcyBpcyBhIG1hZ2ljIG51bWJlci4gRWFjaCBmb3JtYXR0aW5nCi0gICByb3V0aW5lIGRvZXMgYm91bmRzIGNoZWNraW5nIHRvIGVuc3VyZSBubyBvdmVyZmxvdywgYnV0IGEgYmV0dGVyCi0gICBzb2x1dGlvbiBtYXkgYmUgdG8gbWFsbG9jIGEgYnVmZmVyIG9mIGFwcHJvcHJpYXRlIHNpemUgZm9yIGVhY2gKLSAgIGZvcm1hdC4gRm9yIG5vdywgdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgc3VmZmljaWVudC4KLSovCi0jZGVmaW5lIEZPUk1BVEJVRkxFTiAoc2l6ZV90KTEyMAorLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pICovCiAKIFB5T2JqZWN0ICoKLV9QeUJ5dGVzX0Zvcm1hdChQeU9iamVjdCAqZm9ybWF0LCBQeU9iamVjdCAqYXJncykKK19QeUJ5dGVzX0Zvcm1hdEV4KGNvbnN0IGNoYXIgKmZvcm1hdCwgUHlfc3NpemVfdCBmb3JtYXRfbGVuLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIGludCB1c2VfYnl0ZWFycmF5KQogewotICAgIGNoYXIgKmZtdCwgKnJlczsKKyAgICBjb25zdCBjaGFyICpmbXQ7CisgICAgY2hhciAqcmVzOwogICAgIFB5X3NzaXplX3QgYXJnbGVuLCBhcmdpZHg7Ci0gICAgUHlfc3NpemVfdCByZXNsZW4sIHJlc2NudCwgZm10Y250OworICAgIFB5X3NzaXplX3QgZm10Y250OwogICAgIGludCBhcmdzX293bmVkID0gMDsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLSAgICBpZiAoZm9ybWF0ID09IE5VTEwgfHwgIVB5Qnl0ZXNfQ2hlY2soZm9ybWF0KSB8fCBhcmdzID09IE5VTEwpIHsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZm10ID0gUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0KTsKLSAgICBmbXRjbnQgPSBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdCk7Ci0gICAgcmVzbGVuID0gcmVzY250ID0gZm10Y250ICsgMTAwOwotICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCByZXNsZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBmbXQgPSBmb3JtYXQ7CisgICAgZm10Y250ID0gZm9ybWF0X2xlbjsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgd3JpdGVyLnVzZV9ieXRlYXJyYXkgPSB1c2VfYnl0ZWFycmF5OworCisgICAgcmVzID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgZm10Y250KTsKKyAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlcyA9IFB5Qnl0ZXNfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpZiAoIXVzZV9ieXRlYXJyYXkpCisgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOworCiAgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJncykpIHsKICAgICAgICAgYXJnbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKICAgICAgICAgYXJnaWR4ID0gMDsKQEAgLTYwMCwxOCArNjEyLDIzIEBACiAgICAgICAgICFQeUJ5dGVBcnJheV9DaGVjayhhcmdzKSkgewogICAgICAgICAgICAgZGljdCA9IGFyZ3M7CiAgICAgfQorCiAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgaWYgKCpmbXQgIT0gJyUnKSB7Ci0gICAgICAgICAgICBpZiAoLS1yZXNjbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gZm10Y250ICsgMTAwOwotICAgICAgICAgICAgICAgIHJlc2xlbiArPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICByZXMgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OwotICAgICAgICAgICAgICAgIC0tcmVzY250OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnJlcysrID0gKmZtdCsrOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBjaGFyICpwb3M7CisKKyAgICAgICAgICAgIHBvcyA9IHN0cmNocihmbXQgKyAxLCAnJScpOworICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGxlbiA9IHBvcyAtIGZtdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRfbGVuIC0gKGZtdCAtIGZvcm1hdCk7CisgICAgICAgICAgICBhc3NlcnQobGVuICE9IDApOworCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzLCBmbXQsIGxlbik7CisgICAgICAgICAgICByZXMgKz0gbGVuOworICAgICAgICAgICAgZm10ICs9IGxlbjsKKyAgICAgICAgICAgIGZtdGNudCAtPSAobGVuIC0gMSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAvKiBHb3QgYSBmb3JtYXQgc3BlY2lmaWVyICovCkBAIC02MjYsMTAgKzY0MywxNCBAQAogICAgICAgICAgICAgaW50IHNpZ247CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CiAgICAgICAgICAgICBjaGFyIG9uZWNoYXI7IC8qIEZvciBieXRlX2NvbnZlcnRlcigpICovCisgICAgICAgICAgICBQeV9zc2l6ZV90IGFsbG9jOworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgICAgICBjaGFyICpiZWZvcmU7CisjZW5kaWYKIAogICAgICAgICAgICAgZm10Kys7CiAgICAgICAgICAgICBpZiAoKmZtdCA9PSAnKCcpIHsKLSAgICAgICAgICAgICAgICBjaGFyICprZXlzdGFydDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzdGFydDsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGtleWxlbjsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5OwogICAgICAgICAgICAgICAgIGludCBwY291bnQgPSAxOwpAQCAtNjczLDYgKzY5NCw4IEBACiAgICAgICAgICAgICAgICAgYXJnbGVuID0gLTE7CiAgICAgICAgICAgICAgICAgYXJnaWR4ID0gLTI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIGZsYWdzLiBFeGFtcGxlOiAiJStpIiA9PiBmbGFncz1GX1NJR04uICovCiAgICAgICAgICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA9ICpmbXQrKykgewogICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBmbGFncyB8PSBGX0xKVVNUOyBjb250aW51ZTsKQEAgLTY4Myw2ICs3MDYsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2Ugd2lkdGguIEV4YW1wbGU6ICIlMTBzIiA9PiB3aWR0aD0xMCAqLwogICAgICAgICAgICAgaWYgKGMgPT0gJyonKSB7CiAgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQpAQCAtNzE3LDYgKzc0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgqMTAgKyAoYyAtICcwJyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBwcmVjaXNpb24uIEV4YW1wbGU6ICIlLjNmIiA9PiBwcmVjPTMgKi8KICAgICAgICAgICAgIGlmIChjID09ICcuJykgewogICAgICAgICAgICAgICAgIHByZWMgPSAwOwogICAgICAgICAgICAgICAgIGlmICgtLWZtdGNudCA+PSAwKQpAQCAtNzcxLDEzICs3OTgsMTkgQEAKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm10Y250IDwgMCkgeworICAgICAgICAgICAgICAgIC8qIGxhc3Qgd3JpdGVyOiBkaXNhYmxlIHdyaXRlciBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzaWduID0gMDsKICAgICAgICAgICAgIGZpbGwgPSAnICc7CiAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgIHBidWYgPSAiJSI7Ci0gICAgICAgICAgICAgICAgbGVuID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAqcmVzKysgPSAnJSc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgIC8vICVyIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICVhCiAgICAgICAgICAgICBjYXNlICdhJzoKQEAgLTc5MCw2ICs4MjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIChwcmVjID49IDAgJiYgbGVuID4gcHJlYykKICAgICAgICAgICAgICAgICAgICAgbGVuID0gcHJlYzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgLy8gJXMgaXMgb25seSBmb3IgMi8zIGNvZGU7IDMgb25seSBjb2RlIHNob3VsZCB1c2UgJWIKICAgICAgICAgICAgIGNhc2UgJ2InOgpAQCAtNzk5LDEyICs4MzMsNDkgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodikKKyAgICAgICAgICAgICAgICAgICAgJiYgd2lkdGggPT0gLTEgJiYgcHJlYyA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiAhKGZsYWdzICYgKEZfU0lHTiB8IEZfQkxBTkspKQorICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdYJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0ZXJuYXRlID0gZmxhZ3MgJiBGX0FMVDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJhc2U7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDAgJiYgIid0eXBlJyBub3QgaW4gW2RpdW94WF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVkIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKCZ3cml0ZXIsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCBiYXNlLCBhbHRlcm5hdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0bG9uZyh2LCBmbGFncywgcHJlYywgYyk7CiAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtODE1LDE0ICs4ODYsMjUgQEAKICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX1pFUk8pCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnMCc7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICBjYXNlICdHJzoKLSAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0ZmxvYXQodiwgZmxhZ3MsIHByZWMsIGMpOwotICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IDI7IC8qIHNpemUgcHJlYWxsb2NhdGVkIGZvciAiJWYiICovCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjLCBOVUxMLCAmd3JpdGVyLCByZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjLCAmdGVtcCwgTlVMTCwgcmVzKSkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICBwYnVmID0gUHlCeXRlc19BU19TVFJJTkcodGVtcCk7CiAgICAgICAgICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRSh0ZW1wKTsKQEAgLTgzMCwyMSArOTEyLDI4IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgICAgICBwYnVmID0gJm9uZWNoYXI7CiAgICAgICAgICAgICAgICAgbGVuID0gYnl0ZV9jb252ZXJ0ZXIodiwgJm9uZWNoYXIpOwogICAgICAgICAgICAgICAgIGlmICghbGVuKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gb25lY2hhcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJyAoMHgleCkgIgogICAgICAgICAgICAgICAgICAgImF0IGluZGV4ICV6ZCIsCiAgICAgICAgICAgICAgICAgICBjLCBjLAotICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmcoZm9ybWF0KSkpOworICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLSBmb3JtYXQpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgIGlmICgqcGJ1ZiA9PSAnLScgfHwgKnBidWYgPT0gJysnKSB7CiAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAqcGJ1ZisrOwpAQCAtODU5LDI5ICs5NDgsMzEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh3aWR0aCA8IGxlbikKICAgICAgICAgICAgICAgICB3aWR0aCA9IGxlbjsKLSAgICAgICAgICAgIGlmIChyZXNjbnQgLSAoc2lnbiAhPSAwKSA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmVzbGVuIC09IHJlc2NudDsKLSAgICAgICAgICAgICAgICByZXNjbnQgPSB3aWR0aCArIGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChyZXNsZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXMgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OworCisgICAgICAgICAgICBhbGxvYyA9IHdpZHRoOworICAgICAgICAgICAgaWYgKHNpZ24gIT0gMCAmJiBsZW4gPT0gd2lkdGgpCisgICAgICAgICAgICAgICAgYWxsb2MrKzsKKyAgICAgICAgICAgIC8qIDI6IHNpemUgcHJlYWxsb2NhdGVkIGZvciAlcyAqLworICAgICAgICAgICAgaWYgKGFsbG9jID4gMikgeworICAgICAgICAgICAgICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcmVzLCBhbGxvYyAtIDIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgYmVmb3JlID0gcmVzOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBzaWduIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoZmlsbCAhPSAnICcpCiAgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IHNpZ247Ci0gICAgICAgICAgICAgICAgcmVzY250LS07CiAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuKQogICAgICAgICAgICAgICAgICAgICB3aWR0aC0tOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgbnVtZXJpYyBwcmVmaXggZm9yICJ4IiwgIlgiIGFuZCAibyIgZm9ybWF0cworICAgICAgICAgICAgICAgaWYgdGhlIGFsdGVybmF0ZSBmb3JtIGlzIHVzZWQuCisgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgd3JpdGUgIjB4IiBmb3IgdGhlICIlI3giIGZvcm1hdC4gKi8KICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBGX0FMVCkgJiYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSkgewogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzBdID09ICcwJyk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KHBidWZbMV0gPT0gYyk7CkBAIC04ODksMTggKzk4MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNjbnQgLT0gMjsKICAgICAgICAgICAgICAgICB3aWR0aCAtPSAyOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFkIGxlZnQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCiAgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4gJiYgIShmbGFncyAmIEZfTEpVU1QpKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gZmlsbDsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXdpZHRoID4gbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCBmaWxsLCB3aWR0aCAtIGxlbik7CisgICAgICAgICAgICAgICAgcmVzICs9ICh3aWR0aCAtIGxlbik7CisgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHBhZGRpbmcgd2l0aCBzcGFjZXM6IHdyaXRlIHNpZ24gaWYgbmVlZGVkIGFuZC9vciBudW1lcmljCisgICAgICAgICAgICAgICBwcmVmaXggaWYgdGhlIGFsdGVybmF0ZSBmb3JtIGlzIHVzZWQgKi8KICAgICAgICAgICAgIGlmIChmaWxsID09ICcgJykgewogICAgICAgICAgICAgICAgIGlmIChzaWduKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwpAQCAtOTEyLDEzICsxMDA2LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb3B5IGJ5dGVzICovCiAgICAgICAgICAgICBQeV9NRU1DUFkocmVzLCBwYnVmLCBsZW4pOwogICAgICAgICAgICAgcmVzICs9IGxlbjsKLSAgICAgICAgICAgIHJlc2NudCAtPSBsZW47Ci0gICAgICAgICAgICB3aGlsZSAoLS13aWR0aCA+PSBsZW4pIHsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgICAgICAqcmVzKysgPSAnICc7CisKKyAgICAgICAgICAgIC8qIFBhZCByaWdodCB3aXRoIHRoZSBmaWxsIGNoYXJhY3RlciBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikgeworICAgICAgICAgICAgICAgIG1lbXNldChyZXMsICcgJywgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZGljdCAmJiAoYXJnaWR4IDwgYXJnbGVuKSAmJiBjICE9ICclJykgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBieXRlcyBmb3JtYXR0aW5nIik7CkBAIC05MjYsMjIgKzEwMjQsMzEgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IHdlIGNvbXB1dGVkIHRoZSBleGFjdCBzaXplIGZvciB0aGlzIHdyaXRlICovCisgICAgICAgICAgICBhc3NlcnQoKHJlcyAtIGJlZm9yZSkgPT0gYWxsb2MpOworI2VuZGlmCiAgICAgICAgIH0gLyogJyUnICovCisKKyAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICBhc3NlcnQod3JpdGVyLm92ZXJhbGxvY2F0ZSB8fCBmbXRjbnQgPCAwIHx8IHVzZV9ieXRlYXJyYXkpOwogICAgIH0gLyogdW50aWwgZW5kICovCisKICAgICBpZiAoYXJnaWR4IDwgYXJnbGVuICYmICFkaWN0KSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBieXRlcyBmb3JtYXR0aW5nIik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQorCiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIHJlc2xlbiAtIHJlc2NudCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCByZXMpOwogCiAgZXJyb3I6Ci0gICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICBpZiAoYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgfQpAQCAtOTYxLDYgKzEwNjgsNDIgQEAKICAgIHRoZSBzdHJpbmcgaXMgVVRGLTggZW5jb2RlZCBhbmQgc2hvdWxkIGJlIHJlLWVuY29kZWQgaW4gdGhlCiAgICBzcGVjaWZpZWQgZW5jb2RpbmcuICAqLwogCitzdGF0aWMgY2hhciAqCitfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoY29uc3QgY2hhciAqKnMsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGNvbnN0IGNoYXIgKnJlY29kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpwKQoreworICAgIFB5T2JqZWN0ICp1LCAqdzsKKyAgICBjb25zdCBjaGFyKiB0OworCisgICAgdCA9ICpzOworICAgIC8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCisgICAgd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpCisgICAgICAgIHQrKzsKKyAgICB1ID0gUHlVbmljb2RlX0RlY29kZVVURjgoKnMsIHQgLSAqcywgZXJyb3JzKTsKKyAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFJlY29kZSB0aGVtIGluIHRhcmdldCBlbmNvZGluZy4gKi8KKyAgICB3ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7CisgICAgUHlfREVDUkVGKHUpOworICAgIGlmICAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7CisKKyAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICB3cml0ZXItPm1pbl9zaXplLS07ICAgLyogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyh3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRSh3KSk7CisgICAgUHlfREVDUkVGKHcpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnMgPSB0OworICAgIHJldHVybiBwOworfQorCiBQeU9iamVjdCAqUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKQEAgLTk2OCw1NCArMTExMSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCiB7CiAgICAgaW50IGM7Ci0gICAgY2hhciAqcCwgKmJ1ZjsKKyAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBQeU9iamVjdCAqdjsKLSAgICBQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKLSAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7Ci0gICAgaWYgKHYgPT0gTlVMTCkKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodik7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisKICAgICBlbmQgPSBzICsgbGVuOwogICAgIHdoaWxlIChzIDwgZW5kKSB7CiAgICAgICAgIGlmICgqcyAhPSAnXFwnKSB7CiAgICAgICAgICAgbm9uX2VzYzoKLSAgICAgICAgICAgIGlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdSwgKnc7Ci0gICAgICAgICAgICAgICAgY2hhciAqcjsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0OwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgcm47Ci0gICAgICAgICAgICAgICAgdCA9IHM7Ci0gICAgICAgICAgICAgICAgLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOwotICAgICAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBpZighdSkgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCi0gICAgICAgICAgICAgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF3KSAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7Ci0gICAgICAgICAgICAgICAgciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHcpOwotICAgICAgICAgICAgICAgIHJuID0gUHlCeXRlc19HRVRfU0laRSh3KTsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocCwgciwgcm4pOwotICAgICAgICAgICAgICAgIHAgKz0gcm47Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOwotICAgICAgICAgICAgICAgIHMgPSB0OwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkpIHsKICAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vbi1BU0NJSSBjaGFyYWN0ZXIgYW5kIG5lZWQgdG8gcmVjb2RlICovCisgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgmcywgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCByZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKICAgICAgICAgcysrOwotICAgICAgICBpZiAocz09ZW5kKSB7CisgICAgICAgIGlmIChzID09IGVuZCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOwogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KKwogICAgICAgICBzd2l0Y2ggKCpzKyspIHsKICAgICAgICAgLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KICAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKQEAgLTEwNDAsMjggKzExNzEsMTggQEAKICAgICAgICAgICAgICpwKysgPSBjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSAmJiBQeV9JU1hESUdJVChzWzFdKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB4ID0gMDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IGMgLSAnMCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlfSVNMT1dFUihjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgeCA9IHggPDwgNDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ2EnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgKnArKyA9IHg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocysxIDwgZW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGRpZ2l0MSwgZGlnaXQyOworICAgICAgICAgICAgICAgIGRpZ2l0MSA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzBdKV07CisgICAgICAgICAgICAgICAgZGlnaXQyID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHNbMV0pXTsKKyAgICAgICAgICAgICAgICBpZiAoZGlnaXQxIDwgMTYgJiYgZGlnaXQyIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSgoZGlnaXQxIDw8IDQpICsgZGlnaXQyKTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0cyAqLworCiAgICAgICAgICAgICBpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBcXHggZXNjYXBlIGF0IHBvc2l0aW9uICVkIiwKQEAgLTEwODMsNiArMTIwNCw3IEBACiAgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSkKICAgICAgICAgICAgICAgICBzKys7IC8qIGFuZCBhIGhleGRpZ2l0ICovCiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICBzLS07CkBAIC0xMDkwLDExICsxMjEyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04IGJ5dGVzIG1heSBmb2xsb3cuICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHAtYnVmIDwgbmV3bGVuKQotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnYsIHAgLSBidWYpOwotICAgIHJldHVybiB2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKwogICBmYWlsZWQ6Ci0gICAgUHlfREVDUkVGKHYpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE4MTUsMTYgKzE5MzcsMTUgQEAKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwogICAgIGlmIChlbmQgLSBzdGFydCA8IHN1Yl9sZW4pCiAgICAgICAgIHJlcyA9IC0xOwotICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMQotI2lmbmRlZiBIQVZFX01FTVJDSFIKLSAgICAgICAgICAgICYmIGRpciA+IDAKLSNlbmRpZgotICAgICkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZSA9ICpzdWI7Ci0gICAgICAgIGludCBtb2RlID0gKGRpciA+IDApID8gRkFTVF9TRUFSQ0ggOiBGQVNUX1JTRUFSQ0g7Ci0gICAgICAgIHJlcyA9IHN0cmluZ2xpYl9mYXN0c2VhcmNoX21lbWNocl8xY2hhcigKLSAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAotICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGUsIG1vZGUpOworICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMSkgeworICAgICAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX2NoYXIoCisgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZikgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgKnN1Yik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9jaGFyKAorICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOwogICAgICAgICBpZiAocmVzID49IDApCiAgICAgICAgICAgICByZXMgKz0gc3RhcnQ7CiAgICAgfQpAQCAtMjk3NSwyMiArMzA5Niw2IEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKLWhleF9kaWdpdF90b19pbnQoUHlfVUNTNCBjKQotewotICAgIGlmIChjID49IDEyOCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeV9JU0RJR0lUKGMpKQotICAgICAgICByZXR1cm4gYyAtICcwJzsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5X0lTVVBQRVIoYykpCi0gICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKltjbGluaWMgaW5wdXRdCiBAY2xhc3NtZXRob2QKIGJ5dGVzLmZyb21oZXgKQEAgLTMwMDgsNDcgKzMxMTMsODMgQEAKIGJ5dGVzX2Zyb21oZXhfaW1wbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzdHJpbmcpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDk3M2FjYzYzNjYxYmIyZSBpbnB1dD1iZjRkMWMzNjE2NzBhY2QzXSovCiB7Ci0gICAgUHlPYmplY3QgKm5ld3N0cmluZzsKKyAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUhleChzdHJpbmcsIDApOworfQorCitQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21IZXgoUHlPYmplY3QgKnN0cmluZywgaW50IHVzZV9ieXRlYXJyYXkpCit7CiAgICAgY2hhciAqYnVmOwotICAgIFB5X3NzaXplX3QgaGV4bGVuLCBieXRlc2xlbiwgaSwgajsKLSAgICBpbnQgdG9wLCBib3Q7Ci0gICAgdm9pZCAqZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQga2luZDsKKyAgICBQeV9zc2l6ZV90IGhleGxlbiwgaW52YWxpZF9jaGFyOworICAgIHVuc2lnbmVkIGludCB0b3AsIGJvdDsKKyAgICBQeV9VQ1MxICpzdHIsICplbmQ7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKyAgICB3cml0ZXIudXNlX2J5dGVhcnJheSA9IHVzZV9ieXRlYXJyYXk7CiAKICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHN0cmluZykpOwogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyaW5nKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7Ci0gICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cmluZyk7CiAgICAgaGV4bGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyaW5nKTsKIAotICAgIGJ5dGVzbGVuID0gaGV4bGVuLzI7IC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCi0gICAgbmV3c3RyaW5nID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlc2xlbik7Ci0gICAgaWYgKCFuZXdzdHJpbmcpCisgICAgaWYgKCFQeVVuaWNvZGVfSVNfQVNDSUkoc3RyaW5nKSkgeworICAgICAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHJpbmcpOworICAgICAgICBQeV9zc2l6ZV90IGk7CisKKyAgICAgICAgLyogc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uLUFTQ0lJIGNoYXJhY3RlciAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGV4bGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA+PSAxMjgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW52YWxpZF9jaGFyID0gaTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQoc3RyaW5nKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgc3RyID0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKKworICAgIC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCisgICAgYnVmID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgaGV4bGVuIC8gMik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBidWYgPSBQeUJ5dGVzX0FTX1NUUklORyhuZXdzdHJpbmcpOwotICAgIGZvciAoaSA9IGogPSAwOyBpIDwgaGV4bGVuOyBpICs9IDIpIHsKKworICAgIGVuZCA9IHN0ciArIGhleGxlbjsKKyAgICB3aGlsZSAoc3RyIDwgZW5kKSB7CiAgICAgICAgIC8qIHNraXAgb3ZlciBzcGFjZXMgaW4gdGhlIGlucHV0ICovCi0gICAgICAgIHdoaWxlIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA9PSAnICcpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGlmIChpID49IGhleGxlbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB0b3AgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgYm90ID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKzEpKTsKLSAgICAgICAgaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpKTsKKyAgICAgICAgaWYgKCpzdHIgPT0gJyAnKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc3RyKys7CisgICAgICAgICAgICB9IHdoaWxlICgqc3RyID09ICcgJyk7CisgICAgICAgICAgICBpZiAoc3RyID49IGVuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRvcCA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsqc3RyXTsKKyAgICAgICAgaWYgKHRvcCA+PSAxNikgeworICAgICAgICAgICAgaW52YWxpZF9jaGFyID0gc3RyIC0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgYnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgICAgICBzdHIrKzsKKworICAgICAgICBib3QgPSBfUHlMb25nX0RpZ2l0VmFsdWVbKnN0cl07CisgICAgICAgIGlmIChib3QgPj0gMTYpIHsKKyAgICAgICAgICAgIGludmFsaWRfY2hhciA9IHN0ciAtIFB5VW5pY29kZV8xQllURV9EQVRBKHN0cmluZyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHN0cisrOworCisgICAgICAgICpidWYrKyA9ICh1bnNpZ25lZCBjaGFyKSgodG9wIDw8IDQpICsgYm90KTsKICAgICB9Ci0gICAgaWYgKGogIT0gYnl0ZXNsZW4gJiYgX1B5Qnl0ZXNfUmVzaXplKCZuZXdzdHJpbmcsIGopIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICByZXR1cm4gbmV3c3RyaW5nOworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBidWYpOwogCiAgIGVycm9yOgotICAgIFB5X1hERUNSRUYobmV3c3RyaW5nKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgorICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpbnZhbGlkX2NoYXIpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTMxMzEsMTEgKzMyNzIsMTUgQEAKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19tb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQorYnl0ZXNfbW9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sodikpCi0gICAgICAgIFB5X1JFVFVSTl9OT1RJTVBMRU1FTlRFRDsKLSAgICByZXR1cm4gX1B5Qnl0ZXNfRm9ybWF0KHYsIHcpOworICAgIGlmIChzZWxmID09IE5VTEwgfHwgIVB5Qnl0ZXNfQ2hlY2soc2VsZikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXRFeChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgMCk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYnl0ZXNfYXNfbnVtYmVyID0gewpAQCAtMzI0NCwxMDMgKzMzODksOTUgQEAKICAgICByZXR1cm4gUHlCeXRlc19Gcm9tT2JqZWN0KHgpOwogfQogCi1QeU9iamVjdCAqCi1QeUJ5dGVzX0Zyb21PYmplY3QoUHlPYmplY3QgKngpCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tQnVmZmVyKFB5T2JqZWN0ICp4KQogewotICAgIFB5T2JqZWN0ICpuZXcsICppdDsKKyAgICBQeU9iamVjdCAqbmV3OworICAgIFB5X2J1ZmZlciB2aWV3OworCisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcih4LCAmdmlldywgUHlCVUZfRlVMTF9STykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdmlldy5sZW4pOworICAgIGlmICghbmV3KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5QnVmZmVyX1RvQ29udGlndW91cygoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsLAorICAgICAgICAgICAgICAgICZ2aWV3LCB2aWV3LmxlbiwgJ0MnKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICByZXR1cm4gbmV3OworCitmYWlsOgorICAgIFB5X1hERUNSRUYobmV3KTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBHRVRfSVRFTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICpieXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfc3NpemVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNoYXIgKnN0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqaXRlbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnl0ZXMgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ciA9ICgoUHlCeXRlc09iamVjdCAqKWJ5dGVzKS0+b2Jfc3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpdGVtID0gR0VUX0lURU0oKHgpLCBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfVmFsdWVFcnJvcik7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBieXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tTGlzdChQeU9iamVjdCAqeCkKK3sKKyAgICBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBQeUxpc3RfR0VUX0lURU0pOworfQorCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tVHVwbGUoUHlPYmplY3QgKngpCit7CisgICAgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgUHlUdXBsZV9HRVRfSVRFTSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitfUHlCeXRlc19Gcm9tSXRlcmF0b3IoUHlPYmplY3QgKngpCit7CisgICAgY2hhciAqc3RyOworICAgIFB5T2JqZWN0ICppdDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCi0gICAgaWYgKHggPT0gTlVMTCkgewotICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBQeV9JTkNSRUYoeCk7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIC8qIFVzZSB0aGUgbW9kZXJuIGJ1ZmZlciBpbnRlcmZhY2UgKi8KLSAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoeCkpIHsKLSAgICAgICAgUHlfYnVmZmVyIHZpZXc7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoeCwgJnZpZXcsIFB5QlVGX0ZVTExfUk8pIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHZpZXcubGVuKTsKLSAgICAgICAgaWYgKCFuZXcpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGlmIChQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXMoKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlldywgdmlldy5sZW4sICdDJykgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICAgIGZhaWw6Ci0gICAgICAgIFB5X1hERUNSRUYobmV3KTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHgpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgdW5pY29kZSBvYmplY3QgdG8gYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7Ci0gICAgICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KAotICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTSh4LCBpKSwgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3OwotICAgIH0KLSAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7Ci0gICAgICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KAotICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oeCwgaSksIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWxbaV0gPSAoY2hhcikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICB9CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIC8qIEZvciBpdGVyYXRvciB2ZXJzaW9uLCBjcmVhdGUgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXNpemUgYXMgbmVlZGVkICovCiAgICAgc2l6ZSA9IFB5T2JqZWN0X0xlbmd0aEhpbnQoeCwgNjQpOwogICAgIGlmIChzaXplID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIEFsbG9jYXRlIGFuIGV4dHJhIGJ5dGUgdG8gcHJldmVudCBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKCkgZnJvbQotICAgICAgIHJldHVybmluZyBhIHNoYXJlZCBlbXB0eSBieXRlcyBzdHJpbmcuIFRoaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZQotICAgICAgIHdhbnQgdG8gY2FsbCBfUHlCeXRlc19SZXNpemUoKSB0aGUgcmV0dXJuZWQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KLSAgICAgICBvbmx5IGRvIG9uIGJ5dGVzIG9iamVjdHMgd2l0aCByZWZjb3VudCA9PSAxLiAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHNpemUgPSAxOwotICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7Ci0gICAgaWYgKG5ldyA9PSBOVUxMKQorCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhc3NlcnQoUHlfUkVGQ05UKG5ldykgPT0gMSk7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAKICAgICAvKiBHZXQgdGhlIGl0ZXJhdG9yICovCiAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOwpAQCAtMzM3NSwyNCArMzUxMiw1NSBAQAogCiAgICAgICAgIC8qIEFwcGVuZCB0aGUgYnl0ZSAqLwogICAgICAgICBpZiAoaSA+PSBzaXplKSB7Ci0gICAgICAgICAgICBzaXplID0gMiAqIHNpemUgKyAxOwotICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmbmV3LCBzaXplKSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1Jlc2l6ZSgmd3JpdGVyLCBzdHIsIHNpemUrMSk7CisgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzaXplID0gd3JpdGVyLmFsbG9jYXRlZDsKICAgICAgICAgfQotICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOworICAgICAgICAqc3RyKysgPSAoY2hhcikgdmFsdWU7CiAgICAgfQotICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmbmV3LCBpKTsKLQotICAgIC8qIENsZWFuIHVwIGFuZCByZXR1cm4gc3VjY2VzcyAqLwogICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgcmV0dXJuIG5ldzsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgc3RyKTsKIAogICBlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIFB5X1hERUNSRUYoaXQpOwotICAgIFB5X1hERUNSRUYobmV3KTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAorUHlPYmplY3QgKgorUHlCeXRlc19Gcm9tT2JqZWN0KFB5T2JqZWN0ICp4KQoreworICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChQeUJ5dGVzX0NoZWNrRXhhY3QoeCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICAvKiBVc2UgdGhlIG1vZGVybiBidWZmZXIgaW50ZXJmYWNlICovCisgICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUJ1ZmZlcih4KTsKKworICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIF9QeUJ5dGVzX0Zyb21MaXN0KHgpOworCisgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIF9QeUJ5dGVzX0Zyb21UdXBsZSh4KTsKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCB1bmljb2RlIG9iamVjdCB0byBieXRlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKHgpOworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC0zNzQwLDMgKzM5MDgsMjc3IEBACiAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CisKKworLyogX1B5Qnl0ZXNXcml0ZXIgQVBJICovCisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKK3ZvaWQKK19QeUJ5dGVzV3JpdGVyX0luaXQoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICAvKiBTZXQgYWxsIGF0dHJpYnV0ZXMgYmVmb3JlIHNtYWxsX2J1ZmZlciB0byAwICovCisgICAgbWVtc2V0KHdyaXRlciwgMCwgb2Zmc2V0b2YoX1B5Qnl0ZXNXcml0ZXIsIHNtYWxsX2J1ZmZlcikpOworI2lmZGVmIFB5X0RFQlVHCisgICAgbWVtc2V0KHdyaXRlci0+c21hbGxfYnVmZmVyLCAweENCLCBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpKTsKKyNlbmRpZgorfQorCit2b2lkCitfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpCit7CisgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworfQorCitQeV9MT0NBTF9JTkxJTkUoY2hhciopCitfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyKQoreworICAgIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworICAgICAgICByZXR1cm4gd3JpdGVyLT5zbWFsbF9idWZmZXI7CisgICAgfQorICAgIGVsc2UgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiBQeUJ5dGVBcnJheV9BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyICE9IE5VTEwpOworICAgICAgICByZXR1cm4gUHlCeXRlc19BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KK30KKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitfUHlCeXRlc1dyaXRlcl9HZXRTaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICpzdGFydCA9IF9QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKHdyaXRlcik7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RyID49IHN0YXJ0KTsKKyAgICBhc3NlcnQoc3RyIC0gc3RhcnQgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIHJldHVybiBzdHIgLSBzdGFydDsKK30KKworUHlfTE9DQUxfSU5MSU5FKHZvaWQpCitfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyNpZmRlZiBQeV9ERUJVRworICAgIGNoYXIgKnN0YXJ0LCAqZW5kOworCisgICAgaWYgKHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdCh3cml0ZXItPmJ1ZmZlcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVja0V4YWN0KHdyaXRlci0+YnVmZmVyKSk7CisgICAgICAgIGFzc2VydChQeV9SRUZDTlQod3JpdGVyLT5idWZmZXIpID09IDEpOworICAgIH0KKworICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgLyogYnl0ZWFycmF5IGhhcyBpdHMgb3duIG92ZXJhbGxvY2F0aW9uIGFsZ29yaXRobSwKKyAgICAgICAgICAgd3JpdGVyIG92ZXJhbGxvY2F0aW9uIG11c3QgYmUgZGlzYWJsZWQgKi8KKyAgICAgICAgYXNzZXJ0KCF3cml0ZXItPm92ZXJhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYXNzZXJ0KDAgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIGFzc2VydCgwIDw9IHdyaXRlci0+bWluX3NpemUgJiYgd3JpdGVyLT5taW5fc2l6ZSA8PSB3cml0ZXItPmFsbG9jYXRlZCk7CisgICAgLyogdGhlIGxhc3QgYnl0ZSBtdXN0IGFsd2F5cyBiZSBudWxsICovCisgICAgc3RhcnQgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpOworICAgIGFzc2VydChzdGFydFt3cml0ZXItPmFsbG9jYXRlZF0gPT0gMCk7CisKKyAgICBlbmQgPSBzdGFydCArIHdyaXRlci0+YWxsb2NhdGVkOworICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0YXJ0IDw9IHN0ciAmJiBzdHIgPD0gZW5kKTsKKyNlbmRpZgorfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnN0ciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkLCBwb3M7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQod3JpdGVyLT5hbGxvY2F0ZWQgPCBzaXplKTsKKworICAgIGFsbG9jYXRlZCA9IHNpemU7CisgICAgaWYgKHdyaXRlci0+b3ZlcmFsbG9jYXRlCisgICAgICAgICYmIGFsbG9jYXRlZCA8PSAoUFlfU1NJWkVfVF9NQVggLSBhbGxvY2F0ZWQgLyBPVkVSQUxMT0NBVEVfRkFDVE9SKSkgeworICAgICAgICAvKiBvdmVyYWxsb2NhdGUgdG8gbGltaXQgdGhlIG51bWJlciBvZiByZWFsbG9jKCkgKi8KKyAgICAgICAgYWxsb2NhdGVkICs9IGFsbG9jYXRlZCAvIE9WRVJBTExPQ0FURV9GQUNUT1I7CisgICAgfQorCisgICAgcG9zID0gX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZSh3cml0ZXIsIHN0cik7CisgICAgaWYgKCF3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSh3cml0ZXItPmJ1ZmZlciwgYWxsb2NhdGVkKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgLyogd3JpdGVyLT5hbGxvY2F0ZWQgY2FuIGJlIHNtYWxsZXIgdGhhbiB3cml0ZXItPmJ1ZmZlci0+b2JfYWxsb2MsCisgICAgICAgICAgICAgICBidXQgd2UgY2Fubm90IHVzZSBvYl9hbGxvYyBiZWNhdXNlIGJ5dGVzIG1heSBuZWVkIHRvIGJlIG1vdmVkCisgICAgICAgICAgICAgICB0byB1c2UgdGhlIHdob2xlIGJ1ZmZlci4gYnl0ZWFycmF5IHVzZXMgYW4gaW50ZXJuYWwgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICB0byBhdm9pZCBtb3Zpbmcgb3IgY29weWluZyBieXRlcyB3aGVuIGJ5dGVzIGFyZSByZW1vdmVkIGF0IHRoZQorICAgICAgICAgICAgICAgYmVnaW5uaW5nIChleDogZGVsIGJ5dGVhcnJheVs6MV0pLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmd3JpdGVyLT5idWZmZXIsIGFsbG9jYXRlZCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY29udmVydCBmcm9tIHN0YWNrIGJ1ZmZlciB0byBieXRlcyBvYmplY3QgYnVmZmVyICovCisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KQorICAgICAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhbGxvY2F0ZWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYWxsb2NhdGVkKTsKKyAgICAgICAgaWYgKHdyaXRlci0+YnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIGlmIChwb3MgIT0gMCkgeworICAgICAgICAgICAgY2hhciAqZGVzdDsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIFB5X01FTUNQWShkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+c21hbGxfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIgPSAwOworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgIG1lbXNldCh3cml0ZXItPnNtYWxsX2J1ZmZlciwgMHhEQiwgc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKSk7CisjZW5kaWYKKyAgICB9CisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQ7CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpICsgcG9zOworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworICAgIHJldHVybiBzdHI7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgUHlfc3NpemVfdCBuZXdfbWluX3NpemU7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIGlmICh3cml0ZXItPm1pbl9zaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5ld19taW5fc2l6ZSA9IHdyaXRlci0+bWluX3NpemUgKyBzaXplOworCisgICAgaWYgKG5ld19taW5fc2l6ZSA+IHdyaXRlci0+YWxsb2NhdGVkKQorICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUod3JpdGVyLCBzdHIsIG5ld19taW5fc2l6ZSk7CisKKyAgICB3cml0ZXItPm1pbl9zaXplID0gbmV3X21pbl9zaXplOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9BbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgLyogZW5zdXJlIHRoYXQgX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoKSBpcyBvbmx5IGNhbGxlZCBvbmNlICovCisgICAgYXNzZXJ0KHdyaXRlci0+bWluX3NpemUgPT0gMCAmJiB3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlciA9IDE7CisjaWZkZWYgUHlfREVCVUcKKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcikgLSAxOworICAgIC8qIEluIGRlYnVnIG1vZGUsIGRvbid0IHVzZSB0aGUgZnVsbCBzbWFsbCBidWZmZXIgYmVjYXVzZSBpdCBpcyBsZXNzCisgICAgICAgZWZmaWNpZW50IHRoYW4gYnl0ZXMgYW5kIGJ5dGVhcnJheSBvYmplY3RzIHRvIGRldGVjdCBidWZmZXIgdW5kZXJmbG93CisgICAgICAgYW5kIGJ1ZmZlciBvdmVyZmxvdy4gVXNlIDEwIGJ5dGVzIG9mIHRoZSBzbWFsbCBidWZmZXIgdG8gdGVzdCBhbHNvCisgICAgICAgY29kZSB1c2luZyB0aGUgc21hbGxlciBidWZmZXIgaW4gZGVidWcgbW9kZS4KKworICAgICAgIERvbid0IG1vZGlmeSB0aGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlICh1c2UgYSBzaG9ydGVyIHNtYWxsIGJ1ZmZlcikKKyAgICAgICBpbiBkZWJ1ZyBtb2RlIHRvIGFsc28gYmUgYWJsZSB0byBkZXRlY3Qgc3RhY2sgb3ZlcmZsb3cgd2hlbiBydW5uaW5nCisgICAgICAgdGVzdHMgaW4gZGVidWcgbW9kZS4gVGhlIF9QeUJ5dGVzV3JpdGVyIGlzIGxhcmdlIChtb3JlIHRoYW4gNTEyIGJ5dGVzKSwKKyAgICAgICBpZiBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoKSBpcyBub3QgdXNlZCBpbiBkZWVwIEMgY2FsbGJhY2ssIHdlIG1heSBoaXQgYQorICAgICAgIHN0YWNrIG92ZXJmbG93LiAqLworICAgIHdyaXRlci0+YWxsb2NhdGVkID0gUHlfTUlOKHdyaXRlci0+YWxsb2NhdGVkLCAxMCk7CisgICAgLyogX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSgpIHJlcXVpcmVzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgMCwKKyAgICAgICB0byBkZXRlY3QgYnVmZmVyIG92ZXJmbG93ICovCisgICAgd3JpdGVyLT5zbWFsbF9idWZmZXJbd3JpdGVyLT5hbGxvY2F0ZWRdID0gMDsKKyNlbHNlCisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpOworI2VuZGlmCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCB3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7Cit9CisKK1B5T2JqZWN0ICoKK19QeUJ5dGVzV3JpdGVyX0ZpbmlzaChfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpzdHIpCit7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKworICAgIHNpemUgPSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKHdyaXRlciwgc3RyKTsKKyAgICBpZiAoc2l6ZSA9PSAwICYmICF3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworICAgICAgICAvKiBHZXQgdGhlIGVtcHR5IGJ5dGUgc3RyaW5nIHNpbmdsZXRvbiAqLworICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIH0KKyAgICBlbHNlIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSh3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSB3cml0ZXItPmJ1ZmZlcjsKKyAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworCisgICAgICAgIGlmIChzaXplICE9IHdyaXRlci0+YWxsb2NhdGVkKSB7CisgICAgICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZShyZXN1bHQsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ5dGVzLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgY2hhciAqc3RyID0gKGNoYXIgKilwdHI7CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUHlfTUVNQ1BZKHN0ciwgYnl0ZXMsIHNpemUpOworICAgIHN0ciArPSBzaXplOworCisgICAgcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL09iamVjdHMvZGVzY3JvYmplY3QuYyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwppbmRleCBkYTExZjZiLi4yMDAyZDIxIDEwMDY0NAotLS0gYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCkBAIC0yMiw3ICsyMiw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZXNjcl9yZXByKFB5RGVzY3JPYmplY3QgKmRlc2NyLCBjaGFyICpmb3JtYXQpCitkZXNjcl9yZXByKFB5RGVzY3JPYmplY3QgKmRlc2NyLCBjb25zdCBjaGFyICpmb3JtYXQpCiB7CiAgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOwogICAgIGlmIChkZXNjci0+ZF9uYW1lICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKGRlc2NyLT5kX25hbWUpKQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMgYi9PYmplY3RzL2RpY3RvYmplY3QuYwppbmRleCBmNTNjZDQwLi5mMWYzMWVkIDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL2RpY3RvYmplY3QuYwpAQCAtMTE2NSwzOSArMTE2NSw0MiBAQAogICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcihkcCwga3YpOwogfQogCi0vKiBGYXN0IHZlcnNpb24gb2YgZ2xvYmFsIHZhbHVlIGxvb2t1cC4KKy8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwIChMT0FEX0dMT0JBTCkuCiAgKiBMb29rdXAgaW4gZ2xvYmFscywgdGhlbiBidWlsdGlucy4KKyAqCisgKiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkIChleDogY29tcHV0aW5nIHRoZQorICoga2V5IGhhc2ggZmFpbGVkLCBrZXkgY29tcGFyaXNvbiBmYWlsZWQsIC4uLikuIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lc24ndAorICogZXhpc3QuIFJldHVybiB0aGUgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMuCiAgKi8KIFB5T2JqZWN0ICoKIF9QeURpY3RfTG9hZEdsb2JhbChQeURpY3RPYmplY3QgKmdsb2JhbHMsIFB5RGljdE9iamVjdCAqYnVpbHRpbnMsIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgUHlPYmplY3QgKng7Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpIHsKLSAgICAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKWtleSktPmhhc2g7Ci0gICAgICAgIGlmIChoYXNoICE9IC0xKSB7Ci0gICAgICAgICAgICBQeURpY3RLZXlFbnRyeSAqZTsKLSAgICAgICAgICAgIGUgPSBnbG9iYWxzLT5tYV9rZXlzLT5ka19sb29rdXAoZ2xvYmFscywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICAgICAgZSA9IGJ1aWx0aW5zLT5tYV9rZXlzLT5ka19sb29rdXAoYnVpbHRpbnMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCA9ICp2YWx1ZV9hZGRyOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KKyAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBQeURpY3RLZXlFbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHggPSBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcigoUHlPYmplY3QgKilnbG9iYWxzLCBrZXkpOwotICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiB4OwotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorCisgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KKyAgICBlbnRyeSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWJ1aWx0aW5zLCBrZXkpOworICAgIHZhbHVlID0gKnZhbHVlX2FkZHI7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIC8qIG5hbWVzcGFjZSAyOiBidWlsdGlucyAqLworICAgIGVudHJ5ID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAqdmFsdWVfYWRkcjsKIH0KIAogLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKQEAgLTE5MjIsNyArMTkyNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKK2RpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjb25zdCBjaGFyICptZXRobmFtZSkKIHsKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCBkOTJiZWMzLi5lYjYwNjU5IDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0xNDUxLDI5ICsxNDUxLDIzIEBACiAgICAgaW50IGV4cG9uZW50OwogICAgIGludCBpOwogCi0gICAgUHlPYmplY3QgKnByZXY7CiAgICAgUHlPYmplY3QgKnB5X2V4cG9uZW50ID0gTlVMTDsKICAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKICAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXN1bHRfcGFpciA9IE5VTEw7CiAgICAgUHlOdW1iZXJNZXRob2RzICpsb25nX21ldGhvZHMgPSBQeUxvbmdfVHlwZS50cF9hc19udW1iZXI7CiAKLSNkZWZpbmUgSU5QTEFDRV9VUERBVEUob2JqLCBjYWxsKSBcCi0gICAgcHJldiA9IG9iajsgXAotICAgIG9iaiA9IGNhbGw7IFwKLSAgICBQeV9ERUNSRUYocHJldik7IFwKLQogICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOwogCiAgICAgaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgaW5maW5pdHkgdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKLSAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoUHlfSVNfTkFOKHNlbGYpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgTmFOIHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXNfaW50ZWdlcl9yYXRpbyIsIGdvdG8gZXJyb3IpOwpAQCAtMTQ4OSwyOSArMTQ4MywzMSBAQAogICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLwogCiAgICAgbnVtZXJhdG9yID0gUHlMb25nX0Zyb21Eb3VibGUoZmxvYXRfcGFydCk7Ci0gICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBweV9leHBvbmVudCA9IFB5TG9uZ19Gcm9tTG9uZyhQeV9BQlMoZXhwb25lbnQpKTsKKyAgICBpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAogICAgIC8qIGZvbGQgaW4gMioqZXhwb25lbnQgKi8KLSAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKLSAgICBweV9leHBvbmVudCA9IFB5TG9uZ19Gcm9tTG9uZyhsYWJzKChsb25nKWV4cG9uZW50KSk7Ci0gICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gICAgSU5QTEFDRV9VUERBVEUocHlfZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQoZGVub21pbmF0b3IsIHB5X2V4cG9uZW50KSk7Ci0gICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAgICAgaWYgKGV4cG9uZW50ID4gMCkgewotICAgICAgICBJTlBMQUNFX1VQREFURShudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOwotICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX2xzaGlmdChudW1lcmF0b3IsIHB5X2V4cG9uZW50KSk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBQeV9ERUNSRUYoZGVub21pbmF0b3IpOwotICAgICAgICBkZW5vbWluYXRvciA9IHB5X2V4cG9uZW50OwotICAgICAgICBweV9leHBvbmVudCA9IE5VTEw7CisgICAgICAgIFB5X1NFVFJFRihkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOworICAgICAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgcmVzdWx0X3BhaXIgPSBQeVR1cGxlX1BhY2soMiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CiAKLSN1bmRlZiBJTlBMQUNFX1VQREFURQogZXJyb3I6CiAgICAgUHlfWERFQ1JFRihweV9leHBvbmVudCk7CiAgICAgUHlfWERFQ1JFRihkZW5vbWluYXRvcik7CmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3RvYmplY3QuYyBiL09iamVjdHMvbGlzdG9iamVjdC5jCmluZGV4IGVlZTdjNjguLmZjYzIxY2IgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdG9iamVjdC5jCisrKyBiL09iamVjdHMvbGlzdG9iamVjdC5jCkBAIC0yMTYsNyArMjE2LDYgQEAKIFB5TGlzdF9TZXRJdGVtKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpLAogICAgICAgICAgICAgICAgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0gICAgUHlPYmplY3QgKm9sZGl0ZW07CiAgICAgUHlPYmplY3QgKipwOwogICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgewogICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOwpAQCAtMjMwLDkgKzIyOSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcCA9ICgoUHlMaXN0T2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9TRVRSRUYoKnAsIG5ld2l0ZW0pOwogICAgIHJldHVybiAwOwogfQogCkBAIC03MzAsNyArNzI3LDYgQEAKIHN0YXRpYyBpbnQKIGxpc3RfYXNzX2l0ZW0oUHlMaXN0T2JqZWN0ICphLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CiAgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CkBAIC03MzksOSArNzM1LDcgQEAKICAgICBpZiAodiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKICAgICBQeV9JTkNSRUYodik7Ci0gICAgb2xkX3ZhbHVlID0gYS0+b2JfaXRlbVtpXTsKLSAgICBhLT5vYl9pdGVtW2ldID0gdjsKLSAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsKKyAgICBQeV9TRVRSRUYoYS0+b2JfaXRlbVtpXSwgdik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdHNvcnQudHh0IGIvT2JqZWN0cy9saXN0c29ydC50eHQKaW5kZXggODMyZTRmMi4uZmVmOTgyZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0c29ydC50eHQKKysrIGIvT2JqZWN0cy9saXN0c29ydC50eHQKQEAgLTQ4Niw3ICs0ODYsNyBAQAogSSBmaXJzdCBsZWFybmVkIGFib3V0IHRoZSBnYWxsb3Bpbmcgc3RyYXRlZ3kgaW4gYSByZWxhdGVkIGNvbnRleHQ7IHNlZToKIAogICAgICJBZGFwdGl2ZSBTZXQgSW50ZXJzZWN0aW9ucywgVW5pb25zLCBhbmQgRGlmZmVyZW5jZXMiICgyMDAwKQotICAgIEVyaWsgRC4gRGVtYWluZSwgQWxlamFuZHJvIEzzcGV6LU9ydGl6LCBKLiBJYW4gTXVucm8KKyAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBMw7NwZXotT3J0aXosIEouIElhbiBNdW5ybwogCiBhbmQgaXRzIGZvbGxvd3VwKHMpLiAgQW4gZWFybGllciBwYXBlciBjYWxsZWQgdGhlIHNhbWUgc3RyYXRlZ3kKICJleHBvbmVudGlhbCBzZWFyY2giOgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCBkODIxZTRiLi5kMDVkZThiIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMTU4MiwxMCArMTU4MiwxMiBAQAogc3RhdGljIGludAogbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChQeU9iamVjdCAqYWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqYnl0ZXNfd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqYnl0ZXNfc3RyKQogewogICAgIFB5TG9uZ09iamVjdCAqc2NyYXRjaCwgKmE7Ci0gICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeU9iamVjdCAqc3RyID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHNpemUsIHN0cmxlbiwgc2l6ZV9hLCBpLCBqOwogICAgIGRpZ2l0ICpwb3V0LCAqcGluLCByZW0sIHRlbnBvdzsKICAgICBpbnQgbmVnYXRpdmU7CkBAIC0xNjYyLDcgKzE2NjQsMTMgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBraW5kID0gd3JpdGVyLT5raW5kOwotICAgICAgICBzdHIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgKmJ5dGVzX3N0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoYnl0ZXNfd3JpdGVyLCAqYnl0ZXNfc3RyLCBzdHJsZW4pOworICAgICAgICBpZiAoKmJ5dGVzX3N0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2NyYXRjaCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHN0ciA9IFB5VW5pY29kZV9OZXcoc3RybGVuLCAnOScpOwpAQCAtMTY3MywxMyArMTY4MSw4IEBACiAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHIpOwogICAgIH0KIAotI2RlZmluZSBXUklURV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgV1JJVEVfRElHSVRTKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpICsgd3JpdGVyLT5wb3MgKyBzdHJsZW47IFwKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHN0cikgKyBzdHJsZW47ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLyogcG91dFswXSB0aHJvdWdoIHBvdXRbc2l6ZS0yXSBjb250cmlidXRlIGV4YWN0bHkgICAgICAgICAgICBcCiAgICAgICAgICAgIF9QeUxvbmdfREVDSU1BTF9TSElGVCBkaWdpdHMgZWFjaCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemUgLSAxOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE2OTksNiArMTcwMiwxNiBAQAogICAgICAgICAvKiBhbmQgc2lnbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKG5lZ2F0aXZlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJy0nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgV1JJVEVfVU5JQ09ERV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpICsgd3JpdGVyLT5wb3MgKyBzdHJsZW47IFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHN0cikgKyBzdHJsZW47ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgV1JJVEVfRElHSVRTKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAvKiBjaGVjayB3ZSd2ZSBjb3VudGVkIGNvcnJlY3RseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNzA4LDI1ICsxNzIxLDM0IEBACiAgICAgfSB3aGlsZSAoMCkKIAogICAgIC8qIGZpbGwgdGhlIHN0cmluZyByaWdodC10by1sZWZ0ICovCi0gICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKKyAgICBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgIGNoYXIgKnAgPSAqYnl0ZXNfc3RyICsgc3RybGVuOworICAgICAgICBXUklURV9ESUdJVFMocCk7CisgICAgICAgIGFzc2VydChwID09ICpieXRlc19zdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgIFB5X1VDUzEgKnA7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1MxKTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTMSk7CiAgICAgfQogICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzJCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMiAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzIpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MyKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5X1VDUzQgKnA7CiAgICAgICAgIGFzc2VydCAoa2luZCA9PSBQeVVuaWNvZGVfNEJZVEVfS0lORCk7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1M0KTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTNCk7CiAgICAgfQogI3VuZGVmIFdSSVRFX0RJR0lUUworI3VuZGVmIFdSSVRFX1VOSUNPREVfRElHSVRTCiAKICAgICBQeV9ERUNSRUYoc2NyYXRjaCk7CiAgICAgaWYgKHdyaXRlcikgewogICAgICAgICB3cml0ZXItPnBvcyArPSBzdHJsZW47CiAgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAoKmJ5dGVzX3N0cikgKz0gc3RybGVuOworICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeShzdHIsIDEpKTsKICAgICAgICAgKnBfb3V0cHV0ID0gKFB5T2JqZWN0ICopc3RyOwpAQCAtMTczOCw3ICsxNzYwLDcgQEAKIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmcoUHlPYmplY3QgKmFhKQogewogICAgIFB5T2JqZWN0ICp2OwotICAgIGlmIChsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKGFhLCAmdiwgTlVMTCkgPT0gLTEpCisgICAgaWYgKGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwoYWEsICZ2LCBOVUxMLCBOVUxMLCBOVUxMKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIHY7CiB9CkBAIC0xNzUwLDEwICsxNzcyLDExIEBACiAKIHN0YXRpYyBpbnQKIGxvbmdfZm9ybWF0X2JpbmFyeShQeU9iamVjdCAqYWEsIGludCBiYXNlLCBpbnQgYWx0ZXJuYXRlLAotICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9vdXRwdXQsIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKKyAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnBfb3V0cHV0LCBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKmJ5dGVzX3dyaXRlciwgY2hhciAqKmJ5dGVzX3N0cikKIHsKICAgICBQeUxvbmdPYmplY3QgKmEgPSAoUHlMb25nT2JqZWN0ICopYWE7Ci0gICAgUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc3o7CiAgICAgUHlfc3NpemVfdCBzaXplX2E7CiAgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kOwpAQCAtMTgxMCw3ICsxODMzLDExIEBACiAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzeiwgJ3gnKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAga2luZCA9IHdyaXRlci0+a2luZDsKLSAgICAgICAgdiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAqYnl0ZXNfc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShieXRlc193cml0ZXIsICpieXRlc19zdHIsIHN6KTsKKyAgICAgICAgaWYgKCpieXRlc19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHYgPSBQeVVuaWNvZGVfTmV3KHN6LCAneCcpOwpAQCAtMTgxOSwxMyArMTg0Niw4IEBACiAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh2KTsKICAgICB9CiAKLSNkZWZpbmUgV1JJVEVfRElHSVRTKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgV1JJVEVfRElHSVRTKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpICsgd3JpdGVyLT5wb3MgKyBzejsgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh2KSArIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoc2l6ZV9hID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgKi0tcCA9ICcwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTg2MCwzMCArMTg4Miw1MCBAQAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAobmVnYXRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgKi0tcCA9ICctJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgV1JJVEVfVU5JQ09ERV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHdyaXRlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpICsgd3JpdGVyLT5wb3MgKyBzejsgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh2KSArIHN6OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUklURV9ESUdJVFMocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYXNzZXJ0KHAgPT0gKChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcykpOyBcCiAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBhc3NlcnQocCA9PSAoVFlQRSopUHlVbmljb2RlX0RBVEEodikpOyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAotICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CisgICAgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICBjaGFyICpwID0gKmJ5dGVzX3N0ciArIHN6OworICAgICAgICBXUklURV9ESUdJVFMocCk7CisgICAgICAgIGFzc2VydChwID09ICpieXRlc19zdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgIFB5X1VDUzEgKnA7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1MxKTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTMSk7CiAgICAgfQogICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzJCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMiAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzIpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MyKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5X1VDUzQgKnA7CiAgICAgICAgIGFzc2VydCAoa2luZCA9PSBQeVVuaWNvZGVfNEJZVEVfS0lORCk7Ci0gICAgICAgIFdSSVRFX0RJR0lUUyhQeV9VQ1M0KTsKKyAgICAgICAgV1JJVEVfVU5JQ09ERV9ESUdJVFMoUHlfVUNTNCk7CiAgICAgfQogI3VuZGVmIFdSSVRFX0RJR0lUUworI3VuZGVmIFdSSVRFX1VOSUNPREVfRElHSVRTCiAKICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgIHdyaXRlci0+cG9zICs9IHN6OwogICAgIH0KKyAgICBlbHNlIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgKCpieXRlc19zdHIpICs9IHN6OworICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeSh2LCAxKSk7CiAgICAgICAgICpwX291dHB1dCA9IHY7CkBAIC0xODk3LDkgKzE5MzksOSBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgaW50IGVycjsKICAgICBpZiAoYmFzZSA9PSAxMCkKLSAgICAgICAgZXJyID0gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosICZzdHIsIE5VTEwpOworICAgICAgICBlcnIgPSBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgJnN0ciwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgZWxzZQotICAgICAgICBlcnIgPSBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCAxLCAmc3RyLCBOVUxMKTsKKyAgICAgICAgZXJyID0gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgMSwgJnN0ciwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKGVyciA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIHN0cjsKQEAgLTE5MTEsOSArMTk1MywzMSBAQAogICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGludCBhbHRlcm5hdGUpCiB7CiAgICAgaWYgKGJhc2UgPT0gMTApCi0gICAgICAgIHJldHVybiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgTlVMTCwgd3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOwogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIGFsdGVybmF0ZSwgTlVMTCwgd3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIGFsdGVybmF0ZSwgTlVMTCwgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworfQorCitjaGFyKgorX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcihfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlLCBpbnQgYWx0ZXJuYXRlKQoreworICAgIGNoYXIgKnN0cjI7CisgICAgaW50IHJlczsKKyAgICBzdHIyID0gc3RyOworICAgIGlmIChiYXNlID09IDEwKQorICAgICAgICByZXMgPSBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsICZzdHIyKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIGFsdGVybmF0ZSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwgJnN0cjIpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoc3RyMiAhPSBOVUxMKTsKKyAgICByZXR1cm4gc3RyMjsKIH0KIAogLyogVGFibGUgb2YgZGlnaXQgdmFsdWVzIGZvciA4LWJpdCBzdHJpbmcgLT4gaW50ZWdlciBjb252ZXJzaW9uLgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9tZW1vcnlvYmplY3QuYyBiL09iamVjdHMvbWVtb3J5b2JqZWN0LmMKaW5kZXggMTAxNjJjYi4uZTM1NWE4MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9tZW1vcnlvYmplY3QuYworKysgYi9PYmplY3RzL21lbW9yeW9iamVjdC5jCkBAIC0xMTMzLDcgKzExMzMsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotUHlfTE9DQUxfSU5MSU5FKGNoYXIgKikKK1B5X0xPQ0FMX0lOTElORShjb25zdCBjaGFyICopCiBnZXRfbmF0aXZlX2ZtdHN0cihjb25zdCBjaGFyICpmbXQpCiB7CiAgICAgaW50IGF0ID0gMDsKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIHZpZXctPmZvcm1hdCA9IGdldF9uYXRpdmVfZm10c3RyKFB5Qnl0ZXNfQVNfU1RSSU5HKGFzY2lpZm10KSk7CisgICAgdmlldy0+Zm9ybWF0ID0gKGNoYXIgKilnZXRfbmF0aXZlX2ZtdHN0cihQeUJ5dGVzX0FTX1NUUklORyhhc2NpaWZtdCkpOwogICAgIGlmICh2aWV3LT5mb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAvKiBOT1RfUkVBQ0hFRDogZ2V0X25hdGl2ZV9mbXRjaGFyKCkgYWxyZWFkeSB2YWxpZGF0ZXMgdGhlIGZvcm1hdC4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JqZWN0LmMgYi9PYmplY3RzL29iamVjdC5jCmluZGV4IDZmYzRkZjEuLjQxN2E5N2QgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vYmplY3QuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAvKiBNYXAgcmljaCBjb21wYXJpc29uIG9wZXJhdG9ycyB0byB0aGVpciBzd2FwcGVkIHZlcnNpb24sIGUuZy4gTFQgPC0tPiBHVCAqLwogaW50IF9QeV9Td2FwcGVkT3BbXSA9IHtQeV9HVCwgUHlfR0UsIFB5X0VRLCBQeV9ORSwgUHlfTFQsIFB5X0xFfTsKIAotc3RhdGljIGNoYXIgKm9wc3RyaW5nc1tdID0geyI8IiwgIjw9IiwgIj09IiwgIiE9IiwgIj4iLCAiPj0ifTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3BzdHJpbmdzW10gPSB7IjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSJ9OwogCiAvKiBQZXJmb3JtIGEgcmljaCBjb21wYXJpc29uLCByYWlzaW5nIFR5cGVFcnJvciB3aGVuIHRoZSByZXF1ZXN0ZWQgY29tcGFyaXNvbgogICAgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gKi8KQEAgLTY4NiwxMSArNjg2LDEwIEBACiAgICAgICAgIHJlcyA9ICh2ICE9IHcpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICAvKiBYWFggU3BlY2lhbC1jYXNlIE5vbmUgc28gaXQgZG9lc24ndCBzaG93IGFzIE5vbmVUeXBlKCkgKi8KICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJ1bm9yZGVyYWJsZSB0eXBlczogJS4xMDBzKCkgJXMgJS4xMDBzKCkiLAotICAgICAgICAgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICInJXMnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJyUuMTAwcycgYW5kICclLjEwMHMnIiwKICAgICAgICAgICAgICAgICAgICAgIG9wc3RyaW5nc1tvcF0sCisgICAgICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IDJmYWFmMTIuLjk0NjhlZTYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtMjksNyArMjksNiBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCi0jaW5jbHVkZSAic3RyaW5nbGliL2VxLmgiCiAKIC8qIE9iamVjdCB1c2VkIGFzIGR1bW15IGtleSB0byBmaWxsIGRlbGV0ZWQgZW50cmllcyAqLwogc3RhdGljIFB5T2JqZWN0IF9kdW1teV9zdHJ1Y3Q7CkBAIC01MSwxOSArNTAsMjAgQEAKIHN0YXRpYyBzZXRlbnRyeSAqCiBzZXRfbG9va2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQogewotICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLSAgICBzZXRlbnRyeSAqZnJlZXNsb3QgPSBOVUxMOworICAgIHNldGVudHJ5ICp0YWJsZTsKICAgICBzZXRlbnRyeSAqZW50cnk7Ci0gICAgc2l6ZV90IHBlcnR1cmIgPSBoYXNoOworICAgIHNpemVfdCBwZXJ0dXJiOwogICAgIHNpemVfdCBtYXNrID0gc28tPm1hc2s7CiAgICAgc2l6ZV90IGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOyAvKiBVbnNpZ25lZCBmb3IgZGVmaW5lZCBvdmVyZmxvdyBiZWhhdmlvciAqLwogICAgIHNpemVfdCBqOwogICAgIGludCBjbXA7CiAKLSAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICBlbnRyeSA9ICZzby0+dGFibGVbaV07CiAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIGVudHJ5OwogCisgICAgcGVydHVyYiA9IGhhc2g7CisKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgewogICAgICAgICAgICAgUHlPYmplY3QgKnN0YXJ0a2V5ID0gZW50cnktPmtleTsKQEAgLTczLDggKzczLDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCiAgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQotICAgICAgICAgICAgICAgICYmIHVuaWNvZGVfZXEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOwogICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKQEAgLTg2LDE0ICs4NywxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsgICAgICAgICAgICAgICAgIC8qIGhlbHAgYXZvaWQgYSByZWdpc3RlciBzcGlsbCAqLwogICAgICAgICB9Ci0gICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKIAogICAgICAgICBpZiAoaSArIExJTkVBUl9QUk9CRVMgPD0gbWFzaykgewogICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBMSU5FQVJfUFJPQkVTIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgZW50cnkrKzsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX251bGw7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IDAgJiYgZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0YXJ0a2V5ID0gZW50cnktPmtleTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHN0YXJ0a2V5ICE9IGR1bW15KTsKQEAgLTEwMSw4ICsxMDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB1bmljb2RlX2VxKHN0YXJ0a2V5LCBrZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CkBAIC0xMTQsNyArMTE0LDEwNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKKyAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CisKKyAgICAgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KK30KKworc3RhdGljIGludCBzZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICosIFB5X3NzaXplX3QpOworCitzdGF0aWMgaW50CitzZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCit7CisgICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IG1hc2s7CisgICAgc2l6ZV90IGk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnNpZ25lZCBmb3IgZGVmaW5lZCBvdmVyZmxvdyBiZWhhdmlvciAqLworICAgIHNpemVfdCBqOworICAgIGludCBjbXA7CisKKyAgICAvKiBQcmUtaW5jcmVtZW50IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGFyYml0cmFyeSBjb2RlIGluIHRoZSByaWNoCisgICAgICAgY29tcGFyaXNvbiBmcm9tIGRlYWxsb2NhdGluZyB0aGUga2V5IGp1c3QgYmVmb3JlIHRoZSBpbnNlcnRpb24uICovCisgICAgUHlfSU5DUkVGKGtleSk7CisKKyAgcmVzdGFydDoKKworICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICBpID0gKHNpemVfdCloYXNoICYgbWFzazsKKworICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKworICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICBwZXJ0dXJiID0gaGFzaDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgLyogc3RhcnRrZXkgY2Fubm90IGJlIGEgZHVtbXkgYmVjYXVzZSB0aGUgZHVtbXkgaGFzaCBmaWVsZCBpcyAtMSAqLworICAgICAgICAgICAgYXNzZXJ0KHN0YXJ0a2V5ICE9IGR1bW15KTsKKyAgICAgICAgICAgIGlmIChzdGFydGtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQorICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpa2VseSAqLworICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfYWN0aXZlOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgLyogQ29udGludWluZyB0aGUgc2VhcmNoIGZyb20gdGhlIGN1cnJlbnQgZW50cnkgb25seSBtYWtlcworICAgICAgICAgICAgICAgc2Vuc2UgaWYgdGhlIHRhYmxlIGFuZCBlbnRyeSBhcmUgdW5jaGFuZ2VkOyBvdGhlcndpc2UsCisgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nICovCisgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOyAgICAgICAgICAgICAgICAgLyogaGVscCBhdm9pZCBhIHJlZ2lzdGVyIHNwaWxsICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisKKyAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTElORUFSX1BST0JFUyA7IGorKykgeworICAgICAgICAgICAgICAgIGVudHJ5Kys7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IDAgJiYgZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3VudXNlZF9vcl9kdW1teTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRrZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTIyLDI5ICsyMTksNTEgQEAKICAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKICAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CiAKLSAgICAgICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKICAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZm91bmRfbnVsbDsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfdW51c2VkX29yX2R1bW15OwogICAgIH0KLSAgZm91bmRfbnVsbDoKLSAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7CisKKyAgZm91bmRfdW51c2VkX29yX2R1bW15OgorICAgIGlmIChmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKyAgICBzby0+dXNlZCsrOworICAgIGZyZWVzbG90LT5rZXkgPSBrZXk7CisgICAgZnJlZXNsb3QtPmhhc2ggPSBoYXNoOworICAgIHJldHVybiAwOworCisgIGZvdW5kX3VudXNlZDoKKyAgICBzby0+ZmlsbCsrOworICAgIHNvLT51c2VkKys7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CisgICAgaWYgKChzaXplX3Qpc28tPmZpbGwqMyA8IG1hc2sqMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkKTsKKworICBmb3VuZF9hY3RpdmU6CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIDA7CisKKyAgY29tcGFyaXNvbl9lcnJvcjoKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCiBJbnRlcm5hbCByb3V0aW5lIHVzZWQgYnkgc2V0X3RhYmxlX3Jlc2l6ZSgpIHRvIGluc2VydCBhbiBpdGVtIHdoaWNoIGlzCiBrbm93biB0byBiZSBhYnNlbnQgZnJvbSB0aGUgc2V0LiAgVGhpcyByb3V0aW5lIGFsc28gYXNzdW1lcyB0aGF0CiB0aGUgc2V0IGNvbnRhaW5zIG5vIGRlbGV0ZWQgZW50cmllcy4gIEJlc2lkZXMgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXQsCi11c2luZyBzZXRfaW5zZXJ0X2NsZWFuKCkgaW4gc2V0X3RhYmxlX3Jlc2l6ZSgpIGlzIGRhbmdlcm91cyAoU0YgYnVnICMxNDU2MjA5KS4KLU5vdGUgdGhhdCBubyByZWZjb3VudHMgYXJlIGNoYW5nZWQgYnkgdGhpcyByb3V0aW5lOyBpZiBuZWVkZWQsIHRoZSBjYWxsZXIKLWlzIHJlc3BvbnNpYmxlIGZvciBpbmNyZWYnaW5nIGBrZXlgLgordGhlcmUgaXMgYWxzbyBzYWZldHkgYmVuZWZpdCBzaW5jZSB1c2luZyBzZXRfYWRkX2VudHJ5KCkgcmlza3MgbWFraW5nCithIGNhbGxiYWNrIGluIHRoZSBtaWRkbGUgb2YgYSBzZXRfdGFibGVfcmVzaXplKCksIHNlZSBpc3N1ZSAxNDU2MjA5LgorVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIGtleSdzIHJlZmVyZW5jZSBjb3VudCBhbmQKK3RoZSBzZXRvYmplY3QncyBmaWxsIGFuZCB1c2VkIGZpZWxkcy4KICovCiBzdGF0aWMgdm9pZAotc2V0X2luc2VydF9jbGVhbihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQorc2V0X2luc2VydF9jbGVhbihzZXRlbnRyeSAqdGFibGUsIHNpemVfdCBtYXNrLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIHNpemVfdCBwZXJ0dXJiID0gaGFzaDsKLSAgICBzaXplX3QgbWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgc2l6ZV90IGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOwogICAgIHNpemVfdCBqOwogCkBAIC0xNjUsNDUgKzI4NCwxMSBAQAogICBmb3VuZF9udWxsOgogICAgIGVudHJ5LT5rZXkgPSBrZXk7CiAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgIHNvLT5maWxsKys7Ci0gICAgc28tPnVzZWQrKzsKIH0KIAogLyogPT09PT09PT0gRW5kIGxvZ2ljIGZvciBwcm9iaW5nIHRoZSBoYXNoIHRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCi0vKgotSW50ZXJuYWwgcm91dGluZSB0byBpbnNlcnQgYSBuZXcga2V5IGludG8gdGhlIHRhYmxlLgotVXNlZCBieSB0aGUgcHVibGljIGluc2VydCByb3V0aW5lLgotRWF0cyBhIHJlZmVyZW5jZSB0byBrZXkuCi0qLwotc3RhdGljIGludAotc2V0X2luc2VydF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKLXsKLSAgICBzZXRlbnRyeSAqZW50cnk7Ci0KLSAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOwotICAgIGlmIChlbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewotICAgICAgICAvKiBVTlVTRUQgKi8KLSAgICAgICAgZW50cnktPmtleSA9IGtleTsKLSAgICAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgICAgICBzby0+ZmlsbCsrOwotICAgICAgICBzby0+dXNlZCsrOwotICAgIH0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotICAgICAgICAvKiBEVU1NWSAqLwotICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OwotICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgICAgIHNvLT51c2VkKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogQUNUSVZFICovCi0gICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogLyoKIFJlc3RydWN0dXJlIHRoZSB0YWJsZSBieSBhbGxvY2F0aW5nIGEgbmV3IHRhYmxlIGFuZCByZWluc2VydGluZyBhbGwKIGtleXMgYWdhaW4uICBXaGVuIGVudHJpZXMgaGF2ZSBiZWVuIGRlbGV0ZWQsIHRoZSBuZXcgdGFibGUgbWF5CkBAIC0yMTYsMTAgKzMwMSwxMyBAQAogICAgIHNldGVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBvbGRmaWxsID0gc28tPmZpbGw7CiAgICAgUHlfc3NpemVfdCBvbGR1c2VkID0gc28tPnVzZWQ7CisgICAgUHlfc3NpemVfdCBvbGRtYXNrID0gc28tPm1hc2s7CisgICAgc2l6ZV90IG5ld21hc2s7CiAgICAgaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOwogICAgIHNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAKICAgICBhc3NlcnQobWludXNlZCA+PSAwKTsKKyAgICBtaW51c2VkID0gKG1pbnVzZWQgPiA1MDAwMCkgPyBtaW51c2VkICogMiA6IG1pbnVzZWQgKiA0OwogCiAgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCiAgICAgLyogWFhYIHNwZWVkLXVwIHdpdGggaW50cmluc2ljcyAqLwpAQCAtMjY3LDI1ICszNTUsMjQgQEAKICAgICAvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCiAgICAgYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKICAgICBtZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihzZXRlbnRyeSkgKiBuZXdzaXplKTsKLSAgICBzby0+ZmlsbCA9IDA7Ci0gICAgc28tPnVzZWQgPSAwOworICAgIHNvLT5maWxsID0gb2xkdXNlZDsKKyAgICBzby0+dXNlZCA9IG9sZHVzZWQ7CiAgICAgc28tPm1hc2sgPSBuZXdzaXplIC0gMTsKICAgICBzby0+dGFibGUgPSBuZXd0YWJsZTsKIAogICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKICAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgaWYgKG9sZGZpbGwgPT0gb2xkdXNlZCkgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgb2xkdXNlZC0tOwotICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4oc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKG5ld3RhYmxlLCBuZXdtYXNrLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgICAgICBvbGR1c2VkLS07Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4obmV3dGFibGUsIG5ld21hc2ssIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5NSw1NyArMzgyLDMwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIENBVVRJT046IHNldF9hZGRfa2V5L2VudHJ5KCkgbXVzdCBndWFyYW50ZWUgaXQgd29uJ3QgcmVzaXplIHRoZSB0YWJsZSAqLwotCiBzdGF0aWMgaW50Ci1zZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQorc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7Ci0gICAgUHlfc3NpemVfdCBuX3VzZWQ7Ci0gICAgUHlPYmplY3QgKmtleSA9IGVudHJ5LT5rZXk7Ci0gICAgUHlfaGFzaF90IGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLSAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLSAgICBuX3VzZWQgPSBzby0+dXNlZDsKLSAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKLX0KLQotc3RhdGljIGludAotc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQotewotICAgIHNldGVudHJ5IGVudHJ5OwotICAgIFB5X2hhc2hfdCBoYXNoOwotCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8Ci0gICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9hZGRfZW50cnkoc28sICZlbnRyeSk7CisgICAgZW50cnkgPSBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5rZXkgIT0gTlVMTDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRElTQ0FSRF9OT1RGT1VORCAwCiAjZGVmaW5lIERJU0NBUkRfRk9VTkQgMQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9lbnRyeShQeVNldE9iamVjdCAqc28sIHNldGVudHJ5ICpvbGRlbnRyeSkKK3NldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5T2JqZWN0ICpvbGRfa2V5OwogCi0gICAgZW50cnkgPSBzZXRfbG9va2tleShzbywgb2xkZW50cnktPmtleSwgb2xkZW50cnktPmhhc2gpOworICAgIGVudHJ5ID0gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKICAgICBvbGRfa2V5ID0gZW50cnktPmtleTsKICAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CkBAIC0zNTYsMjIgKzQxNiw0NSBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQorc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotICAgIHNldGVudHJ5IGVudHJ5OwogICAgIFB5X2hhc2hfdCBoYXNoOwogCi0gICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CiAgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CiAgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAgICAgICAgIGlmIChoYXNoID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmZW50cnkpOworICAgIHJldHVybiBzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworfQorCitzdGF0aWMgaW50CitzZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKK30KKworc3RhdGljIGludAorc2V0X2Rpc2NhcmRfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDUyLDIwICs1MzUsMjIgQEAKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBtYXNrOwotICAgIHNldGVudHJ5ICp0YWJsZTsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKICAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAgICAgaSA9ICpwb3NfcHRyOwogICAgIGFzc2VydChpID49IDApOwotICAgIHRhYmxlID0gc28tPnRhYmxlOwogICAgIG1hc2sgPSBzby0+bWFzazsKLSAgICB3aGlsZSAoaSA8PSBtYXNrICYmICh0YWJsZVtpXS5rZXkgPT0gTlVMTCB8fCB0YWJsZVtpXS5rZXkgPT0gZHVtbXkpKQorICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkpIHsKICAgICAgICAgaSsrOworICAgICAgICBlbnRyeSsrOworICAgIH0KICAgICAqcG9zX3B0ciA9IGkrMTsKICAgICBpZiAoaSA+IG1hc2spCiAgICAgICAgIHJldHVybiAwOwotICAgIGFzc2VydCh0YWJsZVtpXS5rZXkgIT0gTlVMTCk7Ci0gICAgKmVudHJ5X3B0ciA9ICZ0YWJsZVtpXTsKKyAgICBhc3NlcnQoZW50cnkgIT0gTlVMTCk7CisgICAgKmVudHJ5X3B0ciA9IGVudHJ5OwogICAgIHJldHVybiAxOwogfQogCkBAIC01NjMsOCArNjQ4LDggQEAKICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAogICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgogICAgICAqLwotICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgewotICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKKyAgICBpZiAoKHNvLT5maWxsICsgb3RoZXItPnVzZWQpKjMgPj0gc28tPm1hc2sqMikgeworICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCArIG90aGVyLT51c2VkKSAhPSAwKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHNvX2VudHJ5ID0gc28tPnRhYmxlOwpAQCAtNTg5LDExICs2NzQsMTUgQEAKIAogICAgIC8qIElmIG91ciB0YWJsZSBpcyBlbXB0eSwgd2UgY2FuIHVzZSBzZXRfaW5zZXJ0X2NsZWFuKCkgKi8KICAgICBpZiAoc28tPmZpbGwgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyssIG90aGVyX2VudHJ5KyspIHsKKyAgICAgICAgc2V0ZW50cnkgKm5ld3RhYmxlID0gc28tPnRhYmxlOworICAgICAgICBzaXplX3QgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CisgICAgICAgIHNvLT5maWxsID0gb3RoZXItPnVzZWQ7CisgICAgICAgIHNvLT51c2VkID0gb3RoZXItPnVzZWQ7CisgICAgICAgIGZvciAoaSA9IG90aGVyLT5tYXNrICsgMTsgaSA+IDAgOyBpLS0sIG90aGVyX2VudHJ5KyspIHsKICAgICAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgICAgICBpZiAoa2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15KSB7CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CisgICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihuZXd0YWJsZSwgbmV3bWFzaywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC02MDQsNDYgKzY5MywxMyBAQAogICAgICAgICBvdGhlcl9lbnRyeSA9ICZvdGhlci0+dGFibGVbaV07CiAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgIGlmIChrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOwotICAgICAgICAgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgb3RoZXJfZW50cnktPmhhc2gpKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQotewotICAgIFB5T2JqZWN0ICprZXk7Ci0gICAgc2V0ZW50cnkgKmx1X2VudHJ5OwotCi0gICAgbHVfZW50cnkgPSBzZXRfbG9va2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotICAgIGlmIChsdV9lbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAga2V5ID0gbHVfZW50cnktPmtleTsKLSAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwotfQotCi1zdGF0aWMgaW50Ci1zZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKLXsKLSAgICBzZXRlbnRyeSBlbnRyeTsKLSAgICBQeV9oYXNoX3QgaGFzaDsKLQotICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAotICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgewotICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotICAgICAgICBpZiAoaGFzaCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZW50cnkua2V5ID0ga2V5OwotICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgIHJldHVybiBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9wKFB5U2V0T2JqZWN0ICpzbykKIHsKQEAgLTY4NSw0MyArNzQxLDY0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoIHZhbHVlcy4KKyAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSB1c2UgY2FzZXMgaGF2ZSBtYW55IGNvbWJpbmF0aW9ucyBvZiBhCisgICBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdAorICAgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLworCitzdGF0aWMgUHlfdWhhc2hfdAorX3NodWZmbGVfYml0cyhQeV91aGFzaF90IGgpCit7CisgICAgcmV0dXJuICgoaCBeIDg5ODY5NzQ3VUwpIF4gKGggPDwgMTYpKSAqIDM2NDQ3OTgxNjdVTDsKK30KKworLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob3NlbgorICAgbGFyZ2UgcHJpbWVzIHdpdGggImludGVyZXN0aW5nIGJpdCBwYXR0ZXJucyIgYW5kIHRoYXQgcGFzc2VkIHRlc3RzCisgICBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMgZGF0YXNldHMKKyAgIGluY2x1ZGluZyBwb3dlcnNldHMgYW5kIGdyYXBoIHN0cnVjdHVyZXMgKHN1Y2ggYXMgRGF2aWQgRXBwc3RlaW4ncworICAgZ3JhcGggcmVjaXBlcyBpbiBMaWIvdGVzdC90ZXN0X3NldC5weSkgKi8KKwogc3RhdGljIFB5X2hhc2hfdAogZnJvemVuc2V0X2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob29zZW4KLSAgICAgICBsYXJnZSBwcmltZXMgd2l0aCAiaW50ZXJlc3RpbmcgYml0IHBhdHRlcm5zIiBhbmQgdGhhdCBwYXNzZWQKLSAgICAgICB0ZXN0cyBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMKLSAgICAgICBkYXRhc2V0cyBzdWNoIGFzOgotCi0gICAgICAgICAgcHMgPSBbXQotICAgICAgICAgIGZvciByIGluIHJhbmdlKDIxKToKLSAgICAgICAgICAgICAgcHMgKz0gaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhyYW5nZSgyMCksIHIpCi0gICAgICAgICAgbnVtX2Rpc3RpbmN0X2hhc2hlcyA9IGxlbih7aGFzaChmcm96ZW5zZXQocykpIGZvciBzIGluIHBzfSkKLQotICAgICovCiAgICAgUHlTZXRPYmplY3QgKnNvID0gKFB5U2V0T2JqZWN0ICopc2VsZjsKLSAgICBQeV91aGFzaF90IGgsIGhhc2ggPSAxOTI3ODY4MjM3VUw7CisgICAgUHlfdWhhc2hfdCBoYXNoID0gMDsKICAgICBzZXRlbnRyeSAqZW50cnk7Ci0gICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCiAgICAgaWYgKHNvLT5oYXNoICE9IC0xKQogICAgICAgICByZXR1cm4gc28tPmhhc2g7CiAKLSAgICBoYXNoICo9IChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMTsKLSAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2gKLSAgICAgICAgICAgdmFsdWVzLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkKLSAgICAgICAgICAgY29tYmluYXRpb25zIG9mIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggbmVhcmJ5Ci0gICAgICAgICAgIGhhc2hlcyBzbyB0aGF0IG1hbnkgZGlzdGluY3QgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkKLSAgICAgICAgICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLwotICAgICAgICBoID0gZW50cnktPmhhc2g7Ci0gICAgICAgIGhhc2ggXj0gKChoIF4gODk4Njk3NDdVTCkgXiAoaCA8PCAxNikpICogMzY0NDc5ODE2N1VMOwotICAgIH0KLSAgICAvKiBNYWtlIHRoZSBmaW5hbCByZXN1bHQgc3ByZWFkLW91dCBpbiBhIGRpZmZlcmVudCBwYXR0ZXJuCi0gICAgICAgdGhhbiB0aGUgYWxnb3JpdGhtIGZvciB0dXBsZXMgb3Igb3RoZXIgcHl0aG9uIG9iamVjdHMuICovCisgICAgLyogWG9yLWluIHNodWZmbGVkIGJpdHMgZnJvbSBldmVyeSBlbnRyeSdzIGhhc2ggZmllbGQgYmVjYXVzZSB4b3IgaXMKKyAgICAgICBjb21tdXRhdGl2ZSBhbmQgYSBmcm96ZW5zZXQgaGFzaCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2Ygb3JkZXIuCisKKyAgICAgICBGb3Igc3BlZWQsIGluY2x1ZGUgbnVsbCBlbnRyaWVzIGFuZCBkdW1teSBlbnRyaWVzIGFuZCB0aGVuCisgICAgICAgc3VidHJhY3Qgb3V0IHRoZWlyIGVmZmVjdCBhZnRlcndhcmRzIHNvIHRoYXQgdGhlIGZpbmFsIGhhc2gKKyAgICAgICBkZXBlbmRzIG9ubHkgb24gYWN0aXZlIGVudHJpZXMuICBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBiZQorICAgICAgIHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBpdCBzYXZlcyB0aGUgdW5wcmVkaWN0YWJsZQorICAgICAgIGJyYW5jaGVzIHRoYXQgd291bGQgYXJpc2Ugd2hlbiB0cnlpbmcgdG8gZXhjbHVkZSBudWxsIGFuZCBkdW1teQorICAgICAgIGVudHJpZXMgb24gZXZlcnkgaXRlcmF0aW9uLiAqLworCisgICAgZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZW50cnkgPD0gJnNvLT50YWJsZVtzby0+bWFza107IGVudHJ5KyspCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cyhlbnRyeS0+aGFzaCk7CisKKyAgICAvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBhbiBvZGQgbnVtYmVyIG9mIE5VTEwgZW50cmllcyAqLworICAgIGlmICgoc28tPm1hc2sgKyAxIC0gc28tPmZpbGwpICYgMSkKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKDApOworCisgICAgLyogUmVtb3ZlIHRoZSBlZmZlY3Qgb2YgYW4gb2RkIG51bWJlciBvZiBkdW1teSBlbnRyaWVzICovCisgICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAmIDEpCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cygtMSk7CisKKyAgICAvKiBGYWN0b3IgaW4gdGhlIG51bWJlciBvZiBhY3RpdmUgZW50cmllcyAqLworICAgIGhhc2ggXj0gKChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMSkgKiAxOTI3ODY4MjM3VUw7CisKKyAgICAvKiBEaXNwZXJzZSBwYXR0ZXJucyBhcmlzaW5nIGluIG5lc3RlZCBmcm96ZW5zZXRzICovCiAgICAgaGFzaCA9IGhhc2ggKiA2OTA2OVUgKyA5MDcxMzM5MjNVTDsKKworICAgIC8qIC0xIGlzIHJlc2VydmVkIGFzIGFuIGVycm9yIGNvZGUgKi8KICAgICBpZiAoaGFzaCA9PSAoUHlfdWhhc2hfdCktMSkKICAgICAgICAgaGFzaCA9IDU5MDkyMzcxM1VMOworCiAgICAgc28tPmhhc2ggPSBoYXNoOwogICAgIHJldHVybiBoYXNoOwogfQpAQCAtODY4LDcgKzk0NSw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC05MTMsMTggKzk5MCwxNCBAQAogICAgICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBrZXlzLiAgRXhwZWN0CiAgICAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCiAgICAgICAgICovCi0gICAgICAgIGlmIChkaWN0c2l6ZSA9PSAtMSkKKyAgICAgICAgaWYgKGRpY3RzaXplIDwgMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKChzby0+ZmlsbCArIGRpY3RzaXplKSozID49IChzby0+bWFzaysxKSoyKSB7Ci0gICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgKHNvLT51c2VkICsgZGljdHNpemUpKjIpICE9IDApCisgICAgICAgIGlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSBzby0+bWFzayoyKSB7CisgICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQgKyBkaWN0c2l6ZSkgIT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwotCi0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpKQorICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTIwNCw2ICsxMjc3LDggQEAKIHsKICAgICBQeVNldE9iamVjdCAqcmVzdWx0OwogICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKKyAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCiAgICAgICAgIHJldHVybiBzZXRfY29weShzbyk7CkBAIC0xMjIzLDEzICsxMjk4LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOwotICAgICAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocnYpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGVudHJ5KSkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTI0NSwzMiArMTMyMiwxNSBAQAogICAgIH0KIAogICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgc2V0ZW50cnkgZW50cnk7Ci0gICAgICAgIFB5X2hhc2hfdCBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCi0gICAgICAgIGlmIChoYXNoID09IC0xKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIGlmIChydikgewotICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCAmZW50cnkpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwga2V5LCBoYXNoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgIH0KQEAgLTEyODAsNiArMTM0MCwxMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgZXJyb3I6CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzNjYsNiArMTQzMSw3IEBACiBzZXRfaXNkaXNqb2ludChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKICAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKSB7CiAgICAgICAgIGlmIChQeVNldF9HRVRfU0laRShzbykgPT0gMCkKQEAgLTEzODQsOCArMTQ1MCw4IEBACiAgICAgICAgICAgICBvdGhlciA9IHRtcDsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOwotICAgICAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBpZiAocnYpCiAgICAgICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwpAQCAtMTM5OCw4ICsxNDY0LDYgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBpbnQgcnY7Ci0gICAgICAgIHNldGVudHJ5IGVudHJ5OwogICAgICAgICBQeV9oYXNoX3QgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKIAogICAgICAgICBpZiAoaGFzaCA9PSAtMSkgewpAQCAtMTQwNywxMSArMTQ3MSw5IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7CisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOwogICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMTQ0MCw3ICsxNTAyLDcgQEAKICAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCiAgICAgICAgIHdoaWxlIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilvdGhlciwgJnBvcywgJmVudHJ5KSkKLSAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpID09IC0xKQorICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9IGVsc2UgewogICAgICAgICBQeU9iamVjdCAqa2V5LCAqaXQ7CkBAIC0xNDQ5LDcgKzE1MTEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpIDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTQ2MCwxMCArMTUyMiwxMCBAQAogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgLyogSWYgbW9yZSB0aGFuIDEvNSBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLwotICAgIGlmICgoc28tPmZpbGwgLSBzby0+dXNlZCkgKiA1IDwgc28tPm1hc2spCisgICAgLyogSWYgbW9yZSB0aGFuIDEvNHRoIGFyZSBkdW1taWVzLCB0aGVuIHJlc2l6ZSB0aGVtIGF3YXkuICovCisgICAgaWYgKChzaXplX3QpKHNvLT5maWxsIC0gc28tPnVzZWQpIDw9IChzaXplX3Qpc28tPm1hc2sgLyA0KQogICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQ+NTAwMDAgPyBzby0+dXNlZCoyIDogc28tPnVzZWQqNCk7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE0OTAsNyArMTU1Miw3IEBACiAgICAgcmVzdWx0ID0gc2V0X2NvcHkoc28pOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKikgcmVzdWx0LCBvdGhlcikgIT0gLTEpCisgICAgaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKikgcmVzdWx0LCBvdGhlcikgPT0gMCkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTE1MDAsOCArMTU2MiwxMSBAQAogc2V0X2RpZmZlcmVuY2UoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5X2hhc2hfdCBoYXNoOwogICAgIHNldGVudHJ5ICplbnRyeTsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikgICYmICFQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKICAgICAgICAgcmV0dXJuIHNldF9jb3B5X2FuZF9kaWZmZXJlbmNlKHNvLCBvdGhlcik7CkBAIC0xNTE5LDE3ICsxNTg0LDE1IEBACiAKICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CiAgICAgICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotICAgICAgICAgICAgc2V0ZW50cnkgZW50cnljb3B5OwotICAgICAgICAgICAgaW50IHJ2OwotICAgICAgICAgICAgZW50cnljb3B5Lmhhc2ggPSBlbnRyeS0+aGFzaDsKLSAgICAgICAgICAgIGVudHJ5Y29weS5rZXkgPSBlbnRyeS0+a2V5OwotICAgICAgICAgICAgcnYgPSBfUHlEaWN0X0NvbnRhaW5zKG90aGVyLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICBrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICAgICAgcnYgPSBfUHlEaWN0X0NvbnRhaW5zKG90aGVyLCBrZXksIGhhc2gpOwogICAgICAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFydikgewotICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgJmVudHJ5Y29weSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1NDAsMTMgKzE2MDMsMTUgQEAKIAogICAgIC8qIEl0ZXJhdGUgb3ZlciBzbywgY2hlY2tpbmcgZm9yIGNvbW1vbiBlbGVtZW50cyBpbiBvdGhlci4gKi8KICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICBoYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBrZXksIGhhc2gpOworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgZW50cnkpKSB7CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTE2MDgsMjkgKzE2NzMsMjQgQEAKICAgICBQeVNldE9iamVjdCAqb3RoZXJzZXQ7CiAgICAgUHlPYmplY3QgKmtleTsKICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlfaGFzaF90IGhhc2g7CiAgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIGludCBydjsKIAogICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKICAgICAgICAgcmV0dXJuIHNldF9jbGVhcihzbyk7CiAKICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CiAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZTsKLSAgICAgICAgaW50IHJ2OwotICAgICAgICBQeV9oYXNoX3QgaGFzaDsKICAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwotCiAgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICAgICAgICAgIGFuX2VudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgYW5fZW50cnkua2V5ID0ga2V5OwotCi0gICAgICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmYW5fZW50cnkpOwotICAgICAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywgJmFuX2VudHJ5KSkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC0xNjUwLDEzICsxNzEwLDE1IEBACiAgICAgfQogCiAgICAgd2hpbGUgKHNldF9uZXh0KG90aGVyc2V0LCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICBoYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGVudHJ5KSkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtMTcxOCw2ICsxNzgwLDcgQEAKIHsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIGludCBydjsKIAogICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CiAgICAgICAgIFB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7CkBAIC0xNzMyLDggKzE3OTUsOCBAQAogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoKFB5U2V0T2JqZWN0ICopb3RoZXIsIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBpZiAoIXJ2KQogICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwpAQCAtMTgyNCw3ICsxODg3LDcgQEAKICAgICBpbnQgcnY7CiAKICAgICBydiA9IHNldF9jb250YWluc19rZXkoc28sIGtleSk7Ci0gICAgaWYgKHJ2ID09IC0xKSB7CisgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTE4NDMsNyArMTkwNiw3IEBACiAgICAgbG9uZyByZXN1bHQ7CiAKICAgICByZXN1bHQgPSBzZXRfY29udGFpbnMoc28sIGtleSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICBpZiAocmVzdWx0IDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQpAQCAtMTg1Nyw3ICsxOTIwLDcgQEAKICAgICBpbnQgcnY7CiAKICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLSAgICBpZiAocnYgPT0gLTEpIHsKKyAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODY2LDcgKzE5MjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCB0bXBrZXkpOwogICAgICAgICBQeV9ERUNSRUYodG1wa2V5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xODg5LDcgKzE5NTIsNyBAQAogICAgIGludCBydjsKIAogICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpOwotICAgIGlmIChydiA9PSAtMSkgeworICAgIGlmIChydiA8IDApIHsKICAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTE4OTgsNyArMTk2MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIHRtcGtleSk7CiAgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOwotICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC0yMTI1LDcgKzIxODgsNyBAQAogICAgICBjb3B5X2RvY30sCiAgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAogICAgICBkaWZmZXJlbmNlX2RvY30sCi0gICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgIHsiaW50ZXJzZWN0aW9uIiwgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksICAgIE1FVEhfVkFSQVJHUywKICAgICAgaW50ZXJzZWN0aW9uX2RvY30sCiAgICAgeyJpc2Rpc2pvaW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsICAgIE1FVEhfTywKICAgICAgaXNkaXNqb2ludF9kb2N9LApAQCAtMjE5Niw3ICsyMjU5LDcgQEAKICAgICAodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAoZ2V0aXRlcmZ1bmMpc2V0X2l0ZXIsICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBmcm96ZW5zZXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaCBiL09iamVjdHMvc3RyaW5nbGliL2NvZGVjcy5oCmluZGV4IDBmYzZiNTguLjJiZWI2MDQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2NvZGVjcy5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2NvZGVjcy5oCkBAIC0yNjMsNDkgKzI2MywzMyBAQAogI2RlZmluZSBNQVhfU0hPUlRfVU5JQ0hBUlMgMzAwICAvKiBsYXJnZXN0IHNpemUgd2UnbGwgZG8gb24gdGhlIHN0YWNrICovCiAKICAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gcyBvZiBuZXh0IGlucHV0IGJ5dGUgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgIC8qIHJlc3VsdCBzdHJpbmcgb2JqZWN0ICovCiAgICAgY2hhciAqcDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGZyZWUgYnl0ZSBpbiBvdXRwdXQgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBuYWxsb2NhdGVkOyAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgYWxsb2NhdGVkICovCi0gICAgUHlfc3NpemVfdCBubmVlZGVkOyAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgbmVlZGVkICovCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcCA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogI2VuZGlmCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKICAgICBjb25zdCBQeV9zc2l6ZV90IG1heF9jaGFyX3NpemUgPSAyOwotICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogMl07CiAjZWxpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMgogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDM7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiAzXTsKICNlbHNlIC8qICBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gNCAqLwogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDQ7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiA0XTsKICNlbmRpZgorICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGFzc2VydChzaXplID49IDApOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKLSAgICBpZiAoc2l6ZSA8PSBNQVhfU0hPUlRfVU5JQ0hBUlMpIHsKLSAgICAgICAgLyogV3JpdGUgaW50byB0aGUgc3RhY2sgYnVmZmVyOyBuYWxsb2NhdGVkIGNhbid0IG92ZXJmbG93LgotICAgICAgICAgKiBBdCB0aGUgZW5kLCB3ZSdsbCBhbGxvY2F0ZSBleGFjdGx5IGFzIG11Y2ggaGVhcCBzcGFjZSBhcyBpdAotICAgICAgICAgKiB0dXJucyBvdXQgd2UgbmVlZC4KLSAgICAgICAgICovCi0gICAgICAgIG5hbGxvY2F0ZWQgPSBQeV9TQUZFX0RPV05DQVNUKHNpemVvZihzdGFja2J1ZiksIHNpemVfdCwgaW50KTsKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsgICAvKiB3aWxsIGFsbG9jYXRlIGFmdGVyIHdlJ3JlIGRvbmUgKi8KLSAgICAgICAgcCA9IHN0YWNrYnVmOworICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBtYXhfY2hhcl9zaXplKSB7CisgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbWF4X2NoYXJfc2l6ZSkgewotICAgICAgICAgICAgLyogaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogT3ZlcmFsbG9jYXRlIG9uIHRoZSBoZWFwLCBhbmQgZ2l2ZSB0aGUgZXhjZXNzIGJhY2sgYXQgdGhlIGVuZC4gKi8KLSAgICAgICAgbmFsbG9jYXRlZCA9IHNpemUgKiBtYXhfY2hhcl9zaXplOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5hbGxvY2F0ZWQpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgfQorCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUgKiBtYXhfY2hhcl9zaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOykgewogICAgICAgICBQeV9VQ1M0IGNoID0gZGF0YVtpKytdOwpAQCAtMzI2LDcyICszMTAsMTE4IEBACiAgICAgICAgIH0KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgICAgICAgIGVsc2UgaWYgKFB5X1VOSUNPREVfSVNfU1VSUk9HQVRFKGNoKSkgewotICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIGssIHN0YXJ0cG9zOworICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBuZXdwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGs7CisgICAgICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKwogICAgICAgICAgICAgc3RhcnRwb3MgPSBpLTE7Ci0gICAgICAgICAgICByZXAgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKLSAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwgInV0Zi04IiwgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIHN0YXJ0cG9zKzEsICZuZXdwb3MpOwotICAgICAgICAgICAgaWYgKCFyZXApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVuZHBvcyA9IHN0YXJ0cG9zKzE7CiAKLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpCi0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKKyAgICAgICAgICAgIHdoaWxlICgoZW5kcG9zIDwgc2l6ZSkgJiYgUHlfVU5JQ09ERV9JU19TVVJST0dBVEUoZGF0YVtlbmRwb3NdKSkKKyAgICAgICAgICAgICAgICBlbmRwb3MrKzsKIAotICAgICAgICAgICAgaWYgKHJlcHNpemUgPiBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAvKiBPbmx5IG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHdyaXRlICovCisgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gKGVuZHBvcyA8IHNpemUpOwogCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBwIC0gc3RhY2tidWY7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHAsICc/JywgZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIHAgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdGhlIGlnbm9yZSBoYW5kbGVyICovCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGlmIChuYWxsb2NhdGVkID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplICsgbWF4X2NoYXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOgorICAgICAgICAgICAgICAgIGZvciAoaz1zdGFydHBvczsgazxlbmRwb3M7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IGRhdGFba107CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoMHhlMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoY2ggJiAweDNmKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbGxvY2F0ZWQgKz0gcmVwc2l6ZSAtIG1heF9jaGFyX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbmFsbG9jYXRlZCkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5hbGxvY2F0ZWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICBQeV9NRU1DUFkoUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSwgc3RhY2tidWYsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgb2Zmc2V0OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwcmVwID0gUHlCeXRlc19BU19TVFJJTkcocmVwKTsKLSAgICAgICAgICAgICAgICBmb3IoayA9IHJlcHNpemU7IGsgPiAwOyBrLS0pCi0gICAgICAgICAgICAgICAgICAgICpwKysgPSAqcHJlcCsrOwotICAgICAgICAgICAgfSBlbHNlIC8qIHJlcCBpcyB1bmljb2RlICovIHsKLSAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIHJlcGtpbmQ7Ci0gICAgICAgICAgICAgICAgdm9pZCAqcmVwZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gbWF4X2NoYXJfc2l6ZSAqIChlbmRwb3MgLSBzdGFydHBvcyk7CisgICAgICAgICAgICAgICAgcCA9IGJhY2tzbGFzaHJlcGxhY2UoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBzdGFydHBvcywgZW5kcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIHJlcGtpbmQgPSBQeVVuaWNvZGVfS0lORChyZXApOwotICAgICAgICAgICAgICAgIHJlcGRhdGEgPSBQeVVuaWNvZGVfREFUQShyZXApOworICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBmb3Ioaz0wOyBrPHJlcHNpemU7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGMgPSBQeVVuaWNvZGVfUkVBRChyZXBraW5kLCByZXBkYXRhLCBrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDB4ODAgPD0gYykgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSBtYXhfY2hhcl9zaXplICogKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICBwID0geG1sY2hhcnJlZnJlcGxhY2UoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgc3RhcnRwb3MsIGVuZHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChrPXN0YXJ0cG9zOyBrPGVuZHBvczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gZGF0YVtrXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoMHhEQzgwIDw9IGNoICYmIGNoIDw9IDB4RENGRikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKShjaCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoayA+PSBlbmRwb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0cG9zID0gazsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRwb3MgPCBlbmRwb3MpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0aGUgZGVmYXVsdCBoYW5kbGVyICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAorICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLCAidXRmLTgiLCAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIGVuZHBvcywgJm5ld3Bvcyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IG1heF9jaGFyX3NpemU7CisKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocmVwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiByZXAgaXMgdW5pY29kZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHJlcCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShyZXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsICJ1dGYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktMSwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKWM7CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlcCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworICAgICAgICAgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfREFUQShyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKHJlcCk7CisKKyAgICAgICAgICAgICAgICBpID0gbmV3cG9zOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IGkgPT0gc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDIKQEAgLTQxNiwzMSArNDQ2LDE4IEBACiAjZW5kaWYgLyogU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMSAqLwogICAgIH0KIAotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAvKiBUaGlzIHdhcyBzdGFjayBhbGxvY2F0ZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBwIC0gc3RhY2tidWY7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHN0YWNrYnVmLCBubmVlZGVkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEN1dCBiYWNrIHRvIHNpemUgYWN0dWFsbHkgbmVlZGVkLiAqLwotICAgICAgICBubmVlZGVkID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbm5lZWRlZCk7Ci0gICAgfQotCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAjZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CiAKICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgZXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXApOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oCmluZGV4IGNkYTY4ZTcuLjk4MTY1YWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKQEAgLTMyLDUyICszMiw5OCBAQAogI2RlZmluZSBTVFJJTkdMSUJfQkxPT00obWFzaywgY2gpICAgICBcCiAgICAgKChtYXNrICYgICgxVUwgPDwgKChjaCkgJiAoU1RSSU5HTElCX0JMT09NX1dJRFRIIC0xKSkpKSkKIAorUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitTVFJJTkdMSUIoZmluZF9jaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLCBTVFJJTkdMSUJfQ0hBUiBjaCkKK3sKKyAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqcCwgKmU7CisKKyAgICBwID0gczsKKyAgICBlID0gcyArIG47CisgICAgaWYgKG4gPiAxMCkgeworI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAxCisgICAgICAgIHAgPSBtZW1jaHIocywgY2gsIG4pOworICAgICAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgICAgIC8qIHVzZSBtZW1jaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQorICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSBjaCAmIDB4ZmY7CisgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCisgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgorICAgICAgICAgICBhbmQgVUNTNCByZXByZXNlbnRhdGlvbnMuICovCisgICAgICAgIGlmIChuZWVkbGUgIT0gMCkgeworICAgICAgICAgICAgd2hpbGUgKHAgPCBlKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtY2hyKHAsIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgLSBwKSAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHAgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHdoaWxlIChwIDwgZSkgeworICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CiAKIFB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotU1RSSU5HTElCKGZhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiBjaCwgdW5zaWduZWQgY2hhciBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQorU1RSSU5HTElCKHJmaW5kX2NoYXIpKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzLCBQeV9zc2l6ZV90IG4sIFNUUklOR0xJQl9DSEFSIGNoKQogewotICAgIGlmIChtb2RlID09IEZBU1RfU0VBUkNIKSB7Ci0gICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpwdHIgPSBzOwotICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqZSA9IHMgKyBuOwotICAgICAgICB3aGlsZSAocHRyIDwgZSkgewotICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtY2hyKChjb25zdCB2b2lkICopIHB0ciwgbmVlZGxlLCAoZSAtIHB0cikgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBwdHIgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChzaXplb2YoU1RSSU5HTElCX0NIQVIpID09IDEgfHwgKnB0ciA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gKHB0ciAtIHMpOwotICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KLSAgICAgICAgICAgIHB0cisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKnA7CiAjaWZkZWYgSEFWRV9NRU1SQ0hSCiAgICAgLyogbWVtcmNocigpIGlzIGEgR05VIGV4dGVuc2lvbiwgYXZhaWxhYmxlIHNpbmNlIGdsaWJjIDIuMS45MS4KICAgICAgICBpdCBkb2Vzbid0IHNlZW0gYXMgb3B0aW1pemVkIGFzIG1lbWNocigpLCBidXQgaXMgc3RpbGwgcXVpdGUKLSAgICAgICBmYXN0ZXIgdGhhbiBvdXIgaGFuZC13cml0dGVuIGxvb3AgaW4gRkFTVFNFQVJDSCBiZWxvdyAqLwotICAgIGVsc2UgaWYgKG1vZGUgPT0gRkFTVF9SU0VBUkNIKSB7Ci0gICAgICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKmZvdW5kOwotICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtcmNocigoY29uc3Qgdm9pZCAqKSBzLCBuZWVkbGUsIG4gKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBmb3VuZCA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKSBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotICAgICAgICAgICAgbiA9IGZvdW5kIC0gczsKLSAgICAgICAgICAgIGlmIChzaXplb2YoU1RSSU5HTElCX0NIQVIpID09IDEgfHwgKmZvdW5kID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotI2VuZGlmCi0gICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydCgwKTsgLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlICovCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICAgICBmYXN0ZXIgdGhhbiBvdXIgaGFuZC13cml0dGVuIGxvb3AgYmVsb3cgKi8KIAotI3VuZGVmIERPX01FTUNIUgorICAgIGlmIChuID4gMTApIHsKKyNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMQorICAgICAgICBwID0gbWVtcmNocihzLCBjaCwgbik7CisgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICAgICAgLyogdXNlIG1lbXJjaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQorICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSBjaCAmIDB4ZmY7CisgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCisgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgorICAgICAgICAgICBhbmQgVUNTNCByZXByZXNlbnRhdGlvbnMuICovCisgICAgICAgIGlmIChuZWVkbGUgIT0gMCkgeworICAgICAgICAgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqY2FuZGlkYXRlID0gbWVtcmNocihzLCBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcCA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBuID0gcCAtIHM7CisgICAgICAgICAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYgIC8qIEhBVkVfTUVNUkNIUiAqLworICAgIHAgPSBzICsgbjsKKyAgICB3aGlsZSAocCA+IHMpIHsKKyAgICAgICAgcC0tOworICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKQEAgLTk5LDI1ICsxNDUsMTEgQEAKICAgICAgICAgaWYgKG0gPD0gMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgLyogdXNlIHNwZWNpYWwgY2FzZSBmb3IgMS1jaGFyYWN0ZXIgc3RyaW5ncyAqLwotICAgICAgICBpZiAobiA+IDEwICYmIChtb2RlID09IEZBU1RfU0VBUkNICi0jaWZkZWYgSEFWRV9NRU1SQ0hSCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gRkFTVF9SU0VBUkNICi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgKSkgewotICAgICAgICAgICAgLyogdXNlIG1lbWNociBpZiB3ZSBjYW4gY2hvb3NlIGEgbmVlZGxlIHdpdGhvdXQgdHdvIG1hbnkgbGlrZWx5Ci0gICAgICAgICAgICAgICBmYWxzZSBwb3NpdGl2ZXMgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlOwotICAgICAgICAgICAgbmVlZGxlID0gcFswXSAmIDB4ZmY7Ci0jaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgICAgICAgICAgLyogSWYgbG9va2luZyBmb3IgYSBtdWx0aXBsZSBvZiAyNTYsIHdlJ2QgaGF2ZSB0b28KLSAgICAgICAgICAgICAgIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGxvb2tpbmcgZm9yIHRoZSAnXDAnIGJ5dGUgaW4gVUNTMgotICAgICAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLwotICAgICAgICAgICAgaWYgKG5lZWRsZSAhPSAwKQotI2VuZGlmCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQihmYXN0c2VhcmNoX21lbWNocl8xY2hhcikKLSAgICAgICAgICAgICAgICAgICAgICAgKHMsIG4sIHBbMF0sIG5lZWRsZSwgbW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vZGUgPT0gRkFTVF9DT1VOVCkgeworICAgICAgICBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkKKyAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUIoZmluZF9jaGFyKShzLCBuLCBwWzBdKTsKKyAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBGQVNUX1JTRUFSQ0gpCisgICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCKHJmaW5kX2NoYXIpKHMsIG4sIHBbMF0pOworICAgICAgICBlbHNlIHsgIC8qIEZBU1RfQ09VTlQgKi8KICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gcFswXSkgewogICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwpAQCAtMTI1LDE0ICsxNTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heGNvdW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IEZBU1RfU0VBUkNIKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHBbMF0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9IGVsc2UgeyAgICAvKiBGQVNUX1JTRUFSQ0ggKi8KLSAgICAgICAgICAgIGZvciAoaSA9IG4gLSAxOyBpID4gLTE7IGktLSkKLSAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaCBiL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmgKaW5kZXggYWVjMjIxYS4uZDcyZTQ3ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgcmV0dXJuIFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLT5zdHIsIHN0ci0+c3RhcnQsIHN0ci0+ZW5kKTsKIH0KIAotLyogcmV0dXJuIGEgbmV3IHN0cmluZy4gIGlmIHN0ci0+c3RyIGlzIE5VTEwsIHJldHVybiBOb25lICovCisvKiByZXR1cm4gYSBuZXcgc3RyaW5nLiAgaWYgc3RyLT5zdHIgaXMgTlVMTCwgcmV0dXJuIGEgbmV3IGVtcHR5IHN0cmluZyAqLwogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBTdWJTdHJpbmdfbmV3X29iamVjdF9vcl9lbXB0eShTdWJTdHJpbmcgKnN0cikKIHsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RydWN0c2VxLmMgYi9PYmplY3RzL3N0cnVjdHNlcS5jCmluZGV4IDY2NDM0NGIuLmUzMTVjYmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RydWN0c2VxLmMKKysrIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwpAQCAtNCw5ICs0LDkgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotc3RhdGljIGNoYXIgdmlzaWJsZV9sZW5ndGhfa2V5W10gPSAibl9zZXF1ZW5jZV9maWVsZHMiOwotc3RhdGljIGNoYXIgcmVhbF9sZW5ndGhfa2V5W10gPSAibl9maWVsZHMiOwotc3RhdGljIGNoYXIgdW5uYW1lZF9maWVsZHNfa2V5W10gPSAibl91bm5hbWVkX2ZpZWxkcyI7CitzdGF0aWMgY29uc3QgY2hhciB2aXNpYmxlX2xlbmd0aF9rZXlbXSA9ICJuX3NlcXVlbmNlX2ZpZWxkcyI7CitzdGF0aWMgY29uc3QgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7CitzdGF0aWMgY29uc3QgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKIAogLyogRmllbGRzIHdpdGggdGhpcyBuYW1lIGhhdmUgb25seSBhIGZpZWxkIGluZGV4LCBub3QgYSBmaWVsZCBuYW1lLgogICAgVGhleSBhcmUgb25seSBhbGxvd2VkIGZvciBpbmRpY2VzIDwgbl92aXNpYmxlX2ZpZWxkcy4gKi8KQEAgLTE2LDE0ICsxNiwxNCBAQAogX1B5X0lERU5USUZJRVIobl91bm5hbWVkX2ZpZWxkcyk7CiAKICNkZWZpbmUgVklTSUJMRV9TSVpFKG9wKSBQeV9TSVpFKG9wKQotI2RlZmluZSBWSVNJQkxFX1NJWkVfVFAodHApIFB5TG9uZ19Bc0xvbmcoIFwKKyNkZWZpbmUgVklTSUJMRV9TSVpFX1RQKHRwKSBQeUxvbmdfQXNTc2l6ZV90KCBcCiAgICAgICAgICAgICAgICAgICAgICAgX1B5RGljdF9HZXRJdGVtSWQoKHRwKS0+dHBfZGljdCwgJlB5SWRfbl9zZXF1ZW5jZV9maWVsZHMpKQogCi0jZGVmaW5lIFJFQUxfU0laRV9UUCh0cCkgUHlMb25nX0FzTG9uZyggXAorI2RlZmluZSBSRUFMX1NJWkVfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX2ZpZWxkcykpCiAjZGVmaW5lIFJFQUxfU0laRShvcCkgUkVBTF9TSVpFX1RQKFB5X1RZUEUob3ApKQogCi0jZGVmaW5lIFVOTkFNRURfRklFTERTX1RQKHRwKSBQeUxvbmdfQXNMb25nKCBcCisjZGVmaW5lIFVOTkFNRURfRklFTERTX1RQKHRwKSBQeUxvbmdfQXNTc2l6ZV90KCBcCiAgICAgICAgICAgICAgICAgICAgICAgX1B5RGljdF9HZXRJdGVtSWQoKHRwKS0+dHBfZGljdCwgJlB5SWRfbl91bm5hbWVkX2ZpZWxkcykpCiAjZGVmaW5lIFVOTkFNRURfRklFTERTKG9wKSBVTk5BTUVEX0ZJRUxEU19UUChQeV9UWVBFKG9wKSkKIApAQCAtMTY0LDcgKzE2NCw4IEBACiAjZGVmaW5lIFRZUEVfTUFYU0laRSAxMDAKIAogICAgIFB5VHlwZU9iamVjdCAqdHlwID0gUHlfVFlQRShvYmopOwotICAgIGludCBpLCByZW1vdmVsYXN0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHJlbW92ZWxhc3QgPSAwOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGNoYXIgYnVmW1JFUFJfQlVGRkVSX1NJWkVdOwogICAgIGNoYXIgKmVuZG9mYnVmLCAqcGJ1ZiA9IGJ1ZjsKQEAgLTIzNiw4ICsyMzcsNyBAQAogICAgIFB5T2JqZWN0KiB0dXAgPSBOVUxMOwogICAgIFB5T2JqZWN0KiBkaWN0ID0gTlVMTDsKICAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIFB5X3NzaXplX3Qgbl9maWVsZHMsIG5fdmlzaWJsZV9maWVsZHMsIG5fdW5uYW1lZF9maWVsZHM7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkcywgaTsKIAogICAgIG5fZmllbGRzID0gUkVBTF9TSVpFKHNlbGYpOwogICAgIG5fdmlzaWJsZV9maWVsZHMgPSBWSVNJQkxFX1NJWkUoc2VsZik7CkBAIC0zMjUsNyArMzI1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqZGljdDsKICAgICBQeU1lbWJlckRlZiogbWVtYmVyczsKLSAgICBpbnQgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKKyAgICBQeV9zc2l6ZV90IG5fbWVtYmVycywgbl91bm5hbWVkX21lbWJlcnMsIGksIGs7CiAgICAgUHlPYmplY3QgKnY7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCkBAIC0zNzMsOSArMzczLDkgQEAKICAgICBQeV9JTkNSRUYodHlwZSk7CiAKICAgICBkaWN0ID0gdHlwZS0+dHBfZGljdDsKLSNkZWZpbmUgU0VUX0RJQ1RfRlJPTV9JTlQoa2V5LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNFVF9ESUNUX0ZST01fU0laRShrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZykgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVNzaXplX3QodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAodiA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBrZXksIHYpIDwgMCkgeyAgICAgICAgICAgXApAQCAtMzg1LDkgKzM4NSw5IEBACiAgICAgICAgIFB5X0RFQ1JFRih2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSAgICBTRVRfRElDVF9GUk9NX0lOVCh2aXNpYmxlX2xlbmd0aF9rZXksIGRlc2MtPm5faW5fc2VxdWVuY2UpOwotICAgIFNFVF9ESUNUX0ZST01fSU5UKHJlYWxfbGVuZ3RoX2tleSwgbl9tZW1iZXJzKTsKLSAgICBTRVRfRElDVF9GUk9NX0lOVCh1bm5hbWVkX2ZpZWxkc19rZXksIG5fdW5uYW1lZF9tZW1iZXJzKTsKKyAgICBTRVRfRElDVF9GUk9NX1NJWkUodmlzaWJsZV9sZW5ndGhfa2V5LCBkZXNjLT5uX2luX3NlcXVlbmNlKTsKKyAgICBTRVRfRElDVF9GUk9NX1NJWkUocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOworICAgIFNFVF9ESUNUX0ZST01fU0laRSh1bm5hbWVkX2ZpZWxkc19rZXksIG5fdW5uYW1lZF9tZW1iZXJzKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy90dXBsZW9iamVjdC5jIGIvT2JqZWN0cy90dXBsZW9iamVjdC5jCmluZGV4IDdlZmExYTYuLjhlMWIwMGIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdHVwbGVvYmplY3QuYworKysgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKQEAgLTE0OSw3ICsxNDksNiBAQAogaW50CiBQeVR1cGxlX1NldEl0ZW0oUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpuZXdpdGVtKQogewotICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogICAgIFB5T2JqZWN0ICoqcDsKICAgICBpZiAoIVB5VHVwbGVfQ2hlY2sob3ApIHx8IG9wLT5vYl9yZWZjbnQgIT0gMSkgewogICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOwpAQCAtMTYzLDkgKzE2Miw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcCA9ICgoUHlUdXBsZU9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLSAgICBvbGRpdGVtID0gKnA7Ci0gICAgKnAgPSBuZXdpdGVtOwotICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgUHlfU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCBmM2MwYzM4Li43OGVmNmFjIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtNDAxLDcgKzQwMSw2IEBACiBzdGF0aWMgaW50CiB0eXBlX3NldF9uYW1lKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotICAgIFB5SGVhcFR5cGVPYmplY3QqIGV0OwogICAgIGNoYXIgKnRwX25hbWU7CiAgICAgUHlPYmplY3QgKnRtcDsKIApAQCAtNDMwLDE3ICs0MjksOSBAQAogICAgIGlmICh0cF9uYW1lID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QqKXR5cGU7Ci0KLSAgICBQeV9JTkNSRUYodmFsdWUpOwotCi0gICAgLyogV2FpdCB1bnRpbCBldCBpcyBhIHNhbmUgc3RhdGUgYmVmb3JlIFB5X0RFQ1JFRidpbmcgdGhlIG9sZCBldC0+aHRfbmFtZQotICAgICAgIHZhbHVlLiAgKEJ1ZyAjMTY0NDcuKSAgKi8KLSAgICB0bXAgPSBldC0+aHRfbmFtZTsKLSAgICBldC0+aHRfbmFtZSA9IHZhbHVlOwotCiAgICAgdHlwZS0+dHBfbmFtZSA9IHRwX25hbWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9TRVRSRUYoKChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlKS0+aHRfbmFtZSwgdmFsdWUpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC01NjQsNyArNTU1LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKik7CiBQeV9MT0NBTF9JTkxJTkUoaW50KSB0eXBlX2lzX3N1YnR5cGVfYmFzZV9jaGFpbihQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwotc3RhdGljIGludCBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGFkZF9zdWJjbGFzcyhQeVR5cGVPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKIHN0YXRpYyBpbnQgYWRkX2FsbF9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwpAQCAtOTA0LDI1ICs4OTUsMzMgQEAKICNlbmRpZgogCiAgICAgb2JqID0gdHlwZS0+dHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICAvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAotICAgICAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KLSAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCi0gICAgICAgICAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgotICAgICAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAotICAgICAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKLSAgICAgICAgICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKLSAgICAgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50IHJlcyA9IHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICAgICAgb2JqID0gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICBvYmogPSBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdCgoUHlPYmplY3QqKXR5cGUsIG9iaiwgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCisgICAgICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCisgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCisgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgIChrd2RzID09IE5VTEwgfHwKKyAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQorICAgICAgICByZXR1cm4gb2JqOworCisgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKKyAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIG9iajsKKworICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7CisgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgeworICAgICAgICBpbnQgcmVzID0gdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBvYmogPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2JqOwpAQCAtMTQyNyw3ICsxNDI2LDcgQEAKICAgIGFzIGxvb2t1cF9tZXRob2QgdG8gY2FjaGUgdGhlIGludGVybmVkIG5hbWUgc3RyaW5nIG9iamVjdC4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNhbGxfbWV0aG9kKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjaGFyICpmb3JtYXQsIC4uLikKK2NhbGxfbWV0aG9kKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwogICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CkBAIC0xNDYzLDcgKzE0NjIsNyBAQAogLyogQ2xvbmUgb2YgY2FsbF9tZXRob2QoKSB0aGF0IHJldHVybnMgTm90SW1wbGVtZW50ZWQgd2hlbiB0aGUgbG9va3VwIGZhaWxzLiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9tYXliZShQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY2hhciAqZm9ybWF0LCAuLi4pCitjYWxsX21heWJlKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwogICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CkBAIC0yNjgyLDcgKzI2ODEsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc2hvcnQgc2xvdG9mZnNldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzaG9ydCBzbG90b2Zmc2V0c1tdID0gewogICAgIC0xLCAvKiBpbnZhbGlkIHNsb3QgKi8KICNpbmNsdWRlICJ0eXBlc2xvdHMuaW5jIgogfTsKQEAgLTM2MDEsNyArMzYwMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY2hhciogYXR0cikKK2NvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY29uc3QgY2hhciogYXR0cikKIHsKICAgICBQeVR5cGVPYmplY3QgKm5ld2Jhc2UsICpvbGRiYXNlOwogCkBAIC00MTE4LDcgKzQxMTcsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotcmVkdWNlX25ld29iaihQeU9iamVjdCAqb2JqLCBpbnQgcHJvdG8pCityZWR1Y2VfbmV3b2JqKFB5T2JqZWN0ICpvYmopCiB7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqa3dhcmdzID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29weXJlZzsKQEAgLTQxNzEsNyArNDE3MCw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgZWxzZSBpZiAocHJvdG8gPj0gNCkgeworICAgIGVsc2UgewogICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKIAogICAgICAgICBuZXdvYmogPSBfUHlPYmplY3RfR2V0QXR0cklkKGNvcHlyZWcsICZQeUlkX19fbmV3b2JqX2V4X18pOwpAQCAtNDE4OSwxNiArNDE4OCw2IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAibXVzdCB1c2UgcHJvdG9jb2wgNCBvciBncmVhdGVyIHRvIGNvcHkgdGhpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0OyBzaW5jZSBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudHMuIik7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGt3YXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihjb3B5cmVnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAgc3RhdGUgPSBfUHlPYmplY3RfR2V0U3RhdGUob2JqLAogICAgICAgICAgICAgICAgICFoYXNhcmdzICYmICFQeUxpc3RfQ2hlY2sob2JqKSAmJiAhUHlEaWN0X0NoZWNrKG9iaikpOwpAQCAtNDI0NCw3ICs0MjMzLDcgQEAKICAgICBQeU9iamVjdCAqY29weXJlZywgKnJlczsKIAogICAgIGlmIChwcm90byA+PSAyKQotICAgICAgICByZXR1cm4gcmVkdWNlX25ld29iaihzZWxmLCBwcm90byk7CisgICAgICAgIHJldHVybiByZWR1Y2VfbmV3b2JqKHNlbGYpOwogCiAgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CiAgICAgaWYgKCFjb3B5cmVnKQpAQCAtNTM3MSw3ICs1MzYwLDcgQEAKIC8qIEhlbHBlciB0byBjaGVjayBmb3Igb2JqZWN0Ll9fc2V0YXR0cl9fIG9yIF9fZGVsYXR0cl9fIGFwcGxpZWQgdG8gYSB0eXBlLgogICAgVGhpcyBpcyBjYWxsZWQgdGhlIENhcmxvIFZlcnJlIGhhY2sgYWZ0ZXIgaXRzIGRpc2NvdmVyZXIuICovCiBzdGF0aWMgaW50Ci1oYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjaGFyICp3aGF0KQoraGFja2NoZWNrKFB5T2JqZWN0ICpzZWxmLCBzZXRhdHRyb2Z1bmMgZnVuYywgY29uc3QgY2hhciAqd2hhdCkKIHsKICAgICBQeVR5cGVPYmplY3QgKnR5cGUgPSBQeV9UWVBFKHNlbGYpOwogICAgIHdoaWxlICh0eXBlICYmIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKZGlmZiAtLWdpdCBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKaW5kZXggYzk1NzkyOS4uZmI3OWJkOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJ1Y25oYXNoLmgiCiAjaW5jbHVkZSAiYnl0ZXNfbWV0aG9kcy5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9lcS5oIgogCiAjaWZkZWYgTVNfV0lORE9XUwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTE2Miw2ICsxNjMsMTQgQEAKICAgICAgICAgICAgICpfdG8rKyA9ICh0b190eXBlKSAqX2l0ZXIrKzsgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKIC8qIFRoaXMgZGljdGlvbmFyeSBob2xkcyBhbGwgaW50ZXJuZWQgdW5pY29kZSBzdHJpbmdzLiAgTm90ZSB0aGF0IHJlZmVyZW5jZXMKICAgIHRvIHN0cmluZ3MgaW4gdGhpcyBkaWN0aW9uYXJ5IGFyZSAqbm90KiBjb3VudGVkIGluIHRoZSBzdHJpbmcncyBvYl9yZWZjbnQuCiAgICBXaGVuIHRoZSBpbnRlcm5lZCBzdHJpbmcgcmVhY2hlcyBhIHJlZmNudCBvZiAwIHRoZSBzdHJpbmcgZGVhbGxvY2F0aW9uCkBAIC0yNjMsNyArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKIAogLyogU2FtZSBmb3IgbGluZWJyZWFrcyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNjaWlfbGluZWJyZWFrW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc2NpaV9saW5lYnJlYWtbXSA9IHsKICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogLyogICAgICAgICAweDAwMEEsICogTElORSBGRUVEICovCiAvKiAgICAgICAgIDB4MDAwQiwgKiBMSU5FIFRBQlVMQVRJT04gKi8KQEAgLTI5Miw2ICszMDEsMzggQEAKIAogI2luY2x1ZGUgImNsaW5pYy91bmljb2Rlb2JqZWN0LmMuaCIKIAordHlwZWRlZiBlbnVtIHsKKyAgICBfUHlfRVJST1JfVU5LTk9XTj0wLAorICAgIF9QeV9FUlJPUl9TVFJJQ1QsCisgICAgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRSwKKyAgICBfUHlfRVJST1JfUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfSUdOT1JFLAorICAgIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFLAorICAgIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTLAorICAgIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfT1RIRVIKK30gX1B5X2Vycm9yX2hhbmRsZXI7CisKK3N0YXRpYyBfUHlfZXJyb3JfaGFuZGxlcgorZ2V0X2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqZXJyb3JzKQoreworICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVFJJQ1Q7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVlc2NhcGUiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1JFUExBQ0U7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0lHTk9SRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgImJhY2tzbGFzaHJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVwYXNzIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOworICAgIHJldHVybiBfUHlfRVJST1JfT1RIRVI7Cit9CisKIC8qIFRoZSBtYXggdW5pY29kZSB2YWx1ZSBpcyBhbHdheXMgMHgxMEZGRkYgd2hpbGUgdXNpbmcgdGhlIFBFUC0zOTMgQVBJLgogICAgVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBBUEkuICovCiBQeV9VTklDT0RFCkBAIC01MjEsNiArNTYyLDEyOSBAQAogICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Db3B5KHVuaWNvZGUpOwogfQogCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yIGhhbmRsZXIgZm9yIDgtYml0IGVuY29kaW5nczoKKyAgIEFTQ0lJLCBMYXRpbjEsIFVURi04LCBldGMuICovCitzdGF0aWMgY2hhcioKK2JhY2tzbGFzaHJlcGxhY2UoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMHgxMDApCisgICAgICAgICAgICBpbmNyID0gMisyOworICAgICAgICBlbHNlIGlmIChjaCA8IDB4MTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisgICAgICAgICAgICBpbmNyID0gMis4OworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBpbmNyOworICAgIH0KKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAqc3RyKysgPSAnXFwnOworICAgICAgICBpZiAoY2ggPj0gMHgwMDAxMDAwMCkgeworICAgICAgICAgICAgKnN0cisrID0gJ1UnOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjgpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yNCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjIwKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTYpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xMikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjgpJjB4Zl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDApIHsKKyAgICAgICAgICAgICpzdHIrKyA9ICd1JzsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjEyKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+OCkmMHhmXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqc3RyKysgPSAneCc7CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjQpJjB4Zl07CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1tjaCYweGZdOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgInhtbGNoYXJyZWZyZXBsYWNlIiBlcnJvciBoYW5kbGVyIGZvciA4LWJpdCBlbmNvZGluZ3M6CisgICBBU0NJSSwgTGF0aW4xLCBVVEYtOCwgZXRjLiAqLworc3RhdGljIGNoYXIqCit4bWxjaGFycmVmcmVwbGFjZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMTApCisgICAgICAgICAgICBpbmNyID0gMisxKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwKQorICAgICAgICAgICAgaW5jciA9IDIrMisxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCisgICAgICAgICAgICBpbmNyID0gMiszKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0KzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNSsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApCisgICAgICAgICAgICBpbmNyID0gMis2KzE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKyAgICAgICAgICAgIGluY3IgPSAyKzcrMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5jcjsKKyAgICB9CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKIC8qIC0tLSBCbG9vbSBGaWx0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIHN0dWZmIHRvIGltcGxlbWVudCBzaW1wbGUgImJsb29tIGZpbHRlcnMiIGZvciBVbmljb2RlIGNoYXJhY3RlcnMuCkBAIC02NDcsMjcgKzgxMSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwgUHlfVUNTNCBjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIGludCBtb2RlID0gKGRpcmVjdGlvbiA9PSAxKSA/IEZBU1RfU0VBUkNIIDogRkFTVF9SU0VBUkNIOwotCiAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKLSAgICAgICAgewotICAgICAgICAgICAgUHlfVUNTMSBjaDEgPSAoUHlfVUNTMSkgY2g7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX2Zhc3RzZWFyY2goKFB5X1VDUzEgKikgcywgc2l6ZSwgJmNoMSwgMSwgMCwgbW9kZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGlmICgoUHlfVUNTMSkgY2ggIT0gY2gpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfZmluZF9jaGFyKChQeV9VQ1MxICopIHMsIHNpemUsIChQeV9VQ1MxKSBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX3JmaW5kX2NoYXIoKFB5X1VDUzEgKikgcywgc2l6ZSwgKFB5X1VDUzEpIGNoKTsKICAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOgotICAgICAgICB7Ci0gICAgICAgICAgICBQeV9VQ1MyIGNoMiA9IChQeV9VQ1MyKSBjaDsKLSAgICAgICAgICAgIGlmIChjaDIgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfZmFzdHNlYXJjaCgoUHlfVUNTMiAqKSBzLCBzaXplLCAmY2gyLCAxLCAwLCBtb2RlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKChQeV9VQ1MyKSBjaCAhPSBjaCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9maW5kX2NoYXIoKFB5X1VDUzIgKikgcywgc2l6ZSwgKFB5X1VDUzIpIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfcmZpbmRfY2hhcigoUHlfVUNTMiAqKSBzLCBzaXplLCAoUHlfVUNTMikgY2gpOwogICAgIGNhc2UgUHlVbmljb2RlXzRCWVRFX0tJTkQ6Ci0gICAgICAgIHJldHVybiB1Y3M0bGliX2Zhc3RzZWFyY2goKFB5X1VDUzQgKikgcywgc2l6ZSwgJmNoLCAxLCAwLCBtb2RlKTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzNGxpYl9maW5kX2NoYXIoKFB5X1VDUzQgKikgcywgc2l6ZSwgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzNGxpYl9yZmluZF9jaGFyKChQeV9VQ1M0ICopIHMsIHNpemUsIGNoKTsKICAgICBkZWZhdWx0OgogICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTMxNjUsMjQgKzMzMjgsMjIgQEAKIHN0YXRpYyBpbnQKIGxvY2FsZV9lcnJvcl9oYW5kbGVyKGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpzdXJyb2dhdGVlc2NhcGUpCiB7Ci0gICAgaWYgKGVycm9ycyA9PSBOVUxMKSB7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVFJJQ1Q6CiAgICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAwOwogICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKLSAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoc3RyY21wKGVycm9ycywgInN1cnJvZ2F0ZWVzY2FwZSIpID09IDApIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CiAgICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAxOwogICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJvbmx5ICdzdHJpY3QnIGFuZCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVycyAiCisgICAgICAgICAgICAgICAgICAgICAiYXJlIHN1cHBvcnRlZCwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIm9ubHkgJ3N0cmljdCcgYW5kICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXJzICIKLSAgICAgICAgICAgICAgICAgImFyZSBzdXBwb3J0ZWQsIG5vdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgZXJyb3JzKTsKLSAgICByZXR1cm4gLTE7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTM5NzQsNyArNDEzNSw3IEBACiAgICAgUHlfc3NpemVfdCAqZW5kaW5wb3MsIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LCBjb25zdCBjaGFyICoqaW5wdHIsCiAgICAgUHlPYmplY3QgKipvdXRwdXQsIFB5X3NzaXplX3QgKm91dHBvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlPYmplY3QgKnJlc3R1cGxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7CkBAIC00MDgyLDcgKzQyNDMsNyBAQAogICAgIFB5X3NzaXplX3QgKmVuZGlucG9zLCBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwgY29uc3QgY2hhciAqKmlucHRyLAogICAgIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciAvKiBQeU9iamVjdCAqKm91dHB1dCwgUHlfc3NpemVfdCAqb3V0cG9zICovKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeU9iamVjdCAqcmVzdHVwbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsKQEAgLTQ2ODgsOCArNDg0OSw5IEBACiAgICAgUHlfc3NpemVfdCBzdGFydGlucG9zOwogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgY29uc3QgY2hhciAqZXJybXNnID0gIiI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIGlmIChjb25zdW1lZCkKQEAgLTQ3MTQsNiArNDg3Niw3IEBACiAgICAgd2hpbGUgKHMgPCBlbmQpIHsKICAgICAgICAgUHlfVUNTNCBjaDsKICAgICAgICAgaW50IGtpbmQgPSB3cml0ZXIua2luZDsKKwogICAgICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSSh3cml0ZXIuYnVmZmVyKSkKICAgICAgICAgICAgICAgICBjaCA9IGFzY2lpbGliX3V0ZjhfZGVjb2RlKCZzLCBlbmQsIHdyaXRlci5kYXRhLCAmd3JpdGVyLnBvcyk7CkBAIC00NzUyLDI0ICs0OTE1LDU2IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcl93cml0ZXIoCi0gICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKLSAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZW5kLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKLSAgICAgICAgICAgICAgICAmd3JpdGVyKSkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgorICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgMHhmZmZkKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworCisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgmd3JpdGVyLCBQeVVuaWNvZGVfMkJZVEVfS0lORCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIGZvciAoaT1zdGFydGlucG9zOyBpPGVuZGlucG9zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IChQeV9VQ1M0KSh1bnNpZ25lZCBjaGFyKShzdGFydHNbaV0pOworICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoICsgMHhkYzAwKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKKyAgICAgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCisgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogRW5kOgogICAgIGlmIChjb25zdW1lZCkKICAgICAgICAgKmNvbnN1bWVkID0gcyAtIHN0YXJ0czsKIAotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiBvbkVycm9yOgotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwpAQCAtNTg2MCwxMSArNjA1NSwxMCBAQAogUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIHsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgUHlfc3NpemVfdCBleHBhbmRzaXplID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICAvKiBJbml0aWFsIGFsbG9jYXRpb24gaXMgYmFzZWQgb24gdGhlIGxvbmdlc3QtcG9zc2libGUgY2hhcmFjdGVyCiAgICAgICAgZXNjYXBlLgpAQCAtNTg4MCwzNSArNjA3NCwyOCBAQAogICAgIH0KICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSA0OyBicmVhazsKLSAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBleHBhbmRzaXplID0gNjsgYnJlYWs7Ci0gICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDEwOyBicmVhazsKLSAgICB9CiAKLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCi0gICAgaWYgKGxlbiA+IChQWV9TU0laRV9UX01BWCAtIDIgLSAxKSAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCi0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBhbmRzaXplKmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSk7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CiAKICAgICAgICAgLyogRXNjYXBlIGJhY2tzbGFzaGVzICovCiAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTkxNyw2ICs2MTA0LDExIEBACiAgICAgICAgIC8qIE1hcCAyMS1iaXQgY2hhcmFjdGVycyB0byAnXFUwMHh4eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMTAtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdVJzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4MDAwMDAwMEZdOwpAQCAtNTkzMiw2ICs2MTI0LDEwIEBACiAKICAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAyNTYpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4MDAwRl07CkBAIC01OTQyLDIwICs2MTM4LDM3IEBACiAKICAgICAgICAgLyogTWFwIHNwZWNpYWwgd2hpdGVzcGFjZSB0byAnXHQnLCBcbicsICdccicgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3QnOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICduJzsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAncic7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBNYXAgbm9uLXByaW50YWJsZSBVUyBBU0NJSSB0byAnXHhoaCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPCAnICcgfHwgY2ggPj0gMHg3RikgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA0LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAneCc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4MDAwRl07CkBAIC01OTY3LDEwICs2MTgwLDExIEBACiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KIAotICAgIGFzc2VydChwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikgPiAwKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgpAQCAtNjA5OSwxMyArNjMxMywxMiBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIHsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwotICAgIGNoYXIgKnE7Ci0gICAgUHlfc3NpemVfdCBleHBhbmRzaXplLCBwb3M7CisgICAgUHlfc3NpemVfdCBwb3M7CiAgICAgaW50IGtpbmQ7CiAgICAgdm9pZCAqZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmljb2RlKSkgewogICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwpAQCAtNjExMywyOCArNjMyNiwyOSBAQAogICAgIH0KICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwogICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHVuaWNvZGUpOwotICAgIC8qIDQgYnl0ZSBjaGFyYWN0ZXJzIGNhbiB0YWtlIHVwIDEwIGJ5dGVzLCAyIGJ5dGUgY2hhcmFjdGVycyBjYW4gdGFrZSB1cCA2Ci0gICAgICAgYnl0ZXMsIGFuZCAxIGJ5dGUgY2hhcmFjdGVycyA0LiAqLwotICAgIGV4cGFuZHNpemUgPSBraW5kICogMiArIDI7CiAKLSAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyBleHBhbmRzaXplKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIGxlbik7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gcmVwcjsKLQotICAgIHAgPSBxID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCBsZW47IHBvcysrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwogICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7CiAgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworCisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtNjE0OCw2ICs2MzYyLDExIEBACiAgICAgICAgIH0KICAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoID49IDI1NikgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA2LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweGZdOwpAQCAtNjE2MCwxMCArNjM3OSwxMSBAQAogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAKLSAgICBhc3NlcnQocCA+IHEpOwotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcHIsIHAgLSBxKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTYzNDAsNyArNjU2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IGVuZHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CiAgICAgUHlPYmplY3QgKnJlc3VuaWNvZGU7CkBAIC02Mzk0LDI1ICs2NjE0LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9lbmNvZGVfdWNzMShQeU9iamVjdCAqdW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGltaXQpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X1VDUzQgbGltaXQpCiB7CiAgICAgLyogaW5wdXQgc3RhdGUgKi8KICAgICBQeV9zc2l6ZV90IHBvcz0wLCBzaXplOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgLyogb3V0cHV0IG9iamVjdCAqLwotICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgLyogcG9pbnRlciBpbnRvIHRoZSBvdXRwdXQgKi8KICAgICBjaGFyICpzdHI7Ci0gICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KLSAgICBQeV9zc2l6ZV90IHJlc3NpemU7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSAobGltaXQgPT0gMjU2KSA/ICJsYXRpbi0xIiA6ICJhc2NpaSI7CiAgICAgY29uc3QgY2hhciAqcmVhc29uID0gKGxpbWl0ID09IDI1NikgPyAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMjU2KSIgOiAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCi0gICAgICogLTE9bm90IGluaXRpYWxpemVkLCAwPXVua25vd24sIDE9c3RyaWN0LCAyPXJlcGxhY2UsIDM9aWdub3JlLCA0PXhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgaW50IGtub3duX2Vycm9ySGFuZGxlciA9IC0xOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKKyAgICBQeU9iamVjdCAqcmVwID0gTlVMTDsKKyAgICAvKiBvdXRwdXQgb2JqZWN0ICovCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02NDIzLDE4NiArNjY0MCwxNTcgQEAKICAgICAgICByZXBsYWNlbWVudHMsIGlmIHdlIG5lZWQgbW9yZSwgd2UnbGwgcmVzaXplICovCiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7Ci0gICAgcmVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLSAgICBpZiAocmVzID09IE5VTEwpCisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICByZXNzaXplID0gc2l6ZTsKIAogICAgIHdoaWxlIChwb3MgPCBzaXplKSB7Ci0gICAgICAgIFB5X1VDUzQgYyA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CisgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwogCiAgICAgICAgIC8qIGNhbiB3ZSBlbmNvZGUgdGhpcz8gKi8KLSAgICAgICAgaWYgKGM8bGltaXQpIHsKKyAgICAgICAgaWYgKGNoIDwgbGltaXQpIHsKICAgICAgICAgICAgIC8qIG5vIG92ZXJmbG93IGNoZWNrLCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgc3BhY2UgaXMgZW5vdWdoICovCi0gICAgICAgICAgICAqc3RyKysgPSAoY2hhciljOworICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpY2g7CiAgICAgICAgICAgICArK3BvczsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGU7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIG5ld3BvcywgcmVzcG9zLCBpOworICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3MsIGk7CiAgICAgICAgICAgICAvKiBzdGFydHBvcyBmb3IgY29sbGVjdGluZyB1bmVuY29kYWJsZSBjaGFycyAqLwogICAgICAgICAgICAgUHlfc3NpemVfdCBjb2xsc3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBjb2xsc3RhcnQgKyAxOwogICAgICAgICAgICAgLyogZmluZCBhbGwgdW5lY29kYWJsZSBjaGFyYWN0ZXJzICovCisKICAgICAgICAgICAgIHdoaWxlICgoY29sbGVuZCA8IHNpemUpICYmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBjb2xsZW5kKSA+PSBsaW1pdCkpCiAgICAgICAgICAgICAgICAgKytjb2xsZW5kOworCisgICAgICAgICAgICAvKiBPbmx5IG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHdyaXRlICovCisgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gKGNvbGxlbmQgPCBzaXplKTsKKwogICAgICAgICAgICAgLyogY2FjaGUgY2FsbGJhY2sgbmFtZSBsb29rdXAgKGlmIG5vdCBkb25lIHlldCwgaS5lLiBpdCdzIHRoZSBmaXJzdCBlcnJvcikgKi8KLSAgICAgICAgICAgIGlmIChrbm93bl9lcnJvckhhbmRsZXI9PS0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnJvcnM9PU5VTEwpIHx8ICghc3RyY21wKGVycm9ycywgInN0cmljdCIpKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgImlnbm9yZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAzOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gNDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGtub3duX2Vycm9ySGFuZGxlcikgewotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdHJpY3QgKi8KKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQsIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgY2FzZSAyOiAvKiByZXBsYWNlICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbGxzdGFydCsrIDwgY29sbGVuZCkKLSAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gJz8nOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgMzogLyogaWdub3JlICovCisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHN0ciwgJz8nLCBjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgKz0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCBpZ25vcmUgZXJyb3IgaGFuZGxlciAqLworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgogICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSByZXNwb3M7Ci0gICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwotICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGluY3I7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDEwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMSsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzIrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMysxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNCsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzUrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis3KzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBpbmNyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSAoc2l6ZSAtIGNvbGxlbmQpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBzaXplIC0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gcmVzc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA8PSBQWV9TU0laRV9UX01BWC8yICYmIHJlcXVpcmVkc2l6ZSA8IDIqcmVzc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IDIqcmVzc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXF1aXJlZHNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICByZXNzaXplID0gcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHIgKz0gc3ByaW50ZihzdHIsICImIyVkOyIsIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0LCBjb2xsZW5kLCAmbmV3cG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocmVwdW5pY29kZSA9PSBOVUxMIHx8IChQeVVuaWNvZGVfQ2hlY2socmVwdW5pY29kZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRFkocmVwdW5pY29kZSkgPT0gLTEpKQorCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIHN0ciA9IGJhY2tzbGFzaHJlcGxhY2UoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXB1bmljb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RseSBjb3B5IGJ5dGVzIHJlc3VsdCB0byBvdXRwdXQuICovCi0gICAgICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeUJ5dGVzX1NpemUocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXBzaXplID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSByb29tIGZvciBhbGwgYWRkaXRpb25hbCBieXRlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gcmVwc2l6ZSAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgcmVzc2l6ZStyZXBzaXplLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNzaXplICs9IHJlcHNpemUtMTsKKyAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgPSB4bWxjaGFycmVmcmVwbGFjZSgmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDB4ZGM4MCB8fCAweGRjZmYgPCBjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGEgVVRGLThiIHN1cnJvZ2F0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN0ciwgUHlCeXRlc19Bc1N0cmluZyhyZXB1bmljb2RlKSwgcmVwc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciArPSByZXBzaXplOwotICAgICAgICAgICAgICAgICAgICBwb3MgPSBuZXdwb3M7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpKGNoIC0gMHhkYzAwKTsKKyAgICAgICAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID49IGNvbGxlbmQpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgc3BhY2U/IChhdCBsZWFzdCBlbm91Z2ggZm9yIHdoYXQgd2UKLSAgICAgICAgICAgICAgICAgICBoYXZlK3RoZSByZXBsYWNlbWVudCt0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLCBzbwotICAgICAgICAgICAgICAgICAgIHdlIHdvbid0IGhhdmUgdG8gY2hlY2sgc3BhY2UgZm9yIGVuY29kYWJsZSBjaGFyYWN0ZXJzKSAqLwotICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IHJlc3BvczsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSByZXBzaXplOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIChzaXplIC0gY29sbGVuZCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHNpemUgLSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiByZXNzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplIDw9IFBZX1NTSVpFX1RfTUFYLzIgJiYgcmVxdWlyZWRzaXplIDwgMipyZXNzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gMipyZXNzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlcXVpcmVkc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBjb2xsc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGNvbGxzdGFydCAhPSBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsYmFjayB0byBnZW5lcmFsIGVycm9yIGhhbmRsaW5nICovCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVwID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnQsIGNvbGxlbmQsICZuZXdwb3MpOworICAgICAgICAgICAgICAgIGlmIChyZXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAxOworCisgICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RseSBjb3B5IGJ5dGVzIHJlc3VsdCB0byBvdXRwdXQuICovCisgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShyZXApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHVuZW5jb2RhYmxlIGluIHRoZSByZXBsYWNlbWVudAotICAgICAgICAgICAgICAgICAgIGFuZCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgewotICAgICAgICAgICAgICAgICAgICBjID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXB1bmljb2RlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2socmVwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShyZXApIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aDogYWxsIGNoYXJhY3RlcnMgYXJlIHNtYWxsZXIgdGhhbiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGxpbWl0ID49IDEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVwKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0RBVEEocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBzdHIsIHJlcHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdW5lbmNvZGFibGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCBhbmQgY29weSBpdCB0byB0aGUgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXAsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWNoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcyA9IG5ld3BvczsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IHBvcyA9PSBzaXplKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiBSZXNpemUgaWYgd2UgYWxsb2NhdGVkIHRvIG11Y2ggKi8KLSAgICBzaXplID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICBpZiAoc2l6ZSA8IHJlc3NpemUpIHsgLyogSWYgdGhpcyBmYWxscyByZXMgd2lsbCBiZSBOVUxMICovCi0gICAgICAgIGFzc2VydChzaXplID49IDApOwotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHNpemUpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICB9CiAKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIHJldHVybiByZXM7Ci0KLSAgb3ZlcmZsb3c6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKHJlcCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02NjYyLDggKzY4NTAsOSBAQAogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgUHlfc3NpemVfdCBvdXRwb3M7CiAgICAgY29uc3QgY2hhciAqZTsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKIAogICAgIGlmIChzaXplID09IDApCiAgICAgICAgIF9QeV9SRVRVUk5fVU5JQ09ERV9FTVBUWSgpOwpAQCAtNjY5MiwxMiArNjg4MSw0MiBAQAogICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIGMpOwogICAgICAgICAgICAgd3JpdGVyLnBvcysrOwogICAgICAgICAgICAgKytzOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisKKyAgICAgICAgLyogYnl0ZSBvdXRzaXplIHJhbmdlIDB4MDAuLjB4N2Y6IGNhbGwgdGhlIGVycm9yIGhhbmRsZXIgKi8KKworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgeworICAgICAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgorICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAvKiBGYXN0LXBhdGg6IHRoZSBlcnJvciBoYW5kbGVyIG9ubHkgd3JpdGVzIG9uZSBjaGFyYWN0ZXIsCisgICAgICAgICAgICAgICBidXQgd2UgbWF5IHN3aXRjaCB0byBVQ1MyIGF0IHRoZSBmaXJzdCB3cml0ZSAqLworICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoJndyaXRlciwgUHlVbmljb2RlXzJCWVRFX0tJTkQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBraW5kID0gd3JpdGVyLmtpbmQ7CisgICAgICAgICAgICBkYXRhID0gd3JpdGVyLmRhdGE7CisKKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9SRVBMQUNFKQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCAweGZmZmQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCBjICsgMHhkYzAwKTsKKyAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGFydGlucG9zID0gcy1zdGFydHM7CiAgICAgICAgICAgICBlbmRpbnBvcyA9IHN0YXJ0aW5wb3MgKyAxOwogICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKICAgICAgICAgICAgICAgICAgICAgImFzY2lpIiwgIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiLAogICAgICAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZSwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCiAgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQpAQCAtNjcwNiwxMyArNjkyNSwxMyBAQAogICAgICAgICAgICAgZGF0YSA9IHdyaXRlci5kYXRhOwogICAgICAgICB9CiAgICAgfQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiAgIG9uRXJyb3I6CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02NzY3LDcgKzY5ODYsNyBAQAogIyAgZGVmaW5lIFdDX0VSUl9JTlZBTElEX0NIQVJTIDB4MDA4MAogI2VuZGlmCiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIqCiBjb2RlX3BhZ2VfbmFtZShVSU5UIGNvZGVfcGFnZSwgUHlPYmplY3QgKipvYmopCiB7CiAgICAgKm9iaiA9IE5VTEw7CkBAIC02ODc1LDcgKzcwOTQsNyBAQAogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICplbmNvZGluZ19vYmogPSBOVUxMOwotICAgIGNoYXIgKmVuY29kaW5nOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogICAgIERXT1JEIGVycjsKICAgICBpbnQgcmV0ID0gLTE7CiAKQEAgLTcxMTEsNyArNzMzMCw2IEBACiAgICAgQk9PTCB1c2VkRGVmYXVsdENoYXIgPSBGQUxTRTsKICAgICBCT09MICpwdXNlZERlZmF1bHRDaGFyID0gJnVzZWREZWZhdWx0Q2hhcjsKICAgICBpbnQgb3V0c2l6ZTsKLSAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICB3Y2hhcl90ICpwOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBjb25zdCBEV09SRCBmbGFncyA9IGVuY29kZV9jb2RlX3BhZ2VfZmxhZ3MoY29kZV9wYWdlLCBOVUxMKTsKQEAgLTcyMjAsNyArNzQzOCw3IEBACiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX29iaiA9IE5VTEw7Ci0gICAgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAgICAgUHlfc3NpemVfdCBuZXdwb3MsIG5ld291dHNpemU7CiAgICAgUHlPYmplY3QgKnJlcDsKICAgICBpbnQgcmV0ID0gLTE7CkBAIC04MDc4LDcgKzgyOTYsNyBAQAogY2hhcm1hcF9lbmNvZGluZ19lcnJvcigKICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCAqaW5wb3MsIFB5T2JqZWN0ICptYXBwaW5nLAogICAgIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LAotICAgIGludCAqa25vd25fZXJyb3JIYW5kbGVyLCBQeU9iamVjdCAqKmVycm9ySGFuZGxlciwgY29uc3QgY2hhciAqZXJyb3JzLAorICAgIF9QeV9lcnJvcl9oYW5kbGVyICplcnJvcl9oYW5kbGVyLCBQeU9iamVjdCAqKmVycm9yX2hhbmRsZXJfb2JqLCBjb25zdCBjaGFyICplcnJvcnMsCiAgICAgUHlPYmplY3QgKipyZXMsIFB5X3NzaXplX3QgKnJlc3BvcykKIHsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7IC8qIGluaXRpYWxpemUgdG8gcHJldmVudCBnY2Mgd2FybmluZyAqLwpAQCAtODEyNSwyMyArODM0MywxNSBAQAogICAgIH0KICAgICAvKiBjYWNoZSBjYWxsYmFjayBuYW1lIGxvb2t1cAogICAgICAqIChpZiBub3QgZG9uZSB5ZXQsIGkuZS4gaXQncyB0aGUgZmlyc3QgZXJyb3IpICovCi0gICAgaWYgKCprbm93bl9lcnJvckhhbmRsZXI9PS0xKSB7Ci0gICAgICAgIGlmICgoZXJyb3JzPT1OVUxMKSB8fCAoIXN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSkpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMTsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMjsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAzOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInhtbGNoYXJyZWZyZXBsYWNlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDA7Ci0gICAgfQotICAgIHN3aXRjaCAoKmtub3duX2Vycm9ySGFuZGxlcikgewotICAgIGNhc2UgMTogLyogc3RyaWN0ICovCisgICAgaWYgKCplcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAqZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICBzd2l0Y2ggKCplcnJvcl9oYW5kbGVyKSB7CisgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKGV4Y2VwdGlvbk9iamVjdCwgZW5jb2RpbmcsIHVuaWNvZGUsIGNvbGxzdGFydHBvcywgY29sbGVuZHBvcywgcmVhc29uKTsKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGNhc2UgMjogLyogcmVwbGFjZSAqLworCisgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKICAgICAgICAgZm9yIChjb2xscG9zID0gY29sbHN0YXJ0cG9zOyBjb2xscG9zPGNvbGxlbmRwb3M7ICsrY29sbHBvcykgewogICAgICAgICAgICAgeCA9IGNoYXJtYXBlbmNvZGVfb3V0cHV0KCc/JywgbWFwcGluZywgcmVzLCByZXNwb3MpOwogICAgICAgICAgICAgaWYgKHg9PWVuY19FWENFUFRJT04pIHsKQEAgLTgxNTMsMTAgKzgzNjMsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIDM6IC8qIGlnbm9yZSAqLworICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKICAgICAgICAgKmlucG9zID0gY29sbGVuZHBvczsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAvKiB4bWxjaGFycmVmcmVwbGFjZSAqLworCisgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CiAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICh0ZW1wb3JhcmlseSAobWlzKXVzZXMgcCkgKi8KICAgICAgICAgZm9yIChjb2xscG9zID0gY29sbHN0YXJ0cG9zOyBjb2xscG9zIDwgY29sbGVuZHBvczsgKytjb2xscG9zKSB7CiAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyKzI5KzErMV07CkBAIC04MTc0LDggKzgzODUsOSBAQAogICAgICAgICB9CiAgICAgICAgICppbnBvcyA9IGNvbGxlbmRwb3M7CiAgICAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgZXJyb3JIYW5kbGVyLAorICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCBlcnJvcl9oYW5kbGVyX29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCByZWFzb24sIHVuaWNvZGUsIGV4Y2VwdGlvbk9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxzdGFydHBvcywgY29sbGVuZHBvcywgJm5ld3Bvcyk7CiAgICAgICAgIGlmIChyZXB1bmljb2RlID09IE5VTEwpCkBAIC04MjM4LDEyICs4NDUwLDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KICAgICBQeV9zc2l6ZV90IHJlc3BvcyA9IDA7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCi0gICAgICogLTE9bm90IGluaXRpYWxpemVkLCAwPXVua25vd24sIDE9c3RyaWN0LCAyPXJlcGxhY2UsCi0gICAgICogMz1pZ25vcmUsIDQ9eG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICBpbnQga25vd25fZXJyb3JIYW5kbGVyID0gLTE7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogICAgIHZvaWQgKmRhdGE7CiAgICAgaW50IGtpbmQ7CiAKQEAgLTgyNzQsNyArODQ4Myw3IEBACiAgICAgICAgIGlmICh4PT1lbmNfRkFJTEVEKSB7IC8qIHVuZW5jb2RhYmxlIGNoYXJhY3RlciAqLwogICAgICAgICAgICAgaWYgKGNoYXJtYXBfZW5jb2RpbmdfZXJyb3IodW5pY29kZSwgJmlucG9zLCBtYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm93bl9lcnJvckhhbmRsZXIsICZlcnJvckhhbmRsZXIsIGVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9oYW5kbGVyLCAmZXJyb3JfaGFuZGxlcl9vYmosIGVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXMsICZyZXNwb3MpKSB7CiAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgfQpAQCAtODI5MCwxMyArODQ5OSwxMyBAQAogICAgICAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICByZXR1cm4gcmVzOwogCiAgIG9uRXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXMpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTgzNjMsNyArODU3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IGVuZHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO3RyYW5zbGF0aW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjt0cmFuc2xhdGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlfc3NpemVfdCBpX25ld3BvczsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CkBAIC04NjIyLDcgKzg4MzEsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLVB5T2JqZWN0ICoKK3N0YXRpYyBQeU9iamVjdCAqCiBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoUHlPYmplY3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKQEAgLTEwODkzLDYgKzExMTAyLDEyIEBACiB9CiAKIGludAorX1B5VW5pY29kZV9FUShQeU9iamVjdCAqYWEsIFB5T2JqZWN0ICpiYikKK3sKKyAgICByZXR1cm4gdW5pY29kZV9lcShhYSwgYmIpOworfQorCitpbnQKIFB5VW5pY29kZV9Db250YWlucyhQeU9iamVjdCAqY29udGFpbmVyLCBQeU9iamVjdCAqZWxlbWVudCkKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqc3ViOwpAQCAtMTE5NDEsNyArMTIxNTYsNyBAQAogI2RlZmluZSBCT1RIU1RSSVAgMgogCiAvKiBBcnJheXMgaW5kZXhlZCBieSBhYm92ZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnN0cmlwZm9ybWF0W10gPSB7InxPOmxzdHJpcCIsICJ8Tzpyc3RyaXAiLCAifE86c3RyaXAifTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RyaXBmb3JtYXRbXSA9IHsifE86bHN0cmlwIiwgInxPOnJzdHJpcCIsICJ8TzpzdHJpcCJ9OwogCiAjZGVmaW5lIFNUUklQTkFNRShpKSAoc3RyaXBmb3JtYXRbaV0rMykKIApAQCAtMTMyMjUsNDQgKzEzNDQwLDUwIEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIF9QeVVuaWNvZGVXcml0ZXJfVXBkYXRlKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKIHsKLSAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpCisgICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKKyAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7CisKKyAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpIHsKKyAgICAgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogICAgICAgICB3cml0ZXItPnNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcik7CisgICAgfQogICAgIGVsc2UgeworICAgICAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkgd2lsbCBjb3B5IHRoZSBidWZmZXIuICovCisgICAgICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9XQ0hBUl9LSU5EOworICAgICAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKwogICAgICAgICAvKiBDb3B5LW9uLXdyaXRlIG1vZGU6IHNldCBidWZmZXIgc2l6ZSB0byAwIHNvCiAgICAgICAgICAqIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSgpIHdpbGwgY29weSAoYW5kIGVubGFyZ2UpIHRoZSBidWZmZXIgb24KICAgICAgICAgICogbmV4dCB3cml0ZS4gKi8KICAgICAgICAgd3JpdGVyLT5zaXplID0gMDsKICAgICB9Ci0gICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKLSAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7Ci0gICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogfQogCiB2b2lkCiBfUHlVbmljb2RlV3JpdGVyX0luaXQoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQogewogICAgIG1lbXNldCh3cml0ZXIsIDAsIHNpemVvZigqd3JpdGVyKSk7Ci0jaWZkZWYgUHlfREVCVUcKLSAgICB3cml0ZXItPmtpbmQgPSA1OyAgICAvKiBpbnZhbGlkIGtpbmQgKi8KLSNlbmRpZgorCisgICAgLyogQVNDSUkgaXMgdGhlIGJhcmUgbWluaW11bSAqLwogICAgIHdyaXRlci0+bWluX2NoYXIgPSAxMjc7CisKKyAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKSB3aWxsIGNvcHkgdGhlIGJ1ZmZlci4gKi8KKyAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfV0NIQVJfS0lORDsKKyAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKIH0KIAogaW50CiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfVUNTNCBtYXhjaGFyKQogewotI2lmZGVmIE1TX1dJTkRPV1MKLSAgIC8qIE9uIFdpbmRvd3MsIG92ZXJhbGxvY2F0ZSBieSA1MCUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiAyCi0jZWxzZQotICAgLyogT24gTGludXgsIG92ZXJhbGxvY2F0ZSBieSAyNSUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiA0Ci0jZW5kaWYKICAgICBQeV9zc2l6ZV90IG5ld2xlbjsKICAgICBQeU9iamVjdCAqbmV3YnVmZmVyOwogCi0gICAgYXNzZXJ0KGxlbmd0aCA+IDApOworICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUgbWFjcm8gd2FzIHVzZWQgKi8KKyAgICBhc3NlcnQoKG1heGNoYXIgPiB3cml0ZXItPm1heGNoYXIgJiYgbGVuZ3RoID49IDApCisgICAgICAgICAgIHx8IGxlbmd0aCA+IDApOwogCiAgICAgaWYgKGxlbmd0aCA+IFBZX1NTSVpFX1RfTUFYIC0gd3JpdGVyLT5wb3MpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTEzMzI4LDYgKzEzNTQ5LDI4IEBACiAjdW5kZWYgT1ZFUkFMTE9DQVRFX0ZBQ1RPUgogfQogCitpbnQKK19QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kKQoreworICAgIFB5X1VDUzQgbWF4Y2hhcjsKKworICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kIG1hY3JvIHdhcyB1c2VkICovCisgICAgYXNzZXJ0KHdyaXRlci0+a2luZCA8IGtpbmQpOworCisgICAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOiBtYXhjaGFyID0gMHhmZjsgYnJlYWs7CisgICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDogbWF4Y2hhciA9IDB4ZmZmZjsgYnJlYWs7CisgICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogbWF4Y2hhciA9IDB4MTBmZmZmOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiaW52YWxpZCBraW5kIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlSW50ZXJuYWwod3JpdGVyLCAwLCBtYXhjaGFyKTsKK30KKwogUHlfTE9DQUxfSU5MSU5FKGludCkKIF9QeVVuaWNvZGVXcml0ZXJfV3JpdGVDaGFySW5saW5lKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwgUHlfVUNTNCBjaCkKIHsKQEAgLTEzNDk4LDE3ICsxMzc0MSwyNiBAQAogICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSB3cml0ZXItPnBvcyk7CiAgICAgICAgIHJldHVybiBzdHI7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcikgIT0gd3JpdGVyLT5wb3MpIHsKLSAgICAgICAgUHlPYmplY3QgKm5ld2J1ZmZlcjsKLSAgICAgICAgbmV3YnVmZmVyID0gcmVzaXplX2NvbXBhY3Qod3JpdGVyLT5idWZmZXIsIHdyaXRlci0+cG9zKTsKLSAgICAgICAgaWYgKG5ld2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICBpZiAod3JpdGVyLT5wb3MgPT0gMCkgeworICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7CisKKyAgICAgICAgLyogR2V0IHRoZSBlbXB0eSBVbmljb2RlIHN0cmluZyBzaW5nbGV0b24gKCcnKSAqLworICAgICAgICBfUHlfSU5DUkVGX1VOSUNPREVfRU1QVFkoKTsKKyAgICAgICAgc3RyICA9IHVuaWNvZGVfZW1wdHk7CiAgICAgfQotICAgIHN0ciA9IHdyaXRlci0+YnVmZmVyOwotICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgc3RyID0gd3JpdGVyLT5idWZmZXI7CisgICAgICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAhPSB3cml0ZXItPnBvcykgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjI7CisgICAgICAgICAgICBzdHIyID0gcmVzaXplX2NvbXBhY3Qoc3RyLCB3cml0ZXItPnBvcyk7CisgICAgICAgICAgICBpZiAoc3RyMiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc3RyID0gc3RyMjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3koc3RyLCAxKSk7CiAgICAgcmV0dXJuIHVuaWNvZGVfcmVzdWx0X3JlYWR5KHN0cik7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IGQ0ZDUyZTYuLmY0MmZlM2QgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogc3RhdGljIGludAotcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAorcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipvYnAsIFB5T2JqZWN0ICoqY2FsbGJhY2twKQogewogICAgIC8qIFhYWCBTaG91bGQgY2hlY2sgdGhhdCBrd2FyZ3MgPT0gTlVMTCBvciBpcyBlbXB0eS4gKi8KZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKaW5kZXggZjM5YjM4MS4uMTZlZWIzNSAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKQEAgLTcwOSw3ICs3MDksNyBAQAogICogMSBpZiB0aGUgUHl0aG9uLWRsbCBkb2VzIG5vdCBleHBvcnQgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkCiAgKiAyIGlmIG5vIGluc3RhbGwtc2NyaXB0IGlzIHNwZWNpZmllZCBpbiBwYXRobmFtZQogICogMyBpZiB0aGUgaW5zdGFsbC1zY3JpcHQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkCi0gKiB0aGUgcmV0dXJuIHZhbHVlIG9mIFB5UnVuX1NpbXBsZVN0cmluZygpIG90aGVyd2lzZSwKKyAqIHRoZSByZXR1cm4gdmFsdWUgb2YgUHlSdW5fU2ltcGxlU3RyaW5nKCkgb3IgUHlfRmluYWxpemVFeCgpIG90aGVyd2lzZSwKICAqIHdoaWNoIGlzIDAgaWYgZXZlcnl0aGluZyBpcyBvaywgLTEgaWYgYW4gZXhjZXB0aW9uIGhhZCBvY2N1cnJlZAogICogaW4gdGhlIGluc3RhbGwtc2NyaXB0LgogICovCkBAIC03MjIsNyArNzIyLDcgQEAKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlTeXNfU2V0QXJndiwgKGludCwgd2NoYXJfdCAqKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0gICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeV9GaW5hbGl6ZUV4LCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywKICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOwpAQCAtNzMwLDcgKzczMCw3IEBACiAgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CiAKICAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5U3lzX1NldEFyZ3YKLSAgICAgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemUpCisgICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplRXgpCiAgICAgICAgIHJldHVybiAxOwogCiAgICAgaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCkBAIC03NzcsNyArNzc3LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KIAogICAgIGNsb3NlKGZoKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODM5LDExICs4NDEsMTEgQEAKICAgICBpbnQgcmM7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKHdjaGFyX3QgKikpOwotICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlfRmluYWxpemVFeCwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5RXJyX1ByaW50LCAodm9pZCkpOwogCi0gICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUgfHwKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZUV4IHx8CiAgICAgICAgICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5RXJyX1ByaW50KQogICAgICAgICByZXR1cm4gLTE7CiAKQEAgLTg1Myw3ICs4NTUsOSBAQAogICAgIHJjID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7CiAgICAgaWYgKHJjKQogICAgICAgICBQeUVycl9QcmludCgpOwotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CiAgICAgcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9QQy9sYXVuY2hlci5jIGIvUEMvbGF1bmNoZXIuYwppbmRleCBkZWFmMzI1Li5iMzc5YTM4IDEwMDY0NAotLS0gYS9QQy9sYXVuY2hlci5jCisrKyBiL1BDL2xhdW5jaGVyLmMKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBNZXNzYWdlQm94KE5VTEwsIG1lc3NhZ2UsIFRFWFQoIlB5dGhvbiBMYXVuY2hlciBpcyBzb3JyeSB0byBzYXkgLi4uIiksCiAgICAgICAgICAgICAgICBNQl9PSyk7CiAjZW5kaWYKLSAgICBFeGl0UHJvY2VzcyhyYyk7CisgICAgZXhpdChyYyk7CiB9CiAKIC8qCkBAIC02NTIsNyArNjUyLDcgQEAKICAgICBpZiAoIW9rKQogICAgICAgICBlcnJvcihSQ19DUkVBVEVfUFJPQ0VTUywgTCJGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzIik7CiAgICAgZGVidWcoTCJjaGlsZCBwcm9jZXNzIGV4aXQgY29kZTogJWRcbiIsIHJjKTsKLSAgICBFeGl0UHJvY2VzcyhyYyk7CisgICAgZXhpdChyYyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTA4LDcgKzExMDgsNyBAQAogICovCiAgICAgRklMRSAqIGZwOwogICAgIGVycm5vX3QgcmMgPSBfd2ZvcGVuX3MoJmZwLCAqYXJndiwgTCJyYiIpOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW0JVRlNJWkVdOworICAgIGNoYXIgYnVmZmVyW0JVRlNJWkVdOwogICAgIHdjaGFyX3Qgc2hlYmFuZ19saW5lW0JVRlNJWkUgKyAxXTsKICAgICBzaXplX3QgcmVhZDsKICAgICBjaGFyICpwOwpAQCAtMTEzMCw3ICsxMTMwLDggQEAKICAgICAgICAgZmNsb3NlKGZwKTsKIAogICAgICAgICBpZiAoKHJlYWQgPj0gNCkgJiYgKGJ1ZmZlclszXSA9PSAnXG4nKSAmJiAoYnVmZmVyWzJdID09ICdccicpKSB7Ci0gICAgICAgICAgICBpcCA9IGZpbmRfYnlfbWFnaWMoKGJ1ZmZlclsxXSA8PCA4IHwgYnVmZmVyWzBdKSAmIDB4RkZGRik7CisgICAgICAgICAgICBpcCA9IGZpbmRfYnlfbWFnaWMoKCgodW5zaWduZWQgY2hhcilidWZmZXJbMV0pIDw8IDggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcilidWZmZXJbMF0pICYgMHhGRkZGKTsKICAgICAgICAgICAgIGlmIChpcCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZGVidWcoTCJzY3JpcHQgZmlsZSBpcyBjb21waWxlZCBhZ2FpbnN0IFB5dGhvbiAlbHNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaXAtPnZlcnNpb24pOwpAQCAtMTM1Niw2ICsxMzU3LDcgQEAKICAgICB3Y2hhcl90ICogYXZbMl07CiAjZW5kaWYKIAorICAgIHNldHZidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwsIF9JT05CRiwgMCk7CiAgICAgd3AgPSBnZXRfZW52KEwiUFlMQVVOQ0hfREVCVUciKTsKICAgICBpZiAoKHdwICE9IE5VTEwpICYmICgqd3AgIT0gTCdcMCcpKQogICAgICAgICBsb2dfZnAgPSBzdGRlcnI7CmRpZmYgLS1naXQgYS9QQy9tc3ZjcnRtb2R1bGUuYyBiL1BDL21zdmNydG1vZHVsZS5jCmluZGV4IDUyZDQxMDAuLmQ3M2NlNzkgMTAwNjQ0Ci0tLSBhL1BDL21zdmNydG1vZHVsZS5jCisrKyBiL1BDL21zdmNydG1vZHVsZS5jCkBAIC01NDEsNyArNTQxLDYgQEAKICNlbmRpZgogCiAgICAgLyogY29uc3RhbnRzIGZvciB0aGUgY3J0IHZlcnNpb25zICovCi0gICAgKHZvaWQpc3Q7CiAjaWZkZWYgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOCiAgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOKTsKQEAgLTU2Nyw2ICs1NjYsOCBAQAogICAgIHN0ID0gUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDUlRfQVNTRU1CTFlfVkVSU0lPTiIsIHZlcnNpb24pOwogICAgIGlmIChzdCA8IDApIHJldHVybiBOVUxMOwogI2VuZGlmCisgICAgLyogbWFrZSBjb21waWxlciB3YXJuaW5nIHF1aWV0IGlmIHN0IGlzIHVudXNlZCAqLworICAgICh2b2lkKXN0OwogCiAgICAgcmV0dXJuIG07CiB9CmRpZmYgLS1naXQgYS9QQy9weWNvbmZpZy5oIGIvUEMvcHljb25maWcuaAppbmRleCBkNDQxNzNhLi44ODYxMTQ4IDEwMDY0NAotLS0gYS9QQy9weWNvbmZpZy5oCisrKyBiL1BDL3B5Y29uZmlnLmgKQEAgLTMxMiwxMSArMzEyLDExIEBACiAJCQl0aGVpciBNYWtlZmlsZSAob3RoZXIgY29tcGlsZXJzIGFyZSBnZW5lcmFsbHkKIAkJCXRha2VuIGNhcmUgb2YgYnkgZGlzdHV0aWxzLikgKi8KICMJCQlpZiBkZWZpbmVkKF9ERUJVRykKLSMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNV9kLmxpYiIpCisjCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzZfZC5saWIiKQogIwkJCWVsaWYgZGVmaW5lZChQeV9MSU1JVEVEX0FQSSkKICMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zLmxpYiIpCiAjCQkJZWxzZQotIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM1LmxpYiIpCisjCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzYubGliIikKICMJCQllbmRpZiAvKiBfREVCVUcgKi8KICMJCWVuZGlmIC8qIF9NU0NfVkVSICovCiAjCWVuZGlmIC8qIFB5X0JVSUxEX0NPUkUgKi8KZGlmZiAtLWdpdCBhL1BDL3B5dGhvbjMuZGVmIGIvUEMvcHl0aG9uMy5kZWYKaW5kZXggODhjMDc0Mi4uZThkMmQ4YyAxMDA2NDQKLS0tIGEvUEMvcHl0aG9uMy5kZWYKKysrIGIvUEMvcHl0aG9uMy5kZWYKQEAgLTIsNzEyICsyLDcxMyBAQAogOyBJdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcHl0aG9uM2RsbC52Y3hwcm9qCiBMSUJSQVJZCSJweXRob24zIgogRVhQT1JUUwotICBQeUFyZ19QYXJzZT1weXRob24zNS5QeUFyZ19QYXJzZQotICBQeUFyZ19QYXJzZVR1cGxlPXB5dGhvbjM1LlB5QXJnX1BhcnNlVHVwbGUKLSAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM1LlB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcwotICBQeUFyZ19VbnBhY2tUdXBsZT1weXRob24zNS5QeUFyZ19VbnBhY2tUdXBsZQotICBQeUFyZ19WYVBhcnNlPXB5dGhvbjM1LlB5QXJnX1ZhUGFyc2UKLSAgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzUuUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMKLSAgUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzPXB5dGhvbjM1LlB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cwotICBQeUJhc2VPYmplY3RfVHlwZT1weXRob24zNS5QeUJhc2VPYmplY3RfVHlwZSBEQVRBCi0gIFB5Qm9vbF9Gcm9tTG9uZz1weXRob24zNS5QeUJvb2xfRnJvbUxvbmcKLSAgUHlCb29sX1R5cGU9cHl0aG9uMzUuUHlCb29sX1R5cGUgREFUQQotICBQeUJ5dGVBcnJheUl0ZXJfVHlwZT1weXRob24zNS5QeUJ5dGVBcnJheUl0ZXJfVHlwZSBEQVRBCi0gIFB5Qnl0ZUFycmF5X0FzU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0FzU3RyaW5nCi0gIFB5Qnl0ZUFycmF5X0NvbmNhdD1weXRob24zNS5QeUJ5dGVBcnJheV9Db25jYXQKLSAgUHlCeXRlQXJyYXlfRnJvbU9iamVjdD1weXRob24zNS5QeUJ5dGVBcnJheV9Gcm9tT2JqZWN0Ci0gIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZUFycmF5X1Jlc2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9SZXNpemUKLSAgUHlCeXRlQXJyYXlfU2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9TaXplCi0gIFB5Qnl0ZUFycmF5X1R5cGU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfVHlwZSBEQVRBCi0gIFB5Qnl0ZXNJdGVyX1R5cGU9cHl0aG9uMzUuUHlCeXRlc0l0ZXJfVHlwZSBEQVRBCi0gIFB5Qnl0ZXNfQXNTdHJpbmc9cHl0aG9uMzUuUHlCeXRlc19Bc1N0cmluZwotICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVzX0NvbmNhdD1weXRob24zNS5QeUJ5dGVzX0NvbmNhdAotICBQeUJ5dGVzX0NvbmNhdEFuZERlbD1weXRob24zNS5QeUJ5dGVzX0NvbmNhdEFuZERlbAotICBQeUJ5dGVzX0RlY29kZUVzY2FwZT1weXRob24zNS5QeUJ5dGVzX0RlY29kZUVzY2FwZQotICBQeUJ5dGVzX0Zyb21Gb3JtYXQ9cHl0aG9uMzUuUHlCeXRlc19Gcm9tRm9ybWF0Ci0gIFB5Qnl0ZXNfRnJvbUZvcm1hdFY9cHl0aG9uMzUuUHlCeXRlc19Gcm9tRm9ybWF0VgotICBQeUJ5dGVzX0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlCeXRlc19Gcm9tT2JqZWN0Ci0gIFB5Qnl0ZXNfRnJvbVN0cmluZz1weXRob24zNS5QeUJ5dGVzX0Zyb21TdHJpbmcKLSAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZXNfUmVwcj1weXRob24zNS5QeUJ5dGVzX1JlcHIKLSAgUHlCeXRlc19TaXplPXB5dGhvbjM1LlB5Qnl0ZXNfU2l6ZQotICBQeUJ5dGVzX1R5cGU9cHl0aG9uMzUuUHlCeXRlc19UeXBlIERBVEEKLSAgUHlDRnVuY3Rpb25fQ2FsbD1weXRob24zNS5QeUNGdW5jdGlvbl9DYWxsCi0gIFB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzUuUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdAotICBQeUNGdW5jdGlvbl9HZXRGbGFncz1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRGbGFncwotICBQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbj1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRGdW5jdGlvbgotICBQeUNGdW5jdGlvbl9HZXRTZWxmPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldFNlbGYKLSAgUHlDRnVuY3Rpb25fTmV3PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX05ldwotICBQeUNGdW5jdGlvbl9OZXdFeD1weXRob24zNS5QeUNGdW5jdGlvbl9OZXdFeAotICBQeUNGdW5jdGlvbl9UeXBlPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX1R5cGUgREFUQQotICBQeUNhbGxJdGVyX05ldz1weXRob24zNS5QeUNhbGxJdGVyX05ldwotICBQeUNhbGxJdGVyX1R5cGU9cHl0aG9uMzUuUHlDYWxsSXRlcl9UeXBlIERBVEEKLSAgUHlDYWxsYWJsZV9DaGVjaz1weXRob24zNS5QeUNhbGxhYmxlX0NoZWNrCi0gIFB5Q2Fwc3VsZV9HZXRDb250ZXh0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXRDb250ZXh0Ci0gIFB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yCi0gIFB5Q2Fwc3VsZV9HZXROYW1lPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXROYW1lCi0gIFB5Q2Fwc3VsZV9HZXRQb2ludGVyPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXRQb2ludGVyCi0gIFB5Q2Fwc3VsZV9JbXBvcnQ9cHl0aG9uMzUuUHlDYXBzdWxlX0ltcG9ydAotICBQeUNhcHN1bGVfSXNWYWxpZD1weXRob24zNS5QeUNhcHN1bGVfSXNWYWxpZAotICBQeUNhcHN1bGVfTmV3PXB5dGhvbjM1LlB5Q2Fwc3VsZV9OZXcKLSAgUHlDYXBzdWxlX1NldENvbnRleHQ9cHl0aG9uMzUuUHlDYXBzdWxlX1NldENvbnRleHQKLSAgUHlDYXBzdWxlX1NldERlc3RydWN0b3I9cHl0aG9uMzUuUHlDYXBzdWxlX1NldERlc3RydWN0b3IKLSAgUHlDYXBzdWxlX1NldE5hbWU9cHl0aG9uMzUuUHlDYXBzdWxlX1NldE5hbWUKLSAgUHlDYXBzdWxlX1NldFBvaW50ZXI9cHl0aG9uMzUuUHlDYXBzdWxlX1NldFBvaW50ZXIKLSAgUHlDYXBzdWxlX1R5cGU9cHl0aG9uMzUuUHlDYXBzdWxlX1R5cGUgREFUQQotICBQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZT1weXRob24zNS5QeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSBEQVRBCi0gIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnMKLSAgUHlDb2RlY19EZWNvZGU9cHl0aG9uMzUuUHlDb2RlY19EZWNvZGUKLSAgUHlDb2RlY19EZWNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfRGVjb2RlcgotICBQeUNvZGVjX0VuY29kZT1weXRob24zNS5QeUNvZGVjX0VuY29kZQotICBQeUNvZGVjX0VuY29kZXI9cHl0aG9uMzUuUHlDb2RlY19FbmNvZGVyCi0gIFB5Q29kZWNfSWdub3JlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfSWdub3JlRXJyb3JzCi0gIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyCi0gIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyCi0gIFB5Q29kZWNfS25vd25FbmNvZGluZz1weXRob24zNS5QeUNvZGVjX0tub3duRW5jb2RpbmcKLSAgUHlDb2RlY19Mb29rdXBFcnJvcj1weXRob24zNS5QeUNvZGVjX0xvb2t1cEVycm9yCi0gIFB5Q29kZWNfUmVnaXN0ZXI9cHl0aG9uMzUuUHlDb2RlY19SZWdpc3RlcgotICBQeUNvZGVjX1JlZ2lzdGVyRXJyb3I9cHl0aG9uMzUuUHlDb2RlY19SZWdpc3RlckVycm9yCi0gIFB5Q29kZWNfUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX1JlcGxhY2VFcnJvcnMKLSAgUHlDb2RlY19TdHJlYW1SZWFkZXI9cHl0aG9uMzUuUHlDb2RlY19TdHJlYW1SZWFkZXIKLSAgUHlDb2RlY19TdHJlYW1Xcml0ZXI9cHl0aG9uMzUuUHlDb2RlY19TdHJlYW1Xcml0ZXIKLSAgUHlDb2RlY19TdHJpY3RFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19TdHJpY3RFcnJvcnMKLSAgUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzCi0gIFB5Q29tcGxleF9Gcm9tRG91Ymxlcz1weXRob24zNS5QeUNvbXBsZXhfRnJvbURvdWJsZXMKLSAgUHlDb21wbGV4X0ltYWdBc0RvdWJsZT1weXRob24zNS5QeUNvbXBsZXhfSW1hZ0FzRG91YmxlCi0gIFB5Q29tcGxleF9SZWFsQXNEb3VibGU9cHl0aG9uMzUuUHlDb21wbGV4X1JlYWxBc0RvdWJsZQotICBQeUNvbXBsZXhfVHlwZT1weXRob24zNS5QeUNvbXBsZXhfVHlwZSBEQVRBCi0gIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q9cHl0aG9uMzUuUHlEZXNjcl9OZXdDbGFzc01ldGhvZAotICBQeURlc2NyX05ld0dldFNldD1weXRob24zNS5QeURlc2NyX05ld0dldFNldAotICBQeURlc2NyX05ld01lbWJlcj1weXRob24zNS5QeURlc2NyX05ld01lbWJlcgotICBQeURlc2NyX05ld01ldGhvZD1weXRob24zNS5QeURlc2NyX05ld01ldGhvZAotICBQeURpY3RJdGVtc19UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZW1zX1R5cGUgREFUQQotICBQeURpY3RJdGVySXRlbV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJJdGVtX1R5cGUgREFUQQotICBQeURpY3RJdGVyS2V5X1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlcktleV9UeXBlIERBVEEKLSAgUHlEaWN0SXRlclZhbHVlX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlclZhbHVlX1R5cGUgREFUQQotICBQeURpY3RLZXlzX1R5cGU9cHl0aG9uMzUuUHlEaWN0S2V5c19UeXBlIERBVEEKLSAgUHlEaWN0UHJveHlfTmV3PXB5dGhvbjM1LlB5RGljdFByb3h5X05ldwotICBQeURpY3RQcm94eV9UeXBlPXB5dGhvbjM1LlB5RGljdFByb3h5X1R5cGUgREFUQQotICBQeURpY3RWYWx1ZXNfVHlwZT1weXRob24zNS5QeURpY3RWYWx1ZXNfVHlwZSBEQVRBCi0gIFB5RGljdF9DbGVhcj1weXRob24zNS5QeURpY3RfQ2xlYXIKLSAgUHlEaWN0X0NvbnRhaW5zPXB5dGhvbjM1LlB5RGljdF9Db250YWlucwotICBQeURpY3RfQ29weT1weXRob24zNS5QeURpY3RfQ29weQotICBQeURpY3RfRGVsSXRlbT1weXRob24zNS5QeURpY3RfRGVsSXRlbQotICBQeURpY3RfRGVsSXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfRGVsSXRlbVN0cmluZwotICBQeURpY3RfR2V0SXRlbT1weXRob24zNS5QeURpY3RfR2V0SXRlbQotICBQeURpY3RfR2V0SXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfR2V0SXRlbVN0cmluZwotICBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcj1weXRob24zNS5QeURpY3RfR2V0SXRlbVdpdGhFcnJvcgotICBQeURpY3RfSXRlbXM9cHl0aG9uMzUuUHlEaWN0X0l0ZW1zCi0gIFB5RGljdF9LZXlzPXB5dGhvbjM1LlB5RGljdF9LZXlzCi0gIFB5RGljdF9NZXJnZT1weXRob24zNS5QeURpY3RfTWVyZ2UKLSAgUHlEaWN0X01lcmdlRnJvbVNlcTI9cHl0aG9uMzUuUHlEaWN0X01lcmdlRnJvbVNlcTIKLSAgUHlEaWN0X05ldz1weXRob24zNS5QeURpY3RfTmV3Ci0gIFB5RGljdF9OZXh0PXB5dGhvbjM1LlB5RGljdF9OZXh0Ci0gIFB5RGljdF9TZXRJdGVtPXB5dGhvbjM1LlB5RGljdF9TZXRJdGVtCi0gIFB5RGljdF9TZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9TZXRJdGVtU3RyaW5nCi0gIFB5RGljdF9TaXplPXB5dGhvbjM1LlB5RGljdF9TaXplCi0gIFB5RGljdF9UeXBlPXB5dGhvbjM1LlB5RGljdF9UeXBlIERBVEEKLSAgUHlEaWN0X1VwZGF0ZT1weXRob24zNS5QeURpY3RfVXBkYXRlCi0gIFB5RGljdF9WYWx1ZXM9cHl0aG9uMzUuUHlEaWN0X1ZhbHVlcwotICBQeUVsbGlwc2lzX1R5cGU9cHl0aG9uMzUuUHlFbGxpcHNpc19UeXBlIERBVEEKLSAgUHlFbnVtX1R5cGU9cHl0aG9uMzUuUHlFbnVtX1R5cGUgREFUQQotICBQeUVycl9CYWRBcmd1bWVudD1weXRob24zNS5QeUVycl9CYWRBcmd1bWVudAotICBQeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzUuUHlFcnJfQmFkSW50ZXJuYWxDYWxsCi0gIFB5RXJyX0NoZWNrU2lnbmFscz1weXRob24zNS5QeUVycl9DaGVja1NpZ25hbHMKLSAgUHlFcnJfQ2xlYXI9cHl0aG9uMzUuUHlFcnJfQ2xlYXIKLSAgUHlFcnJfRGlzcGxheT1weXRob24zNS5QeUVycl9EaXNwbGF5Ci0gIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzUuUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcwotICBQeUVycl9GZXRjaD1weXRob24zNS5QeUVycl9GZXRjaAotICBQeUVycl9Gb3JtYXQ9cHl0aG9uMzUuUHlFcnJfRm9ybWF0Ci0gIFB5RXJyX0Zvcm1hdFY9cHl0aG9uMzUuUHlFcnJfRm9ybWF0VgotICBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzUuUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzCi0gIFB5RXJyX05ld0V4Y2VwdGlvbj1weXRob24zNS5QeUVycl9OZXdFeGNlcHRpb24KLSAgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYz1weXRob24zNS5QeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jCi0gIFB5RXJyX05vTWVtb3J5PXB5dGhvbjM1LlB5RXJyX05vTWVtb3J5Ci0gIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbj1weXRob24zNS5QeUVycl9Ob3JtYWxpemVFeGNlcHRpb24KLSAgUHlFcnJfT2NjdXJyZWQ9cHl0aG9uMzUuUHlFcnJfT2NjdXJyZWQKLSAgUHlFcnJfUHJpbnQ9cHl0aG9uMzUuUHlFcnJfUHJpbnQKLSAgUHlFcnJfUHJpbnRFeD1weXRob24zNS5QeUVycl9QcmludEV4Ci0gIFB5RXJyX1Byb2dyYW1UZXh0PXB5dGhvbjM1LlB5RXJyX1Byb2dyYW1UZXh0Ci0gIFB5RXJyX1Jlc3RvcmU9cHl0aG9uMzUuUHlFcnJfUmVzdG9yZQotICBQeUVycl9TZXRGcm9tRXJybm89cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vCi0gIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZT1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUKLSAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdAotICBQeUVycl9TZXRJbnRlcnJ1cHQ9cHl0aG9uMzUuUHlFcnJfU2V0SW50ZXJydXB0Ci0gIFB5RXJyX1NldE5vbmU9cHl0aG9uMzUuUHlFcnJfU2V0Tm9uZQotICBQeUVycl9TZXRPYmplY3Q9cHl0aG9uMzUuUHlFcnJfU2V0T2JqZWN0Ci0gIFB5RXJyX1NldFN0cmluZz1weXRob24zNS5QeUVycl9TZXRTdHJpbmcKLSAgUHlFcnJfU3ludGF4TG9jYXRpb249cHl0aG9uMzUuUHlFcnJfU3ludGF4TG9jYXRpb24KLSAgUHlFcnJfV2FybkV4PXB5dGhvbjM1LlB5RXJyX1dhcm5FeAotICBQeUVycl9XYXJuRXhwbGljaXQ9cHl0aG9uMzUuUHlFcnJfV2FybkV4cGxpY2l0Ci0gIFB5RXJyX1dhcm5Gb3JtYXQ9cHl0aG9uMzUuUHlFcnJfV2FybkZvcm1hdAotICBQeUVycl9Xcml0ZVVucmFpc2FibGU9cHl0aG9uMzUuUHlFcnJfV3JpdGVVbnJhaXNhYmxlCi0gIFB5RXZhbF9BY3F1aXJlTG9jaz1weXRob24zNS5QeUV2YWxfQWNxdWlyZUxvY2sKLSAgUHlFdmFsX0FjcXVpcmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX0FjcXVpcmVUaHJlYWQKLSAgUHlFdmFsX0NhbGxGdW5jdGlvbj1weXRob24zNS5QeUV2YWxfQ2FsbEZ1bmN0aW9uCi0gIFB5RXZhbF9DYWxsTWV0aG9kPXB5dGhvbjM1LlB5RXZhbF9DYWxsTWV0aG9kCi0gIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzPXB5dGhvbjM1LlB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzCi0gIFB5RXZhbF9FdmFsQ29kZT1weXRob24zNS5QeUV2YWxfRXZhbENvZGUKLSAgUHlFdmFsX0V2YWxDb2RlRXg9cHl0aG9uMzUuUHlFdmFsX0V2YWxDb2RlRXgKLSAgUHlFdmFsX0V2YWxGcmFtZT1weXRob24zNS5QeUV2YWxfRXZhbEZyYW1lCi0gIFB5RXZhbF9FdmFsRnJhbWVFeD1weXRob24zNS5QeUV2YWxfRXZhbEZyYW1lRXgKLSAgUHlFdmFsX0dldEJ1aWx0aW5zPXB5dGhvbjM1LlB5RXZhbF9HZXRCdWlsdGlucwotICBQeUV2YWxfR2V0Q2FsbFN0YXRzPXB5dGhvbjM1LlB5RXZhbF9HZXRDYWxsU3RhdHMKLSAgUHlFdmFsX0dldEZyYW1lPXB5dGhvbjM1LlB5RXZhbF9HZXRGcmFtZQotICBQeUV2YWxfR2V0RnVuY0Rlc2M9cHl0aG9uMzUuUHlFdmFsX0dldEZ1bmNEZXNjCi0gIFB5RXZhbF9HZXRGdW5jTmFtZT1weXRob24zNS5QeUV2YWxfR2V0RnVuY05hbWUKLSAgUHlFdmFsX0dldEdsb2JhbHM9cHl0aG9uMzUuUHlFdmFsX0dldEdsb2JhbHMKLSAgUHlFdmFsX0dldExvY2Fscz1weXRob24zNS5QeUV2YWxfR2V0TG9jYWxzCi0gIFB5RXZhbF9Jbml0VGhyZWFkcz1weXRob24zNS5QeUV2YWxfSW5pdFRocmVhZHMKLSAgUHlFdmFsX1JlSW5pdFRocmVhZHM9cHl0aG9uMzUuUHlFdmFsX1JlSW5pdFRocmVhZHMKLSAgUHlFdmFsX1JlbGVhc2VMb2NrPXB5dGhvbjM1LlB5RXZhbF9SZWxlYXNlTG9jawotICBQeUV2YWxfUmVsZWFzZVRocmVhZD1weXRob24zNS5QeUV2YWxfUmVsZWFzZVRocmVhZAotICBQeUV2YWxfUmVzdG9yZVRocmVhZD1weXRob24zNS5QeUV2YWxfUmVzdG9yZVRocmVhZAotICBQeUV2YWxfU2F2ZVRocmVhZD1weXRob24zNS5QeUV2YWxfU2F2ZVRocmVhZAotICBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkPXB5dGhvbjM1LlB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQKLSAgUHlFeGNfQXJpdGhtZXRpY0Vycm9yPXB5dGhvbjM1LlB5RXhjX0FyaXRobWV0aWNFcnJvciBEQVRBCi0gIFB5RXhjX0Fzc2VydGlvbkVycm9yPXB5dGhvbjM1LlB5RXhjX0Fzc2VydGlvbkVycm9yIERBVEEKLSAgUHlFeGNfQXR0cmlidXRlRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXR0cmlidXRlRXJyb3IgREFUQQotICBQeUV4Y19CYXNlRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXhjX0Jhc2VFeGNlcHRpb24gREFUQQotICBQeUV4Y19CdWZmZXJFcnJvcj1weXRob24zNS5QeUV4Y19CdWZmZXJFcnJvciBEQVRBCi0gIFB5RXhjX0J5dGVzV2FybmluZz1weXRob24zNS5QeUV4Y19CeXRlc1dhcm5pbmcgREFUQQotICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKLSAgUHlFeGNfRU9GRXJyb3I9cHl0aG9uMzUuUHlFeGNfRU9GRXJyb3IgREFUQQotICBQeUV4Y19FbnZpcm9ubWVudEVycm9yPXB5dGhvbjM1LlB5RXhjX0Vudmlyb25tZW50RXJyb3IgREFUQQotICBQeUV4Y19FeGNlcHRpb249cHl0aG9uMzUuUHlFeGNfRXhjZXB0aW9uIERBVEEKLSAgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yPXB5dGhvbjM1LlB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvciBEQVRBCi0gIFB5RXhjX0Z1dHVyZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfRnV0dXJlV2FybmluZyBEQVRBCi0gIFB5RXhjX0dlbmVyYXRvckV4aXQ9cHl0aG9uMzUuUHlFeGNfR2VuZXJhdG9yRXhpdCBEQVRBCi0gIFB5RXhjX0lPRXJyb3I9cHl0aG9uMzUuUHlFeGNfSU9FcnJvciBEQVRBCi0gIFB5RXhjX0ltcG9ydEVycm9yPXB5dGhvbjM1LlB5RXhjX0ltcG9ydEVycm9yIERBVEEKLSAgUHlFeGNfSW1wb3J0V2FybmluZz1weXRob24zNS5QeUV4Y19JbXBvcnRXYXJuaW5nIERBVEEKLSAgUHlFeGNfSW5kZW50YXRpb25FcnJvcj1weXRob24zNS5QeUV4Y19JbmRlbnRhdGlvbkVycm9yIERBVEEKLSAgUHlFeGNfSW5kZXhFcnJvcj1weXRob24zNS5QeUV4Y19JbmRleEVycm9yIERBVEEKLSAgUHlFeGNfS2V5RXJyb3I9cHl0aG9uMzUuUHlFeGNfS2V5RXJyb3IgREFUQQotICBQeUV4Y19LZXlib2FyZEludGVycnVwdD1weXRob24zNS5QeUV4Y19LZXlib2FyZEludGVycnVwdCBEQVRBCi0gIFB5RXhjX0xvb2t1cEVycm9yPXB5dGhvbjM1LlB5RXhjX0xvb2t1cEVycm9yIERBVEEKLSAgUHlFeGNfTWVtb3J5RXJyb3I9cHl0aG9uMzUuUHlFeGNfTWVtb3J5RXJyb3IgREFUQQotICBQeUV4Y19NZW1vcnlFcnJvckluc3Q9cHl0aG9uMzUuUHlFeGNfTWVtb3J5RXJyb3JJbnN0IERBVEEKLSAgUHlFeGNfTmFtZUVycm9yPXB5dGhvbjM1LlB5RXhjX05hbWVFcnJvciBEQVRBCi0gIFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I9cHl0aG9uMzUuUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciBEQVRBCi0gIFB5RXhjX09TRXJyb3I9cHl0aG9uMzUuUHlFeGNfT1NFcnJvciBEQVRBCi0gIFB5RXhjX092ZXJmbG93RXJyb3I9cHl0aG9uMzUuUHlFeGNfT3ZlcmZsb3dFcnJvciBEQVRBCi0gIFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCi0gIFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdD1weXRob24zNS5QeUV4Y19SZWN1cnNpb25FcnJvckluc3QgREFUQQotICBQeUV4Y19SZWZlcmVuY2VFcnJvcj1weXRob24zNS5QeUV4Y19SZWZlcmVuY2VFcnJvciBEQVRBCi0gIFB5RXhjX1J1bnRpbWVFcnJvcj1weXRob24zNS5QeUV4Y19SdW50aW1lRXJyb3IgREFUQQotICBQeUV4Y19SdW50aW1lV2FybmluZz1weXRob24zNS5QeUV4Y19SdW50aW1lV2FybmluZyBEQVRBCi0gIFB5RXhjX1N0b3BJdGVyYXRpb249cHl0aG9uMzUuUHlFeGNfU3RvcEl0ZXJhdGlvbiBEQVRBCi0gIFB5RXhjX1N5bnRheEVycm9yPXB5dGhvbjM1LlB5RXhjX1N5bnRheEVycm9yIERBVEEKLSAgUHlFeGNfU3ludGF4V2FybmluZz1weXRob24zNS5QeUV4Y19TeW50YXhXYXJuaW5nIERBVEEKLSAgUHlFeGNfU3lzdGVtRXJyb3I9cHl0aG9uMzUuUHlFeGNfU3lzdGVtRXJyb3IgREFUQQotICBQeUV4Y19TeXN0ZW1FeGl0PXB5dGhvbjM1LlB5RXhjX1N5c3RlbUV4aXQgREFUQQotICBQeUV4Y19UYWJFcnJvcj1weXRob24zNS5QeUV4Y19UYWJFcnJvciBEQVRBCi0gIFB5RXhjX1R5cGVFcnJvcj1weXRob24zNS5QeUV4Y19UeXBlRXJyb3IgREFUQQotICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvcj1weXRob24zNS5QeUV4Y19VbmJvdW5kTG9jYWxFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlV2FybmluZz1weXRob24zNS5QeUV4Y19Vbmljb2RlV2FybmluZyBEQVRBCi0gIFB5RXhjX1VzZXJXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1VzZXJXYXJuaW5nIERBVEEKLSAgUHlFeGNfVmFsdWVFcnJvcj1weXRob24zNS5QeUV4Y19WYWx1ZUVycm9yIERBVEEKLSAgUHlFeGNfV2FybmluZz1weXRob24zNS5QeUV4Y19XYXJuaW5nIERBVEEKLSAgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IgREFUQQotICBQeUV4Y2VwdGlvbl9HZXRDYXVzZT1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRDYXVzZQotICBQeUV4Y2VwdGlvbl9HZXRDb250ZXh0PXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldENvbnRleHQKLSAgUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrPXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldFRyYWNlYmFjawotICBQeUV4Y2VwdGlvbl9TZXRDYXVzZT1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRDYXVzZQotICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0PXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldENvbnRleHQKLSAgUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrPXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldFRyYWNlYmFjawotICBQeUZpbGVfRnJvbUZkPXB5dGhvbjM1LlB5RmlsZV9Gcm9tRmQKLSAgUHlGaWxlX0dldExpbmU9cHl0aG9uMzUuUHlGaWxlX0dldExpbmUKLSAgUHlGaWxlX1dyaXRlT2JqZWN0PXB5dGhvbjM1LlB5RmlsZV9Xcml0ZU9iamVjdAotICBQeUZpbGVfV3JpdGVTdHJpbmc9cHl0aG9uMzUuUHlGaWxlX1dyaXRlU3RyaW5nCi0gIFB5RmlsdGVyX1R5cGU9cHl0aG9uMzUuUHlGaWx0ZXJfVHlwZSBEQVRBCi0gIFB5RmxvYXRfQXNEb3VibGU9cHl0aG9uMzUuUHlGbG9hdF9Bc0RvdWJsZQotICBQeUZsb2F0X0Zyb21Eb3VibGU9cHl0aG9uMzUuUHlGbG9hdF9Gcm9tRG91YmxlCi0gIFB5RmxvYXRfRnJvbVN0cmluZz1weXRob24zNS5QeUZsb2F0X0Zyb21TdHJpbmcKLSAgUHlGbG9hdF9HZXRJbmZvPXB5dGhvbjM1LlB5RmxvYXRfR2V0SW5mbwotICBQeUZsb2F0X0dldE1heD1weXRob24zNS5QeUZsb2F0X0dldE1heAotICBQeUZsb2F0X0dldE1pbj1weXRob24zNS5QeUZsb2F0X0dldE1pbgotICBQeUZsb2F0X1R5cGU9cHl0aG9uMzUuUHlGbG9hdF9UeXBlIERBVEEKLSAgUHlGcm96ZW5TZXRfTmV3PXB5dGhvbjM1LlB5RnJvemVuU2V0X05ldwotICBQeUZyb3plblNldF9UeXBlPXB5dGhvbjM1LlB5RnJvemVuU2V0X1R5cGUgREFUQQotICBQeUdDX0NvbGxlY3Q9cHl0aG9uMzUuUHlHQ19Db2xsZWN0Ci0gIFB5R0lMU3RhdGVfRW5zdXJlPXB5dGhvbjM1LlB5R0lMU3RhdGVfRW5zdXJlCi0gIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlPXB5dGhvbjM1LlB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlCi0gIFB5R0lMU3RhdGVfUmVsZWFzZT1weXRob24zNS5QeUdJTFN0YXRlX1JlbGVhc2UKLSAgUHlHZXRTZXREZXNjcl9UeXBlPXB5dGhvbjM1LlB5R2V0U2V0RGVzY3JfVHlwZSBEQVRBCi0gIFB5SW1wb3J0X0FkZE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9BZGRNb2R1bGUKLSAgUHlJbXBvcnRfQXBwZW5kSW5pdHRhYj1weXRob24zNS5QeUltcG9ydF9BcHBlbmRJbml0dGFiCi0gIFB5SW1wb3J0X0NsZWFudXA9cHl0aG9uMzUuUHlJbXBvcnRfQ2xlYW51cAotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZT1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZQotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4PXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzPXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcwotICBQeUltcG9ydF9HZXRJbXBvcnRlcj1weXRob24zNS5QeUltcG9ydF9HZXRJbXBvcnRlcgotICBQeUltcG9ydF9HZXRNYWdpY051bWJlcj1weXRob24zNS5QeUltcG9ydF9HZXRNYWdpY051bWJlcgotICBQeUltcG9ydF9HZXRNYWdpY1RhZz1weXRob24zNS5QeUltcG9ydF9HZXRNYWdpY1RhZwotICBQeUltcG9ydF9HZXRNb2R1bGVEaWN0PXB5dGhvbjM1LlB5SW1wb3J0X0dldE1vZHVsZURpY3QKLSAgUHlJbXBvcnRfSW1wb3J0PXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydAotICBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGUKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWw9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaz1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrCi0gIFB5SW1wb3J0X1JlbG9hZE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9SZWxvYWRNb2R1bGUKLSAgUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyPXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcgotICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlPXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUKLSAgUHlJbnRlcnByZXRlclN0YXRlX05ldz1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfTmV3Ci0gIFB5SXRlcl9OZXh0PXB5dGhvbjM1LlB5SXRlcl9OZXh0Ci0gIFB5TGlzdEl0ZXJfVHlwZT1weXRob24zNS5QeUxpc3RJdGVyX1R5cGUgREFUQQotICBQeUxpc3RSZXZJdGVyX1R5cGU9cHl0aG9uMzUuUHlMaXN0UmV2SXRlcl9UeXBlIERBVEEKLSAgUHlMaXN0X0FwcGVuZD1weXRob24zNS5QeUxpc3RfQXBwZW5kCi0gIFB5TGlzdF9Bc1R1cGxlPXB5dGhvbjM1LlB5TGlzdF9Bc1R1cGxlCi0gIFB5TGlzdF9HZXRJdGVtPXB5dGhvbjM1LlB5TGlzdF9HZXRJdGVtCi0gIFB5TGlzdF9HZXRTbGljZT1weXRob24zNS5QeUxpc3RfR2V0U2xpY2UKLSAgUHlMaXN0X0luc2VydD1weXRob24zNS5QeUxpc3RfSW5zZXJ0Ci0gIFB5TGlzdF9OZXc9cHl0aG9uMzUuUHlMaXN0X05ldwotICBQeUxpc3RfUmV2ZXJzZT1weXRob24zNS5QeUxpc3RfUmV2ZXJzZQotICBQeUxpc3RfU2V0SXRlbT1weXRob24zNS5QeUxpc3RfU2V0SXRlbQotICBQeUxpc3RfU2V0U2xpY2U9cHl0aG9uMzUuUHlMaXN0X1NldFNsaWNlCi0gIFB5TGlzdF9TaXplPXB5dGhvbjM1LlB5TGlzdF9TaXplCi0gIFB5TGlzdF9Tb3J0PXB5dGhvbjM1LlB5TGlzdF9Tb3J0Ci0gIFB5TGlzdF9UeXBlPXB5dGhvbjM1LlB5TGlzdF9UeXBlIERBVEEKLSAgUHlMb25nUmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzUuUHlMb25nUmFuZ2VJdGVyX1R5cGUgREFUQQotICBQeUxvbmdfQXNEb3VibGU9cHl0aG9uMzUuUHlMb25nX0FzRG91YmxlCi0gIFB5TG9uZ19Bc0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzTG9uZwotICBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93Ci0gIFB5TG9uZ19Bc0xvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdMb25nCi0gIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdwotICBQeUxvbmdfQXNTaXplX3Q9cHl0aG9uMzUuUHlMb25nX0FzU2l6ZV90Ci0gIFB5TG9uZ19Bc1NzaXplX3Q9cHl0aG9uMzUuUHlMb25nX0FzU3NpemVfdAotICBQeUxvbmdfQXNVbnNpZ25lZExvbmc9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZwotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzawotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sKLSAgUHlMb25nX0FzVm9pZFB0cj1weXRob24zNS5QeUxvbmdfQXNWb2lkUHRyCi0gIFB5TG9uZ19Gcm9tRG91YmxlPXB5dGhvbjM1LlB5TG9uZ19Gcm9tRG91YmxlCi0gIFB5TG9uZ19Gcm9tTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbUxvbmcKLSAgUHlMb25nX0Zyb21Mb25nTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbUxvbmdMb25nCi0gIFB5TG9uZ19Gcm9tU2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Gcm9tU2l6ZV90Ci0gIFB5TG9uZ19Gcm9tU3NpemVfdD1weXRob24zNS5QeUxvbmdfRnJvbVNzaXplX3QKLSAgUHlMb25nX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21TdHJpbmcKLSAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKLSAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZwotICBQeUxvbmdfRnJvbVZvaWRQdHI9cHl0aG9uMzUuUHlMb25nX0Zyb21Wb2lkUHRyCi0gIFB5TG9uZ19HZXRJbmZvPXB5dGhvbjM1LlB5TG9uZ19HZXRJbmZvCi0gIFB5TG9uZ19UeXBlPXB5dGhvbjM1LlB5TG9uZ19UeXBlIERBVEEKLSAgUHlNYXBfVHlwZT1weXRob24zNS5QeU1hcF9UeXBlIERBVEEKLSAgUHlNYXBwaW5nX0NoZWNrPXB5dGhvbjM1LlB5TWFwcGluZ19DaGVjawotICBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfR2V0SXRlbVN0cmluZwotICBQeU1hcHBpbmdfSGFzS2V5PXB5dGhvbjM1LlB5TWFwcGluZ19IYXNLZXkKLSAgUHlNYXBwaW5nX0hhc0tleVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfSGFzS2V5U3RyaW5nCi0gIFB5TWFwcGluZ19JdGVtcz1weXRob24zNS5QeU1hcHBpbmdfSXRlbXMKLSAgUHlNYXBwaW5nX0tleXM9cHl0aG9uMzUuUHlNYXBwaW5nX0tleXMKLSAgUHlNYXBwaW5nX0xlbmd0aD1weXRob24zNS5QeU1hcHBpbmdfTGVuZ3RoCi0gIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19TZXRJdGVtU3RyaW5nCi0gIFB5TWFwcGluZ19TaXplPXB5dGhvbjM1LlB5TWFwcGluZ19TaXplCi0gIFB5TWFwcGluZ19WYWx1ZXM9cHl0aG9uMzUuUHlNYXBwaW5nX1ZhbHVlcwotICBQeU1lbV9GcmVlPXB5dGhvbjM1LlB5TWVtX0ZyZWUKLSAgUHlNZW1fTWFsbG9jPXB5dGhvbjM1LlB5TWVtX01hbGxvYwotICBQeU1lbV9SZWFsbG9jPXB5dGhvbjM1LlB5TWVtX1JlYWxsb2MKLSAgUHlNZW1iZXJEZXNjcl9UeXBlPXB5dGhvbjM1LlB5TWVtYmVyRGVzY3JfVHlwZSBEQVRBCi0gIFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0Ci0gIFB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzPXB5dGhvbjM1LlB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzCi0gIFB5TWVtb3J5Vmlld19UeXBlPXB5dGhvbjM1LlB5TWVtb3J5Vmlld19UeXBlIERBVEEKLSAgUHlNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM1LlB5TWV0aG9kRGVzY3JfVHlwZSBEQVRBCi0gIFB5TW9kdWxlX0FkZEludENvbnN0YW50PXB5dGhvbjM1LlB5TW9kdWxlX0FkZEludENvbnN0YW50Ci0gIFB5TW9kdWxlX0FkZE9iamVjdD1weXRob24zNS5QeU1vZHVsZV9BZGRPYmplY3QKLSAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQ9cHl0aG9uMzUuUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQKLSAgUHlNb2R1bGVfQ3JlYXRlMj1weXRob24zNS5QeU1vZHVsZV9DcmVhdGUyCi0gIFB5TW9kdWxlX0dldERlZj1weXRob24zNS5QeU1vZHVsZV9HZXREZWYKLSAgUHlNb2R1bGVfR2V0RGljdD1weXRob24zNS5QeU1vZHVsZV9HZXREaWN0Ci0gIFB5TW9kdWxlX0dldEZpbGVuYW1lPXB5dGhvbjM1LlB5TW9kdWxlX0dldEZpbGVuYW1lCi0gIFB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM1LlB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0Ci0gIFB5TW9kdWxlX0dldE5hbWU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0TmFtZQotICBQeU1vZHVsZV9HZXRTdGF0ZT1weXRob24zNS5QeU1vZHVsZV9HZXRTdGF0ZQotICBQeU1vZHVsZV9OZXc9cHl0aG9uMzUuUHlNb2R1bGVfTmV3Ci0gIFB5TW9kdWxlX1R5cGU9cHl0aG9uMzUuUHlNb2R1bGVfVHlwZSBEQVRBCi0gIFB5TW9kdWxlRGVmX0luaXQ9cHl0aG9uMzUuUHlNb2R1bGVEZWZfSW5pdAotICBQeU1vZHVsZURlZl9UeXBlPXB5dGhvbjM1LlB5TW9kdWxlRGVmX1R5cGUgREFUQQotICBQeU51bGxJbXBvcnRlcl9UeXBlPXB5dGhvbjM1LlB5TnVsbEltcG9ydGVyX1R5cGUgREFUQQotICBQeU51bWJlcl9BYnNvbHV0ZT1weXRob24zNS5QeU51bWJlcl9BYnNvbHV0ZQotICBQeU51bWJlcl9BZGQ9cHl0aG9uMzUuUHlOdW1iZXJfQWRkCi0gIFB5TnVtYmVyX0FuZD1weXRob24zNS5QeU51bWJlcl9BbmQKLSAgUHlOdW1iZXJfQXNTc2l6ZV90PXB5dGhvbjM1LlB5TnVtYmVyX0FzU3NpemVfdAotICBQeU51bWJlcl9DaGVjaz1weXRob24zNS5QeU51bWJlcl9DaGVjawotICBQeU51bWJlcl9EaXZtb2Q9cHl0aG9uMzUuUHlOdW1iZXJfRGl2bW9kCi0gIFB5TnVtYmVyX0Zsb2F0PXB5dGhvbjM1LlB5TnVtYmVyX0Zsb2F0Ci0gIFB5TnVtYmVyX0Zsb29yRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0Zsb29yRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VBZGQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUFkZAotICBQeU51bWJlcl9JblBsYWNlQW5kPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VBbmQKLSAgUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZQotICBQeU51bWJlcl9JblBsYWNlTHNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VMc2hpZnQKLSAgUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VNdWx0aXBseQotICBQeU51bWJlcl9JblBsYWNlT3I9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZU9yCi0gIFB5TnVtYmVyX0luUGxhY2VQb3dlcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUG93ZXIKLSAgUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUmVtYWluZGVyCi0gIFB5TnVtYmVyX0luUGxhY2VSc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVJzaGlmdAotICBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Q9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0Ci0gIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VYb3I9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVhvcgotICBQeU51bWJlcl9JbmRleD1weXRob24zNS5QeU51bWJlcl9JbmRleAotICBQeU51bWJlcl9JbnZlcnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW52ZXJ0Ci0gIFB5TnVtYmVyX0xvbmc9cHl0aG9uMzUuUHlOdW1iZXJfTG9uZwotICBQeU51bWJlcl9Mc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfTHNoaWZ0Ci0gIFB5TnVtYmVyX011bHRpcGx5PXB5dGhvbjM1LlB5TnVtYmVyX011bHRpcGx5Ci0gIFB5TnVtYmVyX05lZ2F0aXZlPXB5dGhvbjM1LlB5TnVtYmVyX05lZ2F0aXZlCi0gIFB5TnVtYmVyX09yPXB5dGhvbjM1LlB5TnVtYmVyX09yCi0gIFB5TnVtYmVyX1Bvc2l0aXZlPXB5dGhvbjM1LlB5TnVtYmVyX1Bvc2l0aXZlCi0gIFB5TnVtYmVyX1Bvd2VyPXB5dGhvbjM1LlB5TnVtYmVyX1Bvd2VyCi0gIFB5TnVtYmVyX1JlbWFpbmRlcj1weXRob24zNS5QeU51bWJlcl9SZW1haW5kZXIKLSAgUHlOdW1iZXJfUnNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX1JzaGlmdAotICBQeU51bWJlcl9TdWJ0cmFjdD1weXRob24zNS5QeU51bWJlcl9TdWJ0cmFjdAotICBQeU51bWJlcl9Ub0Jhc2U9cHl0aG9uMzUuUHlOdW1iZXJfVG9CYXNlCi0gIFB5TnVtYmVyX1RydWVEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfVHJ1ZURpdmlkZQotICBQeU51bWJlcl9Yb3I9cHl0aG9uMzUuUHlOdW1iZXJfWG9yCi0gIFB5T1NfQWZ0ZXJGb3JrPXB5dGhvbjM1LlB5T1NfQWZ0ZXJGb3JrCi0gIFB5T1NfSW5pdEludGVycnVwdHM9cHl0aG9uMzUuUHlPU19Jbml0SW50ZXJydXB0cwotICBQeU9TX0lucHV0SG9vaz1weXRob24zNS5QeU9TX0lucHV0SG9vayBEQVRBCi0gIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQ9cHl0aG9uMzUuUHlPU19JbnRlcnJ1cHRPY2N1cnJlZAotICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyPXB5dGhvbjM1LlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgREFUQQotICBQeU9TX2RvdWJsZV90b19zdHJpbmc9cHl0aG9uMzUuUHlPU19kb3VibGVfdG9fc3RyaW5nCi0gIFB5T1NfZ2V0c2lnPXB5dGhvbjM1LlB5T1NfZ2V0c2lnCi0gIFB5T1NfbXlzdHJpY21wPXB5dGhvbjM1LlB5T1NfbXlzdHJpY21wCi0gIFB5T1NfbXlzdHJuaWNtcD1weXRob24zNS5QeU9TX215c3RybmljbXAKLSAgUHlPU19zZXRzaWc9cHl0aG9uMzUuUHlPU19zZXRzaWcKLSAgUHlPU19zbnByaW50Zj1weXRob24zNS5QeU9TX3NucHJpbnRmCi0gIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZT1weXRob24zNS5QeU9TX3N0cmluZ190b19kb3VibGUKLSAgUHlPU19zdHJ0b2w9cHl0aG9uMzUuUHlPU19zdHJ0b2wKLSAgUHlPU19zdHJ0b3VsPXB5dGhvbjM1LlB5T1Nfc3RydG91bAotICBQeU9TX3ZzbnByaW50Zj1weXRob24zNS5QeU9TX3ZzbnByaW50ZgotICBQeU9iamVjdF9BU0NJST1weXRob24zNS5QeU9iamVjdF9BU0NJSQotICBQeU9iamVjdF9Bc0NoYXJCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNDaGFyQnVmZmVyCi0gIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I9cHl0aG9uMzUuUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcgotICBQeU9iamVjdF9Bc1JlYWRCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNSZWFkQnVmZmVyCi0gIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcgotICBQeU9iamVjdF9CeXRlcz1weXRob24zNS5QeU9iamVjdF9CeXRlcwotICBQeU9iamVjdF9DYWxsPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGwKLSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxGdW5jdGlvbgotICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MKLSAgUHlPYmplY3RfQ2FsbE1ldGhvZD1weXRob24zNS5QeU9iamVjdF9DYWxsTWV0aG9kCi0gIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzCi0gIFB5T2JqZWN0X0NhbGxPYmplY3Q9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE9iamVjdAotICBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyCi0gIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnM9cHl0aG9uMzUuUHlPYmplY3RfQ2xlYXJXZWFrUmVmcwotICBQeU9iamVjdF9EZWxJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X0RlbEl0ZW0KLSAgUHlPYmplY3RfRGVsSXRlbVN0cmluZz1weXRob24zNS5QeU9iamVjdF9EZWxJdGVtU3RyaW5nCi0gIFB5T2JqZWN0X0Rpcj1weXRob24zNS5QeU9iamVjdF9EaXIKLSAgUHlPYmplY3RfRm9ybWF0PXB5dGhvbjM1LlB5T2JqZWN0X0Zvcm1hdAotICBQeU9iamVjdF9GcmVlPXB5dGhvbjM1LlB5T2JqZWN0X0ZyZWUKLSAgUHlPYmplY3RfR0NfRGVsPXB5dGhvbjM1LlB5T2JqZWN0X0dDX0RlbAotICBQeU9iamVjdF9HQ19UcmFjaz1weXRob24zNS5QeU9iamVjdF9HQ19UcmFjawotICBQeU9iamVjdF9HQ19VblRyYWNrPXB5dGhvbjM1LlB5T2JqZWN0X0dDX1VuVHJhY2sKLSAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2VuZXJpY0dldEF0dHIKLSAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2VuZXJpY1NldEF0dHIKLSAgUHlPYmplY3RfR2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZXRBdHRyCi0gIFB5T2JqZWN0X0dldEF0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfR2V0QXR0clN0cmluZwotICBQeU9iamVjdF9HZXRJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X0dldEl0ZW0KLSAgUHlPYmplY3RfR2V0SXRlcj1weXRob24zNS5QeU9iamVjdF9HZXRJdGVyCi0gIFB5T2JqZWN0X0hhc0F0dHI9cHl0aG9uMzUuUHlPYmplY3RfSGFzQXR0cgotICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0hhc0F0dHJTdHJpbmcKLSAgUHlPYmplY3RfSGFzaD1weXRob24zNS5QeU9iamVjdF9IYXNoCi0gIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZD1weXRob24zNS5QeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQKLSAgUHlPYmplY3RfSW5pdD1weXRob24zNS5QeU9iamVjdF9Jbml0Ci0gIFB5T2JqZWN0X0luaXRWYXI9cHl0aG9uMzUuUHlPYmplY3RfSW5pdFZhcgotICBQeU9iamVjdF9Jc0luc3RhbmNlPXB5dGhvbjM1LlB5T2JqZWN0X0lzSW5zdGFuY2UKLSAgUHlPYmplY3RfSXNTdWJjbGFzcz1weXRob24zNS5QeU9iamVjdF9Jc1N1YmNsYXNzCi0gIFB5T2JqZWN0X0lzVHJ1ZT1weXRob24zNS5QeU9iamVjdF9Jc1RydWUKLSAgUHlPYmplY3RfTGVuZ3RoPXB5dGhvbjM1LlB5T2JqZWN0X0xlbmd0aAotICBQeU9iamVjdF9NYWxsb2M9cHl0aG9uMzUuUHlPYmplY3RfTWFsbG9jCi0gIFB5T2JqZWN0X05vdD1weXRob24zNS5QeU9iamVjdF9Ob3QKLSAgUHlPYmplY3RfUmVhbGxvYz1weXRob24zNS5QeU9iamVjdF9SZWFsbG9jCi0gIFB5T2JqZWN0X1JlcHI9cHl0aG9uMzUuUHlPYmplY3RfUmVwcgotICBQeU9iamVjdF9SaWNoQ29tcGFyZT1weXRob24zNS5QeU9iamVjdF9SaWNoQ29tcGFyZQotICBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w9cHl0aG9uMzUuUHlPYmplY3RfUmljaENvbXBhcmVCb29sCi0gIFB5T2JqZWN0X1NlbGZJdGVyPXB5dGhvbjM1LlB5T2JqZWN0X1NlbGZJdGVyCi0gIFB5T2JqZWN0X1NldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfU2V0QXR0cgotICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X1NldEF0dHJTdHJpbmcKLSAgUHlPYmplY3RfU2V0SXRlbT1weXRob24zNS5QeU9iamVjdF9TZXRJdGVtCi0gIFB5T2JqZWN0X1NpemU9cHl0aG9uMzUuUHlPYmplY3RfU2l6ZQotICBQeU9iamVjdF9TdHI9cHl0aG9uMzUuUHlPYmplY3RfU3RyCi0gIFB5T2JqZWN0X1R5cGU9cHl0aG9uMzUuUHlPYmplY3RfVHlwZSBEQVRBCi0gIFB5T0RpY3RfRGVsSXRlbT1weXRob24zNS5QeU9EaWN0X0RlbEl0ZW0KLSAgUHlPRGljdF9OZXc9cHl0aG9uMzUuUHlPRGljdF9OZXcKLSAgUHlPRGljdF9TZXRJdGVtPXB5dGhvbjM1LlB5T0RpY3RfU2V0SXRlbQotICBQeU9EaWN0X1R5cGU9cHl0aG9uMzUuUHlPRGljdF9UeXBlIERBVEEKLSAgUHlPRGljdEl0ZW1zX1R5cGU9cHl0aG9uMzUuUHlPRGljdEl0ZW1zX1R5cGUgREFUQQotICBQeU9EaWN0SXRlcl9UeXBlPXB5dGhvbjM1LlB5T0RpY3RJdGVyX1R5cGUgREFUQQotICBQeU9EaWN0S2V5c19UeXBlPXB5dGhvbjM1LlB5T0RpY3RLZXlzX1R5cGUgREFUQQotICBQeU9EaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzUuUHlPRGljdFZhbHVlc19UeXBlIERBVEEKLSAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3M9cHl0aG9uMzUuUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MKLSAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncz1weXRob24zNS5QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzCi0gIFB5UHJvcGVydHlfVHlwZT1weXRob24zNS5QeVByb3BlcnR5X1R5cGUgREFUQQotICBQeVJhbmdlSXRlcl9UeXBlPXB5dGhvbjM1LlB5UmFuZ2VJdGVyX1R5cGUgREFUQQotICBQeVJhbmdlX1R5cGU9cHl0aG9uMzUuUHlSYW5nZV9UeXBlIERBVEEKLSAgUHlSZXZlcnNlZF9UeXBlPXB5dGhvbjM1LlB5UmV2ZXJzZWRfVHlwZSBEQVRBCi0gIFB5U2VxSXRlcl9OZXc9cHl0aG9uMzUuUHlTZXFJdGVyX05ldwotICBQeVNlcUl0ZXJfVHlwZT1weXRob24zNS5QeVNlcUl0ZXJfVHlwZSBEQVRBCi0gIFB5U2VxdWVuY2VfQ2hlY2s9cHl0aG9uMzUuUHlTZXF1ZW5jZV9DaGVjawotICBQeVNlcXVlbmNlX0NvbmNhdD1weXRob24zNS5QeVNlcXVlbmNlX0NvbmNhdAotICBQeVNlcXVlbmNlX0NvbnRhaW5zPXB5dGhvbjM1LlB5U2VxdWVuY2VfQ29udGFpbnMKLSAgUHlTZXF1ZW5jZV9Db3VudD1weXRob24zNS5QeVNlcXVlbmNlX0NvdW50Ci0gIFB5U2VxdWVuY2VfRGVsSXRlbT1weXRob24zNS5QeVNlcXVlbmNlX0RlbEl0ZW0KLSAgUHlTZXF1ZW5jZV9EZWxTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX0RlbFNsaWNlCi0gIFB5U2VxdWVuY2VfRmFzdD1weXRob24zNS5QeVNlcXVlbmNlX0Zhc3QKLSAgUHlTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfR2V0SXRlbQotICBQeVNlcXVlbmNlX0dldFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfR2V0U2xpY2UKLSAgUHlTZXF1ZW5jZV9Jbj1weXRob24zNS5QeVNlcXVlbmNlX0luCi0gIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdD1weXRob24zNS5QeVNlcXVlbmNlX0luUGxhY2VDb25jYXQKLSAgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdAotICBQeVNlcXVlbmNlX0luZGV4PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5kZXgKLSAgUHlTZXF1ZW5jZV9MZW5ndGg9cHl0aG9uMzUuUHlTZXF1ZW5jZV9MZW5ndGgKLSAgUHlTZXF1ZW5jZV9MaXN0PXB5dGhvbjM1LlB5U2VxdWVuY2VfTGlzdAotICBQeVNlcXVlbmNlX1JlcGVhdD1weXRob24zNS5QeVNlcXVlbmNlX1JlcGVhdAotICBQeVNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9TZXRJdGVtCi0gIFB5U2VxdWVuY2VfU2V0U2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9TZXRTbGljZQotICBQeVNlcXVlbmNlX1NpemU9cHl0aG9uMzUuUHlTZXF1ZW5jZV9TaXplCi0gIFB5U2VxdWVuY2VfVHVwbGU9cHl0aG9uMzUuUHlTZXF1ZW5jZV9UdXBsZQotICBQeVNldEl0ZXJfVHlwZT1weXRob24zNS5QeVNldEl0ZXJfVHlwZSBEQVRBCi0gIFB5U2V0X0FkZD1weXRob24zNS5QeVNldF9BZGQKLSAgUHlTZXRfQ2xlYXI9cHl0aG9uMzUuUHlTZXRfQ2xlYXIKLSAgUHlTZXRfQ29udGFpbnM9cHl0aG9uMzUuUHlTZXRfQ29udGFpbnMKLSAgUHlTZXRfRGlzY2FyZD1weXRob24zNS5QeVNldF9EaXNjYXJkCi0gIFB5U2V0X05ldz1weXRob24zNS5QeVNldF9OZXcKLSAgUHlTZXRfUG9wPXB5dGhvbjM1LlB5U2V0X1BvcAotICBQeVNldF9TaXplPXB5dGhvbjM1LlB5U2V0X1NpemUKLSAgUHlTZXRfVHlwZT1weXRob24zNS5QeVNldF9UeXBlIERBVEEKLSAgUHlTbGljZV9HZXRJbmRpY2VzPXB5dGhvbjM1LlB5U2xpY2VfR2V0SW5kaWNlcwotICBQeVNsaWNlX0dldEluZGljZXNFeD1weXRob24zNS5QeVNsaWNlX0dldEluZGljZXNFeAotICBQeVNsaWNlX05ldz1weXRob24zNS5QeVNsaWNlX05ldwotICBQeVNsaWNlX1R5cGU9cHl0aG9uMzUuUHlTbGljZV9UeXBlIERBVEEKLSAgUHlTb3J0V3JhcHBlcl9UeXBlPXB5dGhvbjM1LlB5U29ydFdyYXBwZXJfVHlwZSBEQVRBCi0gIFB5U3RhdGVfRmluZE1vZHVsZT1weXRob24zNS5QeVN0YXRlX0ZpbmRNb2R1bGUKLSAgUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9BZGRNb2R1bGUKLSAgUHlTdGF0ZV9SZW1vdmVNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9SZW1vdmVNb2R1bGUKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbQotICBQeVN0cnVjdFNlcXVlbmNlX05ldz1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX05ldwotICBQeVN0cnVjdFNlcXVlbmNlX05ld1R5cGU9cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlCi0gIFB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW0KLSAgUHlTdXBlcl9UeXBlPXB5dGhvbjM1LlB5U3VwZXJfVHlwZSBEQVRBCi0gIFB5U3lzX0FkZFdhcm5PcHRpb249cHl0aG9uMzUuUHlTeXNfQWRkV2Fybk9wdGlvbgotICBQeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZT1weXRob24zNS5QeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZQotICBQeVN5c19Gb3JtYXRTdGRlcnI9cHl0aG9uMzUuUHlTeXNfRm9ybWF0U3RkZXJyCi0gIFB5U3lzX0Zvcm1hdFN0ZG91dD1weXRob24zNS5QeVN5c19Gb3JtYXRTdGRvdXQKLSAgUHlTeXNfR2V0T2JqZWN0PXB5dGhvbjM1LlB5U3lzX0dldE9iamVjdAotICBQeVN5c19IYXNXYXJuT3B0aW9ucz1weXRob24zNS5QeVN5c19IYXNXYXJuT3B0aW9ucwotICBQeVN5c19SZXNldFdhcm5PcHRpb25zPXB5dGhvbjM1LlB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMKLSAgUHlTeXNfU2V0QXJndj1weXRob24zNS5QeVN5c19TZXRBcmd2Ci0gIFB5U3lzX1NldEFyZ3ZFeD1weXRob24zNS5QeVN5c19TZXRBcmd2RXgKLSAgUHlTeXNfU2V0T2JqZWN0PXB5dGhvbjM1LlB5U3lzX1NldE9iamVjdAotICBQeVN5c19TZXRQYXRoPXB5dGhvbjM1LlB5U3lzX1NldFBhdGgKLSAgUHlTeXNfV3JpdGVTdGRlcnI9cHl0aG9uMzUuUHlTeXNfV3JpdGVTdGRlcnIKLSAgUHlTeXNfV3JpdGVTdGRvdXQ9cHl0aG9uMzUuUHlTeXNfV3JpdGVTdGRvdXQKLSAgUHlUaHJlYWRTdGF0ZV9DbGVhcj1weXRob24zNS5QeVRocmVhZFN0YXRlX0NsZWFyCi0gIFB5VGhyZWFkU3RhdGVfRGVsZXRlPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfRGVsZXRlCi0gIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudD1weXRob24zNS5QeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQKLSAgUHlUaHJlYWRTdGF0ZV9HZXQ9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9HZXQKLSAgUHlUaHJlYWRTdGF0ZV9HZXREaWN0PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfR2V0RGljdAotICBQeVRocmVhZFN0YXRlX05ldz1weXRob24zNS5QeVRocmVhZFN0YXRlX05ldwotICBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMKLSAgUHlUaHJlYWRTdGF0ZV9Td2FwPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfU3dhcAotICBQeVRyYWNlQmFja19IZXJlPXB5dGhvbjM1LlB5VHJhY2VCYWNrX0hlcmUKLSAgUHlUcmFjZUJhY2tfUHJpbnQ9cHl0aG9uMzUuUHlUcmFjZUJhY2tfUHJpbnQKLSAgUHlUcmFjZUJhY2tfVHlwZT1weXRob24zNS5QeVRyYWNlQmFja19UeXBlIERBVEEKLSAgUHlUdXBsZUl0ZXJfVHlwZT1weXRob24zNS5QeVR1cGxlSXRlcl9UeXBlIERBVEEKLSAgUHlUdXBsZV9DbGVhckZyZWVMaXN0PXB5dGhvbjM1LlB5VHVwbGVfQ2xlYXJGcmVlTGlzdAotICBQeVR1cGxlX0dldEl0ZW09cHl0aG9uMzUuUHlUdXBsZV9HZXRJdGVtCi0gIFB5VHVwbGVfR2V0U2xpY2U9cHl0aG9uMzUuUHlUdXBsZV9HZXRTbGljZQotICBQeVR1cGxlX05ldz1weXRob24zNS5QeVR1cGxlX05ldwotICBQeVR1cGxlX1BhY2s9cHl0aG9uMzUuUHlUdXBsZV9QYWNrCi0gIFB5VHVwbGVfU2V0SXRlbT1weXRob24zNS5QeVR1cGxlX1NldEl0ZW0KLSAgUHlUdXBsZV9TaXplPXB5dGhvbjM1LlB5VHVwbGVfU2l6ZQotICBQeVR1cGxlX1R5cGU9cHl0aG9uMzUuUHlUdXBsZV9UeXBlIERBVEEKLSAgUHlUeXBlX0NsZWFyQ2FjaGU9cHl0aG9uMzUuUHlUeXBlX0NsZWFyQ2FjaGUKLSAgUHlUeXBlX0Zyb21TcGVjPXB5dGhvbjM1LlB5VHlwZV9Gcm9tU3BlYwotICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXM9cHl0aG9uMzUuUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzCi0gIFB5VHlwZV9HZW5lcmljQWxsb2M9cHl0aG9uMzUuUHlUeXBlX0dlbmVyaWNBbGxvYwotICBQeVR5cGVfR2VuZXJpY05ldz1weXRob24zNS5QeVR5cGVfR2VuZXJpY05ldwotICBQeVR5cGVfR2V0RmxhZ3M9cHl0aG9uMzUuUHlUeXBlX0dldEZsYWdzCi0gIFB5VHlwZV9HZXRTbG90PXB5dGhvbjM1LlB5VHlwZV9HZXRTbG90Ci0gIFB5VHlwZV9Jc1N1YnR5cGU9cHl0aG9uMzUuUHlUeXBlX0lzU3VidHlwZQotICBQeVR5cGVfTW9kaWZpZWQ9cHl0aG9uMzUuUHlUeXBlX01vZGlmaWVkCi0gIFB5VHlwZV9SZWFkeT1weXRob24zNS5QeVR5cGVfUmVhZHkKLSAgUHlUeXBlX1R5cGU9cHl0aG9uMzUuUHlUeXBlX1R5cGUgREFUQQotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGU9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZwotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlSXRlcl9UeXBlPXB5dGhvbjM1LlB5VW5pY29kZUl0ZXJfVHlwZSBEQVRBCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVfQXBwZW5kPXB5dGhvbjM1LlB5VW5pY29kZV9BcHBlbmQKLSAgUHlVbmljb2RlX0FwcGVuZEFuZERlbD1weXRob24zNS5QeVVuaWNvZGVfQXBwZW5kQW5kRGVsCi0gIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZwotICBQeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGUKLSAgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZwotICBQeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZT1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZQotICBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZwotICBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEYxNlN0cmluZwotICBQeVVuaWNvZGVfQXNVVEYzMlN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEYzMlN0cmluZwotICBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjhTdHJpbmcKLSAgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1dpZGVDaGFyPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1dpZGVDaGFyCi0gIFB5VW5pY29kZV9DbGVhckZyZWVsaXN0PXB5dGhvbjM1LlB5VW5pY29kZV9DbGVhckZyZWVsaXN0Ci0gIFB5VW5pY29kZV9Db21wYXJlPXB5dGhvbjM1LlB5VW5pY29kZV9Db21wYXJlCi0gIFB5VW5pY29kZV9Db25jYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0NvbmNhdAotICBQeVVuaWNvZGVfQ29udGFpbnM9cHl0aG9uMzUuUHlVbmljb2RlX0NvbnRhaW5zCi0gIFB5VW5pY29kZV9Db3VudD1weXRob24zNS5QeVVuaWNvZGVfQ291bnQKLSAgUHlVbmljb2RlX0RlY29kZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlCi0gIFB5VW5pY29kZV9EZWNvZGVBU0NJST1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlQVNDSUkKLSAgUHlVbmljb2RlX0RlY29kZUNoYXJtYXA9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUNoYXJtYXAKLSAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0Ci0gIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplCi0gIFB5VW5pY29kZV9EZWNvZGVMYXRpbjE9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUxhdGluMQotICBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQotICBQeVVuaWNvZGVfRGVjb2RlVVRGMTY9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjE2Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYzMj1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMzIKLSAgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVURjg9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjgKLSAgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlCi0gIFB5VW5pY29kZV9GU0NvbnZlcnRlcj1weXRob24zNS5QeVVuaWNvZGVfRlNDb252ZXJ0ZXIKLSAgUHlVbmljb2RlX0ZTRGVjb2Rlcj1weXRob24zNS5QeVVuaWNvZGVfRlNEZWNvZGVyCi0gIFB5VW5pY29kZV9GaW5kPXB5dGhvbjM1LlB5VW5pY29kZV9GaW5kCi0gIFB5VW5pY29kZV9Gb3JtYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0Zvcm1hdAotICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Gcm9tRm9ybWF0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRm9ybWF0Ci0gIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vj1weXRob24zNS5QeVVuaWNvZGVfRnJvbUZvcm1hdFYKLSAgUHlVbmljb2RlX0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21PYmplY3QKLSAgUHlVbmljb2RlX0Zyb21PcmRpbmFsPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tT3JkaW5hbAotICBQeVVuaWNvZGVfRnJvbVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfRnJvbVN0cmluZwotICBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXI9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21XaWRlQ2hhcgotICBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcKLSAgUHlVbmljb2RlX0dldFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0dldFNpemUKLSAgUHlVbmljb2RlX0lzSWRlbnRpZmllcj1weXRob24zNS5QeVVuaWNvZGVfSXNJZGVudGlmaWVyCi0gIFB5VW5pY29kZV9Kb2luPXB5dGhvbjM1LlB5VW5pY29kZV9Kb2luCi0gIFB5VW5pY29kZV9QYXJ0aXRpb249cHl0aG9uMzUuUHlVbmljb2RlX1BhcnRpdGlvbgotICBQeVVuaWNvZGVfUlBhcnRpdGlvbj1weXRob24zNS5QeVVuaWNvZGVfUlBhcnRpdGlvbgotICBQeVVuaWNvZGVfUlNwbGl0PXB5dGhvbjM1LlB5VW5pY29kZV9SU3BsaXQKLSAgUHlVbmljb2RlX1JlcGxhY2U9cHl0aG9uMzUuUHlVbmljb2RlX1JlcGxhY2UKLSAgUHlVbmljb2RlX1Jlc2l6ZT1weXRob24zNS5QeVVuaWNvZGVfUmVzaXplCi0gIFB5VW5pY29kZV9SaWNoQ29tcGFyZT1weXRob24zNS5QeVVuaWNvZGVfUmljaENvbXBhcmUKLSAgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nCi0gIFB5VW5pY29kZV9TcGxpdD1weXRob24zNS5QeVVuaWNvZGVfU3BsaXQKLSAgUHlVbmljb2RlX1NwbGl0bGluZXM9cHl0aG9uMzUuUHlVbmljb2RlX1NwbGl0bGluZXMKLSAgUHlVbmljb2RlX1RhaWxtYXRjaD1weXRob24zNS5QeVVuaWNvZGVfVGFpbG1hdGNoCi0gIFB5VW5pY29kZV9UcmFuc2xhdGU9cHl0aG9uMzUuUHlVbmljb2RlX1RyYW5zbGF0ZQotICBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcD1weXRob24zNS5QeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcAotICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZwotICBQeVVuaWNvZGVfRGVjb2RlVVRGNz1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGNwotICBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwKLSAgUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdD1weXRob24zNS5QeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0Ci0gIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nCi0gIFB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbD1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWwKLSAgUHlVbmljb2RlX0ludGVybkluUGxhY2U9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkluUGxhY2UKLSAgUHlVbmljb2RlX1R5cGU9cHl0aG9uMzUuUHlVbmljb2RlX1R5cGUgREFUQQotICBQeVdlYWtyZWZfR2V0T2JqZWN0PXB5dGhvbjM1LlB5V2Vha3JlZl9HZXRPYmplY3QgREFUQQotICBQeVdlYWtyZWZfTmV3UHJveHk9cHl0aG9uMzUuUHlXZWFrcmVmX05ld1Byb3h5Ci0gIFB5V2Vha3JlZl9OZXdSZWY9cHl0aG9uMzUuUHlXZWFrcmVmX05ld1JlZgotICBQeVdyYXBwZXJEZXNjcl9UeXBlPXB5dGhvbjM1LlB5V3JhcHBlckRlc2NyX1R5cGUgREFUQQotICBQeVdyYXBwZXJfTmV3PXB5dGhvbjM1LlB5V3JhcHBlcl9OZXcKLSAgUHlaaXBfVHlwZT1weXRob24zNS5QeVppcF9UeXBlIERBVEEKLSAgUHlfQWRkUGVuZGluZ0NhbGw9cHl0aG9uMzUuUHlfQWRkUGVuZGluZ0NhbGwKLSAgUHlfQXRFeGl0PXB5dGhvbjM1LlB5X0F0RXhpdAotICBQeV9CdWlsZFZhbHVlPXB5dGhvbjM1LlB5X0J1aWxkVmFsdWUKLSAgUHlfQ29tcGlsZVN0cmluZz1weXRob24zNS5QeV9Db21waWxlU3RyaW5nCi0gIFB5X0RlY1JlZj1weXRob24zNS5QeV9EZWNSZWYKLSAgUHlfRW5kSW50ZXJwcmV0ZXI9cHl0aG9uMzUuUHlfRW5kSW50ZXJwcmV0ZXIKLSAgUHlfRXhpdD1weXRob24zNS5QeV9FeGl0Ci0gIFB5X0ZhdGFsRXJyb3I9cHl0aG9uMzUuUHlfRmF0YWxFcnJvcgotICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQotICBQeV9GaW5hbGl6ZT1weXRob24zNS5QeV9GaW5hbGl6ZQotICBQeV9HZXRCdWlsZEluZm89cHl0aG9uMzUuUHlfR2V0QnVpbGRJbmZvCi0gIFB5X0dldENvbXBpbGVyPXB5dGhvbjM1LlB5X0dldENvbXBpbGVyCi0gIFB5X0dldENvcHlyaWdodD1weXRob24zNS5QeV9HZXRDb3B5cmlnaHQKLSAgUHlfR2V0RXhlY1ByZWZpeD1weXRob24zNS5QeV9HZXRFeGVjUHJlZml4Ci0gIFB5X0dldFBhdGg9cHl0aG9uMzUuUHlfR2V0UGF0aAotICBQeV9HZXRQbGF0Zm9ybT1weXRob24zNS5QeV9HZXRQbGF0Zm9ybQotICBQeV9HZXRQcmVmaXg9cHl0aG9uMzUuUHlfR2V0UHJlZml4Ci0gIFB5X0dldFByb2dyYW1GdWxsUGF0aD1weXRob24zNS5QeV9HZXRQcm9ncmFtRnVsbFBhdGgKLSAgUHlfR2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzUuUHlfR2V0UHJvZ3JhbU5hbWUKLSAgUHlfR2V0UHl0aG9uSG9tZT1weXRob24zNS5QeV9HZXRQeXRob25Ib21lCi0gIFB5X0dldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1LlB5X0dldFJlY3Vyc2lvbkxpbWl0Ci0gIFB5X0dldFZlcnNpb249cHl0aG9uMzUuUHlfR2V0VmVyc2lvbgotICBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQotICBQeV9JbmNSZWY9cHl0aG9uMzUuUHlfSW5jUmVmCi0gIFB5X0luaXRpYWxpemU9cHl0aG9uMzUuUHlfSW5pdGlhbGl6ZQotICBQeV9Jbml0aWFsaXplRXg9cHl0aG9uMzUuUHlfSW5pdGlhbGl6ZUV4Ci0gIFB5X0lzSW5pdGlhbGl6ZWQ9cHl0aG9uMzUuUHlfSXNJbml0aWFsaXplZAotICBQeV9NYWluPXB5dGhvbjM1LlB5X01haW4KLSAgUHlfTWFrZVBlbmRpbmdDYWxscz1weXRob24zNS5QeV9NYWtlUGVuZGluZ0NhbGxzCi0gIFB5X05ld0ludGVycHJldGVyPXB5dGhvbjM1LlB5X05ld0ludGVycHJldGVyCi0gIFB5X1JlcHJFbnRlcj1weXRob24zNS5QeV9SZXByRW50ZXIKLSAgUHlfUmVwckxlYXZlPXB5dGhvbjM1LlB5X1JlcHJMZWF2ZQotICBQeV9TZXRQcm9ncmFtTmFtZT1weXRob24zNS5QeV9TZXRQcm9ncmFtTmFtZQotICBQeV9TZXRQeXRob25Ib21lPXB5dGhvbjM1LlB5X1NldFB5dGhvbkhvbWUKLSAgUHlfU2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuUHlfU2V0UmVjdXJzaW9uTGltaXQKLSAgUHlfU3ltdGFibGVTdHJpbmc9cHl0aG9uMzUuUHlfU3ltdGFibGVTdHJpbmcKLSAgUHlfVmFCdWlsZFZhbHVlPXB5dGhvbjM1LlB5X1ZhQnVpbGRWYWx1ZQotICBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM1Ll9QeUVycl9CYWRJbnRlcm5hbENhbGwKLSAgX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVD1weXRob24zNS5fUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUCi0gIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUPXB5dGhvbjM1Ll9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUCi0gIF9QeU9iamVjdF9HQ19NYWxsb2M9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX01hbGxvYwotICBfUHlPYmplY3RfR0NfTmV3PXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19OZXcKLSAgX1B5T2JqZWN0X0dDX05ld1Zhcj1weXRob24zNS5fUHlPYmplY3RfR0NfTmV3VmFyCi0gIF9QeU9iamVjdF9HQ19SZXNpemU9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX1Jlc2l6ZQotICBfUHlPYmplY3RfTmV3PXB5dGhvbjM1Ll9QeU9iamVjdF9OZXcKLSAgX1B5T2JqZWN0X05ld1Zhcj1weXRob24zNS5fUHlPYmplY3RfTmV3VmFyCi0gIF9QeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNS5fUHlTdGF0ZV9BZGRNb2R1bGUKLSAgX1B5VGhyZWFkU3RhdGVfSW5pdD1weXRob24zNS5fUHlUaHJlYWRTdGF0ZV9Jbml0Ci0gIF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jPXB5dGhvbjM1Ll9QeVRocmVhZFN0YXRlX1ByZWFsbG9jCi0gIF9QeVRyYXNoX2RlbGV0ZV9sYXRlcj1weXRob24zNS5fUHlUcmFzaF9kZWxldGVfbGF0ZXIgREFUQQotICBfUHlUcmFzaF9kZWxldGVfbmVzdGluZz1weXRob24zNS5fUHlUcmFzaF9kZWxldGVfbmVzdGluZyBEQVRBCi0gIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0PXB5dGhvbjM1Ll9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0Ci0gIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW49cHl0aG9uMzUuX1B5VHJhc2hfZGVzdHJveV9jaGFpbgotICBfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUgREFUQQotICBfUHlXZWFrcmVmX1Byb3h5VHlwZT1weXRob24zNS5fUHlXZWFrcmVmX1Byb3h5VHlwZSBEQVRBCi0gIF9QeVdlYWtyZWZfUmVmVHlwZT1weXRob24zNS5fUHlXZWFrcmVmX1JlZlR5cGUgREFUQQotICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfQnVpbGRWYWx1ZV9TaXplVAotICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdD1weXRob24zNS5fUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCBEQVRBCi0gIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGw9cHl0aG9uMzUuX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbAotICBfUHlfRGVhbGxvYz1weXRob24zNS5fUHlfRGVhbGxvYwotICBfUHlfRWxsaXBzaXNPYmplY3Q9cHl0aG9uMzUuX1B5X0VsbGlwc2lzT2JqZWN0IERBVEEKLSAgX1B5X0ZhbHNlU3RydWN0PXB5dGhvbjM1Ll9QeV9GYWxzZVN0cnVjdCBEQVRBCi0gIF9QeV9Ob25lU3RydWN0PXB5dGhvbjM1Ll9QeV9Ob25lU3RydWN0IERBVEEKLSAgX1B5X05vdEltcGxlbWVudGVkU3RydWN0PXB5dGhvbjM1Ll9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCBEQVRBCi0gIF9QeV9Td2FwcGVkT3A9cHl0aG9uMzUuX1B5X1N3YXBwZWRPcCBEQVRBCi0gIF9QeV9UcnVlU3RydWN0PXB5dGhvbjM1Ll9QeV9UcnVlU3RydWN0IERBVEEKLSAgX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfVmFCdWlsZFZhbHVlX1NpemVUCi0gIF9QeUFyZ19QYXJzZV9TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCi0gIF9QeUFyZ19WYVBhcnNlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19WYVBhcnNlX1NpemVUCi0gIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNS5fUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKLSAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKKyAgUHlBcmdfUGFyc2U9cHl0aG9uMzYuUHlBcmdfUGFyc2UKKyAgUHlBcmdfUGFyc2VUdXBsZT1weXRob24zNi5QeUFyZ19QYXJzZVR1cGxlCisgIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNi5QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMKKyAgUHlBcmdfVW5wYWNrVHVwbGU9cHl0aG9uMzYuUHlBcmdfVW5wYWNrVHVwbGUKKyAgUHlBcmdfVmFQYXJzZT1weXRob24zNi5QeUFyZ19WYVBhcnNlCisgIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM2LlB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCisgIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cz1weXRob24zNi5QeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHMKKyAgUHlCYXNlT2JqZWN0X1R5cGU9cHl0aG9uMzYuUHlCYXNlT2JqZWN0X1R5cGUgREFUQQorICBQeUJvb2xfRnJvbUxvbmc9cHl0aG9uMzYuUHlCb29sX0Zyb21Mb25nCisgIFB5Qm9vbF9UeXBlPXB5dGhvbjM2LlB5Qm9vbF9UeXBlIERBVEEKKyAgUHlCeXRlQXJyYXlJdGVyX1R5cGU9cHl0aG9uMzYuUHlCeXRlQXJyYXlJdGVyX1R5cGUgREFUQQorICBQeUJ5dGVBcnJheV9Bc1N0cmluZz1weXRob24zNi5QeUJ5dGVBcnJheV9Bc1N0cmluZworICBQeUJ5dGVBcnJheV9Db25jYXQ9cHl0aG9uMzYuUHlCeXRlQXJyYXlfQ29uY2F0CisgIFB5Qnl0ZUFycmF5X0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlCeXRlQXJyYXlfRnJvbU9iamVjdAorICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVBcnJheV9SZXNpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfUmVzaXplCisgIFB5Qnl0ZUFycmF5X1NpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfU2l6ZQorICBQeUJ5dGVBcnJheV9UeXBlPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1R5cGUgREFUQQorICBQeUJ5dGVzSXRlcl9UeXBlPXB5dGhvbjM2LlB5Qnl0ZXNJdGVyX1R5cGUgREFUQQorICBQeUJ5dGVzX0FzU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZXNfQXNTdHJpbmcKKyAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUKKyAgUHlCeXRlc19Db25jYXQ9cHl0aG9uMzYuUHlCeXRlc19Db25jYXQKKyAgUHlCeXRlc19Db25jYXRBbmREZWw9cHl0aG9uMzYuUHlCeXRlc19Db25jYXRBbmREZWwKKyAgUHlCeXRlc19EZWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlCeXRlc19EZWNvZGVFc2NhcGUKKyAgUHlCeXRlc19Gcm9tRm9ybWF0PXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbUZvcm1hdAorICBQeUJ5dGVzX0Zyb21Gb3JtYXRWPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbUZvcm1hdFYKKyAgUHlCeXRlc19Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbU9iamVjdAorICBQeUJ5dGVzX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlCeXRlc19Gcm9tU3RyaW5nCisgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVzX1JlcHI9cHl0aG9uMzYuUHlCeXRlc19SZXByCisgIFB5Qnl0ZXNfU2l6ZT1weXRob24zNi5QeUJ5dGVzX1NpemUKKyAgUHlCeXRlc19UeXBlPXB5dGhvbjM2LlB5Qnl0ZXNfVHlwZSBEQVRBCisgIFB5Q0Z1bmN0aW9uX0NhbGw9cHl0aG9uMzYuUHlDRnVuY3Rpb25fQ2FsbAorICBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QKKyAgUHlDRnVuY3Rpb25fR2V0RmxhZ3M9cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0RmxhZ3MKKyAgUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb249cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24KKyAgUHlDRnVuY3Rpb25fR2V0U2VsZj1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRTZWxmCisgIFB5Q0Z1bmN0aW9uX05ldz1weXRob24zNi5QeUNGdW5jdGlvbl9OZXcKKyAgUHlDRnVuY3Rpb25fTmV3RXg9cHl0aG9uMzYuUHlDRnVuY3Rpb25fTmV3RXgKKyAgUHlDRnVuY3Rpb25fVHlwZT1weXRob24zNi5QeUNGdW5jdGlvbl9UeXBlIERBVEEKKyAgUHlDYWxsSXRlcl9OZXc9cHl0aG9uMzYuUHlDYWxsSXRlcl9OZXcKKyAgUHlDYWxsSXRlcl9UeXBlPXB5dGhvbjM2LlB5Q2FsbEl0ZXJfVHlwZSBEQVRBCisgIFB5Q2FsbGFibGVfQ2hlY2s9cHl0aG9uMzYuUHlDYWxsYWJsZV9DaGVjaworICBQeUNhcHN1bGVfR2V0Q29udGV4dD1weXRob24zNi5QeUNhcHN1bGVfR2V0Q29udGV4dAorICBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3Rvcj1weXRob24zNi5QeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcgorICBQeUNhcHN1bGVfR2V0TmFtZT1weXRob24zNi5QeUNhcHN1bGVfR2V0TmFtZQorICBQeUNhcHN1bGVfR2V0UG9pbnRlcj1weXRob24zNi5QeUNhcHN1bGVfR2V0UG9pbnRlcgorICBQeUNhcHN1bGVfSW1wb3J0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9JbXBvcnQKKyAgUHlDYXBzdWxlX0lzVmFsaWQ9cHl0aG9uMzYuUHlDYXBzdWxlX0lzVmFsaWQKKyAgUHlDYXBzdWxlX05ldz1weXRob24zNi5QeUNhcHN1bGVfTmV3CisgIFB5Q2Fwc3VsZV9TZXRDb250ZXh0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXRDb250ZXh0CisgIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yCisgIFB5Q2Fwc3VsZV9TZXROYW1lPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXROYW1lCisgIFB5Q2Fwc3VsZV9TZXRQb2ludGVyPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXRQb2ludGVyCisgIFB5Q2Fwc3VsZV9UeXBlPXB5dGhvbjM2LlB5Q2Fwc3VsZV9UeXBlIERBVEEKKyAgUHlDbGFzc01ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzYuUHlDbGFzc01ldGhvZERlc2NyX1R5cGUgREFUQQorICBQeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzCisgIFB5Q29kZWNfRGVjb2RlPXB5dGhvbjM2LlB5Q29kZWNfRGVjb2RlCisgIFB5Q29kZWNfRGVjb2Rlcj1weXRob24zNi5QeUNvZGVjX0RlY29kZXIKKyAgUHlDb2RlY19FbmNvZGU9cHl0aG9uMzYuUHlDb2RlY19FbmNvZGUKKyAgUHlDb2RlY19FbmNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfRW5jb2RlcgorICBQeUNvZGVjX0lnbm9yZUVycm9ycz1weXRob24zNi5QeUNvZGVjX0lnbm9yZUVycm9ycworICBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcj1weXRob24zNi5QeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcgorICBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcj1weXRob24zNi5QeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcgorICBQeUNvZGVjX0tub3duRW5jb2Rpbmc9cHl0aG9uMzYuUHlDb2RlY19Lbm93bkVuY29kaW5nCisgIFB5Q29kZWNfTG9va3VwRXJyb3I9cHl0aG9uMzYuUHlDb2RlY19Mb29rdXBFcnJvcgorICBQeUNvZGVjX1JlZ2lzdGVyPXB5dGhvbjM2LlB5Q29kZWNfUmVnaXN0ZXIKKyAgUHlDb2RlY19SZWdpc3RlckVycm9yPXB5dGhvbjM2LlB5Q29kZWNfUmVnaXN0ZXJFcnJvcgorICBQeUNvZGVjX1JlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19SZXBsYWNlRXJyb3JzCisgIFB5Q29kZWNfU3RyZWFtUmVhZGVyPXB5dGhvbjM2LlB5Q29kZWNfU3RyZWFtUmVhZGVyCisgIFB5Q29kZWNfU3RyZWFtV3JpdGVyPXB5dGhvbjM2LlB5Q29kZWNfU3RyZWFtV3JpdGVyCisgIFB5Q29kZWNfU3RyaWN0RXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfU3RyaWN0RXJyb3JzCisgIFB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycworICBQeUNvbXBsZXhfRnJvbURvdWJsZXM9cHl0aG9uMzYuUHlDb21wbGV4X0Zyb21Eb3VibGVzCisgIFB5Q29tcGxleF9JbWFnQXNEb3VibGU9cHl0aG9uMzYuUHlDb21wbGV4X0ltYWdBc0RvdWJsZQorICBQeUNvbXBsZXhfUmVhbEFzRG91YmxlPXB5dGhvbjM2LlB5Q29tcGxleF9SZWFsQXNEb3VibGUKKyAgUHlDb21wbGV4X1R5cGU9cHl0aG9uMzYuUHlDb21wbGV4X1R5cGUgREFUQQorICBQeURlc2NyX05ld0NsYXNzTWV0aG9kPXB5dGhvbjM2LlB5RGVzY3JfTmV3Q2xhc3NNZXRob2QKKyAgUHlEZXNjcl9OZXdHZXRTZXQ9cHl0aG9uMzYuUHlEZXNjcl9OZXdHZXRTZXQKKyAgUHlEZXNjcl9OZXdNZW1iZXI9cHl0aG9uMzYuUHlEZXNjcl9OZXdNZW1iZXIKKyAgUHlEZXNjcl9OZXdNZXRob2Q9cHl0aG9uMzYuUHlEZXNjcl9OZXdNZXRob2QKKyAgUHlEaWN0SXRlbXNfVHlwZT1weXRob24zNi5QeURpY3RJdGVtc19UeXBlIERBVEEKKyAgUHlEaWN0SXRlckl0ZW1fVHlwZT1weXRob24zNi5QeURpY3RJdGVySXRlbV9UeXBlIERBVEEKKyAgUHlEaWN0SXRlcktleV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJLZXlfVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJWYWx1ZV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJWYWx1ZV9UeXBlIERBVEEKKyAgUHlEaWN0S2V5c19UeXBlPXB5dGhvbjM2LlB5RGljdEtleXNfVHlwZSBEQVRBCisgIFB5RGljdFByb3h5X05ldz1weXRob24zNi5QeURpY3RQcm94eV9OZXcKKyAgUHlEaWN0UHJveHlfVHlwZT1weXRob24zNi5QeURpY3RQcm94eV9UeXBlIERBVEEKKyAgUHlEaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzYuUHlEaWN0VmFsdWVzX1R5cGUgREFUQQorICBQeURpY3RfQ2xlYXI9cHl0aG9uMzYuUHlEaWN0X0NsZWFyCisgIFB5RGljdF9Db250YWlucz1weXRob24zNi5QeURpY3RfQ29udGFpbnMKKyAgUHlEaWN0X0NvcHk9cHl0aG9uMzYuUHlEaWN0X0NvcHkKKyAgUHlEaWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlEaWN0X0RlbEl0ZW0KKyAgUHlEaWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X0RlbEl0ZW1TdHJpbmcKKyAgUHlEaWN0X0dldEl0ZW09cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW0KKyAgUHlEaWN0X0dldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW1TdHJpbmcKKyAgUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3I9cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IKKyAgUHlEaWN0X0l0ZW1zPXB5dGhvbjM2LlB5RGljdF9JdGVtcworICBQeURpY3RfS2V5cz1weXRob24zNi5QeURpY3RfS2V5cworICBQeURpY3RfTWVyZ2U9cHl0aG9uMzYuUHlEaWN0X01lcmdlCisgIFB5RGljdF9NZXJnZUZyb21TZXEyPXB5dGhvbjM2LlB5RGljdF9NZXJnZUZyb21TZXEyCisgIFB5RGljdF9OZXc9cHl0aG9uMzYuUHlEaWN0X05ldworICBQeURpY3RfTmV4dD1weXRob24zNi5QeURpY3RfTmV4dAorICBQeURpY3RfU2V0SXRlbT1weXRob24zNi5QeURpY3RfU2V0SXRlbQorICBQeURpY3RfU2V0SXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfU2V0SXRlbVN0cmluZworICBQeURpY3RfU2l6ZT1weXRob24zNi5QeURpY3RfU2l6ZQorICBQeURpY3RfVHlwZT1weXRob24zNi5QeURpY3RfVHlwZSBEQVRBCisgIFB5RGljdF9VcGRhdGU9cHl0aG9uMzYuUHlEaWN0X1VwZGF0ZQorICBQeURpY3RfVmFsdWVzPXB5dGhvbjM2LlB5RGljdF9WYWx1ZXMKKyAgUHlFbGxpcHNpc19UeXBlPXB5dGhvbjM2LlB5RWxsaXBzaXNfVHlwZSBEQVRBCisgIFB5RW51bV9UeXBlPXB5dGhvbjM2LlB5RW51bV9UeXBlIERBVEEKKyAgUHlFcnJfQmFkQXJndW1lbnQ9cHl0aG9uMzYuUHlFcnJfQmFkQXJndW1lbnQKKyAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM2LlB5RXJyX0JhZEludGVybmFsQ2FsbAorICBQeUVycl9DaGVja1NpZ25hbHM9cHl0aG9uMzYuUHlFcnJfQ2hlY2tTaWduYWxzCisgIFB5RXJyX0NsZWFyPXB5dGhvbjM2LlB5RXJyX0NsZWFyCisgIFB5RXJyX0Rpc3BsYXk9cHl0aG9uMzYuUHlFcnJfRGlzcGxheQorICBQeUVycl9FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM2LlB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMKKyAgUHlFcnJfRmV0Y2g9cHl0aG9uMzYuUHlFcnJfRmV0Y2gKKyAgUHlFcnJfRm9ybWF0PXB5dGhvbjM2LlB5RXJyX0Zvcm1hdAorICBQeUVycl9Gb3JtYXRWPXB5dGhvbjM2LlB5RXJyX0Zvcm1hdFYKKyAgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM2LlB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcworICBQeUVycl9OZXdFeGNlcHRpb249cHl0aG9uMzYuUHlFcnJfTmV3RXhjZXB0aW9uCisgIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2M9cHl0aG9uMzYuUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYworICBQeUVycl9Ob01lbW9yeT1weXRob24zNi5QeUVycl9Ob01lbW9yeQorICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb249cHl0aG9uMzYuUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uCisgIFB5RXJyX09jY3VycmVkPXB5dGhvbjM2LlB5RXJyX09jY3VycmVkCisgIFB5RXJyX1ByaW50PXB5dGhvbjM2LlB5RXJyX1ByaW50CisgIFB5RXJyX1ByaW50RXg9cHl0aG9uMzYuUHlFcnJfUHJpbnRFeAorICBQeUVycl9Qcm9ncmFtVGV4dD1weXRob24zNi5QeUVycl9Qcm9ncmFtVGV4dAorICBQeUVycl9SZXN0b3JlPXB5dGhvbjM2LlB5RXJyX1Jlc3RvcmUKKyAgUHlFcnJfU2V0RnJvbUVycm5vPXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJubworICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU9cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lCisgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdD1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QKKyAgUHlFcnJfU2V0SW50ZXJydXB0PXB5dGhvbjM2LlB5RXJyX1NldEludGVycnVwdAorICBQeUVycl9TZXROb25lPXB5dGhvbjM2LlB5RXJyX1NldE5vbmUKKyAgUHlFcnJfU2V0T2JqZWN0PXB5dGhvbjM2LlB5RXJyX1NldE9iamVjdAorICBQeUVycl9TZXRTdHJpbmc9cHl0aG9uMzYuUHlFcnJfU2V0U3RyaW5nCisgIFB5RXJyX1N5bnRheExvY2F0aW9uPXB5dGhvbjM2LlB5RXJyX1N5bnRheExvY2F0aW9uCisgIFB5RXJyX1dhcm5FeD1weXRob24zNi5QeUVycl9XYXJuRXgKKyAgUHlFcnJfV2FybkV4cGxpY2l0PXB5dGhvbjM2LlB5RXJyX1dhcm5FeHBsaWNpdAorICBQeUVycl9XYXJuRm9ybWF0PXB5dGhvbjM2LlB5RXJyX1dhcm5Gb3JtYXQKKyAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlPXB5dGhvbjM2LlB5RXJyX1dyaXRlVW5yYWlzYWJsZQorICBQeUV2YWxfQWNxdWlyZUxvY2s9cHl0aG9uMzYuUHlFdmFsX0FjcXVpcmVMb2NrCisgIFB5RXZhbF9BY3F1aXJlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9BY3F1aXJlVGhyZWFkCisgIFB5RXZhbF9DYWxsRnVuY3Rpb249cHl0aG9uMzYuUHlFdmFsX0NhbGxGdW5jdGlvbgorICBQeUV2YWxfQ2FsbE1ldGhvZD1weXRob24zNi5QeUV2YWxfQ2FsbE1ldGhvZAorICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcz1weXRob24zNi5QeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcworICBQeUV2YWxfRXZhbENvZGU9cHl0aG9uMzYuUHlFdmFsX0V2YWxDb2RlCisgIFB5RXZhbF9FdmFsQ29kZUV4PXB5dGhvbjM2LlB5RXZhbF9FdmFsQ29kZUV4CisgIFB5RXZhbF9FdmFsRnJhbWU9cHl0aG9uMzYuUHlFdmFsX0V2YWxGcmFtZQorICBQeUV2YWxfRXZhbEZyYW1lRXg9cHl0aG9uMzYuUHlFdmFsX0V2YWxGcmFtZUV4CisgIFB5RXZhbF9HZXRCdWlsdGlucz1weXRob24zNi5QeUV2YWxfR2V0QnVpbHRpbnMKKyAgUHlFdmFsX0dldENhbGxTdGF0cz1weXRob24zNi5QeUV2YWxfR2V0Q2FsbFN0YXRzCisgIFB5RXZhbF9HZXRGcmFtZT1weXRob24zNi5QeUV2YWxfR2V0RnJhbWUKKyAgUHlFdmFsX0dldEZ1bmNEZXNjPXB5dGhvbjM2LlB5RXZhbF9HZXRGdW5jRGVzYworICBQeUV2YWxfR2V0RnVuY05hbWU9cHl0aG9uMzYuUHlFdmFsX0dldEZ1bmNOYW1lCisgIFB5RXZhbF9HZXRHbG9iYWxzPXB5dGhvbjM2LlB5RXZhbF9HZXRHbG9iYWxzCisgIFB5RXZhbF9HZXRMb2NhbHM9cHl0aG9uMzYuUHlFdmFsX0dldExvY2FscworICBQeUV2YWxfSW5pdFRocmVhZHM9cHl0aG9uMzYuUHlFdmFsX0luaXRUaHJlYWRzCisgIFB5RXZhbF9SZUluaXRUaHJlYWRzPXB5dGhvbjM2LlB5RXZhbF9SZUluaXRUaHJlYWRzCisgIFB5RXZhbF9SZWxlYXNlTG9jaz1weXRob24zNi5QeUV2YWxfUmVsZWFzZUxvY2sKKyAgUHlFdmFsX1JlbGVhc2VUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1JlbGVhc2VUaHJlYWQKKyAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1Jlc3RvcmVUaHJlYWQKKyAgUHlFdmFsX1NhdmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1NhdmVUaHJlYWQKKyAgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZD1weXRob24zNi5QeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkCisgIFB5RXhjX0FyaXRobWV0aWNFcnJvcj1weXRob24zNi5QeUV4Y19Bcml0aG1ldGljRXJyb3IgREFUQQorICBQeUV4Y19Bc3NlcnRpb25FcnJvcj1weXRob24zNi5QeUV4Y19Bc3NlcnRpb25FcnJvciBEQVRBCisgIFB5RXhjX0F0dHJpYnV0ZUVycm9yPXB5dGhvbjM2LlB5RXhjX0F0dHJpYnV0ZUVycm9yIERBVEEKKyAgUHlFeGNfQmFzZUV4Y2VwdGlvbj1weXRob24zNi5QeUV4Y19CYXNlRXhjZXB0aW9uIERBVEEKKyAgUHlFeGNfQnVmZmVyRXJyb3I9cHl0aG9uMzYuUHlFeGNfQnVmZmVyRXJyb3IgREFUQQorICBQeUV4Y19CeXRlc1dhcm5pbmc9cHl0aG9uMzYuUHlFeGNfQnl0ZXNXYXJuaW5nIERBVEEKKyAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCisgIFB5RXhjX0VPRkVycm9yPXB5dGhvbjM2LlB5RXhjX0VPRkVycm9yIERBVEEKKyAgUHlFeGNfRW52aXJvbm1lbnRFcnJvcj1weXRob24zNi5QeUV4Y19FbnZpcm9ubWVudEVycm9yIERBVEEKKyAgUHlFeGNfRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXhjX0V4Y2VwdGlvbiBEQVRBCisgIFB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvcj1weXRob24zNi5QeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IgREFUQQorICBQeUV4Y19GdXR1cmVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0Z1dHVyZVdhcm5pbmcgREFUQQorICBQeUV4Y19HZW5lcmF0b3JFeGl0PXB5dGhvbjM2LlB5RXhjX0dlbmVyYXRvckV4aXQgREFUQQorICBQeUV4Y19JT0Vycm9yPXB5dGhvbjM2LlB5RXhjX0lPRXJyb3IgREFUQQorICBQeUV4Y19JbXBvcnRFcnJvcj1weXRob24zNi5QeUV4Y19JbXBvcnRFcnJvciBEQVRBCisgIFB5RXhjX0ltcG9ydFdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfSW1wb3J0V2FybmluZyBEQVRBCisgIFB5RXhjX0luZGVudGF0aW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfSW5kZW50YXRpb25FcnJvciBEQVRBCisgIFB5RXhjX0luZGV4RXJyb3I9cHl0aG9uMzYuUHlFeGNfSW5kZXhFcnJvciBEQVRBCisgIFB5RXhjX0tleUVycm9yPXB5dGhvbjM2LlB5RXhjX0tleUVycm9yIERBVEEKKyAgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ9cHl0aG9uMzYuUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQgREFUQQorICBQeUV4Y19Mb29rdXBFcnJvcj1weXRob24zNi5QeUV4Y19Mb29rdXBFcnJvciBEQVRBCisgIFB5RXhjX01lbW9yeUVycm9yPXB5dGhvbjM2LlB5RXhjX01lbW9yeUVycm9yIERBVEEKKyAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0PXB5dGhvbjM2LlB5RXhjX01lbW9yeUVycm9ySW5zdCBEQVRBCisgIFB5RXhjX05hbWVFcnJvcj1weXRob24zNi5QeUV4Y19OYW1lRXJyb3IgREFUQQorICBQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yPXB5dGhvbjM2LlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IgREFUQQorICBQeUV4Y19PU0Vycm9yPXB5dGhvbjM2LlB5RXhjX09TRXJyb3IgREFUQQorICBQeUV4Y19PdmVyZmxvd0Vycm9yPXB5dGhvbjM2LlB5RXhjX092ZXJmbG93RXJyb3IgREFUQQorICBQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgREFUQQorICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q9cHl0aG9uMzYuUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0IERBVEEKKyAgUHlFeGNfUmVmZXJlbmNlRXJyb3I9cHl0aG9uMzYuUHlFeGNfUmVmZXJlbmNlRXJyb3IgREFUQQorICBQeUV4Y19SdW50aW1lRXJyb3I9cHl0aG9uMzYuUHlFeGNfUnVudGltZUVycm9yIERBVEEKKyAgUHlFeGNfUnVudGltZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfUnVudGltZVdhcm5pbmcgREFUQQorICBQeUV4Y19TdG9wSXRlcmF0aW9uPXB5dGhvbjM2LlB5RXhjX1N0b3BJdGVyYXRpb24gREFUQQorICBQeUV4Y19TeW50YXhFcnJvcj1weXRob24zNi5QeUV4Y19TeW50YXhFcnJvciBEQVRBCisgIFB5RXhjX1N5bnRheFdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfU3ludGF4V2FybmluZyBEQVRBCisgIFB5RXhjX1N5c3RlbUVycm9yPXB5dGhvbjM2LlB5RXhjX1N5c3RlbUVycm9yIERBVEEKKyAgUHlFeGNfU3lzdGVtRXhpdD1weXRob24zNi5QeUV4Y19TeXN0ZW1FeGl0IERBVEEKKyAgUHlFeGNfVGFiRXJyb3I9cHl0aG9uMzYuUHlFeGNfVGFiRXJyb3IgREFUQQorICBQeUV4Y19UeXBlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVHlwZUVycm9yIERBVEEKKyAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZURlY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfVW5pY29kZVdhcm5pbmcgREFUQQorICBQeUV4Y19Vc2VyV2FybmluZz1weXRob24zNi5QeUV4Y19Vc2VyV2FybmluZyBEQVRBCisgIFB5RXhjX1ZhbHVlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVmFsdWVFcnJvciBEQVRBCisgIFB5RXhjX1dhcm5pbmc9cHl0aG9uMzYuUHlFeGNfV2FybmluZyBEQVRBCisgIFB5RXhjX1plcm9EaXZpc2lvbkVycm9yPXB5dGhvbjM2LlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIERBVEEKKyAgUHlFeGNlcHRpb25fR2V0Q2F1c2U9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0Q2F1c2UKKyAgUHlFeGNlcHRpb25fR2V0Q29udGV4dD1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRDb250ZXh0CisgIFB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaz1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2sKKyAgUHlFeGNlcHRpb25fU2V0Q2F1c2U9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0Q2F1c2UKKyAgUHlFeGNlcHRpb25fU2V0Q29udGV4dD1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRDb250ZXh0CisgIFB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaz1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sKKyAgUHlGaWxlX0Zyb21GZD1weXRob24zNi5QeUZpbGVfRnJvbUZkCisgIFB5RmlsZV9HZXRMaW5lPXB5dGhvbjM2LlB5RmlsZV9HZXRMaW5lCisgIFB5RmlsZV9Xcml0ZU9iamVjdD1weXRob24zNi5QeUZpbGVfV3JpdGVPYmplY3QKKyAgUHlGaWxlX1dyaXRlU3RyaW5nPXB5dGhvbjM2LlB5RmlsZV9Xcml0ZVN0cmluZworICBQeUZpbHRlcl9UeXBlPXB5dGhvbjM2LlB5RmlsdGVyX1R5cGUgREFUQQorICBQeUZsb2F0X0FzRG91YmxlPXB5dGhvbjM2LlB5RmxvYXRfQXNEb3VibGUKKyAgUHlGbG9hdF9Gcm9tRG91YmxlPXB5dGhvbjM2LlB5RmxvYXRfRnJvbURvdWJsZQorICBQeUZsb2F0X0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlGbG9hdF9Gcm9tU3RyaW5nCisgIFB5RmxvYXRfR2V0SW5mbz1weXRob24zNi5QeUZsb2F0X0dldEluZm8KKyAgUHlGbG9hdF9HZXRNYXg9cHl0aG9uMzYuUHlGbG9hdF9HZXRNYXgKKyAgUHlGbG9hdF9HZXRNaW49cHl0aG9uMzYuUHlGbG9hdF9HZXRNaW4KKyAgUHlGbG9hdF9UeXBlPXB5dGhvbjM2LlB5RmxvYXRfVHlwZSBEQVRBCisgIFB5RnJvemVuU2V0X05ldz1weXRob24zNi5QeUZyb3plblNldF9OZXcKKyAgUHlGcm96ZW5TZXRfVHlwZT1weXRob24zNi5QeUZyb3plblNldF9UeXBlIERBVEEKKyAgUHlHQ19Db2xsZWN0PXB5dGhvbjM2LlB5R0NfQ29sbGVjdAorICBQeUdJTFN0YXRlX0Vuc3VyZT1weXRob24zNi5QeUdJTFN0YXRlX0Vuc3VyZQorICBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZT1weXRob24zNi5QeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZQorICBQeUdJTFN0YXRlX1JlbGVhc2U9cHl0aG9uMzYuUHlHSUxTdGF0ZV9SZWxlYXNlCisgIFB5R2V0U2V0RGVzY3JfVHlwZT1weXRob24zNi5QeUdldFNldERlc2NyX1R5cGUgREFUQQorICBQeUltcG9ydF9BZGRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfQWRkTW9kdWxlCisgIFB5SW1wb3J0X0FwcGVuZEluaXR0YWI9cHl0aG9uMzYuUHlJbXBvcnRfQXBwZW5kSW5pdHRhYgorICBQeUltcG9ydF9DbGVhbnVwPXB5dGhvbjM2LlB5SW1wb3J0X0NsZWFudXAKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeD1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4CisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcz1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXMKKyAgUHlJbXBvcnRfR2V0SW1wb3J0ZXI9cHl0aG9uMzYuUHlJbXBvcnRfR2V0SW1wb3J0ZXIKKyAgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXI9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIKKyAgUHlJbXBvcnRfR2V0TWFnaWNUYWc9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TWFnaWNUYWcKKyAgUHlJbXBvcnRfR2V0TW9kdWxlRGljdD1weXRob24zNi5QeUltcG9ydF9HZXRNb2R1bGVEaWN0CisgIFB5SW1wb3J0X0ltcG9ydD1weXRob24zNi5QeUltcG9ydF9JbXBvcnQKKyAgUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZQorICBQeUltcG9ydF9JbXBvcnRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2s9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaworICBQeUltcG9ydF9SZWxvYWRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfUmVsb2FkTW9kdWxlCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcj1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfQ2xlYXIKKyAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZT1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfRGVsZXRlCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXc9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX05ldworICBQeUl0ZXJfTmV4dD1weXRob24zNi5QeUl0ZXJfTmV4dAorICBQeUxpc3RJdGVyX1R5cGU9cHl0aG9uMzYuUHlMaXN0SXRlcl9UeXBlIERBVEEKKyAgUHlMaXN0UmV2SXRlcl9UeXBlPXB5dGhvbjM2LlB5TGlzdFJldkl0ZXJfVHlwZSBEQVRBCisgIFB5TGlzdF9BcHBlbmQ9cHl0aG9uMzYuUHlMaXN0X0FwcGVuZAorICBQeUxpc3RfQXNUdXBsZT1weXRob24zNi5QeUxpc3RfQXNUdXBsZQorICBQeUxpc3RfR2V0SXRlbT1weXRob24zNi5QeUxpc3RfR2V0SXRlbQorICBQeUxpc3RfR2V0U2xpY2U9cHl0aG9uMzYuUHlMaXN0X0dldFNsaWNlCisgIFB5TGlzdF9JbnNlcnQ9cHl0aG9uMzYuUHlMaXN0X0luc2VydAorICBQeUxpc3RfTmV3PXB5dGhvbjM2LlB5TGlzdF9OZXcKKyAgUHlMaXN0X1JldmVyc2U9cHl0aG9uMzYuUHlMaXN0X1JldmVyc2UKKyAgUHlMaXN0X1NldEl0ZW09cHl0aG9uMzYuUHlMaXN0X1NldEl0ZW0KKyAgUHlMaXN0X1NldFNsaWNlPXB5dGhvbjM2LlB5TGlzdF9TZXRTbGljZQorICBQeUxpc3RfU2l6ZT1weXRob24zNi5QeUxpc3RfU2l6ZQorICBQeUxpc3RfU29ydD1weXRob24zNi5QeUxpc3RfU29ydAorICBQeUxpc3RfVHlwZT1weXRob24zNi5QeUxpc3RfVHlwZSBEQVRBCisgIFB5TG9uZ1JhbmdlSXRlcl9UeXBlPXB5dGhvbjM2LlB5TG9uZ1JhbmdlSXRlcl9UeXBlIERBVEEKKyAgUHlMb25nX0FzRG91YmxlPXB5dGhvbjM2LlB5TG9uZ19Bc0RvdWJsZQorICBQeUxvbmdfQXNMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmcKKyAgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdworICBQeUxvbmdfQXNMb25nTG9uZz1weXRob24zNi5QeUxvbmdfQXNMb25nTG9uZworICBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cKKyAgUHlMb25nX0FzU2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Bc1NpemVfdAorICBQeUxvbmdfQXNTc2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Bc1NzaXplX3QKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2s9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrCisgIFB5TG9uZ19Bc1ZvaWRQdHI9cHl0aG9uMzYuUHlMb25nX0FzVm9pZFB0cgorICBQeUxvbmdfRnJvbURvdWJsZT1weXRob24zNi5QeUxvbmdfRnJvbURvdWJsZQorICBQeUxvbmdfRnJvbUxvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21Mb25nCisgIFB5TG9uZ19Gcm9tTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21Mb25nTG9uZworICBQeUxvbmdfRnJvbVNpemVfdD1weXRob24zNi5QeUxvbmdfRnJvbVNpemVfdAorICBQeUxvbmdfRnJvbVNzaXplX3Q9cHl0aG9uMzYuUHlMb25nX0Zyb21Tc2l6ZV90CisgIFB5TG9uZ19Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tU3RyaW5nCisgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nCisgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKKyAgUHlMb25nX0Zyb21Wb2lkUHRyPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVm9pZFB0cgorICBQeUxvbmdfR2V0SW5mbz1weXRob24zNi5QeUxvbmdfR2V0SW5mbworICBQeUxvbmdfVHlwZT1weXRob24zNi5QeUxvbmdfVHlwZSBEQVRBCisgIFB5TWFwX1R5cGU9cHl0aG9uMzYuUHlNYXBfVHlwZSBEQVRBCisgIFB5TWFwcGluZ19DaGVjaz1weXRob24zNi5QeU1hcHBpbmdfQ2hlY2sKKyAgUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcKKyAgUHlNYXBwaW5nX0hhc0tleT1weXRob24zNi5QeU1hcHBpbmdfSGFzS2V5CisgIFB5TWFwcGluZ19IYXNLZXlTdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX0hhc0tleVN0cmluZworICBQeU1hcHBpbmdfSXRlbXM9cHl0aG9uMzYuUHlNYXBwaW5nX0l0ZW1zCisgIFB5TWFwcGluZ19LZXlzPXB5dGhvbjM2LlB5TWFwcGluZ19LZXlzCisgIFB5TWFwcGluZ19MZW5ndGg9cHl0aG9uMzYuUHlNYXBwaW5nX0xlbmd0aAorICBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfU2V0SXRlbVN0cmluZworICBQeU1hcHBpbmdfU2l6ZT1weXRob24zNi5QeU1hcHBpbmdfU2l6ZQorICBQeU1hcHBpbmdfVmFsdWVzPXB5dGhvbjM2LlB5TWFwcGluZ19WYWx1ZXMKKyAgUHlNZW1fRnJlZT1weXRob24zNi5QeU1lbV9GcmVlCisgIFB5TWVtX01hbGxvYz1weXRob24zNi5QeU1lbV9NYWxsb2MKKyAgUHlNZW1fUmVhbGxvYz1weXRob24zNi5QeU1lbV9SZWFsbG9jCisgIFB5TWVtYmVyRGVzY3JfVHlwZT1weXRob24zNi5QeU1lbWJlckRlc2NyX1R5cGUgREFUQQorICBQeU1lbW9yeVZpZXdfRnJvbU9iamVjdD1weXRob24zNi5QeU1lbW9yeVZpZXdfRnJvbU9iamVjdAorICBQeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cz1weXRob24zNi5QeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cworICBQeU1lbW9yeVZpZXdfVHlwZT1weXRob24zNi5QeU1lbW9yeVZpZXdfVHlwZSBEQVRBCisgIFB5TWV0aG9kRGVzY3JfVHlwZT1weXRob24zNi5QeU1ldGhvZERlc2NyX1R5cGUgREFUQQorICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudD1weXRob24zNi5QeU1vZHVsZV9BZGRJbnRDb25zdGFudAorICBQeU1vZHVsZV9BZGRPYmplY3Q9cHl0aG9uMzYuUHlNb2R1bGVfQWRkT2JqZWN0CisgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50PXB5dGhvbjM2LlB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50CisgIFB5TW9kdWxlX0NyZWF0ZTI9cHl0aG9uMzYuUHlNb2R1bGVfQ3JlYXRlMgorICBQeU1vZHVsZV9HZXREZWY9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RGVmCisgIFB5TW9kdWxlX0dldERpY3Q9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RGljdAorICBQeU1vZHVsZV9HZXRGaWxlbmFtZT1weXRob24zNi5QeU1vZHVsZV9HZXRGaWxlbmFtZQorICBQeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdD1weXRob24zNi5QeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdAorICBQeU1vZHVsZV9HZXROYW1lPXB5dGhvbjM2LlB5TW9kdWxlX0dldE5hbWUKKyAgUHlNb2R1bGVfR2V0U3RhdGU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0U3RhdGUKKyAgUHlNb2R1bGVfTmV3PXB5dGhvbjM2LlB5TW9kdWxlX05ldworICBQeU1vZHVsZV9UeXBlPXB5dGhvbjM2LlB5TW9kdWxlX1R5cGUgREFUQQorICBQeU1vZHVsZURlZl9Jbml0PXB5dGhvbjM2LlB5TW9kdWxlRGVmX0luaXQKKyAgUHlNb2R1bGVEZWZfVHlwZT1weXRob24zNi5QeU1vZHVsZURlZl9UeXBlIERBVEEKKyAgUHlOdWxsSW1wb3J0ZXJfVHlwZT1weXRob24zNi5QeU51bGxJbXBvcnRlcl9UeXBlIERBVEEKKyAgUHlOdW1iZXJfQWJzb2x1dGU9cHl0aG9uMzYuUHlOdW1iZXJfQWJzb2x1dGUKKyAgUHlOdW1iZXJfQWRkPXB5dGhvbjM2LlB5TnVtYmVyX0FkZAorICBQeU51bWJlcl9BbmQ9cHl0aG9uMzYuUHlOdW1iZXJfQW5kCisgIFB5TnVtYmVyX0FzU3NpemVfdD1weXRob24zNi5QeU51bWJlcl9Bc1NzaXplX3QKKyAgUHlOdW1iZXJfQ2hlY2s9cHl0aG9uMzYuUHlOdW1iZXJfQ2hlY2sKKyAgUHlOdW1iZXJfRGl2bW9kPXB5dGhvbjM2LlB5TnVtYmVyX0Rpdm1vZAorICBQeU51bWJlcl9GbG9hdD1weXRob24zNi5QeU51bWJlcl9GbG9hdAorICBQeU51bWJlcl9GbG9vckRpdmlkZT1weXRob24zNi5QeU51bWJlcl9GbG9vckRpdmlkZQorICBQeU51bWJlcl9JblBsYWNlQWRkPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VBZGQKKyAgUHlOdW1iZXJfSW5QbGFjZUFuZD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlQW5kCisgIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZUxzaGlmdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlTHNoaWZ0CisgIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlTXVsdGlwbHkKKyAgUHlOdW1iZXJfSW5QbGFjZU9yPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VPcgorICBQeU51bWJlcl9JblBsYWNlUG93ZXI9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVBvd2VyCisgIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcgorICBQeU51bWJlcl9JblBsYWNlUnNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VSc2hpZnQKKyAgUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdAorICBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZQorICBQeU51bWJlcl9JblBsYWNlWG9yPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VYb3IKKyAgUHlOdW1iZXJfSW5kZXg9cHl0aG9uMzYuUHlOdW1iZXJfSW5kZXgKKyAgUHlOdW1iZXJfSW52ZXJ0PXB5dGhvbjM2LlB5TnVtYmVyX0ludmVydAorICBQeU51bWJlcl9Mb25nPXB5dGhvbjM2LlB5TnVtYmVyX0xvbmcKKyAgUHlOdW1iZXJfTHNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0xzaGlmdAorICBQeU51bWJlcl9NdWx0aXBseT1weXRob24zNi5QeU51bWJlcl9NdWx0aXBseQorICBQeU51bWJlcl9OZWdhdGl2ZT1weXRob24zNi5QeU51bWJlcl9OZWdhdGl2ZQorICBQeU51bWJlcl9Pcj1weXRob24zNi5QeU51bWJlcl9PcgorICBQeU51bWJlcl9Qb3NpdGl2ZT1weXRob24zNi5QeU51bWJlcl9Qb3NpdGl2ZQorICBQeU51bWJlcl9Qb3dlcj1weXRob24zNi5QeU51bWJlcl9Qb3dlcgorICBQeU51bWJlcl9SZW1haW5kZXI9cHl0aG9uMzYuUHlOdW1iZXJfUmVtYWluZGVyCisgIFB5TnVtYmVyX1JzaGlmdD1weXRob24zNi5QeU51bWJlcl9Sc2hpZnQKKyAgUHlOdW1iZXJfU3VidHJhY3Q9cHl0aG9uMzYuUHlOdW1iZXJfU3VidHJhY3QKKyAgUHlOdW1iZXJfVG9CYXNlPXB5dGhvbjM2LlB5TnVtYmVyX1RvQmFzZQorICBQeU51bWJlcl9UcnVlRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX1RydWVEaXZpZGUKKyAgUHlOdW1iZXJfWG9yPXB5dGhvbjM2LlB5TnVtYmVyX1hvcgorICBQeU9TX0FmdGVyRm9yaz1weXRob24zNi5QeU9TX0FmdGVyRm9yaworICBQeU9TX0luaXRJbnRlcnJ1cHRzPXB5dGhvbjM2LlB5T1NfSW5pdEludGVycnVwdHMKKyAgUHlPU19JbnB1dEhvb2s9cHl0aG9uMzYuUHlPU19JbnB1dEhvb2sgREFUQQorICBQeU9TX0ludGVycnVwdE9jY3VycmVkPXB5dGhvbjM2LlB5T1NfSW50ZXJydXB0T2NjdXJyZWQKKyAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcj1weXRob24zNi5QeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyIERBVEEKKyAgUHlPU19kb3VibGVfdG9fc3RyaW5nPXB5dGhvbjM2LlB5T1NfZG91YmxlX3RvX3N0cmluZworICBQeU9TX2dldHNpZz1weXRob24zNi5QeU9TX2dldHNpZworICBQeU9TX215c3RyaWNtcD1weXRob24zNi5QeU9TX215c3RyaWNtcAorICBQeU9TX215c3RybmljbXA9cHl0aG9uMzYuUHlPU19teXN0cm5pY21wCisgIFB5T1Nfc2V0c2lnPXB5dGhvbjM2LlB5T1Nfc2V0c2lnCisgIFB5T1Nfc25wcmludGY9cHl0aG9uMzYuUHlPU19zbnByaW50ZgorICBQeU9TX3N0cmluZ190b19kb3VibGU9cHl0aG9uMzYuUHlPU19zdHJpbmdfdG9fZG91YmxlCisgIFB5T1Nfc3RydG9sPXB5dGhvbjM2LlB5T1Nfc3RydG9sCisgIFB5T1Nfc3RydG91bD1weXRob24zNi5QeU9TX3N0cnRvdWwKKyAgUHlPU192c25wcmludGY9cHl0aG9uMzYuUHlPU192c25wcmludGYKKyAgUHlPYmplY3RfQVNDSUk9cHl0aG9uMzYuUHlPYmplY3RfQVNDSUkKKyAgUHlPYmplY3RfQXNDaGFyQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzQ2hhckJ1ZmZlcgorICBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yPXB5dGhvbjM2LlB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IKKyAgUHlPYmplY3RfQXNSZWFkQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzUmVhZEJ1ZmZlcgorICBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzV3JpdGVCdWZmZXIKKyAgUHlPYmplY3RfQnl0ZXM9cHl0aG9uMzYuUHlPYmplY3RfQnl0ZXMKKyAgUHlPYmplY3RfQ2FsbD1weXRob24zNi5QeU9iamVjdF9DYWxsCisgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbj1weXRob24zNi5QeU9iamVjdF9DYWxsRnVuY3Rpb24KKyAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncz1weXRob24zNi5QeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzCisgIFB5T2JqZWN0X0NhbGxNZXRob2Q9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE1ldGhvZAorICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncz1weXRob24zNi5QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncworICBQeU9iamVjdF9DYWxsT2JqZWN0PXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxPYmplY3QKKyAgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcgorICBQeU9iamVjdF9DbGVhcldlYWtSZWZzPXB5dGhvbjM2LlB5T2JqZWN0X0NsZWFyV2Vha1JlZnMKKyAgUHlPYmplY3RfRGVsSXRlbT1weXRob24zNi5QeU9iamVjdF9EZWxJdGVtCisgIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfRGVsSXRlbVN0cmluZworICBQeU9iamVjdF9EaXI9cHl0aG9uMzYuUHlPYmplY3RfRGlyCisgIFB5T2JqZWN0X0Zvcm1hdD1weXRob24zNi5QeU9iamVjdF9Gb3JtYXQKKyAgUHlPYmplY3RfRnJlZT1weXRob24zNi5QeU9iamVjdF9GcmVlCisgIFB5T2JqZWN0X0dDX0RlbD1weXRob24zNi5QeU9iamVjdF9HQ19EZWwKKyAgUHlPYmplY3RfR0NfVHJhY2s9cHl0aG9uMzYuUHlPYmplY3RfR0NfVHJhY2sKKyAgUHlPYmplY3RfR0NfVW5UcmFjaz1weXRob24zNi5QeU9iamVjdF9HQ19VblRyYWNrCisgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyCisgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyCisgIFB5T2JqZWN0X0dldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2V0QXR0cgorICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0dldEF0dHJTdHJpbmcKKyAgUHlPYmplY3RfR2V0SXRlbT1weXRob24zNi5QeU9iamVjdF9HZXRJdGVtCisgIFB5T2JqZWN0X0dldEl0ZXI9cHl0aG9uMzYuUHlPYmplY3RfR2V0SXRlcgorICBQeU9iamVjdF9IYXNBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0hhc0F0dHIKKyAgUHlPYmplY3RfSGFzQXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9IYXNBdHRyU3RyaW5nCisgIFB5T2JqZWN0X0hhc2g9cHl0aG9uMzYuUHlPYmplY3RfSGFzaAorICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ9cHl0aG9uMzYuUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkCisgIFB5T2JqZWN0X0luaXQ9cHl0aG9uMzYuUHlPYmplY3RfSW5pdAorICBQeU9iamVjdF9Jbml0VmFyPXB5dGhvbjM2LlB5T2JqZWN0X0luaXRWYXIKKyAgUHlPYmplY3RfSXNJbnN0YW5jZT1weXRob24zNi5QeU9iamVjdF9Jc0luc3RhbmNlCisgIFB5T2JqZWN0X0lzU3ViY2xhc3M9cHl0aG9uMzYuUHlPYmplY3RfSXNTdWJjbGFzcworICBQeU9iamVjdF9Jc1RydWU9cHl0aG9uMzYuUHlPYmplY3RfSXNUcnVlCisgIFB5T2JqZWN0X0xlbmd0aD1weXRob24zNi5QeU9iamVjdF9MZW5ndGgKKyAgUHlPYmplY3RfTWFsbG9jPXB5dGhvbjM2LlB5T2JqZWN0X01hbGxvYworICBQeU9iamVjdF9Ob3Q9cHl0aG9uMzYuUHlPYmplY3RfTm90CisgIFB5T2JqZWN0X1JlYWxsb2M9cHl0aG9uMzYuUHlPYmplY3RfUmVhbGxvYworICBQeU9iamVjdF9SZXByPXB5dGhvbjM2LlB5T2JqZWN0X1JlcHIKKyAgUHlPYmplY3RfUmljaENvbXBhcmU9cHl0aG9uMzYuUHlPYmplY3RfUmljaENvbXBhcmUKKyAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sPXB5dGhvbjM2LlB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbAorICBQeU9iamVjdF9TZWxmSXRlcj1weXRob24zNi5QeU9iamVjdF9TZWxmSXRlcgorICBQeU9iamVjdF9TZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X1NldEF0dHIKKyAgUHlPYmplY3RfU2V0QXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9TZXRBdHRyU3RyaW5nCisgIFB5T2JqZWN0X1NldEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfU2V0SXRlbQorICBQeU9iamVjdF9TaXplPXB5dGhvbjM2LlB5T2JqZWN0X1NpemUKKyAgUHlPYmplY3RfU3RyPXB5dGhvbjM2LlB5T2JqZWN0X1N0cgorICBQeU9iamVjdF9UeXBlPXB5dGhvbjM2LlB5T2JqZWN0X1R5cGUgREFUQQorICBQeU9EaWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlPRGljdF9EZWxJdGVtCisgIFB5T0RpY3RfTmV3PXB5dGhvbjM2LlB5T0RpY3RfTmV3CisgIFB5T0RpY3RfU2V0SXRlbT1weXRob24zNi5QeU9EaWN0X1NldEl0ZW0KKyAgUHlPRGljdF9UeXBlPXB5dGhvbjM2LlB5T0RpY3RfVHlwZSBEQVRBCisgIFB5T0RpY3RJdGVtc19UeXBlPXB5dGhvbjM2LlB5T0RpY3RJdGVtc19UeXBlIERBVEEKKyAgUHlPRGljdEl0ZXJfVHlwZT1weXRob24zNi5QeU9EaWN0SXRlcl9UeXBlIERBVEEKKyAgUHlPRGljdEtleXNfVHlwZT1weXRob24zNi5QeU9EaWN0S2V5c19UeXBlIERBVEEKKyAgUHlPRGljdFZhbHVlc19UeXBlPXB5dGhvbjM2LlB5T0RpY3RWYWx1ZXNfVHlwZSBEQVRBCisgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzPXB5dGhvbjM2LlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzCisgIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3M9cHl0aG9uMzYuUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncworICBQeVByb3BlcnR5X1R5cGU9cHl0aG9uMzYuUHlQcm9wZXJ0eV9UeXBlIERBVEEKKyAgUHlSYW5nZUl0ZXJfVHlwZT1weXRob24zNi5QeVJhbmdlSXRlcl9UeXBlIERBVEEKKyAgUHlSYW5nZV9UeXBlPXB5dGhvbjM2LlB5UmFuZ2VfVHlwZSBEQVRBCisgIFB5UmV2ZXJzZWRfVHlwZT1weXRob24zNi5QeVJldmVyc2VkX1R5cGUgREFUQQorICBQeVNlcUl0ZXJfTmV3PXB5dGhvbjM2LlB5U2VxSXRlcl9OZXcKKyAgUHlTZXFJdGVyX1R5cGU9cHl0aG9uMzYuUHlTZXFJdGVyX1R5cGUgREFUQQorICBQeVNlcXVlbmNlX0NoZWNrPXB5dGhvbjM2LlB5U2VxdWVuY2VfQ2hlY2sKKyAgUHlTZXF1ZW5jZV9Db25jYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db25jYXQKKyAgUHlTZXF1ZW5jZV9Db250YWlucz1weXRob24zNi5QeVNlcXVlbmNlX0NvbnRhaW5zCisgIFB5U2VxdWVuY2VfQ291bnQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db3VudAorICBQeVNlcXVlbmNlX0RlbEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9EZWxJdGVtCisgIFB5U2VxdWVuY2VfRGVsU2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9EZWxTbGljZQorICBQeVNlcXVlbmNlX0Zhc3Q9cHl0aG9uMzYuUHlTZXF1ZW5jZV9GYXN0CisgIFB5U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNi5QeVNlcXVlbmNlX0dldEl0ZW0KKyAgUHlTZXF1ZW5jZV9HZXRTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX0dldFNsaWNlCisgIFB5U2VxdWVuY2VfSW49cHl0aG9uMzYuUHlTZXF1ZW5jZV9JbgorICBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0CisgIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdD1weXRob24zNi5QeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQKKyAgUHlTZXF1ZW5jZV9JbmRleD1weXRob24zNi5QeVNlcXVlbmNlX0luZGV4CisgIFB5U2VxdWVuY2VfTGVuZ3RoPXB5dGhvbjM2LlB5U2VxdWVuY2VfTGVuZ3RoCisgIFB5U2VxdWVuY2VfTGlzdD1weXRob24zNi5QeVNlcXVlbmNlX0xpc3QKKyAgUHlTZXF1ZW5jZV9SZXBlYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9SZXBlYXQKKyAgUHlTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2V0SXRlbQorICBQeVNlcXVlbmNlX1NldFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2V0U2xpY2UKKyAgUHlTZXF1ZW5jZV9TaXplPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2l6ZQorICBQeVNlcXVlbmNlX1R1cGxlPXB5dGhvbjM2LlB5U2VxdWVuY2VfVHVwbGUKKyAgUHlTZXRJdGVyX1R5cGU9cHl0aG9uMzYuUHlTZXRJdGVyX1R5cGUgREFUQQorICBQeVNldF9BZGQ9cHl0aG9uMzYuUHlTZXRfQWRkCisgIFB5U2V0X0NsZWFyPXB5dGhvbjM2LlB5U2V0X0NsZWFyCisgIFB5U2V0X0NvbnRhaW5zPXB5dGhvbjM2LlB5U2V0X0NvbnRhaW5zCisgIFB5U2V0X0Rpc2NhcmQ9cHl0aG9uMzYuUHlTZXRfRGlzY2FyZAorICBQeVNldF9OZXc9cHl0aG9uMzYuUHlTZXRfTmV3CisgIFB5U2V0X1BvcD1weXRob24zNi5QeVNldF9Qb3AKKyAgUHlTZXRfU2l6ZT1weXRob24zNi5QeVNldF9TaXplCisgIFB5U2V0X1R5cGU9cHl0aG9uMzYuUHlTZXRfVHlwZSBEQVRBCisgIFB5U2xpY2VfR2V0SW5kaWNlcz1weXRob24zNi5QeVNsaWNlX0dldEluZGljZXMKKyAgUHlTbGljZV9HZXRJbmRpY2VzRXg9cHl0aG9uMzYuUHlTbGljZV9HZXRJbmRpY2VzRXgKKyAgUHlTbGljZV9OZXc9cHl0aG9uMzYuUHlTbGljZV9OZXcKKyAgUHlTbGljZV9UeXBlPXB5dGhvbjM2LlB5U2xpY2VfVHlwZSBEQVRBCisgIFB5U29ydFdyYXBwZXJfVHlwZT1weXRob24zNi5QeVNvcnRXcmFwcGVyX1R5cGUgREFUQQorICBQeVN0YXRlX0ZpbmRNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9GaW5kTW9kdWxlCisgIFB5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfQWRkTW9kdWxlCisgIFB5U3RhdGVfUmVtb3ZlTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfUmVtb3ZlTW9kdWxlCisgIFB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW0KKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXc9cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZQorICBQeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtCisgIFB5U3VwZXJfVHlwZT1weXRob24zNi5QeVN1cGVyX1R5cGUgREFUQQorICBQeVN5c19BZGRXYXJuT3B0aW9uPXB5dGhvbjM2LlB5U3lzX0FkZFdhcm5PcHRpb24KKyAgUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGU9cHl0aG9uMzYuUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGUKKyAgUHlTeXNfRm9ybWF0U3RkZXJyPXB5dGhvbjM2LlB5U3lzX0Zvcm1hdFN0ZGVycgorICBQeVN5c19Gb3JtYXRTdGRvdXQ9cHl0aG9uMzYuUHlTeXNfRm9ybWF0U3Rkb3V0CisgIFB5U3lzX0dldE9iamVjdD1weXRob24zNi5QeVN5c19HZXRPYmplY3QKKyAgUHlTeXNfSGFzV2Fybk9wdGlvbnM9cHl0aG9uMzYuUHlTeXNfSGFzV2Fybk9wdGlvbnMKKyAgUHlTeXNfUmVzZXRXYXJuT3B0aW9ucz1weXRob24zNi5QeVN5c19SZXNldFdhcm5PcHRpb25zCisgIFB5U3lzX1NldEFyZ3Y9cHl0aG9uMzYuUHlTeXNfU2V0QXJndgorICBQeVN5c19TZXRBcmd2RXg9cHl0aG9uMzYuUHlTeXNfU2V0QXJndkV4CisgIFB5U3lzX1NldE9iamVjdD1weXRob24zNi5QeVN5c19TZXRPYmplY3QKKyAgUHlTeXNfU2V0UGF0aD1weXRob24zNi5QeVN5c19TZXRQYXRoCisgIFB5U3lzX1dyaXRlU3RkZXJyPXB5dGhvbjM2LlB5U3lzX1dyaXRlU3RkZXJyCisgIFB5U3lzX1dyaXRlU3Rkb3V0PXB5dGhvbjM2LlB5U3lzX1dyaXRlU3Rkb3V0CisgIFB5VGhyZWFkU3RhdGVfQ2xlYXI9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9DbGVhcgorICBQeVRocmVhZFN0YXRlX0RlbGV0ZT1weXRob24zNi5QeVRocmVhZFN0YXRlX0RlbGV0ZQorICBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50CisgIFB5VGhyZWFkU3RhdGVfR2V0PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfR2V0CisgIFB5VGhyZWFkU3RhdGVfR2V0RGljdD1weXRob24zNi5QeVRocmVhZFN0YXRlX0dldERpY3QKKyAgUHlUaHJlYWRTdGF0ZV9OZXc9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9OZXcKKyAgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yz1weXRob24zNi5QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjCisgIFB5VGhyZWFkU3RhdGVfU3dhcD1weXRob24zNi5QeVRocmVhZFN0YXRlX1N3YXAKKyAgUHlUcmFjZUJhY2tfSGVyZT1weXRob24zNi5QeVRyYWNlQmFja19IZXJlCisgIFB5VHJhY2VCYWNrX1ByaW50PXB5dGhvbjM2LlB5VHJhY2VCYWNrX1ByaW50CisgIFB5VHJhY2VCYWNrX1R5cGU9cHl0aG9uMzYuUHlUcmFjZUJhY2tfVHlwZSBEQVRBCisgIFB5VHVwbGVJdGVyX1R5cGU9cHl0aG9uMzYuUHlUdXBsZUl0ZXJfVHlwZSBEQVRBCisgIFB5VHVwbGVfQ2xlYXJGcmVlTGlzdD1weXRob24zNi5QeVR1cGxlX0NsZWFyRnJlZUxpc3QKKyAgUHlUdXBsZV9HZXRJdGVtPXB5dGhvbjM2LlB5VHVwbGVfR2V0SXRlbQorICBQeVR1cGxlX0dldFNsaWNlPXB5dGhvbjM2LlB5VHVwbGVfR2V0U2xpY2UKKyAgUHlUdXBsZV9OZXc9cHl0aG9uMzYuUHlUdXBsZV9OZXcKKyAgUHlUdXBsZV9QYWNrPXB5dGhvbjM2LlB5VHVwbGVfUGFjaworICBQeVR1cGxlX1NldEl0ZW09cHl0aG9uMzYuUHlUdXBsZV9TZXRJdGVtCisgIFB5VHVwbGVfU2l6ZT1weXRob24zNi5QeVR1cGxlX1NpemUKKyAgUHlUdXBsZV9UeXBlPXB5dGhvbjM2LlB5VHVwbGVfVHlwZSBEQVRBCisgIFB5VHlwZV9DbGVhckNhY2hlPXB5dGhvbjM2LlB5VHlwZV9DbGVhckNhY2hlCisgIFB5VHlwZV9Gcm9tU3BlYz1weXRob24zNi5QeVR5cGVfRnJvbVNwZWMKKyAgUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzPXB5dGhvbjM2LlB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcworICBQeVR5cGVfR2VuZXJpY0FsbG9jPXB5dGhvbjM2LlB5VHlwZV9HZW5lcmljQWxsb2MKKyAgUHlUeXBlX0dlbmVyaWNOZXc9cHl0aG9uMzYuUHlUeXBlX0dlbmVyaWNOZXcKKyAgUHlUeXBlX0dldEZsYWdzPXB5dGhvbjM2LlB5VHlwZV9HZXRGbGFncworICBQeVR5cGVfR2V0U2xvdD1weXRob24zNi5QeVR5cGVfR2V0U2xvdAorICBQeVR5cGVfSXNTdWJ0eXBlPXB5dGhvbjM2LlB5VHlwZV9Jc1N1YnR5cGUKKyAgUHlUeXBlX01vZGlmaWVkPXB5dGhvbjM2LlB5VHlwZV9Nb2RpZmllZAorICBQeVR5cGVfUmVhZHk9cHl0aG9uMzYuUHlUeXBlX1JlYWR5CisgIFB5VHlwZV9UeXBlPXB5dGhvbjM2LlB5VHlwZV9UeXBlIERBVEEKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZQorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZworICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZUl0ZXJfVHlwZT1weXRob24zNi5QeVVuaWNvZGVJdGVyX1R5cGUgREFUQQorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlX0FwcGVuZD1weXRob24zNi5QeVVuaWNvZGVfQXBwZW5kCisgIFB5VW5pY29kZV9BcHBlbmRBbmREZWw9cHl0aG9uMzYuUHlVbmljb2RlX0FwcGVuZEFuZERlbAorICBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNBU0NJSVN0cmluZworICBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcKKyAgUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlCisgIFB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdAorICBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcKKyAgUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGUKKyAgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0xhdGluMVN0cmluZworICBQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGOFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEY4U3RyaW5nCisgIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZworICBQeVVuaWNvZGVfQXNXaWRlQ2hhcj1weXRob24zNi5QeVVuaWNvZGVfQXNXaWRlQ2hhcgorICBQeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdD1weXRob24zNi5QeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdAorICBQeVVuaWNvZGVfQ29tcGFyZT1weXRob24zNi5QeVVuaWNvZGVfQ29tcGFyZQorICBQeVVuaWNvZGVfQ29uY2F0PXB5dGhvbjM2LlB5VW5pY29kZV9Db25jYXQKKyAgUHlVbmljb2RlX0NvbnRhaW5zPXB5dGhvbjM2LlB5VW5pY29kZV9Db250YWlucworICBQeVVuaWNvZGVfQ291bnQ9cHl0aG9uMzYuUHlVbmljb2RlX0NvdW50CisgIFB5VW5pY29kZV9EZWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZQorICBQeVVuaWNvZGVfRGVjb2RlQVNDSUk9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUFTQ0lJCisgIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVDaGFybWFwCisgIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQ9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdAorICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZQorICBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVMYXRpbjEKKyAgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUKKyAgUHlVbmljb2RlX0RlY29kZVVURjE2PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYxNgorICBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVVRGMzI9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjMyCisgIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVVEY4PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY4CisgIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZQorICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXI9cHl0aG9uMzYuUHlVbmljb2RlX0ZTQ29udmVydGVyCisgIFB5VW5pY29kZV9GU0RlY29kZXI9cHl0aG9uMzYuUHlVbmljb2RlX0ZTRGVjb2RlcgorICBQeVVuaWNvZGVfRmluZD1weXRob24zNi5QeVVuaWNvZGVfRmluZAorICBQeVVuaWNvZGVfRm9ybWF0PXB5dGhvbjM2LlB5VW5pY29kZV9Gb3JtYXQKKyAgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdAorICBQeVVuaWNvZGVfRnJvbUZvcm1hdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbUZvcm1hdAorICBQeVVuaWNvZGVfRnJvbUZvcm1hdFY9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21Gb3JtYXRWCisgIFB5VW5pY29kZV9Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tT2JqZWN0CisgIFB5VW5pY29kZV9Gcm9tT3JkaW5hbD1weXRob24zNi5QeVVuaWNvZGVfRnJvbU9yZGluYWwKKyAgUHlVbmljb2RlX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21TdHJpbmcKKyAgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tV2lkZUNoYXIKKyAgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nCisgIFB5VW5pY29kZV9HZXRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9HZXRTaXplCisgIFB5VW5pY29kZV9Jc0lkZW50aWZpZXI9cHl0aG9uMzYuUHlVbmljb2RlX0lzSWRlbnRpZmllcgorICBQeVVuaWNvZGVfSm9pbj1weXRob24zNi5QeVVuaWNvZGVfSm9pbgorICBQeVVuaWNvZGVfUGFydGl0aW9uPXB5dGhvbjM2LlB5VW5pY29kZV9QYXJ0aXRpb24KKyAgUHlVbmljb2RlX1JQYXJ0aXRpb249cHl0aG9uMzYuUHlVbmljb2RlX1JQYXJ0aXRpb24KKyAgUHlVbmljb2RlX1JTcGxpdD1weXRob24zNi5QeVVuaWNvZGVfUlNwbGl0CisgIFB5VW5pY29kZV9SZXBsYWNlPXB5dGhvbjM2LlB5VW5pY29kZV9SZXBsYWNlCisgIFB5VW5pY29kZV9SZXNpemU9cHl0aG9uMzYuUHlVbmljb2RlX1Jlc2l6ZQorICBQeVVuaWNvZGVfUmljaENvbXBhcmU9cHl0aG9uMzYuUHlVbmljb2RlX1JpY2hDb21wYXJlCisgIFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZworICBQeVVuaWNvZGVfU3BsaXQ9cHl0aG9uMzYuUHlVbmljb2RlX1NwbGl0CisgIFB5VW5pY29kZV9TcGxpdGxpbmVzPXB5dGhvbjM2LlB5VW5pY29kZV9TcGxpdGxpbmVzCisgIFB5VW5pY29kZV9UYWlsbWF0Y2g9cHl0aG9uMzYuUHlVbmljb2RlX1RhaWxtYXRjaAorICBQeVVuaWNvZGVfVHJhbnNsYXRlPXB5dGhvbjM2LlB5VW5pY29kZV9UcmFuc2xhdGUKKyAgUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXA9cHl0aG9uMzYuUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXAKKyAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcKKyAgUHlVbmljb2RlX0RlY29kZVVURjc9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjcKKyAgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsCisgIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQ9cHl0aG9uMzYuUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdAorICBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZworICBQeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWw9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkltbW9ydGFsCisgIFB5VW5pY29kZV9JbnRlcm5JblBsYWNlPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5JblBsYWNlCisgIFB5VW5pY29kZV9UeXBlPXB5dGhvbjM2LlB5VW5pY29kZV9UeXBlIERBVEEKKyAgUHlXZWFrcmVmX0dldE9iamVjdD1weXRob24zNi5QeVdlYWtyZWZfR2V0T2JqZWN0IERBVEEKKyAgUHlXZWFrcmVmX05ld1Byb3h5PXB5dGhvbjM2LlB5V2Vha3JlZl9OZXdQcm94eQorICBQeVdlYWtyZWZfTmV3UmVmPXB5dGhvbjM2LlB5V2Vha3JlZl9OZXdSZWYKKyAgUHlXcmFwcGVyRGVzY3JfVHlwZT1weXRob24zNi5QeVdyYXBwZXJEZXNjcl9UeXBlIERBVEEKKyAgUHlXcmFwcGVyX05ldz1weXRob24zNi5QeVdyYXBwZXJfTmV3CisgIFB5WmlwX1R5cGU9cHl0aG9uMzYuUHlaaXBfVHlwZSBEQVRBCisgIFB5X0FkZFBlbmRpbmdDYWxsPXB5dGhvbjM2LlB5X0FkZFBlbmRpbmdDYWxsCisgIFB5X0F0RXhpdD1weXRob24zNi5QeV9BdEV4aXQKKyAgUHlfQnVpbGRWYWx1ZT1weXRob24zNi5QeV9CdWlsZFZhbHVlCisgIFB5X0NvbXBpbGVTdHJpbmc9cHl0aG9uMzYuUHlfQ29tcGlsZVN0cmluZworICBQeV9EZWNSZWY9cHl0aG9uMzYuUHlfRGVjUmVmCisgIFB5X0VuZEludGVycHJldGVyPXB5dGhvbjM2LlB5X0VuZEludGVycHJldGVyCisgIFB5X0V4aXQ9cHl0aG9uMzYuUHlfRXhpdAorICBQeV9GYXRhbEVycm9yPXB5dGhvbjM2LlB5X0ZhdGFsRXJyb3IKKyAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKKyAgUHlfRmluYWxpemU9cHl0aG9uMzYuUHlfRmluYWxpemUKKyAgUHlfRmluYWxpemVFeD1weXRob24zNi5QeV9GaW5hbGl6ZUV4CisgIFB5X0dldEJ1aWxkSW5mbz1weXRob24zNi5QeV9HZXRCdWlsZEluZm8KKyAgUHlfR2V0Q29tcGlsZXI9cHl0aG9uMzYuUHlfR2V0Q29tcGlsZXIKKyAgUHlfR2V0Q29weXJpZ2h0PXB5dGhvbjM2LlB5X0dldENvcHlyaWdodAorICBQeV9HZXRFeGVjUHJlZml4PXB5dGhvbjM2LlB5X0dldEV4ZWNQcmVmaXgKKyAgUHlfR2V0UGF0aD1weXRob24zNi5QeV9HZXRQYXRoCisgIFB5X0dldFBsYXRmb3JtPXB5dGhvbjM2LlB5X0dldFBsYXRmb3JtCisgIFB5X0dldFByZWZpeD1weXRob24zNi5QeV9HZXRQcmVmaXgKKyAgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoPXB5dGhvbjM2LlB5X0dldFByb2dyYW1GdWxsUGF0aAorICBQeV9HZXRQcm9ncmFtTmFtZT1weXRob24zNi5QeV9HZXRQcm9ncmFtTmFtZQorICBQeV9HZXRQeXRob25Ib21lPXB5dGhvbjM2LlB5X0dldFB5dGhvbkhvbWUKKyAgUHlfR2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuUHlfR2V0UmVjdXJzaW9uTGltaXQKKyAgUHlfR2V0VmVyc2lvbj1weXRob24zNi5QeV9HZXRWZXJzaW9uCisgIFB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCisgIFB5X0luY1JlZj1weXRob24zNi5QeV9JbmNSZWYKKyAgUHlfSW5pdGlhbGl6ZT1weXRob24zNi5QeV9Jbml0aWFsaXplCisgIFB5X0luaXRpYWxpemVFeD1weXRob24zNi5QeV9Jbml0aWFsaXplRXgKKyAgUHlfSXNJbml0aWFsaXplZD1weXRob24zNi5QeV9Jc0luaXRpYWxpemVkCisgIFB5X01haW49cHl0aG9uMzYuUHlfTWFpbgorICBQeV9NYWtlUGVuZGluZ0NhbGxzPXB5dGhvbjM2LlB5X01ha2VQZW5kaW5nQ2FsbHMKKyAgUHlfTmV3SW50ZXJwcmV0ZXI9cHl0aG9uMzYuUHlfTmV3SW50ZXJwcmV0ZXIKKyAgUHlfUmVwckVudGVyPXB5dGhvbjM2LlB5X1JlcHJFbnRlcgorICBQeV9SZXByTGVhdmU9cHl0aG9uMzYuUHlfUmVwckxlYXZlCisgIFB5X1NldFByb2dyYW1OYW1lPXB5dGhvbjM2LlB5X1NldFByb2dyYW1OYW1lCisgIFB5X1NldFB5dGhvbkhvbWU9cHl0aG9uMzYuUHlfU2V0UHl0aG9uSG9tZQorICBQeV9TZXRSZWN1cnNpb25MaW1pdD1weXRob24zNi5QeV9TZXRSZWN1cnNpb25MaW1pdAorICBQeV9TeW10YWJsZVN0cmluZz1weXRob24zNi5QeV9TeW10YWJsZVN0cmluZworICBQeV9WYUJ1aWxkVmFsdWU9cHl0aG9uMzYuUHlfVmFCdWlsZFZhbHVlCisgIF9QeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzYuX1B5RXJyX0JhZEludGVybmFsQ2FsbAorICBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUPXB5dGhvbjM2Ll9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKKyAgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQ9cHl0aG9uMzYuX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQKKyAgX1B5T2JqZWN0X0dDX01hbGxvYz1weXRob24zNi5fUHlPYmplY3RfR0NfTWFsbG9jCisgIF9QeU9iamVjdF9HQ19OZXc9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX05ldworICBfUHlPYmplY3RfR0NfTmV3VmFyPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19OZXdWYXIKKyAgX1B5T2JqZWN0X0dDX1Jlc2l6ZT1weXRob24zNi5fUHlPYmplY3RfR0NfUmVzaXplCisgIF9QeU9iamVjdF9OZXc9cHl0aG9uMzYuX1B5T2JqZWN0X05ldworICBfUHlPYmplY3RfTmV3VmFyPXB5dGhvbjM2Ll9QeU9iamVjdF9OZXdWYXIKKyAgX1B5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM2Ll9QeVN0YXRlX0FkZE1vZHVsZQorICBfUHlUaHJlYWRTdGF0ZV9Jbml0PXB5dGhvbjM2Ll9QeVRocmVhZFN0YXRlX0luaXQKKyAgX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2M9cHl0aG9uMzYuX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MKKyAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyPXB5dGhvbjM2Ll9QeVRyYXNoX2RlbGV0ZV9sYXRlciBEQVRBCisgIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nPXB5dGhvbjM2Ll9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIERBVEEKKyAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3Q9cHl0aG9uMzYuX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QKKyAgX1B5VHJhc2hfZGVzdHJveV9jaGFpbj1weXRob24zNi5fUHlUcmFzaF9kZXN0cm95X2NoYWluCisgIF9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSBEQVRBCisgIF9QeVdlYWtyZWZfUHJveHlUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfUHJveHlUeXBlIERBVEEKKyAgX1B5V2Vha3JlZl9SZWZUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfUmVmVHlwZSBEQVRBCisgIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9CdWlsZFZhbHVlX1NpemVUCisgIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2Ll9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0IERBVEEKKyAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbD1weXRob24zNi5fUHlfQ2hlY2tSZWN1cnNpdmVDYWxsCisgIF9QeV9EZWFsbG9jPXB5dGhvbjM2Ll9QeV9EZWFsbG9jCisgIF9QeV9FbGxpcHNpc09iamVjdD1weXRob24zNi5fUHlfRWxsaXBzaXNPYmplY3QgREFUQQorICBfUHlfRmFsc2VTdHJ1Y3Q9cHl0aG9uMzYuX1B5X0ZhbHNlU3RydWN0IERBVEEKKyAgX1B5X05vbmVTdHJ1Y3Q9cHl0aG9uMzYuX1B5X05vbmVTdHJ1Y3QgREFUQQorICBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3Q9cHl0aG9uMzYuX1B5X05vdEltcGxlbWVudGVkU3RydWN0IERBVEEKKyAgX1B5X1N3YXBwZWRPcD1weXRob24zNi5fUHlfU3dhcHBlZE9wIERBVEEKKyAgX1B5X1RydWVTdHJ1Y3Q9cHl0aG9uMzYuX1B5X1RydWVTdHJ1Y3QgREFUQQorICBfUHlfVmFCdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZV9TaXplVAorICBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VUdXBsZV9TaXplVAorICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyAgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1ZhUGFyc2VfU2l6ZVQKKyAgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAorICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfQnVpbGRWYWx1ZV9TaXplVApkaWZmIC0tZ2l0IGEvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAppbmRleCBjMDhhOWYzLi4zMTUzNjE1IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAorKysgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdApAQCAtMywxMCArMywxMCBAQAogICBpZiAlMSBFUVUgRGVidWcgKA0KICAgICBzaGlmdA0KICAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uX2QuZXhlDQotICAgIGlmIG5vdCBleGlzdCBweXRob24zNV9kLmRsbCBleGl0IDENCisgICAgaWYgbm90IGV4aXN0IHB5dGhvbjM2X2QuZGxsIGV4aXQgMQ0KICAgKSBFTFNFICgNCiAgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbi5leGUNCi0gICAgaWYgbm90IGV4aXN0IHB5dGhvbjM1LmRsbCBleGl0IDENCisgICAgaWYgbm90IGV4aXN0IHB5dGhvbjM2LmRsbCBleGl0IDENCiAgICkNCiApDQogJUhPU1RfUFlUSE9OJSBwcmVwYXJlX3NzbC5weSAlMQ0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcmVhZG1lLnR4dCBiL1BDYnVpbGQvcmVhZG1lLnR4dAppbmRleCAwOWE5OTZmLi41YmU2NmY0IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3JlYWRtZS50eHQKKysrIGIvUENidWlsZC9yZWFkbWUudHh0CkBAIC00OCw3ICs0OCw3IEBACiAgICAgVXNlZCB0byBidWlsZCBQeXRob24gd2l0aCBleHRyYSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLCBlcXVpdmFsZW50DQogICAgIHRvIHVzaW5nIC4vY29uZmlndXJlIC0td2l0aC1weWRlYnVnIG9uIFVOSVguICBBbGwgYmluYXJpZXMgYnVpbHQNCiAgICAgdXNpbmcgdGhpcyBjb25maWd1cmF0aW9uIGhhdmUgIl9kIiBhZGRlZCB0byB0aGVpciBuYW1lOg0KLSAgICBweXRob24zNV9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gIEJvdGggdGhlDQorICAgIHB5dGhvbjM2X2QuZGxsLCBweXRob25fZC5leGUsIHBhcnNlcl9kLnB5ZCwgYW5kIHNvIG9uLiAgQm90aCB0aGUNCiAgICAgYnVpbGQgYW5kIHJ0IChydW4gdGVzdCkgYmF0Y2ggZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYWNjZXB0IGEgLWQNCiAgICAgb3B0aW9uIGZvciBkZWJ1ZyBidWlsZHMuICBJZiB5b3UgYXJlIGJ1aWxkaW5nIFB5dGhvbiB0byBoZWxwIHdpdGgNCiAgICAgZGV2ZWxvcG1lbnQgb2YgQ1B5dGhvbiwgeW91IHdpbGwgbW9zdCBsaWtlbHkgdXNlIHRoaXMgY29uZmlndXJhdGlvbi4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qIGIvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagppbmRleCAwMTQ0ZmE5Li45ZGJkYzc3IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCisrKyBiL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKQEAgLTYyLDcgKzYyLDcgQEAKICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cD4KICAgICA8Q2xDb21waWxlPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNTAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNjAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+d3NvY2szMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KZGlmZiAtLWdpdCBhL1BhcnNlci9QeXRob24uYXNkbCBiL1BhcnNlci9QeXRob24uYXNkbAppbmRleCBjZDA4MzJkLi4yMjc3NWM2IDEwMDY0NAotLS0gYS9QYXJzZXIvUHl0aG9uLmFzZGwKKysrIGIvUGFyc2VyL1B5dGhvbi5hc2RsCkBAIC03MSw2ICs3MSw4IEBACiAgICAgICAgICB8IENhbGwoZXhwciBmdW5jLCBleHByKiBhcmdzLCBrZXl3b3JkKiBrZXl3b3JkcykKICAgICAgICAgIHwgTnVtKG9iamVjdCBuKSAtLSBhIG51bWJlciBhcyBhIFB5T2JqZWN0LgogICAgICAgICAgfCBTdHIoc3RyaW5nIHMpIC0tIG5lZWQgdG8gc3BlY2lmeSByYXcsIHVuaWNvZGUsIGV0Yz8KKyAgICAgICAgIHwgRm9ybWF0dGVkVmFsdWUoZXhwciB2YWx1ZSwgaW50PyBjb252ZXJzaW9uLCBleHByPyBmb3JtYXRfc3BlYykKKyAgICAgICAgIHwgSm9pbmVkU3RyKGV4cHIqIHZhbHVlcykKICAgICAgICAgIHwgQnl0ZXMoYnl0ZXMgcykKICAgICAgICAgIHwgTmFtZUNvbnN0YW50KHNpbmdsZXRvbiB2YWx1ZSkKICAgICAgICAgIHwgRWxsaXBzaXMKZGlmZiAtLWdpdCBhL1BhcnNlci9hc2RsX2MucHkgYi9QYXJzZXIvYXNkbF9jLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjM4YzI1My4uZWVkZDg5YgotLS0gYS9QYXJzZXIvYXNkbF9jLnB5CisrKyBiL1BhcnNlci9hc2RsX2MucHkKQEAgLTkwNiw3ICs5MDYsNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpID0gKGludClQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaSA9IF9QeUxvbmdfQXNJbnQob2JqKTsKICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gMTsKICAgICAqb3V0ID0gaTsKZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXRvay5jIGIvUGFyc2VyL3BhcnNldG9rLmMKaW5kZXggNjI5ZGVlNS4uZWJlOTQ5NSAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNldG9rLmMKKysrIGIvUGFyc2VyL3BhcnNldG9rLmMKQEAgLTE2MSwxMCArMTYxLDEwIEBACiAKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKICNpZiAwCi1zdGF0aWMgY2hhciB3aXRoX21zZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHdpdGhfbXNnW10gPQogIiVzOiVkOiBXYXJuaW5nOiAnd2l0aCcgd2lsbCBiZWNvbWUgYSByZXNlcnZlZCBrZXl3b3JkIGluIFB5dGhvbiAyLjZcbiI7CiAKLXN0YXRpYyBjaGFyIGFzX21zZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFzX21zZ1tdID0KICIlczolZDogV2FybmluZzogJ2FzJyB3aWxsIGJlY29tZSBhIHJlc2VydmVkIGtleXdvcmQgaW4gUHl0aG9uIDIuNlxuIjsKIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VuLmMgYi9QYXJzZXIvcGdlbi5jCmluZGV4IGYzMDMxYWUuLmJlMzVlMDIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VuLmMKKysrIGIvUGFyc2VyL3BnZW4uYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKICNpZmRlZiBQeV9ERUJVRwogCi1zdGF0aWMgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIFJFUU5GTVRbXSA9ICJtZXRhY29tcGlsZTogbGVzcyB0aGFuICVkIGNoaWxkcmVuXG4iOwogCiAjZGVmaW5lIFJFUU4oaSwgY291bnQpIGRvIHsgXAogICAgIGlmIChpIDwgY291bnQpIHsgXApAQCAtMzc5LDcgKzM3OSw3IEBACiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyB2b2lkIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjaGFyICptc2cpOworICAgICAgICAgICAgICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjb25zdCBjaGFyICptc2cpOwogc3RhdGljIHZvaWQgc2ltcGxpZnkoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSk7CiBzdGF0aWMgdm9pZCBjb252ZXJ0KGRmYSAqZCwgaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSk7CiAKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCiBzdGF0aWMgdm9pZAogcHJpbnRzc2RmYShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlLCBpbnQgbmJpdHMsCi0gICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZykKKyAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY29uc3QgY2hhciAqbXNnKQogewogICAgIGludCBpLCBpYml0LCBpYXJjOwogICAgIHNzX3N0YXRlICp5eTsKZGlmZiAtLWdpdCBhL1BhcnNlci9wZ2VubWFpbi5jIGIvUGFyc2VyL3BnZW5tYWluLmMKaW5kZXggMGYwNTVkNi4uM2NhNGFmZSAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW5tYWluLmMKKysrIGIvUGFyc2VyL3BnZW5tYWluLmMKQEAgLTI3LDcgKzI3LDcgQEAKIGludCBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWc7CiAKIC8qIEZvcndhcmQgKi8KLWdyYW1tYXIgKmdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpOworZ3JhbW1hciAqZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CiAKIHZvaWQgUHlfRXhpdChpbnQpIF9QeV9OT19SRVRVUk47CiAKQEAgLTc2LDcgKzc2LDcgQEAKIH0KIAogZ3JhbW1hciAqCi1nZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQorZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBGSUxFICpmcDsKICAgICBub2RlICpuOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IDFjZGJhZTIuLmJlN2NmNDkgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTIwMiw4ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfbm9ybWFsX25hbWUoY29uc3QgY2hhciAqcykgIC8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLwogewogICAgIGNoYXIgYnVmWzEzXTsKICAgICBpbnQgaTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7CiAgICAgICAgICAgICAgICAgY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbiwgdG9rKTsKLSAgICAgICAgICAgICAgICBjaGFyKiBxOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHE7CiAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwpAQCAtMTQ3NCwxNyArMTQ3NCwxOSBAQAogICAgIG5vbmFzY2lpID0gMDsKICAgICBpZiAoaXNfcG90ZW50aWFsX2lkZW50aWZpZXJfc3RhcnQoYykpIHsKICAgICAgICAgLyogUHJvY2VzcyBiIiIsIHIiIiwgdSIiLCBiciIiIGFuZCByYiIiICovCi0gICAgICAgIGludCBzYXdfYiA9IDAsIHNhd19yID0gMCwgc2F3X3UgPSAwOworICAgICAgICBpbnQgc2F3X2IgPSAwLCBzYXdfciA9IDAsIHNhd191ID0gMCwgc2F3X2YgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCEoc2F3X2IgfHwgc2F3X3UpICYmIChjID09ICdiJyB8fCBjID09ICdCJykpCisgICAgICAgICAgICBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfZikgJiYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSkKICAgICAgICAgICAgICAgICBzYXdfYiA9IDE7CiAgICAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBsaXRlcmFsIHdlIGRvbid0CiAgICAgICAgICAgICAgICB3YW50IHRvIHN1cHBvcnQgaXQgaW4gYXJiaXRyYXJ5IG9yZGVyIGxpa2UgYnl0ZSBsaXRlcmFscy4gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X3IpICYmIChjID09ICd1JyB8fCBjID09ICdVJykpCisgICAgICAgICAgICBlbHNlIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19yIHx8IHNhd19mKSAmJiAoYyA9PSAndScgfHwgYyA9PSAnVScpKQogICAgICAgICAgICAgICAgIHNhd191ID0gMTsKICAgICAgICAgICAgIC8qIHVyIiIgYW5kIHJ1IiIgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X3IgfHwgc2F3X3UpICYmIChjID09ICdyJyB8fCBjID09ICdSJykpCiAgICAgICAgICAgICAgICAgc2F3X3IgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfZiB8fCBzYXdfYiB8fCBzYXdfdSkgJiYgKGMgPT0gJ2YnIHx8IGMgPT0gJ0YnKSkKKyAgICAgICAgICAgICAgICBzYXdfZiA9IDE7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CkBAIC0xNzM4LDcgKzE3NDAsNyBAQAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgZW5kX3F1b3RlX3NpemUgPSAwOwogICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpCi0gICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOyAgLyogc2tpcCBlc2NhcGVkIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOyAgLyogc2tpcCBlc2NhcGVkIGNoYXIgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9QeXRob24vUHl0aG9uLWFzdC5jIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwppbmRleCBlZGZjYmFkLi4wN2Q5YjNlIDEwMDY0NAotLS0gYS9QeXRob24vUHl0aG9uLWFzdC5jCisrKyBiL1B5dGhvbi9QeXRob24tYXN0LmMKQEAgLTI4NSw2ICsyODUsMTggQEAKIHN0YXRpYyBjaGFyICpTdHJfZmllbGRzW109ewogICAgICJzIiwKIH07CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpGb3JtYXR0ZWRWYWx1ZV90eXBlOworX1B5X0lERU5USUZJRVIoY29udmVyc2lvbik7CitfUHlfSURFTlRJRklFUihmb3JtYXRfc3BlYyk7CitzdGF0aWMgY2hhciAqRm9ybWF0dGVkVmFsdWVfZmllbGRzW109eworICAgICJ2YWx1ZSIsCisgICAgImNvbnZlcnNpb24iLAorICAgICJmb3JtYXRfc3BlYyIsCit9Oworc3RhdGljIFB5VHlwZU9iamVjdCAqSm9pbmVkU3RyX3R5cGU7CitzdGF0aWMgY2hhciAqSm9pbmVkU3RyX2ZpZWxkc1tdPXsKKyAgICAidmFsdWVzIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpCeXRlc190eXBlOwogc3RhdGljIGNoYXIgKkJ5dGVzX2ZpZWxkc1tdPXsKICAgICAicyIsCkBAIC03NjksNyArNzgxLDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaSA9IChpbnQpUHlMb25nX0FzTG9uZyhvYmopOworICAgIGkgPSBfUHlMb25nX0FzSW50KG9iaik7CiAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIDE7CiAgICAgKm91dCA9IGk7CkBAIC05MTcsNiArOTI5LDExIEBACiAgICAgaWYgKCFOdW1fdHlwZSkgcmV0dXJuIDA7CiAgICAgU3RyX3R5cGUgPSBtYWtlX3R5cGUoIlN0ciIsIGV4cHJfdHlwZSwgU3RyX2ZpZWxkcywgMSk7CiAgICAgaWYgKCFTdHJfdHlwZSkgcmV0dXJuIDA7CisgICAgRm9ybWF0dGVkVmFsdWVfdHlwZSA9IG1ha2VfdHlwZSgiRm9ybWF0dGVkVmFsdWUiLCBleHByX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZWRWYWx1ZV9maWVsZHMsIDMpOworICAgIGlmICghRm9ybWF0dGVkVmFsdWVfdHlwZSkgcmV0dXJuIDA7CisgICAgSm9pbmVkU3RyX3R5cGUgPSBtYWtlX3R5cGUoIkpvaW5lZFN0ciIsIGV4cHJfdHlwZSwgSm9pbmVkU3RyX2ZpZWxkcywgMSk7CisgICAgaWYgKCFKb2luZWRTdHJfdHlwZSkgcmV0dXJuIDA7CiAgICAgQnl0ZXNfdHlwZSA9IG1ha2VfdHlwZSgiQnl0ZXMiLCBleHByX3R5cGUsIEJ5dGVzX2ZpZWxkcywgMSk7CiAgICAgaWYgKCFCeXRlc190eXBlKSByZXR1cm4gMDsKICAgICBOYW1lQ29uc3RhbnRfdHlwZSA9IG1ha2VfdHlwZSgiTmFtZUNvbnN0YW50IiwgZXhwcl90eXBlLApAQCAtMjA2Myw2ICsyMDgwLDQyIEBACiB9CiAKIGV4cHJfdHkKK0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLCBpbnQgbGluZW5vLAorICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBGb3JtYXR0ZWRWYWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBGb3JtYXR0ZWRWYWx1ZV9raW5kOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24gPSBjb252ZXJzaW9uOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMgPSBmb3JtYXRfc3BlYzsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKK0pvaW5lZFN0cihhc2RsX3NlcSAqIHZhbHVlcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEpvaW5lZFN0cl9raW5kOworICAgIHAtPnYuSm9pbmVkU3RyLnZhbHVlcyA9IHZhbHVlczsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEJ5dGVzKGJ5dGVzIHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKIHsKICAgICBleHByX3R5IHA7CkBAIC0zMTY0LDYgKzMyMTcsMzQgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEZvcm1hdHRlZFZhbHVlX3R5cGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9leHByKG8tPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZSwgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9pbnQoby0+di5Gb3JtYXR0ZWRWYWx1ZS5jb252ZXJzaW9uKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfY29udmVyc2lvbiwgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9leHByKG8tPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF9mb3JtYXRfc3BlYywgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEpvaW5lZFN0cl90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfbGlzdChvLT52LkpvaW5lZFN0ci52YWx1ZXMsIGFzdDJvYmpfZXhwcik7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlcywgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQnl0ZXNfa2luZDoKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQnl0ZXNfdHlwZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKQEAgLTYwMjUsNiArNjEwNiw4NiBAQAogICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilGb3JtYXR0ZWRWYWx1ZV90eXBlKTsKKyAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlzaW5zdGFuY2UpIHsKKyAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgaW50IGNvbnZlcnNpb247CisgICAgICAgIGV4cHJfdHkgZm9ybWF0X3NwZWM7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcih0bXAsICZ2YWx1ZSwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZVwiIG1pc3NpbmcgZnJvbSBGb3JtYXR0ZWRWYWx1ZSIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4aXN0c19ub3Rfbm9uZShvYmosICZQeUlkX2NvbnZlcnNpb24pKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX2NvbnZlcnNpb24pOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfaW50KHRtcCwgJmNvbnZlcnNpb24sIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVyc2lvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4aXN0c19ub3Rfbm9uZShvYmosICZQeUlkX2Zvcm1hdF9zcGVjKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF9mb3JtYXRfc3BlYyk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKHRtcCwgJmZvcm1hdF9zcGVjLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdF9zcGVjID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gRm9ybWF0dGVkVmFsdWUodmFsdWUsIGNvbnZlcnNpb24sIGZvcm1hdF9zcGVjLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUpvaW5lZFN0cl90eXBlKTsKKyAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlzaW5zdGFuY2UpIHsKKyAgICAgICAgYXNkbF9zZXEqIHZhbHVlczsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlcykpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZXMpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIGlmICghUHlMaXN0X0NoZWNrKHRtcCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiSm9pbmVkU3RyIGZpZWxkIFwidmFsdWVzXCIgbXVzdCBiZSBhIGxpc3QsIG5vdCBhICUuMjAwcyIsIHRtcC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUodG1wKTsKKyAgICAgICAgICAgIHZhbHVlcyA9IF9QeV9hc2RsX3NlcV9uZXcobGVuLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAodmFsdWVzID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIoUHlMaXN0X0dFVF9JVEVNKHRtcCwgaSksICZ2YWx1ZSwgYXJlbmEpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKHZhbHVlcywgaSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXF1aXJlZCBmaWVsZCBcInZhbHVlc1wiIG1pc3NpbmcgZnJvbSBKb2luZWRTdHIiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBKb2luZWRTdHIodmFsdWVzLCBsaW5lbm8sIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopQnl0ZXNfdHlwZSk7CiAgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKICAgICAgICAgcmV0dXJuIDE7CkBAIC03MzQ2LDYgKzc1MDcsMTAgQEAKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNhbGwiLCAoUHlPYmplY3QqKUNhbGxfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk51bSIsIChQeU9iamVjdCopTnVtX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdHIiLCAoUHlPYmplY3QqKVN0cl90eXBlKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRm9ybWF0dGVkVmFsdWUiLAorICAgICAgICAoUHlPYmplY3QqKUZvcm1hdHRlZFZhbHVlX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKb2luZWRTdHIiLCAoUHlPYmplY3QqKUpvaW5lZFN0cl90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQnl0ZXMiLCAoUHlPYmplY3QqKUJ5dGVzX3R5cGUpIDwgMCkgcmV0dXJuCiAgICAgICAgIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOYW1lQ29uc3RhbnQiLCAoUHlPYmplY3QqKU5hbWVDb25zdGFudF90eXBlKSA8CmRpZmYgLS1naXQgYS9QeXRob24vX3dhcm5pbmdzLmMgYi9QeXRob24vX3dhcm5pbmdzLmMKaW5kZXggOTc4YmFkMS4uZGFhMTM1NSAxMDA2NDQKLS0tIGEvUHl0aG9uL193YXJuaW5ncy5jCisrKyBiL1B5dGhvbi9fd2FybmluZ3MuYwpAQCAtOTIxLDcgKzkyMSw3IEBACiAjdW5kZWYgUHlFcnJfV2FybgogCiBQeUFQSV9GVU5DKGludCkKLVB5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICp0ZXh0KQorUHlFcnJfV2FybihQeU9iamVjdCAqY2F0ZWdvcnksIGNvbnN0IGNoYXIgKnRleHQpCiB7CiAgICAgcmV0dXJuIFB5RXJyX1dhcm5FeChjYXRlZ29yeSwgdGV4dCwgMSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggNzc0M2MzMS4uMzNmMjU5NyAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMjU3LDYgKzI1NywxNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcnMoZXhwLT52LkpvaW5lZFN0ci52YWx1ZXMsIExvYWQsIDApOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgaWYgKHZhbGlkYXRlX2V4cHIoZXhwLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlLCBMb2FkKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMsIExvYWQpOworICAgICAgICByZXR1cm4gMTsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6IHsKICAgICAgICAgUHlPYmplY3QgKmIgPSBleHAtPnYuQnl0ZXMuczsKICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrRXhhY3QoYikpIHsKQEAgLTUxMyw3ICs1MjEsNyBAQAogLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbnRlcm5hbGx5ICovCiBzdHJ1Y3QgY29tcGlsaW5nIHsKICAgICBjaGFyICpjX2VuY29kaW5nOyAvKiBzb3VyY2UgZW5jb2RpbmcgKi8KLSAgICBQeUFyZW5hICpjX2FyZW5hOyAvKiBhcmVuYSBmb3IgYWxsb2NhdGluZyBtZW1lb3J5ICovCisgICAgUHlBcmVuYSAqY19hcmVuYTsgLyogQXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LiAqLwogICAgIFB5T2JqZWN0ICpjX2ZpbGVuYW1lOyAvKiBmaWxlbmFtZSAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZTsgLyogTm9ybWFsaXphdGlvbiBmdW5jdGlvbiBmcm9tIHVuaWNvZGVkYXRhLiAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZV9hcmdzOyAvKiBOb3JtYWxpemF0aW9uIGFyZ3VtZW50IHR1cGxlLiAqLwpAQCAtNTM1LDkgKzU0Myw3IEBACiBzdGF0aWMgZXhwcl90eSBhc3RfZm9yX2NhbGwoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICosIGV4cHJfdHkpOwogCiBzdGF0aWMgUHlPYmplY3QgKnBhcnNlbnVtYmVyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBQeU9iamVjdCAqcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSk7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RycGx1cyhzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ5dGVzbW9kZSk7CitzdGF0aWMgZXhwcl90eSBwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuKTsKIAogI2RlZmluZSBDT01QX0dFTkVYUCAgIDAKICNkZWZpbmUgQ09NUF9MSVNUQ09NUCAxCkBAIC04NjQsNyArODcwLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBGT1JCSURERU5bXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRk9SQklEREVOW10gPSB7CiAgICAgIk5vbmUiLAogICAgICJUcnVlIiwKICAgICAiRmFsc2UiLApAQCAtODgxLDcgKzg4Nyw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBpZiAoZnVsbF9jaGVja3MpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnA7CisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKICAgICAgICAgZm9yIChwID0gRk9SQklEREVOOyAqcDsgcCsrKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcobmFtZSwgKnApID09IDApIHsKICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImFzc2lnbm1lbnQgdG8ga2V5d29yZCIpOwpAQCAtOTg2LDYgKzk5Miw4IEBACiAgICAgICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIGNhc2UgU3RyX2tpbmQ6CiAgICAgICAgIGNhc2UgQnl0ZXNfa2luZDoKKyAgICAgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgogICAgICAgICAgICAgZXhwcl9uYW1lID0gImxpdGVyYWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CkBAIC0xMjU5LDE2ICsxMjY3LDIwIEBACiAgICAgICAgYW5kIHZhcmFyZ3NsaXN0IChsYW1iZGEgZGVmaW5pdGlvbikuCiAKICAgICAgICBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotICAgICAgIHR5cGVkYXJnc2xpc3Q6ICgodGZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAgICAgICAgICAgKCcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0KLSAgICAgICAgICAgfCAnKionIHRmcGRlZikKLSAgICAgICAgICAgfCB0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgICAgIHwgJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiAgICAgICAgdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLSAgICAgICB2YXJhcmdzbGlzdDogKCh2ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICAgICAgICAgICAoJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiAgWycsJyAnKionIHZmcGRlZl0KLSAgICAgICAgICAgfCAnKionIHZmcGRlZikKLSAgICAgICAgICAgfCB2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICAgICAgICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqKicgdmZwZGVmIFsnLCddCisgICAgICAgKQogICAgICAgIHZmcGRlZjogTkFNRQorCiAgICAgKi8KICAgICBpbnQgaSwgaiwgaywgbnBvc2FyZ3MgPSAwLCBua3dvbmx5YXJncyA9IDA7CiAgICAgaW50IG5wb3NkZWZhdWx0cyA9IDAsIGZvdW5kX2RlZmF1bHQgPSAwOwpAQCAtMTM3MCw3ICsxMzgyLDggQEAKICAgICAgICAgICAgICAgICBpICs9IDI7IC8qIHRoZSBuYW1lIGFuZCB0aGUgY29tbWEgKi8KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgICAgICAgICBpZiAoaSsxID49IE5DSChuKSkgeworICAgICAgICAgICAgICAgIGlmIChpKzEgPj0gTkNIKG4pIHx8CisgICAgICAgICAgICAgICAgICAgIChpKzIgPT0gTkNIKG4pICYmIFRZUEUoQ0hJTEQobiwgaSsxKSkgPT0gQ09NTUEpKSB7CiAgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBDSElMRChuLCBpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTk5Myw3ICsyMDA2LDYgQEAKICAgICAgICB8ICcuLi4nIHwgJ05vbmUnIHwgJ1RydWUnIHwgJ0ZhbHNlJwogICAgICovCiAgICAgbm9kZSAqY2ggPSBDSElMRChuLCAwKTsKLSAgICBpbnQgYnl0ZXNtb2RlID0gMDsKIAogICAgIHN3aXRjaCAoVFlQRShjaCkpIHsKICAgICBjYXNlIE5BTUU6IHsKQEAgLTIwMTUsNyArMjAyNyw3IEBACiAgICAgICAgIHJldHVybiBOYW1lKG5hbWUsIExvYWQsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAgICAgY2FzZSBTVFJJTkc6IHsKLSAgICAgICAgUHlPYmplY3QgKnN0ciA9IHBhcnNlc3RycGx1cyhjLCBuLCAmYnl0ZXNtb2RlKTsKKyAgICAgICAgZXhwcl90eSBzdHIgPSBwYXJzZXN0cnBsdXMoYywgbik7CiAgICAgICAgIGlmICghc3RyKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJ0eXBlID0gTlVMTDsKICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVFcnJvcikpCkBAIC0yMDMyLDYgKzIwNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXMpICVzIiwgZXJydHlwZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJzdHIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiglcykgdW5rbm93biBlcnJvciIsIGVycnR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgYnVmKTsKQEAgLTIwNDEsMTQgKzIwNTQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgc3RyKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzbW9kZSkKLSAgICAgICAgICAgIHJldHVybiBCeXRlcyhzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFN0cihzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9CiAgICAgY2FzZSBOVU1CRVI6IHsKICAgICAgICAgUHlPYmplY3QgKnB5bnVtID0gcGFyc2VudW1iZXIoYywgU1RSKGNoKSk7CkBAIC0zOTM1LDcgKzM5NDEsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVjb2RlX3VuaWNvZGUoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50IHJhd21vZGUsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQorZGVjb2RlX3VuaWNvZGUoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgY29uc3QgY2hhciAqZW5jb2RpbmcpCiB7CiAgICAgUHlPYmplY3QgKnYsICp1OwogICAgIGNoYXIgKmJ1ZjsKQEAgLTM5OTEsMjAgKzM5OTcsODc0IEBACiAgICAgICAgIGxlbiA9IHAgLSBidWY7CiAgICAgICAgIHMgPSBidWY7CiAgICAgfQotICAgIGlmIChyYXdtb2RlKQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOworICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOwogICAgIFB5X1hERUNSRUYodSk7CiAgICAgcmV0dXJuIHY7CiB9CiAKLS8qIHMgaXMgYSBQeXRob24gc3RyaW5nIGxpdGVyYWwsIGluY2x1ZGluZyB0aGUgYnJhY2tldGluZyBxdW90ZSBjaGFyYWN0ZXJzLAotICogYW5kIHIgJi9vciBiIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQgZXNjYXBlIHNlcXVlbmNlcyAoaWYgYW55KS4KLSAqIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlIGRlY29kZWQgUHl0aG9uIHN0cmluZyBvYmplY3QuCi0gKi8KKy8qIENvbXBpbGUgdGhpcyBleHByZXNzaW9uIGluIHRvIGFuIGV4cHJfdHkuIFdlIGtub3cgdGhhdCB3ZSBjYW4KKyAgIHRlbXBvcmFyaWx5IG1vZGlmeSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhpcyBzdHJpbmcKKyAgIChpdCdzICd7JyksIGFuZCB3ZSBrbm93IHdlIGNhbiB0ZW1wb3JhcmlseSBtb2RpZnkgdGhlIGNoYXJhY3RlcgorICAgYWZ0ZXIgdGhpcyBzdHJpbmcgKGl0IGlzIGEgJ30nKS4gIExldmVyYWdlIHRoaXMgdG8gY3JlYXRlIGEKKyAgIHN1Yi1zdHJpbmcgd2l0aCBlbm91Z2ggcm9vbSBmb3IgdXMgdG8gYWRkIHBhcmVucyBhcm91bmQgdGhlCisgICBleHByZXNzaW9uLiBUaGlzIGlzIHRvIGFsbG93IHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcywgZm9yCisgICBleGFtcGxlLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfY29tcGlsZV9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgZXhwcl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZXhwcl9lbmQsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCisKK3sKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgbW9kX3R5IG1vZDsKKyAgICBjaGFyICp1dGZfZXhwcjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfVUNTNCBlbmRfY2ggPSAtMTsKKyAgICBpbnQgYWxsX3doaXRlc3BhY2U7CisgICAgUHlPYmplY3QgKnN1YiA9IE5VTEw7CisKKyAgICAvKiBXZSBvbmx5IGRlY3JlZiBzdWIgaWYgd2UgYWxsb2NhdGVkIGl0IHdpdGggYSBQeVVuaWNvZGVfU3Vic3RyaW5nLgorICAgICAgIGRlY3JlZl9zdWIgcmVjb3JkcyB0aGF0LiAqLworICAgIGludCBkZWNyZWZfc3ViID0gMDsKKworICAgIGFzc2VydChzdHIpOworCisgICAgYXNzZXJ0KGV4cHJfc3RhcnQgPj0gMCAmJiBleHByX3N0YXJ0IDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kID49IDAgJiYgZXhwcl9lbmQgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPj0gZXhwcl9zdGFydCk7CisKKyAgICAvKiBUaGVyZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvbiBlYWNoIHNpZGUgb2YgdGhlCisgICAgICAgZXhwcmVzc2lvbiBpbnNpZGUgdGhpcyBzdHIuIFRoaXMgd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGJlZm9yZQorICAgICAgIHdlJ3JlIGNhbGxlZC4gKi8KKyAgICBhc3NlcnQoZXhwcl9zdGFydCA+PSAxKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKS0xKTsKKworICAgIC8qIElmIHRoZSBzdWJzdHJpbmcgaXMgYWxsIHdoaXRlc3BhY2UsIGl0J3MgYW4gZXJyb3IuIFdlIG5lZWQgdG8KKyAgICAgICAgY2F0Y2ggdGhpcyBoZXJlLCBhbmQgbm90IHdoZW4gd2UgY2FsbCBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nLAorICAgICAgICBiZWNhdXNlIHR1cm5pbmcgdGhlIGV4cHJlc3Npb24gJycgaW4gdG8gJygpJyB3b3VsZCBnbyBmcm9tCisgICAgICAgIGJlaW5nIGludmFsaWQgdG8gdmFsaWQuICovCisgICAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSBzYXlzIGFuIGVtcHR5IHN0cmluZyBpcyBhbGwKKyAgICAgICAgd2hpdGVzcGFjZS4gVGhhdCdzIGltcG9ydGFudC4gVGhlcmUncyBhIHRlc3QgZm9yIGl0OiBmJ3t9Jy4gKi8KKyAgICBhbGxfd2hpdGVzcGFjZSA9IDE7CisgICAgZm9yIChpID0gZXhwcl9zdGFydDsgaSA8IGV4cHJfZW5kOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeV9VTklDT0RFX0lTU1BBQ0UoUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsIGkpKSkgeworICAgICAgICAgICAgYWxsX3doaXRlc3BhY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsbF93aGl0ZXNwYWNlKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nLCB3ZSBjYW4ndCB1c2UKKyAgICAgICAgUHlVbmljb2RlX1N1YnN0cmluZywgc2luY2UgaXQgd2lsbCByZXR1cm4gYW5vdGhlciByZWZlcmVuY2UgdG8KKyAgICAgICAgb3VyIG9yaWdpbmFsIHN0cmluZy4gQmVjYXVzZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHN0cmluZyBpbgorICAgICAgICBwbGFjZSwgdGhhdCdzIGEgbm8tbm8uIFNvLCBkZXRlY3QgdGhhdCBjYXNlIGFuZCBqdXN0IHVzZSBvdXIKKyAgICAgICAgc3RyaW5nIGRpcmVjdGx5LiAqLworCisgICAgaWYgKGV4cHJfc3RhcnQtMSA9PSAwICYmIGV4cHJfZW5kKzEgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICAvKiBJZiBzdHIgaXMgd2VsbCBmb3JtZWQsIHRoZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJzIG11c3QKKyAgICAgICAgICAgYmUgJ3snIGFuZCAnfScsIHJlc3BlY3RpdmVseS4gQnV0LCBpZiB0aGVyZSdzIGEgc3ludGF4CisgICAgICAgICAgIGVycm9yLCBmb3IgZXhhbXBsZSBmJ3szIScsIHRoZW4gdGhlIGxhc3QgY2hhciB3b24ndCBiZSBhCisgICAgICAgICAgIGNsb3NpbmcgYnJhY2UuIFNvLCByZW1lbWJlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZCBpbgorICAgICAgICAgICBvcmRlciBmb3IgdXMgdG8gcmVzdG9yZSBpdC4gKi8KKyAgICAgICAgZW5kX2NoID0gUHlVbmljb2RlX1JlYWRDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxKTsKKyAgICAgICAgYXNzZXJ0KGVuZF9jaCAhPSAoUHlfVUNTNCktMSk7CisKKyAgICAgICAgLyogSW4gYWxsIGNhc2VzLCBob3dldmVyLCBzdGFydF9jaCBtdXN0IGJlICd7Jy4gKi8KKyAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9SZWFkQ2hhcihzdHIsIDApID09ICd7Jyk7CisKKyAgICAgICAgc3ViID0gc3RyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBhIHN1YnN0cmluZyBvYmplY3QuIEl0IG11c3QgYmUgYSBuZXcgb2JqZWN0LCB3aXRoCisgICAgICAgICAgIHJlZmNvdW50PT0xLCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICovCisgICAgICAgIHN1YiA9IFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLCBleHByX3N0YXJ0LTEsIGV4cHJfZW5kKzEpOworICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGFzc2VydChzdWIgIT0gc3RyKTsgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgbmV3IHN0cmluZy4gKi8KKyAgICAgICAgZGVjcmVmX3N1YiA9IDE7ICAgICAgLyogUmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSBpdCBvbiBlcnJvci4gKi8KKyAgICB9CisKKyAgICAvKiBQdXQgKCkgYXJvdW5kIHRoZSBleHByZXNzaW9uLiAqLworICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN1YiwgMCwgJygnKSA8IDAgfHwKKyAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdWIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgJyknKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBObyBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSByZXR1cm5lZCBoZXJlOiBpdCdzIG1hbmFnZWQgYnkgdGhlCisgICAgICAgc3RyaW5nLiAqLworICAgIHV0Zl9leHByID0gUHlVbmljb2RlX0FzVVRGOChzdWIpOworICAgIGlmICghdXRmX2V4cHIpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjZi5jZl9mbGFncyA9IFB5Q0ZfT05MWV9BU1Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyh1dGZfZXhwciwgIjxmc3RyaW5nPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ldmFsX2lucHV0LCAmY2YsIGMtPmNfYXJlbmEpOworICAgIGlmICghbW9kKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHN1YiAhPSBzdHIpCisgICAgICAgIC8qIENsZWFyIGluc3RlYWQgb2YgZGVjcmVmIGluIGNhc2Ugd2UgZXZlciBtb2RpZnkgdGhpcyBjb2RlIHRvIGNoYW5nZQorICAgICAgICAgICB0aGUgZXJyb3IgaGFuZGxpbmc6IHRoaXMgaXMgc2FmZXN0IGJlY2F1c2UgdGhlIFhERUNSRUYgd29uJ3QgdHJ5CisgICAgICAgICAgIGFuZCBkZWNyZWYgaXQgd2hlbiBpdCdzIE5VTEwuICovCisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgY2hhcnMgaW4gc3ViLCBzaW5jZSB3ZSBrbm93IGl0J3MgZ2V0dGluZworICAgICAgICAgICByZWFkeSB0byBnZXQgZGVsZXRlZCAocmVmY291bnQgbXVzdCBiZSAxLCBzaW5jZSB3ZSBnb3QgYSBuZXcgc3RyaW5nCisgICAgICAgICAgIGluIFB5VW5pY29kZV9TdWJzdHJpbmcpLiAqLworICAgICAgICBQeV9DTEVBUihzdWIpOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIWRlY3JlZl9zdWIpOworICAgICAgICBhc3NlcnQoZW5kX2NoICE9IChQeV9VQ1M0KS0xKTsKKyAgICAgICAgLyogUmVzdG9yZSBzdHIsIHdoaWNoIHdlIGVhcmxpZXIgbW9kaWZpZWQgZGlyZWN0bHkuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgMCwgJ3snKSA8IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEsIGVuZF9jaCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG1vZC0+di5FeHByZXNzaW9uLmJvZHk7CisKK2Vycm9yOgorICAgIC8qIE9ubHkgZGVjcmVmIHN1YiBpZiBpdCB3YXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gU3ViU3RyaW5nLiAqLworICAgIGlmIChkZWNyZWZfc3ViKQorICAgICAgICBQeV9YREVDUkVGKHN1Yik7CisKKyAgICBpZiAoZW5kX2NoICE9IChQeV9VQ1M0KS0xKSB7CisgICAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgbW9kaWZpZWQgc3RyLiBNYWtlIHN1cmUgdGhhdCdzIHRoZQorICAgICAgICAgICBjYXNlOiBzdHIgd2lsbCBiZSBlcXVhbCB0byBzdWIuICovCisgICAgICAgIGlmIChzdHIgPT0gc3ViKSB7CisgICAgICAgICAgICAvKiBEb24ndCBjaGVjayB0aGUgZXJyb3IsIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBzZXQgdGhlCisgICAgICAgICAgICAgICBlcnJvciBzdGF0ZSAodGhhdCdzIHdoeSB3ZSdyZSBpbiAnZXJyb3InLCBhZnRlcgorICAgICAgICAgICAgICAgYWxsKS4gKi8KKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCAwLCAneycpOworICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgZW5kX2NoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwuCisKKyAgIFJldHVybiAxIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsLCBidXQgd2Ugd2FudAorICAgdGhlIGNhbGxlciB0byBwcm9jZXNzIHRoZSBsaXRlcmFsIHVwIHRvIHRoaXMgcG9pbnQuIFVzZWQgZm9yCisgICBkb3VibGVkIGJyYWNlcy4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbChQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIFB5T2JqZWN0ICoqbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNlX2x2bCwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICAvKiBHZXQgYW55IGxpdGVyYWwgc3RyaW5nLiBJdCBlbmRzIHdoZW4gd2UgaGl0IGFuIHVuLWRvdWJsZWQgYnJhY2UsIG9yIHRoZQorICAgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworCisgICAgUHlfc3NpemVfdCBsaXRlcmFsX3N0YXJ0LCBsaXRlcmFsX2VuZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKKyAgICBhc3NlcnQoKmxpdGVyYWwgPT0gTlVMTCk7CisKKyAgICBsaXRlcmFsX3N0YXJ0ID0gKm9mczsKKyAgICBmb3IgKDsgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7ICpvZnMgKz0gMSkgeworICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgZG91YmxlZCBicmFjZXMsIGJ1dCBvbmx5IGF0IHRoZSB0b3AgbGV2ZWwuIElmCisgICAgICAgICAgICAgICB3ZSBjaGVja2VkIGF0IGV2ZXJ5IGxldmVsLCB0aGVuIGYnezA6ezN9fScgd291bGQgZmFpbAorICAgICAgICAgICAgICAgd2l0aCB0aGUgdHdvIGNsb3NpbmcgYnJhY2VzLiAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2VfbHZsID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKm9mcyArIDEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMgKyAxKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBnb2luZyB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB0aGUgbGl0ZXJhbCBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGJ1dCB0aGF0IHRoZXkgc2hvdWxkIGNvbnRpbnVlIHNjYW5uaW5nLiBCdXQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICBza2lwIG92ZXIgdGhlIHNlY29uZCBicmFjZSB3aGVuIHdlIHJlc3VtZSBzY2FubmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbF9lbmQgPSAqb2ZzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2hlcmUgYSBzaW5nbGUgJ3snIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBleHByZXNzaW9uLCBhCisgICAgICAgICAgICAgICAgICAgc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UncmUgZWl0aGVyIGF0IGEgJ3snLCB3aGljaCBtZWFucyB3ZSdyZSBzdGFydGluZyBhbm90aGVyCisgICAgICAgICAgICAgICBleHByZXNzaW9uOyBvciBhICd9Jywgd2hpY2ggbWVhbnMgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgICAgICAgICBmLXN0cmluZyAoZm9yIGEgbmVzdGVkIGZvcm1hdF9zcGVjKS4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxpdGVyYWxfZW5kID0gKm9mczsKKworICAgIGFzc2VydCgqb2ZzID09IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ3snIHx8CisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd9Jyk7Citkb25lOgorICAgIGlmIChsaXRlcmFsX3N0YXJ0ICE9IGxpdGVyYWxfZW5kKSB7CisgICAgICAgICpsaXRlcmFsID0gUHlVbmljb2RlX1N1YnN0cmluZyhzdHIsIGxpdGVyYWxfc3RhcnQsIGxpdGVyYWxfZW5kKTsKKyAgICAgICAgaWYgKCEqbGl0ZXJhbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGJlY2F1c2UgcGFyc2luZyBpcyByZWN1cnNpdmUuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19wYXJzZShQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbik7CisKKy8qIFBhcnNlIHRoZSBmLXN0cmluZyBzdHIsIHN0YXJ0aW5nIGF0IG9mcy4gV2Uga25vdyAqb2ZzIHN0YXJ0cyBhbgorICAgZXhwcmVzc2lvbiAoc28gaXQgbXVzdCBiZSBhICd7JykuIFJldHVybnMgdGhlIEZvcm1hdHRlZFZhbHVlIG5vZGUsCisgICB3aGljaCBpbmNsdWRlcyB0aGUgZXhwcmVzc2lvbiwgY29udmVyc2lvbiBjaGFyYWN0ZXIsIGFuZAorICAgZm9ybWF0X3NwZWMgZXhwcmVzc2lvbi4KKworICAgTm90ZSB0aGF0IEkgZG9uJ3QgZG8gYSBwZXJmZWN0IGpvYiBoZXJlOiBJIGRvbid0IG1ha2Ugc3VyZSB0aGF0IGEKKyAgIGNsb3NpbmcgYnJhY2UgZG9lc24ndCBtYXRjaCBhbiBvcGVuaW5nIHBhcmVuLCBmb3IgZXhhbXBsZS4gSXQKKyAgIGRvZXNuJ3QgbmVlZCB0byBlcnJvciBvbiBhbGwgaW52YWxpZCBleHByZXNzaW9ucywganVzdCBjb3JyZWN0bHkKKyAgIGZpbmQgdGhlIGVuZCBvZiBhbGwgdmFsaWQgb25lcy4gQW55IGVycm9ycyBpbnNpZGUgdGhlIGV4cHJlc3Npb24KKyAgIHdpbGwgYmUgY2F1Z2h0IHdoZW4gd2UgcGFyc2UgaXQgbGF0ZXIuICovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgIGV4cHJfdHkgKmV4cHJlc3Npb24sIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgLyogUmV0dXJuIC0xIG9uIGVycm9yLCBlbHNlIDAuICovCisKKyAgICBQeV9zc2l6ZV90IGV4cHJfc3RhcnQ7CisgICAgUHlfc3NpemVfdCBleHByX2VuZDsKKyAgICBleHByX3R5IHNpbXBsZV9leHByZXNzaW9uOworICAgIGV4cHJfdHkgZm9ybWF0X3NwZWMgPSBOVUxMOyAvKiBPcHRpb25hbCBmb3JtYXQgc3BlY2lmaWVyLiAqLworICAgIFB5X1VDUzQgY29udmVyc2lvbiA9IC0xOyAvKiBUaGUgY29udmVyc2lvbiBjaGFyLiAtMSBpZiBub3Qgc3BlY2lmaWVkLiAqLworCisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKworICAgIC8qIDAgaWYgd2UncmUgbm90IGluIGEgc3RyaW5nLCBlbHNlIHRoZSBxdW90ZSBjaGFyIHdlJ3JlIHRyeWluZyB0bworICAgICAgIG1hdGNoIChzaW5nbGUgb3IgZG91YmxlIHF1b3RlKS4gKi8KKyAgICBQeV9VQ1M0IHF1b3RlX2NoYXIgPSAwOworCisgICAgLyogSWYgd2UncmUgaW5zaWRlIGEgc3RyaW5nLCAxPW5vcm1hbCwgMz10cmlwbGUtcXVvdGVkLiAqLworICAgIGludCBzdHJpbmdfdHlwZSA9IDA7CisKKyAgICAvKiBLZWVwIHRyYWNrIG9mIG5lc3RpbmcgbGV2ZWwgZm9yIGJyYWNlcy9wYXJlbnMvYnJhY2tldHMgaW4KKyAgICAgICBleHByZXNzaW9ucy4gKi8KKyAgICBQeV9zc2l6ZV90IG5lc3RlZF9kZXB0aCA9IDA7CisKKyAgICAvKiBDYW4gb25seSBuZXN0IG9uZSBsZXZlbCBkZWVwLiAqLworICAgIGlmIChyZWN1cnNlX2x2bCA+PSAyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cHJlc3Npb25zIG5lc3RlZCB0b28gZGVlcGx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgZmlyc3QgY2hhciBtdXN0IGJlIGEgbGVmdCBicmFjZSwgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3R0ZW4KKyAgICAgICBoZXJlLiBTa2lwIG92ZXIgaXQuICovCisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd7Jyk7CisgICAgKm9mcyArPSAxOworCisgICAgZXhwcl9zdGFydCA9ICpvZnM7CisgICAgZm9yICg7ICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOyAqb2ZzICs9IDEpIHsKKyAgICAgICAgUHlfVUNTNCBjaDsKKworICAgICAgICAvKiBMb29wIGludmFyaWFudHMuICovCisgICAgICAgIGFzc2VydChuZXN0ZWRfZGVwdGggPj0gMCk7CisgICAgICAgIGFzc2VydCgqb2ZzID49IGV4cHJfc3RhcnQpOworICAgICAgICBpZiAocXVvdGVfY2hhcikKKyAgICAgICAgICAgIGFzc2VydChzdHJpbmdfdHlwZSA9PSAxIHx8IHN0cmluZ190eXBlID09IDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoc3RyaW5nX3R5cGUgPT0gMCk7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgaWYgKHF1b3RlX2NoYXIpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZy4gU2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQuICovCisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgbmVlZHMgdG8gaW1wbGVtZW50IHRoZSBzYW1lIG5vbi1lcnJvciBsb2dpYworICAgICAgICAgICAgICAgYXMgdG9rX2dldCBmcm9tIHRva2VuaXplci5jLCBhdCB0aGUgbGV0dGVyX3F1b3RlCisgICAgICAgICAgICAgICBsYWJlbC4gVG8gYWN0dWFsbHkgc2hhcmUgdGhhdCBjb2RlIHdvdWxkIGJlIGEKKyAgICAgICAgICAgICAgIG5pZ2h0bWFyZS4gQnV0LCBpdCdzIHVubGlrZWx5IHRvIGNoYW5nZSBhbmQgaXMgc21hbGwsCisgICAgICAgICAgICAgICBzbyBkdXBsaWNhdGUgaXQgaGVyZS4gTm90ZSB3ZSBkb24ndCBuZWVkIHRvIGNhdGNoIGFsbAorICAgICAgICAgICAgICAgb2YgdGhlIGVycm9ycywgc2luY2UgdGhleSdsbCBiZSBjYXVnaHQgd2hlbiBwYXJzaW5nIHRoZQorICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4gV2UganVzdCBuZWVkIHRvIG1hdGNoIHRoZSBub24tZXJyb3IKKyAgICAgICAgICAgICAgIGNhc2VzLiBUaHVzIHdlIGNhbiBpZ25vcmUgXG4gaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdzLAorICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuIE9yIG5vbi10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gcXVvdGVfY2hhcikgeworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyBtYXRjaCB0aGUgc3RyaW5nX3R5cGUgKHNpbmdsZSBvciB0cmlwbGUKKyAgICAgICAgICAgICAgICAgICBxdW90ZWQpPyAqLworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqb2ZzKzIgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09IGNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBhIG5vcm1hbCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZywgYW5kIG5vdCBmaW5pc2hlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgc3RyaW5nLiBJZiB0aGlzIGlzIGEgYmFja3NsYXNoLCBza2lwIHRoZSBuZXh0IGNoYXIgKGl0CisgICAgICAgICAgICAgICBtaWdodCBiZSBhbiBlbmQgcXVvdGUgdGhhdCBuZWVkcyBza2lwcGluZykuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIGp1c3QgY29uc3VtZSB0aGlzIGNoYXJhY3RlciBub3JtYWxseS4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmICpvZnMrMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIG5leHQgY2hhciwgd2hhdGV2ZXIgaXQgaXMuICovCisgICAgICAgICAgICAgICAgKm9mcyArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKSB7CisgICAgICAgICAgICAvKiBJcyB0aGlzIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmc/ICovCisgICAgICAgICAgICBpZiAoKm9mcysyIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gY2ggJiYKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAzOworICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgYSBub3JtYWwgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBjaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnWycgfHwgY2ggPT0gJ3snIHx8IGNoID09ICcoJykgeworICAgICAgICAgICAgbmVzdGVkX2RlcHRoKys7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJ10nIHx8IGNoID09ICd9JyB8fCBjaCA9PSAnKScpKSB7CisgICAgICAgICAgICBuZXN0ZWRfZGVwdGgtLTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIEVycm9yOiBjYW4ndCBpbmNsdWRlIGEgY29tbWVudCBjaGFyYWN0ZXIsIGluc2lkZSBwYXJlbnMKKyAgICAgICAgICAgICAgIG9yIG5vdC4gKi8KKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJyEnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnfScpKSB7CisgICAgICAgICAgICAvKiBGaXJzdCwgdGVzdCBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiIT0iLiBTaW5jZSAnPScgaXMKKyAgICAgICAgICAgICAgIG5vdCBhbiBhbGxvd2VkIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBub3RoaW5nIGlzIGxvc3QgaW4KKyAgICAgICAgICAgICAgIHRoaXMgdGVzdC4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnIScgJiYgKm9mcysxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSAnPScpCisgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCBhIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBqdXN0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBOb3JtYWwgd2F5IG91dCBvZiB0aGlzIGxvb3AuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEp1c3QgY29uc3VtZSB0aGlzIGNoYXIgYW5kIGxvb3AgYXJvdW5kLiAqLworICAgICAgICB9CisgICAgfQorICAgIGV4cHJfZW5kID0gKm9mczsKKyAgICAvKiBJZiB3ZSBsZWF2ZSB0aGlzIGxvb3AgaW4gYSBzdHJpbmcgb3Igd2l0aCBtaXNtYXRjaGVkIHBhcmVucywgd2UKKyAgICAgICBkb24ndCBjYXJlLiBXZSdsbCBnZXQgYSBzeW50YXggZXJyb3Igd2hlbiBjb21waWxpbmcgdGhlCisgICAgICAgZXhwcmVzc2lvbi4gQnV0LCB3ZSBjYW4gcHJvZHVjZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLCBzbworICAgICAgIGxldCdzIGp1c3QgZG8gdGhhdC4qLworICAgIGlmIChxdW90ZV9jaGFyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobmVzdGVkX2RlcHRoKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAvKiBDb21waWxlIHRoZSBleHByZXNzaW9uIGFzIHNvb24gYXMgcG9zc2libGUsIHNvIHdlIHNob3cgZXJyb3JzCisgICAgICAgcmVsYXRlZCB0byB0aGUgZXhwcmVzc2lvbiBiZWZvcmUgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlCisgICAgICAgY29udmVyc2lvbiBvciBmb3JtYXRfc3BlYy4gKi8KKyAgICBzaW1wbGVfZXhwcmVzc2lvbiA9IGZzdHJpbmdfY29tcGlsZV9leHByKHN0ciwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGMsIG4pOworICAgIGlmICghc2ltcGxlX2V4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBhIGNvbnZlcnNpb24gY2hhciwgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJyEnKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIGNvbnZlcnNpb24gPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgKm9mcyArPSAxOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBjb252ZXJzaW9uLiAqLworICAgICAgICBpZiAoIShjb252ZXJzaW9uID09ICdzJyB8fCBjb252ZXJzaW9uID09ICdyJworICAgICAgICAgICAgICB8fCBjb252ZXJzaW9uID09ICdhJykpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJ3MnLCAncicsIG9yICdhJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBmb3JtYXQgc3BlYywgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJzonKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIC8qIFBhcnNlIHRoZSBmb3JtYXQgc3BlYy4gKi8KKyAgICAgICAgZm9ybWF0X3NwZWMgPSBmc3RyaW5nX3BhcnNlKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCsxLCBjLCBuKTsKKyAgICAgICAgaWYgKCFmb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgIT0gJ30nKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgIC8qIFdlJ3JlIGF0IGEgcmlnaHQgYnJhY2UuIENvbnN1bWUgaXQuICovCisgICAgYXNzZXJ0KCpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ30nKTsKKyAgICAqb2ZzICs9IDE7CisKKyAgICAvKiBBbmQgbm93IGNyZWF0ZSB0aGUgRm9ybWF0dGVkVmFsdWUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBlbnRpcmUKKyAgICAgICBleHByZXNzaW9uIHdpdGggdGhlIGNvbnZlcnNpb24gYW5kIGZvcm1hdCBzcGVjLiAqLworICAgICpleHByZXNzaW9uID0gRm9ybWF0dGVkVmFsdWUoc2ltcGxlX2V4cHJlc3Npb24sIChpbnQpY29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgIGlmICghKmV4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworCit1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc6CisgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCAocG9zc2libGUgemVybyBsZW5ndGgpIGFuZCBhbgorICAgZXhwcmVzc2lvbiAoemVybyBsZW5ndGggaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCisgICBSZXR1cm4gMSBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCwgYnV0IG5vIGV4cHJlc3Npb24sIGFuZCB3ZSB3YW50IHRoZQorICAgY2FsbGVyIHRvIGNhbGwgdXMgYWdhaW4uIFRoaXMgaXMgdXNlZCB0byBkZWFsIHdpdGggZG91YmxlZAorICAgYnJhY2VzLgorCisgICBXaGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc3RyaW5nICdhe3tiezB9YycsIHRoaXMgZnVuY3Rpb24KKyAgIHdpbGwgcmV0dXJuOgorCisgICAxLiB0aGUgbGl0ZXJhbCAnYXsnIHdpdGggbm8gZXhwcmVzc2lvbiwgYW5kIGEgcmV0dXJuIHZhbHVlCisgICAgICBvZiAxLiBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlcmUncyBubyBleHByZXNzaW9uLCB0aGUgcmV0dXJuCisgICAgICB2YWx1ZSBvZiAxIG1lYW5zIHdlJ3JlIG5vdCBmaW5pc2hlZCB5ZXQuCisKKyAgIDIuIHRoZSBsaXRlcmFsICdiJyBhbmQgdGhlIGV4cHJlc3Npb24gJzAnLCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mCisgICAgICAwLiBUaGUgZmFjdCB0aGF0IHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBtZWFucyB3ZSdyZSBub3QgZmluaXNoZWQuCisKKyAgIDMuIGxpdGVyYWwgJ2MnIHdpdGggbm8gZXhwcmVzc2lvbiBhbmQgYSByZXR1cm4gdmFsdWUgb2YgMC4gVGhlCisgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIDAgd2l0aCBubyBleHByZXNzaW9uIG1lYW5zCisgICAgICB3ZSdyZSBmaW5pc2hlZC4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbF9hbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqbGl0ZXJhbCwgZXhwcl90eSAqZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIGFzc2VydCgqbGl0ZXJhbCA9PSBOVUxMICYmICpleHByZXNzaW9uID09IE5VTEwpOworCisgICAgLyogR2V0IGFueSBsaXRlcmFsIHN0cmluZy4gKi8KKyAgICByZXN1bHQgPSBmc3RyaW5nX2ZpbmRfbGl0ZXJhbChzdHIsIG9mcywgbGl0ZXJhbCwgcmVjdXJzZV9sdmwsIGMsIG4pOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAxKTsKKworICAgIGlmIChyZXN1bHQgPT0gMSkKKyAgICAgICAgLyogV2UgaGF2ZSBhIGxpdGVyYWwsIGJ1dCBkb24ndCBsb29rIGF0IHRoZSBleHByZXNzaW9uLiAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ30nKQorICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlIGVuZCBvZiBhIG5lc3RlZAorICAgICAgICAgICBmLXN0cmluZzogbm8gZXhwcmVzc2lvbi4gVGhlIHRvcC1sZXZlbCBlcnJvciBjYXNlIHdoZXJlIHdlCisgICAgICAgICAgIGV4cGVjdCB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYnV0IHdlJ3JlIGF0IGEgJ30nIGlzCisgICAgICAgICAgIGhhbmRsZWQgbGF0ZXIuICovCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogV2UgbXVzdCBub3cgYmUgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sIG9uIGEgJ3snLiAqLworICAgIGFzc2VydCgqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ3snKTsKKworICAgIGlmIChmc3RyaW5nX2ZpbmRfZXhwcihzdHIsIG9mcywgcmVjdXJzZV9sdmwsIGV4cHJlc3Npb24sIGMsIG4pIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9DTEVBUigqbGl0ZXJhbCk7CisgICAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIEVYUFJMSVNUX05fQ0FDSEVEICA2NAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogSW5jcmVtZW50YWxseSBidWlsZCBhbiBhcnJheSBvZiBleHByX3R5LCBzbyBiZSB1c2VkIGluIGFuCisgICAgICAgYXNkbF9zZXEuIENhY2hlIHNvbWUgc21hbGwgYnV0IHJlYXNvbmFibHkgc2l6ZWQgbnVtYmVyIG9mCisgICAgICAgZXhwcl90eSdzLCBhbmQgdGhlbiBhZnRlciB0aGF0IHN0YXJ0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcsCisgICAgICAgZG91YmxpbmcgdGhlIG51bWJlciBhbGxvY2F0ZWQgZWFjaCB0aW1lLiBOb3RlIHRoYXQgdGhlIGYtc3RyaW5nCisgICAgICAgZid7MH1hezF9JyBjb250YWlucyAzIGV4cHJfdHknczogMiBGb3JtYXR0ZWRWYWx1ZSdzLCBhbmQgb25lCisgICAgICAgU3RyIGZvciB0aGUgbGl0ZXJhbCAnYScuIFNvIHlvdSBhZGQgZXhwcl90eSdzIGFib3V0IHR3aWNlIGFzCisgICAgICAgZmFzdCBhcyB5b3UgYWRkIGV4cmVzc2lvbnMgaW4gYW4gZi1zdHJpbmcuICovCisKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsgIC8qIE51bWJlciB3ZSd2ZSBhbGxvY2F0ZWQuICovCisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAvKiBOdW1iZXIgd2UndmUgdXNlZC4gKi8KKyAgICBleHByX3R5ICAgICpwOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB3ZSdyZSBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcuIFdpbGwgcG9pbnQgdG8gJ2RhdGEnIHVudGlsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nLiAqLworICAgIGV4cHJfdHkgICAgZGF0YVtFWFBSTElTVF9OX0NBQ0hFRF07Cit9IEV4cHJMaXN0OworCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCkKKyNlbHNlCitzdGF0aWMgdm9pZAorRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhFeHByTGlzdCAqbCkKK3sKKyAgICAvKiBDaGVjayBvdXIgaW52YXJpYW50cy4gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzICJsaXZlIiwgYW5kCisgICAgICAgaGFzbid0IGJlZW4gZGVhbGxvY2F0ZWQuICovCisgICAgYXNzZXJ0KGwtPnNpemUgPj0gMCk7CisgICAgYXNzZXJ0KGwtPnAgIT0gTlVMTCk7CisgICAgaWYgKGwtPnNpemUgPD0gRVhQUkxJU1RfTl9DQUNIRUQpCisgICAgICAgIGFzc2VydChsLT5kYXRhID09IGwtPnApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9Jbml0KEV4cHJMaXN0ICpsKQoreworICAgIGwtPmFsbG9jYXRlZCA9IEVYUFJMSVNUX05fQ0FDSEVEOworICAgIGwtPnNpemUgPSAwOworCisgICAgLyogVW50aWwgd2Ugc3RhcnQgYWxsb2NhdGluZyBkeW5hbWljYWxseSwgcCBwb2ludHMgdG8gZGF0YS4gKi8KKyAgICBsLT5wID0gbC0+ZGF0YTsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7Cit9CisKK3N0YXRpYyBpbnQKK0V4cHJMaXN0X0FwcGVuZChFeHByTGlzdCAqbCwgZXhwcl90eSBleHApCit7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKyAgICBpZiAobC0+c2l6ZSA+PSBsLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBhbGxvYyAob3IgcmVhbGxvYykgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGwtPmFsbG9jYXRlZCAqIDI7CisKKyAgICAgICAgLyogU2VlIGlmIHdlJ3ZlIGV2ZXIgYWxsb2NhdGVkIGFueXRoaW5nIGR5bmFtaWNhbGx5LiAqLworICAgICAgICBpZiAobC0+cCA9PSBsLT5kYXRhKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAvKiBXZSdyZSBzdGlsbCB1c2luZyB0aGUgY2FjaGVkIGRhdGEuIFN3aXRjaCB0bworICAgICAgICAgICAgICAgYWxsb2MtaW5nLiAqLworICAgICAgICAgICAgbC0+cCA9IFB5TWVtX1Jhd01hbGxvYyhzaXplb2YoZXhwcl90eSkgKiBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWwtPnApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogQ29weSB0aGUgY2FjaGVkIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5zaXplOyBpKyspCisgICAgICAgICAgICAgICAgbC0+cFtpXSA9IGwtPmRhdGFbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IHJlYWxsb2MuICovCisgICAgICAgICAgICBleHByX3R5ICp0bXAgPSBQeU1lbV9SYXdSZWFsbG9jKGwtPnAsIHNpemVvZihleHByX3R5KSAqIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghdG1wKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fUmF3RnJlZShsLT5wKTsKKyAgICAgICAgICAgICAgICBsLT5wID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLT5wID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgbC0+YWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgIGFzc2VydChsLT5hbGxvY2F0ZWQgPT0gMiAqIGwtPnNpemUpOworICAgIH0KKworICAgIGwtPnBbbC0+c2l6ZSsrXSA9IGV4cDsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9EZWFsbG9jKEV4cHJMaXN0ICpsKQoreworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisKKyAgICAvKiBJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIG9yIHdlJ3ZlIG5ldmVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwKKyAgICAgICBkbyBub3RoaW5nLiAqLworICAgIGlmICghbC0+cCB8fCBsLT5wID09IGwtPmRhdGEpIHsKKyAgICAgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gRnJlZSB0aGUgbWVtb3J5LiAqLworICAgICAgICBQeU1lbV9SYXdGcmVlKGwtPnApOworICAgIH0KKyAgICBsLT5wID0gTlVMTDsKKyAgICBsLT5zaXplID0gLTE7Cit9CisKK3N0YXRpYyBhc2RsX3NlcSAqCitFeHByTGlzdF9GaW5pc2goRXhwckxpc3QgKmwsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGFzZGxfc2VxICpzZXE7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGFzZGxfc2VxIGFuZCBjb3B5IHRoZSBleHByZXNzaW9ucyBpbiB0byBpdC4gKi8KKyAgICBzZXEgPSBfUHlfYXNkbF9zZXFfbmV3KGwtPnNpemUsIGFyZW5hKTsKKyAgICBpZiAoc2VxKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGwtPnNpemU7IGkrKykKKyAgICAgICAgICAgIGFzZGxfc2VxX1NFVChzZXEsIGksIGwtPnBbaV0pOworICAgIH0KKyAgICBFeHByTGlzdF9EZWFsbG9jKGwpOworICAgIHJldHVybiBzZXE7Cit9CisKKy8qIFRoZSBGc3RyaW5nUGFyc2VyIGlzIGRlc2lnbmVkIHRvIGFkZCBhIG1peCBvZiBzdHJpbmdzIGFuZAorICAgZi1zdHJpbmdzLCBhbmQgY29uY2F0IHRoZW0gdG9nZXRoZXIgYXMgbmVlZGVkLiBVbHRpbWF0ZWx5LCBpdAorICAgZ2VuZXJhdGVzIGFuIGV4cHJfdHkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyOworICAgIEV4cHJMaXN0IGV4cHJfbGlzdDsKK30gRnN0cmluZ1BhcnNlcjsKKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhdGUtPmxhc3Rfc3RyKSk7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cygmc3RhdGUtPmV4cHJfbGlzdCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfSW5pdChGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBzdGF0ZS0+bGFzdF9zdHIgPSBOVUxMOworICAgIEV4cHJMaXN0X0luaXQoJnN0YXRlLT5leHByX2xpc3QpOworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX0RlYWxsb2MoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIFB5X1hERUNSRUYoc3RhdGUtPmxhc3Rfc3RyKTsKKyAgICBFeHByTGlzdF9EZWFsbG9jKCZzdGF0ZS0+ZXhwcl9saXN0KTsKK30KKworLyogTWFrZSBhIFN0ciBub2RlLCBidXQgZGVjcmVmIHRoZSBQeVVuaWNvZGUgb2JqZWN0IGJlaW5nIGFkZGVkLiAqLworc3RhdGljIGV4cHJfdHkKK21ha2Vfc3RyX25vZGVfYW5kX2RlbChQeU9iamVjdCAqKnN0ciwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSogbikKK3sKKyAgICBQeU9iamVjdCAqcyA9ICpzdHI7CisgICAgKnN0ciA9IE5VTEw7CisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKyAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFN0cihzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Cit9CisKKy8qIEFkZCBhIG5vbi1mLXN0cmluZyAodGhhdCBpcywgYSByZWd1bGFyIGxpdGVyYWwgc3RyaW5nKS4gc3RyIGlzCisgICBkZWNyZWYnZC4gKi8KK3N0YXRpYyBpbnQKK0ZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RyKSk7CisKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAvKiBXZSBkaWRuJ3QgaGF2ZSBhIHN0cmluZyBiZWZvcmUsIHNvIGp1c3QgcmVtZW1iZXIgdGhpcyBvbmUuICovCisgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25jYXRlbmF0ZSB0aGlzIHdpdGggdGhlIHByZXZpb3VzIHN0cmluZy4gKi8KKyAgICAgICAgUHlVbmljb2RlX0FwcGVuZEFuZERlbCgmc3RhdGUtPmxhc3Rfc3RyLCBzdHIpOworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgYW4gZi1zdHJpbmcuIFRoZSBmLXN0cmluZyBpcyBpbiBzdHIsIHN0YXJ0aW5nIGF0IG9mcywgd2l0aCBubyAnZicKKyAgIG9yIHF1b3Rlcy4gc3RyIGlzIG5vdCBkZWNyZWYnZCwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlLgorICAgQW5kIGlmIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBhIHBhcnQgb2YgYSBzdHJpbmcsIHRoZW4gZGVjcmVmJ2luZyBpcworICAgZGVmaW5pdGVseSBub3QgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvISAqLworc3RhdGljIGludAorRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIC8qIFBhcnNlIHRoZSBmLXN0cmluZy4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBQeU9iamVjdCAqbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbiA9IE5VTEw7CisKKyAgICAgICAgLyogSWYgdGhlcmUncyBhIHplcm8gbGVuZ3RoIGxpdGVyYWwgaW4gZnJvbnQgb2YgdGhlCisgICAgICAgICAgIGV4cHJlc3Npb24sIGxpdGVyYWwgd2lsbCBiZSBOVUxMLiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mCisgICAgICAgICAgIHRoZSBmLXN0cmluZywgZXhwcmVzc2lvbiB3aWxsIGJlIE5VTEwgKHVubGVzcyByZXN1bHQgPT0gMSwKKyAgICAgICAgICAgc2VlIGJlbG93KS4gKi8KKyAgICAgICAgaW50IHJlc3VsdCA9IGZzdHJpbmdfZmluZF9saXRlcmFsX2FuZF9leHByKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXRlcmFsLCAmZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIG4pOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvKiBBZGQgdGhlIGxpdGVyYWwsIGlmIGFueS4gKi8KKyAgICAgICAgaWYgKCFsaXRlcmFsKSB7CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiBKdXN0IGxlYXZlIGxhc3Rfc3RyIGFsb25lIChhbmQgcG9zc2libHkKKyAgICAgICAgICAgICAgIE5VTEwpLiAqLworICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IGxpdGVyYWw7CisgICAgICAgICAgICBsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBsaXRlcmFsLCBjb25jYXRlbmF0ZSBpdC4gKi8KKyAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChsaXRlcmFsKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbChzdGF0ZSwgbGl0ZXJhbCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGxpdGVyYWwgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydCghc3RhdGUtPmxhc3Rfc3RyIHx8CisgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdGF0ZS0+bGFzdF9zdHIpICE9IDApOworCisgICAgICAgIC8qIFdlJ3ZlIGRlYWx0IHdpdGggdGhlIGxpdGVyYWwgbm93LiBJdCBjYW4ndCBiZSBsZWFrZWQgb24gZnVydGhlcgorICAgICAgICAgICBlcnJvcnMuICovCisgICAgICAgIGFzc2VydChsaXRlcmFsID09IE5VTEwpOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSBzaG91bGQganVzdCBsb29wIGFyb3VuZCB0byBnZXQgdGhlIG5leHQgbGl0ZXJhbAorICAgICAgICAgICBhbmQgZXhwcmVzc2lvbiwgd2hpbGUgaWdub3JpbmcgdGhlIGV4cHJlc3Npb24gdGhpcworICAgICAgICAgICB0aW1lLiBUaGlzIGlzIHVzZWQgZm9yIHVuLWRvdWJsaW5nIGJyYWNlcywgYXMgYW4KKyAgICAgICAgICAgb3B0aW1pemF0aW9uLiAqLworICAgICAgICBpZiAocmVzdWx0ID09IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIWV4cHJlc3Npb24pCisgICAgICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBmLXN0cmluZy4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFdlIGtub3cgd2UgaGF2ZSBhbiBleHByZXNzaW9uLiBDb252ZXJ0IGFueSBleGlzdGluZyBzdHJpbmcKKyAgICAgICAgICAgdG8gYSBTdHIgbm9kZS4gKi8KKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcuIE5vIHByZXZpb3VzIGxpdGVyYWwuICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRoZSBleGlzdGluZyBsYXN0X3N0ciBsaXRlcmFsIHRvIGEgU3RyIG5vZGUuICovCisgICAgICAgICAgICBleHByX3R5IHN0ciA9IG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICAgICAgICAgIGlmICghc3RyIHx8IEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgc3RyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgZXhwcmVzc2lvbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgLyogSWYgcmVjdXJzZV9sdmwgaXMgemVybywgdGhlbiB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgc3RyaW5nLiBPdGhlcndpc2UsIHdlIG11c3QgYmUgYXQgYSByaWdodCBicmFjZS4gKi8KKworICAgIGlmIChyZWN1cnNlX2x2bCA9PSAwICYmICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZWN1cnNlX2x2bCAhPSAwICYmIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSAhPSAnfScpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCB0aGUgcGFydGlhbCBzdGF0ZSByZWZsZWN0ZWQgaW4gbGFzdF9zdHIgYW5kIGV4cHJfbGlzdCB0byBhbgorICAgZXhwcl90eS4gVGhlIGV4cHJfdHkgY2FuIGJlIGEgU3RyLCBvciBhIEpvaW5lZFN0ci4gKi8KK3N0YXRpYyBleHByX3R5CitGc3RyaW5nUGFyc2VyX0ZpbmlzaChGc3RyaW5nUGFyc2VyICpzdGF0ZSwgc3RydWN0IGNvbXBpbGluZyAqYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgKm4pCit7CisgICAgYXNkbF9zZXEgKnNlcTsKKworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICAvKiBJZiB3ZSdyZSBqdXN0IGEgY29uc3RhbnQgc3RyaW5nIHdpdGggbm8gZXhwcmVzc2lvbnMsIHJldHVybgorICAgICAgIHRoYXQuICovCisgICAgaWYoc3RhdGUtPmV4cHJfbGlzdC5zaXplID09IDApIHsKKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIHplcm8gbGVuZ3RoIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBTdHIgbm9kZSBvdXQgb2YgbGFzdF9zdHIsIGlmIG5lZWRlZC4gSXQgd2lsbCBiZSB0aGUKKyAgICAgICBsYXN0IG5vZGUgaW4gb3VyIGV4cHJlc3Npb24gbGlzdC4gKi8KKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgIGV4cHJfdHkgc3RyID0gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgICAgICBpZiAoIXN0ciB8fCBFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIHN0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICAgIGFzc2VydChzdGF0ZS0+bGFzdF9zdHIgPT0gTlVMTCk7CisKKyAgICBzZXEgPSBFeHByTGlzdF9GaW5pc2goJnN0YXRlLT5leHByX2xpc3QsIGMtPmNfYXJlbmEpOworICAgIGlmICghc2VxKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogSWYgdGhlcmUncyBvbmx5IG9uZSBleHByZXNzaW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgd2UgbmVlZAorICAgICAgIHRvIGpvaW4gdGhlbSB0b2dldGhlci4gKi8KKyAgICBpZiAoc2VxLT5zaXplID09IDEpCisgICAgICAgIHJldHVybiBzZXEtPmVsZW1lbnRzWzBdOworCisgICAgcmV0dXJuIEpvaW5lZFN0cihzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKworZXJyb3I6CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKHN0YXRlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYW4gZi1zdHJpbmcgKHdpdGggbm8gJ2YnIG9yIHF1b3RlcykgdGhhdCdzIGluIHN0ciBzdGFydGluZyBhdAorICAgb2ZzLCBwYXJzZSBpdCBpbnRvIGFuIGV4cHJfdHkuIFJldHVybiBOVUxMIG9uIGVycm9yLiBEb2VzIG5vdAorICAgZGVjcmVmIHN0ci4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX3BhcnNlKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisKKyAgICBGc3RyaW5nUGFyc2VyX0luaXQoJnN0YXRlKTsKKyAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKCZzdGF0ZSwgc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgbikgPCAwKSB7CisgICAgICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKK30KKworLyogbiBpcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgaW5jbHVkaW5nIHRoZSBicmFja2V0aW5nIHF1b3RlCisgICBjaGFyYWN0ZXJzLCBhbmQgciwgYiwgdSwgJi9vciBmIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQKKyAgIGVzY2FwZSBzZXF1ZW5jZXMgKGlmIGFueSkuIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlCisgICBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHN0cmluZyBpcyBhbiBmLXN0cmluZywgc2V0CisgICAqZm1vZGUgYW5kIHJldHVybiB0aGUgdW5wYXJzZWQgc3RyaW5nIG9iamVjdC4KKyovCiBzdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCitwYXJzZXN0cihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSwgaW50ICpmbW9kZSkKIHsKICAgICBzaXplX3QgbGVuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBTVFIobik7CkBAIC00MDI0LDE1ICs0ODg0LDI0IEBACiAgICAgICAgICAgICAgICAgcXVvdGUgPSAqKytzOwogICAgICAgICAgICAgICAgIHJhd21vZGUgPSAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVvdGUgPT0gJ2YnIHx8IHF1b3RlID09ICdGJykgeworICAgICAgICAgICAgICAgIHF1b3RlID0gKisrczsKKyAgICAgICAgICAgICAgICAqZm1vZGUgPSAxOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKCpmbW9kZSAmJiAqYnl0ZXNtb2RlKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKHF1b3RlICE9ICdcJycgJiYgcXVvdGUgIT0gJ1wiJykgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIC8qIFNraXAgdGhlIGxlYWRpbmcgcXVvdGUgY2hhci4gKi8KICAgICBzKys7CiAgICAgbGVuID0gc3RybGVuKHMpOwogICAgIGlmIChsZW4gPiBJTlRfTUFYKSB7CkBAIC00MDQxLDE5ICs0OTEwLDI0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoc1stLWxlbl0gIT0gcXVvdGUpIHsKKyAgICAgICAgLyogTGFzdCBxdW90ZSBjaGFyIG11c3QgbWF0Y2ggdGhlIGZpcnN0LiAqLwogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChsZW4gPj0gNCAmJiBzWzBdID09IHF1b3RlICYmIHNbMV0gPT0gcXVvdGUpIHsKKyAgICAgICAgLyogQSB0cmlwbGUgcXVvdGVkIHN0cmluZy4gV2UndmUgYWxyZWFkeSBza2lwcGVkIG9uZSBxdW90ZSBhdAorICAgICAgICAgICB0aGUgc3RhcnQgYW5kIG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIE5vdyBza2lwIHRoZQorICAgICAgICAgICB0d28gYXQgdGhlIHN0YXJ0LiAqLwogICAgICAgICBzICs9IDI7CiAgICAgICAgIGxlbiAtPSAyOworICAgICAgICAvKiBBbmQgY2hlY2sgdGhhdCB0aGUgbGFzdCB0d28gbWF0Y2guICovCiAgICAgICAgIGlmIChzWy0tbGVuXSAhPSBxdW90ZSB8fCBzWy0tbGVuXSAhPSBxdW90ZSkgewogICAgICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoISpieXRlc21vZGUgJiYgIXJhd21vZGUpIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZV91bmljb2RlKGMsIHMsIGxlbiwgcmF3bW9kZSwgYy0+Y19lbmNvZGluZyk7CisgICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZShjLCBzLCBsZW4sIGMtPmNfZW5jb2RpbmcpOwogICAgIH0KICAgICBpZiAoKmJ5dGVzbW9kZSkgewogICAgICAgICAvKiBEaXNhbGxvdyBub24tYXNjaWkgY2hhcmFjdGVycyAoYnV0IG5vdCBlc2NhcGVzKSAqLwpAQCAtNDA4NSw1MSArNDk1OSw4NCBAQAogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBQeUJ5dGVzX0RlY29kZUVzY2FwZShzLCBsZW4sIE5VTEwsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2VuY29kaW5nID8gYy0+Y19lbmNvZGluZyA6IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2VuY29kaW5nID8gYy0+Y19lbmNvZGluZyA6IE5VTEwpOwogfQogCi0vKiBCdWlsZCBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IG91dCBvZiBhIFNUUklORysgYXRvbS4gIFRoaXMgdGFrZXMgY2FyZSBvZgotICogY29tcGlsZS10aW1lIGxpdGVyYWwgY2F0ZW5hdGlvbiwgY2FsbGluZyBwYXJzZXN0cigpIG9uIGVhY2ggcGllY2UsIGFuZAotICogcGFzdGluZyB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgdG9nZXRoZXIuCi0gKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1wYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCisvKiBBY2NlcHRzIGEgU1RSSU5HKyBhdG9tLCBhbmQgcHJvZHVjZXMgYW4gZXhwcl90eSBub2RlLiBSdW4gdGhyb3VnaAorICAgZWFjaCBTVFJJTkcgYXRvbSwgYW5kIHByb2Nlc3MgaXQgYXMgbmVlZGVkLiBGb3IgYnl0ZXMsIGp1c3QKKyAgIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXIsIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgYSBCeXRlcyBub2RlLiBGb3IKKyAgIG5vcm1hbCBzdHJpbmdzIGFuZCBmLXN0cmluZ3MsIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXIuIFRoZSByZXN1bHQKKyAgIHdpbGwgYmUgYSBTdHIgbm9kZSBpZiB0aGVyZSB3ZXJlIG5vIGYtc3RyaW5nczsgYSBGb3JtYXR0ZWRWYWx1ZQorICAgbm9kZSBpZiB0aGVyZSdzIGp1c3QgYW4gZi1zdHJpbmcgKHdpdGggbm8gbGVhZGluZyBvciB0cmFpbGluZworICAgbGl0ZXJhbHMpLCBvciBhIEpvaW5lZFN0ciBub2RlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBmLXN0cmluZ3Mgb3IKKyAgIGFueSBsaXRlcmFscyBpbnZvbHZlZC4gKi8KK3N0YXRpYyBleHByX3R5CitwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKIHsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgYnl0ZXNtb2RlID0gMDsKKyAgICBQeU9iamVjdCAqYnl0ZXNfc3RyID0gTlVMTDsKICAgICBpbnQgaTsKLSAgICBSRVEoQ0hJTEQobiwgMCksIFNUUklORyk7Ci0gICAgdiA9IHBhcnNlc3RyKGMsIENISUxEKG4sIDApLCBieXRlc21vZGUpOwotICAgIGlmICh2ICE9IE5VTEwpIHsKLSAgICAgICAgLyogU3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbiAqLwotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKG4pOyBpKyspIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpzOwotICAgICAgICAgICAgaW50IHN1YmJtID0gMDsKLSAgICAgICAgICAgIHMgPSBwYXJzZXN0cihjLCBDSElMRChuLCBpKSwgJnN1YmJtKTsKLSAgICAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgaWYgKCpieXRlc21vZGUgIT0gc3ViYm0pIHsKLSAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisgICAgRnN0cmluZ1BhcnNlcl9Jbml0KCZzdGF0ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspIHsKKyAgICAgICAgaW50IHRoaXNfYnl0ZXNtb2RlID0gMDsKKyAgICAgICAgaW50IHRoaXNfZm1vZGUgPSAwOworICAgICAgICBQeU9iamVjdCAqczsKKworICAgICAgICBSRVEoQ0hJTEQobiwgaSksIFNUUklORyk7CisgICAgICAgIHMgPSBwYXJzZXN0cihjLCBDSElMRChuLCBpKSwgJnRoaXNfYnl0ZXNtb2RlLCAmdGhpc19mbW9kZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSdyZSBub3QgbWl4aW5nIGJ5dGVzIHdpdGggdW5pY29kZS4gKi8KKyAgICAgICAgaWYgKGkgIT0gMCAmJiBieXRlc21vZGUgIT0gdGhpc19ieXRlc21vZGUpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiY2Fubm90IG1peCBieXRlcyBhbmQgbm9uYnl0ZXMgbGl0ZXJhbHMiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNtb2RlID0gdGhpc19ieXRlc21vZGU7CisKKyAgICAgICAgYXNzZXJ0KGJ5dGVzbW9kZSA/IFB5Qnl0ZXNfQ2hlY2tFeGFjdChzKSA6IFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKworICAgICAgICBpZiAoYnl0ZXNtb2RlKSB7CisgICAgICAgICAgICAvKiBGb3IgYnl0ZXMsIGNvbmNhdCBhcyB3ZSBnby4gKi8KKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBqdXN0IHJlbWVtYmVyIHRoaXMgdmFsdWUuICovCisgICAgICAgICAgICAgICAgYnl0ZXNfc3RyID0gczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlCeXRlc19Db25jYXRBbmREZWwoJmJ5dGVzX3N0ciwgcyk7CisgICAgICAgICAgICAgICAgaWYgKCFieXRlc19zdHIpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayh2KSAmJiBQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlCeXRlc19Db25jYXRBbmREZWwoJnYsIHMpOwotICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlVbmljb2RlX0NvbmNhdCh2LCBzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgICAgIHYgPSB0ZW1wOwotICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzX2Ztb2RlKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIGYtc3RyaW5nLiBDb25jYXRlbmF0ZSBhbmQgZGVjcmVmIGl0LiAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBvZnMgPSAwOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEZzdHJpbmdQYXJzZXJfQ29uY2F0RnN0cmluZygmc3RhdGUsIHMsICZvZnMsIDAsIGMsIG4pOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYSByZWd1bGFyIHN0cmluZy4gQ29uY2F0ZW5hdGUgaXQuICovCisgICAgICAgICAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRBbmREZWwoJnN0YXRlLCBzKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdjsKKyAgICBpZiAoYnl0ZXNtb2RlKSB7CisgICAgICAgIC8qIEp1c3QgcmV0dXJuIHRoZSBieXRlcyBvYmplY3QgYW5kIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGMtPmNfYXJlbmEsIGJ5dGVzX3N0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEJ5dGVzKGJ5dGVzX3N0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIH0KIAotICBvbkVycm9yOgotICAgIFB5X1hERUNSRUYodik7CisgICAgLyogV2UncmUgbm90IGEgYnl0ZXMgc3RyaW5nLCBieXRlc19zdHIgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBzZXQuICovCisgICAgYXNzZXJ0KGJ5dGVzX3N0ciA9PSBOVUxMKTsKKworICAgIHJldHVybiBGc3RyaW5nUGFyc2VyX0ZpbmlzaCgmc3RhdGUsIGMsIG4pOworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGJ5dGVzX3N0cik7CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKCZzdGF0ZSk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYmx0aW5tb2R1bGUuYyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCmluZGV4IGEwNmVmNjEuLjMxZDllMGUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jCisrKyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCkBAIC0zMzEsNyArMzMxLDcgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAoY21wID09IDEpIHsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKICAgICAgICAgfQpAQCAtNDY5LDYgKzQ2OSw3IEBACiAgICAgUHlPYmplY3QgKml0ID0gbHotPml0OwogICAgIGxvbmcgb2s7CiAgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIGludCBjaGVja3RydWUgPSBsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZTsKIAogICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKICAgICBmb3IgKDs7KSB7CkBAIC00NzYsMTIgKzQ3NywxMSBAQAogICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7CisgICAgICAgIGlmIChjaGVja3RydWUpIHsKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7Ci0gICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwogICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNzQsMTMgKzExNzQsMTQgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5X3NzaXplX3QgbnVtYXJncywgaTsKIAotICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUobHotPml0ZXJzKTsKKyAgICBudW1hcmdzID0gUHlUdXBsZV9HRVRfU0laRShsei0+aXRlcnMpOwogICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7CiAgICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLSAgICAgICAgdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpOworICAgICAgICB2YWwgPSBQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQoaXQpOwogICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmd0dXBsZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggNzg2YWRiZi4uMzgzNWNiYiAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludCBsbHRyYWNlOwotc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNoYXIgKik7CitzdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKICNlbmRpZgogc3RhdGljIGludCBjYWxsX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICBQeVRocmVhZFN0YXRlICosIFB5RnJhbWVPYmplY3QgKiwKQEAgLTIzMDcsNyArMjMwNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShsb2NhbHMsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwgJiYgX1B5RXJyX09DQ1VSUkVEKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMjM0NywyNiArMjM0NywzMyBAQAogICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CiAgICAgICAgICAgICBQeU9iamVjdCAqdjsKICAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2dsb2JhbHMpCi0gICAgICAgICAgICAgICAgJiYgUHlEaWN0X0NoZWNrRXhhY3QoZi0+Zl9idWlsdGlucykpIHsKKyAgICAgICAgICAgICAgICAmJiBQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2J1aWx0aW5zKSkKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2ID0gX1B5RGljdF9Mb2FkR2xvYmFsKChQeURpY3RPYmplY3QgKilmLT5mX2dsb2JhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEaWN0T2JqZWN0ICopZi0+Zl9idWlsdGlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfUHlFcnJfT0NDVVJSRUQoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfUHlFcnJfT0NDVVJSRUQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogX1B5RGljdF9Mb2FkR2xvYmFsKCkgcmV0dXJucyBOVUxMIHdpdGhvdXQgcmFpc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICogYW4gZXhjZXB0aW9uIGlmIHRoZSBrZXkgZG9lc24ndCBleGlzdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfTmFtZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV9FUlJPUl9NU0csIG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNsb3ctcGF0aCBpZiBnbG9iYWxzIG9yIGJ1aWx0aW5zIGlzIG5vdCBhIGRpY3QgKi8KKworICAgICAgICAgICAgICAgIC8qIG5hbWVzcGFjZSAxOiBnbG9iYWxzICovCiAgICAgICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0oZi0+Zl9nbG9iYWxzLCBuYW1lKTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogCisgICAgICAgICAgICAgICAgICAgIC8qIG5hbWVzcGFjZSAyOiBidWlsdGlucyAqLwogICAgICAgICAgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShmLT5mX2J1aWx0aW5zLCBuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQpAQCAtMjQyNiw3ICsyNDMzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfR2V0SXRlbShsb2NhbHMsIG5hbWUpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTMzNjYsNiArMzM3Myw2MyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFRBUkdFVChGT1JNQVRfVkFMVUUpIHsKKyAgICAgICAgICAgIC8qIEhhbmRsZXMgZi1zdHJpbmcgdmFsdWUgZm9ybWF0dGluZy4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBQeU9iamVjdCAqZm10X3NwZWM7CisgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgICAgICAgICBQeU9iamVjdCAqKCpjb252X2ZuKShQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGludCB3aGljaF9jb252ZXJzaW9uID0gb3BhcmcgJiBGVkNfTUFTSzsKKyAgICAgICAgICAgIGludCBoYXZlX2ZtdF9zcGVjID0gKG9wYXJnICYgRlZTX01BU0spID09IEZWU19IQVZFX1NQRUM7CisKKyAgICAgICAgICAgIGZtdF9zcGVjID0gaGF2ZV9mbXRfc3BlYyA/IFBPUCgpIDogTlVMTDsKKyAgICAgICAgICAgIHZhbHVlID0gVE9QKCk7CisKKyAgICAgICAgICAgIC8qIFNlZSBpZiBhbnkgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQuICovCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoX2NvbnZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRlZDX1NUUjogICBjb252X2ZuID0gUHlPYmplY3RfU3RyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVkNfUkVQUjogIGNvbnZfZm4gPSBQeU9iamVjdF9SZXByOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZWQ19BU0NJSTogY29udl9mbiA9IFB5T2JqZWN0X0FTQ0lJOyBicmVhazsKKworICAgICAgICAgICAgLyogTXVzdCBiZSAwIChtZWFuaW5nIG5vIGNvbnZlcnNpb24pLCBzaW5jZSBvbmx5IGZvdXIKKyAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgYWxsb3dlZCBieSAob3BhcmcgJiBGVkNfTUFTSykuICovCisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgY29udl9mbiA9IE5VTEw7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGNvbnZlcnNpb24gZnVuY3Rpb24sIGNhbGwgaXQgYW5kIHJlcGxhY2UKKyAgICAgICAgICAgICAgIHZhbHVlIHdpdGggdGhhdCByZXN1bHQuIE90aGVyd2lzZSwganVzdCB1c2UgdmFsdWUsCisgICAgICAgICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24uICovCisgICAgICAgICAgICBpZiAoY29udl9mbikgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZfZm4odmFsdWUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB2YWx1ZSBpcyBhIHVuaWNvZGUgb2JqZWN0LCBhbmQgdGhlcmUncyBubyBmbXRfc3BlYywKKyAgICAgICAgICAgICAgIHRoZW4gd2Uga25vdyB0aGUgcmVzdWx0IG9mIGZvcm1hdCh2YWx1ZSkgaXMgdmFsdWUKKyAgICAgICAgICAgICAgIGl0c2VsZi4gSW4gdGhhdCBjYXNlLCBza2lwIGNhbGxpbmcgZm9ybWF0KCkuIEkgcGxhbiB0bworICAgICAgICAgICAgICAgbW92ZSB0aGlzIG9wdGltaXphdGlvbiBpbiB0byBQeU9iamVjdF9Gb3JtYXQoKQorICAgICAgICAgICAgICAgaXRzZWxmLiAqLworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKSAmJiBmbXRfc3BlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZywganVzdCB0cmFuc2ZlciBvd25lcnNoaXAgdG8gcmVzdWx0LiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBBY3R1YWxseSBjYWxsIGZvcm1hdCgpLiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0Zvcm1hdCh2YWx1ZSwgZm10X3NwZWMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFVF9UT1AocmVzdWx0KTsKKyAgICAgICAgICAgIERJU1BBVENIKCk7CisgICAgICAgIH0KKwogICAgICAgICBUQVJHRVQoRVhURU5ERURfQVJHKSB7CiAgICAgICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKICAgICAgICAgICAgIG9wYXJnID0gb3Bhcmc8PDE2IHwgTkVYVEFSRygpOwpAQCAtNDI0NCw3ICs0MzA4LDcgQEAKIAogI2lmZGVmIExMVFJBQ0UKIHN0YXRpYyBpbnQKLXBydHJhY2UoUHlPYmplY3QgKnYsIGNoYXIgKnN0cikKK3BydHJhY2UoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBwcmludGYoIiVzICIsIHN0cik7CiAgICAgaWYgKFB5T2JqZWN0X1ByaW50KHYsIHN0ZG91dCwgMCkgIT0gMCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IDc2MzFmNGUuLjBmNjE5YzQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtNzMxLDYgKzczMSw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogLyogQWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCiAgICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpAQCAtMTA2Niw2ICsxMDY3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBHRVRfWUlFTERfRlJPTV9JVEVSOgogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRk9STUFUX1ZBTFVFOgorICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGZtdF9zcGVjIG9uIHRoZSBzdGFjaywgd2UgZ28gZnJvbSAyLT4xLAorICAgICAgICAgICAgICAgZWxzZSAxLT4xLiAqLworICAgICAgICAgICAgcmV0dXJuIChvcGFyZyAmIEZWU19NQVNLKSA9PSBGVlNfSEFWRV9TUEVDID8gLTEgOiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFBZX0lOVkFMSURfU1RBQ0tfRUZGRUNUOwogICAgIH0KQEAgLTMyMDgsNiArMzIxMyw4MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkNhbGwua2V5d29yZHMpOwogfQogCitzdGF0aWMgaW50Citjb21waWxlcl9qb2luZWRfc3RyKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQoreworICAgIC8qIENvbmNhdGVuYXRlIHBhcnRzIG9mIGEgc3RyaW5nIHVzaW5nICcnLmpvaW4ocGFydHMpLiBUaGVyZSBhcmUKKyAgICAgICBwcm9iYWJseSBiZXR0ZXIgd2F5cyBvZiBkb2luZyB0aGlzLgorCisgICAgICAgVGhpcyBpcyB1c2VkIGZvciBjb25zdHJ1Y3RzIGxpa2UgIid4PScgZid7NDJ9JyIsIHdoaWNoIGhhdmUgdG8KKyAgICAgICBiZSBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lLiAqLworCisgICAgc3RhdGljIFB5T2JqZWN0ICplbXB0eV9zdHJpbmc7CisgICAgc3RhdGljIFB5T2JqZWN0ICpqb2luX3N0cmluZzsKKworICAgIGlmICghZW1wdHlfc3RyaW5nKSB7CisgICAgICAgIGVtcHR5X3N0cmluZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKCFlbXB0eV9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFqb2luX3N0cmluZykgeworICAgICAgICBqb2luX3N0cmluZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJqb2luIik7CisgICAgICAgIGlmICgham9pbl9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGVtcHR5X3N0cmluZywgY29uc3RzKTsKKyAgICBBRERPUF9OQU1FKGMsIExPQURfQVRUUiwgam9pbl9zdHJpbmcsIG5hbWVzKTsKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIGFzZGxfc2VxX0xFTihlLT52LkpvaW5lZFN0ci52YWx1ZXMpKTsKKyAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworICAgIHJldHVybiAxOworfQorCisvKiBVc2VkIHRvIGltcGxlbWVudCBmLXN0cmluZ3MuIEZvcm1hdCBhIHNpbmdsZSB2YWx1ZS4gKi8KK3N0YXRpYyBpbnQKK2NvbXBpbGVyX2Zvcm1hdHRlZF92YWx1ZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICAvKiBPdXIgb3BhcmcgZW5jb2RlcyAyIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogdGhlIGNvbnZlcnNpb24KKyAgICAgICBjaGFyYWN0ZXIsIGFuZCB3aGV0aGVyIG9yIG5vdCBhIGZvcm1hdF9zcGVjIHdhcyBwcm92aWRlZC4KKworICAgICAgIENvbnZlcnQgdGhlIGNvbnZlcnNpb24gY2hhciB0byAyIGJpdHM6CisgICAgICAgTm9uZTogMDAwICAweDAgIEZWQ19OT05FCisgICAgICAgIXMgIDogMDAxICAweDEgIEZWQ19TVFIKKyAgICAgICAhciAgOiAwMTAgIDB4MiAgRlZDX1JFUFIKKyAgICAgICAhYSAgOiAwMTEgIDB4MyAgRlZDX0FTQ0lJCisKKyAgICAgICBuZXh0IGJpdCBpcyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgZm9ybWF0IHNwZWM6CisgICAgICAgeWVzIDogMTAwICAweDQKKyAgICAgICBubyAgOiAwMDAgIDB4MAorICAgICovCisKKyAgICBpbnQgb3Bhcmc7CisKKyAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBiZSBmb3JtYXR0ZWQuICovCisgICAgVklTSVQoYywgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisKKyAgICBzd2l0Y2ggKGUtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbikgeworICAgIGNhc2UgJ3MnOiBvcGFyZyA9IEZWQ19TVFI7ICAgYnJlYWs7CisgICAgY2FzZSAncic6IG9wYXJnID0gRlZDX1JFUFI7ICBicmVhazsKKyAgICBjYXNlICdhJzogb3BhcmcgPSBGVkNfQVNDSUk7IGJyZWFrOworICAgIGNhc2UgLTE6ICBvcGFyZyA9IEZWQ19OT05FOyAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBjb252ZXJzaW9uIGNoYXJhY3RlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpIHsKKyAgICAgICAgLyogRXZhbHVhdGUgdGhlIGZvcm1hdCBzcGVjLCBhbmQgdXBkYXRlIG91ciBvcGNvZGUgYXJnLiAqLworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgb3BhcmcgfD0gRlZTX0hBVkVfU1BFQzsKKyAgICB9CisKKyAgICAvKiBBbmQgcHVzaCBvdXIgb3Bjb2RlIGFuZCBvcGFyZyAqLworICAgIEFERE9QX0koYywgRk9STUFUX1ZBTFVFLCBvcGFyZyk7CisgICAgcmV0dXJuIDE7Cit9CisKIC8qIHNoYXJlZCBjb2RlIGJldHdlZW4gY29tcGlsZXJfY2FsbCBhbmQgY29tcGlsZXJfY2xhc3MgKi8KIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywKQEAgLTM2MjcsOSArMzcwNyw5IEBACiAgICAgICAgQkxPQ0sKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQ6Ci0gICAgICAgZXhjID0gY29weSBvZiAoZXhjZXB0aW9uLCBpbnN0YW5jZSwgdHJhY2ViYWNrKQorICAgICAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCiAgICAgICAgZWxzZToKLSAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgaWYgbm90IChhd2FpdCBleGl0KCpleGMpKToKICAgICAgICAgICAgcmFpc2UKICAqLwpAQCAtMzg3Nyw2ICszOTU3LDEwIEBACiAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfam9pbmVkX3N0cihjLCBlKTsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoYywgZSk7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQnl0ZXMucywgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CkBAIC00NzgzLDQgKzQ4NjcsMyBAQAogewogICAgIHJldHVybiBQeUFTVF9Db21waWxlRXgobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIC0xLCBhcmVuYSk7CiB9Ci0KZGlmZiAtLWdpdCBhL1B5dGhvbi9kdG9hLmMgYi9QeXRob24vZHRvYS5jCmluZGV4IDNkYTU0NmUuLmUwNjY1YjYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9kdG9hLmMKKysrIGIvUHl0aG9uL2R0b2EuYwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiB7CiAgICAgQmlnaW50ICpiMSwgKnA1LCAqcDUxOwogICAgIGludCBpOwotICAgIHN0YXRpYyBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CisgICAgc3RhdGljIGNvbnN0IGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKIAogICAgIGlmICgoaSA9IGsgJiAzKSkgewogICAgICAgICBiID0gbXVsdGFkZChiLCBwMDVbaS0xXSwgMCk7CkBAIC04MDMsNyArODAzLDcgQEAKIHsKICAgICBCaWdpbnQgKmIxLCAqcDUsICpwNTE7CiAgICAgaW50IGk7Ci0gICAgc3RhdGljIGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OwogCiAgICAgaWYgKChpID0gayAmIDMpKSB7CiAgICAgICAgIGIgPSBtdWx0YWRkKGIsIHAwNVtpLTFdLCAwKTsKQEAgLTIzMTUsNyArMjMxNSw3IEBACiB9CiAKIHN0YXRpYyBjaGFyICoKLW5ydl9hbGxvYyhjaGFyICpzLCBjaGFyICoqcnZlLCBpbnQgbikKK25ydl9hbGxvYyhjb25zdCBjaGFyICpzLCBjaGFyICoqcnZlLCBpbnQgbikKIHsKICAgICBjaGFyICpydiwgKnQ7CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggZjJjNzk2ZS4uMDUwNTBjZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTI0LDEyICsyNCwxMCBAQAogI2RlZmluZSBQWURfREVCVUdfU1VGRklYICIiCiAjZW5kaWYKIAotI2RlZmluZSBTVFJJTkdJWkUyKHgpICN4Ci0jZGVmaW5lIFNUUklOR0laRSh4KSBTVFJJTkdJWkUyKHgpCiAjaWZkZWYgUFlEX1BMQVRGT1JNX1RBRwotI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFNUUklOR0laRShQWV9NQUpPUl9WRVJTSU9OKSBTVFJJTkdJWkUoUFlfTUlOT1JfVkVSU0lPTikgIi0iIFBZRF9QTEFURk9STV9UQUcgIi5weWQiCisjZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKSAiLSIgUFlEX1BMQVRGT1JNX1RBRyAiLnB5ZCIKICNlbHNlCi0jZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgU1RSSU5HSVpFKFBZX01BSk9SX1ZFUlNJT04pIFNUUklOR0laRShQWV9NSU5PUl9WRVJTSU9OKSAiLnB5ZCIKKyNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pICIucHlkIgogI2VuZGlmCiAKICNkZWZpbmUgUFlEX1VOVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIucHlkIgpAQCAtNDMsNyArNDEsNyBAQAogLyogQ2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZSwgdG8gYXZvaWQgYW55IGRlcGVuZGVuY2llcyBvbiBwYXJ0aWN1bGFyCiAgICBDIFJUTCBpbXBsZW1lbnRhdGlvbnMgKi8KIAotc3RhdGljIGludCBzdHJjYXNlY21wIChjaGFyICpzdHJpbmcxLCBjaGFyICpzdHJpbmcyKQorc3RhdGljIGludCBzdHJjYXNlY21wIChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyKQogewogICAgIGludCBmaXJzdCwgc2Vjb25kOwogCmRpZmYgLS1naXQgYS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCmluZGV4IDA1NmJiNzYuLmE0MjhmYmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCisrKyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNoYXIgbm9fZ3JvdXBpbmdbMV0gPSB7Q0hBUl9NQVh9Oworc3RhdGljIGNvbnN0IGNoYXIgbm9fZ3JvdXBpbmdbMV0gPSB7Q0hBUl9NQVh9OwogCiAvKiBGaW5kIHRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlcihzPyksIHRob3VzYW5kc19zZXBhcmF0b3Iocz8pLCBhbmQKICAgIGdyb3VwaW5nIGRlc2NyaXB0aW9uLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSBpZiB0eXBlIGlzCmRpZmYgLS1naXQgYS9QeXRob24vZnJvemVubWFpbi5jIGIvUHl0aG9uL2Zyb3plbm1haW4uYwppbmRleCBkZThiZDM1Li43NjliMzNkIDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVubWFpbi5jCisrKyBiL1B5dGhvbi9mcm96ZW5tYWluLmMKQEAgLTk5LDcgKzk5LDkgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlXaW5GcmVlemVfRXhlVGVybSgpOwogI2VuZGlmCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiBlcnJvcjoKICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weSk7CmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCBjMzY1ZmMyLi43ZDQ1Nzg1IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogCiAjaWZkZWYgSEFWRV9ERUNMU1BFQ19ETEwKIC8qIEV4cG9ydCBmdW5jdGlvbnMgKi8KLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCAuLi4pOwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QpOwogI2VuZGlmCkBAIC01NiwxOCArNTYsMTggQEAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBpbnQgdmdldGFyZ3MxKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgc2V0ZXJyb3IoUHlfc3NpemVfdCwgY29uc3QgY2hhciAqLCBpbnQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGNoYXIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNoYXIgKiopOwotc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNoYXIqKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnR0dXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIGZyZWVsaXN0X3QgKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydHNpbXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIFB5X3NzaXplX3QgY29udmVydGJ1ZmZlcihQeU9iamVjdCAqLCB2b2lkICoqcCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgaW50IGdldGJ1ZmZlcihQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgY29uc3QgY2hhcioqKTsKIAogc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqc2tpcGl0ZW0oY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNraXBpdGVtKGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKIAogaW50CiBQeUFyZ19QYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCkBAIC04Miw3ICs4Miw3IEBACiB9CiAKIGludAotX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgaW50IHJldHZhbDsKICAgICB2YV9saXN0IHZhOwpAQCAtMTA3LDcgKzEwNyw3IEBACiB9CiAKIGludAotX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgLi4uKQorX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCitfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewogICAgIHZhX2xpc3QgbHZhOwogCkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBpbnQgZW5kZm10ID0gMDsKICAgICBjb25zdCBjaGFyICpmb3JtYXRzYXZlID0gZm9ybWF0OwogICAgIFB5X3NzaXplX3QgaSwgbGVuOwotICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICptc2c7CiAgICAgaW50IGNvbXBhdCA9IGZsYWdzICYgRkxBR19DT01QQVQ7CiAgICAgZnJlZWxpc3RlbnRyeV90IHN0YXRpY19lbnRyaWVzW1NUQVRJQ19GUkVFTElTVF9FTlRSSUVTXTsKICAgICBmcmVlbGlzdF90IGZyZWVsaXN0OwpAQCAtNDE2LDcgKzQxNiw3IEBACiAgICAgICBhbmQgbXNnYnVmIGlzIHJldHVybmVkLgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHR1cGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBpbnQgdG9wbGV2ZWwsCiAgICAgICAgICAgICAgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCkBAIC00NzQsNyArNDc0LDcgQEAKIAogICAgIGZvcm1hdCA9ICpwX2Zvcm1hdDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICBQeU9iamVjdCAqaXRlbTsKICAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmcsIGkpOwogICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CkBAIC01MDEsMTEgKzUwMSwxMSBAQAogCiAvKiBDb252ZXJ0IGEgc2luZ2xlIGl0ZW0uICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnRpdGVtKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQogewotICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICptc2c7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OwogCiAgICAgaWYgKCpmb3JtYXQgPT0gJygnIC8qICcpJyAqLykgewpAQCAtNTMwLDcgKzUzMCw3IEBACiAKIC8qIEZvcm1hdCBhbiBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb252ZXJ0c2ltcGxlKCkuICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnRlcnIoY29uc3QgY2hhciAqZXhwZWN0ZWQsIFB5T2JqZWN0ICphcmcsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUpCiB7CiAgICAgYXNzZXJ0KGV4cGVjdGVkICE9IE5VTEwpOwpAQCAtNTY2LDcgKzU2Niw3IEBACiAgICBXaGVuIHlvdSBhZGQgbmV3IGZvcm1hdCBjb2RlcywgcGxlYXNlIGRvbid0IGZvcmdldCBwb29yIHNraXBpdGVtKCkgYmVsb3cuCiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKQEAgLTg1MSw3ICs4NTEsNyBAQAogCiAgICAgY2FzZSAneSc6IHsvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KICAgICAgICAgdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotICAgICAgICBjaGFyICpidWY7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKICAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyonKSB7CiAgICAgICAgICAgICBpZiAoZ2V0YnVmZmVyKGFyZywgKFB5X2J1ZmZlciopcCwgJmJ1ZikgPCAwKQpAQCAtODk4LDcgKzg5OCw3IEBACiAgICAgICAgICAgICAgICAgUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLCBzYXJnLCBsZW4sIDEsIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7IC8qIGFueSBieXRlcy1saWtlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAgICAgICAgICAgICB9CkBAIC05MjgsNyArOTI4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiByZWFkLW9ubHkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KICAgICAgICAgICAgICAgICAvKiBYWFggUmVhbGx5PyAqLwotICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKQEAgLTEyNzUsNyArMTI3NSw3IEBACiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1jb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjaGFyICoqZXJybXNnKQorY29udmVydGJ1ZmZlcihQeU9iamVjdCAqYXJnLCB2b2lkICoqcCwgY29uc3QgY2hhciAqKmVycm1zZykKIHsKICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IFB5X1RZUEUoYXJnKS0+dHBfYXNfYnVmZmVyOwogICAgIFB5X3NzaXplX3QgY291bnQ7CkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1nZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjaGFyICoqZXJybXNnKQorZ2V0YnVmZmVyKFB5T2JqZWN0ICphcmcsIFB5X2J1ZmZlciAqdmlldywgY29uc3QgY2hhciAqKmVycm1zZykKIHsKICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgdmlldywgUHlCVUZfU0lNUExFKSAhPSAwKSB7CiAgICAgICAgICplcnJtc2cgPSAiYnl0ZXMtbGlrZSBvYmplY3QiOwpAQCAtMTYyOSw3ICsxNjI5LDcgQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CkBAIC0xNzIyLDcgKzE3MjIsNyBAQAogCiAgICAgY2FzZSAnKCc6ICAgICAgICAgICAvKiBieXBhc3MgdHVwbGUsIG5vdCBoYW5kbGVkIGF0IGFsbCBwcmV2aW91c2x5ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICBpZiAoKmZvcm1hdD09JyknKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL1B5dGhvbi9ncmFtaW5pdC5jIGIvUHl0aG9uL2dyYW1pbml0LmMKaW5kZXggODIxMmIyYS4uMzU0ZGMxMiAxMDA2NDQKLS0tIGEvUHl0aG9uL2dyYW1pbml0LmMKKysrIGIvUHl0aG9uL2dyYW1pbml0LmMKQEAgLTIwNCwxMSArMjA0LDEzIEBACiAgICAgezMyLCA3fSwKICAgICB7MCwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfN1syXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzdbM10gPSB7CiAgICAgezMwLCAxMn0sCiAgICAgezM0LCAzfSwKKyAgICB7MCwgN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfOFsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzhbMl0gPSB7CisgICAgezMyLCAxM30sCiAgICAgezAsIDh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzlbMl0gPSB7CkBAIC0yMjEsMzUgKzIyMywzOSBAQAogICAgIHswLCAxMH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTFbM10gPSB7Ci0gICAgezMwLCAxM30sCi0gICAgezMyLCAxNH0sCisgICAgezMwLCAxNH0sCisgICAgezMyLCAxNX0sCiAgICAgezAsIDExfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xMlszXSA9IHsKICAgICB7MzIsIDd9LAotICAgIHszMSwgMTV9LAorICAgIHszMSwgMTZ9LAogICAgIHswLCAxMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTNbMl0gPSB7Ci0gICAgezMyLCAxNH0sCitzdGF0aWMgYXJjIGFyY3NfOV8xM1sxXSA9IHsKICAgICB7MCwgMTN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzE0WzJdID0gewotICAgIHszMCwgMTZ9LAotICAgIHszNCwgM30sCisgICAgezMyLCAxNX0sCisgICAgezAsIDE0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzE1WzNdID0geworICAgIHszMCwgMTd9LAorICAgIHszNCwgM30sCisgICAgezAsIDE1fSwKK307CitzdGF0aWMgYXJjIGFyY3NfOV8xNlsxXSA9IHsKICAgICB7MjYsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE2WzNdID0gewotICAgIHszMiwgMTR9LAotICAgIHszMSwgMTd9LAotICAgIHswLCAxNn0sCitzdGF0aWMgYXJjIGFyY3NfOV8xN1szXSA9IHsKKyAgICB7MzIsIDE1fSwKKyAgICB7MzEsIDE4fSwKKyAgICB7MCwgMTd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE3WzFdID0gewotICAgIHsyNiwgMTN9LAorc3RhdGljIGFyYyBhcmNzXzlfMThbMV0gPSB7CisgICAgezI2LCAxNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc185WzE4XSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfOVsxOV0gPSB7CiAgICAgezMsIGFyY3NfOV8wfSwKICAgICB7MywgYXJjc185XzF9LAogICAgIHszLCBhcmNzXzlfMn0sCkBAIC0yNTcsMTcgKzI2MywxOCBAQAogICAgIHsxLCBhcmNzXzlfNH0sCiAgICAgezQsIGFyY3NfOV81fSwKICAgICB7MiwgYXJjc185XzZ9LAotICAgIHsyLCBhcmNzXzlfN30sCi0gICAgezEsIGFyY3NfOV84fSwKKyAgICB7MywgYXJjc185Xzd9LAorICAgIHsyLCBhcmNzXzlfOH0sCiAgICAgezIsIGFyY3NfOV85fSwKICAgICB7MywgYXJjc185XzEwfSwKICAgICB7MywgYXJjc185XzExfSwKICAgICB7MywgYXJjc185XzEyfSwKLSAgICB7MiwgYXJjc185XzEzfSwKKyAgICB7MSwgYXJjc185XzEzfSwKICAgICB7MiwgYXJjc185XzE0fSwKLSAgICB7MSwgYXJjc185XzE1fSwKLSAgICB7MywgYXJjc185XzE2fSwKLSAgICB7MSwgYXJjc185XzE3fSwKKyAgICB7MywgYXJjc185XzE1fSwKKyAgICB7MSwgYXJjc185XzE2fSwKKyAgICB7MywgYXJjc185XzE3fSwKKyAgICB7MSwgYXJjc185XzE4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTBfMFsxXSA9IHsKICAgICB7MjMsIDF9LApAQCAtMzE5LDExICszMjYsMTMgQEAKICAgICB7MzIsIDd9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfN1syXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV83WzNdID0gewogICAgIHszNiwgMTJ9LAogICAgIHszNCwgM30sCisgICAgezAsIDd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV84WzFdID0geworc3RhdGljIGFyYyBhcmNzXzExXzhbMl0gPSB7CisgICAgezMyLCAxM30sCiAgICAgezAsIDh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV85WzJdID0gewpAQCAtMzM2LDM1ICszNDUsMzkgQEAKICAgICB7MCwgMTB9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV8xMVszXSA9IHsKLSAgICB7MzYsIDEzfSwKLSAgICB7MzIsIDE0fSwKKyAgICB7MzYsIDE0fSwKKyAgICB7MzIsIDE1fSwKICAgICB7MCwgMTF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV8xMlszXSA9IHsKICAgICB7MzIsIDd9LAotICAgIHszMSwgMTV9LAorICAgIHszMSwgMTZ9LAogICAgIHswLCAxMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzEzWzJdID0gewotICAgIHszMiwgMTR9LAorc3RhdGljIGFyYyBhcmNzXzExXzEzWzFdID0gewogICAgIHswLCAxM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzE0WzJdID0gewotICAgIHszNiwgMTZ9LAotICAgIHszNCwgM30sCisgICAgezMyLCAxNX0sCisgICAgezAsIDE0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTVbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfMTVbM10gPSB7CisgICAgezM2LCAxN30sCisgICAgezM0LCAzfSwKKyAgICB7MCwgMTV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18xMV8xNlsxXSA9IHsKICAgICB7MjYsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xNlszXSA9IHsKLSAgICB7MzIsIDE0fSwKLSAgICB7MzEsIDE3fSwKLSAgICB7MCwgMTZ9LAorc3RhdGljIGFyYyBhcmNzXzExXzE3WzNdID0geworICAgIHszMiwgMTV9LAorICAgIHszMSwgMTh9LAorICAgIHswLCAxN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE3WzFdID0gewotICAgIHsyNiwgMTN9LAorc3RhdGljIGFyYyBhcmNzXzExXzE4WzFdID0geworICAgIHsyNiwgMTR9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMTFbMThdID0geworc3RhdGljIHN0YXRlIHN0YXRlc18xMVsxOV0gPSB7CiAgICAgezMsIGFyY3NfMTFfMH0sCiAgICAgezMsIGFyY3NfMTFfMX0sCiAgICAgezMsIGFyY3NfMTFfMn0sCkBAIC0zNzIsMTcgKzM4NSwxOCBAQAogICAgIHsxLCBhcmNzXzExXzR9LAogICAgIHs0LCBhcmNzXzExXzV9LAogICAgIHsyLCBhcmNzXzExXzZ9LAotICAgIHsyLCBhcmNzXzExXzd9LAotICAgIHsxLCBhcmNzXzExXzh9LAorICAgIHszLCBhcmNzXzExXzd9LAorICAgIHsyLCBhcmNzXzExXzh9LAogICAgIHsyLCBhcmNzXzExXzl9LAogICAgIHszLCBhcmNzXzExXzEwfSwKICAgICB7MywgYXJjc18xMV8xMX0sCiAgICAgezMsIGFyY3NfMTFfMTJ9LAotICAgIHsyLCBhcmNzXzExXzEzfSwKKyAgICB7MSwgYXJjc18xMV8xM30sCiAgICAgezIsIGFyY3NfMTFfMTR9LAotICAgIHsxLCBhcmNzXzExXzE1fSwKLSAgICB7MywgYXJjc18xMV8xNn0sCi0gICAgezEsIGFyY3NfMTFfMTd9LAorICAgIHszLCBhcmNzXzExXzE1fSwKKyAgICB7MSwgYXJjc18xMV8xNn0sCisgICAgezMsIGFyY3NfMTFfMTd9LAorICAgIHsxLCBhcmNzXzExXzE4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTJfMFsxXSA9IHsKICAgICB7MjMsIDF9LApAQCAtMTg3OSwxMSArMTg5MywxMSBAQAogICAgICAiXDAwMFwwMDBcMTAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjQsICJwYXJhbWV0ZXJzIiwgMCwgNCwgc3RhdGVzXzgsCiAgICAgICJcMDAwXDA0MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI2NSwgInR5cGVkYXJnc2xpc3QiLCAwLCAxOCwgc3RhdGVzXzksCisgICAgezI2NSwgInR5cGVkYXJnc2xpc3QiLCAwLCAxOSwgc3RhdGVzXzksCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2NiwgInRmcGRlZiIsIDAsIDQsIHN0YXRlc18xMCwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MjY3LCAidmFyYXJnc2xpc3QiLCAwLCAxOCwgc3RhdGVzXzExLAorICAgIHsyNjcsICJ2YXJhcmdzbGlzdCIsIDAsIDE5LCBzdGF0ZXNfMTEsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2OCwgInZmcGRlZiIsIDAsIDIsIHN0YXRlc18xMiwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCBlZGYwMzBkLi44ZDdiZmU5IDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAogCiAvKiBMaXN0IG9mIG5hbWVzIHRvIGNsZWFyIGluIHN5cyAqLwotc3RhdGljIGNoYXIqIHN5c19kZWxldGVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c19kZWxldGVzW10gPSB7CiAgICAgInBhdGgiLCAiYXJndiIsICJwczEiLCAicHMyIiwKICAgICAibGFzdF90eXBlIiwgImxhc3RfdmFsdWUiLCAibGFzdF90cmFjZWJhY2siLAogICAgICJwYXRoX2hvb2tzIiwgInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCAibWV0YV9wYXRoIiwKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgIE5VTEwKIH07CiAKLXN0YXRpYyBjaGFyKiBzeXNfZmlsZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2ZpbGVzW10gPSB7CiAgICAgInN0ZGluIiwgIl9fc3RkaW5fXyIsCiAgICAgInN0ZG91dCIsICJfX3N0ZG91dF9fIiwKICAgICAic3RkZXJyIiwgIl9fc3RkZXJyX18iLApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CiAgICAgUHlPYmplY3QgKndlYWtsaXN0ID0gTlVMTDsKLSAgICBjaGFyICoqcDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKnA7CiAKICAgICBpZiAobW9kdWxlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm47IC8qIEFscmVhZHkgZG9uZSAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGRsLmMgYi9QeXRob24vaW1wb3J0ZGwuYwppbmRleCAxYWE1ODVkLi5hYzAzMjg5IDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0ZGwuYworKysgYi9QeXRob24vaW1wb3J0ZGwuYwpAQCAtMjMsOCArMjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCk7CiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IGNoYXIgKmFzY2lpX29ubHlfcHJlZml4ID0gIlB5SW5pdCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqbm9uYXNjaWlfcHJlZml4ID0gIlB5SW5pdFUiOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhc2NpaV9vbmx5X3ByZWZpeCA9ICJQeUluaXQiOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub25hc2NpaV9wcmVmaXggPSAiUHlJbml0VSI7CiAKIC8qIEdldCB0aGUgdmFyaWFibGUgcGFydCBvZiBhIG1vZHVsZSdzIGV4cG9ydCBzeW1ib2wgbmFtZS4KICAqIFJldHVybnMgYSBieXRlcyBpbnN0YW5jZS4gRm9yIG5vbi1BU0NJSS1uYW1lZCBtb2R1bGVzLCB0aGUgbmFtZSBpcwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCmluZGV4IGIyMGNlMTcuLjU4MjhjZWIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAorKysgYi9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKQEAgLTEsOCArMSw4IEBACiAvKiBBdXRvLWdlbmVyYXRlZCBieSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIF9QeV9NX19pbXBvcnRsaWJfZXh0ZXJuYWxbXSA9IHsKICAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw3LDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwyMjgsMiwwLDAsMTAwLDAsMCw5MCwwLDAsCi0gICAgMTAwLDk2LDAsOTAsMSwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLAorICAgIDAsNjQsMCwwLDAsMTE1LDIxMCwyLDAsMCwxMDAsMCwwLDkwLDAsMCwKKyAgICAxMDAsOTIsMCw5MCwxLDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCiAgICAgMiwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDMsMCwxMDAsOCwKICAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDEwLDAsMTAwLDExLDAsCiAgICAgMTMyLDAsMCw5MCw1LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsMCw5MCwKQEAgLTIwLDU2MyArMjAsNTQxIEBACiAgICAgMSwxLDkwLDI2LDAsMTAwLDM3LDAsMTAwLDM4LDAsMTMyLDAsMCw5MCwyNywKICAgICAwLDEwMCwzOSwwLDEwMCw0MCwwLDEzMiwwLDAsOTAsMjgsMCwxMDAsNDEsMCwKICAgICAxMDAsNDIsMCwxMzIsMCwwLDkwLDI5LDAsMTAwLDQzLDAsMTAwLDQ0LDAsMTMyLAotICAgIDAsMCw5MCwzMCwwLDEwMCw0NSwwLDEwMCw0NiwwLDEwMCw0NywwLDEwMCw0OCwKLSAgICAwLDEzMiwwLDEsOTAsMzEsMCwxMDAsNDksMCwxMDAsNTAsMCwxMzIsMCwwLAotICAgIDkwLDMyLDAsMTAwLDUxLDAsMTAwLDUyLDAsMTMyLDAsMCw5MCwzMywwLDEwMCwKLSAgICAzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCw1MywwLDEwMCw1NCwwLDEzMiwzLAotICAgIDAsOTAsMzQsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsNTUsMCwKLSAgICAxMDAsNTYsMCwxMzIsMywwLDkwLDM1LDAsMTAwLDU3LDAsMTAwLDU3LDAsMTAwLAotICAgIDU4LDAsMTAwLDU5LDAsMTMyLDIsMCw5MCwzNiwwLDEwMCw2MCwwLDEwMCw2MSwKLSAgICAwLDEzMiwwLDAsOTAsMzcsMCwxMDEsMzgsMCwxMzEsMCwwLDkwLDM5LDAsCi0gICAgMTAwLDMzLDAsMTAwLDYyLDAsMTAwLDMzLDAsMTAwLDYzLDAsMTAxLDM5LDAsMTAwLAotICAgIDY0LDAsMTAwLDY1LDAsMTMyLDEsMiw5MCw0MCwwLDcxLDEwMCw2NiwwLDEwMCwKLSAgICA2NywwLDEzMiwwLDAsMTAwLDY3LDAsMTMxLDIsMCw5MCw0MSwwLDcxLDEwMCwKLSAgICA2OCwwLDEwMCw2OSwwLDEzMiwwLDAsMTAwLDY5LDAsMTMxLDIsMCw5MCw0MiwKLSAgICAwLDcxLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwwLDAsMTAwLDcxLDAsMTAxLDQyLAotICAgIDAsMTMxLDMsMCw5MCw0MywwLDcxLDEwMCw3MiwwLDEwMCw3MywwLDEzMiwwLAotICAgIDAsMTAwLDczLDAsMTMxLDIsMCw5MCw0NCwwLDcxLDEwMCw3NCwwLDEwMCw3NSwKLSAgICAwLDEzMiwwLDAsMTAwLDc1LDAsMTAxLDQ0LDAsMTAxLDQzLDAsMTMxLDQsMCwKLSAgICA5MCw0NSwwLDcxLDEwMCw3NiwwLDEwMCw3NywwLDEzMiwwLDAsMTAwLDc3LDAsCi0gICAgMTAxLDQ0LDAsMTAxLDQyLDAsMTMxLDQsMCw5MCw0NiwwLDEwMywwLDAsOTAsCi0gICAgNDcsMCw3MSwxMDAsNzgsMCwxMDAsNzksMCwxMzIsMCwwLDEwMCw3OSwwLDEwMSwKLSAgICA0NCwwLDEwMSw0MiwwLDEzMSw0LDAsOTAsNDgsMCw3MSwxMDAsODAsMCwxMDAsCi0gICAgODEsMCwxMzIsMCwwLDEwMCw4MSwwLDEzMSwyLDAsOTAsNDksMCw3MSwxMDAsCi0gICAgODIsMCwxMDAsODMsMCwxMzIsMCwwLDEwMCw4MywwLDEzMSwyLDAsOTAsNTAsCi0gICAgMCw3MSwxMDAsODQsMCwxMDAsODUsMCwxMzIsMCwwLDEwMCw4NSwwLDEzMSwyLAotICAgIDAsOTAsNTEsMCw3MSwxMDAsODYsMCwxMDAsODcsMCwxMzIsMCwwLDEwMCw4NywKLSAgICAwLDEzMSwyLDAsOTAsNTIsMCwxMDAsMzMsMCwxMDAsODgsMCwxMDAsODksMCwKLSAgICAxMzIsMSwwLDkwLDUzLDAsMTAwLDkwLDAsMTAwLDkxLDAsMTMyLDAsMCw5MCwKLSAgICA1NCwwLDEwMCw5MiwwLDEwMCw5MywwLDEzMiwwLDAsOTAsNTUsMCwxMDAsOTQsCi0gICAgMCwxMDAsOTUsMCwxMzIsMCwwLDkwLDU2LDAsMTAwLDMzLDAsODMsNDEsOTcsCi0gICAgOTcsOTQsMSwwLDAsNjcsMTExLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTAsMTAsCi0gICAgODQsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw3OCwKLSAgICA3OSw4NCwzMiwxMDksMTAxLDk3LDExMCwxMTYsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLAotICAgIDEwNSwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsCi0gICAgMzMsMzIsNzMsMTE2LDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTAwLDEwMSwKLSAgICAxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTUsMTE3LDk5LDEwNCwxMCwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiwxMDUsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LAotICAgIDExNiwxMTQsOTcsMTEyLDExMiwxMDEsMTAwLDMyLDEwNSwxMTAsMTE2LDExMSwzMiw4MCwxMjEsMTE2LAotICAgIDEwNCwxMTEsMTEwLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLAotICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiw0NiwzMiw2NSwxMTUsMTAsMTE1LDExNyw5OSwxMDQsMzIsMTA1LDExNiwzMiwKLSAgICAxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTA2LAotICAgIDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLAotICAgIDEwNSw5OSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NywKLSAgICAxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsCi0gICAgMTAxLDExNCwzMiwxMTYsMTExLDEwLDExOSwxMTEsMTE0LDEwNyw0NiwzMiw3OSwxMTAsMTAxLDMyLAotICAgIDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDExNywxMTUsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTcsOTgsMTA4LAotICAgIDEwNSw5OSw0NSwxMDIsOTcsOTksMTA1LDExMCwxMDMsMzIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsCi0gICAgMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDQ2LDEwLDEwLDIxOCwzLDExOSwxMDUsMTEwLDIxOCw2LDk5LDEyMSwxMDMsMTE5LDEwNSwxMTAsCi0gICAgMjE4LDYsMTAwLDk3LDExNCwxMTksMTA1LDExMCw5OSwwLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw0OSwwLAotICAgIDAsMCwxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMTYsMywwLDEzMSwxLAotICAgIDAsMTE0LDMzLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsMTI1LDAsMCwKLSAgICAxMTAsMTIsMCwxMDAsMywwLDEwMCwyLDAsMTMyLDAsMCwxMjUsMCwwLDEyNCwKLSAgICAwLDAsODMsNDEsNCw3OCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDgzLDAsMCwwLDExNSwxMywwLDAsMCwKLSAgICAxMDAsMSwwLDExNiwwLDAsMTA2LDEsMCwxMDcsNiwwLDgzLDQxLDIsMTIyLAotICAgIDUzLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksCi0gICAgMTAxLDExNSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDk5LDEwNCwxMDEsOTksMTA3LAotICAgIDEwMSwxMDAsMzIsOTksOTcsMTE1LDEwMSw0NSwxMDUsMTEwLDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LAotICAgIDEwNSwxMTgsMTAxLDEwOCwxMjEsNDYsMTE1LDEyLDAsMCwwLDgwLDg5LDg0LDcyLDc5LAotICAgIDc4LDY3LDY1LDgzLDY5LDc5LDc1LDQxLDIsMjE4LDMsOTUsMTExLDExNSw5MCw3LAotICAgIDEwMSwxMTAsMTE4LDEwNSwxMTQsMTExLDExMCwxNjksMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwyNTAsMzgsNjAsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywKLSAgICAxMTIsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDYyLDIxOCwxMSw5NSwxMTQsMTAxLAotICAgIDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSwzMCwwLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDIsMTIyLDM3LDk1LDEwOSw5NywxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCwKLSAgICA5NSw5OSw5NywxMTUsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwKLSAgICAxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDgzLDAsMCwwLDExNSwKLSAgICA0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsNTMsODQsMTE0LDExNywxMDEsCi0gICAgMzIsMTA1LDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsCi0gICAgMTE1LDExNiwzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywKLSAgICAxMTUsMTAxLDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSwKLSAgICA0Niw3MCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAzNCwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsNDEsNCwyMTgsMywxMTUsCi0gICAgMTIxLDExNSwyMTgsOCwxMTIsMTA4LDk3LDExNiwxMDIsMTExLDExNCwxMDksMjE4LDEwLDExNSwxMTYsCi0gICAgOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCwyNyw5NSw2Nyw2NSw4Myw2OSw5NSwKLSAgICA3Myw3OCw4Myw2OSw3OCw4Myw3Myw4NCw3Myw4Niw2OSw5NSw4MCw3Niw2NSw4NCwKLSAgICA3MCw3OSw4Miw3Nyw4Myw0MSwxLDExNCw2LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNiw5NSwxMDksOTcsCi0gICAgMTA3LDEwMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSwyOCwwLDAsCi0gICAgMCwxMTUsOCwwLDAsMCwwLDEsMTgsMSwxNSw0LDEyLDMsMTE0LDExLAorICAgIDAsMCw5MCwzMCwwLDEwMCw0NSwwLDEwMCw0NiwwLDEzMiwwLDAsOTAsMzEsCisgICAgMCwxMDAsNDcsMCwxMDAsNDgsMCwxMzIsMCwwLDkwLDMyLDAsMTAwLDMzLDAsCisgICAgMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDQ5LDAsMTAwLDUwLDAsMTMyLDMsMCw5MCwKKyAgICAzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCw1MSwwLDEwMCw1MiwKKyAgICAwLDEzMiwzLDAsOTAsMzQsMCwxMDAsNTMsMCwxMDAsNTMsMCwxMDAsNTQsMCwKKyAgICAxMDAsNTUsMCwxMzIsMiwwLDkwLDM1LDAsMTAwLDU2LDAsMTAwLDU3LDAsMTMyLAorICAgIDAsMCw5MCwzNiwwLDEwMSwzNywwLDEzMSwwLDAsOTAsMzgsMCwxMDAsMzMsCisgICAgMCwxMDAsNTgsMCwxMDAsMzMsMCwxMDAsNTksMCwxMDEsMzgsMCwxMDAsNjAsMCwKKyAgICAxMDAsNjEsMCwxMzIsMSwyLDkwLDM5LDAsNzEsMTAwLDYyLDAsMTAwLDYzLDAsCisgICAgMTMyLDAsMCwxMDAsNjMsMCwxMzEsMiwwLDkwLDQwLDAsNzEsMTAwLDY0LDAsCisgICAgMTAwLDY1LDAsMTMyLDAsMCwxMDAsNjUsMCwxMzEsMiwwLDkwLDQxLDAsNzEsCisgICAgMTAwLDY2LDAsMTAwLDY3LDAsMTMyLDAsMCwxMDAsNjcsMCwxMDEsNDEsMCwxMzEsCisgICAgMywwLDkwLDQyLDAsNzEsMTAwLDY4LDAsMTAwLDY5LDAsMTMyLDAsMCwxMDAsCisgICAgNjksMCwxMzEsMiwwLDkwLDQzLDAsNzEsMTAwLDcwLDAsMTAwLDcxLDAsMTMyLAorICAgIDAsMCwxMDAsNzEsMCwxMDEsNDMsMCwxMDEsNDIsMCwxMzEsNCwwLDkwLDQ0LAorICAgIDAsNzEsMTAwLDcyLDAsMTAwLDczLDAsMTMyLDAsMCwxMDAsNzMsMCwxMDEsNDMsCisgICAgMCwxMDEsNDEsMCwxMzEsNCwwLDkwLDQ1LDAsMTAzLDAsMCw5MCw0NiwwLAorICAgIDcxLDEwMCw3NCwwLDEwMCw3NSwwLDEzMiwwLDAsMTAwLDc1LDAsMTAxLDQzLDAsCisgICAgMTAxLDQxLDAsMTMxLDQsMCw5MCw0NywwLDcxLDEwMCw3NiwwLDEwMCw3NywwLAorICAgIDEzMiwwLDAsMTAwLDc3LDAsMTMxLDIsMCw5MCw0OCwwLDcxLDEwMCw3OCwwLAorICAgIDEwMCw3OSwwLDEzMiwwLDAsMTAwLDc5LDAsMTMxLDIsMCw5MCw0OSwwLDcxLAorICAgIDEwMCw4MCwwLDEwMCw4MSwwLDEzMiwwLDAsMTAwLDgxLDAsMTMxLDIsMCw5MCwKKyAgICA1MCwwLDcxLDEwMCw4MiwwLDEwMCw4MywwLDEzMiwwLDAsMTAwLDgzLDAsMTMxLAorICAgIDIsMCw5MCw1MSwwLDEwMCwzMywwLDEwMCw4NCwwLDEwMCw4NSwwLDEzMiwxLAorICAgIDAsOTAsNTIsMCwxMDAsODYsMCwxMDAsODcsMCwxMzIsMCwwLDkwLDUzLDAsCisgICAgMTAwLDg4LDAsMTAwLDg5LDAsMTMyLDAsMCw5MCw1NCwwLDEwMCw5MCwwLDEwMCwKKyAgICA5MSwwLDEzMiwwLDAsOTAsNTUsMCwxMDAsMzMsMCw4Myw0MSw5Myw5Nyw5NCwKKyAgICAxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLAorICAgIDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCwKKyAgICA5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsCisgICAgMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LAorICAgIDMyLDEwOSwxMDEsOTcsMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwKKyAgICAxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiwKKyAgICA3MywxMTYsMzIsMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsCisgICAgMTAzLDExMCwxMDEsMTAwLDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwKKyAgICAxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCwKKyAgICA5NywxMTIsMTEyLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwKKyAgICAxMTAsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwKKyAgICAxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDQ2LDMyLDY1LDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsCisgICAgMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsCisgICAgMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LAorICAgIDMyLDExNiwxMTEsMTAsMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwKKyAgICAxMTEsMTE3LDEwOCwxMDAsMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LAorICAgIDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LAorICAgIDQ1LDEwMiw5Nyw5OSwxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsCisgICAgMTExLDEwMiwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsCisgICAgMTAsMjE4LDMsMTE5LDEwNSwxMTAsMjE4LDYsOTksMTIxLDEwMywxMTksMTA1LDExMCwyMTgsNiwKKyAgICAxMDAsOTcsMTE0LDExOSwxMDUsMTEwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDQ5LDAsMCwwLAorICAgIDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDExNiwzLDAsMTMxLDEsMCwxMTQsCisgICAgMzMsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjUsMCwwLDExMCwxMiwKKyAgICAwLDEwMCwzLDAsMTAwLDIsMCwxMzIsMCwwLDEyNSwwLDAsMTI0LDAsMCwKKyAgICA4Myw0MSw0LDc4LDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsODMsMCwwLDAsMTE1LDEzLDAsMCwwLDEwMCwxLAorICAgIDAsMTE2LDAsMCwxMDYsMSwwLDEwNyw2LDAsODMsNDEsMiwxMjIsNTMsODQsCisgICAgMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LAorICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwKKyAgICAzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwKKyAgICAxMDEsMTA4LDEyMSw0NiwxMTUsMTIsMCwwLDAsODAsODksODQsNzIsNzksNzgsNjcsCisgICAgNjUsODMsNjksNzksNzUsNDEsMiwyMTgsMyw5NSwxMTEsMTE1LDkwLDcsMTAxLDExMCwKKyAgICAxMTgsMTA1LDExNCwxMTEsMTEwLDE2OSwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDI1MCwzOCw2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDgsMTA1LDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwKKyAgICAxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsNjIsMjE4LDExLDk1LDExNCwxMDEsMTA4LDk3LAorICAgIDEyMCw5NSw5OSw5NywxMTUsMTAxLDMwLDAsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMiwxMjIsMzcsOTUsMTA5LDk3LDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LAorICAgIDk3LDExNSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsCisgICAgMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDk5LDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDEsMCwwLDAsODMsMCwwLDAsMTE1LDQsMCwKKyAgICAwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsCisgICAgMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LAorICAgIDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsCisgICAgNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDcwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCw2LDAsMCwwLDM0LDAsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMiw0MSw0LDIxOCwzLDExNSwxMjEsMTE1LAorICAgIDIxOCw4LDExMiwxMDgsOTcsMTE2LDEwMiwxMTEsMTE0LDEwOSwyMTgsMTAsMTE1LDExNiw5NywxMTQsCisgICAgMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDI3LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LAorICAgIDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LAorICAgIDgyLDc3LDgzLDQxLDEsMTE0LDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDEwOSw5NywxMDcsMTAxLAorICAgIDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDI4LDAsMCwwLDExNSwKKyAgICA4LDAsMCwwLDAsMSwxOCwxLDE1LDQsMTIsMywxMTQsMTEsMCwwLAorICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LDAsMCwxMjQsMCwKKyAgICAwLDEzMSwxLDAsMTAwLDEsMCw2NCwxMDYsMSwwLDEwMCwyLDAsMTAwLDMsCisgICAgMCwxMzEsMiwwLDgzLDQxLDQsMTIyLDQyLDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LAorICAgIDMyLDk3LDMyLDUxLDUwLDQ1LDk4LDEwNSwxMTYsMzIsMTA1LDExMCwxMTYsMTAxLDEwMywxMDEsCisgICAgMTE0LDMyLDExNiwxMTEsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsNDUsMTAxLDExMCwxMDAsMTA1LAorICAgIDk3LDExMCw0NiwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwxMjcsMywwLDIzMyw0LAorICAgIDAsMCwwLDIxOCw2LDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLDQxLDIsMjE4LDMsMTA1LAorICAgIDExMCwxMTYsMjE4LDgsMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMSwyMTgsMSwKKyAgICAxMjAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0MCwwLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDIsMTE0LDE3LDAsMCwwLDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LAorICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLAorICAgIDIsMCw4Myw0MSwyLDEyMiw0Nyw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw1MiwKKyAgICAzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSwKKyAgICA0NSwxMDEsMTEwLDEwMCwxMDUsOTcsMTEwLDMyLDExNiwxMTEsMzIsOTcsMTEwLDMyLDEwNSwxMTAsCisgICAgMTE2LDEwMSwxMDMsMTAxLDExNCw0NiwxMTQsMTMsMCwwLDAsNDEsMiwxMTQsMTQsMCwKKyAgICAwLDAsMjE4LDEwLDEwMiwxMTQsMTExLDEwOSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMSwKKyAgICA5MCw5LDEwNSwxMTAsMTE2LDk1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNyw5NSwxMTQsOTUsMTA4LAorICAgIDExMSwxMTAsMTAzLDQ1LDAsMCwwLDExNSwyLDAsMCwwLDAsMiwxMTQsMTksCisgICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisgICAgMywwLDAsMCw3MSwwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LDAsMCwKKyAgICAxMDYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwwLDAsNjgsCisgICAgMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDMsMTIyLDMxLDgyLDEwMSwxMTIsMTA4LDk3LAorICAgIDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsCisgICAgMTE2LDEwNCw0NiwxMDYsMTExLDEwNSwxMTAsNDAsNDEsNDYsOTksMSwwLDAsMCwwLAorICAgIDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw4MywwLDAsMCwxMTUsCisgICAgMzcsMCwwLDAsMTAzLDAsMCwxMjQsMCwwLDkzLDI3LDAsMTI1LDEsMCwKKyAgICAxMjQsMSwwLDExNCw2LDAsMTI0LDEsMCwxMDYsMCwwLDExNiwxLDAsMTMxLAorICAgIDEsMCwxNDUsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwwLDAsNDEsMiwKKyAgICAyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LAorICAgIDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LDQ4LDIxOCwKKyAgICA0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsCisgICAgNTIsMCwwLDAsMTE1LDIsMCwwLDAsOSwxLDEyMiwzMCw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAorICAgIDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCw4LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwxLDIxOCwKKyAgICAxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1MCwwLDAsMCwxMTUsNCwwLDAsMCwwLAorICAgIDIsMTUsMSwxMTQsMjgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMTM0LDAsCisgICAgMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwwLDEwMCwxLDAsMTA3LDIsCisgICAgMCwxMTQsNTIsMCwxMjQsMCwwLDEwNiwyLDAsMTE2LDMsMCwxMzEsMSwwLAorICAgIDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwwLDEyNCwKKyAgICAzLDAsMTAyLDIsMCw4MywxMjAsNjksMCwxMTYsNCwwLDEyNCwwLDAsMTMxLAorICAgIDEsMCw2OCw5Myw1NSwwLDEyNSw0LDAsMTI0LDQsMCwxMTYsMSwwLDEwNywKKyAgICA2LDAsMTE0LDY1LDAsMTI0LDAsMCwxMDYsNSwwLDEyNCw0LDAsMTAwLDIsCisgICAgMCwxMDAsMSwwLDEzMSwxLDEsOTIsMiwwLDEyNSwxLDAsMTI1LDMsMCwKKyAgICAxMjQsMSwwLDEyNCwzLDAsMTAyLDIsMCw4MywxMTMsNjUsMCw4NywxMDAsMywKKyAgICAwLDEyNCwwLDAsMTAyLDIsMCw4Myw0MSw0LDEyMiwzMiw4MiwxMDEsMTEyLDEwOCwKKyAgICA5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLAorICAgIDk3LDExNiwxMDQsNDYsMTE1LDExMiwxMDgsMTA1LDExNiw0MCw0MSw0NiwyMzMsMSwwLDAsCisgICAgMCw5MCw4LDEwOSw5NywxMjAsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMCw0MSw2LDIxOCwKKyAgICAzLDEwOCwxMDEsMTEwLDExNCwyMSwwLDAsMCwyMTgsMTAsMTE0LDExMiw5NywxMTQsMTE2LAorICAgIDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI1LDAsMCwwLDIxOCw4LDExNCwxMDEsMTE4LDEwMSwKKyAgICAxMTQsMTE1LDEwMSwxMDAsMjE4LDYsMTE0LDExNSwxMTIsMTA4LDEwNSwxMTYsNDEsNSwyMTgsNCwKKyAgICAxMTIsOTcsMTE2LDEwNCw5MCw1LDEwMiwxMTQsMTExLDExMCwxMTYsMjE4LDEsOTUsMjE4LDQsCisgICAgMTE2LDk3LDEwNSwxMDgsMTE0LDE2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMTUsMTEyLDEwOCwxMDUsMTE2LDU2LDAsMCwwLDExNSwxNiwwLDAsMCwwLDIsCisgICAgMTgsMSwyNCwxLDEwLDEsMTksMSwxMiwxLDI3LDEsMTQsMSwxMTQsMzgsCiAgICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTAwLDEsMCw2NCwxMDYsMSwwLDEwMCwyLDAsCi0gICAgMTAwLDMsMCwxMzEsMiwwLDgzLDQxLDQsMTIyLDQyLDY3LDExMSwxMTAsMTE4LDEwMSwKLSAgICAxMTQsMTE2LDMyLDk3LDMyLDUxLDUwLDQ1LDk4LDEwNSwxMTYsMzIsMTA1LDExMCwxMTYsMTAxLAotICAgIDEwMywxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsNDUsMTAxLDExMCwKLSAgICAxMDAsMTA1LDk3LDExMCw0NiwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwxMjcsMywwLAotICAgIDIzMyw0LDAsMCwwLDIxOCw2LDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLDQxLDIsMjE4LAotICAgIDMsMTA1LDExMCwxMTYsMjE4LDgsMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMSwKLSAgICAyMTgsMSwxMjAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0MCwwLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDIsMTE0LDE3LDAsMCwwLDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEwMCwxLAotICAgIDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw0Nyw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwKLSAgICAzMiw1MiwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMDgsMTA1LDExNiwxMTYsCi0gICAgMTA4LDEwMSw0NSwxMDEsMTEwLDEwMCwxMDUsOTcsMTEwLDMyLDExNiwxMTEsMzIsOTcsMTEwLDMyLAotICAgIDEwNSwxMTAsMTE2LDEwMSwxMDMsMTAxLDExNCw0NiwxMTQsMTMsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTQsMCwwLDAsMjE4LDEwLDEwMiwxMTQsMTExLDEwOSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsCi0gICAgNDEsMSw5MCw5LDEwNSwxMTAsMTE2LDk1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNyw5NSwxMTQsCi0gICAgOTUsMTA4LDExMSwxMTAsMTAzLDQ1LDAsMCwwLDExNSwyLDAsMCwwLDAsMiwKLSAgICAxMTQsMTksMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMywwLDAsMCw3MSwwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwwLAotICAgIDAsNjgsMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDMsMTIyLDMxLDgyLDEwMSwxMTIsCisgICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsMTE2LDAsMCwKKyAgICAxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCw4Myw0MSwxLDEyMiwxMjYsODMsMTE2LAorICAgIDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLDk3LDMyLDExNSwxMDEsMTEyLDk3LDExNCw5NywxMTYsCisgICAgMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDEwOSw5NywKKyAgICAxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLDk3LDExNSwxMDUsMTAxLDExNCwzMiwxMTYsMTExLDMyLAorICAgIDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LDExMCwzMiwxMDEsMTIwLDExMiwxMDEsCisgICAgMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LDEwLDMyLDMyLDMyLDMyLDQwLDEwMSw0NiwxMDMsCisgICAgNDYsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMTUsMTE2LDk3LDExNiwzMiwxMTQsMTAxLDExNSwKKyAgICAxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNDEsMiwxMTQsMywKKyAgICAwLDAsMCw5MCw0LDExNSwxMTYsOTcsMTE2LDQxLDEsMTE0LDM1LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwKKyAgICAxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiw2OCwwLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDcsMTE0LDM5LDAsMCwwLDk5LDIsMCwwLDAsCisgICAgMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw1OCwwLDAsMCwxMjEsMTYsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsCisgICAgMCwxMjUsMiwwLDg3LDExMCwyMiwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsCisgICAgNDAsMCwxLDEsMSwxMDAsMSwwLDgzLDg5LDExMCwxLDAsODgsMTI0LDIsCisgICAgMCwxMDYsMiwwLDEwMCwyLDAsNjQsMTI0LDEsMCwxMDcsMiwwLDgzLDQxLAorICAgIDMsMTIyLDQ5LDg0LDEwMSwxMTUsMTE2LDMyLDExOSwxMDQsMTAxLDExNiwxMDQsMTAxLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTAxLDMyLDExNiwKKyAgICAxMjEsMTEyLDEwMSw0Niw3MCwxMDUsMCwyNDAsMCwwLDQxLDMsMTE0LDM5LDAsMCwKKyAgICAwLDIxOCw3LDc5LDgzLDY5LDExNCwxMTQsMTExLDExNCwyMTgsNywxMTUsMTE2LDk1LDEwOSwKKyAgICAxMTEsMTAwLDEwMSw0MSwzLDExNCwzNSwwLDAsMCwyMTgsNCwxMDksMTExLDEwMCwxMDEsCisgICAgOTAsOSwxMTUsMTE2LDk3LDExNiw5NSwxMDUsMTEwLDEwMiwxMTEsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE4LDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwNSwxMTUsOTUsMTA5LDExMSwxMDAsMTAxLDk1LDExNiwxMjEsMTEyLDEwMSw3OCwwLAorICAgIDAsMCwxMTUsMTAsMCwwLDAsMCwyLDMsMSwxNiwxLDEzLDEsOSwKKyAgICAxLDExNCw0MywwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwKKyAgICAxMTYsMCwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLDIsMTIyLAorICAgIDMxLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsCisgICAgMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMiwxMDUsMTA4LDEwMSw0NiwKKyAgICAxMDUsMCwxMjgsMCwwLDQxLDEsMTE0LDQzLDAsMCwwLDQxLDEsMTE0LDM1LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCisgICAgMCwwLDIxOCwxMiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMiwxMDUsMTA4LDEwMSwKKyAgICA4NywwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDQ0LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDMxLDAsMCwwLDEyNCwwLDAsMTE1LDE4LDAsCisgICAgMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDAsMCwxMTYsMiwwLDEyNCwKKyAgICAwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLDIsMTIyLDMwLDgyLDEwMSwxMTIsCiAgICAgMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMDYsMTExLDEwNSwxMTAsNDAsNDEsNDYsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw4MywwLDAsCi0gICAgMCwxMTUsMzcsMCwwLDAsMTAzLDAsMCwxMjQsMCwwLDkzLDI3LDAsMTI1LAotICAgIDEsMCwxMjQsMSwwLDExNCw2LDAsMTI0LDEsMCwxMDYsMCwwLDExNiwxLAotICAgIDAsMTMxLDEsMCwxNDUsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwwLDAsCi0gICAgNDEsMiwyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsCi0gICAgOTUsMTE1LDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LAotICAgIDQ4LDIxOCw0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwKLSAgICAxMTIsNjIsNTIsMCwwLDAsMTE1LDIsMCwwLDAsOSwxLDEyMiwzMCw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsCi0gICAgMTE1LDYyLDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCwKLSAgICA4LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwKLSAgICAxLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1MCwwLDAsMCwxMTUsNCwwLDAsCi0gICAgMCwwLDIsMTUsMSwxMTQsMjgsMCwwLDAsOTksMSwwLDAsMCwwLAotICAgIDAsMCwwLDUsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMTM0LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDIsMCwxMTQsNTIsMCwxMjQsMCwwLDEwNiwyLDAsMTE2LDMsMCwxMzEsCi0gICAgMSwwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTAyLDIsMCw4MywxMjAsNjksMCwxMTYsNCwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCw2OCw5Myw1NSwwLDEyNSw0LDAsMTI0LDQsMCwxMTYsMSwKLSAgICAwLDEwNyw2LDAsMTE0LDY1LDAsMTI0LDAsMCwxMDYsNSwwLDEyNCw0LDAsCi0gICAgMTAwLDIsMCwxMDAsMSwwLDEzMSwxLDEsOTIsMiwwLDEyNSwxLDAsMTI1LAotICAgIDMsMCwxMjQsMSwwLDEyNCwzLDAsMTAyLDIsMCw4MywxMTMsNjUsMCw4NywKLSAgICAxMDAsMywwLDEyNCwwLDAsMTAyLDIsMCw4Myw0MSw0LDEyMiwzMiw4MiwxMDEsCi0gICAgMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsCi0gICAgNDYsMTEyLDk3LDExNiwxMDQsNDYsMTE1LDExMiwxMDgsMTA1LDExNiw0MCw0MSw0NiwyMzMsMSwKLSAgICAwLDAsMCw5MCw4LDEwOSw5NywxMjAsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMCw0MSwKLSAgICA2LDIxOCwzLDEwOCwxMDEsMTEwLDExNCwyMSwwLDAsMCwyMTgsMTAsMTE0LDExMiw5NywKLSAgICAxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI1LDAsMCwwLDIxOCw4LDExNCwxMDEsCi0gICAgMTE4LDEwMSwxMTQsMTE1LDEwMSwxMDAsMjE4LDYsMTE0LDExNSwxMTIsMTA4LDEwNSwxMTYsNDEsNSwKLSAgICAyMTgsNCwxMTIsOTcsMTE2LDEwNCw5MCw1LDEwMiwxMTQsMTExLDExMCwxMTYsMjE4LDEsOTUsCi0gICAgMjE4LDQsMTE2LDk3LDEwNSwxMDgsMTE0LDE2LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAwLDEwNSwxMTQsNDYsMTA1LDAsNjQsMCwwLAorICAgIDQxLDMsMTE0LDMsMCwwLDAsMjE4LDYsMTAzLDEwMSwxMTYsOTksMTE5LDEwMCwxMTQsCisgICAgNDMsMCwwLDAsNDEsMSwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsCiAgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDk1LDExNSwxMTIsMTA4LDEwNSwxMTYsNTYsMCwwLDAsMTE1LDE2LDAsMCwwLAotICAgIDAsMiwxOCwxLDI0LDEsMTAsMSwxOSwxLDEyLDEsMjcsMSwxNCwxLAotICAgIDExNCwzOCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMTYsCi0gICAgMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDgzLDQxLDEsMTIyLDEyNiwKLSAgICA4MywxMTYsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ2LDEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDc3LDk3LDEwMCwxMDEsMzIsOTcsMzIsMTE1LDEwMSwxMTIsOTcsMTE0LAotICAgIDk3LDExNiwxMDEsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsCi0gICAgMTA5LDk3LDEwNywxMDEsMzIsMTA1LDExNiwzMiwxMDEsOTcsMTE1LDEwNSwxMDEsMTE0LDMyLDExNiwKLSAgICAxMTEsMzIsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMDUsMTEwLDMyLDEwMSwxMjAsCi0gICAgMTEyLDEwMSwxMTQsMTA1LDEwOSwxMDEsMTEwLDExNiwxMTUsMTAsMzIsMzIsMzIsMzIsNDAsMTAxLAotICAgIDQ2LDEwMyw0NiwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDExNSwxMTYsOTcsMTE2LDMyLDExNCwKLSAgICAxMDEsMTE1LDExNywxMDgsMTE2LDExNSw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw0MSwyLAotICAgIDExNCwzLDAsMCwwLDkwLDQsMTE1LDExNiw5NywxMTYsNDEsMSwxMTQsMzUsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAotICAgIDAsMjE4LDEwLDk1LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDY4LDAsMCwKLSAgICAwLDExNSwyLDAsMCwwLDAsNywxMTQsMzksMCwwLDAsOTksMiwwLAotICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDU4LDAsMCwwLDEyMSwxNiwwLDExNiwwLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDEyNSwyLDAsODcsMTEwLDIyLDAsNCwxMTYsMSwwLDEwNywxMCwKLSAgICAwLDExNCw0MCwwLDEsMSwxLDEwMCwxLDAsODMsODksMTEwLDEsMCw4OCwKLSAgICAxMjQsMiwwLDEwNiwyLDAsMTAwLDIsMCw2NCwxMjQsMSwwLDEwNywyLDAsCi0gICAgODMsNDEsMywxMjIsNDksODQsMTAxLDExNSwxMTYsMzIsMTE5LDEwNCwxMDEsMTE2LDEwNCwxMDEsCi0gICAgMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMDEsCi0gICAgMzIsMTE2LDEyMSwxMTIsMTAxLDQ2LDcwLDEwNSwwLDI0MCwwLDAsNDEsMywxMTQsMzksCi0gICAgMCwwLDAsMjE4LDcsNzksODMsNjksMTE0LDExNCwxMTEsMTE0LDIxOCw3LDExNSwxMTYsCi0gICAgOTUsMTA5LDExMSwxMDAsMTAxLDQxLDMsMTE0LDM1LDAsMCwwLDIxOCw0LDEwOSwxMTEsCi0gICAgMTAwLDEwMSw5MCw5LDExNSwxMTYsOTcsMTE2LDk1LDEwNSwxMTAsMTAyLDExMSwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTgsOTUsMTEyLAotICAgIDk3LDExNiwxMDQsOTUsMTA1LDExNSw5NSwxMDksMTExLDEwMCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLAotICAgIDc4LDAsMCwwLDExNSwxMCwwLDAsMCwwLDIsMywxLDE2LDEsMTMsCi0gICAgMSw5LDEsMTE0LDQzLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwyLDAsODMsNDEsCi0gICAgMiwxMjIsMzEsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsCi0gICAgMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDQ2LDEwNSwwLDEyOCwwLDAsNDEsMSwxMTQsNDMsMCwwLDAsNDEsMSwKLSAgICAxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDEyLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMTUsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDg3LDAsMCwwLDExNSwyLDAsMCwwLDAsMiwxMTQsNDQsMCwKLSAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMzEsMCwwLDAsMTI0LDAsMCwxMTUsCi0gICAgMTgsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMCwwLDExNiwyLAotICAgIDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwyLDAsODMsNDEsMiwxMjIsMzAsODIsCi0gICAgMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsCi0gICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAwLDEwNSwxMTQsNDYsMTA1LDAsNjQsCi0gICAgMCwwLDQxLDMsMTE0LDMsMCwwLDAsMjE4LDYsMTAzLDEwMSwxMTYsOTksMTE5LAotICAgIDEwMCwxMTQsNDMsMCwwLDAsNDEsMSwxMTQsMzUsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNSwxMTUsMTAwLDEwNSwxMTQsOTIsMCwwLDAsMTE1LDYsMCwKLSAgICAwLDAsMCwyLDYsMSwxMiwxLDExNCw0NiwwLDAsMCwxMDUsMTgyLDEsCi0gICAgMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDE3LAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxOTMsMCwwLDAsMTAwLDEsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTE2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsCi0gICAgMCwxMjUsMywwLDExNiwyLDAsMTA2LDMsMCwxMjQsMywwLDExNiwyLDAsCi0gICAgMTA2LDQsMCwxMTYsMiwwLDEwNiw1LDAsNjYsMTE2LDIsMCwxMDYsNiwwLAotICAgIDY2LDEyNCwyLDAsMTAwLDIsMCw2NCwxMzEsMywwLDEyNSw0LDAsMTIxLDYxLAotICAgIDAsMTE2LDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLDMsMCwxMzEsMiwwLAotICAgIDE0MywyMCwwLDEyNSw1LDAsMTI0LDUsMCwxMDYsOSwwLDEyNCwxLDAsMTMxLAotICAgIDEsMCwxLDg3LDEwMCw0LDAsODEsODIsODgsMTE2LDIsMCwxMDYsMTAsMCwKLSAgICAxMjQsMywwLDEyNCwwLDAsMTMxLDIsMCwxLDg3LDExMCw1OSwwLDQsMTE2LAotICAgIDExLDAsMTA3LDEwLDAsMTE0LDE4OCwwLDEsMSwxLDEyMSwxNywwLDExNiwyLAotICAgIDAsMTA2LDEyLDAsMTI0LDMsMCwxMzEsMSwwLDEsODcsMTEwLDE4LDAsNCwKLSAgICAxMTYsMTEsMCwxMDcsMTAsMCwxMTQsMTgwLDAsMSwxLDEsODksMTEwLDEsMCwKLSAgICA4OCwxMzAsMCwwLDg5LDExMCwxLDAsODgsMTAwLDQsMCw4Myw0MSw1LDEyMiwKLSAgICAxNjIsNjYsMTAxLDExNSwxMTYsNDUsMTAxLDEwMiwxMDIsMTExLDExNCwxMTYsMzIsMTAyLDExNywxMTAsCi0gICAgOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwzMiwxMDAsCi0gICAgOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE2LAotICAgIDExMSwxMDksMTA1LDk5LDk3LDEwOCwxMDgsMTIxLDQ2LDEwLDMyLDMyLDMyLDMyLDY2LDEwMSwKLSAgICAzMiwxMTIsMTE0LDEwMSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDQsOTcsMTEwLAotICAgIDEwMCwxMDgsMTAxLDMyLDk3LDMyLDcwLDEwNSwxMDgsMTAxLDY5LDEyMCwxMDUsMTE1LDExNiwxMTUsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMDIsMzIsOTksMTExLDExMCw5OSwxMTcsMTE0LDExNCwKLSAgICAxMDEsMTEwLDExNiwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTAxLDEwOSwxMTIsMTExLDExNCw5NywxMTQsMTIxLAotICAgIDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LAotICAgIDEwMSwxMDAsNDYsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDEwNSwxODIsMSwwLDAsOTAsCi0gICAgMiwxMTksOTgsNzgsNDEsMTMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwyMTgsMiwKLSAgICAxMDUsMTAwLDExNCwzLDAsMCwwLDkwLDQsMTExLDExMiwxMDEsMTEwLDkwLDYsNzksCi0gICAgOTUsNjksODgsNjcsNzYsOTAsNyw3OSw5NSw2Nyw4Miw2OSw2NSw4NCw5MCw4LAotICAgIDc5LDk1LDg3LDgyLDc5LDc4LDc2LDg5LDIxOCwzLDk1LDEwNSwxMTEsMjE4LDYsNzAsCi0gICAgMTA1LDEwOCwxMDEsNzMsNzksMjE4LDUsMTE5LDExNCwxMDUsMTE2LDEwMSwyMTgsNywxMTQsMTAxLAotICAgIDExMiwxMDgsOTcsOTksMTAxLDExNCw0MCwwLDAsMCw5MCw2LDExNywxMTAsMTA4LDEwNSwKLSAgICAxMTAsMTA3LDQxLDYsMTE0LDM1LDAsMCwwLDIxOCw0LDEwMCw5NywxMTYsOTcsMTE0LAotICAgIDQyLDAsMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsOTUsMTE2LDEwOSwxMTIsOTAsMiwKLSAgICAxMDIsMTAwLDIxOCw0LDEwMiwxMDUsMTA4LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsOTUsMTE5LDExNCwxMDUsMTE2LDEwMSw5NSwKLSAgICA5NywxMTYsMTExLDEwOSwxMDUsOTksOTksMCwwLDAsMTE1LDI2LDAsMCwwLDAsCi0gICAgNSwyNCwxLDksMSwzMywxLDMsMywyMSwxLDIwLDEsMjAsMSwxMywKLSAgICAxLDMsMSwxNywxLDEzLDEsNSwxLDExNCw1NSwwLDAsMCwxMDUsMjIsCi0gICAgMTMsMCwwLDIzMywyLDAsMCwwLDExNCwxMywwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsCi0gICAgOTUsMTIyLDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwxMjIsNCw0NiwxMTIsCi0gICAgMTIxLDk5LDc4LDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDk5LDIsMCwwLDAsMSwwLDAsMCwxMSwwLDAsMCw2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw4NywxLDAsMCwxMjQsMSwwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsNzYsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDIsMCwKLSAgICAxMTYsMiwwLDEzMSwyLDAsMSwxMjQsMiwwLDEwMCwxLDAsMTA3LDksMCwKLSAgICAxMTQsNTgsMCwxMDAsMywwLDEyNSwzLDAsMTE2LDMsMCwxMjQsMywwLDEzMSwKLSAgICAxLDAsMTMwLDEsMCwxMjQsMSwwLDExNCw3MCwwLDEwMCw0LDAsMTEwLDMsCi0gICAgMCwxMDAsNSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMCwwLDEzMSwxLDAsCi0gICAgOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMjQsNSwwLDEwNiw1LDAsMTAwLAotICAgIDYsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNiwwLDEyNSw3LDAsMTI1LDgsCi0gICAgMCwxMTYsNiwwLDEwNiw3LDAsMTA2LDgsMCwxMjUsOSwwLDEyNCw5LDAsCi0gICAgMTAwLDEsMCwxMDcsOCwwLDExNCwxNTQsMCwxMTYsOSwwLDEwMCw3LDAsMTMxLAotICAgIDEsMCwxMzAsMSwwLDEwMCw0LDAsMTA2LDEwLDAsMTI0LDYsMCwxMTQsMTcyLAotICAgIDAsMTI0LDYsMCwxMTAsMywwLDEyNCw4LDAsMTI0LDcsMCwxMjQsOSwwLAotICAgIDEwMywzLDAsMTMxLDEsMCwxMjUsMTAsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LAotICAgIDgsMCwxMTQsMjQxLDAsMTE2LDYsMCwxMDYsMTEsMCwxMDYsMTIsMCwxMDAsOCwKLSAgICAwLDEwNywyLDAsMTE0LDIyOSwwLDEwMCw0LDAsMTI1LDIsMCwxMTAsMTIsMCwKLSAgICAxMTYsNiwwLDEwNiwxMSwwLDEwNiwxMiwwLDEyNSwyLDAsMTE2LDEzLDAsMTI0LAotICAgIDIsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsNCwwLDEwNywzLAotICAgIDAsMTE0LDYzLDEsMTI0LDIsMCwxMDYsMTQsMCwxMzEsMCwwLDExNSw0MiwxLAotICAgIDExNiwxNSwwLDEwMCw5LDAsMTA2LDE2LDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsMTMwLDEsMCwxMDAsMTAsMCwxMDYsMTYsMCwxMjQsMTAsMCwxMTYsMTcsCi0gICAgMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDEwLDAsMTE2LDE4LDAsMTI0LDQsMCwKLSAgICAxMTYsMTksMCwxMjQsMTAsMCwxMTYsMjAsMCwxMDAsOCwwLDI1LDIzLDEzMSwzLAotICAgIDAsODMsNDEsMTEsOTcsMjU0LDIsMCwwLDcxLDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDQ2LDExMiwxMjEsCi0gICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLAotICAgIDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LAotICAgIDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsCi0gICAgMTEwLDExMSwxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LAotICAgIDExNiw1OSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LAotICAgIDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsNDYsMTEyLDEyMSw5OSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsCi0gICAgOTcsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LAotICAgIDEwOCwxMDEsMzIsMTE5LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwxMTEsMTEyLDExNiwxMDUsCi0gICAgMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwKLSAgICAxMTYsMTAxLDExNCwzMiw5OSwxMTEsMTEwLDExNiwxMTQsMTExLDEwOCwxMTUsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTEyLDExNCwxMDEsMTE1LDExNywxMDksMTAxLDEwMCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwKLSAgICAxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTExLDEwMiwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICAzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsNzMsMTAyLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwKLSAgICA3OCwxMTEsMTEwLDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywKLSAgICAzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5NywxMTQsMTAzLDExNywxMDksCi0gICAgMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTYsOTcsMTA3LDEwMSwxMTAsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLAotICAgIDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDQwLDEwMSwxMDgsCi0gICAgMTE1LDEwMSwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLAotICAgIDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLAotICAgIDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiw3MywKLSAgICAxMDIsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsCi0gICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSw0NCwxMCwzMiwzMiwKLSAgICAzMiwzMiw5NywzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LAotICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsOTcsMTA5LDEwMSwzMiw5NywxMTUsMzIsMTE1LDEwMSwKLSAgICAxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDEsMTA5LDExMiwxMTYsCi0gICAgMTIxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLDMyLDExOSwxMDQsMTA1LAotICAgIDEwOCwxMDEsMzIsOTcsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLDExMCwxMTYsMzIsMTE2LAotICAgIDExMSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwKLSAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLDM5LDQ5LDM5LDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwKLSAgICAxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LAotICAgIDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsCi0gICAgMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDcwLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsCi0gICAgOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsCi0gICAgOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksCi0gICAgOTcsMTE2LDEwMSwxMDAsNTksMzIsMTE3LDExNSwxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwKLSAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwKLSAgICAxMjIsNTAsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsCi0gICAgMzIsMTExLDExNCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiwKLSAgICA3OCwxMTEsMTEwLDEwMSwxMTQsMzAsMCwwLDAsMTE0LDI5LDAsMCwwLDIxOCwxLAotICAgIDQ2LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwKLSAgICA5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLAotICAgIDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMjMzLDAsMCwwLDAsMTIyLDI0LDEyMywzMywKLSAgICAxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTA4LDExMiwxMDQsOTcsMTEwLAotICAgIDExNywxMDksMTAxLDExNCwxMDUsOTksMTIyLDcsMTIzLDEyNSw0NiwxMjMsMTI1LDEyMywxMjUsNDEsCi0gICAgMjEsMjE4LDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDIxOCw0LDExOSw5NywKLSAgICAxMTQsMTEwLDIxOCwxOCw2OCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDg3LAotICAgIDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMjE4LDksODQsMTIxLDExMiwxMDEsNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDExNCwzOCwwLDAsMCwxMTQsMzIsMCwwLDAsMTE0LDcsMCwwLDAsCi0gICAgMjE4LDE0LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwKLSAgICAyMTgsOSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMjE4LDE5LDc4LDExMSwxMTYsCi0gICAgNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwKLSAgICAxMTQsMjYsMCwwLDAsMjE4LDUsMTAyLDEwOCw5NywxMDMsMTE1LDIxOCw4LDExMSwxMTIsCi0gICAgMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LDcsMTA1LDExNSw5NywKLSAgICAxMDgsMTEwLDExNywxMDksMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwKLSAgICAxMTQsNDcsMCwwLDAsMjE4LDQsOTUsNzksODAsODQsMTE0LDI4LDAsMCwwLAotICAgIDIxOCw4LDk1LDgwLDg5LDY3LDY1LDY3LDcyLDY5LDIxOCwxNyw2Niw4OSw4NCw2OSwKLSAgICA2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwxMSwxMTQsCi0gICAgMzUsMCwwLDAsOTAsMTQsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwKLSAgICAxMTQsMTA1LDEwMCwxMDEsMTE0LDU3LDAsMCwwLDIxOCw3LDEwOSwxMDEsMTE1LDExNSw5NywKLSAgICAxMDMsMTAxLDIxOCw0LDEwNCwxMDEsOTcsMTAwLDExNCwzNywwLDAsMCw5MCw0LDk4LAotICAgIDk3LDExNSwxMDEsMjE4LDMsMTE1LDEwMSwxMTIsMjE4LDQsMTE0LDEwMSwxMTUsMTE2LDkwLDMsCi0gICAgMTE2LDk3LDEwMyw5MCwxNSw5NywxMDgsMTA5LDExMSwxMTUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwKLSAgICAxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwyMTgsMTcsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyNDMsMCwwLDAsMTE1LDQ2LDAsMCwwLDAsCi0gICAgMTgsMTIsMSw5LDEsNywxLDEyLDEsNiwxLDEyLDEsMTgsMSwxOCwKLSAgICAxLDI0LDEsMTIsMSwxMiwxLDEyLDEsMzYsMSwxMiwxLDE4LDEsOSwKLSAgICAyLDEyLDEsMTIsMSwxMiwxLDEyLDEsMjEsMSwyMSwxLDExNCw3OSwwLAotICAgIDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCw1LAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw2MiwxLDAsMCwxMTYsMCwwLDEwNiwKLSAgICAxLDAsMTA2LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDMwLDAsMTE2LDMsCi0gICAgMCwxMDAsMiwwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCw5MiwyLDAsMTI1LDEsMCwxMjUsMiwwLDExNiw0LDAsMTI0LAotICAgIDEsMCwxMzEsMSwwLDkyLDIsMCwxMjUsMSwwLDEyNSwzLDAsMTI0LDMsCi0gICAgMCwxMTYsNSwwLDEwNywzLDAsMTE0LDEwMiwwLDExNiw2LDAsMTAwLDMsMCwKLSAgICAxMDYsNywwLDExNiw1LDAsMTI0LDAsMCwxMzEsMiwwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMjQsMiwwLDEwNiw4LDAsMTAwLDQsMCwxMzEsMSwwLDEyNSw0LAotICAgIDAsMTI0LDQsMCwxMDAsMTEsMCwxMDcsNywwLDExNCwxNTMsMCwxMTYsNiwwLAotICAgIDEwMCw3LDAsMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsCi0gICAgMSwwLDExMCwxMjUsMCwxMjQsNCwwLDEwMCw2LDAsMTA3LDIsMCwxMTQsMjIsCi0gICAgMSwxMjQsMiwwLDEwNiw5LDAsMTAwLDQsMCwxMDAsNSwwLDEzMSwyLDAsCi0gICAgMTAwLDEyLDAsMjUsMTI1LDUsMCwxMjQsNSwwLDEwNiwxMCwwLDExNiwxMSwwLAotICAgIDEzMSwxLDAsMTE1LDIyMywwLDExNiw2LDAsMTAwLDgsMCwxMDYsNywwLDExNiwKLSAgICAxMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCw1LDAsMTE2LDEyLAotICAgIDAsMTE2LDExLDAsMTMxLDEsMCwxMDAsMSwwLDEzMywyLDAsMjUsMTI1LDYsCi0gICAgMCwxMjQsNiwwLDEwNiwxMywwLDEzMSwwLDAsMTE1LDIyLDEsMTE2LDYsMCwKLSAgICAxMDAsOSwwLDEwNiw3LDAsMTI0LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMjQsMiwwLDEwNiwxNCwwLDEwMCw0LDAsMTMxLDEsMCwxMDAsMTAsCi0gICAgMCwyNSwxMjUsNywwLDExNiwxNSwwLDEyNCwxLDAsMTI0LDcsMCwxMTYsMTYsCi0gICAgMCwxMDAsMTAsMCwyNSwyMywxMzEsMiwwLDgzLDQxLDEzLDk3LDExMCwxLDAsCi0gICAgMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsCi0gICAgMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDk5LDQ2LDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKLSAgICAzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSw5OSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsCi0gICAgMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsCi0gICAgMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LAotICAgIDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTksMTExLDExNCwxMTQsCi0gICAgMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsCi0gICAgMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiwzMiw3MywxMDIsMzIsMTEyLDk3LDExNiwKLSAgICAxMDQsMzIsMTAwLDExMSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMCwxMTEsMTE2LDMyLDk5LAotICAgIDExMSwxMTAsMTAyLDExMSwxMTQsMTA5LDMyLDExNiwxMTEsMzIsODAsNjksODAsMzIsNTEsNDksCi0gICAgNTIsNTUsNDcsNTIsNTYsNTYsMzIsMTAyLDExMSwxMTQsMTA5LDk3LDExNiw0NCwzMiw4NiwKLSAgICA5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk4LAotICAgIDEwMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDMyLDczLDEwMiwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsCisgICAgMTA0LDk1LDEwNSwxMTUsMTAwLDEwNSwxMTQsOTIsMCwwLDAsMTE1LDYsMCwwLDAsCisgICAgMCwyLDYsMSwxMiwxLDExNCw0NiwwLDAsMCwxMDUsMTgyLDEsMCwwLAorICAgIDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDE3LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxOTMsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLAorICAgIDEyNCwwLDAsMTE2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsMCwxMjUsCisgICAgMywwLDExNiwyLDAsMTA2LDMsMCwxMjQsMywwLDExNiwyLDAsMTA2LDQsCisgICAgMCwxMTYsMiwwLDEwNiw1LDAsNjYsMTE2LDIsMCwxMDYsNiwwLDY2LDEyNCwKKyAgICAyLDAsMTAwLDIsMCw2NCwxMzEsMywwLDEyNSw0LDAsMTIxLDYxLDAsMTE2LAorICAgIDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLDMsMCwxMzEsMiwwLDE0MywyMCwKKyAgICAwLDEyNSw1LDAsMTI0LDUsMCwxMDYsOSwwLDEyNCwxLDAsMTMxLDEsMCwKKyAgICAxLDg3LDEwMCw0LDAsODEsODIsODgsMTE2LDIsMCwxMDYsMTAsMCwxMjQsMywKKyAgICAwLDEyNCwwLDAsMTMxLDIsMCwxLDg3LDExMCw1OSwwLDQsMTE2LDExLDAsCisgICAgMTA3LDEwLDAsMTE0LDE4OCwwLDEsMSwxLDEyMSwxNywwLDExNiwyLDAsMTA2LAorICAgIDEyLDAsMTI0LDMsMCwxMzEsMSwwLDEsODcsMTEwLDE4LDAsNCwxMTYsMTEsCisgICAgMCwxMDcsMTAsMCwxMTQsMTgwLDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMzAsCisgICAgMCwwLDg5LDExMCwxLDAsODgsMTAwLDQsMCw4Myw0MSw1LDEyMiwxNjIsNjYsCisgICAgMTAxLDExNSwxMTYsNDUsMTAxLDEwMiwxMDIsMTExLDExNCwxMTYsMzIsMTAyLDExNywxMTAsOTksMTE2LAorICAgIDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwzMiwxMDAsOTcsMTE2LAorICAgIDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE2LDExMSwxMDksCisgICAgMTA1LDk5LDk3LDEwOCwxMDgsMTIxLDQ2LDEwLDMyLDMyLDMyLDMyLDY2LDEwMSwzMiwxMTIsCisgICAgMTE0LDEwMSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsCisgICAgMTAxLDMyLDk3LDMyLDcwLDEwNSwxMDgsMTAxLDY5LDEyMCwxMDUsMTE1LDExNiwxMTUsNjksMTE0LAorICAgIDExNCwxMTEsMTE0LDMyLDEwNSwxMDIsMzIsOTksMTExLDExMCw5OSwxMTcsMTE0LDExNCwxMDEsMTEwLAorICAgIDExNiwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMTYsMTAxLDEwOSwxMTIsMTExLDExNCw5NywxMTQsMTIxLDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LDEwMSwxMDAsCisgICAgNDYsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDEwNSwxODIsMSwwLDAsOTAsMiwxMTksCisgICAgOTgsNzgsNDEsMTMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwyMTgsMiwxMDUsMTAwLAorICAgIDExNCwzLDAsMCwwLDkwLDQsMTExLDExMiwxMDEsMTEwLDkwLDYsNzksOTUsNjksCisgICAgODgsNjcsNzYsOTAsNyw3OSw5NSw2Nyw4Miw2OSw2NSw4NCw5MCw4LDc5LDk1LAorICAgIDg3LDgyLDc5LDc4LDc2LDg5LDIxOCwzLDk1LDEwNSwxMTEsMjE4LDYsNzAsMTA1LDEwOCwKKyAgICAxMDEsNzMsNzksMjE4LDUsMTE5LDExNCwxMDUsMTE2LDEwMSwyMTgsNywxMTQsMTAxLDExMiwxMDgsCisgICAgOTcsOTksMTAxLDExNCw0MCwwLDAsMCw5MCw2LDExNywxMTAsMTA4LDEwNSwxMTAsMTA3LAorICAgIDQxLDYsMTE0LDM1LDAsMCwwLDIxOCw0LDEwMCw5NywxMTYsOTcsMTE0LDQyLDAsCisgICAgMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsOTUsMTE2LDEwOSwxMTIsOTAsMiwxMDIsMTAwLAorICAgIDIxOCw0LDEwMiwxMDUsMTA4LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNSwwLDAsMCwyMTgsMTMsOTUsMTE5LDExNCwxMDUsMTE2LDEwMSw5NSw5NywxMTYsCisgICAgMTExLDEwOSwxMDUsOTksOTksMCwwLDAsMTE1LDI2LDAsMCwwLDAsNSwyNCwKKyAgICAxLDksMSwzMywxLDMsMywyMSwxLDIwLDEsMjAsMSwxMywxLDMsCisgICAgMSwxNywxLDEzLDEsNSwxLDExNCw1NSwwLDAsMCwxMDUsMzIsMTMsMCwKKyAgICAwLDIzMywyLDAsMCwwLDExNCwxMywwLDAsMCwxMTUsMiwwLDAsMCwKKyAgICAxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsOTUsMTIyLAorICAgIDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwxMjIsNCw0NiwxMTIsMTIxLDk5LAorICAgIDc4LDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDk5LAorICAgIDIsMCwwLDAsMSwwLDAsMCwxMSwwLDAsMCw2LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw4NywxLDAsMCwxMjQsMSwwLDEwMCwxLDAsMTA3LAorICAgIDksMCwxMTQsNzYsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDIsMCwxMTYsMiwKKyAgICAwLDEzMSwyLDAsMSwxMjQsMiwwLDEwMCwxLDAsMTA3LDksMCwxMTQsNTgsCisgICAgMCwxMDAsMywwLDEyNSwzLDAsMTE2LDMsMCwxMjQsMywwLDEzMSwxLDAsCisgICAgMTMwLDEsMCwxMjQsMSwwLDExNCw3MCwwLDEwMCw0LDAsMTEwLDMsMCwxMDAsCisgICAgNSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMCwwLDEzMSwxLDAsOTIsMiwKKyAgICAwLDEyNSw0LDAsMTI1LDUsMCwxMjQsNSwwLDEwNiw1LDAsMTAwLDYsMCwKKyAgICAxMzEsMSwwLDkyLDMsMCwxMjUsNiwwLDEyNSw3LDAsMTI1LDgsMCwxMTYsCisgICAgNiwwLDEwNiw3LDAsMTA2LDgsMCwxMjUsOSwwLDEyNCw5LDAsMTAwLDEsCisgICAgMCwxMDcsOCwwLDExNCwxNTQsMCwxMTYsOSwwLDEwMCw3LDAsMTMxLDEsMCwKKyAgICAxMzAsMSwwLDEwMCw0LDAsMTA2LDEwLDAsMTI0LDYsMCwxMTQsMTcyLDAsMTI0LAorICAgIDYsMCwxMTAsMywwLDEyNCw4LDAsMTI0LDcsMCwxMjQsOSwwLDEwMywzLAorICAgIDAsMTMxLDEsMCwxMjUsMTAsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwKKyAgICAxMTQsMjQxLDAsMTE2LDYsMCwxMDYsMTEsMCwxMDYsMTIsMCwxMDAsOCwwLDEwNywKKyAgICAyLDAsMTE0LDIyOSwwLDEwMCw0LDAsMTI1LDIsMCwxMTAsMTIsMCwxMTYsNiwKKyAgICAwLDEwNiwxMSwwLDEwNiwxMiwwLDEyNSwyLDAsMTE2LDEzLDAsMTI0LDIsMCwKKyAgICAxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsNCwwLDEwNywzLDAsMTE0LAorICAgIDYzLDEsMTI0LDIsMCwxMDYsMTQsMCwxMzEsMCwwLDExNSw0MiwxLDExNiwxNSwKKyAgICAwLDEwMCw5LDAsMTA2LDE2LDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwxLDAsCisgICAgMTMwLDEsMCwxMDAsMTAsMCwxMDYsMTYsMCwxMjQsMTAsMCwxMTYsMTcsMCwxMjQsCisgICAgMiwwLDEzMSwzLDAsMTI1LDEwLDAsMTE2LDE4LDAsMTI0LDQsMCwxMTYsMTksCisgICAgMCwxMjQsMTAsMCwxMTYsMjAsMCwxMDAsOCwwLDI1LDIzLDEzMSwzLDAsODMsCisgICAgNDEsMTEsOTcsMjU0LDIsMCwwLDcxLDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDQ2LDExMiwxMjEsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLDEyMSw5OSwKKyAgICAzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICA0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwKKyAgICAxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwKKyAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsCisgICAgMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsCisgICAgMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsOTcsMTE1LAorICAgIDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsCisgICAgMzIsMTE5LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwKKyAgICAxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLAorICAgIDExNCwzMiw5OSwxMTEsMTEwLDExNiwxMTQsMTExLDEwOCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDExNCwxMDEsMTE1LDExNywxMDksMTAxLDEwMCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTExLDEwMiwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsNDYsMzIsNzMsMTAyLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsCisgICAgMTEwLDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTQsCisgICAgMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwKKyAgICAxMTYsMzIsMTA1LDExNSwzMiwxMTYsOTcsMTA3LDEwMSwxMTAsMzIsOTcsMTEwLDEwMCwzMiwxMTgsCisgICAgMTAxLDExNCwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDk3LDEwOCwKKyAgICAxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDQwLDEwMSwxMDgsMTE1LDEwMSwKKyAgICAzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTAsMzIsMzIsMzIsMzIsCisgICAgMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDg0LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsCisgICAgMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsCisgICAgMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiw3MywxMDIsMzIsCisgICAgMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LAorICAgIDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSw0NCwxMCwzMiwzMiwzMiwzMiwKKyAgICA5NywzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTUsOTcsMTA5LDEwMSwzMiw5NywxMTUsMzIsMTE1LDEwMSwxMTYsMTE2LAorICAgIDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwKKyAgICAxMTAsMzksMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDMyLAorICAgIDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsCisgICAgMzIsOTcsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwKKyAgICAxMTUsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLDExMCwxMTYsMzIsMTE2LDExMSwzMiwKKyAgICAxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLAorICAgIDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLDM5LDQ5LDM5LDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLAorICAgIDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwKKyAgICAxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLAorICAgIDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LAorICAgIDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDcwLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsOTgsMTE3LAorICAgIDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsOTcsMTA5LAorICAgIDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAorICAgIDEwMSwxMDAsNTksMzIsMTE3LDExNSwxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLAorICAgIDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwxMjIsNTAsCisgICAgMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTExLAorICAgIDExNCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOSwKKyAgICAxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiw3OCwxMTEsCisgICAgMTEwLDEwMSwxMTQsMzAsMCwwLDAsMTE0LDI5LDAsMCwwLDIxOCwxLDQ2LDEyMiwKKyAgICAzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsCiAgICAgMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsCi0gICAgMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LAotICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsCi0gICAgMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAotICAgIDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LAotICAgIDExNSwzMiw3OCwxMTEsMTEwLDEwMSwxMjIsMzcsMTIzLDEyNSwzMiwxMTAsMTExLDExNiwzMiw5OCwKLSAgICAxMTEsMTE2LDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTAwLDEwNSwxMTQsMTAxLAotICAgIDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDExNCw1OCwwLAotICAgIDAsMCwxMTQsNTYsMCwwLDAsMjMzLDMsMCwwLDAsMTIyLDMzLDEwMSwxMjAsCi0gICAgMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsNTAsMzIsMTExLDExNCwKLSAgICAzMiw1MSwzMiwxMDAsMTExLDExNiwxMTUsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsCi0gICAgNTcsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTIsMTExLAotICAgIDExNCwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwKLSAgICAxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTYsOTcsMTE0LDExNiwKLSAgICAzMiwxMTksMTA1LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDUyLDExMSwxMTIsMTE2LDEwNSwKLSAgICAxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDExMCwzMiw5NywxMDgsCi0gICAgMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwxMTgsOTcsMTA4LDExNywxMDEsCi0gICAgMTE0LDU5LDAsMCwwLDYyLDIsMCwwLDAsMTE0LDU2LDAsMCwwLDExNCwKLSAgICA4MCwwLDAsMCwyMzMsMjU0LDI1NSwyNTUsMjU1LDQxLDE3LDExNCw3LDAsMCwwLAotICAgIDExNCw2NCwwLDAsMCwxMTQsNjUsMCwwLDAsMTE0LDY2LDAsMCwwLDExNCwKLSAgICAzOCwwLDAsMCwxMTQsNzMsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCw0NywKLSAgICAwLDAsMCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDM0LDAsMCwwLDExNCwKLSAgICA5LDAsMCwwLDExNCw3MiwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDcwLAotICAgIDAsMCwwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI4LAotICAgIDAsMCwwLDIxOCwxNSw4Myw3OSw4NSw4Miw2Nyw2OSw5NSw4Myw4NSw3MCw3MCwKLSAgICA3Myw4OCw2OSw4Myw0MSw4LDExNCwzNSwwLDAsMCwxMTQsNzYsMCwwLDAsCi0gICAgOTAsMTYsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCi0gICAgMTA5LDEwMSw5MCw3LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5MCw5LDEwMCwxMTEsMTE2LAotICAgIDk1LDk5LDExMSwxMTcsMTEwLDExNiwxMTQsNTcsMCwwLDAsOTAsOSwxMTEsMTEyLDExNiwKLSAgICA5NSwxMDgsMTAxLDExOCwxMDEsMTA4LDkwLDEzLDk4LDk3LDExNSwxMDEsOTUsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCwxNywxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDEwMiwxMTQsMTExLAotICAgIDEwOSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDMxLDEsMCwwLDExNSw0NCwwLDAsMCwKLSAgICAwLDksMTgsMSwxMiwxLDE4LDEsMTgsMSwxMiwxLDksMSwxNSwxLAotICAgIDE1LDEsMTIsMSw5LDEsMTUsMSwxMiwxLDIyLDEsMTUsMSw5LDEsCi0gICAgMTIsMSwyMiwxLDEyLDEsOSwxLDEyLDEsMTksMSwxMTQsODUsMCwwLAotICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMTIsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDE2NCwwLDAsMCwxMTYsMCwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDIyLDAsMTAwLDIsMCwKLSAgICA4MywxMjQsMCwwLDEwNiwxLDAsMTAwLDMsMCwxMzEsMSwwLDkyLDMsMCwKLSAgICAxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwwLDEyLDExNSw4MSwwLAotICAgIDEyNCwzLDAsMTA2LDIsMCwxMzEsMCwwLDEwMCw3LDAsMTAwLDgsMCwxMzMsCi0gICAgMiwwLDI1LDEwMCw2LDAsMTA3LDMsMCwxMTQsODUsMCwxMjQsMCwwLDgzLAotICAgIDEyMSwxNiwwLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsODcsCi0gICAgMTEwLDQwLDAsNCwxMTYsNCwwLDExNiw1LDAsMTAyLDIsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTQzLDAsMSwxLDEsMTI0LDAsMCwxMDAsMiwwLDEwMCw5LDAsMTMzLAotICAgIDIsMCwyNSwxMjUsNCwwLDg5LDExMCwxLDAsODgsMTE2LDYsMCwxMjQsNCwKLSAgICAwLDEzMSwxLDAsMTE0LDE2MCwwLDEyNCw0LDAsODMsMTI0LDAsMCw4Myw0MSwKLSAgICAxMCwxMjIsMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDk4LDEyMSwxMTYsCi0gICAgMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKLSAgICAxMTYsMTExLDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsNDAsMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsNDEsNDYsMTAsCi0gICAgMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwKLSAgICAxMTEsMTEwLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsMTE0LDEwMSwxMDgsMTIxLAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCwxMTUsNDUsOTksCi0gICAgMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLDMyLDEwMiwxMTEsMTE0LAotICAgIDEwLDMyLDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDk1LDY5LDEyMCwKLSAgICAxMDEsOTksNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4NywxMDUsMTE2LDEwNCwKLSAgICA3MCwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsMTA1LDExMCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsCi0gICAgNTksMCwwLDAsNzgsMTE0LDU4LDAsMCwwLDExNCw4MCwwLDAsMCwxMTQsCi0gICAgMjksMCwwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwyNTUsMjMzLDI1NSwyNTUsCi0gICAgMjU1LDI1NSwxMTQsODcsMCwwLDAsNDEsNywxMTQsMzEsMCwwLDAsMTE0LDMyLAotICAgIDAsMCwwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg1LDAsMCwwLDExNCwKLSAgICA2NiwwLDAsMCwxMTQsNzEsMCwwLDAsMTE0LDQ0LDAsMCwwLDQxLDUsCi0gICAgMjE4LDEzLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMzYsMCwwLDAsOTAsOSwxMDEsMTIwLDExNiwxMDEsMTEwLAotICAgIDExNSwxMDUsMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTIsOTcsMTE2LAotICAgIDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKLSAgICAyMTgsMTUsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMDIsMTA1LDEwOCwKLSAgICAxMDEsNjQsMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywxOCwxLDQsMSwKLSAgICAyNCwxLDM1LDEsNCwxLDMsMSwxNiwxLDE5LDEsMjEsMSwxMTQsOTEsCi0gICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDkyLDAsMCwwLDEyNCwwLDAsCi0gICAgMTA2LDAsMCwxMTYsMSwwLDExNiwyLDAsMTMxLDEsMCwxMzEsMSwwLDExNCwKLSAgICA1OSwwLDEyMSwxNCwwLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDgzLDg3LAotICAgIDExMyw4OCwwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsNTUsMCwxLDEsMSwKLSAgICA4OSwxMTMsODgsMCw4OCwxMTAsMjksMCwxMjQsMCwwLDEwNiwwLDAsMTE2LDEsCi0gICAgMCwxMTYsNSwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsODQsMCwxMjQsMCwwLAotICAgIDgzLDEwMCwwLDAsODMsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDgsCi0gICAgMTAxLDExMCwxMDAsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNCwKLSAgICA4NCwwLDAsMCwxMTQsNzksMCwwLDAsMTE0LDY2LDAsMCwwLDExNCw3NCwKLSAgICAwLDAsMCw0MSwxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsCi0gICAgOTUsMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsODMsMSwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDAsMSwyMSwxLDMsMSwxNCwxLDEzLDEsOCwxLAotICAgIDIxLDEsNCwyLDExNCw5NSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNjAsCi0gICAgMCwwLDAsMTIxLDE5LDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMTA2LAotICAgIDEsMCwxMjUsMSwwLDg3LDExMCwyNCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwKLSAgICAxMTQsNDUsMCwxLDEsMSwxMDAsMSwwLDEyNSwxLDAsODksMTEwLDEsMCwKLSAgICA4OCwxMjQsMSwwLDEwMCwyLDAsNzksMTI1LDEsMCwxMjQsMSwwLDgzLDQxLAotICAgIDMsMTIyLDUxLDY3LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTAxLDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTExLDExMCwKLSAgICAxMTUsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsCi0gICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwNSwxODIsMSwwLDAsMjMzLDEyOCwwLDAsMCwKLSAgICA0MSwzLDExNCwzOSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQwLDAsMCwKLSAgICAwLDQxLDIsMTE0LDM1LDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTAsOTUsOTksCi0gICAgOTcsMTA4LDk5LDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwxLDAsMCwxMTUsMTIsMCwwLAotICAgIDAsMCwyLDMsMSwxOSwxLDEzLDEsMTEsMywxMCwxLDExNCw5NywwLAotICAgIDAsMCwyMTgsOSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwNSwxMTYsMTIxLDExNCwyOSwwLAotICAgIDAsMCw5OSwxLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw0LAotICAgIDAsMCwwLDcxLDAsMCwwLDExNSw3NSwwLDAsMCwxMTYsMCwwLDEwNiwKLSAgICAxLDAsMTA2LDIsMCwxMjQsMSwwLDEwNyw1LDAsMTE0LDcxLDAsMTI0LDAsCi0gICAgMCwxMDYsMywwLDEwMCw2LDAsMTMxLDEsMCwxMTUsNDMsMCwxMDAsMywwLAotICAgIDEyNCwwLDAsMjMsMTI1LDAsMCwxMTYsNCwwLDEyNCwwLDAsMTA2LDUsMCwKLSAgICAxMjQsMiwwLDE0MCwwLDAsMTAwLDQsMCwxMTYsMCwwLDEwNiw2LDAsMTMxLAotICAgIDEsMSwxLDEwMCw1LDAsODMsNDEsNywxMjIsNjEsODAsMTE0LDEwNSwxMTAsMTE2LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDMyLDExNiwxMTEsMzIsCi0gICAgMTE1LDExNiwxMDAsMTAxLDExNCwxMTQsMzIsMTA1LDEwMiwzMiw0NSwxMTgsNDcsODAsODksODQsCi0gICAgNzIsNzksNzgsODYsNjksODIsNjYsNzksODMsNjksMzIsMTA1LDExNSwzMiwxMTYsMTE3LAotICAgIDExNCwxMTAsMTAxLDEwMCwzMiwxMTEsMTEwLDQ2LDI1MCwxLDM1LDI1MCw3LDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDMyLDEyMiwyLDM1LDMyLDExNCw1NCwwLDAsMCw3OCw0MSwyLAotICAgIDExNCw5OSwwLDAsMCwxMTQsMTAwLDAsMCwwLDQxLDcsMTE0LDcsMCwwLAotICAgIDAsMTE0LDY3LDAsMCwwLDIxOCw3LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTAxLDExNCwKLSAgICA5LDAsMCwwLDIxOCw1LDExMiwxMTQsMTA1LDExMCwxMTYsMTE0LDQ3LDAsMCwwLAotICAgIDIxOCw2LDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LDQxLDMsMTE0LDc1LDAsMCwwLDExNCwKLSAgICA5OCwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsCi0gICAgMTExLDExNSwxMDEsOTUsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTA3LDEsMCwwLDExNSwKLSAgICA4LDAsMCwwLDAsMiwxOCwxLDE1LDEsMTAsMSwxMTQsMTA1LDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsCi0gICAgMCwwLDMsMCwwLDAsMTE1LDg0LDAsMCwwLDEwMCwxLDAsMTM1LDAsCi0gICAgMCwxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMSwwLDEyNSwxLDAsCi0gICAgMTIxLDEzLDAsMTE2LDAsMCwxMDYsMSwwLDEyNSwyLDAsODcsMTEwLDMwLDAsCi0gICAgNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2NiwwLDEsMSwxLDEwMCw0LDAsCi0gICAgMTAwLDUsMCwxMzIsMCwwLDEyNSwyLDAsODksMTEwLDEsMCw4OCwxMjQsMiwKLSAgICAwLDEyNCwxLDAsMTM2LDAsMCwxMzEsMiwwLDEsMTI0LDEsMCw4Myw0MSwKLSAgICA2LDEyMiwyNTIsNjgsMTAxLDk5LDExMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsMTE2LDExMSwzMiwKLSAgICAxMTgsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTE0LDEwMSwxMTMsCi0gICAgMTE3LDEwMSwxMTUsMTE2LDEwMSwxMDAsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDk3LDExMCwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTQsMTE1LDExNiwKLSAgICAzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsNDAsMTE1LDEwMSwxMDgsMTAyLDQxLAotICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwMSwzMiw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSw5OSwKLSAgICAxMTEsMTEwLDEwMCwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwxMCwKLSAgICAzMiwzMiwzMiwzMiw5OSwxMTEsMTA5LDExMiw5NywxMTQsMTAxLDEwMCwzMiw5NywxMDMsOTcsCi0gICAgMTA1LDExMCwxMTUsMTE2LDQ2LDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTA5LAotICAgIDExMiw5NywxMTQsMTA1LDExNSwxMTEsMTEwLDMyLDEwMiw5NywxMDUsMTA4LDExNSwzMiwxMTYsMTA0LAotICAgIDEwMSwxMTAsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LAotICAgIDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDUsMCwwLAotICAgIDAsMzEsMCwwLDAsMTE1LDg5LDAsMCwwLDEyNCwxLDAsMTAwLDAsMCwKLSAgICAxMDcsOCwwLDExNCwyNCwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMSwwLDExMCwKLSAgICA0NiwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNywzLDAsMTE0LDcwLAotICAgIDAsMTE2LDEsMCwxMDAsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLAotICAgIDEwMiwyLDAsMjIsMTAwLDIsMCwxMjQsMSwwLDEzMSwxLDEsMTMwLDEsMCwKLSAgICAxMzYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTQyLAotICAgIDIsMCw4Myw0MSwzLDc4LDEyMiwzMCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDM3LDExNSwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExMCwKLSAgICAxMDAsMTA4LDEwMSwzMiwzNywxMTUsMjE4LDQsMTEwLDk3LDEwOSwxMDEsNDEsMiwxMTQsMTA2LAotICAgIDAsMCwwLDIxOCwxMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwKLSAgICA0MSw0LDIxOCw0LDExNSwxMDEsMTA4LDEwMiwxMTQsMTA2LDAsMCwwLDExNCwxMDQsMCwKLSAgICAwLDAsOTAsNiwxMDcsMTE5LDk3LDExNCwxMDMsMTE1LDQxLDEsMjE4LDYsMTA5LDEwMSwKKyAgICAzMiw3OCwxMTEsMTEwLDEwMSwyMzMsMCwwLDAsMCwxMjIsMjQsMTIzLDMzLDExNCwxMjUsCisgICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwKKyAgICAxMDEsMTE0LDEwNSw5OSwxMjIsNywxMjMsMTI1LDQ2LDEyMywxMjUsMTIzLDEyNSw0MSwyMSwyMTgsCisgICAgOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMjE4LDQsMTE5LDk3LDExNCwxMTAsCisgICAgMjE4LDE4LDY4LDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsODcsOTcsMTE0LAorICAgIDExMCwxMDUsMTEwLDEwMywyMTgsOSw4NCwxMjEsMTEyLDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LAorICAgIDM4LDAsMCwwLDExNCwzMiwwLDAsMCwxMTQsNywwLDAsMCwyMTgsMTQsCisgICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDIxOCw5LAorICAgIDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywyMTgsMTksNzgsMTExLDExNiw3MywxMDksCisgICAgMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDExNCwyNiwKKyAgICAwLDAsMCwyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsMjE4LDgsMTExLDExMiwxMTYsMTA1LAorICAgIDEwOSwxMDUsMTIyLDEwMSwyMTgsMywxMTUsMTE2LDExNCwyMTgsNywxMDUsMTE1LDk3LDEwOCwxMTAsCisgICAgMTE3LDEwOSwyMTgsMTAsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw0NywKKyAgICAwLDAsMCwyMTgsNCw5NSw3OSw4MCw4NCwxMTQsMjgsMCwwLDAsMjE4LDgsCisgICAgOTUsODAsODksNjcsNjUsNjcsNzIsNjksMjE4LDE3LDY2LDg5LDg0LDY5LDY3LDc5LAorICAgIDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDExLDExNCwzNSwwLAorICAgIDAsMCw5MCwxNCwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsCisgICAgMTAwLDEwMSwxMTQsNTcsMCwwLDAsMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsCisgICAgMjE4LDQsMTA0LDEwMSw5NywxMDAsMTE0LDM3LDAsMCwwLDkwLDQsOTgsOTcsMTE1LAorICAgIDEwMSwyMTgsMywxMTUsMTAxLDExMiwyMTgsNCwxMTQsMTAxLDExNSwxMTYsOTAsMywxMTYsOTcsCisgICAgMTAzLDkwLDE1LDk3LDEwOCwxMDksMTExLDExNSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywKKyAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDIxOCwxNyw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTExLAorICAgIDExNywxMTQsOTksMTAxLDI0NCwwLDAsMCwxMTUsNDYsMCwwLDAsMCwxOCwxMiwKKyAgICAxLDksMSw3LDEsMTIsMSw2LDEsMTIsMSwxOCwxLDE4LDEsMjQsCisgICAgMSwxMiwxLDEyLDEsMTIsMSwzNiwxLDEyLDEsMTgsMSw5LDIsMTIsCisgICAgMSwxMiwxLDEyLDEsMTIsMSwyMSwxLDIxLDEsMTE0LDc5LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCw4LDAsMCwwLDUsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDYyLDEsMCwwLDExNiwwLDAsMTA2LDEsMCwKKyAgICAxMDYsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzAsMCwxMTYsMywwLDEwMCwKKyAgICAyLDAsMTMxLDEsMCwxMzAsMSwwLDExNiw0LDAsMTI0LDAsMCwxMzEsMSwKKyAgICAwLDkyLDIsMCwxMjUsMSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMSwwLAorICAgIDEzMSwxLDAsOTIsMiwwLDEyNSwxLDAsMTI1LDMsMCwxMjQsMywwLDExNiwKKyAgICA1LDAsMTA3LDMsMCwxMTQsMTAyLDAsMTE2LDYsMCwxMDAsMywwLDEwNiw3LAorICAgIDAsMTE2LDUsMCwxMjQsMCwwLDEzMSwyLDAsMTMxLDEsMCwxMzAsMSwwLAorICAgIDEyNCwyLDAsMTA2LDgsMCwxMDAsNCwwLDEzMSwxLDAsMTI1LDQsMCwxMjQsCisgICAgNCwwLDEwMCwxMSwwLDEwNyw3LDAsMTE0LDE1MywwLDExNiw2LDAsMTAwLDcsCisgICAgMCwxMDYsNywwLDEyNCwyLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsCisgICAgMTEwLDEyNSwwLDEyNCw0LDAsMTAwLDYsMCwxMDcsMiwwLDExNCwyMiwxLDEyNCwKKyAgICAyLDAsMTA2LDksMCwxMDAsNCwwLDEwMCw1LDAsMTMxLDIsMCwxMDAsMTIsCisgICAgMCwyNSwxMjUsNSwwLDEyNCw1LDAsMTA2LDEwLDAsMTE2LDExLDAsMTMxLDEsCisgICAgMCwxMTUsMjIzLDAsMTE2LDYsMCwxMDAsOCwwLDEwNiw3LDAsMTE2LDExLDAsCisgICAgMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDUsMCwxMTYsMTIsMCwxMTYsCisgICAgMTEsMCwxMzEsMSwwLDEwMCwxLDAsMTMzLDIsMCwyNSwxMjUsNiwwLDEyNCwKKyAgICA2LDAsMTA2LDEzLDAsMTMxLDAsMCwxMTUsMjIsMSwxMTYsNiwwLDEwMCw5LAorICAgIDAsMTA2LDcsMCwxMjQsNSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLAorICAgIDEyNCwyLDAsMTA2LDE0LDAsMTAwLDQsMCwxMzEsMSwwLDEwMCwxMCwwLDI1LAorICAgIDEyNSw3LDAsMTE2LDE1LDAsMTI0LDEsMCwxMjQsNywwLDExNiwxNiwwLDEwMCwKKyAgICAxMCwwLDI1LDIzLDEzMSwyLDAsODMsNDEsMTMsOTcsMTEwLDEsMCwwLDcxLAorICAgIDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDQ2LDExMiwxMjEsOTksNDYsMzIsMTAyLDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwKKyAgICAxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsCisgICAgMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLAorICAgIDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsCisgICAgMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LAorICAgIDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsMTE1LAorICAgIDExMiwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsOTksCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDMyLDczLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMDAsMTExLDEwMSwxMTUsMTAsMzIsMzIsMzIsMzIsMTEwLDExMSwxMTYsMzIsOTksMTExLDExMCwKKyAgICAxMDIsMTExLDExNCwxMDksMzIsMTE2LDExMSwzMiw4MCw2OSw4MCwzMiw1MSw0OSw1Miw1NSwKKyAgICA0Nyw1Miw1Niw1NiwzMiwxMDIsMTExLDExNCwxMDksOTcsMTE2LDQ0LDMyLDg2LDk3LDEwOCwKKyAgICAxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsOTgsMTAxLDMyLAorICAgIDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMzIsNzMsMTAyLDEwLDMyLDMyLDMyLDMyLDExNSwKKyAgICAxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLAorICAgIDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwKKyAgICAxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwKKyAgICAxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsCisgICAgMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMjIsMzYsCisgICAgMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLAorICAgIDc4LDExMSwxMTAsMTAxLDEyMiwzNywxMjMsMTI1LDMyLDExMCwxMTEsMTE2LDMyLDk4LDExMSwxMTYsCisgICAgMTE2LDExMSwxMDksNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LAorICAgIDExMSwxMTQsMTIxLDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTE0LDU4LDAsMCwwLAorICAgIDExNCw1NiwwLDAsMCwyMzMsMywwLDAsMCwxMjIsMzMsMTAxLDEyMCwxMTIsMTAxLAorICAgIDk5LDExNiwxMDEsMTAwLDMyLDExMSwxMTAsMTA4LDEyMSwzMiw1MCwzMiwxMTEsMTE0LDMyLDUxLAorICAgIDMyLDEwMCwxMTEsMTE2LDExNSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDEyMiw1NywxMTEsCisgICAgMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwKKyAgICAxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDExNiw5NywxMTQsMTE2LDMyLDExOSwKKyAgICAxMDUsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNTIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsCisgICAgMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEyMywzMywxMTQsCisgICAgMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTEwLDMyLDk3LDEwOCwxMTIsMTA0LAorICAgIDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDExOCw5NywxMDgsMTE3LDEwMSwxMTQsNTksCisgICAgMCwwLDAsNjIsMiwwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDgwLDAsCisgICAgMCwwLDIzMywyNTQsMjU1LDI1NSwyNTUsNDEsMTcsMTE0LDcsMCwwLDAsMTE0LDY0LAorICAgIDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsNjYsMCwwLDAsMTE0LDM4LDAsCisgICAgMCwwLDExNCw3MywwLDAsMCwxMTQsNzEsMCwwLDAsMTE0LDQ3LDAsMCwKKyAgICAwLDIxOCw1LDk5LDExMSwxMTcsMTEwLDExNiwxMTQsMzQsMCwwLDAsMTE0LDksMCwKKyAgICAwLDAsMTE0LDcyLDAsMCwwLDExNCwzMSwwLDAsMCwxMTQsNzAsMCwwLAorICAgIDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCwxMTQsMjgsMCwwLAorICAgIDAsMjE4LDE1LDgzLDc5LDg1LDgyLDY3LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LAorICAgIDY5LDgzLDQxLDgsMTE0LDM1LDAsMCwwLDExNCw3NiwwLDAsMCw5MCwxNiwKKyAgICAxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLAorICAgIDkwLDcsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDkwLDksMTAwLDExMSwxMTYsOTUsOTksCisgICAgMTExLDExNywxMTAsMTE2LDExNCw1NywwLDAsMCw5MCw5LDExMSwxMTIsMTE2LDk1LDEwOCwKKyAgICAxMDEsMTE4LDEwMSwxMDgsOTAsMTMsOTgsOTcsMTE1LDEwMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLAorICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMjE4LDE3LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LAorICAgIDk5LDk3LDk5LDEwNCwxMDEsMzIsMSwwLDAsMTE1LDQ0LDAsMCwwLDAsOSwKKyAgICAxOCwxLDEyLDEsMTgsMSwxOCwxLDEyLDEsOSwxLDE1LDEsMTUsMSwKKyAgICAxMiwxLDksMSwxNSwxLDEyLDEsMjIsMSwxNSwxLDksMSwxMiwxLAorICAgIDIyLDEsMTIsMSw5LDEsMTIsMSwxOSwxLDExNCw4NSwwLDAsMCw5OSwKKyAgICAxLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwxMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTY0LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMzEsCisgICAgMSwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsMjIsMCwxMDAsMiwwLDgzLDEyNCwKKyAgICAwLDAsMTA2LDEsMCwxMDAsMywwLDEzMSwxLDAsOTIsMywwLDEyNSwxLAorICAgIDAsMTI1LDIsMCwxMjUsMywwLDEyNCwxLDAsMTIsMTE1LDgxLDAsMTI0LDMsCisgICAgMCwxMDYsMiwwLDEzMSwwLDAsMTAwLDcsMCwxMDAsOCwwLDEzMywyLDAsCisgICAgMjUsMTAwLDYsMCwxMDcsMywwLDExNCw4NSwwLDEyNCwwLDAsODMsMTIxLDE2LAorICAgIDAsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDQsMCw4NywxMTAsNDAsCisgICAgMCw0LDExNiw0LDAsMTE2LDUsMCwxMDIsMiwwLDEwNywxMCwwLDExNCwxNDMsCisgICAgMCwxLDEsMSwxMjQsMCwwLDEwMCwyLDAsMTAwLDksMCwxMzMsMiwwLAorICAgIDI1LDEyNSw0LDAsODksMTEwLDEsMCw4OCwxMTYsNiwwLDEyNCw0LDAsMTMxLAorICAgIDEsMCwxMTQsMTYwLDAsMTI0LDQsMCw4MywxMjQsMCwwLDgzLDQxLDEwLDEyMiwKKyAgICAxODgsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsOTcsMzIsOTgsMTIxLDExNiwxMDEsOTksCisgICAgMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsCisgICAgMzIsOTcsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw0MCwKKyAgICAxMDUsMTAyLDMyLDExMiwxMTEsMTE1LDExNSwxMDUsOTgsMTA4LDEwMSw0MSw0NiwxMCwxMCwzMiwKKyAgICAzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsCisgICAgMzIsMTAxLDEyMCwxMDUsMTE1LDExNiwxMTUsMzIsMTEyLDExNywxMTQsMTAxLDEwOCwxMjEsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsOTgsOTcsOTksMTA3LDExOSw5NywxMTQsMTAwLDExNSw0NSw5OSwxMTEsMTA5LAorICAgIDExMiw5NywxMTYsMTA1LDk4LDEwNSwxMDgsMTA1LDExNiwxMjEsMzIsMTAyLDExMSwxMTQsMTAsMzIsCisgICAgMzIsMzIsMzIsODAsMTIxLDczLDEwOSwxMTIsMTExLDExNCwxMTYsOTUsNjksMTIwLDEwMSw5OSwKKyAgICA2NywxMTEsMTAwLDEwMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDg3LDEwNSwxMTYsMTA0LDcwLDEwNSwKKyAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSw0MCw0MSwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDY3LDMyLDY1LDgwLDczLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCw1OSwwLAorICAgIDAsMCw3OCwxMTQsNTgsMCwwLDAsMTE0LDgwLDAsMCwwLDExNCwyOSwwLAorICAgIDAsMCw5MCwyLDExMiwxMjEsMjMzLDI1MywyNTUsMjU1LDI1NSwyMzMsMjU1LDI1NSwyNTUsMjU1LAorICAgIDExNCw4NywwLDAsMCw0MSw3LDExNCwzMSwwLDAsMCwxMTQsMzIsMCwwLAorICAgIDAsMjE4LDUsMTA4LDExMSwxMTksMTAxLDExNCwxMTQsODUsMCwwLDAsMTE0LDY2LDAsCisgICAgMCwwLDExNCw3MSwwLDAsMCwxMTQsNDQsMCwwLDAsNDEsNSwyMTgsMTMsCisgICAgOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDc4LDAsCisgICAgMCwwLDExNCwzNiwwLDAsMCw5MCw5LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKKyAgICAxMTEsMTEwLDIxOCwxMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNSwKKyAgICA5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDEwMiwxMDUsMTA4LDEwMSw2NSwKKyAgICAxLDAsMCwxMTUsMjAsMCwwLDAsMCw3LDE4LDEsNCwxLDI0LDEsCisgICAgMzUsMSw0LDEsMywxLDE2LDEsMTksMSwyMSwxLDExNCw5MSwwLDAsCisgICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxMSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsOTIsMCwwLDAsMTI0LDAsMCwxMDYsMCwKKyAgICAwLDExNiwxLDAsMTE2LDIsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDU5LDAsCisgICAgMTIxLDE0LDAsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsODMsODcsMTEzLDg4LAorICAgIDAsNCwxMTYsNCwwLDEwNywxMCwwLDExNCw1NSwwLDEsMSwxLDg5LDExMywKKyAgICA4OCwwLDg4LDExMCwyOSwwLDEyNCwwLDAsMTA2LDAsMCwxMTYsMSwwLDExNiwKKyAgICA1LDAsMTMxLDEsMCwxMzEsMSwwLDExNCw4NCwwLDEyNCwwLDAsODMsMTAwLAorICAgIDAsMCw4MywxMDAsMCwwLDgzLDQxLDEsNzgsNDEsNiwyMTgsOCwxMDEsMTEwLAorICAgIDEwMCwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCw1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE0LDg0LDAsCisgICAgMCwwLDExNCw3OSwwLDAsMCwxMTQsNjYsMCwwLDAsMTE0LDc0LDAsMCwKKyAgICAwLDQxLDEsMjE4LDgsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMDMsCisgICAgMTAxLDExNiw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw4NCwxLDAsMCwxMTUsMTYsMCwKKyAgICAwLDAsMCwxLDIxLDEsMywxLDE0LDEsMTMsMSw4LDEsMjEsMSwKKyAgICA0LDIsMTE0LDk1LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw2MCwwLDAsCisgICAgMCwxMjEsMTksMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxMDYsMSwwLAorICAgIDEyNSwxLDAsODcsMTEwLDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw0NSwKKyAgICAwLDEsMSwxLDEwMCwxLDAsMTI1LDEsMCw4OSwxMTAsMSwwLDg4LDEyNCwKKyAgICAxLDAsMTAwLDIsMCw3OSwxMjUsMSwwLDEyNCwxLDAsODMsNDEsMywxMjIsCisgICAgNTEsNjcsOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCisgICAgMTExLDEwMCwxMDEsMzIsMTEyLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDExNSwzMiwKKyAgICAxMDIsMTExLDExNCwzMiw5NywzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsNDYsMTA1LDE4MiwxLDAsMCwyMzMsMTI4LDAsMCwwLDQxLDMsCisgICAgMTE0LDM5LDAsMCwwLDExNCw0MSwwLDAsMCwxMTQsNDAsMCwwLDAsNDEsCisgICAgMiwxMTQsMzUsMCwwLDAsMTE0LDQyLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMCw5NSw5OSw5NywxMDgsCisgICAgOTksOTUsMTA5LDExMSwxMDAsMTAxLDk2LDEsMCwwLDExNSwxMiwwLDAsMCwwLAorICAgIDIsMywxLDE5LDEsMTMsMSwxMSwzLDEwLDEsMTE0LDk3LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwKKyAgICAwLDMsMCwwLDAsMTE1LDg0LDAsMCwwLDEwMCwxLDAsMTM1LDAsMCwKKyAgICAxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMSwwLDEyNSwxLDAsMTIxLAorICAgIDEzLDAsMTE2LDAsMCwxMDYsMSwwLDEyNSwyLDAsODcsMTEwLDMwLDAsNCwKKyAgICAxMTYsMiwwLDEwNywxMCwwLDExNCw2NiwwLDEsMSwxLDEwMCw0LDAsMTAwLAorICAgIDUsMCwxMzIsMCwwLDEyNSwyLDAsODksMTEwLDEsMCw4OCwxMjQsMiwwLAorICAgIDEyNCwxLDAsMTM2LDAsMCwxMzEsMiwwLDEsMTI0LDEsMCw4Myw0MSw2LAorICAgIDEyMiwyNTIsNjgsMTAxLDk5LDExMSwxMTQsOTcsMTE2LDExMSwxMTQsMzIsMTE2LDExMSwzMiwxMTgsCisgICAgMTAxLDExNCwxMDUsMTAyLDEyMSwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTE0LDEwMSwxMTMsMTE3LAorICAgIDEwMSwxMTUsMTE2LDEwMSwxMDAsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDMyLDk5LDk3LDExMCwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTQsMTE1LDExNiwzMiwKKyAgICA5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsNDAsMTE1LDEwMSwxMDgsMTAyLDQxLDMyLAorICAgIDEwOSwxMTcsMTE1LDExNiwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwMSwzMiw5NSwxMTAsOTcsMTA5LAorICAgIDEwMSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSw5OSwxMTEsCisgICAgMTEwLDEwMCwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwxMCwzMiwKKyAgICAzMiwzMiwzMiw5OSwxMTEsMTA5LDExMiw5NywxMTQsMTAxLDEwMCwzMiw5NywxMDMsOTcsMTA1LAorICAgIDExMCwxMTUsMTE2LDQ2LDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTA5LDExMiwKKyAgICA5NywxMTQsMTA1LDExNSwxMTEsMTEwLDMyLDEwMiw5NywxMDUsMTA4LDExNSwzMiwxMTYsMTA0LDEwMSwKKyAgICAxMTAsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwKKyAgICAzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDUsMCwwLDAsCisgICAgMzEsMCwwLDAsMTE1LDg5LDAsMCwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsCisgICAgOCwwLDExNCwyNCwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMSwwLDExMCw0NiwKKyAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNywzLDAsMTE0LDcwLDAsCisgICAgMTE2LDEsMCwxMDAsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEwMiwKKyAgICAyLDAsMjIsMTAwLDIsMCwxMjQsMSwwLDEzMSwxLDEsMTMwLDEsMCwxMzYsCisgICAgMCwwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTQyLDIsCisgICAgMCw4Myw0MSwzLDc4LDEyMiwzMCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDM3LDExNSwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExMCwxMDAsCisgICAgMTA4LDEwMSwzMiwzNywxMTUsMjE4LDQsMTEwLDk3LDEwOSwxMDEsNDEsMiwxMTQsOTgsMCwKKyAgICAwLDAsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDQxLAorICAgIDQsMjE4LDQsMTE1LDEwMSwxMDgsMTAyLDExNCw5OCwwLDAsMCwyMTgsNCw5NywxMTQsCisgICAgMTAzLDExNSw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsMSwyMTgsNiwxMDksMTAxLAogICAgIDExNiwxMDQsMTExLDEwMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTksCiAgICAgOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsMTE5LDExNCw5NywxMTIsCi0gICAgMTEyLDEwMSwxMTQsMTIzLDEsMCwwLDExNSwxMiwwLDAsMCwwLDEsMTIsMSwKKyAgICAxMTIsMTAxLDExNCwxMTYsMSwwLDAsMTE1LDEyLDAsMCwwLDAsMSwxMiwxLAogICAgIDEyLDEsMTUsMSw2LDEsMjUsMSwxMjIsNDAsOTUsOTksMTA0LDEwMSw5OSwxMDcsCiAgICAgOTUsMTEwLDk3LDEwOSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LAogICAgIDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwxMTQsOTcsMTEyLDExMiwKQEAgLTU5NSwxNyArNTczLDE3IEBACiAgICAgMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCwKICAgICA2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsCiAgICAgMTExLDEwOCwxMDAsMTE0LDUyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsOTcsMTEyLDEzNCwxLAorICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsNSw5NSwxMTksMTE0LDk3LDExMiwxMjcsMSwKICAgICAwLDAsMTE1LDgsMCwwLDAsMCwxLDI1LDEsMTUsMSwyOSwxLDEyMiwKICAgICAyNiw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw0Niw2MCwxMDgsMTExLAogICAgIDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE5LDExNCw5NywxMTIsNDEsMywyMTgsMTAsOTUsCi0gICAgOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExNCwxMjAsMCwwLDAsMjE4LDksCi0gICAgNzgsOTcsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsNDEsMywxMTQsMTA5LDAsMCwwLAotICAgIDExNCwxMTAsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsNCwwLDAsMCw0MSwKLSAgICAxLDExNCwxMDksMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDk1LDk5LDEwNCwKLSAgICAxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDExNSwxLDAsMCwxMTUsMTQsMCwwLAorICAgIDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTQsMTEzLDAsMCwwLDIxOCw5LAorICAgIDc4LDk3LDEwOSwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDQxLDMsMTE0LDEwMiwwLDAsMCwKKyAgICAxMTQsMTAzLDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDQsMCwwLDAsNDEsCisgICAgMSwxMTQsMTAyLDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSw5OSwxMDQsCisgICAgMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwxMDgsMSwwLDAsMTE1LDE0LDAsMCwKICAgICAwLDAsOCwyMSw3LDMsMSwxMywxLDEzLDIsMTcsNSwxMywxLDExNCwKLSAgICAxMjMsMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLAorICAgIDExNiwwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsCiAgICAgMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw4NCwwLDAsMCwxMjQsMCwKICAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDkyLDIsMCwxMjUsMiwwLAogICAgIDEyNSwzLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDgwLDAsMTE2LApAQCAtNjI4LDE0ICs2MDYsMTQgQEAKICAgICAxMTQsNTksMCwwLDAsNDEsNiwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsCiAgICAgOTcsMTAwLDEwMSwxMTQsMTE0LDMxLDAsMCwwLDExNCw2MCwwLDAsMCwxMTQsNjEsCiAgICAgMCwwLDAsMTE0LDQ3LDAsMCwwLDIxOCwxMyw3MywxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsNDEsNSwxMTQsMTA4LDAsMCwwLDIxOCw4LAorICAgIDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsNDEsNSwxMTQsMTAwLDAsMCwwLDIxOCw4LAogICAgIDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwyMTgsNiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAogICAgIDIxOCw4LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsMjE4LDMsMTA5LDExNSwxMDMsMTE0LAogICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE3LAogICAgIDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwKLSAgICAxMDksMTQzLDEsMCwwLDExNSwxMCwwLDAsMCwwLDEwLDIxLDEsMjQsMSwKLSAgICA2LDEsMjksMSwxMTQsMTMwLDAsMCwwLDk5LDQsMCwwLDAsMCwwLAotICAgIDAsMCwxMSwwLDAsMCwxOSwwLDAsMCw2NywwLDAsMCwxMTUsMjQwLAorICAgIDEwOSwxMzYsMSwwLDAsMTE1LDEwLDAsMCwwLDAsMTAsMjEsMSwyNCwxLAorICAgIDYsMSwyOSwxLDExNCwxMjMsMCwwLDAsOTksNCwwLDAsMCwwLDAsCisgICAgMCwwLDExLDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwyNTIsCiAgICAgMSwwLDAsMTA1LDAsMCwxMjUsNCwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsCiAgICAgOSwwLDExNCwzMSwwLDEyNCwyLDAsMTI0LDQsMCwxMDAsMiwwLDYwLDExMCwKICAgICA2LDAsMTAwLDMsMCwxMjUsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMDcsOSwKQEAgLTY0MywxOTU1ICs2MjEsMTk2MSBAQAogICAgIDAsMTAwLDEsMCwxMDAsNSwwLDEzMywyLDAsMjUsMTI1LDUsMCwxMjQsMCwKICAgICAwLDEwMCw1LDAsMTAwLDYsMCwxMzMsMiwwLDI1LDEyNSw2LDAsMTI0LDAsCiAgICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMzLDIsMCwyNSwxMjUsNywwLDEyNCw1LAotICAgIDAsMTE2LDAsMCwxMDcsMywwLDExNCwxNjgsMCwxMDAsOCwwLDEwNiwxLDAsCi0gICAgMTI0LDIsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LDgsMCwxMTYsMiwwLDEwMCwKLSAgICA5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LDMsMCwxMjQsOCwwLDEyNCwKLSAgICA0LDAsMTQxLDEsMCwxMzAsMSwwLDExMCwxMTksMCwxMTYsNCwwLDEyNCw2LAotICAgIDAsMTMxLDEsMCwxMDAsNSwwLDEwNywzLDAsMTE0LDIyOSwwLDEwMCwxMCwwLAotICAgIDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsCi0gICAgOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiw1LDAsMTI0LDgsMCwxMzEsCi0gICAgMSwwLDEzMCwxLDAsMTEwLDU4LDAsMTE2LDQsMCwxMjQsNywwLDEzMSwxLAotICAgIDAsMTAwLDUsMCwxMDcsMywwLDExNCwzMSwxLDEwMCwxMSwwLDEwNiwxLDAsCi0gICAgMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsOSwwLDEyNCwKLSAgICA4LDAsMTMxLDIsMCwxLDExNiw1LDAsMTI0LDgsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDIyNiwxLDEyMSwyMCwKLSAgICAwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTIsMCwyNSwxMzEsMSwwLDEyNSw5LAotICAgIDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCw4MywxLDEsCi0gICAgMSwxLDg5LDExMCw2MiwwLDg4LDExNiw4LDAsMTI0LDYsMCwxMzEsMSwwLAotICAgIDEyNCw5LDAsMTA3LDMsMCwxMTQsMTQ1LDEsMTAwLDEzLDAsMTA2LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwxLDAsMTI1LDgsMCwxMTYsMiwwLDEwMCw5LDAsMTI0LDgsCi0gICAgMCwxMzEsMiwwLDEsMTE2LDMsMCwxMjQsOCwwLDEyNCw0LDAsMTQxLDEsCi0gICAgMCwxMzAsMSwwLDEyMSwxOCwwLDEyNCwxLDAsMTAwLDE0LDAsMjUsMTAwLDE1LAotICAgIDAsNjQsMTI1LDEwLDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLAotICAgIDExNCwxODMsMSwxLDEsMSw4OSwxMTAsNDMsMCw4OCwxMTYsOCwwLDEyNCw3LAotICAgIDAsMTMxLDEsMCwxMjQsMTAsMCwxMDcsMywwLDExNCwyMjYsMSwxMTYsMywwLAotICAgIDEwMCwxMywwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCw0LDAsMTQxLAotICAgIDEsMCwxMzAsMSwwLDEyNCwwLDAsMTAwLDcsMCwxMDAsMSwwLDEzMywyLAotICAgIDAsMjUsODMsNDEsMTYsOTcsMTIyLDEsMCwwLDg2LDk3LDEwOCwxMDUsMTAwLDk3LAotICAgIDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTAyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsNDUsMTA1LDExMCwzMiw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDMyLAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDMyLDQwLDEwNSwxMDIsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCw0MSwzMiw5NywxMTAsMTAwLDMyLAotICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwKLSAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDk3LDExMCwzMiwKLSAgICA5OCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OSwKLSAgICAxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwKLSAgICAxMDgsMTA4LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsCi0gICAgMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwKLSAgICAxMTAsMTA0LDk3LDExMCw5OSwxMDEsMzIsMTAxLDExNCwxMTQsMTExLDExNCwzMiwxMTQsMTAxLDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LAotICAgIDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSw5NywxMDMsMTA1LAotICAgIDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDExMSwKLSAgICAxMTQsMTE0LDEwMSw5OSwxMTYsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTEsMTE3LAotICAgIDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTE1LDExNiw5NywxMDgsMTAxLDQ2LDMyLAotICAgIDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LAotICAgIDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsCi0gICAgMzIsMTA1LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDEwLAotICAgIDMyLDMyLDMyLDMyLDExNiwxMTQsMTE3LDExMCw5OSw5NywxMTYsMTAxLDEwMCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw3OCwxMTQsMTA2LDAsMCwwLDEyMiwxMCw2MCw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSw2MiwxMTQsMzUsMCwwLDAsMTE0LDEyLDAsMCwwLAotICAgIDIzMyw4LDAsMCwwLDIzMywxMiwwLDAsMCwxMjIsMzAsOTgsOTcsMTAwLDMyLAotICAgIDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExMCwzMiwKLSAgICAxMjMsMzMsMTE0LDEyNSw1OCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsMiwxMjMsMTI1LDEyMiw0MywKLSAgICAxMTQsMTAxLDk3LDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwKLSAgICAxMDEsMzIsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsCi0gICAgOTcsMTA5LDExMiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDEyMiw0OCwxMTQsMTAxLDk3LAotICAgIDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsMTE0LAotICAgIDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE1LDEwNSwxMjIsMTAxLDMyLDExMSwxMDIsMzIsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDIxOCw1LDEwOSwKLSAgICAxMTYsMTA1LDEwOSwxMDEsMTIyLDI2LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTE1LDExNiw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMywzMywxMTQsMTI1LAotICAgIDIxOCw0LDExNSwxMDUsMTIyLDEwMSwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwxMjcsMywKLSAgICAwLDQxLDksMjE4LDEyLDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LAotICAgIDgyLDExNCw0NywwLDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxMDcsMCwwLDAsCi0gICAgMTE0LDMxLDAsMCwwLDIxOCw4LDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsCi0gICAgMTQsMCwwLDAsMjE4LDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDE5LAotICAgIDAsMCwwLDQxLDExLDExNCw1MywwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwKLSAgICAwLDAsOTAsMTEsMTAxLDEyMCw5OSw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCwKLSAgICA1LDEwOSw5NywxMDMsMTA1LDk5LDkwLDEzLDExNCw5NywxMTksOTUsMTE2LDEwNSwxMDksMTAxLAotICAgIDExNSwxMTYsOTcsMTA5LDExMiw5MCw4LDExNCw5NywxMTksOTUsMTE1LDEwNSwxMjIsMTAxLDExNCwKLSAgICA3NSwwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDksMTE2LDEwNSwKLSAgICAxMDksMTAxLDIxOCwxMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMjUsCi0gICAgOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLAotICAgIDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwxNjAsMSwwLDAsMTE1LDc2LDAsCi0gICAgMCwwLDAsMTEsNiwxLDEyLDEsMTMsMyw2LDEsMTIsMSwxMCwxLAotICAgIDE2LDEsMTYsMSwxNiwxLDEyLDEsMTgsMSwxMywxLDE4LDEsMTgsMSwKLSAgICAxNSwxLDEzLDEsMTUsMSwxOCwxLDE1LDEsMTMsMSwxMiwxLDEyLDEsCi0gICAgMywxLDIwLDEsMTMsMSw1LDIsMTgsMSwxNSwxLDEzLDEsMTUsMSwKLSAgICAzLDEsMTgsMSwxMywxLDUsMiwxOCwxLDE1LDEsOSwxLDExNCwxNDEsCi0gICAgMCwwLDAsOTksNCwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNiwwLDAsMCw2NywwLDAsMCwxMTUsMTEyLDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDQsMCwxMTYsMiwwLDEyNCwKLSAgICA0LDAsMTE2LDMsMCwxMzEsMiwwLDExNCw3NSwwLDExNiw0LDAsMTAwLDEsCi0gICAgMCwxMjQsMiwwLDEzMSwyLDAsMSwxMjQsMywwLDEwMCwyLDAsMTA3LDksCi0gICAgMCwxMTQsNzEsMCwxMTYsNSwwLDEwNiw2LDAsMTI0LDQsMCwxMjQsMywwLAotICAgIDEzMSwyLDAsMSwxMjQsNCwwLDgzLDExNiw3LDAsMTAwLDMsMCwxMDYsOCwKLSAgICAwLDEyNCwyLDAsMTMxLDEsMCwxMDAsNCwwLDEyNCwxLDAsMTAwLDUsMCwKLSAgICAxMjQsMiwwLDEzMSwxLDIsMTMwLDEsMCwxMDAsMiwwLDgzLDQxLDYsMTIyLAotICAgIDYwLDY3LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCi0gICAgMTAxLDMyLDk3LDExNSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDk4LDEyMSwKLSAgICAzMiw5NSwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwKLSAgICAxMTEsMTAwLDEwMSw5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDQwLDQxLDQ2LDEyMiwyMSw5OSwKLSAgICAxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExNCwxMTEsMTA5LDMyLAotICAgIDEyMywzMywxMTQsMTI1LDc4LDEyMiwyMyw3OCwxMTEsMTEwLDQ1LDk5LDExMSwxMDAsMTAxLDMyLAotICAgIDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDExNCwxMDYsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDksMjE4LDcsMTA5LDk3LDExNCwxMTUsCi0gICAgMTA0LDk3LDEwOCw5MCw1LDEwOCwxMTEsOTcsMTAwLDExNSwyMTgsMTAsMTA1LDExNSwxMDUsMTEwLAotICAgIDExNSwxMTYsOTcsMTEwLDk5LDEwMSwyMTgsMTAsOTUsOTksMTExLDEwMCwxMDEsOTUsMTE2LDEyMSwKLSAgICAxMTIsMTAxLDExNCwxMDUsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwxMTIsOTAsMTYsOTUsCi0gICAgMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsCi0gICAgMTA3LDAsMCwwLDExNCw0NywwLDAsMCw0MSw1LDExNCw1MywwLDAsMCwKLSAgICAxMTQsMTA2LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTAsMCwwLDAsMjE4LAotICAgIDQsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDk1LDk4LAotICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIxNSwxLDAsMCwxMTUsMTYsMCwwLDAsCi0gICAgMCwyLDE1LDEsMTUsMSwxMywxLDEyLDEsMTYsMSw0LDIsMTgsMSwKLSAgICAxMTQsMTQ3LDAsMCwwLDExNCw1OSwwLDAsMCw5OSwzLDAsMCwwLDAsCi0gICAgMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICA3NiwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTMxLDEsMCwxMjUsMywwLAotICAgIDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLDEyNCwxLDAsMTMxLDEsMCwxMzEsCi0gICAgMSwwLDEsMTI0LDMsMCwxMDYsMiwwLDExNiwzLDAsMTI0LDIsMCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMSwxMjQsMywwLDEwNiwyLDAsMTE2LDQsMCwxMDYsCi0gICAgNSwwLDEyNCwwLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCw4MywKLSAgICA0MSwxLDEyMiw4MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5NywzMiw5OSwxMTEsCi0gICAgMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwxMTYsMTExLDMyLDk4LAotICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExOSwxMTQsMTA1LDExNiwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTEsMTE3LDExNiwzMiwxMTYsMTExLDMyLDk3LDMyLDk4LDEyMSwxMTYsCi0gICAgMTAxLDQ1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwxMCwzMiwzMiwzMiwzMiwxMDIsCi0gICAgMTA1LDEwOCwxMDEsNDYsNDEsNiwyMTgsOSw5OCwxMjEsMTE2LDEwMSw5NywxMTQsMTE0LDk3LAotICAgIDEyMSwxMTQsMTM1LDAsMCwwLDIxOCw2LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTAwLDExNCwxNywKLSAgICAwLDAsMCwxMTQsMTQyLDAsMCwwLDkwLDUsMTAwLDExNywxMDksMTEyLDExNSw0MSwKLSAgICA0LDExNCwxNDYsMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsMTQwLDAsMCwwLAotICAgIDExNCw1MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwMCwxMDEsOTUsMTE2LDExMSw5NSw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMjcsMSwwLDAsMTE1LDEwLDAsMCwwLAotICAgIDAsMywxMiwxLDE5LDEsMTksMSwyMiwxLDExNCwxNTAsMCwwLDAsOTksCi0gICAgMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsNCwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsODksMCwwLDAsMTAwLDEsMCwxMDAsMiwwLDEwOCwKLSAgICAwLDAsMTI1LDEsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDAsMCwxMzEsMSwKLSAgICAwLDEwNiwzLDAsMTI1LDIsMCwxMjQsMSwwLDEwNiw0LDAsMTI0LDIsMCwKLSAgICAxMzEsMSwwLDEyNSwzLDAsMTE2LDEsMCwxMDYsNSwwLDEwMCwyLDAsMTAwLAotICAgIDMsMCwxMzEsMiwwLDEyNSw0LDAsMTI0LDQsMCwxMDYsNiwwLDEyNCwwLAotICAgIDAsMTA2LDYsMCwxMjQsMywwLDEwMCwxLDAsMjUsMTMxLDEsMCwxMzEsMSwKLSAgICAwLDgzLDQxLDQsMTIyLDEyMSw2OCwxMDEsOTksMTExLDEwMCwxMDEsMzIsOTgsMTIxLDExNiwKLSAgICAxMDEsMTE1LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLAotICAgIDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NSwxMTAsMTA1LDExOCwxMDEsMTE0LDExNSw5NywKLSAgICAxMDgsMzIsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LAotICAgIDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwMCwxMDEsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw0NiwxMCwzMiwzMiwzMiwzMiwxMTQsCi0gICAgNTksMCwwLDAsNzgsODQsNDEsNywyMTgsOCwxMTYsMTExLDEwNywxMDEsMTEwLDEwNSwKLSAgICAxMjIsMTAxLDExNCw0OSwwLDAsMCw5MCw3LDY2LDEyMSwxMTYsMTAxLDExNSw3Myw3OSwKLSAgICA5MCw4LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSw5MCwxNSwxMDAsMTAxLDExNiwxMDEsCi0gICAgOTksMTE2LDk1LDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw5MCwyNSw3MywxMTAsOTksCi0gICAgMTE0LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTA4LDc4LDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDY4LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE4LDYsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSw0MSw1LAotICAgIDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMTUxLAotICAgIDAsMCwwLDkwLDIxLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsOTgsMTIxLDExNiwxMDEsCi0gICAgMTE1LDk1LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSwyMTgsOCwxMDEsMTEwLDk5LDExMSwKLSAgICAxMDAsMTA1LDExMCwxMDMsOTAsMTUsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDk1LDEwMCwxMDEsCi0gICAgOTksMTExLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCwxMywxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExNSwxMTEsMTE3LAotICAgIDExNCw5OSwxMDEsMjM3LDEsMCwwLDExNSwxMCwwLDAsMCwwLDUsMTIsMSwKLSAgICAxOCwxLDE1LDEsMTgsMSwxMTQsMTU1LDAsMCwwLDExNCwxMjcsMCwwLDAsCi0gICAgMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsCi0gICAgOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw5OSwyLDAsMCwKLSAgICAwLDIsMCwwLDAsOSwwLDAsMCwxOSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsODksMSwwLDAsMTI0LDEsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDczLDAsMTAwLDIsMCwxMjUsMSwwLDExNiwwLDAsMTI0LDIsMCwxMDAsMywKLSAgICAwLDEzMSwyLDAsMTE0LDczLDAsMTIxLDE5LDAsMTI0LDIsMCwxMDYsMSwwLAotICAgIDEyNCwwLDAsMTMxLDEsMCwxMjUsMSwwLDg3LDExMCwxOCwwLDQsMTE2LDIsCi0gICAgMCwxMDcsMTAsMCwxMTQsNzIsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDExNiwKLSAgICAzLDAsMTA2LDQsMCwxMjQsMCwwLDEyNCwyLDAsMTAwLDQsMCwxMjQsMSwKLSAgICAwLDEzMSwyLDEsMTI1LDQsMCwxMDAsNSwwLDEyNCw0LDAsOTUsNSwwLAotICAgIDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwxOTQsMCwxMjAsNzMsMCwxMTYsCi0gICAgNiwwLDEzMSwwLDAsNjgsOTMsNTgsMCw5MiwyLDAsMTI1LDUsMCwxMjUsCi0gICAgNiwwLDEyNCwxLDAsMTA2LDcsMCwxMTYsOCwwLDEyNCw2LDAsMTMxLDEsCi0gICAgMCwxMzEsMSwwLDExNCwxMjgsMCwxMjQsNSwwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICAxMzEsMiwwLDEyNSwyLDAsMTI0LDIsMCwxMjQsNCwwLDk1LDksMCw4MCwKLSAgICAxMTMsMTI4LDAsODcsMTAwLDEsMCw4MywxMjQsMywwLDExNiwxMCwwLDEwNyw4LAotICAgIDAsMTE0LDIzLDEsMTE2LDAsMCwxMjQsMiwwLDEwMCw2LDAsMTMxLDIsMCwKLSAgICAxMTQsMzIsMSwxMjEsMTksMCwxMjQsMiwwLDEwNiwxMSwwLDEyNCwwLDAsMTMxLAotICAgIDEsMCwxMjUsNywwLDg3LDExMCwxOCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwKLSAgICAxMTQsNCwxLDEsMSwxLDg5LDExMywzMiwxLDg4LDEyNCw3LDAsMTE0LDMyLAotICAgIDEsMTAzLDAsMCwxMjQsNCwwLDk1LDEyLDAsMTEwLDksMCwxMjQsMywwLAotICAgIDEyNCw0LDAsOTUsMTIsMCwxMjQsNCwwLDEwNiwxMiwwLDEwMywwLDAsMTA3LAotICAgIDIsMCwxMTQsODUsMSwxMjQsMSwwLDExNCw4NSwxLDExNiwxMywwLDEyNCwxLAotICAgIDAsMTMxLDEsMCwxMDAsNywwLDI1LDEyNSw4LDAsMTI0LDQsMCwxMDYsMTIsCi0gICAgMCwxMDYsMTQsMCwxMjQsOCwwLDEzMSwxLDAsMSwxMjQsNCwwLDgzLDQxLAotICAgIDgsOTcsNjEsMSwwLDAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5OCw5NywxMTUsMTAxLDEwMCwKLSAgICAzMiwxMTEsMTEwLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDgsMTExLDk5LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMTEsMzIsMTA1LDExMCwxMDAsCi0gICAgMTA1LDk5LDk3LDExNiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LAotICAgIDEwMywxMDEsNDQsMzIsMTE1LDEwMSwxMTYsMTAsMzIsMzIsMzIsMzIsMTE1LDExNyw5OCwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSwKLSAgICA5NywxMTYsMTA1LDExMSwxMTAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMzIsMTA4LDEwNSwxMTUsMTE2LAotICAgIDMyLDExMSwxMDIsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMTIsOTcsCi0gICAgMTE2LDEwNCwxMTUsNDYsMzIsMzIsNjUsMTEwLDEwLDMyLDMyLDMyLDMyLDEwMSwxMDksMTEyLAotICAgIDExNiwxMjEsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDEwNSwxMTUsMzIsMTE1LDExNywxMDIsMTAyLDEwNSwKLSAgICA5OSwxMDUsMTAxLDExMCwxMTYsNDQsMzIsMTE2LDEwNCwxMTEsMTE3LDEwMywxMDQsMzIsMTA1LDExNiwKLSAgICAxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTExLDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsMzIsCi0gICAgMTE3LDExNSwxMDEsMTAyLDExNywxMDgsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwKLSAgICAzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTA5LDExNywxMTUsMTE2LDMyLDExNiw5NywxMDcsMTAxLDMyLDk3LDMyLDExNSwxMTIsMTAxLAotICAgIDk5LDMyLDk3LDExNSwzMiwxMDUsMTE2LDExNSwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsOTUsOTUsCi0gICAgMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQwLDQxLDMyLDk3LDExNCwxMDMsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzgsMTIyLDksNjAsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDYyLDIxOCwKLSAgICAxMiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMjE4LDYsMTExLAotICAgIDExNCwxMDUsMTAzLDEwNSwxMTAsODQsMjE4LDEwLDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywKLSAgICAxMDMsMTAxLDExNCw1OSwwLDAsMCw0MSwxNSwxMTQsMTE1LDAsMCwwLDExNCwxNTcsCi0gICAgMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTIxLDAsMCwwLDIxOCwxMCw3NywKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksOTAsMTMsOTUsMTE1LDEwMSwxMTYsOTUsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDk3LDExNiwxMTYsMTE0LDIxOCwyNyw5NSwxMDMsMTAxLDExNiw5NSwxMTUsCi0gICAgMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsMTA4LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCwxMTUsMTE0LDkyLDAsMCwwLDExNCw5MywwLDAsMCwxMTQsCi0gICAgMTI3LDAsMCwwLDIxOCw5LDk1LDgwLDc5LDgwLDg1LDc2LDY1LDg0LDY5LDExNCwKLSAgICAxNTksMCwwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMzgsMCwwLDAsMjE4LDYsCi0gICAgOTcsMTEyLDExMiwxMDEsMTEwLDEwMCw0MSw5LDExNCwxMDYsMCwwLDAsOTAsOCwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTI3LDAsMCwwLDExNCwxNTYsMCwwLAotICAgIDAsMjE4LDQsMTE1LDExMiwxMDEsOTksMjE4LDEyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsCi0gICAgOTksMTA4LDk3LDExNSwxMTUsMjE4LDgsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLDExNSwxMTQsCi0gICAgMTU5LDAsMCwwLDkwLDcsMTAwLDEwNSwxMTQsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDIzLDExNSwxMTIsCi0gICAgMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsMTA4LDExMSw5OSwKLSAgICA5NywxMTYsMTA1LDExMSwxMTAsMjU0LDEsMCwwLDExNSw2MCwwLDAsMCwwLDEyLAotICAgIDEyLDQsNiwxLDE1LDIsMywxLDE5LDEsMTMsMSw1LDgsMjQsMSwKLSAgICA5LDMsMTIsMSwyMiwxLDIxLDEsMTUsMSw5LDEsNSwyLDQsMywKLSAgICAxMiwyLDE1LDEsMywxLDE5LDEsMTMsMSw1LDIsNiwxLDEyLDIsCi0gICAgOSwxLDE1LDEsNiwxLDE2LDEsMTYsMiwxMTQsMTY3LDAsMCwwLDk5LAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNjQsMCwwLDAsMTE1LDEyMSwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsCi0gICAgMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDkwLDQsCi0gICAgMCwxMDAsMywwLDkwLDUsMCwxMDAsNCwwLDkwLDYsMCwxMDEsNywwLAotICAgIDEwMCw1LDAsMTAwLDYsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSwKLSAgICA3LDAsMTAwLDcsMCwxMDAsOCwwLDEzMiwwLDAsMTMxLDEsMCw5MCw5LAotICAgIDAsMTAxLDcsMCwxMDAsOSwwLDEwMCw5LDAsMTAwLDEwLDAsMTAwLDExLDAsCi0gICAgMTMyLDIsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDcsMCwxMDAsOSwwLDEwMCwKLSAgICAxMiwwLDEwMCwxMywwLDEzMiwxLDAsMTMxLDEsMCw5MCwxMSwwLDEwMCw5LAotICAgIDAsODMsNDEsMTQsMjE4LDIxLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCi0gICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LAotICAgIDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDAsMTAxLDk5LDEwOCw5NywxMTQsCi0gICAgMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksCi0gICAgMTE1LDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTIyLDU5LDgzLDExMSwxMDIsCi0gICAgMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwKLSAgICAxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsCi0gICAgMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLAotICAgIDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDEyNSwxMjIsNjUsODMsMTExLDEwMiwxMTYsMTE5LDk3LAotICAgIDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLAotICAgIDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwKLSAgICAxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTI1LDkyLDY4LDEwMSw5OCwxMTcsMTAzLDcwLDk5LDIsMCwwLAotICAgIDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSw2NywwLDAsMCwxMjEsMjMsMCwxMTYsMCwwLDEwNiwxLDAsMTE2LAotICAgIDAsMCwxMDYsMiwwLDEyNCwxLDAsMTMxLDIsMCw4Myw4NywxMTAsMzcsMCwKLSAgICA0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDYyLDAsMSwxLDEsMTE2LDAsMCwKLSAgICAxMDYsMSwwLDExNiwwLDAsMTA2LDQsMCwxMjQsMSwwLDEzMSwyLDAsODMsCi0gICAgODksMTEwLDEsMCw4OCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsNSwyMTgsNywKLSAgICA5NSwxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5MCw3LDc5LDExMiwxMDEsMTEwLDc1LDEwMSwxMjEsCi0gICAgOTAsMTcsNzIsNzUsNjksODksOTUsNjcsODUsODIsODIsNjksNzgsODQsOTUsODUsCi0gICAgODMsNjksODIsMTE0LDQwLDAsMCwwLDkwLDE4LDcyLDc1LDY5LDg5LDk1LDc2LAotICAgIDc5LDY3LDY1LDc2LDk1LDc3LDY1LDY3LDcyLDczLDc4LDY5LDQxLDIsMjE4LDMsCi0gICAgOTksMTA4LDExNSwyMTgsMywxMDcsMTAxLDEyMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMTQsOTUsMTExLDExMiwxMDEsMTEwLDk1LDExNCwKLSAgICAxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzYsMiwwLDAsMTE1LDgsMCwwLDAsCi0gICAgMCwyLDMsMSwyMywxLDEzLDEsMTIyLDM2LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksCi0gICAgMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LAotICAgIDk1LDExMSwxMTIsMTAxLDExMCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDE2LDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwxNDMsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDExNCwyMSwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjUsMiwwLDExMCw5LDAsMTI0LDAsMCwKLSAgICAxMDYsMiwwLDEyNSwyLDAsMTI0LDIsMCwxMDYsMywwLDEwMCwxLDAsMTI0LAotICAgIDEsMCwxMDAsMiwwLDExNiw0LDAsMTA2LDUsMCwxMDAsMCwwLDEwMCwzLAotICAgIDAsMTMzLDIsMCwyNSwxMzEsMCwyLDEyNSwzLDAsMTIxLDQ3LDAsMTI0LDAsCi0gICAgMCwxMDYsNiwwLDEyNCwzLDAsMTMxLDEsMCwxNDMsMjUsMCwxMjUsNCwwLAotICAgIDExNiw3LDAsMTA2LDgsMCwxMjQsNCwwLDEwMCw0LDAsMTMxLDIsMCwxMjUsCi0gICAgNSwwLDg3LDEwMCwwLDAsODEsODIsODgsODcsMTEwLDIyLDAsNCwxMTYsOSwKLSAgICAwLDEwNywxMCwwLDExNCwxMzgsMCwxLDEsMSwxMDAsMCwwLDgzLDg5LDExMCwKLSAgICAxLDAsODgsMTI0LDUsMCw4Myw0MSw1LDc4LDExNCwxMjYsMCwwLDAsOTAsCi0gICAgMTEsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDExNCw4MCwwLDAsCi0gICAgMCwxMTQsMzAsMCwwLDAsNDEsMTAsMjE4LDExLDY4LDY5LDY2LDg1LDcxLDk1LAotICAgIDY2LDg1LDczLDc2LDY4LDIxOCwxOCw4Miw2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSwKLSAgICA3NSw2OSw4OSw5NSw2OCw2OSw2Niw4NSw3MSwyMTgsMTIsODIsNjksNzEsNzMsODMsCi0gICAgODQsODIsODksOTUsNzUsNjksODksMTE0LDQ3LDAsMCwwLDExNCw3LDAsMCwKLSAgICAwLDIxOCw3LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxNjksMCwwLDAsOTAsMTAsODEsMTE3LDEwMSwxMTQsMTIxLDg2LDk3LDEwOCwxMTcsMTAxLAotICAgIDExNCw0MCwwLDAsMCw0MSw2LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsCi0gICAgMCw5MCwxMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDk1LDEwNywxMDEsMTIxLDExNCwKLSAgICAxNzEsMCwwLDAsOTAsNCwxMDQsMTA3LDEwMSwxMjEsMjE4LDgsMTAyLDEwNSwxMDgsMTAxLAotICAgIDExMiw5NywxMTYsMTA0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDIxOCwxNiw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTE0LDEwMSwxMDMsCi0gICAgMTA1LDExNSwxMTYsMTE0LDEyMSw4MywyLDAsMCwxMTUsMjIsMCwwLDAsMCwyLAotICAgIDksMSwxMiwyLDksMSwxNSwxLDIyLDEsMywxLDE4LDEsMjksMSwKLSAgICAxMywxLDksMSwxMjIsMzgsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywKLSAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTE1LDEwMSw5NywKLSAgICAxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzgsOTksNCwwLAotICAgIDAsMCwwLDAsMCwwLDgsMCwwLDAsMTQsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDE1OCwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LAotICAgIDMxLDAsMTAwLDAsMCw4MywxMjEsMTQsMCwxMTYsMSwwLDEyNCw0LDAsMTMxLAotICAgIDEsMCwxLDg3LDExMCwyMiwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjksCi0gICAgMCwxLDEsMSwxMDAsMCwwLDgzLDg5LDExMCwxLDAsODgsMTIwLDgxLDAsCi0gICAgMTE2LDMsMCwxMzEsMCwwLDY4LDkzLDcwLDAsOTIsMiwwLDEyNSw1LDAsCi0gICAgMTI1LDYsMCwxMjQsNCwwLDEwNiw0LDAsMTE2LDUsMCwxMjQsNiwwLDEzMSwKLSAgICAxLDAsMTMxLDEsMCwxMTQsODAsMCwxMTYsNiwwLDEwNiw3LDAsMTI0LDEsCi0gICAgMCwxMjQsNSwwLDEyNCwxLDAsMTI0LDQsMCwxMzEsMiwwLDEwMCwxLDAsCi0gICAgMTI0LDQsMCwxMzEsMiwxLDEyNSw3LDAsMTI0LDcsMCw4MywxMTMsODAsMCwKLSAgICA4NywxMDAsMCwwLDgzLDQxLDIsNzgsMTE0LDE1OCwwLDAsMCw0MSw4LDExNCwKLSAgICAxNzgsMCwwLDAsMTE0LDM5LDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsMTYxLAotICAgIDAsMCwwLDExNCw5MiwwLDAsMCwxMTQsOTMsMCwwLDAsMTE0LDEyMSwwLAotICAgIDAsMCwyMTgsMTYsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDEsOCwxMTQsMTcwLDAsMCwwLDExNCwxMjYsMCwwLDAsCi0gICAgMTE0LDM1LDAsMCwwLDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwxMTYsMTE0LDE3NywwLAotICAgIDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LDE2NCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKLSAgICAyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTgsMiwwLDAsMTE1LAotICAgIDI2LDAsMCwwLDAsMiwxNSwxLDEyLDEsNCwxLDMsMSwxNCwxLAotICAgIDEzLDEsOSwxLDIyLDEsMjEsMSw5LDEsMTUsMSw5LDEsMTIyLDMxLAorICAgIDAsMTE2LDAsMCwxMDcsMywwLDExNCwxNzEsMCwxMDAsOCwwLDEwNiwxLDAsCisgICAgMTI0LDIsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LDgsMCwxMTYsMiwwLDEwNiwKKyAgICAzLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNCwwLDEyNCwKKyAgICA4LDAsMTI0LDQsMCwxNDEsMSwwLDEzMCwxLDAsMTEwLDEyNSwwLDExNiw1LAorICAgIDAsMTI0LDYsMCwxMzEsMSwwLDEwMCw1LDAsMTA3LDMsMCwxMTQsMjM1LDAsCisgICAgMTAwLDEwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDgsMCwxMTYsCisgICAgMiwwLDEwNiwzLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsCisgICAgNiwwLDEyNCw4LDAsMTMxLDEsMCwxMzAsMSwwLDExMCw2MSwwLDExNiw1LAorICAgIDAsMTI0LDcsMCwxMzEsMSwwLDEwMCw1LDAsMTA3LDMsMCwxMTQsNDAsMSwKKyAgICAxMDAsMTEsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLDExNiwKKyAgICAyLDAsMTA2LDMsMCwxMDAsOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwKKyAgICA2LDAsMTI0LDgsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDEsMCwxMDAsMSwKKyAgICAwLDEwNyw5LDAsMTE0LDIzOCwxLDEyMSwyMCwwLDExNiw3LDAsMTI0LDEsMCwKKyAgICAxMDAsMTIsMCwyNSwxMzEsMSwwLDEyNSw5LDAsODcsMTEwLDE4LDAsNCwxMTYsCisgICAgOCwwLDEwNywxMCwwLDExNCw5MiwxLDEsMSwxLDg5LDExMCw2NSwwLDg4LAorICAgIDExNiw5LDAsMTI0LDYsMCwxMzEsMSwwLDEyNCw5LDAsMTA3LDMsMCwxMTQsCisgICAgMTU3LDEsMTAwLDEzLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDgsCisgICAgMCwxMTYsMiwwLDEwNiwzLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsCisgICAgMSwxMTYsNCwwLDEyNCw4LDAsMTI0LDQsMCwxNDEsMSwwLDEzMCwxLDAsCisgICAgMTIxLDE4LDAsMTI0LDEsMCwxMDAsMTQsMCwyNSwxMDAsMTUsMCw2NCwxMjUsMTAsCisgICAgMCw4NywxMTAsMTgsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LDE5NSwxLDEsCisgICAgMSwxLDg5LDExMCw0MywwLDg4LDExNiw5LDAsMTI0LDcsMCwxMzEsMSwwLAorICAgIDEyNCwxMCwwLDEwNywzLDAsMTE0LDIzOCwxLDExNiw0LDAsMTAwLDEzLDAsMTA2LAorICAgIDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI0LDQsMCwxNDEsMSwwLDEzMCwxLAorICAgIDAsMTI0LDAsMCwxMDAsNywwLDEwMCwxLDAsMTMzLDIsMCwyNSw4Myw0MSwKKyAgICAxNiw5NywxMjIsMSwwLDAsODYsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTEyLDk3LDExNSwxMTUsMTAxLDEwMCw0NSwxMDUsMTEwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDk3LDEwMyw5NywxMDUsMTEwLDExNSwxMTYsMzIsMTE1LDExMSwxMTcsMTE0LAorICAgIDk5LDEwMSw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsNDAsMTA1LDEwMiwxMCwzMiwzMiwzMiwKKyAgICAzMiwxMDMsMTA1LDExOCwxMDEsMTEwLDQxLDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LAorICAgIDExNCwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLAorICAgIDEwMCwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5OSwKKyAgICAxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDk5LDExMSwxMDksMTEyLDEwNSwKKyAgICAxMDgsMTAxLDQwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTExLAorICAgIDExNiwxMDQsMTAxLDExNCwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMTE1LDMyLDk3LAorICAgIDExNCwxMDEsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDExMCwxMDQsOTcsMTEwLAorICAgIDk5LDEwMSwzMiwxMDEsMTE0LDExNCwxMTEsMTE0LDMyLDExNCwxMDEsMTEyLDExMSwxMTQsMTE2LDEwNSwKKyAgICAxMTAsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwzMiwxMTksCisgICAgMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDk3LDEwMywxMDUsOTksMzIsMTEwLDExNywKKyAgICAxMDksOTgsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTExLDExNCwxMTQsMTAxLDk5LAorICAgIDExNiwzMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMTYsCisgICAgMTExLDMyLDk4LDEwMSwzMiwxMTUsMTE2LDk3LDEwOCwxMDEsNDYsMzIsNjksNzksNzAsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwzMiwxMTksCisgICAgMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMDUsMTE1LDMyLAorICAgIDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMTAsMzIsMzIsMzIsMzIsCisgICAgMTE2LDExNCwxMTcsMTEwLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDc4LDExNCw5OCwwLDAsMCwxMjIsMTAsNjAsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwKKyAgICAxMDEsNjIsMTE0LDM1LDAsMCwwLDExNCwxMiwwLDAsMCwyMzMsOCwwLDAsCisgICAgMCwyMzMsMTIsMCwwLDAsMTIyLDMwLDk4LDk3LDEwMCwzMiwxMDksOTcsMTAzLDEwNSwKKyAgICA5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsCisgICAgNTgsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDIsMTIzLDEyNSwxMjIsNDMsMTE0LDEwMSw5Nyw5OSwKKyAgICAxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsCisgICAgOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsCisgICAgMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNDgsMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwKKyAgICAzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwKKyAgICAxMTAsMTAzLDMyLDExNSwxMDUsMTIyLDEwMSwzMiwxMTEsMTAyLDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwyMTgsNSwxMDksMTE2LDEwNSwxMDksMTAxLAorICAgIDEyMiwyNiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMTYsCisgICAgOTcsMTA4LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMjMsMzMsMTE0LDEyNSwyMTgsNCwxMTUsMTA1LAorICAgIDEyMiwxMDEsMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsMTI3LDMsMCw0MSwxMCwyMTgsCisgICAgMTIsNzcsNjUsNzEsNzMsNjcsOTUsNzgsODUsNzcsNjYsNjksODIsMTE0LDQ3LDAsCisgICAgMCwwLDExNCwxMTQsMCwwLDAsMjE4LDE2LDk1LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsCisgICAgMTAxLDk1LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDExNCw5OSwwLDAsMCwxMTQsMzEsCisgICAgMCwwLDAsMjE4LDgsNjksNzksNzAsNjksMTE0LDExNCwxMTEsMTE0LDExNCwxNCwwLAorICAgIDAsMCwyMTgsOCw3NSwxMDEsMTIxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTksMCwwLAorICAgIDAsNDEsMTEsMTE0LDUzLDAsMCwwLDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAorICAgIDk1LDExNSwxMTYsOTcsMTE2LDExNSwxMTQsOTgsMCwwLDAsMTE0LDM1LDAsMCwwLAorICAgIDkwLDExLDEwMSwxMjAsOTksOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsNSwxMDksCisgICAgOTcsMTAzLDEwNSw5OSw5MCwxMywxMTQsOTcsMTE5LDk1LDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LAorICAgIDk3LDEwOSwxMTIsOTAsOCwxMTQsOTcsMTE5LDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsNzUsMCwKKyAgICAwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwKKyAgICAyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsMTA1LDEyMiwxMDEsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDI1LDk1LDExOCwKKyAgICA5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLAorICAgIDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMTUzLDEsMCwwLDExNSw3NiwwLDAsMCwKKyAgICAwLDExLDYsMSwxMiwxLDEzLDMsNiwxLDEyLDEsMTAsMSwxNiwxLAorICAgIDE2LDEsMTYsMSwxMiwxLDE4LDEsMTYsMSwxOCwxLDE4LDEsMTUsMSwKKyAgICAxNiwxLDE1LDEsMTgsMSwxNSwxLDE2LDEsMTIsMSwxMiwxLDMsMSwKKyAgICAyMCwxLDEzLDEsNSwyLDE4LDEsMTUsMSwxNiwxLDE1LDEsMywxLAorICAgIDE4LDEsMTMsMSw1LDIsMTgsMSwxNSwxLDksMSwxMTQsMTM1LDAsMCwKKyAgICAwLDk5LDQsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDYsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDExNSwwLDAsMCwxMTYsMCwwLDEwNiwxLAorICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsMTE2LDIsMCwxMjQsNCwwLAorICAgIDExNiwzLDAsMTMxLDIsMCwxMTQsNzgsMCwxMTYsNCwwLDEwNiw1LDAsMTAwLAorICAgIDEsMCwxMjQsMiwwLDEzMSwyLDAsMSwxMjQsMywwLDEwMCwyLDAsMTA3LAorICAgIDksMCwxMTQsNzQsMCwxMTYsNiwwLDEwNiw3LDAsMTI0LDQsMCwxMjQsMywKKyAgICAwLDEzMSwyLDAsMSwxMjQsNCwwLDgzLDExNiw4LDAsMTAwLDMsMCwxMDYsCisgICAgOSwwLDEyNCwyLDAsMTMxLDEsMCwxMDAsNCwwLDEyNCwxLDAsMTAwLDUsCisgICAgMCwxMjQsMiwwLDEzMSwxLDIsMTMwLDEsMCwxMDAsMiwwLDgzLDQxLDYsCisgICAgMTIyLDYwLDY3LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDMyLDk3LDExNSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDk4LAorICAgIDEyMSwzMiw5NSwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSwKKyAgICA5OSwxMTEsMTAwLDEwMSw5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDQwLDQxLDQ2LDEyMiwyMSwKKyAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExNCwxMTEsMTA5LAorICAgIDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwyMyw3OCwxMTEsMTEwLDQ1LDk5LDExMSwxMDAsMTAxLAorICAgIDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDExNCwKKyAgICA5OCwwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMTAsMjE4LDcsMTA5LDk3LDExNCwKKyAgICAxMTUsMTA0LDk3LDEwOCw5MCw1LDEwOCwxMTEsOTcsMTAwLDExNSwyMTgsMTAsMTA1LDExNSwxMDUsCisgICAgMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwyMTgsMTAsOTUsOTksMTExLDEwMCwxMDEsOTUsMTE2LAorICAgIDEyMSwxMTIsMTAxLDExNCwxMTQsMCwwLDAsMTE0LDEyOSwwLDAsMCwyMTgsNCw5NSwKKyAgICAxMDUsMTA5LDExMiw5MCwxNiw5NSwxMDIsMTA1LDEyMCw5NSw5OSwxMTEsOTUsMTAyLDEwNSwxMDgsCisgICAgMTAxLDExMCw5NywxMDksMTAxLDExNCw5OSwwLDAsMCwxMTQsNDcsMCwwLDAsNDEsCisgICAgNSwxMTQsNTMsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCw4OSwwLDAsMCwKKyAgICAxMTQsOTAsMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDksCisgICAgMTEyLDEwNSwxMDgsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIwOCwxLDAsCisgICAgMCwxMTUsMTYsMCwwLDAsMCwyLDE1LDEsMTUsMSwxNiwxLDEyLDEsCisgICAgMTYsMSw0LDIsMTgsMSwxMTQsMTQxLDAsMCwwLDExNCw1OSwwLDAsMCwKKyAgICA5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSw3NiwwLDAsMCwxMTYsMCwwLDExNiwxLDAsCisgICAgMTMxLDEsMCwxMjUsMywwLDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLDEyNCwKKyAgICAxLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsMiwwLDExNiwKKyAgICAzLDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwxLDAsMSwxMjQsMywwLDEwNiwKKyAgICAyLDAsMTE2LDQsMCwxMDYsNSwwLDEyNCwwLDAsMTMxLDEsMCwxMzEsMSwKKyAgICAwLDEsMTI0LDMsMCw4Myw0MSwxLDEyMiw4MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LAorICAgIDEwMSwzMiw5NywzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsCisgICAgMTA1LDExMCwxMTYsMTExLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTE3LDExNiwzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLDQ1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsNDEsNiwyMTgsOSw5OCwxMjEsCisgICAgMTE2LDEwMSw5NywxMTQsMTE0LDk3LDEyMSwxMTQsMTI4LDAsMCwwLDIxOCw2LDEwMSwxMjAsCisgICAgMTE2LDEwMSwxMTAsMTAwLDExNCwxNywwLDAsMCwxMTQsMTM2LDAsMCwwLDkwLDUsCisgICAgMTAwLDExNywxMDksMTEyLDExNSw0MSw0LDExNCwxNDAsMCwwLDAsMTE0LDEyNiwwLDAsCisgICAgMCwxMTQsMTM0LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwMCwKKyAgICAxMDEsOTUsMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMjAsMSwwLAorICAgIDAsMTE1LDEwLDAsMCwwLDAsMywxMiwxLDE5LDEsMTksMSwyMiwxLAorICAgIDExNCwxNDQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwKKyAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODksMCwwLDAsMTAwLAorICAgIDEsMCwxMDAsMiwwLDEwOCwwLDAsMTI1LDEsMCwxMTYsMSwwLDEwNiwyLAorICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEwNiwzLDAsMTI1LDIsMCwxMjQsMSwwLAorICAgIDEwNiw0LDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTE2LDEsMCwxMDYsCisgICAgNSwwLDEwMCwyLDAsMTAwLDMsMCwxMzEsMiwwLDEyNSw0LDAsMTI0LDQsCisgICAgMCwxMDYsNiwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsMywwLDEwMCwxLDAsCisgICAgMjUsMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDEyMSw2OCwxMDEsOTksMTExLAorICAgIDEwMCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwKKyAgICAxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwKKyAgICAxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NSwxMTAsCisgICAgMTA1LDExOCwxMDEsMTE0LDExNSw5NywxMDgsMzIsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDMyLAorICAgIDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwKKyAgICAxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw0NiwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMTQsNTksMCwwLDAsNzgsODQsNDEsNywyMTgsOCwKKyAgICAxMTYsMTExLDEwNywxMDEsMTEwLDEwNSwxMjIsMTAxLDExNCw0OSwwLDAsMCw5MCw3LDY2LAorICAgIDEyMSwxMTYsMTAxLDExNSw3Myw3OSw5MCw4LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSwKKyAgICA5MCwxNSwxMDAsMTAxLDExNiwxMDEsOTksMTE2LDk1LDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLAorICAgIDEwMyw5MCwyNSw3MywxMTAsOTksMTE0LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTA4LDc4LDEwMSwKKyAgICAxMTksMTA4LDEwNSwxMTAsMTAxLDY4LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE4LDYsMTAwLDEwMSwKKyAgICA5OSwxMTEsMTAwLDEwMSw0MSw1LDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDk4LAorICAgIDEyMSwxMTYsMTAxLDExNSwxMTQsMTQ1LDAsMCwwLDkwLDIxLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDk1LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSwKKyAgICAyMTgsOCwxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsOTAsMTUsMTEwLDEwMSwxMTksMTA4LAorICAgIDEwNSwxMTAsMTAxLDk1LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMywxMDAsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjMwLDEsMCwwLDExNSwxMCwwLAorICAgIDAsMCwwLDUsMTIsMSwxOCwxLDE1LDEsMTgsMSwxMTQsMTQ5LDAsMCwKKyAgICAwLDExNCwxMjAsMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsCisgICAgMTEwLDExNSw5OSwyLDAsMCwwLDIsMCwwLDAsOSwwLDAsMCwxOSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsODksMSwwLDAsMTI0LDEsMCwxMDAsCisgICAgMSwwLDEwNyw4LDAsMTE0LDczLDAsMTAwLDIsMCwxMjUsMSwwLDExNiwwLAorICAgIDAsMTI0LDIsMCwxMDAsMywwLDEzMSwyLDAsMTE0LDczLDAsMTIxLDE5LDAsCisgICAgMTI0LDIsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsMSwwLDg3LAorICAgIDExMCwxOCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNzIsMCwxLDEsMSwKKyAgICA4OSwxMTAsMSwwLDg4LDExNiwzLDAsMTA2LDQsMCwxMjQsMCwwLDEyNCwyLAorICAgIDAsMTAwLDQsMCwxMjQsMSwwLDEzMSwyLDEsMTI1LDQsMCwxMDAsNSwwLAorICAgIDEyNCw0LDAsOTUsNSwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwKKyAgICAxOTQsMCwxMjAsNzMsMCwxMTYsNiwwLDEzMSwwLDAsNjgsOTMsNTgsMCw5MiwKKyAgICAyLDAsMTI1LDUsMCwxMjUsNiwwLDEyNCwxLDAsMTA2LDcsMCwxMTYsOCwKKyAgICAwLDEyNCw2LDAsMTMxLDEsMCwxMzEsMSwwLDExNCwxMjgsMCwxMjQsNSwwLAorICAgIDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwwLDEyNSwyLDAsMTI0LDIsMCwxMjQsCisgICAgNCwwLDk1LDksMCw4MCwxMTMsMTI4LDAsODcsMTAwLDEsMCw4MywxMjQsMywKKyAgICAwLDExNiwxMCwwLDEwNyw4LDAsMTE0LDIzLDEsMTE2LDAsMCwxMjQsMiwwLAorICAgIDEwMCw2LDAsMTMxLDIsMCwxMTQsMzIsMSwxMjEsMTksMCwxMjQsMiwwLDEwNiwKKyAgICAxMSwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsNywwLDg3LDExMCwxOCwwLDQsCisgICAgMTE2LDIsMCwxMDcsMTAsMCwxMTQsNCwxLDEsMSwxLDg5LDExMywzMiwxLAorICAgIDg4LDEyNCw3LDAsMTE0LDMyLDEsMTAzLDAsMCwxMjQsNCwwLDk1LDEyLDAsCisgICAgMTEwLDksMCwxMjQsMywwLDEyNCw0LDAsOTUsMTIsMCwxMjQsNCwwLDEwNiwKKyAgICAxMiwwLDEwMywwLDAsMTA3LDIsMCwxMTQsODUsMSwxMjQsMSwwLDExNCw4NSwKKyAgICAxLDExNiwxMywwLDEyNCwxLDAsMTMxLDEsMCwxMDAsNywwLDI1LDEyNSw4LAorICAgIDAsMTI0LDQsMCwxMDYsMTIsMCwxMDYsMTQsMCwxMjQsOCwwLDEzMSwxLDAsCisgICAgMSwxMjQsNCwwLDgzLDQxLDgsOTcsNjEsMSwwLDAsODIsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwKKyAgICAzMiwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICA4NCwxMTEsMzIsMTA1LDExMCwxMDAsMTA1LDk5LDk3LDExNiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywKKyAgICAzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDQsMzIsMTE1LDEwMSwxMTYsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCwKKyAgICA5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDMyLDExNiwxMTEsMzIsCisgICAgOTcsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDExMSwxMDIsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwKKyAgICAxMTEsMTE0LDEyMSwzMiwxMTIsOTcsMTE2LDEwNCwxMTUsNDYsMzIsMzIsNjUsMTEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDEwMSwxMDksMTEyLDExNiwxMjEsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDEwNSwxMTUsCisgICAgMzIsMTE1LDExNywxMDIsMTAyLDEwNSw5OSwxMDUsMTAxLDExMCwxMTYsNDQsMzIsMTE2LDEwNCwxMTEsCisgICAgMTE3LDEwMywxMDQsMzIsMTA1LDExNiwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTExLDExNiwxMDQsMTAxLAorICAgIDExNCwxMTksMTA1LDExNSwxMDEsMzIsMTE3LDExNSwxMDEsMTAyLDExNywxMDgsMzIsMTE2LDExMSwzMiwKKyAgICAxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTUsCisgICAgMTIxLDExNSwxMTYsMTAxLDEwOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTA5LDExNywxMTUsMTE2LDMyLDExNiw5NywxMDcsMTAxLAorICAgIDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDMyLDk3LDExNSwzMiwxMDUsMTE2LDExNSwzMiwxMTEsCisgICAgMTEwLDEwOCwxMjEsMzIsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQwLDQxLDMyLDk3LAorICAgIDExNCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDksNjAsMTE3LDExMCwxMDcsCisgICAgMTEwLDExMSwxMTksMTEwLDYyLDIxOCwxMiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLAorICAgIDk3LDEwOSwxMDEsMjE4LDYsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsODQsMjE4LDEwLDEwNSwxMTUsCisgICAgOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDExNCw1OSwwLDAsMCw0MSwxNSwxMTQsCisgICAgMTA4LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMTQsCisgICAgMCwwLDAsMjE4LDEwLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw5MCwKKyAgICAxMyw5NSwxMTUsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwxMTQsMjE4LDI3LAorICAgIDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwMiwKKyAgICAxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsOTIsMCwwLDAsCisgICAgMTE0LDkzLDAsMCwwLDExNCwxMjAsMCwwLDAsMjE4LDksOTUsODAsNzksODAsCisgICAgODUsNzYsNjUsODQsNjksMTE0LDE1MywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwKKyAgICAzOCwwLDAsMCwyMTgsNiw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDQxLDksMTE0LDk4LAorICAgIDAsMCwwLDkwLDgsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDEyMCwwLAorICAgIDAsMCwxMTQsMTUwLDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCwxMiwxMDgsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk5LDEwOCw5NywxMTUsMTE1LDIxOCw4LDExNSwxMTcsMTAyLAorICAgIDEwMiwxMDUsMTIwLDEwMSwxMTUsMTE0LDE1MywwLDAsMCw5MCw3LDEwMCwxMDUsMTE0LDExMCwKKyAgICA5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCisgICAgMCwwLDIxOCwyMywxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDI0NywxLDAsMCwxMTUsCisgICAgNjAsMCwwLDAsMCwxMiwxMiw0LDYsMSwxNSwyLDMsMSwxOSwxLAorICAgIDEzLDEsNSw4LDI0LDEsOSwzLDEyLDEsMjIsMSwyMSwxLDE1LDEsCisgICAgOSwxLDUsMiw0LDMsMTIsMiwxNSwxLDMsMSwxOSwxLDEzLDEsCisgICAgNSwyLDYsMSwxMiwyLDksMSwxNSwxLDYsMSwxNiwxLDE2LDIsCisgICAgMTE0LDE2MSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCw1LDAsMCwwLDY0LDAsMCwwLDExNSwxMjEsMCwwLDAsMTAxLAorICAgIDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLAorICAgIDAsMTAwLDIsMCw5MCw0LDAsMTAwLDMsMCw5MCw1LDAsMTAwLDQsMCwKKyAgICA5MCw2LDAsMTAxLDcsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCwxMzEsCisgICAgMSwwLDkwLDgsMCwxMDEsNywwLDEwMCw3LDAsMTAwLDgsMCwxMzIsMCwKKyAgICAwLDEzMSwxLDAsOTAsOSwwLDEwMSw3LDAsMTAwLDksMCwxMDAsOSwwLAorICAgIDEwMCwxMCwwLDEwMCwxMSwwLDEzMiwyLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSwKKyAgICA3LDAsMTAwLDksMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMSwwLDEzMSwxLAorICAgIDAsOTAsMTEsMCwxMDAsOSwwLDgzLDQxLDE0LDIxOCwyMSw4NywxMDUsMTEwLDEwMCwKKyAgICAxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCwxMjIsNjIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsCisgICAgMTAwLDEwMSw5OSwxMDgsOTcsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICA4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSwzMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLAorICAgIDQ2LDEyMiw1OSw4MywxMTEsMTAyLDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwKKyAgICAxMTEsMTEwLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwKKyAgICAxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwxMTUsOTIsMTIzLDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsMTIyLDY1LAorICAgIDgzLDExMSwxMDIsMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsCisgICAgODAsMTIxLDExNiwxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsCisgICAgMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSwKKyAgICA5MiwxMjMsMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDEyNSw5Miw2OCwxMDEsOTgsMTE3LAorICAgIDEwMyw3MCw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsNjcsMCwwLDAsMTIxLDIzLDAsMTE2LAorICAgIDAsMCwxMDYsMSwwLDExNiwwLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLAorICAgIDAsODMsODcsMTEwLDM3LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCw2MiwwLAorICAgIDEsMSwxLDExNiwwLDAsMTA2LDEsMCwxMTYsMCwwLDEwNiw0LDAsMTI0LAorICAgIDEsMCwxMzEsMiwwLDgzLDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSwKKyAgICAxLDc4LDQxLDUsMjE4LDcsOTUsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsNyw3OSwKKyAgICAxMTIsMTAxLDExMCw3NSwxMDEsMTIxLDkwLDE3LDcyLDc1LDY5LDg5LDk1LDY3LDg1LDgyLAorICAgIDgyLDY5LDc4LDg0LDk1LDg1LDgzLDY5LDgyLDExNCw0MCwwLDAsMCw5MCwxOCwKKyAgICA3Miw3NSw2OSw4OSw5NSw3Niw3OSw2Nyw2NSw3Niw5NSw3Nyw2NSw2Nyw3Miw3MywKKyAgICA3OCw2OSw0MSwyLDIxOCwzLDk5LDEwOCwxMTUsMjE4LDMsMTA3LDEwMSwxMjEsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE0LDk1LAorICAgIDExMSwxMTIsMTAxLDExMCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDY5LDIsMCwKKyAgICAwLDExNSw4LDAsMCwwLDAsMiwzLDEsMjMsMSwxMywxLDEyMiwzNiwKICAgICA4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksCi0gICAgMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNDUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwKLSAgICAxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsMSwKLSAgICAwLDEwNyw5LDAsMTE0LDM3LDAsMTI0LDMsMCwxMDYsMSwwLDgzLDEwMCwxLAotICAgIDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxMDgsNzAsMTA1LDExMCwxMDAsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsCi0gICAgMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxODEsMCwwLDAsMTE0LDEyNywKLSAgICAwLDAsMCw0MSw0LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsCi0gICAgMzUsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNCwyLDAsMCwxMTUsOCwwLDAsMCwwLDcsCi0gICAgMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsCi0gICAgMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwxMTIsMCwwLDAsCi0gICAgMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LAotICAgIDE3NSwwLDAsMCwxMTQsMTc0LDAsMCwwLDExNCwxNzMsMCwwLDAsMjE4LDExLAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNzIsMCwwLDAsCi0gICAgMTE0LDE3OCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE2OCwwLDAsMCw2NCwyLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMTIsMiw2LDMsNiwzLDYsMiw2LDIsMTgsNywxOCwxNSwzLAotICAgIDEsMjEsMTUsMywxLDExNCwxNjgsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwxMDAsOSwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDgzLDQxLDExLDIxOCwxMyw5NSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLDgzLDY2LDk3LDExNSwKLSAgICAxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsCi0gICAgMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwKLSAgICAzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsODMsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsODgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwxLDAsMTAwLDEsMCwyNSwKLSAgICAxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCwxMDAsMywwLDI1LDEyNSwzLDAsMTI0LDEsMCwxMDYsMywwLDEwMCwKLSAgICAyLDAsMTMxLDEsMCwxMDAsNCwwLDI1LDEyNSw0LDAsMTI0LDMsMCwxMDAsCi0gICAgNSwwLDEwNywyLDAsMTExLDg3LDAsMTI0LDQsMCwxMDAsNSwwLDEwNywzLAotICAgIDAsODMsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwKLSAgICAxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwzMiw5OSwxMDQsMTAxLAotICAgIDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCi0gICAgMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LAotICAgIDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0NiwxMTIsCi0gICAgMTIxLDM5LDQ2LDExNCwyOSwwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDU5LDAsCi0gICAgMCwwLDExNCw1NiwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsCi0gICAgOTUsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMzQsMCwKLSAgICAwLDAsMTE0LDMyLDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LAotICAgIDAsMCwwLDExNCw5NCwwLDAsMCw5MCwxMywxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsMTA4LDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwxNTksMCwwLDAsMTMzLDIsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMywyNSwxLDIyLDEsMTksMSwxMjIsMjQsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsCi0gICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwKLSAgICAxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE0MSwyLDAsCi0gICAgMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LAotICAgIDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsCi0gICAgMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTQsMCwxMTYsMiwwLDEwMCwyLAotICAgIDAsMTA2LDMsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCwxMzEsMSwwLAotICAgIDEzMCwxLDAsMTE2LDQsMCwxMDYsNSwwLDExNiw2LDAsMTI0LDIsMCwxMjQsCi0gICAgMSwwLDEwNiw3LDAsMTMxLDMsMCwxLDEwMCwxLDAsODMsNDEsMywxMjIsCi0gICAgMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExOSwKLSAgICAxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0MCw0MSwzMiwxMTQsCi0gICAgMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsOCwyMTgsOCwxMDMsCi0gICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTEyLDAsMCwwLDExNCwxMDcsMCwwLAotICAgIDAsMTE0LDQ3LDAsMCwwLDExNCwxMjEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LAotICAgIDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LAotICAgIDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCwxMTgsMCwwLAotICAgIDAsNDEsMywxMTQsMTA4LDAsMCwwLDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNCwxNDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDE0NCwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDE4LDEsMTIsMSwKLSAgICA5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwKLSAgICAxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsCi0gICAgMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDEyMSwKLSAgICAwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxNTIsMiwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzgsNDEsOCwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLAotICAgIDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxNTksMCwwLDAsCi0gICAgMTE0LDE4NiwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxOTMsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE4NCwwLDAsMCwxMjgsMiwwLDAsMTE1LDEwLDAsMCwKLSAgICAwLDEyLDMsNiwyLDEyLDgsMTIsMywxMiw4LDExNCwxODQsMCwwLDAsCi0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLAotICAgIDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLAotICAgIDMsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDUsCi0gICAgMCwxMDAsNiwwLDEzMiwwLDAsOTAsNSwwLDEwMCw3LDAsMTAwLDgsMCwKLSAgICAxMzIsMCwwLDkwLDYsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwwLDAsOTAsCi0gICAgNywwLDEwMCwxMSwwLDEwMCwxOCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLAotICAgIDEsOTAsOCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLDAsOTAsOSwwLAotICAgIDEwMCwxNywwLDgzLDQxLDE5LDIxOCwxMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwwLAotICAgIDAsMTMwLDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE3OCw3OSwxMTIsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMDUsMTA5LDEwMSwzMiw0MCwKLSAgICA5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMTAsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLAotICAgIDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsMTE1LDMyLDczLDc5LDY5LAotICAgIDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LDEwMSwzMiwxMDQsOTcsMTEwLAotICAgIDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICAxLDIxOCw3LDczLDc5LDY5LDExNCwxMTQsMTExLDExNCw0MSwyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksCi0gICAgMTAxLDE1OCwyLDAsMCwxMTUsMiwwLDAsMCwwLDYsMTIyLDIzLDgzLDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLDAsMCwxMDAsCi0gICAgMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTA1LDEsCi0gICAgMCw4Myw0MSwyLDk3LDE3MCwxLDAsMCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LAotICAgIDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsCi0gICAgMTEwLDEwMywzMiw5NywzMiwxMDksMTAxLDExNiw5NywxMDAsOTcsMTE2LDk3LDMyLDEwMCwxMDUsCi0gICAgOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKLSAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMTE2LDExMSwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsNDAsMTE1LDExNiwxMTQsNDEsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgODAsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsMzIsMTA3LDEwMSwxMjEsMTE1LDU4LDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDEwOSwxMTYsMTA1LDEwOSwxMDEsMzksCi0gICAgMzIsNDAsMTA5LDk3LDExMCwxMDAsOTcsMTE2LDExMSwxMTQsMTIxLDQxLDMyLDEwNSwxMTUsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE2LDEwNSwxMDksMTAxLAotICAgIDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMTEsMTAyLDMyLDEwOCw5NywxMTUsMTE2LDMyLDExNSwxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsOTksCi0gICAgMTExLDEwMCwxMDEsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDU5LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDExNSwxMDUsMTIyLAotICAgIDEwMSwzOSwzMiw0MCwxMTEsMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsNDEsMzIsMTA1LDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTA1LDExMCwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDMyLDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsCi0gICAgMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTYsMTExLDMyLDExNCwxMDEsCi0gICAgOTcsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAxMTUsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsCi0gICAgMTE1LDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LAotICAgIDEwMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTQsMTMzLDAsMCwwLDQxLDEsMTE0LDE5NiwwLDAsMCw0MSwKLSAgICAyLDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCwKLSAgICA5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTY2LDIsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMTEsMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCw4Myw0MSwxLDEyMiwyMjgsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsCi0gICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsCi0gICAgMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LAotICAgIDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsCi0gICAgMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLAotICAgIDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwKLSAgICAxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwKLSAgICAxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LAotICAgIDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTE2LAotICAgIDExNCw5NywxMTAsMTE1LDEwMiwxMDEsMTE0LDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsCi0gICAgMTExLDExMCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwyMTgsOCwKLSAgICAxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQxLDQsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgOTAsMCwwLDAsOTAsMTAsOTksOTcsOTksMTA0LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICAxMTQsNTMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDE1LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsMTc5LDIsMCwwLDExNSwyLDAsMCwwLDAsOCwKLSAgICAxMjIsMjgsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk5LDMsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNTAsCi0gICAgNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsCi0gICAgMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsCi0gICAgOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwKLSAgICAxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLAotICAgIDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSw0NiwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsNCwwLDAsMCw0MSwzLDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTk4LDAsMCwKLSAgICAwLDE4OSwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjEsODMsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LAotICAgIDk3LDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDE2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxMDUsMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyMSwxOSwwLDEyNCwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCw4NywxMTAsNTgsMCwKLSAgICA0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxMjUsNCwwLDEsMTIyLAotICAgIDI2LDAsMTE2LDMsMCwxMDAsMSwwLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwKLSAgICAxLDEyNCw0LDAsMTMwLDIsMCw4Nyw4OSwxMDAsMywwLDEwMCwzLDAsMTI1LAotICAgIDQsMCwxMjYsNCwwLDg4LDExMCwxLDAsODgsMTE2LDQsMCwxMjQsMywwLAotICAgIDEzMSwxLDAsODMsNDEsNCwxMjIsNTIsNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLAotICAgIDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwxMjIsMzksMTE1LDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwKLSAgICAxMDgsMTAxLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsMTAxLDExNiw5NSwxMDAsCi0gICAgOTcsMTE2LDk3LDQwLDQxLDExNCwxMDYsMCwwLDAsNzgsNDEsNSwxMTQsMTU3LDAsCi0gICAgMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsMTE0LDQwLDAsMCwKLSAgICAwLDExNCwxMDcsMCwwLDAsMTE0LDE1NSwwLDAsMCw0MSw1LDExNCwxMDgsMCwKLSAgICAwLDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE1MywwLDAsCi0gICAgMCwyMTgsMywxMDEsMTIwLDk5LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDE5NiwyLDAsMCwxMTUsMTQsMCwwLDAsMCwyLDE1LDEsMywxLAotICAgIDE5LDEsMTgsMSw5LDEsMzEsMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMTE0LDI5LDAsMCwKLSAgICAwLDk5LDMsMCwwLDAsMSwwLDAsMCw0LDAsMCwwLDksMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMSwwLDEwMCwyLDAsCi0gICAgMTAwLDMsMCwxMDAsNCwwLDEyNCwzLDAsMTMxLDQsMiw4Myw0MSw1LDEyMiwKLSAgICAxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwKLSAgICAzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLAotICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTAwLDk3LDExNiw5NywKLSAgICAzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsOTksOTcsMTEwLDMyLDk4LAotICAgIDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMTYsMTIxLDExMiwKLSAgICAxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsNDEsCi0gICAgMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTQsMTg5LDAsMCwwLDIxOCwxMiwxMDAsMTExLDExMCwxMTYsOTUsMTA1LAotICAgIDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw2OCwwLDAsMCw0MSwzLDExNCwxMjEsCi0gICAgMCwwLDAsMTE0LDE4OCwwLDAsMCwyMTgsNyw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LAotICAgIDEwMSw0MSw0LDExNCwxMDgsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwzNSwwLAotICAgIDAsMCwxMTQsMjAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNiwKLSAgICAxMTEsOTUsOTksMTExLDEwMCwxMDEsMjA2LDIsMCwwLDExNSw0LDAsMCwwLDAsCi0gICAgNSwyMSwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSw5OSwxMTEsMTAwLDEwMSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwwLDAsNDMsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDE3NCwxLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwxMjUsMywwLDEyMSwKLSAgICAxNiwwLDExNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw0LDAsODcsMTEwLAotICAgIDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2MywwLDEsMSwxLDEwMCwKLSAgICAxLDAsMTI1LDQsMCw4OSwxMTAsMjAyLDAsODgsMTIxLDE5LDAsMTI0LDAsMCwKLSAgICAxMDYsMywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsNSwwLDg3LDExMCwxOCwwLAotICAgIDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsMTAzLDAsMSwxLDEsODksMTEwLDE2MiwKLSAgICAwLDg4LDExNiw1LDAsMTI0LDUsMCwxMDAsMiwwLDI1LDEzMSwxLDAsMTI1LAotICAgIDMsMCwxMjEsMTksMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDQsMCwxMzEsMSwKLSAgICAwLDEyNSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCwKLSAgICAxNTksMCwxLDEsMSw4OSwxMTAsMTA2LDAsODgsMTIxLDM0LDAsMTE2LDgsMCwKLSAgICAxMjQsNiwwLDEwMCwzLDAsMTI0LDUsMCwxMDAsNCwwLDEyNCwxLDAsMTAwLAotICAgIDUsMCwxMjQsNCwwLDEzMSwxLDMsMTI1LDcsMCw4NywxMTAsMjQsMCw0LAotICAgIDExNiw5LDAsMTE2LDEwLDAsMTAyLDIsMCwxMDcsMTAsMCwxMTQsMjIwLDAsMSwKLSAgICAxLDEsODksMTEwLDQ1LDAsODgsMTE2LDExLDAsMTAwLDYsMCwxMjQsNCwwLAotICAgIDEyNCwyLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEyNCw3LDAsMTAwLDQsMCwKLSAgICAxMjQsMSwwLDEwMCw3LDAsMTI0LDQsMCwxMDAsOCwwLDEyNCwyLDAsMTMxLAotICAgIDEsMyw4MywxMjQsMCwwLDEwNiw2LDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwKLSAgICA4LDAsMTI0LDAsMCwxMDYsMTMsMCwxMjQsOCwwLDEyNCwyLDAsMTMxLDIsCi0gICAgMCwxMjUsOSwwLDExNiwxMSwwLDEwMCw5LDAsMTI0LDIsMCwxMzEsMiwwLAotICAgIDEsMTE2LDE0LDAsMTA2LDE1LDAsMTIsMTE0LDE3MCwxLDEyNCw0LDAsMTAwLDEsCi0gICAgMCwxMDcsOSwwLDExNCwxNzAsMSwxMjQsMywwLDEwMCwxLDAsMTA3LDksMCwKLSAgICAxMTQsMTcwLDEsMTE2LDE2LDAsMTI0LDksMCwxMjQsMywwLDExNiwxNywwLDEyNCwKLSAgICA4LDAsMTMxLDEsMCwxMzEsMywwLDEyNSw2LDAsMTIxLDM2LDAsMTI0LDAsCi0gICAgMCwxMDYsMTgsMCwxMjQsMiwwLDEyNCw0LDAsMTI0LDYsMCwxMzEsMywwLAotICAgIDEsMTE2LDExLDAsMTAwLDEwLDAsMTI0LDQsMCwxMzEsMiwwLDEsODcsMTEwLAotICAgIDE4LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCwxNjksMSwxLDEsMSw4OSwKLSAgICAxMTAsMSwwLDg4LDEyNCw5LDAsODMsNDEsMTEsMTIyLDE5MCw2NywxMTEsMTEwLDk5LAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTExLDExMiwxMDEsMTEwLDk1LDExNCwxMDEsMTAzLDEwNSwKKyAgICAxMTUsMTE2LDExNCwxMjEsOTksMiwwLDAsMCwwLDAsMCwwLDYsMCwwLAorICAgIDAsMTYsMCwwLDAsNjcsMCwwLDAsMTE1LDE0MywwLDAsMCwxMjQsMCwKKyAgICAwLDEwNiwwLDAsMTE0LDIxLDAsMTI0LDAsMCwxMDYsMSwwLDEyNSwyLDAsCisgICAgMTEwLDksMCwxMjQsMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjQsMiwwLDEwNiwKKyAgICAzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTE2LDQsMCwxMDYsNSwKKyAgICAwLDEwMCwwLDAsMTAwLDMsMCwxMzMsMiwwLDI1LDEzMSwwLDIsMTI1LDMsCisgICAgMCwxMjEsNDcsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMzEsMSwwLAorICAgIDE0MywyNSwwLDEyNSw0LDAsMTE2LDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLAorICAgIDQsMCwxMzEsMiwwLDEyNSw1LDAsODcsMTAwLDAsMCw4MSw4Miw4OCw4NywKKyAgICAxMTAsMjIsMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDEzOCwwLDEsMSwxLAorICAgIDEwMCwwLDAsODMsODksMTEwLDEsMCw4OCwxMjQsNSwwLDgzLDQxLDUsNzgsCisgICAgMTE0LDExOSwwLDAsMCw5MCwxMSwxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LAorICAgIDExMSwxMTAsMTE0LDgwLDAsMCwwLDExNCwzMCwwLDAsMCw0MSwxMCwyMTgsMTEsCisgICAgNjgsNjksNjYsODUsNzEsOTUsNjYsODUsNzMsNzYsNjgsMjE4LDE4LDgyLDY5LDcxLAorICAgIDczLDgzLDg0LDgyLDg5LDk1LDc1LDY5LDg5LDk1LDY4LDY5LDY2LDg1LDcxLDIxOCwKKyAgICAxMiw4Miw2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSw3NSw2OSw4OSwxMTQsNDcsMCwKKyAgICAwLDAsMTE0LDcsMCwwLDAsMjE4LDcsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLAorICAgIDExNCwxNjYsMCwwLDAsMTE0LDE2MywwLDAsMCw5MCwxMCw4MSwxMTcsMTAxLDExNCwKKyAgICAxMjEsODYsOTcsMTA4LDExNywxMDEsMTE0LDQwLDAsMCwwLDQxLDYsMTE0LDE2NCwwLAorICAgIDAsMCwxMTQsMTE5LDAsMCwwLDkwLDEyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwKKyAgICAxMjEsOTUsMTA3LDEwMSwxMjEsMTE0LDE2NSwwLDAsMCw5MCw0LDEwNCwxMDcsMTAxLDEyMSwKKyAgICAyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEyLDk3LDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDExNSwxMDEsOTcsMTE0LAorICAgIDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc2LDIsMCwwLDExNSwKKyAgICAyMiwwLDAsMCwwLDIsOSwxLDEyLDIsOSwxLDE1LDEsMjIsMSwKKyAgICAzLDEsMTgsMSwyOSwxLDEzLDEsOSwxLDEyMiwzOCw4NywxMDUsMTEwLDEwMCwKKyAgICAxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0Niw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsCisgICAgMTE0LDEyMSw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwKKyAgICAxNCwwLDAsMCw2NywwLDAsMCwxMTUsMTU4LDAsMCwwLDEyNCwwLDAsCisgICAgMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDQsMCwxMjQsNCwwLDEwMCwKKyAgICAwLDAsMTA3LDgsMCwxMTQsMzEsMCwxMDAsMCwwLDgzLDEyMSwxNCwwLDExNiwKKyAgICAxLDAsMTI0LDQsMCwxMzEsMSwwLDEsODcsMTEwLDIyLDAsNCwxMTYsMiwKKyAgICAwLDEwNywxMCwwLDExNCw2OSwwLDEsMSwxLDEwMCwwLDAsODMsODksMTEwLAorICAgIDEsMCw4OCwxMjAsODEsMCwxMTYsMywwLDEzMSwwLDAsNjgsOTMsNzAsMCwKKyAgICA5MiwyLDAsMTI1LDUsMCwxMjUsNiwwLDEyNCw0LDAsMTA2LDQsMCwxMTYsCisgICAgNSwwLDEyNCw2LDAsMTMxLDEsMCwxMzEsMSwwLDExNCw4MCwwLDExNiw2LAorICAgIDAsMTA2LDcsMCwxMjQsMSwwLDEyNCw1LDAsMTI0LDEsMCwxMjQsNCwwLAorICAgIDEzMSwyLDAsMTAwLDEsMCwxMjQsNCwwLDEzMSwyLDEsMTI1LDcsMCwxMjQsCisgICAgNywwLDgzLDExMyw4MCwwLDg3LDEwMCwwLDAsODMsNDEsMiw3OCwxMTQsMTUyLAorICAgIDAsMCwwLDQxLDgsMTE0LDE3MiwwLDAsMCwxMTQsMzksMCwwLDAsMTE0LAorICAgIDQwLDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDkyLDAsMCwwLDExNCw5MywKKyAgICAwLDAsMCwxMTQsMTE0LDAsMCwwLDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsCisgICAgMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0MSw4LDExNCwxNjQsMCwwLAorICAgIDAsMTE0LDExOSwwLDAsMCwxMTQsMzUsMCwwLDAsMjE4LDYsMTE2LDk3LDExNCwKKyAgICAxMDMsMTAxLDExNiwxMTQsMTcxLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE2MCwwLAorICAgIDAsMCwxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDIxOCw5LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSwKKyAgICA5OSw5MSwyLDAsMCwxMTUsMjYsMCwwLDAsMCwyLDE1LDEsMTIsMSwKKyAgICA0LDEsMywxLDE0LDEsMTMsMSw5LDEsMjIsMSwyMSwxLDksMSwKKyAgICAxNSwxLDksMSwxMjIsMzEsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywKKyAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLAorICAgIDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDQ1LDAsMCwwLDEyNCwKKyAgICAwLDAsMTA2LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsMywKKyAgICAwLDEyNCwzLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwzNywwLDEyNCwzLDAsCisgICAgMTA2LDEsMCw4MywxMDAsMSwwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsMTA4LAorICAgIDcwLDEwNSwxMTAsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLAorICAgIDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwKKyAgICAxMjEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsCisgICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLAorICAgIDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywKKyAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsNDEsMiwxMTQsCisgICAgMTc1LDAsMCwwLDExNCwxMjAsMCwwLDAsNDEsNCwxMTQsMTY0LDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLAorICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMDcsMiwwLDAsMTE1LAorICAgIDgsMCwwLDAsMCw3LDE4LDEsMTIsMSw3LDIsMTIyLDMzLDg3LDEwNSwKKyAgICAxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLAorICAgIDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwKKyAgICAxMiwxMTQsMTA1LDAsMCwwLDExNCwxMDQsMCwwLDAsMTE0LDEwNiwwLDAsMCwKKyAgICAxMTQsMTA3LDAsMCwwLDExNCwxNjksMCwwLDAsMTE0LDE2OCwwLDAsMCwxMTQsCisgICAgMTY3LDAsMCwwLDIxOCwxMSw5OSwxMDgsOTcsMTE1LDExNSwxMDksMTAxLDExNiwxMDQsMTExLAorICAgIDEwMCwxMTQsMTY2LDAsMCwwLDExNCwxNzIsMCwwLDAsMTE0LDE3NSwwLDAsMCwKKyAgICAxMTQsMTc2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNjIsMCwwLDAsNTcsMiwKKyAgICAwLDAsMTE1LDIwLDAsMCwwLDEyLDIsNiwzLDYsMyw2LDIsNiwKKyAgICAyLDE4LDcsMTgsMTUsMywxLDIxLDE1LDMsMSwxMTQsMTYyLDAsMCwwLAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsNjQsMCwwLDAsMTE1LDcwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLAorICAgIDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLAorICAgIDMsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsCisgICAgMCw5MCw1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLAorICAgIDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCw4MywKKyAgICA0MSwxMSwyMTgsMTMsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksCisgICAgMTE1LDEyMiw4Myw2Niw5NywxMTUsMTAxLDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExMSwxMDIsCisgICAgMzIsOTksMTExLDEwOSwxMDksMTExLDExMCwzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTAsMTAxLDEwMSwKKyAgICAxMDAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsOTgsMTExLDExNiwxMDQsMzIsODMsMTExLDExNywxMTQsCisgICAgOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiw5NywxMTAsMTAwLDEwLDMyLDMyLDMyLAorICAgIDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCw1LAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDg4LDAsMCwwLAorICAgIDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMzEsCisgICAgMSwwLDEwMCwxLDAsMjUsMTI1LDIsMCwxMjQsMiwwLDEwNiwyLDAsMTAwLAorICAgIDIsMCwxMDAsMSwwLDEzMSwyLDAsMTAwLDMsMCwyNSwxMjUsMywwLDEyNCwKKyAgICAxLDAsMTA2LDMsMCwxMDAsMiwwLDEzMSwxLDAsMTAwLDQsMCwyNSwxMjUsCisgICAgNCwwLDEyNCwzLDAsMTAwLDUsMCwxMDcsMiwwLDExMSw4NywwLDEyNCw0LAorICAgIDAsMTAwLDUsMCwxMDcsMywwLDgzLDQxLDYsMTIyLDE0MSw2NywxMTEsMTEwLDk5LAogICAgIDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsCiAgICAgMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLAotICAgIDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTE0LDEwMSwxMTMsMTE3LAotICAgIDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsCi0gICAgMTE2LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLAotICAgIDEwMCw0NiwzMiw4NCwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw0NCwzMiwxMTUsMTAxLAotICAgIDExNiw5NSwxMDAsOTcsMTE2LDk3LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5NywxMDgsMTE1LDExMSwKLSAgICAzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsMTMzLDAsMCwwLAotICAgIDExNCwxMzgsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTIyLAotICAgIDEzLDEyMywxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMjMsMTI1LDExNCw4OSwKLSAgICAwLDAsMCwxMTQsOTAsMCwwLDAsMTIyLDE5LDk5LDExMSwxMDAsMTAxLDMyLDExMSwKLSAgICA5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDEyNSwxMjIsMTAsMTE5LAotICAgIDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwxOSwxMTQsMTU3LDAsMCwwLAotICAgIDExNCw3OSwwLDAsMCwxMTQsNjYsMCwwLDAsMTE0LDE5NywwLDAsMCwxMTQsCi0gICAgMTk1LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjAwLDAsMCwwLDExNCw0MCwKLSAgICAwLDAsMCwxMTQsMTQxLDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEzNiwwLAotICAgIDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDIwNiwwLDAsCi0gICAgMCwxMTQsNywwLDAsMCwyMTgsMTksMTAwLDExMSwxMTAsMTE2LDk1LDExOSwxMTQsMTA1LAotICAgIDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDE1MCwwLDAsMCwKLSAgICAxMTQsMzEsMCwwLDAsMTE0LDE5OSwwLDAsMCw0MSwxMCwxMTQsMTA4LDAsMCwKLSAgICAwLDExNCwxMjYsMCwwLDAsMTE0LDkwLDAsMCwwLDExNCwxMzksMCwwLDAsCi0gICAgMTE0LDg5LDAsMCwwLDIxOCwyLDExNSwxMTYsMTE0LDUzLDAsMCwwLDIxOCwxMCwKLSAgICA5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTAwLDk3LDExNiw5NywxMTQsMTUzLDAsMCwwLDkwLAotICAgIDExLDk5LDExMSwxMDAsMTAxLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsMCwwLAotICAgIDIxNCwyLDAsMCwxMTUsNzgsMCwwLDAsMCw3LDE1LDEsNiwxLDMsCi0gICAgMSwxNiwxLDEzLDEsMTEsMiwzLDEsMTksMSwxMywxLDUsMiwxNiwKLSAgICAxLDMsMSwxOSwxLDEzLDEsNSwyLDMsMSw5LDEsMTIsMSwxMywKLSAgICAxLDE5LDEsNSwyLDksMSw3LDEsMTUsMSw2LDEsNywxLDE1LAotICAgIDEsMTgsMSwxMywxLDIyLDEsMTIsMSw5LDEsMTUsMSwzLDEsMTksCi0gICAgMSwxNywxLDEzLDEsNSwxLDEyMiwyMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDc4LDExNCwKLSAgICA4NywwLDAsMCw0MSwxMCwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5OSwwLDAsMCwxMTQsMTk4LDAsMCwwLDExNCwyMDIsMCwwLDAsMTE0LDIwNiwKLSAgICAwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTQsMCwwLAotICAgIDAsMTU2LDIsMCwwLDExNSwxNCwwLDAsMCwxMiwyLDEyLDgsMTIsMTMsCi0gICAgMTIsMTAsMTIsNywxMiwxMCwxOCw4LDExNCwxOTQsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwwLDAsCi0gICAgMCwwLDExNSwxMTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCwKLSAgICA5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwKLSAgICAwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsCi0gICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAxLDcsMCwKLSAgICAxMzUsMCwwLDEwMiwxLDAsMTAwLDgsMCwxMDAsOSwwLDEzNCwwLDAsMTMxLAotICAgIDEsMCw5MCw4LDAsMTAxLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwKLSAgICAwLDEzMSwxLDAsOTAsOSwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsCi0gICAgOTAsMTAsMCwxMzUsMCwwLDgzLDQxLDE0LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExOSwxMDQsCi0gICAgMTA1LDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LDExMSwxMTYsMTExLDk5LAotICAgIDExMSwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDEwLAotICAgIDMyLDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsMTAxLDQ2LDk5LDMsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLAotICAgIDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMSwwLDgzLDQxLDIsCi0gICAgMTIyLDc1LDY3LDk3LDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw3OCw0MSwyLAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDMsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg1LDAsMCwwLDE1LAotICAgIDMsMCwwLDExNSw0LDAsMCwwLDAsMyw5LDEsMTIyLDE5LDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsCi0gICAgOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTA2LDAsMCwxMDcsMiwwLDExMSwzMywwLDEyNCwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LDIsMCw4Myw0MSwxLDc4LAotICAgIDQxLDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsOTUsMTE0LDExOCwwLAotICAgIDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMjE4LDUsMTExLDExNiwxMDQsMTAxLDExNCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsCi0gICAgNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDIxLDMsMCwwLDExNSw0LDAsMCwwLAotICAgIDAsMSwxOCwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsMSw3OCw0MSwzLAotICAgIDIxOCw0LDEwNCw5NywxMTUsMTA0LDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwKLSAgICAyNSwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDE5LDcwLDEwNSwxMDgsCi0gICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwKLSAgICAwLDMsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLDAsMTE2LDEsMCwKLSAgICAxMjQsMCwwLDEzMSwyLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwxLDAsODMsCi0gICAgNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwxMCwKKyAgICA5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwKKyAgICA5OCwxMjEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTA1LDExMCwxMDMsMzIsMTA1LDEwMiwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMDMsMTAxLDExNiw5NSwKKyAgICAxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTA0LDk3LDExNSwzMiw5NywzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwzOSw5NSw5NSwxMDUsMTEwLAorICAgIDEwNSwxMTYsOTUsOTUsNDYsMTEyLDEyMSwzOSw0NiwxMTQsMjksMCwwLDAsMTE0LDU4LAorICAgIDAsMCwwLDExNCw1OSwwLDAsMCwxMTQsNTYsMCwwLDAsMjE4LDgsOTUsCisgICAgOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQxLDQsMTE0LDM4LDAsMCwwLDExNCwxNTEsCisgICAgMCwwLDAsMTE0LDM0LDAsMCwwLDExNCwzMiwwLDAsMCw0MSw1LDExNCwKKyAgICAxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsOTQsMCwwLDAsOTAsMTMsCisgICAgMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDk1LDk4LDk3LDExNSwxMDEsOTAsOSwxMTYsCisgICAgOTcsMTA1LDEwOCw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTUzLDAsMCwwLDEyNiwyLDAsMCwKKyAgICAxMTUsOCwwLDAsMCwwLDMsMjUsMSwyMiwxLDE5LDEsMTIyLDI0LDk1LAorICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0NiwxMDUsMTE1LDk1LAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwKKyAgICAwLDEwMCwxLDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiwKKyAgICA5NywxMTcsMTA4LDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LAorICAgIDExMSwxMTAsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLAorICAgIDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMjE4LDEzLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMzQsMiwwLDAsMTE1LDAsMCwwLDAsMTIyLDI3LDk1LDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0Niw5OSwxMTQsMTAxLDk3LAorICAgIDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsCisgICAgMCwwLDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODAsCisgICAgMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA2LDEsMCwxMzEsCisgICAgMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDU0LAorICAgIDAsMTE2LDIsMCwxMDAsMiwwLDEwNiwzLDAsMTI0LDEsMCwxMDYsMSwwLAorICAgIDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDExNiw0LDAsMTA2LDUsMCwxMTYsCisgICAgNiwwLDEyNCwyLDAsMTI0LDEsMCwxMDYsNywwLDEzMSwzLDAsMSwxMDAsCisgICAgMSwwLDgzLDQxLDMsMTIyLDE5LDY5LDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsNzgsMTIyLDUyLDk5LDk3LDExMCwKKyAgICAxMTAsMTExLDExNiwzMiwxMDgsMTExLDk3LDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTAzLDEwMSwxMTYsOTUsOTksMTExLAorICAgIDEwMCwxMDEsNDAsNDEsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDc4LDExMSwxMTAsCisgICAgMTAxLDQxLDgsMjE4LDgsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsMTE0LDEwNSwwLAorICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDQ3LDAsMCwwLDExNCwxMTQsMCwwLAorICAgIDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsCisgICAgOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsCisgICAgMTAxLDk5LDExNCwxMTEsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLDIxOCw2LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNDAsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEzNywyLDAsMCwxMTUsMTAsMCwwLDAsCisgICAgMCwyLDE4LDEsMTIsMSw5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwKKyAgICAwLDAsMTA2LDEsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwKKyAgICAxLDEyMiwyNiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCisgICAgMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsNDEsMiwxMTQsCisgICAgMTE0LDAsMCwwLDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwxMDksNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwxMTksCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMjE4LDExLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE0NSwKKyAgICAyLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI1LDk1LDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSw4LDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLAorICAgIDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE1MywwLDAsCisgICAgMCwxMTQsMTgwLDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDE4NywwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwxMTQsMTc4LDAsMCwwLDEyMSwyLDAsMCwxMTUsMTAsMCwKKyAgICAwLDAsMTIsMyw2LDIsMTIsOCwxMiwzLDEyLDgsMTE0LDE3OCwwLDAsCisgICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw0LDAsCisgICAgMCwwLDY0LDAsMCwwLDExNSwxMDYsMCwwLDAsMTAxLDAsMCw5MCwxLAorICAgIDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsCisgICAgOTAsMywwLDEwMCwzLDAsMTAwLDQsMCwxMzIsMCwwLDkwLDQsMCwxMDAsCisgICAgNSwwLDEwMCw2LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDcsMCwxMDAsOCwKKyAgICAwLDEzMiwwLDAsOTAsNiwwLDEwMCw5LDAsMTAwLDEwLDAsMTMyLDAsMCwKKyAgICA5MCw3LDAsMTAwLDExLDAsMTAwLDE4LDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLAorICAgIDAsMSw5MCw4LDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsMCw5MCw5LAorICAgIDAsMTAwLDE3LDAsODMsNDEsMTksMjE4LDEyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LAorICAgIDAsMCwxMzAsMSwwLDEwMCwxLDAsODMsNDEsMiwxMjIsMTc4LDc5LDExMiwxMTYsCisgICAgMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExNiwxMDQsOTcsCisgICAgMTE2LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAorICAgIDEwMCwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDEwNSwxMDksMTAxLDMyLAorICAgIDQwLDk3LDExMCwzMiwxMDUsMTEwLDExNiw0MSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwKKyAgICAxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDQ0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCw0NiwxMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LDEwMSwxMTUsMzIsNzMsNzksCisgICAgNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTgsMTAxLDMyLDEwNCw5NywKKyAgICAxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LAorICAgIDQxLDEsMjE4LDcsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDQxLDIsMTE0LDEwMCwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDEwOSwxMTYsMTA1LAorICAgIDEwOSwxMDEsMTUyLDIsMCwwLDExNSwyLDAsMCwwLDAsNiwxMjIsMjMsODMsCisgICAgMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDksMTE2LDEwNSwxMDksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE5LDAsMCwwLAorICAgIDEwMCwxLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMDUsCisgICAgMSwwLDgzLDQxLDIsOTcsMTcwLDEsMCwwLDc5LDExMiwxMTYsMTA1LDExMSwxMTAsCisgICAgOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDEwNSwxMTAsMTAzLDMyLDk3LDMyLDEwOSwxMDEsMTE2LDk3LDEwMCw5NywxMTYsOTcsMzIsMTAwLAorICAgIDEwNSw5OSwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksCisgICAgMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwxMTYsMTExLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCwzMiw0MCwxMTUsMTE2LDExNCw0MSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiw4MCwxMTEsMTE1LDExNSwxMDUsOTgsMTA4LDEwMSwzMiwxMDcsMTAxLDEyMSwxMTUsNTgsMTAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDUsMzIsMzksMTA5LDExNiwxMDUsMTA5LDEwMSwKKyAgICAzOSwzMiw0MCwxMDksOTcsMTEwLDEwMCw5NywxMTYsMTExLDExNCwxMjEsNDEsMzIsMTA1LDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwxMTYsMTA1LDEwOSwKKyAgICAxMDEsMTE1LDExNiw5NywxMDksMTEyLDMyLDExMSwxMDIsMzIsMTA4LDk3LDExNSwxMTYsMzIsMTE1LAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwKKyAgICAxMTAsNTksMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDUsMzIsMzksMTE1LDEwNSwKKyAgICAxMjIsMTAxLDM5LDMyLDQwLDExMSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCw0MSwzMiwxMDUsCisgICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDUsMTIyLDEwMSwzMiwxMDUsMTEwLDMyLDk4LDEyMSwKKyAgICAxMTYsMTAxLDExNSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTE0LAorICAgIDEwMSw5NywxMDAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsCisgICAgMTAxLDExNSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LAorICAgIDEwMSwxMTUsMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsCisgICAgOTgsMTAxLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDExNCwxMjYsMCwwLDAsNDEsMSwxMTQsMTkwLDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsCisgICAgMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSwxNjAsMiwwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwxMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsOTksNCwwLDAsMCwKKyAgICAwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMTYsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwyLDAsMTI0LDMsCisgICAgMCwxMzEsMiwwLDgzLDQxLDEsMTIyLDIyOCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LAorICAgIDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LAorICAgIDExNCwxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwKKyAgICAxMTUsNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywKKyAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwKKyAgICAxMTEsMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsCisgICAgMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDg0LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsCisgICAgMTAxLDExNCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwKKyAgICAxMTYsMTE0LDk3LDExMCwxMTUsMTAyLDEwMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LAorICAgIDEwNSwxMTEsMTEwLDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDIxOCwKKyAgICA4LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsNCwxMTQsMTAwLDAsMCwwLAorICAgIDExNCw5MCwwLDAsMCw5MCwxMCw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExMiw5NywxMTYsCisgICAgMTA0LDExNCw1MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNSwwLDAsMCwyMTgsMTUsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxNzMsMiwwLDAsMTE1LDIsMCwwLDAsMCwKKyAgICA4LDEyMiwyOCw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTksCisgICAgMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLAorICAgIDE1MCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwKKyAgICAzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LAorICAgIDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMzIsMTE2LDExMSwzMiw5NywzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsCisgICAgNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsCisgICAgMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDExNCw0LDAsMCwwLDQxLDMsMTE0LAorICAgIDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTIsMCwKKyAgICAwLDAsMTgzLDIsMCwwLDExNSwwLDAsMCwwLDEyMiwyMSw4MywxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCw5NywKKyAgICAxMTYsOTcsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMTYsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDEwNSwwLDAsMCwxMjQsMCwwLDEwNiwKKyAgICAwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTIxLDE5LDAsMTI0LDAsCisgICAgMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDg3LDExMCw1OCwKKyAgICAwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsOTQsMCwxLDEyNSw0LDAsMSwKKyAgICAxMjIsMjYsMCwxMTYsMywwLDEwMCwxLDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwKKyAgICAxLDEsMTI0LDQsMCwxMzAsMiwwLDg3LDg5LDEwMCwzLDAsMTAwLDMsMCwKKyAgICAxMjUsNCwwLDEyNiw0LDAsODgsMTEwLDEsMCw4OCwxMTYsNCwwLDEyNCwzLAorICAgIDAsMTMxLDEsMCw4Myw0MSw0LDEyMiw1Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LAorICAgIDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEyMiwzOSwxMTUsCisgICAgMTExLDExNywxMTQsOTksMTAxLDMyLDExMCwxMTEsMTE2LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LAorICAgIDk4LDEwOCwxMDEsMzIsMTE2LDEwNCwxMTQsMTExLDExNywxMDMsMTA0LDMyLDEwMywxMDEsMTE2LDk1LAorICAgIDEwMCw5NywxMTYsOTcsNDAsNDEsMTE0LDk4LDAsMCwwLDc4LDQxLDUsMTE0LDE1MSwKKyAgICAwLDAsMCwyMTgsOCwxMDMsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDExNCw0MCwwLAorICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDE0OSwwLDAsMCw0MSw1LDExNCwxMDAsCisgICAgMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE0NywwLAorICAgIDAsMCwyMTgsMywxMDEsMTIwLDk5LDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDE5MCwyLDAsMCwxMTUsMTQsMCwwLDAsMCwyLDE1LDEsMywKKyAgICAxLDE5LDEsMTgsMSw5LDEsMzEsMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksCisgICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsCisgICAgOTksMTAxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMTE0LDI5LDAsCisgICAgMCwwLDk5LDMsMCwwLDAsMSwwLDAsMCw0LDAsMCwwLDksCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsMTA2LAorICAgIDEsMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMSwwLDEwMCwyLAorICAgIDAsMTAwLDMsMCwxMDAsNCwwLDEyNCwzLDAsMTMxLDQsMiw4Myw0MSw1LAorICAgIDEyMiwxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTAwLAorICAgIDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsCisgICAgMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTAwLDk3LDExNiwKKyAgICA5NywzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsOTksOTcsMTEwLDMyLAorICAgIDk4LDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMTYsMTIxLAorICAgIDExMiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsCisgICAgNDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwxMTQsMTgzLDAsMCwwLDIxOCwxMiwxMDAsMTExLDExMCwxMTYsOTUsCisgICAgMTA1LDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw2OCwwLDAsMCw0MSwzLDExNCwKKyAgICAxMTQsMCwwLDAsMTE0LDE4MiwwLDAsMCwyMTgsNyw5OSwxMTEsMTA5LDExMiwxMDUsCisgICAgMTA4LDEwMSw0MSw0LDExNCwxMDAsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwzNSwKKyAgICAwLDAsMCwxMTQsMTk3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw1LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LAorICAgIDExNiwxMTEsOTUsOTksMTExLDEwMCwxMDEsMjAwLDIsMCwwLDExNSw0LDAsMCwwLAorICAgIDAsNSwyMSwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSw5OSwxMTEsMTAwLAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwwLDAsNDMsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDE4MywxLDAsMCwxMjQsMCwwLDEwNiwwLAorICAgIDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwxMjUsMywwLAorICAgIDEyMSwxNiwwLDExNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw0LDAsODcsCisgICAgMTEwLDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2MywwLDEsMSwxLAorICAgIDEwMCwxLDAsMTI1LDQsMCw4OSwxMTAsMjA1LDAsODgsMTIxLDE5LDAsMTI0LDAsCisgICAgMCwxMDYsMywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsNSwwLDg3LDExMCwxOCwKKyAgICAwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsMTAzLDAsMSwxLDEsODksMTEwLAorICAgIDE2NSwwLDg4LDExNiw1LDAsMTI0LDUsMCwxMDAsMiwwLDI1LDEzMSwxLDAsCisgICAgMTI1LDMsMCwxMjEsMTksMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDQsMCwxMzEsCisgICAgMSwwLDEyNSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLAorICAgIDExNCwxNTksMCwxLDEsMSw4OSwxMTAsMTA5LDAsODgsMTIxLDM0LDAsMTE2LDgsCisgICAgMCwxMjQsNiwwLDEwMCwzLDAsMTI0LDUsMCwxMDAsNCwwLDEyNCwxLDAsCisgICAgMTAwLDUsMCwxMjQsNCwwLDEzMSwxLDMsMTI1LDcsMCw4NywxMTAsMjQsMCwKKyAgICA0LDExNiw5LDAsMTE2LDEwLDAsMTAyLDIsMCwxMDcsMTAsMCwxMTQsMjIwLDAsCisgICAgMSwxLDEsODksMTEwLDQ4LDAsODgsMTE2LDExLDAsMTA2LDEyLDAsMTAwLDYsCisgICAgMCwxMjQsNCwwLDEyNCwyLDAsMTMxLDMsMCwxLDExNiwxMywwLDEyNCw3LAorICAgIDAsMTAwLDQsMCwxMjQsMSwwLDEwMCw3LDAsMTI0LDQsMCwxMDAsOCwwLAorICAgIDEyNCwyLDAsMTMxLDEsMyw4MywxMjQsMCwwLDEwNiw2LDAsMTI0LDIsMCwKKyAgICAxMzEsMSwwLDEyNSw4LDAsMTI0LDAsMCwxMDYsMTQsMCwxMjQsOCwwLDEyNCwKKyAgICAyLDAsMTMxLDIsMCwxMjUsOSwwLDExNiwxMSwwLDEwNiwxMiwwLDEwMCw5LAorICAgIDAsMTI0LDIsMCwxMzEsMiwwLDEsMTE2LDE1LDAsMTA2LDE2LDAsMTIsMTE0LAorICAgIDE3OSwxLDEyNCw0LDAsMTAwLDEsMCwxMDcsOSwwLDExNCwxNzksMSwxMjQsMywKKyAgICAwLDEwMCwxLDAsMTA3LDksMCwxMTQsMTc5LDEsMTE2LDE3LDAsMTI0LDksMCwKKyAgICAxMjQsMywwLDExNiwxOCwwLDEyNCw4LDAsMTMxLDEsMCwxMzEsMywwLDEyNSwKKyAgICA2LDAsMTIxLDM5LDAsMTI0LDAsMCwxMDYsMTksMCwxMjQsMiwwLDEyNCw0LAorICAgIDAsMTI0LDYsMCwxMzEsMywwLDEsMTE2LDExLDAsMTA2LDEyLDAsMTAwLDEwLAorICAgIDAsMTI0LDQsMCwxMzEsMiwwLDEsODcsMTEwLDE4LDAsNCwxMTYsMiwwLAorICAgIDEwNywxMCwwLDExNCwxNzgsMSwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCw5LAorICAgIDAsODMsNDEsMTEsMTIyLDE5MCw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKKyAgICAzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsCisgICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw4MiwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwKKyAgICAxMDEsOTksMTExLDEwMCwxMDEsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsCisgICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwzMiw4NCwxMTEsMzIsCisgICAgMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw0NCwzMiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LAorICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5NywxMDgsMTE1LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwKKyAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiw3OCwxMTQsMTI2LDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LAorICAgIDk4LDAsMCwwLDExNCwzNSwwLDAsMCwxMjIsMTMsMTIzLDEyNSwzMiwxMDksOTcsCisgICAgMTE2LDk5LDEwNCwxMDEsMTE1LDMyLDEyMywxMjUsMTE0LDg5LDAsMCwwLDExNCw5MCwwLAorICAgIDAsMCwxMjIsMTksOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLAorICAgIDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMTI1LDEyMiwxMCwxMTksMTE0LDExMSwxMTYsMTAxLDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDQxLDIwLDExNCwxNTEsMCwwLDAsMTE0LDc5LDAsMCwwLDExNCwKKyAgICA2NiwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxODksMCwwLDAsMTE0LDE0LAorICAgIDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCwxMzUsMCwKKyAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMzAsMCwwLDAsMTE0LDExNCwwLDAsCisgICAgMCwxMTQsMTI5LDAsMCwwLDExNCwxNDEsMCwwLDAsMTE0LDIwMCwwLDAsMCwKKyAgICAxMTQsNywwLDAsMCwyMTgsMTksMTAwLDExMSwxMTAsMTE2LDk1LDExOSwxMTQsMTA1LDExNiwKKyAgICAxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDE0NCwwLDAsMCwxMTQsCisgICAgMzEsMCwwLDAsMTE0LDE5MywwLDAsMCw0MSwxMCwxMTQsMTAwLDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDkwLDAsMCwwLDExNCwxMzMsMCwwLDAsMTE0LAorICAgIDg5LDAsMCwwLDIxOCwyLDExNSwxMTYsMTE0LDUzLDAsMCwwLDIxOCwxMCw5OCwKKyAgICAxMjEsMTE2LDEwMSwxMTUsOTUsMTAwLDk3LDExNiw5NywxMTQsMTQ3LDAsMCwwLDkwLDExLAorICAgIDk5LDExMSwxMDAsMTAxLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTgxLDAsMCwwLDIwOCwKKyAgICAyLDAsMCwxMTUsNzgsMCwwLDAsMCw3LDE1LDEsNiwxLDMsMSwKKyAgICAxNiwxLDEzLDEsMTEsMiwzLDEsMTksMSwxMywxLDUsMiwxNiwxLAorICAgIDMsMSwxOSwxLDEzLDEsNSwyLDMsMSw5LDEsMTIsMSwxMywxLAorICAgIDE5LDEsNSwyLDEyLDEsNywxLDE1LDEsNiwxLDcsMSwxNSwxLAorICAgIDE4LDEsMTYsMSwyMiwxLDEyLDEsOSwxLDE1LDEsMywxLDE5LDEsCisgICAgMjAsMSwxMywxLDUsMSwxMjIsMjEsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw3OCwxMTQsODcsCisgICAgMCwwLDAsNDEsMTAsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwKKyAgICAxMDYsMCwwLDAsMTE0LDE5MCwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxOTMsCisgICAgMCwwLDAsMTE0LDE5MiwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwyMDAsMCwKKyAgICAwLDAsMTE0LDE4MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg4LDAsMCwwLAorICAgIDE1MCwyLDAsMCwxMTUsMTQsMCwwLDAsMTIsMiwxMiw4LDEyLDEzLDEyLAorICAgIDEwLDEyLDcsMTIsMTAsMTgsOCwxMTQsMTg4LDAsMCwwLDk5LDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMCwwLDAsCisgICAgMCwxMTUsMTEyLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsCisgICAgMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwKKyAgICAwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsCisgICAgMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMSw3LDAsMTM1LAorICAgIDAsMCwxMDIsMSwwLDEwMCw4LDAsMTAwLDksMCwxMzQsMCwwLDEzMSwxLAorICAgIDAsOTAsOCwwLDEwMSw3LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsMCwKKyAgICAxMzEsMSwwLDkwLDksMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLAorICAgIDEwLDAsMTM1LDAsMCw4Myw0MSwxNCwyMTgsMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDEyMiwxMDMsNjYsOTcsMTE1LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsCisgICAgMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMTksMTA0LDEwNSwKKyAgICA5OSwxMDQsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTE1LDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTEyLDExNCwxMTEsMTE2LDExMSw5OSwxMTEsCisgICAgMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNSwzMiwxMTYsMTA0LDk3LDExNiwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLAorICAgIDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDExNywxMTUsOTcsMTAzLDEwMSw0Niw5OSwzLDAsCisgICAgMCwwLDAsMCwwLDAsMywwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwwLAorICAgIDEyNCwyLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwKKyAgICA3NSw2Nyw5Nyw5OSwxMDQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsCisgICAgMTAyLDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsNzgsNDEsMiwxMTQsCisgICAgOTgsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDMsMTE0LDEwMCwwLDAsMCwKKyAgICAxMTQsMTE5LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc5LDAsMCwwLDksMywKKyAgICAwLDAsMTE1LDQsMCwwLDAsMCwzLDksMSwxMjIsMTksNzAsMTA1LDEwOCwKKyAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsCisgICAgMTI0LDEsMCwxMDYsMCwwLDEwNywyLDAsMTExLDMzLDAsMTI0LDAsMCwxMDYsCisgICAgMSwwLDEyNCwxLDAsMTA2LDEsMCwxMDcsMiwwLDgzLDQxLDEsNzgsNDEsCisgICAgMiwyMTgsOSw5NSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSw5NSwxMTQsMTExLDAsMCwKKyAgICAwLDQxLDIsMTE0LDEwMCwwLDAsMCwyMTgsNSwxMTEsMTE2LDEwNCwxMDEsMTE0LDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw2LAorICAgIDk1LDk1LDEwMSwxMTMsOTUsOTUsMTUsMywwLDAsMTE1LDQsMCwwLDAsMCwKKyAgICAxLDE4LDEsMTIyLDE3LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKKyAgICA5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLAorICAgIDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTE2LDAsMCwxMjQsCisgICAgMCwwLDEwNiwyLDAsMTMxLDEsMCw2NSw4Myw0MSwxLDc4LDQxLDMsMjE4LAorICAgIDQsMTA0LDk3LDExNSwxMDQsMTE0LDk4LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwKKyAgICAxLDExNCwxMDAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMjE4LDgsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsMTksCisgICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwKKyAgICAzLDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTI0LAorICAgIDAsMCwxMzEsMiwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLAorICAgIDEsMTIyLDEwMCw3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLAorICAgIDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMywyMTgsNSwxMTUsMTE3LDExMiwxMDEsMTE0LAorICAgIDExNCwyMDQsMCwwLDAsMTE0LDE4NywwLDAsMCw0MSwyLDExNCwxMDAsMCwwLAorICAgIDAsMTE0LDExOSwwLDAsMCw0MSwxLDExNCwyMDUsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NywwLDAsMCwyMiwzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDEwLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsODMsCisgICAgNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLAorICAgIDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw0MSwxLAorICAgIDExNCwzNSwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKKyAgICAxMTQsMTUxLDAsMCwwLDM0LDMsMCwwLDExNSwyLDAsMCwwLDAsMywKKyAgICAxMjIsMjMsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAorICAgIDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSw0MiwKKyAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDAsMSwwLDEzMSwKKyAgICAyLDAsMTQzLDE3LDAsMTI1LDIsMCwxMjQsMiwwLDEwNiwyLDAsMTMxLDAsCisgICAgMCw4Myw4NywxMDAsMiwwLDgxLDgyLDg4LDEwMCwyLDAsODMsNDEsMywxMjIsCisgICAgMzksODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsOTcsMTE2LDk3LAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTUsMzIsMTE0LDk3LAorICAgIDExOSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsNDYsMjE4LDEsMTE0LDc4LDQxLDMsMTE0LDQ5LAorICAgIDAsMCwwLDExNCw1MCwwLDAsMCw5MCw0LDExNCwxMDEsOTcsMTAwLDQxLDMsCisgICAgMTE0LDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDU0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTQsCisgICAgMCwwLDAsMzksMywwLDAsMTE1LDQsMCwwLDAsMCwyLDIxLDEsCisgICAgMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiwKKyAgICA5NSwxMDAsOTcsMTE2LDk3LDQxLDExLDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsCisgICAgMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE3OSwwLDAsMCwKKyAgICAxMTQsMjA3LDAsMCwwLDExNCwyMDksMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsCisgICAgMTg3LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwyMDUsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDIwNCwwLDAsMCw0LDMsMCwwLDExNSwxNCwwLAorICAgIDAsMCwxMiwzLDYsMiwxMiw2LDEyLDQsMTIsMywyNCwxMiwxOCw1LAorICAgIDExNCwyMDQsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsNjQsMCwwLDAsMTAxLAorICAgIDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLAorICAgIDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsCisgICAgMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTAwLAorICAgIDgsMCwxMDAsOSwwLDEzMiwwLDEsOTAsNiwwLDEwMCwxMCwwLDgzLDQxLAorICAgIDExLDIxOCwxNiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDEyMiw2Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICA4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExNywxMTUsMTA1LAorICAgIDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwKKyAgICAxMDEsMTA5LDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLAorICAgIDQsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsCisgICAgMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwxMjQsMiwwLDEwNiwKKyAgICAxLDAsMTAwLDIsMCwxMjQsMiwwLDEwNiwyLDAsMTA1LDIsMCw4Myw0MSwKKyAgICAzLDEyMiwzMyw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsCisgICAgMTE2LDk3LDEwMCw5NywxMTYsOTcsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsNDYsMTE0LDEyNiwwLDAsMCwxMTQsMTI3LDAsMCwwLDQxLDMsCisgICAgMTE0LDM5LDAsMCwwLDIxOCw4LDExNSwxMTYsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSw5MCwKKyAgICA3LDExNSwxMTYsOTUsMTE1LDEwNSwxMjIsMTAxLDQxLDMsMTE0LDEwMCwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTkxLDAsMCwwLDQ5LDMsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsMiwxMiwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLDAsMCwwLDAsCisgICAgNSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsCisgICAgMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsNCwwLDEyNCwwLDAsCisgICAgMTA2LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsNCwwLDEzMSwKKyAgICAyLDEsODMsNDEsMiw3OCwyMTgsNSw5NSwxMDksMTExLDEwMCwxMDEsNDEsMiwxMTQsCisgICAgOTcsMCwwLDAsMTE0LDE5MiwwLDAsMCw0MSw1LDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDkwLDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LAorICAgIDQyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwxOTMsMCwwLDAsNTQsMywwLDAsMTE1LDQsMCwwLAorICAgIDAsMCwyLDEyLDEsMTIyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE0LDAsMCwwLDEwNSwxODIsMSwwLAorICAgIDAsOTksMywwLDAsMCwxLDAsMCwwLDksMCwwLDAsMTcsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDYyLDEsMCwwLDExNiwwLDAsMTI0LDEsCisgICAgMCwxMzEsMSwwLDkyLDIsMCwxMjUsNCwwLDEyNSw1LDAsMTAzLDAsMCwKKyAgICAxMjUsNiwwLDEyMCw1NCwwLDEyNCw0LDAsMTE0LDgwLDAsMTE2LDEsMCwxMjQsCisgICAgNCwwLDEzMSwxLDAsMTIsMTE0LDgwLDAsMTE2LDAsMCwxMjQsNCwwLDEzMSwKKyAgICAxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDcsMCwxMjQsNiwwLDEwNiwyLAorICAgIDAsMTI0LDcsMCwxMzEsMSwwLDEsMTEzLDI3LDAsODcsMTIwLDEzNSwwLDExNiwKKyAgICAzLDAsMTI0LDYsMCwxMzEsMSwwLDY4LDkzLDEyMSwwLDEyNSw3LDAsMTE2LAorICAgIDQsMCwxMjQsNCwwLDEyNCw3LDAsMTMxLDIsMCwxMjUsNCwwLDEyMSwxNywKKyAgICAwLDExNiw1LDAsMTA2LDYsMCwxMjQsNCwwLDEzMSwxLDAsMSw4NywxMTMsCisgICAgOTQsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LDE1NSwwLDEsMSwxLDExOSwKKyAgICA5NCwwLDg5LDExMyw5NCwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMjE0LDAsCisgICAgMSwxMjUsOCwwLDEsMTIyLDI4LDAsMTE2LDksMCwxMDYsMTAsMCwxMDAsMSwKKyAgICAwLDEyNCw0LDAsMTI0LDgsMCwxMzEsMywwLDEsMTAwLDIsMCw4Myw4NywKKyAgICA4OSwxMDAsMiwwLDEwMCwyLDAsMTI1LDgsMCwxMjYsOCwwLDg4LDExMyw5NCwKKyAgICAwLDg4LDExMyw5NCwwLDg3LDEyMSwzNiwwLDExNiwxMSwwLDEyNCwxLDAsMTI0LAorICAgIDIsMCwxMjQsMywwLDEzMSwzLDAsMSwxMTYsOSwwLDEwNiwxMCwwLDEwMCwKKyAgICAzLDAsMTI0LDEsMCwxMzEsMiwwLDEsODcsMTEwLDU2LDAsNCwxMTYsOCwKKyAgICAwLDEwNywxMCwwLDExNCw1NywxLDEsMTI1LDgsMCwxLDEyMiwyNCwwLDExNiwKKyAgICA5LDAsMTA2LDEwLDAsMTAwLDEsMCwxMjQsMSwwLDEyNCw4LDAsMTMxLDMsCisgICAgMCwxLDg3LDg5LDEwMCwyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsCisgICAgODgsMTEwLDEsMCw4OCwxMDAsMiwwLDgzLDQxLDQsMTIyLDI3LDg3LDExNCwxMDUsCisgICAgMTE2LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMjIsMjcsOTksMTExLDExNywxMDgsMTAwLDMyLAorICAgIDExMCwxMTEsMTE2LDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw1OCwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMTIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDEwMCwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSw0MSwxMiwxMTQsMzgsMCwwLDAsMTE0LDQ2LDAsMCwwLAorICAgIDExNCwxNTcsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsCisgICAgMywwLDAsMCw5MCw1LDEwOSwxMDcsMTAwLDEwNSwxMTQsMjE4LDE1LDcwLDEwNSwxMDgsCisgICAgMTAxLDY5LDEyMCwxMDUsMTE1LDExNiwxMTUsNjksMTE0LDExNCwxMTEsMTE0LDExNCw0MCwwLDAsCisgICAgMCwxMTQsMTE0LDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDU1LDAsMCwwLAorICAgIDQxLDksMTE0LDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwKKyAgICAwLDExNCwyMTQsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwxMTQsOTQsCisgICAgMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwxMTQsMTk1LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDExNCwxOTIsMCwwLDAsNTksMywwLDAsMTE1LDQyLDAsMCwwLDAsCisgICAgMiwxOCwxLDYsMiwyMiwxLDE4LDEsMTcsMiwxOSwxLDE1LDEsMywKKyAgICAxLDE3LDEsMTMsMiw3LDEsMTgsMyw5LDEsMTAsMSwyNywxLDMsCisgICAgMSwxNiwxLDIwLDEsMTgsMiwxMiwxLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LAorICAgIDEwMCw5NywxMTYsOTcsNzgsNDEsNywxMTQsMTA1LDAsMCwwLDExNCwxMDQsMCwwLAorICAgIDAsMTE0LDEwNiwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxOTEsMCwwLDAsCisgICAgMTE0LDE5MywwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTIsCisgICAgMCwwLDAsNDUsMywwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsCisgICAgMTIsNSwxMiw1LDExNCwyMTIsMCwwLDAsOTksMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsCisgICAgMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLAorICAgIDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwKKyAgICAwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLAorICAgIDgzLDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLAorICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsNzYsMCwKKyAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwKKyAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwKKyAgICAxMTYsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTI0LAorICAgIDIsMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwwLDEwMCwxLAorICAgIDAsMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiw4Myw0MSw0LAorICAgIDc4LDExNCw5OCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDg5LDAsMCwwLAorICAgIDQxLDQsMTE0LDE1MSwwLDAsMCwxMTQsMTk0LDAsMCwwLDExNCwxMzUsMCwwLAorICAgIDAsMTE0LDE0MSwwLDAsMCw0MSw1LDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwyMDMsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMTE0LDE4MSwwLDAsMCw5NCwzLDAsMCwxMTUsOCwwLDAsMCwwLDEsCisgICAgMTUsMSwxNSwxLDI0LDEsMTIyLDI5LDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLAorICAgIDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAorICAgIDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLAorICAgIDEsMCw4Myw0MSwyLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwKKyAgICAxMTAsMTAxLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLAorICAgIDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwKKyAgICA0LDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKKyAgICAxOTYsMCwwLDAsMTAwLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsCisgICAgMzEsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA3OCw0MSw2LDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsCisgICAgMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTk2LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDExNCwyMTcsMCwwLDAsOTAsMywwLDAsMTE1LDYsCisgICAgMCwwLDAsMTIsMiw2LDIsMTIsNiwxMTQsMjE3LDAsMCwwLDk5LDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsCisgICAgMCwwLDAsMTE1LDEzNiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwKKyAgICAwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsCisgICAgMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCisgICAgNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwKKyAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsCisgICAgMTMyLDAsMCw5MCw4LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsMCw5MCwKKyAgICA5LDAsMTAwLDE0LDAsMTAwLDE1LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxNiwKKyAgICAwLDEwMCwxNywwLDEzMiwwLDAsOTAsMTEsMCwxMDEsMTIsMCwxMDAsMTgsMCwKKyAgICAxMDAsMTksMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTMsMCwxMDAsMjAsMCw4MywKKyAgICA0MSwyMSwyMTgsMTksNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDkzLDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwKKyAgICAxMDIsMTExLDExNCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICA5OSwxMTEsMTEwLDExNSwxMTYsMTE0LDExNyw5OSwxMTYsMTExLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwKKyAgICAxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMTksMTExLDExNCwxMDcsMzIsCisgICAgMTE5LDEwNSwxMTYsMTA0LDMyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsOTksMywwLDAsMCwwLDAsMCwwLDMsCisgICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjIsMCwwLDAsCisgICAgMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsCisgICAgMSwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCw5OCwwLDAsMCwKKyAgICAxMTQsMzUsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLDExNCw5OCwwLDAsCisgICAgMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTcsMywwLDAsMTE1LDQsCisgICAgMCwwLDAsMCwxLDksMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCisgICAgMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LAorICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwKKyAgICAwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsMCwxMTEsMzMsCisgICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywyLDAsCisgICAgODMsNDEsMSw3OCw0MSwyLDExNCwyMDUsMCwwLDAsMTE0LDExMSwwLDAsMCwKKyAgICA0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjA3LDAsMCwwLAorICAgIDEyMSwzLDAsMCwxMTUsNCwwLDAsMCwwLDEsMTgsMSwxMjIsMjYsNjksCisgICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwKKyAgICAwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDExNiwKKyAgICAwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsMSw3OCwKKyAgICA0MSwzLDExNCwyMDgsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCwzNSwwLDAsCisgICAgMCw0MSwxLDExNCwxMDAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDIwOSwwLDAsMCwxMjUsMywwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKKyAgICAxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsCisgICAgOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw1MCwwLDAsMCwxMTYsCisgICAgMCwwLDEwNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMTMxLDIsCisgICAgMCwxMjUsMiwwLDExNiwwLDAsMTA2LDQsMCwxMDAsMSwwLDEyNCwxLDAsCisgICAgMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTMxLDMsMCwxLDEyNCwyLDAsCisgICAgODMsNDEsMiwxMjIsMzgsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDExMCwzMiwxMTcsCisgICAgMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwKKyAgICAxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDM4LDEwMSwxMjAsMTE2LAorICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKKyAgICAxMTQsMTI1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDQxLDcsMTE0LDExNCwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwKKyAgICAxMzksMCwwLDAsOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwMCwxMjEsMTEwLAorICAgIDk3LDEwOSwxMDUsOTksMTE0LDEyOSwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDQxLDMsMTE0LDEwMCwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwKKyAgICAxODQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMTE0LDE4MCwwLDAsMCwxMjgsMywwLDAsMTE1LDEwLDAsMCwKKyAgICAwLDAsMiw2LDEsMTUsMSw5LDEsMTYsMSwxMjIsMzMsNjksMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDQ4LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMTYsMiwKKyAgICAwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDAsMCwxMDYsNCwKKyAgICAwLDEwMCwxLDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwKKyAgICAxMzEsMywwLDEsMTAwLDIsMCw4Myw0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwKKyAgICAxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwKKyAgICAxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLAorICAgIDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwKKyAgICAxMjUsMzIsMTAxLDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSw3OCw0MSw3LDExNCwxMTQsMCwwLDAsMTE0LDE4MiwwLDAsCisgICAgMCwxMTQsMTM5LDAsMCwwLDkwLDEyLDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLAorICAgIDk3LDEwOSwxMDUsOTksMTE0LDEyOSwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODUsCisgICAgMCwwLDAsMTM2LDMsMCwwLDExNSw2LDAsMCwwLDAsMiwxOSwxLAorICAgIDksMSwxMjIsMzEsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNCwwLDAsMCwzLDAsMCwwLDExNSw0OCwwLDAsMCwxMTYsMCwwLAorICAgIDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDEwMCwxLDAsMjUsMTM3LDAsMCwKKyAgICAxMTYsMiwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LAorICAgIDAsMCwxMTYsMywwLDY4LDEzMSwxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiwKKyAgICA0OSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywKKyAgICAxMDEsNDYsMTE0LDI5LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDQsMCwwLDAsNTEsMCwwLDAsMTE1LDMxLDAsMCwKKyAgICAwLDEyNCwwLDAsOTMsMjEsMCwxMjUsMSwwLDEzNiwwLDAsMTAwLDAsMCwKKyAgICAxMjQsMSwwLDIzLDEwNywyLDAsODYsMSwxMTMsMywwLDEwMCwxLDAsODMsCisgICAgNDEsMiwxMTQsMTc5LDAsMCwwLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LAorICAgIDIyLDAsMCwwLDIxOCw2LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDQxLDEsMjE4LDksCisgICAgMTAyLDEwNSwxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNDUsMywKKyAgICAwLDAsMTE1LDIsMCwwLDAsNiwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsCisgICAgMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsCisgICAgMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwKKyAgICAxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDM4LAorICAgIDAsMCwwLDExNCwzNSwwLDAsMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSwKKyAgICA4OCw4NCw2OSw3OCw4Myw3Myw3OSw3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSwKKyAgICA4Myw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCw0MSwxLDExNCwyMjAsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE1MywKKyAgICAwLDAsMCwxNDIsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE5LDEsCisgICAgMTgsMSwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLAorICAgIDQxLDIsMTIyLDYzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsCisgICAgOTcsMTE1LDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTksMTE0LAorICAgIDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLAorICAgIDk5LDExNiw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDExOSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwxMTQsMTgxLDAsMCwwLDE0OCwzLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDIsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKKyAgICAxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4MywKKyAgICA0MSwyLDEyMiw1Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLAorICAgIDk3LDExNSwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLAorICAgIDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTYsMCwwLDAsMTUyLAorICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICA3LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwKKyAgICAxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwKKyAgICAxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLDEsMTE0LDM1LDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNTEsMCwwLDAsCisgICAgMTU2LDMsMCwwLDExNSwyLDAsMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LAorICAgIDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwKKyAgICAxMDcsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMjA3LDAsMCwwLDExNCwyMDksCisgICAgMCwwLDAsMTE0LDE4MCwwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxNTMsMCwKKyAgICAwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxMTYsMCwwLAorICAgIDAsMTE0LDE1MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjE4LDAsMCwwLDEwOSwKKyAgICAzLDAsMCwxMTUsMjAsMCwwLDAsMTIsNiw2LDIsMTIsNCwxMiw0LAorICAgIDEyLDMsMTIsOCwxMiw2LDEyLDYsMTIsNCwxMiw0LDExNCwyMTgsMCwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsMTMwLDAsMCwwLDEwMSwwLDAsOTAsMSwKKyAgICAwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsCisgICAgMTAwLDMsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLAorICAgIDAsMCw5MCw1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwKKyAgICAwLDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwKKyAgICAxMDAsMTEsMCwxMzIsMCwwLDkwLDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsCisgICAgMCwwLDkwLDksMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLAorICAgIDAsMTAwLDE2LDAsMTAwLDE3LDAsMTMyLDAsMCw5MCwxMSwwLDEwMCwxOCwwLAorICAgIDEwMCwxOSwwLDEzMiwwLDAsOTAsMTIsMCwxMDAsMjAsMCw4Myw0MSwyMSwyMTgsCisgICAgMTQsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDk3LAorICAgIDM4LDEsMCwwLDgyLDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDk3LAorICAgIDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwzOSwxMTUsMzIsMTEyLDk3LDExNiwxMDQsNDYsMzIsMzIsNzMsMTE2LDMyLDExNywKKyAgICAxMTUsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiwKKyAgICAxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDQ0LDMyLDk3LDExMCwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDExNCwKKyAgICAxMDEsMzIsMTA1LDExNiwzMiwxMDgsMTExLDExMSwxMDcsMTE1LDMyLDExNywxMTIsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsOTUsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDYsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LAorICAgIDEwNCwxMDUsMTE1LDMyLDk5LDEwNCw5NywxMTAsMTAzLDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMSwxMTksMTEwLDMyLDExMiw5NywKKyAgICAxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTE0LDEwMSw5OSwxMTEsMTA5LDExMiwxMTcsMTE2LDEwMSwxMDAsCisgICAgNDQsMTAsMzIsMzIsMzIsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwzMiwzMiw3MCwxMTEsMTE0LDMyLDExNiwxMTEsCisgICAgMTEyLDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsCisgICAgMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsOTksNCwwLDAsMCwwLAorICAgIDAsMCwwLDQsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgNTIsMCwwLDAsMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLAorICAgIDEyNCwwLDAsOTUsMSwwLDExNiwyLDAsMTI0LDAsMCwxMDYsMywwLDEzMSwKKyAgICAwLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDQsMCwxMjQsMywwLDEyNCwwLAorICAgIDAsOTUsNSwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSw2LDIxOCw1LDk1LAorICAgIDExMCw5NywxMDksMTAxLDIxOCw1LDk1LDExMiw5NywxMTYsMTA0LDExNCw5MywwLDAsMCwKKyAgICAyMTgsMTYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCwyMTgsMTcsOTUsMTA4LDk3LDExNSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKKyAgICA5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsNDEsNCwxMTQsMTAwLDAsMCwwLDExNCw5OCwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMjE4LDExLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDExNCwxNzksMCwwLDAsMTY5LDMsMCwwLDExNSw4LDAsMCwwLDAsMSwKKyAgICA5LDEsOSwxLDIxLDEsMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksCisgICAgMSwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNTMsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwKKyAgICAxLDAsMTAwLDEsMCwxMzEsMSwwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLAorICAgIDAsMTI1LDMsMCwxMjQsMiwwLDEwMCwyLDAsMTA3LDIsMCwxMTQsNDMsMCwKKyAgICAxMDAsNiwwLDgzLDEyNCwxLDAsMTAwLDUsMCwxMDIsMiwwLDgzLDQxLDcsCisgICAgMTIyLDYyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwKKyAgICAxMDEsMzIsMTExLDEwMiwzMiw0MCwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDQ1LDExMCw5NywxMDksMTAxLDQ0LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsCisgICAgNDUsMTEyLDk3LDExNiwxMDQsNDUsOTcsMTE2LDExNiwxMTQsNDUsMTEwLDk3LDEwOSwxMDEsNDEsCisgICAgMTE0LDU4LDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsNywwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsOTAsOCw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSw0MSwyLAorICAgIDEyMiwzLDExNSwxMjEsMTE1LDEyMiw0LDExMiw5NywxMTYsMTA0LDQxLDIsMTE0LDIyNSwwLAorICAgIDAsMCwxMTQsMzIsMCwwLDAsNDEsNCwxMTQsMTAwLDAsMCwwLDExNCwyMTYsCisgICAgMCwwLDAsMjE4LDMsMTAwLDExMSwxMTYsOTAsMiwxMDksMTAxLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LAorICAgIDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTUsMTc1LDMsMCwwLDExNSw4LDAsMCwwLDAsMiwyNywKKyAgICAxLDEyLDIsNCwzLDEyMiwzOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLAorICAgIDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDM4LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLAorICAgIDkyLDIsMCwxMjUsMSwwLDEyNSwyLDAsMTE2LDEsMCwxMTYsMiwwLDEwNiwKKyAgICAzLDAsMTI0LDEsMCwyNSwxMjQsMiwwLDEzMSwyLDAsODMsNDEsMSw3OCwKKyAgICA0MSw0LDExNCwyMzIsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsNywwLDAsCisgICAgMCwyMTgsNywxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDEsMywxMTQsMTAwLDAsMCwKKyAgICAwLDkwLDE4LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsMTEyLDk3LDExNiwxMDQsOTUsOTcsMTE2LDExNiwxMTQsCisgICAgOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDIyNywwLDAsMCwxODUsMywwLDAsMTE1LDQsMCwKKyAgICAwLDAsMCwxLDE4LDEsMTIyLDMxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDExOCwwLDAsCisgICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsCisgICAgMTI1LDEsMCwxMjQsMSwwLDEyNCwwLDAsMTA2LDIsMCwxMDcsMywwLDExNCwKKyAgICAxMTEsMCwxMjQsMCwwLDEwNiwzLDAsMTI0LDAsMCwxMDYsNCwwLDEyNCwxLAorICAgIDAsMTMxLDIsMCwxMjUsMiwwLDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLAorICAgIDExNCwxMDIsMCwxMjQsMiwwLDEwNiw1LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKKyAgICAxMDIsMCwxMjQsMiwwLDEwNiw2LDAsMTE0LDEwMiwwLDEyNCwyLDAsMTA2LDYsCisgICAgMCwxMjQsMCwwLDk1LDcsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMiwwLAorICAgIDEyNCwwLDAsMTA2LDcsMCw4Myw0MSwxLDc4LDQxLDgsMTE0LDkzLDAsMCwKKyAgICAwLDExNCwyMjcsMCwwLDAsMTE0LDIyOCwwLDAsMCwxMTQsMjI5LDAsMCwwLAorICAgIDExNCwyMjUsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwKKyAgICAyMjYsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLDkwLDExLDExMiw5NywxMTQsCisgICAgMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE1OCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTIsOTUsMTE0LAorICAgIDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDE4OSwzLDAsMCwxMTUsMTYsCisgICAgMCwwLDAsMCwyLDE4LDEsMTUsMSwyMSwzLDI3LDEsOSwxLDEyLAorICAgIDEsOSwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLAorICAgIDk3LDExNiwxMDQsNDYsOTUsMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwKKyAgICAxMDYsMSwwLDEzMSwwLDAsMTMxLDEsMCw4Myw0MSwxLDc4LDQxLDIsMjE4LAorICAgIDQsMTA1LDExNiwxMDEsMTE0LDExNCwyMzQsMCwwLDAsNDEsMSwxMTQsMTAwLDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDIxOCw4LDk1LDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSwyMDIsMywwLDAsMTE1LDIsCisgICAgMCwwLDAsMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA1LDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwKKyAgICAwLDEzMSwwLDAsMTMxLDEsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDMxLDAsCisgICAgMCwwLDExNCwyMzQsMCwwLDAsNDEsMSwxMTQsMTAwLDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw3LDk1LAorICAgIDk1LDEwOCwxMDEsMTEwLDk1LDk1LDIwNSwzLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDEsMTIyLDIyLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LAorICAgIDEwNCw0Niw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKKyAgICAwLDAsMCwxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwKKyAgICAxLDAsODMsNDEsMiw3OCwxMjIsMjAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAorICAgIDk5LDEwMSw4MCw5NywxMTYsMTA0LDQwLDEyMywzMywxMTQsMTI1LDQxLDQxLDIsMTE0LDQ3LAorICAgIDAsMCwwLDExNCwyMjYsMCwwLDAsNDEsMSwxMTQsMTAwLDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw4LAorICAgIDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSwyMDgsMywwLDAsMTE1LDIsMCwwLAorICAgIDAsMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLAorICAgIDk3LDExNiwxMDQsNDYsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDk5LDIsMCwwLAorICAgIDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDE2LDAsMCwwLDEyNCwxLDAsMTI0LDAsMCwxMDYsMCwwLDEzMSwKKyAgICAwLDAsMTA3LDYsMCw4Myw0MSwxLDc4LDQxLDEsMTE0LDIzNCwwLDAsMCwKKyAgICA0MSwyLDExNCwxMDAsMCwwLDAsMjE4LDQsMTA1LDExNiwxMDEsMTA5LDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMiw5NSw5NSwKKyAgICA5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLDExNSw5NSw5NSwyMTEsMywwLDAsMTE1LDIsCisgICAgMCwwLDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsCisgICAgOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMjAsMCwwLDAsMTI0LDAsMCwxMDYsCisgICAgMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEsMTAwLDAsMCw4MywKKyAgICA0MSwxLDc4LDQxLDIsMTE0LDIyNiwwLDAsMCwxMTQsMTU3LDAsMCwwLDQxLAorICAgIDIsMTE0LDEwMCwwLDAsMCwxMTQsMjM5LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNTcsMCwwLDAsMjE0LAorICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjEsOTUsNzgsOTcsMTA5LAorICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk3LDExMiwxMTIsMTAxLDExMCwKKyAgICAxMDAsNzgsNDEsMTMsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwxMDYsCisgICAgMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCwyMzIsMCwKKyAgICAwLDAsMTE0LDIyNywwLDAsMCwxMTQsMjM0LDAsMCwwLDExNCwyMzYsMCwwLAorICAgIDAsMTE0LDIzNywwLDAsMCwxMTQsMjM4LDAsMCwwLDExNCwyNDAsMCwwLDAsCisgICAgMTE0LDE1NywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjI0LDAsMCwwLDE2MiwzLAorICAgIDAsMCwxMTUsMjAsMCwwLDAsMTIsNSw2LDIsMTIsNiwxMiwxMCwxMiwKKyAgICA0LDEyLDEzLDEyLDMsMTIsMywxMiwzLDEyLDMsMTE0LDIyNCwwLDAsMCwKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwxMTgsMCwwLDAsMTAxLDAsMCw5MCwxLDAsCisgICAgMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsCisgICAgMywwLDEwMSw0LDAsMTAwLDMsMCwxMDAsNCwwLDEzMiwwLDAsMTMxLDEsCisgICAgMCw5MCw1LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsOTAsNiwwLAorICAgIDEwMCw3LDAsMTAwLDgsMCwxMzIsMCwwLDkwLDcsMCwxMDAsOSwwLDEwMCwKKyAgICAxMCwwLDEzMiwwLDAsOTAsOCwwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLAorICAgIDAsOTAsOSwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLDAsOTAsMTAsMCwKKyAgICAxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMCwwLDkwLDExLDAsMTAwLDE3LDAsODMsCisgICAgNDEsMTgsMjE4LDE2LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwKKyAgICAwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDI1LDAsMCwwLDExNiwwLAorICAgIDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxMjQsMCwwLAorICAgIDk1LDEsMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMjI0LDAsMCwKKyAgICAwLDExNCwyMjYsMCwwLDAsNDEsNCwxMTQsMTAwLDAsMCwwLDExNCw5OCwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsMTE0LDIzMCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc5LDAsMCwwLAorICAgIDIyMCwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LDc4LDk3LAorICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LAorICAgIDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwKKyAgICAxMDAsMSwwLDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsODMsCisgICAgNDEsMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLAorICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsCisgICAgMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LAorICAgIDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyNSw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA0MSw2Miw0MSwyLDExNCw0NywwLDAsMCwxMTQsMTA1LDAsMCwwLDQxLDIsCisgICAgMTE0LDE2NCwwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjIzLDMsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgNywxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDc4LAorICAgIDg0LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDExNCwxNTMsMCwwLDAsMjMyLDMsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwKKyAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsMTE0LAorICAgIDMwLDAsMCwwLDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwKKyAgICAxMTQsMTE5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDExNCwxOTYsMCwwLDAsMjM1LDMsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwwLDEwMCwxLAorICAgIDAsMTAwLDIsMCwxMDAsMywwLDEwMCw0LDAsMTAwLDUsMCwxMzEsMywxLAorICAgIDgzLDQxLDYsNzgsMTE0LDMwLDAsMCwwLDEyMiw4LDYwLDExNSwxMTYsMTE0LDEwNSwKKyAgICAxMTAsMTAzLDYyLDExNCwxODMsMCwwLDAsMTE0LDE5OCwwLDAsMCw4NCw0MSwxLAorICAgIDExNCwxOTksMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwxMTksMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMTE0LDE4MSwwLDAsMCwyMzgsMywwLDAsMTE1LDIsMCwwLDAsMCwxLAorICAgIDEyMiwyNSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsCisgICAgMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwKKyAgICAzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSwKKyAgICA5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LAorICAgIDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsCisgICAgMTAwLDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4MCwwLDAsMCwyNDEsMywwLAorICAgIDAsMTE1LDAsMCwwLDAsMTIyLDMwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLAorICAgIDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDAsCisgICAgMCwwLDAsMTE0LDE4NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg1LDAsMCwwLDI0NCwzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiwKKyAgICA5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM1LDAsMCwwLDExNiwKKyAgICAwLDAsMTA2LDEsMCwxMDAsMSwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMiwKKyAgICAwLDEsMTE2LDAsMCwxMDYsMywwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwKKyAgICAwLDgzLDQxLDIsMTIyLDk4LDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTEwLDk3LDEwOSwKKyAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsCiAgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsCiAgICAgMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsCiAgICAgMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMywyMTgsNSwxMTUsMTE3LDExMiwxMDEsCi0gICAgMTE0LDExNCwyMTAsMCwwLDAsMTE0LDE5MywwLDAsMCw0MSwyLDExNCwxMDgsMCwKLSAgICAwLDAsMTE0LDEyNiwwLDAsMCw0MSwxLDExNCwyMTEsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MywwLDAsMCwyOCwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDEwLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsNywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgODMsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLAotICAgIDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw0MSwKLSAgICAxLDExNCwzNSwwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwzOCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLAorICAgIDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsCisgICAgMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSwKKyAgICA0MSw0LDExNCwxMTQsMCwwLDAsMTE0LDEyOSwwLDAsMCwxMTQsMjI2LDAsMCwKKyAgICAwLDExNCwxODYsMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwxMTksMCwKICAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAotICAgIDAsMTE0LDE1NywwLDAsMCw0MCwzLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDMsMTIyLDIzLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLAotICAgIDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTksMiwwLDAsMCwwLAotICAgIDAsMCwwLDMsMCwwLDAsOSwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgNDIsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMzEsMiwwLDE0MywxNywwLDEyNSwyLDAsMTI0LDIsMCwxMDYsMiwwLDEzMSwKLSAgICAwLDAsODMsODcsMTAwLDIsMCw4MSw4Miw4OCwxMDAsMiwwLDgzLDQxLDMsCi0gICAgMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiwKLSAgICA5NywzMiwxMDIsMTE0LDExMSwxMDksMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE1LDMyLDExNCwKLSAgICA5NywxMTksMzIsOTgsMTIxLDExNiwxMDEsMTE1LDQ2LDIxOCwxLDExNCw3OCw0MSwzLDExNCwKLSAgICA0OSwwLDAsMCwxMTQsNTAsMCwwLDAsOTAsNCwxMTQsMTAxLDk3LDEwMCw0MSwKLSAgICAzLDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw1NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjAwLDAsMCwwLDQ1LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwyMSwKLSAgICAxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSwxMSwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwKLSAgICAwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxODUsMCwwLAotICAgIDAsMTE0LDIxMywwLDAsMCwxMTQsMjE1LDAsMCwwLDExNCwxMjMsMCwwLDAsCi0gICAgMTE0LDE5MywwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMjExLDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDExNCwyMTAsMCwwLDAsMTAsMywwLDAsMTE1LDE0LAotICAgIDAsMCwwLDEyLDMsNiwyLDEyLDYsMTIsNCwxMiwzLDI0LDEyLDE4LAotICAgIDUsMTE0LDIxMCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSw2NCwwLDAsMCwKLSAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAotICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LDAsMTAwLDcsMCwKLSAgICAxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMSw5MCw2LDAsMTAwLDEwLDAsODMsCi0gICAgNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE3LDExNSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsCi0gICAgMTE2LDEwMSwxMDksNDYsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTE2LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwwLDEyNCwyLDAsCi0gICAgMTA2LDEsMCwxMDAsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDUsMiwwLDgzLAotICAgIDQxLDMsMTIyLDMzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAotICAgIDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMTQsMTMzLDAsMCwwLDExNCwxMzQsMCwwLDAsNDEsCi0gICAgMywxMTQsMzksMCwwLDAsMjE4LDgsMTE1LDExNiw5NSwxMDksMTE2LDEwNSwxMDksMTAxLAotICAgIDkwLDcsMTE1LDExNiw5NSwxMTUsMTA1LDEyMiwxMDEsNDEsMywxMTQsMTA4LDAsMCwwLAotICAgIDExNCwzNSwwLDAsMCwxMTQsMjA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTcsMCwwLDAsNTUsMywKLSAgICAwLDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLDI3LDgzLDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMDAsMSwwLDEyNCw0LDAsCi0gICAgMTMxLDIsMSw4Myw0MSwyLDc4LDIxOCw1LDk1LDEwOSwxMTEsMTAwLDEwMSw0MSwyLAotICAgIDExNCw5NywwLDAsMCwxMTQsMTk4LDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsOTAsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw1MywwLDAsMCwKLSAgICAxMTQsNDIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE5OSwwLDAsMCw2MCwzLDAsMCwxMTUsNCwwLAotICAgIDAsMCwwLDIsMTIsMSwxMjIsMzIsODMsMTExLDExNywxMTQsOTksMTAxLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LAotICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMjAsMCwwLDAsMTA1LDE4MiwxLAotICAgIDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsOSwwLDAsMCwxNywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNTMsMSwwLDAsMTE2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMDMsMCwKLSAgICAwLDEyNSw2LDAsMTIwLDU0LDAsMTI0LDQsMCwxMTQsODAsMCwxMTYsMSwwLAotICAgIDEyNCw0LDAsMTMxLDEsMCwxMiwxMTQsODAsMCwxMTYsMCwwLDEyNCw0LDAsCi0gICAgMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNywwLDEyNCw2LDAsMTA2LAotICAgIDIsMCwxMjQsNywwLDEzMSwxLDAsMSwxMTMsMjcsMCw4NywxMjAsMTMyLDAsCi0gICAgMTE2LDMsMCwxMjQsNiwwLDEzMSwxLDAsNjgsOTMsMTE4LDAsMTI1LDcsMCwKLSAgICAxMTYsNCwwLDEyNCw0LDAsMTI0LDcsMCwxMzEsMiwwLDEyNSw0LDAsMTIxLAotICAgIDE3LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTMxLDEsMCwxLDg3LAotICAgIDExMyw5NCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMTU1LDAsMSwxLDEsCi0gICAgMTE5LDk0LDAsODksMTEzLDk0LDAsNCwxMTYsOCwwLDEwNywxMCwwLDExNCwyMTEsCi0gICAgMCwxLDEyNSw4LDAsMSwxMjIsMjUsMCwxMTYsOSwwLDEwMCwxLDAsMTI0LAotICAgIDQsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMDAsMiwwLDgzLDg3LDg5LDEwMCwKLSAgICAyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsMTEzLDk0LDAsODgsCi0gICAgMTEzLDk0LDAsODcsMTIxLDMzLDAsMTE2LDEwLDAsMTI0LDEsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTMxLDMsMCwxLDExNiw5LDAsMTAwLDMsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsMSw4NywxMTAsNTMsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LAotICAgIDQ4LDEsMSwxMjUsOCwwLDEsMTIyLDIxLDAsMTE2LDksMCwxMDAsMSwwLAotICAgIDEyNCwxLDAsMTI0LDgsMCwxMzEsMywwLDEsODcsODksMTAwLDIsMCwxMDAsCi0gICAgMiwwLDEyNSw4LDAsMTI2LDgsMCw4OCwxMTAsMSwwLDg4LDEwMCwyLDAsCi0gICAgODMsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwKLSAgICAzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LAotICAgIDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywKLSAgICAxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwxMiwKLSAgICA5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LDQxLDExLDExNCwzOCwKLSAgICAwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDE2MywwLDAsMCwxMTQsMzMsMCwKLSAgICAwLDAsMTE0LDI4LDAsMCwwLDExNCwzLDAsMCwwLDkwLDUsMTA5LDEwNywKLSAgICAxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsMTE2LDExNSw2OSwKLSAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDQwLDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDU1LAotICAgIDAsMCwwLDQxLDksMTE0LDEwOCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LAotICAgIDUzLDAsMCwwLDExNCwyMjAsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLAotICAgIDExNiwxMTQsOTQsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwKLSAgICAxMTQsMjAxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxOTgsMCwwLDAsNjUsMywwLDAsMTE1LDM4LDAsCi0gICAgMCwwLDAsMiwxOCwxLDYsMiwyMiwxLDE4LDEsMTcsMiwxOSwxLAotICAgIDE1LDEsMywxLDE3LDEsMTMsMiw3LDEsMTgsMywxNiwxLDI3LDEsCi0gICAgMywxLDE2LDEsMTcsMSwxOCwyLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCwKLSAgICA5NywxMTYsOTcsNzgsNDEsNywxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5OSwwLDAsMCwxMTQsMTk4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTgsMCwKLSAgICAwLDAsNTEsMywwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNSwxMiw1LDExNCwyMTgsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDgzLAotICAgIDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsNzYsMCwwLAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLAotICAgIDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsCi0gICAgMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTI0LDIsCi0gICAgMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwwLDEwMCwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiw4Myw0MSw0LDc4LAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw4OSwwLDAsMCw0MSwKLSAgICA0LDExNCwxNTcsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTQxLDAsMCwwLAotICAgIDExNCwxNDcsMCwwLDAsNDEsNSwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsMjA5LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODcsMCwwLDAsOTgsMywwLDAsMTE1LDgsMCwwLDAsMCwxLDE1LAotICAgIDEsMTUsMSwyNCwxLDEyMiwyOSw4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsCi0gICAgMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwKLSAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsMzksODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLAotICAgIDEwMSwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsCi0gICAgMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjAyLAotICAgIDAsMCwwLDEwNCwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDMxLAotICAgIDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNzgsCi0gICAgNDEsNiwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDExMywwLDAsCi0gICAgMCwxMTQsMTE0LDAsMCwwLDExNCwxODcsMCwwLDAsMTE0LDIwMiwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwxMTQsMjIzLDAsMCwwLDk0LDMsMCwwLDExNSw2LDAsCi0gICAgMCwwLDEyLDIsNiwyLDEyLDYsMTE0LDIyMywwLDAsMCw5OSwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsCi0gICAgMCwwLDExNSwxMzYsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCwKLSAgICA5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwKLSAgICAwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsCi0gICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwKLSAgICAxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDEwMCwxMSwwLDEzMiwKLSAgICAwLDAsOTAsOCwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsOSwKLSAgICAwLDEwMCwxNCwwLDEwMCwxNSwwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTYsMCwKLSAgICAxMDAsMTcsMCwxMzIsMCwwLDkwLDExLDAsMTAxLDEyLDAsMTAwLDE4LDAsMTAwLAotICAgIDE5LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEzLDAsMTAwLDIwLDAsODMsNDEsCi0gICAgMjEsMjE4LDE5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsCi0gICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw5Myw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsOTksCi0gICAgMTExLDExMCwxMTUsMTE2LDExNCwxMTcsOTksMTE2LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAotICAgIDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTE5LDExMSwxMTQsMTA3LDMyLDExOSwKLSAgICAxMDUsMTE2LDEwNCwzMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsCi0gICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwKLSAgICAxLDAsMTI0LDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsCi0gICAgMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMTA2LDAsMCwwLDExNCwKLSAgICAzNSwwLDAsMCw0MSwzLDExNCwxMDgsMCwwLDAsMTE0LDEwNiwwLDAsMCwKLSAgICAxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMjEsMywwLDAsMTE1LDQsMCwKLSAgICAwLDAsMCwxLDksMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLAotICAgIDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwKLSAgICAxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwwLAotICAgIDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsMCwxMTEsMzMsMCwKLSAgICAxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywyLDAsODMsCi0gICAgNDEsMSw3OCw0MSwyLDExNCwyMTEsMCwwLDAsMTE0LDExOCwwLDAsMCw0MSwKLSAgICAyLDExNCwxMDgsMCwwLDAsMTE0LDIxMiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjEzLDAsMCwwLDEyNSwKLSAgICAzLDAsMCwxMTUsNCwwLDAsMCwwLDEsMTgsMSwxMjIsMjYsNjksMTIwLAotICAgIDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDExNiwwLAotICAgIDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsMSw3OCw0MSwKLSAgICAzLDExNCwyMTQsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDExNCwyMTUsMCwwLDAsMTI5LDMsMCwwLDExNSwKLSAgICAyLDAsMCwwLDAsMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLAotICAgIDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LAotICAgIDExNSwxMDQsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNDcsMCwwLDAsMTE2LDAsCi0gICAgMCwxMDYsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwyLDAsCi0gICAgMTI1LDIsMCwxMTYsNCwwLDEwMCwxLDAsMTI0LDEsMCwxMDYsNSwwLDEyNCwKLSAgICAwLDAsMTA2LDYsMCwxMzEsMywwLDEsMTI0LDIsMCw4Myw0MSwyLDEyMiwKLSAgICAzOCw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMTEwLDMyLDExNywxMTAsMTA1LDExNiwxMDUsCi0gICAgOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsMzgsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNDEsCi0gICAgNywxMTQsMTIxLDAsMCwwLDExNCwxODgsMCwwLDAsMTE0LDE0NSwwLDAsMCwKLSAgICA5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSwKLSAgICAxMTQsMTA1LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLAotICAgIDMsMTE0LDEwOCwwLDAsMCwxMTQsMTY0LDAsMCwwLDExNCwxOTAsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LAotICAgIDE4NiwwLDAsMCwxMzIsMywwLDAsMTE1LDEwLDAsMCwwLDAsMiw2LAotICAgIDEsMTUsMSw2LDEsMTYsMSwxMjIsMzMsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCi0gICAgMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSwKLSAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDQ1LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMTYsMiwwLDEwNiwzLDAsCi0gICAgMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDQsMCwxMDAsMSwwLDEyNCwwLDAsCi0gICAgMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTMxLDMsMCwxLDEwMCwyLDAsCi0gICAgODMsNDEsMywxMjIsMzAsNzMsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwKLSAgICA5NywxMTAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTIyLDQwLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwMSwxMjAsMTAxLDk5LDExNywKLSAgICAxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNzgsNDEsNywKLSAgICAxMTQsMTIxLDAsMCwwLDExNCwxODgsMCwwLDAsMTE0LDE0NSwwLDAsMCw5MCwKLSAgICAxMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDExNCwxMDUsMCwKLSAgICAwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwxOTAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MSwwLDAsMCwxNDAsMywwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCwyLDE5LDEsNiwxLDEyMiwzMSw2OSwxMjAsMTE2LAotICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCw0LDAsMCwwLDMsMCwwLAotICAgIDAsMTE1LDQ4LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAxLDAsMTAwLDEsMCwyNSwxMzcsMCwwLDExNiwyLDAsMTM1LDAsMCwxMDIsCi0gICAgMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMCwwLDExNiwzLDAsNjgsMTMxLAotICAgIDEsMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDQ5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDEsMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LAotICAgIDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0NiwxMTQsMjksMCwwLDAsCi0gICAgOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsCi0gICAgMCw1MSwwLDAsMCwxMTUsMzEsMCwwLDAsMTI0LDAsMCw5MywyMSwwLAotICAgIDEyNSwxLDAsMTM2LDAsMCwxMDAsMCwwLDEyNCwxLDAsMjMsMTA3LDIsMCwKLSAgICA4NiwxLDExMywzLDAsMTAwLDEsMCw4Myw0MSwyLDExNCwxODUsMCwwLDAsCi0gICAgNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMjIsMCwwLDAsMjE4LDYsMTE1LAotICAgIDExNywxMDIsMTAyLDEwNSwxMjAsNDEsMSwyMTgsOSwxMDIsMTA1LDEwOCwxMDEsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsMTAzLAotICAgIDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDE0OSwzLDAsMCwxMTUsMiwwLDAsMCwKLSAgICA2LDEsMTIyLDQ5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwKLSAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywKLSAgICAxMDMsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwKLSAgICAxMDEsMTIwLDExMiwxMTQsNjIsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDM1LDAsMCwKLSAgICAwLDIxOCwzLDk3LDExMCwxMjEsMjE4LDE4LDY5LDg4LDg0LDY5LDc4LDgzLDczLDc5LAotICAgIDc4LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDIsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDIyNiwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTU5LDAsMCwwLDE0NiwzLDAsMCwKLSAgICAxMTUsNiwwLDAsMCwwLDIsMTksMSwxOCwxLDEyMiwzMCw2OSwxMjAsMTE2LAotICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLAotICAgIDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsNjMsODIsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsOTcsMTEwLDMyLDEwMSwKLSAgICAxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAotICAgIDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMzIsCi0gICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDQ2LDc4LDExNCw0LDAsCi0gICAgMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODcsMCwKLSAgICAwLDAsMTUyLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjgsNjksCi0gICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUzLDgyLDEwMSwxMTYsCi0gICAgMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDEwMSwxMjAsMTE2LDEwMSwKLSAgICAxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDQsOTcsCi0gICAgMTE4LDEwMSwzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwKLSAgICAxMDEsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwKLSAgICAxMjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDIwMiwwLDAsMCwxNTYsMywwLDAsMTE1LDIsMCwwLAotICAgIDAsMCwyLDEyMiwzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywKLSAgICAxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDEsMCwwLDAsNjcsMCwwLDAsMTE1LDcsMCwwLDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDgzLDQxLDEsMTIyLDU4LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5NywxMTUsMzIsMTAyLDExMSwKLSAgICAxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsNDEsMSwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLAotICAgIDExNCwxMjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE1NywwLDAsMCwxNjAsMywwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCwzLDEyMiwzMiw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLAotICAgIDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LAotICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsNzgsNDEsMTQsMTE0LDExMiwwLDAsMCwxMTQsMTExLAotICAgIDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNCwwLDAsMCwxMTQsMTg1LDAsCi0gICAgMCwwLDExNCwyMTMsMCwwLDAsMTE0LDIxNSwwLDAsMCwxMTQsMTg2LDAsMCwKLSAgICAwLDExNCwxOTEsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsMTg3LDAsMCwwLAotICAgIDExNCwyMDIsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDExNCwyMjQsMCwwLDAsMTEzLDMsMCwwLDExNSwyMCwwLDAsCi0gICAgMCwxMiw2LDYsMiwxMiw0LDEyLDQsMTIsMywxMiw4LDEyLDYsMTIsCi0gICAgNiwxMiw0LDEyLDQsMTE0LDIyNCwwLDAsMCw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICAxMzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwxMDAsOSwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDEwMCwxMSwwLDEzMiwwLDAsOTAsCi0gICAgOCwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsOSwwLDEwMCwxNCwKLSAgICAwLDEwMCwxNSwwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTYsMCwxMDAsMTcsMCwKLSAgICAxMzIsMCwwLDkwLDExLDAsMTAwLDE4LDAsMTAwLDE5LDAsMTMyLDAsMCw5MCwKLSAgICAxMiwwLDEwMCwyMCwwLDgzLDQxLDIxLDIxOCwxNCw5NSw3OCw5NywxMDksMTAxLDExNSwKLSAgICAxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsOTcsMzgsMSwwLDAsODIsMTAxLDExMiwKLSAgICAxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiwKLSAgICA5Nyw5OSwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDM5LDExNSwzMiwxMTIsOTcsCi0gICAgMTE2LDEwNCw0NiwzMiwzMiw3MywxMTYsMzIsMTE3LDExNSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDEwNSwxMTYsMTE1LDMyLDExMiw5NywxMTQsCi0gICAgMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE2LDMyLDEwOCwxMTEsCi0gICAgMTExLDEwNywxMTUsMzIsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsCi0gICAgMTE2LDM5LDExNSwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSwKLSAgICA0NiwzMiwzMiw4NywxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsOTksMTA0LDk3LAotICAgIDExMCwxMDMsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAzOSwxMTUsMzIsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTQsCi0gICAgMTAxLDk5LDExMSwxMDksMTEyLDExNywxMTYsMTAxLDEwMCw0NCwxMCwzMiwzMiwzMiwzMiwxMTcsCi0gICAgMTE1LDEwNSwxMTAsMTAzLDMyLDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LAotICAgIDQ2LDMyLDMyLDcwLDExMSwxMTQsMzIsMTE2LDExMSwxMTIsNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAotICAgIDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMTA1LDExNSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCw0Niw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwKLSAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSw1MiwwLDAsMCwxMjQsMSwwLAotICAgIDEyNCwwLDAsOTUsMCwwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLDAsMTE2LAotICAgIDIsMCwxMjQsMCwwLDEwNiwzLDAsMTMxLDAsMCwxMzEsMSwwLDEyNCwwLAotICAgIDAsOTUsNCwwLDEyNCwzLDAsMTI0LDAsMCw5NSw1LDAsMTAwLDAsMCwKLSAgICA4Myw0MSwxLDc4LDQxLDYsMjE4LDUsOTUsMTEwLDk3LDEwOSwxMDEsMjE4LDUsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsMTE0LDkzLDAsMCwwLDIxOCwxNiw5NSwxMDMsMTAxLDExNiw5NSwKLSAgICAxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxNyw5NSwxMDgsOTcsCi0gICAgMTE1LDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxMiwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0MSw0LDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsMjE4LDExLDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODUsMCwwLDAsMTczLDMsCi0gICAgMCwwLDExNSw4LDAsMCwwLDAsMSw5LDEsOSwxLDIxLDEsMTIyLAotICAgIDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0NiwKLSAgICA5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNTMsMCwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTAwLDEsMCwxMzEsMSwKLSAgICAwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMiwwLAotICAgIDEwMCwyLDAsMTA3LDIsMCwxMTQsNDMsMCwxMDAsNiwwLDgzLDEyNCwxLDAsCi0gICAgMTAwLDUsMCwxMDIsMiwwLDgzLDQxLDcsMTIyLDYyLDgyLDEwMSwxMTYsMTE3LDExNCwKLSAgICAxMTAsMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsMTExLDEwMiwzMiw0MCwxMTIsCi0gICAgOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ1LDExMCw5NywxMDksCi0gICAgMTAxLDQ0LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDUsMTEyLDk3LDExNiwxMDQsNDUsOTcsCi0gICAgMTE2LDExNiwxMTQsNDUsMTEwLDk3LDEwOSwxMDEsNDEsMTE0LDU4LDAsMCwwLDExNCwzMCwKLSAgICAwLDAsMCwxMTQsNywwLDAsMCwxMTQsMzUsMCwwLDAsOTAsOCw5NSwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSw0MSwyLDEyMiwzLDExNSwxMjEsMTE1LDEyMiw0LAotICAgIDExMiw5NywxMTYsMTA0LDQxLDIsMTE0LDIzMSwwLDAsMCwxMTQsMzIsMCwwLDAsCi0gICAgNDEsNCwxMTQsMTA4LDAsMCwwLDExNCwyMjIsMCwwLDAsMjE4LDMsMTAwLDExMSwKLSAgICAxMTYsOTAsMiwxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsCi0gICAgMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTc5LDMsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMiwyNywxLDEyLDIsNCwzLDEyMiwzOCwKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsCi0gICAgOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDk5LDEsMCwwLDAsMCwwLDAsMCwzLAotICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLAotICAgIDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDkyLDIsMCwxMjUsMSwwLDEyNSwKLSAgICAyLDAsMTE2LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDEsMCwyNSwxMjQsCi0gICAgMiwwLDEzMSwyLDAsODMsNDEsMSw3OCw0MSw0LDExNCwyMzgsMCwwLDAsCi0gICAgMTE0LDExNywwLDAsMCwxMTQsNywwLDAsMCwyMTgsNywxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwxMTUsNDEsMywxMTQsMTA4LDAsMCwwLDkwLDE4LDExMiw5NywxMTQsMTAxLAotICAgIDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsOTcsMTE2LDExNiwxMTQsOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIzMywwLAotICAgIDAsMCwxODksMywwLDAsMTE1LDQsMCwwLDAsMCwxLDE4LDEsMTIyLAotICAgIDMxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0NiwKLSAgICA5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDExOCwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsMTI1LDEsMCwxMjQsMSwwLDEyNCwKLSAgICAwLDAsMTA2LDIsMCwxMDcsMywwLDExNCwxMTEsMCwxMjQsMCwwLDEwNiwzLAotICAgIDAsMTI0LDAsMCwxMDYsNCwwLDEyNCwxLDAsMTMxLDIsMCwxMjUsMiwwLAotICAgIDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiwKLSAgICA1LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiw2LAotICAgIDAsMTE0LDEwMiwwLDEyNCwyLDAsMTA2LDYsMCwxMjQsMCwwLDk1LDcsMCwKLSAgICAxMjQsMSwwLDEyNCwwLDAsOTUsMiwwLDEyNCwwLDAsMTA2LDcsMCw4MywKLSAgICA0MSwxLDc4LDQxLDgsMTE0LDkzLDAsMCwwLDExNCwyMzMsMCwwLDAsMTE0LAotICAgIDIzNCwwLDAsMCwxMTQsMjM1LDAsMCwwLDExNCwyMzEsMCwwLDAsMTE0LDEyNywKLSAgICAwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwyMzIsMCwwLDAsNDEsMywxMTQsCi0gICAgMTA4LDAsMCwwLDkwLDExLDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwKLSAgICAxMDQsMTE0LDE2NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNSwwLDAsMCwyMTgsMTIsOTUsMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCwKLSAgICA5NywxMTYsMTAxLDE5MywzLDAsMCwxMTUsMTYsMCwwLDAsMCwyLDE4LDEsCi0gICAgMTUsMSwyMSwzLDI3LDEsOSwxLDEyLDEsOSwxLDEyMiwyNyw5NSw3OCwKLSAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsMTE0LDEwMSwKLSAgICA5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LAotICAgIDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTMxLAotICAgIDEsMCw4Myw0MSwxLDc4LDQxLDIsMjE4LDQsMTA1LDExNiwxMDEsMTE0LDExNCwyNDAsCi0gICAgMCwwLDAsNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw4LDk1LDk1LDEwNSwxMTYsMTAxLAotICAgIDExNCw5NSw5NSwyMDYsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMywKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCi0gICAgOTUsMTA1LDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwKLSAgICAwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTMxLDEsMCwKLSAgICA4Myw0MSwxLDc4LDQxLDIsMTE0LDMxLDAsMCwwLDExNCwyNDAsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDIxOCw3LDk1LDk1LDEwOCwxMDEsMTEwLDk1LDk1LDIwOSwKLSAgICAzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIyLDk1LDc4LDk3LDEwOSwKLSAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwxMDgsMTAxLDExMCwKLSAgICA5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMSwwLDEwNiwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsODMsNDEsMiw3OCwxMjIsCi0gICAgMjAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQwLAotICAgIDEyMywzMywxMTQsMTI1LDQxLDQxLDIsMTE0LDQ3LDAsMCwwLDExNCwyMzIsMCwwLAotICAgIDAsNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDIxOCw4LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSwKLSAgICA5NSwyMTIsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMyw5NSw3OCwKLSAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTE0LAotICAgIDEwMSwxMTIsMTE0LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwKLSAgICAxLDAsMTI0LDAsMCwxMDYsMCwwLDEzMSwwLDAsMTA3LDYsMCw4Myw0MSwKLSAgICAxLDc4LDQxLDEsMTE0LDI0MCwwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsCi0gICAgMjE4LDQsMTA1LDExNiwxMDEsMTA5LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMiw5NSw5NSw5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLAotICAgIDExNSw5NSw5NSwyMTUsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNywKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCi0gICAgOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsOTUsOTUsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMjAsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTI0LDEsCi0gICAgMCwxMzEsMSwwLDEsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDIzMiwKLSAgICAwLDAsMCwxMTQsMTYzLDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMjQ1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDExNCwxNjMsMCwwLDAsMjE4LDMsMCwwLDExNSwyLDAsMCwKLSAgICAwLDAsMSwxMjIsMjEsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCwKLSAgICA5NywxMTYsMTA0LDQ2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNzgsNDEsMTMsMTE0LDExMiwwLAotICAgIDAsMCwxMTQsMTExLDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNCwwLDAsCi0gICAgMCwxMTQsMTg1LDAsMCwwLDExNCwyMzgsMCwwLDAsMTE0LDIzMywwLDAsMCwKLSAgICAxMTQsMjQwLDAsMCwwLDExNCwyNDIsMCwwLDAsMTE0LDI0MywwLDAsMCwxMTQsCi0gICAgMjQ0LDAsMCwwLDExNCwyNDYsMCwwLDAsMTE0LDE2MywwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAotICAgIDAsMCwxMTQsMjMwLDAsMCwwLDE2NiwzLDAsMCwxMTUsMjAsMCwwLDAsCi0gICAgMTIsNSw2LDIsMTIsNiwxMiwxMCwxMiw0LDEyLDEzLDEyLDMsMTIsMywKLSAgICAxMiwzLDEyLDMsMTE0LDIzMCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSwxMTgsCisgICAgMCwxMTQsMTg3LDAsMCwwLDI0NywzLDAsMCwxMTUsNiwwLDAsMCwwLAorICAgIDcsOSwxLDEwLDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwKKyAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDc4LDQxLDEyLDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwKKyAgICAxMTQsMTA2LDAsMCwwLDExNCwxNzksMCwwLDAsMTE0LDE3NywwLDAsMCwxMTQsCisgICAgMjQyLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTgxLAorICAgIDAsMCwwLDExNCwxODAsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsMTg3LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDExNCwyNDEsMCwwLDAsMjE5LDMsMCwwLDExNSwKKyAgICAxNiwwLDAsMCwxMiwxLDEyLDMsMTgsOSwxMiwzLDEyLDMsMTIsMywKKyAgICAxMiwzLDEyLDMsMTE0LDI0MSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsMCwwLDExNSwxNjAsCiAgICAgMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLAotICAgIDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsMywwLDEwMSw0LDAsMTAwLDMsCi0gICAgMCwxMDAsNCwwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAwLDUsMCwKLSAgICAxMDAsNiwwLDEzMiwwLDAsOTAsNiwwLDEwMCw3LDAsMTAwLDgsMCwxMzIsCi0gICAgMCwwLDkwLDcsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwwLDAsOTAsOCwKLSAgICAwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxMywwLAotICAgIDEwMCwxNCwwLDEzMiwwLDAsOTAsMTAsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsCi0gICAgMCwwLDkwLDExLDAsMTAwLDE3LDAsODMsNDEsMTgsMjE4LDE2LDk1LDc4LDk3LAotICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDI1LDAsMCwwLDExNiwwLDAsMTI0LDEsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTMxLDMsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMCwwLDgzLAotICAgIDQxLDEsNzgsNDEsMiwxMTQsMjMwLDAsMCwwLDExNCwyMzIsMCwwLDAsNDEsCi0gICAgNCwxMTQsMTA4LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDExNCwyMzYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE4NSwwLDAsMCwyMjQsMywwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCwxLDEyMiwyNSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksCi0gICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwKLSAgICAxLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsCi0gICAgMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LAotICAgIDEyMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsCi0gICAgMTE2LDExNSwxMDEsMTA4LDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAxMjIsMjUsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsNjIsNDEsMiwxMTQsNDcsMCwKLSAgICAwLDAsMTE0LDExMiwwLDAsMCw0MSwyLDExNCwxNzAsMCwwLDAsMTE0LDE5MCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAotICAgIDAsMCwyMTgsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDIyNywKLSAgICAzLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI4LDk1LDc4LDk3LDEwOSwKLSAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsCi0gICAgMCwwLDEwMCwxLDAsODMsNDEsMiw3OCw4NCwxMTQsNCwwLDAsMCw0MSwKLSAgICAyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTU5LDAsMCwwLDIzNiwKLSAgICAzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwKLSAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsCi0gICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLAotICAgIDAsMTAwLDEsMCw4Myw0MSwyLDc4LDExNCwzMCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjAyLDAsCi0gICAgMCwwLDIzOSwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI3LDk1LAotICAgIDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAotICAgIDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLAotICAgIDAsMCwwLDIsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMjIsMCwwLDAsMTE2LDAsMCwxMDAsMSwwLDEwMCwyLDAsMTAwLDMsMCwKLSAgICAxMDAsNCwwLDEwMCw1LDAsMTMxLDMsMSw4Myw0MSw2LDc4LDExNCwzMCwwLAotICAgIDAsMCwxMjIsOCw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw2MiwxMTQsMTg5LDAsMCwKLSAgICAwLDExNCwyMDQsMCwwLDAsODQsNDEsMSwxMTQsMjA1LDAsMCwwLDQxLDIsCi0gICAgMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODcsMCwwLDAsMjQyLDMsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwKLSAgICAxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCi0gICAgOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwKLSAgICAxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LAotICAgIDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTY0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwxODYsMCwwLDAsMjQ1LDMsMCwwLDExNSwwLDAsMCwwLDEyMiwKLSAgICAzMCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAotICAgIDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksCi0gICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMCwwLDgzLDQxLDEsNzgsCi0gICAgMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwxOTAsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMTE0LDE5MSwwLDAsMCwyNDgsMywwLDAsMTE1LDIsMCwwLDAsMCwxLAotICAgIDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwzMiwwLDAsMCwxMTYsMCwwLDEwMCwxLDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEzMSwyLDAsMSwxMTYsMiwwLDEwNiwzLDAsMTI0LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwyLDAsODMsNDEsMiwxMjIsOTgsNzYsMTExLDk3LDEwMCwKLSAgICAzMiw5NywzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCi0gICAgMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLAotICAgIDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLAotICAgIDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsCi0gICAgMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMzgsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTEyLDk3LDExNiwKLSAgICAxMDQsMzIsMTIzLDMzLDExNCwxMjUsNDEsNCwxMTQsMTA1LDAsMCwwLDExNCwyMzIsMCwKLSAgICAwLDAsMTE0LDEyMSwwLDAsMCwxMTQsMTkyLDAsMCwwLDQxLDIsMTE0LDEwOCwKLSAgICAwLDAsMCwxMTQsMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDExNCwxOTMsMCwwLDAsMjUxLDMsMCwwLAotICAgIDExNSw0LDAsMCwwLDAsNywxNiwxLDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLAotICAgIDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSwxMiwxMTQsMTEyLDAsMCwwLDExNCwKLSAgICAxMTEsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxODMsCi0gICAgMCwwLDAsMTE0LDI0OCwwLDAsMCwxMTQsMTU5LDAsMCwwLDExNCwyMDIsMCwKLSAgICAwLDAsMTE0LDE4NywwLDAsMCwxMTQsMTg2LDAsMCwwLDExNCwxOTEsMCwwLAotICAgIDAsMTE0LDE5MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjQ3LDAsMCwwLDIyMywKLSAgICAzLDAsMCwxMTUsMTYsMCwwLDAsMTIsMSwxMiwzLDE4LDksMTIsMywKLSAgICAxMiwzLDEyLDMsMTIsMywxMiwzLDExNCwyNDcsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw2NCwwLAotICAgIDAsMCwxMTUsMTYwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsCi0gICAgOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMSw0LDAsMTAwLDIsMCwxMDAsCi0gICAgMywwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAxLDQsMCwxMDAsNCwKLSAgICAwLDEwMCw1LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDYsMCwxMDEsNCwwLAotICAgIDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNywwLDEwMSwKLSAgICA0LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsMTMxLDEsMCw5MCw4LAotICAgIDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMSwwLAotICAgIDEzMSwxLDAsOTAsOSwwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDEwLDAsMTAwLAotICAgIDEzLDAsMTAwLDE0LDAsMTMyLDIsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDQsCi0gICAgMCwxMDAsMTAsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMSwwLDEzMSwxLDAsCi0gICAgOTAsMTEsMCwxMDAsMTAsMCw4Myw0MSwxNywyMTgsMTAsODAsOTcsMTE2LDEwNCw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LAotICAgIDExMiw5NywxMTYsMTA0LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAotICAgIDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwKLSAgICAxMTcsMTE2LDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNTUsMCwwLDAsMTIwLAotICAgIDQ4LDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTMxLDAsMCw2OCw5MywKLSAgICAzMSwwLDEyNSwxLDAsMTE2LDMsMCwxMjQsMSwwLDEwMCwxLDAsMTMxLDIsCi0gICAgMCwxMTQsMTYsMCwxMjQsMSwwLDEwNiw0LDAsMTMxLDAsMCwxLDExMywxNiwKLSAgICAwLDg3LDEwMCwyLDAsODMsNDEsMywxMjIsMTI1LDY3LDk3LDEwOCwxMDgsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5NywKLSAgICA5OSwxMDQsMTAxLDExNSw0MCw0MSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTEsMTEwLAotICAgIDMyLDk3LDEwOCwxMDgsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwKLSAgICAxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMTE1LDExNiwxMTEsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsMTE1LDMyLDQwLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsMTAxLDEwMCw0MSw0NiwyMTgsMTcsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsCi0gICAgOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw3OCw0MSw1LDExNCw3LDAsCi0gICAgMCwwLDIxOCwxOSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMjE4LDYsMTE4LDk3LDEwOCwxMTcsMTAxLDExNSwxMTQsCi0gICAgMTE1LDAsMCwwLDExNCwyNTAsMCwwLDAsNDEsMiwxMTQsMTcwLDAsMCwwLAotICAgIDIxOCw2LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDExNCwyNTAsMCwwLDAsMTIsNCwwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCw0LDIyLDEsMTUsMSwxMjIsMjgsODAsOTcsMTE2LAotICAgIDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LAotICAgIDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsOTksMiwwLDAsMCwwLDAsCi0gICAgMCwwLDMsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDEwNywKLSAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwKLSAgICA0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwxMTYsMiwwLDEwNiwKLSAgICAzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwxMjAsNTksMCwxMTYsCi0gICAgMCwwLDEwNiwxLDAsNjgsOTMsNDQsMCwxMjUsMiwwLDEyMSwxNCwwLDEyNCwKLSAgICAyLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDg3LDExMyw1MSwwLDQsMTE2LDUsCi0gICAgMCwxMDcsMTAsMCwxMTQsOTQsMCwxLDEsMSwxMTksNTEsMCw4OSwxMTMsNTEsCi0gICAgMCw4OCwxMTMsNTEsMCw4NywxMDAsMSwwLDgzLDEwMCwxLDAsODMsNDEsMywKLSAgICAxMjIsMTEzLDgzLDEwMSw5NywxMTQsOTksMTA0LDMyLDExNSwxMDEsMTEzLDExNywxMDEsMTEwLDk5LAotICAgIDEwMSwzMiwxMTEsMTAyLDMyLDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTAyLDExMSwxMTQsMzIsOTcsCi0gICAgMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwKLSAgICAxMDQsMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLAotICAgIDM5LDEwNCwxMTEsMTExLDEwNywxMTUsMzksMzIsMTA1LDExNSwzMiwxMDIsOTcsMTA4LDExNSwxMDEsCi0gICAgMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNywxMTUsMTAxLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsNzgsMTIyLDIzLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwKLSAgICAxMTEsMTExLDEwNywxMTUsMzIsMTA1LDExNSwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDYsMTE0LAotICAgIDcsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsCi0gICAgMTE0LDYwLDAsMCwwLDExNCw2MSwwLDAsMCwxMTQsMTI1LDAsMCwwLDExNCwKLSAgICAxMDcsMCwwLDAsNDEsMywxMTQsMTcwLDAsMCwwLDExNCwzNSwwLDAsMCwKLSAgICA5MCw0LDEwNCwxMTEsMTExLDEwNywxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNSwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsCi0gICAgMTA3LDExNSwyMCw0LDAsMCwxMTUsMTYsMCwwLDAsMCw3LDI1LDEsMTYsCi0gICAgMSwxNiwxLDMsMSwxNCwxLDEzLDEsMTIsMiwxMjIsMjIsODAsOTcsMTE2LAotICAgIDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsCi0gICAgMTExLDEwNywxMTUsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCi0gICAgMTksMCwwLDAsNjcsMCwwLDAsMTE1LDEyMywwLDAsMCwxMjQsMSwwLAotICAgIDEwMCwxLDAsMTA3LDIsMCwxMTQsNTMsMCwxMjEsMTYsMCwxMTYsMCwwLDEwNiwKLSAgICAxLDAsMTMxLDAsMCwxMjUsMSwwLDg3LDExMCwyMiwwLDQsMTE2LDIsMCwKLSAgICAxMDcsMTAsMCwxMTQsNTIsMCwxLDEsMSwxMDAsMiwwLDgzLDg5LDExMCwxLAotICAgIDAsODgsMTIxLDE3LDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMjUsMTI1LAotICAgIDIsMCw4NywxMTAsNDYsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDExOCwwLAotICAgIDEsMSwxLDEyNCwwLDAsMTA2LDYsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LAotICAgIDIsMCwxMjQsMiwwLDExNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDYwLDg5LAotICAgIDExMCwxLDAsODgsMTI0LDIsMCw4Myw0MSwzLDEyMiwyMTAsNzEsMTAxLDExNiwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwMiwxMTQsCi0gICAgMTExLDEwOSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDUsMTEwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsNDQsMzIsMTAyLDEwNSwxMTAsMTAwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDk3LDExMiwxMTIsMTE0LDExMSwxMTIsMTE0LDEwNSw5NywxMTYsMTAxLAotICAgIDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDk3LDExMCwxMDAsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMDUsMTE2LDQ2LDMyLDczLDEwMiwKLSAgICAzMiwxMTAsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsMTE4LAotICAgIDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NCwzMiwxMTUsMTE2LDExMSwxMTQsMTAxLDMyLDc4LAotICAgIDExMSwxMTAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwzMCwKLSAgICAwLDAsMCw3OCw0MSw3LDExNCwzLDAsMCwwLDExNCw0NSwwLDAsMCwKLSAgICAyMTgsMTcsNzAsMTA1LDEwOCwxMDEsNzgsMTExLDExNiw3MCwxMTEsMTE3LDExMCwxMDAsNjksMTE0LAotICAgIDExNCwxMTEsMTE0LDExNCw3LDAsMCwwLDExNCwyNTEsMCwwLDAsMTE0LDEzNywwLAotICAgIDAsMCwxMTQsMjU1LDAsMCwwLDQxLDMsMTE0LDE3MCwwLDAsMCwxMTQsMzUsCi0gICAgMCwwLDAsMTE0LDI1MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMjAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDM3LDQsMCwKLSAgICAwLDExNSwyMiwwLDAsMCwwLDgsMTIsMSwzLDEsMTYsMSwxMywzLAotICAgIDksMSwzLDEsMTcsMSwxMywxLDE1LDEsMTgsMSwxMjIsMzEsODAsOTcsCi0gICAgMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw5OSwzLDAsCi0gICAgMCwwLDAsMCwwLDAsNiwwLDAsMCwzLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxMTksMCwwLDAsMTE2LDAsMCwxMjQsMiwwLDEwMCwxLDAsCi0gICAgMTMxLDIsMCwxMTQsMzksMCwxMjQsMiwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsCi0gICAgMSwwLDkyLDIsMCwxMjUsMywwLDEyNSw0LDAsMTEwLDIxLDAsMTI0LDIsCi0gICAgMCwxMDYsMiwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMywwLDEwMywwLDAsCi0gICAgMTI1LDQsMCwxMjQsMywwLDEwMCwwLDAsMTA3LDksMCwxMTQsODgsMCwxMTYsCi0gICAgMywwLDEwNiw0LDAsMTI0LDEsMCwxMjQsMywwLDEzMSwyLDAsODMsMTE2LAotICAgIDMsMCwxMDYsNSwwLDEyNCwxLDAsMTAwLDAsMCwxMzEsMiwwLDEyNSw1LAotICAgIDAsMTI0LDQsMCwxMjQsNSwwLDk1LDYsMCwxMjQsNSwwLDgzLDQxLDIsCi0gICAgNzgsMTE0LDEyNCwwLDAsMCw0MSw3LDExNCwxMTUsMCwwLDAsMTE0LDEyNCwwLAotICAgIDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxMjEsMCwwLDAsMTE0LDE3OSwwLDAsCi0gICAgMCwxMTQsMTYwLDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsNiwxMTQsMTcwLDAsCi0gICAgMCwwLDExNCwxMjYsMCwwLDAsMTE0LDI1MywwLDAsMCwxMTQsMTI3LDAsMCwKLSAgICAwLDExNCwxMjgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTYsOTUsMTA4LDEwMSwxMDMsCi0gICAgOTcsOTksMTIxLDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDU5LDQsMCwwLAotICAgIDExNSwxOCwwLDAsMCwwLDQsMTUsMSwyNCwyLDE1LDEsNiwxLDEyLAotICAgIDEsMTYsMSwxOCwxLDksMSwxMjIsMjcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLAotICAgIDEwMCwxMDEsMTE0LDQ2LDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwKLSAgICAxMTUsMTEyLDEwMSw5OSw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOSwwLAotICAgIDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwyNDMsMCwwLDAsMTAzLAotICAgIDAsMCwxMjUsNCwwLDEyMCwyMzAsMCwxMjQsMiwwLDY4LDkzLDE5MSwwLDEyNSwKLSAgICA1LDAsMTE2LDAsMCwxMjQsNSwwLDExNiwxLDAsMTE2LDIsMCwxMDIsMiwKLSAgICAwLDEzMSwyLDAsMTE1LDQzLDAsMTEzLDEzLDAsMTI0LDAsMCwxMDYsMywwLAotICAgIDEyNCw1LDAsMTMxLDEsMCwxMjUsNiwwLDEyNCw2LDAsMTAwLDEsMCwxMDcsCi0gICAgOSwwLDExNCwxMywwLDExNiw0LDAsMTI0LDYsMCwxMDAsMiwwLDEzMSwyLAotICAgIDAsMTE0LDEwNiwwLDEyNCw2LDAsMTA2LDUsMCwxMjQsMSwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCwxMjUsNywwLDExMCwxOCwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsCi0gICAgMSwwLDEyNCw2LDAsMTMxLDIsMCwxMjUsNywwLDEyNCw3LDAsMTAwLDEsCi0gICAgMCwxMDcsOCwwLDExNCwxMzksMCwxMTMsMTMsMCwxMjQsNywwLDEwNiw3LDAsCi0gICAgMTAwLDEsMCwxMDcsOSwwLDExNCwxNTgsMCwxMjQsNywwLDgzLDEyNCw3LDAsCi0gICAgMTA2LDgsMCwxMjUsOCwwLDEyNCw4LDAsMTAwLDEsMCwxMDcsOCwwLDExNCwKLSAgICAxOTEsMCwxMTYsOSwwLDEwMCwzLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCw0LAotICAgIDAsMTA2LDEwLDAsMTI0LDgsMCwxMzEsMSwwLDEsMTEzLDEzLDAsODcsMTE2LAotICAgIDExLDAsMTA2LDEyLDAsMTI0LDEsMCwxMDAsMSwwLDEzMSwyLDAsMTI1LDcsCi0gICAgMCwxMjQsNCwwLDEyNCw3LDAsOTUsOCwwLDEyNCw3LDAsODMsMTAwLDEsCi0gICAgMCw4Myw0MSw0LDEyMiw2Myw3MCwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExMSwxMTQsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5NywKLSAgICA5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDUsMTE1LAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ3LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwKLSAgICAxMTAsOTcsMTA5LDEwMSw0Niw3OCwxMTQsMTgxLDAsMCwwLDEyMiwxOSwxMTUsMTEyLDEwMSwKLSAgICA5OSwzMiwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0MSwxMywxMTQsMTQzLDAsMCwwLDExNCw2OSwwLDAsMCwyMTgsNSw5OCwxMjEsCi0gICAgMTE2LDEwMSwxMTUsMTE0LDEsMSwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTgxLDAsCi0gICAgMCwwLDExNCwyLDEsMCwwLDExNCwxMjcsMCwwLDAsMTE0LDE1NiwwLDAsCi0gICAgMCwxMTQsMTA3LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDEyMSwwLDAsMCwKLSAgICAxMTQsMTYwLDAsMCwwLDQxLDksMTE0LDE3MCwwLDAsMCwxMTQsMTI2LDAsMCwKLSAgICAwLDExNCwzNSwwLDAsMCwxMTQsMTgwLDAsMCwwLDIxOCwxNCwxMTAsOTcsMTA5LAotICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCw5MCw1LDEwMSwxMTAsMTE2LAotICAgIDExNCwxMjEsMTE0LDI1MywwLDAsMCwxMTQsMTY0LDAsMCwwLDExNCwxMjgsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDksOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzQsNCwwLDAsMTE1LAotICAgIDQwLDAsMCwwLDAsNSw2LDEsMTMsMSwyMSwxLDMsMSwxNSwxLAotICAgIDEyLDEsMTUsMSwyMSwyLDE4LDEsMTIsMSwzLDEsMTUsMSw0LDEsCi0gICAgOSwxLDEyLDEsMTIsNSwxNywyLDE4LDEsOSwxLDEyMiwyMCw4MCw5NywKLSAgICAxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwKLSAgICAxMDEsOTksOTksNCwwLDAsMCwwLDAsMCwwLDYsMCwwLDAsNCwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTQwLDAsMCwwLDEyNCwyLDAsMTAwLAotICAgIDEsMCwxMDcsOCwwLDExNCwyMSwwLDExNiwwLDAsMTA2LDEsMCwxMjUsMiwKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMjQsMSwwLDEyNCwyLDAsMTI0LDMsMCwKLSAgICAxMzEsMywwLDEyNSw0LDAsMTI0LDQsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDU4LDAsMTAwLDEsMCw4MywxMjQsNCwwLDEwNiwzLDAsMTAwLDEsMCwxMDcsCi0gICAgOCwwLDExNCwxMzIsMCwxMjQsNCwwLDEwNiw0LDAsMTI1LDUsMCwxMjQsNSwKLSAgICAwLDExNCwxMjUsMCwxMDAsMiwwLDEyNCw0LDAsOTUsNSwwLDExNiw2LDAsCi0gICAgMTI0LDEsMCwxMjQsNSwwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMywwLDEyNCwKLSAgICA0LDAsOTUsNCwwLDEyNCw0LDAsODMsMTAwLDEsMCw4MywxMTAsNCwwLAotICAgIDEyNCw0LDAsODMsMTAwLDEsMCw4Myw0MSwzLDEyMiw5OCwxMDIsMTA1LDExMCwxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTExLDExMCwzMiwxMTUsCi0gICAgMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiwxMTEsMTE0LDMyLDM5LDExMiw5NywxMTYsMTA0LAotICAgIDM5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLAotICAgIDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiw5NywxMTAsMTAwLDEwLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNSwKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw0Niw3OCw5MCwKLSAgICA5LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDcsMTE0LDcsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw1LDEsMCwwLDExNCwxMjcsMCwwLDAsCi0gICAgMTE0LDE1NiwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwyMzAsMCwwLDAsNDEsCi0gICAgNiwxMTQsMTcwLDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDExNCwxODAsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsNCwxLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTgxLAotICAgIDAsMCwwLDEwNiw0LDAsMCwxMTUsMjYsMCwwLDAsMCw0LDEyLDEsCi0gICAgOSwxLDIxLDEsMTIsMSw0LDEsMTUsMSw5LDEsNiwzLDksMSwKLSAgICAyNCwxLDQsMiw3LDIsMTIyLDIwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsCi0gICAgMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsCi0gICAgMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNDEsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTI0LAotICAgIDIsMCwxMzEsMiwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsMSwwLDEwNyw4LAotICAgIDAsMTE0LDM0LDAsMTAwLDEsMCw4MywxMjQsMywwLDEwNiwxLDAsODMsNDEsCi0gICAgMiwxMjIsMTcwLDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwKLSAgICAxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLAotICAgIDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LAotICAgIDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsCi0gICAgNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSwKLSAgICA5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAotICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxODEsMCwwLDAsMTE0LDEyNywwLDAsMCw0MSw0LDExNCwxNzAsMCwwLAotICAgIDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE2NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMTgyLDAsMCwwLDEyOCw0LDAsMCwxMTUsOCwwLDAsMCwwLDgsMTgsCi0gICAgMSwxMiwxLDQsMSwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwxMiwxMTQsCi0gICAgMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LAotICAgIDAsMCwwLDExNCwxODMsMCwwLDAsMTE0LDI1MCwwLDAsMCwxMTQsMjU1LDAsCi0gICAgMCwwLDExNCwxLDEsMCwwLDExNCwyLDEsMCwwLDExNCw1LDEsMCwKLSAgICAwLDExNCwxODEsMCwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjQ5LDAsMCwwLDgsNCwwLDAsMTE1LDIyLDAsMCwwLDEyLDIsNiwKLSAgICAyLDE4LDgsMTgsMTcsMTgsMjIsMTgsMTUsMywxLDE4LDMxLDMsMSwyMSwKLSAgICAyMSwzLDEsMTE0LDI0OSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSwxMzMsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDEsNiwwLDkwLAotICAgIDcsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw4LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEwMCwxMiwwLDEzMiwxLDAsOTAsMTAsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsCi0gICAgMCwwLDkwLDExLDAsMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsCi0gICAgMCwxMzEsMSwwLDkwLDEzLDAsMTAwLDE3LDAsMTAwLDE4LDAsMTMyLDAsMCwKLSAgICA5MCwxNCwwLDEwMCwxMCwwLDgzLDQxLDE5LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwxNzIsNzAsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsCi0gICAgMTEwLDExNiwxMDEsMTE0LDk3LDk5LDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwKLSAgICAzMiw5NywxMTQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSw5NywxMTAsOTksMTAxLDQ0LDMyLDk4LDEwMSwxMDUsCi0gICAgMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLDExNSwxMDQsMTAxLDEwMCwKLSAgICAzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwKLSAgICAxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsOTcsMTE1LDMyLDk4LAotICAgIDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNSwwLDAsMCw3LDAsMCwwLDExNSwxMjIsMCwwLDAsMTAzLDAsMCwKLSAgICAxMjUsMywwLDEyMCw1MiwwLDEyNCwyLDAsNjgsOTMsNDQsMCw5MiwyLDAsCi0gICAgMTM3LDAsMCwxMjUsNCwwLDEyNCwzLDAsMTA2LDAsMCwxMzUsMCwwLDEwMiwKLSAgICAxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI0LDQsMCw2OCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMjQsMywwLDEyNCwwLDAsCi0gICAgOTUsMSwwLDEyNCwxLDAsMTEyLDc5LDAsMTAwLDMsMCwxMjQsMCwwLDk1LAotICAgIDIsMCwxMDAsNiwwLDEyNCwwLDAsOTUsMywwLDExNiw0LDAsMTMxLDAsCi0gICAgMCwxMjQsMCwwLDk1LDUsMCwxMTYsNCwwLDEzMSwwLDAsMTI0LDAsMCwKLSAgICA5NSw2LDAsMTAwLDUsMCw4Myw0MSw3LDEyMiwxNTQsNzMsMTEwLDEwNSwxMTYsMTA1LAotICAgIDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTExLDExMCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDk3LDMyLDExOCw5NywxMTQsMTA1LDk3LDk4LDEwOCwxMDEsMzIsCi0gICAgMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDUwLDQ1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE1LDMyLDk5LDExMSwxMTAsMTE2LDk3LAotICAgIDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTE3LAotICAgIDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEwMSw5OSwxMTEsMTAzLDExMCwKLSAgICAxMDUsMTIyLDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMywwLDAsMCw1MSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LAotICAgIDAsMCw5MywxNywwLDEyNSwxLDAsMTI0LDEsMCwxMzYsMCwwLDEwMiwyLAotICAgIDAsODYsMSwxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwyMiwwLDAsMCwxMTQsMjI1LDAsMCwwLDQxLDEsCi0gICAgMTE0LDEyNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjI3LDAsMCwwLDE1Nyw0LDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDM4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwKLSAgICAxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsCi0gICAgMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDU4LDAsMCwwLDExNCwyOSwwLDAsCi0gICAgMCw3OCwxMTQsODcsMCwwLDAsNDEsNywxMTQsMTQ5LDAsMCwwLDIxOCw4LAotICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwzNSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMywxMTUsMTAxLDExNiwyMTgsCi0gICAgMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSwyMTgsMTksOTUsMTE0LAotICAgIDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0MSw1LDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwxNCwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDcsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICA0MSwxLDExNCwxMjcsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NSwwLDAsCi0gICAgMCwxNTEsNCwwLDAsMTE1LDE2LDAsMCwwLDAsNCw2LDEsMTksMSwKLSAgICAzNiwxLDksMiwxNSwxLDksMSwxMiwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKLSAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMDAsMywwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEwMCwyLDAsODMsNDEsNCwxMjIsMzEsNzMsMTEwLDExOCw5NywxMDgsMTA1LAotICAgIDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLAotICAgIDExNCwxMjEsMzIsMTA5LDExNiwxMDUsMTA5LDEwMSw0NiwxMTQsMjksMCwwLDAsNzgsMTE0LAotICAgIDg3LDAsMCwwLDQxLDEsMTE0LDgsMSwwLDAsNDEsMSwxMTQsMTA4LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwyNTAsMCwwLDAsMTY1LDQsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLAotICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDU5LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsCi0gICAgMCwxMTQsMzcsMCwxMDAsMSwwLDEwMywwLDAsMTAyLDIsMCw4MywxMjQsMiwKLSAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMDYsMiwwLDExMiw1NSwwLDEwMywwLDAsCi0gICAgMTAyLDIsMCw4Myw0MSwyLDEyMiwxOTcsODQsMTE0LDEyMSwzMiwxMTYsMTExLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwKLSAgICA0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsCi0gICAgMTExLDExMCwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAotICAgIDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLAotICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsCi0gICAgOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDMsCi0gICAgMTE0LDE4MSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsCi0gICAgMywxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDE2NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMTI0LDAsMCwwLDE3MSw0LDAsMCwxMTUsOCwwLDAsMCwwLDcsMTUsCi0gICAgMSwxMiwxLDEwLDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTksNiwwLAotICAgIDAsMCwwLDAsMCwwLDcsMCwwLDAsNywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNDAsMCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCwxMjUsNiwwLDExNiwwLDAsMTI0LDIsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTI0LDYsMCwxMDAsMiwwLDEyNCw0LDAsMTMxLDIsMiw4Myw0MSwKLSAgICAzLDc4LDExNCwxMjcsMCwwLDAsMTE0LDE1NiwwLDAsMCw0MSwxLDExNCwxNjcsCi0gICAgMCwwLDAsNDEsNywxMTQsMTA4LDAsMCwwLDExNCwxNjUsMCwwLDAsMTE0LAotICAgIDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LAotICAgIDE4MCwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCw1LDEsMCwwLDE4Myw0LDAsCi0gICAgMCwxMTUsNiwwLDAsMCwwLDEsMTUsMSwxOCwxLDEyMiwyMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsCi0gICAgMTAxLDk5LDc4LDk5LDMsMCwwLDAsMCwwLDAsMCwxNCwwLDAsMCwKLSAgICAxNSwwLDAsMCw2NywwLDAsMCwxMTUsMjM0LDEsMCwwLDEwMCwxLDAsCi0gICAgMTI1LDMsMCwxMjQsMSwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsMSwwLDEwMCwKLSAgICAzLDAsMjUsMTI1LDQsMCwxMjEsMzQsMCwxMTYsMSwwLDEyNCwwLDAsMTA2LAotICAgIDIsMCwxMTIsNDksMCwxMTYsMywwLDEwNiw0LDAsMTMxLDAsMCwxMzEsMSwKLSAgICAwLDEwNiw1LDAsMTI1LDUsMCw4NywxMTAsMjQsMCw0LDExNiw2LDAsMTA3LAotICAgIDEwLDAsMTE0LDg1LDAsMSwxLDEsMTAwLDEwLDAsMTI1LDUsMCw4OSwxMTAsCi0gICAgMSwwLDg4LDEyNCw1LDAsMTI0LDAsMCwxMDYsNywwLDEwNywzLDAsMTE0LAotICAgIDEyMCwwLDEyNCwwLDAsMTA2LDgsMCwxMzEsMCwwLDEsMTI0LDUsMCwxMjQsCi0gICAgMCwwLDk1LDcsMCwxMTYsOSwwLDEzMSwwLDAsMTE0LDE1MywwLDEyNCwwLAotICAgIDAsMTA2LDEwLDAsMTI1LDYsMCwxMjQsNCwwLDEwNiwxMSwwLDEzMSwwLDAsCi0gICAgMTI1LDcsMCwxMTAsMTUsMCwxMjQsMCwwLDEwNiwxMiwwLDEyNSw2LDAsMTI0LAotICAgIDQsMCwxMjUsNywwLDEyNCw3LDAsMTI0LDYsMCwxMDcsNiwwLDExNCw0NSwKLSAgICAxLDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEzMSwyLDAsCi0gICAgMTI1LDgsMCwxMjAsMTAwLDAsMTI0LDAsMCwxMDYsMTQsMCw2OCw5Myw3NywwLAotICAgIDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLDEwMCw1LDAsMTI0LDksMCwyMywKLSAgICAxMjUsMTEsMCwxMTYsMTMsMCwxMjQsOCwwLDEyNCwxMSwwLDEzMSwyLDAsMTI1LAotICAgIDEyLDAsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsMCwxMTQsMjA4LDAsMTI0LDAsCi0gICAgMCwxMDYsMTYsMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEyNCw4LDAsCi0gICAgMTAzLDEsMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDIwOCwwLDg3LDExNiwxNywKLSAgICAwLDEyNCw4LDAsMTMxLDEsMCwxMjUsMywwLDEyMCwxMjMsMCwxMjQsMCwwLAotICAgIDEwNiwxNCwwLDY4LDkzLDExMiwwLDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLAotICAgIDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEyNCw5LDAsMjMsCi0gICAgMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTgsMCwxMDAsNiwwLDEwNiwxOSwwLDEyNCwKLSAgICAxMiwwLDEzMSwxLDAsMTAwLDcsMCwxMDAsMywwLDEzMSwxLDEsMSwxMjQsCi0gICAgNywwLDEyNCw5LDAsMjMsMTI0LDYsMCwxMDcsNiwwLDExNCw1NSwxLDExNiwKLSAgICAxNSwwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LDU1LDEsMTI0LDAsMCwxMDYsMTYsCi0gICAgMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEwMCw4LDAsMTI0LDIsMCwKLSAgICAxMzEsNSwwLDgzLDExMyw1NSwxLDg3LDEyNCwzLDAsMTE0LDIzMCwxLDExNiwxOCwKLSAgICAwLDEwMCw5LDAsMTA2LDE5LDAsMTI0LDgsMCwxMzEsMSwwLDEzMSwxLDAsCi0gICAgMSwxMTYsMjAsMCwxMDYsMjEsMCwxMjQsMSwwLDEwMCw4LDAsMTMxLDIsMCwKLSAgICAxMjUsMTMsMCwxMjQsOCwwLDEwMywxLDAsMTI0LDEzLDAsOTUsMjIsMCwxMjQsCi0gICAgMTMsMCw4MywxMDAsOCwwLDgzLDQxLDExLDEyMiwxMjUsODQsMTE0LDEyMSwzMiwxMTYsCi0gICAgMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwKLSAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDExNSw0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDEsNDYsNzAsMTE0LDU4LDAsMCwwLDExNCw1NiwKLSAgICAwLDAsMCwxMTQsMjksMCwwLDAsMTE0LDE4NSwwLDAsMCwxMjIsOSwxMTYsCi0gICAgMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMjMsMTI1LDExNCw5OCwwLDAsMCw3OCwxMjIsMjUsCi0gICAgMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsCi0gICAgOTksMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMywxMjUsMTE0LDg3LDAsMCwwLDQxLDIzLAotICAgIDExNCwzMiwwLDAsMCwxMTQsMzksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKLSAgICAzLDAsMCwwLDExNCw0NSwwLDAsMCwxMTQsMjE5LDAsMCwwLDExNCw0MCwKLSAgICAwLDAsMCwxMTQsOCwxLDAsMCwyMTgsMTEsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTE0LDYsMCwwLDAsMTE0LDExLDEsMCwwLDExNCwKLSAgICA4OCwwLDAsMCwxMTQsMTAsMSwwLDAsMTE0LDI4LDAsMCwwLDExNCw3LAotICAgIDEsMCwwLDExNCw0NCwwLDAsMCwxMTQsNSwxLDAsMCwxMTQsNDYsMCwKLSAgICAwLDAsMTE0LDEwNSwwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDEyMSwwLDAsCi0gICAgMCwxMTQsMTYwLDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsMTQsMTE0LDEwOCwwLAotICAgIDAsMCwxMTQsMTI2LDAsMCwwLDExNCwxODAsMCwwLDAsOTAsMTIsMTA1LDExNSwKLSAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5MCwxMSwxMTYsOTcsMTA1LDEwOCwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTMzLDAsMCwwLDkwLDUsOTksOTcsCi0gICAgOTksMTA0LDEwMSw5MCwxMiw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDkwLDksOTgsOTcsMTE1LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMjI1LDAsMCwKLSAgICAwLDExNCwxNjUsMCwwLDAsOTAsMTMsMTA1LDExMCwxMDUsMTE2LDk1LDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSw5MCw5LDEwMiwxMTcsMTA4LDEwOCw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICAxMTQsMTY0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODEsMCwwLDAsMTg4LDQsMCwwLDExNSw2OCwwLAotICAgIDAsMCwwLDMsNiwxLDE5LDEsMywxLDM0LDEsMTMsMSwxMSwxLAotICAgIDE1LDEsMTAsMSw5LDIsOSwxLDksMSwxNSwyLDksMSw2LDIsCi0gICAgMTIsMSwxOCwxLDIyLDEsMTAsMSwxNSwxLDEyLDEsMzIsNCwxMiwyLAotICAgIDIyLDEsMjIsMSwyNSwxLDE2LDEsMTIsMSwyOSwxLDYsMSwxOSwxLAotICAgIDE4LDEsMTIsMSw0LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCw5LDAsMCwwLDEzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxMSwxLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMjEsCi0gICAgMzEsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwxMTIsMzMsMCwxMTYsMSwKLSAgICAwLDEwNiwzLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwyLDAsODcsMTEwLDMzLAotICAgIDAsNCwxMTYsNCwwLDExNiw1LDAsMTE2LDYsMCwxMDIsMywwLDEwNywxMCwKLSAgICAwLDExNCw3NSwwLDEsMSwxLDEwMywwLDAsMTI1LDIsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDExNiw3LDAsMTA2LDgsMCwxMDYsOSwwLDEwMCwxLDAsMTMxLDEsCi0gICAgMCwxMTUsMTEyLDAsMTE2LDEwLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCwwLDAsCi0gICAgOTUsMTEsMCwxMTAsMTExLDAsMTE2LDEwLDAsMTMxLDAsMCwxMjUsMywwLDEyMCwKLSAgICA5MCwwLDEyNCwyLDAsNjgsOTMsODIsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LAotICAgIDEyLDAsMTAwLDIsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNSwwLDEyNSw2LAotICAgIDAsMTI1LDcsMCwxMjQsNiwwLDExNCwxOTEsMCwxMDAsMywwLDEwNiwxMywwLAotICAgIDEyNCw1LDAsMTI0LDcsMCwxMDYsMTQsMCwxMzEsMCwwLDEzMSwyLDAsMTI1LAotICAgIDgsMCwxMTAsNiwwLDEyNCw1LDAsMTI1LDgsMCwxMjQsMywwLDEwNiwxNSwKLSAgICAwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywxMjgsMCw4NywxMjQsMywwLDEyNCwKLSAgICAwLDAsOTUsMTEsMCwxMTYsNywwLDEwNiw4LDAsMTA2LDksMCwxMTYsMTYsCi0gICAgMCwxMzEsMSwwLDExNCw3LDEsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsCi0gICAgMTI0LDIsMCw2OCwxMzEsMSwwLDEyNCwwLDAsOTUsMTcsMCwxMDAsNiwwLAotICAgIDgzLDQxLDcsMTIyLDY4LDcwLDEwNSwxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LAotICAgIDk5LDEwNCwxMDEsMzIsMTExLDEwMiwzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwKLSAgICAxMDcsOTcsMTAzLDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMCwKLSAgICAxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDYsMTE0LDAsMCwwLDAsMTE0LDU4LAotICAgIDAsMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDgzLDAsMCwwLDExNSwKLSAgICAyOCwwLDAsMCwxMDQsMCwwLDEyNCwwLDAsOTMsMTgsMCwxMjUsMSwwLAotICAgIDEyNCwxLDAsMTA2LDAsMCwxMzEsMCwwLDE0NiwyLDAsMTEzLDYsMCw4MywKLSAgICAxMTQsNCwwLDAsMCw0MSwxLDExNCw4OCwwLDAsMCw0MSwyLDExNCwyMiwKLSAgICAwLDAsMCw5MCwyLDEwMiwxMTAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsCi0gICAgNjIsNiw1LDAsMCwxMTUsMiwwLDAsMCw5LDAsMTIyLDQxLDcwLDEwNSwKLSAgICAxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDExNSwKLSAgICAxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDc4LDQxLDE4LDExNCwzNSwwLDAsMCwxMTQsCi0gICAgMywwLDAsMCw5MCw3LDEwOCwxMDUsMTE1LDExNiwxMDAsMTA1LDExNCwxMTQsNDUsMCwKLSAgICAwLDAsMTE0LDAsMSwwLDAsMjE4LDE1LDgwLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LAotICAgIDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwyMTgsMTgsNzgsMTExLDExNiw2NSw2OCwxMDUsCi0gICAgMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw3LDAsMCwKLSAgICAwLDExNCw4LDAsMCwwLDExNCw5LDAsMCwwLDExNCw5LDEsMCwwLAotICAgIDExNCwxMCwxLDAsMCwxMTQsODMsMCwwLDAsMTE0LDQ3LDAsMCwwLDExNCwKLSAgICA4OCwwLDAsMCwyMTgsMyw5NywxMDAsMTAwLDExNCwxMCwwLDAsMCwxMTQsMTEsCi0gICAgMSwwLDAsNDEsOSwxMTQsMTA4LDAsMCwwLDExNCwzNSwwLDAsMCw5MCwKLSAgICA4LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSw5MCwyMSwxMDgsMTExLDExOSwxMDEsMTE0LAotICAgIDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDk1LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwKLSAgICAxMTQsMjQ1LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDIzNywwLDAsMCwxMTQsCi0gICAgMjI1LDAsMCwwLDkwLDgsMTEwLDEwMSwxMTksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDEzLDEsCi0gICAgMCwwLDIzMyw0LDAsMCwxMTUsMzQsMCwwLDAsMCwyLDksMSwzLAotICAgIDEsMzEsMSwyMiwzLDExLDMsMTgsMSwxOCw3LDksMSwxMywxLDI0LAotICAgIDEsNiwxLDI3LDIsNiwxLDE3LDEsOSwxLDE4LDEsMTIyLDIyLDcwLAotICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKLSAgICAwLDAsMywwLDAsMCw3LDAsMCwwLDExNSwyNSwwLDAsMCwxMzUsCi0gICAgMCwwLDEzNSwxLDAsMTAyLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTM0LDAsCi0gICAgMCwxMjUsMiwwLDEyNCwyLDAsODMsNDEsMyw5NywyMCwxLDAsMCw2NSwKLSAgICAzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LAotICAgIDEwNSw5OSwxMDQsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDk5LDEwOCwKLSAgICAxMTEsMTE1LDExNywxMTQsMTAxLDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTExLDExMCwzMiwKLSAgICAxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMDUsMTA4LDEwOCwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywxMTAsMzIsMTA1LDExMCwxMTUsMTE2LDk3LAotICAgIDExMCw5OSwxMDEsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLAotICAgIDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LAotICAgIDEwOCwxMTEsMTE1LDExNywxMTQsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw0NCwzMiw3MywxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDMsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTE1LDMwLDAsMTE2LDEsMCwxMDAsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwKLSAgICAwLDEzNiwxLDAsMTQwLDEsMCw4Myw0MSwzLDEyMiw0NSw4MCw5NywxMTYsMTA0LAotICAgIDMyLDEwNCwxMTEsMTExLDEwNywzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDgsMTA1LDk4LDQ2LDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSw0Niw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEyMiwzMCwxMTEsMTEwLDEwOCwxMjEsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEwNSwxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsCi0gICAgMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMTE0LDM1LDAsMCwwLDQxLDIsCi0gICAgMTE0LDQ2LDAsMCwwLDExNCwxMDcsMCwwLDAsNDEsMSwxMTQsMzUsMCwwLAotICAgIDAsNDEsMiwxMTQsMTcwLDAsMCwwLDExNCwxMiwxLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMjQsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwKKyAgICAxLDAsOTAsMywwLDEwMSw0LDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAorICAgIDAsMTMxLDEsMCw5MCw1LDAsMTAxLDQsMCwxMDAsNCwwLDEwMCw1LDAsCisgICAgMTMyLDAsMCwxMzEsMSwwLDkwLDYsMCwxMDEsNCwwLDEwMCw2LDAsMTAwLAorICAgIDcsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNywwLDEwMSw0LDAsMTAwLDgsCisgICAgMCwxMDAsOSwwLDEzMiwwLDAsMTMxLDEsMCw5MCw4LDAsMTAxLDQsMCwKKyAgICAxMDAsMTAsMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMSwwLDEzMSwxLDAsOTAsCisgICAgOSwwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDEwLDAsMTAwLDEzLDAsMTAwLDE0LAorICAgIDAsMTMyLDIsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDQsMCwxMDAsMTAsMCwKKyAgICAxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMSwwLDEzMSwxLDAsOTAsMTEsMCwxMDAsCisgICAgMTAsMCw4Myw0MSwxNywyMTgsMTAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLAorICAgIDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LAorICAgIDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk1LDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDk1LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsCisgICAgNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsNTUsMCwwLDAsMTIwLDQ4LDAsMTE2LDAsCisgICAgMCwxMDYsMSwwLDEwNiwyLDAsMTMxLDAsMCw2OCw5MywzMSwwLDEyNSwxLAorICAgIDAsMTE2LDMsMCwxMjQsMSwwLDEwMCwxLDAsMTMxLDIsMCwxMTQsMTYsMCwKKyAgICAxMjQsMSwwLDEwNiw0LDAsMTMxLDAsMCwxLDExMywxNiwwLDg3LDEwMCwyLAorICAgIDAsODMsNDEsMywxMjIsMTI1LDY3LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LAorICAgIDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSwKKyAgICA0MCw0MSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTEsMTEwLDMyLDk3LDEwOCwxMDgsCisgICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDIsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExNiwxMTEsMTE0LAorICAgIDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDMyLDQwLAorICAgIDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLAorICAgIDEwMCw0MSw0NiwyMTgsMTcsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDExNSw3OCw0MSw1LDExNCw3LDAsMCwwLDIxOCwxOSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LAorICAgIDk5LDEwNCwxMDEsMjE4LDYsMTE4LDk3LDEwOCwxMTcsMTAxLDExNSwxMTQsMTA4LDAsMCwwLAorICAgIDExNCwyNDQsMCwwLDAsNDEsMiwxMTQsMTY0LDAsMCwwLDIxOCw2LDEwMiwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwyNDQsMCwwLDAsOSw0LDAsMCwxMTUsNiwwLDAsCisgICAgMCwwLDQsMjIsMSwxNSwxLDEyMiwyOCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSwKKyAgICA5Nyw5OSwxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsMTA3LDAsMCwwLDExNiwKKyAgICAwLDAsMTA2LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDQxLDAsMTE2LDAsCisgICAgMCwxMDYsMSwwLDEyLDExNCw0MSwwLDExNiwyLDAsMTA2LDMsMCwxMDAsMiwKKyAgICAwLDExNiw0LDAsMTMxLDIsMCwxLDEyMCw1OSwwLDExNiwwLDAsMTA2LDEsCisgICAgMCw2OCw5Myw0NCwwLDEyNSwyLDAsMTIxLDE0LDAsMTI0LDIsMCwxMjQsMSwKKyAgICAwLDEzMSwxLDAsODMsODcsMTEzLDUxLDAsNCwxMTYsNSwwLDEwNywxMCwwLAorICAgIDExNCw5NCwwLDEsMSwxLDExOSw1MSwwLDg5LDExMyw1MSwwLDg4LDExMyw1MSwKKyAgICAwLDg3LDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwzLDEyMiwxMTMsODMsMTAxLAorICAgIDk3LDExNCw5OSwxMDQsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksMTAxLDMyLDExMSwxMDIsCisgICAgMzIsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDIsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMzksMTA0LDExMSwxMTEsCisgICAgMTA3LDExNSwzOSwzMiwxMDUsMTE1LDMyLDEwMiw5NywxMDgsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwKKyAgICAxMTAsMzIsMTE3LDExNSwxMDEsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LAorICAgIDExMSwxMTEsMTA3LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwKKyAgICAxMjIsMjMsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwKKyAgICAzMiwxMDUsMTE1LDMyLDEwMSwxMDksMTEyLDExNiwxMjEsNDEsNiwxMTQsNywwLDAsMCwKKyAgICAyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwxMTQsNjAsMCwwLAorICAgIDAsMTE0LDYxLDAsMCwwLDExNCwxMTgsMCwwLDAsMTE0LDk5LDAsMCwwLAorICAgIDQxLDMsMTE0LDE2NCwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMDQsMTExLAorICAgIDExMSwxMDcsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAorICAgIDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMTcsNCwKKyAgICAwLDAsMTE1LDE2LDAsMCwwLDAsNywyNSwxLDE2LDEsMTYsMSwzLAorICAgIDEsMTQsMSwxMywxLDEyLDIsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDE5LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSwxMjMsMCwwLDAsMTI0LDEsMCwxMDAsMSwwLDEwNywKKyAgICAyLDAsMTE0LDUzLDAsMTIxLDE2LDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLAorICAgIDAsMTI1LDEsMCw4NywxMTAsMjIsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LAorICAgIDUyLDAsMSwxLDEsMTAwLDIsMCw4Myw4OSwxMTAsMSwwLDg4LDEyMSwxNywKKyAgICAwLDExNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDI1LDEyNSwyLDAsODcsMTEwLAorICAgIDQ2LDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxMTgsMCwxLDEsMSwxMjQsCisgICAgMCwwLDEwNiw2LDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsCisgICAgMCwxMTYsMywwLDEwNiw0LDAsMTI0LDEsMCw2MCw4OSwxMTAsMSwwLDg4LAorICAgIDEyNCwyLDAsODMsNDEsMywxMjIsMjEwLDcxLDEwMSwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LAorICAgIDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwKKyAgICA5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwKKyAgICAxMTQsMTIxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw5OSw5Nyw5OSwxMDQsMTAxLDQ0LDMyLDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw5NywxMTIsMTEyLDExNCwxMTEsMTEyLDExNCwxMDUsOTcsMTE2LDEwMSwzMiwxMDIsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5NywxMTAsMTAwLDMyLAorICAgIDk5LDk3LDk5LDEwNCwxMDEsMzIsMTA1LDExNiw0NiwzMiw3MywxMDIsMzIsMTEwLDExMSwzMiwKKyAgICAxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LAorICAgIDk4LDEwOCwxMDEsNDQsMzIsMTE1LDExNiwxMTEsMTE0LDEwMSwzMiw3OCwxMTEsMTEwLDEwMSw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMzAsMCwwLDAsNzgsCisgICAgNDEsNywxMTQsMywwLDAsMCwxMTQsNDUsMCwwLDAsMjE4LDE3LDcwLDEwNSwKKyAgICAxMDgsMTAxLDc4LDExMSwxMTYsNzAsMTExLDExNywxMTAsMTAwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsCisgICAgNywwLDAsMCwxMTQsMjQ1LDAsMCwwLDExNCwxMzEsMCwwLDAsMTE0LDI0OSwKKyAgICAwLDAsMCw0MSwzLDExNCwxNjQsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKKyAgICAyNDcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMjE4LDIwLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSwzNCw0LDAsMCwxMTUsMjIsMCwKKyAgICAwLDAsMCw4LDEyLDEsMywxLDE2LDEsMTMsMyw5LDEsMywxLAorICAgIDE3LDEsMTMsMSwxNSwxLDE4LDEsMTIyLDMxLDgwLDk3LDExNiwxMDQsNzAsMTA1LAorICAgIDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTksMywwLDAsMCwwLDAsCisgICAgMCwwLDYsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTE5LAorICAgIDAsMCwwLDExNiwwLDAsMTI0LDIsMCwxMDAsMSwwLDEzMSwyLDAsMTE0LAorICAgIDM5LDAsMTI0LDIsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCw5MiwyLAorICAgIDAsMTI1LDMsMCwxMjUsNCwwLDExMCwyMSwwLDEyNCwyLDAsMTA2LDIsMCwKKyAgICAxMjQsMSwwLDEzMSwxLDAsMTI1LDMsMCwxMDMsMCwwLDEyNSw0LDAsMTI0LAorICAgIDMsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDg4LDAsMTE2LDMsMCwxMDYsNCwKKyAgICAwLDEyNCwxLDAsMTI0LDMsMCwxMzEsMiwwLDgzLDExNiwzLDAsMTA2LDUsCisgICAgMCwxMjQsMSwwLDEwMCwwLDAsMTMxLDIsMCwxMjUsNSwwLDEyNCw0LDAsCisgICAgMTI0LDUsMCw5NSw2LDAsMTI0LDUsMCw4Myw0MSwyLDc4LDExNCwxMTcsMCwKKyAgICAwLDAsNDEsNywxMTQsMTA4LDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDE3NiwKKyAgICAwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDE1NCwwLAorICAgIDAsMCwxMTQsMTUwLDAsMCwwLDQxLDYsMTE0LDE2NCwwLDAsMCwxMTQsMTE5LAorICAgIDAsMCwwLDExNCwyNDcsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTIxLDAsCisgICAgMCwwLDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwKKyAgICAxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw1Niw0LDAsMCwxMTUsMTgsMCwwLAorICAgIDAsMCw0LDE1LDEsMjQsMiwxNSwxLDYsMSwxMiwxLDE2LDEsMTgsCisgICAgMSw5LDEsMTIyLDI3LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKKyAgICA5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksCisgICAgNzgsOTksNCwwLDAsMCwwLDAsMCwwLDksMCwwLDAsNSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMjQzLDAsMCwwLDEwMywwLDAsMTI1LDQsCisgICAgMCwxMjAsMjMwLDAsMTI0LDIsMCw2OCw5MywxOTEsMCwxMjUsNSwwLDExNiwwLAorICAgIDAsMTI0LDUsMCwxMTYsMSwwLDExNiwyLDAsMTAyLDIsMCwxMzEsMiwwLAorICAgIDExNSw0MywwLDExMywxMywwLDEyNCwwLDAsMTA2LDMsMCwxMjQsNSwwLDEzMSwKKyAgICAxLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwxLDAsMTA3LDksMCwxMTQsMTMsCisgICAgMCwxMTYsNCwwLDEyNCw2LDAsMTAwLDIsMCwxMzEsMiwwLDExNCwxMDYsMCwKKyAgICAxMjQsNiwwLDEwNiw1LDAsMTI0LDEsMCwxMjQsMywwLDEzMSwyLDAsMTI1LAorICAgIDcsMCwxMTAsMTgsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDEsMCwxMjQsNiwKKyAgICAwLDEzMSwyLDAsMTI1LDcsMCwxMjQsNywwLDEwMCwxLDAsMTA3LDgsMCwKKyAgICAxMTQsMTM5LDAsMTEzLDEzLDAsMTI0LDcsMCwxMDYsNywwLDEwMCwxLDAsMTA3LAorICAgIDksMCwxMTQsMTU4LDAsMTI0LDcsMCw4MywxMjQsNywwLDEwNiw4LDAsMTI1LAorICAgIDgsMCwxMjQsOCwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTkxLDAsMTE2LDksCisgICAgMCwxMDAsMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsNCwwLDEwNiwxMCwwLAorICAgIDEyNCw4LDAsMTMxLDEsMCwxLDExMywxMywwLDg3LDExNiwxMSwwLDEwNiwxMiwKKyAgICAwLDEyNCwxLDAsMTAwLDEsMCwxMzEsMiwwLDEyNSw3LDAsMTI0LDQsMCwKKyAgICAxMjQsNywwLDk1LDgsMCwxMjQsNywwLDgzLDEwMCwxLDAsODMsNDEsNCwKKyAgICAxMjIsNjMsNzAsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwzMiwxMTEsMTE0LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw0NywxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgNDYsNzgsMTE0LDE3NSwwLDAsMCwxMjIsMTksMTE1LDExMiwxMDEsOTksMzIsMTA5LDEwNSwKKyAgICAxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsMTMsMTE0LDEzNywKKyAgICAwLDAsMCwxMTQsNjksMCwwLDAsMjE4LDUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwKKyAgICAyNTEsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMTc1LDAsMCwwLDExNCwyNTIsCisgICAgMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCw5OSwwLAorICAgIDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LDE1NCwwLDAsCisgICAgMCw0MSw5LDExNCwxNjQsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMzUsMCwKKyAgICAwLDAsMTE0LDE3NCwwLDAsMCwyMTgsMTQsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsNSwxMDEsMTEwLDExNiwxMTQsMTIxLDExNCwyNDcsCisgICAgMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsMTIxLDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw5LDk1LDEwMywKKyAgICAxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDcxLDQsMCwwLDExNSw0MCwwLDAsMCwKKyAgICAwLDUsNiwxLDEzLDEsMjEsMSwzLDEsMTUsMSwxMiwxLDE1LDEsCisgICAgMjEsMiwxOCwxLDEyLDEsMywxLDE1LDEsNCwxLDksMSwxMiwxLAorICAgIDEyLDUsMTcsMiwxOCwxLDksMSwxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDk5LDQsCisgICAgMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDQsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDE0MCwwLDAsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsCisgICAgMCwxMTQsMjEsMCwxMTYsMCwwLDEwNiwxLDAsMTI1LDIsMCwxMjQsMCwwLAorICAgIDEwNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxMjUsCisgICAgNCwwLDEyNCw0LDAsMTAwLDEsMCwxMDcsOCwwLDExNCw1OCwwLDEwMCwxLAorICAgIDAsODMsMTI0LDQsMCwxMDYsMywwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTMyLAorICAgIDAsMTI0LDQsMCwxMDYsNCwwLDEyNSw1LDAsMTI0LDUsMCwxMTQsMTI1LDAsCisgICAgMTAwLDIsMCwxMjQsNCwwLDk1LDUsMCwxMTYsNiwwLDEyNCwxLDAsMTI0LAorICAgIDUsMCwxMjQsMCwwLDEwNiwyLDAsMTMxLDMsMCwxMjQsNCwwLDk1LDQsCisgICAgMCwxMjQsNCwwLDgzLDEwMCwxLDAsODMsMTEwLDQsMCwxMjQsNCwwLDgzLAorICAgIDEwMCwxLDAsODMsNDEsMywxMjIsOTgsMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywKKyAgICAxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDEwNCwxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsNzgsOTAsOSwxMTAsOTcsMTA5LAorICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0MSw3LDExNCw3LDAsMCwwLDExNCwzNSwwLAorICAgIDAsMCwxMTQsMjU1LDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE1MCwwLDAsCisgICAgMCwxMTQsMTUyLDAsMCwwLDExNCwyMjQsMCwwLDAsNDEsNiwxMTQsMTY0LDAsCisgICAgMCwwLDExNCwxMTksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwxNzQsMCwwLAorICAgIDAsMTE0LDE1OCwwLDAsMCwxMTQsMjU0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzUsMCwwLDAsMTAzLAorICAgIDQsMCwwLDExNSwyNiwwLDAsMCwwLDQsMTIsMSw5LDEsMjEsMSwKKyAgICAxMiwxLDQsMSwxNSwxLDksMSw2LDMsOSwxLDI0LDEsNCwyLAorICAgIDcsMiwxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwKKyAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLAorICAgIDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0MSwwLAorICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLAorICAgIDAsMTI1LDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzQsMCwKKyAgICAxMDAsMSwwLDgzLDEyNCwzLDAsMTA2LDEsMCw4Myw0MSwyLDEyMiwxNzAsMTAyLAorICAgIDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwKKyAgICAxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsCisgICAgOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsCisgICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsCisgICAgMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LAorICAgIDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LAorICAgIDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDE3NSwwLDAsCisgICAgMCwxMTQsMTIwLDAsMCwwLDQxLDQsMTE0LDE2NCwwLDAsMCwxMTQsMTE5LDAsCisgICAgMCwwLDExNCwzNSwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzYsMCwwLDAsCisgICAgMTI1LDQsMCwwLDExNSw4LDAsMCwwLDAsOCwxOCwxLDEyLDEsNCwKKyAgICAxLDEyMiwyMiw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwKKyAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwxMDUsMCwwLDAsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LAorICAgIDE3NywwLDAsMCwxMTQsMjQ0LDAsMCwwLDExNCwyNDksMCwwLDAsMTE0LDI1MSwKKyAgICAwLDAsMCwxMTQsMjUyLDAsMCwwLDExNCwyNTUsMCwwLDAsMTE0LDE3NSwwLAorICAgIDAsMCwxMTQsMTc2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDMsMCwwLDAsCisgICAgNSw0LDAsMCwxMTUsMjIsMCwwLDAsMTIsMiw2LDIsMTgsOCwxOCwKKyAgICAxNywxOCwyMiwxOCwxNSwzLDEsMTgsMzEsMywxLDIxLDIxLDMsMSwxMTQsCisgICAgMjQzLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDMsMCwwLDAsNjQsMCwwLDAsMTE1LDEzMywwLDAsMCwxMDEsMCwKKyAgICAwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwKKyAgICAxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsCisgICAgNSwwLDEzMiwwLDAsOTAsNSwwLDEwMSw2LDAsOTAsNywwLDEwMCw2LAorICAgIDAsMTAwLDcsMCwxMzIsMCwwLDkwLDgsMCwxMDAsOCwwLDEwMCw5LDAsCisgICAgMTMyLDAsMCw5MCw5LDAsMTAwLDEwLDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLAorICAgIDEsMCw5MCwxMCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLDAsOTAsMTEsCisgICAgMCwxMDEsMTIsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMCwwLDEzMSwxLDAsCisgICAgOTAsMTMsMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDkwLDE0LDAsMTAwLAorICAgIDEwLDAsODMsNDEsMTksMjE4LDEwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsMTIyLDE3Miw3MCwxMDUsMTA4LDEwMSw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDIsMTA1LAorICAgIDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMTAsMTE2LDEwMSwxMTQsCisgICAgOTcsOTksMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDk3LDExNCwxMDEsCisgICAgMzIsOTksOTcsOTksMTA0LDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTAyLAorICAgIDExMSwxMTQsMTA5LDk3LDExMCw5OSwxMDEsNDQsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDEwLDMyLAorICAgIDMyLDMyLDMyLDExNCwxMDEsMTAyLDExNCwxMDEsMTE1LDEwNCwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLAorICAgIDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTA0LDk3LAorICAgIDExMCwxMDAsMTA4LDEwNSwxMTAsMTAzLDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsCisgICAgMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw1LDAsMCwwLAorICAgIDcsMCwwLDAsMTE1LDEyMiwwLDAsMCwxMDMsMCwwLDEyNSwzLDAsMTIwLAorICAgIDUyLDAsMTI0LDIsMCw2OCw5Myw0NCwwLDkyLDIsMCwxMzcsMCwwLDEyNSwKKyAgICA0LDAsMTI0LDMsMCwxMDYsMCwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMSwKKyAgICAwLDEwMCwyLDAsMTM0LDAsMCwxMjQsNCwwLDY4LDEzMSwxLDAsMTMxLDEsCisgICAgMCwxLDExMywxMywwLDg3LDEyNCwzLDAsMTI0LDAsMCw5NSwxLDAsMTI0LAorICAgIDEsMCwxMTIsNzksMCwxMDAsMywwLDEyNCwwLDAsOTUsMiwwLDEwMCw2LAorICAgIDAsMTI0LDAsMCw5NSwzLDAsMTE2LDQsMCwxMzEsMCwwLDEyNCwwLDAsCisgICAgOTUsNSwwLDExNiw0LDAsMTMxLDAsMCwxMjQsMCwwLDk1LDYsMCwxMDAsCisgICAgNSwwLDgzLDQxLDcsMTIyLDE1NCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsCisgICAgMTAxLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICAxMTYsMTExLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMTEsMTEwLDMyLDk3LDExMCwxMDAsCisgICAgMzIsOTcsMzIsMTE4LDk3LDExNCwxMDUsOTcsOTgsMTA4LDEwMSwzMiwxMTAsMTE3LDEwOSw5OCwKKyAgICAxMDEsMTE0LDMyLDExMSwxMDIsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNTAsNDUsCisgICAgMTE2LDExNywxMTIsMTA4LDEwMSwxMTUsMzIsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMDUsMTEwLAorICAgIDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLAorICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsMTEwLDEwNSwxMjIsMTAxLDExNSwKKyAgICA0Niw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCisgICAgMCwwLDUxLDAsMCwwLDExNSwyNywwLDAsMCwxMjQsMCwwLDkzLDE3LAorICAgIDAsMTI1LDEsMCwxMjQsMSwwLDEzNiwwLDAsMTAyLDIsMCw4NiwxLDExMywKKyAgICAzLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsCisgICAgMTE0LDIyLDAsMCwwLDExNCwyMTksMCwwLDAsNDEsMSwxMTQsMTIwLDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMjEsMCwwLDAsCisgICAgMTU0LDQsMCwwLDExNSwyLDAsMCwwLDYsMCwxMjIsMzgsNzAsMTA1LDEwOCwKKyAgICAxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsCisgICAgNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsCisgICAgMTEyLDExNCw2MiwxMTQsNTgsMCwwLDAsMTE0LDI5LDAsMCwwLDc4LDExNCw4NywKKyAgICAwLDAsMCw0MSw3LDExNCwxNDMsMCwwLDAsMjE4LDgsOTUsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCwxMTUsMTE0LDM1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDksMTE2LDEwNSwxMDksMTAxLDIxOCwzLDExNSwxMDEsMTE2LDIxOCwxMSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDIxOCwxOSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsCisgICAgMTAxLDEwMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQxLDUsMTE0LAorICAgIDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMjE4LDE0LDEwOCwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsNywxMDgsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDExNSwxMTQsMTYwLDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDEyMCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc5LDAsMCwwLDE0OCw0LDAsCisgICAgMCwxMTUsMTYsMCwwLDAsMCw0LDYsMSwxOSwxLDM2LDEsOSwyLAorICAgIDE1LDEsOSwxLDEyLDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDEzLDAsMCwwLDEwMCwzLDAsMTI0LDAsMCw5NSwwLDAsMTAwLDIsCisgICAgMCw4Myw0MSw0LDEyMiwzMSw3MywxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDksCisgICAgMTE2LDEwNSwxMDksMTAxLDQ2LDExNCwyOSwwLDAsMCw3OCwxMTQsODcsMCwwLDAsCisgICAgNDEsMSwxMTQsMiwxLDAsMCw0MSwxLDExNCwxMDAsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDI0NCwwLAorICAgIDAsMCwxNjIsNCwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwyOCw3MCwKKyAgICAxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsCisgICAgMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsOTksMiwwLDAsMCwKKyAgICAwLDAsMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsNTksMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsCisgICAgMCwxMjUsMiwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwzNywwLAorICAgIDEwMCwxLDAsMTAzLDAsMCwxMDIsMiwwLDgzLDEyNCwyLDAsMTA2LDEsMCwKKyAgICAxMjQsMiwwLDEwNiwyLDAsMTEyLDU1LDAsMTAzLDAsMCwxMDIsMiwwLDgzLAorICAgIDQxLDIsMTIyLDE5Nyw4NCwxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLAorICAgIDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw0NCwzMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsCisgICAgOTcsOTksMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsCisgICAgOTcsMTAzLDEwMSwzMiwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LDMyLDgyLDEwMSwKKyAgICAxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDQwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTA4LAorICAgIDEwNSwxMTUsMTE2LDQ1LDExMSwxMDIsNDUsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0MSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwKKyAgICAxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksCisgICAgOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsNDEsMywxMTQsMTc1LDAsMCwKKyAgICAwLDExNCwxMjAsMCwwLDAsMTE0LDE1MCwwLDAsMCw0MSwzLDExNCwxMDAsMCwKKyAgICAwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxMTcsMCwwLDAsCisgICAgMTY4LDQsMCwwLDExNSw4LDAsMCwwLDAsNywxNSwxLDEyLDEsMTAsCisgICAgMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LAorICAgIDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5OSw2LDAsMCwwLDAsMCwKKyAgICAwLDAsNywwLDAsMCw3LDAsMCwwLDY3LDAsMCwwLDExNSw0MCwKKyAgICAwLDAsMCwxMjQsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSwKKyAgICA2LDAsMTE2LDAsMCwxMjQsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsNiwKKyAgICAwLDEwMCwyLDAsMTI0LDQsMCwxMzEsMiwyLDgzLDQxLDMsNzgsMTE0LDEyMCwKKyAgICAwLDAsMCwxMTQsMTUwLDAsMCwwLDQxLDEsMTE0LDE2MSwwLDAsMCw0MSwKKyAgICA3LDExNCwxMDAsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsMTE5LDAsMCwwLAorICAgIDExNCwzNSwwLDAsMCw5MCw0LDExNSwxMDksMTE1LDEwOCwxMTQsMTc0LDAsMCwwLAorICAgIDExNCwxMjAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDI1NSwwLDAsMCwxODAsNCwwLDAsMTE1LDYsMCwKKyAgICAwLDAsMCwxLDE1LDEsMTgsMSwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LAorICAgIDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw3OCw5OSwKKyAgICAzLDAsMCwwLDAsMCwwLDAsMTQsMCwwLDAsMTUsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDIyOCwxLDAsMCwxMDAsMSwwLDEyNSwzLDAsMTI0LAorICAgIDEsMCwxMDYsMCwwLDEwMCwyLDAsMTMxLDEsMCwxMDAsMywwLDI1LDEyNSwKKyAgICA0LDAsMTIxLDM0LDAsMTE2LDEsMCwxMjQsMCwwLDEwNiwyLDAsMTEyLDQ5LAorICAgIDAsMTE2LDMsMCwxMDYsNCwwLDEzMSwwLDAsMTMxLDEsMCwxMDYsNSwwLAorICAgIDEyNSw1LDAsODcsMTEwLDI0LDAsNCwxMTYsNiwwLDEwNywxMCwwLDExNCw4NSwKKyAgICAwLDEsMSwxLDEwMCwxMCwwLDEyNSw1LDAsODksMTEwLDEsMCw4OCwxMjQsCisgICAgNSwwLDEyNCwwLDAsMTA2LDcsMCwxMDcsMywwLDExNCwxMjAsMCwxMjQsMCwKKyAgICAwLDEwNiw4LDAsMTMxLDAsMCwxLDEyNCw1LDAsMTI0LDAsMCw5NSw3LAorICAgIDAsMTE2LDksMCwxMzEsMCwwLDExNCwxNTMsMCwxMjQsMCwwLDEwNiwxMCwwLAorICAgIDEyNSw2LDAsMTI0LDQsMCwxMDYsMTEsMCwxMzEsMCwwLDEyNSw3LDAsMTEwLAorICAgIDE1LDAsMTI0LDAsMCwxMDYsMTIsMCwxMjUsNiwwLDEyNCw0LDAsMTI1LDcsCisgICAgMCwxMjQsNywwLDEyNCw2LDAsMTA3LDYsMCwxMTQsNDUsMSwxMTYsMTMsMCwKKyAgICAxMjQsMCwwLDEwNiwyLDAsMTI0LDQsMCwxMzEsMiwwLDEyNSw4LDAsMTIwLAorICAgIDEwMCwwLDEyNCwwLDAsMTA2LDE0LDAsNjgsOTMsNzcsMCw5MiwyLDAsMTI1LAorICAgIDksMCwxMjUsMTAsMCwxMDAsNSwwLDEyNCw5LDAsMjMsMTI1LDExLDAsMTE2LAorICAgIDEzLDAsMTI0LDgsMCwxMjQsMTEsMCwxMzEsMiwwLDEyNSwxMiwwLDExNiwxNSwKKyAgICAwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LDIwOCwwLDEyNCwwLDAsMTA2LDE2LDAsCisgICAgMTI0LDEwLDAsMTI0LDEsMCwxMjQsMTIsMCwxMjQsOCwwLDEwMywxLDAsMTI0LAorICAgIDIsMCwxMzEsNSwwLDgzLDExMywyMDgsMCw4NywxMTYsMTcsMCwxMjQsOCwwLAorICAgIDEzMSwxLDAsMTI1LDMsMCwxMjAsMTIwLDAsMTI0LDAsMCwxMDYsMTQsMCw2OCwKKyAgICA5MywxMDksMCw5MiwyLDAsMTI1LDksMCwxMjUsMTAsMCwxMTYsMTMsMCwxMjQsCisgICAgMCwwLDEwNiwyLDAsMTI0LDQsMCwxMjQsOSwwLDIzLDEzMSwyLDAsMTI1LAorICAgIDEyLDAsMTE2LDE4LDAsMTA2LDE5LDAsMTAwLDYsMCwxMjQsMTIsMCwxMDAsNywKKyAgICAwLDEwMCwzLDAsMTMxLDIsMSwxLDEyNCw3LDAsMTI0LDksMCwyMywxMjQsCisgICAgNiwwLDEwNyw2LDAsMTE0LDU1LDEsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsCisgICAgMCwxMTQsNTUsMSwxMjQsMCwwLDEwNiwxNiwwLDEyNCwxMCwwLDEyNCwxLDAsCisgICAgMTI0LDEyLDAsMTAwLDgsMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDU1LDEsCisgICAgODcsMTI0LDMsMCwxMTQsMjI0LDEsMTE2LDE4LDAsMTA2LDE5LDAsMTAwLDksMCwKKyAgICAxMjQsOCwwLDEzMSwyLDAsMSwxMTYsMTgsMCwxMDYsMjAsMCwxMjQsMSwwLAorICAgIDEwMCw4LDAsMTMxLDIsMCwxMjUsMTMsMCwxMjQsOCwwLDEwMywxLDAsMTI0LAorICAgIDEzLDAsOTUsMjEsMCwxMjQsMTMsMCw4MywxMDAsOCwwLDgzLDQxLDExLDEyMiwKKyAgICAxMjUsODQsMTE0LDEyMSwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsCisgICAgMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsCisgICAgMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsCisgICAgMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDExNSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiwKKyAgICA0NSwxMTEsMTAyLDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDEsNDYsNzAsMTE0LAorICAgIDU4LDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsMjksMCwwLDAsMTE0LDE3OSwKKyAgICAwLDAsMCwxMjIsOSwxMTYsMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMjMsMTI1LDkwLDksCisgICAgMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDUsMTE2LDEyMSw3OCwxMjIsMjUsMTEyLDExMSwxMTUsMTE1LAorICAgIDEwNSw5OCwxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDEyMywxMjUsMTE0LDg3LDAsMCwwLDQxLDIyLDExNCwzMiwwLDAsCisgICAgMCwxMTQsMzksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwzLDAsMCwwLAorICAgIDExNCw0NSwwLDAsMCwxMTQsMjEzLDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsCisgICAgMiwxLDAsMCwyMTgsMTEsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwKKyAgICAxMDEsMTE0LDYsMCwwLDAsMTE0LDUsMSwwLDAsMTE0LDg4LDAsMCwwLAorICAgIDExNCw0LDEsMCwwLDExNCwyOCwwLDAsMCwxMTQsMSwxLDAsMCwxMTQsCisgICAgNDQsMCwwLDAsMTE0LDI1NSwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDExNCwKKyAgICAwLDAsMCwxMTQsMTI5LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE1MCwwLAorICAgIDAsMCw0MSwxNCwxMTQsMTAwLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDE3NCwKKyAgICAwLDAsMCw5MCwxMiwxMDUsMTE1LDk1LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDkwLDExLDExNiw5NywxMDUsMTA4LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMjYsCisgICAgMCwwLDAsOTAsNSw5OSw5Nyw5OSwxMDQsMTAxLDkwLDEyLDk5LDk3LDk5LDEwNCwKKyAgICAxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsOSw5OCw5NywxMTUsMTAxLDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDExNCwyMTksMCwwLDAsMTE0LDE1OSwwLDAsMCw5MCwxMywxMDUsCisgICAgMTEwLDEwNSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDkwLDksMTAyLDExNywKKyAgICAxMDgsMTA4LDk1LDExMiw5NywxMTYsMTA0LDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE3NSwwLDAsMCwKKyAgICAxODUsNCwwLDAsMTE1LDcwLDAsMCwwLDAsMyw2LDEsMTksMSwzLAorICAgIDEsMzQsMSwxMywxLDExLDEsMTUsMSwxMCwxLDksMiw5LDEsOSwKKyAgICAxLDE1LDIsOSwxLDYsMiwxMiwxLDE4LDEsMjIsMSwxMCwxLDE1LAorICAgIDEsMTIsMSwzMiw0LDEyLDIsMjIsMSwyMiwxLDIyLDEsMTYsMSwxMiwKKyAgICAxLDE1LDEsMTQsMSw2LDEsMTYsMSwxOCwxLDEyLDEsNCwxLDEyMiwKKyAgICAyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSwxLDAsMCwwLDAsMCwwLDAsOSwwLAorICAgIDAsMCwxMywwLDAsMCw2NywwLDAsMCwxMTUsMTEsMSwwLDAsMTI0LAorICAgIDAsMCwxMDYsMCwwLDEyNSwxLDAsMTIxLDMxLDAsMTE2LDEsMCwxMDYsMiwKKyAgICAwLDEyNCwxLDAsMTEyLDMzLDAsMTE2LDEsMCwxMDYsMywwLDEzMSwwLDAsCisgICAgMTMxLDEsMCwxMjUsMiwwLDg3LDExMCwzMywwLDQsMTE2LDQsMCwxMTYsNSwKKyAgICAwLDExNiw2LDAsMTAyLDMsMCwxMDcsMTAsMCwxMTQsNzUsMCwxLDEsMSwKKyAgICAxMDMsMCwwLDEyNSwyLDAsODksMTEwLDEsMCw4OCwxMTYsNywwLDEwNiw4LAorICAgIDAsMTA2LDksMCwxMDAsMSwwLDEzMSwxLDAsMTE1LDExMiwwLDExNiwxMCwwLAorICAgIDEyNCwyLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDExLDAsMTEwLDExMSwwLDExNiwKKyAgICAxMCwwLDEzMSwwLDAsMTI1LDMsMCwxMjAsOTAsMCwxMjQsMiwwLDY4LDkzLAorICAgIDgyLDAsMTI1LDQsMCwxMjQsNCwwLDEwNiwxMiwwLDEwMCwyLDAsMTMxLDEsCisgICAgMCw5MiwzLDAsMTI1LDUsMCwxMjUsNiwwLDEyNSw3LDAsMTI0LDYsMCwKKyAgICAxMTQsMTkxLDAsMTAwLDMsMCwxMDYsMTMsMCwxMjQsNSwwLDEyNCw3LDAsMTA2LAorICAgIDE0LDAsMTMxLDAsMCwxMzEsMiwwLDEyNSw4LDAsMTEwLDYsMCwxMjQsNSwKKyAgICAwLDEyNSw4LDAsMTI0LDMsMCwxMDYsMTUsMCwxMjQsOCwwLDEzMSwxLDAsCisgICAgMSwxMTMsMTI4LDAsODcsMTI0LDMsMCwxMjQsMCwwLDk1LDExLDAsMTE2LDcsCisgICAgMCwxMDYsOCwwLDEwNiw5LDAsMTE2LDE2LDAsMTMxLDEsMCwxMTQsNywxLAorICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDEyNCwyLDAsNjgsMTMxLDEsMCwKKyAgICAxMjQsMCwwLDk1LDE3LDAsMTAwLDYsMCw4Myw0MSw3LDEyMiw2OCw3MCwxMDUsCisgICAgMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDExMSwxMDIsMzIsCisgICAgMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsMTA1LDk3LDEwOCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsCisgICAgMTIxLDQ2LDExNCwwLDAsMCwwLDExNCw1OCwwLDAsMCwxMjIsNSwxMjMsMTI1LAorICAgIDQ2LDEyMywxMjUsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgMywwLDAsMCw4MywwLDAsMCwxMTUsMjgsMCwwLDAsMTA0LDAsMCwKKyAgICAxMjQsMCwwLDkzLDE4LDAsMTI1LDEsMCwxMjQsMSwwLDEwNiwwLDAsMTMxLAorICAgIDAsMCwxNDYsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwwLDAsNDEsMSwKKyAgICAxMTQsODgsMCwwLDAsNDEsMiwxMTQsMjIsMCwwLDAsOTAsMiwxMDIsMTEwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDI1MCwKKyAgICA5LDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDQsNSwwLDAsMTE1LDIsCisgICAgMCwwLDAsOSwwLDEyMiw0MSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDYwLDEwOCwKKyAgICAxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMTUsMTAxLDExNiw5OSwxMTEsMTA5LDExMiw2MiwKKyAgICA3OCw0MSwxOCwxMTQsMzUsMCwwLDAsMTE0LDMsMCwwLDAsOTAsNywxMDgsCisgICAgMTA1LDExNSwxMTYsMTAwLDEwNSwxMTQsMTE0LDQ1LDAsMCwwLDExNCwyNTAsMCwwLDAsCisgICAgMjE4LDE1LDgwLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLAorICAgIDExNCwyMTgsMTgsNzgsMTExLDExNiw2NSw2OCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsCisgICAgNjksMTE0LDExNCwxMTEsMTE0LDExNCw3LDAsMCwwLDExNCw4LDAsMCwwLDExNCwKKyAgICA5LDAsMCwwLDExNCwzLDEsMCwwLDExNCw0LDEsMCwwLDExNCw4MywKKyAgICAwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDg4LDAsMCwwLDIxOCwzLDk3LAorICAgIDEwMCwxMDAsMTE0LDEwLDAsMCwwLDExNCw1LDEsMCwwLDQxLDksMTE0LDEwMCwKKyAgICAwLDAsMCwxMTQsMzUsMCwwLDAsOTAsOCw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLAorICAgIDExNiwxMTUsOTAsMjEsMTA4LDExMSwxMTksMTAxLDExNCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwKKyAgICA5NSw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsMTE0LDIzOSwwLDAsMCwxMTQsOTgsCisgICAgMCwwLDAsMTE0LDIzMSwwLDAsMCwxMTQsMjE5LDAsMCwwLDkwLDgsMTEwLAorICAgIDEwMSwxMTksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMTE0LDcsMSwwLDAsMjMxLDQsMCwwLDExNSwKKyAgICAzNCwwLDAsMCwwLDIsOSwxLDMsMSwzMSwxLDIyLDMsMTEsMywKKyAgICAxOCwxLDE4LDcsOSwxLDEzLDEsMjQsMSw2LDEsMjcsMiw2LDEsCisgICAgMTcsMSw5LDEsMTgsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCw0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDcsCisgICAgMCwwLDAsMTE1LDI1LDAsMCwwLDEzNSwwLDAsMTM1LDEsMCwxMDIsMiwKKyAgICAwLDEwMCwxLDAsMTAwLDIsMCwxMzQsMCwwLDEyNSwyLDAsMTI0LDIsMCwKKyAgICA4Myw0MSwzLDk3LDIwLDEsMCwwLDY1LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLAorICAgIDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTQsMTAxLDExNiwKKyAgICAxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTE2LAorICAgIDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTksCisgICAgMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwzMiwxMTcsMTE1LDEwNSwKKyAgICAxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCisgICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OSw5NywKKyAgICAxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwKKyAgICAxMTcsMTE0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLAorICAgIDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsCisgICAgMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwKKyAgICAxMTQsMTIxLDQ0LDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLAorICAgIDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLAorICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMSwwLDAsMCw0LDAsMCwwLDE5LDAsMCwKKyAgICAwLDExNSw0MywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxMTUsCisgICAgMzAsMCwxMTYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMjQsMCwwLDEzMSwxLAorICAgIDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTM2LDEsMCwxNDAsMSwwLAorICAgIDgzLDQxLDMsMTIyLDQ1LDgwLDk3LDExNiwxMDQsMzIsMTA0LDExMSwxMTEsMTA3LDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsMTA5LDk3LDk5LAorICAgIDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDQ2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTIyLDMwLDExMSwxMTAsMTA4LDEyMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwKKyAgICAxMTQsMTA1LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsCisgICAgMTAxLDEwMCwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsNDYsMCwwLDAsMTE0LDk5LAorICAgIDAsMCwwLDQxLDEsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDE2NCwwLDAsCisgICAgMCwxMTQsNiwxLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKKyAgICAyMTgsMjQsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk1LDEwMiwxMTEsMTE0LDk1LAorICAgIDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTYsNSwwLDAsMTE1LDYsCisgICAgMCwwLDAsMCwyLDEyLDEsMTgsMSwxMjIsNTQsNzAsMTA1LDEwOCwxMDEsNzAsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsNDYsCisgICAgNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsCiAgICAgMTExLDEwNyw5NSwxMDIsMTExLDExNCw5NSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDE4LDUsMCwwLDExNSw2LDAsMCwwLDAsMiwxMiwxLDE4LDEsCi0gICAgMTIyLDU0LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwKLSAgICAxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0NiwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsNzAsMTA1LAotICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCw0MSwzLDExNCwKLSAgICAxNzAsMCwwLDAsMTE0LDEyLDEsMCwwLDExNCwxOCwxLDAsMCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxNzAsMCwwLDAsMTE0LDEyLDEsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCw5LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw4LAotICAgIDUsMCwwLDExNSw0LDAsMCwwLDAsMTAsMjEsNiwxMjIsMjAsNzAsMTA1LAotICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLAotICAgIDExMSwxMDcsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLAotICAgIDE2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDAsMTIzLDMzLDExNCwxMjUsCi0gICAgNDEsNDEsMiwxMTQsNDcsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDEsMTE0LAotICAgIDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwxMTQsMjQ0LDAsMCwwLDI2LDUsMCwwLDExNSwyLDAsMCwKLSAgICAwLDAsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICA5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNDEsMTUsMTE0LDExMiwwLDAsMCwxMTQsCi0gICAgMTExLDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNCwwLDAsMCwxMTQsMTg1LAotICAgIDAsMCwwLDExNCwyNTAsMCwwLDAsMTE0LDEzMCwwLDAsMCwxMTQsMTgyLDAsCi0gICAgMCwwLDExNCwxMjQsMCwwLDAsMTE0LDUsMSwwLDAsMTE0LDE4MSwwLDAsCi0gICAgMCwxMTQsMTMsMSwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTksMSwwLDAsCi0gICAgMTE0LDI0NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsNiwxLDAsMCwxNDIsNCwKLSAgICAwLDAsMTE1LDIwLDAsMCwwLDEyLDcsNiwyLDEyLDE0LDEyLDQsNiwKLSAgICAyLDEyLDEyLDEyLDUsMTUsNDUsMTIsMzEsMTgsMTgsMTE0LDYsMSwwLDAsCi0gICAgOTksNCwwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMTEsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDE5NSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTAwLDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwKLSAgICAyLDAsMTMxLDEsMCwxMjUsNSwwLDEyNCw0LDAsMTE1LDk5LDAsMTI0LDUsCi0gICAgMCwxMTQsNTQsMCwxMjQsNSwwLDEwNiwxLDAsMTI1LDQsMCwxMTAsNDUsMCwKLSAgICAxMjQsMiwwLDEyNCwzLDAsMTA3LDIsMCwxMTQsODQsMCwxMTYsMiwwLDEyNCwKLSAgICAxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSw0LDAsMTEwLDE1LDAsMTE2LDMsCi0gICAgMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsNCwwLDEyNCw1LDAsCi0gICAgMTE1LDEyNiwwLDExNiw0LDAsMTI0LDEsMCwxMjQsMiwwLDEwMCwzLDAsMTI0LAotICAgIDQsMCwxMzEsMiwxLDEyNSw1LDAsMTIxLDQ0LDAsMTI0LDUsMCwxMjQsMCwKLSAgICAwLDEwMCwyLDAsNjAsMTI0LDQsMCwxMjQsMCwwLDEwMCwxLDAsNjAsMTI0LAotICAgIDIsMCwxMjQsMCwwLDEwMCw0LDAsNjAsMTI0LDMsMCwxMjQsMCwwLDEwMCwKLSAgICA1LDAsNjAsODcsMTEwLDE4LDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxOTAsCi0gICAgMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsNiw3OCwKLSAgICAyMTgsMTAsOTUsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSw5NSwyMTgsOCw5NSw5NSwKLSAgICAxMTUsMTEyLDEwMSw5OSw5NSw5NSwxMTQsMTI3LDAsMCwwLDkwLDgsOTUsOTUsMTAyLAotICAgIDEwNSwxMDgsMTAxLDk1LDk1LDkwLDEwLDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LAotICAgIDk1LDQxLDYsMjE4LDMsMTAzLDEwMSwxMTYsMTE0LDEyNywwLDAsMCwxMTQsMjIzLDAsCi0gICAgMCwwLDExNCwyMTgsMCwwLDAsMTE0LDE2NywwLDAsMCwyMTgsOSw2OSwxMjAsCi0gICAgOTksMTAxLDExMiwxMTYsMTA1LDExMSwxMTAsNDEsNiw5MCwyLDExMCwxMTUsMTE0LDEwNiwwLAotICAgIDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDExMCw5NywxMDksMTAxLDkwLDksOTksMTEyLAotICAgIDk3LDExNiwxMDQsMTEwLDk3LDEwOSwxMDEsMTE0LDEyNywwLDAsMCwxMTQsMTY0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAotICAgIDIxOCwxNCw5NSwxMDIsMTA1LDEyMCw5NSwxMTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDMyLDUsMCwwLDExNSwzNCwwLDAsMCwwLDIsMTUsMSwxNSwxLDYsCi0gICAgMSw2LDEsMTIsMSwxMiwxLDE4LDIsMTUsMSw2LDEsMjEsMSwzLAotICAgIDEsMTAsMSwxMCwxLDEwLDEsMTQsMSwxMywyLDExNCwyNCwxLDAsMCwKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSw1NSwwLDAsMCwxMTYsMCwwLDExNiwxLDAsCi0gICAgMTA2LDIsMCwxMzEsMCwwLDEwMiwyLDAsMTI1LDAsMCwxMTYsMywwLDExNiwKLSAgICA0LDAsMTAyLDIsMCwxMjUsMSwwLDExNiw1LDAsMTE2LDYsMCwxMDIsMiwKLSAgICAwLDEyNSwyLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTAzLDMsMCwKLSAgICA4Myw0MSwxLDEyMiw5NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMDgsCi0gICAgMTA1LDExNSwxMTYsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjksOTcsOTksMTA0LDMyLDEwNSwxMTYsMTAxLDEwOSwKLSAgICAzMiwxMDUsMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsNDAsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw0NCwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDQxLDQ2LDEwLAotICAgIDMyLDMyLDMyLDMyLDQxLDcsMTE0LDIyNCwwLDAsMCwxMTQsMTQ1LDAsMCwwLAotICAgIDIxOCwxOCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw5NSwxMTUsMTE3LDEwMiwxMDIsCi0gICAgMTA1LDEyMCwxMDEsMTE1LDExNCwyMTgsMCwwLDAsMTE0LDg0LDAsMCwwLDExNCwyMjMsCi0gICAgMCwwLDAsMTE0LDc0LDAsMCwwLDQxLDMsOTAsMTAsMTAxLDEyMCwxMTYsMTAxLAotICAgIDExMCwxMTUsMTA1LDExMSwxMTAsMTE1LDkwLDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5MCw4LAotICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDExNCwxNjEsMCwwLDAsNTUsNSwwLDAsCi0gICAgMTE1LDgsMCwwLDAsMCw1LDE4LDEsMTIsMSwxMiwxLDExNCwxNjEsMCwKLSAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEyLDAsMCwwLDEyLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw3MCwyLDAsMCwxMjQsMCwwLDk3LAotICAgIDAsMCwxMTYsMCwwLDEwNiwxLDAsOTcsMSwwLDExNiwwLDAsMTA2LDIsCi0gICAgMCw5NywyLDAsMTE2LDEsMCwxMDYsMywwLDExNiw0LDAsMjUsMTI1LDEsCi0gICAgMCwxMjAsNzYsMCwxMDAsMjYsMCw2OCw5Myw2OCwwLDEyNSwyLDAsMTI0LDIsCi0gICAgMCwxMTYsMSwwLDEwNiwzLDAsMTA3LDcsMCwxMTQsODMsMCwxMTYsMCwwLAotICAgIDEwNiw1LDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTEwLDEzLDAsMTE2LAotICAgIDEsMCwxMDYsMywwLDEyNCwyLDAsMjUsMTI1LDMsMCwxMTYsNiwwLDEyNCwKLSAgICAxLDAsMTI0LDIsMCwxMjQsMywwLDEzMSwzLDAsMSwxMTMsNDQsMCw4NywKLSAgICAxMDAsNSwwLDEwMCw2LDAsMTAzLDEsMCwxMDIsMiwwLDEwMCw3LDAsMTAwLAotICAgIDgsMCwxMDAsNiwwLDEwMywyLDAsMTAyLDIsMCwxMDIsMiwwLDEyNSw0LAotICAgIDAsMTIwLDE0OSwwLDEyNCw0LDAsNjgsOTMsMTI5LDAsOTIsMiwwLDEyNSw1LAotICAgIDAsMTI1LDYsMCwxMTYsNywwLDEwMCw5LDAsMTAwLDEwLDAsMTMyLDAsMCwKLSAgICAxMjQsNiwwLDY4LDEzMSwxLDAsMTMxLDEsMCwxMTUsMTk5LDAsMTE2LDgsMCwKLSAgICAxMzAsMSwwLDEyNCw2LDAsMTAwLDExLDAsMjUsMTI1LDcsMCwxMjQsNSwwLAotICAgIDExNiwxLDAsMTA2LDMsMCwxMDcsNiwwLDExNCwyNDEsMCwxMTYsMSwwLDEwNiwKLSAgICAzLDAsMTI0LDUsMCwyNSwxMjUsOCwwLDgwLDExMywxNTYsMCwxMjEsMjAsMCwKLSAgICAxMTYsMCwwLDEwNiw1LDAsMTI0LDUsMCwxMzEsMSwwLDEyNSw4LDAsODAsCi0gICAgODcsMTEzLDE1NiwwLDQsMTE2LDksMCwxMDcsMTAsMCwxMTQsMjgsMSwxLDEsCi0gICAgMSwxMTksMTU2LDAsODksMTEzLDE1NiwwLDg4LDExMywxNTYsMCw4NywxMTYsOSwwLAotICAgIDEwMCwxMiwwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLAotICAgIDEzLDAsMTI0LDgsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwKLSAgICAxNCwwLDEyNCw3LDAsMTMxLDMsMCwxLDExNiw2LDAsMTI0LDEsMCwxMDAsCi0gICAgMTUsMCwxMDAsMTYsMCwxMDYsMTAsMCwxMjQsNiwwLDEzMSwxLDAsMTMxLDMsCi0gICAgMCwxLDEyMSwxOSwwLDExNiwwLDAsMTA2LDUsMCwxMDAsMTcsMCwxMzEsMSwKLSAgICAwLDEyNSw5LDAsODcsMTEwLDI0LDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwKLSAgICAxNDcsMSwxLDEsMSwxMDAsMTgsMCwxMjUsOSwwLDg5LDExMCwxLDAsODgsCi0gICAgMTE2LDYsMCwxMjQsMSwwLDEwMCwxNywwLDEyNCw5LDAsMTMxLDMsMCwxLAotICAgIDExNiwwLDAsMTA2LDUsMCwxMDAsMTksMCwxMzEsMSwwLDEyNSwxMCwwLDExNiwKLSAgICA2LDAsMTI0LDEsMCwxMDAsMTksMCwxMjQsMTAsMCwxMzEsMywwLDEsMTI0LAotICAgIDUsMCwxMDAsNywwLDEwNywyLDAsMTE0LDIzOCwxLDExNiwwLDAsMTA2LDUsCi0gICAgMCwxMDAsMjAsMCwxMzEsMSwwLDEyNSwxMSwwLDExNiw2LDAsMTI0LDEsMCwKLSAgICAxMDAsMjEsMCwxMjQsMTEsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLAotICAgIDEwMCwyMiwwLDExNiwxMSwwLDEzMSwwLDAsMTMxLDMsMCwxLDExNiwxMiwwLAotICAgIDEwNiwxMywwLDExNiwyLDAsMTA2LDE0LDAsMTMxLDAsMCwxMzEsMSwwLDEsCi0gICAgMTI0LDUsMCwxMDAsNywwLDEwNywyLDAsMTE0LDY2LDIsMTE2LDE1LDAsMTA2LAotICAgIDE2LDAsMTAwLDIzLDAsMTMxLDEsMCwxLDEwMCwyNCwwLDExNiwxMiwwLDEwNywKLSAgICA2LDAsMTE0LDY2LDIsMTAwLDI1LDAsMTE2LDE3LDAsOTUsMTgsMCwxMDAsMTgsCi0gICAgMCw4Myw0MSwyNywxMjIsMjA1LDgzLDEwMSwxMTYsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiwxMDEsMTE0LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsCi0gICAgMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwKLSAgICAxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwxMCwzMiwzMiwzMiwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsCi0gICAgNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwzMiwxMDUsCi0gICAgMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCwKLSAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LAotICAgIDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwzMiwKLSAgICA5NywxMTQsMTAxLDMyLDEwMSwxMjAsMTE2LDExNCw5Nyw5OSwxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LAotICAgIDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDExNCwxMDEsMzIsOTgsMTExLDExMSwxMTYsCi0gICAgMTE1LDExNiwxMTQsOTcsMTEyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDExNCw0OSwwLDAsMCwxMTQsNjAsMCwwLDAsMjE4LDgsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LDExNCwxNDIsMCwwLDAsOTAsNSwxMTIsMTExLAotICAgIDExNSwxMDUsMTIwLDI1MCwxLDQ3LDIxOCwyLDExMCwxMTYsMjUwLDEsOTIsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsMCwKLSAgICAwLDAsMTE1LDMzLDAsMCwwLDEyNCwwLDAsOTMsMjMsMCwxMjUsMSwwLAotICAgIDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEwMCwwLDAsMTA3LDIsMCw4NiwKLSAgICAxLDExMywzLDAsMTAwLDEsMCw4Myw0MSwyLDExNCwyOSwwLDAsMCw3OCwKLSAgICA0MSwxLDExNCwzMSwwLDAsMCw0MSwyLDExNCwyMiwwLDAsMCwxMTQsNzcsCisgICAgMTE0LDExNCw0LDAsMCwwLDQxLDMsMTE0LDE2NCwwLDAsMCwxMTQsNiwxLAorICAgIDAsMCwxMTQsMTIsMSwwLDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTY0LAorICAgIDAsMCwwLDExNCw2LDEsMCwwLDExNCw1LDAsMCwwLDIxOCw5LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw2LDUsMCwwLDExNSw0LDAsMCwKKyAgICAwLDAsMTAsMjEsNiwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTksMSwwLDAsMCwKKyAgICAwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsCisgICAgMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDE2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsNDAsMTIzLDMzLDExNCwxMjUsNDEsNDEsMiwxMTQsNDcsMCwwLAorICAgIDAsMTE0LDM1LDAsMCwwLDQxLDEsMTE0LDEwMCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjM4LDAsMCwKKyAgICAwLDI0LDUsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMTksNzAsMTA1LAorICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsCisgICAgOTUsNDEsMTUsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwxMDYsMCwKKyAgICAwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCwyNDQsMCwwLAorICAgIDAsMTE0LDEyMywwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwxMTcsMCwwLDAsCisgICAgMTE0LDI1NSwwLDAsMCwxMTQsMTc1LDAsMCwwLDExNCw3LDEsMCwwLDExNCwKKyAgICAxNzcsMCwwLDAsMTE0LDEzLDEsMCwwLDExNCwyMzgsMCwwLDAsMTE0LDQsCiAgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMTE0LDIyNywwLDAsMCw5MSw1LDAsMCwxMTUsMiwwLDAsMCwKLSAgICA2LDAsMTIyLDI1LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNDYsNjAsMTA4LDExMSw5OSw5NywKLSAgICAxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMTQsNTksMCwKLSAgICAwLDAsMTIyLDMwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTE0LDEwMSwKLSAgICAxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsMTExLDExNSwxMDUsMTIwLDMyLDExMSwxMTQsMzIsCi0gICAgMTEwLDExNiwxMTQsMywwLDAsMCwxMTQsMjUsMCwwLDAsMTE0LDIxLDAsMCwKLSAgICAwLDExNCwzMCwwLDAsMCw5MCw3LDk1LDExNiwxMDQsMTE0LDEwMSw5NywxMDAsNzgsCi0gICAgOTAsOCw5NSwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCw2LDExOSwxMDUsMTEwLDExNCwKLSAgICAxMDEsMTAzLDExNCwxNjksMCwwLDAsMTE0LDYsMCwwLDAsMTIyLDQsNDYsMTEyLAotICAgIDEyMSwxMTksMTIyLDYsOTUsMTAwLDQ2LDExMiwxMjEsMTAwLDg0LDQxLDQsMTIyLDMsOTUsCi0gICAgMTA1LDExMSwxMjIsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMTIyLDgsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LDEyMiw3LDEwOSw5NywxMTQsMTE1LDEwNCw5NywxMDgsCi0gICAgNDEsMTksMTE0LDEyMSwwLDAsMCwxMTQsNywwLDAsMCwxMTQsMTQ1LDAsMCwKLSAgICAwLDExNCwyMzksMCwwLDAsMTE0LDExMiwwLDAsMCw5MCwxOCw5NSw5OCwxMTcsCi0gICAgMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LAotICAgIDExNiwwLDAsMCwyMTgsMyw5NywxMDgsMTA4LDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTA3LDAsMCwwLDExNCwyNiwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIyOSwwLDAsMCwxMTQsMTQ5LDAsCi0gICAgMCwwLDExNCwyNSwxLDAsMCwxMTQsODQsMCwwLDAsMTE0LDE2MywwLDAsCi0gICAgMCwxMTQsMTY4LDAsMCwwLDExNCwxNzMsMCwwLDAsNDEsMTIsMjE4LDE3LDk1LAotICAgIDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTIsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsMTE3LDEwNSwKLSAgICAxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTAsMTExLDExNSw5NSwKLSAgICAxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCwxMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwKLSAgICA5NSwxMTEsMTE1LDExNCwyMSwwLDAsMCwxMTQsMjUsMCwwLDAsOTAsOSwxMTEsCi0gICAgMTE1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDUsMCwwLDAsMjE4LDYsOTUsMTE1LDEwMSwxMTYsMTE3LDExMiw2Niw1LDAsCi0gICAgMCwxMTUsODIsMCwwLDAsMCw4LDYsMSw5LDEsOSwzLDEzLDEsCi0gICAgMTMsMSwxNSwxLDE4LDIsMTMsMSwyMCwzLDMzLDEsMTksMiwzMSwxLAotICAgIDEwLDEsMTUsMSwxMywxLDQsMiwzLDEsMTUsMSw1LDEsMTMsMSwKLSAgICAxMiwyLDEyLDEsMTYsMSwxNiwxLDI1LDMsMywxLDE5LDEsMTMsMiwKLSAgICAxMSwxLDE2LDMsMTUsMSwxNiwzLDEyLDEsMTUsMSwxNiwzLDE5LDEsCi0gICAgMTksMSwxMiwxLDEzLDEsMTIsMSwxMTQsMzMsMSwwLDAsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLAotICAgIDEsMTE2LDEsMCwxMzEsMCwwLDEyNSwxLDAsMTE2LDIsMCwxMDYsMywwLAotICAgIDEwNiw0LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCwxLDAsMTQwLDAsMCwxMDMsCi0gICAgMSwwLDEzMSwxLDAsMSwxMTYsNywwLDEwNiw4LDAsMTAwLDEsMCwxMDcsCi0gICAgMiwwLDExNCw3OCwwLDExNiwyLDAsMTA2LDksMCwxMDYsMTAsMCwxMTYsMTEsCi0gICAgMCwxMzEsMSwwLDEsMTE2LDIsMCwxMDYsOSwwLDEwNiwxMCwwLDExNiwxMiwKLSAgICAwLDEzMSwxLDAsMSwxMTYsNSwwLDEyNCwwLDAsOTUsNSwwLDExNiwxMywKLSAgICAwLDEyNCwwLDAsOTUsMTMsMCwxMDAsMiwwLDgzLDQxLDMsMTIyLDQxLDczLAotICAgIDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsCi0gICAgOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTksMTExLDEwOSwKLSAgICAxMTIsMTExLDExMCwxMDEsMTEwLDExNiwxMTUsNDYsMTE0LDI4LDEsMCwwLDc4LDQxLDE0LAotICAgIDExNCwzMywxLDAsMCwxMTQsMTYxLDAsMCwwLDExNCw3LDAsMCwwLDExNCwKLSAgICAyNTQsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsNiwxLDAsMCwxMTQsMTksCi0gICAgMSwwLDAsMTE0LDMsMCwwLDAsMTE0LDExMiwwLDAsMCwyMTgsOSwxMDksCi0gICAgMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTYzLDAsMCwwLDExNCwxNjgsMCwKLSAgICAwLDAsMTE0LDI0OSwwLDAsMCwxMTQsMjE4LDAsMCwwLDQxLDIsMTE0LDMyLAotICAgIDEsMCwwLDkwLDE3LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEzNCwKLSAgICA1LDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEwLDEsOSwxLDI4LDEsCi0gICAgMTUsMSwxNiwxLDE2LDQsOSwxLDExNCwzNSwxLDAsMCw0MSwzLDEyMiwKLSAgICAzLDExOSwxMDUsMTEwLDExNCwxLDAsMCwwLDExNCwyLDAsMCwwLDQxLDU3LAotICAgIDExNCwxMTQsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsCi0gICAgMTcsMCwwLDAsMTE0LDE5LDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsMzgsCi0gICAgMCwwLDAsMTE0LDM5LDAsMCwwLDExNCw0MywwLDAsMCwxMTQsNDQsMCwKLSAgICAwLDAsMTE0LDQ2LDAsMCwwLDExNCw1NSwwLDAsMCwyMTgsNCwxMTYsMTIxLAotICAgIDExMiwxMDEsMjE4LDgsOTUsOTUsOTksMTExLDEwMCwxMDEsOTUsOTUsMTE0LDE0NCwwLDAsCi0gICAgMCwxMTQsMTUsMCwwLDAsMTE0LDEzNSwwLDAsMCwxMTQsMTQsMCwwLDAsCi0gICAgMTE0LDE4LDAsMCwwLDkwLDE3LDk1LDgyLDY1LDg3LDk1LDc3LDY1LDcxLDczLAotICAgIDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCw3MywwLDAsMCwxMTQsNzIsMCwKLSAgICAwLDAsMTE0LDg0LDAsMCwwLDExNCw3NCwwLDAsMCw5MCwyMyw2OCw2OSwKLSAgICA2Niw4NSw3MSw5NSw2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCwKLSAgICA3MCw3Myw4OCw2OSw4Myw5MCwyNyw3OSw4MCw4NCw3Myw3Nyw3Myw5MCw2OSw2OCwKLSAgICA5NSw2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCwKLSAgICA2OSw4MywxMTQsNzksMCwwLDAsMTE0LDg1LDAsMCwwLDExNCw5MSwwLDAsCi0gICAgMCwxMTQsOTUsMCwwLDAsMTE0LDk3LDAsMCwwLDExNCwxMDUsMCwwLDAsCi0gICAgMTE0LDEyMywwLDAsMCwxMTQsMTMwLDAsMCwwLDExNCwxNDEsMCwwLDAsMTE0LAotICAgIDE0NywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwxNTUsMCwwLDAsMjE4LDYsCi0gICAgMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCwxNjIsMCwwLDAsMTE0LDE2NywwLDAsMCwKLSAgICAxMTQsMTY4LDAsMCwwLDExNCwxODQsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsCi0gICAgMjEwLDAsMCwwLDExNCwyMTgsMCwwLDAsMTE0LDIyMywwLDAsMCwxMTQsMjI5LAotICAgIDAsMCwwLDExNCwyMjQsMCwwLDAsMTE0LDIzMCwwLDAsMCwxMTQsMjQ3LDAsCi0gICAgMCwwLDExNCwyNDksMCwwLDAsMTE0LDYsMSwwLDAsMTE0LDI0LDEsMCwKLSAgICAwLDExNCwxNjEsMCwwLDAsMTE0LDMzLDEsMCwwLDExNCwzNSwxLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsCi0gICAgMCwwLDExNSwxMDAsMCwwLDAsNiwxNyw2LDMsMTIsMTIsMTIsNSwxMiwKLSAgICA1LDEyLDYsMTIsMTIsMTIsMTAsMTIsOSwxMiw1LDEyLDcsMTUsMjIsMTUsCi0gICAgMTEwLDIyLDEsMTgsMiw2LDEsNiwyLDksMiw5LDIsMTAsMiwyMSwKLSAgICA0NCwxMiwzMywxMiwxOSwxMiwxMiwxMiwxMiwxOCw4LDEyLDI4LDEyLDE3LDIxLAotICAgIDU1LDIxLDEyLDE4LDEwLDEyLDE0LDksMywxMiwxLDE1LDY1LDE5LDY0LDE5LAotICAgIDI4LDIyLDExMCwxOSw0MSwyNSw0MywyNSwxNiw2LDMsMjUsNTMsMTksNTcsMTksCi0gICAgNDEsMTksMTM0LDE5LDE0NiwxNSwyMywxMiwxMSwxMiw2OCwKKyAgICAwLDAsMTE0LDAsMSwwLDAsMTM5LDQsMCwwLDExNSwyMCwwLDAsMCwKKyAgICAxMiw3LDYsMiwxMiwxNCwxMiw0LDYsMiwxMiwxMiwxMiw1LDE1LDQ2LAorICAgIDEyLDMxLDE4LDE4LDExNCwwLDEsMCwwLDk5LDQsMCwwLDAsMCwwLAorICAgIDAsMCw2LDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSwxOTUsCisgICAgMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwxLDAsMTMxLDEsMCwxMjUsCisgICAgNCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMiwwLDEzMSwxLDAsMTI1LDUsCisgICAgMCwxMjQsNCwwLDExNSw5OSwwLDEyNCw1LDAsMTE0LDU0LDAsMTI0LDUsMCwKKyAgICAxMDYsMSwwLDEyNSw0LDAsMTEwLDQ1LDAsMTI0LDIsMCwxMjQsMywwLDEwNywKKyAgICAyLDAsMTE0LDg0LDAsMTE2LDIsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsCisgICAgMCwxMjUsNCwwLDExMCwxNSwwLDExNiwzLDAsMTI0LDEsMCwxMjQsMiwwLAorICAgIDEzMSwyLDAsMTI1LDQsMCwxMjQsNSwwLDExNSwxMjYsMCwxMTYsNCwwLDEyNCwKKyAgICAxLDAsMTI0LDIsMCwxMDAsMywwLDEyNCw0LDAsMTMxLDIsMSwxMjUsNSwKKyAgICAwLDEyMSw0NCwwLDEyNCw1LDAsMTI0LDAsMCwxMDAsMiwwLDYwLDEyNCw0LAorICAgIDAsMTI0LDAsMCwxMDAsMSwwLDYwLDEyNCwyLDAsMTI0LDAsMCwxMDAsNCwKKyAgICAwLDYwLDEyNCwzLDAsMTI0LDAsMCwxMDAsNSwwLDYwLDg3LDExMCwxOCwwLAorICAgIDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTkwLDAsMSwxLDEsODksMTEwLDEsCisgICAgMCw4OCwxMDAsMCwwLDgzLDQxLDYsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsOTUsOTUsMjE4LDgsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMTE0LAorICAgIDEyMCwwLDAsMCw5MCw4LDk1LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSw5NSw5MCwxMCwKKyAgICA5NSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSw0MSw2LDIxOCwzLDEwMywxMDEsCisgICAgMTE2LDExNCwxMjAsMCwwLDAsMTE0LDIxNywwLDAsMCwxMTQsMjEyLDAsMCwwLAorICAgIDExNCwxNjEsMCwwLDAsMjE4LDksNjksMTIwLDk5LDEwMSwxMTIsMTE2LDEwNSwxMTEsMTEwLAorICAgIDQxLDYsOTAsMiwxMTAsMTE1LDExNCw5OCwwLDAsMCw5MCw4LDExMiw5NywxMTYsCisgICAgMTA0LDExMCw5NywxMDksMTAxLDkwLDksOTksMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwxMDEsCisgICAgMTE0LDEyMCwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNCw5NSwxMDIsMTA1LDEyMCw5NSwKKyAgICAxMTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMwLDUsMCwwLDExNSwzNCwwLAorICAgIDAsMCwwLDIsMTUsMSwxNSwxLDYsMSw2LDEsMTIsMSwxMiwxLAorICAgIDE4LDIsMTUsMSw2LDEsMjEsMSwzLDEsMTAsMSwxMCwxLDEwLDEsCisgICAgMTQsMSwxMywyLDExNCwxOCwxLDAsMCw5OSwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw1NSwKKyAgICAwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMzEsMCwwLDEwMiwKKyAgICAyLDAsMTI1LDAsMCwxMTYsMywwLDExNiw0LDAsMTAyLDIsMCwxMjUsMSwKKyAgICAwLDExNiw1LDAsMTE2LDYsMCwxMDIsMiwwLDEyNSwyLDAsMTI0LDAsMCwKKyAgICAxMjQsMSwwLDEyNCwyLDAsMTAzLDMsMCw4Myw0MSwxLDEyMiw5NSw4MiwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMDgsMTA1LDExNSwxMTYsMzIsMTExLDEwMiwzMiwKKyAgICAxMDIsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgNjksOTcsOTksMTA0LDMyLDEwNSwxMTYsMTAxLDEwOSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExNiwKKyAgICAxMTcsMTEyLDEwOCwxMDEsMzIsNDAsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NCwzMiwxMTUsMTE3LAorICAgIDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDQxLDQ2LDEwLDMyLDMyLDMyLDMyLDQxLDcsMTE0LAorICAgIDIxOCwwLDAsMCwxMTQsMTM5LDAsMCwwLDIxOCwxOCwxMDEsMTIwLDExNiwxMDEsMTEwLAorICAgIDExNSwxMDUsMTExLDExMCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwyMTIsMCwKKyAgICAwLDAsMTE0LDg0LDAsMCwwLDExNCwyMTcsMCwwLDAsMTE0LDc0LDAsMCwKKyAgICAwLDQxLDMsOTAsMTAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMTE1LDkwLAorICAgIDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5MCw4LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDExNCwxNTUsMCwwLDAsNTMsNSwwLDAsMTE1LDgsMCwwLDAsMCw1LAorICAgIDE4LDEsMTIsMSwxMiwxLDExNCwxNTUsMCwwLDAsOTksMSwwLDAsMCwKKyAgICAwLDAsMCwwLDEyLDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw3MCwyLDAsMCwxMjQsMCwwLDk3LDAsMCwxMTYsMCwwLDEwNiwxLAorICAgIDAsOTcsMSwwLDExNiwwLDAsMTA2LDIsMCw5NywyLDAsMTE2LDEsMCwKKyAgICAxMDYsMywwLDExNiw0LDAsMjUsMTI1LDEsMCwxMjAsNzYsMCwxMDAsMjYsMCwKKyAgICA2OCw5Myw2OCwwLDEyNSwyLDAsMTI0LDIsMCwxMTYsMSwwLDEwNiwzLDAsCisgICAgMTA3LDcsMCwxMTQsODMsMCwxMTYsMCwwLDEwNiw1LDAsMTI0LDIsMCwxMzEsCisgICAgMSwwLDEyNSwzLDAsMTEwLDEzLDAsMTE2LDEsMCwxMDYsMywwLDEyNCwyLAorICAgIDAsMjUsMTI1LDMsMCwxMTYsNiwwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywKKyAgICAwLDEzMSwzLDAsMSwxMTMsNDQsMCw4NywxMDAsNSwwLDEwMCw2LDAsMTAzLAorICAgIDEsMCwxMDIsMiwwLDEwMCw3LDAsMTAwLDgsMCwxMDAsNiwwLDEwMywyLAorICAgIDAsMTAyLDIsMCwxMDIsMiwwLDEyNSw0LDAsMTIwLDE0OSwwLDEyNCw0LDAsCisgICAgNjgsOTMsMTI5LDAsOTIsMiwwLDEyNSw1LDAsMTI1LDYsMCwxMTYsNywwLAorICAgIDEwMCw5LDAsMTAwLDEwLDAsMTMyLDAsMCwxMjQsNiwwLDY4LDEzMSwxLDAsCisgICAgMTMxLDEsMCwxMTUsMTk5LDAsMTE2LDgsMCwxMzAsMSwwLDEyNCw2LDAsMTAwLAorICAgIDExLDAsMjUsMTI1LDcsMCwxMjQsNSwwLDExNiwxLDAsMTA2LDMsMCwxMDcsCisgICAgNiwwLDExNCwyNDEsMCwxMTYsMSwwLDEwNiwzLDAsMTI0LDUsMCwyNSwxMjUsCisgICAgOCwwLDgwLDExMywxNTYsMCwxMjEsMjAsMCwxMTYsMCwwLDEwNiw1LDAsMTI0LAorICAgIDUsMCwxMzEsMSwwLDEyNSw4LDAsODAsODcsMTEzLDE1NiwwLDQsMTE2LDksCisgICAgMCwxMDcsMTAsMCwxMTQsMjgsMSwxLDEsMSwxMTksMTU2LDAsODksMTEzLDE1NiwKKyAgICAwLDg4LDExMywxNTYsMCw4NywxMTYsOSwwLDEwMCwxMiwwLDEzMSwxLDAsMTMwLAorICAgIDEsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDEzLDAsMTI0LDgsMCwxMzEsMywKKyAgICAwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwxNCwwLDEyNCw3LDAsMTMxLDMsCisgICAgMCwxLDExNiw2LDAsMTI0LDEsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMDYsMTAsCisgICAgMCwxMjQsNiwwLDEzMSwxLDAsMTMxLDMsMCwxLDEyMSwxOSwwLDExNiwwLAorICAgIDAsMTA2LDUsMCwxMDAsMTcsMCwxMzEsMSwwLDEyNSw5LDAsODcsMTEwLDI0LAorICAgIDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwxNDcsMSwxLDEsMSwxMDAsMTgsCisgICAgMCwxMjUsOSwwLDg5LDExMCwxLDAsODgsMTE2LDYsMCwxMjQsMSwwLDEwMCwKKyAgICAxNywwLDEyNCw5LDAsMTMxLDMsMCwxLDExNiwwLDAsMTA2LDUsMCwxMDAsCisgICAgMTksMCwxMzEsMSwwLDEyNSwxMCwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTksCisgICAgMCwxMjQsMTAsMCwxMzEsMywwLDEsMTI0LDUsMCwxMDAsNywwLDEwNywyLAorICAgIDAsMTE0LDIzOCwxLDExNiwwLDAsMTA2LDUsMCwxMDAsMjAsMCwxMzEsMSwwLAorICAgIDEyNSwxMSwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMjEsMCwxMjQsMTEsMCwxMzEsCisgICAgMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwyMiwwLDExNiwxMSwwLDEzMSwKKyAgICAwLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEwNiwxMywwLDExNiwyLDAsMTA2LAorICAgIDE0LDAsMTMxLDAsMCwxMzEsMSwwLDEsMTI0LDUsMCwxMDAsNywwLDEwNywKKyAgICAyLDAsMTE0LDY2LDIsMTE2LDE1LDAsMTA2LDE2LDAsMTAwLDIzLDAsMTMxLDEsCisgICAgMCwxLDEwMCwyNCwwLDExNiwxMiwwLDEwNyw2LDAsMTE0LDY2LDIsMTAwLDI1LAorICAgIDAsMTE2LDE3LDAsOTUsMTgsMCwxMDAsMTgsMCw4Myw0MSwyNywxMjIsMjA1LDgzLAorICAgIDEwMSwxMTYsMTE3LDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywKKyAgICAxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDExNSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwxMCwKKyAgICAzMiwzMiwzMiwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwKKyAgICAxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMTEsCisgICAgMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDEwMSwxMjAsMTE2LAorICAgIDExNCw5Nyw5OSwxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgOTksMTExLDExNCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCw0OSwwLDAsCisgICAgMCwxMTQsNjAsMCwwLDAsMjE4LDgsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LAorICAgIDExNCwxMzYsMCwwLDAsOTAsNSwxMTIsMTExLDExNSwxMDUsMTIwLDI1MCwxLDQ3LDIxOCwKKyAgICAyLDExMCwxMTYsMjUwLDEsOTIsOTksMSwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMywwLDAsMCwxMTUsMCwwLDAsMTE1LDMzLDAsMCwwLAorICAgIDEyNCwwLDAsOTMsMjMsMCwxMjUsMSwwLDExNiwwLDAsMTI0LDEsMCwxMzEsCisgICAgMSwwLDEwMCwwLDAsMTA3LDIsMCw4NiwxLDExMywzLDAsMTAwLDEsMCwKKyAgICA4Myw0MSwyLDExNCwyOSwwLDAsMCw3OCw0MSwxLDExNCwzMSwwLDAsMCwKKyAgICA0MSwyLDExNCwyMiwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIyMSwwLDAsMCwKKyAgICA4OSw1LDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLDI1LDk1LDExNSwxMDEsCisgICAgMTE2LDExNywxMTIsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsCisgICAgMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMTQsNTksMCwwLDAsMTIyLDMwLDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwKKyAgICAxMTIsMTExLDExNSwxMDUsMTIwLDMyLDExMSwxMTQsMzIsMTEwLDExNiwxMTQsMywwLDAsMCwKKyAgICAxMTQsMjUsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCwzMCwwLDAsMCw5MCwKKyAgICA3LDk1LDExNiwxMDQsMTE0LDEwMSw5NywxMDAsNzgsOTAsOCw5NSwxMTksMTAxLDk3LDEwNywKKyAgICAxMTQsMTAxLDEwMiw5MCw2LDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDExNCwxNjMsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMTIyLDQsNDYsMTEyLDEyMSwxMTksMTIyLDYsOTUsMTAwLDQ2LAorICAgIDExMiwxMjEsMTAwLDg0LDQxLDQsMTIyLDMsOTUsMTA1LDExMSwxMjIsOSw5NSwxMTksOTcsCisgICAgMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMTIyLDgsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LAorICAgIDEyMiw3LDEwOSw5NywxMTQsMTE1LDEwNCw5NywxMDgsNDEsMTksMTE0LDExNCwwLDAsMCwKKyAgICAxMTQsNywwLDAsMCwxMTQsMTM5LDAsMCwwLDExNCwyMzMsMCwwLDAsMTE0LAorICAgIDEwNSwwLDAsMCw5MCwxOCw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDIsCisgICAgMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDEwOSwwLDAsMCwyMTgsMyw5NywKKyAgICAxMDgsMTA4LDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsCisgICAgMTExLDExNCwxMTQsOTksMCwwLDAsMTE0LDI2LDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwxMTQsMjIzLDAsMCwwLDExNCwxNDMsMCwwLDAsMTE0LDE5LDEsMCwwLAorICAgIDExNCw4NCwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LAorICAgIDE2NywwLDAsMCw0MSwxMiwyMTgsMTcsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsCisgICAgOTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDExLDExNSwxMDEsMTA4LDEwMiw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMiw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwKKyAgICAxMTAsOTcsMTA5LDEwMSw5MCwxNCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw5MCwxMCwxMTEsMTE1LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LAorICAgIDkwLDEwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMSwxMTUsMTE0LDIxLDAsMCwKKyAgICAwLDExNCwyNSwwLDAsMCw5MCw5LDExMSwxMTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA5MCwxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA5MCwxMywxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNiwKKyAgICA5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDY0LDUsMCwwLDExNSw4MiwwLDAsMCwwLAorICAgIDgsNiwxLDksMSw5LDMsMTMsMSwxMywxLDE1LDEsMTgsMiwxMywKKyAgICAxLDIwLDMsMzMsMSwxOSwyLDMxLDEsMTAsMSwxNSwxLDEzLDEsNCwKKyAgICAyLDMsMSwxNSwxLDUsMSwxMywxLDEyLDIsMTIsMSwxNiwxLDE2LAorICAgIDEsMjUsMywzLDEsMTksMSwxMywyLDExLDEsMTYsMywxNSwxLDE2LAorICAgIDMsMTIsMSwxNSwxLDE2LDMsMTksMSwxOSwxLDEyLDEsMTMsMSwxMiwKKyAgICAxLDExNCwyNywxLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMTYsMCwwLDAsCisgICAgMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMSwxMTYsMSwwLDEzMSwwLDAsCisgICAgMTI1LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTA2LDQsMCwxMTYsNSwwLDEwNiwKKyAgICA2LDAsMTI0LDEsMCwxNDAsMCwwLDEwMywxLDAsMTMxLDEsMCwxLDExNiwKKyAgICA3LDAsMTA2LDgsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDc4LDAsMTE2LDIsCisgICAgMCwxMDYsOSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLDAsMSwxMTYsMiwKKyAgICAwLDEwNiw5LDAsMTA2LDEwLDAsMTE2LDEyLDAsMTMxLDEsMCwxLDExNiw1LAorICAgIDAsMTI0LDAsMCw5NSw1LDAsMTE2LDEzLDAsMTI0LDAsMCw5NSwxMywwLAorICAgIDEwMCwyLDAsODMsNDEsMywxMjIsNDEsNzMsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwKKyAgICA0NiwxMTQsMjIsMSwwLDAsNzgsNDEsMTQsMTE0LDI3LDEsMCwwLDExNCwxNTUsCisgICAgMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDI0OCwwLDAsMCwxMTQsMTQzLDAsCisgICAgMCwwLDExNCwwLDEsMCwwLDExNCwxMywxLDAsMCwxMTQsMywwLDAsCisgICAgMCwxMTQsMTA1LDAsMCwwLDIxOCw5LDEwOSwxMDEsMTE2LDk3LDk1LDExMiw5NywxMTYsCisgICAgMTA0LDExNCwxNTcsMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMjQzLDAsMCwwLAorICAgIDExNCwyMTIsMCwwLDAsNDEsMiwxMTQsMjYsMSwwLDAsOTAsMTcsMTE1LDExNywKKyAgICAxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDgsCisgICAgOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTMyLDUsMCwwLDExNSwxNiwwLDAsCisgICAgMCwwLDIsMTAsMSw5LDEsMjgsMSwxNSwxLDE2LDEsMTYsNCw5LAorICAgIDEsMTE0LDI5LDEsMCwwLDQxLDMsMTIyLDMsMTE5LDEwNSwxMTAsMTE0LDEsMCwKKyAgICAwLDAsMTE0LDIsMCwwLDAsNDEsNTYsMTE0LDEwNywwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNywwLDAsMCwxMTQsMTksMCwKKyAgICAwLDAsMTE0LDI4LDAsMCwwLDExNCwzOCwwLDAsMCwxMTQsMzksMCwwLAorICAgIDAsMTE0LDQzLDAsMCwwLDExNCw0NCwwLDAsMCwxMTQsNDYsMCwwLDAsCisgICAgMTE0LDU1LDAsMCwwLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsOCw5NSw5NSw5OSwKKyAgICAxMTEsMTAwLDEwMSw5NSw5NSwxMTQsMTM4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsCisgICAgMTI4LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTgsMCwwLDAsOTAsMTcsCisgICAgOTUsODIsNjUsODcsOTUsNzcsNjUsNzEsNzMsNjcsOTUsNzgsODUsNzcsNjYsNjksCisgICAgODIsMTE0LDczLDAsMCwwLDExNCw3MiwwLDAsMCwxMTQsODQsMCwwLDAsCisgICAgMTE0LDc0LDAsMCwwLDkwLDIzLDY4LDY5LDY2LDg1LDcxLDk1LDY2LDg5LDg0LAorICAgIDY5LDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDkwLDI3LAorICAgIDc5LDgwLDg0LDczLDc3LDczLDkwLDY5LDY4LDk1LDY2LDg5LDg0LDY5LDY3LDc5LAorICAgIDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDExNCw3OSwwLDAsMCwKKyAgICAxMTQsODUsMCwwLDAsMTE0LDkxLDAsMCwwLDExNCw5NSwwLDAsMCwxMTQsCisgICAgOTcsMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxMzUsCisgICAgMCwwLDAsMTE0LDE0MSwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxNDksMCwKKyAgICAwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCwxNTYsMCwwLDAsMTE0LAorICAgIDE2MSwwLDAsMCwxMTQsMTYyLDAsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDE4OCwKKyAgICAwLDAsMCwxMTQsMjA0LDAsMCwwLDExNCwyMTIsMCwwLDAsMTE0LDIxNywwLAorICAgIDAsMCwxMTQsMjIzLDAsMCwwLDExNCwyMTgsMCwwLDAsMTE0LDIyNCwwLDAsCisgICAgMCwxMTQsMjQxLDAsMCwwLDExNCwyNDMsMCwwLDAsMTE0LDAsMSwwLDAsCisgICAgMTE0LDE4LDEsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDI3LDEsMCwwLDExNCwKKyAgICAyOSwxLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw2Miw4LDAsMCwwLDExNSw5OCwwLDAsMCw2LDE3LDYsMywxMiwKKyAgICAxMiwxMiw1LDEyLDUsMTIsNiwxMiwxMiwxMiwxMCwxMiw5LDEyLDUsMTIsCisgICAgNywxNSwyMiwxNSwxMTEsMjIsMSwxOCwyLDYsMSw2LDIsOSwyLDksCisgICAgMiwxMCwyLDIxLDQ0LDEyLDMzLDEyLDE5LDEyLDEyLDEyLDEyLDEyLDI4LDEyLAorICAgIDE3LDIxLDU1LDIxLDEyLDE4LDEwLDEyLDE0LDksMywxMiwxLDE1LDY1LDE5LAorICAgIDY0LDE5LDI5LDIyLDExMCwxOSw0MSwyNSw0NSwyNSwxNiw2LDMsMjUsNTMsMTksCisgICAgNTcsMTksNDIsMTksMTM0LDE5LDE0NywxNSwyMywxMiwxMSwxMiw2OCwKIH07CmRpZmYgLS1naXQgYS9QeXRob24vbWFyc2hhbC5jIGIvUHl0aG9uL21hcnNoYWwuYwppbmRleCA1YjhkZTk5Li41ODllYjgwIDEwMDY0NAotLS0gYS9QeXRob24vbWFyc2hhbC5jCisrKyBiL1B5dGhvbi9tYXJzaGFsLmMKQEAgLTY0Myw3ICs2NDMsNyBAQAogICAgIFB5T2JqZWN0ICpyZWZzOyAgLyogYSBsaXN0ICovCiB9IFJGSUxFOwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiByX3N0cmluZyhQeV9zc2l6ZV90IG4sIFJGSUxFICpwKQogewogICAgIFB5X3NzaXplX3QgcmVhZCA9IC0xOwpAQCAtNzI5LDcgKzcyOSw3IEBACiAgICAgICAgIGMgPSBnZXRjKHAtPmZwKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGNoYXIgKnB0ciA9IHJfc3RyaW5nKDEsIHApOworICAgICAgICBjb25zdCBjaGFyICpwdHIgPSByX3N0cmluZygxLCBwKTsKICAgICAgICAgaWYgKHB0ciAhPSBOVUxMKQogICAgICAgICAgICAgYyA9ICoodW5zaWduZWQgY2hhciAqKSBwdHI7CiAgICAgfQpAQCAtNzQwLDkgKzc0MCw5IEBACiByX3Nob3J0KFJGSUxFICpwKQogewogICAgIHNob3J0IHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoMiwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gYnVmZmVyWzFdIDw8IDg7CkBAIC03NTYsOSArNzU2LDkgQEAKIHJfbG9uZyhSRklMRSAqcCkKIHsKICAgICBsb25nIHggPSAtMTsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZmZXI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCi0gICAgYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CisgICAgYnVmZmVyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoNCwgcCk7CiAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgIHggPSBidWZmZXJbMF07CiAgICAgICAgIHggfD0gKGxvbmcpYnVmZmVyWzFdIDw8IDg7CkBAIC05NzgsNyArOTc4LDggQEAKIAogICAgIGNhc2UgVFlQRV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBkb3VibGUgZHg7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDAxLDkgKzEwMDIsOSBAQAogCiAgICAgY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKICAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwogICAgICAgICAgICAgZG91YmxlIHg7Ci0gICAgICAgICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOwogICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKQEAgLTEwMTYsNyArMTAxNyw4IEBACiAKICAgICBjYXNlIFRZUEVfQ09NUExFWDoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciBidWZbMjU2XSwgKnB0cjsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBQeV9jb21wbGV4IGM7CiAgICAgICAgICAgICBuID0gcl9ieXRlKHApOwogICAgICAgICAgICAgaWYgKG4gPT0gRU9GKSB7CkBAIC0xMDUzLDE1ICsxMDU1LDE1IEBACiAKICAgICBjYXNlIFRZUEVfQklOQVJZX0NPTVBMRVg6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKICAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLnJlYWwgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CiAgICAgICAgICAgICBpZiAoYy5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjLmltYWcgPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CkBAIC0xMDc0LDcgKzEwNzYsNyBAQAogCiAgICAgY2FzZSBUWVBFX1NUUklORzoKICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgbiA9IHJfbG9uZyhwKTsKICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTExOSw3ICsxMTIxLDcgQEAKICAgICAgICAgfQogICAgIF9yZWFkX2FzY2lpOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBwdHIgPSByX3N0cmluZyhuLCBwKTsKICAgICAgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMzcsNyArMTEzOSw3IEBACiAgICAgICAgIGlzX2ludGVybmVkID0gMTsKICAgICBjYXNlIFRZUEVfVU5JQ09ERToKICAgICAgICAgewotICAgICAgICBjaGFyICpidWZmZXI7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKIAogICAgICAgICBuID0gcl9sb25nKHApOwogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKZGlmZiAtLWdpdCBhL1B5dGhvbi9tb2RzdXBwb3J0LmMgYi9QeXRob24vbW9kc3VwcG9ydC5jCmluZGV4IDZjOTM4ZGQuLjdlNmE2NWIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tb2RzdXBwb3J0LmMKKysrIGIvUHl0aG9uL21vZHN1cHBvcnQuYwpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgIGNhc2UgJ1UnOiAgIC8qIFhYWCBkZXByZWNhdGVkIGFsaWFzICovCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CkBAIC0zMzQsNyArMzM0LDcgQEAKICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICAgICAgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOwogICAgICAgICAgICAgUHlfc3NpemVfdCBuOwogICAgICAgICAgICAgaWYgKCoqcF9mb3JtYXQgPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgKysqcF9mb3JtYXQ7CmRpZmYgLS1naXQgYS9QeXRob24vbXlzdHJ0b3VsLmMgYi9QeXRob24vbXlzdHJ0b3VsLmMKaW5kZXggOTg0MjlkNC4uYTg1NzkwZSAxMDA2NDQKLS0tIGEvUHl0aG9uL215c3RydG91bC5jCisrKyBiL1B5dGhvbi9teXN0cnRvdWwuYwpAQCAtMTcsNyArMTcsNyBAQAogICogc21hbGxtYXhbYmFzZV0gaXMgdGhlIGxhcmdlc3QgdW5zaWduZWQgbG9uZyBpIHN1Y2ggdGhhdAogICogaSAqIGJhc2UgZG9lc24ndCBvdmVyZmxvdyB1bnNpZ25lZCBsb25nLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzbWFsbG1heFtdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgc21hbGxtYXhbXSA9IHsKICAgICAwLCAvKiBiYXNlcyAwIGFuZCAxIGFyZSBpbnZhbGlkICovCiAgICAgMCwKICAgICBVTE9OR19NQVggLyAyLApAQCAtNjIsMTQgKzYyLDE0IEBACiAgKiBOb3RlIHRoYXQgdGhpcyBpcyBwZXNzaW1pc3RpYyBpZiBzaXplb2YobG9uZykgPiA0LgogICovCiAjaWYgU0laRU9GX0xPTkcgPT0gNAotc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CitzdGF0aWMgY29uc3QgaW50IGRpZ2l0bGltaXRbXSA9IHsKICAgICAwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLwogICAgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCiAgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLwogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAogLyogW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjY0LCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0gKi8KLXN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0geworc3RhdGljIGNvbnN0IGludCBkaWdpdGxpbWl0W10gPSB7CiAgICAgICAgICAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KICAgICAxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCiAgICAgMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL29wY29kZV90YXJnZXRzLmggYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAppbmRleCAxOTI1OWUxLi4zODcyMjU2IDEwMDY0NAotLS0gYS9QeXRob24vb3Bjb2RlX3RhcmdldHMuaAorKysgYi9QeXRob24vb3Bjb2RlX3RhcmdldHMuaApAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgJiZUQVJHRVRfQlVJTERfVFVQTEVfVU5QQUNLLAogICAgICYmVEFSR0VUX0JVSUxEX1NFVF9VTlBBQ0ssCiAgICAgJiZUQVJHRVRfU0VUVVBfQVNZTkNfV0lUSCwKLSAgICAmJl91bmtub3duX29wY29kZSwKKyAgICAmJlRBUkdFVF9GT1JNQVRfVkFMVUUsCiAgICAgJiZfdW5rbm93bl9vcGNvZGUsCiAgICAgJiZfdW5rbm93bl9vcGNvZGUsCiAgICAgJiZfdW5rbm93bl9vcGNvZGUsCmRpZmYgLS1naXQgYS9QeXRob24vcHlsaWZlY3ljbGUuYyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCmluZGV4IDRmNWVmYzkuLmM4NGM0NmEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWxpZmVjeWNsZS5jCisrKyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogR2xvYmFsIGluaXRpYWxpemF0aW9ucy4gIENhbiBiZSB1bmRvbmUgYnkgUHlfRmluYWxpemUoKS4gIERvbid0Ci0gICBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhbiBpbnRlcnZlbmluZyBQeV9GaW5hbGl6ZSgpIGNhbGwuICBXaGVuCisvKiBHbG9iYWwgaW5pdGlhbGl6YXRpb25zLiAgQ2FuIGJlIHVuZG9uZSBieSBQeV9GaW5hbGl6ZUV4KCkuICBEb24ndAorICAgY2FsbCB0aGlzIHR3aWNlIHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgUHlfRmluYWxpemVFeCgpIGNhbGwuICBXaGVuCiAgICBpbml0aWFsaXphdGlvbnMgZmFpbCwgYSBmYXRhbCBlcnJvciBpcyBpc3N1ZWQgYW5kIHRoZSBmdW5jdGlvbiBkb2VzCiAgICBub3QgcmV0dXJuLiAgT24gcmV0dXJuLCB0aGUgZmlyc3QgdGhyZWFkIGFuZCBpbnRlcnByZXRlciBzdGF0ZSBoYXZlCiAgICBiZWVuIGNyZWF0ZWQuCkBAIC0zMjcsMTEgKzMyNywxMSBAQAogICAgICh2b2lkKSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgLyogV2UgY2FuJ3QgY2FsbCBfUHlFdmFsX0ZpbmlUaHJlYWRzKCkgaW4gUHlfRmluYWxpemUgYmVjYXVzZQorICAgIC8qIFdlIGNhbid0IGNhbGwgX1B5RXZhbF9GaW5pVGhyZWFkcygpIGluIFB5X0ZpbmFsaXplRXggYmVjYXVzZQogICAgICAgIGRlc3Ryb3lpbmcgdGhlIEdJTCBtaWdodCBmYWlsIHdoZW4gaXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBmcm9tCiAgICAgICAgYW5vdGhlciBydW5uaW5nIHRocmVhZCAoc2VlIGlzc3VlICM5OTAxKS4KICAgICAgICBJbnN0ZWFkIHdlIGRlc3Ryb3kgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBHSUwgaGVyZSwgd2hpY2ggZW5zdXJlcwotICAgICAgIHRoYXQgd2UgY2FuIGNhbGwgUHlfSW5pdGlhbGl6ZSAvIFB5X0ZpbmFsaXplIG11bHRpcGxlIHRpbWVzLiAqLworICAgICAgIHRoYXQgd2UgY2FuIGNhbGwgUHlfSW5pdGlhbGl6ZSAvIFB5X0ZpbmFsaXplRXggbXVsdGlwbGUgdGltZXMuICovCiAgICAgX1B5RXZhbF9GaW5pVGhyZWFkcygpOwogCiAgICAgLyogQXV0by10aHJlYWQtc3RhdGUgQVBJICovCkBAIC00NzcsMjggKzQ3NywzNSBAQAogICAgIHJldHVybiByID4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGZsdXNoX3N0ZF9maWxlcyh2b2lkKQogewogICAgIFB5T2JqZWN0ICpmb3V0ID0gX1B5U3lzX0dldE9iamVjdElkKCZQeUlkX3N0ZG91dCk7CiAgICAgUHlPYmplY3QgKmZlcnIgPSBfUHlTeXNfR2V0T2JqZWN0SWQoJlB5SWRfc3RkZXJyKTsKICAgICBQeU9iamVjdCAqdG1wOworICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgaWYgKGZvdXQgIT0gTlVMTCAmJiBmb3V0ICE9IFB5X05vbmUgJiYgIWZpbGVfaXNfY2xvc2VkKGZvdXQpKSB7CiAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZm91dCwgJlB5SWRfZmx1c2gsICIiKTsKLSAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShmb3V0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogICAgIH0KIAogICAgIGlmIChmZXJyICE9IE5VTEwgJiYgZmVyciAhPSBQeV9Ob25lICYmICFmaWxlX2lzX2Nsb3NlZChmZXJyKSkgewogICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZlcnIsICZQeUlkX2ZsdXNoLCAiIik7Ci0gICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyogVW5kbyB0aGUgZWZmZWN0IG9mIFB5X0luaXRpYWxpemUoKS4KQEAgLTUxNSwxNCArNTIyLDE1IEBACiAKICovCiAKLXZvaWQKLVB5X0ZpbmFsaXplKHZvaWQpCitpbnQKK1B5X0ZpbmFsaXplRXgodm9pZCkKIHsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBpZiAoIWluaXRpYWxpemVkKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAKICAgICB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24oKTsKIApAQCAtNTQ3LDcgKzU1NSw5IEBACiAgICAgaW5pdGlhbGl6ZWQgPSAwOwogCiAgICAgLyogRmx1c2ggc3lzLnN0ZG91dCBhbmQgc3lzLnN0ZGVyciAqLwotICAgIGZsdXNoX3N0ZF9maWxlcygpOworICAgIGlmIChmbHVzaF9zdGRfZmlsZXMoKSA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gLTE7CisgICAgfQogCiAgICAgLyogRGlzYWJsZSBzaWduYWwgaGFuZGxpbmcgKi8KICAgICBQeU9TX0ZpbmlJbnRlcnJ1cHRzKCk7CkBAIC01NzYsNyArNTg2LDkgQEAKICAgICBQeUltcG9ydF9DbGVhbnVwKCk7CiAKICAgICAvKiBGbHVzaCBzeXMuc3Rkb3V0IGFuZCBzeXMuc3RkZXJyIChhZ2FpbiwgaW4gY2FzZSBtb3JlIHdhcyBwcmludGVkKSAqLwotICAgIGZsdXNoX3N0ZF9maWxlcygpOworICAgIGlmIChmbHVzaF9zdGRfZmlsZXMoKSA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gLTE7CisgICAgfQogCiAgICAgLyogQ29sbGVjdCBmaW5hbCBnYXJiYWdlLiAgVGhpcyBkaXNwb3NlcyBvZiBjeWNsZXMgY3JlYXRlZCBieQogICAgICAqIGNsYXNzIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZS4KQEAgLTY5Niw2ICs3MDgsMTMgQEAKICNlbmRpZgogCiAgICAgY2FsbF9sbF9leGl0ZnVuY3MoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkCitQeV9GaW5hbGl6ZSh2b2lkKQoreworICAgIFB5X0ZpbmFsaXplRXgoKTsKIH0KIAogLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVycHJldGVyIGFuZCB0aHJlYWQsIGFuZCByZXR1cm4gdGhlCkBAIC04MDMsNyArODIyLDcgQEAKICAgIGZyYW1lcywgYW5kIHRoYXQgaXQgaXMgaXRzIGludGVycHJldGVyJ3Mgb25seSByZW1haW5pbmcgdGhyZWFkLgogICAgSXQgaXMgYSBmYXRhbCBlcnJvciB0byB2aW9sYXRlIHRoZXNlIGNvbnN0cmFpbnRzLgogCi0gICAoUHlfRmluYWxpemUoKSBkb2Vzbid0IGhhdmUgdGhlc2UgY29uc3RyYWludHMgLS0gaXQgemFwcworICAgKFB5X0ZpbmFsaXplRXgoKSBkb2Vzbid0IGhhdmUgdGhlc2UgY29uc3RyYWludHMgLS0gaXQgemFwcwogICAgZXZlcnl0aGluZywgcmVnYXJkbGVzcy4pCiAKICAgIExvY2tpbmc6IGFzIGFib3ZlLgpAQCAtOTcyLDYgKzk5MSw5IEBACiAgICAgaWYgKGZkIDwgMCB8fCAhX1B5VmVyaWZ5X2ZkKGZkKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgIC8qIFByZWZlciBkdXAoKSBvdmVyIGZzdGF0KCkuIGZzdGF0KCkgY2FuIHJlcXVpcmUgaW5wdXQvb3V0cHV0IHdoZXJlYXMKKyAgICAgICBkdXAoKSBkb2Vzbid0LCB0aGVyZSBpcyBhIGxvdyByaXNrIG9mIEVNRklMRS9FTkZJTEUgYXQgUHl0aG9uCisgICAgICAgc3RhcnR1cC4gKi8KICAgICBmZDIgPSBkdXAoZmQpOwogICAgIGlmIChmZDIgPj0gMCkKICAgICAgICAgY2xvc2UoZmQyKTsKQEAgLTk4Miw4ICsxMDA0LDggQEAKIC8qIHJldHVybnMgUHlfTm9uZSBpZiB0aGUgZmQgaXMgbm90IHZhbGlkICovCiBzdGF0aWMgUHlPYmplY3QqCiBjcmVhdGVfc3RkaW8oUHlPYmplY3QqIGlvLAotICAgIGludCBmZCwgaW50IHdyaXRlX21vZGUsIGNoYXIqIG5hbWUsCi0gICAgY2hhciogZW5jb2RpbmcsIGNoYXIqIGVycm9ycykKKyAgICBpbnQgZmQsIGludCB3cml0ZV9tb2RlLCBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IGNoYXIqIGVuY29kaW5nLCBjb25zdCBjaGFyKiBlcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKmJ1ZiA9IE5VTEwsICpzdHJlYW0gPSBOVUxMLCAqdGV4dCA9IE5VTEwsICpyYXcgPSBOVUxMLCAqcmVzOwogICAgIGNvbnN0IGNoYXIqIG1vZGU7CkBAIC0xMDEzLDcgKzEwMzUsOCBAQAogICAgICAgICBtb2RlID0gInJiIjsKICAgICBidWYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGlvLCAmUHlJZF9vcGVuLCAiaXNpT09PaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgbW9kZSwgYnVmZmVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgUHlfTm9uZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCBQeV9Ob25lLCAvKiBlbmNvZGluZywgZXJyb3JzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCAwKTsgLyogbmV3bGluZSwgY2xvc2VmZCAqLwogICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKIApAQCAtMTQ0Nyw3ICsxNDcwLDkgQEAKIHZvaWQKIFB5X0V4aXQoaW50IHN0cykKIHsKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHN0cyA9IDEyMDsKKyAgICB9CiAKICAgICBleGl0KHN0cyk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcHlzdGF0ZS5jIGIvUHl0aG9uL3B5c3RhdGUuYwppbmRleCA3ZTAyNjdhLi41MGVkZmJiIDEwMDY0NAotLS0gYS9QeXRob24vcHlzdGF0ZS5jCisrKyBiL1B5dGhvbi9weXN0YXRlLmMKQEAgLTY4Niw3ICs2ODYsNyBAQAogfQogCiAvKiBJbnRlcm5hbCBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb25zIGNhbGxlZCBieQotICAgUHlfSW5pdGlhbGl6ZS9QeV9GaW5hbGl6ZQorICAgUHlfSW5pdGlhbGl6ZS9QeV9GaW5hbGl6ZUV4CiAqLwogdm9pZAogX1B5R0lMU3RhdGVfSW5pdChQeUludGVycHJldGVyU3RhdGUgKmksIFB5VGhyZWFkU3RhdGUgKnQpCmRpZmYgLS1naXQgYS9QeXRob24vcHlzdHJ0b2QuYyBiL1B5dGhvbi9weXN0cnRvZC5jCmluZGV4IDIwOWM5MDguLjVmM2FmOTIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0cnRvZC5jCisrKyBiL1B5dGhvbi9weXN0cnRvZC5jCkBAIC04ODEsMTIgKzg4MSwxMiBAQAogI2RlZmluZSBPRlNfRSAyCiAKIC8qIFRoZSBsZW5ndGhzIG9mIHRoZXNlIGFyZSBrbm93biB0byB0aGUgY29kZSBiZWxvdywgc28gZG9uJ3QgY2hhbmdlIHRoZW0gKi8KLXN0YXRpYyBjaGFyICpsY19mbG9hdF9zdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKICAgICAiaW5mIiwKICAgICAibmFuIiwKICAgICAiZSIsCiB9Owotc3RhdGljIGNoYXIgKnVjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWNfZmxvYXRfc3RyaW5nc1tdID0gewogICAgICJJTkYiLAogICAgICJOQU4iLAogICAgICJFIiwKQEAgLTkyNSw3ICs5MjUsOCBAQAogZm9ybWF0X2Zsb2F0X3Nob3J0KGRvdWJsZSBkLCBjaGFyIGZvcm1hdF9jb2RlLAogICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBpbnQgcHJlY2lzaW9uLAogICAgICAgICAgICAgICAgICAgIGludCBhbHdheXNfYWRkX3NpZ24sIGludCBhZGRfZG90XzBfaWZfaW50ZWdlciwKLSAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2FsdF9mb3JtYXR0aW5nLCBjaGFyICoqZmxvYXRfc3RyaW5ncywgaW50ICp0eXBlKQorICAgICAgICAgICAgICAgICAgIGludCB1c2VfYWx0X2Zvcm1hdHRpbmcsIGNvbnN0IGNoYXIgKiBjb25zdCAqZmxvYXRfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICBpbnQgKnR5cGUpCiB7CiAgICAgY2hhciAqYnVmID0gTlVMTDsKICAgICBjaGFyICpwID0gTlVMTDsKQEAgLTExNzYsNyArMTE3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlKQogewotICAgIGNoYXIgKipmbG9hdF9zdHJpbmdzID0gbGNfZmxvYXRfc3RyaW5nczsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKmZsb2F0X3N0cmluZ3MgPSBsY19mbG9hdF9zdHJpbmdzOwogICAgIGludCBtb2RlOwogCiAgICAgLyogVmFsaWRhdGUgZm9ybWF0X2NvZGUsIGFuZCBtYXAgdXBwZXIgYW5kIGxvd2VyIGNhc2UuIENvbXB1dGUgdGhlCmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggZWJlZGQxMi4uODgyOTY5OSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtNDMxLDcgKzQzMSw3IEBACiBwYXJzZV9zeW50YXhfZXJyb3IoUHlPYmplY3QgKmVyciwgUHlPYmplY3QgKiptZXNzYWdlLCBQeU9iamVjdCAqKmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgIGludCAqbGluZW5vLCBpbnQgKm9mZnNldCwgUHlPYmplY3QgKip0ZXh0KQogewotICAgIGxvbmcgaG9sZDsKKyAgICBpbnQgaG9sZDsKICAgICBQeU9iamVjdCAqdjsKICAgICBfUHlfSURFTlRJRklFUihtc2cpOwogICAgIF9QeV9JREVOVElGSUVSKGZpbGVuYW1lKTsKQEAgLTQ2NCwxMSArNDY0LDExIEBACiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF9saW5lbm8pOwogICAgIGlmICghdikKICAgICAgICAgZ290byBmaW5hbGx5OwotICAgIGhvbGQgPSBQeUxvbmdfQXNMb25nKHYpOworICAgIGhvbGQgPSBfUHlMb25nX0FzSW50KHYpOwogICAgIFB5X0RFQ1JFRih2KTsKICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICpsaW5lbm8gPSAoaW50KWhvbGQ7CisgICAgKmxpbmVubyA9IGhvbGQ7CiAKICAgICB2ID0gX1B5T2JqZWN0X0dldEF0dHJJZChlcnIsICZQeUlkX29mZnNldCk7CiAgICAgaWYgKCF2KQpAQCAtNDc3LDExICs0NzcsMTEgQEAKICAgICAgICAgKm9mZnNldCA9IC0xOwogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaG9sZCA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgIGhvbGQgPSBfUHlMb25nX0FzSW50KHYpOwogICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgIGlmIChob2xkIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICAqb2Zmc2V0ID0gKGludClob2xkOworICAgICAgICAqb2Zmc2V0ID0gaG9sZDsKICAgICB9CiAKICAgICB2ID0gX1B5T2JqZWN0X0dldEF0dHJJZChlcnIsICZQeUlkX3RleHQpOwpAQCAtNzg1LDExICs3ODUsMTEgQEAKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmNhdXNlX21lc3NhZ2UgPQorc3RhdGljIGNvbnN0IGNoYXIgY2F1c2VfbWVzc2FnZVtdID0KICAgICAiXG5UaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlICIKICAgICAib2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246XG5cbiI7CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb250ZXh0X21lc3NhZ2UgPQorc3RhdGljIGNvbnN0IGNoYXIgY29udGV4dF9tZXNzYWdlW10gPQogICAgICJcbkR1cmluZyBoYW5kbGluZyBvZiB0aGUgYWJvdmUgZXhjZXB0aW9uLCAiCiAgICAgImFub3RoZXIgZXhjZXB0aW9uIG9jY3VycmVkOlxuXG4iOwogCkBAIC0xMTM4LDggKzExMzgsOCBAQAogCiBtb2RfdHkKIFB5UGFyc2VyX0FTVEZyb21GaWxlT2JqZWN0KEZJTEUgKmZwLCBQeU9iamVjdCAqZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY2hhciAqcHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNvbnN0IGNoYXIgKnBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpCiB7CiAgICAgbW9kX3R5IG1vZDsKQEAgLTExNzEsOCArMTE3MSw4IEBACiAKIG1vZF90eQogUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lX3N0ciwgY29uc3QgY2hhciogZW5jLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjaGFyICpwczEsCi0gICAgICAgICAgICAgICAgICAgICBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY29uc3QgY2hhciAqcHMxLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKICAgICBtb2RfdHkgbW9kOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5dGltZS5jIGIvUHl0aG9uL3B5dGltZS5jCmluZGV4IDdmNjU4MjQuLjgxNjgyY2EgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXRpbWUuYworKysgYi9QeXRob24vcHl0aW1lLmMKQEAgLTcsNiArNywxMSBAQAogI2luY2x1ZGUgPG1hY2gvbWFjaF90aW1lLmg+ICAgLyogbWFjaF9hYnNvbHV0ZV90aW1lKCksIG1hY2hfdGltZWJhc2VfaW5mbygpICovCiAjZW5kaWYKIAorI2RlZmluZSBfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyhhLCBiKSBcCisgICAgKGFzc2VydChiID4gMCksIFwKKyAgICAgKF9QeVRpbWVfdCkoYSkgPCBfUHlUaW1lX01JTiAvIChfUHlUaW1lX3QpKGIpIFwKKyAgICAgfHwgX1B5VGltZV9NQVggLyAoX1B5VGltZV90KShiKSA8IChfUHlUaW1lX3QpKGEpKQorCiAvKiBUbyBtaWxsaXNlY29uZCAoMTBeLTMpICovCiAjZGVmaW5lIFNFQ19UT19NUyAxMDAwCiAKQEAgLTM4LDcgKzQzLDcgQEAKICAgICB2YWwgPSBQeUxvbmdfQXNMb25nTG9uZyhvYmopOwogI2Vsc2UKICAgICBsb25nIHZhbDsKLSAgICBhc3NlcnQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKICAgICB2YWwgPSBQeUxvbmdfQXNMb25nKG9iaik7CiAjZW5kaWYKICAgICBpZiAodmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKQEAgLTU1LDU1ICs2MCw4OCBAQAogI2lmIGRlZmluZWQoSEFWRV9MT05HX0xPTkcpICYmIFNJWkVPRl9USU1FX1QgPT0gU0laRU9GX0xPTkdfTE9ORwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdCk7CiAjZWxzZQotICAgIGFzc2VydChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdCk7CiAjZW5kaWYKIH0KIAorLyogUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIKKyAgIChfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgKi8KK3N0YXRpYyBkb3VibGUKK19QeVRpbWVfUm91bmRIYWxmRXZlbihkb3VibGUgeCkKK3sKKyAgICBkb3VibGUgcm91bmRlZCA9IHJvdW5kKHgpOworICAgIGlmIChmYWJzKHgtcm91bmRlZCkgPT0gMC41KQorICAgICAgICAvKiBoYWxmd2F5IGNhc2U6IHJvdW5kIHRvIGV2ZW4gKi8KKyAgICAgICAgcm91bmRlZCA9IDIuMCpyb3VuZCh4LzIuMCk7CisgICAgcmV0dXJuIHJvdW5kZWQ7Cit9CisKK3N0YXRpYyBkb3VibGUKK19QeVRpbWVfUm91bmQoZG91YmxlIHgsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKK3sKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGQ7CisKKyAgICBkID0geDsKKyAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pCisgICAgICAgIGQgPSBfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZCk7CisgICAgZWxzZSBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKQorICAgICAgICBkID0gY2VpbChkKTsKKyAgICBlbHNlCisgICAgICAgIGQgPSBmbG9vcihkKTsKKyAgICByZXR1cm4gZDsKK30KKworc3RhdGljIGludAorX1B5VGltZV9Eb3VibGVUb0Rlbm9taW5hdG9yKGRvdWJsZSBkLCB0aW1lX3QgKnNlYywgbG9uZyAqbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZW5vbWluYXRvciwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQoreworICAgIGRvdWJsZSBpbnRwYXJ0LCBlcnI7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBmbG9hdHBhcnQ7CisKKyAgICBmbG9hdHBhcnQgPSBtb2RmKGQsICZpbnRwYXJ0KTsKKworICAgIGZsb2F0cGFydCAqPSBkZW5vbWluYXRvcjsKKyAgICBmbG9hdHBhcnQgPSBfUHlUaW1lX1JvdW5kKGZsb2F0cGFydCwgcm91bmQpOworICAgIGlmIChmbG9hdHBhcnQgPj0gZGVub21pbmF0b3IpIHsKKyAgICAgICAgZmxvYXRwYXJ0IC09IGRlbm9taW5hdG9yOworICAgICAgICBpbnRwYXJ0ICs9IDEuMDsKKyAgICB9CisgICAgZWxzZSBpZiAoZmxvYXRwYXJ0IDwgMCkgeworICAgICAgICBmbG9hdHBhcnQgKz0gZGVub21pbmF0b3I7CisgICAgICAgIGludHBhcnQgLT0gMS4wOworICAgIH0KKyAgICBhc3NlcnQoMC4wIDw9IGZsb2F0cGFydCAmJiBmbG9hdHBhcnQgPCBkZW5vbWluYXRvcik7CisKKyAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OworICAgICpudW1lcmF0b3IgPSAobG9uZylmbG9hdHBhcnQ7CisKKyAgICBlcnIgPSBpbnRwYXJ0IC0gKGRvdWJsZSkqc2VjOworICAgIGlmIChlcnIgPD0gLTEuMCB8fCBlcnIgPj0gMS4wKSB7CisgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3IoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIGxvbmcgKm51bWVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVub21pbmF0b3IsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKLSAgICBhc3NlcnQoZGVub21pbmF0b3IgPD0gTE9OR19NQVgpOworICAgIGFzc2VydChkZW5vbWluYXRvciA8PSAoZG91YmxlKUxPTkdfTUFYKTsKKwogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgZG91YmxlIGQsIGludHBhcnQsIGVycjsKLSAgICAgICAgLyogdm9sYXRpbGUgYXZvaWRzIHVuc2FmZSBvcHRpbWl6YXRpb24gb24gZmxvYXQgZW5hYmxlZCBieSBnY2MgLU8zICovCi0gICAgICAgIHZvbGF0aWxlIGRvdWJsZSBmbG9hdHBhcnQ7Ci0KLSAgICAgICAgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKLSAgICAgICAgZmxvYXRwYXJ0ID0gbW9kZihkLCAmaW50cGFydCk7Ci0gICAgICAgIGlmIChmbG9hdHBhcnQgPCAwKSB7Ci0gICAgICAgICAgICBmbG9hdHBhcnQgPSAxLjAgKyBmbG9hdHBhcnQ7Ci0gICAgICAgICAgICBpbnRwYXJ0IC09IDEuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0cGFydCAqPSBkZW5vbWluYXRvcjsKLSAgICAgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgewotICAgICAgICAgICAgZmxvYXRwYXJ0ID0gY2VpbChmbG9hdHBhcnQpOwotICAgICAgICAgICAgaWYgKGZsb2F0cGFydCA+PSBkZW5vbWluYXRvcikgewotICAgICAgICAgICAgICAgIGZsb2F0cGFydCA9IDAuMDsKLSAgICAgICAgICAgICAgICBpbnRwYXJ0ICs9IDEuMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0cGFydCA9IGZsb29yKGZsb2F0cGFydCk7Ci0gICAgICAgIH0KLQotICAgICAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OwotICAgICAgICBlcnIgPSBpbnRwYXJ0IC0gKGRvdWJsZSkqc2VjOwotICAgICAgICBpZiAoZXJyIDw9IC0xLjAgfHwgZXJyID49IDEuMCkgewotICAgICAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAqbnVtZXJhdG9yID0gKGxvbmcpZmxvYXRwYXJ0OwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZG91YmxlIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CisgICAgICAgIHJldHVybiBfUHlUaW1lX0RvdWJsZVRvRGVub21pbmF0b3IoZCwgc2VjLCBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IsIHJvdW5kKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgICpzZWMgPSBfUHlMb25nX0FzVGltZV90KG9iaik7CisgICAgICAgICpudW1lcmF0b3IgPSAwOwogICAgICAgICBpZiAoKnNlYyA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICpudW1lcmF0b3IgPSAwOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CkBAIC0xMTIsMTMgKzE1MCwxMiBAQAogX1B5VGltZV9PYmplY3RUb1RpbWVfdChQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgZG91YmxlIGQsIGludHBhcnQsIGVycjsKKyAgICAgICAgZG91YmxlIGludHBhcnQsIGVycjsKKyAgICAgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgICAgICB2b2xhdGlsZSBkb3VibGUgZDsKIAogICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKQotICAgICAgICAgICAgZCA9IGNlaWwoZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGQgPSBmbG9vcihkKTsKKyAgICAgICAgZCA9IF9QeVRpbWVfUm91bmQoZCwgcm91bmQpOwogICAgICAgICAodm9pZCltb2RmKGQsICZpbnRwYXJ0KTsKIAogICAgICAgICAqc2VjID0gKHRpbWVfdClpbnRwYXJ0OwpAQCAtMTQxLDE0ICsxNzgsMjAgQEAKIF9QeVRpbWVfT2JqZWN0VG9UaW1lc3BlYyhQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgbG9uZyAqbnNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7Ci0gICAgcmV0dXJuIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgbnNlYywgMWU5LCByb3VuZCk7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIG5zZWMsIDFlOSwgcm91bmQpOworICAgIGFzc2VydCgwIDw9ICpuc2VjICYmICpuc2VjIDwgU0VDX1RPX05TKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKIF9QeVRpbWVfT2JqZWN0VG9UaW1ldmFsKFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBsb25nICp1c2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewotICAgIHJldHVybiBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIHVzZWMsIDFlNiwgcm91bmQpOworICAgIGludCByZXM7CisgICAgcmVzID0gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCB1c2VjLCAxZTYsIHJvdW5kKTsKKyAgICBhc3NlcnQoMCA8PSAqdXNlYyAmJiAqdXNlYyA8IFNFQ19UT19VUyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2MiwxMiArMjA1LDE1IEBACiBfUHlUaW1lX0Zyb21TZWNvbmRzKGludCBzZWNvbmRzKQogewogICAgIF9QeVRpbWVfdCB0OworICAgIHQgPSAoX1B5VGltZV90KXNlY29uZHM7CiAgICAgLyogZW5zdXJlIHRoYXQgaW50ZWdlciBvdmVyZmxvdyBjYW5ub3QgaGFwcGVuLCBpbnQgdHlwZSBzaG91bGQgaGF2ZSAzMgogICAgICAgIGJpdHMsIHdoZXJlYXMgX1B5VGltZV90IHR5cGUgaGFzIGF0IGxlYXN0IDY0IGJpdHMgKFNFQ19UT19NUyB0YWtlcyAzMAogICAgICAgIGJpdHMpLiAqLwotICAgIGFzc2VydCgoc2Vjb25kcyA+PSAwICYmIHNlY29uZHMgPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpCi0gICAgICAgICAgIHx8IChzZWNvbmRzIDwgMCAmJiBzZWNvbmRzID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKSk7Ci0gICAgdCA9IChfUHlUaW1lX3Qpc2Vjb25kcyAqIFNFQ19UT19OUzsKKyAgICBQeV9CVUlMRF9BU1NFUlQoSU5UX01BWCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUyk7CisgICAgUHlfQlVJTERfQVNTRVJUKElOVF9NSU4gPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpOworICAgIGFzc2VydCgodCA+PSAwICYmIHQgPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpCisgICAgICAgICAgIHx8ICh0IDwgMCAmJiB0ID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKSk7CisgICAgdCAqPSBTRUNfVE9fTlM7CiAgICAgcmV0dXJuIHQ7CiB9CiAKQEAgLTE3NSw3ICsyMjEsNyBAQAogX1B5VGltZV9Gcm9tTmFub3NlY29uZHMoUFlfTE9OR19MT05HIG5zKQogewogICAgIF9QeVRpbWVfdCB0OwotICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKICAgICB0ID0gUHlfU0FGRV9ET1dOQ0FTVChucywgUFlfTE9OR19MT05HLCBfUHlUaW1lX3QpOwogICAgIHJldHVybiB0OwogfQpAQCAtMTg3LDEyICsyMzMsMTUgQEAKICAgICBfUHlUaW1lX3QgdDsKICAgICBpbnQgcmVzID0gMDsKIAotICAgIHQgPSAoX1B5VGltZV90KXRzLT50dl9zZWMgKiBTRUNfVE9fTlM7Ci0gICAgaWYgKHQgLyBTRUNfVE9fTlMgIT0gdHMtPnR2X3NlYykgeworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodHMtPnR2X3NlYykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSAoX1B5VGltZV90KXRzLT50dl9zZWM7CisKKyAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3codCwgU0VDX1RPX05TKSkgewogICAgICAgICBpZiAocmFpc2UpCiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgIHJlcyA9IC0xOwogICAgIH0KKyAgICB0ID0gdCAqIFNFQ19UT19OUzsKIAogICAgIHQgKz0gdHMtPnR2X25zZWM7CiAKQEAgLTIwNiwxMiArMjU1LDE1IEBACiAgICAgX1B5VGltZV90IHQ7CiAgICAgaW50IHJlcyA9IDA7CiAKLSAgICB0ID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjICogU0VDX1RPX05TOwotICAgIGlmICh0IC8gU0VDX1RPX05TICE9IHR2LT50dl9zZWMpIHsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHR2LT50dl9zZWMpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjOworCisgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHQsIFNFQ19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICByZXMgPSAtMTsKICAgICB9CisgICAgdCA9IHQgKiBTRUNfVE9fTlM7CiAKICAgICB0ICs9IChfUHlUaW1lX3QpdHYtPnR2X3VzZWMgKiBVU19UT19OUzsKIApAQCAtMjIxLDUwICsyNzMsNTkgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50CitfUHlUaW1lX0Zyb21GbG9hdE9iamVjdChfUHlUaW1lX3QgKnQsIGRvdWJsZSB2YWx1ZSwgX1B5VGltZV9yb3VuZF90IHJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyB1bml0X3RvX25zKQoreworICAgIGRvdWJsZSBlcnI7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBkOworCisgICAgLyogY29udmVydCB0byBhIG51bWJlciBvZiBuYW5vc2Vjb25kcyAqLworICAgIGQgPSB2YWx1ZTsKKyAgICBkICo9IChkb3VibGUpdW5pdF90b19uczsKKyAgICBkID0gX1B5VGltZV9Sb3VuZChkLCByb3VuZCk7CisKKyAgICAqdCA9IChfUHlUaW1lX3QpZDsKKyAgICBlcnIgPSBkIC0gKGRvdWJsZSkqdDsKKyAgICBpZiAoZmFicyhlcnIpID49IDEuMCkgeworICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIF9QeVRpbWVfRnJvbU9iamVjdChfUHlUaW1lX3QgKnQsIFB5T2JqZWN0ICpvYmosIF9QeVRpbWVfcm91bmRfdCByb3VuZCwKLSAgICAgICAgICAgICAgICAgICBsb25nIHRvX25hbm9zZWNvbmRzKQorICAgICAgICAgICAgICAgICAgIGxvbmcgdW5pdF90b19ucykKIHsKICAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7Ci0gICAgICAgIC8qIHZvbGF0aWxlIGF2b2lkcyB1bnNhZmUgb3B0aW1pemF0aW9uIG9uIGZsb2F0IGVuYWJsZWQgYnkgZ2NjIC1PMyAqLwotICAgICAgICB2b2xhdGlsZSBkb3VibGUgZCwgZXJyOwotCi0gICAgICAgIC8qIGNvbnZlcnQgdG8gYSBudW1iZXIgb2YgbmFub3NlY29uZHMgKi8KKyAgICAgICAgZG91YmxlIGQ7CiAgICAgICAgIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGQgKj0gdG9fbmFub3NlY29uZHM7Ci0KLSAgICAgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykKLSAgICAgICAgICAgIGQgPSBjZWlsKGQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkID0gZmxvb3IoZCk7Ci0KLSAgICAgICAgKnQgPSAoX1B5VGltZV90KWQ7Ci0gICAgICAgIGVyciA9IGQgLSAoZG91YmxlKSp0OwotICAgICAgICBpZiAoZmFicyhlcnIpID49IDEuMCkgewotICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gX1B5VGltZV9Gcm9tRmxvYXRPYmplY3QodCwgZCwgcm91bmQsIHVuaXRfdG9fbnMpOwogICAgIH0KICAgICBlbHNlIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICBQWV9MT05HX0xPTkcgc2VjOworICAgICAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworCiAgICAgICAgIHNlYyA9IFB5TG9uZ19Bc0xvbmdMb25nKG9iaik7Ci0gICAgICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CiAjZWxzZQogICAgICAgICBsb25nIHNlYzsKKyAgICAgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKwogICAgICAgICBzZWMgPSBQeUxvbmdfQXNMb25nKG9iaik7Ci0gICAgICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CiAjZW5kaWYKICAgICAgICAgaWYgKHNlYyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKICAgICAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgKnQgPSBzZWMgKiB0b19uYW5vc2Vjb25kczsKLSAgICAgICAgaWYgKCp0IC8gdG9fbmFub3NlY29uZHMgIT0gc2VjKSB7CisKKyAgICAgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHNlYywgdW5pdF90b19ucykpIHsKICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQorICAgICAgICAqdCA9IHNlYyAqIHVuaXRfdG9fbnM7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KQEAgLTI4NCwyMiArMzQ1LDMxIEBACiBkb3VibGUKIF9QeVRpbWVfQXNTZWNvbmRzRG91YmxlKF9QeVRpbWVfdCB0KQogewotICAgIF9QeVRpbWVfdCBzZWMsIG5zOwotICAgIC8qIERpdmlkZSB1c2luZyBpbnRlZ2VycyB0byBhdm9pZCByb3VuZGluZyBpc3N1ZXMgb24gdGhlIGludGVnZXIgcGFydC4KLSAgICAgICAxZS05IGNhbm5vdCBiZSBzdG9yZWQgZXhhY3RseSBpbiBJRUVFIDY0LWJpdC4gKi8KLSAgICBzZWMgPSB0IC8gU0VDX1RPX05TOwotICAgIG5zID0gdCAlIFNFQ19UT19OUzsKLSAgICByZXR1cm4gKGRvdWJsZSlzZWMgKyAoZG91YmxlKW5zICogMWUtOTsKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGQ7CisKKyAgICBpZiAodCAlIFNFQ19UT19OUyA9PSAwKSB7CisgICAgICAgIF9QeVRpbWVfdCBzZWNzOworICAgICAgICAvKiBEaXZpZGUgdXNpbmcgaW50ZWdlcnMgdG8gYXZvaWQgcm91bmRpbmcgaXNzdWVzIG9uIHRoZSBpbnRlZ2VyIHBhcnQuCisgICAgICAgICAgIDFlLTkgY2Fubm90IGJlIHN0b3JlZCBleGFjdGx5IGluIElFRUUgNjQtYml0LiAqLworICAgICAgICBzZWNzID0gdCAvIFNFQ19UT19OUzsKKyAgICAgICAgZCA9IChkb3VibGUpc2VjczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGQgPSAoZG91YmxlKXQ7CisgICAgICAgIGQgLz0gMWU5OworICAgIH0KKyAgICByZXR1cm4gZDsKIH0KIAogUHlPYmplY3QgKgogX1B5VGltZV9Bc05hbm9zZWNvbmRzT2JqZWN0KF9QeVRpbWVfdCB0KQogewogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0gICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpID49IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdCk7CiAjZWxzZQotICAgIGFzc2VydChzaXplb2YobG9uZykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YobG9uZykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOwogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdCk7CiAjZW5kaWYKIH0KQEAgLTMwOSw3ICszNzksMjAgQEAKICAgICAgICAgICAgICAgIGNvbnN0IF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKICAgICBhc3NlcnQoayA+IDEpOwotICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKKyAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pIHsKKyAgICAgICAgX1B5VGltZV90IHgsIHIsIGFic19yOworICAgICAgICB4ID0gdCAvIGs7CisgICAgICAgIHIgPSB0ICUgazsKKyAgICAgICAgYWJzX3IgPSBQeV9BQlMocik7CisgICAgICAgIGlmIChhYnNfciA+IGsgLyAyIHx8IChhYnNfciA9PSBrIC8gMiAmJiAoUHlfQUJTKHgpICYgMSkpKSB7CisgICAgICAgICAgICBpZiAodCA+PSAwKQorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4LS07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIGVsc2UgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgewogICAgICAgICBpZiAodCA+PSAwKQogICAgICAgICAgICAgcmV0dXJuICh0ICsgayAtIDEpIC8gazsKICAgICAgICAgZWxzZQpAQCAtMzczLDcgKzQ1Niw3IEBACiBfUHlUaW1lX0FzVGltZXZhbFN0cnVjdF9pbXBsKF9QeVRpbWVfdCB0LCBzdHJ1Y3QgdGltZXZhbCAqdHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVRpbWVfcm91bmRfdCByb3VuZCwgaW50IHJhaXNlKQogewotICAgIF9QeVRpbWVfdCBzZWNzOworICAgIF9QeVRpbWVfdCBzZWNzLCBzZWNzMjsKICAgICBpbnQgdXM7CiAgICAgaW50IHJlczsKIApAQCAtMzg2LDcgKzQ2OSw4IEBACiAjZW5kaWYKICAgICB0di0+dHZfdXNlYyA9IHVzOwogCi0gICAgaWYgKHJlcyA8IDAgfHwgKF9QeVRpbWVfdCl0di0+dHZfc2VjICE9IHNlY3MpIHsKKyAgICBzZWNzMiA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYzsKKyAgICBpZiAocmVzIDwgMCB8fCBzZWNzMiAhPSBzZWNzKSB7CiAgICAgICAgIGlmIChyYWlzZSkKICAgICAgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC00MjQsNiArNTA4LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiAjaWYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpIHx8IGRlZmluZWQoSEFWRV9LUVVFVUUpCiBpbnQKIF9QeVRpbWVfQXNUaW1lc3BlYyhfUHlUaW1lX3QgdCwgc3RydWN0IHRpbWVzcGVjICp0cykKQEAgLTQzNywxMyArNTIyLDEzIEBACiAgICAgICAgIHNlY3MgLT0gMTsKICAgICB9CiAgICAgdHMtPnR2X3NlYyA9ICh0aW1lX3Qpc2VjczsKLSAgICBpZiAoKF9QeVRpbWVfdCl0cy0+dHZfc2VjICE9IHNlY3MpIHsKLSAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGFzc2VydCgwIDw9IG5zZWMgJiYgbnNlYyA8IFNFQ19UT19OUyk7CiAgICAgdHMtPnR2X25zZWMgPSBuc2VjOwogCi0gICAgYXNzZXJ0KDAgPD0gdHMtPnR2X25zZWMgJiYgdHMtPnR2X25zZWMgPD0gOTk5OTk5OTk5KTsKKyAgICBpZiAoKF9QeVRpbWVfdCl0cy0+dHZfc2VjICE9IHNlY3MpIHsKKyAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTU1NywxOSArNjQyLDIwIEBACiAgICAgcmV0dXJuIHB5Z2V0dGltZW9mZGF5KHQsIGluZm8sIDEpOwogfQogCi0KIHN0YXRpYyBpbnQKIHB5bW9ub3RvbmljKF9QeVRpbWVfdCAqdHAsIF9QeV9jbG9ja19pbmZvX3QgKmluZm8sIGludCByYWlzZSkKIHsKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCi0gICAgVUxPTkdMT05HIHJlc3VsdDsKKyAgICBVTE9OR0xPTkcgdGlja3M7CisgICAgX1B5VGltZV90IHQ7CiAKICAgICBhc3NlcnQoaW5mbyA9PSBOVUxMIHx8IHJhaXNlKTsKIAotICAgIHJlc3VsdCA9IEdldFRpY2tDb3VudDY0KCk7CisgICAgdGlja3MgPSBHZXRUaWNrQ291bnQ2NCgpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodGlja3MpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0aWNrczsKIAotICAgICp0cCA9IHJlc3VsdCAqIE1TX1RPX05TOwotICAgIGlmICgqdHAgLyBNU19UT19OUyAhPSByZXN1bHQpIHsKKyAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3codCwgTVNfVE9fTlMpKSB7CiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNTc3LDYgKzY2Myw3IEBACiAgICAgICAgIC8qIEhlbGxvLCB0aW1lIHRyYXZlbGVyISAqLwogICAgICAgICBhc3NlcnQoMCk7CiAgICAgfQorICAgICp0cCA9IHQgKiBNU19UT19OUzsKIAogICAgIGlmIChpbmZvKSB7CiAgICAgICAgIERXT1JEIHRpbWVBZGp1c3RtZW50LCB0aW1lSW5jcmVtZW50OwpAQCAtNjg5LDggKzc3Niw1IEBACiAgICAgaWYgKF9QeVRpbWVfR2V0TW9ub3RvbmljQ2xvY2tXaXRoSW5mbygmdCwgTlVMTCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAvKiBjaGVjayB0aGF0IF9QeVRpbWVfRnJvbVNlY29uZHMoKSBjYW5ub3Qgb3ZlcmZsb3cgKi8KLSAgICBhc3NlcnQoSU5UX01BWCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUyk7Ci0gICAgYXNzZXJ0KElOVF9NSU4gPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3JhbmRvbS5jIGIvUHl0aG9uL3JhbmRvbS5jCmluZGV4IDc3MmJmZWYuLjliNDJkNTQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9yYW5kb20uYworKysgYi9QeXRob24vcmFuZG9tLmMKQEAgLTM3OSw3ICszNzksNyBAQAogICAgIGNoYXIgKmVudjsKICAgICB1bnNpZ25lZCBjaGFyICpzZWNyZXQgPSAodW5zaWduZWQgY2hhciAqKSZfUHlfSGFzaFNlY3JldC51YzsKICAgICBQeV9zc2l6ZV90IHNlY3JldF9zaXplID0gc2l6ZW9mKF9QeV9IYXNoU2VjcmV0X3QpOwotICAgIGFzc2VydChzZWNyZXRfc2l6ZSA9PSBzaXplb2YoX1B5X0hhc2hTZWNyZXQudWMpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKF9QeV9IYXNoU2VjcmV0X3QpID09IHNpemVvZihfUHlfSGFzaFNlY3JldC51YykpOwogCiAgICAgaWYgKF9QeV9IYXNoU2VjcmV0X0luaXRpYWxpemVkKQogICAgICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9QeXRob24vc3ltdGFibGUuYyBiL1B5dGhvbi9zeW10YWJsZS5jCmluZGV4IDZkMWE2MmIuLjlmNTE0OWYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeW10YWJsZS5jCisrKyBiL1B5dGhvbi9zeW10YWJsZS5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgc3ltdGFibGVfYW5hbHl6ZShzdHJ1Y3Qgc3ltdGFibGUgKnN0KTsKLXN0YXRpYyBpbnQgc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjaGFyICptc2csIGludCBsaW5lbm8pOworc3RhdGljIGludCBzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNvbnN0IGNoYXIgKm1zZywgaW50IGxpbmVubyk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0cnVjdCBzeW10YWJsZSAqc3QsIGlkZW50aWZpZXIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2Jsb2NrX3R5IGJsb2NrLCB2b2lkICphc3QsIGludCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0KTsKQEAgLTkwOCw3ICs5MDgsNyBAQAogCiAKIHN0YXRpYyBpbnQKLXN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY2hhciAqbXNnLCBpbnQgbGluZW5vKQorc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjb25zdCBjaGFyICptc2csIGludCBsaW5lbm8pCiB7CiAgICAgUHlPYmplY3QgKm1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhtc2cpOwogICAgIGlmIChtZXNzYWdlID09IE5VTEwpCkBAIC0xNDQ3LDYgKzE0NDcsMTQgQEAKICAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkNhbGwuYXJncyk7CiAgICAgICAgIFZJU0lUX1NFUV9XSVRIX05VTEwoc3QsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUpOworICAgICAgICBpZiAoZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYykKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkpvaW5lZFN0ci52YWx1ZXMpOworICAgICAgICBicmVhazsKICAgICBjYXNlIE51bV9raW5kOgogICAgIGNhc2UgU3RyX2tpbmQ6CiAgICAgY2FzZSBCeXRlc19raW5kOgpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5c21vZHVsZS5jIGIvUHl0aG9uL3N5c21vZHVsZS5jCmluZGV4IDMzNGY1ZDAuLmY3ODRmNzUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeXNtb2R1bGUuYworKysgYi9QeXRob24vc3lzbW9kdWxlLmMKQEAgLTM0Niw4ICszNDYsMTAgQEAKIHN0YXRpYyBpbnQKIHRyYWNlX2luaXQodm9pZCkKIHsKLSAgICBzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIn07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3aGF0bmFtZXNbN10gPSB7CisgICAgICAgICJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCisgICAgICAgICJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4iCisgICAgfTsKICAgICBQeU9iamVjdCAqbmFtZTsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7CkBAIC0xNjQzLDE1ICsxNjQ1LDExIEBACiAvKiBzeXMuaW1wbGVtZW50YXRpb24gdmFsdWVzICovCiAjZGVmaW5lIE5BTUUgImNweXRob24iCiBjb25zdCBjaGFyICpfUHlTeXNfSW1wbE5hbWUgPSBOQU1FOwotI2RlZmluZSBRVU9URShhcmcpICNhcmcKLSNkZWZpbmUgU1RSSUZZKG5hbWUpIFFVT1RFKG5hbWUpCi0jZGVmaW5lIE1BSk9SIFNUUklGWShQWV9NQUpPUl9WRVJTSU9OKQotI2RlZmluZSBNSU5PUiBTVFJJRlkoUFlfTUlOT1JfVkVSU0lPTikKKyNkZWZpbmUgTUFKT1IgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pCisjZGVmaW5lIE1JTk9SIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKQogI2RlZmluZSBUQUcgTkFNRSAiLSIgTUFKT1IgTUlOT1IKIGNvbnN0IGNoYXIgKl9QeVN5c19JbXBsQ2FjaGVUYWcgPSBUQUc7CiAjdW5kZWYgTkFNRQotI3VuZGVmIFFVT1RFCi0jdW5kZWYgU1RSSUZZCiAjdW5kZWYgTUFKT1IKICN1bmRlZiBNSU5PUgogI3VuZGVmIFRBRwpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDg0YWFlZjkuLmQ2ODJhMmIgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTEsNSArMSw1IEBACi1UaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNS4xCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNi4wIGFscGhhIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsCiAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTI4LDkgKzI4LDkgQEAKIGVsc2V3aGVyZSBpdCdzIGp1c3QgcHl0aG9uLgogCiBPbiBNYWMgT1MgWCwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBQeXRob24gd2l0aCAtLWVuYWJsZS1mcmFtZXdvcmssIHlvdSBzaG91bGQKLXVzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB0byBkbyB0aGUgaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaW5zdGFsbHMKLXRoZSBQeXRob24gZXhlY3V0YWJsZSBpbiBhIHBsYWNlIHRoYXQgaXMgbm90IG5vcm1hbGx5IG9uIHlvdXIgUEFUSCwgeW91IG1heQotd2FudCB0byBzZXQgdXAgYSBzeW1saW5rIGluIC91c3IvbG9jYWwvYmluLgordXNlICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgdGhpcyBpbnN0YWxscyB0aGUKK1B5dGhvbiBleGVjdXRhYmxlIGluIGEgcGxhY2UgdGhhdCBpcyBub3Qgbm9ybWFsbHkgb24geW91ciBQQVRILCB5b3UgbWF5IHdhbnQgdG8KK3NldCB1cCBhIHN5bWxpbmsgaW4gL3Vzci9sb2NhbC9iaW4uCiAKIE9uIFdpbmRvd3MsIHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQuCiAKQEAgLTc5LDkgKzc5LDkgQEAKIC0tLS0tLS0tLS0KIAogV2UgaGF2ZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXMgaW4gdGhlICJXaGF0J3MgTmV3IGluCi1QeXRob24gMy41IiBkb2N1bWVudCwgZm91bmQgYXQKK1B5dGhvbiAzLjYiIGRvY3VtZW50LCBmb3VuZCBhdAogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvd2hhdHNuZXcvMy41Lmh0bWwKKyAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNi93aGF0c25ldy8zLjYuaHRtbAogCiBGb3IgYSBtb3JlIGRldGFpbGVkIGNoYW5nZSBsb2csIHJlYWQgTWlzYy9ORVdTICh0aG91Z2ggdGhpcyBmaWxlLCB0b28sCiBpcyBpbmNvbXBsZXRlLCBhbmQgYWxzbyBkb2Vzbid0IGxpc3QgYW55dGhpbmcgbWVyZ2VkIGluIGZyb20gdGhlIDIuNwpAQCAtOTQsOSArOTQsOSBAQAogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCi1Eb2N1bWVudGF0aW9uIGZvciBQeXRob24gMy41IGlzIG9ubGluZSwgdXBkYXRlZCBkYWlseToKK0RvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAzLjYgaXMgb25saW5lLCB1cGRhdGVkIGRhaWx5OgogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvCisgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjYvCiAKIEl0IGNhbiBhbHNvIGJlIGRvd25sb2FkZWQgaW4gbWFueSBmb3JtYXRzIGZvciBmYXN0ZXIgYWNjZXNzLiAgVGhlIGRvY3VtZW50YXRpb24KIGlzIGRvd25sb2FkYWJsZSBpbiBIVE1MLCBQREYsIGFuZCByZVN0cnVjdHVyZWRUZXh0IGZvcm1hdHM7IHRoZSBsYXR0ZXIgdmVyc2lvbgpAQCAtMTIxLDcgKzEyMSw3IEBACiBBIHNvdXJjZS10by1zb3VyY2UgdHJhbnNsYXRpb24gdG9vbCwgIjJ0bzMiLCBjYW4gdGFrZSBjYXJlIG9mIHRoZSBtdW5kYW5lIHRhc2sKIG9mIGNvbnZlcnRpbmcgbGFyZ2UgYW1vdW50cyBvZiBzb3VyY2UgY29kZS4gIEl0IGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGJ1dAogaXMgY29tcGxlbWVudGVkIGJ5IHRoZSBkZXByZWNhdGlvbiB3YXJuaW5ncyBpbiAyLjYuICBTZWUKLWh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy41L2xpYnJhcnkvMnRvMy5odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLgoraHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAogVGVzdGluZwpAQCAtMTUxLDE2ICsxNTEsMTYgQEAKIAogT24gVW5peCBhbmQgTWFjIHN5c3RlbXMgaWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbgogdXNpbmcgdGhlIHNhbWUgaW5zdGFsbGF0aW9uIHByZWZpeCAoLS1wcmVmaXggYXJndW1lbnQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQpCi15b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5Ci10aGUgaW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZAotdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKLXNpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzCi10byAke3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZwotdGhlIHNhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiCi12ZXJzaW9uLiAgSW5zdGFsbCB0aGF0IHZlcnNpb24gdXNpbmcgIm1ha2UgaW5zdGFsbCIuICBJbnN0YWxsIGFsbCBvdGhlcgotdmVyc2lvbnMgdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIuCit5b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5IHRoZQoraW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZCB1c2luZworIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKK3NpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzIHRvCiske3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZyB0aGUKK3NhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiIHZlcnNpb24uCitJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyIHZlcnNpb25zIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIi4KIAotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgUHl0aG9uIDIuNiwgMi43IGFuZCAzLjUgd2l0aCAyLjcgYmVpbmcgdGhlCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNiB3aXRoIDIuNyBiZWluZyB0aGUKIHByaW1hcnkgdmVyc2lvbiwgeW91IHdvdWxkIGV4ZWN1dGUgIm1ha2UgaW5zdGFsbCIgaW4geW91ciAyLjcgYnVpbGQgZGlyZWN0b3J5CiBhbmQgIm1ha2UgYWx0aW5zdGFsbCIgaW4gdGhlIG90aGVycy4KIApAQCAtMTk2LDcgKzE5Niw3IEBACiBSZWxlYXNlIFNjaGVkdWxlCiAtLS0tLS0tLS0tLS0tLS0tCiAKLVNlZSBQRVAgNDc4IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3OC8KK1NlZSBQRVAgNDk0IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ5NC8KIAogCiBDb3B5cmlnaHQgYW5kIExpY2Vuc2UgSW5mb3JtYXRpb24KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cyBiL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cwppbmRleCBmYTc5YThkLi44MDRhYjAxIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKKysrIGIvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCkBAIC02NCwxNiArNjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgS2V5PSJQeXRob25QYXRoIiBUeXBlPSJzdHJpbmciIFZhbHVlPSJbTGliXTtbRExMc10iIC8+CiAgICAgICAgICAgICAgICAgPC9SZWdpc3RyeUtleT4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgotICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iTGliX3NpdGVfcGFja2FnZXNfUkVBRE1FIiBEaXJlY3Rvcnk9IkxpYl9zaXRlX3BhY2thZ2VzIiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0iTGliX3NpdGVfcGFja2FnZXNfUkVBRE1FIiBOYW1lPSJSRUFETUUudHh0IiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKUxpYlxzaXRlLXBhY2thZ2VzXFJFQURNRSIgS2V5UGF0aD0ieWVzIiAvPgotICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmUiIERpcmVjdG9yeT0iTGliX2xpYjJ0bzMiIEd1aWQ9IiQodmFyLlJlbW92ZUxpYjJ0bzNQaWNrbGVDb21wb25lbnRHdWlkKSI+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZpbGUgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZV9maWxlcyIgTmFtZT0iKi5waWNrbGUiIE9uPSJ1bmluc3RhbGwiIC8+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZvbGRlciBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlX2ZvbGRlciIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgotICAgICAgICA8RGlyZWN0b3J5UmVmIElkPSJMaWIiPgotICAgICAgICAgICAgPERpcmVjdG9yeSBJZD0iTGliX3NpdGVfcGFja2FnZXMiIE5hbWU9InNpdGUtcGFja2FnZXMiIC8+Ci0gICAgICAgIDwvRGlyZWN0b3J5UmVmPgogICAgIDwvRnJhZ21lbnQ+CiA8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5IGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKaW5kZXggYzgyODU3Ny4uOTk3Mjc5NyAxMDA2NDQKLS0tIGEvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKKysrIGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKQEAgLTMyMiw2ICszMjIsNDUgQEAKICAgICBkZWYgX1N0cihzZWxmLCB0cmVlKToKICAgICAgICAgc2VsZi53cml0ZShyZXByKHRyZWUucykpCiAKKyAgICBkZWYgX0pvaW5lZFN0cihzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Kb2luZWRTdHIodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZSh0LCBzdHJpbmcud3JpdGUpCisgICAgICAgIHNlbGYud3JpdGUocmVwcihzdHJpbmcuZ2V0dmFsdWUoKSkpCisKKyAgICBkZWYgX2ZzdHJpbmdfSm9pbmVkU3RyKHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgZm9yIHZhbHVlIGluIHQudmFsdWVzOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHZhbHVlKS5fX25hbWVfXykKKyAgICAgICAgICAgIG1ldGgodmFsdWUsIHdyaXRlKQorCisgICAgZGVmIF9mc3RyaW5nX1N0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHZhbHVlID0gdC5zLnJlcGxhY2UoInsiLCAie3siKS5yZXBsYWNlKCJ9IiwgIn19IikKKyAgICAgICAgd3JpdGUodmFsdWUpCisKKyAgICBkZWYgX2ZzdHJpbmdfRm9ybWF0dGVkVmFsdWUoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICB3cml0ZSgieyIpCisgICAgICAgIGV4cHIgPSBpby5TdHJpbmdJTygpCisgICAgICAgIFVucGFyc2VyKHQudmFsdWUsIGV4cHIpCisgICAgICAgIGV4cHIgPSBleHByLmdldHZhbHVlKCkucnN0cmlwKCJcbiIpCisgICAgICAgIGlmIGV4cHIuc3RhcnRzd2l0aCgieyIpOgorICAgICAgICAgICAgd3JpdGUoIiAiKSAgIyBTZXBhcmF0ZSBwYWlyIG9mIG9wZW5pbmcgYnJhY2tldHMgYXMgInsgeyIKKyAgICAgICAgd3JpdGUoZXhwcikKKyAgICAgICAgaWYgdC5jb252ZXJzaW9uICE9IC0xOgorICAgICAgICAgICAgY29udmVyc2lvbiA9IGNocih0LmNvbnZlcnNpb24pCisgICAgICAgICAgICBhc3NlcnQgY29udmVyc2lvbiBpbiAic3JhIgorICAgICAgICAgICAgd3JpdGUoZiIhe2NvbnZlcnNpb259IikKKyAgICAgICAgaWYgdC5mb3JtYXRfc3BlYzoKKyAgICAgICAgICAgIHdyaXRlKCI6IikKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICJfZnN0cmluZ18iICsgdHlwZSh0LmZvcm1hdF9zcGVjKS5fX25hbWVfXykKKyAgICAgICAgICAgIG1ldGgodC5mb3JtYXRfc3BlYywgd3JpdGUpCisgICAgICAgIHdyaXRlKCJ9IikKKwogICAgIGRlZiBfTmFtZShzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSh0LmlkKQogCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5IGIvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQppbmRleCBlMTBlNDlhLi43Y2E5NTI2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKQEAgLTYsNyArNiw3IEBACiBBIGhlbHBlciBmb3IgYW5hbHl6aW5nIFBZVEhPTkRVTVBSRUZTIG91dHB1dC4KIAogV2hlbiB0aGUgUFlUSE9ORFVNUFJFRlMgZW52YXIgaXMgc2V0IGluIGEgZGVidWcgYnVpbGQsIGF0IFB5dGhvbiBzaHV0ZG93bgotdGltZSBQeV9GaW5hbGl6ZSgpIHByaW50cyB0aGUgbGlzdCBvZiBhbGwgbGl2ZSBvYmplY3RzIHR3aWNlOiAgZmlyc3QgaXQKK3RpbWUgUHlfRmluYWxpemVFeCgpIHByaW50cyB0aGUgbGlzdCBvZiBhbGwgbGl2ZSBvYmplY3RzIHR3aWNlOiAgZmlyc3QgaXQKIHByaW50cyB0aGUgcmVwcigpIG9mIGVhY2ggb2JqZWN0IHdoaWxlIHRoZSBpbnRlcnByZXRlciBpcyBzdGlsbCBmdWxseSBpbnRhY3QuCiBBZnRlciBjbGVhbmluZyB1cCBldmVyeXRoaW5nIGl0IGNhbiwgaXQgcHJpbnRzIGFsbCByZW1haW5pbmcgbGl2ZSBvYmplY3RzCiBhZ2FpbiwgYnV0IHRoZSBzZWNvbmQgdGltZSBqdXN0IHByaW50cyB0aGVpciBhZGRyZXNzZXMsIHJlZmNvdW50cywgYW5kIHR5cGUKQEAgLTQxLDcgKzQxLDcgQEAKIG9iamVjdHMgc2hvd24gaW4gdGhlIHJlcHI6ICB0aGUgcmVwciB3YXMgY2FwdHVyZWQgZnJvbSB0aGUgZmlyc3Qgb3V0cHV0IGJsb2NrLAogYW5kIHNvbWUgb2YgdGhlIGNvbnRhaW5lZXMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCBzaW5jZSB0aGVuLiAgRm9yIGV4YW1wbGUsCiBpdCdzIGNvbW1vbiBmb3IgdGhlIGxpbmUgc2hvd2luZyB0aGUgZGljdCBvZiBpbnRlcm5lZCBzdHJpbmdzIHRvIGRpc3BsYXkKLXN0cmluZ3MgdGhhdCBubyBsb25nZXIgZXhpc3QgYXQgdGhlIGVuZCBvZiBQeV9GaW5hbGl6ZTsgdGhpcyBjYW4gYmUgcmVjb2duaXplZAorc3RyaW5ncyB0aGF0IG5vIGxvbmdlciBleGlzdCBhdCB0aGUgZW5kIG9mIFB5X0ZpbmFsaXplRXg7IHRoaXMgY2FuIGJlIHJlY29nbml6ZWQKIChhbGJlaXQgcGFpbmZ1bGx5KSBiZWNhdXNlIHN1Y2ggY29udGFpbmVlcyBkb24ndCBoYXZlIGEgbGluZSBvZiB0aGVpciBvd24uCiAKIFRoZSBvYmplY3RzIGFyZSBsaXN0ZWQgaW4gYWxsb2NhdGlvbiBvcmRlciwgd2l0aCBtb3N0LXJlY2VudGx5IGFsbG9jYXRlZApkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9weXZlbnYgYi9Ub29scy9zY3JpcHRzL3B5dmVudgppbmRleCA5NzhkNjkxLi4xZmI0MmM2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3B5dmVudgorKysgYi9Ub29scy9zY3JpcHRzL3B5dmVudgpAQCAtMSw2ICsxLDEyIEBACiAjIS91c3IvYmluL2VudiBweXRob24zCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgcGF0aGxpYgorCisgICAgZXhlY3V0YWJsZSA9IHBhdGhsaWIuUGF0aChzeXMuZXhlY3V0YWJsZSBvciAncHl0aG9uMycpLm5hbWUKKyAgICBwcmludCgnV0FSTklORzogdGhlIHB5ZW52IHNjcmlwdCBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiAnCisgICAgICAgICAgZidge2V4ZWN1dGFibGV9IC1tIHZlbnZgJywgZmlsZT1zeXMuc3RkZXJyKQorCiAgICAgcmMgPSAxCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnQgdmVudgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDQzYmYwZjMuLmJkMzNkMTQgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsNiArMSw2IEBACiAjISAvYmluL3NoCiAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNS4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBweXRob24gMy42LgogIwogIyBSZXBvcnQgYnVncyB0byA8aHR0cDovL2J1Z3MucHl0aG9uLm9yZy8+LgogIwpAQCAtNTgwLDggKzU4MCw4IEBACiAjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KIFBBQ0tBR0VfTkFNRT0ncHl0aG9uJwogUEFDS0FHRV9UQVJOQU1FPSdweXRob24nCi1QQUNLQUdFX1ZFUlNJT049JzMuNScKLVBBQ0tBR0VfU1RSSU5HPSdweXRob24gMy41JworUEFDS0FHRV9WRVJTSU9OPSczLjYnCitQQUNLQUdFX1NUUklORz0ncHl0aG9uIDMuNicKIFBBQ0tBR0VfQlVHUkVQT1JUPSdodHRwOi8vYnVncy5weXRob24ub3JnLycKIFBBQ0tBR0VfVVJMPScnCiAKQEAgLTEzODUsNyArMTM4NSw3IEBACiAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgogICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCiAgIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgcHl0aG9uIDMuNSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBweXRob24gMy42IHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KIAogVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCiAKQEAgLTE0NTAsNyArMTQ1MCw3IEBACiAKIGlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCiAgIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgcHl0aG9uIDMuNToiOzsKKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHB5dGhvbiAzLjY6Ijs7CiAgICBlc2FjCiAgIGNhdCA8PFxfQUNFT0YKIApAQCAtMTYwNSw3ICsxNjA1LDcgQEAKIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCi1weXRob24gY29uZmlndXJlIDMuNQorcHl0aG9uIGNvbmZpZ3VyZSAzLjYKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OQogCiBDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0yNDQ0LDcgKzI0NDQsNyBAQAogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKLUl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy42LCB3aGljaCB3YXMKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKQEAgLTMwMTcsNyArMzAxNyw3IEBACiBtdiBjb25mZGVmcy5oLm5ldyBjb25mZGVmcy5oCiAKIAotVkVSU0lPTj0zLjUKK1ZFUlNJT049My42CiAKICMgVmVyc2lvbiBudW1iZXIgb2YgUHl0aG9uJ3Mgb3duIHNoYXJlZCBsaWJyYXJ5IGZpbGUuCiAKQEAgLTE2ODExLDcgKzE2ODExLDcgQEAKICMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgogIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KIGFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjYsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwpAQCAtMTY4NzMsNyArMTY4NzMsNyBAQAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiBhY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgogYWNfY3NfdmVyc2lvbj0iXFwKLXB5dGhvbiBjb25maWcuc3RhdHVzIDMuNQorcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy42CiBjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCiAgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggOTQ2MzJmMi4uNDFkZjdjMyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMyw3ICszLDcgQEAKIGRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAjIFNldCBWRVJTSU9OIHNvIHdlIG9ubHkgbmVlZCB0byBlZGl0IGluIG9uZSBwbGFjZSAoaS5lLiwgaGVyZSkKLW00X2RlZmluZShQWVRIT05fVkVSU0lPTiwgMy41KQorbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjYpCiAKIEFDX1BSRVJFUSgyLjY1KQogCg==