ZGlmZiAtLWdpdCBhL0RvYy9NYWtlZmlsZSBiL0RvYy9NYWtlZmlsZQppbmRleCBhNDJlOThiLi4wM2EzN2YxIDEwMDY0NAotLS0gYS9Eb2MvTWFrZWZpbGUKKysrIGIvRG9jL01ha2VmaWxlCkBAIC0xNTMsNyArMTUzLDcgQEAKIAljcCAtcFBSIGJ1aWxkL2VwdWIvUHl0aG9uLmVwdWIgZGlzdC9weXRob24tJChESVNUVkVSU0lPTiktZG9jcy5lcHViCiAKIGNoZWNrOgotCSQoUFlUSE9OKSB0b29scy9yc3RsaW50LnB5IC1pIHRvb2xzCisJJChQWVRIT04pIHRvb2xzL3JzdGxpbnQucHkgLWkgdG9vbHMgLWkgdmVudgogCiBzZXJ2ZToKIAkuLi9Ub29scy9zY3JpcHRzL3NlcnZlLnB5IGJ1aWxkL2h0bWwKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9hcmcucnN0IGIvRG9jL2MtYXBpL2FyZy5yc3QKaW5kZXggOTgzZDExMy4uZDlmMGY0MyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2FyZy5yc3QKKysrIGIvRG9jL2MtYXBpL2FyZy5yc3QKQEAgLTIwNiw4ICsyMDYsNyBAQAogICAgOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZWAgd2lsbCB1c2UgdGhpcyBsb2NhdGlvbiBhcyB0aGUgYnVmZmVyIGFuZCBpbnRlcnByZXQgdGhlCiAgICBpbml0aWFsIHZhbHVlIG9mICpcKmJ1ZmZlcl9sZW5ndGgqIGFzIHRoZSBidWZmZXIgc2l6ZS4gIEl0IHdpbGwgdGhlbiBjb3B5IHRoZQogICAgZW5jb2RlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBhbmQgTlVMLXRlcm1pbmF0ZSBpdC4gIElmIHRoZSBidWZmZXIgaXMgbm90IGxhcmdlCi0gICBlbm91Z2gsIGEgOmV4YzpgVHlwZUVycm9yYCB3aWxsIGJlIHNldC4KLSAgIE5vdGU6IHN0YXJ0aW5nIGZyb20gUHl0aG9uIDMuNiBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgc2V0LgorICAgZW5vdWdoLCBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgc2V0LgogCiAgICBJbiBib3RoIGNhc2VzLCAqXCpidWZmZXJfbGVuZ3RoKiBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBkYXRhCiAgICB3aXRob3V0IHRoZSB0cmFpbGluZyBOVUwgYnl0ZS4KZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdCBiL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdAppbmRleCAxOWNiYjNiLi4yMjZiNjE5IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKKysrIGIvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CkBAIC0zMzQsNiArMzM0LDE0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAogCisuLiBjOmZ1bmN0aW9uOjogaW50IFB5RXJyX1Jlc291cmNlV2FybmluZyhQeU9iamVjdCAqc291cmNlLCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKworICAgRnVuY3Rpb24gc2ltaWxhciB0byA6YzpmdW5jOmBQeUVycl9XYXJuRm9ybWF0YCwgYnV0ICpjYXRlZ29yeSogaXMKKyAgIDpleGM6YFJlc291cmNlV2FybmluZ2AgYW5kIHBhc3MgKnNvdXJjZSogdG8gOmZ1bmM6YHdhcm5pbmdzLldhcm5pbmdNZXNzYWdlYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogUXVlcnlpbmcgdGhlIGVycm9yIGluZGljYXRvcgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW5pdC5yc3QgYi9Eb2MvYy1hcGkvaW5pdC5yc3QKaW5kZXggODE4MjNiZi4uNDY1MTQ3YyAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2luaXQucnN0CisrKyBiL0RvYy9jLWFwaS9pbml0LnJzdApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgdHJpcGxlOiBtb2R1bGU7IHNlYXJjaDsgcGF0aAogICAgICAgc2luZ2xlOiBQeVN5c19TZXRBcmd2KCkKICAgICAgIHNpbmdsZTogUHlTeXNfU2V0QXJndkV4KCkKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKIAogICAgSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgSW4gYW4gYXBwbGljYXRpb24gZW1iZWRkaW5nICBQeXRob24sIHRoaXMKICAgIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBvdGhlciBQeXRob24vQyBBUEkgZnVuY3Rpb25zOyB3aXRoIHRoZQpAQCAtMzQsNyArMzQsNyBAQAogICAgbW9kdWxlcyA6bW9kOmBidWlsdGluc2AsIDptb2Q6YF9fbWFpbl9fYCBhbmQgOm1vZDpgc3lzYC4gIEl0IGFsc28gaW5pdGlhbGl6ZXMKICAgIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKGBgc3lzLnBhdGhgYCkuIEl0IGRvZXMgbm90IHNldCBgYHN5cy5hcmd2YGA7IHVzZQogICAgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YCBmb3IgdGhhdC4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQgdGltZQotICAgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCisgICAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZTsgaXQgaXMgYQogICAgZmF0YWwgZXJyb3IgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgogCiAKQEAgLTQ4LDE5ICs0OCwyMCBAQAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9Jc0luaXRpYWxpemVkKCkKIAogICAgUmV0dXJuIHRydWUgKG5vbnplcm8pIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZCwgZmFsc2UKLSAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgaXMgY2FsbGVkLCB0aGlzIHJldHVybnMgZmFsc2UgdW50aWwKKyAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAogICAgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgaXMgY2FsbGVkIGFnYWluLgogCiAKLS4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0ZpbmFsaXplKCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfRmluYWxpemVFeCgpCiAKICAgIFVuZG8gYWxsIGluaXRpYWxpemF0aW9ucyBtYWRlIGJ5IDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFuZCBzdWJzZXF1ZW50IHVzZSBvZgogICAgUHl0aG9uL0MgQVBJIGZ1bmN0aW9ucywgYW5kIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgKHNlZQogICAgOmM6ZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgIGJlbG93KSB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgbm90IHlldCBkZXN0cm95ZWQgc2luY2UKICAgIHRoZSBsYXN0IGNhbGwgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBJZGVhbGx5LCB0aGlzIGZyZWVzIGFsbCBtZW1vcnkKICAgIGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZAotICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybgotICAgdmFsdWU7IGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uIGFyZSBpZ25vcmVkLgorICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIE5vcm1hbGx5IHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIDAuICBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uCisgICAoZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSksIC0xIGlzIHJldHVybmVkLgogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBhIG51bWJlciBvZiByZWFzb25zLiAgQW4gZW1iZWRkaW5nIGFwcGxpY2F0aW9uCiAgICBtaWdodCB3YW50IHRvIHJlc3RhcnQgUHl0aG9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4KQEAgLTc5LDcgKzgwLDE1IEBACiAgICBmcmVlZC4gIFNvbWUgbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24gbW9kdWxlcyBtYXkgbm90IGJlIGZyZWVkLiAgU29tZQogICAgZXh0ZW5zaW9ucyBtYXkgbm90IHdvcmsgcHJvcGVybHkgaWYgdGhlaXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSBpcyBjYWxsZWQgbW9yZQogICAgdGhhbiBvbmNlOyB0aGlzIGNhbiBoYXBwZW4gaWYgYW4gYXBwbGljYXRpb24gY2FsbHMgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgbW9yZSB0aGFuIG9uY2UuCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBtb3JlIHRoYW4gb25jZS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRmluYWxpemUoKQorCisgICBUaGlzIGlzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCB0aGF0CisgICBkaXNyZWdhcmRzIHRoZSByZXR1cm4gdmFsdWUuCiAKIAogUHJvY2Vzcy13aWRlIHBhcmFtZXRlcnMKQEAgLTEwNyw3ICsxMTYsNyBAQAogICAgTm90ZSB0aGF0IDpkYXRhOmBzeXMuc3RkZXJyYCBhbHdheXMgdXNlcyB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yCiAgICBoYW5kbGVyLCByZWdhcmRsZXNzIG9mIHRoaXMgKG9yIGFueSBvdGhlcikgc2V0dGluZy4KIAotICAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGlzIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkCisgICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGNhbGxlZAogICAgYWdhaW4gaW4gb3JkZXIgdG8gYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuCiAKICAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBhIG5vbnplcm8gdmFsdWUgb24gZXJyb3IgKGUuZy4gY2FsbGluZyBhZnRlciB0aGUKQEAgLTkxOCw3ICs5MjcsNyBAQAogICAgZW50cnkuKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IFB5X0luaXRpYWxpemUoKQogCiAgICBFeHRlbnNpb24gbW9kdWxlcyBhcmUgc2hhcmVkIGJldHdlZW4gKHN1Yi0paW50ZXJwcmV0ZXJzIGFzIGZvbGxvd3M6IHRoZSBmaXJzdApAQCAtOTI4LDcgKzkzNyw3IEBACiAgICBhbmQgZmlsbGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMgY29weTsgdGhlIGV4dGVuc2lvbidzIGBgaW5pdGBgIGZ1bmN0aW9uIGlzCiAgICBub3QgY2FsbGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBoYXBwZW5zIHdoZW4gYW4gZXh0ZW5zaW9uIGlzCiAgICBpbXBvcnRlZCBhZnRlciB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncworICAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncwogICAgYGBpbml0bW9kdWxlYGAgZnVuY3Rpb24gKmlzKiBjYWxsZWQgYWdhaW4uCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBjbG9zZSgpIChpbiBtb2R1bGUgb3MpCkBAIC05MzYsMTQgKzk0NSwxNCBAQAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKLSAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAuLiBpbmRleDo6IHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAKICAgIERlc3Ryb3kgdGhlIChzdWItKWludGVycHJldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB0aHJlYWQgc3RhdGUuIFRoZSBnaXZlbgogICAgdGhyZWFkIHN0YXRlIG11c3QgYmUgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHRocmVhZAogICAgc3RhdGVzIGJlbG93LiAgV2hlbiB0aGUgY2FsbCByZXR1cm5zLCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgKk5VTEwqLiAgQWxsCiAgICB0aHJlYWQgc3RhdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVycHJldGVyIGFyZSBkZXN0cm95ZWQuICAoVGhlIGdsb2JhbAogICAgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgaXMgc3RpbGwgaGVsZAotICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCB3aWxsIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgdGhhdAorICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CiAgICBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkZXN0cm95ZWQgYXQgdGhhdCBwb2ludC4KIAogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW50cm8ucnN0IGIvRG9jL2MtYXBpL2ludHJvLnJzdAppbmRleCBiYzNhNzUyLi43NDY4MWQyIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW50cm8ucnN0CisrKyBiL0RvYy9jLWFwaS9pbnRyby5yc3QKQEAgLTY0LDkgKzY0LDEwIEBACiBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcmllcyA6ZmlsZTpge3ByZWZpeH0vaW5jbHVkZS9weXRob252ZXJzaW9uL2AgYW5kCiA6ZmlsZTpge2V4ZWNfcHJlZml4fS9pbmNsdWRlL3B5dGhvbnZlcnNpb24vYCwgd2hlcmUgOmVudnZhcjpgcHJlZml4YCBhbmQKIDplbnZ2YXI6YGV4ZWNfcHJlZml4YCBhcmUgZGVmaW5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzIHRvIFB5dGhvbidzCi06cHJvZ3JhbTpgY29uZmlndXJlYCBzY3JpcHQgYW5kICp2ZXJzaW9uKiBpcyBgYHN5cy52ZXJzaW9uWzozXWBgLiAgT24gV2luZG93cywKLXRoZSBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgaW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzCi10aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KKzpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBhbmQgKnZlcnNpb24qIGlzCitgYCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXWBgLiAgT24gV2luZG93cywgdGhlIGhlYWRlcnMgYXJlIGluc3RhbGxlZAoraW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzIHRoZSBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KIAogVG8gaW5jbHVkZSB0aGUgaGVhZGVycywgcGxhY2UgYm90aCBkaXJlY3RvcmllcyAoaWYgZGlmZmVyZW50KSBvbiB5b3VyIGNvbXBpbGVyJ3MKIHNlYXJjaCBwYXRoIGZvciBpbmNsdWRlcy4gIERvICpub3QqIHBsYWNlIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgb24gdGhlIHNlYXJjaApAQCAtNTc4LDkgKzU3OSw5IEBACiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0bwogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWApIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAgdXNlIG9mCiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBQeXRob24uICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLWJ5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0lzSW5pdGlhbGl6ZWRgIHJldHVybnMKK2J5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucwogdHJ1ZSBpZiBQeXRob24gaXMgY3VycmVudGx5IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZS4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYAordGhlc2UgZnVuY3Rpb25zIGlzIGdpdmVuIGluIGEgbGF0ZXIgY2hhcHRlci4gTm90aWNlIHRoYXQgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKIGRvZXMgKm5vdCogZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLCBlLmcuIG1lbW9yeQogYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIGN1cnJlbnRseSBjYW5ub3QgYmUgcmVsZWFzZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tZW1vcnkucnN0IGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKaW5kZXggMjkwZWYwOS4uYmQwYmMxMiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL21lbW9yeS5yc3QKKysrIGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKQEAgLTg1LDkgKzg1LDEyIEBACiAKIC4uIHNlZWFsc286OgogCisgICBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUKKyAgIHRoZSBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbi4KKwogICAgVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBwcmludAotICAgbWVtb3J5IGFsbG9jYXRpb24gc3RhdGlzdGljcyBldmVyeSB0aW1lIGEgbmV3IG9iamVjdCBhcmVuYSBpcyBjcmVhdGVkLCBhbmQKLSAgIG9uIHNodXRkb3duLgorICAgc3RhdGlzdGljcyBvZiB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YCBldmVyeSB0aW1lIGEKKyAgIG5ldyBweW1hbGxvYyBvYmplY3QgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgogCiAKIFJhdyBNZW1vcnkgSW50ZXJmYWNlCkBAIC0zMzgsMzAgKzM0MSw1NCBAQAogICAgTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYCwgZnJlZWQgbWVtb3J5IGlzCiAgICBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYC4gQWRkaXRpb25hbCBjaGVja3M6CiAKLSAgIC0gZGV0ZWN0IEFQSSB2aW9sYXRpb25zLCBleDogOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgYnVmZmVyCisgICAtIERldGVjdCBBUEkgdmlvbGF0aW9ucywgZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgIGNhbGxlZCBvbiBhIGJ1ZmZlcgogICAgICBhbGxvY2F0ZWQgYnkgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYAotICAgLSBkZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQotICAgLSBkZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKGJ1ZmZlciB1bmRlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKGJ1ZmZlciBvdmVyZmxvdykKKyAgIC0gQ2hlY2sgdGhhdCB0aGUgOnRlcm06YEdJTCA8Z2xvYmFsIGludGVycHJldGVyIGxvY2s+YCBpcyBoZWxkIHdoZW4KKyAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGFuZCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2ApIGRvbWFpbnMgYXJlIGNhbGxlZAogCi0gICBUaGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIFB5dGhvbiBpcyBub3QgY29tcGlsZWQgaXMgZGVidWcgbW9kZS4KKyAgIE9uIGVycm9yLCB0aGUgZGVidWcgaG9va3MgdXNlIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlIHRvIGdldCB0aGUKKyAgIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgdHJhY2ViYWNrIGlzIG9ubHkKKyAgIGRpc3BsYXllZCBpZiA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgdHJhY2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zIGFuZCB0aGUKKyAgIG1lbW9yeSBibG9jayB3YXMgdHJhY2VkLgorCisgICBUaGVzZSBob29rcyBhcmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIGluIGRlYnVnCisgICBtb2RlLiBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsCisgICBkZWJ1ZyBob29rcyBvbiBhIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGlzIGZ1bmN0aW9uIG5vdyBhbHNvIHdvcmtzIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisgICAgICBPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIG5vdyB1c2UgOm1vZDpgdHJhY2VtYWxsb2NgIHRvIGdldCB0aGUgdHJhY2ViYWNrCisgICAgICB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgZGVidWcgaG9va3Mgbm93IGFsc28gY2hlY2sKKyAgICAgIGlmIHRoZSBHSUwgaXMgaGVsZCB3aGVuIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCBhbmQKKyAgICAgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIGRvbWFpbnMgYXJlIGNhbGxlZC4KIAogCi1DdXN0b21pemUgUHlPYmplY3QgQXJlbmEgQWxsb2NhdG9yCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisuLiBfcHltYWxsb2M6CiAKLVB5dGhvbiBoYXMgYSAqcHltYWxsb2MqIGFsbG9jYXRvciBmb3IgYWxsb2NhdGlvbnMgc21hbGxlciB0aGFuIDUxMiBieXRlcy4gVGhpcwotYWxsb2NhdG9yIGlzIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5Ci1tYXBwaW5ncyBjYWxsZWQgImFyZW5hcyIgd2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvCi06YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgIGFuZCA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyCi10aGFuIDUxMiBieXRlcy4gICpweW1hbGxvYyogaXMgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIHVzZWQgYnkKLTpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AuCitUaGUgcHltYWxsb2MgYWxsb2NhdG9yCis9PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBkZWZhdWx0IGFyZW5hIGFsbG9jYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorUHl0aG9uIGhhcyBhICpweW1hbGxvYyogYWxsb2NhdG9yIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyAoc21hbGxlciBvciBlcXVhbAordG8gNTEyIGJ5dGVzKSB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5IG1hcHBpbmdzIGNhbGxlZCAiYXJlbmFzIgord2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AgYW5kCis6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gNTEyIGJ5dGVzLgorCisqcHltYWxsb2MqIGlzIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBvZiB0aGUgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgZG9tYWluCisoZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApLgorCitUaGUgYXJlbmEgYWxsb2NhdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKICogOmM6ZnVuYzpgVmlydHVhbEFsbG9jYCBhbmQgOmM6ZnVuYzpgVmlydHVhbEZyZWVgIG9uIFdpbmRvd3MsCiAqIDpjOmZ1bmM6YG1tYXBgIGFuZCA6YzpmdW5jOmBtdW5tYXBgIGlmIGF2YWlsYWJsZSwKICogOmM6ZnVuYzpgbWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWAgb3RoZXJ3aXNlLgogCitDdXN0b21pemUgcHltYWxsb2MgQXJlbmEgQWxsb2NhdG9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAuLiBjOnR5cGU6OiBQeU9iamVjdEFyZW5hQWxsb2NhdG9yCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvc3lzLnJzdCBiL0RvYy9jLWFwaS9zeXMucnN0CmluZGV4IDNkODNiMjcuLjliYTY0OTYgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9zeXMucnN0CisrKyBiL0RvYy9jLWFwaS9zeXMucnN0CkBAIC0yMTIsMjAgKzIxMiwyNCBAQAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRXhpdChpbnQgc3RhdHVzKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IGV4aXQoKQogCi0gICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBhbmQgdGhlbiBjYWxscyB0aGUKLSAgIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBgYGV4aXQoc3RhdHVzKWBgLgorICAgRXhpdCB0aGUgY3VycmVudCBwcm9jZXNzLiAgVGhpcyBjYWxscyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBhbmQgdGhlbiBjYWxscyB0aGUKKyAgIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbiBgYGV4aXQoc3RhdHVzKWBgLiAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKKyAgIGluZGljYXRlcyBhbiBlcnJvciwgdGhlIGV4aXQgc3RhdHVzIGlzIHNldCB0byAxMjAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBFcnJvcnMgZnJvbSBmaW5hbGl6YXRpb24gbm8gbG9uZ2VyIGlnbm9yZWQuCiAKIAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9BdEV4aXQodm9pZCAoKmZ1bmMpICgpKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IGNsZWFudXAgZnVuY3Rpb25zCiAKLSAgIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGNsZWFudXAKKyAgIFJlZ2lzdGVyIGEgY2xlYW51cCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgY2xlYW51cAogICAgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgYW5kIHNob3VsZCByZXR1cm4gbm8gdmFsdWUuICBBdCBtb3N0CiAgICAzMiBjbGVhbnVwIGZ1bmN0aW9ucyBjYW4gYmUgcmVnaXN0ZXJlZC4gIFdoZW4gdGhlIHJlZ2lzdHJhdGlvbiBpcyBzdWNjZXNzZnVsLAogICAgOmM6ZnVuYzpgUHlfQXRFeGl0YCByZXR1cm5zIGBgMGBgOyBvbiBmYWlsdXJlLCBpdCByZXR1cm5zIGBgLTFgYC4gIFRoZSBjbGVhbnVwCmRpZmYgLS1naXQgYS9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QgYi9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKaW5kZXggYWNkNjBhZS4uMTU0NmIxYSAxMDA2NDQKLS0tIGEvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CisrKyBiL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdApAQCAtNjcsNyArNjcsOSBAQAogICAgICAgIFB5X0luaXRpYWxpemUoKTsKICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImZyb20gdGltZSBpbXBvcnQgdGltZSxjdGltZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbnQoJ1RvZGF5IGlzJywgY3RpbWUodGltZSgpKSlcbiIpOwotICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgICAgZXhpdCgxMjApOworICAgICAgIH0KICAgICAgICBQeU1lbV9SYXdGcmVlKHByb2dyYW0pOwogICAgICAgIHJldHVybiAwOwogICAgfQpAQCAtNzYsNyArNzgsNyBAQAogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgdG8gaW5mb3JtIHRoZSBpbnRlcnByZXRlciBhYm91dCBwYXRocyB0byBQeXRob24gcnVuLXRpbWUKIGxpYnJhcmllcy4gIE5leHQsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aAogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAsIGZvbGxvd2VkIGJ5IHRoZSBleGVjdXRpb24gb2YgYSBoYXJkLWNvZGVkIFB5dGhvbiBzY3JpcHQKLXRoYXQgcHJpbnRzIHRoZSBkYXRlIGFuZCB0aW1lLiAgQWZ0ZXJ3YXJkcywgdGhlIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBjYWxsIHNodXRzCit0aGF0IHByaW50cyB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBjYWxsIHNodXRzCiB0aGUgaW50ZXJwcmV0ZXIgZG93biwgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4gIEluIGEgcmVhbCBwcm9ncmFtLAogeW91IG1heSB3YW50IHRvIGdldCB0aGUgUHl0aG9uIHNjcmlwdCBmcm9tIGFub3RoZXIgc291cmNlLCBwZXJoYXBzIGEgdGV4dC1lZGl0b3IKIHJvdXRpbmUsIGEgZmlsZSwgb3IgYSBkYXRhYmFzZS4gIEdldHRpbmcgdGhlIFB5dGhvbiBjb2RlIGZyb20gYSBmaWxlIGNhbiBiZXR0ZXIKZGlmZiAtLWdpdCBhL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0IGIvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKaW5kZXggNzQ2ZWZjNi4uYWMzYmE0MiAxMDA2NDQKLS0tIGEvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKKysrIGIvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKQEAgLTgzOSw3ICs4MzksOCBAQAogVG8gY29udmVydCwgZS5nLiwgdGhlIG51bWJlciAxNDQgdG8gdGhlIHN0cmluZyAnMTQ0JywgdXNlIHRoZSBidWlsdC1pbiB0eXBlCiBjb25zdHJ1Y3RvciA6ZnVuYzpgc3RyYC4gIElmIHlvdSB3YW50IGEgaGV4YWRlY2ltYWwgb3Igb2N0YWwgcmVwcmVzZW50YXRpb24sIHVzZQogdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyA6ZnVuYzpgaGV4YCBvciA6ZnVuYzpgb2N0YC4gIEZvciBmYW5jeSBmb3JtYXR0aW5nLCBzZWUKLXRoZSA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9uLCBlLmcuIGBgIns6MDRkfSIuZm9ybWF0KDE0NClgYCB5aWVsZHMKK3RoZSA6cmVmOmBmLXN0cmluZ3NgIGFuZCA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9ucywKK2UuZy4gYGAiezowNGR9Ii5mb3JtYXQoMTQ0KWBgIHlpZWxkcwogYGAnMDE0NCdgYCBhbmQgYGAiezouM2Z9Ii5mb3JtYXQoMS4wLzMuMClgYCB5aWVsZHMgYGAnMC4zMzMnYGAuCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdCBiL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKaW5kZXggY2ZlOTg2OC4uN2E2MDE2NSAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdAorKysgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CkBAIC01NDcsNyArNTQ3LDggQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAicHJvZy5weSIsIGxpbmUgMTEsIGluIDxtb2R1bGU+CiAgICAgICAgaWYgYXJncy52ZXJib3NpdHkgPj0gMjoKLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IE5vbmVUeXBlKCkgPj0gaW50KCkKKyAgIFR5cGVFcnJvcjogJz49JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdOb25lVHlwZScgYW5kICdpbnQnCisKIAogKiBGaXJzdCBvdXRwdXQgd2VudCB3ZWxsLCBhbmQgZml4ZXMgdGhlIGJ1ZyB3ZSBoYWQgYmVmb3JlLgogICBUaGF0IGlzLCB3ZSB3YW50IGFueSB2YWx1ZSA+PSAyIHRvIGJlIGFzIHZlcmJvc2UgYXMgcG9zc2libGUuCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCmluZGV4IDk4NmQ2NzAuLmVhZDdiZGQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCisrKyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCkBAIC02Myw2ICs2Myw4IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgXCIlc1wiXG4iLCBhcmd2WzFdKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDEyMDsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvdGVzdC5weSBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CmluZGV4IDdlYmY0NmEuLjllOWQ0YTYgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy90ZXN0LnB5CisrKyBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CkBAIC0yMDQsNyArMjA0LDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCi1QTEFUX1NQRUMgPSAiJXMtJXMiICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvblswOjNdKQorUExBVF9TUEVDID0gIiVzLSVkLiVkIiAlIChnZXRfcGxhdGZvcm0oKSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogc3JjID0gb3MucGF0aC5qb2luKCJidWlsZCIsICJsaWIuJXMiICUgUExBVF9TUEVDKQogc3lzLnBhdGguYXBwZW5kKHNyYykKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0IGIvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CmluZGV4IGZmMmJkZGEuLjYzMmVjZjcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdAorKysgYi9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKQEAgLTUyLDEzICs1MiwxNCBAQAogICAgdGhhbiBvbmUgbGluZSBtYXkgYmUgcGFzc2VkIGF0IGEgdGltZS4KIAogCi0uLiBmdW5jdGlvbjo6IGIyYV9iYXNlNjQoZGF0YSkKKy4uIGZ1bmN0aW9uOjogYjJhX2Jhc2U2NChkYXRhLCBcKiwgbmV3bGluZT1UcnVlKQogCiAgICBDb252ZXJ0IGJpbmFyeSBkYXRhIHRvIGEgbGluZSBvZiBBU0NJSSBjaGFyYWN0ZXJzIGluIGJhc2U2NCBjb2RpbmcuIFRoZSByZXR1cm4KLSAgIHZhbHVlIGlzIHRoZSBjb252ZXJ0ZWQgbGluZSwgaW5jbHVkaW5nIGEgbmV3bGluZSBjaGFyLiAgVGhlIG5ld2xpbmUgaXMKLSAgIGFkZGVkIGJlY2F1c2UgdGhlIG9yaWdpbmFsIHVzZSBjYXNlIGZvciB0aGlzIGZ1bmN0aW9uIHdhcyB0byBmZWVkIGl0IGEKLSAgIHNlcmllcyBvZiA1NyBieXRlIGlucHV0IGxpbmVzIHRvIGdldCBvdXRwdXQgbGluZXMgdGhhdCBjb25mb3JtIHRvIHRoZQotICAgTUlNRS1iYXNlNjQgc3RhbmRhcmQuICBPdGhlcndpc2UgdGhlIG91dHB1dCBjb25mb3JtcyB0byA6cmZjOmAzNTQ4YC4KKyAgIHZhbHVlIGlzIHRoZSBjb252ZXJ0ZWQgbGluZSwgaW5jbHVkaW5nIGEgbmV3bGluZSBjaGFyIGlmICpuZXdsaW5lKiBpcworICAgdHJ1ZS4gIFRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiBjb25mb3JtcyB0byA6cmZjOmAzNTQ4YC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSAqbmV3bGluZSogcGFyYW1ldGVyLgogCiAKIC4uIGZ1bmN0aW9uOjogYTJiX3FwKGRhdGEsIGhlYWRlcj1GYWxzZSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0CmluZGV4IGQ5YjkzYWQuLjYwODY0MWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdApAQCAtNDAsMTIgKzQwLDEzIEBACiA6Y2xhc3M6YEhhc2hhYmxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19oYXNoX19gYAogOmNsYXNzOmBJdGVyYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faXRlcl9fYGAKIDpjbGFzczpgSXRlcmF0b3JgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgICAgICAgYGBfX25leHRfX2BgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgCis6Y2xhc3M6YFJldmVyc2libGVgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCAgICAgIGBgX19yZXZlcnNlZF9fYGAKIDpjbGFzczpgR2VuZXJhdG9yYCAgICAgICAgIDpjbGFzczpgSXRlcmF0b3JgICAgICAgYGBzZW5kYGAsIGBgdGhyb3dgYCAgICAgYGBjbG9zZWBgLCBgYF9faXRlcl9fYGAsIGBgX19uZXh0X19gYAogOmNsYXNzOmBTaXplZGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fbGVuX19gYAogOmNsYXNzOmBDYWxsYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9fY2FsbF9fYGAKIAogOmNsYXNzOmBTZXF1ZW5jZWAgICAgICAgICAgOmNsYXNzOmBTaXplZGAsICAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBgYF9fY29udGFpbnNfX2BgLCBgYF9faXRlcl9fYGAsIGBgX19yZXZlcnNlZF9fYGAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCwgICAgIGBgX19sZW5fX2BgICAgICAgICAgICAgIGBgaW5kZXhgYCwgYW5kIGBgY291bnRgYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBSZXZlcnNpYmxlYCwgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYGluZGV4YGAsIGFuZCBgYGNvdW50YGAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgQ29udGFpbmVyYAogCiA6Y2xhc3M6YE11dGFibGVTZXF1ZW5jZWAgICA6Y2xhc3M6YFNlcXVlbmNlYCAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIEluaGVyaXRlZCA6Y2xhc3M6YFNlcXVlbmNlYCBtZXRob2RzIGFuZApAQCAtMTA3LDYgKzEwOCwxMCBAQAogICAgOm1ldGg6YH5pdGVyYXRvci5fX25leHRfX2AgbWV0aG9kcy4gIFNlZSBhbHNvIHRoZSBkZWZpbml0aW9uIG9mCiAgICA6dGVybTpgaXRlcmF0b3JgLgogCisuLiBjbGFzczo6IFJldmVyc2libGUKKworICAgQUJDIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSB0aGUgOm1ldGg6YF9fcmV2ZXJzZWRfX2AgbWV0aG9kLgorCiAuLiBjbGFzczo6IEdlbmVyYXRvcgogCiAgICBBQkMgZm9yIGdlbmVyYXRvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm90b2NvbCBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKaW5kZXggODU4YTU2Ni4uNzI4Y2Q0OCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdApAQCAtOTU4LDYgKzk1OCw5IEBACiAgICAgICBjb25zdHJ1Y3RvciB0aGF0IGlzIGNvbnZlbmllbnQgZm9yIHVzZSBjYXNlcyB3aGVyZSBuYW1lZCB0dXBsZXMgYXJlIGJlaW5nCiAgICAgICBzdWJjbGFzc2VkLgogCisgICAgKiA6bWV0aDpgdHlwZXMuU2ltcGxlTmFtZXNwYWNlYCBmb3IgYSBtdXRhYmxlIG5hbWVzcGFjZSBiYXNlZCBvbiBhbiB1bmRlcmx5aW5nCisgICAgICBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgYSB0dXBsZS4KKwogCiA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdCBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CmluZGV4IGM1NzM2ZjIuLjY3OWMyYjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CkBAIC0xMDMsNyArMTAzLDggQEAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9kaXIoZGlyLCBtYXhsZXZlbHM9MTAsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsIGxlZ2FjeT1GYWxzZSwgb3B0aW1pemU9LTEsIHdvcmtlcnM9MSkKIAogICAgUmVjdXJzaXZlbHkgZGVzY2VuZCB0aGUgZGlyZWN0b3J5IHRyZWUgbmFtZWQgYnkgKmRpciosIGNvbXBpbGluZyBhbGwgOmZpbGU6YC5weWAKLSAgIGZpbGVzIGFsb25nIHRoZSB3YXkuCisgICBmaWxlcyBhbG9uZyB0aGUgd2F5LiBSZXR1cm4gYSB0cnVlIHZhbHVlIGlmIGFsbCB0aGUgZmlsZXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LAorICAgYW5kIGEgZmFsc2UgdmFsdWUgb3RoZXJ3aXNlLgogCiAgICBUaGUgKm1heGxldmVscyogcGFyYW1ldGVyIGlzIHVzZWQgdG8gbGltaXQgdGhlIGRlcHRoIG9mIHRoZSByZWN1cnNpb247IGl0CiAgICBkZWZhdWx0cyB0byBgYDEwYGAuCkBAIC0xNTUsNyArMTU2LDggQEAKIAogLi4gZnVuY3Rpb246OiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsIGxlZ2FjeT1GYWxzZSwgb3B0aW1pemU9LTEpCiAKLSAgIENvbXBpbGUgdGhlIGZpbGUgd2l0aCBwYXRoICpmdWxsbmFtZSouCisgICBDb21waWxlIHRoZSBmaWxlIHdpdGggcGF0aCAqZnVsbG5hbWUqLiBSZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBmaWxlCisgICBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KIAogICAgSWYgKmRkaXIqIGlzIGdpdmVuLCBpdCBpcyBwcmVwZW5kZWQgdG8gdGhlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgY29tcGlsZWQKICAgIGZvciB1c2UgaW4gY29tcGlsYXRpb24gdGltZSB0cmFjZWJhY2tzLCBhbmQgaXMgYWxzbyBjb21waWxlZCBpbiB0byB0aGUKQEAgLTE5MSw4ICsxOTMsMTAgQEAKIAogLi4gZnVuY3Rpb246OiBjb21waWxlX3BhdGgoc2tpcF9jdXJkaXI9VHJ1ZSwgbWF4bGV2ZWxzPTAsIGZvcmNlPUZhbHNlLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xKQogCi0gICBCeXRlLWNvbXBpbGUgYWxsIHRoZSA6ZmlsZTpgLnB5YCBmaWxlcyBmb3VuZCBhbG9uZyBgYHN5cy5wYXRoYGAuIElmCi0gICAqc2tpcF9jdXJkaXIqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCBpbmNsdWRlZAorICAgQnl0ZS1jb21waWxlIGFsbCB0aGUgOmZpbGU6YC5weWAgZmlsZXMgZm91bmQgYWxvbmcgYGBzeXMucGF0aGBgLiBSZXR1cm4gYQorICAgdHJ1ZSB2YWx1ZSBpZiBhbGwgdGhlIGZpbGVzIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwgYW5kIGEgZmFsc2UgdmFsdWUgb3RoZXJ3aXNlLgorCisgICBJZiAqc2tpcF9jdXJkaXIqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCBpbmNsdWRlZAogICAgaW4gdGhlIHNlYXJjaC4gIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIDpmdW5jOmBjb21waWxlX2RpcmAKICAgIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHVubGlrZSB0aGUgb3RoZXIgY29tcGlsZSBmdW5jdGlvbnMsIGBgbWF4bGV2ZWxzYGAKICAgIGRlZmF1bHRzIHRvIGBgMGBgLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdAppbmRleCBjMTEyMjQxLi43ODc2ZTdhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdApAQCAtMTgsNiArMTgsMTggQEAKIAogRnVuY3Rpb25zIGFuZCBjbGFzc2VzIHByb3ZpZGVkOgogCisuLiBjbGFzczo6IEFic3RyYWN0Q29udGV4dE1hbmFnZXIKKworICAgQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudAorICAgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGFuZCA6bWV0aDpgb2JqZWN0Ll9fZXhpdF9fYC4gQSBkZWZhdWx0CisgICBpbXBsZW1lbnRhdGlvbiBmb3IgOm1ldGg6YG9iamVjdC5fX2VudGVyX19gIGlzIHByb3ZpZGVkIHdoaWNoIHJldHVybnMKKyAgIGBgc2VsZmBgIHdoaWxlIDptZXRoOmBvYmplY3QuX19leGl0X19gIGlzIGFuIGFic3RyYWN0IG1ldGhvZCB3aGljaCBieSBkZWZhdWx0CisgICByZXR1cm5zIGBgTm9uZWBgLiBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZiA6cmVmOmB0eXBlY29udGV4dG1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisKIC4uIGRlY29yYXRvcjo6IGNvbnRleHRtYW5hZ2VyCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgYSA6dGVybTpgZGVjb3JhdG9yYCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhIGZhY3RvcnkKQEAgLTQ0Nyw5ICs0NTksOSBAQAogYWNxdWlzaXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zLCBhbG9uZyB3aXRoIGFuIG9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24sCiBhbmQgbWFwcyB0aGVtIHRvIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2w6OgogCi0gICBmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyLCBFeGl0U3RhY2sKKyAgIGZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIsIEV4aXRTdGFjawogCi0gICBjbGFzcyBSZXNvdXJjZU1hbmFnZXI6CisgICBjbGFzcyBSZXNvdXJjZU1hbmFnZXIoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWNxdWlyZV9yZXNvdXJjZSwgcmVsZWFzZV9yZXNvdXJjZSwgY2hlY2tfcmVzb3VyY2Vfb2s9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuYWNxdWlyZV9yZXNvdXJjZSA9IGFjcXVpcmVfcmVzb3VyY2UKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NyeXB0LnJzdCBiL0RvYy9saWJyYXJ5L2NyeXB0LnJzdAppbmRleCBiNGM5MGNkLi4wNGZmZGIyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY3J5cHQucnN0CkBAIC02NCw3ICs2NCw3IEBACiAKICAgIEEgbGlzdCBvZiBhdmFpbGFibGUgcGFzc3dvcmQgaGFzaGluZyBhbGdvcml0aG1zLCBhcwogICAgYGBjcnlwdC5NRVRIT0RfKmBgIG9iamVjdHMuICBUaGlzIGxpc3QgaXMgc29ydGVkIGZyb20gc3Ryb25nZXN0IHRvCi0gICB3ZWFrZXN0LCBhbmQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGF0IGxlYXN0IGBgY3J5cHQuTUVUSE9EX0NSWVBUYGAuCisgICB3ZWFrZXN0LgogCiAKIE1vZHVsZSBGdW5jdGlvbnMKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QgYi9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0CmluZGV4IDFlZGRmZGMuLmFlNDU1NDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdApAQCAtMTYsMyArMTYsNCBAQAogCiAgICBoYXNobGliLnJzdAogICAgaG1hYy5yc3QKKyAgIHNlY3JldHMucnN0CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKaW5kZXggMzU1M2Q0OS4uOWU2YjY2YSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdApAQCAtNjA3LDcgKzYwNyw4IEBACiAuLiBtZXRob2Q6OiBkYXRlLl9fZm9ybWF0X18oZm9ybWF0KQogCiAgICBTYW1lIGFzIDptZXRoOmAuZGF0ZS5zdHJmdGltZWAuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGVgIG9iamVjdCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKKyAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRlYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtMTEzNSw3ICsxMTM2LDcgQEAKICAgIGBgc2VsZi5kYXRlKCkuaXNvY2FsZW5kYXIoKWBgLgogCiAKLS4uIG1ldGhvZDo6IGRhdGV0aW1lLmlzb2Zvcm1hdChzZXA9J1QnKQorLi4gbWV0aG9kOjogZGF0ZXRpbWUuaXNvZm9ybWF0KHNlcD0nVCcsIHRpbWVzcGVjPSdhdXRvJykKIAogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGF0ZSBhbmQgdGltZSBpbiBJU08gODYwMSBmb3JtYXQsCiAgICBZWVlZLU1NLUREVEhIOk1NOlNTLm1tbW1tbSBvciwgaWYgOmF0dHI6YG1pY3Jvc2Vjb25kYCBpcyAwLApAQCAtMTE1Niw2ICsxMTU3LDM3IEBACiAgICAgICA+Pj4gZGF0ZXRpbWUoMjAwMiwgMTIsIDI1LCB0emluZm89VFooKSkuaXNvZm9ybWF0KCcgJykKICAgICAgICcyMDAyLTEyLTI1IDAwOjAwOjAwLTA2OjM5JwogCisgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKnRpbWVzcGVjKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUgKHRoZSBkZWZhdWx0IGlzIGBgJ2F1dG8nYGApLgorICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAtIGBgJ2F1dG8nYGA6IFNhbWUgYXMgYGAnc2Vjb25kcydgYCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCisgICAgIHNhbWUgYXMgYGAnbWljcm9zZWNvbmRzJ2BgIG90aGVyd2lzZS4KKyAgIC0gYGAnaG91cnMnYGA6IEluY2x1ZGUgdGhlIDphdHRyOmBob3VyYCBpbiB0aGUgdHdvLWRpZ2l0IEhIIGZvcm1hdC4KKyAgIC0gYGAnbWludXRlcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAgYW5kIDphdHRyOmBtaW51dGVgIGluIEhIOk1NIGZvcm1hdC4KKyAgIC0gYGAnc2Vjb25kcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAsIDphdHRyOmBtaW51dGVgLCBhbmQgOmF0dHI6YHNlY29uZGAKKyAgICAgaW4gSEg6TU06U1MgZm9ybWF0LgorICAgLSBgYCdtaWxsaXNlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lLCBidXQgdHJ1bmNhdGUgZnJhY3Rpb25hbCBzZWNvbmQKKyAgICAgcGFydCB0byBtaWxsaXNlY29uZHMuIEhIOk1NOlNTLnNzcyBmb3JtYXQuCisgICAtIGBgJ21pY3Jvc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUgaW4gSEg6TU06U1MubW1tbW1tIGZvcm1hdC4KKworICAgLi4gbm90ZTo6CisKKyAgICAgIEV4Y2x1ZGVkIHRpbWUgY29tcG9uZW50cyBhcmUgdHJ1bmNhdGVkLCBub3Qgcm91bmRlZC4KKworICAgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSByYWlzZWQgb24gYW4gaW52YWxpZCAqdGltZXNwZWMqIGFyZ3VtZW50LgorCisKKyAgICAgID4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQorICAgICAgPj4+IGRhdGV0aW1lLm5vdygpLmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpCisgICAgICAnMjAwMi0xMi0yNVQwMDowMCcKKyAgICAgID4+PiBkdCA9IGRhdGV0aW1lKDIwMTUsIDEsIDEsIDEyLCAzMCwgNTksIDApCisgICAgICA+Pj4gZHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKQorICAgICAgJzIwMTUtMDEtMDFUMTI6MzA6NTkuMDAwMDAwJworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSAqdGltZXNwZWMqIGFyZ3VtZW50LgorCiAKIC4uIG1ldGhvZDo6IGRhdGV0aW1lLl9fc3RyX18oKQogCkBAIC0xMTgyLDcgKzEyMTQsOCBAQAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuX19mb3JtYXRfXyhmb3JtYXQpCiAKICAgIFNhbWUgYXMgOm1ldGg6YC5kYXRldGltZS5zdHJmdGltZWAuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBmb3JtYXQKLSAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKKyAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRldGltZWAgb2JqZWN0IGluIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcKKyAgIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCBhbmQgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQogICAgY29tcGxldGUgbGlzdCBvZiBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMsIHNlZQogICAgOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCkBAIC0xNDA0LDEzICsxNDM3LDQ2IEBACiAgICBhd2FyZSA6Y2xhc3M6YC50aW1lYCwgd2l0aG91dCBjb252ZXJzaW9uIG9mIHRoZSB0aW1lIGRhdGEuCiAKIAotLi4gbWV0aG9kOjogdGltZS5pc29mb3JtYXQoKQorLi4gbWV0aG9kOjogdGltZS5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1MubW1tbW1tIG9yLCBpZgotICAgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUyBJZiA6bWV0aDpgdXRjb2Zmc2V0YCBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIGEKKyAgIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwgSEg6TU06U1MgSWYgOm1ldGg6YHV0Y29mZnNldGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCBhCiAgICA2LWNoYXJhY3RlciBzdHJpbmcgaXMgYXBwZW5kZWQsIGdpdmluZyB0aGUgVVRDIG9mZnNldCBpbiAoc2lnbmVkKSBob3VycyBhbmQKICAgIG1pbnV0ZXM6IEhIOk1NOlNTLm1tbW1tbStISDpNTSBvciwgaWYgc2VsZi5taWNyb3NlY29uZCBpcyAwLCBISDpNTTpTUytISDpNTQogCisgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKnRpbWVzcGVjKiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUgKHRoZSBkZWZhdWx0IGlzIGBgJ2F1dG8nYGApLgorICAgSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAtIGBgJ2F1dG8nYGA6IFNhbWUgYXMgYGAnc2Vjb25kcydgYCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCisgICAgIHNhbWUgYXMgYGAnbWljcm9zZWNvbmRzJ2BgIG90aGVyd2lzZS4KKyAgIC0gYGAnaG91cnMnYGA6IEluY2x1ZGUgdGhlIDphdHRyOmBob3VyYCBpbiB0aGUgdHdvLWRpZ2l0IEhIIGZvcm1hdC4KKyAgIC0gYGAnbWludXRlcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAgYW5kIDphdHRyOmBtaW51dGVgIGluIEhIOk1NIGZvcm1hdC4KKyAgIC0gYGAnc2Vjb25kcydgYDogSW5jbHVkZSA6YXR0cjpgaG91cmAsIDphdHRyOmBtaW51dGVgLCBhbmQgOmF0dHI6YHNlY29uZGAKKyAgICAgaW4gSEg6TU06U1MgZm9ybWF0LgorICAgLSBgYCdtaWxsaXNlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lLCBidXQgdHJ1bmNhdGUgZnJhY3Rpb25hbCBzZWNvbmQKKyAgICAgcGFydCB0byBtaWxsaXNlY29uZHMuIEhIOk1NOlNTLnNzcyBmb3JtYXQuCisgICAtIGBgJ21pY3Jvc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUgaW4gSEg6TU06U1MubW1tbW1tIGZvcm1hdC4KKworICAgLi4gbm90ZTo6CisKKyAgICAgIEV4Y2x1ZGVkIHRpbWUgY29tcG9uZW50cyBhcmUgdHJ1bmNhdGVkLCBub3Qgcm91bmRlZC4KKworICAgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSByYWlzZWQgb24gYW4gaW52YWxpZCAqdGltZXNwZWMqIGFyZ3VtZW50LgorCisKKyAgICAgID4+PiBmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lCisgICAgICA+Pj4gdGltZShob3Vycz0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTEyMzQ1NikuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJykKKyAgICAgICcxMjozNCcKKyAgICAgID4+PiBkdCA9IHRpbWUoaG91cnM9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0wKQorICAgICAgPj4+IGR0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJykKKyAgICAgICcxMjozNDo1Ni4wMDAwMDAnCisgICAgICA+Pj4gZHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJykKKyAgICAgICcxMjozNDo1NicKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgKnRpbWVzcGVjKiBhcmd1bWVudC4KKwogCiAuLiBtZXRob2Q6OiB0aW1lLl9fc3RyX18oKQogCkBAIC0xNDI3LDcgKzE0OTMsOCBAQAogLi4gbWV0aG9kOjogdGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLnRpbWUuc3RyZnRpbWVgLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBmb3JtYXQgc3RyaW5nCi0gICBmb3IgYSA6Y2xhc3M6YC50aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQorICAgZm9yIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0IGluIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcKKyAgIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCBhbmQgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQogICAgY29tcGxldGUgbGlzdCBvZiBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMsIHNlZQogICAgOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCkBAIC0xNzM4LDEwICsxODA1LDcgQEAKICAgb3RoZXJ3aXNlIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KIAogICBUaGUgKm5hbWUqIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkIGl0IG11c3QgYmUgYSBzdHJpbmcgdGhhdAotICBpcyB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYGB0em5hbWUoZHQpYGAgbWV0aG9kLiAgT3RoZXJ3aXNlLAotICBgYHR6bmFtZShkdClgYCByZXR1cm5zIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKLSAgYGBvZmZzZXQubWludXRlc2BgIHJlc3BlY3RpdmVseS4KKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGRhdGV0aW1lLnR6bmFtZWAgbWV0aG9kLgogCiAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCkBAIC0xNzU0LDExICsxODE4LDE5IEBACiAKIC4uIG1ldGhvZDo6IHRpbWV6b25lLnR6bmFtZShkdCkKIAotICBSZXR1cm4gdGhlIGZpeGVkIHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YHRpbWV6b25lYCBpbnN0YW5jZSBpcwotICBjb25zdHJ1Y3RlZCBvciBhIHN0cmluZyAnVVRDc0hIOk1NJywgd2hlcmUgcyBpcyB0aGUgc2lnbiBvZgotICAqb2Zmc2V0KiwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCisgIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlCisgIGlzIGNvbnN0cnVjdGVkLiAgSWYgKm5hbWUqIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZQorICBuYW1lIHJldHVybmVkIGJ5IGBgdHpuYW1lKGR0KWBgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUKKyAgYGBvZmZzZXRgYCBhcyBmb2xsb3dzLiAgSWYgKm9mZnNldCogaXMgYGB0aW1lZGVsdGEoMClgYCwgdGhlIG5hbWUKKyAgaXMgIlVUQyIsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZyAnVVRDwrFISDpNTScsIHdoZXJlIMKxIGlzIHRoZSBzaWduCisgIG9mIGBgb2Zmc2V0YGAsIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAogICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgogCisgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgIE5hbWUgZ2VuZXJhdGVkIGZyb20gYGBvZmZzZXQ9dGltZWRlbHRhKDApYGAgaXMgbm93IHBsYWluICdVVEMnLCBub3QKKyAgICAgJ1VUQyswMDowMCcuCisKKwogLi4gbWV0aG9kOjogdGltZXpvbmUuZHN0KGR0KQogCiAgIEFsd2F5cyByZXR1cm5zIGBgTm9uZWBgLgpAQCAtMTkwOCw2ICsxOTgwLDM0IEBACiB8IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiAKK1NldmVyYWwgYWRkaXRpb25hbCBkaXJlY3RpdmVzIG5vdCByZXF1aXJlZCBieSB0aGUgQzg5IHN0YW5kYXJkIGFyZSBpbmNsdWRlZCBmb3IKK2NvbnZlbmllbmNlLiBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBjb3JyZXNwb25kIHRvIElTTyA4NjAxIGRhdGUgdmFsdWVzLiBUaGVzZQorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyB3aGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cmZ0aW1lYAorbWV0aG9kLiBUaGUgSVNPIDg2MDEgeWVhciBhbmQgSVNPIDg2MDEgd2VlayBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlCit3aXRoIHRoZSB5ZWFyIGFuZCB3ZWVrIG51bWJlciBkaXJlY3RpdmVzIGFib3ZlLiBDYWxsaW5nIDptZXRoOmBzdHJwdGltZWAgd2l0aAoraW5jb21wbGV0ZSBvciBhbWJpZ3VvdXMgSVNPIDg2MDEgZGlyZWN0aXZlcyB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuCisKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgRGlyZWN0aXZlIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICB8IE5vdGVzIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PSsKK3wgYGAlR2BgICAgIHwgSVNPIDg2MDEgeWVhciB3aXRoIGNlbnR1cnkgICAgIHwgMDAwMSwgMDAwMiwgLi4uLCAyMDEzLCB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgcmVwcmVzZW50aW5nIHRoZSB5ZWFyIHRoYXQgICAgIHwgMjAxNCwgLi4uLCA5OTk4LCA5OTk5ICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgY29udGFpbnMgdGhlIGdyZWF0ZXIgcGFydCBvZiAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIElTTyB3ZWVrIChgYCVWYGApLiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAldWBgICAgIHwgSVNPIDg2MDEgd2Vla2RheSBhcyBhIGRlY2ltYWwgIHwgMSwgMiwgLi4uLCA3ICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdoZXJlIDEgaXMgTW9uZGF5LiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAlVmBgICAgIHwgSVNPIDg2MDEgd2VlayBhcyBhIGRlY2ltYWwgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdpdGggTW9uZGF5IGFzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgV2VlayAwMSBpcyB0aGUgd2VlayBjb250YWluaW5nIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgSmFuIDQuICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgIHdlcmUgYWRkZWQuCisKIE5vdGVzOgogCiAoMSkKQEAgLTE5NzIsNyArMjA3MiwxNCBAQAogCiAoNykKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgYGAlVWBgIGFuZCBgYCVXYGAgYXJlIG9ubHkgdXNlZAotICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlIHNwZWNpZmllZC4KKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBjYWxlbmRhciB5ZWFyIChgYCVZYGApCisgICBhcmUgc3BlY2lmaWVkLgorCisoOCkKKyAgIFNpbWlsYXIgdG8gYGAlVWBgIGFuZCBgYCVXYGAsIGBgJVZgYCBpcyBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlCisgICBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBJU08geWVhciAoYGAlR2BgKSBhcmUgc3BlY2lmaWVkIGluIGEKKyAgIDptZXRoOmBzdHJwdGltZWAgZm9ybWF0IHN0cmluZy4gQWxzbyBub3RlIHRoYXQgYGAlR2BgIGFuZCBgYCVZYGAgYXJlIG5vdAorICAgaW50ZXJjaGFuZ2FibGUuCiAKIC4uIHJ1YnJpYzo6IEZvb3Rub3RlcwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kZWNpbWFsLnJzdCBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CmluZGV4IGQ0NmY4NTAuLjY3OTZmOGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CkBAIC00NDUsNiArNDQ1LDE5IEBACiAgICAgICBgYERlY2ltYWwoJzMyMWUrNScpLmFkanVzdGVkKClgYCByZXR1cm5zIHNldmVuLiAgVXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlCiAgICAgICBwb3NpdGlvbiBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCB3aXRoIHJlc3BlY3QgdG8gdGhlIGRlY2ltYWwgcG9pbnQuCiAKKyAgIC4uIG1ldGhvZDo6IGFzX2ludGVnZXJfcmF0aW8oKQorCisgICAgICBSZXR1cm4gYSBwYWlyIGBgKG4sIGQpYGAgb2YgaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGdpdmVuCisgICAgICA6Y2xhc3M6YERlY2ltYWxgIGluc3RhbmNlIGFzIGEgZnJhY3Rpb24sIGluIGxvd2VzdCB0ZXJtcyBhbmQKKyAgICAgIHdpdGggYSBwb3NpdGl2ZSBkZW5vbWluYXRvcjo6CisKKyAgICAgICAgICA+Pj4gRGVjaW1hbCgnLTMuMTQnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgICAoLTE1NywgNTApCisKKyAgICAgIFRoZSBjb252ZXJzaW9uIGlzIGV4YWN0LiAgUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBWYWx1ZUVycm9yCisgICAgICBvbiBOYU5zLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogICAgLi4gbWV0aG9kOjogYXNfdHVwbGUoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kaXMucnN0IGIvRG9jL2xpYnJhcnkvZGlzLnJzdAppbmRleCA2OGMxOTZlLi4yMjliOWExIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kaXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Rpcy5yc3QKQEAgLTk4OSw2ICs5ODksMjggQEAKICAgIGFyZ3VtZW50cy4KIAogCisuLiBvcGNvZGU6OiBGT1JNQVRfVkFMVUUgKGZsYWdzKQorCisgICBVc2VkIGZvciBpbXBsZW1lbnRpbmcgZm9ybWF0dGVkIGxpdGVyYWwgc3RyaW5ncyAoZi1zdHJpbmdzKS4gIFBvcHMKKyAgIGFuIG9wdGlvbmFsICpmbXRfc3BlYyogZnJvbSB0aGUgc3RhY2ssIHRoZW4gYSByZXF1aXJlZCAqdmFsdWUqLgorICAgKmZsYWdzKiBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwMGBgOiAqdmFsdWUqIGlzIGZvcm1hdHRlZCBhcy1pcy4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAxYGA6IGNhbGwgOmZ1bmM6YHN0cmAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAyYGA6IGNhbGwgOmZ1bmM6YHJlcHJgIG9uICp2YWx1ZSogYmVmb3JlCisgICAgIGZvcm1hdHRpbmcgaXQuCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwM2BgOiBjYWxsIDpmdW5jOmBhc2NpaWAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDA0KSA9PSAweDA0YGA6IHBvcCAqZm10X3NwZWMqIGZyb20gdGhlIHN0YWNrIGFuZCB1c2UKKyAgICAgaXQsIGVsc2UgdXNlIGFuIGVtcHR5ICpmbXRfc3BlYyouCisKKyAgIEZvcm1hdHRpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIDpjOmZ1bmM6YFB5T2JqZWN0X0Zvcm1hdGAuICBUaGUKKyAgIHJlc3VsdCBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAuLiBvcGNvZGU6OiBIQVZFX0FSR1VNRU5UCiAKICAgIFRoaXMgaXMgbm90IHJlYWxseSBhbiBvcGNvZGUuICBJdCBpZGVudGlmaWVzIHRoZSBkaXZpZGluZyBsaW5lIGJldHdlZW4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VudW0ucnN0IGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKaW5kZXggOGEwMmE1NS4uYjM2OTFjYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW51bS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKQEAgLTU1OCw3ICs1NTgsOCBAQAogNC4gJS1zdHlsZSBmb3JtYXR0aW5nOiAgYCVzYCBhbmQgYCVyYCBjYWxsIHRoZSA6Y2xhc3M6YEVudW1gIGNsYXNzJ3MKICAgIDptZXRoOmBfX3N0cl9fYCBhbmQgOm1ldGg6YF9fcmVwcl9fYCByZXNwZWN0aXZlbHk7IG90aGVyIGNvZGVzIChzdWNoIGFzCiAgICBgJWlgIG9yIGAlaGAgZm9yIEludEVudW0pIHRyZWF0IHRoZSBlbnVtIG1lbWJlciBhcyBpdHMgbWl4ZWQtaW4gdHlwZS4KLTUuIDptZXRoOmBzdHIuZm9ybWF0YCAob3IgOmZ1bmM6YGZvcm1hdGApIHdpbGwgdXNlIHRoZSBtaXhlZC1pbgorNS4gOnJlZjpgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIDptZXRoOmBzdHIuZm9ybWF0YCwKKyAgIGFuZCA6ZnVuYzpgZm9ybWF0YCB3aWxsIHVzZSB0aGUgbWl4ZWQtaW4KICAgIHR5cGUncyA6bWV0aDpgX19mb3JtYXRfX2AuICBJZiB0aGUgOmNsYXNzOmBFbnVtYCBjbGFzcydzIDpmdW5jOmBzdHJgIG9yCiAgICA6ZnVuYzpgcmVwcmAgaXMgZGVzaXJlZCwgdXNlIHRoZSBgIXNgIG9yIGAhcmAgZm9ybWF0IGNvZGVzLgogCkBAIC03NDcsNiArNzQ4LDE1IEBACiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAKK0Jvb2xlYW4gZXZhbHVhdGlvbjogRW51bSBjbGFzc2VzIHRoYXQgYXJlIG1peGVkIHdpdGggbm9uLUVudW0gdHlwZXMgKHN1Y2ggYXMKKzpjbGFzczpgaW50YCwgOmNsYXNzOmBzdHJgLCBldGMuKSBhcmUgZXZhbHVhdGVkIGFjY29yZGluZyB0byB0aGUgbWl4ZWQtaW4KK3R5cGUncyBydWxlczsgb3RoZXJ3aXNlLCBhbGwgbWVtYmVycyBldmFsdWF0ZSBhcyBgYFRydWVgYC4gIFRvIG1ha2UgeW91ciBvd24KK0VudW0ncyBib29sZWFuIGV2YWx1YXRpb24gZGVwZW5kIG9uIHRoZSBtZW1iZXIncyB2YWx1ZSBhZGQgdGhlIGZvbGxvd2luZyB0bworeW91ciBjbGFzczo6CisKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYudmFsdWUpCisKIFRoZSA6YXR0cjpgX19tZW1iZXJzX19gIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY2xhc3MuCiAKIElmIHlvdSBnaXZlIHlvdXIgOmNsYXNzOmBFbnVtYCBzdWJjbGFzcyBleHRyYSBtZXRob2RzLCBsaWtlIHRoZSBgUGxhbmV0YF8KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QgYi9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0CmluZGV4IDNhNWJhZGQuLjNjNDk2NDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdApAQCAtNjgsNiArNjgsOSBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZmlsZSBkZXNjcmlwdG9yIHRvIHRoaXMgZnVuY3Rpb24uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPbiBXaW5kb3dzLCBhIGhhbmRsZXIgZm9yIFdpbmRvd3MgZXhjZXB0aW9uIGlzIGFsc28gaW5zdGFsbGVkLgorCiAuLiBmdW5jdGlvbjo6IGRpc2FibGUoKQogCiAgICBEaXNhYmxlIHRoZSBmYXVsdCBoYW5kbGVyOiB1bmluc3RhbGwgdGhlIHNpZ25hbCBoYW5kbGVycyBpbnN0YWxsZWQgYnkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QgYi9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CmluZGV4IDk1MTBmNzYuLjZjYTQwMDggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdApAQCAtNzEsOSArNzEsOCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIENhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4yCi0gICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KLQorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSB0aGUgZ2xvYmFsIHN0YXRlIGNyZWF0ZWQgYnkgOmZ1bmM6YGZpbGVpbnB1dC5pbnB1dGA7CiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgc3RhdGUsIDpleGM6YFJ1bnRpbWVFcnJvcmAgaXMgcmFpc2VkLgpAQCAtMTY2LDggKzE2NSw4IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy40CiAgICAgICBUaGUgYGAnclUnYGAgYW5kIGBgJ1UnYGAgbW9kZXMuCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41LjIKLSAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIAogKipPcHRpb25hbCBpbi1wbGFjZSBmaWx0ZXJpbmc6KiogaWYgdGhlIGtleXdvcmQgYXJndW1lbnQgYGBpbnBsYWNlPVRydWVgYCBpcwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZ3JwLnJzdCBiL0RvYy9saWJyYXJ5L2dycC5yc3QKaW5kZXggODg4MjE0MC4uYzg0MGNmZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZ3JwLnJzdAorKysgYi9Eb2MvbGlicmFyeS9ncnAucnN0CkBAIC00Miw2ICs0Miw5IEBACiAgICBSZXR1cm4gdGhlIGdyb3VwIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gbnVtZXJpYyBncm91cCBJRC4gOmV4YzpgS2V5RXJyb3JgCiAgICBpcyByYWlzZWQgaWYgdGhlIGVudHJ5IGFza2VkIGZvciBjYW5ub3QgYmUgZm91bmQuCiAKKyAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKyAgICAgIFNpbmNlIFB5dGhvbiAzLjYgdGhlIHN1cHBvcnQgb2Ygbm9uLWludGVnZXIgYXJndW1lbnRzIGxpa2UgZmxvYXRzIG9yCisgICAgICBzdHJpbmdzIGluIDpmdW5jOmBnZXRncmdpZGAgaXMgZGVwcmVjYXRlZC4KIAogLi4gZnVuY3Rpb246OiBnZXRncm5hbShuYW1lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKaW5kZXggMGJkZTM1Yi4uN2FiMjQ5YSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdApAQCAtMzc1LDEwICszNzUsOSBAQAogCiAgICBIYW5kbGVyID0gaHR0cC5zZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCiAKLSAgIGh0dHBkID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoIiIsIFBPUlQpLCBIYW5kbGVyKQotCi0gICBwcmludCgic2VydmluZyBhdCBwb3J0IiwgUE9SVCkKLSAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKCgiIiwgUE9SVCksIEhhbmRsZXIpIGFzIGh0dHBkOgorICAgICAgIHByaW50KCJzZXJ2aW5nIGF0IHBvcnQiLCBQT1JUKQorICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAuLiBfaHR0cC1zZXJ2ZXItY2xpOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbWFwbGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CmluZGV4IDE1YjA5MzIuLmNkMjE0ZmYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CkBAIC01MDAsNiArNTAwLDE3IEBACiAgICAgICAgICBNLnN0b3JlKG51bSwgJytGTEFHUycsICdcXERlbGV0ZWQnKQogICAgICAgTS5leHB1bmdlKCkKIAorICAgLi4gbm90ZTo6CisKKyAgICAgIENyZWF0aW5nIGZsYWdzIGNvbnRhaW5pbmcgJ10nIChmb3IgZXhhbXBsZTogIlt0ZXN0XSIpIHZpb2xhdGVzCisgICAgICA6cmZjOmAzNTAxYCAodGhlIElNQVAgcHJvdG9jb2wpLiAgSG93ZXZlciwgaW1hcGxpYiBoYXMgaGlzdG9yaWNhbGx5CisgICAgICBhbGxvd2VkIGNyZWF0aW9uIG9mIHN1Y2ggdGFncywgYW5kIHBvcHVsYXIgSU1BUCBzZXJ2ZXJzLCBzdWNoIGFzIEdtYWlsLAorICAgICAgYWNjZXB0IGFuZCBwcm9kdWNlIHN1Y2ggZmxhZ3MuICBUaGVyZSBhcmUgbm9uLVB5dGhvbiBwcm9ncmFtcyB3aGljaCBhbHNvCisgICAgICBjcmVhdGUgc3VjaCB0YWdzLiAgQWx0aG91Z2ggaXQgaXMgYW4gUkZDIHZpb2xhdGlvbiBhbmQgSU1BUCBjbGllbnRzIGFuZAorICAgICAgc2VydmVycyBhcmUgc3VwcG9zZWQgdG8gYmUgc3RyaWN0LCBpbWFwbGliIG5vbnRoZWxlc3MgY29udGludWVzIHRvIGFsbG93CisgICAgICBzdWNoIHRhZ3MgdG8gYmUgY3JlYXRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbmQgYXMgb2YKKyAgICAgIHB5dGhvbiAzLjYsIGhhbmRsZXMgdGhlbSBpZiB0aGV5IGFyZSBzZW50IGZyb20gdGhlIHNlcnZlciwgc2luY2UgdGhpcworICAgICAgaW1wcm92ZXMgcmVhbC13b3JsZCBjb21wYXRpYmlsaXR5LgogCiAuLiBtZXRob2Q6OiBJTUFQNC5zdWJzY3JpYmUobWFpbGJveCkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wLnJzdCBiL0RvYy9saWJyYXJ5L2ltcC5yc3QKaW5kZXggNjhhNmI2OC4uNDIwMDMxYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXAucnN0CkBAIC04MSw3ICs4MSw5IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy4zCiAgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLmZpbmRfc3BlY2AgaW5zdGVhZCB1bmxlc3MgUHl0aG9uIDMuMwogICAgICAgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZCwgaW4gd2hpY2ggY2FzZSB1c2UKLSAgICAgIDpmdW5jOmBpbXBvcnRsaWIuZmluZF9sb2FkZXJgLgorICAgICAgOmZ1bmM6YGltcG9ydGxpYi5maW5kX2xvYWRlcmAuIEZvciBleGFtcGxlIHVzYWdlIG9mIHRoZSBmb3JtZXIgY2FzZSwKKyAgICAgIHNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYCBzZWN0aW9uIG9mIHRoZSA6bW9kOmBpbXBvcnRsaWJgCisgICAgICBkb2N1bWVudGF0aW9uLgogCiAKIC4uIGZ1bmN0aW9uOjogbG9hZF9tb2R1bGUobmFtZSwgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uKQpAQCAtMTA4LDkgKzExMCwxMiBAQAogICAgICAgSWYgcHJldmlvdXNseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggOmZ1bmM6YGltcC5maW5kX21vZHVsZWAgdGhlbgogICAgICAgY29uc2lkZXIgdXNpbmcgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYCwgb3RoZXJ3aXNlIHVzZSB0aGUgbG9hZGVyCiAgICAgICByZXR1cm5lZCBieSB0aGUgcmVwbGFjZW1lbnQgeW91IGNob3NlIGZvciA6ZnVuYzpgaW1wLmZpbmRfbW9kdWxlYC4gSWYgeW91Ci0gICAgICBjYWxsZWQgOmZ1bmM6YGltcC5sb2FkX21vZHVsZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGRpcmVjdGx5IHRoZW4gdXNlIHRoZQotICAgICAgY2xhc3NlcyBpbiA6bW9kOmBpbXBvcnRsaWIubWFjaGluZXJ5YCwgZS5nLgotICAgICAgYGBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIobmFtZSwgcGF0aCkubG9hZF9tb2R1bGUoKWBgLgorICAgICAgY2FsbGVkIDpmdW5jOmBpbXAubG9hZF9tb2R1bGVgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkaXJlY3RseSB3aXRoIGZpbGUKKyAgICAgIHBhdGggYXJndW1lbnRzIHRoZW4gdXNlIGEgY29tYmluYXRpb24gb2YKKyAgICAgIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fZmlsZV9sb2NhdGlvbmAgYW5kCisgICAgICA6ZnVuYzpgaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlY2AuIFNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYAorICAgICAgc2VjdGlvbiBvZiB0aGUgOm1vZDpgaW1wb3J0bGliYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIHRoZSB2YXJpb3VzCisgICAgICBhcHByb2FjaGVzLgogCiAKIC4uIGZ1bmN0aW9uOjogbmV3X21vZHVsZShuYW1lKQpAQCAtMTE5LDcgKzEyNCw3IEBACiAgICBpbiBgYHN5cy5tb2R1bGVzYGAuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKLSAgICAgIFVzZSA6Y2xhc3M6YHR5cGVzLk1vZHVsZVR5cGVgIGluc3RlYWQuCisgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWNgIGluc3RlYWQuCiAKIAogLi4gZnVuY3Rpb246OiByZWxvYWQobW9kdWxlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKaW5kZXggNDNiMzRlOS4uMWExMzQ4ZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CkBAIC0yNTYsNyArMjU2LDcgQEAKICAgICAgIG1vZHVsZSBhbmQgKnBhdGgqIHdpbGwgYmUgdGhlIHZhbHVlIG9mIDphdHRyOmBfX3BhdGhfX2AgZnJvbSB0aGUKICAgICAgIHBhcmVudCBwYWNrYWdlLiBJZiBhIHNwZWMgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KICAgICAgIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgIGlzIGEgbW9kdWxlIG9iamVjdCB0aGF0IHRoZSBmaW5kZXIgbWF5Ci0gICAgICB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KKyAgICAgIHVzZSB0byBtYWtlIGEgbW9yZSBlZHVjYXRlZCBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtMzA2LDcgKzMwNiw3IEBACiAgICAgICB3aXRoaW4gdGhlIDp0ZXJtOmBwYXRoIGVudHJ5YCB0byB3aGljaCBpdCBpcyBhc3NpZ25lZC4gIElmIGEgc3BlYwogICAgICAgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4gIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgCiAgICAgICBpcyBhIG1vZHVsZSBvYmplY3QgdGhhdCB0aGUgZmluZGVyIG1heSB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQKLSAgICAgIGFib3V0IHdoYXQgc3BlYyB0byByZXR1cm4uCisgICAgICBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtOTIxLDYgKzkyMSwxMCBAQAogICAgICAgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB3aGVyZQogICAgICAgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgaXMgb3B0aW9uYWwuCiAKKyAgICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKworICAgICAgICAgVXNlIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgaW5zdGVhZC4KKwogCiAuLiBjbGFzczo6IFNvdXJjZWxlc3NGaWxlTG9hZGVyKGZ1bGxuYW1lLCBwYXRoKQogCkBAIC05NjAsNiArOTY0LDEwIEBACiAgICBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHdoZXJlCiAgICBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCBpcyBvcHRpb25hbC4KIAorICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorCisgICAgICBVc2UgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpbnN0ZWFkLgorCiAKIC4uIGNsYXNzOjogRXh0ZW5zaW9uRmlsZUxvYWRlcihmdWxsbmFtZSwgcGF0aCkKIApAQCAtMTMwMCwzICsxMzA4LDEyMCBAQAogICAgICAgICBsb2FkZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIKICAgICAgICAgbGF6eV9sb2FkZXIgPSBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyLmZhY3RvcnkobG9hZGVyKQogICAgICAgICBmaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LkZpbGVGaW5kZXIocGF0aCwgKGxhenlfbG9hZGVyLCBzdWZmaXhlcykpCisKKy4uIF9pbXBvcnRsaWItZXhhbXBsZXM6CisKK0V4YW1wbGVzCistLS0tLS0tLQorCitUbyBwcm9ncmFtbWF0aWNhbGx5IGltcG9ydCBhIG1vZHVsZSwgdXNlIDpmdW5jOmBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZWAuCis6OgorCisgIGltcG9ydCBpbXBvcnRsaWIKKworICBpdGVydG9vbHMgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnaXRlcnRvb2xzJykKKworSWYgeW91IG5lZWQgdG8gZmluZCBvdXQgaWYgYSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgdGhlCitpbXBvcnQsIHRoZW4geW91IHNob3VsZCB1c2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLmZpbmRfc3BlY2AuCis6OgorCisgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICBpbXBvcnQgc3lzCisKKyAgIyBGb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICBuYW1lID0gJ2l0ZXJ0b29scycKKworICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCisgIGlmIHNwZWMgaXMgTm9uZToKKyAgICAgIHByaW50KCJjYW4ndCBmaW5kIHRoZSBpdGVydG9vbHMgbW9kdWxlIikKKyAgZWxzZToKKyAgICAgICMgSWYgeW91IGNob3NlIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBpbXBvcnQgLi4uCisgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCisgICAgICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCisgICAgICAjIEFkZGluZyB0aGUgbW9kdWxlIHRvIHN5cy5tb2R1bGVzIGlzIG9wdGlvbmFsLgorICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKKworVG8gaW1wb3J0IGEgUHl0aG9uIHNvdXJjZSBmaWxlIGRpcmVjdGx5LCB1c2UgdGhlIGZvbGxvd2luZyByZWNpcGUKKyhQeXRob24gMy40IGFuZCBuZXdlciBvbmx5KTo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi51dGlsCisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCisgIGltcG9ydCB0b2tlbml6ZQorICBmaWxlX3BhdGggPSB0b2tlbml6ZS5fX2ZpbGVfXworICBtb2R1bGVfbmFtZSA9IHRva2VuaXplLl9fbmFtZV9fCisKKyAgc3BlYyA9IGltcG9ydGxpYi51dGlsLnNwZWNfZnJvbV9maWxlX2xvY2F0aW9uKG1vZHVsZV9uYW1lLCBmaWxlX3BhdGgpCisgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQorICAjIE9wdGlvbmFsOyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGltcG9ydCB0aGUgbW9kdWxlCisgICMgYnkgbmFtZSBsYXRlci4KKyAgc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdID0gbW9kdWxlCisKK0ZvciBkZWVwIGN1c3RvbWl6YXRpb25zIG9mIGltcG9ydCwgeW91IHR5cGljYWxseSB3YW50IHRvIGltcGxlbWVudCBhbgorOnRlcm06YGltcG9ydGVyYC4gVGhpcyBtZWFucyBtYW5hZ2luZyBib3RoIHRoZSA6dGVybTpgZmluZGVyYCBhbmQgOnRlcm06YGxvYWRlcmAKK3NpZGUgb2YgdGhpbmdzLiBGb3IgZmluZGVycyB0aGVyZSBhcmUgdHdvIGZsYXZvdXJzIHRvIGNob29zZSBmcm9tIGRlcGVuZGluZyBvbgoreW91ciBuZWVkczogYSA6dGVybTpgbWV0YSBwYXRoIGZpbmRlcmAgb3IgYSA6dGVybTpgcGF0aCBlbnRyeSBmaW5kZXJgLiBUaGUKK2Zvcm1lciBpcyB3aGF0IHlvdSB3b3VsZCBwdXQgb24gOmF0dHI6YHN5cy5tZXRhX3BhdGhgIHdoaWxlIHRoZSBsYXR0ZXIgaXMgd2hhdAoreW91IGNyZWF0ZSB1c2luZyBhIDp0ZXJtOmBwYXRoIGVudHJ5IGhvb2tgIG9uIDphdHRyOmBzeXMucGF0aF9ob29rc2Agd2hpY2ggd29ya3MKK3dpdGggOmF0dHI6YHN5cy5wYXRoYCBlbnRyaWVzIHRvIHBvdGVudGlhbGx5IGNyZWF0ZSBhIGZpbmRlci4gVGhpcyBleGFtcGxlIHdpbGwKK3Nob3cgeW91IGhvdyB0byByZWdpc3RlciB5b3VyIG93biBpbXBvcnRlcnMgc28gdGhhdCBpbXBvcnQgd2lsbCB1c2UgdGhlbSAoZm9yCitjcmVhdGluZyBhbiBpbXBvcnRlciBmb3IgeW91cnNlbGYsIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBhcHByb3ByaWF0ZQorY2xhc3NlcyBkZWZpbmVkIHdpdGhpbiB0aGlzIHBhY2thZ2UpOjoKKworICBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQorICBpbXBvcnQgc3lzCisKKyAgIyBGb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzIG9ubHkuCisgIFNwYW1NZXRhUGF0aEZpbmRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuUGF0aEZpbmRlcgorICBTcGFtUGF0aEVudHJ5RmluZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5GaWxlRmluZGVyCisgIGxvYWRlcl9kZXRhaWxzID0gKGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlRmlsZUxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVMpCisKKyAgIyBTZXR0aW5nIHVwIGEgbWV0YSBwYXRoIGZpbmRlci4KKyAgIyBNYWtlIHN1cmUgdG8gcHV0IHRoZSBmaW5kZXIgaW4gdGhlIHByb3BlciBsb2NhdGlvbiBpbiB0aGUgbGlzdCBpbiB0ZXJtcyBvZgorICAjIHByaW9yaXR5LgorICBzeXMubWV0YV9wYXRoLmFwcGVuZChTcGFtTWV0YVBhdGhGaW5kZXIpCisKKyAgIyBTZXR0aW5nIHVwIGEgcGF0aCBlbnRyeSBmaW5kZXIuCisgICMgTWFrZSBzdXJlIHRvIHB1dCB0aGUgcGF0aCBob29rIGluIHRoZSBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIGxpc3QgaW4gdGVybXMKKyAgIyBvZiBwcmlvcml0eS4KKyAgc3lzLnBhdGhfaG9va3MuYXBwZW5kKFNwYW1QYXRoRW50cnlGaW5kZXIucGF0aF9ob29rKGxvYWRlcl9kZXRhaWxzKSkKKworSW1wb3J0IGl0c2VsZiBpcyBpbXBsZW1lbnRlZCBpbiBQeXRob24gY29kZSwgbWFraW5nIGl0IHBvc3NpYmxlIHRvCitleHBvc2UgbW9zdCBvZiB0aGUgaW1wb3J0IG1hY2hpbmVyeSB0aHJvdWdoIGltcG9ydGxpYi4gVGhlIGZvbGxvd2luZworaGVscHMgaWxsdXN0cmF0ZSB0aGUgdmFyaW91cyBBUElzIHRoYXQgaW1wb3J0bGliIGV4cG9zZXMgYnkgcHJvdmlkaW5nIGFuCithcHByb3hpbWF0ZSBpbXBsZW1lbnRhdGlvbiBvZgorOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYCAoUHl0aG9uIDMuNCBhbmQgbmV3ZXIgZm9yIHRoZSBpbXBvcnRsaWIgdXNhZ2UsCitQeXRob24gMy42IGFuZCBuZXdlciBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGNvZGUpLgorOjoKKworICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKKyAgaW1wb3J0IHN5cworCisgIGRlZiBpbXBvcnRfbW9kdWxlKG5hbWUsIHBhY2thZ2U9Tm9uZSk6CisgICAgICAiIiJBbiBhcHByb3hpbWF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBpbXBvcnQuIiIiCisgICAgICBhYnNvbHV0ZV9uYW1lID0gaW1wb3J0bGliLnV0aWwucmVzb2x2ZV9uYW1lKG5hbWUsIHBhY2thZ2UpCisgICAgICB0cnk6CisgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2Fic29sdXRlX25hbWVdCisgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgcGFzcworCisgICAgICBwYXRoID0gTm9uZQorICAgICAgaWYgJy4nIGluIGFic29sdXRlX25hbWU6CisgICAgICAgICAgcGFyZW50X25hbWUsIF8sIGNoaWxkX25hbWUgPSBhYnNvbHV0ZV9uYW1lLnJwYXJ0aXRpb24oJy4nKQorICAgICAgICAgIHBhcmVudF9tb2R1bGUgPSBpbXBvcnRfbW9kdWxlKHBhcmVudF9uYW1lKQorICAgICAgICAgIHBhdGggPSBwYXJlbnRfbW9kdWxlLnNwZWMuc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMKKyAgICAgIGZvciBmaW5kZXIgaW4gc3lzLm1ldGFfcGF0aDoKKyAgICAgICAgICBzcGVjID0gZmluZGVyLmZpbmRfc3BlYyhhYnNvbHV0ZV9uYW1lLCBwYXRoKQorICAgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgIGJyZWFrCisgICAgICBlbHNlOgorICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKGYnTm8gbW9kdWxlIG5hbWVkIHthYnNvbHV0ZV9uYW1lIXJ9JykKKyAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgICAgIHN5cy5tb2R1bGVzW2Fic29sdXRlX25hbWVdID0gbW9kdWxlCisgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgIHNldGF0dHIocGFyZW50X21vZHVsZSwgY2hpbGRfbmFtZSwgbW9kdWxlKQorICAgICAgcmV0dXJuIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAppbmRleCA4ZDI1YjFlLi5hYThhMTgxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdApAQCAtMjM0LDI0ICsyMzQsNiBAQAogICAgICAgbGlzdGVkIGluIHRoZSBtZXRhY2xhc3MnIGN1c3RvbSA6bWV0aDpgX19kaXJfX2AuCiAKIAotLi4gZnVuY3Rpb246OiBnZXRtb2R1bGVpbmZvKHBhdGgpCi0KLSAgIFJldHVybnMgYSA6dGVybTpgbmFtZWQgdHVwbGVgIGBgTW9kdWxlSW5mbyhuYW1lLCBzdWZmaXgsIG1vZGUsIG1vZHVsZV90eXBlKWBgCi0gICBvZiB2YWx1ZXMgdGhhdCBkZXNjcmliZSBob3cgUHl0aG9uIHdpbGwgaW50ZXJwcmV0IHRoZSBmaWxlIGlkZW50aWZpZWQgYnkKLSAgICpwYXRoKiBpZiBpdCBpcyBhIG1vZHVsZSwgb3IgYGBOb25lYGAgaWYgaXQgd291bGQgbm90IGJlIGlkZW50aWZpZWQgYXMgYQotICAgbW9kdWxlLiAgSW4gdGhhdCB0dXBsZSwgKm5hbWUqIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2l0aG91dCB0aGUgbmFtZSBvZgotICAgYW55IGVuY2xvc2luZyBwYWNrYWdlLCAqc3VmZml4KiBpcyB0aGUgdHJhaWxpbmcgcGFydCBvZiB0aGUgZmlsZSBuYW1lICh3aGljaAotICAgbWF5IG5vdCBiZSBhIGRvdC1kZWxpbWl0ZWQgZXh0ZW5zaW9uKSwgKm1vZGUqIGlzIHRoZSA6ZnVuYzpgb3BlbmAgbW9kZSB0aGF0Ci0gICB3b3VsZCBiZSB1c2VkIChgYCdyJ2BgIG9yIGBgJ3JiJ2BgKSwgYW5kICptb2R1bGVfdHlwZSogaXMgYW4gaW50ZWdlciBnaXZpbmcKLSAgIHRoZSB0eXBlIG9mIHRoZSBtb2R1bGUuICAqbW9kdWxlX3R5cGUqIHdpbGwgaGF2ZSBhIHZhbHVlIHdoaWNoIGNhbiBiZQotICAgY29tcGFyZWQgdG8gdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoZSA6bW9kOmBpbXBgIG1vZHVsZTsgc2VlIHRoZQotICAgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbW9kdWxlIHR5cGVzLgotCi0gICAuLiBkZXByZWNhdGVkOjogMy4zCi0gICAgICBZb3UgbWF5IGNoZWNrIHRoZSBmaWxlIHBhdGgncyBzdWZmaXggYWdhaW5zdCB0aGUgc3VwcG9ydGVkIHN1ZmZpeGVzCi0gICAgICBsaXN0ZWQgaW4gOm1vZDpgaW1wb3J0bGliLm1hY2hpbmVyeWAgdG8gaW5mZXIgdGhlIHNhbWUgaW5mb3JtYXRpb24uCi0KLQogLi4gZnVuY3Rpb246OiBnZXRtb2R1bGVuYW1lKHBhdGgpCiAKICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIG5hbWVkIGJ5IHRoZSBmaWxlICpwYXRoKiwgd2l0aG91dCBpbmNsdWRpbmcgdGhlCkBAIC0yNjUsOCArMjQ3LDcgQEAKICAgIHN0aWxsIHJldHVybiBgYE5vbmVgYC4KIAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKLSAgICAgIFRoaXMgZnVuY3Rpb24gaXMgbm93IGJhc2VkIGRpcmVjdGx5IG9uIDptb2Q6YGltcG9ydGxpYmAgcmF0aGVyIHRoYW4gdGhlCi0gICAgICBkZXByZWNhdGVkIDpmdW5jOmBnZXRtb2R1bGVpbmZvYC4KKyAgICAgIFRoZSBmdW5jdGlvbiBpcyBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgLgogCiAKIC4uIGZ1bmN0aW9uOjogaXNtb2R1bGUob2JqZWN0KQpAQCAtODQ4LDggKzgyOSw2IEBACiAgICBmcm9tIGt3b25seWFyZ3MgdG8gZGVmYXVsdHMuICAqYW5ub3RhdGlvbnMqIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50CiAgICBuYW1lcyB0byBhbm5vdGF0aW9ucy4KIAotICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gOmZ1bmM6YGdldGFyZ3NwZWNgLgotCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3cgYmFzZWQgb24gOmZ1bmM6YHNpZ25hdHVyZWAsIGJ1dCBzdGlsbCBpZ25vcmVzCiAgICAgICBgYF9fd3JhcHBlZF9fYGAgYXR0cmlidXRlcyBhbmQgaW5jbHVkZXMgdGhlIGFscmVhZHkgYm91bmQgZmlyc3QKQEAgLTg3OCw3ICs4NTcsNyBAQAogLi4gZnVuY3Rpb246OiBmb3JtYXRhcmdzcGVjKGFyZ3NbLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm5vdGF0aW9uc1ssIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBmb3JtYXRyZXR1cm5zLCBmb3JtYXRhbm5vdGF0aW9uc11dKQogCiAgICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgIDpmdW5jOmBnZXRhcmdzcGVjYCBvciA6ZnVuYzpgZ2V0ZnVsbGFyZ3NwZWNgLgorICAgOmZ1bmM6YGdldGZ1bGxhcmdzcGVjYC4KIAogICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGBgYXJnc2BgLCBgYHZhcmFyZ3NgYCwgYGB2YXJrd2BgLAogICAgYGBkZWZhdWx0c2BgLCBgYGt3b25seWFyZ3NgYCwgYGBrd29ubHlkZWZhdWx0c2BgLCBgYGFubm90YXRpb25zYGApLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAppbmRleCA1OTM2ZTEyLi5mODlkNmMzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdApAQCAtMTYyLDExICsxNjIsMTkgQEAKICAgIGZpcnN0IGNhbGwgdG8gOm1ldGg6YGVtaXRgLiAgQnkgZGVmYXVsdCwgdGhlIGZpbGUgZ3Jvd3MgaW5kZWZpbml0ZWx5LgogCiAKKyAgIC4uIG1ldGhvZDo6IHJlb3BlbklmTmVlZGVkKCkKKworICAgICAgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMgY2hhbmdlZC4gIElmIGl0IGhhcywgdGhlIGV4aXN0aW5nIHN0cmVhbSBpcworICAgICAgZmx1c2hlZCBhbmQgY2xvc2VkIGFuZCB0aGUgZmlsZSBvcGVuZWQgYWdhaW4sIHR5cGljYWxseSBhcyBhIHByZWN1cnNvciB0bworICAgICAgb3V0cHV0dGluZyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAgICAuLiBtZXRob2Q6OiBlbWl0KHJlY29yZCkKIAotICAgICAgT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBidXQgZmlyc3QgY2hlY2tzIHRvIHNlZSBpZiB0aGUgZmlsZSBoYXMKLSAgICAgIGNoYW5nZWQuICBJZiBpdCBoYXMsIHRoZSBleGlzdGluZyBzdHJlYW0gaXMgZmx1c2hlZCBhbmQgY2xvc2VkIGFuZCB0aGUKLSAgICAgIGZpbGUgb3BlbmVkIGFnYWluLCBiZWZvcmUgb3V0cHV0dGluZyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLgorICAgICAgT3V0cHV0cyB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBidXQgZmlyc3QgY2FsbHMgOm1ldGg6YHJlb3BlbklmTmVlZGVkYCB0bworICAgICAgcmVvcGVuIHRoZSBmaWxlIGlmIGl0IGhhcyBjaGFuZ2VkLgogCiAuLiBfYmFzZS1yb3RhdGluZy1oYW5kbGVyOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tbWFwLnJzdCBiL0RvYy9saWJyYXJ5L21tYXAucnN0CmluZGV4IDMzYmFmMmIuLmZiMjQ3MjggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L21tYXAucnN0CisrKyBiL0RvYy9saWJyYXJ5L21tYXAucnN0CkBAIC0yNjMsMTMgKzI2MywxOCBAQAogICAgLi4gbWV0aG9kOjogd3JpdGUoYnl0ZXMpCiAKICAgICAgIFdyaXRlIHRoZSBieXRlcyBpbiAqYnl0ZXMqIGludG8gbWVtb3J5IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZQotICAgICAgZmlsZSBwb2ludGVyOyB0aGUgZmlsZSBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHBvaW50IGFmdGVyIHRoZSBieXRlcyB0aGF0Ci0gICAgICB3ZXJlIHdyaXR0ZW4uIElmIHRoZSBtbWFwIHdhcyBjcmVhdGVkIHdpdGggOmNvbnN0OmBBQ0NFU1NfUkVBRGAsIHRoZW4KKyAgICAgIGZpbGUgcG9pbnRlciBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiAobmV2ZXIgbGVzcyB0aGFuCisgICAgICBgYGxlbihieXRlcylgYCwgc2luY2UgaWYgdGhlIHdyaXRlIGZhaWxzLCBhIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUKKyAgICAgIHJhaXNlZCkuICBUaGUgZmlsZSBwb3NpdGlvbiBpcyB1cGRhdGVkIHRvIHBvaW50IGFmdGVyIHRoZSBieXRlcyB0aGF0CisgICAgICB3ZXJlIHdyaXR0ZW4uICBJZiB0aGUgbW1hcCB3YXMgY3JlYXRlZCB3aXRoIDpjb25zdDpgQUNDRVNTX1JFQURgLCB0aGVuCiAgICAgICB3cml0aW5nIHRvIGl0IHdpbGwgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgIGV4Y2VwdGlvbi4KIAogICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgICAgIFdyaXRhYmxlIDp0ZXJtOmBieXRlcy1saWtlIG9iamVjdGAgaXMgbm93IGFjY2VwdGVkLgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlzIG5vdyByZXR1cm5lZC4KKwogCiAgICAuLiBtZXRob2Q6OiB3cml0ZV9ieXRlKGJ5dGUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CmluZGV4IDY4NGE1OWYuLjY0NDBmNWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdApAQCAtODgzLDggKzg4MywxMyBAQAogCiAuLiBmdW5jdGlvbjo6IGNwdV9jb3VudCgpCiAKLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4gIE1heSByYWlzZQotICAgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAuCisgICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uCisKKyAgIFRoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgorICAgdXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorICAgYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKKworICAgTWF5IHJhaXNlIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgLgogCiAgICAuLiBzZWVhbHNvOjoKICAgICAgIDpmdW5jOmBvcy5jcHVfY291bnRgCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9vcy5yc3QgYi9Eb2MvbGlicmFyeS9vcy5yc3QKaW5kZXggZjJjZmRiNC4uMDUxZGI5OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvb3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L29zLnJzdApAQCAtMTg5MSwxNCArMTg5MSwyOSBAQAogICAgOmF0dHI6YH5EaXJFbnRyeS5wYXRoYCBhdHRyaWJ1dGVzIG9mIGVhY2ggOmNsYXNzOmBEaXJFbnRyeWAgd2lsbCBiZSBvZgogICAgdGhlIHNhbWUgdHlwZSBhcyAqcGF0aCouCiAKKyAgIFRoZSA6ZnVuYzpgc2NhbmRpcmAgaXRlcmF0b3Igc3VwcG9ydHMgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sCisgICBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorCisgICAuLiBtZXRob2Q6OiBzY2FuZGlyLmNsb3NlKCkKKworICAgICAgQ2xvc2UgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIGFjcXVpcmVkIHJlc291cmNlcy4KKworICAgICAgVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQgb3IgZ2FyYmFnZQorICAgICAgY29sbGVjdGVkLCBvciB3aGVuIGFuIGVycm9yIGhhcHBlbnMgZHVyaW5nIGl0ZXJhdGluZy4gIEhvd2V2ZXIgaXQKKyAgICAgIGlzIGFkdmlzYWJsZSB0byBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgdXNlIHRoZSA6a2V5d29yZDpgd2l0aGAKKyAgICAgIHN0YXRlbWVudC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSB1c2Ugb2YgOmZ1bmM6YHNjYW5kaXJgIHRvIGRpc3BsYXkgYWxsCiAgICB0aGUgZmlsZXMgKGV4Y2x1ZGluZyBkaXJlY3RvcmllcykgaW4gdGhlIGdpdmVuICpwYXRoKiB0aGF0IGRvbid0IHN0YXJ0IHdpdGgKICAgIGBgJy4nYGAuIFRoZSBgYGVudHJ5LmlzX2ZpbGUoKWBgIGNhbGwgd2lsbCBnZW5lcmFsbHkgbm90IG1ha2UgYW4gYWRkaXRpb25hbAogICAgc3lzdGVtIGNhbGw6OgogCi0gICAgICBmb3IgZW50cnkgaW4gb3Muc2NhbmRpcihwYXRoKToKLSAgICAgICAgIGlmIG5vdCBlbnRyeS5uYW1lLnN0YXJ0c3dpdGgoJy4nKSBhbmQgZW50cnkuaXNfZmlsZSgpOgotICAgICAgICAgICAgIHByaW50KGVudHJ5Lm5hbWUpCisgICAgICB3aXRoIG9zLnNjYW5kaXIocGF0aCkgYXMgaXQ6CisgICAgICAgICAgZm9yIGVudHJ5IGluIGl0OgorICAgICAgICAgICAgICBpZiBub3QgZW50cnkubmFtZS5zdGFydHN3aXRoKCcuJykgYW5kIGVudHJ5LmlzX2ZpbGUoKToKKyAgICAgICAgICAgICAgICAgIHByaW50KGVudHJ5Lm5hbWUpCiAKICAgIC4uIG5vdGU6OgogCkBAIC0xOTE0LDYgKzE5MjksMTIgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sIGFuZCB0aGUKKyAgICAgIDpmdW5jOmB+c2NhbmRpci5jbG9zZSgpYCBtZXRob2QuICBJZiBhIDpmdW5jOmBzY2FuZGlyYCBpdGVyYXRvciBpcyBuZWl0aGVyCisgICAgICBleGhhdXN0ZWQgbm9yIGV4cGxpY2l0bHkgY2xvc2VkIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCB3aWxsIGJlIGVtaXR0ZWQKKyAgICAgIGluIGl0cyBkZXN0cnVjdG9yLgorCiAKIC4uIGNsYXNzOjogRGlyRW50cnkKIApAQCAtMzYwNiw2ICszNjI3LDExIEBACiAKICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4gUmV0dXJucyBOb25lIGlmIHVuZGV0ZXJtaW5lZC4KIAorICAgVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCisgICB1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICBgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAorCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0IGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKaW5kZXggYTdjZTE4ZC4uNWZmOGJlOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgPj4+IFB1cmVXaW5kb3dzUGF0aCgnZm9vJykgPCBQdXJlUG9zaXhQYXRoKCdmb28nKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgotICAgVHlwZUVycm9yOiB1bm9yZGVyYWJsZSB0eXBlczogUHVyZVdpbmRvd3NQYXRoKCkgPCBQdXJlUG9zaXhQYXRoKCkKKyAgIFR5cGVFcnJvcjogJzwnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJ1B1cmVXaW5kb3dzUGF0aCcgYW5kICdQdXJlUG9zaXhQYXRoJwogCiAKIE9wZXJhdG9ycwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdCBiL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKaW5kZXggN2UwOWIwMy4uMjQxOTI3NyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGlja2xlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9waWNrbGUucnN0CkBAIC00ODgsNyArNDg4LDcgQEAKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0bmV3YXJnc19leF9fKCkKIAotICAgSW4gcHJvdG9jb2xzIDQgYW5kIG5ld2VyLCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50cyB0aGUKKyAgIEluIHByb3RvY29scyAyIGFuZCBuZXdlciwgY2xhc3NlcyB0aGF0IGltcGxlbWVudHMgdGhlCiAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIG1ldGhvZCBjYW4gZGljdGF0ZSB0aGUgdmFsdWVzIHBhc3NlZCB0byB0aGUKICAgIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLiAgVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhIHBhaXIKICAgIGBgKGFyZ3MsIGt3YXJncylgYCB3aGVyZSAqYXJncyogaXMgYSB0dXBsZSBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cwpAQCAtNTAwLDE1ICs1MDAsMjIgQEAKICAgIGNsYXNzIHJlcXVpcmVzIGtleXdvcmQtb25seSBhcmd1bWVudHMuICBPdGhlcndpc2UsIGl0IGlzIHJlY29tbWVuZGVkIGZvcgogICAgY29tcGF0aWJpbGl0eSB0byBpbXBsZW1lbnQgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMgbm93IHVzZWQgaW4gcHJvdG9jb2xzIDIgYW5kIDMuCisKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0bmV3YXJnc19fKCkKIAotICAgVGhpcyBtZXRob2Qgc2VydmUgYSBzaW1pbGFyIHB1cnBvc2UgYXMgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBidXQKLSAgIGZvciBwcm90b2NvbHMgMiBhbmQgbmV3ZXIuICBJdCBtdXN0IHJldHVybiBhIHR1cGxlIG9mIGFyZ3VtZW50cyBgYGFyZ3NgYAotICAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLgorICAgVGhpcyBtZXRob2Qgc2VydmUgYSBzaW1pbGFyIHB1cnBvc2UgYXMgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCwgYnV0CisgICBzdXBwb3J0cyBvbmx5IHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgSXQgbXVzdCByZXR1cm4gYSB0dXBsZSBvZiBhcmd1bWVudHMKKyAgIGBgYXJnc2BgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4KIAotICAgSW4gcHJvdG9jb2xzIDQgYW5kIG5ld2VyLCA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdpbGwgbm90IGJlIGNhbGxlZCBpZgotICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcyBkZWZpbmVkLgorICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcworICAgZGVmaW5lZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEJlZm9yZSBQeXRob24gMy42LCA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdhcyBjYWxsZWQgaW5zdGVhZCBvZgorICAgICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpbiBwcm90b2NvbHMgMiBhbmQgMy4KIAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRzdGF0ZV9fKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QgYi9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CmluZGV4IGRmNTAyYTAuLmU3YjgxYWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdApAQCAtNDYsNyArNDYsOCBAQAogLi4gd2FybmluZzo6CiAKICAgIFRoZSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvcnMgb2YgdGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICAgc2VjdXJpdHkgcHVycG9zZXMuCisgICBzZWN1cml0eSBwdXJwb3Nlcy4gIEZvciBzZWN1cml0eSBvciBjcnlwdG9ncmFwaGljIHVzZXMsIHNlZSB0aGUKKyAgIDptb2Q6YHNlY3JldHNgIG1vZHVsZS4KIAogCiBCb29ra2VlcGluZyBmdW5jdGlvbnM6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zZWNyZXRzLnJzdCBiL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjg0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGlicmFyeS9zZWNyZXRzLnJzdApAQCAtMCwwICsxLDE5OCBAQAorOm1vZDpgc2VjcmV0c2AgLS0tIEdlbmVyYXRlIHNlY3VyZSByYW5kb20gbnVtYmVycyBmb3IgbWFuYWdpbmcgc2VjcmV0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBtb2R1bGU6OiBzZWNyZXRzCisgICA6c3lub3BzaXM6IEdlbmVyYXRlIHNlY3VyZSByYW5kb20gbnVtYmVycyBmb3IgbWFuYWdpbmcgc2VjcmV0cy4KKworLi4gbW9kdWxlYXV0aG9yOjogU3RldmVuIEQnQXByYW5vIDxzdGV2ZStweXRob25AcGVhcndvb2QuaW5mbz4KKy4uIHNlY3Rpb25hdXRob3I6OiBTdGV2ZW4gRCdBcHJhbm8gPHN0ZXZlK3B5dGhvbkBwZWFyd29vZC5pbmZvPgorLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIHRlc3RzZXR1cDo6CisKKyAgIGZyb20gc2VjcmV0cyBpbXBvcnQgKgorICAgX19uYW1lX18gPSAnPGRvY3Rlc3Q+JworCisqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9zZWNyZXRzLnB5YAorCistLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcKK3JhbmRvbSBudW1iZXJzIHN1aXRhYmxlIGZvciBtYW5hZ2luZyBkYXRhIHN1Y2ggYXMgcGFzc3dvcmRzLCBhY2NvdW50CithdXRoZW50aWNhdGlvbiwgc2VjdXJpdHkgdG9rZW5zLCBhbmQgcmVsYXRlZCBzZWNyZXRzLgorCitJbiBwYXJ0aWN1bGFybHksIDptb2Q6YHNlY3JldHNgIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gdGhlCitkZWZhdWx0IHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbiB0aGUgOm1vZDpgcmFuZG9tYCBtb2R1bGUsIHdoaWNoCitpcyBkZXNpZ25lZCBmb3IgbW9kZWxsaW5nIGFuZCBzaW11bGF0aW9uLCBub3Qgc2VjdXJpdHkgb3IgY3J5cHRvZ3JhcGh5LgorCisuLiBzZWVhbHNvOjoKKworICAgOnBlcDpgNTA2YAorCisKK1JhbmRvbSBudW1iZXJzCistLS0tLS0tLS0tLS0tLQorCitUaGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbW9zdCBzZWN1cmUgc291cmNlIG9mCityYW5kb21uZXNzIHRoYXQgeW91ciBvcGVyYXRpbmcgc3lzdGVtIHByb3ZpZGVzLgorCisuLiBjbGFzczo6IFN5c3RlbVJhbmRvbQorCisgICBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzIHVzaW5nIHRoZSBoaWdoZXN0LXF1YWxpdHkKKyAgIHNvdXJjZXMgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTZWUKKyAgIDpjbGFzczpgcmFuZG9tLlN5c3RlbVJhbmRvbWAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKworLi4gZnVuY3Rpb246OiBjaG9pY2Uoc2VxdWVuY2UpCisKKyAgIFJldHVybiBhIHJhbmRvbWx5LWNob3NlbiBlbGVtZW50IGZyb20gYSBub24tZW1wdHkgc2VxdWVuY2UuCisKKy4uIGZ1bmN0aW9uOjogcmFuZGJlbG93KG4pCisKKyAgIFJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLCAqbiopLgorCisuLiBmdW5jdGlvbjo6IHJhbmRiaXRzKGspCisKKyAgIFJldHVybiBhbiBpbnQgd2l0aCAqayogcmFuZG9tIGJpdHMuCisKKworR2VuZXJhdGluZyB0b2tlbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHNlY3VyZQordG9rZW5zLCBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXRzLAoraGFyZC10by1ndWVzcyBVUkxzLCBhbmQgc2ltaWxhci4KKworLi4gZnVuY3Rpb246OiB0b2tlbl9ieXRlcyhbbmJ5dGVzPU5vbmVdKQorCisgICBSZXR1cm4gYSByYW5kb20gYnl0ZSBzdHJpbmcgY29udGFpbmluZyAqbmJ5dGVzKiBudW1iZXIgb2YgYnl0ZXMuCisgICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzCisgICB1c2VkLgorCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IHRva2VuX2J5dGVzKDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAgIGInXHhlYnJceDE3RCp0XHhhZVx4ZDRceGUzU1x4YjZceGUyXHhlYlAxXHg4YicKKworCisuLiBmdW5jdGlvbjo6IHRva2VuX2hleChbbmJ5dGVzPU5vbmVdKQorCisgICBSZXR1cm4gYSByYW5kb20gdGV4dCBzdHJpbmcsIGluIGhleGFkZWNpbWFsLiAgVGhlIHN0cmluZyBoYXMgKm5ieXRlcyoKKyAgIHJhbmRvbSBieXRlcywgZWFjaCBieXRlIGNvbnZlcnRlZCB0byB0d28gaGV4IGRpZ2l0cy4gIElmICpuYnl0ZXMqIGlzCisgICBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5faGV4KDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAgICdmOWJmNzhiOWExOGNlNmQ0NmEwY2QyYjBiODZkZjlkYScKKworLi4gZnVuY3Rpb246OiB0b2tlbl91cmxzYWZlKFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSBVUkwtc2FmZSB0ZXh0IHN0cmluZywgY29udGFpbmluZyAqbmJ5dGVzKiByYW5kb20KKyAgIGJ5dGVzLiAgVGhlIHRleHQgaXMgQmFzZTY0IGVuY29kZWQsIHNvIG9uIGF2ZXJhZ2UgZWFjaCBieXRlIHJlc3VsdHMKKyAgIGluIGFwcHJveGltYXRlbHkgMS4zIGNoYXJhY3RlcnMuICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3QKKyAgIHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IHRva2VuX3VybHNhZmUoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgJ0RybWh6ZTZFUGN2MGZOXzgxQmotbkEnCisKKworSG93IG1hbnkgYnl0ZXMgc2hvdWxkIHRva2VucyB1c2U/CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVG8gYmUgc2VjdXJlIGFnYWluc3QKK2BicnV0ZS1mb3JjZSBhdHRhY2tzIDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcnV0ZS1mb3JjZV9hdHRhY2s+YF8sCit0b2tlbnMgbmVlZCB0byBoYXZlIHN1ZmZpY2llbnQgcmFuZG9tbmVzcy4gIFVuZm9ydHVuYXRlbHksIHdoYXQgaXMKK2NvbnNpZGVyZWQgc3VmZmljaWVudCB3aWxsIG5lY2Vzc2FyaWx5IGluY3JlYXNlIGFzIGNvbXB1dGVycyBnZXQgbW9yZQorcG93ZXJmdWwgYW5kIGFibGUgdG8gbWFrZSBtb3JlIGd1ZXNzZXMgaW4gYSBzaG9ydGVyIHBlcmlvZC4gIEFzIG9mIDIwMTUsCitpdCBpcyBiZWxpZXZlZCB0aGF0IDMyIGJ5dGVzICgyNTYgYml0cykgb2YgcmFuZG9tbmVzcyBpcyBzdWZmaWNpZW50IGZvcgordGhlIHR5cGljYWwgdXNlLWNhc2UgZXhwZWN0ZWQgZm9yIHRoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUuCisKK0ZvciB0aG9zZSB3aG8gd2FudCB0byBtYW5hZ2UgdGhlaXIgb3duIHRva2VuIGxlbmd0aCwgeW91IGNhbiBleHBsaWNpdGx5CitzcGVjaWZ5IGhvdyBtdWNoIHJhbmRvbW5lc3MgaXMgdXNlZCBmb3IgdG9rZW5zIGJ5IGdpdmluZyBhbiA6Y2xhc3M6YGludGAKK2FyZ3VtZW50IHRvIHRoZSB2YXJpb3VzIGBgdG9rZW5fKmBgIGZ1bmN0aW9ucy4gIFRoYXQgYXJndW1lbnQgaXMgdGFrZW4KK2FzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcmFuZG9tbmVzcyB0byB1c2UuCisKK090aGVyd2lzZSwgaWYgbm8gYXJndW1lbnQgaXMgcHJvdmlkZWQsIG9yIGlmIHRoZSBhcmd1bWVudCBpcyBgYE5vbmVgYCwKK3RoZSBgYHRva2VuXypgYCBmdW5jdGlvbnMgd2lsbCB1c2UgYSByZWFzb25hYmxlIGRlZmF1bHQgaW5zdGVhZC4KKworLi4gbm90ZTo6CisKKyAgIFRoYXQgZGVmYXVsdCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZSwgaW5jbHVkaW5nIGR1cmluZworICAgbWFpbnRlbmFuY2UgcmVsZWFzZXMuCisKKworT3RoZXIgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0KKworLi4gZnVuY3Rpb246OiBjb21wYXJlX2RpZ2VzdChhLCBiKQorCisgICBSZXR1cm4gYGBUcnVlYGAgaWYgc3RyaW5ncyAqYSogYW5kICpiKiBhcmUgZXF1YWwsIG90aGVyd2lzZSBgYEZhbHNlYGAsCisgICBpbiBzdWNoIGEgd2F5IGFzIHRvIHJlZHVjZSB0aGUgcmlzayBvZgorICAgYHRpbWluZyBhdHRhY2tzIDxodHRwOi8vY29kYWhhbGUuY29tL2EtbGVzc29uLWluLXRpbWluZy1hdHRhY2tzLz5gXy4KKyAgIFNlZSA6ZnVuYzpgaG1hYy5jb21wYXJlX2RpZ2VzdGAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKworCitSZWNpcGVzIGFuZCBiZXN0IHByYWN0aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIHNob3dzIHJlY2lwZXMgYW5kIGJlc3QgcHJhY3RpY2VzIGZvciB1c2luZyA6bW9kOmBzZWNyZXRzYAordG8gbWFuYWdlIGEgYmFzaWMgbGV2ZWwgb2Ygc2VjdXJpdHkuCisKK0dlbmVyYXRlIGFuIGVpZ2h0LWNoYXJhY3RlciBhbHBoYW51bWVyaWMgcGFzc3dvcmQ6CisKKy4uIHRlc3Rjb2RlOjoKKworICAgaW1wb3J0IHN0cmluZworICAgYWxwaGFiZXQgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMKKyAgIHBhc3N3b3JkID0gJycuam9pbihjaG9pY2UoYWxwaGFiZXQpIGZvciBpIGluIHJhbmdlKDgpKQorCisKKy4uIG5vdGU6OgorCisgICBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdAorICAgYHN0b3JlIHBhc3N3b3JkcyBpbiBhIHJlY292ZXJhYmxlIGZvcm1hdCA8aHR0cDovL2N3ZS5taXRyZS5vcmcvZGF0YS9kZWZpbml0aW9ucy8yNTcuaHRtbD5gXywKKyAgIHdoZXRoZXIgcGxhaW4gdGV4dCBvciBlbmNyeXB0ZWQuICBUaGV5IHNob3VsZCBiZSBzYWx0ZWQgYW5kIGhhc2hlZAorICAgdXNpbmcgYSBjcnlwdG9ncmFwaGljYWxseS1zdHJvbmcgb25lLXdheSAoaXJyZXZlcnNpYmxlKSBoYXNoIGZ1bmN0aW9uLgorCisKK0dlbmVyYXRlIGEgdGVuLWNoYXJhY3RlciBhbHBoYW51bWVyaWMgcGFzc3dvcmQgd2l0aCBhdCBsZWFzdCBvbmUKK2xvd2VyY2FzZSBjaGFyYWN0ZXIsIGF0IGxlYXN0IG9uZSB1cHBlcmNhc2UgY2hhcmFjdGVyLCBhbmQgYXQgbGVhc3QKK3RocmVlIGRpZ2l0czoKKworLi4gdGVzdGNvZGU6OgorCisgICBpbXBvcnQgc3RyaW5nCisgICBhbHBoYWJldCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cworICAgd2hpbGUgVHJ1ZToKKyAgICAgICBwYXNzd29yZCA9ICcnLmpvaW4oY2hvaWNlKGFscGhhYmV0KSBmb3IgaSBpbiByYW5nZSgxMCkpCisgICAgICAgaWYgKGFueShjLmlzbG93ZXIoKSBmb3IgYyBpbiBwYXNzd29yZCkKKyAgICAgICAgICAgICAgIGFuZCBhbnkoYy5pc3VwcGVyKCkgZm9yIGMgaW4gcGFzc3dvcmQpCisgICAgICAgICAgICAgICBhbmQgc3VtKGMuaXNkaWdpdCgpIGZvciBjIGluIHBhc3N3b3JkKSA+PSAzKToKKyAgICAgICAgICAgYnJlYWsKKworCitHZW5lcmF0ZSBhbiBgWEtDRC1zdHlsZSBwYXNzcGhyYXNlIDxodHRwOi8veGtjZC5jb20vOTM2Lz5gXzoKKworLi4gdGVzdGNvZGU6OgorCisgICAjIE9uIHN0YW5kYXJkIExpbnV4IHN5c3RlbXMsIHVzZSBhIGNvbnZlbmllbnQgZGljdGlvbmFyeSBmaWxlLgorICAgIyBPdGhlciBwbGF0Zm9ybXMgbWF5IG5lZWQgdG8gcHJvdmlkZSB0aGVpciBvd24gd29yZC1saXN0LgorICAgd2l0aCBvcGVuKCcvdXNyL3NoYXJlL2RpY3Qvd29yZHMnKSBhcyBmOgorICAgICAgIHdvcmRzID0gW3dvcmQuc3RyaXAoKSBmb3Igd29yZCBpbiBmXQorICAgICAgIHBhc3N3b3JkID0gJyAnLmpvaW4oY2hvaWNlKHdvcmRzKSBmb3IgaSBpbiByYW5nZSg0KSkKKworCitHZW5lcmF0ZSBhIGhhcmQtdG8tZ3Vlc3MgdGVtcG9yYXJ5IFVSTCBjb250YWluaW5nIGEgc2VjdXJpdHkgdG9rZW4KK3N1aXRhYmxlIGZvciBwYXNzd29yZCByZWNvdmVyeSBhcHBsaWNhdGlvbnM6CisKKy4uIHRlc3Rjb2RlOjoKKworICAgdXJsID0gJ2h0dHBzOi8vbXlkb21haW4uY29tL3Jlc2V0PScgKyB0b2tlbl91cmxzYWZlKCkKKworCisKKy4uCisgICAjIFRoaXMgbW9kZWxpbmUgbXVzdCBhcHBlYXIgd2l0aGluIHRoZSBsYXN0IHRlbiBsaW5lcyBvZiB0aGUgZmlsZS4KKyAgIGthdGU6IGluZGVudC13aWR0aCAzOyByZW1vdmUtdHJhaWxpbmctc3BhY2Ugb247IHJlcGxhY2UtdGFicyBvbjsgZW5jb2RpbmcgdXRmLTg7CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zaXRlLnJzdCBiL0RvYy9saWJyYXJ5L3NpdGUucnN0CmluZGV4IDBhNzNmNWEuLjQzZGFmNzkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NpdGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NpdGUucnN0CkBAIC01Miw3ICs1Miw4IEBACiBBIHBhdGggY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgZmlsZSB3aG9zZSBuYW1lIGhhcyB0aGUgZm9ybSA6ZmlsZTpge25hbWV9LnB0aGAKIGFuZCBleGlzdHMgaW4gb25lIG9mIHRoZSBmb3VyIGRpcmVjdG9yaWVzIG1lbnRpb25lZCBhYm92ZTsgaXRzIGNvbnRlbnRzIGFyZQogYWRkaXRpb25hbCBpdGVtcyAob25lIHBlciBsaW5lKSB0byBiZSBhZGRlZCB0byBgYHN5cy5wYXRoYGAuICBOb24tZXhpc3RpbmcgaXRlbXMKLWFyZSBuZXZlciBhZGRlZCB0byBgYHN5cy5wYXRoYGAuICBObyBpdGVtIGlzIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCBtb3JlIHRoYW4KK2FyZSBuZXZlciBhZGRlZCB0byBgYHN5cy5wYXRoYGAsIGFuZCBubyBjaGVjayBpcyBtYWRlIHRoYXQgdGhlIGl0ZW0gcmVmZXJzIHRvIGEKK2RpcmVjdG9yeSByYXRoZXIgdGhhbiBhIGZpbGUuICBObyBpdGVtIGlzIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCBtb3JlIHRoYW4KIG9uY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHNraXBwZWQuICBMaW5lcyBzdGFydGluZwogd2l0aCBgYGltcG9ydGBgIChmb2xsb3dlZCBieSBzcGFjZSBvciB0YWIpIGFyZSBleGVjdXRlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc29ja2V0LnJzdCBiL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKaW5kZXggYzA5OTI3Yy4uY2Q2ZTMxMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc29ja2V0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CkBAIC04NjgsNiArODY4LDEwIEBACiAgICBpdCBpcyByZWNvbW1lbmRlZCB0byA6bWV0aDpgY2xvc2VgIHRoZW0gZXhwbGljaXRseSwgb3IgdG8gdXNlIGEKICAgIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQgYXJvdW5kIHRoZW0uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6ZXhjOmBPU0Vycm9yYCBpcyBub3cgcmFpc2VkIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIHRoZSB1bmRlcmx5aW5nCisgICAgICA6YzpmdW5jOmBjbG9zZWAgY2FsbCBpcyBtYWRlLgorCiAgICAuLiBub3RlOjoKIAogICAgICAgOm1ldGg6YGNsb3NlKClgIHJlbGVhc2VzIHRoZSByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBjb25uZWN0aW9uIGJ1dApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKaW5kZXggZjBjZmM4MC4uZTE0OGQzMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CkBAIC01MiwxMSArNTIsMTIgQEAKIG92ZXJyaWRpbmcgaXRzIDptZXRoOmB+QmFzZVJlcXVlc3RIYW5kbGVyLmhhbmRsZWAgbWV0aG9kOwogdGhpcyBtZXRob2Qgd2lsbCBwcm9jZXNzIGluY29taW5nCiByZXF1ZXN0cy4gIFNlY29uZCwgeW91IG11c3QgaW5zdGFudGlhdGUgb25lIG9mIHRoZSBzZXJ2ZXIgY2xhc3NlcywgcGFzc2luZyBpdAotdGhlIHNlcnZlcidzIGFkZHJlc3MgYW5kIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuICBUaGVuIGNhbGwgdGhlCit0aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCit0aGUgc2VydmVyIGluIGEgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudC4gVGhlbiBjYWxsIHRoZQogOm1ldGg6YH5CYXNlU2VydmVyLmhhbmRsZV9yZXF1ZXN0YCBvcgogOm1ldGg6YH5CYXNlU2VydmVyLnNlcnZlX2ZvcmV2ZXJgIG1ldGhvZCBvZiB0aGUgc2VydmVyIG9iamVjdCB0bwogcHJvY2VzcyBvbmUgb3IgbWFueSByZXF1ZXN0cy4gIEZpbmFsbHksIGNhbGwgOm1ldGg6YH5CYXNlU2VydmVyLnNlcnZlcl9jbG9zZWAKLXRvIGNsb3NlIHRoZSBzb2NrZXQuCit0byBjbG9zZSB0aGUgc29ja2V0ICh1bmxlc3MgeW91IHVzZWQgYSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50KS4KIAogV2hlbiBpbmhlcml0aW5nIGZyb20gOmNsYXNzOmBUaHJlYWRpbmdNaXhJbmAgZm9yIHRocmVhZGVkIGNvbm5lY3Rpb24gYmVoYXZpb3IsCiB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgZGVjbGFyZSBob3cgeW91IHdhbnQgeW91ciB0aHJlYWRzIHRvIGJlaGF2ZSBvbiBhbiBhYnJ1cHQKQEAgLTMwNCw3ICszMDUsMTEgQEAKICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHRoZSA6bWV0aDpgfkJhc2VSZXF1ZXN0SGFuZGxlci5oYW5kbGVgCiAgICAgICBtZXRob2Qgb2YgYSA6YXR0cjpgUmVxdWVzdEhhbmRsZXJDbGFzc2AgaW5zdGFuY2UgcmFpc2VzCiAgICAgICBhbiBleGNlcHRpb24uICBUaGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gcHJpbnQgdGhlIHRyYWNlYmFjayB0bwotICAgICAgc3RhbmRhcmQgb3V0cHV0IGFuZCBjb250aW51ZSBoYW5kbGluZyBmdXJ0aGVyIHJlcXVlc3RzLgorICAgICAgc3RhbmRhcmQgZXJyb3IgYW5kIGNvbnRpbnVlIGhhbmRsaW5nIGZ1cnRoZXIgcmVxdWVzdHMuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBOb3cgb25seSBjYWxsZWQgZm9yIGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSA6ZXhjOmBFeGNlcHRpb25gCisgICAgICAgICBjbGFzcy4KIAogCiAgICAuLiBtZXRob2Q6OiBoYW5kbGVfdGltZW91dCgpCkBAIC0zNDksNiArMzU0LDExIEBACiAgICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIDpjb25zdDpgVHJ1ZWAuCiAKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1cHBvcnQgZm9yIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbCB3YXMgYWRkZWQuICBFeGl0aW5nIHRoZQorICAgICAgY29udGV4dCBtYW5hZ2VyIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyA6bWV0aDpgc2VydmVyX2Nsb3NlYC4KKworCiBSZXF1ZXN0IEhhbmRsZXIgT2JqZWN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDI5LDExICs0MzksMTAgQEAKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKIAogICAgICAgICMgQ3JlYXRlIHRoZSBzZXJ2ZXIsIGJpbmRpbmcgdG8gbG9jYWxob3N0IG9uIHBvcnQgOTk5OQotICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVRDUEhhbmRsZXIpCi0KLSAgICAgICAjIEFjdGl2YXRlIHRoZSBzZXJ2ZXI7IHRoaXMgd2lsbCBrZWVwIHJ1bm5pbmcgdW50aWwgeW91Ci0gICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKLSAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCBQT1JUKSwgTXlUQ1BIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICMgQWN0aXZhdGUgdGhlIHNlcnZlcjsgdGhpcyB3aWxsIGtlZXAgcnVubmluZyB1bnRpbCB5b3UKKyAgICAgICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBBbiBhbHRlcm5hdGl2ZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MgdGhhdCBtYWtlcyB1c2Ugb2Ygc3RyZWFtcyAoZmlsZS1saWtlCiBvYmplY3RzIHRoYXQgc2ltcGxpZnkgY29tbXVuaWNhdGlvbiBieSBwcm92aWRpbmcgdGhlIHN0YW5kYXJkIGZpbGUgaW50ZXJmYWNlKTo6CkBAIC01MjUsOCArNTM0LDggQEAKIAogICAgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKLSAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVURQU2VydmVyKChIT1NULCBQT1JUKSwgTXlVRFBIYW5kbGVyKQotICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICB3aXRoIHNvY2tldHNlcnZlci5VRFBTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVVEUEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBUaGlzIGlzIHRoZSBjbGllbnQgc2lkZTo6CiAKQEAgLTU4OCwyMiArNTk3LDIyIEBACiAgICAgICAgSE9TVCwgUE9SVCA9ICJsb2NhbGhvc3QiLCAwCiAKICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZFRDUFNlcnZlcigoSE9TVCwgUE9SVCksIFRocmVhZGVkVENQUmVxdWVzdEhhbmRsZXIpCi0gICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKKyAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKIAotICAgICAgICMgU3RhcnQgYSB0aHJlYWQgd2l0aCB0aGUgc2VydmVyIC0tIHRoYXQgdGhyZWFkIHdpbGwgdGhlbiBzdGFydCBvbmUKLSAgICAgICAjIG1vcmUgdGhyZWFkIGZvciBlYWNoIHJlcXVlc3QKLSAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCi0gICAgICAgIyBFeGl0IHRoZSBzZXJ2ZXIgdGhyZWFkIHdoZW4gdGhlIG1haW4gdGhyZWFkIHRlcm1pbmF0ZXMKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLmRhZW1vbiA9IFRydWUKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKLSAgICAgICBwcmludCgiU2VydmVyIGxvb3AgcnVubmluZyBpbiB0aHJlYWQ6Iiwgc2VydmVyX3RocmVhZC5uYW1lKQorICAgICAgICAgICAjIFN0YXJ0IGEgdGhyZWFkIHdpdGggdGhlIHNlcnZlciAtLSB0aGF0IHRocmVhZCB3aWxsIHRoZW4gc3RhcnQgb25lCisgICAgICAgICAgICMgbW9yZSB0aHJlYWQgZm9yIGVhY2ggcmVxdWVzdAorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCisgICAgICAgICAgICMgRXhpdCB0aGUgc2VydmVyIHRocmVhZCB3aGVuIHRoZSBtYWluIHRocmVhZCB0ZXJtaW5hdGVzCisgICAgICAgICAgIHNlcnZlcl90aHJlYWQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgcHJpbnQoIlNlcnZlciBsb29wIHJ1bm5pbmcgaW4gdGhyZWFkOiIsIHNlcnZlcl90aHJlYWQubmFtZSkKIAotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDEiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDIiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQorICAgICAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAxIikKKyAgICAgICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMiIpCisgICAgICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQogCi0gICAgICAgc2VydmVyLnNodXRkb3duKCkKLSAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgICAgc2VydmVyLnNodXRkb3duKCkKIAogCiBUaGUgb3V0cHV0IG9mIHRoZSBleGFtcGxlIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3B3ZC5yc3QgYi9Eb2MvbGlicmFyeS9zcHdkLnJzdAppbmRleCA1OGJlNzhmLi41M2Y4YzA5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zcHdkLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zcHdkLnJzdApAQCAtNTQsNiArNTQsOSBAQAogCiAgICBSZXR1cm4gdGhlIHNoYWRvdyBwYXNzd29yZCBkYXRhYmFzZSBlbnRyeSBmb3IgdGhlIGdpdmVuIHVzZXIgbmFtZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFJhaXNlcyBhIDpleGM6YFBlcm1pc3Npb25FcnJvcmAgaW5zdGVhZCBvZiA6ZXhjOmBLZXlFcnJvcmAgaWYgdGhlIHVzZXIKKyAgICAgIGRvZXNuJ3QgaGF2ZSBwcml2aWxlZ2VzLgogCiAuLiBmdW5jdGlvbjo6IGdldHNwYWxsKCkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0IGIvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CmluZGV4IDFhMWI3NGMuLjQzYTNjZGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKQEAgLTE0NTAsOCArMTQ1MCw4IEBACiAKICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBgYHN0cmBgIGNsYXNzIGFuZCBpdHMgbWV0aG9kcywgc2VlCiAgICA6cmVmOmB0ZXh0c2VxYCBhbmQgdGhlIDpyZWY6YHN0cmluZy1tZXRob2RzYCBzZWN0aW9uIGJlbG93LiAgVG8gb3V0cHV0Ci0gICBmb3JtYXR0ZWQgc3RyaW5ncywgc2VlIHRoZSA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9uLiAgSW4gYWRkaXRpb24sCi0gICBzZWUgdGhlIDpyZWY6YHN0cmluZ3NlcnZpY2VzYCBzZWN0aW9uLgorICAgZm9ybWF0dGVkIHN0cmluZ3MsIHNlZSB0aGUgOnJlZjpgZi1zdHJpbmdzYCBhbmQgOnJlZjpgZm9ybWF0c3RyaW5nc2AKKyAgIHNlY3Rpb25zLiAgSW4gYWRkaXRpb24sIHNlZSB0aGUgOnJlZjpgc3RyaW5nc2VydmljZXNgIHNlY3Rpb24uCiAKIAogLi4gaW5kZXg6OgpAQCAtMjA1Myw4ICsyMDUzLDggQEAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogZm9ybWF0dGluZywgc3RyaW5nICglKQogICAgc2luZ2xlOiBpbnRlcnBvbGF0aW9uLCBzdHJpbmcgKCUpCi0gICBzaW5nbGU6IHN0cmluZzsgZm9ybWF0dGluZwotICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRpb24KKyAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0aW5nLCBwcmludGYKKyAgIHNpbmdsZTogc3RyaW5nOyBpbnRlcnBvbGF0aW9uLCBwcmludGYKICAgIHNpbmdsZTogcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcKICAgIHNpbmdsZTogc3ByaW50Zi1zdHlsZSBmb3JtYXR0aW5nCiAgICBzaW5nbGU6ICUgZm9ybWF0dGluZwpAQCAtMjA2NCw5ICsyMDY0LDEwIEBACiAKICAgIFRoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGhlcmUgZXhoaWJpdCBhIHZhcmlldHkgb2YgcXVpcmtzIHRoYXQKICAgIGxlYWQgdG8gYSBudW1iZXIgb2YgY29tbW9uIGVycm9ycyAoc3VjaCBhcyBmYWlsaW5nIHRvIGRpc3BsYXkgdHVwbGVzIGFuZAotICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOm1ldGg6YHN0ci5mb3JtYXRgIGludGVyZmFjZQotICAgaGVscHMgYXZvaWQgdGhlc2UgZXJyb3JzLCBhbmQgYWxzbyBwcm92aWRlcyBhIGdlbmVyYWxseSBtb3JlIHBvd2VyZnVsLAotICAgZmxleGlibGUgYW5kIGV4dGVuc2libGUgYXBwcm9hY2ggdG8gZm9ybWF0dGluZyB0ZXh0LgorICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOnJlZjpgZm9ybWF0dGVkCisgICBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIG9yIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgaW50ZXJmYWNlCisgICBoZWxwcyBhdm9pZCB0aGVzZSBlcnJvcnMuICBUaGVzZSBhbHRlcm5hdGl2ZXMgYWxzbyBwcm92aWRlIG1vcmUgcG93ZXJmdWwsCisgICBmbGV4aWJsZSBhbmQgZXh0ZW5zaWJsZSBhcHByb2FjaGVzIHRvIGZvcm1hdHRpbmcgdGV4dC4KIAogU3RyaW5nIG9iamVjdHMgaGF2ZSBvbmUgdW5pcXVlIGJ1aWx0LWluIG9wZXJhdGlvbjogdGhlIGBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLgogVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmcgKmZvcm1hdHRpbmcqIG9yICppbnRlcnBvbGF0aW9uKiBvcGVyYXRvci4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QgYi9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CmluZGV4IDFkYTBjNjcuLjRlYjJkYjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdApAQCAtMTg4LDcgKzE4OCw5IEBACiAKIFRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIGFuZCB0aGUgOmNsYXNzOmBGb3JtYXR0ZXJgIGNsYXNzIHNoYXJlIHRoZSBzYW1lCiBzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiA6Y2xhc3M6YEZvcm1hdHRlcmAsCi1zdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4KK3N1YmNsYXNzZXMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0IHN0cmluZyBzeW50YXgpLiAgVGhlIHN5bnRheCBpcworcmVsYXRlZCB0byB0aGF0IG9mIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gLCBidXQKK3RoZXJlIGFyZSBkaWZmZXJlbmNlcy4KIAogRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcyBgYHt9YGAuCiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbCB0ZXh0LCB3aGljaCBpcwpAQCAtMjgzLDcgKzI4NSw4IEBACiAKICJGb3JtYXQgc3BlY2lmaWNhdGlvbnMiIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkIHdpdGhpbiBhCiBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZCAoc2VlCi06cmVmOmBmb3JtYXRzdHJpbmdzYCkuICBUaGV5IGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgYnVpbHQtaW4KKzpyZWY6YGZvcm1hdHN0cmluZ3NgIGFuZCA6cmVmOmBmLXN0cmluZ3NgKS4KK1RoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbgogOmZ1bmM6YGZvcm1hdGAgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3cgdGhlIGZvcm1hdAogc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC4KIApAQCAtMzA4LDcgKzMxMSw4IEBACiBJZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSAqZmlsbCoKIGNoYXJhY3RlciB0aGF0IGNhbiBiZSBhbnkgY2hhcmFjdGVyIGFuZCBkZWZhdWx0cyB0byBhIHNwYWNlIGlmIG9taXR0ZWQuCiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgbGl0ZXJhbCBjdXJseSBicmFjZSAoImBge2BgIiBvciAiYGB9YGAiKSBhcwotdGhlICpmaWxsKiBjaGFyYWN0ZXIgd2hlbiB1c2luZyB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgCit0aGUgKmZpbGwqIGNoYXJhY3RlciBpbiBhIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbAorPGYtc3RyaW5ncz5gIG9yIHdoZW4gdXNpbmcgdGhlIDptZXRoOmBzdHIuZm9ybWF0YAogbWV0aG9kLiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IGEgY3VybHkgYnJhY2UKIHdpdGggYSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGQuICBUaGlzIGxpbWl0YXRpb24gZG9lc24ndAogYWZmZWN0IHRoZSA6ZnVuYzpgZm9ybWF0YCBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N5cy5yc3QgYi9Eb2MvbGlicmFyeS9zeXMucnN0CmluZGV4IDM2ZThlZTQuLjM0OTQ3ZjggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N5cy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3lzLnJzdApAQCAtMjU1LDcgKzI1NSw3IEBACiAgICAoZGVmYXVsdGluZyB0byB6ZXJvKSwgb3IgYW5vdGhlciB0eXBlIG9mIG9iamVjdC4gIElmIGl0IGlzIGFuIGludGVnZXIsIHplcm8KICAgIGlzIGNvbnNpZGVyZWQgInN1Y2Nlc3NmdWwgdGVybWluYXRpb24iIGFuZCBhbnkgbm9uemVybyB2YWx1ZSBpcyBjb25zaWRlcmVkCiAgICAiYWJub3JtYWwgdGVybWluYXRpb24iIGJ5IHNoZWxscyBhbmQgdGhlIGxpa2UuICBNb3N0IHN5c3RlbXMgcmVxdWlyZSBpdCB0byBiZQotICAgaW4gdGhlIHJhbmdlIDAtMTI3LCBhbmQgcHJvZHVjZSB1bmRlZmluZWQgcmVzdWx0cyBvdGhlcndpc2UuICBTb21lIHN5c3RlbXMKKyAgIGluIHRoZSByYW5nZSAwLS0xMjcsIGFuZCBwcm9kdWNlIHVuZGVmaW5lZCByZXN1bHRzIG90aGVyd2lzZS4gIFNvbWUgc3lzdGVtcwogICAgaGF2ZSBhIGNvbnZlbnRpb24gZm9yIGFzc2lnbmluZyBzcGVjaWZpYyBtZWFuaW5ncyB0byBzcGVjaWZpYyBleGl0IGNvZGVzLCBidXQKICAgIHRoZXNlIGFyZSBnZW5lcmFsbHkgdW5kZXJkZXZlbG9wZWQ7IFVuaXggcHJvZ3JhbXMgZ2VuZXJhbGx5IHVzZSAyIGZvciBjb21tYW5kCiAgICBsaW5lIHN5bnRheCBlcnJvcnMgYW5kIDEgZm9yIGFsbCBvdGhlciBraW5kIG9mIGVycm9ycy4gIElmIGFub3RoZXIgdHlwZSBvZgpAQCAtMjY4LDYgKzI2OCwxMSBAQAogICAgdGhlIHByb2Nlc3Mgd2hlbiBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIGFuZCB0aGUgZXhjZXB0aW9uIGlzIG5vdAogICAgaW50ZXJjZXB0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIGNsZWFudXAgYWZ0ZXIgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgaGFzIGNhdWdodCA6ZXhjOmBTeXN0ZW1FeGl0YCAoc3VjaCBhcyBhbiBlcnJvciBmbHVzaGluZyBidWZmZXJlZCBkYXRhCisgICAgICBpbiB0aGUgc3RhbmRhcmQgc3RyZWFtcyksIHRoZSBleGl0IHN0YXR1cyBpcyBjaGFuZ2VkIHRvIDEyMC4KKwogCiAuLiBkYXRhOjogZmxhZ3MKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdCBiL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKaW5kZXggNTM1YWM1NC4uNDdmMzkwMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CkBAIC0xNjMsNyArMTYzLDcgQEAKIC4uIGZ1bmN0aW9uOjogZ2V0X3B5dGhvbl92ZXJzaW9uKCkKIAogICAgUmV0dXJuIHRoZSBgYE1BSk9SLk1JTk9SYGAgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGFzIGEgc3RyaW5nLiAgU2ltaWxhciB0bwotICAgYGBzeXMudmVyc2lvbls6M11gYC4KKyAgIGBgJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdYGAuCiAKIAogLi4gZnVuY3Rpb246OiBnZXRfcGxhdGZvcm0oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdCBiL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKaW5kZXggNDA0MGY3Mi4uY2U0MDZjYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CkBAIC00Myw2ICs0MywxNyBAQAogICAgOmV4YzpgRU9GRXJyb3JgIHdoZW4gdGhlIGVuZCBvZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkLCBiZWNhdXNlIHRoZXkgY2FuIHJldHVybgogICAgYW4gZW1wdHkgc3RyaW5nIGZvciBvdGhlciByZWFzb25zLiAgU2VlIHRoZSBpbmRpdmlkdWFsIGRlc2NyaXB0aW9ucyBiZWxvdy4KIAorICAgQSA6Y2xhc3M6YFRlbG5ldGAgb2JqZWN0IGlzIGEgY29udGV4dCBtYW5hZ2VyIGFuZCBjYW4gYmUgdXNlZCBpbiBhCisgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LiAgV2hlbiB0aGUgOmtleXdvcmQ6YHdpdGhgIGJsb2NrIGVuZHMsIHRoZQorICAgOm1ldGg6YGNsb3NlYCBtZXRob2QgaXMgY2FsbGVkOjoKKworICAgICAgID4+PiBmcm9tIHRlbG5ldGxpYiBpbXBvcnQgVGVsbmV0CisgICAgICAgPj4+IHdpdGggVGVsbmV0KCdsb2NhbGhvc3QnLCAyMykgYXMgdG46CisgICAgICAgLi4uICAgICB0bi5pbnRlcmFjdCgpCisgICAgICAgLi4uCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42IENvbnRleHQgbWFuYWdlciBzdXBwb3J0IGFkZGVkCisKIAogLi4gc2VlYWxzbzo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Rlc3QucnN0IGIvRG9jL2xpYnJhcnkvdGVzdC5yc3QKaW5kZXggZGIyZGExYi4uNmQxZmZiOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGVzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGVzdC5yc3QKQEAgLTU4MCw2ICs1ODAsNDggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCiAKKy4uIGZ1bmN0aW9uOjogY2hlY2tfX2FsbF9fKHRlc3RfY2FzZSwgbW9kdWxlLCBuYW1lX29mX21vZHVsZT1Ob25lLCBleHRyYT0oKSwgYmxhY2tsaXN0PSgpKQorCisgICBBc3NlcnQgdGhhdCB0aGUgYGBfX2FsbF9fYGAgdmFyaWFibGUgb2YgKm1vZHVsZSogY29udGFpbnMgYWxsIHB1YmxpYyBuYW1lcy4KKworICAgVGhlIG1vZHVsZSdzIHB1YmxpYyBuYW1lcyAoaXRzIEFQSSkgYXJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkKKyAgIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBtYXRjaCB0aGUgcHVibGljIG5hbWUgY29udmVudGlvbiBhbmQgd2VyZSBkZWZpbmVkIGluCisgICAqbW9kdWxlKi4KKworICAgVGhlICpuYW1lX29mX21vZHVsZSogYXJndW1lbnQgY2FuIHNwZWNpZnkgKGFzIGEgc3RyaW5nIG9yIHR1cGxlIHRoZXJlb2YpIHdoYXQKKyAgIG1vZHVsZShzKSBhbiBBUEkgY291bGQgYmUgZGVmaW5lZCBpbiBpbiBvcmRlciB0byBiZSBkZXRlY3RlZCBhcyBhIHB1YmxpYworICAgQVBJLiBPbmUgY2FzZSBmb3IgdGhpcyBpcyB3aGVuICptb2R1bGUqIGltcG9ydHMgcGFydCBvZiBpdHMgcHVibGljIEFQSSBmcm9tCisgICBvdGhlciBtb2R1bGVzLCBwb3NzaWJseSBhIEMgYmFja2VuZCAobGlrZSBgYGNzdmBgIGFuZCBpdHMgYGBfY3N2YGApLgorCisgICBUaGUgKmV4dHJhKiBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCB3b3VsZG4ndCBvdGhlcndpc2UgYmUgYXV0b21hdGljYWxseQorICAgZGV0ZWN0ZWQgYXMgInB1YmxpYyIsIGxpa2Ugb2JqZWN0cyB3aXRob3V0IGEgcHJvcGVyIGBgX19tb2R1bGVfX2BgCisgICBhdHRyaWJ1dGUuIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG9uZXMuCisKKyAgIFRoZSAqYmxhY2tsaXN0KiBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCBtdXN0IG5vdCBiZSB0cmVhdGVkIGFzIHBhcnQgb2YKKyAgIHRoZSBwdWJsaWMgQVBJIGV2ZW4gdGhvdWdoIHRoZWlyIG5hbWVzIGluZGljYXRlIG90aGVyd2lzZS4KKworICAgRXhhbXBsZSB1c2U6OgorCisgICAgICBpbXBvcnQgYmFyCisgICAgICBpbXBvcnQgZm9vCisgICAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisgICAgICBjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZm9vKQorCisgICAgICBjbGFzcyBPdGhlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgIGV4dHJhID0geydCQVJfQ09OU1QnLCAnRk9PX0NPTlNUJ30KKyAgICAgICAgICAgICAgYmxhY2tsaXN0ID0geydiYXonfSAgIyBVbmRvY3VtZW50ZWQgbmFtZS4KKyAgICAgICAgICAgICAgIyBiYXIgaW1wb3J0cyBwYXJ0IG9mIGl0cyBBUEkgZnJvbSBfYmFyLgorICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBiYXIsICgnYmFyJywgJ19iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIFRoZSA6bW9kOmB0ZXN0LnN1cHBvcnRgIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKIAogLi4gY2xhc3M6OiBUcmFuc2llbnRSZXNvdXJjZShleGMsICoqa3dhcmdzKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGltZS5yc3QgYi9Eb2MvbGlicmFyeS90aW1lLnJzdAppbmRleCA4YjUzYmJiLi5jM2M3NWQ1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS90aW1lLnJzdApAQCAtNjM2LDExICs2MzYsMTEgQEAKICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyIHRvIEZlYnJ1YXJ5IDI5LgogCiAgICAgICA6c2FtcDpgTXttfS57bn0ue2R9YAotICAgICAgICAgVGhlICpkKid0aCBkYXkgKDAgPD0gKmQqIDw9IDYpIG9yIHdlZWsgKm4qIG9mIG1vbnRoICptKiBvZiB0aGUgeWVhciAoMQorICAgICAgICAgVGhlICpkKid0aCBkYXkgKDAgPD0gKmQqIDw9IDYpIG9mIHdlZWsgKm4qIG9mIG1vbnRoICptKiBvZiB0aGUgeWVhciAoMQogICAgICAgICAgPD0gKm4qIDw9IDUsIDEgPD0gKm0qIDw9IDEyLCB3aGVyZSB3ZWVrIDUgbWVhbnMgInRoZSBsYXN0ICpkKiBkYXkgaW4KICAgICAgICAgIG1vbnRoICptKiIgd2hpY2ggbWF5IG9jY3VyIGluIGVpdGhlciB0aGUgZm91cnRoIG9yIHRoZSBmaWZ0aAogICAgICAgICAgd2VlaykuIFdlZWsgMSBpcyB0aGUgZmlyc3Qgd2VlayBpbiB3aGljaCB0aGUgKmQqJ3RoIGRheSBvY2N1cnMuIERheQotICAgICAgICAgemVybyBpcyBTdW5kYXkuCisgICAgICAgICB6ZXJvIGlzIGEgU3VuZGF5LgogCiAgICAgICBgYHRpbWVgYCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGBgb2Zmc2V0YGAgZXhjZXB0IHRoYXQgbm8gbGVhZGluZyBzaWduCiAgICAgICAoJy0nIG9yICcrJykgaXMgYWxsb3dlZC4gVGhlIGRlZmF1bHQsIGlmIHRpbWUgaXMgbm90IGdpdmVuLCBpcyAwMjowMDowMC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdCBiL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdAppbmRleCA1ZmViMmQ5Li45ZDFjYjE3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0CkBAIC0zNTUsMTAgKzM1NSwzMiBAQAogICAgU2VlIGFsc28gdGhlIDpmdW5jOmBnZXRfb2JqZWN0X3RyYWNlYmFja2AgZnVuY3Rpb24uCiAKIAorRG9tYWluRmlsdGVyCiteXl5eXl5eXl5eXl4KKworLi4gY2xhc3M6OiBEb21haW5GaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBkb21haW46IGludCkKKworICAgRmlsdGVyIHRyYWNlcyBvZiBtZW1vcnkgYmxvY2tzIGJ5IHRoZWlyIGFkZHJlc3Mgc3BhY2UgKGRvbWFpbikuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKKworICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBtYXRjaCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgRmFsc2VgYCAoZXhjbHVkZSksIG1hdGNoIG1lbW9yeSBibG9ja3Mgbm90IGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGRvbWFpbgorCisgICAgICBBZGRyZXNzIHNwYWNlIG9mIGEgbWVtb3J5IGJsb2NrIChgYGludGBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgorCisKIEZpbHRlcgogXl5eXl5eCiAKLS4uIGNsYXNzOjogRmlsdGVyKGluY2x1c2l2ZTogYm9vbCwgZmlsZW5hbWVfcGF0dGVybjogc3RyLCBsaW5lbm86IGludD1Ob25lLCBhbGxfZnJhbWVzOiBib29sPUZhbHNlKQorLi4gY2xhc3M6OiBGaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBmaWxlbmFtZV9wYXR0ZXJuOiBzdHIsIGxpbmVubzogaW50PU5vbmUsIGFsbF9mcmFtZXM6IGJvb2w9RmFsc2UsIGRvbWFpbjogaW50PU5vbmUpCiAKICAgIEZpbHRlciBvbiB0cmFjZXMgb2YgbWVtb3J5IGJsb2Nrcy4KIApAQCAtMzc4LDkgKzQwMCwxNyBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIFRoZSBgYCcucHlvJ2BgIGZpbGUgZXh0ZW5zaW9uIGlzIG5vIGxvbmdlciByZXBsYWNlZCB3aXRoIGBgJy5weSdgYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSA6YXR0cjpgZG9tYWluYCBhdHRyaWJ1dGUuCisKKworICAgLi4gYXR0cmlidXRlOjogZG9tYWluCisKKyAgICAgIEFkZHJlc3Mgc3BhY2Ugb2YgYSBtZW1vcnkgYmxvY2sgKGBgaW50YGAgb3IgYGBOb25lYGApLgorCiAgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKIAotICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBvbmx5IHRyYWNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYFRydWVgYCAoaW5jbHVkZSksIG9ubHkgbWF0Y2ggbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQKICAgICAgIGluIGEgZmlsZSB3aXRoIGEgbmFtZSBtYXRjaGluZyA6YXR0cjpgZmlsZW5hbWVfcGF0dGVybmAgYXQgbGluZSBudW1iZXIKICAgICAgIDphdHRyOmBsaW5lbm9gLgogCkBAIC0zOTUsNyArNDI1LDcgQEAKIAogICAgLi4gYXR0cmlidXRlOjogZmlsZW5hbWVfcGF0dGVybgogCi0gICAgICBGaWxlbmFtZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgKGBgc3RyYGApLgorICAgICAgRmlsZW5hbWUgcGF0dGVybiBvZiB0aGUgZmlsdGVyIChgYHN0cmBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgogCiAgICAuLiBhdHRyaWJ1dGU6OiBhbGxfZnJhbWVzCiAKQEAgLTQ1OCwxNCArNDg4LDE3IEBACiAgICAuLiBtZXRob2Q6OiBmaWx0ZXJfdHJhY2VzKGZpbHRlcnMpCiAKICAgICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgOmF0dHI6YHRyYWNlc2AKLSAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyoKLSAgICAgIGlzIGFuIGVtcHR5IGxpc3QsIHJldHVybiBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZgotICAgICAgdGhlIHRyYWNlcy4KKyAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRG9tYWluRmlsdGVyYCBhbmQKKyAgICAgIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyogaXMgYW4gZW1wdHkgbGlzdCwgcmV0dXJuIGEgbmV3CisgICAgICA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZiB0aGUgdHJhY2VzLgogCiAgICAgICBBbGwgaW5jbHVzaXZlIGZpbHRlcnMgYXJlIGFwcGxpZWQgYXQgb25jZSwgYSB0cmFjZSBpcyBpZ25vcmVkIGlmIG5vCiAgICAgICBpbmNsdXNpdmUgZmlsdGVycyBtYXRjaCBpdC4gQSB0cmFjZSBpcyBpZ25vcmVkIGlmIGF0IGxlYXN0IG9uZSBleGNsdXNpdmUKICAgICAgIGZpbHRlciBtYXRjaGVzIGl0LgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgOmNsYXNzOmBEb21haW5GaWx0ZXJgIGluc3RhbmNlcyBhcmUgbm93IGFsc28gYWNjZXB0ZWQgaW4gKmZpbHRlcnMqLgorCiAKICAgIC4uIGNsYXNzbWV0aG9kOjogbG9hZChmaWxlbmFtZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdCBiL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QKaW5kZXggODlkNGJiYS4uNDIyZmI1MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS90eXBpbmcucnN0CkBAIC0zNDcsMTEgKzM0NywxNSBAQAogCiAuLiBjbGFzczo6IEl0ZXJhYmxlKEdlbmVyaWNbVF9jb10pCiAKLSAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVgLgorICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlYC4KIAogLi4gY2xhc3M6OiBJdGVyYXRvcihJdGVyYWJsZVtUX2NvXSkKIAotICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYXRvcmAuCisgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JgLgorCisuLiBjbGFzczo6IFJldmVyc2libGUoSXRlcmFibGVbVF9jb10pCisKKyAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5SZXZlcnNpYmxlYC4KIAogLi4gY2xhc3M6OiBTdXBwb3J0c0ludAogCkBAIC0zNzEsMTEgKzM3NSw2IEBACiAgICAgQW4gQUJDIHdpdGggb25lIGFic3RyYWN0IG1ldGhvZCBgYF9fcm91bmRfX2BgCiAgICAgdGhhdCBpcyBjb3ZhcmlhbnQgaW4gaXRzIHJldHVybiB0eXBlLgogCi0uLiBjbGFzczo6IFJldmVyc2libGUKLQotICAgIEFuIEFCQyB3aXRoIG9uZSBhYnN0cmFjdCBtZXRob2QgYGBfX3JldmVyc2VkX19gYCByZXR1cm5pbmcKLSAgICBhbiBgYEl0ZXJhdG9yW1RfY29dYGAuCi0KIC4uIGNsYXNzOjogQ29udGFpbmVyKEdlbmVyaWNbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJgLgpAQCAtMzk2LDcgKzM5NSw3IEBACiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZ2AuCiAKLS4uIGNsYXNzOjogU2VxdWVuY2UoU2l6ZWQsIEl0ZXJhYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCisuLiBjbGFzczo6IFNlcXVlbmNlKFNpemVkLCBSZXZlcnNpYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZWAuCiAKQEAgLTQ1MSw2ICs0NTAsMTIgQEAKIAogICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlld2AuCiAKKy4uIGNsYXNzOjogQ29udGV4dE1hbmFnZXIoR2VuZXJpY1tUX2NvXSkKKworICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gY2xhc3M6OiBEaWN0KGRpY3QsIE11dGFibGVNYXBwaW5nW0tULCBWVF0pCiAKICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgZGljdGAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdCBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CmluZGV4IDkyOWNlYWQuLjIwNzNmMGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CkBAIC0yNTksNiArMjU5LDM0IEBACiAgICAgdXNlZCB0byBzZXQgYXR0cmlidXRlcyBvbiB0aGUgbW9jayBhZnRlciBpdCBpcyBjcmVhdGVkLiBTZWUgdGhlCiAgICAgOm1ldGg6YGNvbmZpZ3VyZV9tb2NrYCBtZXRob2QgZm9yIGRldGFpbHMuCiAKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBBc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCisKKyAgICAgICAgICAgID4+PiBtb2NrID0gTW9jaygpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZCgpCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkX29uY2UoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIEFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgZXhhY3RseSBvbmNlLgorCisgICAgICAgICAgICA+Pj4gbW9jayA9IE1vY2soKQorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kKCkKKyAgICAgICAgICAgIDxNb2NrIG5hbWU9J21vY2subWV0aG9kKCknIGlkPScuLi4nPgorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgQXNzZXJ0aW9uRXJyb3I6IEV4cGVjdGVkICdtZXRob2QnIHRvIGhhdmUgYmVlbiBjYWxsZWQgb25jZS4gQ2FsbGVkIDIgdGltZXMuCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIAogICAgIC4uIG1ldGhvZDo6IGFzc2VydF9jYWxsZWRfd2l0aCgqYXJncywgKiprd2FyZ3MpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CmluZGV4IDIxYzgyZjUuLjAwMDg3NDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdApAQCAtMTE1LDggKzExNSw5IEBACiAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICB8IGlmIHByZXNlbnQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQWRkZWQgSVB2NiBVUkwgcGFyc2luZyBjYXBhYmlsaXRpZXMuCkBAIC0xMjYsNiArMTI3LDEwIEBACiAgICAgICBmYWxzZSksIGluIGFjY29yZGFuY2Ugd2l0aCA6cmZjOmAzOTg2YC4gIFByZXZpb3VzbHksIGEgd2hpdGVsaXN0IG9mCiAgICAgICBzY2hlbWVzIHRoYXQgc3VwcG9ydCBmcmFnbWVudHMgZXhpc3RlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE91dC1vZi1yYW5nZSBwb3J0IG51bWJlcnMgbm93IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpbnN0ZWFkIG9mCisgICAgICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4KKwogCiAuLiBmdW5jdGlvbjo6IHBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSwgc3RyaWN0X3BhcnNpbmc9RmFsc2UsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAKQEAgLTIyOCw4ICsyMzMsMTMgQEAKICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgaWYgcHJlc2VudCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgT3V0LW9mLXJhbmdlIHBvcnQgbnVtYmVycyBub3cgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGluc3RlYWQgb2YKKyAgICAgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLgogCiAKIC4uIGZ1bmN0aW9uOjogdXJsdW5zcGxpdChwYXJ0cykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CmluZGV4IGYxNzlkZTIuLmMyZTFiZWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdApAQCAtNTMsMTUgKzUzLDQxIEBACiAgICAgICBTZXRzIHRoZSB0aW1lIHRoZSBgYHJvYm90cy50eHRgYCBmaWxlIHdhcyBsYXN0IGZldGNoZWQgdG8gdGhlIGN1cnJlbnQKICAgICAgIHRpbWUuCiAKKyAgIC4uIG1ldGhvZDo6IGNyYXdsX2RlbGF5KHVzZXJhZ2VudCkKIAotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB1c2Ugb2YgdGhlIFJvYm90RmlsZVBhcnNlciBjbGFzcy4KKyAgICAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBgYENyYXdsLWRlbGF5YGAgcGFyYW1ldGVyIGZyb20gYGByb2JvdHMudHh0YGAKKyAgICAgIGZvciB0aGUgKnVzZXJhZ2VudCogaW4gcXVlc3Rpb24uICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdAorICAgICAgZG9lc24ndCBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeQorICAgICAgZm9yIHRoaXMgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gbWV0aG9kOjogcmVxdWVzdF9yYXRlKHVzZXJhZ2VudCkKKworICAgICAgUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGBgUmVxdWVzdC1yYXRlYGAgcGFyYW1ldGVyIGZyb20KKyAgICAgIGBgcm9ib3RzLnR4dGBgIGluIHRoZSBmb3JtIG9mIGEgOmZ1bmM6YH5jb2xsZWN0aW9ucy5uYW1lZHR1cGxlYAorICAgICAgYGAocmVxdWVzdHMsIHNlY29uZHMpYGAuICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdCBkb2Vzbid0CisgICAgICBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeSBmb3IgdGhpcworICAgICAgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGJhc2ljIHVzZSBvZiB0aGUgOmNsYXNzOmBSb2JvdEZpbGVQYXJzZXJgCitjbGFzczo6CiAKICAgID4+PiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCiAgICA+Pj4gcnAgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgID4+PiBycC5zZXRfdXJsKCJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS9yb2JvdHMudHh0IikKICAgID4+PiBycC5yZWFkKCkKKyAgID4+PiBycmF0ZSA9IHJwLnJlcXVlc3RfcmF0ZSgiKiIpCisgICA+Pj4gcnJhdGUucmVxdWVzdHMKKyAgIDMKKyAgID4+PiBycmF0ZS5zZWNvbmRzCisgICAyMAorICAgPj4+IHJwLmNyYXdsX2RlbGF5KCIqIikKKyAgIDYKICAgID4+PiBycC5jYW5fZmV0Y2goIioiLCAiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vY2dpLWJpbi9zZWFyY2g/Y2l0eT1TYW4rRnJhbmNpc2NvIikKICAgIEZhbHNlCiAgICA+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tLyIpCiAgICBUcnVlCi0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdCBiL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdAppbmRleCAwMzdmMTFkLi4yYmQxMWE2IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CkBAIC0zMDAsNyArMzAwLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi0uLiBmdW5jdGlvbjo6IHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xKQorLi4gZnVuY3Rpb246OiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSwgc291cmNlPU5vbmUpCiAKICAgIElzc3VlIGEgd2FybmluZywgb3IgbWF5YmUgaWdub3JlIGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoZSAqY2F0ZWdvcnkqCiAgICBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYSB3YXJuaW5nIGNhdGVnb3J5IGNsYXNzIChzZWUgYWJvdmUpOyBpdCBkZWZhdWx0cyB0bwpAQCAtMzE4LDggKzMxOCwxNCBAQAogICAgc291cmNlIG9mIDpmdW5jOmBkZXByZWNhdGlvbmAgaXRzZWxmIChzaW5jZSB0aGUgbGF0dGVyIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZQogICAgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZSkuCiAKKyAgICpzb3VyY2UqLCBpZiBzdXBwbGllZCwgaXMgdGhlIGRlc3Ryb3llZCBvYmplY3Qgd2hpY2ggZW1pdHRlZCBhCisgICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgLgogCi0uLiBmdW5jdGlvbjo6IHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKQorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkICpzb3VyY2UqIHBhcmFtZXRlci4KKworCisuLiBmdW5jdGlvbjo6IHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lLCBzb3VyY2U9Tm9uZSkKIAogICAgVGhpcyBpcyBhIGxvdy1sZXZlbCBpbnRlcmZhY2UgdG8gdGhlIGZ1bmN0aW9uYWxpdHkgb2YgOmZ1bmM6YHdhcm5gLCBwYXNzaW5nIGluCiAgICBleHBsaWNpdGx5IHRoZSBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyLCBhbmQgb3B0aW9uYWxseSB0aGUKQEAgLTMzNSw2ICszNDEsMTIgQEAKICAgIHNvdXJjZSBmb3IgbW9kdWxlcyBmb3VuZCBpbiB6aXBmaWxlcyBvciBvdGhlciBub24tZmlsZXN5c3RlbSBpbXBvcnQKICAgIHNvdXJjZXMpLgogCisgICAqc291cmNlKiwgaWYgc3VwcGxpZWQsIGlzIHRoZSBkZXN0cm95ZWQgb2JqZWN0IHdoaWNoIGVtaXR0ZWQgYQorICAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZCB0aGUgKnNvdXJjZSogcGFyYW1ldGVyLgorCiAKIC4uIGZ1bmN0aW9uOjogc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdCBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CmluZGV4IDcxNjA3ZDYuLjhkNjI4ODUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CkBAIC0xMzEsOSArMTMxLDkgQEAKICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZW52aXJvbi5pdGVtcygpXQogICAgICAgICAgIHJldHVybiByZXQKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgc2ltcGxlX2FwcCkKLSAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHNpbXBsZV9hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCisgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIAogSW4gYWRkaXRpb24gdG8gdGhlIGVudmlyb25tZW50IGZ1bmN0aW9ucyBhYm92ZSwgdGhlIDptb2Q6YHdzZ2lyZWYudXRpbGAgbW9kdWxlCkBAIC0yODMsMTQgKzI4MywxNCBAQAogCiAgICAgICBmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgbWFrZV9zZXJ2ZXIsIGRlbW9fYXBwCiAKLSAgICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQotICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiBwb3J0IDgwMDAuLi4iKQorICAgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24gcG9ydCA4MDAwLi4uIikKIAotICAgICAgIyBSZXNwb25kIHRvIHJlcXVlc3RzIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgICAjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKKyAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKIAotICAgICAgIyBBbHRlcm5hdGl2ZTogc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotICAgICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICMgQWx0ZXJuYXRpdmU6IHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKKyAgICAgICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpCiAKIAogLi4gZnVuY3Rpb246OiBkZW1vX2FwcChlbnZpcm9uLCBzdGFydF9yZXNwb25zZSkKQEAgLTQzMCw5ICs0MzAsOSBAQAogICAgICAgIyBUaGlzIGlzIHRoZSBhcHBsaWNhdGlvbiB3cmFwcGVkIGluIGEgdmFsaWRhdG9yCiAgICAgICB2YWxpZGF0b3JfYXBwID0gdmFsaWRhdG9yKHNpbXBsZV9hcHApCiAKLSAgICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHZhbGlkYXRvcl9hcHApCi0gICAgICBwcmludCgiTGlzdGVuaW5nIG9uIHBvcnQgODAwMC4uLi4iKQotICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCB2YWxpZGF0b3JfYXBwKSBhcyBodHRwZDoKKyAgICAgICAgICBwcmludCgiTGlzdGVuaW5nIG9uIHBvcnQgODAwMC4uLi4iKQorICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAKIDptb2Q6YHdzZ2lyZWYuaGFuZGxlcnNgIC0tIHNlcnZlci9nYXRld2F5IGJhc2UgY2xhc3NlcwpAQCAtNzY5LDggKzc2OSw4IEBACiAgICAgICAgIyBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIHByaW50ZWQKICAgICAgICByZXR1cm4gW2IiSGVsbG8gV29ybGQiXQogCi0gICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBoZWxsb193b3JsZF9hcHApCi0gICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQorICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgaGVsbG9fd29ybGRfYXBwKSBhcyBodHRwZDoKKyAgICAgICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQogCi0gICAjIFNlcnZlIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCi0gICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAjIFNlcnZlIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCisgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94bWxycGMuc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CmluZGV4IDY4MGRiNDEuLmNhODBhYWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CkBAIC0xNDcsMjkgKzE0NywyOSBAQAogICAgICAgIHJwY19wYXRocyA9ICgnL1JQQzInLCkKIAogICAgIyBDcmVhdGUgc2VydmVyCi0gICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1SZXF1ZXN0SGFuZGxlcikKLSAgIHNlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXI9UmVxdWVzdEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQogCi0gICAjIFJlZ2lzdGVyIHBvdygpIGZ1bmN0aW9uOyB0aGlzIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZgotICAgIyBwb3cuX19uYW1lX18gYXMgdGhlIG5hbWUsIHdoaWNoIGlzIGp1c3QgJ3BvdycuCi0gICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICMgUmVnaXN0ZXIgcG93KCkgZnVuY3Rpb247IHRoaXMgd2lsbCB1c2UgdGhlIHZhbHVlIG9mCisgICAgICAgIyBwb3cuX19uYW1lX18gYXMgdGhlIG5hbWUsIHdoaWNoIGlzIGp1c3QgJ3BvdycuCisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKIAotICAgIyBSZWdpc3RlciBhIGZ1bmN0aW9uIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUKLSAgIGRlZiBhZGRlcl9mdW5jdGlvbih4LHkpOgotICAgICAgIHJldHVybiB4ICsgeQotICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGFkZGVyX2Z1bmN0aW9uLCAnYWRkJykKKyAgICAgICAjIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdW5kZXIgYSBkaWZmZXJlbnQgbmFtZQorICAgICAgIGRlZiBhZGRlcl9mdW5jdGlvbih4LHkpOgorICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oYWRkZXJfZnVuY3Rpb24sICdhZGQnKQogCi0gICAjIFJlZ2lzdGVyIGFuIGluc3RhbmNlOyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGluc3RhbmNlIGFyZQotICAgIyBwdWJsaXNoZWQgYXMgWE1MLVJQQyBtZXRob2RzIChpbiB0aGlzIGNhc2UsIGp1c3QgJ211bCcpLgotICAgY2xhc3MgTXlGdW5jczoKLSAgICAgICBkZWYgbXVsKHNlbGYsIHgsIHkpOgotICAgICAgICAgICByZXR1cm4geCAqIHkKKyAgICAgICAjIFJlZ2lzdGVyIGFuIGluc3RhbmNlOyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGluc3RhbmNlIGFyZQorICAgICAgICMgcHVibGlzaGVkIGFzIFhNTC1SUEMgbWV0aG9kcyAoaW4gdGhpcyBjYXNlLCBqdXN0ICdtdWwnKS4KKyAgICAgICBjbGFzcyBNeUZ1bmNzOgorICAgICAgICAgICBkZWYgbXVsKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgcmV0dXJuIHggKiB5CiAKLSAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShNeUZ1bmNzKCkpCisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKE15RnVuY3MoKSkKIAotICAgIyBSdW4gdGhlIHNlcnZlcidzIG1haW4gbG9vcAotICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICMgUnVuIHRoZSBzZXJ2ZXIncyBtYWluIGxvb3AKKyAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCiAKIFRoZSBmb2xsb3dpbmcgY2xpZW50IGNvZGUgd2lsbCBjYWxsIHRoZSBtZXRob2RzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBwcmVjZWRpbmcKIHNlcnZlcjo6CkBAIC0yMDYsMTggKzIwNiwxNyBAQAogICAgICAgICAgICAgZGVmIGdldEN1cnJlbnRUaW1lKCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAKLSAgICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQotICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCi0gICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKLSAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKKyAgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKSBhcyBzZXJ2ZXI6CisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCiAKIFRoaXMgRXhhbXBsZVNlcnZpY2UgZGVtbyBjYW4gYmUgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdCBiL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CmluZGV4IDliMGQxOGEuLjE5YjM1NGQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CkBAIC00NjQsNiArNDY0LDIyIEBACiA6bWV0aDpgLmluZm9saXN0YCBtZXRob2RzIG9mIDpjbGFzczpgWmlwRmlsZWAgb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0b3JlcwogaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgbWVtYmVyIG9mIHRoZSBaSVAgYXJjaGl2ZS4KIAorVGhlcmUgaXMgb25lIGNsYXNzbWV0aG9kIHRvIG1ha2UgYSA6Y2xhc3M6YFppcEluZm9gIGluc3RhbmNlIGZvciBhIGZpbGVzeXN0ZW0KK2ZpbGU6CisKKy4uIGNsYXNzbWV0aG9kOjogWmlwSW5mby5mcm9tX2ZpbGUoZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSkKKworICAgQ29uc3RydWN0IGEgOmNsYXNzOmBaaXBJbmZvYCBpbnN0YW5jZSBmb3IgYSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLCBpbgorICAgcHJlcGFyYXRpb24gZm9yIGFkZGluZyBpdCB0byBhIHppcCBmaWxlLgorCisgICAqZmlsZW5hbWUqIHNob3VsZCBiZSB0aGUgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IG9uIHRoZSBmaWxlc3lzdGVtLgorCisgICBJZiAqYXJjbmFtZSogaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHRoZSBuYW1lIHdpdGhpbiB0aGUgYXJjaGl2ZS4KKyAgIElmICphcmNuYW1lKiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSB3aWxsIGJlIHRoZSBzYW1lIGFzICpmaWxlbmFtZSosIGJ1dAorICAgd2l0aCBhbnkgZHJpdmUgbGV0dGVyIGFuZCBsZWFkaW5nIHBhdGggc2VwYXJhdG9ycyByZW1vdmVkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogSW5zdGFuY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgogCiAKQEAgLTU3Myw0ICs1ODksNSBAQAogCiAgICBTaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZS4KIAorCiAuLiBfUEtaSVAgQXBwbGljYXRpb24gTm90ZTogaHR0cHM6Ly9wa3dhcmUuY2FjaGVmbHkubmV0L3dlYmRvY3MvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3psaWIucnN0IGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKaW5kZXggMTg2OWJiOC4uMDkwMjZjYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvemxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKQEAgLTQ2LDE0ICs0NiwxOSBAQAogICAgICAgcGxhdGZvcm1zLCB1c2UgYGBhZGxlcjMyKGRhdGEpICYgMHhmZmZmZmZmZmBgLgogCiAKLS4uIGZ1bmN0aW9uOjogY29tcHJlc3MoZGF0YVssIGxldmVsXSkKKy4uIGZ1bmN0aW9uOjogY29tcHJlc3MoZGF0YSwgbGV2ZWw9LTEpCiAKICAgIENvbXByZXNzZXMgdGhlIGJ5dGVzIGluICpkYXRhKiwgcmV0dXJuaW5nIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLgotICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAwYGAgdG8gYGA5YGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOworICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAwYGAgdG8gYGA5YGAgb3IgYGAtMWBgIGNvbnRyb2xsaW5nIHRoZSBsZXZlbCBvZiBjb21wcmVzc2lvbjsKICAgIGBgMWBgIGlzIGZhc3Rlc3QgYW5kIHByb2R1Y2VzIHRoZSBsZWFzdCBjb21wcmVzc2lvbiwgYGA5YGAgaXMgc2xvd2VzdCBhbmQKLSAgIHByb2R1Y2VzIHRoZSBtb3N0LiAgYGAwYGAgaXMgbm8gY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDZgYC4KKyAgIHByb2R1Y2VzIHRoZSBtb3N0LiAgYGAwYGAgaXMgbm8gY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYC0xYGAKKyAgIChaX0RFRkFVTFRfQ09NUFJFU1NJT04pLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIHJlcHJlc2VudHMgYSBkZWZhdWx0CisgICBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KICAgIFJhaXNlcyB0aGUgOmV4YzpgZXJyb3JgIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgS2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdyBzdXBwb3J0ZWQuCisKIAogLi4gZnVuY3Rpb246OiBjb21wcmVzc29iaihsZXZlbD0tMSwgbWV0aG9kPURFRkxBVEVELCB3Yml0cz0xNSwgbWVtTGV2ZWw9OCwgc3RyYXRlZ3k9Wl9ERUZBVUxUX1NUUkFURUdZWywgemRpY3RdKQogCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdCBiL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CmluZGV4IDI0ZTg5MGQuLjUxM2NjMTUgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0CkBAIC00NzEsMTAgKzQ3MSwxMCBAQAogICAgZGVjb3JhdG9yczogYGRlY29yYXRvcmArCiAgICBkZWNvcmF0b3I6ICJAIiBgZG90dGVkX25hbWVgIFsiKCIgW2BwYXJhbWV0ZXJfbGlzdGAgWyIsIl1dICIpIl0gTkVXTElORQogICAgZG90dGVkX25hbWU6IGBpZGVudGlmaWVyYCAoIi4iIGBpZGVudGlmaWVyYCkqCi0gICBwYXJhbWV0ZXJfbGlzdDogKGBkZWZwYXJhbWV0ZXJgICIsIikqCi0gICAgICAgICAgICAgICAgIDogfCAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiAiKioiIGBwYXJhbWV0ZXJgXQotICAgICAgICAgICAgICAgICA6IHwgIioqIiBgcGFyYW1ldGVyYAotICAgICAgICAgICAgICAgICA6IHwgYGRlZnBhcmFtZXRlcmAgWyIsIl0gKQorICAgcGFyYW1ldGVyX2xpc3Q6IGBkZWZwYXJhbWV0ZXJgICgiLCIgYGRlZnBhcmFtZXRlcmApKiBbIiwiIFtgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgXV0KKyAgICAgICAgICAgICAgICAgOiB8IGBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc2AKKyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzOiAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbIioqIiBgcGFyYW1ldGVyYCBbIiwiXV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAgWyIsIl0KICAgIHBhcmFtZXRlcjogYGlkZW50aWZpZXJgIFsiOiIgYGV4cHJlc3Npb25gXQogICAgZGVmcGFyYW1ldGVyOiBgcGFyYW1ldGVyYCBbIj0iIGBleHByZXNzaW9uYF0KICAgIGZ1bmNuYW1lOiBgaWRlbnRpZmllcmAKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdCBiL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdAppbmRleCA5OTdlOWVlLi5iNjdjY2JiIDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CkBAIC0xMjM0LDggKzEyMzQsOSBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKIAotICAgQ2FsbGVkIGJ5IHRoZSA6ZnVuYzpgZm9ybWF0YCBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlCi0gICA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIG9mIGNsYXNzIDpjbGFzczpgc3RyYCkgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiCisgICBDYWxsZWQgYnkgdGhlIDpmdW5jOmBmb3JtYXRgIGJ1aWx0LWluIGZ1bmN0aW9uLAorICAgYW5kIGJ5IGV4dGVuc2lvbiwgZXZhbHVhdGlvbiBvZiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCisgICA8Zi1zdHJpbmdzPmAgYW5kIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIKICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSBgYGZvcm1hdF9zcGVjYGAgYXJndW1lbnQgaXMKICAgIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuCiAgICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGBgZm9ybWF0X3NwZWNgYCBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0IGIvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0CmluZGV4IDIxNDRjMWYuLjU2MDQ5Y2UgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QKQEAgLTU1NCwxOSArNTU0LDMwIEBACiAgICBkZXRhaWxzLgogCiAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQgb2YgYGBfX25hbWVfX2BgIHRvIGNhbGN1bGF0ZSBleHBsaWNpdAotICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLCBhcyBkZWZpbmVkIGluIDpwZXA6YDM2NmAuCisgICByZWxhdGl2ZSBpbXBvcnRzIGZvciBtYWluIG1vZHVsZXMsIGFzIGRlZmluZWQgaW4gOnBlcDpgMzY2YC4gSXQgaXMKKyAgIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYGBfX3NwZWNfXy5wYXJlbnRgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSB2YWx1ZSBvZiBgYF9fcGFja2FnZV9fYGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAgICAgIGBgX19zcGVjX18ucGFyZW50YGAuCiAKIC4uIGF0dHJpYnV0ZTo6IF9fc3BlY19fCiAKICAgIFRoZSBgYF9fc3BlY19fYGAgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgc3BlYyB0aGF0IHdhcwotICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBmb3IKLSAgIGludHJvc3BlY3Rpb24gYW5kIGR1cmluZyByZWxvYWRpbmcuICBTZXR0aW5nIGBgX19zcGVjX19gYAorICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiBTZXR0aW5nIGBgX19zcGVjX19gYAogICAgYXBwcm9wcmlhdGVseSBhcHBsaWVzIGVxdWFsbHkgdG8gOnJlZjpgbW9kdWxlcyBpbml0aWFsaXplZCBkdXJpbmcKICAgIGludGVycHJldGVyIHN0YXJ0dXAgPHByb2dyYW1zPmAuICBUaGUgb25lIGV4Y2VwdGlvbiBpcyBgYF9fbWFpbl9fYGAsCiAgICB3aGVyZSBgYF9fc3BlY19fYGAgaXMgOnJlZjpgc2V0IHRvIE5vbmUgaW4gc29tZSBjYXNlcyA8bWFpbl9zcGVjPmAuCiAKKyAgIFdoZW4gYGBfX3BhY2thZ2VfX2BgIGlzIG5vdCBkZWZpbmVkLCBgYF9fc3BlY19fLnBhcmVudGBgIGlzIHVzZWQgYXMKKyAgIGEgZmFsbGJhY2suCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBfX3NwZWNfXy5wYXJlbnRgYCBpcyB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBgYF9fcGFja2FnZV9fYGAgaXMKKyAgICAgIG5vdCBkZWZpbmVkLgorCiAuLiBhdHRyaWJ1dGU6OiBfX3BhdGhfXwogCiAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSAoZWl0aGVyIHJlZ3VsYXIgb3IgbmFtZXNwYWNlKSwgdGhlIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdCBiL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKaW5kZXggOGFkOTc1Zi4uYWFkNWIwYyAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CkBAIC00MDUsNyArNDA1LDggQEAKIAogLi4gcHJvZHVjdGlvbmxpc3Q6OgogICAgc3RyaW5nbGl0ZXJhbDogW2BzdHJpbmdwcmVmaXhgXShgc2hvcnRzdHJpbmdgIHwgYGxvbmdzdHJpbmdgKQotICAgc3RyaW5ncHJlZml4OiAiciIgfCAidSIgfCAiUiIgfCAiVSIKKyAgIHN0cmluZ3ByZWZpeDogInIiIHwgInUiIHwgIlIiIHwgIlUiIHwgImYiIHwgIkYiCisgICAgICAgICAgICAgICA6IHwgImZyIiB8ICJGciIgfCAiZlIiIHwgIkZSIiB8ICJyZiIgfCAickYiIHwgIlJmIiB8ICJSRiIKICAgIHNob3J0c3RyaW5nOiAiJyIgYHNob3J0c3RyaW5naXRlbWAqICInIiB8ICciJyBgc2hvcnRzdHJpbmdpdGVtYCogJyInCiAgICBsb25nc3RyaW5nOiAiJycnIiBgbG9uZ3N0cmluZ2l0ZW1gKiAiJycnIiB8ICciIiInIGBsb25nc3RyaW5naXRlbWAqICciIiInCiAgICBzaG9ydHN0cmluZ2l0ZW06IGBzaG9ydHN0cmluZ2NoYXJgIHwgYHN0cmluZ2VzY2FwZXNlcWAKQEAgLTQ2NCw2ICs0NjUsMTEgQEAKICAgIHRvIHNpbXBsaWZ5IHRoZSBtYWludGVuYW5jZSBvZiBkdWFsIFB5dGhvbiAyLnggYW5kIDMueCBjb2RlYmFzZXMuCiAgICBTZWUgOnBlcDpgNDE0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorQSBzdHJpbmcgbGl0ZXJhbCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYCBpbiBpdHMgcHJlZml4IGlzIGEKKzpkZm46YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbGA7IHNlZSA6cmVmOmBmLXN0cmluZ3NgLiAgVGhlIGBgJ2YnYGAgbWF5IGJlCitjb21iaW5lZCB3aXRoIGBgJ3InYGAsIGJ1dCBub3Qgd2l0aCBgYCdiJ2BgIG9yIGBgJ3UnYGAsIHRoZXJlZm9yZSByYXcKK2Zvcm1hdHRlZCBzdHJpbmdzIGFyZSBwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgbm90LgorCiBJbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZCAoYW5kIGFyZQogcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93IHRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBCiAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZSBsaXRlcmFsLCBpLmUuIGVpdGhlciBgYCdgYCBvciBgYCJgYC4pCkBAIC01ODQsNyArNTkwLDEwNSBAQAogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBkZWZpbmVkIGF0IHRoZSBzeW50YWN0aWNhbCBsZXZlbCwgYnV0IGltcGxlbWVudGVkIGF0CiBjb21waWxlIHRpbWUuICBUaGUgJysnIG9wZXJhdG9yIG11c3QgYmUgdXNlZCB0byBjb25jYXRlbmF0ZSBzdHJpbmcgZXhwcmVzc2lvbnMKIGF0IHJ1biB0aW1lLiAgQWxzbyBub3RlIHRoYXQgbGl0ZXJhbCBjb25jYXRlbmF0aW9uIGNhbiB1c2UgZGlmZmVyZW50IHF1b3RpbmcKLXN0eWxlcyBmb3IgZWFjaCBjb21wb25lbnQgKGV2ZW4gbWl4aW5nIHJhdyBzdHJpbmdzIGFuZCB0cmlwbGUgcXVvdGVkIHN0cmluZ3MpLgorc3R5bGVzIGZvciBlYWNoIGNvbXBvbmVudCAoZXZlbiBtaXhpbmcgcmF3IHN0cmluZ3MgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5ncyksCithbmQgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBtYXkgYmUgY29uY2F0ZW5hdGVkIHdpdGggcGxhaW4gc3RyaW5nIGxpdGVyYWxzLgorCisKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsCisgICBzaW5nbGU6IGludGVycG9sYXRlZCBzdHJpbmcgbGl0ZXJhbAorICAgc2luZ2xlOiBzdHJpbmc7IGZvcm1hdHRlZCBsaXRlcmFsCisgICBzaW5nbGU6IHN0cmluZzsgaW50ZXJwb2xhdGVkIGxpdGVyYWwKKyAgIHNpbmdsZTogZi1zdHJpbmcKKy4uIF9mLXN0cmluZ3M6CisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK0EgOmRmbjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsYCBvciA6ZGZuOmBmLXN0cmluZ2AgaXMgYSBzdHJpbmcgbGl0ZXJhbAordGhhdCBpcyBwcmVmaXhlZCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYC4gIFRoZXNlIHN0cmluZ3MgbWF5IGNvbnRhaW4KK3JlcGxhY2VtZW50IGZpZWxkcywgd2hpY2ggYXJlIGV4cHJlc3Npb25zIGRlbGltaXRlZCBieSBjdXJseSBicmFjZXMgYGB7fWBgLgorV2hpbGUgb3RoZXIgc3RyaW5nIGxpdGVyYWxzIGFsd2F5cyBoYXZlIGEgY29uc3RhbnQgdmFsdWUsIGZvcm1hdHRlZCBzdHJpbmdzCithcmUgcmVhbGx5IGV4cHJlc3Npb25zIGV2YWx1YXRlZCBhdCBydW4gdGltZS4KKworRXNjYXBlIHNlcXVlbmNlcyBhcmUgZGVjb2RlZCBsaWtlIGluIG9yZGluYXJ5IHN0cmluZyBsaXRlcmFscyAoZXhjZXB0IHdoZW4KK2EgbGl0ZXJhbCBpcyBhbHNvIG1hcmtlZCBhcyBhIHJhdyBzdHJpbmcpLiAgQWZ0ZXIgZGVjb2RpbmcsIHRoZSBncmFtbWFyCitmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgaXM6CisKKy4uIHByb2R1Y3Rpb25saXN0OjoKKyAgIGZfc3RyaW5nOiAoYGxpdGVyYWxfY2hhcmAgfCAie3siIHwgIn19IiB8IGByZXBsYWNlbWVudF9maWVsZGApKgorICAgcmVwbGFjZW1lbnRfZmllbGQ6ICJ7IiBgZl9leHByZXNzaW9uYCBbIiEiIGBjb252ZXJzaW9uYF0gWyI6IiBgZm9ybWF0X3NwZWNgXSAifSIKKyAgIGZfZXhwcmVzc2lvbjogYGNvbmRpdGlvbmFsX2V4cHJlc3Npb25gICgiLCIgYGNvbmRpdGlvbmFsX2V4cHJlc3Npb25gKSogWyIsIl0KKyAgICAgICAgICAgICAgIDogfCBgeWllbGRfZXhwcmVzc2lvbmAKKyAgIGNvbnZlcnNpb246ICJzIiB8ICJyIiB8ICJhIgorICAgZm9ybWF0X3NwZWM6IChgbGl0ZXJhbF9jaGFyYCB8IE5VTEwgfCBgcmVwbGFjZW1lbnRfZmllbGRgKSoKKyAgIGxpdGVyYWxfY2hhcjogPGFueSBjb2RlIHBvaW50IGV4Y2VwdCAieyIsICJ9IiBvciBOVUxMPgorCitUaGUgcGFydHMgb2YgdGhlIHN0cmluZyBvdXRzaWRlIGN1cmx5IGJyYWNlcyBhcmUgdHJlYXRlZCBsaXRlcmFsbHksCitleGNlcHQgdGhhdCBhbnkgZG91YmxlZCBjdXJseSBicmFjZXMgYGAne3snYGAgb3IgYGAnfX0nYGAgYXJlIHJlcGxhY2VkCit3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNpbmdsZSBjdXJseSBicmFjZS4gIEEgc2luZ2xlIG9wZW5pbmcgY3VybHkKK2JyYWNrZXQgYGAneydgYCBtYXJrcyBhIHJlcGxhY2VtZW50IGZpZWxkLCB3aGljaCBzdGFydHMgd2l0aCBhCitQeXRob24gZXhwcmVzc2lvbi4gIEFmdGVyIHRoZSBleHByZXNzaW9uLCB0aGVyZSBtYXkgYmUgYSBjb252ZXJzaW9uIGZpZWxkLAoraW50cm9kdWNlZCBieSBhbiBleGNsYW1hdGlvbiBwb2ludCBgYCchJ2BgLiAgQSBmb3JtYXQgc3BlY2lmaWVyIG1heSBhbHNvCitiZSBhcHBlbmRlZCwgaW50cm9kdWNlZCBieSBhIGNvbG9uIGBgJzonYGAuICBBIHJlcGxhY2VtZW50IGZpZWxkIGVuZHMKK3dpdGggYSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgYGAnfSdgYC4KKworRXhwcmVzc2lvbnMgaW4gZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhcmUgdHJlYXRlZCBsaWtlIHJlZ3VsYXIKK1B5dGhvbiBleHByZXNzaW9ucyBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2VzLCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnMuCitBbiBlbXB0eSBleHByZXNzaW9uIGlzIG5vdCBhbGxvd2VkLCBhbmQgYSA6a2V5d29yZDpgbGFtYmRhYCBleHByZXNzaW9uCittdXN0IGJlIHN1cnJvdW5kZWQgYnkgZXhwbGljaXQgcGFyZW50aGVzZXMuICBSZXBsYWNlbWVudCBleHByZXNzaW9ucworY2FuIGNvbnRhaW4gbGluZSBicmVha3MgKGUuZy4gaW4gdHJpcGxlLXF1b3RlZCBzdHJpbmdzKSwgYnV0IHRoZXkKK2Nhbm5vdCBjb250YWluIGNvbW1lbnRzLiAgRWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBpbiB0aGUgY29udGV4dAord2hlcmUgdGhlIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJzLCBpbiBvcmRlciBmcm9tIGxlZnQgdG8gcmlnaHQuCisKK0lmIGEgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQsIHRoZSByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbgoraXMgY29udmVydGVkIGJlZm9yZSBmb3JtYXR0aW5nLiAgQ29udmVyc2lvbiBgYCchcydgYCBjYWxscyA6ZnVuYzpgc3RyYCBvbgordGhlIHJlc3VsdCwgYGAnIXInYGAgY2FsbHMgOmZ1bmM6YHJlcHJgLCBhbmQgYGAnIWEnYGAgY2FsbHMgOmZ1bmM6YGFzY2lpYC4KKworVGhlIHJlc3VsdCBpcyB0aGVuIGZvcm1hdHRlZCB1c2luZyB0aGUgOmZ1bmM6YGZvcm1hdGAgcHJvdG9jb2wuICBUaGUKK2Zvcm1hdCBzcGVjaWZpZXIgaXMgcGFzc2VkIHRvIHRoZSA6bWV0aDpgX19mb3JtYXRfX2AgbWV0aG9kIG9mIHRoZQorZXhwcmVzc2lvbiBvciBjb252ZXJzaW9uIHJlc3VsdC4gIEFuIGVtcHR5IHN0cmluZyBpcyBwYXNzZWQgd2hlbiB0aGUKK2Zvcm1hdCBzcGVjaWZpZXIgaXMgb21pdHRlZC4gIFRoZSBmb3JtYXR0ZWQgcmVzdWx0IGlzIHRoZW4gaW5jbHVkZWQgaW4KK3RoZSBmaW5hbCB2YWx1ZSBvZiB0aGUgd2hvbGUgc3RyaW5nLgorCitUb3AtbGV2ZWwgZm9ybWF0IHNwZWNpZmllcnMgbWF5IGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcy4KK1RoZXNlIG5lc3RlZCBmaWVsZHMgbWF5IGluY2x1ZGUgdGhlaXIgb3duIGNvbnZlcnNpb24gZmllbGRzIGFuZAorZm9ybWF0IHNwZWNpZmllcnMsIGJ1dCBtYXkgbm90IGluY2x1ZGUgbW9yZSBkZWVwbHktbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcy4KKworRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBtYXkgYmUgY29uY2F0ZW5hdGVkLCBidXQgcmVwbGFjZW1lbnQgZmllbGRzCitjYW5ub3QgYmUgc3BsaXQgYWNyb3NzIGxpdGVyYWxzLgorCitTb21lIGV4YW1wbGVzIG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHM6OgorCisgICA+Pj4gbmFtZSA9ICJGcmVkIgorICAgPj4+IGYiSGUgc2FpZCBoaXMgbmFtZSBpcyB7bmFtZSFyfS4iCisgICAiSGUgc2FpZCBoaXMgbmFtZSBpcyAnRnJlZCcuIgorICAgPj4+IGYiSGUgc2FpZCBoaXMgbmFtZSBpcyB7cmVwcihuYW1lKX0uIiAgIyByZXByKCkgaXMgZXF1aXZhbGVudCB0byAhcgorICAgIkhlIHNhaWQgaGlzIG5hbWUgaXMgJ0ZyZWQnLiIKKyAgID4+PiB3aWR0aCA9IDEwCisgICA+Pj4gcHJlY2lzaW9uID0gNAorICAgPj4+IHZhbHVlID0gZGVjaW1hbC5EZWNpbWFsKCIxMi4zNDU2NyIpCisgICA+Pj4gZiJyZXN1bHQ6IHt2YWx1ZTp7d2lkdGh9LntwcmVjaXNpb259fSIgICMgbmVzdGVkIGZpZWxkcworICAgJ3Jlc3VsdDogICAgICAxMi4zNScKKworQSBjb25zZXF1ZW5jZSBvZiBzaGFyaW5nIHRoZSBzYW1lIHN5bnRheCBhcyByZWd1bGFyIHN0cmluZyBsaXRlcmFscyBpcwordGhhdCBjaGFyYWN0ZXJzIGluIHRoZSByZXBsYWNlbWVudCBmaWVsZHMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUKK3F1b3RpbmcgdXNlZCBpbiB0aGUgb3V0ZXIgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsLiAgQWxzbywgZXNjYXBlCitzZXF1ZW5jZXMgbm9ybWFsbHkgYXBwbHkgdG8gdGhlIG91dGVyIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbCwKK3JhdGhlciB0aGFuIGlubmVyIHN0cmluZyBsaXRlcmFsczo6CisKKyAgIGYiYWJjIHthWyJ4Il19IGRlZiIgICAgIyBlcnJvcjogb3V0ZXIgc3RyaW5nIGxpdGVyYWwgZW5kZWQgcHJlbWF0dXJlbHkKKyAgIGYiYWJjIHthW1wieFwiXX0gZGVmIiAgIyB3b3JrYXJvdW5kOiBlc2NhcGUgdGhlIGlubmVyIHF1b3RlcworICAgZiJhYmMge2FbJ3gnXX0gZGVmIiAgICAjIHdvcmthcm91bmQ6IHVzZSBkaWZmZXJlbnQgcXVvdGluZworCisgICBmIm5ld2xpbmU6IHtvcmQoJ1xuJyl9IiAgICMgZXJyb3I6IGxpdGVyYWwgbGluZSBicmVhayBpbiBpbm5lciBzdHJpbmcKKyAgIGYibmV3bGluZToge29yZCgnXFxuJyl9IiAgIyB3b3JrYXJvdW5kOiBkb3VibGUgZXNjYXBpbmcKKyAgIGZyIm5ld2xpbmU6IHtvcmQoJ1xuJyl9IiAgIyB3b3JrYXJvdW5kOiByYXcgb3V0ZXIgc3RyaW5nCisKK1NlZSBhbHNvIDpwZXA6YDQ5OGAgZm9yIHRoZSBwcm9wb3NhbCB0aGF0IGFkZGVkIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMsCithbmQgOm1ldGg6YHN0ci5mb3JtYXRgLCB3aGljaCB1c2VzIGEgcmVsYXRlZCBmb3JtYXQgc3RyaW5nIG1lY2hhbmlzbS4KIAogCiAuLiBfbnVtYmVyczoKZGlmZiAtLWdpdCBhL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkgYi9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CmluZGV4IDYzMTEyODMuLjc5ODYwMTcgMTAwNjQ0Ci0tLSBhL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKKysrIGIvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQpAQCAtMzQsNyArMzQsNyBAQAogCiAKIElTU1VFX1VSSSA9ICdodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZSVzJwotU09VUkNFX1VSSSA9ICdodHRwczovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzMuNS8lcycKK1NPVVJDRV9VUkkgPSAnaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS9kZWZhdWx0LyVzJwogCiAjIG1vbmtleS1wYXRjaCByZVNUIHBhcnNlciB0byBkaXNhYmxlIGFscGhhYmV0aWMgYW5kIHJvbWFuIGVudW1lcmF0ZWQgbGlzdHMKIGZyb20gZG9jdXRpbHMucGFyc2Vycy5yc3Quc3RhdGVzIGltcG9ydCBCb2R5CmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0IGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdAppbmRleCA4MTNjODI4Li44NDUzNzk2IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CisrKyBiL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKQEAgLTc4LDYgKzc4LDkgQEAKICAgID4+PiB3b3JkcwogICAgWydkZWZlbmVzdHJhdGUnLCAnY2F0JywgJ3dpbmRvdycsICdkZWZlbmVzdHJhdGUnXQogCitXaXRoIGBgZm9yIHcgaW4gd29yZHM6YGAsIHRoZSBleGFtcGxlIHdvdWxkIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGluZmluaXRlIGxpc3QsCitpbnNlcnRpbmcgYGBkZWZlbmVzdHJhdGVgYCBvdmVyIGFuZCBvdmVyIGFnYWluLgorCiAKIC4uIF90dXQtcmFuZ2U6CiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CmluZGV4IDAyYmIyOGIuLjY4NmIyYjEgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdApAQCAtMjUsNyArMjUsOCBAQAogY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIHlvdSBjYW4gY3JlYXRlIGFueSBsYXlvdXQgeW91IGNhbiBpbWFnaW5lLiAgVGhlCiBzdHJpbmcgdHlwZSBoYXMgc29tZSBtZXRob2RzIHRoYXQgcGVyZm9ybSB1c2VmdWwgb3BlcmF0aW9ucyBmb3IgcGFkZGluZwogc3RyaW5ncyB0byBhIGdpdmVuIGNvbHVtbiB3aWR0aDsgdGhlc2Ugd2lsbCBiZSBkaXNjdXNzZWQgc2hvcnRseS4gIFRoZSBzZWNvbmQKLXdheSBpcyB0byB1c2UgdGhlIDptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QuCit3YXkgaXMgdG8gdXNlIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gLCBvciB0aGUKKzptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QuCiAKIFRoZSA6bW9kOmBzdHJpbmdgIG1vZHVsZSBjb250YWlucyBhIDpjbGFzczpgfnN0cmluZy5UZW1wbGF0ZWAgY2xhc3Mgd2hpY2ggb2ZmZXJzCiB5ZXQgYW5vdGhlciB3YXkgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW50byBzdHJpbmdzLgpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdCBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKaW5kZXggZTk2NjA4NS4uMjE1YWYwMyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CkBAIC0xLDQgKzEsNCBAQAotLi4gX3R1dC11c2luZzoKKzMuNi4uIF90dXQtdXNpbmc6CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFVzaW5nIHRoZSBQeXRob24gSW50ZXJwcmV0ZXIKQEAgLTEwLDEzICsxMCwxMyBAQAogSW52b2tpbmcgdGhlIEludGVycHJldGVyCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy41YAorVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy42YAogb24gdGhvc2UgbWFjaGluZXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlOyBwdXR0aW5nIDpmaWxlOmAvdXNyL2xvY2FsL2JpbmAgaW4geW91cgogVW5peCBzaGVsbCdzIHNlYXJjaCBwYXRoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZDoKIAogLi4gY29kZS1ibG9jazo6IHRleHQKIAotICAgcHl0aG9uMy41CisgICBweXRob24zLjYKIAogdG8gdGhlIHNoZWxsLiBbI11fIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgbGl2ZXMKIGlzIGFuIGluc3RhbGxhdGlvbiBvcHRpb24sIG90aGVyIHBsYWNlcyBhcmUgcG9zc2libGU7IGNoZWNrIHdpdGggeW91ciBsb2NhbApAQCAtMjQsMTEgKzI0LDExIEBACiBwb3B1bGFyIGFsdGVybmF0aXZlIGxvY2F0aW9uLikKIAogT24gV2luZG93cyBtYWNoaW5lcywgdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gaXMgdXN1YWxseSBwbGFjZWQgaW4KLTpmaWxlOmBDOlxcUHl0aG9uMzVgLCB0aG91Z2ggeW91IGNhbiBjaGFuZ2UgdGhpcyB3aGVuIHlvdSdyZSBydW5uaW5nIHRoZQorOmZpbGU6YEM6XFxQeXRob24zNmAsIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlCiBpbnN0YWxsZXIuICBUbyBhZGQgdGhpcyBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCAgeW91IGNhbiB0eXBlIHRoZSBmb2xsb3dpbmcKIGNvbW1hbmQgaW50byB0aGUgY29tbWFuZCBwcm9tcHQgaW4gYSBET1MgYm94OjoKIAotICAgc2V0IHBhdGg9JXBhdGglO0M6XHB5dGhvbjM1CisgICBzZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzYKIAogVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoOmtiZDpgQ29udHJvbC1EYCBvbiBVbml4LCA6a2JkOmBDb250cm9sLVpgIG9uCiBXaW5kb3dzKSBhdCB0aGUgcHJpbWFyeSBwcm9tcHQgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQKQEAgLTk2LDggKzk2LDggQEAKIHByaW50cyBhIHdlbGNvbWUgbWVzc2FnZSBzdGF0aW5nIGl0cyB2ZXJzaW9uIG51bWJlciBhbmQgYSBjb3B5cmlnaHQgbm90aWNlCiBiZWZvcmUgcHJpbnRpbmcgdGhlIGZpcnN0IHByb21wdDo6CiAKLSAgICQgcHl0aG9uMy41Ci0gICBQeXRob24gMy41IChkZWZhdWx0LCBTZXAgMTYgMjAxNSwgMDk6MjU6MDQpCisgICAkIHB5dGhvbjMuNgorICAgUHl0aG9uIDMuNiAoZGVmYXVsdCwgU2VwIDE2IDIwMTUsIDA5OjI1OjA0KQogICAgW0dDQyA0LjguMl0gb24gbGludXgKICAgIFR5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgID4+PgpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAppbmRleCA4NzU4ZjM4Li44N2YwZmE1IDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdApAQCAtMzUyLDYgKzM1Miw5IEBACiAgICAgICBTdHJpbmdzIHN1cHBvcnQgYSBsYXJnZSBudW1iZXIgb2YgbWV0aG9kcyBmb3IKICAgICAgIGJhc2ljIHRyYW5zZm9ybWF0aW9ucyBhbmQgc2VhcmNoaW5nLgogCisgICA6cmVmOmBmLXN0cmluZ3NgCisgICAgICBTdHJpbmcgbGl0ZXJhbHMgdGhhdCBoYXZlIGVtYmVkZGVkIGV4cHJlc3Npb25zLgorCiAgICA6cmVmOmBmb3JtYXRzdHJpbmdzYAogICAgICAgSW5mb3JtYXRpb24gYWJvdXQgc3RyaW5nIGZvcm1hdHRpbmcgd2l0aCA6bWV0aDpgc3RyLmZvcm1hdGAuCiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0IGIvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKaW5kZXggMDk1NGViYS4uZjllZDQ2ZCAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKQEAgLTE1LDcgKzE1LDcgQEAKIAogICAgPj4+IGltcG9ydCBvcwogICAgPj4+IG9zLmdldGN3ZCgpICAgICAgIyBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLSAgICdDOlxcUHl0aG9uMzUnCisgICAnQzpcXFB5dGhvbjM2JwogICAgPj4+IG9zLmNoZGlyKCcvc2VydmVyL2FjY2Vzc2xvZ3MnKSAgICMgQ2hhbmdlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAgID4+PiBvcy5zeXN0ZW0oJ21rZGlyIHRvZGF5JykgICAjIFJ1biB0aGUgY29tbWFuZCBta2RpciBpbiB0aGUgc3lzdGVtIHNoZWxsCiAgICAwCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QgYi9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKaW5kZXggZjdkMmEwYS4uNzExOTRiMCAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdApAQCAtMjc3LDcgKzI3Nyw3IEBACiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgZFsncHJpbWFyeSddICAgICAgICAgICAgICAgICMgZW50cnkgd2FzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZAotICAgICBGaWxlICJDOi9weXRob24zNS9saWIvd2Vha3JlZi5weSIsIGxpbmUgNDYsIGluIF9fZ2V0aXRlbV9fCisgICAgIEZpbGUgIkM6L3B5dGhvbjM2L2xpYi93ZWFrcmVmLnB5IiwgbGluZSA0NiwgaW4gX19nZXRpdGVtX18KICAgICAgICBvID0gc2VsZi5kYXRhW2tleV0oKQogICAgS2V5RXJyb3I6ICdwcmltYXJ5JwogCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvY21kbGluZS5yc3QgYi9Eb2MvdXNpbmcvY21kbGluZS5yc3QKaW5kZXggZWM3NDRhMy4uYzFjNzAwYyAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL2NtZGxpbmUucnN0CisrKyBiL0RvYy91c2luZy9jbWRsaW5lLnJzdApAQCAtNjIxLDYgKzYyMSw1NSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIAorLi4gZW52dmFyOjogUFlUSE9OTUFMTE9DCisKKyAgIFNldCB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzLgorCisgICBTZXQgdGhlIGZhbWlseSBvZiBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbjoKKworICAgKiBgYG1hbGxvY2BgOiB1c2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeQorICAgICBmb3IgYWxsIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyAoZXg6IDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AsCisgICAgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgYW5kIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApLgorICAgKiBgYHB5bWFsbG9jYGA6IDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxvY2AgYW5kCisgICAgIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgIHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgYWxsb2NhdG9yIDxweW1hbGxvYz5gLgorICAgICBPdGhlciBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgKGV4OiA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgIGFuZAorICAgICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgKSB1c2UgOmM6ZnVuYzpgbWFsbG9jYC4KKworICAgSW5zdGFsbCBkZWJ1ZyBob29rczoKKworICAgKiBgYGRlYnVnYGA6IGluc3RhbGwgZGVidWcgaG9va3Mgb24gdG9wIG9mIHRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3IKKyAgICogYGBtYWxsb2NfZGVidWdgYDogc2FtZSBhcyBgYG1hbGxvY2BgIGJ1dCBhbHNvIGluc3RhbGwgZGVidWcgaG9va3MKKyAgICogYGBweW1hbGxvY19kZWJ1Z2BgOiBzYW1lIGFzIGBgcHltYWxsb2NgYCBidXQgYWxzbyBpbnN0YWxsIGRlYnVnIGhvb2tzCisKKyAgIFdoZW4gUHl0aG9uIGlzIGNvbXBpbGVkIGluIHJlbGVhc2UgbW9kZSwgdGhlIGRlZmF1bHQgaXMgYGBweW1hbGxvY2BgLiBXaGVuCisgICBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLCB0aGUgZGVmYXVsdCBpcyBgYHB5bWFsbG9jX2RlYnVnYGAgYW5kIHRoZSBkZWJ1ZyBob29rcworICAgYXJlIHVzZWQgYXV0b21hdGljYWxseS4KKworICAgSWYgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBgYHB5bWFsbG9jYGAgc3VwcG9ydCwgYGBweW1hbGxvY2BgIGFuZAorICAgYGBweW1hbGxvY19kZWJ1Z2BgIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCBpcyBgYG1hbGxvY2BgIGluIHJlbGVhc2UKKyAgIG1vZGUgYW5kIGBgbWFsbG9jX2RlYnVnYGAgaW4gZGVidWcgbW9kZS4KKworICAgU2VlIHRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGZvciBkZWJ1ZyBob29rcyBvbiBQeXRob24KKyAgIG1lbW9yeSBhbGxvY2F0b3JzLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0NTVEFUUworCisgICBJZiBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nLCBQeXRob24gd2lsbCBwcmludCBzdGF0aXN0aWNzIG9mIHRoZQorICAgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YCBldmVyeSB0aW1lIGEgbmV3IHB5bWFsbG9jIG9iamVjdAorICAgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgorCisgICBUaGlzIHZhcmlhYmxlIGlzIGlnbm9yZWQgaWYgdGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgIGlzIHVzZWQgdG8gZm9yY2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgYWxsb2NhdG9yIG9mIHRoZSBDIGxpYnJhcnksIG9yIGlmCisgICBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IGBgcHltYWxsb2NgYCBzdXBwb3J0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgVGhpcyB2YXJpYWJsZSBjYW4gbm93IGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorICAgICAgSXQgbm93IGhhcyBubyBlZmZlY3QgaWYgc2V0IHRvIGFuIGVtcHR5IHN0cmluZy4KKworCiBEZWJ1Zy1tb2RlIHZhcmlhYmxlcwogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtNjM2LDkgKzY4NSwzIEBACiAKICAgIElmIHNldCwgUHl0aG9uIHdpbGwgZHVtcCBvYmplY3RzIGFuZCByZWZlcmVuY2UgY291bnRzIHN0aWxsIGFsaXZlIGFmdGVyCiAgICBzaHV0dGluZyBkb3duIHRoZSBpbnRlcnByZXRlci4KLQotCi0uLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0NTVEFUUwotCi0gICBJZiBzZXQsIFB5dGhvbiB3aWxsIHByaW50IG1lbW9yeSBhbGxvY2F0aW9uIHN0YXRpc3RpY3MgZXZlcnkgdGltZSBhIG5ldwotICAgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy9tYWMucnN0IGIvRG9jL3VzaW5nL21hYy5yc3QKaW5kZXggMDM1MjY0OC4uMzVkNTI0MCAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL21hYy5yc3QKKysrIGIvRG9jL3VzaW5nL21hYy5yc3QKQEAgLTI1LDcgKzI1LDcgQEAKIAogV2hhdCB5b3UgZ2V0IGFmdGVyIGluc3RhbGxpbmcgaXMgYSBudW1iZXIgb2YgdGhpbmdzOgogCi0qIEEgOmZpbGU6YE1hY1B5dGhvbiAzLjVgIGZvbGRlciBpbiB5b3VyIDpmaWxlOmBBcHBsaWNhdGlvbnNgIGZvbGRlci4gSW4gaGVyZQorKiBBIDpmaWxlOmBNYWNQeXRob24gMy42YCBmb2xkZXIgaW4geW91ciA6ZmlsZTpgQXBwbGljYXRpb25zYCBmb2xkZXIuIEluIGhlcmUKICAgeW91IGZpbmQgSURMRSwgdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHRoYXQgaXMgYSBzdGFuZGFyZCBwYXJ0IG9mIG9mZmljaWFsCiAgIFB5dGhvbiBkaXN0cmlidXRpb25zOyBQeXRob25MYXVuY2hlciwgd2hpY2ggaGFuZGxlcyBkb3VibGUtY2xpY2tpbmcgUHl0aG9uCiAgIHNjcmlwdHMgZnJvbSB0aGUgRmluZGVyOyBhbmQgdGhlICJCdWlsZCBBcHBsZXQiIHRvb2wsIHdoaWNoIGFsbG93cyB5b3UgdG8KQEAgLTkzLDcgKzkzLDcgQEAKIGFueXRoaW5nIHRoYXQgaGFzIGEgR1VJKSBuZWVkIHRvIGJlIHJ1biBpbiBhIHNwZWNpYWwgd2F5LiBVc2UgOnByb2dyYW06YHB5dGhvbndgCiBpbnN0ZWFkIG9mIDpwcm9ncmFtOmBweXRob25gIHRvIHN0YXJ0IHN1Y2ggc2NyaXB0cy4KIAotV2l0aCBQeXRob24gMy41LCB5b3UgY2FuIHVzZSBlaXRoZXIgOnByb2dyYW06YHB5dGhvbmAgb3IgOnByb2dyYW06YHB5dGhvbndgLgorV2l0aCBQeXRob24gMy42LCB5b3UgY2FuIHVzZSBlaXRoZXIgOnByb2dyYW06YHB5dGhvbmAgb3IgOnByb2dyYW06YHB5dGhvbndgLgogCiAKIENvbmZpZ3VyYXRpb24KQEAgLTE1OSw3ICsxNTksNyBAQAogRGlzdHJpYnV0aW5nIFB5dGhvbiBBcHBsaWNhdGlvbnMgb24gdGhlIE1hYwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGUgIkJ1aWxkIEFwcGxldCIgdG9vbCB0aGF0IGlzIHBsYWNlZCBpbiB0aGUgTWFjUHl0aG9uIDMuNSBmb2xkZXIgaXMgZmluZSBmb3IKK1RoZSAiQnVpbGQgQXBwbGV0IiB0b29sIHRoYXQgaXMgcGxhY2VkIGluIHRoZSBNYWNQeXRob24gMy42IGZvbGRlciBpcyBmaW5lIGZvcgogcGFja2FnaW5nIHNtYWxsIFB5dGhvbiBzY3JpcHRzIG9uIHlvdXIgb3duIG1hY2hpbmUgdG8gcnVuIGFzIGEgc3RhbmRhcmQgTWFjCiBhcHBsaWNhdGlvbi4gVGhpcyB0b29sLCBob3dldmVyLCBpcyBub3Qgcm9idXN0IGVub3VnaCB0byBkaXN0cmlidXRlIFB5dGhvbgogYXBwbGljYXRpb25zIHRvIG90aGVyIHVzZXJzLgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuNi5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy42LnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzExMTJmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jL3doYXRzbmV3LzMuNi5yc3QKQEAgLTAsMCArMSw1MzUgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgV2hhdCdzIE5ldyBJbiBQeXRob24gMy42CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKzpSZWxlYXNlOiB8cmVsZWFzZXwKKzpEYXRlOiB8dG9kYXl8CisKKy4uIFJ1bGVzIGZvciBtYWludGVuYW5jZToKKworICAgKiBBbnlvbmUgY2FuIGFkZCB0ZXh0IHRvIHRoaXMgZG9jdW1lbnQuICBEbyBub3Qgc3BlbmQgdmVyeSBtdWNoIHRpbWUKKyAgIG9uIHRoZSB3b3JkaW5nIG9mIHlvdXIgY2hhbmdlcywgYmVjYXVzZSB5b3VyIHRleHQgd2lsbCBwcm9iYWJseQorICAgZ2V0IHJld3JpdHRlbiB0byBzb21lIGRlZ3JlZS4KKworICAgKiBUaGUgbWFpbnRhaW5lciB3aWxsIGdvIHRocm91Z2ggTWlzYy9ORVdTIHBlcmlvZGljYWxseSBhbmQgYWRkCisgICBjaGFuZ2VzOyBpdCdzIHRoZXJlZm9yZSBtb3JlIGltcG9ydGFudCB0byBhZGQgeW91ciBjaGFuZ2VzIHRvCisgICBNaXNjL05FV1MgdGhhbiB0byB0aGlzIGZpbGUuCisKKyAgICogVGhpcyBpcyBub3QgYSBjb21wbGV0ZSBsaXN0IG9mIGV2ZXJ5IHNpbmdsZSBjaGFuZ2U7IGNvbXBsZXRlbmVzcworICAgaXMgdGhlIHB1cnBvc2Ugb2YgTWlzYy9ORVdTLiAgU29tZSBjaGFuZ2VzIEkgY29uc2lkZXIgdG9vIHNtYWxsCisgICBvciBlc290ZXJpYyB0byBpbmNsdWRlLiAgSWYgc3VjaCBhIGNoYW5nZSBpcyBhZGRlZCB0byB0aGUgdGV4dCwKKyAgIEknbGwganVzdCByZW1vdmUgaXQuICAoVGhpcyBpcyBhbm90aGVyIHJlYXNvbiB5b3Ugc2hvdWxkbid0IHNwZW5kCisgICB0b28gbXVjaCB0aW1lIG9uIHdyaXRpbmcgeW91ciBhZGRpdGlvbi4pCisKKyAgICogSWYgeW91IHdhbnQgdG8gZHJhdyB5b3VyIG5ldyB0ZXh0IHRvIHRoZSBhdHRlbnRpb24gb2YgdGhlCisgICBtYWludGFpbmVyLCBhZGQgJ1hYWCcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoIG9yCisgICBzZWN0aW9uLgorCisgICAqIEl0J3MgT0sgdG8ganVzdCBhZGQgYSBmcmFnbWVudGFyeSBub3RlIGFib3V0IGEgY2hhbmdlLiAgRm9yCisgICBleGFtcGxlOiAiWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUKKyAgIHNvY2tldCBtb2R1bGUuIiAgVGhlIG1haW50YWluZXIgd2lsbCByZXNlYXJjaCB0aGUgY2hhbmdlIGFuZAorICAgd3JpdGUgdGhlIG5lY2Vzc2FyeSB0ZXh0LgorCisgICAqIFlvdSBjYW4gY29tbWVudCBvdXQgeW91ciBhZGRpdGlvbnMgaWYgeW91IGxpa2UsIGJ1dCBpdCdzIG5vdAorICAgbmVjZXNzYXJ5IChlc3BlY2lhbGx5IHdoZW4gYSBmaW5hbCByZWxlYXNlIGlzIHNvbWUgbW9udGhzIGF3YXkpLgorCisgICAqIENyZWRpdCB0aGUgYXV0aG9yIG9mIGEgcGF0Y2ggb3IgYnVnZml4LiAgIEp1c3QgdGhlIG5hbWUgaXMKKyAgIHN1ZmZpY2llbnQ7IHRoZSBlLW1haWwgYWRkcmVzcyBpc24ndCBuZWNlc3NhcnkuCisKKyAgICogSXQncyBoZWxwZnVsIHRvIGFkZCB0aGUgYnVnL3BhdGNoIG51bWJlciBhcyBhIGNvbW1lbnQ6CisKKyAgIFhYWCBEZXNjcmliZSB0aGUgdHJhbnNtb2dyaWZ5KCkgZnVuY3Rpb24gYWRkZWQgdG8gdGhlIHNvY2tldAorICAgbW9kdWxlLgorICAgKENvbnRyaWJ1dGVkIGJ5IFAuWS4gRGV2ZWxvcGVyIGluIDppc3N1ZTpgMTIzNDVgLikKKworICAgVGhpcyBzYXZlcyB0aGUgbWFpbnRhaW5lciB0aGUgZWZmb3J0IG9mIGdvaW5nIHRocm91Z2ggdGhlIE1lcmN1cmlhbCBsb2cKKyAgIHdoZW4gcmVzZWFyY2hpbmcgYSBjaGFuZ2UuCisKK1RoaXMgYXJ0aWNsZSBleHBsYWlucyB0aGUgbmV3IGZlYXR1cmVzIGluIFB5dGhvbiAzLjYsIGNvbXBhcmVkIHRvIDMuNS4KKworRm9yIGZ1bGwgZGV0YWlscywgc2VlIHRoZSA6c291cmNlOmBNaXNjL05FV1NgIGZpbGUuCisKKy4uIG5vdGU6OgorCisgICBQcmVyZWxlYXNlIHVzZXJzIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoaXMgZG9jdW1lbnQgaXMgY3VycmVudGx5IGluIGRyYWZ0CisgICBmb3JtLiBJdCB3aWxsIGJlIHVwZGF0ZWQgc3Vic3RhbnRpYWxseSBhcyBQeXRob24gMy42IG1vdmVzIHRvd2FyZHMgcmVsZWFzZSwKKyAgIHNvIGl0J3Mgd29ydGggY2hlY2tpbmcgYmFjayBldmVuIGFmdGVyIHJlYWRpbmcgZWFybGllciB2ZXJzaW9ucy4KKworCitTdW1tYXJ5IC0tIFJlbGVhc2UgaGlnaGxpZ2h0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLi4gVGhpcyBzZWN0aW9uIHNpbmdsZXMgb3V0IHRoZSBtb3N0IGltcG9ydGFudCBjaGFuZ2VzIGluIFB5dGhvbiAzLjYuCisgICBCcmV2aXR5IGlzIGtleS4KKworKiBQRVAgNDk4OiA6cmVmOmBGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIDx3aGF0c25ldy1mc3RyaW5ncz5gCisKKy4uIFBFUC1zaXplZCBpdGVtcyBuZXh0LgorCisuLiBfcGVwLTRYWDoKKworLi4gUEVQIDRYWDogVmlydHVhbCBFbnZpcm9ubWVudHMKKy4uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworLi4gKEltcGxlbWVudGVkIGJ5IEZvbyBCYXIuKQorCisuLiAuLiBzZWVhbHNvOjoKKworICAgIDpwZXA6YDRYWGAgLSBQeXRob24gVmlydHVhbCBFbnZpcm9ubWVudHMKKyAgICAgICBQRVAgd3JpdHRlbiBieSBDYXJsIE1leWVyCisKKworTmV3IEZlYXR1cmVzCis9PT09PT09PT09PT0KKworLi4gX3doYXRzbmV3LWZzdHJpbmdzOgorCitQRVAgNDk4OiBGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgYXJlIGEgbmV3IGtpbmQgb2Ygc3RyaW5nIGxpdGVyYWwsIHByZWZpeGVkCit3aXRoIGBgJ2YnYGAuICBUaGV5IGFyZSBzaW1pbGFyIHRvIHRoZSBmb3JtYXQgc3RyaW5ncyBhY2NlcHRlZCBieQorOm1ldGg6YHN0ci5mb3JtYXRgLiAgVGhleSBjb250YWluIHJlcGxhY2VtZW50IGZpZWxkcyBzdXJyb3VuZGVkIGJ5CitjdXJseSBicmFjZXMuICBUaGUgcmVwbGFjZW1lbnQgZmllbGRzIGFyZSBleHByZXNzaW9ucywgd2hpY2ggYXJlCitldmFsdWF0ZWQgYXQgcnVuIHRpbWUsIGFuZCB0aGVuIGZvcm1hdHRlZCB1c2luZyB0aGUgOmZ1bmM6YGZvcm1hdGAgcHJvdG9jb2wuCisKKyAgICA+Pj4gbmFtZSA9ICJGcmVkIgorICAgID4+PiBmIkhlIHNhaWQgaGlzIG5hbWUgaXMge25hbWV9LiIKKyAgICAnSGUgc2FpZCBoaXMgbmFtZSBpcyBGcmVkLicKKworU2VlIDpwZXA6YDQ5OGAgYW5kIHRoZSBtYWluIGRvY3VtZW50YXRpb24gYXQgOnJlZjpgZi1zdHJpbmdzYC4KKworCitQWVRIT05NQUxMT0MgZW52aXJvbm1lbnQgdmFyaWFibGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbmV3IDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgYWxsb3dzIHRvIHNldCB0aGUgUHl0aG9uCittZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rcy4KKworSXQgaXMgbm93IHBvc3NpYmxlIHRvIGluc3RhbGwgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIG9uIFB5dGhvbgorY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlIHVzaW5nIGBgUFlUSE9OTUFMTE9DPWRlYnVnYGAuIEVmZmVjdHMgb2YgZGVidWcgaG9va3M6CisKKyogTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYAorKiBGcmVlZCBtZW1vcnkgaXMgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweERCYGAKKyogRGV0ZWN0IHZpb2xhdGlvbnMgb2YgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgQVBJLiBGb3IgZXhhbXBsZSwKKyAgOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieQorICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLgorKiBEZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQorKiBEZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisqIENoZWNrIHRoYXQgdGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgaXMgaGVsZCB3aGVuIGFsbG9jYXRvcgorICBmdW5jdGlvbnMgb2YgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgKGV4OiA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBhbmQKKyAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgKSBkb21haW5zIGFyZSBjYWxsZWQuCisKK0NoZWNraW5nIGlmIHRoZSBHSUwgaXMgaGVsZCBpcyBhbHNvIGEgbmV3IGZlYXR1cmUgb2YgUHl0aG9uIDMuNi4KKworU2VlIHRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGZvciBkZWJ1ZyBob29rcyBvbiBQeXRob24KK21lbW9yeSBhbGxvY2F0b3JzLgorCitJdCBpcyBub3cgYWxzbyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgYWxsb2NhdG9yIG9mCit0aGUgQyBsaWJyYXJ5IGZvciBhbGwgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyB1c2luZyBgYFBZVEhPTk1BTExPQz1tYWxsb2NgYC4KK0l0IGhlbHBzIHRvIHVzZSBleHRlcm5hbCBtZW1vcnkgZGVidWdnZXJzIGxpa2UgVmFsZ3JpbmQgb24gYSBQeXRob24gY29tcGlsZWQgaW4KK3JlbGVhc2UgbW9kZS4KKworT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZSB0aGUKKzptb2Q6YHRyYWNlbWFsbG9jYCBtb2R1bGUgdG8gZ2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzCithbGxvY2F0ZWQuCisKK0V4YW1wbGUgb2YgZmF0YWwgZXJyb3Igb24gYnVmZmVyIG92ZXJmbG93IHVzaW5nCitgYHB5dGhvbjMuNiAtWCB0cmFjZW1hbGxvYz01YGAgKHN0b3JlIDUgZnJhbWVzIGluIHRyYWNlcyk6OgorCisgICAgRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD0weDdmYmNkNDE2NjZmODogQVBJICdvJworICAgICAgICA0IGJ5dGVzIG9yaWdpbmFsbHkgcmVxdWVzdGVkCisgICAgICAgIFRoZSA3IHBhZCBieXRlcyBhdCBwLTcgYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLgorICAgICAgICBUaGUgOCBwYWQgYnl0ZXMgYXQgdGFpbD0weDdmYmNkNDE2NjZmYyBhcmUgbm90IGFsbCBGT1JCSURERU5CWVRFICgweGZiKToKKyAgICAgICAgICAgIGF0IHRhaWwrMDogMHgwMiAqKiogT1VDSAorICAgICAgICAgICAgYXQgdGFpbCsxOiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzI6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrMzogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs0OiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzU6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNjogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs3OiAweGZiCisgICAgICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMxMjMzMzI5IHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLgorICAgICAgICBEYXRhIGF0IHA6IDFhIDJiIDMwIDAwCisKKyAgICBNZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAKKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDY0OAorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDEyMgorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDg0CisKKyAgICBGYXRhbCBQeXRob24gZXJyb3I6IGJhZCB0cmFpbGluZyBwYWQgYnl0ZQorCisgICAgQ3VycmVudCB0aHJlYWQgMHgwMDAwN2ZiY2RiZDMyNzAwIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzIGluIHRlc3RfaGV4CisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2NDggaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIC4uLgorCisoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjUxNmAgYW5kIDppc3N1ZTpgMjY1NjRgLikKKworCitPdGhlciBMYW5ndWFnZSBDaGFuZ2VzCis9PT09PT09PT09PT09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworTmV3IE1vZHVsZXMKKz09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworSW1wcm92ZWQgTW9kdWxlcworPT09PT09PT09PT09PT09PQorCitjb250ZXh0bGliCistLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAgY2xhc3MgaGFzIGJlZW4gYWRkZWQgdG8KK3Byb3ZpZGUgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udGV4dCBtYW5hZ2Vycy4gSXQgcHJvdmlkZXMgYQorc2Vuc2libGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYF9fZW50ZXJfXygpYCB3aGljaCByZXR1cm5zCitgYHNlbGZgYCBhbmQgbGVhdmVzIGBfX2V4aXRfXygpYCBhbiBhYnN0cmFjdCBtZXRob2QuIEEgbWF0Y2hpbmcKK2NsYXNzIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSA6bW9kOmB0eXBpbmdgIG1vZHVsZSBhcworOmNsYXNzOmB0eXBpbmcuQ29udGV4dE1hbmFnZXJgLgorKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NjA5YC4pCisKKworZGF0ZXRpbWUKKy0tLS0tLS0tCisKK1RoZSA6bWV0aDpgZGF0ZXRpbWUuc3RyZnRpbWUoKSA8ZGF0ZXRpbWUuZGF0ZXRpbWUuc3RyZnRpbWU+YCBhbmQKKzptZXRoOmBkYXRlLnN0cmZ0aW1lKCkgPGRhdGV0aW1lLmRhdGUuc3RyZnRpbWU+YCBtZXRob2RzIG5vdyBzdXBwb3J0IElTTyA4NjAxIGRhdGUKK2RpcmVjdGl2ZXMgYGAlR2BgLCBgYCV1YGAgYW5kIGBgJVZgYC4KKyhDb250cmlidXRlZCBieSBBc2hsZXkgQW5kZXJzb24gaW4gOmlzc3VlOmAxMjAwNmAuKQorCisKK2ZhdWx0aGFuZGxlcgorLS0tLS0tLS0tLS0tCisKK09uIFdpbmRvd3MsIHRoZSA6bW9kOmBmYXVsdGhhbmRsZXJgIG1vZHVsZSBub3cgaW5zdGFsbHMgYSBoYW5kbGVyIGZvciBXaW5kb3dzCitleGNlcHRpb25zOiBzZWUgOmZ1bmM6YGZhdWx0aGFuZGxlci5lbmFibGVgLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4KKzppc3N1ZTpgMjM4NDhgLikKKworCitvcworLS0KKworQSBuZXcgOm1ldGg6YH5vcy5zY2FuZGlyLmNsb3NlYCBtZXRob2QgYWxsb3dzIGV4cGxpY2l0bHkgY2xvc2luZyBhCis6ZnVuYzpgfm9zLnNjYW5kaXJgIGl0ZXJhdG9yLiAgVGhlIDpmdW5jOmB+b3Muc2NhbmRpcmAgaXRlcmF0b3Igbm93CitzdXBwb3J0cyB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wuICBJZiBhIDpmdW5jOmBzY2FuZGlyYAoraXRlcmF0b3IgaXMgbmVpdGhlciBleGhhdXN0ZWQgbm9yIGV4cGxpY2l0bHkgY2xvc2VkIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYAord2lsbCBiZSBlbWl0dGVkIGluIGl0cyBkZXN0cnVjdG9yLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNTk5NGAuKQorCisKK3BpY2tsZQorLS0tLS0tCisKK09iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gbm93IGJlIHBpY2tsZWQKK3VzaW5nIDpyZWY6YHBpY2tsZSBwcm90b2NvbHMgPHBpY2tsZS1wcm90b2NvbHM+YCBvbGRlciB0aGFuIHByb3RvY29sIHZlcnNpb24gNC4KK1Byb3RvY29sIHZlcnNpb24gNCBhbHJlYWR5IHN1cHBvcnRzIHRoaXMgY2FzZS4gIChDb250cmlidXRlZCBieSBTZXJoaXkKK1N0b3JjaGFrYSBpbiA6aXNzdWU6YDI0MTY0YC4pCisKKworcmxjb21wbGV0ZXIKKy0tLS0tLS0tLS0tCisKK1ByaXZhdGUgYW5kIHNwZWNpYWwgYXR0cmlidXRlIG5hbWVzIG5vdyBhcmUgb21pdHRlZCB1bmxlc3MgdGhlIHByZWZpeCBzdGFydHMKK3dpdGggdW5kZXJzY29yZXMuICBBIHNwYWNlIG9yIGEgY29sb24gaXMgYWRkZWQgYWZ0ZXIgc29tZSBjb21wbGV0ZWQga2V5d29yZHMuCisoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI1MDExYCBhbmQgOmlzc3VlOmAyNTIwOWAuKQorCitOYW1lcyBvZiBtb3N0IGF0dHJpYnV0ZXMgbGlzdGVkIGJ5IDpmdW5jOmBkaXJgIGFyZSBub3cgY29tcGxldGVkLgorUHJldmlvdXNseSwgbmFtZXMgb2YgcHJvcGVydGllcyBhbmQgc2xvdHMgd2hpY2ggd2VyZSBub3QgeWV0IGNyZWF0ZWQgb24KK2FuIGluc3RhbmNlIHdlcmUgZXhjbHVkZWQuICAoQ29udHJpYnV0ZWQgYnkgTWFydGluIFBhbnRlciBpbiA6aXNzdWU6YDI1NTkwYC4pCisKKworc2l0ZQorLS0tLQorCitXaGVuIHNwZWNpZnlpbmcgcGF0aHMgdG8gYWRkIHRvIDphdHRyOmBzeXMucGF0aGAgaW4gYSBgLnB0aGAgZmlsZSwKK3lvdSBtYXkgbm93IHNwZWNpZnkgZmlsZSBwYXRocyBvbiB0b3Agb2YgZGlyZWN0b3JpZXMgKGUuZy4gemlwIGZpbGVzKS4KKyhDb250cmlidXRlZCBieSBXb2xmZ2FuZyBMYW5nbmVyIGluIDppc3N1ZTpgMjY1ODdgKS4KKworCitzb2NrZXRzZXJ2ZXIKKy0tLS0tLS0tLS0tLQorCitTZXJ2ZXJzIGJhc2VkIG9uIHRoZSA6bW9kOmBzb2NrZXRzZXJ2ZXJgIG1vZHVsZSwgaW5jbHVkaW5nIHRob3NlCitkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCis6bW9kOmB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJgLCBub3cgc3VwcG9ydCB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAKK3Byb3RvY29sLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjQwNGAuKQorCisKK3RlbG5ldGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgfnRlbG5ldGxpYi5UZWxuZXRgIGlzIG5vdyBhIGNvbnRleHQgbWFuYWdlciAoY29udHJpYnV0ZWQgYnkKK1N0w6lwaGFuZSBXaXJ0ZWwgaW4gOmlzc3VlOmAyNTQ4NWApLgorCisKK3R5cGluZworLS0tLS0tCisKK1RoZSA6Y2xhc3M6YHR5cGluZy5Db250ZXh0TWFuYWdlcmAgY2xhc3MgaGFzIGJlZW4gYWRkZWQgZm9yCityZXByZXNlbnRpbmcgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgLgorKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NjA5YC4pCisKKwordW5pdHRlc3QubW9jaworLS0tLS0tLS0tLS0tLQorCitUaGUgOmNsYXNzOmB+dW5pdHRlc3QubW9jay5Nb2NrYCBjbGFzcyBoYXMgdGhlIGZvbGxvd2luZyBpbXByb3ZlbWVudHM6CisKKyogVHdvIG5ldyBtZXRob2RzLCA6bWV0aDpgTW9jay5hc3NlcnRfY2FsbGVkKCkKKyAgPHVuaXR0ZXN0Lm1vY2suTW9jay5hc3NlcnRfY2FsbGVkPmAgYW5kIDptZXRoOmBNb2NrLmFzc2VydF9jYWxsZWRfb25jZSgpCisgIDx1bml0dGVzdC5tb2NrLk1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlPmAgdG8gY2hlY2sgaWYgdGhlIG1vY2sgb2JqZWN0CisgIHdhcyBjYWxsZWQuCisgIChDb250cmlidXRlZCBieSBBbWl0IFNhaGEgaW4gOmlzc3VlOmAyNjMyM2AuKQorCisKK3VybGxpYi5yb2JvdHBhcnNlcgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKzpjbGFzczpgfnVybGxpYi5yb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXJgIG5vdyBzdXBwb3J0cyB0aGUgYGBDcmF3bC1kZWxheWBgIGFuZAorYGBSZXF1ZXN0LXJhdGVgYCBleHRlbnNpb25zLgorKENvbnRyaWJ1dGVkIGJ5IE5pa29sYXkgQm9nb3ljaGV2IGluIDppc3N1ZTpgMTYwOTlgLikKKworCit3YXJuaW5ncworLS0tLS0tLS0KKworQSBuZXcgb3B0aW9uYWwgKnNvdXJjZSogcGFyYW1ldGVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorOmZ1bmM6YHdhcm5pbmdzLndhcm5fZXhwbGljaXRgIGZ1bmN0aW9uOiB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKzpleGM6YFJlc291cmNlV2FybmluZ2AuIEEgKnNvdXJjZSogYXR0cmlidXRlIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8KKzpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgIChjb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjU2OGAgYW5kIDppc3N1ZTpgMjY1NjdgKS4KKworV2hlbiBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZyBpcyBsb2dnZWQsIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgbm93Cit1c2VkIHRvIHRyeSB0byByZXRyaWV2ZSB0aGUgdHJhY2ViYWNrIHdoZXJlIHRoZSBkZXRyb3llZCBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKworRXhhbXBsZSB3aXRoIHRoZSBzY3JpcHQgYGBleGFtcGxlLnB5YGA6OgorCisgICAgaW1wb3J0IHdhcm5pbmdzCisKKyAgICBkZWYgZnVuYygpOgorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKworICAgIGYgPSBmdW5jKCkKKyAgICBmID0gTm9uZQorCitPdXRwdXQgb2YgdGhlIGNvbW1hbmQgYGBweXRob24zLjYgLVdkIC1YIHRyYWNlbWFsbG9jPTUgZXhhbXBsZS5weWBgOjoKKworICAgIGV4YW1wbGUucHk6NzogUmVzb3VyY2VXYXJuaW5nOiB1bmNsb3NlZCBmaWxlIDxfaW8uVGV4dElPV3JhcHBlciBuYW1lPSdleGFtcGxlLnB5JyBtb2RlPSdyJyBlbmNvZGluZz0nVVRGLTgnPgorICAgICAgZiA9IE5vbmUKKyAgICBPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNAorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNgorICAgICAgICBmID0gZnVuYygpCisKK1RoZSAiT2JqZWN0IGFsbG9jYXRlZCBhdCIgdHJhY2ViYWNrIGlzIG5ldyBhbmQgb25seSBkaXNwbGF5ZWQgaWYKKzptb2Q6YHRyYWNlbWFsbG9jYCBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGlmIHRoZQorOm1vZDpgd2FybmluZ3NgIHdhcyBhbHJlYWR5IGltcG9ydGVkLgorCisKK3ppcGZpbGUKKy0tLS0tLS0KKworQSBuZXcgOm1ldGg6YFppcEluZm8uZnJvbV9maWxlKCkgPHppcGZpbGUuWmlwSW5mby5mcm9tX2ZpbGU+YCBjbGFzcyBtZXRob2QKK2FsbG93cyBtYWtpbmcgYSA6Y2xhc3M6YH56aXBmaWxlLlppcEluZm9gIGluc3RhbmNlIGZyb20gYSBmaWxlc3lzdGVtIGZpbGUuCitBIG5ldyA6bWV0aDpgWmlwSW5mby5pc19kaXIoKSA8emlwZmlsZS5aaXBJbmZvLmlzX2Rpcj5gIG1ldGhvZCBjYW4gYmUgdXNlZAordG8gY2hlY2sgaWYgdGhlIDpjbGFzczpgfnppcGZpbGUuWmlwSW5mb2AgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS4KKyhDb250cmlidXRlZCBieSBUaG9tYXMgS2x1eXZlciBpbiA6aXNzdWU6YDI2MDM5YC4pCisKKworemxpYgorLS0tLQorCitUaGUgOmZ1bmM6YH56bGliLmNvbXByZXNzYCBmdW5jdGlvbiBub3cgYWNjZXB0cyBrZXl3b3JkIGFyZ3VtZW50cy4KKyhDb250cmlidXRlZCBieSBBdml2IFBhbGl2b2RhIGluIDppc3N1ZTpgMjYyNDNgLikKKworCitPcHRpbWl6YXRpb25zCis9PT09PT09PT09PT09CisKKyogVGhlIEFTQ0lJIGRlY29kZXIgaXMgbm93IHVwIHRvIDYwIHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yIGhhbmRsZXJzCisgIGBgc3Vycm9nYXRlZXNjYXBlYGAsIGBgaWdub3JlYGAgYW5kIGBgcmVwbGFjZWBgIChDb250cmlidXRlZAorICBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI0ODcwYCkuCisKKyogVGhlIEFTQ0lJIGFuZCB0aGUgTGF0aW4xIGVuY29kZXJzIGFyZSBub3cgdXAgdG8gMyB0aW1lcyBhcyBmYXN0IGZvciB0aGUKKyAgZXJyb3IgaGFuZGxlciBgYHN1cnJvZ2F0ZWVzY2FwZWBgIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI1MjI3YCkuCisKKyogVGhlIFVURi04IGVuY29kZXIgaXMgbm93IHVwIHRvIDc1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yIGhhbmRsZXJzCisgIGBgaWdub3JlYGAsIGBgcmVwbGFjZWBgLCBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYHN1cnJvZ2F0ZXBhc3NgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTI2N2ApLgorCisqIFRoZSBVVEYtOCBkZWNvZGVyIGlzIG5vdyB1cCB0byAxNSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCBhbmQgYGBzdXJyb2dhdGVlc2NhcGVgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTMwMWApLgorCisqIGBgYnl0ZXMgJSBhcmdzYGAgaXMgbm93IHVwIHRvIDIgdGltZXMgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIKKyAgaW4gOmlzc3VlOmAyNTM0OWApLgorCisqIGBgYnl0ZWFycmF5ICUgYXJnc2BgIGlzIG5vdyBiZXR3ZWVuIDIuNSBhbmQgNSB0aW1lcyBmYXN0ZXIuIChDb250cmlidXRlZCBieQorICBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI1Mzk5YCkuCisKKyogT3B0aW1pemUgOm1ldGg6YGJ5dGVzLmZyb21oZXhgIGFuZCA6bWV0aDpgYnl0ZWFycmF5LmZyb21oZXhgOiB0aGV5IGFyZSBub3cKKyAgYmV0d2VlbiAyeCBhbmQgMy41eCBmYXN0ZXIuIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI1NDAxYCkuCisKKyogT3B0aW1pemUgYGBieXRlcy5yZXBsYWNlKGInJywgYicuJylgYCBhbmQgYGBieXRlYXJyYXkucmVwbGFjZShiJycsIGInLicpYGA6CisgIHVwIHRvIDgwJSBmYXN0ZXIuIChDb250cmlidXRlZCBieSBKb3NoIFNuaWRlciBpbiA6aXNzdWU6YDI2NTc0YCkuCisKKworQnVpbGQgYW5kIEMgQVBJIENoYW5nZXMKKz09PT09PT09PT09PT09PT09PT09PT09CisKKyogTmV3IDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIEFQSSB3aGljaCBpbmRpY2F0ZXMgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YQorICBmYWlsZWQgKDppc3N1ZTpgNTMxOWApLgorCisKK0RlcHJlY2F0ZWQKKz09PT09PT09PT0KKworTmV3IEtleXdvcmRzCistLS0tLS0tLS0tLS0KKworYGBhc3luY2BgIGFuZCBgYGF3YWl0YGAgYXJlIG5vdCByZWNvbW1lbmRlZCB0byBiZSB1c2VkIGFzIHZhcmlhYmxlLCBjbGFzcywKK2Z1bmN0aW9uIG9yIG1vZHVsZSBuYW1lcy4gIEludHJvZHVjZWQgYnkgOnBlcDpgNDkyYCBpbiBQeXRob24gMy41LCB0aGV5IHdpbGwKK2JlY29tZSBwcm9wZXIga2V5d29yZHMgaW4gUHl0aG9uIDMuNy4KKworCitEZXByZWNhdGVkIFB5dGhvbiBtb2R1bGVzLCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIDptZXRoOmBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIubG9hZF9tb2R1bGVgIGFuZAorICA6bWV0aDpgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VsZXNzRmlsZUxvYWRlci5sb2FkX21vZHVsZWAgYXJlIG5vdworICBkZXByZWNhdGVkLiBUaGV5IHdlcmUgdGhlIG9ubHkgcmVtYWluaW5nIGltcGxlbWVudGF0aW9ucyBvZgorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIGluIDptb2Q6YGltcG9ydGxpYmAgdGhhdCBoYWQgbm90CisgIGJlZW4gZGVwcmVjYXRlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24gaW4gZmF2b3VyIG9mCisgIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAuCisKKworRGVwcmVjYXRlZCBmdW5jdGlvbnMgYW5kIHR5cGVzIG9mIHRoZSBDIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIE5vbmUgeWV0LgorCisKK0RlcHJlY2F0ZWQgZmVhdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgYGBweXZlbnZgYCBzY3JpcHQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgYGBweXRob24zIC1tIHZlbnZgYC4KKyAgVGhpcyBwcmV2ZW50cyBjb25mdXNpb24gYXMgdG8gd2hhdCBQeXRob24gaW50ZXJwcmV0ZXIgYGBweXZlbnZgYCBpcworICBjb25uZWN0ZWQgdG8gYW5kIHRodXMgd2hhdCBQeXRob24gaW50ZXJwcmV0ZXIgd2lsbCBiZSB1c2VkIGJ5IHRoZSB2aXJ0dWFsCisgIGVudmlyb25tZW50LiAoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjUxNTRgLikKKworKiBXaGVuIHBlcmZvcm1pbmcgYSByZWxhdGl2ZSBpbXBvcnQsIGZhbGxpbmcgYmFjayBvbiBgYF9fbmFtZV9fYGAgYW5kCisgIGBgX19wYXRoX19gYCBmcm9tIHRoZSBjYWxsaW5nIG1vZHVsZSB3aGVuIGBgX19zcGVjX19gYCBvcgorICBgYF9fcGFja2FnZV9fYGAgYXJlIG5vdCBkZWZpbmVkIG5vdyByYWlzZXMgYW4gOmV4YzpgSW1wb3J0V2FybmluZ2AuCisgIChDb250cmlidXRlZCBieSBSb3NlIEFtZXMgaW4gOmlzc3VlOmAyNTc5MWAuKQorCisKK0RlcHJlY2F0ZWQgUHl0aG9uIGJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFJhaXNpbmcgdGhlIDpleGM6YFN0b3BJdGVyYXRpb25gIGV4Y2VwdGlvbiBpbnNpZGUgYSBnZW5lcmF0b3Igd2lsbCBub3cgZ2VuZXJhdGUgYQorICA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgLCBhbmQgd2lsbCB0cmlnZ2VyIGEgOmV4YzpgUnVudGltZUVycm9yYCBpbiBQeXRob24gMy43LgorICBTZWUgOnJlZjpgd2hhdHNuZXctcGVwLTQ3OWAgZm9yIGRldGFpbHMuCisKKworUmVtb3ZlZAorPT09PT09PQorCitBUEkgYW5kIEZlYXR1cmUgUmVtb3ZhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIGBgaW5zcGVjdC5nZXRtb2R1bGVpbmZvKClgYCB3YXMgcmVtb3ZlZCAod2FzIGRlcHJlY2F0ZWQgc2luY2UgQ1B5dGhvbiAzLjMpLgorICA6ZnVuYzpgaW5zcGVjdC5nZXRtb2R1bGVuYW1lYCBzaG91bGQgYmUgdXNlZCBmb3Igb2J0YWluaW5nIHRoZSBtb2R1bGUKKyAgbmFtZSBmb3IgYSBnaXZlbiBwYXRoLgorCisqIGBgdHJhY2ViYWNrLklnbm9yZWBgIGNsYXNzIGFuZCBgYHRyYWNlYmFjay51c2FnZWBgLCBgYHRyYWNlYmFjay5tb2RuYW1lYGAsCisgIGBgdHJhY2ViYWNrLmZ1bGxtb2RuYW1lYGAsIGBgdHJhY2ViYWNrLmZpbmRfbGluZXNfZnJvbV9jb2RlYGAsCisgIGBgdHJhY2ViYWNrLmZpbmRfbGluZXNgYCwgYGB0cmFjZWJhY2suZmluZF9zdHJpbmdzYGAsCisgIGBgdHJhY2ViYWNrLmZpbmRfZXhlY3V0YWJsZV9saW5lc2BgIG1ldGhvZHMgd2VyZSByZW1vdmVkIGZyb20gdGhlCisgIDptb2Q6YHRyYWNlYmFja2AgbW9kdWxlLiBUaGV5IHdlcmUgdW5kb2N1bWVudGVkIG1ldGhvZHMgZGVwcmVjYXRlZCBzaW5jZQorICBQeXRob24gMy4yIGFuZCBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGZyb20gcHJpdmF0ZSBtZXRob2RzLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiB0aGUgUHl0aG9uIEFQSQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cyBjaGFuZ2VkIHRvIHN1cHBvcnQKKyAgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIEJ5IGRlZmF1bHQsIFB5dGhvbiBkb2VzIG5vdCBlbWl0IGJ5dGVjb2RlIHdpdGgKKyAgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIEZ1bmN0aW9ucyB1c2luZyBgYGZyYW1lLmZfbGluZW5vYGAsCisgIGBgUHlGcmFtZV9HZXRMaW5lTnVtYmVyKClgYCBvciBgYFB5Q29kZV9BZGRyMkxpbmUoKWBgIGFyZSBub3QgYWZmZWN0ZWQuCisgIEZ1bmN0aW9ucyBkZWNvZGluZyBkaXJlY3RseSBgYGNvX2xub3RhYmBgIHNob3VsZCBiZSB1cGRhdGVkIHRvIHVzZSBhIHNpZ25lZAorICA4LWJpdCBpbnRlZ2VyIHR5cGUgZm9yIHRoZSBsaW5lIG51bWJlciBkZWx0YSwgYnV0IGl0J3Mgb25seSByZXF1aXJlZCB0bworICBzdXBwb3J0IGFwcGxpY2F0aW9ucyB1c2luZyBuZWdhdGl2ZSBsaW5lIG51bWJlciBkZWx0YS4gU2VlCisgIGBgT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0YGAgZm9yIHRoZSBgYGNvX2xub3RhYmBgIGZvcm1hdCBhbmQgaG93IHRvIGRlY29kZQorICBpdCwgYW5kIHNlZSB0aGUgOnBlcDpgNTExYCBmb3IgdGhlIHJhdGlvbmFsZS4KKworKiBUaGUgZnVuY3Rpb25zIGluIHRoZSA6bW9kOmBjb21waWxlYWxsYCBtb2R1bGUgbm93IHJldHVybiBib29sZWFucyBpbnN0ZWFkCisgIG9mIGBgMWBgIG9yIGBgMGBgIHRvIHJlcHJlc2VudCBzdWNjZXNzIG9yIGZhaWx1cmUsIHJlc3BlY3RpdmVseS4gVGhhbmtzIHRvCisgIGJvb2xlYW5zIGJlaW5nIGEgc3ViY2xhc3Mgb2YgaW50ZWdlcnMsIHRoaXMgc2hvdWxkIG9ubHkgYmUgYW4gaXNzdWUgaWYgeW91CisgIHdlcmUgZG9pbmcgaWRlbnRpdHkgY2hlY2tzIGZvciBgYDFgYCBvciBgYDBgYC4gU2VlIDppc3N1ZTpgMjU3NjhgLgorCisqIFJlYWRpbmcgdGhlIDphdHRyOmB+dXJsbGliLnBhcnNlLlNwbGl0UmVzdWx0LnBvcnRgIGF0dHJpYnV0ZSBvZgorICA6ZnVuYzpgdXJsbGliLnBhcnNlLnVybHNwbGl0YCBhbmQgOmZ1bmM6YH51cmxsaWIucGFyc2UudXJscGFyc2VgIHJlc3VsdHMKKyAgbm93IHJhaXNlcyA6ZXhjOmBWYWx1ZUVycm9yYCBmb3Igb3V0LW9mLXJhbmdlIHZhbHVlcywgcmF0aGVyIHRoYW4KKyAgcmV0dXJuaW5nIDpjb25zdDpgTm9uZWAuICBTZWUgOmlzc3VlOmAyMDA1OWAuCisKKyogVGhlIDptb2Q6YGltcGAgbW9kdWxlIG5vdyByYWlzZXMgYSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgIGluc3RlYWQgb2YKKyAgOmV4YzpgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZ2AuCisKKyogVGhlIGZvbGxvd2luZyBtb2R1bGVzIGhhdmUgaGFkIG1pc3NpbmcgQVBJcyBhZGRlZCB0byB0aGVpciA6YXR0cjpgX19hbGxfX2AKKyAgYXR0cmlidXRlcyB0byBtYXRjaCB0aGUgZG9jdW1lbnRlZCBBUElzOiA6bW9kOmBjYWxlbmRhcmAsIDptb2Q6YGNzdmAsCisgIDptb2Q6YH54bWwuZXRyZWUuRWxlbWVudFRyZWVgLCA6bW9kOmBlbnVtYCwKKyAgOm1vZDpgZmlsZWlucHV0YCwgOm1vZDpgZnRwbGliYCwgOm1vZDpgbG9nZ2luZ2AsCisgIDptb2Q6YG9wdHBhcnNlYCwgOm1vZDpgc3VicHJvY2Vzc2AsIDptb2Q6YHRhcmZpbGVgLCA6bW9kOmB0aHJlYWRpbmdgIGFuZAorICA6bW9kOmB3YXZlYC4gIFRoaXMgbWVhbnMgdGhleSB3aWxsIGV4cG9ydCBuZXcgc3ltYm9scyB3aGVuIGBgaW1wb3J0ICpgYAorICBpcyB1c2VkLiAgU2VlIDppc3N1ZTpgMjM4ODNgLgorCisqIFdoZW4gcGVyZm9ybWluZyBhIHJlbGF0aXZlIGltcG9ydCwgaWYgYGBfX3BhY2thZ2VfX2BgIGRvZXMgbm90IGNvbXBhcmUgZXF1YWwKKyAgdG8gYGBfX3NwZWNfXy5wYXJlbnRgYCB0aGVuIDpleGM6YEltcG9ydFdhcm5pbmdgIGlzIHJhaXNlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NzkxYC4pCisKKyogV2hlbiBhIHJlbGF0aXZlIGltcG9ydCBpcyBwZXJmb3JtZWQgYW5kIG5vIHBhcmVudCBwYWNrYWdlIGlzIGtub3duLCB0aGVuCisgIDpleGM6YEltcG9ydEVycm9yYCB3aWxsIGJlIHJhaXNlZC4gUHJldmlvdXNseSwgOmV4YzpgU3lzdGVtRXJyb3JgIGNvdWxkIGJlCisgIHJhaXNlZC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDE4MDE4YC4pCisKKyogU2VydmVycyBiYXNlZCBvbiB0aGUgOm1vZDpgc29ja2V0c2VydmVyYCBtb2R1bGUsIGluY2x1ZGluZyB0aG9zZQorICBkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCisgIDptb2Q6YHdzZ2lyZWYuc2ltcGxlX3NlcnZlcmAsIG5vdyBvbmx5IGNhdGNoIGV4Y2VwdGlvbnMgZGVyaXZlZAorICBmcm9tIDpleGM6YEV4Y2VwdGlvbmAuIFRoZXJlZm9yZSBpZiBhIHJlcXVlc3QgaGFuZGxlciByYWlzZXMKKyAgYW4gZXhjZXB0aW9uIGxpa2UgOmV4YzpgU3lzdGVtRXhpdGAgb3IgOmV4YzpgS2V5Ym9hcmRJbnRlcnJ1cHRgLAorICA6bWV0aDpgfnNvY2tldHNlcnZlci5CYXNlU2VydmVyLmhhbmRsZV9lcnJvcmAgaXMgbm8gbG9uZ2VyIGNhbGxlZCwgYW5kCisgIHRoZSBleGNlcHRpb24gd2lsbCBzdG9wIGEgc2luZ2xlLXRocmVhZGVkIHNlcnZlci4gKENvbnRyaWJ1dGVkIGJ5CisgIE1hcnRpbiBQYW50ZXIgaW4gOmlzc3VlOmAyMzQzMGAuKQorCisqIDpmdW5jOmBzcHdkLmdldHNwbmFtYCBub3cgcmFpc2VzIGEgOmV4YzpgUGVybWlzc2lvbkVycm9yYCBpbnN0ZWFkIG9mCisgIDpleGM6YEtleUVycm9yYCBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KKworKiBUaGUgOm1ldGg6YHNvY2tldC5zb2NrZXQuY2xvc2VgIG1ldGhvZCBub3cgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZgorICBhbiBlcnJvciAoZS5nLiBFQkFERikgd2FzIHJlcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsLgorICBTZWUgOmlzc3VlOmAyNjY4NWAuCisKK0NoYW5nZXMgaW4gdGhlIEMgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIDpjOmZ1bmM6YFB5X0V4aXRgIChhbmQgdGhlIG1haW4gaW50ZXJwcmV0ZXIpIG5vdyBvdmVycmlkZSB0aGUgZXhpdCBzdGF0dXMKKyAgd2l0aCAxMjAgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSBmYWlsZWQuICBTZWUgOmlzc3VlOmA1MzE5YC4KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QgYi9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CmluZGV4IGVkYjU1MDIuLjdjOTI1MjQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QKKysrIGIvRG9jL3doYXRzbmV3L2luZGV4LnJzdApAQCAtMTEsNiArMTEsNyBAQAogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDIKIAorICAgMy42LnJzdAogICAgMy41LnJzdAogICAgMy40LnJzdAogICAgMy4zLnJzdApkaWZmIC0tZ2l0IGEvR3JhbW1hci9HcmFtbWFyIGIvR3JhbW1hci9HcmFtbWFyCmluZGV4IDk5ZmNlYTAuLjE0YmRlY2QgMTAwNjQ0Ci0tLSBhL0dyYW1tYXIvR3JhbW1hcgorKysgYi9HcmFtbWFyL0dyYW1tYXIKQEAgLTI3LDEzICsyNywxOCBAQAogZnVuY2RlZjogJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZQogCiBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnCi0gICAgICAgWycqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZl1dCi0gICAgIHwgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZikKK3R5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJwotICAgICAgIFsnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWZdXQotICAgICB8ICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYpCit2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKionIHZmcGRlZiBbJywnXQorKQogdmZwZGVmOiBOQU1FCiAKIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCAyZDNlYWNiLi4xYWIzNzZhIDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtMjAxLDkgKzIwMSwxMCBAQAogICAgICAgICAgICAgICAgICAgU2V0Q29tcF9raW5kPTksIERpY3RDb21wX2tpbmQ9MTAsIEdlbmVyYXRvckV4cF9raW5kPTExLAogICAgICAgICAgICAgICAgICAgQXdhaXRfa2luZD0xMiwgWWllbGRfa2luZD0xMywgWWllbGRGcm9tX2tpbmQ9MTQsCiAgICAgICAgICAgICAgICAgICBDb21wYXJlX2tpbmQ9MTUsIENhbGxfa2luZD0xNiwgTnVtX2tpbmQ9MTcsIFN0cl9raW5kPTE4LAotICAgICAgICAgICAgICAgICAgQnl0ZXNfa2luZD0xOSwgTmFtZUNvbnN0YW50X2tpbmQ9MjAsIEVsbGlwc2lzX2tpbmQ9MjEsCi0gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yMiwgU3Vic2NyaXB0X2tpbmQ9MjMsIFN0YXJyZWRfa2luZD0yNCwKLSAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yNSwgTGlzdF9raW5kPTI2LCBUdXBsZV9raW5kPTI3fTsKKyAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2tpbmQ9MTksIEpvaW5lZFN0cl9raW5kPTIwLCBCeXRlc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgTmFtZUNvbnN0YW50X2tpbmQ9MjIsIEVsbGlwc2lzX2tpbmQ9MjMsIENvbnN0YW50X2tpbmQ9MjQsCisgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yNSwgU3Vic2NyaXB0X2tpbmQ9MjYsIFN0YXJyZWRfa2luZD0yNywKKyAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yOCwgTGlzdF9raW5kPTI5LCBUdXBsZV9raW5kPTMwfTsKIHN0cnVjdCBfZXhwciB7CiAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CiAgICAgdW5pb24gewpAQCAtMjk3LDYgKzI5OCwxNiBAQAogICAgICAgICB9IFN0cjsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgaW50IGNvbnZlcnNpb247CisgICAgICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworICAgICAgICB9IEZvcm1hdHRlZFZhbHVlOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGFzZGxfc2VxICp2YWx1ZXM7CisgICAgICAgIH0gSm9pbmVkU3RyOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgIGJ5dGVzIHM7CiAgICAgICAgIH0gQnl0ZXM7CiAgICAgICAgIApAQCAtMzA1LDYgKzMxNiwxMCBAQAogICAgICAgICB9IE5hbWVDb25zdGFudDsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBjb25zdGFudCB2YWx1ZTsKKyAgICAgICAgfSBDb25zdGFudDsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBleHByX3R5IHZhbHVlOwogICAgICAgICAgICAgaWRlbnRpZmllciBhdHRyOwogICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKQEAgLTU0Myw2ICs1NTgsMTIgQEAKIGV4cHJfdHkgX1B5X051bShvYmplY3QgbiwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfU3RyKGEwLCBhMSwgYTIsIGEzKQogZXhwcl90eSBfUHlfU3RyKHN0cmluZyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBGb3JtYXR0ZWRWYWx1ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRm9ybWF0dGVkVmFsdWUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEJ5dGVzKGEwLCBhMSwgYTIsIGEzKSBfUHlfQnl0ZXMoYTAsIGExLCBhMiwgYTMpCiBleHByX3R5IF9QeV9CeXRlcyhieXRlcyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogI2RlZmluZSBOYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpIF9QeV9OYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCkBAIC01NTAsNiArNTcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBFbGxpcHNpcyhhMCwgYTEsIGEyKSBfUHlfRWxsaXBzaXMoYTAsIGExLCBhMikKIGV4cHJfdHkgX1B5X0VsbGlwc2lzKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENvbnN0YW50KGEwLCBhMSwgYTIsIGEzKSBfUHlfQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9Db25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEF0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfQXR0cmlidXRlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCiBleHByX3R5IF9QeV9BdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL2FzZGwuaCBiL0luY2x1ZGUvYXNkbC5oCmluZGV4IDQ5NTE1M2MuLjM1ZTlmYTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYXNkbC5oCisrKyBiL0luY2x1ZGUvYXNkbC5oCkBAIC02LDYgKzYsNyBAQAogdHlwZWRlZiBQeU9iamVjdCAqIGJ5dGVzOwogdHlwZWRlZiBQeU9iamVjdCAqIG9iamVjdDsKIHR5cGVkZWYgUHlPYmplY3QgKiBzaW5nbGV0b247Cit0eXBlZGVmIFB5T2JqZWN0ICogY29uc3RhbnQ7CiAKIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFzZGxfYy5weSB3YXMgY29tcGxldGVseQogICAgaW5kZXBlbmRlbnQgb2YgUHl0aG9uLCBidXQgaXQgaXMgYSBnb2FsIHRoZSByZXF1aXJlcyB0b28gbXVjaCB3b3JrCmRpZmYgLS1naXQgYS9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaCBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCmluZGV4IDExZDVmNDIuLmRiYzAzM2MgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCisrKyBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCkBAIC0xNyw5ICsxNyw5IEBACiAvKiBUaGVzZSBzdG9yZSB0aGVpciBsZW4gc2l6ZWQgYW5zd2VyIGluIHRoZSBnaXZlbiBwcmVhbGxvY2F0ZWQgKnJlc3VsdCBhcmcuICovCiBleHRlcm4gdm9pZCBfUHlfYnl0ZXNfbG93ZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CiBleHRlcm4gdm9pZCBfUHlfYnl0ZXNfdXBwZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIF9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOwogCiAvKiBUaGUgbWFrZXRyYW5zKCkgc3RhdGljIG1ldGhvZC4gKi8KIGV4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX21ha2V0cmFucyhQeV9idWZmZXIgKmZybSwgUHlfYnVmZmVyICp0byk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL2J5dGVzb2JqZWN0LmggYi9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKaW5kZXggNmMxZTBjMy4uNDU3ODA2OSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9ieXRlc29iamVjdC5oCisrKyBiL0luY2x1ZGUvYnl0ZXNvYmplY3QuaApAQCAtNjIsNyArNjIsMTQgQEAKIFB5QVBJX0ZVTkModm9pZCkgUHlCeXRlc19Db25jYXRBbmREZWwoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhpbnQpIF9QeUJ5dGVzX1Jlc2l6ZShQeU9iamVjdCAqKiwgUHlfc3NpemVfdCk7Ci1QeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUJ5dGVzX0Zvcm1hdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlCeXRlc19Gb3JtYXRFeCgKKyAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuLAorICAgIFB5T2JqZWN0ICphcmdzLAorICAgIGludCB1c2VfYnl0ZWFycmF5KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlCeXRlc19Gcm9tSGV4KAorICAgIFB5T2JqZWN0ICpzdHJpbmcsCisgICAgaW50IHVzZV9ieXRlYXJyYXkpOwogI2VuZGlmCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKIAkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKQEAgLTEyMyw2ICsxMzAsODcgQEAKICNkZWZpbmUgRl9BTFQJKDE8PDMpCiAjZGVmaW5lIEZfWkVSTwkoMTw8NCkKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorLyogVGhlIF9QeUJ5dGVzV3JpdGVyIHN0cnVjdHVyZSBpcyBiaWc6IGl0IGNvbnRhaW5zIGFuIGVtYmVkZWQgInN0YWNrIGJ1ZmZlciIuCisgICBBIF9QeUJ5dGVzV3JpdGVyIHZhcmlhYmxlIG11c3QgYmUgZGVjbGFyZWQgYXQgdGhlIGVuZCBvZiB2YXJpYWJsZXMgaW4gYQorICAgZnVuY3Rpb24gdG8gb3B0aW1pemUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIG9uIHRoZSBzdGFjay4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBieXRlcywgYnl0ZWFycmF5IG9yIE5VTEwgKHdoZW4gdGhlIHNtYWxsIGJ1ZmZlciBpcyB1c2VkKSAqLworICAgIFB5T2JqZWN0ICpidWZmZXI7CisKKyAgICAvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIHNpemUuICovCisgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7CisKKyAgICAvKiBNaW5pbXVtIG51bWJlciBvZiBhbGxvY2F0ZWQgYnl0ZXMsCisgICAgICAgaW5jcmVtZW50ZWQgYnkgX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgpICovCisgICAgUHlfc3NpemVfdCBtaW5fc2l6ZTsKKworICAgIC8qIElmIG5vbi16ZXJvLCB1c2UgYSBieXRlYXJyYXkgaW5zdGVhZCBvZiBhIGJ5dGVzIG9iamVjdCBmb3IgYnVmZmVyLiAqLworICAgIGludCB1c2VfYnl0ZWFycmF5OworCisgICAgLyogSWYgbm9uLXplcm8sIG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIChkZWZhdWx0OiAwKS4KKyAgICAgICBUaGlzIGZsYWcgbXVzdCBiZSB6ZXJvIGlmIHVzZV9ieXRlYXJyYXkgaXMgbm9uLXplcm8uICovCisgICAgaW50IG92ZXJhbGxvY2F0ZTsKKworICAgIC8qIFN0YWNrIGJ1ZmZlciAqLworICAgIGludCB1c2Vfc21hbGxfYnVmZmVyOworICAgIGNoYXIgc21hbGxfYnVmZmVyWzUxMl07Cit9IF9QeUJ5dGVzV3JpdGVyOworCisvKiBJbml0aWFsaXplIGEgYnl0ZXMgd3JpdGVyCisKKyAgIEJ5IGRlZmF1bHQsIHRoZSBvdmVyYWxsb2NhdGlvbiBpcyBkaXNhYmxlZC4gU2V0IHRoZSBvdmVyYWxsb2NhdGUgYXR0cmlidXRlCisgICB0byBjb250cm9sIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBidWZmZXIuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeUJ5dGVzV3JpdGVyX0luaXQoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcik7CisKKy8qIEdldCB0aGUgYnVmZmVyIGNvbnRlbnQgYW5kIHJlc2V0IHRoZSB3cml0ZXIuCisgICBSZXR1cm4gYSBieXRlcyBvYmplY3QsIG9yIGEgYnl0ZWFycmF5IG9iamVjdCBpZiB1c2VfYnl0ZWFycmF5IGlzIG5vbi16ZXJvLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyKTsKKworLyogRGVhbGxvY2F0ZSBtZW1vcnkgb2YgYSB3cml0ZXIgKGNsZWFyIGl0cyBpbnRlcm5hbCBidWZmZXIpLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpOworCisvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIHdyaXRlIHNpemUgYnl0ZXMuCisgICBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBidWZmZXIgZGF0YS4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9BbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHdyaXRlICpzaXplKiBieXRlcy4KKyAgIEFkZCBzaXplIHRvIHRoZSB3cml0ZXIgbWluaW11bSBzaXplIChtaW5fc2l6ZSBhdHRyaWJ1dGUpLgorCisgICBzdHIgaXMgdGhlIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJldHVybiB0aGUgdXBkYXRlZCBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBQeV9zc2l6ZV90IHNpemUpOworCisvKiBSZXNpemUgdGhlIGJ1ZmZlciB0byBtYWtlIGl0IGxhcmdlci4KKyAgIFRoZSBuZXcgYnVmZmVyIG1heSBiZSBsYXJnZXIgdGhhbiBzaXplIGJ5dGVzIGJlY2F1c2Ugb2Ygb3ZlcmFsbG9jYXRpb24uCisgICBSZXR1cm4gdGhlIHVwZGF0ZWQgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4KKworICAgTm90ZTogc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcyBpbiB0aGUgd3JpdGVyLgorCisgICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlIHRoZSB3cml0ZXIgbWluaW11bSBzaXplIChtaW5fc2l6ZSBhdHRyaWJ1dGUpLgorCisgICBTZWUgYWxzbyBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCkuCisgICAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIFdyaXRlIGJ5dGVzLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgY29uc3Qgdm9pZCAqYnl0ZXMsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKyNlbmRpZiAgIC8qIFB5X0xJTUlURURfQVBJICovCisKICNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9JbmNsdWRlL2NldmFsLmggYi9JbmNsdWRlL2NldmFsLmgKaW5kZXggYjUzNzNhOS4uZDE5NDA0NCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9jZXZhbC5oCisrKyBiL0luY2x1ZGUvY2V2YWwuaApAQCAtMjA2LDYgKzIwNiwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBfUHlFdmFsX1NpZ25hbEFzeW5jRXhjKHZvaWQpOwogI2VuZGlmCiAKKy8qIE1hc2tzIGFuZCB2YWx1ZXMgdXNlZCBieSBGT1JNQVRfVkFMVUUgb3Bjb2RlLiAqLworI2RlZmluZSBGVkNfTUFTSyAgICAgIDB4MworI2RlZmluZSBGVkNfTk9ORSAgICAgIDB4MAorI2RlZmluZSBGVkNfU1RSICAgICAgIDB4MQorI2RlZmluZSBGVkNfUkVQUiAgICAgIDB4MgorI2RlZmluZSBGVkNfQVNDSUkgICAgIDB4MworI2RlZmluZSBGVlNfTUFTSyAgICAgIDB4NAorI2RlZmluZSBGVlNfSEFWRV9TUEVDIDB4NAogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvY29kZS5oIGIvSW5jbHVkZS9jb2RlLmgKaW5kZXggOGVjZjM4YS4uYTMwMGVhZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9jb2RlLmgKKysrIGIvSW5jbHVkZS9jb2RlLmgKQEAgLTEyNiw3ICsxMjYsNyBAQAogI2VuZGlmCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeUNvZGVfT3B0aW1pemUoUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0KiBjb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcywgUHlPYmplY3QgKmxpbmVub19vYmopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMsIFB5T2JqZWN0ICpsbm90YWIpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvbG9uZ29iamVjdC5oIGIvSW5jbHVkZS9sb25nb2JqZWN0LmgKaW5kZXggYWVkNTljZS4uZWFmN2E3ZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9sb25nb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9sb25nb2JqZWN0LmgKQEAgLTY1LDcgKzY1LDggQEAKICMgIGVycm9yICJ2b2lkKiBkaWZmZXJlbnQgaW4gc2l6ZSBmcm9tIGludCwgbG9uZyBhbmQgbG9uZyBsb25nIgogI2VuZGlmIC8qIFNJWkVPRl9WT0lEX1AgKi8KIAotLyogVXNlZCBieSBQeXRob24vbXlzdHJ0b3VsLmMuICovCisvKiBVc2VkIGJ5IFB5dGhvbi9teXN0cnRvdWwuYywgX1B5Qnl0ZXNfRnJvbUhleCgpLAorICAgX1B5Qnl0ZXNfRGVjb2RlRXNjYXBlUmVjb2RlKCksIGV0Yy4gKi8KICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKIFB5QVBJX0RBVEEodW5zaWduZWQgY2hhcikgX1B5TG9uZ19EaWdpdFZhbHVlWzI1Nl07CiAjZW5kaWYKQEAgLTE4Miw2ICsxODMsMTMgQEAKICAgICBpbnQgYmFzZSwKICAgICBpbnQgYWx0ZXJuYXRlKTsKIAorUHlBUElfRlVOQyhjaGFyKikgX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcigKKyAgICBfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIGNoYXIgKnN0ciwKKyAgICBQeU9iamVjdCAqb2JqLAorICAgIGludCBiYXNlLAorICAgIGludCBhbHRlcm5hdGUpOworCiAvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKICAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCiBQeUFQSV9GVU5DKGludCkgX1B5TG9uZ19Gb3JtYXRBZHZhbmNlZFdyaXRlcigKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IDUwZDk3NDcuLjBjODg2MDMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtNzg1LDcgKzc4NSw3IEBACiAgICAgICAgIC0tKF9weV9kZWNyZWZfdG1wKS0+b2JfcmVmY250ICE9IDApICAgICAgICAgICAgIFwKICAgICAgICAgICAgIF9QeV9DSEVDS19SRUZDTlQoX3B5X2RlY3JlZl90bXApICAgICAgICAgICAgXAogICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9QeV9EZWFsbG9jKF9weV9kZWNyZWZfdG1wKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9QeV9EZWFsbG9jKF9weV9kZWNyZWZfdG1wKTsgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKIC8qIFNhZmVseSBkZWNyZWYgYG9wYCBhbmQgc2V0IGBvcGAgdG8gTlVMTCwgZXNwZWNpYWxseSB1c2VmdWwgaW4gdHBfY2xlYXIKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb3Bjb2RlLmggYi9JbmNsdWRlL29wY29kZS5oCmluZGV4IDNmOTE3ZmIuLmIyNjUzNjggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb3Bjb2RlLmgKKysrIGIvSW5jbHVkZS9vcGNvZGUuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAjZGVmaW5lIEJVSUxEX1RVUExFX1VOUEFDSyAgICAgIDE1MgogI2RlZmluZSBCVUlMRF9TRVRfVU5QQUNLICAgICAgICAxNTMKICNkZWZpbmUgU0VUVVBfQVNZTkNfV0lUSCAgICAgICAgMTU0CisjZGVmaW5lIEZPUk1BVF9WQUxVRSAgICAgICAgICAgIDE1NQogCiAvKiBFWENFUFRfSEFORExFUiBpcyBhIHNwZWNpYWwsIGltcGxpY2l0IGJsb2NrIHR5cGUgd2hpY2ggaXMgY3JlYXRlZCB3aGVuCiAgICBlbnRlcmluZyBhbiBleGNlcHQgaGFuZGxlci4gSXQgaXMgbm90IGFuIG9wY29kZSBidXQgd2UgZGVmaW5lIGl0IGhlcmUKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcGF0Y2hsZXZlbC5oIGIvSW5jbHVkZS9wYXRjaGxldmVsLmgKaW5kZXggMTI0OTA4Ni4uMjQ2ZWJhOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9wYXRjaGxldmVsLmgKKysrIGIvSW5jbHVkZS9wYXRjaGxldmVsLmgKQEAgLTE3LDEzICsxNywxMyBAQAogLyogVmVyc2lvbiBwYXJzZWQgb3V0IGludG8gbnVtZXJpYyB2YWx1ZXMgKi8KIC8qLS1zdGFydCBjb25zdGFudHMtLSovCiAjZGVmaW5lIFBZX01BSk9SX1ZFUlNJT04JMwotI2RlZmluZSBQWV9NSU5PUl9WRVJTSU9OCTUKLSNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgkxCi0jZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAorI2RlZmluZSBQWV9NSU5PUl9WRVJTSU9OCTYKKyNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgkwCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9BTFBIQQogI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAkwCiAKIC8qIFZlcnNpb24gYXMgYSBzdHJpbmcgKi8KLSNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy41LjErIgorI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIzLjYuMGEwIgogLyotLWVuZCBjb25zdGFudHMtLSovCiAKIC8qIFZlcnNpb24gYXMgYSBzaW5nbGUgNC1ieXRlIGhleCBudW1iZXIsIGUuZy4gMHgwMTA1MDJCMiA9PSAxLjUuMmIyLgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weV9jdXJzZXMuaCBiL0luY2x1ZGUvcHlfY3Vyc2VzLmgKaW5kZXggZjJjMDhmNi4uM2MyMTY5NyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weV9jdXJzZXMuaAorKysgYi9JbmNsdWRlL3B5X2N1cnNlcy5oCkBAIC0xMDMsOCArMTAzLDggQEAKICNlbmRpZgogCiAvKiBnZW5lcmFsIGVycm9yIG1lc3NhZ2VzICovCi1zdGF0aWMgY2hhciAqY2F0Y2hhbGxfRVJSICA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgRVJSIjsKLXN0YXRpYyBjaGFyICpjYXRjaGFsbF9OVUxMID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBOVUxMIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNhdGNoYWxsX0VSUltdICA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgRVJSIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNhdGNoYWxsX05VTExbXSA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgTlVMTCI7CiAKIC8qIEZ1bmN0aW9uIFByb3RvdHlwZSBNYWNyb3MgLSBUaGV5IGFyZSB1Z2x5IGJ1dCB2ZXJ5LCB2ZXJ5IHVzZWZ1bC4gOy0pCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlsaWZlY3ljbGUuaCBiL0luY2x1ZGUvcHlsaWZlY3ljbGUuaAppbmRleCBjY2RlYmUyLi5lOTZlYjcwIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKKysrIGIvSW5jbHVkZS9weWxpZmVjeWNsZS5oCkBAIC0yNyw2ICsyNyw3IEBACiBQeUFQSV9GVU5DKHZvaWQpIF9QeV9Jbml0aWFsaXplRXhfUHJpdmF0ZShpbnQsIGludCk7CiAjZW5kaWYKIFB5QVBJX0ZVTkModm9pZCkgUHlfRmluYWxpemUodm9pZCk7CitQeUFQSV9GVU5DKGludCkgUHlfRmluYWxpemVFeCh2b2lkKTsKIFB5QVBJX0ZVTkMoaW50KSBQeV9Jc0luaXRpYWxpemVkKHZvaWQpOwogUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5X05ld0ludGVycHJldGVyKHZvaWQpOwogUHlBUElfRlVOQyh2b2lkKSBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1hY3JvLmggYi9JbmNsdWRlL3B5bWFjcm8uaAppbmRleCAzZjZmNWRjLi40OTkyOWU1IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bWFjcm8uaAorKysgYi9JbmNsdWRlL3B5bWFjcm8uaApAQCAtMzYsNiArMzYsMTAgQEAKICNkZWZpbmUgUHlfQlVJTERfQVNTRVJUX0VYUFIoY29uZCkgXAogICAgIChzaXplb2YoY2hhciBbMSAtIDIqIShjb25kKV0pIC0gMSkKIAorI2RlZmluZSBQeV9CVUlMRF9BU1NFUlQoY29uZCkgIGRvIHsgICAgICAgICBcCisgICAgICAgICh2b2lkKVB5X0JVSUxEX0FTU0VSVF9FWFBSKGNvbmQpOyAgIFwKKyAgICB9IHdoaWxlKDApCisKIC8qIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgdmlzaWJsZSBhcnJheQogCiAgICBUaGlzIGRvZXMgbm90IHdvcmsgb24gcG9pbnRlcnMsIG9yIGFycmF5cyBkZWNsYXJlZCBhcyBbXSwgb3IgZnVuY3Rpb24KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltYXRoLmggYi9JbmNsdWRlL3B5bWF0aC5oCmluZGV4IDFlYTlhYzEuLmVkNzYwNTMgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYXRoLmgKKysrIGIvSW5jbHVkZS9weW1hdGguaApAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgICAgICNwcmFnbWEgZmxvYXRfY29udHJvbCAocG9wKQogICAgICAgICAjZGVmaW5lIFB5X05BTiBfX2ljY19uYW4oKQogICAgICNlbHNlIC8qIElDQ19OQU5fUkVMQVhFRCBhcyBkZWZhdWx0IGZvciBJbnRlbCBDb21waWxlciAqLwotICAgICAgICBzdGF0aWMgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OworICAgICAgICBzdGF0aWMgY29uc3QgdW5pb24geyB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsgZG91YmxlIF9faWNjX25hbjsgfSBfX25hbl9zdG9yZSA9IHswLDAsMCwwLDAsMCwweGY4LDB4N2Z9OwogICAgICAgICAjZGVmaW5lIFB5X05BTiAoX19uYW5fc3RvcmUuX19pY2NfbmFuKQogICAgICNlbmRpZiAvKiBJQ0NfTkFOX1NUUklDVCAqLwogI2VuZGlmIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHltZW0uaCBiL0luY2x1ZGUvcHltZW0uaAppbmRleCAwNDNkYjY0Li40MzFlNWI2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5bWVtLmgKKysrIGIvSW5jbHVkZS9weW1lbS5oCkBAIC0xNiw4ICsxNiw1MSBAQAogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd0NhbGxvYyhzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwogUHlBUElfRlVOQyh2b2lkICopIFB5TWVtX1Jhd1JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpOwogUHlBUElfRlVOQyh2b2lkKSBQeU1lbV9SYXdGcmVlKHZvaWQgKnB0cik7CisKKy8qIENvbmZpZ3VyZSB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzLiBQYXNzIE5VTEwgdG8gdXNlIGRlZmF1bHQKKyAgIGFsbG9jYXRvcnMuICovCitQeUFQSV9GVU5DKGludCkgX1B5TWVtX1NldHVwQWxsb2NhdG9ycyhjb25zdCBjaGFyICpvcHQpOworCisjaWZkZWYgV0lUSF9QWU1BTExPQworUHlBUElfRlVOQyhpbnQpIF9QeU1lbV9QeW1hbGxvY0VuYWJsZWQodm9pZCk7CiAjZW5kaWYKIAorLyogSWRlbnRpZmllciBvZiBhbiBhZGRyZXNzIHNwYWNlIChkb21haW4pIGluIHRyYWNlbWFsbG9jICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBfUHlUcmFjZU1hbGxvY19kb21haW5fdDsKKworLyogVHJhY2sgYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBpbiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmV0dXJuIC0xIG9uIGVycm9yIChmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IHRvIHN0b3JlCisgICB0aGUgdHJhY2UpLgorCisgICBSZXR1cm4gLTIgaWYgdHJhY2VtYWxsb2MgaXMgZGlzYWJsZWQuCisKKyAgIElmIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5IHRyYWNrZWQsIHVwZGF0ZSB0aGUgZXhpc3RpbmcgdHJhY2UuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVHJhY2soCisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLAorICAgIFB5X3VpbnRwdHJfdCBwdHIsCisgICAgc2l6ZV90IHNpemUpOworCisvKiBVbnRyYWNrIGFuIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2sgaW4gdGhlIHRyYWNlbWFsbG9jIG1vZHVsZS4KKyAgIERvIG5vdGhpbmcgaWYgdGhlIGJsb2NrIHdhcyBub3QgdHJhY2tlZC4KKworICAgUmV0dXJuIC0yIGlmIHRyYWNlbWFsbG9jIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgcmV0dXJuIDAuICovCitQeUFQSV9GVU5DKGludCkgX1B5VHJhY2VNYWxsb2NfVW50cmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgUHlfdWludHB0cl90IHB0cik7CisKKy8qIEdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQuCisKKyAgIFJldHVybiBhIHR1cGxlIG9mIChmaWxlbmFtZTogc3RyLCBsaW5lbm86IGludCkgdHVwbGVzLgorCisgICBSZXR1cm4gTm9uZSBpZiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlIGlzIGRpc2FibGVkIG9yIGlmIHRoZSBtZW1vcnkgYmxvY2sKKyAgIGlzIG5vdCB0cmFja2VkIGJ5IHRyYWNlbWFsbG9jLgorCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgUHlfdWludHB0cl90IHB0cik7CisjZW5kaWYgICAvKiAhUHlfTElNSVRFRF9BUEkgKi8KKwogCiAvKiBCRVdBUkU6CiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHlzdGF0ZS5oIGIvSW5jbHVkZS9weXN0YXRlLmgKaW5kZXggMDQ5OWE3NC4uZDY5ZDRjOSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXN0YXRlLmgKKysrIGIvSW5jbHVkZS9weXN0YXRlLmgKQEAgLTI0MSwxMSArMjQxLDIzIEBACiAqLwogUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKHZvaWQpOwogCi0vKiBIZWxwZXIvZGlhZ25vc3RpYyBmdW5jdGlvbiAtIHJldHVybiAxIGlmIHRoZSBjdXJyZW50IHRocmVhZAotICogY3VycmVudGx5IGhvbGRzIHRoZSBHSUwsIDAgb3RoZXJ3aXNlCi0gKi8KICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKKy8qIElzc3VlICMyNjU1ODogRmxhZyB0byBkaXNhYmxlIFB5R0lMU3RhdGVfQ2hlY2soKS4KKyAgIElmIHNldCB0byBub24temVybywgUHlHSUxTdGF0ZV9DaGVjaygpIGFsd2F5cyByZXR1cm4gMS4gKi8KK1B5QVBJX0RBVEEoaW50KSBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkOworCisvKiBIZWxwZXIvZGlhZ25vc3RpYyBmdW5jdGlvbiAtIHJldHVybiAxIGlmIHRoZSBjdXJyZW50IHRocmVhZAorICAgY3VycmVudGx5IGhvbGRzIHRoZSBHSUwsIDAgb3RoZXJ3aXNlLgorCisgICBUaGUgZnVuY3Rpb24gcmV0dXJucyAxIGlmIF9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQgaXMgbm9uLXplcm8uICovCiBQeUFQSV9GVU5DKGludCkgUHlHSUxTdGF0ZV9DaGVjayh2b2lkKTsKKworLyogVW5zYWZlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc2luZ2xlIFB5SW50ZXJwcmV0ZXJTdGF0ZSB1c2VkIGJ5IHRoaXMgcHJvY2VzcycKKyAgIEdJTFN0YXRlIGltcGxlbWVudGF0aW9uLgorCisgICBSZXR1cm4gTlVMTCBiZWZvcmUgX1B5R0lMU3RhdGVfSW5pdCgpIGlzIGNhbGxlZCBhbmQgYWZ0ZXIgX1B5R0lMU3RhdGVfRmluaSgpCisgICBpcyBjYWxsZWQuICovCitQeUFQSV9GVU5DKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKSBfUHlHSUxTdGF0ZV9HZXRJbnRlcnByZXRlclN0YXRlVW5zYWZlKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZiAgIC8qICNpZmRlZiBXSVRIX1RIUkVBRCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRob25ydW4uaCBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKaW5kZXggZjkyMTQ4ZC4uM2I5M2E4MCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRob25ydW4uaAorKysgYi9JbmNsdWRlL3B5dGhvbnJ1bi5oCkBAIC02Niw4ICs2Niw4IEBACiAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICAgICAgIC8qIGRlY29kZWQgZnJvbSB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyAqLwogICAgIGNvbnN0IGNoYXIqIGVuYywKICAgICBpbnQgc3RhcnQsCi0gICAgY2hhciAqcHMxLAotICAgIGNoYXIgKnBzMiwKKyAgICBjb25zdCBjaGFyICpwczEsCisgICAgY29uc3QgY2hhciAqcHMyLAogICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCiAgICAgaW50ICplcnJjb2RlLAogICAgIFB5QXJlbmEgKmFyZW5hKTsKQEAgLTc2LDggKzc2LDggQEAKICAgICBQeU9iamVjdCAqZmlsZW5hbWUsCiAgICAgY29uc3QgY2hhciogZW5jLAogICAgIGludCBzdGFydCwKLSAgICBjaGFyICpwczEsCi0gICAgY2hhciAqcHMyLAorICAgIGNvbnN0IGNoYXIgKnBzMSwKKyAgICBjb25zdCBjaGFyICpwczIsCiAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywKICAgICBpbnQgKmVycmNvZGUsCiAgICAgUHlBcmVuYSAqYXJlbmEpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXRpbWUuaCBiL0luY2x1ZGUvcHl0aW1lLmgKaW5kZXggNDk0MzIyYy4uOTg2MTJlMSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXRpbWUuaAorKysgYi9JbmNsdWRlL3B5dGltZS5oCkBAIC0zMCw3ICszMCwxMCBAQAogICAgIF9QeVRpbWVfUk9VTkRfRkxPT1I9MCwKICAgICAvKiBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKS4KICAgICAgICBGb3IgZXhhbXBsZSwgdXNlZCBmb3IgdGltZW91dCB0byB3YWl0ICJhdCBsZWFzdCIgTiBzZWNvbmRzLiAqLwotICAgIF9QeVRpbWVfUk9VTkRfQ0VJTElORworICAgIF9QeVRpbWVfUk9VTkRfQ0VJTElORz0xLAorICAgIC8qIFJvdW5kIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvIG5lYXJlc3QgZXZlbiBpbnRlZ2VyLgorICAgICAgIEZvciBleGFtcGxlLCB1c2VkIHRvIHJvdW5kIGZyb20gYSBQeXRob24gZmxvYXQuICovCisgICAgX1B5VGltZV9ST1VORF9IQUxGX0VWRU4KIH0gX1B5VGltZV9yb3VuZF90OwogCiAvKiBDb252ZXJ0IGEgdGltZV90IHRvIGEgUHlMb25nLiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zZXRvYmplY3QuaCBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKaW5kZXggZjE3YmMxYi4uODdlYzFjOCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zZXRvYmplY3QuaAorKysgYi9JbmNsdWRlL3NldG9iamVjdC5oCkBAIC0xMCwxMiArMTAsMTMgQEAKIAogLyogVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGVudHJpZXMgaW4gdGhlIHRhYmxlOgogCi0xLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTAotMi4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teQotMy4gRHVtbXk6ICAga2V5ID09IGR1bW15CisxLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTCBhbmQgaGFzaCA9PSAwCisyLiBEdW1teTogICBrZXkgPT0gZHVtbXkgYW5kIGhhc2ggPT0gLTEKKzMuIEFjdGl2ZTogIGtleSAhPSBOVUxMIGFuZCBrZXkgIT0gZHVtbXkgYW5kIGhhc2ggIT0gLTEKIAotVGhlIGhhc2ggZmllbGQgb2YgVW51c2VkIHNsb3RzIGhhdmUgbm8gbWVhbmluZy4KLVRoZSBoYXNoIGZpZWxkIG9mIER1bW1ueSBzbG90cyBhcmUgc2V0IHRvIC0xCitUaGUgaGFzaCBmaWVsZCBvZiBVbnVzZWQgc2xvdHMgaXMgYWx3YXlzIHplcm8uCisKK1RoZSBoYXNoIGZpZWxkIG9mIER1bW15IHNsb3RzIGFyZSBzZXQgdG8gLTEKIG1lYW5pbmcgdGhhdCBkdW1teSBlbnRyaWVzIGNhbiBiZSBkZXRlY3RlZCBieQogZWl0aGVyIGVudHJ5LT5rZXk9PWR1bW15IG9yIGJ5IGVudHJ5LT5oYXNoPT0tMS4KICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3RyYWNlYmFjay5oIGIvSW5jbHVkZS90cmFjZWJhY2suaAppbmRleCA4OTEwMDBjLi5mNzY3ZWE4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3RyYWNlYmFjay5oCisrKyBiL0luY2x1ZGUvdHJhY2ViYWNrLmgKQEAgLTUzLDE5ICs1Myw2MyBAQAogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSk7CiAKIC8qIFdyaXRlIHRoZSB0cmFjZWJhY2sgb2YgYWxsIHRocmVhZHMgaW50byB0aGUgZmlsZSAnZmQnLiBjdXJyZW50X3RocmVhZCBjYW4gYmUKLSAgIE5VTEwuIFJldHVybiBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb24gZXJyb3IuCisgICBOVUxMLgorCisgICBSZXR1cm4gTlVMTCBvbiBzdWNjZXNzLCBvciBhbiBlcnJvciBtZXNzYWdlIG9uIGVycm9yLgogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gZm9yIGRlYnVnIHB1cnBvc2Ugb25seS4gSXQgY2FsbHMKICAgIF9QeV9EdW1wVHJhY2ViYWNrKCkgZm9yIGVhY2ggdGhyZWFkLCBhbmQgc28gaGFzIHRoZSBzYW1lIGxpbWl0YXRpb25zLiBJdAogICAgb25seSB3cml0ZSB0aGUgdHJhY2ViYWNrIG9mIHRoZSBmaXJzdCAxMDAgdGhyZWFkczogd3JpdGUgIi4uLiIgaWYgdGhlcmUgYXJlCiAgICBtb3JlIHRocmVhZHMuCiAKKyAgIElmIGN1cnJlbnRfdHN0YXRlIGlzIE5VTEwsIHRoZSBmdW5jdGlvbiB0cmllcyB0byBnZXQgdGhlIFB5dGhvbiB0aHJlYWQgc3RhdGUKKyAgIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gSXQgaXMgbm90IGFuIGVycm9yIGlmIHRoZSBmdW5jdGlvbiBpcyB1bmFibGUgdG8gZ2V0CisgICB0aGUgY3VycmVudCBQeXRob24gdGhyZWFkIHN0YXRlLgorCisgICBJZiBpbnRlcnAgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdldCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgZnJvbQorICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZSwgb3IgZnJvbQorICAgX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSgpIGluIGxhc3QgcmVzb3J0LgorCisgICBJdCBpcyBiZXR0ZXIgdG8gcGFzcyBOVUxMIHRvIGludGVycCBhbmQgY3VycmVudF90c3RhdGUsIHRoZSBmdW5jdGlvbiB0cmllcworICAgZGlmZmVyZW50IG9wdGlvbnMgdG8gcmV0cmlldmUgdGhlc2UgaW5mb3JtYXRpb25zLgorCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLwogCiBQeUFQSV9EQVRBKGNvbnN0IGNoYXIqKSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoCi0gICAgaW50IGZkLCBQeUludGVycHJldGVyU3RhdGUgKmludGVycCwKLSAgICBQeVRocmVhZFN0YXRlICpjdXJyZW50X3RocmVhZCk7CisgICAgaW50IGZkLAorICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAorICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdHN0YXRlKTsKIAorI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorCisvKiBXcml0ZSBhIFVuaWNvZGUgb2JqZWN0IGludG8gdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4gRW5jb2RlIHRoZSBzdHJpbmcgdG8KKyAgIEFTQ0lJIHVzaW5nIHRoZSBiYWNrc2xhc2hyZXBsYWNlIGVycm9yIGhhbmRsZXIuCisKKyAgIERvIG5vdGhpbmcgaWYgdGV4dCBpcyBub3QgYSBVbmljb2RlIG9iamVjdC4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgVW5pY29kZQorICAgc3RyaW5nIHdoaWNoIGlzIG5vdCByZWFkeSAoUHlVbmljb2RlX1dDSEFSX0tJTkQpLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfRHVtcEFTQ0lJKGludCBmZCwgUHlPYmplY3QgKnRleHQpOworCisvKiBGb3JtYXQgYW4gaW50ZWdlciBhcyBkZWNpbWFsIGludG8gdGhlIGZpbGUgZGVzY3JpcHRvciBmZC4KKworICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5X0R1bXBEZWNpbWFsKAorICAgIGludCBmZCwKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKworLyogRm9ybWF0IGFuIGludGVnZXIgYXMgaGV4YWRlY2ltYWwgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkIHdpdGggYXQgbGVhc3QKKyAgIHdpZHRoIGRpZ2l0cy4KKworICAgVGhlIG1heGltdW0gd2lkdGggaXMgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjIgZGlnaXRzLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfRHVtcEhleGFkZWNpbWFsKAorICAgIGludCBmZCwKKyAgICB1bnNpZ25lZCBsb25nIHZhbHVlLAorICAgIFB5X3NzaXplX3Qgd2lkdGgpOworCisjZW5kaWYgICAvKiAhUHlfTElNSVRFRF9BUEkgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaCBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCmluZGV4IDUzM2RkNzUuLjFhZjYyMGQgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCkBAIC05MDAsNyArOTAwLDcgQEAKICAgICAvKiBtaW5pbXVtIGNoYXJhY3RlciAoZGVmYXVsdDogMTI3LCBBU0NJSSkgKi8KICAgICBQeV9VQ1M0IG1pbl9jaGFyOwogCi0gICAgLyogSWYgbm9uLXplcm8sIG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGJ5IDI1JSAoZGVmYXVsdDogMCkuICovCisgICAgLyogSWYgbm9uLXplcm8sIG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIChkZWZhdWx0OiAwKS4gKi8KICAgICB1bnNpZ25lZCBjaGFyIG92ZXJhbGxvY2F0ZTsKIAogICAgIC8qIElmIHJlYWRvbmx5IGlzIDEsIGJ1ZmZlciBpcyBhIHNoYXJlZCBzdHJpbmcgKGNhbm5vdCBiZSBtb2RpZmllZCkKQEAgLTkzNCw2ICs5MzQsMjMgQEAKIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9VQ1M0IG1heGNoYXIpOwogCisvKiBQcmVwYXJlIHRoZSBidWZmZXIgdG8gaGF2ZSBhdCBsZWFzdCB0aGUga2luZCBLSU5ELgorICAgRm9yIGV4YW1wbGUsIGtpbmQ9UHlVbmljb2RlXzJCWVRFX0tJTkQgZW5zdXJlcyB0aGF0IHRoZSB3cml0ZXIgd2lsbAorICAgc3VwcG9ydCBjaGFyYWN0ZXJzIGluIHJhbmdlIFUrMDAwLVUrRkZGRi4KKworICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCisjZGVmaW5lIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoV1JJVEVSLCBLSU5EKSAgICAgICAgICAgICAgICAgICAgXAorICAgIChhc3NlcnQoKEtJTkQpICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKEtJTkQpIDw9IChXUklURVIpLT5raW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgID8gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6IF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbCgoV1JJVEVSKSwgKEtJTkQpKSkKKworLyogRG9uJ3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCB1c2UgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKQorICAgbWFjcm8gaW5zdGVhZC4gKi8KK1B5QVBJX0ZVTkMoaW50KQorX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQpOworCiAvKiBBcHBlbmQgYSBVbmljb2RlIGNoYXJhY3Rlci4KICAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIC0xIG9uIGVycm9yLiAqLwogUHlBUElfRlVOQyhpbnQpCkBAIC0yMjUzLDYgKzIyNzAsMTAgQEAKIC8qIENsZWFyIGFsbCBzdGF0aWMgc3RyaW5ncy4gKi8KIFB5QVBJX0ZVTkModm9pZCkgX1B5VW5pY29kZV9DbGVhclN0YXRpY1N0cmluZ3Modm9pZCk7CiAKKy8qIEZhc3QgZXF1YWxpdHkgY2hlY2sgd2hlbiB0aGUgaW5wdXRzIGFyZSBrbm93biB0byBiZSBleGFjdCB1bmljb2RlIHR5cGVzCisgICBhbmQgd2hlcmUgdGhlIGhhc2ggdmFsdWVzIGFyZSBlcXVhbCAoaS5lLiBhIHZlcnkgcHJvYmFibGUgbWF0Y2gpICovCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9FUShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvd2FybmluZ3MuaCBiL0luY2x1ZGUvd2FybmluZ3MuaAppbmRleCBlZmZiOWZhZC4uYzFjNjk5MiAxMDA2NDQKLS0tIGEvSW5jbHVkZS93YXJuaW5ncy5oCisrKyBiL0luY2x1ZGUvd2FybmluZ3MuaApAQCAtMTcsNiArMTcsMTMgQEAKICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgICAgICAgICAvKiBBU0NJSS1lbmNvZGVkIHN0cmluZyAgKi8KICAgICAuLi4pOworCisvKiBFbWl0IGEgUmVzb3VyY2VXYXJuaW5nIHdhcm5pbmcgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9SZXNvdXJjZVdhcm5pbmcoCisgICAgUHlPYmplY3QgKnNvdXJjZSwKKyAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgICAgICAgICAvKiBBU0NJSS1lbmNvZGVkIHN0cmluZyAgKi8KKyAgICAuLi4pOwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfRlVOQyhpbnQpIFB5RXJyX1dhcm5FeHBsaWNpdE9iamVjdCgKICAgICBQeU9iamVjdCAqY2F0ZWdvcnksCmRpZmYgLS1naXQgYS9MaWIvX2NvbGxlY3Rpb25zX2FiYy5weSBiL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CmluZGV4IGY4OWJiNmYuLmQzMzc1ODQgMTAwNjQ0Ci0tLSBhL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CisrKyBiL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5CkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgc3lzCiAKIF9fYWxsX18gPSBbIkF3YWl0YWJsZSIsICJDb3JvdXRpbmUiLCAiQXN5bmNJdGVyYWJsZSIsICJBc3luY0l0ZXJhdG9yIiwKLSAgICAgICAgICAgIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwgIkdlbmVyYXRvciIsCisgICAgICAgICAgICJIYXNoYWJsZSIsICJJdGVyYWJsZSIsICJJdGVyYXRvciIsICJHZW5lcmF0b3IiLCAiUmV2ZXJzaWJsZSIsCiAgICAgICAgICAgICJTaXplZCIsICJDb250YWluZXIiLCAiQ2FsbGFibGUiLAogICAgICAgICAgICAiU2V0IiwgIk11dGFibGVTZXQiLAogICAgICAgICAgICAiTWFwcGluZyIsICJNdXRhYmxlTWFwcGluZyIsCkBAIC0yNDAsNiArMjQwLDI1IEBACiBJdGVyYXRvci5yZWdpc3Rlcih6aXBfaXRlcmF0b3IpCiAKIAorY2xhc3MgUmV2ZXJzaWJsZShJdGVyYWJsZSk6CisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgUmV2ZXJzaWJsZToKKyAgICAgICAgICAgIGZvciBCIGluIEMuX19tcm9fXzoKKyAgICAgICAgICAgICAgICBpZiAiX19yZXZlcnNlZF9fIiBpbiBCLl9fZGljdF9fOgorICAgICAgICAgICAgICAgICAgICBpZiBCLl9fZGljdF9fWyJfX3JldmVyc2VkX18iXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisKIGNsYXNzIEdlbmVyYXRvcihJdGVyYXRvcik6CiAKICAgICBfX3Nsb3RzX18gPSAoKQpAQCAtNzk0LDcgKzgxMyw3IEBACiAjIyMgU0VRVUVOQ0VTICMjIwogCiAKLWNsYXNzIFNlcXVlbmNlKFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKK2NsYXNzIFNlcXVlbmNlKFNpemVkLCBSZXZlcnNpYmxlLCBDb250YWluZXIpOgogCiAgICAgIiIiQWxsIHRoZSBvcGVyYXRpb25zIG9uIGEgcmVhZC1vbmx5IHNlcXVlbmNlLgogCmRpZmYgLS1naXQgYS9MaWIvX3B5ZGVjaW1hbC5weSBiL0xpYi9fcHlkZWNpbWFsLnB5CmluZGV4IDZiMTNkNDQuLjVjNDhlMGIgMTAwNjQ0Ci0tLSBhL0xpYi9fcHlkZWNpbWFsLnB5CisrKyBiL0xpYi9fcHlkZWNpbWFsLnB5CkBAIC0xNDgsNyArMTQ4LDcgQEAKIF9fbmFtZV9fID0gJ2RlY2ltYWwnICAgICMgRm9yIHBpY2tsaW5nCiBfX3ZlcnNpb25fXyA9ICcxLjcwJyAgICAjIEhpZ2hlc3QgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGlzIGNvbXBsaWVzIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICMgU2VlIGh0dHA6Ly9zcGVsZW90cm92ZS5jb20vZGVjaW1hbC8KLV9fbGlibXBkZWNfdmVyc2lvbl9fID0gIjIuNC4xIiAjIGNvbXBhdGlibGUgbGlibXBkZWMgdmVyc2lvbgorX19saWJtcGRlY192ZXJzaW9uX18gPSAiMi40LjIiICMgY29tcGF0aWJsZSBsaWJtcGRlYyB2ZXJzaW9uCiAKIGltcG9ydCBtYXRoIGFzIF9tYXRoCiBpbXBvcnQgbnVtYmVycyBhcyBfbnVtYmVycwpAQCAtMTAxMCw2ICsxMDEwLDU2IEBACiAgICAgICAgICIiIgogICAgICAgICByZXR1cm4gRGVjaW1hbFR1cGxlKHNlbGYuX3NpZ24sIHR1cGxlKG1hcChpbnQsIHNlbGYuX2ludCkpLCBzZWxmLl9leHApCiAKKyAgICBkZWYgYXNfaW50ZWdlcl9yYXRpbyhzZWxmKToKKyAgICAgICAgIiIiRXhwcmVzcyBhIGZpbml0ZSBEZWNpbWFsIGluc3RhbmNlIGluIHRoZSBmb3JtIG4gLyBkLgorCisgICAgICAgIFJldHVybnMgYSBwYWlyIChuLCBkKSBvZiBpbnRlZ2Vycy4gIFdoZW4gY2FsbGVkIG9uIGFuIGluZmluaXR5CisgICAgICAgIG9yIE5hTiwgcmFpc2VzIE92ZXJmbG93RXJyb3Igb3IgVmFsdWVFcnJvciByZXNwZWN0aXZlbHkuCisKKyAgICAgICAgPj4+IERlY2ltYWwoJzMuMTQnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgKDE1NywgNTApCisgICAgICAgID4+PiBEZWNpbWFsKCctMTIzZTUnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgKC0xMjMwMDAwMCwgMSkKKyAgICAgICAgPj4+IERlY2ltYWwoJzAuMDAnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgKDAsIDEpCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBpZiBzZWxmLmlzX25hbigpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIpCisKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gMCwgMQorCisgICAgICAgICMgRmluZCBuLCBkIGluIGxvd2VzdCB0ZXJtcyBzdWNoIHRoYXQgYWJzKHNlbGYpID09IG4gLyBkOworICAgICAgICAjIHdlJ2xsIGRlYWwgd2l0aCB0aGUgc2lnbiBsYXRlci4KKyAgICAgICAgbiA9IGludChzZWxmLl9pbnQpCisgICAgICAgIGlmIHNlbGYuX2V4cCA+PSAwOgorICAgICAgICAgICAgIyBzZWxmIGlzIGFuIGludGVnZXIuCisgICAgICAgICAgICBuLCBkID0gbiAqIDEwKipzZWxmLl9leHAsIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRmluZCBkMiwgZDUgc3VjaCB0aGF0IGFicyhzZWxmKSA9IG4gLyAoMioqZDIgKiA1KipkNSkuCisgICAgICAgICAgICBkNSA9IC1zZWxmLl9leHAKKyAgICAgICAgICAgIHdoaWxlIGQ1ID4gMCBhbmQgbiAlIDUgPT0gMDoKKyAgICAgICAgICAgICAgICBuIC8vPSA1CisgICAgICAgICAgICAgICAgZDUgLT0gMQorCisgICAgICAgICAgICAjIChuICYgLW4pLmJpdF9sZW5ndGgoKSAtIDEgY291bnRzIHRyYWlsaW5nIHplcm9zIGluIGJpbmFyeQorICAgICAgICAgICAgIyByZXByZXNlbnRhdGlvbiBvZiBuIChwcm92aWRlZCBuIGlzIG5vbnplcm8pLgorICAgICAgICAgICAgZDIgPSAtc2VsZi5fZXhwCisgICAgICAgICAgICBzaGlmdDIgPSBtaW4oKG4gJiAtbikuYml0X2xlbmd0aCgpIC0gMSwgZDIpCisgICAgICAgICAgICBpZiBzaGlmdDI6CisgICAgICAgICAgICAgICAgbiA+Pj0gc2hpZnQyCisgICAgICAgICAgICAgICAgZDIgLT0gc2hpZnQyCisKKyAgICAgICAgICAgIGQgPSA1KipkNSA8PCBkMgorCisgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICBuID0gLW4KKyAgICAgICAgcmV0dXJuIG4sIGQKKwogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgIiIiUmVwcmVzZW50cyB0aGUgbnVtYmVyIGFzIGFuIGluc3RhbmNlIG9mIERlY2ltYWwuIiIiCiAgICAgICAgICMgSW52YXJpYW50OiAgZXZhbChyZXByKGQpKSA9PSBkCmRpZmYgLS1naXQgYS9MaWIvX3B5aW8ucHkgYi9MaWIvX3B5aW8ucHkKaW5kZXggMzEzZmFkZi4uNDA0ZTAyNyAxMDA2NDQKLS0tIGEvTGliL19weWlvLnB5CisrKyBiL0xpYi9fcHlpby5weQpAQCAtMTgyLDggKzE4Miw4IEBACiAgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcwogICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcwogICAgIGlmICJVIiBpbiBtb2RlczoKLSAgICAgICAgaWYgY3JlYXRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKQorICAgICAgICBpZiBjcmVhdGluZyBvciB3cml0aW5nIG9yIGFwcGVuZGluZyBvciB1cGRhdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAneCcsICd3JywgJ2EnLCBvciAnKyciKQogICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgd2FybmluZ3Mud2FybigiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQpAQCAtMTUxNCw3ICsxNTE0LDcgQEAKICAgICAgICAgaWYgc2VsZi5fZmQgPj0gMCBhbmQgc2VsZi5fY2xvc2VmZCBhbmQgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCd1bmNsb3NlZCBmaWxlICVyJyAlIChzZWxmLCksIFJlc291cmNlV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL19zdHJwdGltZS5weSBiL0xpYi9fc3RycHRpbWUucHkKaW5kZXggZjg0MjI3Yi4uZmU5NDM2MSAxMDA2NDQKLS0tIGEvTGliL19zdHJwdGltZS5weQorKysgYi9MaWIvX3N0cnB0aW1lLnB5CkBAIC0xOTksMTIgKzE5OSwxNSBAQAogICAgICAgICAgICAgJ2YnOiByIig/UDxmPlswLTldezEsNn0pIiwKICAgICAgICAgICAgICdIJzogciIoP1A8SD4yWzAtM118WzAtMV1cZHxcZCkiLAogICAgICAgICAgICAgJ0knOiByIig/UDxJPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdHJzogciIoP1A8Rz5cZFxkXGRcZCkiLAogICAgICAgICAgICAgJ2onOiByIig/UDxqPjM2WzAtNl18M1swLTVdXGR8WzEtMl1cZFxkfDBbMS05XVxkfDAwWzEtOV18WzEtOV1cZHwwWzEtOV18WzEtOV0pIiwKICAgICAgICAgICAgICdtJzogciIoP1A8bT4xWzAtMl18MFsxLTldfFsxLTldKSIsCiAgICAgICAgICAgICAnTSc6IHIiKD9QPE0+WzAtNV1cZHxcZCkiLAogICAgICAgICAgICAgJ1MnOiByIig/UDxTPjZbMC0xXXxbMC01XVxkfFxkKSIsCiAgICAgICAgICAgICAnVSc6IHIiKD9QPFU+NVswLTNdfFswLTRdXGR8XGQpIiwKICAgICAgICAgICAgICd3JzogciIoP1A8dz5bMC02XSkiLAorICAgICAgICAgICAgJ3UnOiByIig/UDx1PlsxLTddKSIsCisgICAgICAgICAgICAnVic6IHIiKD9QPFY+NVswLTNdfDBbMS05XXxbMS00XVxkfFxkKSIsCiAgICAgICAgICAgICAjIFcgaXMgc2V0IGJlbG93IGJ5IHVzaW5nICdVJwogICAgICAgICAgICAgJ3knOiByIig/UDx5PlxkXGQpIiwKICAgICAgICAgICAgICNYWFg6IERvZXMgJ1knIG5lZWQgdG8gd29ycnkgYWJvdXQgaGF2aW5nIGxlc3Mgb3IgbW9yZSB0aGFuCkBAIC0yOTksNiArMzAyLDIyIEBACiAgICAgICAgIHJldHVybiAxICsgZGF5c190b193ZWVrICsgZGF5X29mX3dlZWsKIAogCitkZWYgX2NhbGNfanVsaWFuX2Zyb21fVihpc29feWVhciwgaXNvX3dlZWssIGlzb193ZWVrZGF5KToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEp1bGlhbiBkYXkgYmFzZWQgb24gdGhlIElTTyA4NjAxIHllYXIsIHdlZWssIGFuZCB3ZWVrZGF5LgorICAgIElTTyB3ZWVrcyBzdGFydCBvbiBNb25kYXlzLCB3aXRoIHdlZWsgMDEgYmVpbmcgdGhlIHdlZWsgY29udGFpbmluZyA0IEphbi4KKyAgICBJU08gd2VlayBkYXlzIHJhbmdlIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLgorICAgICIiIgorICAgIGNvcnJlY3Rpb24gPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCA0KS5pc293ZWVrZGF5KCkgKyAzCisgICAgb3JkaW5hbCA9IChpc29fd2VlayAqIDcpICsgaXNvX3dlZWtkYXkgLSBjb3JyZWN0aW9uCisgICAgIyBvcmRpbmFsIG1heSBiZSBuZWdhdGl2ZSBvciAwIG5vdywgd2hpY2ggbWVhbnMgdGhlIGRhdGUgaXMgaW4gdGhlIHByZXZpb3VzCisgICAgIyBjYWxlbmRhciB5ZWFyCisgICAgaWYgb3JkaW5hbCA8IDE6CisgICAgICAgIG9yZGluYWwgKz0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgMSkudG9vcmRpbmFsKCkKKyAgICAgICAgaXNvX3llYXIgLT0gMQorICAgICAgICBvcmRpbmFsIC09IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgcmV0dXJuIGlzb195ZWFyLCBvcmRpbmFsCisKKwogZGVmIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgogICAgICIiIlJldHVybiBhIDItdHVwbGUgY29uc2lzdGluZyBvZiBhIHRpbWUgc3RydWN0IGFuZCBhbiBpbnQgY29udGFpbmluZwogICAgIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZQpAQCAtMzQ1LDE1ICszNjQsMTUgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5jb252ZXJ0ZWQgZGF0YSByZW1haW5zOiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0cmluZ1tmb3VuZC5lbmQoKTpdKQogCi0gICAgeWVhciA9IE5vbmUKKyAgICBpc29feWVhciA9IHllYXIgPSBOb25lCiAgICAgbW9udGggPSBkYXkgPSAxCiAgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAogICAgIHR6ID0gLTEKICAgICB0em9mZnNldCA9IE5vbmUKICAgICAjIERlZmF1bHQgdG8gLTEgdG8gc2lnbmlmeSB0aGF0IHZhbHVlcyBub3Qga25vd247IG5vdCBjcml0aWNhbCB0byBoYXZlLAogICAgICMgdGhvdWdoCi0gICAgd2Vla19vZl95ZWFyID0gLTEKLSAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAtMQorICAgIGlzb193ZWVrID0gd2Vla19vZl95ZWFyID0gTm9uZQorICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IE5vbmUKICAgICAjIHdlZWtkYXkgYW5kIGp1bGlhbiBkZWZhdWx0ZWQgdG8gTm9uZSBzbyBhcyB0byBzaWduYWwgbmVlZCB0byBjYWxjdWxhdGUKICAgICAjIHZhbHVlcwogICAgIHdlZWtkYXkgPSBqdWxpYW4gPSBOb25lCkBAIC0zNzUsNiArMzk0LDggQEAKICAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDAKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1knOgogICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0WydZJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdHJzoKKyAgICAgICAgICAgIGlzb195ZWFyID0gaW50KGZvdW5kX2RpY3RbJ0cnXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ20nOgogICAgICAgICAgICAgbW9udGggPSBpbnQoZm91bmRfZGljdFsnbSddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnQic6CkBAIC00MjAsNiArNDQxLDkgQEAKICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gNgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3ZWVrZGF5IC09IDEKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3UnOgorICAgICAgICAgICAgd2Vla2RheSA9IGludChmb3VuZF9kaWN0Wyd1J10pCisgICAgICAgICAgICB3ZWVrZGF5IC09IDEKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2onOgogICAgICAgICAgICAganVsaWFuID0gaW50KGZvdW5kX2RpY3RbJ2onXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgaW4gKCdVJywgJ1cnKToKQEAgLTQzMCw2ICs0NTQsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIFcgc3RhcnRzIHdlZWsgb24gTW9uZGF5LgogICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1YnOgorICAgICAgICAgICAgaXNvX3dlZWsgPSBpbnQoZm91bmRfZGljdFsnViddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAneic6CiAgICAgICAgICAgICB6ID0gZm91bmRfZGljdFsneiddCiAgICAgICAgICAgICB0em9mZnNldCA9IGludCh6WzE6M10pICogNjAgKyBpbnQoelszOjVdKQpAQCAtNDUwLDMyICs0NzYsNjEgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgIyBEZWFsIHdpdGggdGhlIGNhc2VzIHdoZXJlIGFtYmlndWl0aWVzIGFyaXplCisgICAgIyBkb24ndCBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMgZm9yIElTTyB3ZWVrL3llYXIKKyAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIGlzb195ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc29fd2VlayBpcyBOb25lIG9yIHdlZWtkYXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIG11c3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBhbmQgYSB3ZWVrZGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSAoJyVBJywgJyVhJywgJyV3Jywgb3IgJyV1JykuIikKKyAgICAgICAgaWYganVsaWFuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF5IG9mIHRoZSB5ZWFyIGRpcmVjdGl2ZSAnJWonIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIHdpdGggSVNPIHllYXIgZGlyZWN0aXZlICclRycuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSAnJVknIGluc3RlYWQuIikKKyAgICBlbGlmIHdlZWtfb2ZfeWVhciBpcyBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla2RheSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgbXVzdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIElTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIGFuZCBhIHdlZWtkYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlICgnJUEnLCAnJWEnLCAnJXcnLCBvciAnJXUnKS4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgaXMgaW5jb21wYXRpYmxlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHllYXIgZGlyZWN0aXZlICclWScuIFVzZSB0aGUgSVNPIHllYXIgJyVHJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIpCisKICAgICBsZWFwX3llYXJfZml4ID0gRmFsc2UKICAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIG1vbnRoID09IDIgYW5kIGRheSA9PSAyOToKICAgICAgICAgeWVhciA9IDE5MDQgICMgMTkwNCBpcyBmaXJzdCBsZWFwIHllYXIgb2YgMjB0aCBjZW50dXJ5CiAgICAgICAgIGxlYXBfeWVhcl9maXggPSBUcnVlCiAgICAgZWxpZiB5ZWFyIGlzIE5vbmU6CiAgICAgICAgIHllYXIgPSAxOTAwCisKKwogICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCiAgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCi0gICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtfb2ZfeWVhciAhPSAtMSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKLSAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCi0gICAgICAgIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1Vfb3JfVyh5ZWFyLCB3ZWVrX29mX3llYXIsIHdlZWtkYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKLSAgICAgICAgaWYganVsaWFuIDw9IDA6CisgICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtkYXkgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHdlZWtfb2ZfeWVhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQorICAgICAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKKyAgICAgICAgZWxpZiBpc29feWVhciBpcyBub3QgTm9uZSBhbmQgaXNvX3dlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5ZWFyLCBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9WKGlzb195ZWFyLCBpc29fd2Vlaywgd2Vla2RheSArIDEpCisgICAgICAgIGlmIGp1bGlhbiBpcyBub3QgTm9uZSBhbmQganVsaWFuIDw9IDA6CiAgICAgICAgICAgICB5ZWFyIC09IDEKICAgICAgICAgICAgIHlkYXkgPSAzNjYgaWYgY2FsZW5kYXIuaXNsZWFwKHllYXIpIGVsc2UgMzY1CiAgICAgICAgICAgICBqdWxpYW4gKz0geWRheQotICAgICMgQ2Fubm90IHByZS1jYWxjdWxhdGUgZGF0ZXRpbWVfZGF0ZSgpIHNpbmNlIGNhbiBjaGFuZ2UgaW4gSnVsaWFuCi0gICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawotICAgICMgY2FsY3VsYXRpb24uCisKICAgICBpZiBqdWxpYW4gaXMgTm9uZToKKyAgICAgICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KKyAgICAgICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZgorICAgICAgICAjIHRoZSB3ZWVrIGNhbGN1bGF0aW9uLgogICAgICAgICAjIE5lZWQgdG8gYWRkIDEgdG8gcmVzdWx0IHNpbmNlIGZpcnN0IGRheSBvZiB0aGUgeWVhciBpcyAxLCBub3QgMC4KICAgICAgICAganVsaWFuID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS50b29yZGluYWwoKSAtIFwKICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxCi0gICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgaXQgd2lsbAotICAgICAgICAgICAjIGJlIGFjY3VyYXRlLgotICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKChqdWxpYW4gLSAxKSArIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCisgICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgKG9yIGlmIGl0IHdhcworICAgICAgICAgICAjIGNhbGN1bGF0ZWQgYWJvdmUgd2l0aCB5ZWFyL3dlZWsvd2Vla2RheSkgaXQgd2lsbCBiZSBhY2N1cmF0ZS4KKyAgICAgICAgZGF0ZXRpbWVfcmVzdWx0ID0gZGF0ZXRpbWVfZGF0ZS5mcm9tb3JkaW5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanVsaWFuIC0gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCiAgICAgICAgIHllYXIgPSBkYXRldGltZV9yZXN1bHQueWVhcgogICAgICAgICBtb250aCA9IGRhdGV0aW1lX3Jlc3VsdC5tb250aAogICAgICAgICBkYXkgPSBkYXRldGltZV9yZXN1bHQuZGF5CmRpZmYgLS1naXQgYS9MaWIvYWlmYy5weSBiL0xpYi9haWZjLnB5CmluZGV4IDdlYmRiZWIuLjY5MmQwYmYgMTAwNjQ0Ci0tLSBhL0xpYi9haWZjLnB5CisrKyBiL0xpYi9haWZjLnB5CkBAIC0yNTcsNiArMjU3LDE1IEBACiBfYWlmY19wYXJhbXMgPSBuYW1lZHR1cGxlKCdfYWlmY19wYXJhbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmNoYW5uZWxzIHNhbXB3aWR0aCBmcmFtZXJhdGUgbmZyYW1lcyBjb21wdHlwZSBjb21wbmFtZScpCiAKK19haWZjX3BhcmFtcy5uY2hhbm5lbHMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbyknCitfYWlmY19wYXJhbXMuc2FtcHdpZHRoLl9fZG9jX18gPSAnU2FtcGxlIHdpZHRoIGluIGJ5dGVzJworX2FpZmNfcGFyYW1zLmZyYW1lcmF0ZS5fX2RvY19fID0gJ1NhbXBsaW5nIGZyZXF1ZW5jeScKK19haWZjX3BhcmFtcy5uZnJhbWVzLl9fZG9jX18gPSAnTnVtYmVyIG9mIGF1ZGlvIGZyYW1lcycKK19haWZjX3BhcmFtcy5jb21wdHlwZS5fX2RvY19fID0gJ0NvbXByZXNzaW9uIHR5cGUgKCJOT05FIiBmb3IgQUlGRiBmaWxlcyknCitfYWlmY19wYXJhbXMuY29tcG5hbWUuX19kb2NfXyA9ICgiIiJcCitBIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbXByZXNzaW9uIHR5cGUKKygnbm90IGNvbXByZXNzZWQnIGZvciBBSUZGIGZpbGVzKSIiIikKKwogCiBjbGFzcyBBaWZjX3JlYWQ6CiAgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgpkaWZmIC0tZ2l0IGEvTGliL2FyZ3BhcnNlLnB5IGIvTGliL2FyZ3BhcnNlLnB5CmluZGV4IDlhMDY3MTkuLjIwOWI0ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9hcmdwYXJzZS5weQorKysgYi9MaWIvYXJncGFyc2UucHkKQEAgLTExOCwxMCArMTE4LDE2IEBACiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICB0eXBlX25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCiAgICAgICAgIGFyZ19zdHJpbmdzID0gW10KKyAgICAgICAgc3Rhcl9hcmdzID0ge30KICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLl9nZXRfYXJncygpOgogICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKHJlcHIoYXJnKSkKICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX2dldF9rd2FyZ3MoKToKLSAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIG5hbWUuaXNpZGVudGlmaWVyKCk6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFyX2FyZ3NbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpZiBzdGFyX2FyZ3M6CisgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyoqJXMnICUgcmVwcihzdGFyX2FyZ3MpKQogICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZV9uYW1lLCAnLCAnLmpvaW4oYXJnX3N0cmluZ3MpKQogCiAgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgpAQCAtMjA0LDggKzIxMCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5faW5kZW50KCkKICAgICAgICAgICAgIGpvaW4gPSBzZWxmLmZvcm1hdHRlci5fam9pbl9wYXJ0cwotICAgICAgICAgICAgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQogICAgICAgICAgICAgaXRlbV9oZWxwID0gam9pbihbZnVuYygqYXJncykgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtc10pCiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5fZGVkZW50KCkKZGlmZiAtLWdpdCBhL0xpYi9hc3QucHkgYi9MaWIvYXN0LnB5CmluZGV4IDAxNzA0NzIuLjE1NmExZjIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3QucHkKKysrIGIvTGliL2FzdC5weQpAQCAtMzUsNiArMzUsOCBAQAogICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpCiAKIAorX05VTV9UWVBFUyA9IChpbnQsIGZsb2F0LCBjb21wbGV4KQorCiBkZWYgbGl0ZXJhbF9ldmFsKG5vZGVfb3Jfc3RyaW5nKToKICAgICAiIiIKICAgICBTYWZlbHkgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBub2RlIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KQEAgLTQ3LDcgKzQ5LDkgQEAKICAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBFeHByZXNzaW9uKToKICAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBub2RlX29yX3N0cmluZy5ib2R5CiAgICAgZGVmIF9jb252ZXJ0KG5vZGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS5zCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOdW0pOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUubgpAQCAtNjIsMjQgKzY2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbiB6aXAobm9kZS5rZXlzLCBub2RlLnZhbHVlcykpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOYW1lQ29uc3RhbnQpOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFVuYXJ5T3ApIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wZXJhbmQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBVbmFyeU9wKSBhbmQgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpOgogICAgICAgICAgICAgb3BlcmFuZCA9IF9jb252ZXJ0KG5vZGUub3BlcmFuZCkKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICsgb3BlcmFuZAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3AsIChBZGQsIFN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnJpZ2h0LCAoTnVtLCBVbmFyeU9wLCBCaW5PcCkpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmxlZnQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9wZXJhbmQsIF9OVU1fVFlQRVMpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiArIG9wZXJhbmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSk6CiAgICAgICAgICAgICBsZWZ0ID0gX2NvbnZlcnQobm9kZS5sZWZ0KQogICAgICAgICAgICAgcmlnaHQgPSBfY29udmVydChub2RlLnJpZ2h0KQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0LCBfTlVNX1RZUEVTKSBhbmQgaXNpbnN0YW5jZShyaWdodCwgX05VTV9UWVBFUyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmc6ICcgKyByZXByKG5vZGUpKQogICAgIHJldHVybiBfY29udmVydChub2RlX29yX3N0cmluZykKIApAQCAtMTk2LDEyICsxOTcsMTkgQEAKICAgICAiIiIKICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoQXN5bmNGdW5jdGlvbkRlZiwgRnVuY3Rpb25EZWYsIENsYXNzRGVmLCBNb2R1bGUpKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlciBjYW4ndCBoYXZlIGRvY3N0cmluZ3MiICUgbm9kZS5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgaWYgbm9kZS5ib2R5IGFuZCBpc2luc3RhbmNlKG5vZGUuYm9keVswXSwgRXhwcikgYW5kIFwKLSAgICAgICBpc2luc3RhbmNlKG5vZGUuYm9keVswXS52YWx1ZSwgU3RyKToKLSAgICAgICAgaWYgY2xlYW46Ci0gICAgICAgICAgICBpbXBvcnQgaW5zcGVjdAotICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QuY2xlYW5kb2Mobm9kZS5ib2R5WzBdLnZhbHVlLnMpCi0gICAgICAgIHJldHVybiBub2RlLmJvZHlbMF0udmFsdWUucworICAgIGlmIG5vdChub2RlLmJvZHkgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBFeHByKSk6CisgICAgICAgIHJldHVybgorICAgIG5vZGUgPSBub2RlLmJvZHlbMF0udmFsdWUKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnMKKyAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIHN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnZhbHVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgY2xlYW46CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIHRleHQgPSBpbnNwZWN0LmNsZWFuZG9jKHRleHQpCisgICAgcmV0dXJuIHRleHQKIAogCiBkZWYgd2Fsayhub2RlKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL2Jhc2VfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKaW5kZXggMzcwMzQ4MC4uOTlkNTAzZiAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKQEAgLTQxOCw3ICs0MTgsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2Nsb3NlZCgpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfcnVubmluZygpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CmluZGV4IDczNDI1ZDkuLmVmZTA4MzEgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgZ2V0X3BpZChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weQppbmRleCBiMmRkZWU0Li5kYjE2ZmUyIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9wcm9hY3Rvcl9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5CkBAIC04Niw3ICs4Niw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fc29jayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiBwaXBlIHRyYW5zcG9ydCcpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5CmluZGV4IDdiNWEwODQuLjY4MzhkNzIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NlbGVjdG9yX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkKQEAgLTU3Myw3ICs1NzMsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIHNlbGYuX3NvY2sgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCiAKICAgICBkZWYgX2ZhdGFsX2Vycm9yKHNlbGYsIGV4YywgbWVzc2FnZT0nRmF0YWwgZXJyb3Igb24gdHJhbnNwb3J0Jyk6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9zc2xwcm90by5weSBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CmluZGV4IDMzYjE4NDAuLjkyNjI4NjAgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CisrKyBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CkBAIC0zMjQsNyArMzI0LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIHBhdXNlX3JlYWRpbmcoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CmluZGV4IDQ2Njg2YTAuLmFhZDEwNjggMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CisrKyBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CkBAIC0zNzgsNyArMzc4LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIF9mYXRhbF9lcnJvcihzZWxmLCBleGMsIG1lc3NhZ2U9J0ZhdGFsIGVycm9yIG9uIHBpcGUgdHJhbnNwb3J0Jyk6CkBAIC01NjcsNyArNTY4LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weSBiL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkKaW5kZXggODcwY2QxMy4uN2M2M2ZiOSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weQorKysgYi9MaWIvYXN5bmNpby93aW5kb3dzX3V0aWxzLnB5CkBAIC0xNTksNyArMTU5LDggQEAKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jb3JlLnB5IGIvTGliL2FzeW5jb3JlLnB5CmluZGV4IDNiNTFmMGYuLjRiMDQ2ZDYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY29yZS5weQorKysgYi9MaWIvYXN5bmNvcmUucHkKQEAgLTU5NSw3ICs1OTUsOCBAQAogCiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5mZCA+PSAwOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgICAgICBkZWYgcmVjdihzZWxmLCAqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvYmFzZTY0LnB5IGIvTGliL2Jhc2U2NC5weQppbmRleCBhZGFlYzFkLi42N2U1NGYwIDEwMDc1NQotLS0gYS9MaWIvYmFzZTY0LnB5CisrKyBiL0xpYi9iYXNlNjQucHkKQEAgLTU1LDggKzU1LDcgQEAKICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCBmb3IgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuICBUaGlzIGFsbG93cyBhbgogICAgIGFwcGxpY2F0aW9uIHRvIGUuZy4gZ2VuZXJhdGUgdXJsIG9yIGZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4KICAgICAiIiIKLSAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQotICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpWzotMV0KKyAgICBlbmNvZGVkID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzLCBuZXdsaW5lPUZhbHNlKQogICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgogICAgICAgICBhc3NlcnQgbGVuKGFsdGNoYXJzKSA9PSAyLCByZXByKGFsdGNoYXJzKQogICAgICAgICByZXR1cm4gZW5jb2RlZC50cmFuc2xhdGUoYnl0ZXMubWFrZXRyYW5zKGInKy8nLCBhbHRjaGFycykpCmRpZmYgLS1naXQgYS9MaWIvY2FsZW5kYXIucHkgYi9MaWIvY2FsZW5kYXIucHkKaW5kZXggNTI0NGI4ZC4uODViYWYyZSAxMDA2NDQKLS0tIGEvTGliL2NhbGVuZGFyLnB5CisrKyBiL0xpYi9jYWxlbmRhci5weQpAQCAtMTIsNyArMTIsOSBAQAogX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAogICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAogICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKLSAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciIsCisgICAgICAgICAgICJDYWxlbmRhciIsICJUZXh0Q2FsZW5kYXIiLCAiSFRNTENhbGVuZGFyIiwgIkxvY2FsZVRleHRDYWxlbmRhciIsCisgICAgICAgICAgICJMb2NhbGVIVE1MQ2FsZW5kYXIiLCAid2Vla2hlYWRlciJdCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCiBlcnJvciA9IFZhbHVlRXJyb3IKQEAgLTYwNSw1MSArNjA3LDYzIEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gICAgaW1wb3J0IG9wdHBhcnNlCi0gICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBpbXBvcnQgYXJncGFyc2UKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgdGV4dGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgndGV4dCBvbmx5IGFyZ3VtZW50cycpCisgICAgaHRtbGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnaHRtbCBvbmx5IGFyZ3VtZW50cycpCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi13IiwgIi0td2lkdGgiLAotICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKLSAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMikiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItbCIsICItLWxpbmVzIiwKLSAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCi0gICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKLSAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKLSAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLW0iLCAiLS1tb250aHMiLAotICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCi0gICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBodG1sZ3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWMiLCAiLS1jc3MiLAotICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAotICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICAgICBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLUwiLCAiLS1sb2NhbGUiLAotICAgICAgICBkZXN0PSJsb2NhbGUiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAotICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQuIgorICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9ImVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXQiLCAiLS10eXBlIiwKLSAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBkZWZhdWx0PSJ0ZXh0IiwKICAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAogICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKICAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgInllYXIiLAorICAgICAgICBuYXJncz0nPycsIHR5cGU9aW50LAorICAgICAgICBoZWxwPSJ5ZWFyIG51bWJlciAoMS05OTk5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIm1vbnRoIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ibW9udGggbnVtYmVyICgxLTEyLCB0ZXh0IG9ubHkpIgorICAgICkKIAotICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgb3B0aW9ucyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3NbMTpdKQogCiAgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKQEAgLTY2NywxMCArNjgxLDEwIEBACiAgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQuYnVmZmVyLndyaXRlCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KSkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgd3JpdGUoY2FsLmZvcm1hdHllYXJwYWdlKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQogICAgICAgICAgICAgc3lzLmV4aXQoMSkKQEAgLTY4MCwxOCArNjk0LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQogICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKLSAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgIGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKICAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZwogICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIG9wdGlvbnMueWVhciBpcyBOb25lOgogICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQotICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgotICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIob3B0aW9ucy55ZWFyLCAqKm9wdGRpY3QpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgob3B0aW9ucy55ZWFyLCBvcHRpb25zLm1vbnRoLCAqKm9wdGRpY3QpCiAgICAgICAgIHdyaXRlID0gc3lzLnN0ZG91dC53cml0ZQogICAgICAgICBpZiBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmVuY29kZShvcHRpb25zLmVuY29kaW5nKQpkaWZmIC0tZ2l0IGEvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5IGIvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CmluZGV4IDA5MWU1ZDMuLmU1NDk3YjMgMTAwNjQ0Ci0tLSBhL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQorKysgYi9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKQEAgLTg0Miw3ICs4NDIsNyBAQAogCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjICBDaGFpbk1hcCAoaGVscGVyIGZvciBjb25maWdwYXJzZXIgYW5kIHN0cmluZy5UZW1wbGF0ZSkKKyMjIyAgQ2hhaW5NYXAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjbGFzcyBDaGFpbk1hcChNdXRhYmxlTWFwcGluZyk6CkBAIC05NjgsNyArOTY4LDcgQEAKICAgICAgICAgICAgIGRpY3QgPSBrd2FyZ3MucG9wKCdkaWN0JykKICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwogICAgICAgICAgICAgd2FybmluZ3Mud2FybigiUGFzc2luZyAnZGljdCcgYXMga2V5d29yZCBhcmd1bWVudCBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGRpY3QgPSBOb25lCiAgICAgICAgIHNlbGYuZGF0YSA9IHt9CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZWFsbC5weSBiL0xpYi9jb21waWxlYWxsLnB5CmluZGV4IDBjYzBjMWQuLjY3YzVmNWEgMTAwNjQ0Ci0tLSBhL0xpYi9jb21waWxlYWxsLnB5CisrKyBiL0xpYi9jb21waWxlYWxsLnB5CkBAIC02OCw3ICs2OCw3IEBACiAgICAgIiIiCiAgICAgZmlsZXMgPSBfd2Fsa19kaXIoZGlyLCBxdWlldD1xdWlldCwgbWF4bGV2ZWxzPW1heGxldmVscywKICAgICAgICAgICAgICAgICAgICAgICBkZGlyPWRkaXIpCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIGlmIHdvcmtlcnMgaXMgbm90IE5vbmUgYW5kIHdvcmtlcnMgIT0gMSBhbmQgUHJvY2Vzc1Bvb2xFeGVjdXRvciBpcyBub3QgTm9uZToKICAgICAgICAgaWYgd29ya2VycyA8IDA6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3b3JrZXJzIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwJykKQEAgLTgxLDEyICs4MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeT1sZWdhY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemU9b3B0aW1pemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcykKLSAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD0xKQorICAgICAgICAgICAgc3VjY2VzcyA9IG1pbihyZXN1bHRzLCBkZWZhdWx0PVRydWUpCiAgICAgZWxzZToKICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CiAgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9maWxlKGZpbGUsIGRkaXIsIGZvcmNlLCByeCwgcXVpZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeSwgb3B0aW1pemUpOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpcj1Ob25lLCBmb3JjZT1GYWxzZSwgcng9Tm9uZSwgcXVpZXQ9MCwKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIGxlZ2FjeTogICAgaWYgVHJ1ZSwgcHJvZHVjZSBsZWdhY3kgcHljIHBhdGhzIGluc3RlYWQgb2YgUEVQIDMxNDcgcGF0aHMKICAgICBvcHRpbWl6ZTogIG9wdGltaXphdGlvbiBsZXZlbCBvciAtMSBmb3IgbGV2ZWwgb2YgdGhlIGludGVycHJldGVyCiAgICAgIiIiCi0gICAgc3VjY2VzcyA9IDEKKyAgICBzdWNjZXNzID0gVHJ1ZQogICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxuYW1lKQogICAgIGlmIGRkaXIgaXMgbm90IE5vbmU6CiAgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGRkaXIsIG5hbWUpCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgICAgICAgICBvayA9IHB5X2NvbXBpbGUuY29tcGlsZShmdWxsbmFtZSwgY2ZpbGUsIGRmaWxlLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKQogICAgICAgICAgICAgZXhjZXB0IHB5X2NvbXBpbGUuUHlDb21waWxlRXJyb3IgYXMgZXJyOgotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgaWYgcXVpZXQgPj0gMjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICBlbGlmIHF1aWV0OgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgbXNnID0gbXNnLmRlY29kZShzeXMuc3Rkb3V0LmVuY29kaW5nKQogICAgICAgICAgICAgICAgIHByaW50KG1zZykKICAgICAgICAgICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIFVuaWNvZGVFcnJvciwgT1NFcnJvcikgYXMgZToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIHByaW50KGUuX19jbGFzc19fLl9fbmFtZV9fICsgJzonLCBlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBpZiBvayA9PSAwOgotICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICByZXR1cm4gc3VjY2VzcwogCiBkZWYgY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPTEsIG1heGxldmVscz0wLCBmb3JjZT1GYWxzZSwgcXVpZXQ9MCwKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIGxlZ2FjeTogYXMgZm9yIGNvbXBpbGVfZGlyKCkgKGRlZmF1bHQgRmFsc2UpCiAgICAgb3B0aW1pemU6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IC0xKQogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgogICAgICAgICBpZiAobm90IGRpciBvciBkaXIgPT0gb3MuY3VyZGlyKSBhbmQgc2tpcF9jdXJkaXI6CiAgICAgICAgICAgICBpZiBxdWlldCA8IDI6CmRpZmYgLS1naXQgYS9MaWIvY29udGV4dGxpYi5weSBiL0xpYi9jb250ZXh0bGliLnB5CmluZGV4IDUzNzc5ODcuLjZjZjExMmEgMTAwNjQ0Ci0tLSBhL0xpYi9jb250ZXh0bGliLnB5CisrKyBiL0xpYi9jb250ZXh0bGliLnB5CkBAIC0xLDExICsxLDM0IEBACiAiIiJVdGlsaXRpZXMgZm9yIHdpdGgtc3RhdGVtZW50IGNvbnRleHRzLiAgU2VlIFBFUCAzNDMuIiIiCi0KK2ltcG9ydCBhYmMKIGltcG9ydCBzeXMKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKIAotX19hbGxfXyA9IFsiY29udGV4dG1hbmFnZXIiLCAiY2xvc2luZyIsICJDb250ZXh0RGVjb3JhdG9yIiwgIkV4aXRTdGFjayIsCi0gICAgICAgICAgICJyZWRpcmVjdF9zdGRvdXQiLCAicmVkaXJlY3Rfc3RkZXJyIiwgInN1cHByZXNzIl0KK19fYWxsX18gPSBbImNvbnRleHRtYW5hZ2VyIiwgImNsb3NpbmciLCAiQWJzdHJhY3RDb250ZXh0TWFuYWdlciIsCisgICAgICAgICAgICJDb250ZXh0RGVjb3JhdG9yIiwgIkV4aXRTdGFjayIsICJyZWRpcmVjdF9zdGRvdXQiLAorICAgICAgICAgICAicmVkaXJlY3Rfc3RkZXJyIiwgInN1cHByZXNzIl0KKworCitjbGFzcyBBYnN0cmFjdENvbnRleHRNYW5hZ2VyKGFiYy5BQkMpOgorCisgICAgIiIiQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udGV4dCBtYW5hZ2Vycy4iIiIKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBgc2VsZmAgdXBvbiBlbnRlcmluZyB0aGUgcnVudGltZSBjb250ZXh0LiIiIgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAiIiJSYWlzZSBhbnkgZXhjZXB0aW9uIHRyaWdnZXJlZCB3aXRoaW4gdGhlIHJ1bnRpbWUgY29udGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBBYnN0cmFjdENvbnRleHRNYW5hZ2VyOgorICAgICAgICAgICAgaWYgKGFueSgiX19lbnRlcl9fIiBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykgYW5kCisgICAgICAgICAgICAgICAgYW55KCJfX2V4aXRfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKIAogCiBjbGFzcyBDb250ZXh0RGVjb3JhdG9yKG9iamVjdCk6CkBAIC0zMSw3ICs1NCw3IEBACiAgICAgICAgIHJldHVybiBpbm5lcgogCiAKLWNsYXNzIF9HZW5lcmF0b3JDb250ZXh0TWFuYWdlcihDb250ZXh0RGVjb3JhdG9yKToKK2NsYXNzIF9HZW5lcmF0b3JDb250ZXh0TWFuYWdlcihDb250ZXh0RGVjb3JhdG9yLCBBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJIZWxwZXIgZm9yIEBjb250ZXh0bWFuYWdlciBkZWNvcmF0b3IuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYywgYXJncywga3dkcyk6CkBAIC0xMzQsNyArMTU3LDcgQEAKICAgICByZXR1cm4gaGVscGVyCiAKIAotY2xhc3MgY2xvc2luZyhvYmplY3QpOgorY2xhc3MgY2xvc2luZyhBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKICAgICAiIiJDb250ZXh0IHRvIGF1dG9tYXRpY2FsbHkgY2xvc2Ugc29tZXRoaW5nIGF0IHRoZSBlbmQgb2YgYSBibG9jay4KIAogICAgIENvZGUgbGlrZSB0aGlzOgpAQCAtMTU5LDcgKzE4Miw3IEBACiAgICAgICAgIHNlbGYudGhpbmcuY2xvc2UoKQogCiAKLWNsYXNzIF9SZWRpcmVjdFN0cmVhbToKK2NsYXNzIF9SZWRpcmVjdFN0cmVhbShBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKIAogICAgIF9zdHJlYW0gPSBOb25lCiAKQEAgLTE5OSw3ICsyMjIsNyBAQAogICAgIF9zdHJlYW0gPSAic3RkZXJyIgogCiAKLWNsYXNzIHN1cHByZXNzOgorY2xhc3Mgc3VwcHJlc3MoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRvIHN1cHByZXNzIHNwZWNpZmllZCBleGNlcHRpb25zCiAKICAgICBBZnRlciB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGV4ZWN1dGlvbiBwcm9jZWVkcyB3aXRoIHRoZSBuZXh0CkBAIC0yMzAsNyArMjUzLDcgQEAKIAogCiAjIEluc3BpcmVkIGJ5IGRpc2N1c3Npb25zIG9uIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMzU4NQotY2xhc3MgRXhpdFN0YWNrKG9iamVjdCk6CitjbGFzcyBFeGl0U3RhY2soQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiQ29udGV4dCBtYW5hZ2VyIGZvciBkeW5hbWljIG1hbmFnZW1lbnQgb2YgYSBzdGFjayBvZiBleGl0IGNhbGxiYWNrcwogCiAgICAgRm9yIGV4YW1wbGU6CkBAIC0zMDksOSArMzMyLDYgQEAKICAgICAgICAgIiIiSW1tZWRpYXRlbHkgdW53aW5kIHRoZSBjb250ZXh0IHN0YWNrIiIiCiAgICAgICAgIHNlbGYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKIAotICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19kZXRhaWxzKToKICAgICAgICAgcmVjZWl2ZWRfZXhjID0gZXhjX2RldGFpbHNbMF0gaXMgbm90IE5vbmUKIApkaWZmIC0tZ2l0IGEvTGliL2NvcHkucHkgYi9MaWIvY29weS5weQppbmRleCA5NzJiOTRhLi5mODYwNDBhIDEwMDY0NAotLS0gYS9MaWIvY29weS5weQorKysgYi9MaWIvY29weS5weQpAQCAtNTEsNyArNTEsNiBAQAogaW1wb3J0IHR5cGVzCiBpbXBvcnQgd2Vha3JlZgogZnJvbSBjb3B5cmVnIGltcG9ydCBkaXNwYXRjaF90YWJsZQotaW1wb3J0IGJ1aWx0aW5zCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAgcGFzcwpAQCAtMTAyLDM3ICsxMDEsMzMgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoInVuKHNoYWxsb3cpY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXMiICUgY2xzKQogCi0gICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBydiwgMCkKKyAgICBpZiBpc2luc3RhbmNlKHJ2LCBzdHIpOgorICAgICAgICByZXR1cm4geAorICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgTm9uZSwgKnJ2KQogCiAKIF9jb3B5X2Rpc3BhdGNoID0gZCA9IHt9CiAKIGRlZiBfY29weV9pbW11dGFibGUoeCk6CiAgICAgcmV0dXJuIHgKLWZvciB0IGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLAotICAgICAgICAgIGJ5dGVzLCBmcm96ZW5zZXQsIHR5cGUsIHJhbmdlLAotICAgICAgICAgIHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUsIHR5cGUoRWxsaXBzaXMpLAorZm9yIHQgaW4gKHR5cGUoTm9uZSksIGludCwgZmxvYXQsIGJvb2wsIGNvbXBsZXgsIHN0ciwgdHVwbGUsCisgICAgICAgICAgYnl0ZXMsIGZyb3plbnNldCwgdHlwZSwgcmFuZ2UsIHNsaWNlLAorICAgICAgICAgIHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUsIHR5cGUoRWxsaXBzaXMpLCB0eXBlKE5vdEltcGxlbWVudGVkKSwKICAgICAgICAgICB0eXBlcy5GdW5jdGlvblR5cGUsIHdlYWtyZWYucmVmKToKICAgICBkW3RdID0gX2NvcHlfaW1tdXRhYmxlCiB0ID0gZ2V0YXR0cih0eXBlcywgIkNvZGVUeXBlIiwgTm9uZSkKIGlmIHQgaXMgbm90IE5vbmU6CiAgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQotZm9yIG5hbWUgaW4gKCJjb21wbGV4IiwgInVuaWNvZGUiKToKLSAgICB0ID0gZ2V0YXR0cihidWlsdGlucywgbmFtZSwgTm9uZSkKLSAgICBpZiB0IGlzIG5vdCBOb25lOgotICAgICAgICBkW3RdID0gX2NvcHlfaW1tdXRhYmxlCiAKLWRlZiBfY29weV93aXRoX2NvbnN0cnVjdG9yKHgpOgotICAgIHJldHVybiB0eXBlKHgpKHgpCi1mb3IgdCBpbiAobGlzdCwgZGljdCwgc2V0KToKLSAgICBkW3RdID0gX2NvcHlfd2l0aF9jb25zdHJ1Y3RvcgorZFtsaXN0XSA9IGxpc3QuY29weQorZFtkaWN0XSA9IGRpY3QuY29weQorZFtzZXRdID0gc2V0LmNvcHkKK2RbYnl0ZWFycmF5XSA9IGJ5dGVhcnJheS5jb3B5CiAKLWRlZiBfY29weV93aXRoX2NvcHlfbWV0aG9kKHgpOgotICAgIHJldHVybiB4LmNvcHkoKQogaWYgUHlTdHJpbmdNYXAgaXMgbm90IE5vbmU6Ci0gICAgZFtQeVN0cmluZ01hcF0gPSBfY29weV93aXRoX2NvcHlfbWV0aG9kCisgICAgZFtQeVN0cmluZ01hcF0gPSBQeVN0cmluZ01hcC5jb3B5CiAKLWRlbCBkCitkZWwgZCwgdAogCiBkZWYgZGVlcGNvcHkoeCwgbWVtbz1Ob25lLCBfbmlsPVtdKToKICAgICAiIiJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4KQEAgLTE3OSw3ICsxNzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bihkZWVwKWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzIiAlIGNscykKLSAgICAgICAgICAgICAgICB5ID0gX3JlY29uc3RydWN0KHgsIHJ2LCAxLCBtZW1vKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocnYsIHN0cik6CisgICAgICAgICAgICAgICAgICAgIHkgPSB4CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBtZW1vLCAqcnYpCiAKICAgICAjIElmIGlzIGl0cyBvd24gY29weSwgZG9uJ3QgbWVtb2l6ZS4KICAgICBpZiB5IGlzIG5vdCB4OgpAQCAtMTkzLDEzICsxOTEsMTEgQEAKICAgICByZXR1cm4geAogZFt0eXBlKE5vbmUpXSA9IF9kZWVwY29weV9hdG9taWMKIGRbdHlwZShFbGxpcHNpcyldID0gX2RlZXBjb3B5X2F0b21pYworZFt0eXBlKE5vdEltcGxlbWVudGVkKV0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2Zsb2F0XSA9IF9kZWVwY29weV9hdG9taWMKIGRbYm9vbF0gPSBfZGVlcGNvcHlfYXRvbWljCi10cnk6Ci0gICAgZFtjb21wbGV4XSA9IF9kZWVwY29weV9hdG9taWMKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcworZFtjb21wbGV4XSA9IF9kZWVwY29weV9hdG9taWMKIGRbYnl0ZXNdID0gX2RlZXBjb3B5X2F0b21pYwogZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pYwogdHJ5OgpAQCAtMjExLDE1ICsyMDcsMTYgQEAKIGRbdHlwZXMuRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWMKIGRbd2Vha3JlZi5yZWZdID0gX2RlZXBjb3B5X2F0b21pYwogCi1kZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6CitkZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbywgZGVlcGNvcHk9ZGVlcGNvcHkpOgogICAgIHkgPSBbXQogICAgIG1lbW9baWQoeCldID0geQorICAgIGFwcGVuZCA9IHkuYXBwZW5kCiAgICAgZm9yIGEgaW4geDoKLSAgICAgICAgeS5hcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpCisgICAgICAgIGFwcGVuZChkZWVwY29weShhLCBtZW1vKSkKICAgICByZXR1cm4geQogZFtsaXN0XSA9IF9kZWVwY29weV9saXN0CiAKLWRlZiBfZGVlcGNvcHlfdHVwbGUoeCwgbWVtbyk6CitkZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8sIGRlZXBjb3B5PWRlZXBjb3B5KToKICAgICB5ID0gW2RlZXBjb3B5KGEsIG1lbW8pIGZvciBhIGluIHhdCiAgICAgIyBXZSdyZSBub3QgZ29pbmcgdG8gcHV0IHRoZSB0dXBsZSBpbiB0aGUgbWVtbywgYnV0IGl0J3Mgc3RpbGwgaW1wb3J0YW50IHdlCiAgICAgIyBjaGVjayBmb3IgaXQsIGluIGNhc2UgdGhlIHR1cGxlIGNvbnRhaW5zIHJlY3Vyc2l2ZSBtdXRhYmxlIHN0cnVjdHVyZXMuCkBAIC0yMzYsNyArMjMzLDcgQEAKICAgICByZXR1cm4geQogZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGUKIAotZGVmIF9kZWVwY29weV9kaWN0KHgsIG1lbW8pOgorZGVmIF9kZWVwY29weV9kaWN0KHgsIG1lbW8sIGRlZXBjb3B5PWRlZXBjb3B5KToKICAgICB5ID0ge30KICAgICBtZW1vW2lkKHgpXSA9IHkKICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB4Lml0ZW1zKCk6CkBAIC0yNDgsNyArMjQ1LDkgQEAKIAogZGVmIF9kZWVwY29weV9tZXRob2QoeCwgbWVtbyk6ICMgQ29weSBpbnN0YW5jZSBtZXRob2RzCiAgICAgcmV0dXJuIHR5cGUoeCkoeC5fX2Z1bmNfXywgZGVlcGNvcHkoeC5fX3NlbGZfXywgbWVtbykpCi1fZGVlcGNvcHlfZGlzcGF0Y2hbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfbWV0aG9kCitkW3R5cGVzLk1ldGhvZFR5cGVdID0gX2RlZXBjb3B5X21ldGhvZAorCitkZWwgZAogCiBkZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6CiAgICAgIiIiS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB4IGluIHRoZSBtZW1vLgpAQCAtMjY2LDMxICsyNjUsMTUgQEAKICAgICAgICAgIyBhaGEsIHRoaXMgaXMgdGhlIGZpcnN0IG9uZSA6LSkKICAgICAgICAgbWVtb1tpZChtZW1vKV09W3hdCiAKLWRlZiBfcmVjb25zdHJ1Y3QoeCwgaW5mbywgZGVlcCwgbWVtbz1Ob25lKToKLSAgICBpZiBpc2luc3RhbmNlKGluZm8sIHN0cik6Ci0gICAgICAgIHJldHVybiB4Ci0gICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW5mbywgdHVwbGUpCi0gICAgaWYgbWVtbyBpcyBOb25lOgotICAgICAgICBtZW1vID0ge30KLSAgICBuID0gbGVuKGluZm8pCi0gICAgYXNzZXJ0IG4gaW4gKDIsIDMsIDQsIDUpCi0gICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXQotICAgIGlmIG4gPiAyOgotICAgICAgICBzdGF0ZSA9IGluZm9bMl0KLSAgICBlbHNlOgotICAgICAgICBzdGF0ZSA9IE5vbmUKLSAgICBpZiBuID4gMzoKLSAgICAgICAgbGlzdGl0ZXIgPSBpbmZvWzNdCi0gICAgZWxzZToKLSAgICAgICAgbGlzdGl0ZXIgPSBOb25lCi0gICAgaWYgbiA+IDQ6Ci0gICAgICAgIGRpY3RpdGVyID0gaW5mb1s0XQotICAgIGVsc2U6Ci0gICAgICAgIGRpY3RpdGVyID0gTm9uZQorZGVmIF9yZWNvbnN0cnVjdCh4LCBtZW1vLCBmdW5jLCBhcmdzLAorICAgICAgICAgICAgICAgICBzdGF0ZT1Ob25lLCBsaXN0aXRlcj1Ob25lLCBkaWN0aXRlcj1Ob25lLAorICAgICAgICAgICAgICAgICBkZWVwY29weT1kZWVwY29weSk6CisgICAgZGVlcCA9IG1lbW8gaXMgbm90IE5vbmUKKyAgICBpZiBkZWVwIGFuZCBhcmdzOgorICAgICAgICBhcmdzID0gKGRlZXBjb3B5KGFyZywgbWVtbykgZm9yIGFyZyBpbiBhcmdzKQorICAgIHkgPSBmdW5jKCphcmdzKQogICAgIGlmIGRlZXA6Ci0gICAgICAgIGFyZ3MgPSBkZWVwY29weShhcmdzLCBtZW1vKQotICAgIHkgPSBjYWxsYWJsZSgqYXJncykKLSAgICBtZW1vW2lkKHgpXSA9IHkKKyAgICAgICAgbWVtb1tpZCh4KV0gPSB5CiAKICAgICBpZiBzdGF0ZSBpcyBub3QgTm9uZToKICAgICAgICAgaWYgZGVlcDoKQEAgLTMwOSwyMiArMjkyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoeSwga2V5LCB2YWx1ZSkKIAogICAgIGlmIGxpc3RpdGVyIGlzIG5vdCBOb25lOgotICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjoKLSAgICAgICAgICAgIGlmIGRlZXA6CisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjoKICAgICAgICAgICAgICAgICBpdGVtID0gZGVlcGNvcHkoaXRlbSwgbWVtbykKLSAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgorICAgICAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pCiAgICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOgotICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOgogICAgICAgICAgICAgICAgIGtleSA9IGRlZXBjb3B5KGtleSwgbWVtbykKICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKQotICAgICAgICAgICAgeVtrZXldID0gdmFsdWUKKyAgICAgICAgICAgICAgICB5W2tleV0gPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6CisgICAgICAgICAgICAgICAgeVtrZXldID0gdmFsdWUKICAgICByZXR1cm4geQogCi1kZWwgZAotCi1kZWwgdHlwZXMKLQotIyBIZWxwZXIgZm9yIGluc3RhbmNlIGNyZWF0aW9uIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfXwotY2xhc3MgX0VtcHR5Q2xhc3M6Ci0gICAgcGFzcworZGVsIHR5cGVzLCB3ZWFrcmVmLCBQeVN0cmluZ01hcApkaWZmIC0tZ2l0IGEvTGliL2NyeXB0LnB5IGIvTGliL2NyeXB0LnB5CmluZGV4IDQ5YWI5NmUuLmZiYzVmNGMgMTAwNjQ0Ci0tLSBhL0xpYi9jcnlwdC5weQorKysgYi9MaWIvY3J5cHQucHkKQEAgLTU0LDkgKzU0LDggQEAKIE1FVEhPRF9TSEE1MTIgPSBfTWV0aG9kKCdTSEE1MTInLCAnNicsIDE2LCAxMDYpCiAKIG1ldGhvZHMgPSBbXQotZm9yIF9tZXRob2QgaW4gKE1FVEhPRF9TSEE1MTIsIE1FVEhPRF9TSEEyNTYsIE1FVEhPRF9NRDUpOgorZm9yIF9tZXRob2QgaW4gKE1FVEhPRF9TSEE1MTIsIE1FVEhPRF9TSEEyNTYsIE1FVEhPRF9NRDUsIE1FVEhPRF9DUllQVCk6CiAgICAgX3Jlc3VsdCA9IGNyeXB0KCcnLCBfbWV0aG9kKQogICAgIGlmIF9yZXN1bHQgYW5kIGxlbihfcmVzdWx0KSA9PSBfbWV0aG9kLnRvdGFsX3NpemU6CiAgICAgICAgIG1ldGhvZHMuYXBwZW5kKF9tZXRob2QpCi1tZXRob2RzLmFwcGVuZChNRVRIT0RfQ1JZUFQpCiBkZWwgX3Jlc3VsdCwgX21ldGhvZApkaWZmIC0tZ2l0IGEvTGliL2Nzdi5weSBiL0xpYi9jc3YucHkKaW5kZXggY2E0MGU1ZS4uOTA0NjFkYiAxMDA2NDQKLS0tIGEvTGliL2Nzdi5weQorKysgYi9MaWIvY3N2LnB5CkBAIC0xMywxMSArMTMsMTIgQEAKIAogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KIAotX19hbGxfXyA9IFsgIlFVT1RFX01JTklNQUwiLCAiUVVPVEVfQUxMIiwgIlFVT1RFX05PTk5VTUVSSUMiLCAiUVVPVEVfTk9ORSIsCi0gICAgICAgICAgICAiRXJyb3IiLCAiRGlhbGVjdCIsICJfX2RvY19fIiwgImV4Y2VsIiwgImV4Y2VsX3RhYiIsCi0gICAgICAgICAgICAiZmllbGRfc2l6ZV9saW1pdCIsICJyZWFkZXIiLCAid3JpdGVyIiwKLSAgICAgICAgICAgICJyZWdpc3Rlcl9kaWFsZWN0IiwgImdldF9kaWFsZWN0IiwgImxpc3RfZGlhbGVjdHMiLCAiU25pZmZlciIsCi0gICAgICAgICAgICAidW5yZWdpc3Rlcl9kaWFsZWN0IiwgIl9fdmVyc2lvbl9fIiwgIkRpY3RSZWFkZXIiLCAiRGljdFdyaXRlciIgXQorX19hbGxfXyA9IFsiUVVPVEVfTUlOSU1BTCIsICJRVU9URV9BTEwiLCAiUVVPVEVfTk9OTlVNRVJJQyIsICJRVU9URV9OT05FIiwKKyAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAorICAgICAgICAgICAiZmllbGRfc2l6ZV9saW1pdCIsICJyZWFkZXIiLCAid3JpdGVyIiwKKyAgICAgICAgICAgInJlZ2lzdGVyX2RpYWxlY3QiLCAiZ2V0X2RpYWxlY3QiLCAibGlzdF9kaWFsZWN0cyIsICJTbmlmZmVyIiwKKyAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiLAorICAgICAgICAgICAidW5peF9kaWFsZWN0Il0KIAogY2xhc3MgRGlhbGVjdDoKICAgICAiIiJEZXNjcmliZSBhIENTViBkaWFsZWN0LgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy91dGlsLnB5IGIvTGliL2N0eXBlcy91dGlsLnB5CmluZGV4IDllNzRjY2QuLjM4YmQ1N2YgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdXRpbC5weQorKysgYi9MaWIvY3R5cGVzL3V0aWwucHkKQEAgLTIyMSw4ICsyMjEsOCBAQAogICAgICAgICAgICAgYWJpX3R5cGUgPSBtYWNoX21hcC5nZXQobWFjaGluZSwgJ2xpYmM2JykKIAogICAgICAgICAgICAgIyBYWFggYXNzdW1pbmcgR0xJQkMncyBsZGNvbmZpZyAod2l0aCBvcHRpb24gLXApCi0gICAgICAgICAgICByZWdleCA9IG9zLmZzZW5jb2RlKAotICAgICAgICAgICAgICAgICdccysobGliJXNcLlteXHNdKylccytcKCVzJyAlIChyZS5lc2NhcGUobmFtZSksIGFiaV90eXBlKSkKKyAgICAgICAgICAgIHJlZ2V4ID0gcidccysobGliJXNcLlteXHNdKylccytcKCVzJworICAgICAgICAgICAgcmVnZXggPSBvcy5mc2VuY29kZShyZWdleCAlIChyZS5lc2NhcGUobmFtZSksIGFiaV90eXBlKSkKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oWycvc2Jpbi9sZGNvbmZpZycsICctcCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLkRFVk5VTEwsCmRpZmYgLS1naXQgYS9MaWIvZGF0ZXRpbWUucHkgYi9MaWIvZGF0ZXRpbWUucHkKaW5kZXggMmY5NDIxOC4uZDRiN2ZjNCAxMDA2NDQKLS0tIGEvTGliL2RhdGV0aW1lLnB5CisrKyBiL0xpYi9kYXRldGltZS5weQpAQCAtMTUyLDEyICsxNTIsMjYgQEAKICAgICBkbnVtID0gX2RheXNfYmVmb3JlX21vbnRoKHksIG0pICsgZAogICAgIHJldHVybiBfdGltZS5zdHJ1Y3RfdGltZSgoeSwgbSwgZCwgaGgsIG1tLCBzcywgd2RheSwgZG51bSwgZHN0ZmxhZykpCiAKLWRlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMpOgotICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KLSAgICByZXN1bHQgPSAiJTAyZDolMDJkOiUwMmQiICUgKGhoLCBtbSwgc3MpCi0gICAgaWYgdXM6Ci0gICAgICAgIHJlc3VsdCArPSAiLiUwNmQiICUgdXMKLSAgICByZXR1cm4gcmVzdWx0CitkZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzLCB0aW1lc3BlYz0nYXV0bycpOgorICAgIHNwZWNzID0geworICAgICAgICAnaG91cnMnOiAnezowMmR9JywKKyAgICAgICAgJ21pbnV0ZXMnOiAnezowMmR9Ons6MDJkfScsCisgICAgICAgICdzZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9JywKKyAgICAgICAgJ21pbGxpc2Vjb25kcyc6ICd7OjAyZH06ezowMmR9Ons6MDJkfS57OjAzZH0nLAorICAgICAgICAnbWljcm9zZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9Lns6MDZkfScKKyAgICB9CisKKyAgICBpZiB0aW1lc3BlYyA9PSAnYXV0byc6CisgICAgICAgICMgU2tpcCB0cmFpbGluZyBtaWNyb3NlY29uZHMgd2hlbiB1cz09MC4KKyAgICAgICAgdGltZXNwZWMgPSAnbWljcm9zZWNvbmRzJyBpZiB1cyBlbHNlICdzZWNvbmRzJworICAgIGVsaWYgdGltZXNwZWMgPT0gJ21pbGxpc2Vjb25kcyc6CisgICAgICAgIHVzIC8vPSAxMDAwCisgICAgdHJ5OgorICAgICAgICBmbXQgPSBzcGVjc1t0aW1lc3BlY10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1Vua25vd24gdGltZXNwZWMgdmFsdWUnKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KGhoLCBtbSwgc3MsIHVzKQogCiAjIENvcnJlY3RseSBzdWJzdGl0dXRlIGZvciAleiBhbmQgJVogZXNjYXBlcyBpbiBzdHJmdGltZSBmb3JtYXRzLgogZGVmIF93cmFwX3N0cmZ0aW1lKG9iamVjdCwgZm9ybWF0LCB0aW1ldHVwbGUpOgpAQCAtMzE2LDYgKzMzMCw3IEBACiAKICAgICByZXR1cm4gcQogCisKIGNsYXNzIHRpbWVkZWx0YToKICAgICAiIiJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy4KIApAQCAtMTE5MywxNCArMTIwOCwxNyBAQAogICAgICAgICAgICAgcyA9IHNbOi0xXSArICIsIHR6aW5mbz0lciIgJSBzZWxmLl90emluZm8gKyAiKSIKICAgICAgICAgcmV0dXJuIHMKIAotICAgIGRlZiBpc29mb3JtYXQoc2VsZik6CisgICAgZGVmIGlzb2Zvcm1hdChzZWxmLCB0aW1lc3BlYz0nYXV0bycpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uCiAKLSAgICAgICAgVGhpcyBpcyAnSEg6TU06U1MubW1tbW1tK3p6Onp6Jywgb3IgJ0hIOk1NOlNTK3p6Onp6JyBpZgotICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuCisgICAgICAgIFRoZSBmdWxsIGZvcm1hdCBpcyAnSEg6TU06U1MubW1tbW1tK3p6Onp6Jy4gQnkgZGVmYXVsdCwgdGhlIGZyYWN0aW9uYWwKKyAgICAgICAgcGFydCBpcyBvbWl0dGVkIGlmIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KKworICAgICAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgdGltZXNwZWMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbAorICAgICAgICB0ZXJtcyBvZiB0aGUgdGltZSB0byBpbmNsdWRlLgogICAgICAgICAiIiIKICAgICAgICAgcyA9IF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQsIHRpbWVzcGVjKQogICAgICAgICB0eiA9IHNlbGYuX3R6c3RyKCkKICAgICAgICAgaWYgdHo6CiAgICAgICAgICAgICBzICs9IHR6CkBAIC0xNTQ5LDIxICsxNTY3LDI1IEBACiAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgIHNlbGYuX3llYXIpCiAKLSAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOgorICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJywgdGltZXNwZWM9J2F1dG8nKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLgogCi0gICAgICAgIFRoaXMgaXMgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tJywgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MnIGlmCi0gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KKyAgICAgICAgVGhlIGZ1bGwgZm9ybWF0IGxvb2tzIGxpa2UgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tJy4KKyAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBvbWl0dGVkIGlmIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KIAogICAgICAgICBJZiBzZWxmLnR6aW5mbyBpcyBub3QgTm9uZSwgdGhlIFVUQyBvZmZzZXQgaXMgYWxzbyBhdHRhY2hlZCwgZ2l2aW5nCi0gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLgorICAgICAgICBnaXZpbmcgYSBmdWxsIGZvcm1hdCBvZiAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0rSEg6TU0nLgogCiAgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50IHNlcCBzcGVjaWZpZXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGRhdGUgYW5kCiAgICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCB0aW1lc3BlYyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICAgICAgIHRlcm1zIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuCiAgICAgICAgICIiIgogICAgICAgICBzID0gKCIlMDRkLSUwMmQtJTAyZCVjIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICsKICAgICAgICAgICAgICBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQsIHRpbWVzcGVjKSkKKwogICAgICAgICBvZmYgPSBzZWxmLnV0Y29mZnNldCgpCiAgICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIG9mZi5kYXlzIDwgMDoKQEAgLTE5MTMsNiArMTkzNSw4IEBACiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIF9uYW1lX2Zyb21fb2Zmc2V0KGRlbHRhKToKKyAgICAgICAgaWYgbm90IGRlbHRhOgorICAgICAgICAgICAgcmV0dXJuICdVVEMnCiAgICAgICAgIGlmIGRlbHRhIDwgdGltZWRlbHRhKDApOgogICAgICAgICAgICAgc2lnbiA9ICctJwogICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKZGlmZiAtLWdpdCBhL0xpYi9kaXMucHkgYi9MaWIvZGlzLnB5CmluZGV4IGFmMzdjZGYuLjJlODBlMTcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXMucHkKKysrIGIvTGliL2Rpcy5weQpAQCAtMTYyLDYgKzE2MiwxNSBAQAogX0luc3RydWN0aW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgiX0luc3RydWN0aW9uIiwKICAgICAgIm9wbmFtZSBvcGNvZGUgYXJnIGFyZ3ZhbCBhcmdyZXByIG9mZnNldCBzdGFydHNfbGluZSBpc19qdW1wX3RhcmdldCIpCiAKK19JbnN0cnVjdGlvbi5vcG5hbWUuX19kb2NfXyA9ICJIdW1hbiByZWFkYWJsZSBuYW1lIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24ub3Bjb2RlLl9fZG9jX18gPSAiTnVtZXJpYyBjb2RlIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24uYXJnLl9fZG9jX18gPSAiTnVtZXJpYyBhcmd1bWVudCB0byBvcGVyYXRpb24gKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmFyZ3ZhbC5fX2RvY19fID0gIlJlc29sdmVkIGFyZyB2YWx1ZSAoaWYga25vd24pLCBvdGhlcndpc2Ugc2FtZSBhcyBhcmciCitfSW5zdHJ1Y3Rpb24uYXJncmVwci5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIG9wZXJhdGlvbiBhcmd1bWVudCIKK19JbnN0cnVjdGlvbi5vZmZzZXQuX19kb2NfXyA9ICJTdGFydCBpbmRleCBvZiBvcGVyYXRpb24gd2l0aGluIGJ5dGVjb2RlIHNlcXVlbmNlIgorX0luc3RydWN0aW9uLnN0YXJ0c19saW5lLl9fZG9jX18gPSAiTGluZSBzdGFydGVkIGJ5IHRoaXMgb3Bjb2RlIChpZiBhbnkpLCBvdGhlcndpc2UgTm9uZSIKK19JbnN0cnVjdGlvbi5pc19qdW1wX3RhcmdldC5fX2RvY19fID0gIlRydWUgaWYgb3RoZXIgY29kZSBqdW1wcyB0byBoZXJlLCBvdGhlcndpc2UgRmFsc2UiCisKIGNsYXNzIEluc3RydWN0aW9uKF9JbnN0cnVjdGlvbik6CiAgICAgIiIiRGV0YWlscyBmb3IgYSBieXRlY29kZSBvcGVyYXRpb24KIApAQCAtMzg4LDggKzM5Nyw4IEBACiAgICAgR2VuZXJhdGUgcGFpcnMgKG9mZnNldCwgbGluZW5vKSBhcyBkZXNjcmliZWQgaW4gUHl0aG9uL2NvbXBpbGUuYy4KIAogICAgICIiIgotICAgIGJ5dGVfaW5jcmVtZW50cyA9IGxpc3QoY29kZS5jb19sbm90YWJbMDo6Ml0pCi0gICAgbGluZV9pbmNyZW1lbnRzID0gbGlzdChjb2RlLmNvX2xub3RhYlsxOjoyXSkKKyAgICBieXRlX2luY3JlbWVudHMgPSBjb2RlLmNvX2xub3RhYlswOjoyXQorICAgIGxpbmVfaW5jcmVtZW50cyA9IGNvZGUuY29fbG5vdGFiWzE6OjJdCiAKICAgICBsYXN0bGluZW5vID0gTm9uZQogICAgIGxpbmVubyA9IGNvZGUuY29fZmlyc3RsaW5lbm8KQEAgLTQwMCw2ICs0MDksOSBAQAogICAgICAgICAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgbGFzdGxpbmVubyA9IGxpbmVubwogICAgICAgICAgICAgYWRkciArPSBieXRlX2luY3IKKyAgICAgICAgaWYgbGluZV9pbmNyID49IDB4ODA6CisgICAgICAgICAgICAjIGxpbmVfaW5jcmVtZW50cyBpcyBhbiBhcnJheSBvZiA4LWJpdCBzaWduZWQgaW50ZWdlcnMKKyAgICAgICAgICAgIGxpbmVfaW5jciAtPSAweDEwMAogICAgICAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAgICAgaWYgbGluZW5vICE9IGxhc3RsaW5lbm86CiAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQppbmRleCBiM2NmZTljLi5mNmMyMWFlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzZWxmLnRhcmdldF92ZXJzaW9uCiAgICAgICAgICAgICBpZiBub3QgdGFyZ2V0X3ZlcnNpb246CiAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2tpcF9idWlsZCwgIlNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGlzIgotICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc3lzLnZlcnNpb25bMDozXQorICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCB0YXJnZXRfdmVyc2lvbikKICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQppbmRleCAwYzBlMmMxLi5kM2UxZDNhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHNlbGYudGFyZ2V0X3ZlcnNpb24KICAgICAgICAgICAgIGlmIG5vdCB0YXJnZXRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5za2lwX2J1aWxkLCAiU2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoaXMiCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzeXMudmVyc2lvblswOjNdCisgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQogICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKaW5kZXggMzM3ZGQwYi4uYzZmNTJlNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXBsYXQtbmFtZSBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICh0cnkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAnLi9jb25maWd1cmUgLS1oZWxwJyBvbiB5b3VyIHBsYXRmb3JtKSIpCiAKLSAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVkLiVkIiAlIChzZWxmLnBsYXRfbmFtZSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgICMgTWFrZSBpdCBzbyBQeXRob24gMi54IGFuZCBQeXRob24gMi54IHdpdGggLS13aXRoLXB5ZGVidWcgZG9uJ3QKICAgICAgICAgIyBzaGFyZSB0aGUgc2FtZSBidWlsZCBkaXJlY3Rvcmllcy4gRG9pbmcgc28gY29uZnVzZXMgdGhlIGJ1aWxkCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVtcCcgKyBwbGF0X3NwZWNpZmllcikKICAgICAgICAgaWYgc2VsZi5idWlsZF9zY3JpcHRzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmJ1aWxkX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLScgKyBzeXMudmVyc2lvblswOjNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLSVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKaW5kZXggNjdkYjAwNy4uOTQ3NGU5YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKQEAgLTI5MCw4ICsyOTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXN0X3ZlcnNpb24nOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXN0X2Z1bGxuYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb24nOiBweV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uX3Nob3J0JzogcHlfdmVyc2lvblswOjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uX25vZG90JzogcHlfdmVyc2lvblswXSArIHB5X3ZlcnNpb25bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiAnJWQlZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzX3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKaW5kZXggYzJhN2Q2NC4uMGRkYzczNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKQEAgLTIxLDEwICsyMSwxMCBAQAogCiAgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCi0gICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JXMuZWdnLWluZm8iICUgKAorICAgICAgICBiYXNlbmFtZSA9ICIlcy0lcy1weSVkLiVkLmVnZy1pbmZvIiAlICgKICAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKSksCiAgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX3ZlcnNpb24oc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSkpLAotICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdCisgICAgICAgICAgICAqc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgKQogICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKICAgICAgICAgc2VsZi5vdXRwdXRzID0gW3NlbGYudGFyZ2V0XQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5IGIvTGliL2Rpc3R1dGlscy9jb3JlLnB5CmluZGV4IGYwNWIzNGIuLmQ2MDNkNGEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKQEAgLTIwNCwxNiArMjA0LDE1IEBACiAgICAgZ2xvYmFsIF9zZXR1cF9zdG9wX2FmdGVyLCBfc2V0dXBfZGlzdHJpYnV0aW9uCiAgICAgX3NldHVwX3N0b3BfYWZ0ZXIgPSBzdG9wX2FmdGVyCiAKLSAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndgorICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2LmNvcHkoKQogICAgIGcgPSB7J19fZmlsZV9fJzogc2NyaXB0X25hbWV9Ci0gICAgbCA9IHt9CiAgICAgdHJ5OgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzeXMuYXJndlswXSA9IHNjcmlwdF9uYW1lCiAgICAgICAgICAgICBpZiBzY3JpcHRfYXJncyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzeXMuYXJndlsxOl0gPSBzY3JpcHRfYXJncwogICAgICAgICAgICAgd2l0aCBvcGVuKHNjcmlwdF9uYW1lLCAncmInKSBhcyBmOgotICAgICAgICAgICAgICAgIGV4ZWMoZi5yZWFkKCksIGcsIGwpCisgICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZykKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5hcmd2ID0gc2F2ZV9hcmd2CiAgICAgICAgICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKaW5kZXggNTczNzI0ZC4uZDIwM2Y4ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKQEAgLTcwLDcgKzcwLDcgQEAKICAgICBsZWF2aW5nIG9mZiB0aGUgcGF0Y2hsZXZlbC4gIFNhbXBsZSByZXR1cm4gdmFsdWVzIGNvdWxkIGJlICcxLjUnCiAgICAgb3IgJzIuMicuCiAgICAgIiIiCi0gICAgcmV0dXJuIHN5cy52ZXJzaW9uWzozXQorICAgIHJldHVybiAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIAogCiBkZWYgZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0wLCBwcmVmaXg9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkKaW5kZXggMzM5MWYzNi4uYjAyMGE1YiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQpAQCAtMjcsNyArMjcsNyBAQAogICAgICAgICAjIGJ1aWxkX3BsYXRsaWIgaXMgJ2J1aWxkL2xpYi5wbGF0Zm9ybS14LnhbLXB5ZGVidWddJwogICAgICAgICAjIGV4YW1wbGVzOgogICAgICAgICAjICAgYnVpbGQvbGliLm1hY29zeC0xMC4zLWkzODYtMi43Ci0gICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJXMnICUgKGNtZC5wbGF0X25hbWUsIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJWQuJWQnICUgKGNtZC5wbGF0X25hbWUsICpzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX3BsYXRsaWIuZW5kc3dpdGgoJy1weWRlYnVnJykpCiAgICAgICAgICAgICBwbGF0X3NwZWMgKz0gJy1weWRlYnVnJwpAQCAtNDIsNyArNDIsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF90ZW1wLCB3YW50ZWQpCiAKICAgICAgICAgIyBidWlsZF9zY3JpcHRzIGlzIGJ1aWxkL3NjcmlwdHMteC54Ci0gICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ3NjcmlwdHMtJyArICBzeXMudmVyc2lvblswOjNdKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfc2NyaXB0cywgd2FudGVkKQogCiAgICAgICAgICMgZXhlY3V0YWJsZSBpcyBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQppbmRleCA2NTQyMjdjLi4yN2NlNzMyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQpAQCAtMjksNiArMjksMjEgQEAKIHNldHVwKCkKICIiIgogCitzZXR1cF9kb2VzX25vdGhpbmcgPSAiIiJcCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorc2V0dXAoKQorIiIiCisKKworc2V0dXBfZGVmaW5lc19zdWJjbGFzcyA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwgYXMgX2luc3RhbGwKKworY2xhc3MgaW5zdGFsbChfaW5zdGFsbCk6CisgICAgc3ViX2NvbW1hbmRzID0gX2luc3RhbGwuc3ViX2NvbW1hbmRzICsgWydjbWQnXQorCitzZXR1cChjbWRjbGFzcz17J2luc3RhbGwnOiBpbnN0YWxsfSkKKyIiIgogCiBjbGFzcyBDb3JlVGVzdENhc2Uoc3VwcG9ydC5FbnZpcm9uR3VhcmQsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNjcsNiArODIsMjEgQEAKICAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAogICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF91c2luZ19fX2ZpbGVfXykpCiAKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfcHJlc2VydmVzX3N5c19hcmd2KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBydW5fc2V0dXAgZG9lcyBub3QgY2xvYmJlciBzeXMuYXJndgorICAgICAgICBhcmd2X2NvcHkgPSBzeXMuYXJndi5jb3B5KCkKKyAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF9kb2VzX25vdGhpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5hcmd2LCBhcmd2X2NvcHkpCisKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfZGVmaW5lc19zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNjcmlwdCBjYW4gdXNlIF9fZmlsZV9fOyBpZiB0aGF0J3MgbWlzc2luZywgdGhlIHRlc3QKKyAgICAgICAgIyBzZXR1cC5weSBzY3JpcHQgd2lsbCByYWlzZSBOYW1lRXJyb3IuCisgICAgICAgIGRpc3QgPSBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX2RlZmluZXNfc3ViY2xhc3MpKQorICAgICAgICBpbnN0YWxsID0gZGlzdC5nZXRfY29tbWFuZF9vYmooJ2luc3RhbGwnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdjbWQnLCBpbnN0YWxsLnN1Yl9jb21tYW5kcykKKwogICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF91c2VzX2N1cnJlbnRfZGlyKHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdHMgdGhhdCB0aGUgc2V0dXAgc2NyaXB0IGlzIHJ1biB3aXRoIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogICAgICAgICAjIGFzIGl0cyBvd24gY3VycmVudCBkaXJlY3Rvcnk7IHRoaXMgd2FzIHRlbXBvcmFyaWx5IGJyb2tlbiBieSBhCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3V0aWwucHkKaW5kZXggZTQyMzMyNS4uZmRjZjZmYSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQpAQCAtNyw4ICs3LDggQEAKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKLWltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgogZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KQEAgLTM1MCw2ICszNTAsMTEgQEAKICAgICBnZW5lcmF0ZWQgaW4gaW5kaXJlY3QgbW9kZTsgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBsZWF2ZQogICAgIGl0IHNldCB0byBOb25lLgogICAgICIiIgorCisgICAgIyBMYXRlIGltcG9ydCB0byBmaXggYSBib290c3RyYXAgaXNzdWU6IF9wb3NpeHN1YnByb2Nlc3MgaXMgYnVpbHQgYnkKKyAgICAjIHNldHVwLnB5LCBidXQgc2V0dXAucHkgdXNlcyBkaXN0dXRpbHMuCisgICAgaW1wb3J0IHN1YnByb2Nlc3MKKwogICAgICMgbm90aGluZyBpcyBkb25lIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlIGlzIFRydWUKICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQnl0ZUNvbXBpbGVFcnJvcignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQuJykKQEAgLTQxMiwxMSArNDE3LDkgQEAKIAogICAgICAgICAgICAgc2NyaXB0LmNsb3NlKCkKIAotICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsIHNjcmlwdF9uYW1lXQotICAgICAgICBpZiBvcHRpbWl6ZSA9PSAxOgotICAgICAgICAgICAgY21kLmluc2VydCgxLCAiLU8iKQotICAgICAgICBlbGlmIG9wdGltaXplID09IDI6Ci0gICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItT08iKQorICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGVdCisgICAgICAgIGNtZC5leHRlbmQoc3VicHJvY2Vzcy5fb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkpCisgICAgICAgIGNtZC5hcHBlbmQoc2NyaXB0X25hbWUpCiAgICAgICAgIHNwYXduKGNtZCwgZHJ5X3J1bj1kcnlfcnVuKQogICAgICAgICBleGVjdXRlKG9zLnJlbW92ZSwgKHNjcmlwdF9uYW1lLCksICJyZW1vdmluZyAlcyIgJSBzY3JpcHRfbmFtZSwKICAgICAgICAgICAgICAgICBkcnlfcnVuPWRyeV9ydW4pCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDM4ZmRkODAuLjU2MzAyMjAgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC0zODEsMTIgKzM4MSwxNSBAQAogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICMgW1hYXSBOb3JtYWxpemUgd2l0aCByZXNwZWN0IHRvIG9zLnBhdGgucGFyZGlyPwotZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHBhdGgpOgorZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHRlc3RfcGF0aCk6CiAgICAgaWYgbm90IGluc3BlY3QuaXNtb2R1bGUobW9kdWxlKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBhIG1vZHVsZTogJXInICUgbW9kdWxlKQotICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLycpOgorICAgIGlmIHRlc3RfcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01vZHVsZS1yZWxhdGl2ZSBmaWxlcyBtYXkgbm90IGhhdmUgYWJzb2x1dGUgcGF0aHMnKQogCisgICAgIyBOb3JtYWxpemUgdGhlIHBhdGguIE9uIFdpbmRvd3MsIHJlcGxhY2UgIi8iIHdpdGggIlwiLgorICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbigqKHRlc3RfcGF0aC5zcGxpdCgnLycpKSkKKwogICAgICMgRmluZCB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBwYXRoLgogICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKICAgICAgICAgIyBBIG5vcm1hbCBtb2R1bGUvcGFja2FnZQpAQCAtMzk4LDEzICs0MDEsMTkgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJhc2VkaXIgPSBvcy5jdXJkaXIKICAgICBlbHNlOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIG1vZHVsZS5fX3BhdGhfXzoKKyAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIHRlc3RfcGF0aCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmdWxscGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxscGF0aAorCiAgICAgICAgICMgQSBtb2R1bGUgdy9vIF9fZmlsZV9fICh0aGlzIGluY2x1ZGVzIGJ1aWx0aW5zKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICIlciAoaXQgaGFzIG5vIF9fZmlsZV9fKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1vZHVsZS5fX25hbWVfXykKIAotICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZWRpciwgKihwYXRoLnNwbGl0KCcvJykpKQorICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSB0ZXN0IHBhdGguCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCB0ZXN0X3BhdGgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDIuIEV4YW1wbGUgJiBEb2NUZXN0CmRpZmYgLS1naXQgYS9MaWIvZW51bS5weSBiL0xpYi9lbnVtLnB5CmluZGV4IDI0NmRmMTcuLjQ3NmUzYjMgMTAwNjQ0Ci0tLSBhL0xpYi9lbnVtLnB5CisrKyBiL0xpYi9lbnVtLnB5CkBAIC0xLDggKzEsMTQgQEAKIGltcG9ydCBzeXMKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CiBmcm9tIHR5cGVzIGltcG9ydCBNYXBwaW5nUHJveHlUeXBlLCBEeW5hbWljQ2xhc3NBdHRyaWJ1dGUKIAotX19hbGxfXyA9IFsnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCisjIHRyeSBfY29sbGVjdGlvbnMgZmlyc3QgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gX2NvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKworX19hbGxfXyA9IFsnRW51bU1ldGEnLCAnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCiAKIAogZGVmIF9pc19kZXNjcmlwdG9yKG9iaik6CmRpZmYgLS1naXQgYS9MaWIvZmlsZWlucHV0LnB5IGIvTGliL2ZpbGVpbnB1dC5weQppbmRleCBkMmI1MjA2Li4xZTE5ZDI0IDEwMDY0NAotLS0gYS9MaWIvZmlsZWlucHV0LnB5CisrKyBiL0xpYi9maWxlaW5wdXQucHkKQEAgLTc1LDEzICs3NSwxMSBAQAogaW1wb3J0IHN5cywgb3MKIAogX19hbGxfXyA9IFsiaW5wdXQiLCAiY2xvc2UiLCAibmV4dGZpbGUiLCAiZmlsZW5hbWUiLCAibGluZW5vIiwgImZpbGVsaW5lbm8iLAotICAgICAgICAgICAiaXNmaXJzdGxpbmUiLCAiaXNzdGRpbiIsICJGaWxlSW5wdXQiXQorICAgICAgICAgICAiZmlsZW5vIiwgImlzZmlyc3RsaW5lIiwgImlzc3RkaW4iLCAiRmlsZUlucHV0IiwgImhvb2tfY29tcHJlc3NlZCIsCisgICAgICAgICAgICJob29rX2VuY29kZWQiXQogCiBfc3RhdGUgPSBOb25lCiAKLSMgTm8gbG9uZ2VyIHVzZWQKLURFRkFVTFRfQlVGU0laRSA9IDgqMTAyNAotCiBkZWYgaW5wdXQoZmlsZXM9Tm9uZSwgaW5wbGFjZT1GYWxzZSwgYmFja3VwPSIiLCBidWZzaXplPTAsCiAgICAgICAgICAgbW9kZT0iciIsIG9wZW5ob29rPU5vbmUpOgogICAgICIiIlJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgRmlsZUlucHV0IGNsYXNzLCB3aGljaCBjYW4gYmUgaXRlcmF0ZWQuCkBAIC0yMDEsNiArMTk5LDEwIEBACiAgICAgICAgIHNlbGYuX2ZpbGVzID0gZmlsZXMKICAgICAgICAgc2VsZi5faW5wbGFjZSA9IGlucGxhY2UKICAgICAgICAgc2VsZi5fYmFja3VwID0gYmFja3VwCisgICAgICAgIGlmIGJ1ZnNpemU6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ2J1ZnNpemUgaXMgZGVwcmVjYXRlZCBhbmQgaWdub3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICBzZWxmLl9zYXZlc3Rkb3V0ID0gTm9uZQogICAgICAgICBzZWxmLl9vdXRwdXQgPSBOb25lCiAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2ZyYWN0aW9ucy5weSBiL0xpYi9mcmFjdGlvbnMucHkKaW5kZXggNjBiMDcyOC4uNjRkNzQ2YiAxMDA2NDQKLS0tIGEvTGliL2ZyYWN0aW9ucy5weQorKysgYi9MaWIvZnJhY3Rpb25zLnB5CkBAIC0xMjUsMTcgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuZGVub21pbmF0b3IKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZmxvYXQobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIERlY2ltYWwpOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9kZWNpbWFsKG51bWVyYXRvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIChmbG9hdCwgRGVjaW1hbCkpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgc3RyKToKQEAgLTIxMCwxMCArMjAyLDYgQEAKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShmLCBmbG9hdCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzLmZyb21fZmxvYXQoKSBvbmx5IHRha2VzIGZsb2F0cywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBmLCB0eXBlKGYpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc25hbihmKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc2luZihmKToKLSAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTIyNiwxOSArMjE0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19pbmZpbml0ZSgpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19uYW4oKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVzIHRvICVzLiIgJSAoZGVjLCBjbHMuX19uYW1lX18pKQotICAgICAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGRlYy5hc190dXBsZSgpCi0gICAgICAgIGRpZ2l0cyA9IGludCgnJy5qb2luKG1hcChzdHIsIGRpZ2l0cykpKQotICAgICAgICBpZiBzaWduOgotICAgICAgICAgICAgZGlnaXRzID0gLWRpZ2l0cwotICAgICAgICBpZiBleHAgPj0gMDoKLSAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzICogMTAgKiogZXhwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMsIDEwICoqIC1leHApCisgICAgICAgIHJldHVybiBjbHMoKmRlYy5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBkZWYgbGltaXRfZGVub21pbmF0b3Ioc2VsZiwgbWF4X2Rlbm9taW5hdG9yPTEwMDAwMDApOgogICAgICAgICAiIiJDbG9zZXN0IEZyYWN0aW9uIHRvIHNlbGYgd2l0aCBkZW5vbWluYXRvciBhdCBtb3N0IG1heF9kZW5vbWluYXRvci4KZGlmZiAtLWdpdCBhL0xpYi9mdHBsaWIucHkgYi9MaWIvZnRwbGliLnB5CmluZGV4IGM0MTZkODUuLjJhZmExOWQgMTAwNjQ0Ci0tLSBhL0xpYi9mdHBsaWIucHkKKysrIGIvTGliL2Z0cGxpYi5weQpAQCAtNDIsNyArNDIsOCBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIHNvY2tldCBpbXBvcnQgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKIAotX19hbGxfXyA9IFsiRlRQIl0KK19fYWxsX18gPSBbIkZUUCIsICJlcnJvcl9yZXBseSIsICJlcnJvcl90ZW1wIiwgImVycm9yX3Blcm0iLCAiZXJyb3JfcHJvdG8iLAorICAgICAgICAgICAiYWxsX2Vycm9ycyJdCiAKICMgTWFnaWMgbnVtYmVyIGZyb20gPHNvY2tldC5oPgogTVNHX09PQiA9IDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHJvY2VzcyBkYXRhIG91dCBvZiBiYW5kCmRpZmYgLS1naXQgYS9MaWIvaHR0cC9jbGllbnQucHkgYi9MaWIvaHR0cC9jbGllbnQucHkKaW5kZXggMzUwMzEzZS4uNzYzZTFlZiAxMDA2NDQKLS0tIGEvTGliL2h0dHAvY2xpZW50LnB5CisrKyBiL0xpYi9odHRwL2NsaWVudC5weQpAQCAtNDIwLDYgKzQyMCw3IEBACiAgICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKIAogICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgIiIiQWx3YXlzIHJldHVybnMgVHJ1ZSIiIgogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgIyBFbmQgb2YgInJhdyBzdHJlYW0iIG1ldGhvZHMKQEAgLTQ2Nyw2ICs0NjgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBzCiAKICAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CisgICAgICAgICIiIlJlYWQgdXAgdG8gbGVuKGIpIGJ5dGVzIGludG8gYnl0ZWFycmF5IGIgYW5kIHJldHVybiB0aGUgbnVtYmVyCisgICAgICAgIG9mIGJ5dGVzIHJlYWQuCisgICAgICAgICIiIgorCiAgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybiAwCiAKQEAgLTcwNiw2ICs3MTEsMTcgQEAKICAgICAgICAgcmV0dXJuIHNlbGYuZnAuZmlsZW5vKCkKIAogICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGhlYWRlciBtYXRjaGluZyAqbmFtZSouCisKKyAgICAgICAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1hdGNoaW5nIGhlYWRlcnMsIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgc3RyaW5nIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIHNwYWNlcy4KKworICAgICAgICBJZiBubyBtYXRjaGluZyBoZWFkZXIgaXMgZm91bmQsIHJldHVybnMgKmRlZmF1bHQqIG9yIE5vbmUgaWYKKyAgICAgICAgdGhlICpkZWZhdWx0KiBpcyBub3Qgc3BlY2lmaWVkLgorCisgICAgICAgIElmIHRoZSBoZWFkZXJzIGFyZSB1bmtub3duLCByYWlzZXMgaHR0cC5jbGllbnQuUmVzcG9uc2VOb3RSZWFkeS4KKworICAgICAgICAnJycKICAgICAgICAgaWYgc2VsZi5oZWFkZXJzIGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdFJlYWR5KCkKICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycy5nZXRfYWxsKG5hbWUpIG9yIGRlZmF1bHQKQEAgLTcyOCwxMiArNzQ0LDQ1IEBACiAgICAgIyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZC1zdHlsZSB1cmxsaWIgcmVzcG9uc2VzLgogCiAgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgICcnJ1JldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1pbWV0b29scy5NZXNzYWdlIGNvbnRhaW5pbmcKKyAgICAgICAgbWV0YS1pbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVSTC4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgSFRUUCwgdGhlc2UgaGVhZGVycyBhcmUgdGhvc2UgcmV0dXJuZWQgYnkKKyAgICAgICAgdGhlIHNlcnZlciBhdCB0aGUgaGVhZCBvZiB0aGUgcmV0cmlldmVkIEhUTUwgcGFnZSAoaW5jbHVkaW5nCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGFuZCBDb250ZW50LVR5cGUpLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBGVFAsIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIHdpbGwgYmUKKyAgICAgICAgcHJlc2VudCBpZiAoYXMgaXMgbm93IHVzdWFsKSB0aGUgc2VydmVyIHBhc3NlZCBiYWNrIGEgZmlsZQorICAgICAgICBsZW5ndGggaW4gcmVzcG9uc2UgdG8gdGhlIEZUUCByZXRyaWV2YWwgcmVxdWVzdC4gQQorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyIHdpbGwgYmUgcHJlc2VudCBpZiB0aGUgTUlNRSB0eXBlIGNhbiBiZQorICAgICAgICBndWVzc2VkLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBsb2NhbC1maWxlLCByZXR1cm5lZCBoZWFkZXJzIHdpbGwgaW5jbHVkZQorICAgICAgICBhIERhdGUgcmVwcmVzZW50aW5nIHRoZSBmaWxlJ3MgbGFzdC1tb2RpZmllZCB0aW1lLCBhCisgICAgICAgIENvbnRlbnQtTGVuZ3RoIGdpdmluZyBmaWxlIHNpemUsIGFuZCBhIENvbnRlbnQtVHlwZQorICAgICAgICBjb250YWluaW5nIGEgZ3Vlc3MgYXQgdGhlIGZpbGUncyB0eXBlLiBTZWUgYWxzbyB0aGUKKyAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIG1pbWV0b29scyBtb2R1bGUuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKIAogICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgICcnJ1JldHVybiB0aGUgcmVhbCBVUkwgb2YgdGhlIHBhZ2UuCisKKyAgICAgICAgSW4gc29tZSBjYXNlcywgdGhlIEhUVFAgc2VydmVyIHJlZGlyZWN0cyBhIGNsaWVudCB0byBhbm90aGVyCisgICAgICAgIFVSTC4gVGhlIHVybG9wZW4oKSBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgdHJhbnNwYXJlbnRseSwgYnV0IGluCisgICAgICAgIHNvbWUgY2FzZXMgdGhlIGNhbGxlciBuZWVkcyB0byBrbm93IHdoaWNoIFVSTCB0aGUgY2xpZW50IHdhcworICAgICAgICByZWRpcmVjdGVkIHRvLiBUaGUgZ2V0dXJsKCkgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBhdCB0aGlzCisgICAgICAgIHJlZGlyZWN0ZWQgVVJMLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi51cmwKIAogICAgIGRlZiBnZXRjb2RlKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgc2VudCB3aXRoIHRoZSByZXNwb25zZSwKKyAgICAgICAgb3IgTm9uZSBpZiB0aGUgVVJMIGlzIG5vdCBhbiBIVFRQIFVSTC4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHVzCiAKIGNsYXNzIEhUVFBDb25uZWN0aW9uOgpkaWZmIC0tZ2l0IGEvTGliL2h0dHAvc2VydmVyLnB5IGIvTGliL2h0dHAvc2VydmVyLnB5CmluZGV4IGZhYzRkOWQuLmMxNjA3YjMgMTAwNjQ0Ci0tLSBhL0xpYi9odHRwL3NlcnZlci5weQorKysgYi9MaWIvaHR0cC9zZXJ2ZXIucHkKQEAgLTg3LDYgKzg3LDcgQEAKICAgICAiU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyIiwgIkNHSUhUVFBSZXF1ZXN0SGFuZGxlciIsCiBdCiAKK2ltcG9ydCBlbWFpbC51dGlscwogaW1wb3J0IGh0bWwKIGltcG9ydCBodHRwLmNsaWVudAogaW1wb3J0IGlvCkBAIC0xMjYsOSArMTI3LDYgQEAKIAogREVGQVVMVF9FUlJPUl9DT05URU5UX1RZUEUgPSAidGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiCiAKLWRlZiBfcXVvdGVfaHRtbChodG1sKToKLSAgICByZXR1cm4gaHRtbC5yZXBsYWNlKCImIiwgIiZhbXA7IikucmVwbGFjZSgiPCIsICImbHQ7IikucmVwbGFjZSgiPiIsICImZ3Q7IikKLQogY2xhc3MgSFRUUFNlcnZlcihzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKToKIAogICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAxICAgICMgU2VlbXMgdG8gbWFrZSBzZW5zZSBpbiB0ZXN0aW5nIGVudmlyb25tZW50CkBAIC0xMzYsNyArMTM0LDcgQEAKICAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CiAgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKICAgICAgICAgc29ja2V0c2VydmVyLlRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQotICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc2VydmVyX2FkZHJlc3NbOjJdCiAgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBzb2NrZXQuZ2V0ZnFkbihob3N0KQogICAgICAgICBzZWxmLnNlcnZlcl9wb3J0ID0gcG9ydAogCkBAIC0yODIsMTIgKzI4MCw5IEBACiAgICAgICAgIHdvcmRzID0gcmVxdWVzdGxpbmUuc3BsaXQoKQogICAgICAgICBpZiBsZW4od29yZHMpID09IDM6CiAgICAgICAgICAgICBjb21tYW5kLCBwYXRoLCB2ZXJzaW9uID0gd29yZHMKLSAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAotICAgICAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkJBRF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAiQmFkIHJlcXVlc3QgdmVyc2lvbiAoJXIpIiAlIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdmVyc2lvbls6NV0gIT0gJ0hUVFAvJzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICAgICAgIGJhc2VfdmVyc2lvbl9udW1iZXIgPSB2ZXJzaW9uLnNwbGl0KCcvJywgMSlbMV0KICAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlciA9IGJhc2VfdmVyc2lvbl9udW1iZXIuc3BsaXQoIi4iKQogICAgICAgICAgICAgICAgICMgUkZDIDIxNDUgc2VjdGlvbiAzLjEgc2F5cyB0aGVyZSBjYW4gYmUgb25seSBvbmUgIi4iIGFuZApAQCAtMzA5LDcgKzMwNCw3IEBACiAgICAgICAgICAgICBpZiB2ZXJzaW9uX251bWJlciA+PSAoMiwgMCk6CiAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAogICAgICAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkhUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIFZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIHZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBlbGlmIGxlbih3b3JkcykgPT0gMjoKICAgICAgICAgICAgIGNvbW1hbmQsIHBhdGggPSB3b3JkcwpAQCAtMzMyLDEwICszMjcsMTEgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gaHR0cC5jbGllbnQucGFyc2VfaGVhZGVycyhzZWxmLnJmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3M9c2VsZi5NZXNzYWdlQ2xhc3MpCi0gICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5MaW5lVG9vTG9uZzoKKyAgICAgICAgZXhjZXB0IGh0dHAuY2xpZW50LkxpbmVUb29Mb25nIGFzIGVycjoKICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKLSAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLkJBRF9SRVFVRVNULAotICAgICAgICAgICAgICAgICJMaW5lIHRvbyBsb25nIikKKyAgICAgICAgICAgICAgICBIVFRQU3RhdHVzLlJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UsCisgICAgICAgICAgICAgICAgIkxpbmUgdG9vIGxvbmciLAorICAgICAgICAgICAgICAgIHN0cihlcnIpKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5IVFRQRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKQEAgLTQ1MCw5ICs0NDYsMTIgQEAKICAgICAgICAgaWYgZXhwbGFpbiBpcyBOb25lOgogICAgICAgICAgICAgZXhwbGFpbiA9IGxvbmdtc2cKICAgICAgICAgc2VsZi5sb2dfZXJyb3IoImNvZGUgJWQsIG1lc3NhZ2UgJXMiLCBjb2RlLCBtZXNzYWdlKQotICAgICAgICAjIHVzaW5nIF9xdW90ZV9odG1sIHRvIHByZXZlbnQgQ3Jvc3MgU2l0ZSBTY3JpcHRpbmcgYXR0YWNrcyAoc2VlIGJ1ZyAjMTEwMDIwMSkKLSAgICAgICAgY29udGVudCA9IChzZWxmLmVycm9yX21lc3NhZ2VfZm9ybWF0ICUKLSAgICAgICAgICAgICAgICAgICB7J2NvZGUnOiBjb2RlLCAnbWVzc2FnZSc6IF9xdW90ZV9odG1sKG1lc3NhZ2UpLCAnZXhwbGFpbic6IF9xdW90ZV9odG1sKGV4cGxhaW4pfSkKKyAgICAgICAgIyBIVE1MIGVuY29kZSB0byBwcmV2ZW50IENyb3NzIFNpdGUgU2NyaXB0aW5nIGF0dGFja3MgKHNlZSBidWcgIzExMDAyMDEpCisgICAgICAgIGNvbnRlbnQgPSAoc2VsZi5lcnJvcl9tZXNzYWdlX2Zvcm1hdCAlIHsKKyAgICAgICAgICAgICdjb2RlJzogY29kZSwKKyAgICAgICAgICAgICdtZXNzYWdlJzogaHRtbC5lc2NhcGUobWVzc2FnZSwgcXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgJ2V4cGxhaW4nOiBodG1sLmVzY2FwZShleHBsYWluLCBxdW90ZT1GYWxzZSkKKyAgICAgICAgfSkKICAgICAgICAgYm9keSA9IGNvbnRlbnQuZW5jb2RlKCdVVEYtOCcsICdyZXBsYWNlJykKICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKGNvZGUsIG1lc3NhZ2UpCiAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHNlbGYuZXJyb3JfY29udGVudF90eXBlKQpAQCAtNDgxLDEyICs0ODAsMTIgQEAKIAogICAgIGRlZiBzZW5kX3Jlc3BvbnNlX29ubHkoc2VsZiwgY29kZSwgbWVzc2FnZT1Ob25lKToKICAgICAgICAgIiIiU2VuZCB0aGUgcmVzcG9uc2UgaGVhZGVyIG9ubHkuIiIiCi0gICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNlbGYucmVzcG9uc2VzW2NvZGVdWzBdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICBpZiBzZWxmLnJlcXVlc3RfdmVyc2lvbiAhPSAnSFRUUC8wLjknOgorICAgICAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnJlc3BvbnNlc1tjb2RlXVswXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19oZWFkZXJzX2J1ZmZlcicpOgogICAgICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyID0gW10KICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyLmFwcGVuZCgoIiVzICVkICVzXHJcbiIgJQpAQCAtNTczLDEyICs1NzIsNyBAQAogICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgZm9yIGEgbWVzc2FnZSBoZWFkZXIuIiIiCiAgICAgICAgIGlmIHRpbWVzdGFtcCBpcyBOb25lOgogICAgICAgICAgICAgdGltZXN0YW1wID0gdGltZS50aW1lKCkKLSAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCi0gICAgICAgIHMgPSAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAotICAgICAgICAgICAgICAgIHNlbGYud2Vla2RheW5hbWVbd2RdLAotICAgICAgICAgICAgICAgIGRheSwgc2VsZi5tb250aG5hbWVbbW9udGhdLCB5ZWFyLAotICAgICAgICAgICAgICAgIGhoLCBtbSwgc3MpCi0gICAgICAgIHJldHVybiBzCisgICAgICAgIHJldHVybiBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHRpbWVzdGFtcCwgdXNlZ210PVRydWUpCiAKICAgICBkZWYgbG9nX2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdHRlZCBmb3IgbG9nZ2luZy4iIiIKQEAgLTcxNiw3ICs3MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKQogICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgZGlzcGxheXBhdGggPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoKQotICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoKQorICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoLCBxdW90ZT1GYWxzZSkKICAgICAgICAgZW5jID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICAgICAgIHRpdGxlID0gJ0RpcmVjdG9yeSBsaXN0aW5nIGZvciAlcycgJSBkaXNwbGF5cGF0aAogICAgICAgICByLmFwcGVuZCgnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAnCkBAIC03NDAsNyArNzM0LDcgQEAKICAgICAgICAgICAgIHIuYXBwZW5kKCc8bGk+PGEgaHJlZj0iJXMiPiVzPC9hPjwvbGk+JwogICAgICAgICAgICAgICAgICAgICAlICh1cmxsaWIucGFyc2UucXVvdGUobGlua25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUsIHF1b3RlPUZhbHNlKSkpCiAgICAgICAgIHIuYXBwZW5kKCc8L3VsPlxuPGhyPlxuPC9ib2R5PlxuPC9odG1sPlxuJykKICAgICAgICAgZW5jb2RlZCA9ICdcbicuam9pbihyKS5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJykKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTE4MSwxNiArMTE3NSwxNCBAQAogICAgIHNlcnZlcl9hZGRyZXNzID0gKGJpbmQsIHBvcnQpCiAKICAgICBIYW5kbGVyQ2xhc3MucHJvdG9jb2xfdmVyc2lvbiA9IHByb3RvY29sCi0gICAgaHR0cGQgPSBTZXJ2ZXJDbGFzcyhzZXJ2ZXJfYWRkcmVzcywgSGFuZGxlckNsYXNzKQotCi0gICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQotICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCi0gICAgdHJ5OgotICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBodHRwZC5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2VydmVyQ2xhc3Moc2VydmVyX2FkZHJlc3MsIEhhbmRsZXJDbGFzcykgYXMgaHR0cGQ6CisgICAgICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ORVdTLnR4dCBiL0xpYi9pZGxlbGliL05FV1MudHh0CmluZGV4IDZjMDc1YTMuLmQ5MTRiMmMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL05FV1MudHh0CisrKyBiL0xpYi9pZGxlbGliL05FV1MudHh0CkBAIC0xLDYgKzEsNiBAQAotV2hhdCdzIE5ldyBpbiBJRExFIDMuNS4xPwotPT09PT09PT09PT09PT09PT09PT09PT09PQotKlJlbGVhc2UgZGF0ZTogMjAxNS0xMi0wNioKK1doYXQncyBOZXcgaW4gSURMRSAzLjYuMGExPworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAyMDE3PyoKIAogLSBJc3N1ZSAxNTM0ODogU3RvcCB0aGUgZGVidWdnZXIgZW5naW5lIChub3JtYWxseSBpbiBhIHVzZXIgcHJvY2VzcykKICAgYmVmb3JlIGNsb3NpbmcgdGhlIGRlYnVnZ2VyIHdpbmRvdyAocnVubmluZyBpbiB0aGUgSURMRSBwcm9jZXNzKS4KQEAgLTI3OSw2ICsyNzksMTEgQEAKIC0gVXNlIG9mICdmaWx0ZXInIGluIGtleWJpbmRpbmdEaWFsb2cucHkgd2FzIGNhdXNpbmcgY3VzdG9tIGtleSBhc3NpZ25tZW50IHRvCiAgIGZhaWwuICBQYXRjaCA1NzA3IGFtYXVyeS5mb3JnZW90ZGFyYy4KIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4xYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwNy1NYXItMDkqCisKIC0gSXNzdWUgIzQ4MTU6IE9mZmVyIGNvbnZlcnNpb24gdG8gVVRGLTggaWYgc291cmNlIGZpbGVzIGhhdmUKICAgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gYW5kIGFyZSBub3QgZW5jb2RlZCBpbiBVVEYtOC4KIApAQCAtMzE4LDYgKzMyMywxMSBAQAogCiAtIElzc3VlICMzNTQ5OiBPbiBNYWNPUyB0aGUgcHJlZmVyZW5jZXMgbWVudSB3YXMgbm90IHByZXNlbnQKIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4wPworPT09PT09PT09PT09PT09PT09PT09PT0KKypSZWxlYXNlIGRhdGU6IDAzLURlYy0yMDA4KgorCiAtIElETEUgd291bGQgcHJpbnQgYSAiVW5oYW5kbGVkIHNlcnZlciBleGNlcHRpb24hIiBtZXNzYWdlIHdoZW4gaW50ZXJuYWwKICAgZGVidWdnaW5nIGlzIGVuYWJsZWQuCiAKZGlmZiAtLWdpdCBhL0xpYi9pbWFwbGliLnB5IGIvTGliL2ltYXBsaWIucHkKaW5kZXggNGU4YTRiYi4uYTYzYmE4ZCAxMDA2NDQKLS0tIGEvTGliL2ltYXBsaWIucHkKKysrIGIvTGliL2ltYXBsaWIucHkKQEAgLTExMSw3ICsxMTEsMTUgQEAKICMgTGl0ZXJhbCBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIExpdGVyYWwgPSByZS5jb21waWxlKGJyJy4qeyg/UDxzaXplPlxkKyl9JCcsIHJlLkFTQ0lJKQogTWFwQ1JMRiA9IHJlLmNvbXBpbGUoYnInXHJcbnxccnxcbicpCi1SZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShicidcWyg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT5bXlxdXSopKT9cXScpCisjIFdlIG5vIGxvbmdlciBleGNsdWRlIHRoZSAnXScgY2hhcmFjdGVyIGZyb20gdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgY29kZSwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIFJGQy4gIFBvcHVsYXIgSU1BUCBzZXJ2ZXJzIHN1Y2ggYXMgR21haWwKKyMgYWxsb3cgZmxhZ3Mgd2l0aCAnXScsIGFuZCB0aGVyZSBhcmUgcHJvZ3JhbXMgKGluY2x1ZGluZyBpbWFwbGliISkgdGhhdCBjYW4KKyMgcHJvZHVjZSB0aGVtLiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIGlmIHRoZSAndGV4dCcgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgaW5jbHVkZXMgYSAnXScgd2UnbGwgcGFyc2UgdGhlIHJlc3BvbnNlIHdyb25nICh3aGljaCBpcyB0aGUgcG9pbnQgb2YgdGhlIFJGQworIyByZXN0cmljdGlvbikuICBIb3dldmVyLCB0aGF0IHNlZW1zIGxlc3MgbGlrZWx5IHRvIGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZQorIyB0aGFuIGJlaW5nIHVuYWJsZSB0byBjb3JyZWN0bHkgcGFyc2UgZmxhZ3MgdGhhdCBpbmNsdWRlICddJyBjaGFycywgd2hpY2gKKyMgd2FzIHJlcG9ydGVkIGFzIGEgcmVhbC13b3JsZCBwcm9ibGVtIGluIGlzc3VlICMyMTgxNS4KK1Jlc3BvbnNlX2NvZGUgPSByZS5jb21waWxlKGJyJ1xbKD9QPHR5cGU+W0EtWi1dKykoICg/UDxkYXRhPi4qKSk/XF0nKQogVW50YWdnZWRfcmVzcG9uc2UgPSByZS5jb21waWxlKGJyJ1wqICg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpPycpCiAjIFVudGFnZ2VkX3N0YXR1cyBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogVW50YWdnZWRfc3RhdHVzID0gcmUuY29tcGlsZSgKZGlmZiAtLWdpdCBhL0xpYi9pbXAucHkgYi9MaWIvaW1wLnB5CmluZGV4IGY2ZmZmNDQuLmIzMzk5NTIgMTAwNjQ0Ci0tLSBhL0xpYi9pbXAucHkKKysrIGIvTGliL2ltcC5weQpAQCAtMzAsNyArMzAsNyBAQAogCiB3YXJuaW5ncy53YXJuKCJ0aGUgaW1wIG1vZHVsZSBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBpbXBvcnRsaWI7ICIKICAgICAgICAgICAgICAgInNlZSB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiBmb3IgYWx0ZXJuYXRpdmUgdXNlcyIsCi0gICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAKICMgREVQUkVDQVRFRAogU0VBUkNIX0VSUk9SID0gMApkaWZmIC0tZ2l0IGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5IGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5CmluZGV4IDFiM2I0MzAuLmZhOTlmNTYgMTAwNjQ0Ci0tLSBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weQorKysgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkKQEAgLTg3OCwxMyArODc4LDIwIEBACiAKIGRlZiBfZmluZF9zcGVjKG5hbWUsIHBhdGgsIHRhcmdldD1Ob25lKToKICAgICAiIiJGaW5kIGEgbW9kdWxlJ3MgbG9hZGVyLiIiIgotICAgIGlmIHN5cy5tZXRhX3BhdGggaXMgbm90IE5vbmUgYW5kIG5vdCBzeXMubWV0YV9wYXRoOgorICAgIG1ldGFfcGF0aCA9IHN5cy5tZXRhX3BhdGgKKyAgICBpZiBtZXRhX3BhdGggaXMgTm9uZToKKyAgICAgICAgIyBQeUltcG9ydF9DbGVhbnVwKCkgaXMgcnVubmluZyBvciBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJzeXMubWV0YV9wYXRoIGlzIE5vbmUsIFB5dGhvbiBpcyBsaWtlbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2h1dHRpbmcgZG93biIpCisKKyAgICBpZiBub3QgbWV0YV9wYXRoOgogICAgICAgICBfd2FybmluZ3Mud2Fybignc3lzLm1ldGFfcGF0aCBpcyBlbXB0eScsIEltcG9ydFdhcm5pbmcpCisKICAgICAjIFdlIGNoZWNrIHN5cy5tb2R1bGVzIGhlcmUgZm9yIHRoZSByZWxvYWQgY2FzZS4gIFdoaWxlIGEgcGFzc2VkLWluCiAgICAgIyB0YXJnZXQgd2lsbCB1c3VhbGx5IGluZGljYXRlIGEgcmVsb2FkIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSwgd2hlcmVhcwogICAgICMgc3lzLm1vZHVsZXMgcHJvdmlkZXMgb25lLgogICAgIGlzX3JlbG9hZCA9IG5hbWUgaW4gc3lzLm1vZHVsZXMKLSAgICBmb3IgZmluZGVyIGluIHN5cy5tZXRhX3BhdGg6CisgICAgZm9yIGZpbmRlciBpbiBtZXRhX3BhdGg6CiAgICAgICAgIHdpdGggX0ltcG9ydExvY2tDb250ZXh0KCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmluZF9zcGVjID0gZmluZGVyLmZpbmRfc3BlYwpAQCAtOTI1LDYgKzkzMiw5IEBACiAgICAgaWYgbGV2ZWwgPiAwOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlLCBzdHIpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX3BhY2thZ2VfXyBub3Qgc2V0IHRvIGEgc3RyaW5nJykKKyAgICAgICAgZWxpZiBub3QgcGFja2FnZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IHdpdGggbm8ga25vd24gcGFyZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlJykKICAgICAgICAgZWxpZiBwYWNrYWdlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIG1zZyA9ICgnUGFyZW50IG1vZHVsZSB7IXJ9IG5vdCBsb2FkZWQsIGNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlICcKICAgICAgICAgICAgICAgICAgICAnaW1wb3J0JykKQEAgLTEwMzMsNyArMTA0MywxOSBAQAogCiAgICAgIiIiCiAgICAgcGFja2FnZSA9IGdsb2JhbHMuZ2V0KCdfX3BhY2thZ2VfXycpCi0gICAgaWYgcGFja2FnZSBpcyBOb25lOgorICAgIHNwZWMgPSBnbG9iYWxzLmdldCgnX19zcGVjX18nKQorICAgIGlmIHBhY2thZ2UgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmUgYW5kIHBhY2thZ2UgIT0gc3BlYy5wYXJlbnQ6CisgICAgICAgICAgICBfd2FybmluZ3Mud2FybigiX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYiKHtwYWNrYWdlIXJ9ICE9IHtzcGVjLnBhcmVudCFyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQorICAgICAgICByZXR1cm4gcGFja2FnZQorICAgIGVsaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHNwZWMucGFyZW50CisgICAgZWxzZToKKyAgICAgICAgX3dhcm5pbmdzLndhcm4oImNhbid0IHJlc29sdmUgcGFja2FnZSBmcm9tIF9fc3BlY19fIG9yIF9fcGFja2FnZV9fLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgb24gX19uYW1lX18gYW5kIF9fcGF0aF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQogICAgICAgICBwYWNrYWdlID0gZ2xvYmFsc1snX19uYW1lX18nXQogICAgICAgICBpZiAnX19wYXRoX18nIG5vdCBpbiBnbG9iYWxzOgogICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2UucnBhcnRpdGlvbignLicpWzBdCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKaW5kZXggNjE2YjE3Zi4uNWQ2M2ExZiAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQpAQCAtMjIzLDEyICsyMjMsMTQgQEAKICMgICAgIFB5dGhvbiAzLjViMSAgMzMzMCAoUEVQIDQ0ODogQWRkaXRpb25hbCBVbnBhY2tpbmcgR2VuZXJhbGl6YXRpb25zKQogIyAgICAgUHl0aG9uIDMuNWIyICAzMzQwIChmaXggZGljdGlvbmFyeSBkaXNwbGF5IGV2YWx1YXRpb24gb3JkZXIgIzExMjA1KQogIyAgICAgUHl0aG9uIDMuNWIyICAzMzUwIChhZGQgR0VUX1lJRUxEX0ZST01fSVRFUiBvcGNvZGUgIzI0NDAwKQorIyAgICAgUHl0aG9uIDMuNmEwICAzMzYwIChhZGQgRk9STUFUX1ZBTFVFIG9wY29kZSAjMjU0ODMKKyMgICAgIFB5dGhvbiAzLjZhMCAgMzM2MSAobGluZW5vIGRlbHRhIG9mIGNvZGUuY29fbG5vdGFiIGJlY29tZXMgc2lnbmVkKQogIwogIyBNQUdJQyBtdXN0IGNoYW5nZSB3aGVuZXZlciB0aGUgYnl0ZWNvZGUgZW1pdHRlZCBieSB0aGUgY29tcGlsZXIgbWF5IG5vCiAjIGxvbmdlciBiZSB1bmRlcnN0b29kIGJ5IG9sZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZXZhbCBsb29wICh1c3VhbGx5CiAjIGR1ZSB0byB0aGUgYWRkaXRpb24gb2YgbmV3IG9wY29kZXMpLgogCi1NQUdJQ19OVU1CRVIgPSAoMzM1MCkudG9fYnl0ZXMoMiwgJ2xpdHRsZScpICsgYidcclxuJworTUFHSUNfTlVNQkVSID0gKDMzNjEpLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKIF9SQVdfTUFHSUNfTlVNQkVSID0gaW50LmZyb21fYnl0ZXMoTUFHSUNfTlVNQkVSLCAnbGl0dGxlJykgICMgRm9yIGltcG9ydC5jCiAKIF9QWUNBQ0hFID0gJ19fcHljYWNoZV9fJwpAQCAtMzYwLDE0ICszNjIsNiBAQAogICAgIHJldHVybiBtb2RlCiAKIAotZGVmIF92ZXJib3NlX21lc3NhZ2UobWVzc2FnZSwgKmFyZ3MsIHZlcmJvc2l0eT0xKToKLSAgICAiIiJQcmludCB0aGUgbWVzc2FnZSB0byBzdGRlcnIgaWYgLXYvUFlUSE9OVkVSQk9TRSBpcyB0dXJuZWQgb24uIiIiCi0gICAgaWYgc3lzLmZsYWdzLnZlcmJvc2UgPj0gdmVyYm9zaXR5OgotICAgICAgICBpZiBub3QgbWVzc2FnZS5zdGFydHN3aXRoKCgnIycsICdpbXBvcnQgJykpOgotICAgICAgICAgICAgbWVzc2FnZSA9ICcjICcgKyBtZXNzYWdlCi0gICAgICAgIHByaW50KG1lc3NhZ2UuZm9ybWF0KCphcmdzKSwgZmlsZT1zeXMuc3RkZXJyKQotCi0KIGRlZiBfY2hlY2tfbmFtZShtZXRob2QpOgogICAgICIiIkRlY29yYXRvciB0byB2ZXJpZnkgdGhhdCB0aGUgbW9kdWxlIGJlaW5nIHJlcXVlc3RlZCBtYXRjaGVzIHRoZSBvbmUgdGhlCiAgICAgbG9hZGVyIGNhbiBoYW5kbGUuCkBAIC00MzcsMTUgKzQzMSwxNSBAQAogICAgIHJhd19zaXplID0gZGF0YVs4OjEyXQogICAgIGlmIG1hZ2ljICE9IE1BR0lDX05VTUJFUjoKICAgICAgICAgbWVzc2FnZSA9ICdiYWQgbWFnaWMgbnVtYmVyIGluIHshcn06IHshcn0nLmZvcm1hdChuYW1lLCBtYWdpYykKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICBlbGlmIGxlbihyYXdfdGltZXN0YW1wKSAhPSA0OgogICAgICAgICBtZXNzYWdlID0gJ3JlYWNoZWQgRU9GIHdoaWxlIHJlYWRpbmcgdGltZXN0YW1wIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGVsaWYgbGVuKHJhd19zaXplKSAhPSA0OgogICAgICAgICBtZXNzYWdlID0gJ3JlYWNoZWQgRU9GIHdoaWxlIHJlYWRpbmcgc2l6ZSBvZiBzb3VyY2UgaW4geyFyfScuZm9ybWF0KG5hbWUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEVPRkVycm9yKG1lc3NhZ2UpCiAgICAgaWYgc291cmNlX3N0YXRzIGlzIG5vdCBOb25lOgogICAgICAgICB0cnk6CkBAIC00NTUsNyArNDQ5LDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGlmIF9yX2xvbmcocmF3X3RpbWVzdGFtcCkgIT0gc291cmNlX210aW1lOgogICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnYnl0ZWNvZGUgaXMgc3RhbGUgZm9yIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihtZXNzYWdlLCAqKmV4Y19kZXRhaWxzKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzb3VyY2Vfc2l6ZSA9IHNvdXJjZV9zdGF0c1snc2l6ZSddICYgMHhGRkZGRkZGRgpAQCAtNDcyLDcgKzQ2Niw3IEBACiAgICAgIiIiQ29tcGlsZSBieXRlY29kZSBhcyByZXR1cm5lZCBieSBfdmFsaWRhdGVfYnl0ZWNvZGVfaGVhZGVyKCkuIiIiCiAgICAgY29kZSA9IG1hcnNoYWwubG9hZHMoZGF0YSkKICAgICBpZiBpc2luc3RhbmNlKGNvZGUsIF9jb2RlX3R5cGUpOgotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20geyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgIGlmIHNvdXJjZV9wYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgX2ltcC5fZml4X2NvX2ZpbGVuYW1lKGNvZGUsIHNvdXJjZV9wYXRoKQogICAgICAgICByZXR1cm4gY29kZQpAQCAtNTk5LDcgKzU5Myw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZWdpc3RyeV9rZXkgPSBjbHMuUkVHSVNUUllfS0VZCiAgICAgICAgIGtleSA9IHJlZ2lzdHJ5X2tleS5mb3JtYXQoZnVsbG5hbWU9ZnVsbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249c3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPSclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgd2l0aCBjbHMuX29wZW5fcmVnaXN0cnkoa2V5KSBhcyBoa2V5OgogICAgICAgICAgICAgICAgIGZpbGVwYXRoID0gX3dpbnJlZy5RdWVyeVZhbHVlKGhrZXksICcnKQpAQCAtNjYyLDYgKzY1Niw3IEBACiAgICAgICAgIF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZChleGVjLCBjb2RlLCBtb2R1bGUuX19kaWN0X18pCiAKICAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICAiIiJUaGlzIG1vZHVsZSBpcyBkZXByZWNhdGVkLiIiIgogICAgICAgICByZXR1cm4gX2Jvb3RzdHJhcC5fbG9hZF9tb2R1bGVfc2hpbShzZWxmLCBmdWxsbmFtZSkKIAogCkBAIC03NTUsMjEgKzc1MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBFT0ZFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fSBtYXRjaGVzIHt9JywgYnl0ZWNvZGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30gbWF0Y2hlcyB7fScsIGJ5dGVjb2RlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVfYnl0ZWNvZGUoYnl0ZXNfZGF0YSwgbmFtZT1mdWxsbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlY29kZV9wYXRoPWJ5dGVjb2RlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGg9c291cmNlX3BhdGgpCiAgICAgICAgIHNvdXJjZV9ieXRlcyA9IHNlbGYuZ2V0X2RhdGEoc291cmNlX3BhdGgpCiAgICAgICAgIGNvZGVfb2JqZWN0ID0gc2VsZi5zb3VyY2VfdG9fY29kZShzb3VyY2VfYnl0ZXMsIHNvdXJjZV9wYXRoKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHt9Jywgc291cmNlX3BhdGgpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7fScsIHNvdXJjZV9wYXRoKQogICAgICAgICBpZiAobm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlIGFuZCBieXRlY29kZV9wYXRoIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgIHNvdXJjZV9tdGltZSBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICBkYXRhID0gX2NvZGVfdG9fYnl0ZWNvZGUoY29kZV9vYmplY3QsIHNvdXJjZV9tdGltZSwKICAgICAgICAgICAgICAgICAgICAgbGVuKHNvdXJjZV9ieXRlcykpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5fY2FjaGVfYnl0ZWNvZGUoc291cmNlX3BhdGgsIGJ5dGVjb2RlX3BhdGgsIGRhdGEpCi0gICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnd3JvdGUgeyFyfScsIGJ5dGVjb2RlX3BhdGgpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd3cm90ZSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKICAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgcmV0dXJuIGNvZGVfb2JqZWN0CkBAIC04NDksMTQgKzg0NCwxNiBAQAogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgICAgICAgICAgICMgQ291bGQgYmUgYSBwZXJtaXNzaW9uIGVycm9yLCByZWFkLW9ubHkgZmlsZXN5c3RlbToganVzdCBmb3JnZXQKICAgICAgICAgICAgICAgICAjIGFib3V0IHdyaXRpbmcgdGhlIGRhdGEuCi0gICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGFyZW50LCBleGMpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQsIGV4YykKICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgX3dyaXRlX2F0b21pYyhwYXRoLCBkYXRhLCBfbW9kZSkKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NyZWF0ZWQgeyFyfScsIHBhdGgpCisgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NyZWF0ZWQgeyFyfScsIHBhdGgpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICMgU2FtZSBhcyBhYm92ZToganVzdCBkb24ndCB3cml0ZSB0aGUgYnl0ZWNvZGUuCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXRoLCBleGMpCisgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjKQogCiAKIGNsYXNzIFNvdXJjZWxlc3NGaWxlTG9hZGVyKEZpbGVMb2FkZXIsIF9Mb2FkZXJCYXNpY3MpOgpAQCAtOTAxLDE0ICs4OTgsMTQgQEAKICAgICAgICAgIiIiQ3JlYXRlIGFuIHVuaXRpYWxpemVkIGV4dGVuc2lvbiBtb2R1bGUiIiIKICAgICAgICAgbW9kdWxlID0gX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKAogICAgICAgICAgICAgX2ltcC5jcmVhdGVfZHluYW1pYywgc3BlYykKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnZXh0ZW5zaW9uIG1vZHVsZSB7IXJ9IGxvYWRlZCBmcm9tIHshcn0nLAorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBsb2FkZWQgZnJvbSB7IXJ9JywKICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjLm5hbWUsIHNlbGYucGF0aCkKICAgICAgICAgcmV0dXJuIG1vZHVsZQogCiAgICAgZGVmIGV4ZWNfbW9kdWxlKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgICIiIkluaXRpYWxpemUgYW4gZXh0ZW5zaW9uIG1vZHVsZSIiIgogICAgICAgICBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoX2ltcC5leGVjX2R5bmFtaWMsIG1vZHVsZSkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnZXh0ZW5zaW9uIG1vZHVsZSB7IXJ9IGV4ZWN1dGVkIGZyb20geyFyfScsCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnZXh0ZW5zaW9uIG1vZHVsZSB7IXJ9IGV4ZWN1dGVkIGZyb20geyFyfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnBhdGgpCiAKICAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CkBAIC05NzQsNiArOTcxLDkgQEAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3JlY2FsY3VsYXRlKCkpCiAKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHBhdGgpOgorICAgICAgICBzZWxmLl9wYXRoW2luZGV4XSA9IHBhdGgKKwogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3JlY2FsY3VsYXRlKCkpCiAKQEAgLTEwMjMsNyArMTAyMyw4IEBACiAKICAgICAgICAgIiIiCiAgICAgICAgICMgVGhlIGltcG9ydCBzeXN0ZW0gbmV2ZXIgY2FsbHMgdGhpcyBtZXRob2QuCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ25hbWVzcGFjZSBtb2R1bGUgbG9hZGVkIHdpdGggcGF0aCB7IXJ9Jywgc2VsZi5fcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCduYW1lc3BhY2UgbW9kdWxlIGxvYWRlZCB3aXRoIHBhdGggeyFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXRoKQogICAgICAgICByZXR1cm4gX2Jvb3RzdHJhcC5fbG9hZF9tb2R1bGVfc2hpbShzZWxmLCBmdWxsbmFtZSkKIAogCkBAIC0xMjQzLDEyICsxMjQ0LDEzIEBACiAgICAgICAgICMgQ2hlY2sgZm9yIGEgZmlsZSB3LyBhIHByb3BlciBzdWZmaXggZXhpc3RzLgogICAgICAgICBmb3Igc3VmZml4LCBsb2FkZXJfY2xhc3MgaW4gc2VsZi5fbG9hZGVyczoKICAgICAgICAgICAgIGZ1bGxfcGF0aCA9IF9wYXRoX2pvaW4oc2VsZi5wYXRoLCB0YWlsX21vZHVsZSArIHN1ZmZpeCkKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3RyeWluZyB7fScuZm9ybWF0KGZ1bGxfcGF0aCksIHZlcmJvc2l0eT0yKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd0cnlpbmcge30nLCBmdWxsX3BhdGgsIHZlcmJvc2l0eT0yKQogICAgICAgICAgICAgaWYgY2FjaGVfbW9kdWxlICsgc3VmZml4IGluIGNhY2hlOgogICAgICAgICAgICAgICAgIGlmIF9wYXRoX2lzZmlsZShmdWxsX3BhdGgpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3NwZWMobG9hZGVyX2NsYXNzLCBmdWxsbmFtZSwgZnVsbF9wYXRoLCBOb25lLCB0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3BlYyhsb2FkZXJfY2xhc3MsIGZ1bGxuYW1lLCBmdWxsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCB0YXJnZXQpCiAgICAgICAgIGlmIGlzX25hbWVzcGFjZToKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3Bvc3NpYmxlIG5hbWVzcGFjZSBmb3Ige30nLmZvcm1hdChiYXNlX3BhdGgpKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdwb3NzaWJsZSBuYW1lc3BhY2UgZm9yIHt9JywgYmFzZV9wYXRoKQogICAgICAgICAgICAgc3BlYyA9IF9ib290c3RyYXAuTW9kdWxlU3BlYyhmdWxsbmFtZSwgTm9uZSkKICAgICAgICAgICAgIHNwZWMuc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbYmFzZV9wYXRoXQogICAgICAgICAgICAgcmV0dXJuIHNwZWMKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvdXRpbC5weSBiL0xpYi9pbXBvcnRsaWIvdXRpbC5weQppbmRleCA0NTI1YjNmLi5hZjc4MWZkIDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL3V0aWwucHkKKysrIGIvTGliL2ltcG9ydGxpYi91dGlsLnB5CkBAIC0yMiw4ICsyMiw4IEBACiAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnLicpOgogICAgICAgICByZXR1cm4gbmFtZQogICAgIGVsaWYgbm90IHBhY2thZ2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3shcn0gaXMgbm90IGEgcmVsYXRpdmUgbmFtZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyhubyBsZWFkaW5nIGRvdCknLmZvcm1hdChuYW1lKSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmJ25vIHBhY2thZ2Ugc3BlY2lmaWVkIGZvciB7cmVwcihuYW1lKX0gJworICAgICAgICAgICAgICAgICAgICAgICAgICcocmVxdWlyZWQgZm9yIHJlbGF0aXZlIG1vZHVsZSBuYW1lcyknKQogICAgIGxldmVsID0gMAogICAgIGZvciBjaGFyYWN0ZXIgaW4gbmFtZToKICAgICAgICAgaWYgY2hhcmFjdGVyICE9ICcuJzoKZGlmZiAtLWdpdCBhL0xpYi9pbnNwZWN0LnB5IGIvTGliL2luc3BlY3QucHkKaW5kZXggZTgzMGViNi4uNTgyYmIwZSAxMDA2NDQKLS0tIGEvTGliL2luc3BlY3QucHkKKysrIGIvTGliL2luc3BlY3QucHkKQEAgLTE2LDcgKzE2LDcgQEAKICAgICBnZXRtb2R1bGUoKSAtIGRldGVybWluZSB0aGUgbW9kdWxlIHRoYXQgYW4gb2JqZWN0IGNhbWUgZnJvbQogICAgIGdldGNsYXNzdHJlZSgpIC0gYXJyYW5nZSBjbGFzc2VzIHNvIGFzIHRvIHJlcHJlc2VudCB0aGVpciBoaWVyYXJjaHkKIAotICAgIGdldGFyZ3NwZWMoKSwgZ2V0YXJndmFsdWVzKCksIGdldGNhbGxhcmdzKCkgLSBnZXQgaW5mbyBhYm91dCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBnZXRhcmd2YWx1ZXMoKSwgZ2V0Y2FsbGFyZ3MoKSAtIGdldCBpbmZvIGFib3V0IGZ1bmN0aW9uIGFyZ3VtZW50cwogICAgIGdldGZ1bGxhcmdzcGVjKCkgLSBzYW1lLCB3aXRoIHN1cHBvcnQgZm9yIFB5dGhvbiAzIGZlYXR1cmVzCiAgICAgZm9ybWF0YXJnc3BlYygpLCBmb3JtYXRhcmd2YWx1ZXMoKSAtIGZvcm1hdCBhbiBhcmd1bWVudCBzcGVjCiAgICAgZ2V0b3V0ZXJmcmFtZXMoKSwgZ2V0aW5uZXJmcmFtZXMoKSAtIGdldCBpbmZvIGFib3V0IGZyYW1lcwpAQCAtNjI0LDIzICs2MjQsNiBAQAogICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBub3QgYSBtb2R1bGUsIGNsYXNzLCBtZXRob2QsICcKICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uLCB0cmFjZWJhY2ssIGZyYW1lLCBvciBjb2RlIG9iamVjdCcuZm9ybWF0KG9iamVjdCkpCiAKLU1vZHVsZUluZm8gPSBuYW1lZHR1cGxlKCdNb2R1bGVJbmZvJywgJ25hbWUgc3VmZml4IG1vZGUgbW9kdWxlX3R5cGUnKQotCi1kZWYgZ2V0bW9kdWxlaW5mbyhwYXRoKToKLSAgICAiIiJHZXQgdGhlIG1vZHVsZSBuYW1lLCBzdWZmaXgsIG1vZGUsIGFuZCBtb2R1bGUgdHlwZSBmb3IgYSBnaXZlbiBmaWxlLiIiIgotICAgIHdhcm5pbmdzLndhcm4oJ2luc3BlY3QuZ2V0bW9kdWxlaW5mbygpIGlzIGRlcHJlY2F0ZWQnLCBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAyKQotICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICBpbXBvcnQgaW1wCi0gICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCi0gICAgc3VmZml4ZXMgPSBbKC1sZW4oc3VmZml4KSwgc3VmZml4LCBtb2RlLCBtdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIHN1ZmZpeCwgbW9kZSwgbXR5cGUgaW4gaW1wLmdldF9zdWZmaXhlcygpXQotICAgIHN1ZmZpeGVzLnNvcnQoKSAjIHRyeSBsb25nZXN0IHN1ZmZpeGVzIGZpcnN0LCBpbiBjYXNlIHRoZXkgb3ZlcmxhcAotICAgIGZvciBuZWdsZW4sIHN1ZmZpeCwgbW9kZSwgbXR5cGUgaW4gc3VmZml4ZXM6Ci0gICAgICAgIGlmIGZpbGVuYW1lW25lZ2xlbjpdID09IHN1ZmZpeDoKLSAgICAgICAgICAgIHJldHVybiBNb2R1bGVJbmZvKGZpbGVuYW1lWzpuZWdsZW5dLCBzdWZmaXgsIG1vZGUsIG10eXBlKQotCiBkZWYgZ2V0bW9kdWxlbmFtZShwYXRoKToKICAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBuYW1lIGZvciBhIGdpdmVuIGZpbGUsIG9yIE5vbmUuIiIiCiAgICAgZm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCkBAIC0xMDYxLDggKzEwNDQsNiBAQAogICAgICdrd29ubHlkZWZhdWx0cycgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXMgZnJvbSBrd29ubHlhcmdzIHRvIGRlZmF1bHRzLgogICAgICdhbm5vdGF0aW9ucycgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXJndW1lbnQgbmFtZXMgdG8gYW5ub3RhdGlvbnMuCiAKLSAgICBUaGUgZmlyc3QgZm91ciBpdGVtcyBpbiB0aGUgdHVwbGUgY29ycmVzcG9uZCB0byBnZXRhcmdzcGVjKCkuCi0KICAgICBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSBpbnNwZWN0LnNpZ25hdHVyZSgpIGluc3RlYWQuCiAgICAgIiIiCiAKQEAgLTExNzMsOCArMTE1NCw3IEBACiAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHJlcHIodmFsdWUpLAogICAgICAgICAgICAgICAgICAgZm9ybWF0cmV0dXJucz1sYW1iZGEgdGV4dDogJyAtPiAnICsgdGV4dCwKICAgICAgICAgICAgICAgICAgIGZvcm1hdGFubm90YXRpb249Zm9ybWF0YW5ub3RhdGlvbik6Ci0gICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldGFyZ3NwZWMKLSAgICBvciBnZXRmdWxsYXJnc3BlYy4KKyAgICAiIiJGb3JtYXQgYW4gYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0ZnVsbGFyZ3NwZWMuCiAKICAgICBUaGUgZmlyc3Qgc2V2ZW4gYXJndW1lbnRzIGFyZSAoYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLAogICAgIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm5vdGF0aW9ucykuICBUaGUgb3RoZXIgZml2ZSBhcmd1bWVudHMKZGlmZiAtLWdpdCBhL0xpYi9qc29uL2VuY29kZXIucHkgYi9MaWIvanNvbi9lbmNvZGVyLnB5CmluZGV4IGQ1OTY0ODkuLjA3NzJiYmMgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2VuY29kZXIucHkKKysrIGIvTGliL2pzb24vZW5jb2Rlci5weQpAQCAtMTc2LDcgKzE3Niw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT05FbmNvZGVyLmRlZmF1bHQoc2VsZiwgbykKIAogICAgICAgICAiIiIKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKHJlcHIobykgKyAiIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZSIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiT2JqZWN0IG9mIHR5cGUgJyVzJyBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIG8uX19jbGFzc19fLl9fbmFtZV9fKQogCiAgICAgZGVmIGVuY29kZShzZWxmLCBvKToKICAgICAgICAgIiIiUmV0dXJuIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKaW5kZXggZGIzNDEwNC4uMDAzMjdhNyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICAnTm90SW1wbGVtZW50ZWRUeXBlJyA6ICd0eXBlKE5vdEltcGxlbWVudGVkKScsCiAgICAgICAgICdTbGljZVR5cGUnIDogJ3NsaWNlJywKICAgICAgICAgJ1N0cmluZ1R5cGUnOiAnYnl0ZXMnLCAjIFhYWCA/Ci0gICAgICAgICdTdHJpbmdUeXBlcycgOiAnc3RyJywgIyBYWFggPworICAgICAgICAnU3RyaW5nVHlwZXMnIDogJyhzdHIsKScsICMgWFhYID8KICAgICAgICAgJ1R1cGxlVHlwZSc6ICd0dXBsZScsCiAgICAgICAgICdUeXBlVHlwZScgOiAndHlwZScsCiAgICAgICAgICdVbmljb2RlVHlwZSc6ICdzdHInLApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQppbmRleCAwNmIwMDMzLi5kZWY5YjBlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMzMyMiw2ICszMzIyLDEwIEBACiAgICAgICAgIGEgPSAiIiJ0eXBlKE5vbmUpIiIiCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAorICAgICAgICBiID0gInR5cGVzLlN0cmluZ1R5cGVzIgorICAgICAgICBhID0gIihzdHIsKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCiBjbGFzcyBUZXN0X2lkaW9tcyhGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJpZGlvbXMiCiAKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IDYwYmZiZWEuLjIwNmNkYjMgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtMzAyLDEyICszMDIsMTYgQEAKIAogZGVmIGRlbG9jYWxpemUoc3RyaW5nKToKICAgICAiUGFyc2VzIGEgc3RyaW5nIGFzIGEgbm9ybWFsaXplZCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorCisgICAgY29udiA9IGxvY2FsZWNvbnYoKQorCiAgICAgI0ZpcnN0LCBnZXQgcmlkIG9mIHRoZSBncm91cGluZwotICAgIHRzID0gbG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKyAgICB0cyA9IGNvbnZbJ3Rob3VzYW5kc19zZXAnXQogICAgIGlmIHRzOgogICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSh0cywgJycpCisKICAgICAjbmV4dCwgcmVwbGFjZSB0aGUgZGVjaW1hbCBwb2ludCB3aXRoIGEgZG90Ci0gICAgZGQgPSBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGRkID0gY29udlsnZGVjaW1hbF9wb2ludCddCiAgICAgaWYgZGQ6CiAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGRkLCAnLicpCiAgICAgcmV0dXJuIHN0cmluZwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQppbmRleCBhN2JkODkwLi5mOTQxZjQ4IDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQorKysgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQpAQCAtMzMsOCArMzMsOSBAQAogICAgICAgICAgICAnU3RyZWFtSGFuZGxlcicsICdXQVJOJywgJ1dBUk5JTkcnLCAnYWRkTGV2ZWxOYW1lJywgJ2Jhc2ljQ29uZmlnJywKICAgICAgICAgICAgJ2NhcHR1cmVXYXJuaW5ncycsICdjcml0aWNhbCcsICdkZWJ1ZycsICdkaXNhYmxlJywgJ2Vycm9yJywKICAgICAgICAgICAgJ2V4Y2VwdGlvbicsICdmYXRhbCcsICdnZXRMZXZlbE5hbWUnLCAnZ2V0TG9nZ2VyJywgJ2dldExvZ2dlckNsYXNzJywKLSAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnd2FybicsICd3YXJuaW5nJywKLSAgICAgICAgICAgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsICdsYXN0UmVzb3J0J10KKyAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnc2h1dGRvd24nLAorICAgICAgICAgICAnd2FybicsICd3YXJuaW5nJywgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsCisgICAgICAgICAgICdsYXN0UmVzb3J0JywgJ3JhaXNlRXhjZXB0aW9ucyddCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weSBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CmluZGV4IGM2ODQwYzMuLjY0MjUzNTYgMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CisrKyBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC00NDAsMTEgKzQ0MCwxMSBAQAogICAgICAgICAgICAgc3JlcyA9IG9zLmZzdGF0KHNlbGYuc3RyZWFtLmZpbGVubygpKQogICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3Jlc1tTVF9ERVZdLCBzcmVzW1NUX0lOT10KIAotICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgZGVmIHJlb3BlbklmTmVlZGVkKHNlbGYpOgogICAgICAgICAiIiIKLSAgICAgICAgRW1pdCBhIHJlY29yZC4KKyAgICAgICAgUmVvcGVuIGxvZyBmaWxlIGlmIG5lZWRlZC4KIAotICAgICAgICBGaXJzdCBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKKyAgICAgICAgQ2hlY2tzIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAogICAgICAgICBoYXMsIGNsb3NlIHRoZSBvbGQgc3RyZWFtIGFuZCByZW9wZW4gdGhlIGZpbGUgdG8gZ2V0IHRoZQogICAgICAgICBjdXJyZW50IHN0cmVhbS4KICAgICAgICAgIiIiCkBAIC00NjcsNiArNDY3LDE1IEBACiAgICAgICAgICAgICAgICAgIyBvcGVuIGEgbmV3IGZpbGUgaGFuZGxlIGFuZCBnZXQgbmV3IHN0YXQgaW5mbyBmcm9tIHRoYXQgZmQKICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCByZW9wZW4gdGhlIGZpbGUgYmVmb3JlIGVtaXR0aW5nIHRoZQorICAgICAgICByZWNvcmQgdG8gaXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlb3BlbklmTmVlZGVkKCkKICAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKIAogCmRpZmYgLS1naXQgYS9MaWIvbW9kdWxlZmluZGVyLnB5IGIvTGliL21vZHVsZWZpbmRlci5weQppbmRleCA1MGYyNDYyLi5kOGQ2NDVjIDEwMDY0NAotLS0gYS9MaWIvbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi9tb2R1bGVmaW5kZXIucHkKQEAgLTEwLDE1ICsxMCwxNSBAQAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IHdhcm5pbmdzCiB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgIGltcG9ydCBpbXAKIAogIyBYWFggQ2xlYW4gdXAgb25jZSBzdHI4J3MgY3N0b3IgbWF0Y2hlcyBieXRlcy4KLUxPQURfQ09OU1QgPSBieXRlcyhbZGlzLm9wbmFtZS5pbmRleCgnTE9BRF9DT05TVCcpXSkKLUlNUE9SVF9OQU1FID0gYnl0ZXMoW2Rpcy5vcG5hbWUuaW5kZXgoJ0lNUE9SVF9OQU1FJyldKQotU1RPUkVfTkFNRSA9IGJ5dGVzKFtkaXMub3BuYW1lLmluZGV4KCdTVE9SRV9OQU1FJyldKQotU1RPUkVfR0xPQkFMID0gYnl0ZXMoW2Rpcy5vcG5hbWUuaW5kZXgoJ1NUT1JFX0dMT0JBTCcpXSkKLVNUT1JFX09QUyA9IFtTVE9SRV9OQU1FLCBTVE9SRV9HTE9CQUxdCitMT0FEX0NPTlNUID0gYnl0ZXMoW2Rpcy5vcG1hcFsnTE9BRF9DT05TVCddXSkKK0lNUE9SVF9OQU1FID0gYnl0ZXMoW2Rpcy5vcG1hcFsnSU1QT1JUX05BTUUnXV0pCitTVE9SRV9OQU1FID0gYnl0ZXMoW2Rpcy5vcG1hcFsnU1RPUkVfTkFNRSddXSkKK1NUT1JFX0dMT0JBTCA9IGJ5dGVzKFtkaXMub3BtYXBbJ1NUT1JFX0dMT0JBTCddXSkKK1NUT1JFX09QUyA9IFNUT1JFX05BTUUsIFNUT1JFX0dMT0JBTAogSEFWRV9BUkdVTUVOVCA9IGJ5dGVzKFtkaXMuSEFWRV9BUkdVTUVOVF0pCiAKICMgTW9kdWxlZmluZGVyIGRvZXMgYSBnb29kIGpvYiBhdCBzaW11bGF0aW5nIFB5dGhvbidzLCBidXQgaXQgY2FuIG5vdApkaWZmIC0tZ2l0IGEvTGliL21zaWxpYi9fX2luaXRfXy5weSBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKaW5kZXggNmQwYTI4Zi4uODIzNjQ0YSAxMDA2NDQKLS0tIGEvTGliL21zaWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CkBAIC0xLDcgKzEsNyBAQAogIyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFydGluIHYuIEzDtndpcwogIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCiBmcm9tIF9tc2kgaW1wb3J0ICoKLWltcG9ydCBnbG9iCitpbXBvcnQgZm5tYXRjaAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBzdHJpbmcKQEAgLTM3OSw3ICszNzksMTMgQEAKICAgICBkZWYgZ2xvYihzZWxmLCBwYXR0ZXJuLCBleGNsdWRlID0gTm9uZSk6CiAgICAgICAgICIiIkFkZCBhIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50IGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgZ2xvYiBwYXR0ZXJuLiBJbmRpdmlkdWFsIGZpbGVzIGNhbiBiZSBleGNsdWRlZCBpbiB0aGUgZXhjbHVkZSBsaXN0LiIiIgotICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYjEoc2VsZi5hYnNvbHV0ZSwgcGF0dGVybikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHNlbGYuYWJzb2x1dGUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGlmIHBhdHRlcm5bOjFdICE9ICcuJzoKKyAgICAgICAgICAgIGZpbGVzID0gKGYgZm9yIGYgaW4gZmlsZXMgaWYgZlswXSAhPSAnLicpCisgICAgICAgIGZpbGVzID0gZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdHRlcm4pCiAgICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICAgaWYgZXhjbHVkZSBhbmQgZiBpbiBleGNsdWRlOiBjb250aW51ZQogICAgICAgICAgICAgc2VsZi5hZGRfZmlsZShmKQpkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CmluZGV4IDZkMjU0NjkuLmZmZGY0MjYgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKQEAgLTYzOCwyMiArNjM4LDI2IEBACiAgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCA9IGxlbmd0aC8vY2h1bmtzaXplICsgYm9vbChsZW5ndGggJSBjaHVua3NpemUpCiAKICAgICBkZWYgX3NldChzZWxmLCBpLCBzdWNjZXNzX3Jlc3VsdCk6CisgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0IC09IDEKICAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gc3VjY2Vzc19yZXN1bHQKLSAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgaWYgc3VjY2VzcyBhbmQgc2VsZi5fc3VjY2VzczoKICAgICAgICAgICAgIHNlbGYuX3ZhbHVlW2kqc2VsZi5fY2h1bmtzaXplOihpKzEpKnNlbGYuX2NodW5rc2l6ZV0gPSByZXN1bHQKLSAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0IC09IDEKICAgICAgICAgICAgIGlmIHNlbGYuX251bWJlcl9sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQogICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCiAgICAgICAgICAgICAgICAgc2VsZi5fZXZlbnQuc2V0KCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuX3N1Y2Nlc3MgPSBGYWxzZQotICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSByZXN1bHQKLSAgICAgICAgICAgIGlmIHNlbGYuX2Vycm9yX2NhbGxiYWNrOgotICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQotICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KLSAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCisgICAgICAgICAgICBpZiBub3Qgc3VjY2VzcyBhbmQgc2VsZi5fc3VjY2VzczoKKyAgICAgICAgICAgICAgICAjIG9ubHkgc3RvcmUgZmlyc3QgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgc2VsZi5fc3VjY2VzcyA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHNlbGYuX251bWJlcl9sZWZ0ID09IDA6CisgICAgICAgICAgICAgICAgIyBvbmx5IGNvbnNpZGVyIHRoZSByZXN1bHQgcmVhZHkgb25jZSBhbGwgam9icyBhcmUgZG9uZQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2Vycm9yX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQorICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCiAKICMKICMgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSBgUG9vbC5pbWFwKClgCmRpZmYgLS1naXQgYS9MaWIvb3Bjb2RlLnB5IGIvTGliL29wY29kZS5weQppbmRleCA0YzgyNmE3Li5lY2MyNGJiIDEwMDY0NAotLS0gYS9MaWIvb3Bjb2RlLnB5CisrKyBiL0xpYi9vcGNvZGUucHkKQEAgLTM0LDkgKzM0LDcgQEAKIGhhc25hcmdzID0gW10KIAogb3BtYXAgPSB7fQotb3BuYW1lID0gWycnXSAqIDI1NgotZm9yIG9wIGluIHJhbmdlKDI1Nik6IG9wbmFtZVtvcF0gPSAnPCVyPicgJSAob3AsKQotZGVsIG9wCitvcG5hbWUgPSBbJzwlcj4nICUgKG9wLCkgZm9yIG9wIGluIHJhbmdlKDI1NildCiAKIGRlZiBkZWZfb3AobmFtZSwgb3ApOgogICAgIG9wbmFtZVtvcF0gPSBuYW1lCkBAIC0yMTQsNCArMjEyLDYgQEAKIGRlZl9vcCgnQlVJTERfVFVQTEVfVU5QQUNLJywgMTUyKQogZGVmX29wKCdCVUlMRF9TRVRfVU5QQUNLJywgMTUzKQogCitkZWZfb3AoJ0ZPUk1BVF9WQUxVRScsIDE1NSkKKwogZGVsIGRlZl9vcCwgbmFtZV9vcCwganJlbF9vcCwgamFic19vcApkaWZmIC0tZ2l0IGEvTGliL29wdHBhcnNlLnB5IGIvTGliL29wdHBhcnNlLnB5CmluZGV4IDViYzkwNTEuLjIzMGEwZjYgMTAwNjQ0Ci0tLSBhL0xpYi9vcHRwYXJzZS5weQorKysgYi9MaWIvb3B0cGFyc2UucHkKQEAgLTM4LDcgKzM4LDggQEAKICAgICAgICAgICAgJ09wdGlvbkVycm9yJywKICAgICAgICAgICAgJ09wdGlvbkNvbmZsaWN0RXJyb3InLAogICAgICAgICAgICAnT3B0aW9uVmFsdWVFcnJvcicsCi0gICAgICAgICAgICdCYWRPcHRpb25FcnJvciddCisgICAgICAgICAgICdCYWRPcHRpb25FcnJvcicsCisgICAgICAgICAgICdjaGVja19jaG9pY2UnXQogCiBfX2NvcHlyaWdodF9fID0gIiIiCiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiBHcmVnb3J5IFAuIFdhcmQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgpkaWZmIC0tZ2l0IGEvTGliL29zLnB5IGIvTGliL29zLnB5CmluZGV4IGI0YzY1MWQuLjkwNjQ2YTAgMTAwNjQ0Ci0tLSBhL0xpYi9vcy5weQorKysgYi9MaWIvb3MucHkKQEAgLTM1Niw2ICszNTYsNyBAQAogCiAgICAgZGlycyA9IFtdCiAgICAgbm9uZGlycyA9IFtdCisgICAgd2Fsa19kaXJzID0gW10KIAogICAgICMgV2UgbWF5IG5vdCBoYXZlIHJlYWQgcGVybWlzc2lvbiBmb3IgdG9wLCBpbiB3aGljaCBjYXNlIHdlIGNhbid0CiAgICAgIyBnZXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zLiAgb3Mud2FsawpAQCAtMzY5LDQyICszNzAsNTIgQEAKICAgICAgICAgICAgICMgTm90ZSB0aGF0IHNjYW5kaXIgaXMgZ2xvYmFsIGluIHRoaXMgbW9kdWxlIGR1ZQogICAgICAgICAgICAgIyB0byBlYXJsaWVyIGltcG9ydC0qLgogICAgICAgICAgICAgc2NhbmRpcl9pdCA9IHNjYW5kaXIodG9wKQotICAgICAgICBlbnRyaWVzID0gbGlzdChzY2FuZGlyX2l0KQogICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgogICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgb25lcnJvcihlcnJvcikKICAgICAgICAgcmV0dXJuCiAKLSAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAjIElmIGlzX2RpcigpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZSBlbnRyeSBpcyBub3QKLSAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgotICAgICAgICAgICAgaXNfZGlyID0gRmFsc2UKLQotICAgICAgICBpZiBpc19kaXI6Ci0gICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbm9uZGlycy5hcHBlbmQoZW50cnkubmFtZSkKLQotICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgotICAgICAgICAgICAgIyBCb3R0b20tdXA6IHJlY3Vyc2UgaW50byBzdWItZGlyZWN0b3J5LCBidXQgZXhjbHVkZSBzeW1saW5rcyB0bwotICAgICAgICAgICAgIyBkaXJlY3RvcmllcyBpZiBmb2xsb3dsaW5rcyBpcyBGYWxzZQotICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6Ci0gICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gVHJ1ZQotICAgICAgICAgICAgZWxzZToKKyAgICB3aXRoIHNjYW5kaXJfaXQ6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgSWYgaXNfc3ltbGluaygpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgIyBvcy5wYXRoLmlzbGluaygpLgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gRmFsc2UKLSAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQoc2NhbmRpcl9pdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoZXJyb3IpCisgICAgICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgICAgIGlmIHdhbGtfaW50bzoKLSAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsoZW50cnkucGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgSWYgaXNfZGlyKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlIGVudHJ5IGlzIG5vdAorICAgICAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgorICAgICAgICAgICAgICAgIGlzX2RpciA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIGlzX2RpcjoKKyAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub25kaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorCisgICAgICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgorICAgICAgICAgICAgICAgICMgQm90dG9tLXVwOiByZWN1cnNlIGludG8gc3ViLWRpcmVjdG9yeSwgYnV0IGV4Y2x1ZGUgc3ltbGlua3MgdG8KKyAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzIGlmIGZvbGxvd2xpbmtzIGlzIEZhbHNlCisgICAgICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6CisgICAgICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBpc19zeW1saW5rKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgb3MucGF0aC5pc2xpbmsoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworCisgICAgICAgICAgICAgICAgaWYgd2Fsa19pbnRvOgorICAgICAgICAgICAgICAgICAgICB3YWxrX2RpcnMuYXBwZW5kKGVudHJ5LnBhdGgpCiAKICAgICAjIFlpZWxkIGJlZm9yZSByZWN1cnNpb24gaWYgZ29pbmcgdG9wIGRvd24KICAgICBpZiB0b3Bkb3duOgpAQCAtNDIxLDYgKzQzMiw5IEBACiAgICAgICAgICAgICBpZiBmb2xsb3dsaW5rcyBvciBub3QgaXNsaW5rKG5ld19wYXRoKToKICAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsobmV3X3BhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQogICAgIGVsc2U6CisgICAgICAgICMgUmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcmllcworICAgICAgICBmb3IgbmV3X3BhdGggaW4gd2Fsa19kaXJzOgorICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrKG5ld19wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKICAgICAgICAgIyBZaWVsZCBhZnRlciByZWN1cnNpb24gaWYgZ29pbmcgYm90dG9tIHVwCiAgICAgICAgIHlpZWxkIHRvcCwgZGlycywgbm9uZGlycwogCkBAIC00NjcsMTAgKzQ4MSwyMyBAQAogICAgICAgICBzdGF0ID0gc2VsZi5zdGF0KGZvbGxvd19zeW1saW5rcz1GYWxzZSkKICAgICAgICAgcmV0dXJuIHN0LlNfSVNMTksoc3RhdC5zdF9tb2RlKQogCi1kZWYgX2R1bW15X3NjYW5kaXIoZGlyKToKK2NsYXNzIF9kdW1teV9zY2FuZGlyOgogICAgICMgbGlzdGRpci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnl0ZXMgcGF0Y2hlcyBvbiBXaW5kb3dzCi0gICAgZm9yIG5hbWUgaW4gbGlzdGRpcihkaXIpOgotICAgICAgICB5aWVsZCBfRHVtbXlEaXJFbnRyeShkaXIsIG5hbWUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcik6CisgICAgICAgIHNlbGYuZGlyID0gZGlyCisgICAgICAgIHNlbGYuaXQgPSBpdGVyKGxpc3RkaXIoZGlyKSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIF9EdW1teURpckVudHJ5KHNlbGYuZGlyLCBuZXh0KHNlbGYuaXQpKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuaXQgPSBpdGVyKCgpKQogCiBfX2FsbF9fLmFwcGVuZCgid2FsayIpCiAKZGlmZiAtLWdpdCBhL0xpYi9waWNrbGUucHkgYi9MaWIvcGlja2xlLnB5CmluZGV4IDc1MTI3ODcuLmE2MGIxYjcgMTAwNjQ0Ci0tLSBhL0xpYi9waWNrbGUucHkKKysrIGIvTGliL3BpY2tsZS5weQpAQCAtMjcsNiArMjcsNyBAQAogZnJvbSBjb3B5cmVnIGltcG9ydCBkaXNwYXRjaF90YWJsZQogZnJvbSBjb3B5cmVnIGltcG9ydCBfZXh0ZW5zaW9uX3JlZ2lzdHJ5LCBfaW52ZXJ0ZWRfcmVnaXN0cnksIF9leHRlbnNpb25fY2FjaGUKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCiBpbXBvcnQgc3lzCiBmcm9tIHN5cyBpbXBvcnQgbWF4c2l6ZQogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawpAQCAtNTQ0LDcgKzU0NSw3IEBACiAgICAgICAgIHdyaXRlID0gc2VsZi53cml0ZQogCiAgICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgIl9fbmFtZV9fIiwgIiIpCi0gICAgICAgIGlmIHNlbGYucHJvdG8gPj0gNCBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9leF9fIjoKKyAgICAgICAgaWYgc2VsZi5wcm90byA+PSAyIGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX2V4X18iOgogICAgICAgICAgICAgY2xzLCBhcmdzLCBrd2FyZ3MgPSBhcmdzCiAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsICJfX25ld19fIik6CiAgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiYXJnc1swXSBmcm9tIHt9IGFyZ3MgaGFzIG5vIF9fbmV3X18iCkBAIC01NTIsMTAgKzU1MywxNiBAQAogICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBjbHMgaXMgbm90IG9iai5fX2NsYXNzX186CiAgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiYXJnc1swXSBmcm9tIHt9IGFyZ3MgaGFzIHRoZSB3cm9uZyBjbGFzcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoZnVuY19uYW1lKSkKLSAgICAgICAgICAgIHNhdmUoY2xzKQotICAgICAgICAgICAgc2F2ZShhcmdzKQotICAgICAgICAgICAgc2F2ZShrd2FyZ3MpCi0gICAgICAgICAgICB3cml0ZShORVdPQkpfRVgpCisgICAgICAgICAgICBpZiBzZWxmLnByb3RvID49IDQ6CisgICAgICAgICAgICAgICAgc2F2ZShjbHMpCisgICAgICAgICAgICAgICAgc2F2ZShhcmdzKQorICAgICAgICAgICAgICAgIHNhdmUoa3dhcmdzKQorICAgICAgICAgICAgICAgIHdyaXRlKE5FV09CSl9FWCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVuYyA9IHBhcnRpYWwoY2xzLl9fbmV3X18sIGNscywgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgICAgIHNhdmUoZnVuYykKKyAgICAgICAgICAgICAgICBzYXZlKCgpKQorICAgICAgICAgICAgICAgIHdyaXRlKFJFRFVDRSkKICAgICAgICAgZWxpZiBzZWxmLnByb3RvID49IDIgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfXyI6CiAgICAgICAgICAgICAjIEEgX19yZWR1Y2VfXyBpbXBsZW1lbnRhdGlvbiBjYW4gZGlyZWN0IHByb3RvY29sIDIgb3IgbmV3ZXIgdG8KICAgICAgICAgICAgICMgdXNlIHRoZSBtb3JlIGVmZmljaWVudCBORVdPQkogb3Bjb2RlLCB3aGlsZSBzdGlsbApAQCAtMTAyNCw3ICsxMDMxLDcgQEAKICAgICAgICAgc2VsZi5fdW5mcmFtZXIgPSBfVW5mcmFtZXIoc2VsZi5fZmlsZV9yZWFkLCBzZWxmLl9maWxlX3JlYWRsaW5lKQogICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLl91bmZyYW1lci5yZWFkCiAgICAgICAgIHNlbGYucmVhZGxpbmUgPSBzZWxmLl91bmZyYW1lci5yZWFkbGluZQotICAgICAgICBzZWxmLm1hcmsgPSBvYmplY3QoKSAjIGFueSBuZXcgdW5pcXVlIG9iamVjdAorICAgICAgICBzZWxmLm1ldGFzdGFjayA9IFtdCiAgICAgICAgIHNlbGYuc3RhY2sgPSBbXQogICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCiAgICAgICAgIHNlbGYucHJvdG8gPSAwCkBAIC0xMDQwLDIwICsxMDQ3LDEyIEBACiAgICAgICAgIGV4Y2VwdCBfU3RvcCBhcyBzdG9waW5zdDoKICAgICAgICAgICAgIHJldHVybiBzdG9waW5zdC52YWx1ZQogCi0gICAgIyBSZXR1cm4gbGFyZ2VzdCBpbmRleCBrIHN1Y2ggdGhhdCBzZWxmLnN0YWNrW2tdIGlzIHNlbGYubWFyay4KLSAgICAjIElmIHRoZSBzdGFjayBkb2Vzbid0IGNvbnRhaW4gYSBtYXJrLCBldmVudHVhbGx5IHJhaXNlcyBJbmRleEVycm9yLgotICAgICMgVGhpcyBjb3VsZCBiZSBzcGVkIGJ5IG1haW50YWluaW5nIGFub3RoZXIgc3RhY2ssIG9mIGluZGljZXMgYXQgd2hpY2gKLSAgICAjIHRoZSBtYXJrIGFwcGVhcnMuICBGb3IgdGhhdCBtYXR0ZXIsIHRoZSBsYXR0ZXIgc3RhY2sgd291bGQgc3VmZmljZSwKLSAgICAjIGFuZCB3ZSB3b3VsZG4ndCBuZWVkIHRvIHB1c2ggbWFyayBvYmplY3RzIG9uIHNlbGYuc3RhY2sgYXQgYWxsLgotICAgICMgRG9pbmcgc28gaXMgcHJvYmFibHkgYSBnb29kIHRoaW5nLCB0aG91Z2gsIHNpbmNlIGlmIHRoZSBwaWNrbGUgaXMKLSAgICAjIGNvcnJ1cHQgKG9yIGhvc3RpbGUpIHdlIG1heSBnZXQgYSBjbHVlIGZyb20gZmluZGluZyBzZWxmLm1hcmsgZW1iZWRkZWQKLSAgICAjIGluIHVucGlja2xlZCBvYmplY3RzLgotICAgIGRlZiBtYXJrZXIoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrCi0gICAgICAgIGsgPSBsZW4oc3RhY2spLTEKLSAgICAgICAgd2hpbGUgc3RhY2tba10gaXMgbm90IG1hcms6IGsgPSBrLTEKLSAgICAgICAgcmV0dXJuIGsKKyAgICAjIFJldHVybiBhIGxpc3Qgb2YgaXRlbXMgcHVzaGVkIGluIHRoZSBzdGFjayBhZnRlciBsYXN0IE1BUksgaW5zdHJ1Y3Rpb24uCisgICAgZGVmIHBvcF9tYXJrKHNlbGYpOgorICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2sKKyAgICAgICAgc2VsZi5zdGFjayA9IHNlbGYubWV0YXN0YWNrLnBvcCgpCisgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5zdGFjay5hcHBlbmQKKyAgICAgICAgcmV0dXJuIGl0ZW1zCiAKICAgICBkZWYgcGVyc2lzdGVudF9sb2FkKHNlbGYsIHBpZCk6CiAgICAgICAgIHJhaXNlIFVucGlja2xpbmdFcnJvcigidW5zdXBwb3J0ZWQgcGVyc2lzdGVudCBpZCBlbmNvdW50ZXJlZCIpCkBAIC0xMjMwLDggKzEyMjksOCBAQAogICAgIGRpc3BhdGNoW1NIT1JUX0JJTlVOSUNPREVbMF1dID0gbG9hZF9zaG9ydF9iaW51bmljb2RlCiAKICAgICBkZWYgbG9hZF90dXBsZShzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbdHVwbGUoc2VsZi5zdGFja1trKzE6XSldCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKHR1cGxlKGl0ZW1zKSkKICAgICBkaXNwYXRjaFtUVVBMRVswXV0gPSBsb2FkX3R1cGxlCiAKICAgICBkZWYgbG9hZF9lbXB0eV90dXBsZShzZWxmKToKQEAgLTEyNjMsMjEgKzEyNjIsMjAgQEAKICAgICBkaXNwYXRjaFtFTVBUWV9TRVRbMF1dID0gbG9hZF9lbXB0eV9zZXQKIAogICAgIGRlZiBsb2FkX2Zyb3plbnNldChzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbZnJvemVuc2V0KHNlbGYuc3RhY2tbaysxOl0pXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZChmcm96ZW5zZXQoaXRlbXMpKQogICAgIGRpc3BhdGNoW0ZST1pFTlNFVFswXV0gPSBsb2FkX2Zyb3plbnNldAogCiAgICAgZGVmIGxvYWRfbGlzdChzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbc2VsZi5zdGFja1trKzE6XV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoaXRlbXMpCiAgICAgZGlzcGF0Y2hbTElTVFswXV0gPSBsb2FkX2xpc3QKIAogICAgIGRlZiBsb2FkX2RpY3Qoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGl0ZW1zID0gc2VsZi5zdGFja1trKzE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQogICAgICAgICBkID0ge2l0ZW1zW2ldOiBpdGVtc1tpKzFdCiAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMil9Ci0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW2RdCisgICAgICAgIHNlbGYuYXBwZW5kKGQpCiAgICAgZGlzcGF0Y2hbRElDVFswXV0gPSBsb2FkX2RpY3QKIAogICAgICMgSU5TVCBhbmQgT0JKIGRpZmZlciBvbmx5IGluIGhvdyB0aGV5IGdldCBhIGNsYXNzIG9iamVjdC4gIEl0J3Mgbm90CkBAIC0xMjg1LDkgKzEyODMsNyBAQAogICAgICMgcHJldmlvdXNseSBkaXZlcmdlZCBhbmQgZ3JldyBkaWZmZXJlbnQgYnVncy4KICAgICAjIGtsYXNzIGlzIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSwgYW5kIGsgcG9pbnRzIHRvIHRoZSB0b3Btb3N0IG1hcmsKICAgICAjIG9iamVjdCwgZm9sbG93aW5nIHdoaWNoIGFyZSB0aGUgYXJndW1lbnRzIGZvciBrbGFzcy5fX2luaXRfXy4KLSAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBrKToKLSAgICAgICAgYXJncyA9IHR1cGxlKHNlbGYuc3RhY2tbaysxOl0pCi0gICAgICAgIGRlbCBzZWxmLnN0YWNrW2s6XQorICAgIGRlZiBfaW5zdGFudGlhdGUoc2VsZiwga2xhc3MsIGFyZ3MpOgogICAgICAgICBpZiAoYXJncyBvciBub3QgaXNpbnN0YW5jZShrbGFzcywgdHlwZSkgb3IKICAgICAgICAgICAgIGhhc2F0dHIoa2xhc3MsICJfX2dldGluaXRhcmdzX18iKSk6CiAgICAgICAgICAgICB0cnk6CkBAIC0xMzAzLDE0ICsxMjk5LDE0IEBACiAgICAgICAgIG1vZHVsZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdLmRlY29kZSgiYXNjaWkiKQogICAgICAgICBuYW1lID0gc2VsZi5yZWFkbGluZSgpWzotMV0uZGVjb2RlKCJhc2NpaSIpCiAgICAgICAgIGtsYXNzID0gc2VsZi5maW5kX2NsYXNzKG1vZHVsZSwgbmFtZSkKLSAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIHNlbGYubWFya2VyKCkpCisgICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLnBvcF9tYXJrKCkpCiAgICAgZGlzcGF0Y2hbSU5TVFswXV0gPSBsb2FkX2luc3QKIAogICAgIGRlZiBsb2FkX29iaihzZWxmKToKICAgICAgICAgIyBTdGFjayBpcyAuLi4gbWFya29iamVjdCBjbGFzc29iamVjdCBhcmcxIGFyZzIgLi4uCi0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGtsYXNzID0gc2VsZi5zdGFjay5wb3AoaysxKQotICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgaykKKyAgICAgICAgYXJncyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBjbHMgPSBhcmdzLnBvcCgwKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShjbHMsIGFyZ3MpCiAgICAgZGlzcGF0Y2hbT0JKWzBdXSA9IGxvYWRfb2JqCiAKICAgICBkZWYgbG9hZF9uZXdvYmooc2VsZik6CkBAIC0xMzk1LDEyICsxMzkxLDE0IEBACiAgICAgZGlzcGF0Y2hbUkVEVUNFWzBdXSA9IGxvYWRfcmVkdWNlCiAKICAgICBkZWYgbG9hZF9wb3Aoc2VsZik6Ci0gICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgICAgICBpZiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgZGVsIHNlbGYuc3RhY2tbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBvcF9tYXJrKCkKICAgICBkaXNwYXRjaFtQT1BbMF1dID0gbG9hZF9wb3AKIAogICAgIGRlZiBsb2FkX3BvcF9tYXJrKHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICAgICAgc2VsZi5wb3BfbWFyaygpCiAgICAgZGlzcGF0Y2hbUE9QX01BUktbMF1dID0gbG9hZF9wb3BfbWFyawogCiAgICAgZGVmIGxvYWRfZHVwKHNlbGYpOgpAQCAtMTQ1NiwxNyArMTQ1NCwxNCBAQAogICAgIGRpc3BhdGNoW0FQUEVORFswXV0gPSBsb2FkX2FwcGVuZAogCiAgICAgZGVmIGxvYWRfYXBwZW5kcyhzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGxpc3Rfb2JqID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGl0ZW1zID0gc3RhY2tbbWFyayArIDE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBsaXN0X29iaiA9IHNlbGYuc3RhY2tbLTFdCiAgICAgICAgIGlmIGlzaW5zdGFuY2UobGlzdF9vYmosIGxpc3QpOgogICAgICAgICAgICAgbGlzdF9vYmouZXh0ZW5kKGl0ZW1zKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYXBwZW5kID0gbGlzdF9vYmouYXBwZW5kCiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgICAgICBhcHBlbmQoaXRlbSkKLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQogICAgIGRpc3BhdGNoW0FQUEVORFNbMF1dID0gbG9hZF9hcHBlbmRzCiAKICAgICBkZWYgbG9hZF9zZXRpdGVtKHNlbGYpOgpAQCAtMTQ3OCwyNyArMTQ3MywyMSBAQAogICAgIGRpc3BhdGNoW1NFVElURU1bMF1dID0gbG9hZF9zZXRpdGVtCiAKICAgICBkZWYgbG9hZF9zZXRpdGVtcyhzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGRpY3QgPSBzdGFja1ttYXJrIC0gMV0KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobWFyayArIDEsIGxlbihzdGFjayksIDIpOgotICAgICAgICAgICAgZGljdFtzdGFja1tpXV0gPSBzdGFja1tpICsgMV0KLQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIGRpY3QgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oaXRlbXMpLCAyKToKKyAgICAgICAgICAgIGRpY3RbaXRlbXNbaV1dID0gaXRlbXNbaSArIDFdCiAgICAgZGlzcGF0Y2hbU0VUSVRFTVNbMF1dID0gbG9hZF9zZXRpdGVtcwogCiAgICAgZGVmIGxvYWRfYWRkaXRlbXMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBzZXRfb2JqID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGl0ZW1zID0gc3RhY2tbbWFyayArIDE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZXRfb2JqID0gc2VsZi5zdGFja1stMV0KICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXRfb2JqLCBzZXQpOgogICAgICAgICAgICAgc2V0X29iai51cGRhdGUoaXRlbXMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhZGQgPSBzZXRfb2JqLmFkZAogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgYWRkKGl0ZW0pCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KICAgICBkaXNwYXRjaFtBRERJVEVNU1swXV0gPSBsb2FkX2FkZGl0ZW1zCiAKICAgICBkZWYgbG9hZF9idWlsZChzZWxmKToKQEAgLTE1MjYsNyArMTUxNSw5IEBACiAgICAgZGlzcGF0Y2hbQlVJTERbMF1dID0gbG9hZF9idWlsZAogCiAgICAgZGVmIGxvYWRfbWFyayhzZWxmKToKLSAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5tYXJrKQorICAgICAgICBzZWxmLm1ldGFzdGFjay5hcHBlbmQoc2VsZi5zdGFjaykKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5zdGFjay5hcHBlbmQKICAgICBkaXNwYXRjaFtNQVJLWzBdXSA9IGxvYWRfbWFyawogCiAgICAgZGVmIGxvYWRfc3RvcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9waWNrbGV0b29scy5weSBiL0xpYi9waWNrbGV0b29scy5weQppbmRleCAxNTViZDViLi4xYzc3MzM2IDEwMDY0NAotLS0gYS9MaWIvcGlja2xldG9vbHMucHkKKysrIGIvTGliL3BpY2tsZXRvb2xzLnB5CkBAIC0yNDQwLDYgKzI0NDAsNyBAQAogICAgICAgICBpZiBvcGNvZGUubmFtZSBpbiAoIlBVVCIsICJCSU5QVVQiLCAiTE9OR19CSU5QVVQiLCAiTUVNT0laRSIpOgogICAgICAgICAgICAgaWYgb3Bjb2RlLm5hbWUgPT0gIk1FTU9JWkUiOgogICAgICAgICAgICAgICAgIG1lbW9faWR4ID0gbGVuKG1lbW8pCisgICAgICAgICAgICAgICAgbWFya21zZyA9ICIoYXMgJWQpIiAlIG1lbW9faWR4CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGFzc2VydCBhcmcgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICBtZW1vX2lkeCA9IGFyZwpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCBmYzRhMDc0Li4yMDNkNTE1IDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtMTgwLDcgKzE4MCw3IEBACiBkZWYgX2ltcG9ydF9pbXAoKToKICAgICBnbG9iYWwgaW1wCiAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICBpbXAgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnaW1wJykKIAogY2xhc3MgSW1wSW1wb3J0ZXI6CmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhOWMwNGYwLi41ZTVhOGFlCi0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTIwOSw2ICsyMDksMTggQEAKICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKG5hbWUsIGtpbmQsIGNscywgdmFsdWUpKQogICAgIHJldHVybiByZXN1bHRzCiAKK2RlZiBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCk6CisgICAgJ1NvcnQgdGhlIGF0dHJzIGxpc3QgaW4tcGxhY2UgYnkgX2ZpZWxkcyBhbmQgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lJworICAgICMgVGhpcyBhbGxvd3MgZGF0YSBkZXNjcmlwdG9ycyB0byBiZSBvcmRlcmVkIGFjY29yZGluZworICAgICMgdG8gYSBfZmllbGRzIGF0dHJpYnV0ZSBpZiBwcmVzZW50LgorICAgIGZpZWxkcyA9IGdldGF0dHIob2JqZWN0LCAnX2ZpZWxkcycsIFtdKQorICAgIHRyeToKKyAgICAgICAgZmllbGRfb3JkZXIgPSB7bmFtZSA6IGktbGVuKGZpZWxkcykgZm9yIChpLCBuYW1lKSBpbiBlbnVtZXJhdGUoZmllbGRzKX0KKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBmaWVsZF9vcmRlciA9IHt9CisgICAga2V5ZnVuYyA9IGxhbWJkYSBhdHRyOiAoZmllbGRfb3JkZXIuZ2V0KGF0dHJbMF0sIDApLCBhdHRyWzBdKQorICAgIGF0dHJzLnNvcnQoa2V5PWtleWZ1bmMpCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIG1hbmlwdWxhdGlvbgogCiBkZWYgaXNwYWNrYWdlKHBhdGgpOgpAQCAtODY3LDggKzg3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQogICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJwogCi0gICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCdNZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCkBAIC0xMjg2LDggKzEyOTcsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB0YWcgPSAiaW5oZXJpdGVkIGZyb20gJXMiICUgY2xhc3NuYW1lKHRoaXNjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQotICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCi0gICAgICAgICAgICBhdHRycy5zb3J0KCkKKworICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCJNZXRob2RzICVzOlxuIiAlIHRhZywgYXR0cnMsCkBAIC0xOTAwLDEwICsxOTExLDEwIEBACiAKICAgICBkZWYgaW50cm8oc2VsZik6CiAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJwotV2VsY29tZSB0byBQeXRob24gJXMncyBoZWxwIHV0aWxpdHkhCitXZWxjb21lIHRvIFB5dGhvbiB7MH0ncyBoZWxwIHV0aWxpdHkhCiAKIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIFB5dGhvbiwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGNoZWNrIG91dAotdGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnLyVzL3R1dG9yaWFsLy4KK3RoZSB0dXRvcmlhbCBvbiB0aGUgSW50ZXJuZXQgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy97MH0vdHV0b3JpYWwvLgogCiBFbnRlciB0aGUgbmFtZSBvZiBhbnkgbW9kdWxlLCBrZXl3b3JkLCBvciB0b3BpYyB0byBnZXQgaGVscCBvbiB3cml0aW5nCiBQeXRob24gcHJvZ3JhbXMgYW5kIHVzaW5nIFB5dGhvbiBtb2R1bGVzLiAgVG8gcXVpdCB0aGlzIGhlbHAgdXRpbGl0eSBhbmQKQEAgLTE5MTMsNyArMTkyNCw3IEBACiAibW9kdWxlcyIsICJrZXl3b3JkcyIsICJzeW1ib2xzIiwgb3IgInRvcGljcyIuICBFYWNoIG1vZHVsZSBhbHNvIGNvbWVzCiB3aXRoIGEgb25lLWxpbmUgc3VtbWFyeSBvZiB3aGF0IGl0IGRvZXM7IHRvIGxpc3QgdGhlIG1vZHVsZXMgd2hvc2UgbmFtZQogb3Igc3VtbWFyeSBjb250YWluIGEgZ2l2ZW4gc3RyaW5nIHN1Y2ggYXMgInNwYW0iLCB0eXBlICJtb2R1bGVzIHNwYW0iLgotJycnICUgdHVwbGUoW3N5cy52ZXJzaW9uWzozXV0qMikpCisnJycuZm9ybWF0KCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkpCiAKICAgICBkZWYgbGlzdChzZWxmLCBpdGVtcywgY29sdW1ucz00LCB3aWR0aD04MCk6CiAgICAgICAgIGl0ZW1zID0gbGlzdChzb3J0ZWQoaXRlbXMpKQpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CmluZGV4IDI1MGJmZDMuLjM4ODU3ZDIgMTAwNjQ0Ci0tLSBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQorKysgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTEsNSArMSw1IEBACiAjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQotIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBTYXQgRGVjICA1IDE3OjAyOjQ5IDIwMTUKKyMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gU2F0IE1heSAyMyAxNzozODo0MSAyMDE1CiB0b3BpY3MgPSB7J2Fzc2VydCc6IHUnXG5UaGUgImFzc2VydCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9uc1xuaW50byBhIHByb2dyYW06XG5cbiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1cblxuVGhlIHNpbXBsZSBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24iLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuXG5UaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCAiX19kZWJ1Z19fIiBhbmQgIkFzc2VydGlvbkVycm9yIiByZWZlclxudG8gdGhlIGJ1aWx0LWluIHZhcmlhYmxlcyB3aXRoIHRob3NlIG5hbWVzLiAgSW4gdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgIkZhbHNlIiB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgKGNvbW1hbmRcbmxpbmUgb3B0aW9uIC1PKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuXG5hc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlIHRpbWUuICBOb3RlXG50aGF0IGl0IGlzIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvblxudGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlXG5zdGFjayB0cmFjZS5cblxuQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAogICdhc3NpZ25tZW50JzogdSdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG4gICAgICAgICAgICAgIHwgIioiIHRhcmdldFxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yXG4qYXR0cmlidXRlcmVmKiwgKnN1YnNjcmlwdGlvbiosIGFuZCAqc2xpY2luZyouKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCwgb3B0aW9uYWxseSBlbmNsb3NlZCBpblxucGFyZW50aGVzZXMgb3Igc3F1YXJlIGJyYWNrZXRzLCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzIGZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldDogVGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0b1xuICB0aGF0IHRhcmdldC5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzOiBUaGVcbiAgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmVcbiAgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbVxuICBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4gICogSWYgdGhlIHRhcmdldCBsaXN0IGNvbnRhaW5zIG9uZSB0YXJnZXQgcHJlZml4ZWQgd2l0aCBhblxuICAgIGFzdGVyaXNrLCBjYWxsZWQgYSAic3RhcnJlZCIgdGFyZ2V0OiBUaGUgb2JqZWN0IG11c3QgYmUgYSBzZXF1ZW5jZVxuICAgIHdpdGggYXQgbGVhc3QgYXMgbWFueSBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0XG4gICAgbGlzdCwgbWludXMgb25lLiAgVGhlIGZpcnN0IGl0ZW1zIG9mIHRoZSBzZXF1ZW5jZSBhcmUgYXNzaWduZWQsXG4gICAgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgVGhlXG4gICAgZmluYWwgaXRlbXMgb2YgdGhlIHNlcXVlbmNlIGFyZSBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0cyBhZnRlciB0aGVcbiAgICBzdGFycmVkIHRhcmdldC4gIEEgbGlzdCBvZiB0aGUgcmVtYWluaW5nIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBpc1xuICAgIHRoZW4gYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICh0aGUgbGlzdCBjYW4gYmUgZW1wdHkpLlxuXG4gICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGEgc2VxdWVuY2Ugd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlXG4gICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgImdsb2JhbCIgb3IgIm5vbmxvY2FsIiBzdGF0ZW1lbnRcbiAgICBpbiB0aGUgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZVxuICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBnbG9iYWxcbiAgICBuYW1lc3BhY2Ugb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICJub25sb2NhbCIsXG4gICAgcmVzcGVjdGl2ZWx5LlxuXG4gIFRoZSBuYW1lIGlzIHJlYm91bmQgaWYgaXQgd2FzIGFscmVhZHkgYm91bmQuICBUaGlzIG1heSBjYXVzZSB0aGVcbiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2hcbiAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgZGVzdHJ1Y3RvciAoaWYgaXRcbiAgaGFzIG9uZSkgdG8gYmUgY2FsbGVkLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSB0YXJnZXQgbGlzdCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBvciBpblxuICBzcXVhcmUgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlclxuICBvZiBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCBpdHMgaXRlbXMgYXJlXG4gIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluXG4gIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4gIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsICJUeXBlRXJyb3IiIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAiQXR0cmlidXRlRXJyb3IiKS5cblxuICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlXG4gIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTIGV4cHJlc3Npb24sXG4gICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2VcbiAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCAiYS54IiBpcyBhbHdheXNcbiAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgVGh1cywgdGhlXG4gIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlIHNhbWVcbiAgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLCB0aGVcbiAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4gIGFzc2lnbm1lbnQ6XG5cbiAgICAgY2xhc3MgQ2xzOlxuICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuICAgICBpbnN0ID0gQ2xzKClcbiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgM1xuXG4gIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlXG4gIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWRcbiAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgSWYgdGhlXG4gIGluZGV4IGlzIG91dCBvZiByYW5nZSwgIkluZGV4RXJyb3IiIGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byBhXG4gIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4gIEZvciB1c2VyLWRlZmluZWQgb2JqZWN0cywgdGhlICJfX3NldGl0ZW1fXygpIiBtZXRob2QgaXMgY2FsbGVkIHdpdGhcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3RcbiAgKHN1Y2ggYXMgYSBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0XG4gIG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZVxuICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuICBzZXF1ZW5jZVwncyBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gSWZcbiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlXG4gIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCwgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlXG4gIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgbGVuZ3RoIG9mXG4gIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UsXG4gIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgdGFyZ2V0XG4gIHNlcXVlbmNlIGFsbG93cyBpdC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlXG5zeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCBhbmRcbmludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCBjYXVzaW5nXG5sZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuXG5BbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyBiZXR3ZWVuXG50aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlIFwnc2ltdWx0YW5lbm91c1wnIChmb3JcbmV4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlXG5jb2xsZWN0aW9uIG9mIGFzc2lnbmVkLXRvIHZhcmlhYmxlcyBvY2N1ciBsZWZ0LXRvLXJpZ2h0LCBzb21ldGltZXNcbnJlc3VsdGluZyBpbiBjb25mdXNpb24uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBwcmludHNcbiJbMCwgMl0iOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDIgICAgICAgICAjIGkgaXMgdXBkYXRlZCwgdGhlbiB4W2ldIGlzIHVwZGF0ZWRcbiAgIHByaW50KHgpXG5cblNlZSBhbHNvOiAqKlBFUCAzMTMyKiogLSBFeHRlbmRlZCBJdGVyYWJsZSBVbnBhY2tpbmdcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICIqdGFyZ2V0IiBmZWF0dXJlLlxuXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+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+IiAoaW52ZXJ0KSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGl0c1xuaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy5cblxuSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsIGFcbiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAogICd3aGlsZSc6IHUnXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKICAnd2l0aCc6IHUnXG5UaGUgIndpdGgiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxudXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuXG4gICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbiAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG5cblRoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cblxuMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cblxuICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlXG4gICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmdcbiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cblxuNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuXG42LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsIHRocmVlXG4gICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLlxuICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmRcbiAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4gICBzdGF0ZW1lbnQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGVcbiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzogKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLApkaWZmIC0tZ2l0IGEvTGliL3JsY29tcGxldGVyLnB5IGIvTGliL3JsY29tcGxldGVyLnB5CmluZGV4IDQwMWE2MjYuLmJjYTRhN2IgMTAwNjQ0Ci0tLSBhL0xpYi9ybGNvbXBsZXRlci5weQorKysgYi9MaWIvcmxjb21wbGV0ZXIucHkKQEAgLTExMyw2ICsxMTMsMTIgQEAKICAgICAgICAgZm9yIHdvcmQgaW4ga2V5d29yZC5rd2xpc3Q6CiAgICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSB0ZXh0OgogICAgICAgICAgICAgICAgIHNlZW4uYWRkKHdvcmQpCisgICAgICAgICAgICAgICAgaWYgd29yZCBpbiB7J2ZpbmFsbHknLCAndHJ5J306CisgICAgICAgICAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgJzonCisgICAgICAgICAgICAgICAgZWxpZiB3b3JkIG5vdCBpbiB7J0ZhbHNlJywgJ05vbmUnLCAnVHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ3Bhc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbHNlJ306CisgICAgICAgICAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgJyAnCiAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKICAgICAgICAgZm9yIG5zcGFjZSBpbiBbc2VsZi5uYW1lc3BhY2UsIGJ1aWx0aW5zLl9fZGljdF9fXToKICAgICAgICAgICAgIGZvciB3b3JkLCB2YWwgaW4gbnNwYWNlLml0ZW1zKCk6CkBAIC0xNTIsMTQgKzE1OCwzMCBAQAogICAgICAgICAgICAgd29yZHMudXBkYXRlKGdldF9jbGFzc19tZW1iZXJzKHRoaXNvYmplY3QuX19jbGFzc19fKSkKICAgICAgICAgbWF0Y2hlcyA9IFtdCiAgICAgICAgIG4gPSBsZW4oYXR0cikKLSAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6Ci0gICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSBhdHRyOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cih0aGlzb2JqZWN0LCB3b3JkKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIEV4Y2x1ZGUgcHJvcGVydGllcyB0aGF0IGFyZSBub3Qgc2V0Ci0gICAgICAgICAgICAgICAgd29yZCA9IHNlbGYuX2NhbGxhYmxlX3Bvc3RmaXgodmFsLCAiJXMuJXMiICUgKGV4cHIsIHdvcmQpKQotICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHdvcmQpCisgICAgICAgIGlmIGF0dHIgPT0gJyc6CisgICAgICAgICAgICBub3ByZWZpeCA9ICdfJworICAgICAgICBlbGlmIGF0dHIgPT0gJ18nOgorICAgICAgICAgICAgbm9wcmVmaXggPSAnX18nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub3ByZWZpeCA9IE5vbmUKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgICAgIGlmICh3b3JkWzpuXSA9PSBhdHRyIGFuZAorICAgICAgICAgICAgICAgICAgICBub3QgKG5vcHJlZml4IGFuZCB3b3JkWzpuKzFdID09IG5vcHJlZml4KSk6CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gIiVzLiVzIiAlIChleHByLCB3b3JkKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHRoaXNvYmplY3QsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzICAjIEluY2x1ZGUgZXZlbiBpZiBhdHRyaWJ1dGUgbm90IHNldAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLl9jYWxsYWJsZV9wb3N0Zml4KHZhbCwgbWF0Y2gpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKG1hdGNoKQorICAgICAgICAgICAgaWYgbWF0Y2hlcyBvciBub3Qgbm9wcmVmaXg6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vcHJlZml4ID09ICdfJzoKKyAgICAgICAgICAgICAgICBub3ByZWZpeCA9ICdfXycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbm9wcmVmaXggPSBOb25lCiAgICAgICAgIG1hdGNoZXMuc29ydCgpCiAgICAgICAgIHJldHVybiBtYXRjaGVzCiAKZGlmZiAtLWdpdCBhL0xpYi9zY2hlZC5weSBiL0xpYi9zY2hlZC5weQppbmRleCBiNDc2NDhkLi5iZDdjMGYxIDEwMDY0NAotLS0gYS9MaWIvc2NoZWQucHkKKysrIGIvTGliL3NjaGVkLnB5CkBAIC00Niw2ICs0NiwxNyBAQAogICAgIGRlZiBfX2d0X18ocywgbyk6IHJldHVybiAocy50aW1lLCBzLnByaW9yaXR5KSA+ICAoby50aW1lLCBvLnByaW9yaXR5KQogICAgIGRlZiBfX2dlX18ocywgbyk6IHJldHVybiAocy50aW1lLCBzLnByaW9yaXR5KSA+PSAoby50aW1lLCBvLnByaW9yaXR5KQogCitFdmVudC50aW1lLl9fZG9jX18gPSAoJycnTnVtZXJpYyB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQordGltZWZ1bmMgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4nJycpCitFdmVudC5wcmlvcml0eS5fX2RvY19fID0gKCcnJ0V2ZW50cyBzY2hlZHVsZWQgZm9yIHRoZSBzYW1lIHRpbWUgd2lsbCBiZSBleGVjdXRlZAoraW4gdGhlIG9yZGVyIG9mIHRoZWlyIHByaW9yaXR5LicnJykKK0V2ZW50LmFjdGlvbi5fX2RvY19fID0gKCcnJ0V4ZWN1dGluZyB0aGUgZXZlbnQgbWVhbnMgZXhlY3V0aW5nCithY3Rpb24oKmFyZ3VtZW50LCAqKmt3YXJncyknJycpCitFdmVudC5hcmd1bWVudC5fX2RvY19fID0gKCcnJ2FyZ3VtZW50IGlzIGEgc2VxdWVuY2UgaG9sZGluZyB0aGUgcG9zaXRpb25hbAorYXJndW1lbnRzIGZvciB0aGUgYWN0aW9uLicnJykKK0V2ZW50Lmt3YXJncy5fX2RvY19fID0gKCcnJ2t3YXJncyBpcyBhIGRpY3Rpb25hcnkgaG9sZGluZyB0aGUga2V5d29yZAorYXJndW1lbnRzIGZvciB0aGUgYWN0aW9uLicnJykKKwogX3NlbnRpbmVsID0gb2JqZWN0KCkKIAogY2xhc3Mgc2NoZWR1bGVyOgpkaWZmIC0tZ2l0IGEvTGliL3NlY3JldHMucHkgYi9MaWIvc2VjcmV0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZhNDUwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NlY3JldHMucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiR2VuZXJhdGUgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIHBzZXVkby1yYW5kb20gbnVtYmVycyBzdWl0YWJsZSBmb3IKK21hbmFnaW5nIHNlY3JldHMgc3VjaCBhcyBhY2NvdW50IGF1dGhlbnRpY2F0aW9uLCB0b2tlbnMsIGFuZCBzaW1pbGFyLgorCitTZWUgUEVQIDUwNiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KK2h0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA1MDYvCisKKyIiIgorCitfX2FsbF9fID0gWydjaG9pY2UnLCAncmFuZGJlbG93JywgJ3JhbmRiaXRzJywgJ1N5c3RlbVJhbmRvbScsCisgICAgICAgICAgICd0b2tlbl9ieXRlcycsICd0b2tlbl9oZXgnLCAndG9rZW5fdXJsc2FmZScsCisgICAgICAgICAgICdjb21wYXJlX2RpZ2VzdCcsCisgICAgICAgICAgIF0KKworCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgYmluYXNjaWkKK2ltcG9ydCBvcworCitmcm9tIGhtYWMgaW1wb3J0IGNvbXBhcmVfZGlnZXN0Citmcm9tIHJhbmRvbSBpbXBvcnQgU3lzdGVtUmFuZG9tCisKK19zeXNyYW5kID0gU3lzdGVtUmFuZG9tKCkKKworcmFuZGJpdHMgPSBfc3lzcmFuZC5nZXRyYW5kYml0cworY2hvaWNlID0gX3N5c3JhbmQuY2hvaWNlCisKK2RlZiByYW5kYmVsb3coZXhjbHVzaXZlX3VwcGVyX2JvdW5kKToKKyAgICAiIiJSZXR1cm4gYSByYW5kb20gaW50IGluIHRoZSByYW5nZSBbMCwgbikuIiIiCisgICAgcmV0dXJuIF9zeXNyYW5kLl9yYW5kYmVsb3coZXhjbHVzaXZlX3VwcGVyX2JvdW5kKQorCitERUZBVUxUX0VOVFJPUFkgPSAzMiAgIyBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0dXJuIGJ5IGRlZmF1bHQKKworZGVmIHRva2VuX2J5dGVzKG5ieXRlcz1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSByYW5kb20gYnl0ZSBzdHJpbmcgY29udGFpbmluZyAqbmJ5dGVzKiBieXRlcy4KKworICAgIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlCisgICAgZGVmYXVsdCBpcyB1c2VkLgorCisgICAgPj4+IHRva2VuX2J5dGVzKDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICBiJ1xceGViclxceDE3RCp0XFx4YWVcXHhkNFxceGUzU1xceGI2XFx4ZTJcXHhlYlAxXFx4OGInCisKKyAgICAiIiIKKyAgICBpZiBuYnl0ZXMgaXMgTm9uZToKKyAgICAgICAgbmJ5dGVzID0gREVGQVVMVF9FTlRST1BZCisgICAgcmV0dXJuIG9zLnVyYW5kb20obmJ5dGVzKQorCitkZWYgdG9rZW5faGV4KG5ieXRlcz1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSByYW5kb20gdGV4dCBzdHJpbmcsIGluIGhleGFkZWNpbWFsLgorCisgICAgVGhlIHN0cmluZyBoYXMgKm5ieXRlcyogcmFuZG9tIGJ5dGVzLCBlYWNoIGJ5dGUgY29udmVydGVkIHRvIHR3bworICAgIGhleCBkaWdpdHMuICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZQorICAgIGRlZmF1bHQgaXMgdXNlZC4KKworICAgID4+PiB0b2tlbl9oZXgoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICdmOWJmNzhiOWExOGNlNmQ0NmEwY2QyYjBiODZkZjlkYScKKworICAgICIiIgorICAgIHJldHVybiBiaW5hc2NpaS5oZXhsaWZ5KHRva2VuX2J5dGVzKG5ieXRlcykpLmRlY29kZSgnYXNjaWknKQorCitkZWYgdG9rZW5fdXJsc2FmZShuYnl0ZXM9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIFVSTC1zYWZlIHRleHQgc3RyaW5nLCBpbiBCYXNlNjQgZW5jb2RpbmcuCisKKyAgICBUaGUgc3RyaW5nIGhhcyAqbmJ5dGVzKiByYW5kb20gYnl0ZXMuICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYAorICAgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMgdXNlZC4KKworICAgID4+PiB0b2tlbl91cmxzYWZlKDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAnRHJtaHplNkVQY3YwZk5fODFCai1uQScKKworICAgICIiIgorICAgIHRvayA9IHRva2VuX2J5dGVzKG5ieXRlcykKKyAgICByZXR1cm4gYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKHRvaykucnN0cmlwKGInPScpLmRlY29kZSgnYXNjaWknKQpkaWZmIC0tZ2l0IGEvTGliL3NodXRpbC5weSBiL0xpYi9zaHV0aWwucHkKaW5kZXggM2Y0YjZiZi4uZjQ3YTc2MyAxMDA2NDQKLS0tIGEvTGliL3NodXRpbC5weQorKysgYi9MaWIvc2h1dGlsLnB5CkBAIC05NzQsNiArOTc0LDkgQEAKIAogICAgIF9fYWxsX18uYXBwZW5kKCdkaXNrX3VzYWdlJykKICAgICBfbnR1cGxlX2Rpc2t1c2FnZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3VzYWdlJywgJ3RvdGFsIHVzZWQgZnJlZScpCisgICAgX250dXBsZV9kaXNrdXNhZ2UudG90YWwuX19kb2NfXyA9ICdUb3RhbCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS51c2VkLl9fZG9jX18gPSAnVXNlZCBzcGFjZSBpbiBieXRlcycKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS5mcmVlLl9fZG9jX18gPSAnRnJlZSBzcGFjZSBpbiBieXRlcycKIAogICAgIGRlZiBkaXNrX3VzYWdlKHBhdGgpOgogICAgICAgICAiIiJSZXR1cm4gZGlzayB1c2FnZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBnaXZlbiBwYXRoLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dCBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZjYyNQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBleGlzdHMgc28gdGhhdCAzcmQgcGFydHkgcGFja2FnZXMgY2FuIGJlIGluc3RhbGxlZAoraGVyZS4gIFJlYWQgdGhlIHNvdXJjZSBmb3Igc2l0ZS5weSBmb3IgbW9yZSBkZXRhaWxzLgpkaWZmIC0tZ2l0IGEvTGliL3NpdGUucHkgYi9MaWIvc2l0ZS5weQppbmRleCAzYThkMWMzLi5iNjYxMjNmIDEwMDY0NAotLS0gYS9MaWIvc2l0ZS5weQorKysgYi9MaWIvc2l0ZS5weQpAQCAtMTMxLDEzICsxMzEsMTMgQEAKIAogCiBkZWYgX2luaXRfcGF0aGluZm8oKToKLSAgICAiIiJSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBzeXMucGF0aCIiIgorICAgICIiIlJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBleGlzdGluZyBmaWxlIHN5c3RlbSBpdGVtcyBmcm9tIHN5cy5wYXRoLiIiIgogICAgIGQgPSBzZXQoKQotICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyKToKLSAgICAgICAgICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChkaXIpCi0gICAgICAgICAgICAgICAgZC5hZGQoZGlyY2FzZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGl0ZW0pOgorICAgICAgICAgICAgICAgIF8sIGl0ZW1jYXNlID0gbWFrZXBhdGgoaXRlbSkKKyAgICAgICAgICAgICAgICBkLmFkZChpdGVtY2FzZSkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgcmV0dXJuIGQKQEAgLTE1MCw5ICsxNTAsOSBAQAogICAgICIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzaXRlZGlyLCBuYW1lKQogICAgIHRyeToKICAgICAgICAgZiA9IG9wZW4oZnVsbG5hbWUsICJyIikKQEAgLTE5MCw5ICsxOTAsOSBAQAogICAgICdzaXRlZGlyJyIiIgogICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CiAgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQotICAgICAgICByZXNldCA9IDEKKyAgICAgICAgcmVzZXQgPSBUcnVlCiAgICAgZWxzZToKLSAgICAgICAgcmVzZXQgPSAwCisgICAgICAgIHJlc2V0ID0gRmFsc2UKICAgICBzaXRlZGlyLCBzaXRlZGlyY2FzZSA9IG1ha2VwYXRoKHNpdGVkaXIpCiAgICAgaWYgbm90IHNpdGVkaXJjYXNlIGluIGtub3duX3BhdGhzOgogICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2l0ZWRpcikgICAgICAgICMgQWRkIHBhdGggY29tcG9uZW50CkBAIC0zMDQsNyArMzA0LDcgQEAKIAogICAgICAgICBpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uJWQuJWQiICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQocHJlZml4KQpAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgICAgICBpZiBmcmFtZXdvcms6CiAgICAgICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiL0xpYnJhcnkiLCBmcmFtZXdvcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwgInNpdGUtcGFja2FnZXMiKSkKICAgICByZXR1cm4gc2l0ZXBhY2thZ2VzCiAKIGRlZiBhZGRzaXRlcGFja2FnZXMoa25vd25fcGF0aHMsIHByZWZpeGVzPU5vbmUpOgpAQCAtNTA0LDkgKzUwNCwxMyBAQAogZGVmIGV4ZWNzaXRlY3VzdG9taXplKCk6CiAgICAgIiIiUnVuIGN1c3RvbSBzaXRlIHNwZWNpZmljIGNvZGUsIGlmIGF2YWlsYWJsZS4iIiIKICAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBzaXRlY3VzdG9taXplCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzaXRlY3VzdG9taXplCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMubmFtZSA9PSAnc2l0ZWN1c3RvbWl6ZSc6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQogICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVkVSQk9TRSIpOgogICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soKnN5cy5leGNfaW5mbygpKQpAQCAtNTIwLDkgKzUyNCwxMyBAQAogZGVmIGV4ZWN1c2VyY3VzdG9taXplKCk6CiAgICAgIiIiUnVuIGN1c3RvbSB1c2VyIHNwZWNpZmljIGNvZGUsIGlmIGF2YWlsYWJsZS4iIiIKICAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB1c2VyY3VzdG9taXplCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB1c2VyY3VzdG9taXplCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMubmFtZSA9PSAndXNlcmN1c3RvbWl6ZSc6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQogICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiUFlUSE9OVkVSQk9TRSIpOgogICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soKnN5cy5leGNfaW5mbygpKQpkaWZmIC0tZ2l0IGEvTGliL3NuZGhkci5weSBiL0xpYi9zbmRoZHIucHkKaW5kZXggZTU5MDFlYy4uN2VjYWZiNCAxMDA2NDQKLS0tIGEvTGliL3NuZGhkci5weQorKysgYi9MaWIvc25kaGRyLnB5CkBAIC0zNyw2ICszNywxOCBAQAogU25kSGVhZGVycyA9IG5hbWVkdHVwbGUoJ1NuZEhlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGV0eXBlIGZyYW1lcmF0ZSBuY2hhbm5lbHMgbmZyYW1lcyBzYW1wd2lkdGgnKQogCitTbmRIZWFkZXJzLmZpbGV0eXBlLl9fZG9jX18gPSAoIiIiVGhlIHZhbHVlIGZvciB0eXBlIGluZGljYXRlcyB0aGUgZGF0YSB0eXBlCithbmQgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgJ2FpZmMnLCAnYWlmZicsICdhdScsJ2hjb20nLAorJ3NuZHInLCAnc25kdCcsICd2b2MnLCAnd2F2JywgJzhzdngnLCAnc2InLCAndWInLCBvciAndWwnLiIiIikKK1NuZEhlYWRlcnMuZnJhbWVyYXRlLl9fZG9jX18gPSAoIiIiVGhlIHNhbXBsaW5nX3JhdGUgd2lsbCBiZSBlaXRoZXIgdGhlIGFjdHVhbAordmFsdWUgb3IgMCBpZiB1bmtub3duIG9yIGRpZmZpY3VsdCB0byBkZWNvZGUuIiIiKQorU25kSGVhZGVycy5uY2hhbm5lbHMuX19kb2NfXyA9ICgiIiJUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIDAgaWYgaXQgY2Fubm90IGJlCitkZXRlcm1pbmVkIG9yIGlmIHRoZSB2YWx1ZSBpcyBkaWZmaWN1bHQgdG8gZGVjb2RlLiIiIikKK1NuZEhlYWRlcnMubmZyYW1lcy5fX2RvY19fID0gKCIiIlRoZSB2YWx1ZSBmb3IgZnJhbWVzIHdpbGwgYmUgZWl0aGVyIHRoZSBudW1iZXIKK29mIGZyYW1lcyBvciAtMS4iIiIpCitTbmRIZWFkZXJzLnNhbXB3aWR0aC5fX2RvY19fID0gKCIiIkVpdGhlciB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBvcgorJ0EnIGZvciBBLUxBVyBvciAnVScgZm9yIHUtTEFXLiIiIikKKwogZGVmIHdoYXQoZmlsZW5hbWUpOgogICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgc291bmQgZmlsZS4iIiIKICAgICByZXMgPSB3aGF0aGRyKGZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3NvY2tldHNlcnZlci5weSBiL0xpYi9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggODgwODgxMy4uNzBmZGQ2YyAxMDA2NDQKLS0tIGEvTGliL3NvY2tldHNlcnZlci5weQorKysgYi9MaWIvc29ja2V0c2VydmVyLnB5CkBAIC0xMjcsNiArMTI3LDcgQEAKIGltcG9ydCBzZWxlY3RvcnMKIGltcG9ydCBvcwogaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtMzExLDkgKzMxMiwxMiBAQAogICAgICAgICBpZiBzZWxmLnZlcmlmeV9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCiAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQogCkBAIC0zNjcsMTIgKzM3MSwxOCBAQAogICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBwcmludCBhIHRyYWNlYmFjayBhbmQgY29udGludWUuCiAKICAgICAgICAgIiIiCi0gICAgICAgIHByaW50KCctJyo0MCkKLSAgICAgICAgcHJpbnQoJ0V4Y2VwdGlvbiBoYXBwZW5lZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiByZXF1ZXN0IGZyb20nLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjbGllbnRfYWRkcmVzcykKKyAgICAgICAgcHJpbnQoJy0nKjQwLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdFeGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBmcm9tJywKKyAgICAgICAgICAgIGNsaWVudF9hZGRyZXNzLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKLSAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpICMgWFhYIEJ1dCB0aGlzIGdvZXMgdG8gc3RkZXJyIQotICAgICAgICBwcmludCgnLScqNDApCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICBwcmludCgnLScqNDAsIGZpbGU9c3lzLnN0ZGVycikKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCiAKIAogY2xhc3MgVENQU2VydmVyKEJhc2VTZXJ2ZXIpOgpAQCAtNTk2LDE2ICs2MDYsMTcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgQ2hpbGQgcHJvY2Vzcy4KICAgICAgICAgICAgICMgVGhpcyBtdXN0IG5ldmVyIHJldHVybiwgaGVuY2Ugb3MuX2V4aXQoKSEKKyAgICAgICAgICAgIHN0YXR1cyA9IDEKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gMAorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoc3RhdHVzKQogCiAKIGNsYXNzIFRocmVhZGluZ01peEluOgpAQCAtNjIzLDkgKzYzNCw5IEBACiAgICAgICAgICIiIgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAKICAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKZGlmZiAtLWdpdCBhL0xpYi9zcmVfY29tcGlsZS5weSBiL0xpYi9zcmVfY29tcGlsZS5weQppbmRleCA1MDJiMDYxLi40ZWRiMDNmIDEwMDY0NAotLS0gYS9MaWIvc3JlX2NvbXBpbGUucHkKKysrIGIvTGliL3NyZV9jb21waWxlLnB5CkBAIC00MDksNTcgKzQwOSwzOSBAQAogICAgICAgICAgICAgdGFibGVbaV0gPSBpZHggKyAxCiAgICAgcmV0dXJuIHRhYmxlCiAKLWRlZiBfY29tcGlsZV9pbmZvKGNvZGUsIHBhdHRlcm4sIGZsYWdzKToKLSAgICAjIGludGVybmFsOiBjb21waWxlIGFuIGluZm8gYmxvY2suICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLAotICAgICMgdGhpcyBjb250YWlucyBtaW4vbWF4IHBhdHRlcm4gd2lkdGgsIGFuZCBhbiBvcHRpb25hbCBsaXRlcmFsCi0gICAgIyBwcmVmaXggb3IgYSBjaGFyYWN0ZXIgbWFwCi0gICAgbG8sIGhpID0gcGF0dGVybi5nZXR3aWR0aCgpCi0gICAgaWYgaGkgPiBNQVhDT0RFOgotICAgICAgICBoaSA9IE1BWENPREUKLSAgICBpZiBsbyA9PSAwOgotICAgICAgICBjb2RlLmV4dGVuZChbSU5GTywgNCwgMCwgbG8sIGhpXSkKLSAgICAgICAgcmV0dXJuCi0gICAgIyBsb29rIGZvciBhIGxpdGVyYWwgcHJlZml4CitkZWYgX2dldF9saXRlcmFsX3ByZWZpeChwYXR0ZXJuKToKKyAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4CiAgICAgcHJlZml4ID0gW10KICAgICBwcmVmaXhhcHBlbmQgPSBwcmVmaXguYXBwZW5kCi0gICAgcHJlZml4X3NraXAgPSAwCisgICAgcHJlZml4X3NraXAgPSBOb25lCisgICAgZ290X2FsbCA9IFRydWUKKyAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm4uZGF0YToKKyAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKKyAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOOgorICAgICAgICAgICAgcHJlZml4MSwgcHJlZml4X3NraXAxLCBnb3RfYWxsID0gX2dldF9saXRlcmFsX3ByZWZpeChhdlsxXSkKKyAgICAgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgYXZbMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gbGVuKHByZWZpeCkKKyAgICAgICAgICAgICAgICBlbGlmIHByZWZpeF9za2lwMSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBsZW4ocHJlZml4KSArIHByZWZpeF9za2lwMQorICAgICAgICAgICAgcHJlZml4LmV4dGVuZChwcmVmaXgxKQorICAgICAgICAgICAgaWYgbm90IGdvdF9hbGw6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdvdF9hbGwgPSBGYWxzZQorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gcHJlZml4LCBwcmVmaXhfc2tpcCwgZ290X2FsbAorCitkZWYgX2dldF9jaGFyc2V0X3ByZWZpeChwYXR0ZXJuKToKICAgICBjaGFyc2V0ID0gW10gIyBub3QgdXNlZAogICAgIGNoYXJzZXRhcHBlbmQgPSBjaGFyc2V0LmFwcGVuZAotICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19JR05PUkVDQVNFKToKLSAgICAgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAotICAgICAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm4uZGF0YToKKyAgICBpZiBwYXR0ZXJuLmRhdGE6CisgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQorICAgICAgICBpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBhdlsxXToKKyAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCiAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwOgotICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IHByZWZpeF9za2lwICsgMQotICAgICAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKLSAgICAgICAgICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgbGVuKGF2WzFdKSA9PSAxOgotICAgICAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCi0gICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICMgaWYgbm8gcHJlZml4LCBsb29rIGZvciBjaGFyc2V0IHByZWZpeAotICAgICAgICBpZiBub3QgcHJlZml4IGFuZCBwYXR0ZXJuLmRhdGE6Ci0gICAgICAgICAgICBvcCwgYXYgPSBwYXR0ZXJuLmRhdGFbMF0KLSAgICAgICAgICAgIGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGF2WzFdOgotICAgICAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCi0gICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldGFwcGVuZCgob3AsIGF2KSkKLSAgICAgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKLSAgICAgICAgICAgICAgICAgICAgYyA9IFtdCi0gICAgICAgICAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZAotICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBhdlsxXToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBvcCwgYXYgPSBwWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlbmQoKG9wLCBhdikpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICAgICAgICAgIGNoYXJzZXRhcHBlbmQoKG9wLCBhdikpCiAgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKICAgICAgICAgICAgICAgICBjID0gW10KICAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKQEAgLTQ3Myw4ICs0NTUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKLSAgICAgICAgICAgIGVsaWYgb3AgaXMgSU46Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IGF2CisgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgorICAgICAgICAgICAgYyA9IFtdCisgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKKyAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgorICAgICAgICAgICAgICAgIGlmIG5vdCBwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgIGVsaWYgb3AgaXMgSU46CisgICAgICAgICAgICBjaGFyc2V0ID0gYXYKKyAgICByZXR1cm4gY2hhcnNldAorCitkZWYgX2NvbXBpbGVfaW5mbyhjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CisgICAgIyBpbnRlcm5hbDogY29tcGlsZSBhbiBpbmZvIGJsb2NrLiAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwKKyAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAorICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAorICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQorICAgIGlmIGhpID4gTUFYQ09ERToKKyAgICAgICAgaGkgPSBNQVhDT0RFCisgICAgaWYgbG8gPT0gMDoKKyAgICAgICAgY29kZS5leHRlbmQoW0lORk8sIDQsIDAsIGxvLCBoaV0pCisgICAgICAgIHJldHVybgorICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAorICAgIHByZWZpeCA9IFtdCisgICAgcHJlZml4X3NraXAgPSAwCisgICAgY2hhcnNldCA9IFtdICMgbm90IHVzZWQKKyAgICBpZiBub3QgKGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRSk6CisgICAgICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKKyAgICAgICAgcHJlZml4LCBwcmVmaXhfc2tpcCwgZ290X2FsbCA9IF9nZXRfbGl0ZXJhbF9wcmVmaXgocGF0dGVybikKKyAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4CisgICAgICAgIGlmIG5vdCBwcmVmaXg6CisgICAgICAgICAgICBjaGFyc2V0ID0gX2dldF9jaGFyc2V0X3ByZWZpeChwYXR0ZXJuKQogIyMgICAgIGlmIHByZWZpeDoKICMjICAgICAgICAgcHJpbnQoIioqKiBQUkVGSVgiLCBwcmVmaXgsIHByZWZpeF9za2lwKQogIyMgICAgIGlmIGNoYXJzZXQ6CkBAIC00ODcsNyArNTA0LDcgQEAKICAgICBtYXNrID0gMAogICAgIGlmIHByZWZpeDoKICAgICAgICAgbWFzayA9IFNSRV9JTkZPX1BSRUZJWAotICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSBwcmVmaXhfc2tpcCA9PSBsZW4ocGF0dGVybi5kYXRhKToKKyAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZSBhbmQgZ290X2FsbDoKICAgICAgICAgICAgIG1hc2sgPSBtYXNrIHwgU1JFX0lORk9fTElURVJBTAogICAgIGVsaWYgY2hhcnNldDoKICAgICAgICAgbWFzayA9IG1hc2sgfCBTUkVfSU5GT19DSEFSU0VUCkBAIC01MDIsNiArNTE5LDggQEAKICAgICAjIGFkZCBsaXRlcmFsIHByZWZpeAogICAgIGlmIHByZWZpeDoKICAgICAgICAgZW1pdChsZW4ocHJlZml4KSkgIyBsZW5ndGgKKyAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZToKKyAgICAgICAgICAgIHByZWZpeF9za2lwID0gIGxlbihwcmVmaXgpCiAgICAgICAgIGVtaXQocHJlZml4X3NraXApICMgc2tpcAogICAgICAgICBjb2RlLmV4dGVuZChwcmVmaXgpCiAgICAgICAgICMgZ2VuZXJhdGUgb3ZlcmxhcCB0YWJsZQpkaWZmIC0tZ2l0IGEvTGliL3NzbC5weSBiL0xpYi9zc2wucHkKaW5kZXggNjVhZDM4Zi4uNjhkYjc0OCAxMDA2NDQKLS0tIGEvTGliL3NzbC5weQorKysgYi9MaWIvc3NsLnB5CkBAIC04ODYsNyArODg2LDYgQEAKICAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IGFtb3VudCk6CiAgICAgICAgICAgICAgICAgdiA9IHNlbGYuc2VuZChkYXRhW2NvdW50Ol0pCiAgICAgICAgICAgICAgICAgY291bnQgKz0gdgotICAgICAgICAgICAgcmV0dXJuIGFtb3VudAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5zZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzKQogCmRpZmYgLS1naXQgYS9MaWIvc3RyaW5nLnB5IGIvTGliL3N0cmluZy5weQppbmRleCA2MmU4ZjJmLi4xYWRkNDRiIDEwMDY0NAotLS0gYS9MaWIvc3RyaW5nLnB5CisrKyBiL0xpYi9zdHJpbmcucHkKQEAgLTExMiwxMCArMTEyLDcgQEAKICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG1vc3QgY29tbW9uIHBhdGggZmlyc3QuCiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KLSAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKLSAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKHZhbCwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihtYXBwaW5nW25hbWVkXSkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgpAQCAtMTQyLDkgKzEzOSw3IEBACiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyCi0gICAgICAgICAgICAgICAgICAgICMgd2lsbCBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1tuYW1lZF0sKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG1hcHBpbmdbbmFtZWRdKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vLmdyb3VwKCkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc3VicHJvY2Vzcy5weSBiL0xpYi9zdWJwcm9jZXNzLnB5CmluZGV4IGQxMzI0YjguLmU5ODAzNDkgMTAwNjQ0Ci0tLSBhL0xpYi9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9zdWJwcm9jZXNzLnB5CkBAIC00NzEsNyArNDcxLDggQEAKICAgICBfX2FsbF9fLmV4dGVuZChbIkNSRUFURV9ORVdfQ09OU09MRSIsICJDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAiLAogICAgICAgICAgICAgICAgICAgICAiU1REX0lOUFVUX0hBTkRMRSIsICJTVERfT1VUUFVUX0hBTkRMRSIsCiAgICAgICAgICAgICAgICAgICAgICJTVERfRVJST1JfSEFORExFIiwgIlNXX0hJREUiLAotICAgICAgICAgICAgICAgICAgICAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciXSkKKyAgICAgICAgICAgICAgICAgICAgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgIlNUQVJURl9VU0VTSE9XV0lORE9XIiwKKyAgICAgICAgICAgICAgICAgICAgIlNUQVJUVVBJTkZPIl0pCiAKICAgICBjbGFzcyBIYW5kbGUoaW50KToKICAgICAgICAgY2xvc2VkID0gRmFsc2UKQEAgLTUyMCw2ICs1MjEsMTYgQEAKICMgYnV0IGl0J3MgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBpbXBvcnRlZCB3aGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRob3V0CiAjIHRocmVhZHMuCiAKK2RlZiBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgb3B0aW1pemF0aW9uIHNldHRpbmdzIGluIHN5cy5mbGFncy4iIiIKKyAgICBhcmdzID0gW10KKyAgICB2YWx1ZSA9IHN5cy5mbGFncy5vcHRpbWl6ZQorICAgIGlmIHZhbHVlID4gMDoKKyAgICAgICAgYXJncy5hcHBlbmQoJy0nICsgJ08nICogdmFsdWUpCisgICAgcmV0dXJuIGFyZ3MKKworCiBkZWYgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgogICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgpAQCAtNTI3LDcgKzUzOCw2IEBACiAgICAgICAgICdkZWJ1Zyc6ICdkJywKICAgICAgICAgIyAnaW5zcGVjdCc6ICdpJywKICAgICAgICAgIyAnaW50ZXJhY3RpdmUnOiAnaScsCi0gICAgICAgICdvcHRpbWl6ZSc6ICdPJywKICAgICAgICAgJ2RvbnRfd3JpdGVfYnl0ZWNvZGUnOiAnQicsCiAgICAgICAgICdub191c2VyX3NpdGUnOiAncycsCiAgICAgICAgICdub19zaXRlJzogJ1MnLApAQCAtNTM1LDggKzU0NSw5IEBACiAgICAgICAgICd2ZXJib3NlJzogJ3YnLAogICAgICAgICAnYnl0ZXNfd2FybmluZyc6ICdiJywKICAgICAgICAgJ3F1aWV0JzogJ3EnLAorICAgICAgICAjIC1PIGlzIGhhbmRsZWQgaW4gX29wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCiAgICAgfQotICAgIGFyZ3MgPSBbXQorICAgIGFyZ3MgPSBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKICAgICBmb3IgZmxhZywgb3B0IGluIGZsYWdfb3B0X21hcC5pdGVtcygpOgogICAgICAgICB2ID0gZ2V0YXR0cihzeXMuZmxhZ3MsIGZsYWcpCiAgICAgICAgIGlmIHYgPiAwOgpkaWZmIC0tZ2l0IGEvTGliL3N5c2NvbmZpZy5weSBiL0xpYi9zeXNjb25maWcucHkKaW5kZXggOWMzNGJlMC4uZjE4YjFiYyAxMDA2NDQKLS0tIGEvTGliL3N5c2NvbmZpZy5weQorKysgYi9MaWIvc3lzY29uZmlnLnB5CkBAIC04Niw4ICs4Niw4IEBACiAgIyBGSVhNRSBkb24ndCByZWx5IG9uIHN5cy52ZXJzaW9uIGhlcmUsIGl0cyBmb3JtYXQgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsCiAgIyBvZiBDUHl0aG9uLCB1c2Ugc3lzLnZlcnNpb25faW5mbyBvciBzeXMuaGV4dmVyc2lvbgogX1BZX1ZFUlNJT04gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCi1fUFlfVkVSU0lPTl9TSE9SVCA9IHN5cy52ZXJzaW9uWzozXQotX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQorX1BZX1ZFUlNJT05fU0hPUlQgPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KK19QWV9WRVJTSU9OX1NIT1JUX05PX0RPVCA9ICclZCVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiBfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQogX0JBU0VfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMuYmFzZV9wcmVmaXgpCiBfRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKQEAgLTM4Niw3ICszODYsNyBAQAogICAgICAgICBtb2R1bGUuYnVpbGRfdGltZV92YXJzID0gdmFycwogICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG1vZHVsZQogCi0gICAgcHlidWlsZGRpciA9ICdidWlsZC9saWIuJXMtJXMnICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvbls6M10pCisgICAgcHlidWlsZGRpciA9ICdidWlsZC9saWIuJXMtJXMnICUgKGdldF9wbGF0Zm9ybSgpLCBfUFlfVkVSU0lPTl9TSE9SVCkKICAgICBpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKICAgICAgICAgcHlidWlsZGRpciArPSAnLXB5ZGVidWcnCiAgICAgb3MubWFrZWRpcnMocHlidWlsZGRpciwgZXhpc3Rfb2s9VHJ1ZSkKQEAgLTUxOCw3ICs1MTgsNyBAQAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2V4ZWNfcHJlZml4J10gPSBfRVhFQ19QUkVGSVgKICAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uJ10gPSBfUFlfVkVSU0lPTgogICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fc2hvcnQnXSA9IF9QWV9WRVJTSU9OX1NIT1JUCi0gICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9ub2RvdCddID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQorICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2luc3RhbGxlZF9iYXNlJ10gPSBfQkFTRV9QUkVGSVgKICAgICAgICAgX0NPTkZJR19WQVJTWydiYXNlJ10gPSBfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1snaW5zdGFsbGVkX3BsYXRiYXNlJ10gPSBfQkFTRV9FWEVDX1BSRUZJWApkaWZmIC0tZ2l0IGEvTGliL3RhcmZpbGUucHkgYi9MaWIvdGFyZmlsZS5weQppbmRleCA1MjM2MjBlLi5hZDBmNWMzIDEwMDc1NQotLS0gYS9MaWIvdGFyZmlsZS5weQorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtNjQsNyArNjQsMTAgQEAKICAgICBwYXNzCiAKICMgZnJvbSB0YXJmaWxlIGltcG9ydCAqCi1fX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCitfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciIsICJSZWFkRXJyb3IiLAorICAgICAgICAgICAiQ29tcHJlc3Npb25FcnJvciIsICJTdHJlYW1FcnJvciIsICJFeHRyYWN0RXJyb3IiLCAiSGVhZGVyRXJyb3IiLAorICAgICAgICAgICAiRU5DT0RJTkciLCAiVVNUQVJfRk9STUFUIiwgIkdOVV9GT1JNQVQiLCAiUEFYX0ZPUk1BVCIsCisgICAgICAgICAgICJERUZBVUxUX0ZPUk1BVCIsICJvcGVuIl0KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0YXIgY29uc3RhbnRzCkBAIC0yMzczLDkgKzIzNzYsMzIgQEAKICAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6Ci0gICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQorICAgICAgICAgICAgeWllbGQgZnJvbSBzZWxmLm1lbWJlcnMKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgWWllbGQgaXRlbXMgdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCisgICAgICAgICMgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgorICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKKyAgICAgICAgIyB3aGljaCB3aWxsIGhhdmUgYWxyZWFkeSBleGhhdXN0ZWQgdGhlIG5leHQoKSBtZXRob2QuCisgICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgaW5kZXggPCBsZW4oc2VsZi5tZW1iZXJzKToKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5tZW1iZXJzW2luZGV4XQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5fbG9hZGVkOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KIAogICAgIGRlZiBfZGJnKHNlbGYsIGxldmVsLCBtc2cpOgogICAgICAgICAiIiJXcml0ZSBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCkBAIC0yMzk2LDQ1ICsyNDIyLDYgQEAKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKLSMgY2xhc3MgVGFyRmlsZQotCi1jbGFzcyBUYXJJdGVyOgotICAgICIiIkl0ZXJhdG9yIENsYXNzLgotCi0gICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgotICAgICAgICAgICBzdWl0ZS4uLgotICAgICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKLSAgICAgICAgc2VsZi5pbmRleCA9IDAKLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBpdGVyYXRvciBvYmplY3QuCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IGl0ZW0gdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCi0gICAgICAgICAgIFdoZW4gYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQsIHNldCBUYXJGaWxlIGFzIF9sb2FkZWQuCi0gICAgICAgICIiIgotICAgICAgICAjIEZpeCBmb3IgU0YgIzExMDA0Mjk6IFVuZGVyIHJhcmUgY2lyY3Vtc3RhbmNlcyBpdCBjYW4KLSAgICAgICAgIyBoYXBwZW4gdGhhdCBnZXRtZW1iZXJzKCkgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24sCi0gICAgICAgICMgd2hpY2ggd2lsbCBjYXVzZSBUYXJJdGVyIHRvIHN0b3AgcHJlbWF0dXJlbHkuCi0KLSAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwIGFuZCBzZWxmLnRhcmZpbGUuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICBlbGlmIHNlbGYuaW5kZXggPCBsZW4oc2VsZi50YXJmaWxlLm1lbWJlcnMpOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCi0gICAgICAgIGVsaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKLSAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgotICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgc2VsZi5pbmRleCArPSAxCi0gICAgICAgIHJldHVybiB0YXJpbmZvCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBleHBvcnRlZCBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL0xpYi90ZWxuZXRsaWIucHkgYi9MaWIvdGVsbmV0bGliLnB5CmluZGV4IDcyZGFiYzcuLmIwODYzYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZWxuZXRsaWIucHkKKysrIGIvTGliL3RlbG5ldGxpYi5weQpAQCAtNjM3LDYgKzYzNywxMiBAQAogICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKICAgICAgICAgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkKIAorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCiAKIGRlZiB0ZXN0KCk6CiAgICAgIiIiVGVzdCBwcm9ncmFtIGZvciB0ZWxuZXRsaWIuCkBAIC02NjAsMTEgKzY2NiwxMCBAQAogICAgICAgICAgICAgcG9ydCA9IGludChwb3J0c3RyKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShwb3J0c3RyLCAndGNwJykKLSAgICB0biA9IFRlbG5ldCgpCi0gICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKLSAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQotICAgIHRuLmludGVyYWN0KCkKLSAgICB0bi5jbG9zZSgpCisgICAgd2l0aCBUZWxuZXQoKSBhcyB0bjoKKyAgICAgICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKKyAgICAgICAgdG4ub3Blbihob3N0LCBwb3J0LCB0aW1lb3V0PTAuNSkKKyAgICAgICAgdG4uaW50ZXJhY3QoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3RlbXBmaWxlLnB5IGIvTGliL3RlbXBmaWxlLnB5CmluZGV4IGFkNjg3YjkuLjYxNDYyMzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVtcGZpbGUucHkKQEAgLTc5Nyw3ICs3OTcsNiBAQAogICAgICAgICBfc2h1dGlsLnJtdHJlZShuYW1lKQogICAgICAgICBfd2FybmluZ3Mud2Fybih3YXJuX21lc3NhZ2UsIFJlc291cmNlV2FybmluZykKIAotCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjx7fSB7IXJ9PiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L19fbWFpbl9fLnB5IGIvTGliL3Rlc3QvX19tYWluX18ucHkKaW5kZXggZDVmYmUxNS4uMTlhNmIyYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvX19tYWluX18ucHkKKysrIGIvTGliL3Rlc3QvX19tYWluX18ucHkKQEAgLTEsMyArMSwyIEBACi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci0KLXJlZ3J0ZXN0Lm1haW5faW5fdGVtcF9jd2QoKQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0IGltcG9ydCBtYWluCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weSBiL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQppbmRleCAxMWE2MzEwLi4xNjQwN2RiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKKysrIGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CkBAIC0xNjY4LDYgKzE2NjgsMTAgQEAKIGRlZiBtdWwoeCwgeSk6CiAgICAgcmV0dXJuIHgqeQogCitkZWYgcmFpc2VfbGFyZ2VfdmFsdWVycm9yKHdhaXQpOgorICAgIHRpbWUuc2xlZXAod2FpdCkKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJ4IiAqIDEwMjQqKjIpCisKIGNsYXNzIFNheVdoZW5FcnJvcihWYWx1ZUVycm9yKTogcGFzcwogCiBkZWYgZXhjZXB0aW9uX3Rocm93aW5nX2dlbmVyYXRvcih0b3RhbCwgd2hlbik6CkBAIC0xOTEwLDYgKzE5MTQsMjYgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKICAgICAgICAgICAgICAgICBwLmFwcGx5KHNlbGYuX3Rlc3Rfd3JhcHBlZF9leGNlcHRpb24pCiAKKyAgICBkZWYgdGVzdF9tYXBfbm9fZmFpbGZhc3Qoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIzOTkyOiB0aGUgZmFpbC1mYXN0IGJlaGF2aW91ciB3aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQKKyAgICAgICAgIyBkdXJpbmcgbWFwKCkgd291bGQgbWFrZSBQb29sLmpvaW4oKSBkZWFkbG9jaywgYmVjYXVzZSBhIHdvcmtlcgorICAgICAgICAjIHByb2Nlc3Mgd291bGQgZmlsbCB0aGUgcmVzdWx0IHF1ZXVlIChhZnRlciB0aGUgcmVzdWx0IGhhbmRsZXIgdGhyZWFkCisgICAgICAgICMgdGVybWluYXRlZCwgaGVuY2Ugbm90IGRyYWluaW5nIGl0IGFueW1vcmUpLgorCisgICAgICAgIHRfc3RhcnQgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICB3aXRoIHNlbGYuUG9vbCgyKSBhcyBwOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcC5tYXAocmFpc2VfbGFyZ2VfdmFsdWVycm9yLCBbMCwgMV0pCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICAgICAgICAgIHAuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBwLmpvaW4oKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB3ZSBpbmRlZWQgd2FpdGVkIGZvciBhbGwgam9icworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIodGltZS50aW1lKCkgLSB0X3N0YXJ0LCAwLjkpCisKIAogZGVmIHJhaXNpbmcoKToKICAgICByYWlzZSBLZXlFcnJvcigia2V5IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2F1dG90ZXN0LnB5IGIvTGliL3Rlc3QvYXV0b3Rlc3QucHkKaW5kZXggNDFjMjA4OC4uZmE4NWNjMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvYXV0b3Rlc3QucHkKKysrIGIvTGliL3Rlc3QvYXV0b3Rlc3QucHkKQEAgLTEsNiArMSw1IEBACiAjIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcnVubmluZyByZWdydGVzdC5weSBmcm9tIHRoZSBjbWRsaW5lLgogIyBJdCBjYW4gYmUgZXNwZWNpYWxseSBoYW5keSBpZiB5b3UncmUgaW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwsIGUuZy4sCiAjIGZyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QuCi0KLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLXJlZ3J0ZXN0Lm1haW4oKQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0IGltcG9ydCBtYWluCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wIGIvTGliL3Rlc3QvY2FwYXRoLzBlNDAxNWI5LjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDI1OWIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY2FwYXRoLzBlNDAxNWI5LjAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUNsVENDQWY2Z0F3SUJBZ0lKQUtHVTk1d0tSOHBUTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlYKLUJBWVRBbGhaTVJjd0ZRWURWUVFIREE1RFlYTjBiR1VnUVc1MGFISmhlREVqTUNFR0ExVUVDZ3dhVUhsMGFHOXUKLUlGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhJekFoQmdOVkJBTU1Hbk5sYkdZdGMybG5ibVZrTG5CNWRHaHYKLWJuUmxjM1F1Ym1WME1CNFhEVEUwTVRFd01qRTRNRGt5T1ZvWERUSTBNVEF6TURFNE1Ea3lPVm93Y0RFTE1Ba0cKLUExVUVCaE1DV0ZreEZ6QVZCZ05WQkFjTURrTmhjM1JzWlNCQmJuUm9jbUY0TVNNd0lRWURWUVFLREJwUWVYUm8KLWIyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVqTUNFR0ExVUVBd3dhYzJWc1ppMXphV2R1WldRdWNIbDAKLWFHOXVkR1Z6ZEM1dVpYUXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTkRYUVhXOXRqeVoKLVh0MEl2MnRMTDEramlucjR3R2czNmlvTERMRmtNZisyWTFHTDB2MEJuS1lHNE4xT0tsQVUxNUxYR2VHZXI4dm0KLVN2L3lJdm1kckVMdmhBYmJvM3c0YTlUTVlRQTRYa0lWTGR2dTNtdk5PQWV0KzhQTUp4bjI2ZGJEaEc4MDlBTHYKLUVIWTU3bFFzQlMzRzU5Ulp5QlBWcUFxbUltV05KblZ6QWdNQkFBR2pOekExTUNVR0ExVWRFUVFlTUJ5Q0duTmwKLWJHWXRjMmxuYm1Wa0xuQjVkR2h2Ym5SbGMzUXVibVYwTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y04KLUFRRUZCUUFEZ1lFQUl1ekFoZ01vdUpwTmRmM1VSQ0hJaW5leW9TdDZXSy85K2V5VWNqbEtPckRvWE5aYUQ3MmgKLVRYTWVLWW9Xdkp5VmNTTEtMOGNrUHREb2JnUDJPVHQwVWt5QWFqMG4rWkhhcXExbEgyeVZmR1VBMUlMSnY1MTUKLUM4QnFidlZadXFtM2k3eWdtdzNicUUvbFlNZ09yWXRYWG5xT3J6Nm52c0U2WWM5VjlyRmZsT009Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMCBiL0xpYi90ZXN0L2NhcGF0aC9iMTkzMDIxOC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMApAQCAtMCwwICsxLDIxIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURiVENDQWxXZ0F3SUJBZ0lKQUxDU1pMSHkyaUhRTUEwR0NTcUdTSWIzRFFFQkJRVUFNRTB4Q3pBSkJnTlYKK0JBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmlCRFFURVcKK01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakFlRncweE16QXhNRFF4T1RRM01EZGFGdzB5TXpBeE1ESXgKK09UUTNNRGRhTUUweEN6QUpCZ05WQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWcKK1JtOTFibVJoZEdsdmJpQkRRVEVXTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2ZlNmVNTW53QzJvZjByVzViU2I4emd2b2E1SUY3c0EzcFYKK3ErcWs2ZmxKaGRKbTFlM0hldXBXamkyUDUwTGlZaWlwbjlZYmp1dTF0SnlmRkt2ZjVwU0xkaDArYlNSaDdReS8KK0FJcGhETjljeURaekZnRE5SN3B0cEtSMGlJTWpDaG44Q2FjOFNrdlQ1eDB0NU9wTVZDSHpKdHVKTnhqVUFydEEKK01sK2sveTBjOTlTNzdJN1BYSUtzNW53SWJFaUZZUWQvSmVCYzRMdzBYK0M1QkVkMXlFY0xqYnpXeUdoZk00TmkKKzBpQkVOYkd0Z1JxS3pidzFzRnlMUjlZWTZad1lsOHdCUENuTTZCN2s1TUc0M3VmQ0VSaUhXcE0wMktZbDl4UngKKzYrUWhvdElQTGk3VVlnQTEwOWJ2WEdCTFRLa1U0dDBWV0VZM015YTM1eTVkN1VMa3hVMENBd0VBQWFOUU1FNHcKK0hRWURWUjBPQkJZRUZMemRZdGwyMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQjhHQTFVZEl3UVlNQmFBRkx6ZFl0bDIKKzJodlNWR3ZQNEdhYkhoNTdWZ3dMTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKK0FIMEs5Y3VOMDEyOW1ZNzRLdys2NjhMWnBpZFBMbnN2RG1UWUhEVlFUdTc4a0xtTmJhakZ4Z2F3ci9NdHZ6dTQKK1FnZmRHSDF0bFZSWGhSaGdSeS9yZUJ2NTZCZjlXZzJIRnlpc1RHcm12Q24wOUZWd0tVTGVoZXFyYkNNR1pEQjEKK0FvNVR2RjRCTXpmTUhzMjRwUDNLNUY5bE80TWNodkZWQXFBNmo5dVJ0MEFVdE9lTjB1NXp1dVBsTkMyOGxHOU8KK0pBYjNYNHNPcDQ1cjNsNTE5REthVUxGRU01clFCZUo0Z3YvYjJvcGo2Nm5kMGIrZ1lhM2pub29rWFdJTzUweVIKK2YrL2ZORFk3TDEzMWhMSXZ4RzJUbGhwdk1DangyaEthWkxSQU14MjkzaXRUcU9xKzFyeE9sdlZFK3pJWXJ0VWYKKzltbXZ0azU3SFZqc082bFRvMTVZeUo0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAgYi9MaWIvdGVzdC9jYXBhdGgvY2U3Yjg2NDMuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkMjU5Yi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jYXBhdGgvY2U3Yjg2NDMuMAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJQ2xUQ0NBZjZnQXdJQkFnSUpBS0dVOTV3S1I4cFRNQTBHQ1NxR1NJYjNEUUVCQlFVQU1IQXhDekFKQmdOVgotQkFZVEFsaFpNUmN3RlFZRFZRUUhEQTVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNnd2FVSGwwYUc5dQotSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEl6QWhCZ05WQkFNTUduTmxiR1l0YzJsbmJtVmtMbkI1ZEdodgotYm5SbGMzUXVibVYwTUI0WERURTBNVEV3TWpFNE1Ea3lPVm9YRFRJME1UQXpNREU0TURreU9Wb3djREVMTUFrRwotQTFVRUJoTUNXRmt4RnpBVkJnTlZCQWNNRGtOaGMzUnNaU0JCYm5Sb2NtRjRNU013SVFZRFZRUUtEQnBRZVhSbwotYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRWpNQ0VHQTFVRUF3d2FjMlZzWmkxemFXZHVaV1F1Y0hsMAotYUc5dWRHVnpkQzV1WlhRd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFORFhRWFc5dGp5WgotWHQwSXYydExMMStqaW5yNHdHZzM2aW9MRExGa01mKzJZMUdMMHYwQm5LWUc0TjFPS2xBVTE1TFhHZUdlcjh2bQotU3YveUl2bWRyRUx2aEFiYm8zdzRhOVRNWVFBNFhrSVZMZHZ1M212Tk9BZXQrOFBNSnhuMjZkYkRoRzgwOUFMdgotRUhZNTdsUXNCUzNHNTlSWnlCUFZxQXFtSW1XTkpuVnpBZ01CQUFHak56QTFNQ1VHQTFVZEVRUWVNQnlDR25ObAotYkdZdGMybG5ibVZrTG5CNWRHaHZiblJsYzNRdWJtVjBNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTgotQVFFRkJRQURnWUVBSXV6QWhnTW91SnBOZGYzVVJDSElpbmV5b1N0NldLLzkrZXlVY2psS09yRG9YTlphRDcyaAotVFhNZUtZb1d2SnlWY1NMS0w4Y2tQdERvYmdQMk9UdDBVa3lBYWowbitaSGFxcTFsSDJ5VmZHVUExSUxKdjUxNQotQzhCcWJ2Vlp1cW0zaTd5Z213M2JxRS9sWU1nT3JZdFhYbnFPcno2bnZzRTZZYzlWOXJGZmxPTT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wIGIvTGliL3Rlc3QvY2FwYXRoL2NlZmYxNzEwLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wCkBAIC0wLDAgKzEsMjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGJUQ0NBbFdnQXdJQkFnSUpBTENTWkxIeTJpSFFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FMHhDekFKQmdOVgorQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiaUJEUVRFVworTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQWVGdzB4TXpBeE1EUXhPVFEzTURkYUZ3MHlNekF4TURJeAorT1RRM01EZGFNRTB4Q3pBSkJnTlZCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZworUm05MWJtUmhkR2x2YmlCRFFURVdNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPZmU2ZU1NbndDMm9mMHJXNWJTYjh6Z3ZvYTVJRjdzQTNwVgorcStxazZmbEpoZEptMWUzSGV1cFdqaTJQNTBMaVlpaXBuOVlianV1MXRKeWZGS3ZmNXBTTGRoMCtiU1JoN1F5LworQUlwaEROOWN5RFp6RmdETlI3cHRwS1IwaUlNakNobjhDYWM4U2t2VDV4MHQ1T3BNVkNIekp0dUpOeGpVQXJ0QQorTWwray95MGM5OVM3N0k3UFhJS3M1bndJYkVpRllRZC9KZUJjNEx3MFgrQzVCRWQxeUVjTGpield5R2hmTTROaQorMGlCRU5iR3RnUnFLemJ3MXNGeUxSOVlZNlp3WWw4d0JQQ25NNkI3azVNRzQzdWZDRVJpSFdwTTAyS1lsOXhSeAorNitRaG90SVBMaTdVWWdBMTA5YnZYR0JMVEtrVTR0MFZXRVkzTXlhMzV5NWQ3VUxreFUwQ0F3RUFBYU5RTUU0dworSFFZRFZSME9CQllFRkx6ZFl0bDIyaHZTVkd2UDRHYWJIaDU3Vmd3TE1COEdBMVVkSXdRWU1CYUFGTHpkWXRsMgorMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgorQUgwSzljdU4wMTI5bVk3NEt3KzY2OExacGlkUExuc3ZEbVRZSERWUVR1NzhrTG1OYmFqRnhnYXdyL010dnp1NAorUWdmZEdIMXRsVlJYaFJoZ1J5L3JlQnY1NkJmOVdnMkhGeWlzVEdybXZDbjA5RlZ3S1VMZWhlcXJiQ01HWkRCMQorQW81VHZGNEJNemZNSHMyNHBQM0s1RjlsTzRNY2h2RlZBcUE2ajl1UnQwQVV0T2VOMHU1enV1UGxOQzI4bEc5TworSkFiM1g0c09wNDVyM2w1MTlES2FVTEZFTTVyUUJlSjRndi9iMm9wajY2bmQwYitnWWEzam5vb2tYV0lPNTB5UgorZisvZk5EWTdMMTMxaExJdnhHMlRsaHB2TUNqeDJoS2FaTFJBTXgyOTNpdFRxT3ErMXJ4T2x2VkUreklZcnRVZgorOW1tdnRrNTdIVmpzTzZsVG8xNVl5SjQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weSBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CmluZGV4IGI5MDcxNjQuLjFmOTkyZjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CisrKyBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CkBAIC0yODQsNyArMjg0LDggQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOiBzZWxmLkVTVC5kc3QoNSkKIAogICAgIGRlZiB0ZXN0X3R6bmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDKzAwOjAwJywgdGltZXpvbmUoWkVSTykudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZS51dGMudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZShaRVJPKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wNTowMCcsIHRpbWV6b25lKC01ICogSE9VUikudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMrMDk6MzAnLCB0aW1lem9uZSg5LjUgKiBIT1VSKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wMDowMScsIHRpbWV6b25lKHRpbWVkZWx0YShtaW51dGVzPS0xKSkudHpuYW1lKE5vbmUpKQpAQCAtMTU1OCwxMyArMTU1OSwzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQogCiAgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyLCA0LCA1LCAxLCAxMjMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDItMDMtMDJceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1QnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMS0wMi0wMyAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdceDAwJyksICIwMDAxLTAyLTAzXHgwMDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2hvdXJzJyksICIwMDAxLTAyLTAzVDA0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wM1QwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdChzZXA9JyAnLCB0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wMyAwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nZm9vJykKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDEtMDItMDMgMDQ6MDU6MDEuMDAwMTIzIikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxLCA5OTk1MDAsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS45OTkrMDA6MDAiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDEsIDk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMDAwMS0wMi0wM1QwNDowNTowMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMDAwIikKIAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKQEAgLTIzMjQsNiArMjM0NCwyMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4xMDAwMDAiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKIAorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MTIzNDU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdob3VycycpLCAiMTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJyksICIxMjozNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjEyOjM0OjU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIxMjozNDo1Ni4xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjEyOjM0OjU2LjEyMzQ1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjEyOjM0OjU2LjEyMzQ1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nbW9ua2V5JykKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9OTk5NTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjEyOjM0OjU2Ljk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMTI6MzQ6NTYuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIxMjozNDo1Ni4wMDAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJyksICIxMjozNDo1NiIpCisKICAgICBkZWYgdGVzdF8xNjUzNzM2KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSBpdCBkb2Vzbid0IGFjY2VwdCBleHRyYSBrZXl3b3JkIGFyZ3VtZW50cwogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhzZWNvbmQ9MSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CmluZGV4IDk5MzFhNTUuLjFjYjg2ZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQpAQCAtOSw2ICs5LDcgQEAKICIiIgogCiBpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGZhdWx0aGFuZGxlcgogaW1wb3J0IGlvCiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKQEAgLTUwLDYgKzUxLDEwIEBACiAgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2lnbmFsLklUSU1FUl9SRUFMLCBjbHMuc2lnbmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5zaWduYWxfcGVyaW9kKQogCisgICAgICAgICMgSXNzdWUgIzI1Mjc3OiBVc2UgZmF1bHRoYW5kbGVyIHRvIHRyeSB0byBkZWJ1ZyBhIGhhbmcgb24gRnJlZUJTRAorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIoMTAgKiA2MCwgZXhpdD1UcnVlKQorCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHN0b3BfYWxhcm0oY2xzKToKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIDAsIDApCkBAIC01OCw2ICs2Myw4IEBACiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnN0b3BfYWxhcm0oKQogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbHMub3JpZ19oYW5kbGVyKQorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2NhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCiAKICAgICBkZWYgc3VicHJvY2VzcyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgIGNtZF9hcmdzID0gKHN5cy5leGVjdXRhYmxlLCAnLWMnKSArIGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L19faW5pdF9fLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNSBAQAorIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgoraW1wb3J0IGltcG9ydGxpYgorCitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MsIFJFU09VUkNFX05BTUVTCitmcm9tIHRlc3QubGlicmVncnRlc3QubWFpbiBpbXBvcnQgbWFpbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlOTkwZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKQEAgLTAsMCArMSwzNDQgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworCitVU0FHRSA9ICIiIlwKK3B5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQorcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCisiIiIKKworREVTQ1JJUFRJT04gPSAiIiJcCitSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCisKK0lmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCit0aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCit0aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCisKK0ZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZworY29tbWFuZCBsaW5lOgorCitweXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KKyIiIgorCitFUElMT0cgPSAiIiJcCitBZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgorCistciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCitpbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQordGVzdCBvcmRlcnMuCisKKy1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCitvciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKK3RoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKK1B5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCitvdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCit0aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgorV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKK2lzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCitkb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bworY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KKworLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAorbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KK1RoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKK3JlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKK3RoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgorCistZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQorb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCitsaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgord2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KKworLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KK2xlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCitGcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KKworLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bworc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAorYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCit0ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgorb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCityZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKKyJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCisKKy1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKK3R5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KKzIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCit0ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCitzZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCit3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQordGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKK3Nob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91CitzaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKK3RoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Cit0YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKK2xpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKK3RvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKK2dlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgorCistdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAorc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgorVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKK3Jlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKKworICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCisKKyAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCisKKyAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgorICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgorICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCisKKyAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCisgICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KKworICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQorICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQorICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgorCisgICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yaworICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCisKKyAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAorICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCisKKyAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KKworICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KKworICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KKworICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KKworVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKK2V4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKK29wdGlvbiAnLXVhbGwsLWd1aScuCisiIiIKKworCitSRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCisKK2NsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQorCisKK2RlZiBfY3JlYXRlX3BhcnNlcigpOgorICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgorICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KKyAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQorCisgICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KKyAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KKyAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJworCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQorICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tbGlzdC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgd3JpdGUgdGhlIG5hbWUgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBleGVjdXRlIHRoZW0iKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wZ28nLCBkZXN0PSdwZ28nLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdlbmFibGUgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIHRyYWluaW5nJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3MnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorCisgICAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgorICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKKyAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKKworCitkZWYgaHVudHJsZWFrcyhzdHJpbmcpOgorICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQorICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0CisgICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKKyAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCisKKworZGVmIHJlc291cmNlc19saXN0KHN0cmluZyk6CisgICAgdSA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KCcsJyldCisgICAgZm9yIHIgaW4gdToKKyAgICAgICAgaWYgciA9PSAnYWxsJyBvciByID09ICdub25lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgIGlmIHIgbm90IGluIFJFU09VUkNFX05BTUVTOgorICAgICAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoJ2ludmFsaWQgcmVzb3VyY2U6ICcgKyByKQorICAgIHJldHVybiB1CisKKworZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKKyAgICAjIERlZmF1bHRzCisgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCisgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKKyAgICAgICAgc2V0YXR0cihucywgaywgdikKKyAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQorCisgICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQorCisgICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLmZhaWxmYXN0IGFuZCBub3QgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XIikKKyAgICBpZiBucy5wZ28gYW5kIChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UyIG9yIG5zLnZlcmJvc2UzKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItLXBnby8tdiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgaWYgbnMubm93aW5kb3dzOgorICAgICAgICBwcmludCgiV2FybmluZzogdGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICAgICAgICAgIlVzZSAtdnYgdG8gZGlzcGxheSBhc3NlcnRpb25zIGluIHN0ZGVyci4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBpZiBucy5xdWlldDoKKyAgICAgICAgbnMudmVyYm9zZSA9IDAKKyAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6CisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6CisgICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAorICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQorICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKKyAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKKyAgICBpZiBucy51c2U6CisgICAgICAgIGZvciBhIGluIG5zLnVzZToKKyAgICAgICAgICAgIGZvciByIGluIGE6CisgICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKKyAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6CisgICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KKyAgICAgICAgICAgICAgICBpZiByZW1vdmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCisgICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQorICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgorICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCisKKyAgICByZXR1cm4gbnMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2Q5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9tYWluLnB5CkBAIC0wLDAgKzEsNTA0IEBACitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHRpbWUKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5jbWRsaW5lIGltcG9ydCBfcGFyc2VfYXJncworZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJ1bnRlc3QgaW1wb3J0ICgKKyAgICBmaW5kdGVzdHMsIHJ1bnRlc3QsCisgICAgU1REVEVTVFMsIE5PVFRFU1RTLCBQQVNTRUQsIEZBSUxFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRCwKKyAgICBJTlRFUlJVUFRFRCwgQ0hJTERfRVJST1IsCisgICAgUFJPR1JFU1NfTUlOX1RJTUUpCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2V0dXAgaW1wb3J0IHNldHVwX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworCisjIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCisjIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCisjIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCitpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQorZWxzZToKKyAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCisKKworY2xhc3MgUmVncnRlc3Q6CisgICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCisKKyAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKKyAgICBhY2NvcmRpbmdseS4KKworICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCisgICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKKworICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KKyAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KKworICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQorICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQorICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCisgICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAorICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKKyAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncworICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIE5hbWVzcGFjZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBzZWxmLm5zID0gTm9uZQorCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBbXQorCisgICAgICAgICMgdGVzdCByZXN1bHRzCisgICAgICAgIHNlbGYuZ29vZCA9IFtdCisgICAgICAgIHNlbGYuYmFkID0gW10KKyAgICAgICAgc2VsZi5za2lwcGVkID0gW10KKyAgICAgICAgc2VsZi5yZXNvdXJjZV9kZW5pZWRzID0gW10KKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkID0gW10KKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tc2xvdworICAgICAgICBzZWxmLnRlc3RfdGltZXMgPSBbXQorCisgICAgICAgICMgdXNlZCBieSAtLWNvdmVyYWdlLCB0cmFjZS5UcmFjZSBpbnN0YW5jZQorICAgICAgICBzZWxmLnRyYWNlciA9IE5vbmUKKworICAgICAgICAjIHVzZWQgYnkgLS1maW5kbGVha3MsIHN0b3JlIGZvciBnYy5nYXJiYWdlCisgICAgICAgIHNlbGYuZm91bmRfZ2FyYmFnZSA9IFtdCisKKyAgICAgICAgIyB1c2VkIHRvIGRpc3BsYXkgdGhlIHByb2dyZXNzIGJhciAiWyAzLzEwMF0iCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMQorCisgICAgICAgICMgdXNlZCBieSAtLXNpbmdsZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6CisgICAgICAgICAgICBzZWxmLnRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBzZWxmLmdvb2QuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgorICAgICAgICAgICAgc2VsZi5iYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNlbGYuc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgdGltZV9kZWx0YShzZWxmLCBjZWlsPUZhbHNlKToKKyAgICAgICAgc2Vjb25kcyA9IHRpbWUubW9ub3RvbmljKCkgLSBzZWxmLnN0YXJ0X3RpbWUKKyAgICAgICAgaWYgY2VpbDoKKyAgICAgICAgICAgIHNlY29uZHMgPSBtYXRoLmNlaWwoc2Vjb25kcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY29uZHMgPSBpbnQoc2Vjb25kcykKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPXNlY29uZHMpCisKKyAgICBkZWYgZGlzcGxheV9wcm9ncmVzcyhzZWxmLCB0ZXN0X2luZGV4LCB0ZXN0KToKKyAgICAgICAgaWYgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJhZCBhbmQgbm90IHNlbGYubnMucGdvOgorICAgICAgICAgICAgZm10ID0gInt0aW1lfSBbe3Rlc3RfaW5kZXg6e2NvdW50X3dpZHRofX17dGVzdF9jb3VudH0ve25iYWR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9ICJ7dGltZX0gW3t0ZXN0X2luZGV4Ontjb3VudF93aWR0aH19e3Rlc3RfY291bnR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgbGluZSA9IGZtdC5mb3JtYXQoY291bnRfd2lkdGg9c2VsZi50ZXN0X2NvdW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZGV4PXRlc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQ9c2VsZi50ZXN0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYmFkPWxlbihzZWxmLmJhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZT10ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lPXNlbGYudGltZV9kZWx0YSgpKQorICAgICAgICBwcmludChsaW5lLCBmbHVzaD1UcnVlKQorCisgICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwga3dhcmdzKToKKyAgICAgICAgbnMgPSBfcGFyc2VfYXJncyhzeXMuYXJndlsxOl0sICoqa3dhcmdzKQorCisgICAgICAgIGlmIG5zLnRpbWVvdXQgYW5kIG5vdCBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBwcmludCgiV2FybmluZzogVGhlIHRpbWVvdXQgb3B0aW9uIHJlcXVpcmVzICIKKyAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIiLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorCisgICAgICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZSBhbmQgZ2MgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGlnbm9yZSAtLXRocmVzaG9sZC4nLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBucy50aHJlc2hvbGQgPSBOb25lCisKKyAgICAgICAgaWYgbnMuZmluZGxlYWtzOgorICAgICAgICAgICAgaWYgZ2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gcmVwb3J0IGdhcmJhZ2UgdGhhdCBpcyBub3QKKyAgICAgICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQorICAgICAgICAgICAgICAgICMgZ2FyYmFnZSB0aGF0IGlzIG5vdCBjb2xsZWN0YWJsZSBieSB0aGUgR0MgaXMgcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIC0tZmluZGxlYWtzJywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKKworICAgICAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgorICAgICAgICByZW1vdmVweShucy5hcmdzKQorCisgICAgICAgIHJldHVybiBucworCisgICAgZGVmIGZpbmRfdGVzdHMoc2VsZiwgdGVzdHMpOgorICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKKworICAgICAgICBpZiBzZWxmLm5zLnNpbmdsZToKKyAgICAgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgJ3B5bmV4dHRlc3QnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lLCAncicpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICBuZXh0X3Rlc3QgPSBmcC5yZWFkKCkuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RzID0gW25leHRfdGVzdF0KKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBzZWxmLm5zLmZyb21maWxlOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgICAgICAjIHJlZ2V4IHRvIG1hdGNoICd0ZXN0X2J1aWx0aW4nIGluIGxpbmU6CisgICAgICAgICAgICAjICcwOjAwOjAwIFsgIDQvNDAwXSB0ZXN0X2J1aWx0aW4gLS0gdGVzdF9kaWN0IHRvb2sgMSBzZWMnCisgICAgICAgICAgICByZWdleCA9IChyJ14oPzpbMC05XSs6WzAtOV0rOlswLTldKyAqKT8nCisgICAgICAgICAgICAgICAgICAgICByJyg/OlxbWzAtOS8gXStcXSAqKT8nCisgICAgICAgICAgICAgICAgICAgICByJyh0ZXN0X1thLXpBLVowLTlfXSspJykKKyAgICAgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyZWdleCkKKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc2VsZi5ucy5mcm9tZmlsZSkpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGZwOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0cy5hcHBlbmQobWF0Y2guZ3JvdXAoMSkpCisKKyAgICAgICAgcmVtb3ZlcHkoc2VsZi50ZXN0cykKKworICAgICAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCisgICAgICAgIG5vdHRlc3RzID0gTk9UVEVTVFMuY29weSgpCisgICAgICAgIGlmIHNlbGYubnMuZXhjbHVkZToKKyAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5ucy5hcmdzOgorICAgICAgICAgICAgICAgIGlmIGFyZyBpbiBzdGR0ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKKyAgICAgICAgICAgICAgICBub3R0ZXN0cy5hZGQoYXJnKQorICAgICAgICAgICAgc2VsZi5ucy5hcmdzID0gW10KKworICAgICAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbworICAgICAgICAjIGRvbid0IGFkZCBkZWZhdWx0IHRlc3RzIHRvIGJlIGV4ZWN1dGVkIG9yIHNraXBwZWQgKHBhc3MgZW1wdHkgdmFsdWVzKQorICAgICAgICBpZiBzZWxmLm5zLnRlc3RkaXI6CisgICAgICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhzZWxmLm5zLnRlc3RkaXIsIGxpc3QoKSwgc2V0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhzZWxmLm5zLnRlc3RkaXIsIHN0ZHRlc3RzLCBub3R0ZXN0cykKKworICAgICAgICBpZiBub3Qgc2VsZi5ucy5mcm9tZmlsZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBzZWxmLnRlc3RzIG9yIHNlbGYubnMuYXJncyBvciBhbGx0ZXN0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYudGVzdHMKKyAgICAgICAgaWYgc2VsZi5ucy5zaW5nbGU6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkID0gc2VsZi5zZWxlY3RlZFs6MV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwb3MgPSBhbGx0ZXN0cy5pbmRleChzZWxmLnNlbGVjdGVkWzBdKQorICAgICAgICAgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfdGVzdCA9IGFsbHRlc3RzW3BvcyArIDFdCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBSZW1vdmUgYWxsIHRoZSBzZWxlY3RlZCB0ZXN0cyB0aGF0IHByZWNlZGUgc3RhcnQgaWYgaXQncyBzZXQuCisgICAgICAgIGlmIHNlbGYubnMuc3RhcnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuc2VsZWN0ZWRbOnNlbGYuc2VsZWN0ZWQuaW5kZXgoc2VsZi5ucy5zdGFydCldCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAlIHNlbGYubnMuc3RhcnQsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbWl6ZToKKyAgICAgICAgICAgIGlmIHNlbGYubnMucmFuZG9tX3NlZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLm5zLnJhbmRvbV9zZWVkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwMCkKKyAgICAgICAgICAgIHJhbmRvbS5zZWVkKHNlbGYubnMucmFuZG9tX3NlZWQpCisgICAgICAgICAgICByYW5kb20uc2h1ZmZsZShzZWxmLnNlbGVjdGVkKQorCisgICAgZGVmIGxpc3RfdGVzdHMoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuc2VsZWN0ZWQ6CisgICAgICAgICAgICBwcmludChuYW1lKQorCisgICAgZGVmIHJlcnVuX2ZhaWxlZF90ZXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICBzZWxmLm5zLmZhaWxmYXN0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5ucy52ZXJib3NlMyA9IEZhbHNlCisgICAgICAgIHNlbGYubnMubWF0Y2hfdGVzdHMgPSBOb25lCisKKyAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZSIpCisgICAgICAgIGZvciB0ZXN0IGluIHNlbGYuYmFkWzpdOgorICAgICAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgdGVzdCAlciBpbiB2ZXJib3NlIG1vZGUiICUgdGVzdCwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm5zLnZlcmJvc2UgPSBUcnVlCisgICAgICAgICAgICAgICAgb2sgPSBydW50ZXN0KHNlbGYubnMsIHRlc3QpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFkLnJlbW92ZSh0ZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQorICAgICAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgIGRlZiBkaXNwbGF5X3Jlc3VsdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIGFmdGVyIF5DCisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCisgICAgICAgICAgICBleGVjdXRlZCA9IHNldChzZWxmLmdvb2QpIHwgc2V0KHNlbGYuYmFkKSB8IHNldChzZWxmLnNraXBwZWQpCisgICAgICAgICAgICBvbWl0dGVkID0gc2V0KHNlbGYuc2VsZWN0ZWQpIC0gZXhlY3V0ZWQKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihvbWl0dGVkKSwgInRlc3QiKSwgIm9taXR0ZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChvbWl0dGVkKQorCisgICAgICAgICMgSWYgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgUEdPIHRoZW4gbm8gb25lIGNhcmVzIGFib3V0CisgICAgICAgICMgcmVzdWx0cy4KKyAgICAgICAgaWYgc2VsZi5ucy5wZ286CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmdvb2QgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgaWYgKG5vdCBzZWxmLmJhZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5za2lwcGVkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmludGVycnVwdGVkCisgICAgICAgICAgICAgICAgYW5kIGxlbihzZWxmLmdvb2QpID4gMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIkFsbCIsIGVuZD0nICcpCisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5nb29kKSwgInRlc3QiKSwgIk9LLiIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5wcmludF9zbG93OgorICAgICAgICAgICAgc2VsZi50ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICAgICAgcHJpbnQoIjEwIHNsb3dlc3QgdGVzdHM6IikKKyAgICAgICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHNlbGYudGVzdF90aW1lc1s6MTBdOgorICAgICAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQorCisgICAgICAgIGlmIHNlbGYuYmFkOgorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgInRlc3QiKSwgImZhaWxlZDoiKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuYmFkKQorCisgICAgICAgIGlmIHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZDoKKyAgICAgICAgICAgIHByaW50KCJ7fSBhbHRlcmVkIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQ6Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICBjb3VudChsZW4oc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkKSwgInRlc3QiKSkpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkKQorCisgICAgICAgIGlmIHNlbGYuc2tpcHBlZCBhbmQgbm90IHNlbGYubnMucXVpZXQ6CisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5za2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLnNraXBwZWQpCisKKyAgICBkZWYgcnVuX3Rlc3RzX3NlcXVlbnRpYWwoc2VsZik6CisgICAgICAgIGlmIHNlbGYubnMudHJhY2U6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2UKKyAgICAgICAgICAgIHNlbGYudHJhY2VyID0gdHJhY2UuVHJhY2UodHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCisKKyAgICAgICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCisKKyAgICAgICAgcHJpbnQoIlJ1biB0ZXN0cyBzZXF1ZW50aWFsbHkiKQorCisgICAgICAgIHByZXZpb3VzX3Rlc3QgPSBOb25lCisgICAgICAgIGZvciB0ZXN0X2luZGV4LCB0ZXN0IGluIGVudW1lcmF0ZShzZWxmLnRlc3RzLCAxKToKKyAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLm1vbm90b25pYygpCisKKyAgICAgICAgICAgIHRleHQgPSB0ZXN0CisgICAgICAgICAgICBpZiBwcmV2aW91c190ZXN0OgorICAgICAgICAgICAgICAgIHRleHQgPSAnJXMgLS0gJXMnICUgKHRleHQsIHByZXZpb3VzX3Rlc3QpCisgICAgICAgICAgICBzZWxmLmRpc3BsYXlfcHJvZ3Jlc3ModGVzdF9pbmRleCwgdGV4dCkKKworICAgICAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSB0cmFjaW5nIGNvZGUgY292ZXJhZ2UsIHRoZW4gd2UgZG9uJ3QgZXhpdCB3aXRoIHN0YXR1cworICAgICAgICAgICAgICAgICMgaWYgb24gYSBmYWxzZSByZXR1cm4gdmFsdWUgZnJvbSBtYWluLgorICAgICAgICAgICAgICAgIGNtZCA9ICgncmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KTsgJworICAgICAgICAgICAgICAgICAgICAgICAnc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpJykKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlci5ydW5jdHgoY21kLCBnbG9iYWxzPWdsb2JhbHMoKSwgbG9jYWxzPXZhcnMoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KHNlbGYubnMsIHRlc3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIChJTlRFUlJVUFRFRCwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCisKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUubW9ub3RvbmljKCkgLSBzdGFydF90aW1lCisgICAgICAgICAgICBpZiB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUU6CisgICAgICAgICAgICAgICAgcHJldmlvdXNfdGVzdCA9ICclcyB0b29rICUuMGYgc2VjJyAlICh0ZXN0LCB0ZXN0X3RpbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZXZpb3VzX3Rlc3QgPSBOb25lCisKKyAgICAgICAgICAgIGlmIHNlbGYubnMuZmluZGxlYWtzOgorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGlmIGdjLmdhcmJhZ2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiB0ZXN0IGNyZWF0ZWQiLCBsZW4oZ2MuZ2FyYmFnZSksIGVuZD0nICcpCisgICAgICAgICAgICAgICAgICAgIHByaW50KCJ1bmNvbGxlY3RhYmxlIG9iamVjdChzKS4iKQorICAgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHVuY29sbGVjdGFibGUgb2JqZWN0cyBzb21ld2hlcmUgc28gd2UgZG9uJ3Qgc2VlCisgICAgICAgICAgICAgICAgICAgICMgdGhlbSBhZ2FpbgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvdW5kX2dhcmJhZ2UuZXh0ZW5kKGdjLmdhcmJhZ2UpCisgICAgICAgICAgICAgICAgICAgIGRlbCBnYy5nYXJiYWdlWzpdCisKKyAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKKworICAgICAgICBpZiBwcmV2aW91c190ZXN0OgorICAgICAgICAgICAgcHJpbnQocHJldmlvdXNfdGVzdCkKKworICAgIGRlZiBfdGVzdF9mb3JldmVyKHNlbGYsIHRlc3RzKToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgIHlpZWxkIHRlc3QKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcnVuX3Rlc3RzKHNlbGYpOgorICAgICAgICAjIEZvciBhIHBhcnRpYWwgcnVuLCB3ZSBkbyBub3QgbmVlZCB0byBjbHV0dGVyIHRoZSBvdXRwdXQuCisgICAgICAgIGlmIChzZWxmLm5zLnZlcmJvc2UKKyAgICAgICAgICAgIG9yIHNlbGYubnMuaGVhZGVyCisgICAgICAgICAgICBvciBub3QgKHNlbGYubnMucGdvIG9yIHNlbGYubnMucXVpZXQgb3Igc2VsZi5ucy5zaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi50ZXN0cyBvciBzZWxmLm5zLmFyZ3MpKToKKyAgICAgICAgICAgICMgUHJpbnQgYmFzaWMgcGxhdGZvcm0gaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHByaW50KCI9PSIsIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLCAqc3lzLnZlcnNpb24uc3BsaXQoKSkKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLWVuZGlhbiIgJSBzeXMuYnl0ZW9yZGVyKQorICAgICAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCisgICAgICAgICAgICAgICAgICAiNjRiaXQiIGlmIHN5cy5tYXhzaXplID4gMioqMzIgZWxzZSAiMzJiaXQiKQorICAgICAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgICAgIHByaW50KCJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzKQorCisgICAgICAgIGlmIHNlbGYubnMucmFuZG9taXplOgorICAgICAgICAgICAgcHJpbnQoIlVzaW5nIHJhbmRvbSBzZWVkIiwgc2VsZi5ucy5yYW5kb21fc2VlZCkKKworICAgICAgICBpZiBzZWxmLm5zLmZvcmV2ZXI6CisgICAgICAgICAgICBzZWxmLnRlc3RzID0gc2VsZi5fdGVzdF9mb3JldmVyKGxpc3Qoc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnQgPSAnJworICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IGl0ZXIoc2VsZi5zZWxlY3RlZCkKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZi5zZWxlY3RlZCkpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnRfd2lkdGggPSBsZW4oc2VsZi50ZXN0X2NvdW50KSAtIDEKKworICAgICAgICBpZiBzZWxmLm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfbXVsdGlwcm9jZXNzCisgICAgICAgICAgICBydW5fdGVzdHNfbXVsdGlwcm9jZXNzKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0c19zZXF1ZW50aWFsKCkKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZToKKyAgICAgICAgICAgIGlmIHNlbGYubmV4dF9zaW5nbGVfdGVzdDoKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5uZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICByID0gc2VsZi50cmFjZXIucmVzdWx0cygpCisgICAgICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmRpcj1zZWxmLm5zLmNvdmVyZGlyKQorCisgICAgICAgIHByaW50KCJUb3RhbCBkdXJhdGlvbjogJXMiICUgc2VsZi50aW1lX2RlbHRhKGNlaWw9VHJ1ZSkpCisKKyAgICAgICAgaWYgc2VsZi5ucy5ydW5sZWFrczoKKyAgICAgICAgICAgIG9zLnN5c3RlbSgibGVha3MgJWQiICUgb3MuZ2V0cGlkKCkpCisKKyAgICBkZWYgbWFpbihzZWxmLCB0ZXN0cz1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgIGdsb2JhbCBURU1QRElSCisKKyAgICAgICAgaWYgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKFRFTVBESVIpCisgICAgICAgICAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIERlZmluZSBhIHdyaXRhYmxlIHRlbXAgZGlyIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGN3ZCB3aGlsZSBydW5uaW5nCisgICAgICAgICMgdGhlIHRlc3RzLiBUaGUgbmFtZSBvZiB0aGUgZGlyIGluY2x1ZGVzIHRoZSBwaWQgdG8gYWxsb3cgcGFyYWxsZWwKKyAgICAgICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCisgICAgICAgIHRlc3RfY3dkID0gJ3Rlc3RfcHl0aG9uX3t9Jy5mb3JtYXQob3MuZ2V0cGlkKCkpCisgICAgICAgIHRlc3RfY3dkID0gb3MucGF0aC5qb2luKFRFTVBESVIsIHRlc3RfY3dkKQorCisgICAgICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCisgICAgICAgICMgdGVtcG9yYXJ5IGFuZCB3cml0YWJsZSBkaXJlY3RvcnkuICBJZiBpdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgb3IKKyAgICAgICAgIyBjaGFuZ2UgdGhlIENXRCwgdGhlIG9yaWdpbmFsIENXRCB3aWxsIGJlIHVzZWQuICBUaGUgb3JpZ2luYWwgQ1dEIGlzCisgICAgICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KKyAgICAgICAgd2l0aCBzdXBwb3J0LnRlbXBfY3dkKHRlc3RfY3dkLCBxdWlldD1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuX21haW4odGVzdHMsIGt3YXJncykKKworICAgIGRlZiBfbWFpbihzZWxmLCB0ZXN0cywga3dhcmdzKToKKyAgICAgICAgc2VsZi5ucyA9IHNlbGYucGFyc2VfYXJncyhrd2FyZ3MpCisKKyAgICAgICAgaWYgc2VsZi5ucy5zbGF2ZWFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdF9tcCBpbXBvcnQgcnVuX3Rlc3RzX3NsYXZlCisgICAgICAgICAgICBydW5fdGVzdHNfc2xhdmUoc2VsZi5ucy5zbGF2ZWFyZ3MpCisKKyAgICAgICAgaWYgc2VsZi5ucy53YWl0OgorICAgICAgICAgICAgaW5wdXQoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKQorCisgICAgICAgIHNldHVwX3Rlc3RzKHNlbGYubnMpCisKKyAgICAgICAgc2VsZi5maW5kX3Rlc3RzKHRlc3RzKQorCisgICAgICAgIGlmIHNlbGYubnMubGlzdF90ZXN0czoKKyAgICAgICAgICAgIHNlbGYubGlzdF90ZXN0cygpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKCkKKyAgICAgICAgc2VsZi5kaXNwbGF5X3Jlc3VsdCgpCisKKyAgICAgICAgaWYgc2VsZi5ucy52ZXJib3NlMiBhbmQgc2VsZi5iYWQ6CisgICAgICAgICAgICBzZWxmLnJlcnVuX2ZhaWxlZF90ZXN0cygpCisKKyAgICAgICAgc2VsZi5maW5hbGl6ZSgpCisgICAgICAgIHN5cy5leGl0KGxlbihzZWxmLmJhZCkgPiAwIG9yIHNlbGYuaW50ZXJydXB0ZWQpCisKKworZGVmIHJlbW92ZXB5KG5hbWVzKToKKyAgICBpZiBub3QgbmFtZXM6CisgICAgICAgIHJldHVybgorICAgIGZvciBpZHgsIG5hbWUgaW4gZW51bWVyYXRlKG5hbWVzKToKKyAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKKyAgICAgICAgaWYgZXh0ID09ICcucHknOgorICAgICAgICAgICAgbmFtZXNbaWR4XSA9IGJhc2VuYW1lCisKKworZGVmIGNvdW50KG4sIHdvcmQpOgorICAgIGlmIG4gPT0gMToKKyAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKKworCitkZWYgcHJpbnRsaXN0KHgsIHdpZHRoPTcwLCBpbmRlbnQ9NCk6CisgICAgIiIiUHJpbnQgdGhlIGVsZW1lbnRzIG9mIGl0ZXJhYmxlIHggdG8gc3Rkb3V0LgorCisgICAgT3B0aW9uYWwgYXJnIHdpZHRoIChkZWZhdWx0IDcwKSBpcyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aC4KKyAgICBPcHRpb25hbCBhcmcgaW5kZW50IChkZWZhdWx0IDQpIGlzIHRoZSBudW1iZXIgb2YgYmxhbmtzIHdpdGggd2hpY2ggdG8KKyAgICBiZWdpbiBlYWNoIGxpbmUuCisgICAgIiIiCisKKyAgICBibGFua3MgPSAnICcgKiBpbmRlbnQKKyAgICAjIFByaW50IHRoZSBzb3J0ZWQgbGlzdDogJ3gnIG1heSBiZSBhICctLXJhbmRvbScgbGlzdCBvciBhIHNldCgpCisgICAgcHJpbnQodGV4dHdyYXAuZmlsbCgnICcuam9pbihzdHIoZWx0KSBmb3IgZWx0IGluIHNvcnRlZCh4KSksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9YmxhbmtzLCBzdWJzZXF1ZW50X2luZGVudD1ibGFua3MpKQorCisKK2RlZiBtYWluKHRlc3RzPU5vbmUsICoqa3dhcmdzKToKKyAgICAiIiJSdW4gdGhlIFB5dGhvbiBzdWl0ZS4iIiIKKyAgICBSZWdydGVzdCgpLm1haW4odGVzdHM9dGVzdHMsICoqa3dhcmdzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3JlZmxlYWsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkYzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3JlZmxlYWsucHkKQEAgLTAsMCArMSwyMDIgQEAKK2ltcG9ydCBlcnJubworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBpbnNwZWN0IGltcG9ydCBpc2Fic3RyYWN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworCit0cnk6CisgICAgTUFYRkQgPSBvcy5zeXNjb25mKCJTQ19PUEVOX01BWCIpCitleGNlcHQgRXhjZXB0aW9uOgorICAgIE1BWEZEID0gMjU2CisKKworZGVmIGZkX2NvdW50KCk6CisgICAgIiIiQ291bnQgdGhlIG51bWJlciBvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMiIiIKKyAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgoJ2xpbnV4JywgJ2ZyZWVic2QnKSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcigiL3Byb2Mvc2VsZi9mZCIpCisgICAgICAgICAgICByZXR1cm4gbGVuKG5hbWVzKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgZmQgaW4gcmFuZ2UoTUFYRkQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFByZWZlciBkdXAoKSBvdmVyIGZzdGF0KCkuIGZzdGF0KCkgY2FuIHJlcXVpcmUgaW5wdXQvb3V0cHV0CisgICAgICAgICAgICAjIHdoZXJlYXMgZHVwKCkgZG9lc24ndC4KKyAgICAgICAgICAgIGZkMiA9IG9zLmR1cChmZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUJBREY6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkMikKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICByZXR1cm4gY291bnQKKworCitkZWYgZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIGluZGlyZWN0X3Rlc3QsIGh1bnRybGVha3MpOgorICAgICIiIlJ1biBhIHRlc3QgbXVsdGlwbGUgdGltZXMsIGxvb2tpbmcgZm9yIHJlZmVyZW5jZSBsZWFrcy4KKworICAgIFJldHVybnM6CisgICAgICAgIEZhbHNlIGlmIHRoZSB0ZXN0IGRpZG4ndCBsZWFrIHJlZmVyZW5jZXM7IFRydWUgaWYgd2UgZGV0ZWN0ZWQgcmVmbGVha3MuCisgICAgIiIiCisgICAgIyBUaGlzIGNvZGUgaXMgaGFja2lzaCBhbmQgaW5lbGVnYW50LCBidXQgaXQgc2VlbXMgdG8gZG8gdGhlIGpvYi4KKyAgICBpbXBvcnQgY29weXJlZworICAgIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKKworICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUcmFja2luZyByZWZlcmVuY2UgbGVha3MgcmVxdWlyZXMgYSBkZWJ1ZyBidWlsZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAib2YgUHl0aG9uIikKKworICAgICMgU2F2ZSBjdXJyZW50IHZhbHVlcyBmb3IgZGFzaF9SX2NsZWFudXAoKSB0byByZXN0b3JlLgorICAgIGZzID0gd2FybmluZ3MuZmlsdGVyc1s6XQorICAgIHBzID0gY29weXJlZy5kaXNwYXRjaF90YWJsZS5jb3B5KCkKKyAgICBwaWMgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jb3B5KCkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHpkYyA9IE5vbmUgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAorICAgIGVsc2U6CisgICAgICAgIHpkYyA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jb3B5KCkKKyAgICBhYmNzID0ge30KKyAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgorICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgorICAgICAgICAgICAgYWJjc1tvYmpdID0gb2JqLl9hYmNfcmVnaXN0cnkuY29weSgpCisKKyAgICBud2FybXVwLCBudHJhY2tlZCwgZm5hbWUgPSBodW50cmxlYWtzCisgICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgZm5hbWUpCisgICAgcmVwY291bnQgPSBud2FybXVwICsgbnRyYWNrZWQKKyAgICByY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorICAgIGFsbG9jX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisgICAgZmRfZGVsdGFzID0gWzBdICogcmVwY291bnQKKworICAgIHByaW50KCJiZWdpbm5pbmciLCByZXBjb3VudCwgInJlcGV0aXRpb25zIiwgZmlsZT1zeXMuc3RkZXJyKQorICAgIHByaW50KCgiMTIzNDU2Nzg5MCIqKHJlcGNvdW50Ly8xMCArIDEpKVs6cmVwY291bnRdLCBmaWxlPXN5cy5zdGRlcnIsCisgICAgICAgICAgZmx1c2g9VHJ1ZSkKKyAgICAjIGluaXRpYWxpemUgdmFyaWFibGVzIHRvIG1ha2UgcHlmbGFrZXMgcXVpZXQKKyAgICByY19iZWZvcmUgPSBhbGxvY19iZWZvcmUgPSBmZF9iZWZvcmUgPSAwCisgICAgZm9yIGkgaW4gcmFuZ2UocmVwY291bnQpOgorICAgICAgICBpbmRpcmVjdF90ZXN0KCkKKyAgICAgICAgYWxsb2NfYWZ0ZXIsIHJjX2FmdGVyLCBmZF9hZnRlciA9IGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmNzKQorICAgICAgICBwcmludCgnLicsIGVuZD0nJywgZmx1c2g9VHJ1ZSkKKyAgICAgICAgaWYgaSA+PSBud2FybXVwOgorICAgICAgICAgICAgcmNfZGVsdGFzW2ldID0gcmNfYWZ0ZXIgLSByY19iZWZvcmUKKyAgICAgICAgICAgIGFsbG9jX2RlbHRhc1tpXSA9IGFsbG9jX2FmdGVyIC0gYWxsb2NfYmVmb3JlCisgICAgICAgICAgICBmZF9kZWx0YXNbaV0gPSBmZF9hZnRlciAtIGZkX2JlZm9yZQorICAgICAgICBhbGxvY19iZWZvcmUgPSBhbGxvY19hZnRlcgorICAgICAgICByY19iZWZvcmUgPSByY19hZnRlcgorICAgICAgICBmZF9iZWZvcmUgPSBmZF9hZnRlcgorICAgIHByaW50KGZpbGU9c3lzLnN0ZGVycikKKyAgICAjIFRoZXNlIGNoZWNrZXJzIHJldHVybiBGYWxzZSBvbiBzdWNjZXNzLCBUcnVlIG9uIGZhaWx1cmUKKyAgICBkZWYgY2hlY2tfcmNfZGVsdGFzKGRlbHRhcyk6CisgICAgICAgIHJldHVybiBhbnkoZGVsdGFzKQorICAgIGRlZiBjaGVja19hbGxvY19kZWx0YXMoZGVsdGFzKToKKyAgICAgICAgIyBBdCBsZWFzdCAxLzNyZCBvZiAwcworICAgICAgICBpZiAzICogZGVsdGFzLmNvdW50KDApIDwgbGVuKGRlbHRhcyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIE5vdGhpbmcgZWxzZSB0aGFuIDFzLCAwcyBhbmQgLTFzCisgICAgICAgIGlmIG5vdCBzZXQoZGVsdGFzKSA8PSB7MSwwLC0xfToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZhaWxlZCA9IEZhbHNlCisgICAgZm9yIGRlbHRhcywgaXRlbV9uYW1lLCBjaGVja2VyIGluIFsKKyAgICAgICAgKHJjX2RlbHRhcywgJ3JlZmVyZW5jZXMnLCBjaGVja19yY19kZWx0YXMpLAorICAgICAgICAoYWxsb2NfZGVsdGFzLCAnbWVtb3J5IGJsb2NrcycsIGNoZWNrX2FsbG9jX2RlbHRhcyksCisgICAgICAgIChmZF9kZWx0YXMsICdmaWxlIGRlc2NyaXB0b3JzJywgY2hlY2tfcmNfZGVsdGFzKV06CisgICAgICAgIGlmIGNoZWNrZXIoZGVsdGFzKToKKyAgICAgICAgICAgIG1zZyA9ICclcyBsZWFrZWQgJXMgJXMsIHN1bT0lcycgJSAoCisgICAgICAgICAgICAgICAgdGVzdCwgZGVsdGFzW253YXJtdXA6XSwgaXRlbV9uYW1lLCBzdW0oZGVsdGFzKSkKKyAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKKyAgICAgICAgICAgICAgICBwcmludChtc2csIGZpbGU9cmVmcmVwKQorICAgICAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCisgICAgICAgICAgICBmYWlsZWQgPSBUcnVlCisgICAgcmV0dXJuIGZhaWxlZAorCisKK2RlZiBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKToKKyAgICBpbXBvcnQgZ2MsIGNvcHlyZWcKKyAgICBpbXBvcnQgX3N0cnB0aW1lLCBsaW5lY2FjaGUKKyAgICBpbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdCwgbWltZXR5cGVzLCBkb2N0ZXN0CisgICAgaW1wb3J0IHN0cnVjdCwgZmlsZWNtcCwgY29sbGVjdGlvbnMuYWJjCisgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKKyAgICBmcm9tIHdlYWtyZWYgaW1wb3J0IFdlYWtTZXQKKworICAgICMgQ2xlYXIgdGhlIHdhcm5pbmdzIHJlZ2lzdHJ5LCBzbyB0aGV5IGNhbiBiZSBkaXNwbGF5ZWQgYWdhaW4KKyAgICBmb3IgbW9kIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG1vZCwgJ19fd2FybmluZ3JlZ2lzdHJ5X18nKToKKyAgICAgICAgICAgIGRlbCBtb2QuX193YXJuaW5ncmVnaXN0cnlfXworCisgICAgIyBSZXN0b3JlIHNvbWUgb3JpZ2luYWwgdmFsdWVzLgorICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBmcworICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY2xlYXIoKQorICAgIGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUudXBkYXRlKHBzKQorICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKKyAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS51cGRhdGUocGljKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcyAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0CisgICAgZWxzZToKKyAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNsZWFyKCkKKyAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLnVwZGF0ZSh6ZGMpCisKKyAgICAjIGNsZWFyIHR5cGUgY2FjaGUKKyAgICBzeXMuX2NsZWFyX3R5cGVfY2FjaGUoKQorCisgICAgIyBDbGVhciBBQkMgcmVnaXN0cmllcywgcmVzdG9yaW5nIHByZXZpb3VzbHkgc2F2ZWQgQUJDIHJlZ2lzdHJpZXMuCisgICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKKyAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKKyAgICAgICAgICAgIG9iai5fYWJjX3JlZ2lzdHJ5ID0gYWJjcy5nZXQob2JqLCBXZWFrU2V0KCkpLmNvcHkoKQorICAgICAgICAgICAgb2JqLl9hYmNfY2FjaGUuY2xlYXIoKQorICAgICAgICAgICAgb2JqLl9hYmNfbmVnYXRpdmVfY2FjaGUuY2xlYXIoKQorCisgICAgIyBGbHVzaCBzdGFuZGFyZCBvdXRwdXQsIHNvIHRoYXQgYnVmZmVyZWQgZGF0YSBpcyBzZW50IHRvIHRoZSBPUyBhbmQKKyAgICAjIGFzc29jaWF0ZWQgUHl0aG9uIG9iamVjdHMgYXJlIHJlY2xhaW1lZC4KKyAgICBmb3Igc3RyZWFtIGluIChzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyLCBzeXMuX19zdGRvdXRfXywgc3lzLl9fc3RkZXJyX18pOgorICAgICAgICBpZiBzdHJlYW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdHJlYW0uZmx1c2goKQorCisgICAgIyBDbGVhciBhc3NvcnRlZCBtb2R1bGUgY2FjaGVzLgorICAgIF9wYXRoX2NyZWF0ZWQuY2xlYXIoKQorICAgIHJlLnB1cmdlKCkKKyAgICBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlLmNsZWFyKCkKKyAgICB1cmxsaWIucGFyc2UuY2xlYXJfY2FjaGUoKQorICAgIHVybGxpYi5yZXF1ZXN0LnVybGNsZWFudXAoKQorICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKKyAgICBtaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCisgICAgZmlsZWNtcC5fY2FjaGUuY2xlYXIoKQorICAgIHN0cnVjdC5fY2xlYXJjYWNoZSgpCisgICAgZG9jdGVzdC5tYXN0ZXIgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAjIERvbid0IHdvcnJ5IGFib3V0IHJlc2V0dGluZyB0aGUgY2FjaGUgaWYgY3R5cGVzIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGN0eXBlcy5fcmVzZXRfY2FjaGUoKQorCisgICAgIyBDb2xsZWN0IGN5Y2xpYyB0cmFzaCBhbmQgcmVhZCBtZW1vcnkgc3RhdGlzdGljcyBpbW1lZGlhdGVseSBhZnRlci4KKyAgICBmdW5jMSA9IHN5cy5nZXRhbGxvY2F0ZWRibG9ja3MKKyAgICBmdW5jMiA9IHN5cy5nZXR0b3RhbHJlZmNvdW50CisgICAgZ2MuY29sbGVjdCgpCisgICAgcmV0dXJuIGZ1bmMxKCksIGZ1bmMyKCksIGZkX2NvdW50KCkKKworCitkZWYgd2FybV9jYWNoZXMoKToKKyAgICAjIGNoYXIgY2FjaGUKKyAgICBzID0gYnl0ZXMocmFuZ2UoMjU2KSkKKyAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICBzW2k6aSsxXQorICAgICMgdW5pY29kZSBjYWNoZQorICAgIFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0KKyAgICAjIGludCBjYWNoZQorICAgIGxpc3QocmFuZ2UoLTUsIDI1NykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFmMmIyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdC5weQpAQCAtMCwwICsxLDI0NyBAQAoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IGltcG9ydGxpYgoraW1wb3J0IGlvCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJlZmxlYWsgaW1wb3J0IGRhc2hfUgorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnNhdmVfZW52IGltcG9ydCBzYXZlZF90ZXN0X2Vudmlyb25tZW50CisKKworIyBUZXN0IHJlc3VsdCBjb25zdGFudHMuCitQQVNTRUQgPSAxCitGQUlMRUQgPSAwCitFTlZfQ0hBTkdFRCA9IC0xCitTS0lQUEVEID0gLTIKK1JFU09VUkNFX0RFTklFRCA9IC0zCitJTlRFUlJVUFRFRCA9IC00CitDSElMRF9FUlJPUiA9IC01ICAgIyBlcnJvciBpbiBhIGNoaWxkIHByb2Nlc3MKKworIyBNaW5pbXVtIGR1cmF0aW9uIG9mIGEgdGVzdCB0byBkaXNwbGF5IGl0cyBkdXJhdGlvbiBvciB0byBtZW50aW9uIHRoYXQKKyMgdGhlIHRlc3QgaXMgcnVubmluZyBpbiBiYWNrZ3JvdW5kCitQUk9HUkVTU19NSU5fVElNRSA9IDMwLjAgICAjIHNlY29uZHMKKworCisKKyMgc21hbGwgc2V0IG9mIHRlc3RzIHRvIGRldGVybWluZSBpZiB3ZSBoYXZlIGEgYmFzaWNhbGx5IGZ1bmN0aW9uaW5nIGludGVycHJldGVyCisjIChpLmUuIGlmIGFueSBvZiB0aGVzZSBmYWlsLCB0aGVuIGFueXRoaW5nIGVsc2UgaXMgbGlrZWx5IHRvIGZvbGxvdykKK1NURFRFU1RTID0gWworICAgICd0ZXN0X2dyYW1tYXInLAorICAgICd0ZXN0X29wY29kZXMnLAorICAgICd0ZXN0X2RpY3QnLAorICAgICd0ZXN0X2J1aWx0aW4nLAorICAgICd0ZXN0X2V4Y2VwdGlvbnMnLAorICAgICd0ZXN0X3R5cGVzJywKKyAgICAndGVzdF91bml0dGVzdCcsCisgICAgJ3Rlc3RfZG9jdGVzdCcsCisgICAgJ3Rlc3RfZG9jdGVzdDInLAorICAgICd0ZXN0X3N1cHBvcnQnCitdCisKKyMgc2V0IG9mIHRlc3RzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBiZSBleGVjdXRlZCB3aGVuIHVzaW5nIHJlZ3J0ZXN0CitOT1RURVNUUyA9IHNldCgpCisKKworZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXBwbGljYWJsZSB0ZXN0IG1vZHVsZXMuIiIiCisgICAgdGVzdGRpciA9IGZpbmR0ZXN0ZGlyKHRlc3RkaXIpCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRlc3RkaXIpCisgICAgdGVzdHMgPSBbXQorICAgIG90aGVycyA9IHNldChzdGR0ZXN0cykgfCBub3R0ZXN0cworICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBtb2QsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKKyAgICAgICAgaWYgbW9kWzo1XSA9PSAidGVzdF8iIGFuZCBleHQgaW4gKCIucHkiLCAiIikgYW5kIG1vZCBub3QgaW4gb3RoZXJzOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZCkKKyAgICByZXR1cm4gc3RkdGVzdHMgKyBzb3J0ZWQodGVzdHMpCisKKworZGVmIHJ1bnRlc3QobnMsIHRlc3QpOgorICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0LgorCisgICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorICAgIHZlcmJvc2UgLS0gaWYgdHJ1ZSwgcHJpbnQgbW9yZSBtZXNzYWdlcworICAgIHF1aWV0IC0tIGlmIHRydWUsIGRvbid0IHByaW50ICdza2lwcGVkJyBtZXNzYWdlcyAocHJvYmFibHkgcmVkdW5kYW50KQorICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCisgICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cworICAgIG91dHB1dF9vbl9mYWlsdXJlIC0tIGlmIHRydWUsIGRpc3BsYXkgdGVzdCBvdXRwdXQgb24gZmFpbHVyZQorICAgIHRpbWVvdXQgLS0gZHVtcCB0aGUgdHJhY2ViYWNrIGFuZCBleGl0IGlmIGEgdGVzdCB0YWtlcyBtb3JlIHRoYW4KKyAgICAgICAgICAgICAgIHRpbWVvdXQgc2Vjb25kcworICAgIGZhaWxmYXN0LCBtYXRjaF90ZXN0cyAtLSBTZWUgcmVncnRlc3QgY29tbWFuZC1saW5lIGZsYWdzIGZvciB0aGVzZS4KKyAgICBwZ28gLS0gaWYgdHJ1ZSwgc3VwcHJlc3MgYW55IGluZm8gaXJyZWxldmFudCB0byBhIGdlbmVyYXRpbmcgYSBQR08gYnVpbGQKKworICAgIFJldHVybnMgdGhlIHR1cGxlIHJlc3VsdCwgdGVzdF90aW1lLCB3aGVyZSByZXN1bHQgaXMgb25lIG9mIHRoZSBjb25zdGFudHM6CisgICAgICAgIElOVEVSUlVQVEVEICAgICAgS2V5Ym9hcmRJbnRlcnJ1cHQgd2hlbiBydW4gdW5kZXIgLWoKKyAgICAgICAgUkVTT1VSQ0VfREVOSUVEICB0ZXN0IHNraXBwZWQgYmVjYXVzZSByZXNvdXJjZSBkZW5pZWQKKyAgICAgICAgU0tJUFBFRCAgICAgICAgICB0ZXN0IHNraXBwZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCisgICAgICAgIEVOVl9DSEFOR0VEICAgICAgdGVzdCBmYWlsZWQgYmVjYXVzZSBpdCBjaGFuZ2VkIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQKKyAgICAgICAgRkFJTEVEICAgICAgICAgICB0ZXN0IGZhaWxlZAorICAgICAgICBQQVNTRUQgICAgICAgICAgIHRlc3QgcGFzc2VkCisgICAgIiIiCisKKyAgICB2ZXJib3NlID0gbnMudmVyYm9zZQorICAgIHF1aWV0ID0gbnMucXVpZXQKKyAgICBodW50cmxlYWtzID0gbnMuaHVudHJsZWFrcworICAgIG91dHB1dF9vbl9mYWlsdXJlID0gbnMudmVyYm9zZTMKKyAgICBmYWlsZmFzdCA9IG5zLmZhaWxmYXN0CisgICAgbWF0Y2hfdGVzdHMgPSBucy5tYXRjaF90ZXN0cworICAgIHRpbWVvdXQgPSBucy50aW1lb3V0CisgICAgcGdvID0gbnMucGdvCisKKyAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQorICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQorICAgIHRyeToKKyAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCisgICAgICAgIGlmIGZhaWxmYXN0OgorICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCisKKyAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQorICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgorICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgorICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KKyAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQorICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCisKKyAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKG5zLCB0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSwgcGdvPXBnbykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSB2ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAorICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcihucywgdGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1ub3QgdmVyYm9zZSwgcGdvPXBnbykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCisgICAgICAgIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdCwgdmVyYm9zZSkKK3J1bnRlc3Quc3RyaW5naW8gPSBOb25lCisKKworZGVmIHJ1bnRlc3RfaW5uZXIobnMsIHRlc3QsIHZlcmJvc2UsIHF1aWV0LAorICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgZGlzcGxheV9mYWlsdXJlPVRydWUsICosIHBnbz1GYWxzZSk6CisgICAgc3VwcG9ydC51bmxvYWQodGVzdCkKKworICAgIHRlc3RfdGltZSA9IDAuMAorICAgIHJlZmxlYWsgPSBGYWxzZSAgIyBUcnVlIGlmIHRoZSB0ZXN0IGxlYWtlZCByZWZlcmVuY2VzLgorICAgIHRyeToKKyAgICAgICAgaWYgdGVzdC5zdGFydHN3aXRoKCd0ZXN0LicpIG9yIG5zLnRlc3RkaXI6CisgICAgICAgICAgICBhYnN0ZXN0ID0gdGVzdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBbHdheXMgaW1wb3J0IGl0IGZyb20gdGhlIHRlc3QgcGFja2FnZQorICAgICAgICAgICAgYWJzdGVzdCA9ICd0ZXN0LicgKyB0ZXN0CisgICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwgcGdvPXBnbykgYXMgZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHRoZV9tb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShhYnN0ZXN0KQorICAgICAgICAgICAgIyBJZiB0aGUgdGVzdCBoYXMgYSB0ZXN0X21haW4sIHRoYXQgd2lsbCBydW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAjIHRlc3RzLiAgSWYgbm90LCB1c2Ugbm9ybWFsIHVuaXR0ZXN0IHRlc3QgbG9hZGluZy4KKyAgICAgICAgICAgIHRlc3RfcnVubmVyID0gZ2V0YXR0cih0aGVfbW9kdWxlLCAidGVzdF9tYWluIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHRlc3RfcnVubmVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVubmVyKCk6CisgICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoZV9tb2R1bGUpCisgICAgICAgICAgICAgICAgICAgIGZvciBlcnJvciBpbiBsb2FkZXIuZXJyb3JzOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZXJyb3IsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGVzdHMiKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0cykKKyAgICAgICAgICAgIHRlc3RfcnVubmVyKCkKKyAgICAgICAgICAgIGlmIGh1bnRybGVha3M6CisgICAgICAgICAgICAgICAgcmVmbGVhayA9IGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCB0ZXN0X3J1bm5lciwgaHVudHJsZWFrcykKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQorICAgIGV4Y2VwdCBzdXBwb3J0LlJlc291cmNlRGVuaWVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IHF1aWV0IGFuZCBub3QgcGdvOgorICAgICAgICAgICAgcHJpbnQodGVzdCwgInNraXBwZWQgLS0iLCBtc2csIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBSRVNPVVJDRV9ERU5JRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgorICAgICAgICBpZiBub3QgcGdvOgorICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgIGZsdXNoPVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCIsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0OgorICAgICAgICBtc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisgICAgICAgIGlmIG5vdCBwZ286CisgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJjcmFzaGVkIC0tIiwgbXNnLCBmaWxlPXN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKKyAgICBlbHNlOgorICAgICAgICBpZiByZWZsZWFrOgorICAgICAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgICAgIGlmIGVudmlyb25tZW50LmNoYW5nZWQ6CisgICAgICAgICAgICByZXR1cm4gRU5WX0NIQU5HRUQsIHRlc3RfdGltZQorICAgICAgICByZXR1cm4gUEFTU0VELCB0ZXN0X3RpbWUKKworCitkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6CisgICAgaW1wb3J0IHNodXRpbAorICAgIGltcG9ydCBzdGF0CisgICAgaW1wb3J0IGdjCisKKyAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCisgICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0CisgICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgorICAgIGdjLmNvbGxlY3QoKQorCisgICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQorICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cworICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCisgICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQorICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKKyAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCisgICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKKyAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKKyAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6CisgICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQorICAgICAgICAgICAgbnVrZXIobmFtZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6CisgICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKKworCitkZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKKyAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkgb3Igb3MuY3VyZGlyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0X21wLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Y2MzJkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpAQCAtMCwwICsxLDI0NCBAQAoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHF1ZXVlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIk11bHRpcHJvY2VzcyBvcHRpb24gcmVxdWlyZXMgdGhyZWFkIHN1cHBvcnQiKQorICAgIHN5cy5leGl0KDIpCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCAoCisgICAgcnVudGVzdCwgSU5URVJSVVBURUQsIENISUxEX0VSUk9SLCBQUk9HUkVTU19NSU5fVElNRSkKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5zZXR1cCBpbXBvcnQgc2V0dXBfdGVzdHMKKworCisjIERpc3BsYXkgdGhlIHJ1bm5pbmcgdGVzdHMgaWYgbm90aGluZyBoYXBwZW5lZCBsYXN0IE4gc2Vjb25kcworUFJPR1JFU1NfVVBEQVRFID0gMzAuMCAgICMgc2Vjb25kcworCisjIElmIGludGVycnVwdGVkLCBkaXNwbGF5IHRoZSB3YWl0IHByb2dyZXNzIGV2ZXJ5IE4gc2Vjb25kcworV0FJVF9QUk9HUkVTUyA9IDIuMCAgICMgc2Vjb25kcworCisKK2RlZiBydW5fdGVzdF9pbl9zdWJwcm9jZXNzKHRlc3RuYW1lLCBucyk6CisgICAgIiIiUnVuIHRoZSBnaXZlbiB0ZXN0IGluIGEgc3VicHJvY2VzcyB3aXRoIC0tc2xhdmVhcmdzLgorCisgICAgbnMgaXMgdGhlIG9wdGlvbiBOYW1lc3BhY2UgcGFyc2VkIGZyb20gY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gcmVncnRlc3QKKyAgICBpcyBpbnZva2VkIGluIGEgc3VicHJvY2VzcyB3aXRoIHRoZSAtLXNsYXZlYXJncyBhcmd1bWVudDsgd2hlbiB0aGUKKyAgICBzdWJwcm9jZXNzIGV4aXRzLCBpdHMgcmV0dXJuIGNvZGUsIHN0ZG91dCBhbmQgc3RkZXJyIGFyZSByZXR1cm5lZCBhcyBhCisgICAgMy10dXBsZS4KKyAgICAiIiIKKyAgICBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0IFBvcGVuLCBQSVBFCisKKyAgICBuc19kaWN0ID0gdmFycyhucykKKyAgICBzbGF2ZWFyZ3MgPSAobnNfZGljdCwgdGVzdG5hbWUpCisgICAgc2xhdmVhcmdzID0ganNvbi5kdW1wcyhzbGF2ZWFyZ3MpCisKKyAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsICpzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpLAorICAgICAgICAgICAnLVgnLCAnZmF1bHRoYW5kbGVyJywKKyAgICAgICAgICAgJy1tJywgJ3Rlc3QucmVncnRlc3QnLAorICAgICAgICAgICAnLS1zbGF2ZWFyZ3MnLCBzbGF2ZWFyZ3NdCisgICAgaWYgbnMucGdvOgorICAgICAgICBjbWQgKz0gWyctLXBnbyddCisKKyAgICAjIFJ1bm5pbmcgdGhlIGNoaWxkIGZyb20gdGhlIHNhbWUgd29ya2luZyBkaXJlY3RvcnkgYXMgcmVncnRlc3QncyBvcmlnaW5hbAorICAgICMgaW52b2NhdGlvbiBlbnN1cmVzIHRoYXQgVEVNUERJUiBmb3IgdGhlIGNoaWxkIGlzIHRoZSBzYW1lIHdoZW4KKyAgICAjIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSBpcyB0cnVlLiBTZWUgaXNzdWUgMTUzMDAuCisgICAgcG9wZW4gPSBQb3BlbihjbWQsCisgICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCisgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKKyAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQorICAgIHdpdGggcG9wZW46CisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQorICAgICAgICByZXRjb2RlID0gcG9wZW4ud2FpdCgpCisgICAgcmV0dXJuIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyCisKKworZGVmIHJ1bl90ZXN0c19zbGF2ZShzbGF2ZWFyZ3MpOgorICAgIG5zX2RpY3QsIHRlc3RuYW1lID0ganNvbi5sb2FkcyhzbGF2ZWFyZ3MpCisgICAgbnMgPSB0eXBlcy5TaW1wbGVOYW1lc3BhY2UoKipuc19kaWN0KQorCisgICAgc2V0dXBfdGVzdHMobnMpCisKKyAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QobnMsIHRlc3RuYW1lKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmVzdWx0ID0gSU5URVJSVVBURUQsICcnCisgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIHJlc3VsdCA9IENISUxEX0VSUk9SLCBzdHIoZSkKKworICAgIHByaW50KCkgICAjIEZvcmNlIGEgbmV3bGluZSAoanVzdCBpbiBjYXNlKQorICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSwgZmx1c2g9VHJ1ZSkKKyAgICBzeXMuZXhpdCgwKQorCisKKyMgV2UgZG8gbm90IHVzZSBhIGdlbmVyYXRvciBzbyBtdWx0aXBsZSB0aHJlYWRzIGNhbiBjYWxsIG5leHQoKS4KK2NsYXNzIE11bHRpcHJvY2Vzc0l0ZXJhdG9yOgorCisgICAgIiIiQSB0aHJlYWQtc2FmZSBpdGVyYXRvciBvdmVyIHRlc3RzIGZvciBtdWx0aXByb2Nlc3MgbW9kZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0cyk6CisgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYudGVzdHMgPSB0ZXN0cworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYubG9jazoKKyAgICAgICAgICAgIGlmIHNlbGYuaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigndGVzdHMgaW50ZXJydXB0ZWQnKQorICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi50ZXN0cykKKworCitjbGFzcyBNdWx0aXByb2Nlc3NUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBlbmRpbmcsIG91dHB1dCwgbnMpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5wZW5kaW5nID0gcGVuZGluZworICAgICAgICBzZWxmLm91dHB1dCA9IG91dHB1dAorICAgICAgICBzZWxmLm5zID0gbnMKKyAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IE5vbmUKKworICAgIGRlZiBfcnVudGVzdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdCA9IG5leHQoc2VsZi5wZW5kaW5nKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gdGVzdAorCisgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgc2VsZi5ucykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gTm9uZQorCisgICAgICAgIHN0ZG91dCwgXywgcmVzdWx0ID0gc3Rkb3V0LnN0cmlwKCkucnBhcnRpdGlvbigiXG4iKQorICAgICAgICBpZiByZXRjb2RlICE9IDA6CisgICAgICAgICAgICByZXN1bHQgPSAoQ0hJTERfRVJST1IsICJFeGl0IGNvZGUgJXMiICUgcmV0Y29kZSkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgodGVzdCwgc3Rkb3V0LnJzdHJpcCgpLCBzdGRlcnIucnN0cmlwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBzZWxmLm91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXN1bHQgPSBqc29uLmxvYWRzKHJlc3VsdCkKKyAgICAgICAgc2VsZi5vdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0b3AgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgbm90IHN0b3A6CisgICAgICAgICAgICAgICAgc3RvcCA9IHNlbGYuX3J1bnRlc3QoKQorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByYWlzZQorCisKK2RlZiBydW5fdGVzdHNfbXVsdGlwcm9jZXNzKHJlZ3J0ZXN0KToKKyAgICBvdXRwdXQgPSBxdWV1ZS5RdWV1ZSgpCisgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc0l0ZXJhdG9yKHJlZ3J0ZXN0LnRlc3RzKQorICAgIHRlc3RfdGltZW91dCA9IHJlZ3J0ZXN0Lm5zLnRpbWVvdXQKKyAgICB1c2VfdGltZW91dCA9ICh0ZXN0X3RpbWVvdXQgaXMgbm90IE5vbmUpCisKKyAgICB3b3JrZXJzID0gW011bHRpcHJvY2Vzc1RocmVhZChwZW5kaW5nLCBvdXRwdXQsIHJlZ3J0ZXN0Lm5zKQorICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocmVncnRlc3QubnMudXNlX21wKV0KKyAgICBwcmludCgiUnVuIHRlc3RzIGluIHBhcmFsbGVsIHVzaW5nICVzIGNoaWxkIHByb2Nlc3NlcyIKKyAgICAgICAgICAlIGxlbih3b3JrZXJzKSkKKyAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgIHdvcmtlci5zdGFydCgpCisKKyAgICBkZWYgZ2V0X3J1bm5pbmcod29ya2Vycyk6CisgICAgICAgIHJ1bm5pbmcgPSBbXQorICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgICAgICBjdXJyZW50X3Rlc3QgPSB3b3JrZXIuY3VycmVudF90ZXN0CisgICAgICAgICAgICBpZiBub3QgY3VycmVudF90ZXN0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkdCA9IHRpbWUubW9ub3RvbmljKCkgLSB3b3JrZXIuc3RhcnRfdGltZQorICAgICAgICAgICAgaWYgZHQgPj0gUFJPR1JFU1NfTUlOX1RJTUU6CisgICAgICAgICAgICAgICAgcnVubmluZy5hcHBlbmQoJyVzICglLjBmIHNlYyknICUgKGN1cnJlbnRfdGVzdCwgZHQpKQorICAgICAgICByZXR1cm4gcnVubmluZworCisgICAgZmluaXNoZWQgPSAwCisgICAgdGVzdF9pbmRleCA9IDEKKyAgICBnZXRfdGltZW91dCA9IG1heChQUk9HUkVTU19VUERBVEUsIFBST0dSRVNTX01JTl9USU1FKQorICAgIHRyeToKKyAgICAgICAgd2hpbGUgZmluaXNoZWQgPCByZWdydGVzdC5ucy51c2VfbXA6CisgICAgICAgICAgICBpZiB1c2VfdGltZW91dDoKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGVzdF90aW1lb3V0LCBleGl0PVRydWUpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdGVtID0gb3V0cHV0LmdldCh0aW1lb3V0PWdldF90aW1lb3V0KQorICAgICAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBnZXRfcnVubmluZyh3b3JrZXJzKQorICAgICAgICAgICAgICAgIGlmIHJ1bm5pbmcgYW5kIG5vdCByZWdydGVzdC5ucy5wZ286CisgICAgICAgICAgICAgICAgICAgIHByaW50KCdydW5uaW5nOiAlcycgJSAnLCAnLmpvaW4ocnVubmluZykpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdGVzdCwgc3Rkb3V0LCBzdGRlcnIsIHJlc3VsdCA9IGl0ZW0KKyAgICAgICAgICAgIGlmIHRlc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJlZ3J0ZXN0LmFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCkKKworICAgICAgICAgICAgIyBEaXNwbGF5IHByb2dyZXNzCisgICAgICAgICAgICB0ZXh0ID0gdGVzdAorICAgICAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICAgICAgaWYgKG9rIG5vdCBpbiAoQ0hJTERfRVJST1IsIElOVEVSUlVQVEVEKQorICAgICAgICAgICAgICAgIGFuZCB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUUKKyAgICAgICAgICAgICAgICBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbyk6CisgICAgICAgICAgICAgICAgdGV4dCArPSAnICglLjBmIHNlYyknICUgdGVzdF90aW1lCisgICAgICAgICAgICBydW5uaW5nID0gZ2V0X3J1bm5pbmcod29ya2VycykKKyAgICAgICAgICAgIGlmIHJ1bm5pbmcgYW5kIG5vdCByZWdydGVzdC5ucy5wZ286CisgICAgICAgICAgICAgICAgdGV4dCArPSAnIC0tIHJ1bm5pbmc6ICVzJyAlICcsICcuam9pbihydW5uaW5nKQorICAgICAgICAgICAgcmVncnRlc3QuZGlzcGxheV9wcm9ncmVzcyh0ZXN0X2luZGV4LCB0ZXh0KQorCisgICAgICAgICAgICAjIENvcHkgc3Rkb3V0IGFuZCBzdGRlcnIgZnJvbSB0aGUgY2hpbGQgcHJvY2VzcworICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgIHByaW50KHN0ZG91dCwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICBwcmludChzdGRlcnIsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKworICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gQ0hJTERfRVJST1I6CisgICAgICAgICAgICAgICAgbXNnID0gIkNoaWxkIGVycm9yIG9uIHt9OiB7fSIuZm9ybWF0KHRlc3QsIHJlc3VsdFsxXSkKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQorICAgICAgICAgICAgdGVzdF9pbmRleCArPSAxCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByZWdydGVzdC5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgcGVuZGluZy5pbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgcHJpbnQoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCisKKyAgICAjIElmIHRlc3RzIGFyZSBpbnRlcnJ1cHRlZCwgd2FpdCB1bnRpbCB0ZXN0cyBjb21wbGV0ZQorICAgIHdhaXRfc3RhcnQgPSB0aW1lLm1vbm90b25pYygpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcnVubmluZyA9IFt3b3JrZXIuY3VycmVudF90ZXN0IGZvciB3b3JrZXIgaW4gd29ya2Vyc10KKyAgICAgICAgcnVubmluZyA9IGxpc3QoZmlsdGVyKGJvb2wsIHJ1bm5pbmcpKQorICAgICAgICBpZiBub3QgcnVubmluZzoKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZHQgPSB0aW1lLm1vbm90b25pYygpIC0gd2FpdF9zdGFydAorICAgICAgICBsaW5lID0gIldhaXRpbmcgZm9yICVzICglcyB0ZXN0cykiICUgKCcsICcuam9pbihydW5uaW5nKSwgbGVuKHJ1bm5pbmcpKQorICAgICAgICBpZiBkdCA+PSBXQUlUX1BST0dSRVNTOgorICAgICAgICAgICAgbGluZSA9ICIlcyBzaW5jZSAlLjBmIHNlYyIgJSAobGluZSwgZHQpCisgICAgICAgIHByaW50KGxpbmUpCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIHdvcmtlci5qb2luKFdBSVRfUFJPR1JFU1MpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9zYXZlX2Vudi5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjllMTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zYXZlX2Vudi5weQpAQCAtMCwwICsxLDI4NiBAQAoraW1wb3J0IGJ1aWx0aW5zCitpbXBvcnQgbG9jYWxlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcsIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZQorCisKKyMgVW5pdCB0ZXN0cyBhcmUgc3VwcG9zZWQgdG8gbGVhdmUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB1bmNoYW5nZWQKKyMgb25jZSB0aGV5IGNvbXBsZXRlLiAgQnV0IHNvbWV0aW1lcyB0ZXN0cyBoYXZlIGJ1Z3MsIGVzcGVjaWFsbHkgd2hlbgorIyB0ZXN0cyBmYWlsLCBhbmQgdGhlIGNoYW5nZXMgdG8gZW52aXJvbm1lbnQgZ28gb24gdG8gbWVzcyB1cCBvdGhlcgorIyB0ZXN0cy4gIFRoaXMgY2FuIGNhdXNlIGlzc3VlcyB3aXRoIGJ1aWxkYm90IHN0YWJpbGl0eSwgc2luY2UgdGVzdHMKKyMgYXJlIHJ1biBpbiByYW5kb20gb3JkZXIgYW5kIHNvIHByb2JsZW1zIG1heSBhcHBlYXIgdG8gY29tZSBhbmQgZ28uCisjIFRoZXJlIGFyZSBhIGZldyB0aGluZ3Mgd2UgY2FuIHNhdmUgYW5kIHJlc3RvcmUgdG8gbWl0aWdhdGUgdGhpcywgYW5kCisjIHRoZSBmb2xsb3dpbmcgY29udGV4dCBtYW5hZ2VyIGhhbmRsZXMgdGhpcyB0YXNrLgorCitjbGFzcyBzYXZlZF90ZXN0X2Vudmlyb25tZW50OgorICAgICIiIlNhdmUgYml0cyBvZiB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgcmVzdG9yZSB0aGVtIGF0IGJsb2NrIGV4aXQuCisKKyAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3RuYW1lLCB2ZXJib3NlLCBxdWlldCk6CisgICAgICAgICAgICAjc3R1ZmYKKworICAgIFVubGVzcyBxdWlldCBpcyBUcnVlLCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBzdGRlcnIgaWYgYW55IG9mCisgICAgdGhlIHNhdmVkIGl0ZW1zIHdhcyBjaGFuZ2VkIGJ5IHRoZSB0ZXN0LiAgVGhlIGF0dHJpYnV0ZSAnY2hhbmdlZCcKKyAgICBpcyBpbml0aWFsbHkgRmFsc2UsIGJ1dCBpcyBzZXQgdG8gVHJ1ZSBpZiBhIGNoYW5nZSBpcyBkZXRlY3RlZC4KKworICAgIElmIHZlcmJvc2UgaXMgbW9yZSB0aGFuIDEsIHRoZSBiZWZvcmUgYW5kIGFmdGVyIHN0YXRlIG9mIGNoYW5nZWQKKyAgICBpdGVtcyBpcyBhbHNvIHByaW50ZWQuCisgICAgIiIiCisKKyAgICBjaGFuZ2VkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0bmFtZSwgdmVyYm9zZT0wLCBxdWlldD1GYWxzZSwgKiwgcGdvPUZhbHNlKToKKyAgICAgICAgc2VsZi50ZXN0bmFtZSA9IHRlc3RuYW1lCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5xdWlldCA9IHF1aWV0CisgICAgICAgIHNlbGYucGdvID0gcGdvCisKKyAgICAjIFRvIGFkZCB0aGluZ3MgdG8gc2F2ZSBhbmQgcmVzdG9yZSwgYWRkIGEgbmFtZSBYWFggdG8gdGhlIHJlc291cmNlcyBsaXN0CisgICAgIyBhbmQgYWRkIGNvcnJlc3BvbmRpbmcgZ2V0X1hYWC9yZXN0b3JlX1hYWCBmdW5jdGlvbnMuICBnZXRfWFhYIHNob3VsZAorICAgICMgcmV0dXJuIHRoZSB2YWx1ZSB0byBiZSBzYXZlZCBhbmQgY29tcGFyZWQgYWdhaW5zdCBhIHNlY29uZCBjYWxsIHRvIHRoZQorICAgICMgZ2V0IGZ1bmN0aW9uIHdoZW4gdGVzdCBleGVjdXRpb24gY29tcGxldGVzLiAgcmVzdG9yZV9YWFggc2hvdWxkIGFjY2VwdAorICAgICMgdGhlIHNhdmVkIHZhbHVlIGFuZCByZXN0b3JlIHRoZSByZXNvdXJjZSB1c2luZyBpdC4gIEl0IHdpbGwgYmUgY2FsbGVkIGlmCisgICAgIyBhbmQgb25seSBpZiBhIGNoYW5nZSBpbiB0aGUgdmFsdWUgaXMgZGV0ZWN0ZWQuCisgICAgIworICAgICMgTm90ZTogWFhYIHdpbGwgaGF2ZSBhbnkgJy4nIHJlcGxhY2VkIHdpdGggJ18nIGNoYXJhY3RlcnMgd2hlbiBkZXRlcm1pbmluZworICAgICMgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG5hbWVzLgorCisgICAgcmVzb3VyY2VzID0gKCdzeXMuYXJndicsICdjd2QnLCAnc3lzLnN0ZGluJywgJ3N5cy5zdGRvdXQnLCAnc3lzLnN0ZGVycicsCisgICAgICAgICAgICAgICAgICdvcy5lbnZpcm9uJywgJ3N5cy5wYXRoJywgJ3N5cy5wYXRoX2hvb2tzJywgJ19faW1wb3J0X18nLAorICAgICAgICAgICAgICAgICAnd2FybmluZ3MuZmlsdGVycycsICdhc3luY29yZS5zb2NrZXRfbWFwJywKKyAgICAgICAgICAgICAgICAgJ2xvZ2dpbmcuX2hhbmRsZXJzJywgJ2xvZ2dpbmcuX2hhbmRsZXJMaXN0JywgJ3N5cy5nZXR0cmFjZScsCisgICAgICAgICAgICAgICAgICdzeXMud2Fybm9wdGlvbnMnLAorICAgICAgICAgICAgICAgICAjIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkgbWF5IHJlbGVhc2UgcmVmCisgICAgICAgICAgICAgICAgICMgdG8gYSB0aHJlYWQsIHNvIGNoZWNrIHByb2Nlc3NlcyBmaXJzdC4KKyAgICAgICAgICAgICAgICAgJ211bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZycsICd0aHJlYWRpbmcuX2RhbmdsaW5nJywKKyAgICAgICAgICAgICAgICAgJ3N5c2NvbmZpZy5fQ09ORklHX1ZBUlMnLCAnc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMnLAorICAgICAgICAgICAgICAgICAnZmlsZXMnLCAnbG9jYWxlJywgJ3dhcm5pbmdzLnNob3d3YXJuaW5nJywKKyAgICAgICAgICAgICAgICAgJ3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMnLCAnc2h1dGlsX3VucGFja19mb3JtYXRzJywKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgZ2V0X3N5c19hcmd2KHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLmFyZ3YpLCBzeXMuYXJndiwgc3lzLmFyZ3ZbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfYXJndihzZWxmLCBzYXZlZF9hcmd2KToKKyAgICAgICAgc3lzLmFyZ3YgPSBzYXZlZF9hcmd2WzFdCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZWRfYXJndlsyXQorCisgICAgZGVmIGdldF9jd2Qoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5nZXRjd2QoKQorICAgIGRlZiByZXN0b3JlX2N3ZChzZWxmLCBzYXZlZF9jd2QpOgorICAgICAgICBvcy5jaGRpcihzYXZlZF9jd2QpCisKKyAgICBkZWYgZ2V0X3N5c19zdGRvdXQoc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3Rkb3V0CisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZG91dChzZWxmLCBzYXZlZF9zdGRvdXQpOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZWRfc3Rkb3V0CisKKyAgICBkZWYgZ2V0X3N5c19zdGRlcnIoc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3RkZXJyCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGVycihzZWxmLCBzYXZlZF9zdGRlcnIpOgorICAgICAgICBzeXMuc3RkZXJyID0gc2F2ZWRfc3RkZXJyCisKKyAgICBkZWYgZ2V0X3N5c19zdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRpbgorICAgIGRlZiByZXN0b3JlX3N5c19zdGRpbihzZWxmLCBzYXZlZF9zdGRpbik6CisgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVkX3N0ZGluCisKKyAgICBkZWYgZ2V0X29zX2Vudmlyb24oc2VsZik6CisgICAgICAgIHJldHVybiBpZChvcy5lbnZpcm9uKSwgb3MuZW52aXJvbiwgZGljdChvcy5lbnZpcm9uKQorICAgIGRlZiByZXN0b3JlX29zX2Vudmlyb24oc2VsZiwgc2F2ZWRfZW52aXJvbik6CisgICAgICAgIG9zLmVudmlyb24gPSBzYXZlZF9lbnZpcm9uWzFdCisgICAgICAgIG9zLmVudmlyb24uY2xlYXIoKQorICAgICAgICBvcy5lbnZpcm9uLnVwZGF0ZShzYXZlZF9lbnZpcm9uWzJdKQorCisgICAgZGVmIGdldF9zeXNfcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoKSwgc3lzLnBhdGgsIHN5cy5wYXRoWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3BhdGgoc2VsZiwgc2F2ZWRfcGF0aCk6CisgICAgICAgIHN5cy5wYXRoID0gc2F2ZWRfcGF0aFsxXQorICAgICAgICBzeXMucGF0aFs6XSA9IHNhdmVkX3BhdGhbMl0KKworICAgIGRlZiBnZXRfc3lzX3BhdGhfaG9va3Moc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMucGF0aF9ob29rcyksIHN5cy5wYXRoX2hvb2tzLCBzeXMucGF0aF9ob29rc1s6XQorICAgIGRlZiByZXN0b3JlX3N5c19wYXRoX2hvb2tzKHNlbGYsIHNhdmVkX2hvb2tzKToKKyAgICAgICAgc3lzLnBhdGhfaG9va3MgPSBzYXZlZF9ob29rc1sxXQorICAgICAgICBzeXMucGF0aF9ob29rc1s6XSA9IHNhdmVkX2hvb2tzWzJdCisKKyAgICBkZWYgZ2V0X3N5c19nZXR0cmFjZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5nZXR0cmFjZSgpCisgICAgZGVmIHJlc3RvcmVfc3lzX2dldHRyYWNlKHNlbGYsIHRyYWNlX2Z4bik6CisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZV9meG4pCisKKyAgICBkZWYgZ2V0X19faW1wb3J0X18oc2VsZik6CisgICAgICAgIHJldHVybiBidWlsdGlucy5fX2ltcG9ydF9fCisgICAgZGVmIHJlc3RvcmVfX19pbXBvcnRfXyhzZWxmLCBpbXBvcnRfKToKKyAgICAgICAgYnVpbHRpbnMuX19pbXBvcnRfXyA9IGltcG9ydF8KKworICAgIGRlZiBnZXRfd2FybmluZ3NfZmlsdGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHdhcm5pbmdzLmZpbHRlcnMpLCB3YXJuaW5ncy5maWx0ZXJzLCB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgZGVmIHJlc3RvcmVfd2FybmluZ3NfZmlsdGVycyhzZWxmLCBzYXZlZF9maWx0ZXJzKToKKyAgICAgICAgd2FybmluZ3MuZmlsdGVycyA9IHNhdmVkX2ZpbHRlcnNbMV0KKyAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IHNhdmVkX2ZpbHRlcnNbMl0KKworICAgIGRlZiBnZXRfYXN5bmNvcmVfc29ja2V0X21hcChzZWxmKToKKyAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKKyAgICAgICAgIyBYWFggTWFraW5nIGEgY29weSBrZWVwcyBvYmplY3RzIGFsaXZlIHVudGlsIF9fZXhpdF9fIGdldHMgY2FsbGVkLgorICAgICAgICByZXR1cm4gYXN5bmNvcmUgYW5kIGFzeW5jb3JlLnNvY2tldF9tYXAuY29weSgpIG9yIHt9CisgICAgZGVmIHJlc3RvcmVfYXN5bmNvcmVfc29ja2V0X21hcChzZWxmLCBzYXZlZF9tYXApOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICBpZiBhc3luY29yZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbChpZ25vcmVfYWxsPVRydWUpCisgICAgICAgICAgICBhc3luY29yZS5zb2NrZXRfbWFwLnVwZGF0ZShzYXZlZF9tYXApCisKKyAgICBkZWYgZ2V0X3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZik6CisgICAgICAgICMgd2UgY291bGQgY2FsbCBnZXRfYXJjaGl2ZXNfZm9ybWF0cygpIGJ1dCB0aGF0IG9ubHkgcmV0dXJucyB0aGUKKyAgICAgICAgIyByZWdpc3RyeSBrZXlzOyB3ZSB3YW50IHRvIGNoZWNrIHRoZSB2YWx1ZXMgdG9vICh0aGUgZnVuY3Rpb25zIHRoYXQKKyAgICAgICAgIyBhcmUgcmVnaXN0ZXJlZCkKKyAgICAgICAgcmV0dXJuIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLCBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMgPSBzYXZlZFswXQorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy5jbGVhcigpCisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKKworICAgIGRlZiBnZXRfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2h1dGlsLl9VTlBBQ0tfRk9STUFUUywgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTID0gc2F2ZWRbMF0KKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy5jbGVhcigpCisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQorCisgICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVycyhzZWxmKToKKyAgICAgICAgIyBfaGFuZGxlcnMgaXMgYSBXZWFrVmFsdWVEaWN0aW9uYXJ5CisgICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVycyksIGxvZ2dpbmcuX2hhbmRsZXJzLCBsb2dnaW5nLl9oYW5kbGVycy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVycyhzZWxmLCBzYXZlZF9oYW5kbGVycyk6CisgICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYpOgorICAgICAgICAjIF9oYW5kbGVyTGlzdCBpcyBhIGxpc3Qgb2Ygd2Vha3JlZnMgdG8gaGFuZGxlcnMKKyAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJMaXN0KSwgbG9nZ2luZy5faGFuZGxlckxpc3QsIGxvZ2dpbmcuX2hhbmRsZXJMaXN0WzpdCisgICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZiwgc2F2ZWRfaGFuZGxlckxpc3QpOgorICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKKyAgICAgICAgcGFzcworCisgICAgZGVmIGdldF9zeXNfd2Fybm9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMud2Fybm9wdGlvbnMpLCBzeXMud2Fybm9wdGlvbnMsIHN5cy53YXJub3B0aW9uc1s6XQorICAgIGRlZiByZXN0b3JlX3N5c193YXJub3B0aW9ucyhzZWxmLCBzYXZlZF9vcHRpb25zKToKKyAgICAgICAgc3lzLndhcm5vcHRpb25zID0gc2F2ZWRfb3B0aW9uc1sxXQorICAgICAgICBzeXMud2Fybm9wdGlvbnNbOl0gPSBzYXZlZF9vcHRpb25zWzJdCisKKyAgICAjIENvbnRyb2xsaW5nIGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gVGhyZWFkIG9iamVjdHMgY2FuIG1ha2UgaXQgZWFzaWVyCisgICAgIyB0byB0cmFjayByZWZlcmVuY2UgbGVha3MuCisgICAgZGVmIGdldF90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKKyAgICAgICAgcmV0dXJuIHRocmVhZGluZy5fZGFuZ2xpbmcuY29weSgpCisgICAgZGVmIHJlc3RvcmVfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmLCBzYXZlZCk6CisgICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy5jbGVhcigpCisgICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQorCisgICAgIyBTYW1lIGZvciBQcm9jZXNzIG9iamVjdHMKKyAgICBkZWYgZ2V0X211bHRpcHJvY2Vzc2luZ19wcm9jZXNzX19kYW5nbGluZyhzZWxmKToKKyAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgVW5qb2luZWQgcHJvY2VzcyBvYmplY3RzIGNhbiBzdXJ2aXZlIGFmdGVyIHByb2Nlc3MgZXhpdHMKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKQorICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQorICAgICAgICByZXR1cm4gbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX211bHRpcHJvY2Vzc2luZ19wcm9jZXNzX19kYW5nbGluZyhzZWxmLCBzYXZlZCk6CisgICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nLmNsZWFyKCkKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKKworICAgIGRlZiBnZXRfc3lzY29uZmlnX19DT05GSUdfVkFSUyhzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGRpY3QgaXMgaW5pdGlhbGl6ZWQKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdwcmVmaXgnKQorICAgICAgICByZXR1cm4gKGlkKHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpLCBzeXNjb25maWcuX0NPTkZJR19WQVJTLAorICAgICAgICAgICAgICAgIGRpY3Qoc3lzY29uZmlnLl9DT05GSUdfVkFSUykpCisgICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19DT05GSUdfVkFSUyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMgPSBzYXZlZFsxXQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLmNsZWFyKCkKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy51cGRhdGUoc2F2ZWRbMl0pCisKKyAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fSU5TVEFMTF9TQ0hFTUVTKHNlbGYpOgorICAgICAgICByZXR1cm4gKGlkKHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTKSwgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMsCisgICAgICAgICAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY29weSgpKQorICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fSU5TVEFMTF9TQ0hFTUVTKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMgPSBzYXZlZFsxXQorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jbGVhcigpCisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLnVwZGF0ZShzYXZlZFsyXSkKKworICAgIGRlZiBnZXRfZmlsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzb3J0ZWQoZm4gKyAoJy8nIGlmIG9zLnBhdGguaXNkaXIoZm4pIGVsc2UgJycpCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoKSkKKyAgICBkZWYgcmVzdG9yZV9maWxlcyhzZWxmLCBzYXZlZF92YWx1ZSk6CisgICAgICAgIGZuID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgZm4gbm90IGluIHNhdmVkX3ZhbHVlIGFuZCAoZm4gKyAnLycpIG5vdCBpbiBzYXZlZF92YWx1ZToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LnVubGluayhmbikKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcihmbik6CisgICAgICAgICAgICAgICAgc3VwcG9ydC5ybXRyZWUoZm4pCisKKyAgICBfbGMgPSBbZ2V0YXR0cihsb2NhbGUsIGxjKSBmb3IgbGMgaW4gZGlyKGxvY2FsZSkKKyAgICAgICAgICAgaWYgbGMuc3RhcnRzd2l0aCgnTENfJyldCisgICAgZGVmIGdldF9sb2NhbGUoc2VsZik6CisgICAgICAgIHBhaXJpbmdzID0gW10KKyAgICAgICAgZm9yIGxjIGluIHNlbGYuX2xjOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhaXJpbmdzLmFwcGVuZCgobGMsIGxvY2FsZS5zZXRsb2NhbGUobGMsIE5vbmUpKSkKKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICByZXR1cm4gcGFpcmluZ3MKKyAgICBkZWYgcmVzdG9yZV9sb2NhbGUoc2VsZiwgc2F2ZWQpOgorICAgICAgICBmb3IgbGMsIHNldHRpbmcgaW4gc2F2ZWQ6CisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxjLCBzZXR0aW5nKQorCisgICAgZGVmIGdldF93YXJuaW5nc19zaG93d2FybmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHdhcm5pbmdzLnNob3d3YXJuaW5nCisgICAgZGVmIHJlc3RvcmVfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZiwgZnhuKToKKyAgICAgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcgPSBmeG4KKworICAgIGRlZiByZXNvdXJjZV9pbmZvKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnJlc291cmNlczoKKyAgICAgICAgICAgIG1ldGhvZF9zdWZmaXggPSBuYW1lLnJlcGxhY2UoJy4nLCAnXycpCisgICAgICAgICAgICBnZXRfbmFtZSA9ICdnZXRfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHJlc3RvcmVfbmFtZSA9ICdyZXN0b3JlXycgKyBtZXRob2Rfc3VmZml4CisgICAgICAgICAgICB5aWVsZCBuYW1lLCBnZXRhdHRyKHNlbGYsIGdldF9uYW1lKSwgZ2V0YXR0cihzZWxmLCByZXN0b3JlX25hbWUpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLnNhdmVkX3ZhbHVlcyA9IGRpY3QoKG5hbWUsIGdldCgpKSBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWxmLnJlc291cmNlX2luZm8oKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKKyAgICAgICAgc2F2ZWRfdmFsdWVzID0gc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgZGVsIHNlbGYuc2F2ZWRfdmFsdWVzCisgICAgICAgIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCk6CisgICAgICAgICAgICBjdXJyZW50ID0gZ2V0KCkKKyAgICAgICAgICAgIG9yaWdpbmFsID0gc2F2ZWRfdmFsdWVzLnBvcChuYW1lKQorICAgICAgICAgICAgIyBDaGVjayBmb3IgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UncyB2YWx1ZQorICAgICAgICAgICAgaWYgY3VycmVudCAhPSBvcmlnaW5hbDoKKyAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmVzdG9yZShvcmlnaW5hbCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5xdWlldCBhbmQgbm90IHNlbGYucGdvOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZyAtLSB7fSB3YXMgbW9kaWZpZWQgYnkge30iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzZWxmLnRlc3RuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NldHVwLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyNDUzMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NldHVwLnB5CkBAIC0wLDAgKzEsMTIxIEBACitpbXBvcnQgYXRleGl0CitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IGdjCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ2MgPSBOb25lCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5yZWZsZWFrIGltcG9ydCB3YXJtX2NhY2hlcworCisKK2RlZiBzZXR1cF90ZXN0cyhucyk6CisgICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycyAoZS5nLiBzZWdmYXVsdCkKKyAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKGFsbF90aHJlYWRzPVRydWUpCisKKyAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gU0lHQUxSTSBvciBTSUdVU1IxIHNpZ25hbAorICAgIHNpZ25hbHMgPSBbXQorICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpOgorICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHQUxSTSkKKyAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKToKKyAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR1VTUjEpCisgICAgZm9yIHNpZ251bSBpbiBzaWduYWxzOgorICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbnVtLCBjaGFpbj1UcnVlKQorCisgICAgcmVwbGFjZV9zdGRvdXQoKQorICAgIHN1cHBvcnQucmVjb3JkX29yaWdpbmFsX3N0ZG91dChzeXMuc3Rkb3V0KQorCisgICAgaWYgbnMudGVzdGRpcjoKKyAgICAgICAgIyBQcmVwZW5kIHRlc3QgZGlyZWN0b3J5IHRvIHN5cy5wYXRoLCBzbyBydW50ZXN0KCkgd2lsbCBiZSBhYmxlCisgICAgICAgICMgdG8gbG9jYXRlIHRlc3RzCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmFic3BhdGgobnMudGVzdGRpcikpCisKKyAgICAjIFNvbWUgdGltZXMgX19wYXRoX18gYW5kIF9fZmlsZV9fIGFyZSBub3QgYWJzb2x1dGUgKGUuZy4gd2hpbGUgcnVubmluZyBmcm9tCisgICAgIyBMaWIvKSBhbmQsIGlmIHdlIGNoYW5nZSB0aGUgQ1dEIHRvIHJ1biB0aGUgdGVzdHMgaW4gYSB0ZW1wb3JhcnkgZGlyLCBzb21lCisgICAgIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KKyAgICAjIFRoZXNlIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGZpcnN0IGluIHN5cy5wYXRoWzBdIChzbyAnJyAtLSB0aGUgQ1dEKSBhbmQgaWYKKyAgICAjIHRoZXkgYXJlIGZvdW5kIGluIHRoZSBDV0QgdGhlaXIgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgcmVsYXRpdmUgKHRoaXMKKyAgICAjIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKKyAgICAjIG5vdCBmb3VuZCBpbiB0aGUgQ1dELCBhbmQgc2luY2UgdGhlIG90aGVyIHBhdGhzIGluIHN5cy5wYXRoWzE6XSBhcmUgYWJzb2x1dGUKKyAgICAjIChzaXRlLnB5IGFic29sdXRpemUgdGhlbSksIHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSBhYnNvbHV0ZSB0b28uCisgICAgIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgorICAgICMgdGhlIHBhY2thZ2VzIHRvIHByZXZlbnQgbGF0ZXIgaW1wb3J0cyB0byBmYWlsIHdoZW4gdGhlIENXRCBpcyBkaWZmZXJlbnQuCisgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgZm9yIGluZGV4LCBwYXRoIGluIGVudW1lcmF0ZShtb2R1bGUuX19wYXRoX18pOgorICAgICAgICAgICAgICAgIG1vZHVsZS5fX3BhdGhfX1tpbmRleF0gPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgbW9kdWxlLl9fZmlsZV9fID0gb3MucGF0aC5hYnNwYXRoKG1vZHVsZS5fX2ZpbGVfXykKKworICAgICMgTWFjT1NYIChhLmsuYS4gRGFyd2luKSBoYXMgYSBkZWZhdWx0IHN0YWNrIHNpemUgdGhhdCBpcyB0b28gc21hbGwKKyAgICAjIGZvciBkZWVwbHkgcmVjdXJzaXZlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXZSBzZWUgdGhpcyBhcyBjcmFzaGVzIGluCisgICAgIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCisgICAgIyBmaXggaXMgdG8gc2V0IHRoZSBzdGFjayBsaW1pdCB0byAyMDQ4LgorICAgICMgVGhpcyBhcHByb2FjaCBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIG90aGVyIFVuaXh5IHBsYXRmb3JtcyB0aGF0CisgICAgIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCByZXNvdXJjZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzb2Z0LCBoYXJkID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSykKKyAgICAgICAgICAgIG5ld3NvZnQgPSBtaW4oaGFyZCwgbWF4KHNvZnQsIDEwMjQqMjA0OCkpCisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCisKKyAgICBpZiBucy5odW50cmxlYWtzOgorICAgICAgICB1bml0dGVzdC5CYXNlVGVzdFN1aXRlLl9jbGVhbnVwID0gRmFsc2UKKworICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKKyAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgorICAgICAgICB3YXJtX2NhY2hlcygpCisKKyAgICBpZiBucy5tZW1saW1pdCBpcyBub3QgTm9uZToKKyAgICAgICAgc3VwcG9ydC5zZXRfbWVtbGltaXQobnMubWVtbGltaXQpCisKKyAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmU6CisgICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQorCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgbXN2Y3J0LlNldEVycm9yTW9kZShtc3ZjcnQuU0VNX0ZBSUxDUklUSUNBTEVSUk9SU3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT0dQRkFVTFRFUlJPUkJPWHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PT1BFTkZJTEVFUlJPUkJPWCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyByZWxlYXNlIGJ1aWxkCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06CisgICAgICAgICAgICAgICAgaWYgbnMudmVyYm9zZSBhbmQgbnMudmVyYm9zZSA+PSAyOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCBtc3ZjcnQuQ1JUREJHX01PREVfRklMRSkKKyAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydEZpbGUobSwgbXN2Y3J0LkNSVERCR19GSUxFX1NUREVSUikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gbnMudXNlX3Jlc291cmNlcworCisKK2RlZiByZXBsYWNlX3N0ZG91dCgpOgorICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgorICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCisgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAorICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCisgICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCisgICAgICAgIGNsb3NlZmQ9RmFsc2UsCisgICAgICAgIG5ld2xpbmU9J1xuJykKKworICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgorICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkgYi9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CmluZGV4IGFmZDY4NzMuLjA1NWJmMjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbG9ja190ZXN0cy5weQpAQCAtNyw2ICs3LDcgQEAKIGZyb20gX3RocmVhZCBpbXBvcnQgc3RhcnRfbmV3X3RocmVhZCwgVElNRU9VVF9NQVgKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKQEAgLTE5OCw2ICsxOTksMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRzWzBdKQogICAgICAgICBzZWxmLmFzc2VydFRpbWVvdXQocmVzdWx0c1sxXSwgMC41KQogCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9leGlzdHMoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobG9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocmVmKCkpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmX2RlbGV0ZWQoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobG9jaykKKyAgICAgICAgZGVsIGxvY2sKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVmKCkpCisKIAogY2xhc3MgTG9ja1Rlc3RzKEJhc2VMb2NrVGVzdHMpOgogICAgICIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGYyNTJhMGEuLjhkZWI1NmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgICAgICAgICBiJzAnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1AKICAgICAgICAgICAgIGInMScsICAgICAgICAgICAgICAgICAgICAgICAjIFBPUF9NQVJLCiAgICAgICAgICAgICBiJzInLCAgICAgICAgICAgICAgICAgICAgICAgIyBEVVAKLSAgICAgICAgICAgICMgYicoMicsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKDInLAogICAgICAgICAgICAgYidSJywgICAgICAgICAgICAgICAgICAgICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJylSJywKICAgICAgICAgICAgIGInYScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgIGInTmInLAogICAgICAgICAgICAgYidkJywgICAgICAgICAgICAgICAgICAgICAgICMgRElDVAogICAgICAgICAgICAgYidlJywgICAgICAgICAgICAgICAgICAgICAgICMgQVBQRU5EUwotICAgICAgICAgICAgIyBiJyhlJywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhlJywKICAgICAgICAgICAgIGInaWJ1aWx0aW5zXG5saXN0XG4nLCAgICAgICAjIElOU1QKICAgICAgICAgICAgIGInbCcsICAgICAgICAgICAgICAgICAgICAgICAjIExJU1QKICAgICAgICAgICAgIGInbycsICAgICAgICAgICAgICAgICAgICAgICAjIE9CSgpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgIGInTk5zJywKICAgICAgICAgICAgIGIndCcsICAgICAgICAgICAgICAgICAgICAgICAjIFRVUExFCiAgICAgICAgICAgICBiJ3UnLCAgICAgICAgICAgICAgICAgICAgICAgIyBTRVRJVEVNUwotICAgICAgICAgICAgIyBiJyh1JywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgZG9lc24ndCByYWlzZQorICAgICAgICAgICAgYicodScsCiAgICAgICAgICAgICBiJ30oTnUnLAogICAgICAgICAgICAgYidceDgxJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKCiAgICAgICAgICAgICBiJylceDgxJywKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBiJ05ceDg3JywKICAgICAgICAgICAgIGInTk5ceDg3JywKICAgICAgICAgICAgIGInXHg5MCcsICAgICAgICAgICAgICAgICAgICAjIEFERElURU1TCi0gICAgICAgICAgICAjIGInKFx4OTAnLCAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGInKFx4OTAnLAogICAgICAgICAgICAgYidceDkxJywgICAgICAgICAgICAgICAgICAgICMgRlJPWkVOU0VUCiAgICAgICAgICAgICBiJ1x4OTInLCAgICAgICAgICAgICAgICAgICAgIyBORVdPQkpfRVgKICAgICAgICAgICAgIGInKX1ceDkyJywKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKICAgICBkZWYgdGVzdF9iYWRfbWFyayhzZWxmKToKICAgICAgICAgYmFkcGlja2xlcyA9IFsKLSAgICAgICAgICAgICMgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAorICAgICAgICAgICAgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAogICAgICAgICAgICAgYidOKDInLCAgICAgICAgICAgICAgICAgICAgICMgRFVQCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKShSJywgICAgIyBSRURVQ0UKICAgICAgICAgICAgIGInY2J1aWx0aW5zXG5saXN0XG4oKVInLApAQCAtMTA4MSw3ICsxMDgxLDcgQEAKICAgICAgICAgICAgIGInTihceDk0JywgICAgICAgICAgICAgICAgICAjIE1FTU9JWkUKICAgICAgICAgXQogICAgICAgICBmb3IgcCBpbiBiYWRwaWNrbGVzOgotICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX21hcmtfZXJyb3JzLCBwKQorICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX3N0YWNrX2Vycm9ycywgcCkKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9kYXRhKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VucGlja2xpbmdfZXJyb3IoRU9GRXJyb3IsIGInJykKQEAgLTE4NTUsMTYgKzE4NTUsMTQgQEAKICAgICAgICAgeC5hYmMgPSA2NjYKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHByb3RvPXByb3RvKToKLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgeCwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgaWYgcHJvdG8gPCAxOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInXG5MNjQyMDYnLCBzKSAgIyBMT05HCiAgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNXHhjZVx4ZmEnLCBzKSAgIyBCSU5JTlQyCisgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidYXHgwNFx4MDBceDAwXHgwMEZBQ0UnLCBzKSAgIyBCSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHByb3RvID49IDQKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1x4OGNceDA0RkFDRScsIHMpICAjIFNIT1JUX0JJTlVOSUNPREUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkpfRVgsIHMpLApAQCAtMjU4MywxMSArMjU4MSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGluZ0Vycm9yLCBCYWRQaWNrbGVyKCkuZHVtcCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGlja2xlLlVucGlja2xpbmdFcnJvciwgQmFkVW5waWNrbGVyKCkubG9hZCkKIAotICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKLSAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAotICAgICAgICBzID0gYnl0ZXMoWzB4NTgsIDAsIDAsIDAsIDB4NTRdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgcGlja2xlLmxvYWRzLCBzKQotCiAKIGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmZWNmZDA5Li4yMWIwZWRmCi0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC02LDE2MDQgKzYsMzMgQEAKIFJ1biB0aGlzIHNjcmlwdCB3aXRoIC1oIG9yIC0taGVscCBmb3IgZG9jdW1lbnRhdGlvbi4KICIiIgogCi1VU0FHRSA9ICIiIlwKLXB5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCi0iIiIKLQotREVTQ1JJUFRJT04gPSAiIiJcCi1SdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCi0KLUlmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCi10aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCi10aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCi0KLUZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZwotY29tbWFuZCBsaW5lOgotCi1weXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KLSIiIgotCi1FUElMT0cgPSAiIiJcCi1BZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgotCi0tciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCi1pbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQotdGVzdCBvcmRlcnMuCi0KLS1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCi1vciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKLVB5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCi1vdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCi10aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgotV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKLWlzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCi1kb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bwotY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KLQotLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAotbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KLVRoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKLXJlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKLXRoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgotCi0tZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQotb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCi1saW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgotd2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KLQotLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KLWxlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCi1GcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KLQotLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bwotc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAotYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi10ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgotb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCi1yZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKLSJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCi0KLS1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKLXR5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KLTIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCi10ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCi1zZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCi13aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQotdGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKLXNob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91Ci1zaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKLXRoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Ci10YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKLWxpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKLXRvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKLWdlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgotCi0tdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAotc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgotVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKLXJlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKLQotICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCi0KLSAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCi0KLSAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgotICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgotICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCi0KLSAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCi0gICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KLQotICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQotICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQotICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgotCi0gICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yawotICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCi0KLSAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAotICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCi0KLSAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KLQotICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KLQotICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KLQotICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KLQotVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKLWV4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKLW9wdGlvbiAnLXVhbGwsLWd1aScuCi0iIiIKLQogIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgogaW1wb3J0IGltcG9ydGxpYgogCi1pbXBvcnQgYXJncGFyc2UKLWltcG9ydCBidWlsdGlucwotaW1wb3J0IGZhdWx0aGFuZGxlcgotaW1wb3J0IGlvCi1pbXBvcnQganNvbgotaW1wb3J0IGxvY2FsZQotaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKLWltcG9ydCBzeXNjb25maWcKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCi1mcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbgogCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHRocmVhZGluZyA9IE5vbmUKLXRyeToKLSAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCiAKKyMgQWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGp1c3QgaW4gY2FzZSkKK21haW5faW5fdGVtcF9jd2QgPSBtYWluCiAKLSMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KLSMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQotIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KLSMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgotIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCi0jIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKLSMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQotIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgotIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgotIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KLWZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgotICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbb3MucGF0aC5hYnNwYXRoKHBhdGgpIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KLSAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCiAKLQotIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAotIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgotIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCi0jIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCi0jIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAotIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KLWlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCByZXNvdXJjZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQotICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQotICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCi0KLSMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgotUEFTU0VEID0gMQotRkFJTEVEID0gMAotRU5WX0NIQU5HRUQgPSAtMQotU0tJUFBFRCA9IC0yCi1SRVNPVVJDRV9ERU5JRUQgPSAtMwotSU5URVJSVVBURUQgPSAtNAotQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCi0KLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCi1SRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKLSAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCi0KLSMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKLSMgdG8ga2VlcCB0aGUgdGVzdCBmaWxlcyBpbiBhIHN1YmZvbGRlci4gIFRoaXMgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKLSMgZmlsZXMgdXNpbmcgdGhlICJtYWtlIGRpc3RjbGVhbiIgY29tbWFuZC4KLWlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICBURU1QRElSID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdidWlsZCcpCi1lbHNlOgotICAgIFRFTVBESVIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKLVRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoVEVNUERJUikKLQotY2xhc3MgX0FyZ1BhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6Ci0KLSAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSArICJcblBhc3MgLWggb3IgLS1oZWxwIGZvciBjb21wbGV0ZSBoZWxwLiIpCi0KLWRlZiBfY3JlYXRlX3BhcnNlcigpOgotICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgotICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KLSAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQotCi0gICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KLSAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KLSAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJwotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQotICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1QJywgJy0tcGdvJywgZGVzdD0ncGdvJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZW5hYmxlIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiB0cmFpbmluZycpCi0KLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmdzJywgbmFyZ3M9YXJncGFyc2UuUkVNQUlOREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKLQotICAgIHJldHVybiBwYXJzZXIKLQotZGVmIHJlbGF0aXZlX2ZpbGVuYW1lKHN0cmluZyk6Ci0gICAgIyBDV0QgaXMgcmVwbGFjZWQgd2l0aCBhIHRlbXBvcmFyeSBkaXIgYmVmb3JlIGNhbGxpbmcgbWFpbigpLCBzbyB3ZQotICAgICMgam9pbiBpdCB3aXRoIHRoZSBzYXZlZCBDV0Qgc28gaXQgZW5kcyB1cCB3aGVyZSB0aGUgdXNlciBleHBlY3RzLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc3RyaW5nKQotCi1kZWYgaHVudHJsZWFrcyhzdHJpbmcpOgotICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQotICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgotICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKLSAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCi0gICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQotICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0Ci0gICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKLSAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCi0KLWRlZiByZXNvdXJjZXNfbGlzdChzdHJpbmcpOgotICAgIHUgPSBbeC5sb3dlcigpIGZvciB4IGluIHN0cmluZy5zcGxpdCgnLCcpXQotICAgIGZvciByIGluIHU6Ci0gICAgICAgIGlmIHIgPT0gJ2FsbCcgb3IgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgIHIgPSByWzE6XQotICAgICAgICBpZiByIG5vdCBpbiBSRVNPVVJDRV9OQU1FUzoKLSAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKCdpbnZhbGlkIHJlc291cmNlOiAnICsgcikKLSAgICByZXR1cm4gdQotCi1kZWYgX3BhcnNlX2FyZ3MoYXJncywgKiprd2FyZ3MpOgotICAgICMgRGVmYXVsdHMKLSAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSh0ZXN0ZGlyPU5vbmUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsCi0gICAgICAgICBleGNsdWRlPUZhbHNlLCBzaW5nbGU9RmFsc2UsIHJhbmRvbWl6ZT1GYWxzZSwgZnJvbWZpbGU9Tm9uZSwKLSAgICAgICAgIGZpbmRsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLCB0cmFjZT1GYWxzZSwgY292ZXJkaXI9J2NvdmVyYWdlJywKLSAgICAgICAgIHJ1bmxlYWtzPUZhbHNlLCBodW50cmxlYWtzPUZhbHNlLCB2ZXJib3NlMj1GYWxzZSwgcHJpbnRfc2xvdz1GYWxzZSwKLSAgICAgICAgIHJhbmRvbV9zZWVkPU5vbmUsIHVzZV9tcD1Ob25lLCB2ZXJib3NlMz1GYWxzZSwgZm9yZXZlcj1GYWxzZSwKLSAgICAgICAgIGhlYWRlcj1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsIHBnbz1GYWxzZSkKLSAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobnMsIGspOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclciBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBmdW5jdGlvbicgJSBrKQotICAgICAgICBzZXRhdHRyKG5zLCBrLCB2KQotICAgIGlmIG5zLnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKLSAgICAgICAgbnMudXNlX3Jlc291cmNlcyA9IFtdCi0KLSAgICBwYXJzZXIgPSBfY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1hcmdzLCBuYW1lc3BhY2U9bnMpCi0KLSAgICBpZiBucy5zaW5nbGUgYW5kIG5zLmZyb21maWxlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMudHJhY2U6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5maW5kbGVha3M6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLWwgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5tZW1saW1pdDoKLSAgICAgICAgcGFyc2VyLmVycm9yKCItTSBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy5mYWlsZmFzdCBhbmQgbm90IChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UzKToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItRy8tLWZhaWxmYXN0IG5lZWRzIGVpdGhlciAtdiBvciAtVyIpCi0KLSAgICBpZiBucy5xdWlldDoKLSAgICAgICAgbnMudmVyYm9zZSA9IDAKLSAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgotICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6Ci0gICAgICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6Ci0gICAgICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBUaGUgdGltZW91dCBvcHRpb24gcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlciIpCi0gICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQotICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6Ci0gICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAotICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQotICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKLSAgICBpZiBucy51c2U6Ci0gICAgICAgIGZvciBhIGluIG5zLnVzZToKLSAgICAgICAgICAgIGZvciByIGluIGE6Ci0gICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKLSAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgICAgICAgICBpZiByZW1vdmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCi0gICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgotICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQotICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgotICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCi0KLSAgICByZXR1cm4gbnMKLQotCi1kZWYgcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0bmFtZSwgbnMpOgotICAgICIiIlJ1biB0aGUgZ2l2ZW4gdGVzdCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCAtLXNsYXZlYXJncy4KLQotICAgIG5zIGlzIHRoZSBvcHRpb24gTmFtZXNwYWNlIHBhcnNlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIHJlZ3J0ZXN0Ci0gICAgaXMgaW52b2tlZCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgLS1zbGF2ZWFyZ3MgYXJndW1lbnQ7IHdoZW4gdGhlCi0gICAgc3VicHJvY2VzcyBleGl0cywgaXRzIHJldHVybiBjb2RlLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmV0dXJuZWQgYXMgYQotICAgIDMtdHVwbGUuCi0gICAgIiIiCi0gICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQotICAgIGJhc2VfY21kID0gKFtzeXMuZXhlY3V0YWJsZV0gKyBzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpICsKLSAgICAgICAgICAgICAgICBbJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctbScsICd0ZXN0LnJlZ3J0ZXN0J10pCi0gICAgIyByZXF1aXJlZCB0byBzcGF3biBhIG5ldyBwcm9jZXNzIHdpdGggUEdPIGZsYWcgb24vb2ZmCi0gICAgaWYgbnMucGdvOgotICAgICAgICBiYXNlX2NtZCA9IGJhc2VfY21kICsgWyctLXBnbyddCi0gICAgc2xhdmVhcmdzID0gKAotICAgICAgICAgICAgKHRlc3RuYW1lLCBucy52ZXJib3NlLCBucy5xdWlldCksCi0gICAgICAgICAgICBkaWN0KGh1bnRybGVha3M9bnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlcz1ucy51c2VfcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgbWF0Y2hfdGVzdHM9bnMubWF0Y2hfdGVzdHMsIHBnbz1ucy5wZ28pKQotICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCi0gICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgotICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KLSAgICBwb3BlbiA9IFBvcGVuKGJhc2VfY21kICsgWyctLXNsYXZlYXJncycsIGpzb24uZHVtcHMoc2xhdmVhcmdzKV0sCi0gICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCi0gICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKLSAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQotICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQotICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKLSAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKLQotCi1kZWYgbWFpbih0ZXN0cz1Ob25lLCAqKmt3YXJncyk6Ci0gICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCi0KLSAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKLSAgICBhY2NvcmRpbmdseS4KLQotICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCi0gICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKLQotICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KLSAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQotICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KLQotICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQotICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQotICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KLQotICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCi0gICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAotICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKLSAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncwotICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgIiIiCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycyAoZS5nLiBzZWdmYXVsdCkKLSAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKGFsbF90aHJlYWRzPVRydWUpCi0KLSAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gU0lHQUxSTSBvciBTSUdVU1IxIHNpZ25hbAotICAgIHNpZ25hbHMgPSBbXQotICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpOgotICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHQUxSTSkKLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR1VTUjEpCi0gICAgZm9yIHNpZ251bSBpbiBzaWduYWxzOgotICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbnVtLCBjaGFpbj1UcnVlKQotCi0gICAgcmVwbGFjZV9zdGRvdXQoKQotCi0gICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCi0KLSAgICBucyA9IF9wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgKiprd2FyZ3MpCi0KLSAgICBpZiBucy5odW50cmxlYWtzOgotICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKLSAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgotICAgICAgICB3YXJtX2NhY2hlcygpCi0gICAgaWYgbnMubWVtbGltaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQuc2V0X21lbWxpbWl0KG5zLm1lbWxpbWl0KQotICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKLSAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQotICAgIGlmIG5zLm5vd2luZG93czoKLSAgICAgICAgcHJpbnQoJ1RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAnCi0gICAgICAgICAgICAgICdVc2UgLXZ2IHRvIGRpc3BsYXkgYXNzZXJ0aW9ucyBpbiBzdGRlcnIuJykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBtc3ZjcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKLSAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCi0gICAgaWYgbnMud2FpdDoKLSAgICAgICAgaW5wdXQoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKQotCi0gICAgaWYgbnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgotICAgICAgICBhcmdzLCBrd2FyZ3MgPSBqc29uLmxvYWRzKG5zLnNsYXZlYXJncykKLSAgICAgICAgaWYga3dhcmdzLmdldCgnaHVudHJsZWFrcycpOgotICAgICAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKLSAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKLSAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQotICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCi0gICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgIGdvb2QgPSBbXQotICAgIGJhZCA9IFtdCi0gICAgc2tpcHBlZCA9IFtdCi0gICAgcmVzb3VyY2VfZGVuaWVkcyA9IFtdCi0gICAgZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCi0gICAgaW50ZXJydXB0ZWQgPSBGYWxzZQotCi0gICAgaWYgbnMuZmluZGxlYWtzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGZpbmRsZWFrcy4nKQotICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQotICAgICAgICAgICAgIyBnYXJiYWdlIHRoYXQgaXMgbm90IGNvbGxlY3RhYmxlIGJ5IHRoZSBHQyBpcyByZXBvcnRlZC4KLSAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKLSAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UgPSBbXQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGZwOgotICAgICAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgdGVzdHMgPSBbbmV4dF90ZXN0XQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgIGlmIG5zLmZyb21maWxlOgotICAgICAgICB0ZXN0cyA9IFtdCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgbnMuZnJvbWZpbGUpKSBhcyBmcDoKLSAgICAgICAgICAgIGNvdW50X3BhdCA9IHJlLmNvbXBpbGUocidcW1xzKlxkKy9ccypcZCtcXScpCi0gICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKLSAgICAgICAgICAgICAgICBsaW5lID0gY291bnRfcGF0LnN1YignJywgbGluZSkKLSAgICAgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGlmIGd1dHMgYW5kIG5vdCBndXRzWzBdLnN0YXJ0c3dpdGgoJyMnKToKLSAgICAgICAgICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKGd1dHMpCi0KLSAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgotICAgIHJlbW92ZXB5KG5zLmFyZ3MpCi0gICAgcmVtb3ZlcHkodGVzdHMpCi0KLSAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCi0gICAgbm90dGVzdHMgPSBOT1RURVNUUy5jb3B5KCkKLSAgICBpZiBucy5leGNsdWRlOgotICAgICAgICBmb3IgYXJnIGluIG5zLmFyZ3M6Ci0gICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6Ci0gICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKLSAgICAgICAgICAgIG5vdHRlc3RzLmFkZChhcmcpCi0gICAgICAgIG5zLmFyZ3MgPSBbXQotCi0gICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgotICAgIGlmIChucy52ZXJib3NlIG9yIG5zLmhlYWRlciBvcgotICAgICAgICAgICAgbm90IChucy5wZ28gb3IgbnMucXVpZXQgb3IgbnMuc2luZ2xlIG9yIHRlc3RzIG9yIG5zLmFyZ3MpKToKLSAgICAgICAgIyBQcmludCBiYXNpYyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgotICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCi0gICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKLSAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKLSAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKLSAgICAgICAgcHJpbnQoIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MpCi0KLSAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbwotICAgICMgZG9uJ3QgYWRkIGRlZmF1bHQgdGVzdHMgdG8gYmUgZXhlY3V0ZWQgb3Igc2tpcHBlZCAocGFzcyBlbXB0eSB2YWx1ZXMpCi0gICAgaWYgbnMudGVzdGRpcjoKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgbGlzdCgpLCBzZXQoKSkKLSAgICBlbHNlOgotICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCi0KLSAgICBzZWxlY3RlZCA9IHRlc3RzIG9yIG5zLmFyZ3Mgb3IgYWxsdGVzdHMKLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWRbOjFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1thbGx0ZXN0cy5pbmRleChzZWxlY3RlZFswXSkrMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQotICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgotICAgIGlmIG5zLnN0YXJ0OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZWwgc2VsZWN0ZWRbOnNlbGVjdGVkLmluZGV4KG5zLnN0YXJ0KV0KLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIgJSBucy5zdGFydCkKLSAgICBpZiBucy5yYW5kb21pemU6Ci0gICAgICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6Ci0gICAgICAgICAgICBucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCi0gICAgICAgIHJhbmRvbS5zZWVkKG5zLnJhbmRvbV9zZWVkKQotICAgICAgICBwcmludCgiVXNpbmcgcmFuZG9tIHNlZWQiLCBucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZWN0ZWQpCi0gICAgaWYgbnMudHJhY2U6Ci0gICAgICAgIGltcG9ydCB0cmFjZSwgdGVtcGZpbGUKLSAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuZ2V0dGVtcGRpcigpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCi0KLSAgICB0ZXN0X3RpbWVzID0gW10KLSAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAgICAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKLSAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCi0gICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCi0KLSAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KToKLSAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAotICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6Ci0gICAgICAgICAgICB0ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKLSAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgotICAgICAgICAgICAgZ29vZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBGQUlMRUQ6Ci0gICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6Ci0gICAgICAgICAgICBlbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFJFU09VUkNFX0RFTklFRDoKLSAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCi0gICAgICAgICAgICByZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQotCi0gICAgaWYgbnMuZm9yZXZlcjoKLSAgICAgICAgZGVmIHRlc3RfZm9yZXZlcih0ZXN0cz1saXN0KHNlbGVjdGVkKSk6Ci0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICB0ZXN0cyA9IHRlc3RfZm9yZXZlcigpCi0gICAgICAgIHRlc3RfY291bnQgPSAnJwotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gMwotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzID0gaXRlcihzZWxlY3RlZCkKLSAgICAgICAgdGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZWN0ZWQpKQotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gbGVuKHRlc3RfY291bnQpIC0gMQotCi0gICAgaWYgbnMudXNlX21wOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKLSAgICAgICAgICAgIHN5cy5leGl0KDIpCi0gICAgICAgIGZyb20gcXVldWUgaW1wb3J0IFF1ZXVlCi0gICAgICAgIGRlYnVnX291dHB1dF9wYXQgPSByZS5jb21waWxlKHIiXFtcZCsgcmVmcywgXGQrIGJsb2Nrc1xdJCIpCi0gICAgICAgIG91dHB1dCA9IFF1ZXVlKCkKLSAgICAgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc1Rlc3RzKHRlc3RzKQotICAgICAgICBkZWYgd29yaygpOgotICAgICAgICAgICAgIyBBIHdvcmtlciB0aHJlYWQuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IG5leHQocGVuZGluZykKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgbnMpCi0gICAgICAgICAgICAgICAgICAgICMgU3RyaXAgbGFzdCByZWZjb3VudCBvdXRwdXQgbGluZSBpZiBpdCBleGlzdHMsIHNpbmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICMgY29tZXMgZnJvbSB0aGUgc2h1dGRvd24gb2YgdGhlIGludGVycHJldGVyIGluIHRoZSBzdWJjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBkZWJ1Z19vdXRwdXRfcGF0LnN1YigiIiwgc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKLSAgICAgICAgICAgICAgICAgICAgaWYgcmV0Y29kZSAhPSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKENISUxEX0VSUk9SLCAiRXhpdCBjb2RlICVzIiAlIHJldGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLCByZXN1bHQpKQotICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgd29ya2VycyA9IFtUaHJlYWQodGFyZ2V0PXdvcmspIGZvciBpIGluIHJhbmdlKG5zLnVzZV9tcCldCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5zdGFydCgpCi0gICAgICAgIGZpbmlzaGVkID0gMAotICAgICAgICB0ZXN0X2luZGV4ID0gMQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IG5zLnVzZV9tcDoKLSAgICAgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gb3V0cHV0LmdldCgpCi0gICAgICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICAgICAgaWYgYmFkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9XSB7NH0iCi0gICAgICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGJhZCksIHRlc3QpKQotICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0KQotICAgICAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3RkZXJyLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDaGlsZCBlcnJvciBvbiB7fToge30iLmZvcm1hdCh0ZXN0LCByZXN1bHRbMV0pKQotICAgICAgICAgICAgICAgIHRlc3RfaW5kZXggKz0gMQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgIHBlbmRpbmcuaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5qb2luKCkKLSAgICBlbHNlOgotICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgotICAgICAgICAgICAgaWYgbm90IG5zLnF1aWV0OgotICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnRfd2lkdGgsIHRlc3RfaW5kZXgsIHRlc3RfY291bnQsIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgICAgIGlmIG5zLnRyYWNlOgotICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKLSAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KLSAgICAgICAgICAgICAgICB0cmFjZXIucnVuY3R4KCdydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LCB0aW1lb3V0PW5zLnRpbWVvdXQpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9dmFycygpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIGZhaWxmYXN0PW5zLmZhaWxmYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKQotICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgotICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKLSAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQotICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKLSAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KLSAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCi0gICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKLSAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKLQotICAgIGlmIGludGVycnVwdGVkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQwotICAgICAgICBwcmludCgpCi0gICAgICAgIHByaW50KCJUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuIikKLSAgICAgICAgb21pdHRlZCA9IHNldChzZWxlY3RlZCkgLSBzZXQoZ29vZCkgLSBzZXQoYmFkKSAtIHNldChza2lwcGVkKQotICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCi0gICAgICAgIHByaW50bGlzdChvbWl0dGVkKQotICAgIGlmIGdvb2QgYW5kIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgaWYgbm90IGJhZCBhbmQgbm90IHNraXBwZWQgYW5kIG5vdCBpbnRlcnJ1cHRlZCBhbmQgbGVuKGdvb2QpID4gMToKLSAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjb3VudChsZW4oZ29vZCksICJ0ZXN0IiksICJPSy4iKQotICAgIGlmIG5zLnByaW50X3Nsb3c6Ci0gICAgICAgIHRlc3RfdGltZXMuc29ydChyZXZlcnNlPVRydWUpCi0gICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCi0gICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHRlc3RfdGltZXNbOjEwXToKLSAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQotICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KGJhZCkKLSAgICBpZiBlbnZpcm9ubWVudF9jaGFuZ2VkIGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAotICAgICAgICAgICAgICAgICBjb3VudChsZW4oZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQotICAgICAgICBwcmludGxpc3QoZW52aXJvbm1lbnRfY2hhbmdlZCkKLSAgICBpZiBza2lwcGVkIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihza2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KHNraXBwZWQpCi0KLSAgICBpZiBucy52ZXJib3NlMiBhbmQgYmFkOgotICAgICAgICBwcmludCgiUmUtcnVubmluZyBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlIikKLSAgICAgICAgZm9yIHRlc3QgaW4gYmFkWzpdOgotICAgICAgICAgICAgaWYgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICBwcmludCgiUmUtcnVubmluZyB0ZXN0ICVyIGluIHZlcmJvc2UgbW9kZSIgJSB0ZXN0KQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbnMudmVyYm9zZSA9IFRydWUKLSAgICAgICAgICAgICAgICBvayA9IHJ1bnRlc3QodGVzdCwgVHJ1ZSwgbnMucXVpZXQsIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgcGdvPW5zLnBnbykKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBzZXBhcmF0ZSBmcm9tIHRoZSBeQwotICAgICAgICAgICAgICAgIHByaW50KCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBva1swXSBpbiB7UEFTU0VELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVEfToKLSAgICAgICAgICAgICAgICAgICAgYmFkLnJlbW92ZSh0ZXN0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgYmFkOgotICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAndGVzdCcpLCAiZmFpbGVkIGFnYWluOiIpCi0gICAgICAgICAgICAgICAgcHJpbnRsaXN0KGJhZCkKLQotICAgIGlmIG5zLnNpbmdsZToKLSAgICAgICAgaWYgbmV4dF9zaW5nbGVfdGVzdDoKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBmcC53cml0ZShuZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICByID0gdHJhY2VyLnJlc3VsdHMoKQotICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9bnMuY292ZXJkaXIpCi0KLSAgICBpZiBucy5ydW5sZWFrczoKLSAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKLQotICAgIHN5cy5leGl0KGxlbihiYWQpID4gMCBvciBpbnRlcnJ1cHRlZCkKLQotCi0jIHNtYWxsIHNldCBvZiB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIGJhc2ljYWxseSBmdW5jdGlvbmluZyBpbnRlcnByZXRlcgotIyAoaS5lLiBpZiBhbnkgb2YgdGhlc2UgZmFpbCwgdGhlbiBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBmb2xsb3cpCi1TVERURVNUUyA9IFsKLSAgICAndGVzdF9ncmFtbWFyJywKLSAgICAndGVzdF9vcGNvZGVzJywKLSAgICAndGVzdF9kaWN0JywKLSAgICAndGVzdF9idWlsdGluJywKLSAgICAndGVzdF9leGNlcHRpb25zJywKLSAgICAndGVzdF90eXBlcycsCi0gICAgJ3Rlc3RfdW5pdHRlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QyJywKLSAgICAndGVzdF9zdXBwb3J0JwotXQotCi0jIHNldCBvZiB0ZXN0cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB1c2luZyByZWdydGVzdAotTk9UVEVTVFMgPSBzZXQoKQotCi1kZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKLSAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKLSAgICB0ZXN0cyA9IFtdCi0gICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBtb2RbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCBpbiAoIi5weSIsICIiKSBhbmQgbW9kIG5vdCBpbiBvdGhlcnM6Ci0gICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kKQotICAgIHJldHVybiBzdGR0ZXN0cyArIHNvcnRlZCh0ZXN0cykKLQotIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgotY2xhc3MgTXVsdGlwcm9jZXNzVGVzdHMob2JqZWN0KToKLQotICAgICIiIkEgdGhyZWFkLXNhZmUgaXRlcmF0b3Igb3ZlciB0ZXN0cyBmb3IgbXVsdGlwcm9jZXNzIG1vZGUuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMpOgotICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQotICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmxvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLmludGVycnVwdGVkOgotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oJ3Rlc3RzIGludGVycnVwdGVkJykKLSAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYudGVzdHMpCi0KLWRlZiByZXBsYWNlX3N0ZG91dCgpOgotICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgotICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCi0gICAgaW1wb3J0IGF0ZXhpdAotCi0gICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAotICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCi0gICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCi0gICAgICAgIGNsb3NlZmQ9RmFsc2UsCi0gICAgICAgIG5ld2xpbmU9J1xuJykKLQotICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgotICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKLSAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAotICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKLQotZGVmIHJ1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQsCi0gICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCB1c2VfcmVzb3VyY2VzPU5vbmUsCi0gICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsCi0gICAgICAgICAgICB0aW1lb3V0PU5vbmUsICosIHBnbz1GYWxzZSk6Ci0gICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCi0KLSAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCi0gICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCi0gICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKLSAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCi0gICAgdXNlX3Jlc291cmNlcyAtLSBsaXN0IG9mIGV4dHJhIHJlc291cmNlcyB0byB1c2UKLSAgICBvdXRwdXRfb25fZmFpbHVyZSAtLSBpZiB0cnVlLCBkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUKLSAgICB0aW1lb3V0IC0tIGR1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICB0aW1lb3V0IHNlY29uZHMKLSAgICBmYWlsZmFzdCwgbWF0Y2hfdGVzdHMgLS0gU2VlIHJlZ3J0ZXN0IGNvbW1hbmQtbGluZSBmbGFncyBmb3IgdGhlc2UuCi0gICAgcGdvIC0tIGlmIHRydWUsIGRvIG5vdCBwcmludCB1bm5lY2Vzc2FyeSBpbmZvIHdoZW4gcnVubmluZyB0aGUgdGVzdAotICAgICAgICAgICBmb3IgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIGJ1aWxkCi0KLSAgICBSZXR1cm5zIHRoZSB0dXBsZSByZXN1bHQsIHRlc3RfdGltZSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzOgotICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCi0gICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCi0gICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgotICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50Ci0gICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKLSAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAotICAgICIiIgotICAgIGlmIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IHVzZV9yZXNvdXJjZXMKLSAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQotICAgIGlmIHVzZV90aW1lb3V0OgotICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQotICAgIHRyeToKLSAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCi0gICAgICAgIGlmIGZhaWxmYXN0OgotICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKLSAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCi0KLSAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQotICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgotICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgotICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KLSAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQotICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCi0KLSAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPUZhbHNlLCBwZ289cGdvKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBGQUlMRUQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLndyaXRlKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gb3JpZ19zdGRlcnIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IHZlcmJvc2UgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9bm90IHZlcmJvc2UsIHBnbz1wZ28pCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICBmaW5hbGx5OgotICAgICAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQotICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCi1ydW50ZXN0LnN0cmluZ2lvID0gTm9uZQotCi0jIFVuaXQgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGxlYXZlIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdW5jaGFuZ2VkCi0jIG9uY2UgdGhleSBjb21wbGV0ZS4gIEJ1dCBzb21ldGltZXMgdGVzdHMgaGF2ZSBidWdzLCBlc3BlY2lhbGx5IHdoZW4KLSMgdGVzdHMgZmFpbCwgYW5kIHRoZSBjaGFuZ2VzIHRvIGVudmlyb25tZW50IGdvIG9uIHRvIG1lc3MgdXAgb3RoZXIKLSMgdGVzdHMuICBUaGlzIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBidWlsZGJvdCBzdGFiaWxpdHksIHNpbmNlIHRlc3RzCi0jIGFyZSBydW4gaW4gcmFuZG9tIG9yZGVyIGFuZCBzbyBwcm9ibGVtcyBtYXkgYXBwZWFyIHRvIGNvbWUgYW5kIGdvLgotIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHdlIGNhbiBzYXZlIGFuZCByZXN0b3JlIHRvIG1pdGlnYXRlIHRoaXMsIGFuZAotIyB0aGUgZm9sbG93aW5nIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoaXMgdGFzay4KLQotY2xhc3Mgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudDoKLSAgICAiIiJTYXZlIGJpdHMgb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIHJlc3RvcmUgdGhlbSBhdCBibG9jayBleGl0LgotCi0gICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0bmFtZSwgdmVyYm9zZSwgcXVpZXQpOgotICAgICAgICAgICAgI3N0dWZmCi0KLSAgICBVbmxlc3MgcXVpZXQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyIGlmIGFueSBvZgotICAgIHRoZSBzYXZlZCBpdGVtcyB3YXMgY2hhbmdlZCBieSB0aGUgdGVzdC4gIFRoZSBhdHRyaWJ1dGUgJ2NoYW5nZWQnCi0gICAgaXMgaW5pdGlhbGx5IEZhbHNlLCBidXQgaXMgc2V0IHRvIFRydWUgaWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuCi0KLSAgICBJZiB2ZXJib3NlIGlzIG1vcmUgdGhhbiAxLCB0aGUgYmVmb3JlIGFuZCBhZnRlciBzdGF0ZSBvZiBjaGFuZ2VkCi0gICAgaXRlbXMgaXMgYWxzbyBwcmludGVkLgotICAgICIiIgotCi0gICAgY2hhbmdlZCA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdG5hbWUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsICosIHBnbz1GYWxzZSk6Ci0gICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQotICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCi0gICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAotICAgICAgICBzZWxmLnBnbyA9IHBnbwotCi0gICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAotICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKLSAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKLSAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKLSAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgotICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgotICAgICMKLSAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKLSAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KLQotICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAotICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdzeXMucGF0aF9ob29rcycsICdfX2ltcG9ydF9fJywKLSAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzLmZpbHRlcnMnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCi0gICAgICAgICAgICAgICAgICdsb2dnaW5nLl9oYW5kbGVycycsICdsb2dnaW5nLl9oYW5kbGVyTGlzdCcsICdzeXMuZ2V0dHJhY2UnLAotICAgICAgICAgICAgICAgICAnc3lzLndhcm5vcHRpb25zJywKLSAgICAgICAgICAgICAgICAgIyBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpIG1heSByZWxlYXNlIHJlZgotICAgICAgICAgICAgICAgICAjIHRvIGEgdGhyZWFkLCBzbyBjaGVjayBwcm9jZXNzZXMgZmlyc3QuCi0gICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcnLCAndGhyZWFkaW5nLl9kYW5nbGluZycsCi0gICAgICAgICAgICAgICAgICdzeXNjb25maWcuX0NPTkZJR19WQVJTJywgJ3N5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTJywKLSAgICAgICAgICAgICAgICAgJ2ZpbGVzJywgJ2xvY2FsZScsICd3YXJuaW5ncy5zaG93d2FybmluZycsCi0gICAgICAgICAgICAgICAgICdzaHV0aWxfYXJjaGl2ZV9mb3JtYXRzJywgJ3NodXRpbF91bnBhY2tfZm9ybWF0cycsCi0gICAgICAgICAgICAgICAgKQotCi0gICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6Ci0gICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQotICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KLQotICAgIGRlZiBnZXRfY3dkKHNlbGYpOgotICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKLSAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKLSAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQotCi0gICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAotICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKLSAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAotCi0gICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgotICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKLSAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgotCi0gICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuc3RkaW4KLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgotICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgotCi0gICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKLSAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgotICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQotICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKLSAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKLQotICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQotICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgotICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KLSAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoX2hvb2tzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGhfaG9va3MpLCBzeXMucGF0aF9ob29rcywgc3lzLnBhdGhfaG9va3NbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aF9ob29rcyhzZWxmLCBzYXZlZF9ob29rcyk6Ci0gICAgICAgIHN5cy5wYXRoX2hvb2tzID0gc2F2ZWRfaG9va3NbMV0KLSAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzYXZlZF9ob29rc1syXQotCi0gICAgZGVmIGdldF9zeXNfZ2V0dHJhY2Uoc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuZ2V0dHJhY2UoKQotICAgIGRlZiByZXN0b3JlX3N5c19nZXR0cmFjZShzZWxmLCB0cmFjZV9meG4pOgotICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VfZnhuKQotCi0gICAgZGVmIGdldF9fX2ltcG9ydF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gYnVpbHRpbnMuX19pbXBvcnRfXwotICAgIGRlZiByZXN0b3JlX19faW1wb3J0X18oc2VsZiwgaW1wb3J0Xyk6Ci0gICAgICAgIGJ1aWx0aW5zLl9faW1wb3J0X18gPSBpbXBvcnRfCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX2ZpbHRlcnMoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZCh3YXJuaW5ncy5maWx0ZXJzKSwgd2FybmluZ3MuZmlsdGVycywgd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX2ZpbHRlcnMoc2VsZiwgc2F2ZWRfZmlsdGVycyk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBzYXZlZF9maWx0ZXJzWzFdCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlZF9maWx0ZXJzWzJdCi0KLSAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KLSAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQotICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKLSAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKLSAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQotICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQotCi0gICAgZGVmIGdldF9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgotICAgICAgICAjIHdlIGNvdWxkIGNhbGwgZ2V0X2FyY2hpdmVzX2Zvcm1hdHMoKSBidXQgdGhhdCBvbmx5IHJldHVybnMgdGhlCi0gICAgICAgICMgcmVnaXN0cnkga2V5czsgd2Ugd2FudCB0byBjaGVjayB0aGUgdmFsdWVzIHRvbyAodGhlIGZ1bmN0aW9ucyB0aGF0Ci0gICAgICAgICMgYXJlIHJlZ2lzdGVyZWQpCi0gICAgICAgIHJldHVybiBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUywgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTID0gc2F2ZWRbMF0KLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMsIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlcnMoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJzIGlzIGEgV2Vha1ZhbHVlRGljdGlvbmFyeQotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlcnMpLCBsb2dnaW5nLl9oYW5kbGVycywgbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlcnMoc2VsZiwgc2F2ZWRfaGFuZGxlcnMpOgotICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmKToKLSAgICAgICAgIyBfaGFuZGxlckxpc3QgaXMgYSBsaXN0IG9mIHdlYWtyZWZzIHRvIGhhbmRsZXJzCi0gICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVyTGlzdCksIGxvZ2dpbmcuX2hhbmRsZXJMaXN0LCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYsIHNhdmVkX2hhbmRsZXJMaXN0KToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfc3lzX3dhcm5vcHRpb25zKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLndhcm5vcHRpb25zKSwgc3lzLndhcm5vcHRpb25zLCBzeXMud2Fybm9wdGlvbnNbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfd2Fybm9wdGlvbnMoc2VsZiwgc2F2ZWRfb3B0aW9ucyk6Ci0gICAgICAgIHN5cy53YXJub3B0aW9ucyA9IHNhdmVkX29wdGlvbnNbMV0KLSAgICAgICAgc3lzLndhcm5vcHRpb25zWzpdID0gc2F2ZWRfb3B0aW9uc1syXQotCi0gICAgIyBDb250cm9sbGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIFRocmVhZCBvYmplY3RzIGNhbiBtYWtlIGl0IGVhc2llcgotICAgICMgdG8gdHJhY2sgcmVmZXJlbmNlIGxlYWtzLgotICAgIGRlZiBnZXRfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiB0aHJlYWRpbmcuX2RhbmdsaW5nLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKLQotICAgICMgU2FtZSBmb3IgUHJvY2VzcyBvYmplY3RzCi0gICAgZGVmIGdldF9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFVuam9pbmVkIHByb2Nlc3Mgb2JqZWN0cyBjYW4gc3Vydml2ZSBhZnRlciBwcm9jZXNzIGV4aXRzCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkKLSAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKLSAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jbGVhcigpCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZik6Ci0gICAgICAgICMgbWFrZSBzdXJlIHRoZSBkaWN0IGlzIGluaXRpYWxpemVkCi0gICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHJlZml4JykKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0NPTkZJR19WQVJTKSwgc3lzY29uZmlnLl9DT05GSUdfVkFSUywKLSAgICAgICAgICAgICAgICBkaWN0KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpKQotICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy5jbGVhcigpCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyksIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLAotICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNvcHkoKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy51cGRhdGUoc2F2ZWRbMl0pCi0KLSAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICByZXR1cm4gc29ydGVkKGZuICsgKCcvJyBpZiBvcy5wYXRoLmlzZGlyKGZuKSBlbHNlICcnKQotICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKCkpCi0gICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZiwgc2F2ZWRfdmFsdWUpOgotICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCi0gICAgICAgIGlmIGZuIG5vdCBpbiBzYXZlZF92YWx1ZSBhbmQgKGZuICsgJy8nKSBub3QgaW4gc2F2ZWRfdmFsdWU6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoZm4pCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQucm10cmVlKGZuKQotCi0gICAgX2xjID0gW2dldGF0dHIobG9jYWxlLCBsYykgZm9yIGxjIGluIGRpcihsb2NhbGUpCi0gICAgICAgICAgIGlmIGxjLnN0YXJ0c3dpdGgoJ0xDXycpXQotICAgIGRlZiBnZXRfbG9jYWxlKHNlbGYpOgotICAgICAgICBwYWlyaW5ncyA9IFtdCi0gICAgICAgIGZvciBsYyBpbiBzZWxmLl9sYzoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwYWlyaW5ncy5hcHBlbmQoKGxjLCBsb2NhbGUuc2V0bG9jYWxlKGxjLCBOb25lKSkpCi0gICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcmV0dXJuIHBhaXJpbmdzCi0gICAgZGVmIHJlc3RvcmVfbG9jYWxlKHNlbGYsIHNhdmVkKToKLSAgICAgICAgZm9yIGxjLCBzZXR0aW5nIGluIHNhdmVkOgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsYywgc2V0dGluZykKLQotICAgIGRlZiBnZXRfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiB3YXJuaW5ncy5zaG93d2FybmluZwotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYsIGZ4bik6Ci0gICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gZnhuCi0KLSAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKLSAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6Ci0gICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQotICAgICAgICAgICAgZ2V0X25hbWUgPSAnZ2V0XycgKyBtZXRob2Rfc3VmZml4Ci0gICAgICAgICAgICByZXN0b3JlX25hbWUgPSAncmVzdG9yZV8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgeWllbGQgbmFtZSwgZ2V0YXR0cihzZWxmLCBnZXRfbmFtZSksIGdldGF0dHIoc2VsZiwgcmVzdG9yZV9uYW1lKQotCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zYXZlZF92YWx1ZXMgPSBkaWN0KChuYW1lLCBnZXQoKSkgZm9yIG5hbWUsIGdldCwgcmVzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCkpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6Ci0gICAgICAgIHNhdmVkX3ZhbHVlcyA9IHNlbGYuc2F2ZWRfdmFsdWVzCi0gICAgICAgIGRlbCBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgotICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCi0gICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKLSAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKLSAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6Ci0gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxIGFuZCBub3Qgc2VsZi5wZ286Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwKLSAgICAgICAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIGRpc3BsYXlfZmFpbHVyZT1UcnVlLCBwZ289RmFsc2UpOgotICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCi0KLSAgICB0ZXN0X3RpbWUgPSAwLjAKLSAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KLSAgICB0cnk6Ci0gICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKToKLSAgICAgICAgICAgIGFic3Rlc3QgPSB0ZXN0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEFsd2F5cyBpbXBvcnQgaXQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlCi0gICAgICAgICAgICBhYnN0ZXN0ID0gJ3Rlc3QuJyArIHRlc3QKLSAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBwZ289cGdvKSBhcyBlbnZpcm9ubWVudDoKLSAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgICAgICAgdGhlX21vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGFic3Rlc3QpCi0gICAgICAgICAgICAjIElmIHRoZSB0ZXN0IGhhcyBhIHRlc3RfbWFpbiwgdGhhdCB3aWxsIHJ1biB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICMgdGVzdHMuICBJZiBub3QsIHVzZSBub3JtYWwgdW5pdHRlc3QgdGVzdCBsb2FkaW5nLgotICAgICAgICAgICAgdGVzdF9ydW5uZXIgPSBnZXRhdHRyKHRoZV9tb2R1bGUsICJ0ZXN0X21haW4iLCBOb25lKQotICAgICAgICAgICAgaWYgdGVzdF9ydW5uZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW5uZXIoKToKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgIHRlc3RzID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGhlX21vZHVsZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIGxvYWRlci5lcnJvcnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludChlcnJvciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIuZXJyb3JzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvcnMgd2hpbGUgbG9hZGluZyB0ZXN0cyIpCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3RzKQotICAgICAgICAgICAgdGVzdF9ydW5uZXIoKQotICAgICAgICAgICAgaWYgaHVudHJsZWFrczoKLSAgICAgICAgICAgICAgICByZWZsZWFrID0gZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIHRlc3RfcnVubmVyLCBodW50cmxlYWtzKQotICAgICAgICAgICAgdGVzdF90aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgZXhjZXB0IHN1cHBvcnQuUmVzb3VyY2VEZW5pZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcGdvOgotICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgotICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQ6Ci0gICAgICAgIG1zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKLSAgICAgICAgaWYgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImNyYXNoZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgIGVsc2U6Ci0gICAgICAgIGlmIHJlZmxlYWs6Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICAgICAgaWYgZW52aXJvbm1lbnQuY2hhbmdlZDoKLSAgICAgICAgICAgIHJldHVybiBFTlZfQ0hBTkdFRCwgdGVzdF90aW1lCi0gICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQotCi1kZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6Ci0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCBzdGF0Ci0gICAgaW1wb3J0IGdjCi0KLSAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCi0gICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0Ci0gICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgotICAgIGdjLmNvbGxlY3QoKQotCi0gICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQotICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cwotICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCi0gICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQotICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKLSAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCi0gICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCi0gICAgICAgICAgICAgICAgKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQotCi0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKLSAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKLSAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6Ci0gICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQotICAgICAgICAgICAgbnVrZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCi0gICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKLQotZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKLSAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgotICAgICIiIgotICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCi0gICAgaW1wb3J0IGNvcHlyZWcKLSAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi0KLSAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCi0KLSAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KLSAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCi0gICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgemlwaW1wb3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKLSAgICBlbHNlOgotICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCi0gICAgYWJjcyA9IHt9Ci0gICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKLSAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKLSAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQotCi0gICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcwotICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQotICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCi0gICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKLSAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAotCi0gICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6Ci0gICAgICAgIGluZGlyZWN0X3Rlc3QoKQotICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIGlmIGkgPj0gbndhcm11cDoKLSAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCi0gICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQotICAgICAgICBhbGxvY19iZWZvcmUsIHJjX2JlZm9yZSA9IGFsbG9jX2FmdGVyLCByY19hZnRlcgotICAgIHByaW50KGZpbGU9c3lzLnN0ZGVycikKLSAgICAjIFRoZXNlIGNoZWNrZXJzIHJldHVybiBGYWxzZSBvbiBzdWNjZXNzLCBUcnVlIG9uIGZhaWx1cmUKLSAgICBkZWYgY2hlY2tfcmNfZGVsdGFzKGRlbHRhcyk6Ci0gICAgICAgIHJldHVybiBhbnkoZGVsdGFzKQotICAgIGRlZiBjaGVja19hbGxvY19kZWx0YXMoZGVsdGFzKToKLSAgICAgICAgIyBBdCBsZWFzdCAxLzNyZCBvZiAwcwotICAgICAgICBpZiAzICogZGVsdGFzLmNvdW50KDApIDwgbGVuKGRlbHRhcyk6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAjIE5vdGhpbmcgZWxzZSB0aGFuIDFzLCAwcyBhbmQgLTFzCi0gICAgICAgIGlmIG5vdCBzZXQoZGVsdGFzKSA8PSB7MSwwLC0xfToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZhaWxlZCA9IEZhbHNlCi0gICAgZm9yIGRlbHRhcywgaXRlbV9uYW1lLCBjaGVja2VyIGluIFsKLSAgICAgICAgKHJjX2RlbHRhcywgJ3JlZmVyZW5jZXMnLCBjaGVja19yY19kZWx0YXMpLAotICAgICAgICAoYWxsb2NfZGVsdGFzLCAnbWVtb3J5IGJsb2NrcycsIGNoZWNrX2FsbG9jX2RlbHRhcyldOgotICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6Ci0gICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAotICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCi0gICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKLSAgICAgICAgICAgICAgICBwcmludChtc2csIGZpbGU9cmVmcmVwKQotICAgICAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCi0gICAgICAgICAgICBmYWlsZWQgPSBUcnVlCi0gICAgcmV0dXJuIGZhaWxlZAotCi1kZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6Ci0gICAgaW1wb3J0IGdjLCBjb3B5cmVnCi0gICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCi0gICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAotICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYwotICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCi0gICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0Ci0KLSAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCi0gICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKLSAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6Ci0gICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KLQotICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KLSAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKLSAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB6aXBpbXBvcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAotICAgIGVsc2U6Ci0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCi0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQotCi0gICAgIyBjbGVhciB0eXBlIGNhY2hlCi0gICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKLQotICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgotICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106Ci0gICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106Ci0gICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKLSAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKLSAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKLQotICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCi0gICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCi0gICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKLSAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKLQotICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KLSAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKLSAgICByZS5wdXJnZSgpCi0gICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCi0gICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKLSAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKLSAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCi0gICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQotICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKLSAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQotICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IGN0eXBlcwotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKLQotICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCi0gICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCi0gICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAotICAgIGdjLmNvbGxlY3QoKQotICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpCi0KLWRlZiB3YXJtX2NhY2hlcygpOgotICAgICMgY2hhciBjYWNoZQotICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQotICAgIGZvciBpIGluIHJhbmdlKDI1Nik6Ci0gICAgICAgIHNbaTppKzFdCi0gICAgIyB1bmljb2RlIGNhY2hlCi0gICAgeCA9IFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0KLSAgICAjIGludCBjYWNoZQotICAgIHggPSBsaXN0KHJhbmdlKC01LCAyNTcpKQotCi1kZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKLSAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgotCi1kZWYgcmVtb3ZlcHkobmFtZXMpOgotICAgIGlmIG5vdCBuYW1lczoKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgotICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBleHQgPT0gJy5weSc6Ci0gICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKLQotZGVmIGNvdW50KG4sIHdvcmQpOgotICAgIGlmIG4gPT0gMToKLSAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKLQotZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgotICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KLQotICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCi0gICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCi0gICAgYmVnaW4gZWFjaCBsaW5lLgotICAgICIiIgotCi0gICAgZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZmlsbAotICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAotICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKLSAgICBwcmludChmaWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCi0gICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCi0KLQotZGVmIG1haW5faW5fdGVtcF9jd2QoKToKLSAgICAiIiJSdW4gbWFpbigpIGluIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5LiIiIgotICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKLSAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKLSAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCi0gICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCi0gICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKLSAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKLQotICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCi0gICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgotICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcwotICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KLSAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgotICAgICAgICBtYWluKCkKLQorZGVmIF9tYWluKCk6CisgICAgZ2xvYmFsIF9fZmlsZV9fCiAKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgIyBSZW1vdmUgcmVncnRlc3QucHkncyBvd24gZGlyZWN0b3J5IGZyb20gdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4gRGVzcGl0ZQogICAgICMgdGhlIGVsaW1pbmF0aW9uIG9mIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvCiAgICAgIyBlbnN1cmUgdGhhdCBzdWJtb2R1bGVzIG9mIHRoZSB0ZXN0IHBhY2thZ2UgZG8gbm90IGluYXBwcm9wcmlhdGVseSBhcHBlYXIKICAgICAjIGFzIHRvcC1sZXZlbCBtb2R1bGVzIGV2ZW4gd2hlbiBwZW9wbGUgKG9yIGJ1aWxkYm90cyEpIGludm9rZSByZWdydGVzdC5weQogICAgICMgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgLW0gc3dpdGNoCiAgICAgbXlkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSkKLSAgICBpID0gbGVuKHN5cy5wYXRoKQorICAgIGkgPSBsZW4oc3lzLnBhdGgpIC0gMQogICAgIHdoaWxlIGkgPj0gMDoKLSAgICAgICAgaSAtPSAxCiAgICAgICAgIGlmIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKHN5cy5wYXRoW2ldKSkgPT0gbXlkaXI6CiAgICAgICAgICAgICBkZWwgc3lzLnBhdGhbaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgLT0gMQogCiAgICAgIyBmaW5kdGVzdGRpcigpIGdldHMgdGhlIGRpcm5hbWUgb3V0IG9mIF9fZmlsZV9fLCBzbyB3ZSBoYXZlIHRvIG1ha2UgaXQKICAgICAjIGFic29sdXRlIGJlZm9yZSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCkBAIC0xNjE0LDQgKzQzLDggQEAKICAgICAjIHNhbml0eSBjaGVjawogICAgIGFzc2VydCBfX2ZpbGVfXyA9PSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCiAKLSAgICBtYWluX2luX3RlbXBfY3dkKCkKKyAgICBtYWluKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weSBiL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FlMTcwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3Qvc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5CkBAIC0wLDAgKzEsODQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBTSUdVU1IxRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZ290X3NpZ25hbHMgPSB7J1NJR0hVUCc6IDAsICdTSUdVU1IxJzogMCwgJ1NJR0FMUk0nOiAwfQorCisgICAgZGVmIHNpZ2h1cF9oYW5kbGVyKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzWydTSUdIVVAnXSArPSAxCisKKyAgICBkZWYgc2lndXNyMV9oYW5kbGVyKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzWydTSUdVU1IxJ10gKz0gMQorICAgICAgICByYWlzZSBTSUdVU1IxRXhjZXB0aW9uCisKKyAgICBkZWYgd2FpdF9zaWduYWwoc2VsZiwgY2hpbGQsIHNpZ25hbWUsIGV4Y19jbGFzcz1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgY2hpbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBUaGlzIHdhaXQgc2hvdWxkIGJlIGludGVycnVwdGVkIGJ5IGV4Y19jbGFzcworICAgICAgICAgICAgICAgICMgKGlmIHNldCkKKyAgICAgICAgICAgICAgICBjaGlsZC53YWl0KCkKKworICAgICAgICAgICAgdGltZW91dCA9IDEwLjAKKyAgICAgICAgICAgIGRlYWRsaW5lID0gdGltZS5tb25vdG9uaWMoKSArIHRpbWVvdXQKKworICAgICAgICAgICAgd2hpbGUgdGltZS5tb25vdG9uaWMoKSA8IGRlYWRsaW5lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZ290X3NpZ25hbHNbc2lnbmFtZV06CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Y19jbGFzcyBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShleGMsIGV4Y19jbGFzcyk6CisgICAgICAgICAgICAgICAgIyBnb3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBzZWxmLmZhaWwoJ3NpZ25hbCAlcyBub3QgcmVjZWl2ZWQgYWZ0ZXIgJXMgc2Vjb25kcycKKyAgICAgICAgICAgICAgICAgICUgKHNpZ25hbWUsIHRpbWVvdXQpKQorCisgICAgZGVmIHN1YnByb2Nlc3Nfc2VuZF9zaWduYWwoc2VsZiwgcGlkLCBzaWduYW1lKToKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgb3MsIHNpZ25hbDsgb3Mua2lsbCglcywgc2lnbmFsLiVzKScgJSAocGlkLCBzaWduYW1lKQorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLUknLCAnLWMnLCBjb2RlXQorICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5Qb3BlbihhcmdzKQorCisgICAgZGVmIHRlc3RfaW50ZXJwcm9jZXNzX3NpZ25hbChzZWxmKToKKyAgICAgICAgIyBJbnN0YWxsIGhhbmRsZXJzLiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gYSBzdWItcHJvY2Vzcywgc28gd2UKKyAgICAgICAgIyBkb24ndCB3b3JyeSBhYm91dCByZS1zZXR0aW5nIHRoZSBkZWZhdWx0IGhhbmRsZXJzLgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuc2lnaHVwX2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNlbGYuc2lndXNyMV9oYW5kbGVyKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBzaWduYWwuU0lHX0lHTikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCisKKyAgICAgICAgIyBMZXQgdGhlIHN1Yi1wcm9jZXNzZXMga25vdyB3aG8gdG8gc2VuZCBzaWduYWxzIHRvLgorICAgICAgICBwaWQgPSBzdHIob3MuZ2V0cGlkKCkpCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHSFVQIikgYXMgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXRfc2lnbmFsKGNoaWxkLCAnU0lHSFVQJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9zaWduYWxzLCB7J1NJR0hVUCc6IDEsICdTSUdVU1IxJzogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NJR0FMUk0nOiAwfSkKKworICAgICAgICB3aXRoIHNlbGYuc3VicHJvY2Vzc19zZW5kX3NpZ25hbChwaWQsICJTSUdVU1IxIikgYXMgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXRfc2lnbmFsKGNoaWxkLCAnU0lHVVNSMScsIFNJR1VTUjFFeGNlcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHVVNSMiIpIGFzIGNoaWxkOgorICAgICAgICAgICAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW46IFNJR1VTUjIgaXMgaWdub3JlZAorICAgICAgICAgICAgY2hpbGQud2FpdCgpCisKKyAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgIHNlbGYud2FpdF9zaWduYWwoTm9uZSwgJ1NJR0FMUk0nLCBLZXlib2FyZEludGVycnVwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9zaWduYWxzLCB7J1NJR0hVUCc6IDEsICdTSUdVU1IxJzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NJR0FMUk0nOiAwfSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKaW5kZXggZTEyNGZhYi4uMDRlODYyOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCitpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5lcnJvcgogaW1wb3J0IHdhcm5pbmdzCkBAIC04OSw2ICs5MCw3IEBACiAgICAgImJpZ21lbXRlc3QiLCAiYmlnYWRkcnNwYWNldGVzdCIsICJjcHl0aG9uX29ubHkiLCAiZ2V0X2F0dHJpYnV0ZSIsCiAgICAgInJlcXVpcmVzX0lFRUVfNzU0IiwgInNraXBfdW5sZXNzX3hhdHRyIiwgInJlcXVpcmVzX3psaWIiLAogICAgICJhbnRpY2lwYXRlX2ZhaWx1cmUiLCAibG9hZF9wYWNrYWdlX3Rlc3RzIiwgImRldGVjdF9hcGlfbWlzbWF0Y2giLAorICAgICJjaGVja19fYWxsX18iLAogICAgICMgc3lzCiAgICAgImlzX2p5dGhvbiIsICJjaGVja19pbXBsX2RldGFpbCIsCiAgICAgIyBuZXR3b3JrCkBAIC05MDAsNyArOTAyLDcgQEAKICAgICAgICAgeWllbGQgcGF0aAogICAgIGZpbmFsbHk6CiAgICAgICAgIGlmIGRpcl9jcmVhdGVkOgotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQorICAgICAgICAgICAgcm10cmVlKHBhdGgpCiAKIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiBkZWYgY2hhbmdlX2N3ZChwYXRoLCBxdWlldD1GYWxzZSk6CkBAIC0yMDczLDYgKzIwNzUsMTEgQEAKICAgICBzZXR0aW5ncyBpbiBzeXMuZmxhZ3MgYW5kIHN5cy53YXJub3B0aW9ucy4iIiIKICAgICByZXR1cm4gc3VicHJvY2Vzcy5fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKIAorZGVmIG9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAorICAgIG9wdGltaXphdGlvbiBzZXR0aW5ncyBpbiBzeXMuZmxhZ3MuIiIiCisgICAgcmV0dXJuIHN1YnByb2Nlc3MuX29wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMgU3VwcG9ydCBmb3IgYXNzZXJ0aW9ucyBhYm91dCBsb2dnaW5nLgogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMjIyNCw2ICsyMjMxLDY1IEBACiAgICAgcmV0dXJuIG1pc3NpbmdfaXRlbXMKIAogCitkZWYgY2hlY2tfX2FsbF9fKHRlc3RfY2FzZSwgbW9kdWxlLCBuYW1lX29mX21vZHVsZT1Ob25lLCBleHRyYT0oKSwKKyAgICAgICAgICAgICAgICAgYmxhY2tsaXN0PSgpKToKKyAgICAiIiJBc3NlcnQgdGhhdCB0aGUgX19hbGxfXyB2YXJpYWJsZSBvZiAnbW9kdWxlJyBjb250YWlucyBhbGwgcHVibGljIG5hbWVzLgorCisgICAgVGhlIG1vZHVsZSdzIHB1YmxpYyBuYW1lcyAoaXRzIEFQSSkgYXJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24KKyAgICB3aGV0aGVyIHRoZXkgbWF0Y2ggdGhlIHB1YmxpYyBuYW1lIGNvbnZlbnRpb24gYW5kIHdlcmUgZGVmaW5lZCBpbgorICAgICdtb2R1bGUnLgorCisgICAgVGhlICduYW1lX29mX21vZHVsZScgYXJndW1lbnQgY2FuIHNwZWNpZnkgKGFzIGEgc3RyaW5nIG9yIHR1cGxlIHRoZXJlb2YpCisgICAgd2hhdCBtb2R1bGUocykgYW4gQVBJIGNvdWxkIGJlIGRlZmluZWQgaW4gaW4gb3JkZXIgdG8gYmUgZGV0ZWN0ZWQgYXMgYQorICAgIHB1YmxpYyBBUEkuIE9uZSBjYXNlIGZvciB0aGlzIGlzIHdoZW4gJ21vZHVsZScgaW1wb3J0cyBwYXJ0IG9mIGl0cyBwdWJsaWMKKyAgICBBUEkgZnJvbSBvdGhlciBtb2R1bGVzLCBwb3NzaWJseSBhIEMgYmFja2VuZCAobGlrZSAnY3N2JyBhbmQgaXRzICdfY3N2JykuCisKKyAgICBUaGUgJ2V4dHJhJyBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCB3b3VsZG4ndCBvdGhlcndpc2UgYmUKKyAgICBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGFzICJwdWJsaWMiLCBsaWtlIG9iamVjdHMgd2l0aG91dCBhIHByb3BlcgorICAgICdfX21vZHVsZV9fJyBhdHRyaXVidXRlLiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUKKyAgICBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG9uZXMuCisKKyAgICBUaGUgJ2JsYWNrbGlzdCcgYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgbXVzdCBub3QgYmUgdHJlYXRlZAorICAgIGFzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgZXZlbiB0aG91Z2ggdGhlaXIgbmFtZXMgaW5kaWNhdGUgb3RoZXJ3aXNlLgorCisgICAgVXNhZ2U6CisgICAgICAgIGltcG9ydCBiYXIKKyAgICAgICAgaW1wb3J0IGZvbworICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKyAgICAgICAgY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmb28pCisKKyAgICAgICAgY2xhc3MgT3RoZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgZXh0cmEgPSB7J0JBUl9DT05TVCcsICdGT09fQ09OU1QnfQorICAgICAgICAgICAgICAgIGJsYWNrbGlzdCA9IHsnYmF6J30gICMgVW5kb2N1bWVudGVkIG5hbWUuCisgICAgICAgICAgICAgICAgIyBiYXIgaW1wb3J0cyBwYXJ0IG9mIGl0cyBBUEkgZnJvbSBfYmFyLgorICAgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGJhciwgKCdiYXInLCAnX2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgIiIiCisKKyAgICBpZiBuYW1lX29mX21vZHVsZSBpcyBOb25lOgorICAgICAgICBuYW1lX29mX21vZHVsZSA9IChtb2R1bGUuX19uYW1lX18sICkKKyAgICBlbGlmIGlzaW5zdGFuY2UobmFtZV9vZl9tb2R1bGUsIHN0cik6CisgICAgICAgIG5hbWVfb2ZfbW9kdWxlID0gKG5hbWVfb2ZfbW9kdWxlLCApCisKKyAgICBleHBlY3RlZCA9IHNldChleHRyYSkKKworICAgIGZvciBuYW1lIGluIGRpcihtb2R1bGUpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBvciBuYW1lIGluIGJsYWNrbGlzdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG9iaiA9IGdldGF0dHIobW9kdWxlLCBuYW1lKQorICAgICAgICBpZiAoZ2V0YXR0cihvYmosICdfX21vZHVsZV9fJywgTm9uZSkgaW4gbmFtZV9vZl9tb2R1bGUgb3IKKyAgICAgICAgICAgICAgICAobm90IGhhc2F0dHIob2JqLCAnX19tb2R1bGVfXycpIGFuZAorICAgICAgICAgICAgICAgICBub3QgaXNpbnN0YW5jZShvYmosIHR5cGVzLk1vZHVsZVR5cGUpKSk6CisgICAgICAgICAgICBleHBlY3RlZC5hZGQobmFtZSkKKyAgICB0ZXN0X2Nhc2UuYXNzZXJ0Q291bnRFcXVhbChtb2R1bGUuX19hbGxfXywgZXhwZWN0ZWQpCisKKwogY2xhc3MgU3VwcHJlc3NDcmFzaFJlcG9ydDoKICAgICAiIiJUcnkgdG8gcHJldmVudCBhIGNyYXNoIHJlcG9ydCBmcm9tIHBvcHBpbmcgdXAuCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CmluZGV4IGY5ZWUzOTguLjUyYzYyNDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQpAQCAtNDUxMiw2ICs0NTEyLDIxIEBACiAgICAgICAgIHN0cmluZyA9ICJOYW1lc3BhY2UoYmFyPSdzcGFtJywgZm9vPTQyKSIKICAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQogCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKip7JyInOiAncXVvdGUnfSkKKyAgICAgICAgc3RyaW5nID0gIiIiTmFtZXNwYWNlKCoqeyciJzogJ3F1b3RlJ30pIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9rd2FyZ3NfYW5kX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KQorICAgICAgICBzdHJpbmcgPSAiIiJOYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KSIiIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfc3Rhcmt3YXJnc19pZGVudGlmaWVyKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgqKnsndmFsaWQnOiBUcnVlfSkKKyAgICAgICAgc3RyaW5nID0gIk5hbWVzcGFjZSh2YWxpZD1UcnVlKSIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKICAgICAgICAgc3RyaW5nID0gKApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggNDgyNTI2ZS4uYjRmMmJmOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC0zMTgsOCArMzE4LDE5IEBACiAgICAgICAgICAgICBkID0gcGlja2xlLmR1bXBzKChpdG9yaWcsIG9yaWcpLCBwcm90bykKICAgICAgICAgICAgIGl0LCBhID0gcGlja2xlLmxvYWRzKGQpCiAgICAgICAgICAgICBhLmZyb21saXN0KGRhdGEyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGl0KSwgdHlwZShpdG9yaWcpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKworICAgIGRlZiB0ZXN0X2V4aGF1c3RlZF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCBsaXN0KHNlbGYuZXhhbXBsZSkpCisgICAgICAgIGV4aGl0ID0gaXRlcihhKQorICAgICAgICBlbXBpdCA9IGl0ZXIoYSkKKyAgICAgICAgZm9yIHggaW4gZXhoaXQ6ICAjIGV4aGF1c3QgdGhlIGl0ZXJhdG9yCisgICAgICAgICAgICBuZXh0KGVtcGl0KSAgIyBub3QgZXhoYXVzdGVkCisgICAgICAgIGEuYXBwZW5kKHNlbGYub3V0c2lkZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGV4aGl0KSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChlbXBpdCksIFtzZWxmLm91dHNpZGVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIGxpc3Qoc2VsZi5leGFtcGxlKSArIFtzZWxmLm91dHNpZGVdKQogCiAgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQpAQCAtMTA3MCw2ICsxMDgxLDEyIEBACiAgICAgICAgIGEgPSBhcnJheS5hcnJheSgnQicsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGdldGJ1ZmZlcl93aXRoX251bGxfdmlldywgYSkKIAorICAgIGRlZiB0ZXN0X2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIGl0ZXIsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisgICAgICAgIHN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgcmV2ZXJzZWQsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisKIGNsYXNzIFN0cmluZ1Rlc3QoQmFzZVRlc3QpOgogCiAgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggZDNlNmQzNS4uYTAyNWMyMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTEsNyArMSw4IEBACitpbXBvcnQgYXN0CitpbXBvcnQgZGlzCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGFzdAogaW1wb3J0IHdlYWtyZWYKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yMzgsNyArMjM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgYXN0LlB5Q0ZfT05MWV9BU1QpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fdHVwbGUoYXN0X3RyZWUpLCBvKQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRUcnVlb3JkZXIoYXN0X3RyZWUsICgwLCAwKSkKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChhY3Rpb249ImNvbXBpbGluZyIsIGlucHV0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGFjdGlvbj0iY29tcGlsaW5nIiwgaW5wdXQ9aSwga2luZD1raW5kKToKICAgICAgICAgICAgICAgICAgICAgY29tcGlsZShhc3RfdHJlZSwgIj8iLCBraW5kKQogCiAgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CkBAIC05MzMsNiArOTM0LDEyNSBAQAogICAgICAgICAgICAgY29tcGlsZShtb2QsIGZuLCAiZXhlYyIpCiAKIAorY2xhc3MgQ29uc3RhbnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgb24gdGhlIGFzdC5Db25zdGFudCBub2RlIHR5cGUuIiIiCisKKyAgICBkZWYgY29tcGlsZV9jb25zdGFudChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoInggPSAxMjMiKQorCisgICAgICAgIG5vZGUgPSB0cmVlLmJvZHlbMF0udmFsdWUKKyAgICAgICAgbmV3X25vZGUgPSBhc3QuQ29uc3RhbnQodmFsdWU9dmFsdWUpCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19ub2RlLCBub2RlKQorICAgICAgICB0cmVlLmJvZHlbMF0udmFsdWUgPSBuZXdfbm9kZQorCisgICAgICAgIGNvZGUgPSBjb21waWxlKHRyZWUsICI8c3RyaW5nPiIsICJleGVjIikKKworICAgICAgICBucyA9IHt9CisgICAgICAgIGV4ZWMoY29kZSwgbnMpCisgICAgICAgIHJldHVybiBuc1sneCddCisKKyAgICBkZWYgdGVzdF92YWxpZGF0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfY29uc3RhbnQoWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgYW4gaW52YWxpZCB0eXBlIGluIENvbnN0YW50OiBsaXN0IikKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbnMoc2VsZik6CisgICAgICAgIGZvciBjb25zdCBpbiAoTm9uZSwgRmFsc2UsIFRydWUsIEVsbGlwc2lzLCBiJycsIGZyb3plbnNldCgpKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGNvbnN0PWNvbnN0KToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29tcGlsZV9jb25zdGFudChjb25zdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHZhbHVlLCBjb25zdCkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgbmVzdGVkX3R1cGxlID0gKDEsKQorICAgICAgICBuZXN0ZWRfZnJvemVuc2V0ID0gZnJvemVuc2V0KHsxfSkKKyAgICAgICAgZm9yIGxldmVsIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgbmVzdGVkX3R1cGxlID0gKG5lc3RlZF90dXBsZSwgMikKKyAgICAgICAgICAgIG5lc3RlZF9mcm96ZW5zZXQgPSBmcm96ZW5zZXQoe25lc3RlZF9mcm96ZW5zZXQsIDJ9KQorICAgICAgICB2YWx1ZXMgPSAoMTIzLCAxMjMuMCwgMTIzaiwKKyAgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwgYidieXRlcycsCisgICAgICAgICAgICAgICAgICB0dXBsZSgidHVwbGUiKSwgZnJvemVuc2V0KCJmcm96ZW5zZXQiKSwKKyAgICAgICAgICAgICAgICAgIG5lc3RlZF90dXBsZSwgbmVzdGVkX2Zyb3plbnNldCkKKyAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHZhbHVlPXZhbHVlKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbXBpbGVfY29uc3RhbnQodmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHZhbHVlKQorCisgICAgZGVmIHRlc3RfYXNzaWduX3RvX2NvbnN0YW50KHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCJ4ID0gMSIpCisKKyAgICAgICAgdGFyZ2V0ID0gdHJlZS5ib2R5WzBdLnRhcmdldHNbMF0KKyAgICAgICAgbmV3X3RhcmdldCA9IGFzdC5Db25zdGFudCh2YWx1ZT0xKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfdGFyZ2V0LCB0YXJnZXQpCisgICAgICAgIHRyZWUuYm9keVswXS50YXJnZXRzWzBdID0gbmV3X3RhcmdldAorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICBjb21waWxlKHRyZWUsICJzdHJpbmciLCAiZXhlYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24gd2hpY2ggY2FuJ3QgYmUgYXNzaWduZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBpbiBTdG9yZSBjb250ZXh0IikKKworICAgIGRlZiB0ZXN0X2dldF9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoIidkb2NzdHJpbmcnXG54ID0gMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmdldF9kb2NzdHJpbmcodHJlZSksICdkb2NzdHJpbmcnKQorCisgICAgICAgIHRyZWUuYm9keVswXS52YWx1ZSA9IGFzdC5Db25zdGFudCh2YWx1ZT0nY29uc3RhbnQgZG9jc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZ2V0X2RvY3N0cmluZyh0cmVlKSwgJ2NvbnN0YW50IGRvY3N0cmluZycpCisKKyAgICBkZWYgZ2V0X2xvYWRfY29uc3Qoc2VsZiwgdHJlZSk6CisgICAgICAgICMgQ29tcGlsZSB0byBieXRlY29kZSwgZGlzYXNzZW1ibGUgYW5kIGdldCBwYXJhbWV0ZXIgb2YgTE9BRF9DT05TVAorICAgICAgICAjIGluc3RydWN0aW9ucworICAgICAgICBjbyA9IGNvbXBpbGUodHJlZSwgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBjb25zdHMgPSBbXQorICAgICAgICBmb3IgaW5zdHIgaW4gZGlzLmdldF9pbnN0cnVjdGlvbnMoY28pOgorICAgICAgICAgICAgaWYgaW5zdHIub3BuYW1lID09ICdMT0FEX0NPTlNUJzoKKyAgICAgICAgICAgICAgICBjb25zdHMuYXBwZW5kKGluc3RyLmFyZ3ZhbCkKKyAgICAgICAgcmV0dXJuIGNvbnN0cworCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfbG9hZF9jb25zdChzZWxmKToKKyAgICAgICAgY29uc3RzID0gW05vbmUsCisgICAgICAgICAgICAgICAgICBUcnVlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgIDEyNCwKKyAgICAgICAgICAgICAgICAgIDIuMCwKKyAgICAgICAgICAgICAgICAgIDNqLAorICAgICAgICAgICAgICAgICAgInVuaWNvZGUiLAorICAgICAgICAgICAgICAgICAgYidieXRlcycsCisgICAgICAgICAgICAgICAgICAoMSwgMiwgMyldCisKKyAgICAgICAgY29kZSA9ICdcbicuam9pbihbJ3g9eyFyfScuZm9ybWF0KGNvbnN0KSBmb3IgY29uc3QgaW4gY29uc3RzXSkKKyAgICAgICAgY29kZSArPSAnXG54ID0gLi4uJworICAgICAgICBjb25zdHMuZXh0ZW5kKChFbGxpcHNpcywgTm9uZSkpCisKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZShjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2xvYWRfY29uc3QodHJlZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzKQorCisgICAgICAgICMgUmVwbGFjZSBleHByZXNzaW9uIG5vZGVzIHdpdGggY29uc3RhbnRzCisgICAgICAgIGZvciBhc3NpZ24sIGNvbnN0IGluIHppcCh0cmVlLmJvZHksIGNvbnN0cyk6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShhc3NpZ24sIGFzdC5Bc3NpZ24pLCBhc3QuZHVtcChhc3NpZ24pCisgICAgICAgICAgICBuZXdfbm9kZSA9IGFzdC5Db25zdGFudCh2YWx1ZT1jb25zdCkKKyAgICAgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19ub2RlLCBhc3NpZ24udmFsdWUpCisgICAgICAgICAgICBhc3NpZ24udmFsdWUgPSBuZXdfbm9kZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfbG9hZF9jb25zdCh0cmVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWwoc2VsZik6CisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoIjEgKyAyIikKKyAgICAgICAgYmlub3AgPSB0cmVlLmJvZHlbMF0udmFsdWUKKworICAgICAgICBuZXdfbGVmdCA9IGFzdC5Db25zdGFudCh2YWx1ZT0xMCkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X2xlZnQsIGJpbm9wLmxlZnQpCisgICAgICAgIGJpbm9wLmxlZnQgPSBuZXdfbGVmdAorCisgICAgICAgIG5ld19yaWdodCA9IGFzdC5Db25zdGFudCh2YWx1ZT0yMCkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X3JpZ2h0LCBiaW5vcC5yaWdodCkKKyAgICAgICAgYmlub3AucmlnaHQgPSBuZXdfcmlnaHQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoYmlub3ApLCAzMCkKKworCiBkZWYgbWFpbigpOgogICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CiAgICAgICAgIHJldHVybgpAQCAtOTQwLDggKzEwNjAsOSBAQAogICAgICAgICBmb3Igc3RhdGVtZW50cywga2luZCBpbiAoKGV4ZWNfdGVzdHMsICJleGVjIiksIChzaW5nbGVfdGVzdHMsICJzaW5nbGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsX3Rlc3RzLCAiZXZhbCIpKToKICAgICAgICAgICAgIHByaW50KGtpbmQrIl9yZXN1bHRzID0gWyIpCi0gICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZW1lbnRzOgotICAgICAgICAgICAgICAgIHByaW50KHJlcHIodG9fdHVwbGUoY29tcGlsZShzLCAiPyIsIGtpbmQsIDB4NDAwKSkpKyIsIikKKyAgICAgICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gc3RhdGVtZW50czoKKyAgICAgICAgICAgICAgICB0cmVlID0gYXN0LnBhcnNlKHN0YXRlbWVudCwgIj8iLCBraW5kKQorICAgICAgICAgICAgICAgIHByaW50KCIlciwiICUgKHRvX3R1cGxlKHRyZWUpLCkpCiAgICAgICAgICAgICBwcmludCgiXSIpCiAgICAgICAgIHByaW50KCJtYWluKCkiKQogICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQppbmRleCA4MzY3YWZlLi5mYmM5MzNlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0xNTksMTEgKzE1OSwyNSBAQAogICAgICAgICAjIFRoZW4gY2FsY3VsYXRlIHRoZSBoZXhiaW40IGJpbmFyeS10by1BU0NJSSB0cmFuc2xhdGlvbgogICAgICAgICBybGUgPSBiaW5hc2NpaS5ybGVjb2RlX2hxeChzZWxmLmRhdGEpCiAgICAgICAgIGEgPSBiaW5hc2NpaS5iMmFfaHF4KHNlbGYudHlwZTJ0ZXN0KHJsZSkpCisKICAgICAgICAgYiwgXyA9IGJpbmFzY2lpLmEyYl9ocXgoc2VsZi50eXBlMnRlc3QoYSkpCiAgICAgICAgIHJlcyA9IGJpbmFzY2lpLnJsZWRlY29kZV9ocXgoYikKLQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5yYXdkYXRhKQogCisgICAgZGVmIHRlc3RfcmxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgcmVwZXRpdGlvbiB3aXRoIGEgcmVwZXRpdGlvbiBsb25nZXIgdGhhbiB0aGUgbGltaXQgb2YgMjU1CisgICAgICAgIGRhdGEgPSAoYidhJyAqIDEwMCArIGInYicgKyBiJ2MnICogMzAwKQorCisgICAgICAgIGVuY29kZWQgPSBiaW5hc2NpaS5ybGVjb2RlX2hxeChkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGInYVx4OTBkJyAgICAgICMgJ2EnICogMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGInYicgICAgICAgICAgICMgJ2InCisgICAgICAgICAgICAgICAgICAgICAgICAgIGInY1x4OTBceGZmJyAgICMgJ2MnICogMjU1CisgICAgICAgICAgICAgICAgICAgICAgICAgIGInY1x4OTAtJykpICAgICMgJ2MnICogNDUKKworICAgICAgICBkZWNvZGVkID0gYmluYXNjaWkucmxlZGVjb2RlX2hxeChlbmNvZGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsIGRhdGEpCisKICAgICBkZWYgdGVzdF9oZXgoc2VsZik6CiAgICAgICAgICMgdGVzdCBoZXhsaWZpY2F0aW9uCiAgICAgICAgIHMgPSBiJ3tzXDAwNVwwMDBcMDAwXDAwMHdvcmxkaVwwMDJcMDAwXDAwMFwwMDBzXDAwNVwwMDBcMDAwXDAwMGhlbGxvaVwwMDFcMDAwXDAwMFwwMDAwJwpAQCAtMjYyLDYgKzI3NiwxNiBAQAogICAgICAgICAgICAgIyBub24tQVNDSUkgc3RyaW5nCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhMmIsICJceDgwIikKIAorICAgIGRlZiB0ZXN0X2IyYV9iYXNlNjRfbmV3bGluZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjUzNTc6IHRlc3QgbmV3bGluZSBwYXJhbWV0ZXIKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9iYXNlNjQoYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhR1ZzYkc4PVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIsIG5ld2xpbmU9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhR1ZzYkc4PVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIsIG5ld2xpbmU9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD0nKQorCiAKIGNsYXNzIEFycmF5QmluQVNDSUlUZXN0KEJpbkFTQ0lJVGVzdCk6CiAgICAgZGVmIHR5cGUydGVzdChzZWxmLCBzKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CmluZGV4IGFiZjgyODUuLmExMGFkNWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQpAQCAtMzAwLDYgKzMwMCwyMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAnXHgwMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsICcxMiAgIFx4MDAgICAzNCcpCiAKKyAgICAgICAgZm9yIGRhdGEsIHBvcyBpbiAoCisgICAgICAgICAgICAjIGludmFsaWQgZmlyc3QgaGV4YWRlY2ltYWwgY2hhcmFjdGVyCisgICAgICAgICAgICAoJzEyIHg0IDU2JywgMyksCisgICAgICAgICAgICAjIGludmFsaWQgc2Vjb25kIGhleGFkZWNpbWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgKCcxMiAzeCA1NicsIDQpLAorICAgICAgICAgICAgIyB0d28gaW52YWxpZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAoJzEyIHh5IDU2JywgMyksCisgICAgICAgICAgICAjIHRlc3Qgbm9uLUFTQ0lJIHN0cmluZworICAgICAgICAgICAgKCcxMiAzXHhmZiA1NicsIDQpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUydGVzdC5mcm9taGV4KGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdhdCBwb3NpdGlvbiAlcycgJSBwb3MsIHN0cihjbS5leGNlcHRpb24pKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmhleCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5oZXgsIDEpCkBAIC03MjIsMjYgKzczNiwxMDcgQEAKIAogICAgICMgVGVzdCBQeUJ5dGVzX0Zyb21Gb3JtYXQoKQogICAgIGRlZiB0ZXN0X2Zyb21fZm9ybWF0KHNlbGYpOgotICAgICAgICB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHB5dGhvbmFwaSwgcHlfb2JqZWN0LCBjX2ludCwgY19jaGFyX3AKKyAgICAgICAgY3R5cGVzID0gdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2N0eXBlcycpCisgICAgICAgIF90ZXN0Y2FwaSA9IHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGVzdGNhcGknKQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBweV9vYmplY3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0ICgKKyAgICAgICAgICAgIGNfaW50LCBjX3VpbnQsCisgICAgICAgICAgICBjX2xvbmcsIGNfdWxvbmcsCisgICAgICAgICAgICBjX3NpemVfdCwgY19zc2l6ZV90LAorICAgICAgICAgICAgY19jaGFyX3ApCisKICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0ID0gcHl0aG9uYXBpLlB5Qnl0ZXNfRnJvbUZvcm1hdAogICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQucmVzdHlwZSA9IHB5X29iamVjdAogCisgICAgICAgICMgYmFzaWMgdGVzdHMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidmb3JtYXQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Zvcm1hdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInSGVsbG8gJXMgIScsIGInd29ybGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ0hlbGxvIHdvcmxkICEnKQogCisgICAgICAgICMgdGVzdCBmb3JtYXR0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9XDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludChvcmQoJ0AnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1AJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQoMjU1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPVx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KDEpLCBjX2xvbmcoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9MSBsZD0yIHpkPTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KC0xKSwgY19sb25nKC0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoLTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9LTEgbGQ9LTIgemQ9LTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3U9JXUgbHU9JWx1IHp1PSV6dScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdWludCgxMjMpLCBjX3Vsb25nKDQ1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDc4OSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIndT0xMjMgbHU9NDU2IHp1PTc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInaT0laScsIGNfaW50KDEyMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInaT0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2k9JWknLCBjX2ludCgtMTIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidpPS0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JXgnLCBjX2ludCgweGFiYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIneD1hYmMnKQorCisgICAgICAgIHNpemVvZl9wdHIgPSBjdHlwZXMuc2l6ZW9mKGNfY2hhcl9wKQorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgICMgV2luZG93cyAoTVNDUlQpCisgICAgICAgICAgICBwdHJfZm9ybWF0ID0gJzB4JTB7fVgnLmZvcm1hdCgyICogc2l6ZW9mX3B0cikKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChwdHJfZm9ybWF0ICUgcHRyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVTklYIChnbGliYykKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuICclI3gnICUgcHRyCisKKyAgICAgICAgcHRyID0gMHhhYmNkZWYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidwdHI9JXAnLCBjX2NoYXJfcChwdHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3B0cj0nICsgcHRyX2Zvcm1hdHRlcihwdHIpKS5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIncz0lcycsIGNfY2hhcl9wKGInY3N0cicpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3M9Y3N0cicpCisKKyAgICAgICAgIyB0ZXN0IG1pbmltdW0gYW5kIG1heGltdW0gaW50ZWdlciB2YWx1ZXMKKyAgICAgICAgc2l6ZV9tYXggPSBjX3NpemVfdCgtMSkudmFsdWUKKyAgICAgICAgZm9yIGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUsIHZhbHVlLCBweV9mb3JtYXR0ZXIgaW4gKAorICAgICAgICAgICAgKGInJWQnLCBjX2ludCwgX3Rlc3RjYXBpLklOVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclZCcsIGNfaW50LCBfdGVzdGNhcGkuSU5UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsZCcsIGNfbG9uZywgX3Rlc3RjYXBpLkxPTkdfTUlOLCBzdHIpLAorICAgICAgICAgICAgKGInJWxkJywgY19sb25nLCBfdGVzdGNhcGkuTE9OR19NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclbHUnLCBjX3Vsb25nLCBfdGVzdGNhcGkuVUxPTkdfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJXpkJywgY19zc2l6ZV90LCBfdGVzdGNhcGkuUFlfU1NJWkVfVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclemQnLCBjX3NzaXplX3QsIF90ZXN0Y2FwaS5QWV9TU0laRV9UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6dScsIGNfc2l6ZV90LCBzaXplX21heCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVwJywgY19jaGFyX3AsIHNpemVfbWF4LCBwdHJfZm9ybWF0dGVyKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUodmFsdWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfZm9ybWF0dGVyKHZhbHVlKS5lbmNvZGUoJ2FzY2lpJykpLAorCisgICAgICAgICMgd2lkdGggYW5kIHByZWNpc2lvbiAod2lkdGggaXMgY3VycmVudGx5IGlnbm9yZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJTVzJywgYidhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclLjNzJywgYidhYmNkZWYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FiYycpCisKKyAgICAgICAgIyAnJSUnIGZvcm1hdHRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidbJSVdJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidbJV0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJWMnLCBjX2ludChvcmQoJ18nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJXMnKQorCisgICAgICAgICMgSW52YWxpZCBmb3JtYXRzIGFuZCBwYXJ0aWFsIGZvcm1hdHRpbmcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJyksIGInJScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUnKSwgYiclJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJXMnKSwgYiclcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInWyUlXScpLCBiJ1slXScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUlYycsIGNfaW50KG9yZCgnXycpKSksIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JWkgeT0lJywgY19pbnQoMiksIGNfaW50KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3g9MiB5PSUnKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYzolYycsIGNfaW50KDI1NSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInYzpceGZmJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidzOiVzJywgY19jaGFyX3AoYidjc3RyJykpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInczpjc3RyJykKLQotICAgICAgICAjIElzc3VlICMxOTk2OQorICAgICAgICAjIElzc3VlICMxOTk2OTogJWMgbXVzdCByYWlzZSBPdmVyZmxvd0Vycm9yIGZvciB2YWx1ZXMKKyAgICAgICAgIyBub3QgaW4gdGhlIHJhbmdlIFswOyAyNTVdCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdCwgYiclYycsIGNfaW50KC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CmluZGV4IDgwZWQ2MzIuLjZkYWQwNTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQpAQCAtNzAyLDE5ICs3MDIsMTkgQEAKIAogICAgIGRlZiBhc3NlcnRGYWlsdXJlKHNlbGYsICphcmdzKToKICAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctbScsICdjYWxlbmRhcicsICphcmdzKQotICAgICAgICBzZWxmLmFzc2VydEluKGInVXNhZ2U6Jywgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKGIndXNhZ2U6Jywgc3RkZXJyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAyKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKICAgICAgICAgc3Rkb3V0ID0gc2VsZi5ydW5fb2soJy1oJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1VzYWdlOicsIHN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ3VzYWdlOicsIHN0ZG91dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ2NhbGVuZGFyLnB5Jywgc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydEluKGInLS1oZWxwJywgc3Rkb3V0KQogCiAgICAgZGVmIHRlc3RfaWxsZWdhbF9hcmd1bWVudHMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnLXonKQotICAgICAgICAjc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKLSAgICAgICAgI3NlbGYuYXNzZXJ0RmFpbHVyZSgnMjAwNCcsICdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCcyMDA0JywgJ3NwYW0nKQogICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJy10JywgJ2h0bWwnLCAnMjAwNCcsICcxJykKIAogICAgIGRlZiB0ZXN0X291dHB1dF9jdXJyZW50X3llYXIoc2VsZik6CkBAIC04MTUsNSArODE1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgYidocmVmPSJjdXN0b20uY3NzIiAvPicsIHN0ZG91dCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydtZGF5cycsICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ0VQT0NIJywKKyAgICAgICAgICAgICAgICAgICAgICdNT05EQVknLCAnVFVFU0RBWScsICdXRURORVNEQVknLCAnVEhVUlNEQVknLCAnRlJJREFZJywKKyAgICAgICAgICAgICAgICAgICAgICdTQVRVUkRBWScsICdTVU5EQVknLCAnZGlmZmVyZW50X2xvY2FsZScsICdjJywKKyAgICAgICAgICAgICAgICAgICAgICdwcndlZWsnLCAnd2VlaycsICdmb3JtYXQnLCAnZm9ybWF0c3RyaW5nJywgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjYWxlbmRhciwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CmluZGV4IDk2NjY2ZDEuLjhmNDgzNmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKQEAgLTQsOCArNCwxMCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTQzOSw2ICs0NDEsNyBAQAogICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnN0cmlwKCksIGV4cGVjdGVkX291dHB1dCkKIAorCiBjbGFzcyBTa2lwaXRlbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3Rfc2tpcGl0ZW0oc2VsZik6CkBAIC00ODgsMTAgKzQ5MSwxMCBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHModHVwbGVfMSwgZGljdF9iLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZW5jb2RlKCJhc2NpaSIpLCBrZXl3b3JkcykKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiYXJndW1lbnQgMSAoaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+KSIKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gKHN0cihlKSA9PSBzKQotICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKIAogICAgICAgICAgICAgIyB0ZXN0IHRoZSBmb3JtYXQgdW5pdCB3aGVuIHNraXBwZWQKQEAgLTUwMCw3ICs1MDMsNyBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHMoZW1wdHlfdHVwbGUsIGRpY3RfYiwKICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9ybWF0LmVuY29kZSgiYXNjaWkiKSwga2V5d29yZHMpCiAgICAgICAgICAgICAgICAgd2hlbl9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+OiAne30nIi5mb3JtYXQoZm9ybWF0KQogICAgICAgICAgICAgICAgIHdoZW5fc2tpcHBlZCA9IChzdHIoZSkgPT0gcykKIApAQCAtNTIxLDYgKzUyNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgpLCB7fSwgYicnLCBbNDJdKQogCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiBjbGFzcyBUZXN0VGhyZWFkU3RhdGUodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC01NDUsNiArNTQ5LDcgQEAKICAgICAgICAgdC5zdGFydCgpCiAgICAgICAgIHQuam9pbigpCiAKKwogY2xhc3MgVGVzdF90ZXN0Y2FwaSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfX3Rlc3RjYXBpKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKQEAgLTU1Myw1ICs1NTgsODQgQEAKICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICB0ZXN0KCkKIAorCitjbGFzcyBQeU1lbURlYnVnVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFBZVEhPTk1BTExPQyA9ICdkZWJ1ZycKKyAgICAjICcweDA0YzA2ZTAnIG9yICcwNEMwNkUwJworICAgIFBUUl9SRUdFWCA9IHInKD86MHgpP1swLTlhLWZBLUZdKycKKworICAgIGRlZiBjaGVjayhzZWxmLCBjb2RlKToKKyAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKKyAgICAgICAgICAgIG91dCA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZVEhPTk1BTExPQz1zZWxmLlBZVEhPTk1BTExPQykKKyAgICAgICAgc3RkZXJyID0gb3V0LmVycgorICAgICAgICByZXR1cm4gc3RkZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW1lbV9idWZmZXJfb3ZlcmZsb3coKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIG5vdCBhbGwgRk9SQklEREVOQllURSBcKDB4WzAtOWEtZl17ezJ9fVwpOlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMDogMHg3OCBcKlwqXCogT1VDSFxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMTogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMjogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgLipcbiIKKyAgICAgICAgICAgICAgICAgciIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgI1swLTldKyB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIKKyAgICAgICAgICAgICAgICAgciIgICAgRGF0YSBhdCBwOiBjYiBjYiBjYiAuKlxuIgorICAgICAgICAgICAgICAgICByIlxuIgorICAgICAgICAgICAgICAgICByIkZhdGFsIFB5dGhvbiBlcnJvcjogYmFkIHRyYWlsaW5nIHBhZCBieXRlIikKKyAgICAgICAgcmVnZXggPSByZWdleC5mb3JtYXQocHRyPXNlbGYuUFRSX1JFR0VYKQorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgsIGZsYWdzPXJlLkRPVEFMTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3RfYXBpX21pc3VzZShzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjaygnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5bWVtX2FwaV9taXN1c2UoKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjWzAtOV0rIHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBEYXRhIGF0IHA6IGNiIGNiIGNiIC4qXG4iCisgICAgICAgICAgICAgICAgIHIiXG4iCisgICAgICAgICAgICAgICAgIHIiRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgSUQ6IEFsbG9jYXRlZCB1c2luZyBBUEkgJ20nLCB2ZXJpZmllZCB1c2luZyBBUEkgJ3InXG4iKQorICAgICAgICByZWdleCA9IHJlZ2V4LmZvcm1hdChwdHI9c2VsZi5QVFJfUkVHRVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0LCByZWdleCkKKworICAgIGRlZiBjaGVja19tYWxsb2Nfd2l0aG91dF9naWwoc2VsZiwgY29kZSk6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soY29kZSkKKyAgICAgICAgZXhwZWN0ZWQgPSAoJ0ZhdGFsIFB5dGhvbiBlcnJvcjogUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgICAgJ3dpdGhvdXQgaG9sZGluZyB0aGUgR0lMJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgb3V0KQorCisgICAgZGVmIHRlc3RfcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIERlYnVnIGhvb2tzIG11c3QgcmFpc2UgYW4gZXJyb3IgaWYgUHlNZW1fTWFsbG9jKCkgaXMgY2FsbGVkCisgICAgICAgICMgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgX3Rlc3RjYXBpOyBfdGVzdGNhcGkucHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKCknCisgICAgICAgIHNlbGYuY2hlY2tfbWFsbG9jX3dpdGhvdXRfZ2lsKGNvZGUpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgRGVidWcgaG9va3MgbXVzdCByYWlzZSBhbiBlcnJvciBpZiBQeU9iamVjdF9NYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgIyB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICBjb2RlID0gJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoKScKKyAgICAgICAgc2VsZi5jaGVja19tYWxsb2Nfd2l0aG91dF9naWwoY29kZSkKKworCitjbGFzcyBQeU1lbU1hbGxvY0RlYnVnVGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICBQWVRIT05NQUxMT0MgPSAnbWFsbG9jX2RlYnVnJworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9QWU1BTExPQycpID09IDEsCisgICAgICAgICAgICAgICAgICAgICAnbmVlZCBweW1hbGxvYycpCitjbGFzcyBQeU1lbVB5bWFsbG9jRGVidWdUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgIFBZVEhPTk1BTExPQyA9ICdweW1hbGxvY19kZWJ1ZycKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgUHlfREVCVUcnKQorY2xhc3MgUHlNZW1EZWZhdWx0VGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICAjIHRlc3QgZGVmYXVsdCBhbGxvY2F0b3Igb2YgUHl0aG9uIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUKKyAgICBQWVRIT05NQUxMT0MgPSAnJworCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQppbmRleCBkY2U0MThiLi44ZmFhOGUxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTM0OCw4ICszNDgsOSBAQAogICAgICAgICAgICAgdGVzdC5zdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKS5fX2VudGVyX18oKQogICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneCcpCiAgICAgICAgICAgICBvcy5jbG9zZShzeXMuc3Rkb3V0LmZpbGVubygpKSIiIgotICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctYycsIGNvZGUpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyMCwgcmMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgoZXJyLmRlY29kZSgnYXNjaWknLCAnaWdub3JlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbiBpZ25vcmVkIGluLipcbk9TRXJyb3I6IC4qJykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQppbmRleCBiMmJlOWIxLi4wMWZiN2RjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQpAQCAtMTM4LDkgKzEzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndjAsIGV4cGVjdGVkX3BhdGgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3BhY2thZ2UsIGV4cGVjdGVkX2xvYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgotICAgICAgICBpZiBub3QgX19kZWJ1Z19fOgotICAgICAgICAgICAgY21kX2xpbmVfc3dpdGNoZXMgKz0gKCctJyArICdPJyAqIHN5cy5mbGFncy5vcHRpbWl6ZSwpCi0gICAgICAgIHJ1bl9hcmdzID0gY21kX2xpbmVfc3dpdGNoZXMgKyAoc2NyaXB0X25hbWUsKSArIHR1cGxlKGV4YW1wbGVfYXJncykKKyAgICAgICAgcnVuX2FyZ3MgPSBbKnN1cHBvcnQub3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICpjbWRfbGluZV9zd2l0Y2hlcywgc2NyaXB0X25hbWUsICpleGFtcGxlX2FyZ3NdCiAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soKnJ1bl9hcmdzLCBfX2lzb2xhdGVkPUZhbHNlKQogICAgICAgICBzZWxmLl9jaGVja19vdXRwdXQoc2NyaXB0X25hbWUsIHJjLCBvdXQgKyBlcnIsIGV4cGVjdGVkX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGF0aDAsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CmluZGV4IDA0Nzk1NDIuLjQ1YTE5ODcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0yNyw2ICsyNyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKICAgICByZXR1cm4gY2hlY2sKIAorCiBjbGFzcyBRdWV1ZShvYmplY3QpOgogICAgICIiIgogICAgIHF1ZXVlOiB3cml0ZSBieXRlcyBhdCBvbmUgZW5kLCByZWFkIGJ5dGVzIGZyb20gdGhlIG90aGVyIGVuZApAQCAtNDcsNiArNDgsNyBAQAogICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gc2VsZi5fYnVmZmVyW3NpemU6XQogICAgICAgICAgICAgcmV0dXJuIHMKIAorCiBjbGFzcyBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZzoKICAgICBkZWYgY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKHNlbGYsIGVuY29kaW5nLCB1LCBzKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgpAQCAtODAsNiArODIsNyBAQAogICAgICAgICAgICAgcGFydDIgPSBkLmVuY29kZSh1W2k6XSwgVHJ1ZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGFydDErcGFydDIpCiAKKwogY2xhc3MgUmVhZFRlc3QoTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiBjaGVja19wYXJ0aWFsKHNlbGYsIGlucHV0LCBwYXJ0aWFscmVzdWx0cyk6CiAgICAgICAgICMgZ2V0IGEgU3RyZWFtUmVhZGVyIGZvciB0aGUgZW5jb2RpbmcgYW5kIGZlZWQgdGhlIGJ5dGVzdHJpbmcgdmVyc2lvbgpAQCAtMzU4LDYgKzM2MSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIls/XSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQogCisgICAgICAgICMgc2VxdWVudGlhbCBzdXJyb2dhdGUgY2hhcmFjdGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJpZ25vcmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1RDgwMFx1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbPz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisKICAgICAgICAgYm9tID0gIiIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIGZvciBiZWZvcmUsIGFmdGVyIGluIFsoIlxVMDAwMTBmZmYiLCAiQSIpLCAoIlsiLCAiXSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJBIiwgIlxVMDAwMTBmZmYiKV06CkBAIC0zODMsNiArMzkyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9zZXF1ZW5jZS5kZWNvZGUoc2VsZi5lbmNvZGluZywgImJhY2tzbGFzaHJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlICsgYmFja3NsYXNocmVwbGFjZSArIGFmdGVyKQogCisKIGNsYXNzIFVURjMyVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMiIKICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgpAQCAtNDc4LDYgKzQ4OCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2JlKVswXSkKIAorCiBjbGFzcyBVVEYzMkxFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1sZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDgwXHhkY1x4MDBceDAwIgpAQCAtNTIzLDYgKzUzNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1xVMDAwMTAwMDAnICogMTAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2xlX2RlY29kZShlbmNvZGVkKVswXSkKIAorCiBjbGFzcyBVVEYzMkJFVGVzdChSZWFkVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi0zMi1iZSIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceDAwXHgwMFx4ZGNceDgwIgpAQCAtNzQ3LDYgKzc1OSw3IEBACiAgICAgZW5jb2RpbmcgPSAidXRmLTgiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZSA9IGIiXHhlZFx4YjJceDgwIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2VfcmVwbGFjZSA9ICJcdWZmZmQiICogMworICAgIEJPTSA9IGInJwogCiAgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKApAQCAtNzc1LDI3ICs3ODgsNDkgQEAKICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZi5lbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSwgdS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZShzZWxmLmVuY29kaW5nLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCiAgICAgZGVmIHRlc3RfbG9uZV9zdXJyb2dhdGVzKHNlbGYpOgogICAgICAgICBzdXBlcigpLnRlc3RfbG9uZV9zdXJyb2dhdGVzKCkKICAgICAgICAgIyBub3Qgc3VyZSBpZiB0aGlzIGlzIG1ha2luZyBzZW5zZSBmb3IKICAgICAgICAgIyBVVEYtMTYgYW5kIFVURi0zMgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEQzgwXSIuZW5jb2RlKCd1dGYtOCcsICJzdXJyb2dhdGVlc2NhcGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ1tceDgwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYidbXHg4MF0nKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICJbXHVEQzgwXHVEODAwXHVERkZGXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQorICAgICAgICBleGMgPSBjbS5leGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSwgJ1x1RDgwMFx1REZGRicpCiAKICAgICBkZWYgdGVzdF9zdXJyb2dhdGVwYXNzX2hhbmRsZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImFiY1x1ZDgwMGRlZiIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiYWJjXHhlZFx4YTBceDgwZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceGVkXHhhMFx4ODBceGVkXHhiMlx4ODBdJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjXHhlZFx4YTBceDgwZGVmIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjXHVkODAwZGVmIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFUwMDAxMGZmZlx1RDgwMCIuZW5jb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKHNlbGYuZW5jb2RpbmcsICJzdXJyb2dhdGVwYXNzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlxVMDAwMTBmZmZcdUQ4MDAiKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlY3MubG9va3VwX2Vycm9yKCJzdXJyb2dhdGVwYXNzIikpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpCisgICAgICAgICAgICBiImFiY1x4ZWRceGEwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBiImFiY1x4ZWRceGEweiIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAogICAgICAgICAgICAgICAgICAgICAgJ2NwNjUwMDEgaXMgYSBXaW5kb3dzLW9ubHkgY29kZWMnKQpAQCAtMTA1OSw2ICsxMDk0LDcgQEAKIAogY2xhc3MgVVRGOFNpZ1Rlc3QoVVRGOFRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBlbmNvZGluZyA9ICJ1dGYtOC1zaWciCisgICAgQk9NID0gY29kZWNzLkJPTV9VVEY4CiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCkBAIC0xMTk0LDYgKzEyMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJpZ25vcmUiKSwgKGIiW10iLCA4KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4MF1ceDAiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgOCkpCiAKKwogY2xhc3MgUmVjb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZWNvZGluZyhzZWxmKToKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTMxMyw2ICsxMzUwLDcgQEAKICAgICBpZiBsZW4oaSkhPTI6CiAgICAgICAgIHByaW50KHJlcHIoaSkpCiAKKwogY2xhc3MgUHVueWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CiAgICAgICAgIGZvciB1bmksIHB1bnkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgpAQCAtMTMzMiw2ICsxMzcwLDcgQEAKICAgICAgICAgICAgIHB1bnkgPSBwdW55LmRlY29kZSgiYXNjaWkiKS5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pLCBwdW55LmRlY29kZSgicHVueWNvZGUiKSkKIAorCiBjbGFzcyBVbmljb2RlSW50ZXJuYWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhTSVpFT0ZfV0NIQVJfVCA9PSA0LCAnc3BlY2lmaWMgdG8gMzItYml0IHdjaGFyX3QnKQogICAgIGRlZiB0ZXN0X2J1ZzEyNTEzMDAoc2VsZik6CkBAIC0xNTg2LDYgKzE2MjUsNyBAQAogICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKIAorCiBjbGFzcyBJRE5BQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9idWlsdGluX2RlY29kZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYiJweXRob24ub3JnIiwgImlkbmEiKSwgInB5dGhvbi5vcmciKQpAQCAtMTY3Miw2ICsxNzEyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICBiInB5dGhvbi5vcmciLmRlY29kZSwgImlkbmEiLCBlcnJvcnMpCiAKKwogY2xhc3MgQ29kZWNzTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CkBAIC0xNzgwLDYgKzE4MjEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLAogICAgICAgICAgICAgICAgIGNvZGVjcy5kZWNvZGUsIGInYWJjJywgJ3VuZGVmaW5lZCcsIGVycm9ycykKIAorCiBjbGFzcyBTdHJlYW1SZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE3OTAsNiArMTgzMiw3IEBACiAgICAgICAgIGYgPSBzZWxmLnJlYWRlcihzZWxmLnN0cmVhbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbJ1x1ZDU1Y1xuJywgJ1x1YWUwMCddKQogCisKIGNsYXNzIEVuY29kZWRGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTE5MjAsNiArMTk2Myw3IEBACiAgICAgInVuaWNvZGVfaW50ZXJuYWwiCiBdCiAKKwogY2xhc3MgQmFzaWNVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgTWl4SW5DaGVja1N0YXRlSGFuZGxpbmcpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKICAgICAgICAgcyA9ICJhYmMxMjMiICAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCkBAIC0yMDgyLDYgKzIxMjYsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdGVfaGFuZGxpbmdfZGVjb2RlKGVuY29kaW5nLCB1LCB1LmVuY29kZShlbmNvZGluZykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19lbmNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKIAorCiBjbGFzcyBDaGFybWFwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3dpdGhfc3RyaW5nX21hcChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTIzMzIsNiArMjM3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXdyaXRlciwgJ3N0cmljdCcpIGFzIHNydzoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3J3LnJlYWQoKSwgIlx4ZmMiKQogCisKIGNsYXNzIFR5cGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGVjb2RlX3VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgTW9zdCBkZWNvZGVycyBkb24ndCBhY2NlcHQgdW5pY29kZSBpbnB1dApAQCAtMjYyMiw2ICsyNjY4LDcgQEAKICAgICBieXRlc190cmFuc2Zvcm1fZW5jb2RpbmdzLmFwcGVuZCgiYnoyX2NvZGVjIikKICAgICB0cmFuc2Zvcm1fYWxpYXNlc1siYnoyX2NvZGVjIl0gPSBbImJ6MiJdCiAKKwogY2xhc3MgVHJhbnNmb3JtQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKQEAgLTMwOTksNSArMzE0Niw4MSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWQsICgnYWJjJywgMykpCiAKIAorY2xhc3MgQVNDSUlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYzEyMycuZW5jb2RlKCdhc2NpaScpLCBiJ2FiYzEyMycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAnaWdub3JlJywgYidbXScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNdJywgJ3JlcGxhY2UnLCBiJ1s/Pz9dJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzEyODsmIzI1NTsmIzgzNjQ7XScpLAorICAgICAgICAgICAgKCdbXHg4MFx4ZmZcdTIwYWNcVTAwMGFiY2RlXScsICdiYWNrc2xhc2hyZXBsYWNlJywKKyAgICAgICAgICAgICBiJ1tcXHg4MFxceGZmXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHVkYzgwXHVkY2ZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCBiJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHhmZicuZW5jb2RlKCdhc2NpaScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJy5kZWNvZGUoJ2FzY2lpJyksICdhYmMnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdpZ25vcmUnLCAnW10nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAncmVwbGFjZScsICdbXHVmZmZkXHVmZmZkXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdzdXJyb2dhdGVlc2NhcGUnLCAnW1x1ZGM4MFx1ZGNmZl0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnYmFja3NsYXNocmVwbGFjZScsICdbXFx4ODBcXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXJyb3JfaGFuZGxlcj1lcnJvcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2FzY2lpJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworCitjbGFzcyBMYXRpbjFUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ2FiYycsIGInYWJjJyksCisgICAgICAgICAgICAoJ1x4ODBceGU5XHhmZicsIGInXHg4MFx4ZTlceGZmJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXJyb3JfaGFuZGxlciwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ3JlcGxhY2UnLCBiJ1s/P10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xcdTIwYWNcXFUwMDBhYmNkZV0nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAneG1sY2hhcnJlZnJlcGxhY2UnLCBiJ1smIzgzNjQ7JiM1NjQ0ODtdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnbGF0aW4xJywgZXJyb3JfaGFuZGxlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9zdXJyb2dhdGVlc2NhcGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICMgdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUgZGVjb2RlZCwgYnV0IG5vdCB0aGUgc2Vjb25kCisgICAgICAgICAgICAnXHVkYzgwXHUyMGFjJy5lbmNvZGUoJ2xhdGluMScsICdzdXJyb2dhdGVlc2NhcGUnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgZGF0YSwgZXhwZWN0ZWQgaW4gKAorICAgICAgICAgICAgKGInYWJjJywgJ2FiYycpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKCdsYXRpbjEnKSwgZXhwZWN0ZWQpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CmluZGV4IDRjMzJlMDkuLjQyMDI0NjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQpAQCAtMjAsNyArMjAsNyBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgQXdhaXRhYmxlLCBDb3JvdXRpbmUsIEFzeW5jSXRlcmF0b3IsIEFzeW5jSXRlcmFibGUKLWZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBHZW5lcmF0b3IKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBHZW5lcmF0b3IsIFJldmVyc2libGUKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZQogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNldCwgTXV0YWJsZVNldAogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IE1hcHBpbmcsIE11dGFibGVNYXBwaW5nLCBLZXlzVmlldywgSXRlbXNWaWV3CkBAIC02ODksNiArNjg5LDMxIEBACiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhJdGVyYWJsZSwgJ19faXRlcl9fJykKICAgICAgICAgc2VsZi52YWxpZGF0ZV9pc2luc3RhbmNlKEl0ZXJhYmxlLCAnX19pdGVyX18nKQogCisgICAgZGVmIHRlc3RfUmV2ZXJzaWJsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayBzb21lIG5vbi1yZXZlcnNpYmxlcworICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosIGRpY3QoKSwgc2V0KCksIGZyb3plbnNldCgpXQorICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh4LCBSZXZlcnNpYmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIFJldmVyc2libGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIHNvbWUgcmV2ZXJzaWJsZXMKKyAgICAgICAgc2FtcGxlcyA9IFt0dXBsZSgpLCBsaXN0KCldCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgUmV2ZXJzaWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIFJldmVyc2libGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIGFsc28gTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIGFuZCBTZXF1ZW5jZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTZXF1ZW5jZSwgUmV2ZXJzaWJsZSksIHJlcHIoU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoTWFwcGluZywgUmV2ZXJzaWJsZSksIHJlcHIoTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhNdXRhYmxlTWFwcGluZywgUmV2ZXJzaWJsZSksIHJlcHIoTXV0YWJsZU1hcHBpbmcpKQorICAgICAgICAjIENoZWNrIGRpcmVjdCBzdWJjbGFzc2luZworICAgICAgICBjbGFzcyBSKFJldmVyc2libGUpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKGxpc3QoKSkKKyAgICAgICAgICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIobGlzdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQoUigpKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoZmxvYXQsIFIpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoUmV2ZXJzaWJsZSwgJ19fcmV2ZXJzZWRfXycsICdfX2l0ZXJfXycpCisKICAgICBkZWYgdGVzdF9JdGVyYXRvcihzZWxmKToKICAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLCBiIiIsICIiLCAoKSwgW10sIHt9LCBzZXQoKV0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CkBAIC04NDIsMTQgKzg2NywxNCBAQAogICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoQ2FsbGFibGUsICdfX2NhbGxfXycpCiAKICAgICBkZWYgdGVzdF9kaXJlY3Rfc3ViY2xhc3Npbmcoc2VsZik6Ci0gICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgorICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBSZXZlcnNpYmxlLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKICAgICAgICAgICAgIGNsYXNzIEMoQik6CiAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKLSAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFJldmVyc2libGUsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgogICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgICMgTWFrZSBzdXJlIGl0IGlzbid0IGhhc2hhYmxlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCKSwgQi5fX25hbWVfXykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQppbmRleCAyY2U4YTYxLi45YjQyNGE3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CkBAIC0xLDYgKzEsNyBAQAogaW1wb3J0IHN5cwogaW1wb3J0IGNvbXBpbGVhbGwKIGltcG9ydCBpbXBvcnRsaWIudXRpbAoraW1wb3J0IHRlc3QudGVzdF9pbXBvcnRsaWIudXRpbAogaW1wb3J0IG9zCiBpbXBvcnQgcGF0aGxpYgogaW1wb3J0IHB5X2NvbXBpbGUKQEAgLTQwLDYgKzQxLDExIEBACiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyZWN0b3J5KQogCisgICAgZGVmIGFkZF9iYWRfc291cmNlX2ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYmFkX3NvdXJjZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuZGlyZWN0b3J5LCAnX3Rlc3RfYmFkLnB5JykKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmFkX3NvdXJjZV9wYXRoLCAndycpIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKCd4IChcbicpCisKICAgICBkZWYgZGF0YShzZWxmKToKICAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmNfcGF0aCwgJ3JiJykgYXMgZmlsZToKICAgICAgICAgICAgIGRhdGEgPSBmaWxlLnJlYWQoOCkKQEAgLTc4LDE1ICs4NCw0MyBAQAogICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9maWxlKHNlbGYuc291cmNlX3BhdGgsIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aCkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCi0gICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0PVRydWUpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aDIpKQogICAgICAgICBvcy51bmxpbmsoc2VsZi5iY19wYXRoKQogICAgICAgICBvcy51bmxpbmsoc2VsZi5iY19wYXRoMikKKyAgICAgICAgIyBUZXN0IGFnYWluc3QgYmFkIGZpbGVzCisgICAgICAgIHNlbGYuYWRkX2JhZF9zb3VyY2VfZmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5iYWRfc291cmNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PTIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9MikpCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3BhdGgoc2VsZik6CisgICAgICAgICMgRXhjbHVkZSBMaWIvdGVzdC8gd2hpY2ggY29udGFpbnMgaW52YWxpZCBQeXRob24gZmlsZXMgbGlrZQorICAgICAgICAjIExpYi90ZXN0L2JhZHN5bnRheF9wZXAzMTIwLnB5CisgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisgICAgICAgIGlmIHRlc3RkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoc2V0YXR0ciwgc3lzLCAncGF0aCcsIHN5cy5wYXRoKQorCisgICAgICAgICAgICBzeXMucGF0aCA9IGxpc3Qoc3lzLnBhdGgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnBhdGgucmVtb3ZlKHRlc3RkaXIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBpbGVhbGwuY29tcGlsZV9wYXRoKHF1aWV0PTIpKQorCisgICAgICAgIHdpdGggdGVzdC50ZXN0X2ltcG9ydGxpYi51dGlsLmltcG9ydF9zdGF0ZShwYXRoPVtzZWxmLmRpcmVjdG9yeV0pOgorICAgICAgICAgICAgc2VsZi5hZGRfYmFkX3NvdXJjZV9maWxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX3BhdGgoc2tpcF9jdXJkaXI9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIHF1aWV0PTIpKQogCiAgICAgZGVmIHRlc3Rfbm9fcHljYWNoZV9pbl9ub25fcGFja2FnZShzZWxmKToKICAgICAgICAgIyBCdWcgODU2MyByZXBvcnRlZCB0aGF0IF9fcHljYWNoZV9fIGRpcmVjdG9yaWVzIGdvdCBjcmVhdGVkIGJ5CkBAIC0xOTcsMTAgKzIzMSw5IEBACiAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnbm90IGFsbCBlbnRyaWVzIG9uIHN5cy5wYXRoIGFyZSB3cml0YWJsZScpCiAKICAgICBkZWYgX2dldF9ydW5fYXJncyhzZWxmLCBhcmdzKToKLSAgICAgICAgaW50ZXJwX2FyZ3MgPSBbJy1TJ10KLSAgICAgICAgaWYgc3lzLmZsYWdzLm9wdGltaXplOgotICAgICAgICAgICAgaW50ZXJwX2FyZ3MuYXBwZW5kKHsxIDogJy1PJywgMiA6ICctT08nfVtzeXMuZmxhZ3Mub3B0aW1pemVdKQotICAgICAgICByZXR1cm4gaW50ZXJwX2FyZ3MgKyBbJy1tJywgJ2NvbXBpbGVhbGwnXSArIGxpc3QoYXJncykKKyAgICAgICAgcmV0dXJuIFsqc3VwcG9ydC5vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAnLVMnLCAnLW0nLCAnY29tcGlsZWFsbCcsCisgICAgICAgICAgICAgICAgKmFyZ3NdCiAKICAgICBkZWYgYXNzZXJ0UnVuT0soc2VsZiwgKmFyZ3MsICoqZW52X3ZhcnMpOgogICAgICAgICByYywgb3V0LCBlcnIgPSBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKaW5kZXggMzBhNjM3Ny4uNWM4YmM5OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMTIsNiArMTIsMzkgQEAKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKIAorY2xhc3MgVGVzdEFic3RyYWN0Q29udGV4dE1hbmFnZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZW50ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIERlZmF1bHRFbnRlcihBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2V4aXRfXygqYXJncykKKworICAgICAgICBtYW5hZ2VyID0gRGVmYXVsdEVudGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYW5hZ2VyLl9fZW50ZXJfXygpLCBtYW5hZ2VyKQorCisgICAgZGVmIHRlc3RfZXhpdF9pc19hYnN0cmFjdChzZWxmKToKKyAgICAgICAgY2xhc3MgTWlzc2luZ0V4aXQoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgTWlzc2luZ0V4aXQoKQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJhbF9zdWJjbGFzc2luZyhzZWxmKToKKyAgICAgICAgY2xhc3MgTWFuYWdlckZyb21TY3JhdGNoOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhNYW5hZ2VyRnJvbVNjcmF0Y2gsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpKQorCisgICAgICAgIGNsYXNzIERlZmF1bHRFbnRlcihBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc3VwZXIoKS5fX2V4aXRfXygqYXJncykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhEZWZhdWx0RW50ZXIsIEFic3RyYWN0Q29udGV4dE1hbmFnZXIpKQorCisKIGNsYXNzIENvbnRleHRNYW5hZ2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfcGxhaW4oc2VsZik6CkBAIC04OSw3ICsxMjIsNyBAQAogICAgICAgICBkZWYgd29vaG9vKCk6CiAgICAgICAgICAgICB5aWVsZAogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgICAgICB3aXRoIHdvb2hvbygpOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBzdG9wX2V4YwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CmluZGV4IDBlMWY2NzAuLjQ1YTY5MjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29weS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgdGVzdHMgPSBbTm9uZSwgLi4uLCBOb3RJbXBsZW1lbnRlZCwKICAgICAgICAgICAgICAgICAgNDIsIDIqKjEwMCwgMy4xNCwgVHJ1ZSwgRmFsc2UsIDFqLAogICAgICAgICAgICAgICAgICAiaGVsbG8iLCAiaGVsbG9cdTEyMzQiLCBmLl9fY29kZV9fLAotICAgICAgICAgICAgICAgICBiIndvcmxkIiwgYnl0ZXMocmFuZ2UoMjU2KSksIHJhbmdlKDEwKSwKKyAgICAgICAgICAgICAgICAgYiJ3b3JsZCIsIGJ5dGVzKHJhbmdlKDI1NikpLCByYW5nZSgxMCksIHNsaWNlKDEsIDEwLCAyKSwKICAgICAgICAgICAgICAgICAgTmV3U3R5bGUsIENsYXNzaWMsIG1heCwgV2l0aE1ldGFjbGFzc10KICAgICAgICAgZm9yIHggaW4gdGVzdHM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNvcHkuY29weSh4KSwgeCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5IGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKaW5kZXggNzdjMzE1ZS4uOTIxZmQ0YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jc3YucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKQEAgLTQyNiwxNyArNDI2LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAtMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IDEwMCkKIAotICAgICMgU2VlIGlzc3VlICMyMjk5NQotICAgICMjIGRlZiB0ZXN0X2NvcHkoc2VsZik6Ci0gICAgIyMgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6Ci0gICAgIyMgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCi0gICAgIyMgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHkuY29weSwgZGlhbGVjdCkKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgorICAgICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5LmNvcHksIGRpYWxlY3QpCiAKLSAgICAjIyBkZWYgdGVzdF9waWNrbGUoc2VsZik6Ci0gICAgIyMgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6Ci0gICAgIyMgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCi0gICAgIyMgICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSAgICAjIyAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZGlhbGVjdCwgcHJvdG8pCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBjc3YubGlzdF9kaWFsZWN0cygpOgorICAgICAgICAgICAgZGlhbGVjdCA9IGNzdi5nZXRfZGlhbGVjdChuYW1lKQorICAgICAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGRpYWxlY3QsIHByb3RvKQogCiBjbGFzcyBUZXN0Q3N2QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHJlYWRlckFzc2VydEVxdWFsKHNlbGYsIGlucHV0LCBleHBlY3RlZF9yZXN1bHQpOgpAQCAtMTA5OCw1ICsxMDk3LDExIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7J19fZG9jX18nLCAnX192ZXJzaW9uX18nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjc3YsICgnY3N2JywgJ19jc3YnKSwgZXh0cmE9ZXh0cmEpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCBjMGQyMWIxLi5mNTZmOWFkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0yMDQ3LDYgKzIwNDcsMzkgQEAKICAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMiwgNywgMSksICdGJykgKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksICdGJykpCiAKKyAgICBkZWYgdGVzdF9hc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKKworICAgICAgICAjIGV4Y2VwdGlvbmFsIGNhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLWluZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdzbmFuMTIzJykpCisKKyAgICAgICAgZm9yIGV4cCBpbiByYW5nZSgtNCwgMik6CisgICAgICAgICAgICBmb3IgY29lZmYgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgZm9yIHNpZ24gaW4gJysnLCAnLSc6CisgICAgICAgICAgICAgICAgICAgIGQgPSBEZWNpbWFsKCclcyVkRSVkJyAlIChzaWduLCBjb2VmZiwgZXhwKSkKKyAgICAgICAgICAgICAgICAgICAgcHEgPSBkLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICAgICAgICAgICBwLCBxID0gcHEKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHJldHVybiB0eXBlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwcSwgdHVwbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwLCBpbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShxLCBpbnQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBub3JtYWxpemF0aW9uOiAgcSBzaG91bGQgYmUgcG9zaXRpdmU7CisgICAgICAgICAgICAgICAgICAgICMgcCBzaG91bGQgYmUgcmVsYXRpdmVseSBwcmltZSB0byBxLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIocSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmdjZChwLCBxKSwgMSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgcC9xIGFjdHVhbGx5IGdpdmVzIHRoZSBjb3JyZWN0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChwKSAvIERlY2ltYWwocSksIGQpCisKICAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgIyBEaWZmZXJlbnQgYmVoYXZpb3VycyB3aGVuIHN1YmNsYXNzaW5nIERlY2ltYWwKICAgICAgICAgRGVjaW1hbCA9IHNlbGYuZGVjaW1hbC5EZWNpbWFsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCA3MDQxZDE3Li42ZGJlYTQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmluZGV4KGVsZW1lbnQsIHN0YXJ0LCBzdG9wKSwgdGFyZ2V0KQogCi0gICAgZGVmIHRlc3RfaW5zZXJ0X2J1Z18yNDkxMyhzZWxmKToKKyAgICBkZWYgdGVzdF9pbmRleF9idWdfMjQ5MTMoc2VsZik6CiAgICAgICAgIGQgPSBkZXF1ZSgnQScgKiAzKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgaSA9IGQuaW5kZXgoIkhlbGxvIHdvcmxkIiwgMCwgNCkKQEAgLTYyMiwyMCArNjIyLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSAgICAgICAgZCA9IGRlcXVlKHJhbmdlKDIwMCkpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0gICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQsIGkpCi0gICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgZm9yIGQgaW4gZGVxdWUocmFuZ2UoMjAwKSksIGRlcXVlKHJhbmdlKDIwMCksIDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoZCwgaSkKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGUpLCBsaXN0KGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgotIyMgICAgICAgIGQgPSBkZXF1ZSgnYWJjJykKLSMjICAgICAgICBkLmFwcGVuZChkKQotIyMgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0jIyAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIGkpKQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSMjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZVstMV0pKQorICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6CisgICAgICAgIGZvciBkIGluIGRlcXVlKCdhYmMnKSwgZGVxdWUoJ2FiYycsIDMpOgorICAgICAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlWy0xXSksIGlkKGUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCiAgICAgZGVmIHRlc3RfaXRlcmF0b3JfcGlja2xlKHNlbGYpOgogICAgICAgICBvcmlnID0gZGVxdWUocmFuZ2UoMjAwKSkKQEAgLTY5Niw2ICs2OTgsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvciBtYXhsZW4gaW4gcmFuZ2UoLTEsIDYpOgorICAgICAgICAgICAgICAgIHMgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBqIGluIHJhbmdlKGkpXQorICAgICAgICAgICAgICAgIGQgPSBkZXF1ZShzKSBpZiBtYXhsZW4gPT0gLTEgZWxzZSBkZXF1ZShzLCBtYXhsZW4pCisgICAgICAgICAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tYXhsZW4sIGUubWF4bGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoeCBpcyB5IGZvciB4LCB5IGluIHppcChkLCBlKSkpCisKICAgICBkZWYgdGVzdF9jb3B5X21ldGhvZChzZWxmKToKICAgICAgICAgbXV0ID0gWzEwXQogICAgICAgICBkID0gZGVxdWUoW211dF0pCkBAIC04NDUsMjQgKzg1NiwyNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6Ci0jIyAgICAgICAgZCA9IERlcXVlKCdhYmMnKQotIyMgICAgICAgIGQuYXBwZW5kKGQpCi0jIwotIyMgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKLSMjICAgICAgICBkZCA9IGQucG9wKCkKLSMjICAgICAgICBlZSA9IGUucG9wKCkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlZSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQotIyMKLSMjICAgICAgICBkLnggPSBkCi0jIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZS54KSkKLSMjCi0jIyAgICAgICAgZCA9IERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQpCisgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZSgnYWJjJyksIERlcXVlKCdhYmMnLCAzKToKKyAgICAgICAgICAgICAgICBkLmFwcGVuZChkKQorCisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZSksIGlkKGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlKSwgdHlwZShkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubWF4bGVuLCBkLm1heGxlbikKKyAgICAgICAgICAgICAgICBkZCA9IGQucG9wKCkKKyAgICAgICAgICAgICAgICBlZSA9IGUucG9wKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGVlKSwgaWQoZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCBkKQorCisgICAgICAgICAgICAgICAgZC54ID0gZAorICAgICAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIHByb3RvKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUueCksIGlkKGUpKQorCisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnKSwgRGVxdWVXaXRoQmFkSXRlcignYWJjJywgMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQsIHByb3RvKQogCiAgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKCdnYWxsYWhhZCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCBhODIwNmQzLi5kMWIyOTA1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTQ3NDYsMTEgKzQ3NDYsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoYXJncywga3dhcmdzKQogICAgICAgICBvYmogPSBDMygpCiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6Ci0gICAgICAgICAgICBpZiBwcm90byA+PSA0OgorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1Y2UocHJvdG8sIG9iaiwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxpZiBwcm90byA+PSAyOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIG9iai5fX3JlZHVjZV9leF9fKHByb3RvKQogCiAgICAgICAgIGNsYXNzIEM0OgogICAgICAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgpAQCAtNTA2OSwxMCArNTA2Niw2IEBACiAgICAgICAgICAgICAgICAga3dhcmdzID0gZ2V0YXR0cihjbHMsICdLV0FSR1MnLCB7fSkKICAgICAgICAgICAgICAgICBvYmogPSBjbHMoKmNscy5BUkdTLCAqKmt3YXJncykKICAgICAgICAgICAgICAgICBwcm90byA9IHBpY2tsZV9jb3BpZXIucHJvdG8KLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNCBhbmQgaGFzYXR0cihjbHMsICdfX2dldG5ld2FyZ3NfZXhfXycpOgotICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvcGllci5kdW1wcyhvYmosIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIG9iamNvcHkgPSBwaWNrbGVfY29waWVyLmNvcHkob2JqKQogICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9pc19jb3B5KG9iaiwgb2JqY29weSkKICAgICAgICAgICAgICAgICAjIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBzdXBwb3J0cyB0aGlzLCBtYWtlIHN1cmUgd2UgZGlkbid0IGdvCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKaW5kZXggMDc1Y2I1YS4uN2RkNDRiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQpAQCAtMSwxMCArMSwxMiBAQAotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQotaW1wb3J0IGNvbGxlY3Rpb25zLCByYW5kb20sIHN0cmluZworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi1pbXBvcnQgZ2MsIHdlYWtyZWYKK2ltcG9ydCBnYwogaW1wb3J0IHBpY2tsZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cmluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRGljdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtOTY5LDUgKzk3MSw2IEBACiBjbGFzcyBTdWJjbGFzc01hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CiAgICAgdHlwZTJ0ZXN0ID0gRGljdAogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3R2aWV3cy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CmluZGV4IGFiMjNjYTEuLjRjMjkwZmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CkBAIC0xLDMgKzEsNCBAQAoraW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHVuaXR0ZXN0CkBAIC0yMTksNiArMjIwLDI3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBwaWNrbGUuUGlja2xpbmdFcnJvciksCiAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzLCBkLml0ZW1zKCksIHByb3RvKQogCisgICAgZGVmIHRlc3RfYWJjX3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBkID0gZGljdChhPTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5LZXlzVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuSXRlcmFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5WYWx1ZXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC52YWx1ZXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVtc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNpemVkKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggNmE3YmEwYi4uZjdjNDgwNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMjk0OCwxMiArMjk0OCwxMSBAQAogZGVmIHRlc3RfbWFpbigpOgogICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgaW4gZG9jdGVzdCBpdHNlbGY6CiAgICAgcmV0ID0gc3VwcG9ydC5ydW5fZG9jdGVzdChkb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKKwogICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgZGVmaW5lZCBoZXJlOgogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0CiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2RvY3Rlc3QsIHZlcmJvc2l0eT1UcnVlKQogCi1pbXBvcnQgc3lzLCByZSwgaW8KLQogZGVmIHRlc3RfY292ZXJhZ2UoY292ZXJkaXIpOgogICAgIHRyYWNlID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0cmFjZScpCiAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCxdLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9laW50ci5weSBiL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKaW5kZXggYWFiYWQ4My4uNzU0NTJmMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9laW50ci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CkBAIC0xNiwxNCArMTYsOCBAQAogICAgICAgICAjIFJ1biB0aGUgdGVzdGVyIGluIGEgc3ViLXByb2Nlc3MsIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZQogICAgICAgICAjIHRocmVhZCAoZm9yIHJlbGlhYmxlIHNpZ25hbCBkZWxpdmVyeSkuCiAgICAgICAgIHRlc3RlciA9IHN1cHBvcnQuZmluZGZpbGUoImVpbnRyX3Rlc3Rlci5weSIsIHN1YmRpcj0iZWludHJkYXRhIikKLQotICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCB0ZXN0ZXJdCi0gICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oYXJncykgYXMgcHJvYzoKLSAgICAgICAgICAgICAgICBleGl0Y29kZSA9IHByb2Mud2FpdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRjb2RlLCAwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKHRlc3RlcikKKyAgICAgICAgIyB1c2UgLXUgdG8gdHJ5IHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgaWYgdGhlIHRlc3QgaGFuZ3Mgb3IgY3Jhc2gKKyAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKCItdSIsIHRlc3RlcikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5IGIvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CmluZGV4IGE1OWEwNDkuLmU1ZTBlYzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW51bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKQEAgLTYsNiArNiw3IEBACiBmcm9tIGVudW0gaW1wb3J0IEVudW0sIEludEVudW0sIEVudW1NZXRhLCB1bmlxdWUKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHBpY2tsZSBpbXBvcnQgZHVtcHMsIGxvYWRzLCBQaWNrbGluZ0Vycm9yLCBISUdIRVNUX1BST1RPQ09MCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogIyBmb3IgcGlja2xlIHRlc3RzCiB0cnk6CkBAIC0yODMsNiArMjg0LDI4IEBACiAgICAgICAgICAgICBjbGFzcyBXcm9uZyhFbnVtKToKICAgICAgICAgICAgICAgICBfYW55X25hbWVfID0gOQogCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBwbGFpbiBFbnVtIG1lbWJlcnMgYXJlIGFsd2F5cyBUcnVlCisgICAgICAgIGNsYXNzIExvZ2ljKEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IFRydWUKKyAgICAgICAgICAgIGZhbHNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKExvZ2ljLnRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMb2dpYy5mYWxzZSkKKyAgICAgICAgIyB1bmxlc3Mgb3ZlcnJpZGRlbgorICAgICAgICBjbGFzcyBSZWFsTG9naWMoRW51bSk6CisgICAgICAgICAgICB0cnVlID0gVHJ1ZQorICAgICAgICAgICAgZmFsc2UgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZhbHVlXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFJlYWxMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFJlYWxMb2dpYy5mYWxzZSkKKyAgICAgICAgIyBtaXhlZCBFbnVtcyBkZXBlbmQgb24gbWl4ZWQtaW4gdHlwZQorICAgICAgICBjbGFzcyBJbnRMb2dpYyhpbnQsIEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IDEKKyAgICAgICAgICAgIGZhbHNlID0gMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoSW50TG9naWMudHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJbnRMb2dpYy5mYWxzZSkKKwogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBTZWFzb24gPSBzZWxmLlNlYXNvbgogICAgICAgICBzZWxmLmFzc2VydEluKFNlYXNvbi5BVVRVTU4sIFNlYXNvbikKQEAgLTE3MTQsNSArMTczNywxMSBAQAogICAgICAgICBpZiBmYWlsZWQ6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCwgc2VlIHByaW50IGFib3ZlIikKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZW51bSkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mYXVsdGhhbmRsZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQppbmRleCAxNTYyZWVjLi5mYzJkNmQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weQpAQCAtMjMsNiArMjMsNyBAQAogICAgIF90ZXN0Y2FwaSA9IE5vbmUKIAogVElNRU9VVCA9IDAuNQorTVNfV0lORE9XUyA9IChvcy5uYW1lID09ICdudCcpCiAKIGRlZiBleHBlY3RlZF90cmFjZWJhY2sobGluZW5vMSwgbGluZW5vMiwgaGVhZGVyLCBtaW5fY291bnQ9MSk6CiAgICAgcmVnZXggPSBoZWFkZXIKQEAgLTU4LDggKzU5LDkgQEAKICAgICAgICAgICAgIHBhc3NfZmRzLmFwcGVuZChmZCkKICAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKICAgICAgICAgICAgIHByb2Nlc3MgPSBzY3JpcHRfaGVscGVyLnNwYXduX3B5dGhvbignLWMnLCBjb2RlLCBwYXNzX2Zkcz1wYXNzX2ZkcykKLSAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKLSAgICAgICAgZXhpdGNvZGUgPSBwcm9jZXNzLndhaXQoKQorICAgICAgICAgICAgd2l0aCBwcm9jZXNzOgorICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSBwcm9jZXNzLndhaXQoKQogICAgICAgICBvdXRwdXQgPSBzdXBwb3J0LnN0cmlwX3B5dGhvbl9zdGRlcnIoc3Rkb3V0KQogICAgICAgICBvdXRwdXQgPSBvdXRwdXQuZGVjb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykKICAgICAgICAgaWYgZmlsZW5hbWU6CkBAIC03MywxNCArNzUsMTEgQEAKICAgICAgICAgICAgIHdpdGggb3BlbihmZCwgInJiIiwgY2xvc2VmZD1GYWxzZSkgYXMgZnA6CiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gZnAucmVhZCgpCiAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXQuZGVjb2RlKCdhc2NpaScsICdiYWNrc2xhc2hyZXBsYWNlJykKLSAgICAgICAgb3V0cHV0ID0gcmUuc3ViKCdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKycsCi0gICAgICAgICAgICAgICAgICAgICAgICAnQ3VycmVudCB0aHJlYWQgWFhYJywKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKICAgICAgICAgcmV0dXJuIG91dHB1dC5zcGxpdGxpbmVzKCksIGV4aXRjb2RlCiAKLSAgICBkZWYgY2hlY2tfZmF0YWxfZXJyb3Ioc2VsZiwgY29kZSwgbGluZV9udW1iZXIsIG5hbWVfcmVnZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsIGFsbF90aHJlYWRzPVRydWUsIG90aGVyX3JlZ2V4PU5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZkPU5vbmUpOgorICAgIGRlZiBjaGVja19lcnJvcihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICosCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPU5vbmUsIGFsbF90aHJlYWRzPVRydWUsIG90aGVyX3JlZ2V4PU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGZkPU5vbmUsIGtub3dfY3VycmVudF90aHJlYWQ9VHJ1ZSk6CiAgICAgICAgICIiIgogICAgICAgICBDaGVjayB0aGF0IHRoZSBmYXVsdCBoYW5kbGVyIGZvciBmYXRhbCBlcnJvcnMgaXMgZW5hYmxlZCBhbmQgY2hlY2sgdGhlCiAgICAgICAgIHRyYWNlYmFjayBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzIG91dHB1dC4KQEAgLTg4LDE5ICs4NywyMiBAQAogICAgICAgICBSYWlzZSBhbiBlcnJvciBpZiB0aGUgb3V0cHV0IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIGZvcm1hdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIGFsbF90aHJlYWRzOgotICAgICAgICAgICAgaGVhZGVyID0gJ0N1cnJlbnQgdGhyZWFkIFhYWCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCknCisgICAgICAgICAgICBpZiBrbm93X2N1cnJlbnRfdGhyZWFkOgorICAgICAgICAgICAgICAgIGhlYWRlciA9ICdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGVhZGVyID0gJ1RocmVhZCAweFswLTlhLWZdKycKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGhlYWRlciA9ICdTdGFjayAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCknCisgICAgICAgICAgICBoZWFkZXIgPSAnU3RhY2snCiAgICAgICAgIHJlZ2V4ID0gIiIiCi0gICAgICAgICAgICBeRmF0YWwgUHl0aG9uIGVycm9yOiB7bmFtZX0KKyAgICAgICAgICAgIF57ZmF0YWxfZXJyb3J9CiAKLSAgICAgICAgICAgIHtoZWFkZXJ9OgorICAgICAgICAgICAge2hlYWRlcn0gXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6CiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSB7bGluZW5vfSBpbiA8bW9kdWxlPgogICAgICAgICAgICAgIiIiCiAgICAgICAgIHJlZ2V4ID0gZGVkZW50KHJlZ2V4LmZvcm1hdCgKICAgICAgICAgICAgIGxpbmVubz1saW5lX251bWJlciwKLSAgICAgICAgICAgIG5hbWU9bmFtZV9yZWdleCwKLSAgICAgICAgICAgIGhlYWRlcj1yZS5lc2NhcGUoaGVhZGVyKSkpLnN0cmlwKCkKKyAgICAgICAgICAgIGZhdGFsX2Vycm9yPWZhdGFsX2Vycm9yLAorICAgICAgICAgICAgaGVhZGVyPWhlYWRlcikpLnN0cmlwKCkKICAgICAgICAgaWYgb3RoZXJfcmVnZXg6CiAgICAgICAgICAgICByZWdleCArPSAnfCcgKyBvdGhlcl9yZWdleAogICAgICAgICBvdXRwdXQsIGV4aXRjb2RlID0gc2VsZi5nZXRfb3V0cHV0KGNvZGUsIGZpbGVuYW1lPWZpbGVuYW1lLCBmZD1mZCkKQEAgLTEwOCwxNyArMTEwLDM2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0cHV0LCByZWdleCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChleGl0Y29kZSwgMCkKIAorICAgIGRlZiBjaGVja19mYXRhbF9lcnJvcihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgbmFtZV9yZWdleCwgKiprdyk6CisgICAgICAgIGZhdGFsX2Vycm9yID0gJ0ZhdGFsIFB5dGhvbiBlcnJvcjogJXMnICUgbmFtZV9yZWdleAorICAgICAgICBzZWxmLmNoZWNrX2Vycm9yKGNvZGUsIGxpbmVfbnVtYmVyLCBmYXRhbF9lcnJvciwgKiprdykKKworICAgIGRlZiBjaGVja193aW5kb3dzX2V4Y2VwdGlvbihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgbmFtZV9yZWdleCwgKiprdyk6CisgICAgICAgIGZhdGFsX2Vycm9yID0gJ1dpbmRvd3MgZmF0YWwgZXhjZXB0aW9uOiAlcycgJSBuYW1lX3JlZ2V4CisgICAgICAgIHNlbGYuY2hlY2tfZXJyb3IoY29kZSwgbGluZV9udW1iZXIsIGZhdGFsX2Vycm9yLCAqKmt3KQorCiAgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYWl4JyksCiAgICAgICAgICAgICAgICAgICAgICAidGhlIGZpcnN0IHBhZ2Ugb2YgbWVtb3J5IGlzIGEgbWFwcGVkIHJlYWQtb25seSBvbiBBSVgiKQogICAgIGRlZiB0ZXN0X3JlYWRfbnVsbChzZWxmKToKLSAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKLSAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQotICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yZWFkX251bGwoKQotICAgICAgICAgICAgIiIiLAotICAgICAgICAgICAgMywKLSAgICAgICAgICAgICMgSXNzdWUgIzEyNzAwOiBSZWFkIE5VTEwgcmFpc2VzIFNJR0lMTCBvbiBNYWMgT1MgWCBMaW9uCi0gICAgICAgICAgICAnKD86U2VnbWVudGF0aW9uIGZhdWx0fEJ1cyBlcnJvcnxJbGxlZ2FsIGluc3RydWN0aW9uKScpCisgICAgICAgIGlmIG5vdCBNU19XSU5ET1dTOgorICAgICAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yZWFkX251bGwoKQorICAgICAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICMgSXNzdWUgIzEyNzAwOiBSZWFkIE5VTEwgcmFpc2VzIFNJR0lMTCBvbiBNYWMgT1MgWCBMaW9uCisgICAgICAgICAgICAgICAgJyg/OlNlZ21lbnRhdGlvbiBmYXVsdCcKKyAgICAgICAgICAgICAgICAgICAgJ3xCdXMgZXJyb3InCisgICAgICAgICAgICAgICAgICAgICd8SWxsZWdhbCBpbnN0cnVjdGlvbiknKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jaGVja193aW5kb3dzX2V4Y2VwdGlvbigiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yZWFkX251bGwoKQorICAgICAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICdhY2Nlc3MgdmlvbGF0aW9uJykKIAogICAgIGRlZiB0ZXN0X3NpZ3NlZ3Yoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCkBAIC0xMjksNiArMTUwLDE3IEBACiAgICAgICAgICAgICAzLAogICAgICAgICAgICAgJ1NlZ21lbnRhdGlvbiBmYXVsdCcpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBIQVZFX1RIUkVBRFMsICduZWVkIHRocmVhZHMnKQorICAgIGRlZiB0ZXN0X2ZhdGFsX2Vycm9yX2NfdGhyZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgorICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuX2ZhdGFsX2Vycm9yX2NfdGhyZWFkKCkKKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgIDMsCisgICAgICAgICAgICAnaW4gbmV3IHRocmVhZCcsCisgICAgICAgICAgICBrbm93X2N1cnJlbnRfdGhyZWFkPUZhbHNlKQorCiAgICAgZGVmIHRlc3Rfc2lnYWJydChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKICAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKQEAgLTQ2NSw3ICs0OTcsNyBAQAogICAgICAgICAgICAgICBGaWxlICIuKnRocmVhZGluZy5weSIsIGxpbmUgWzAtOV0rIGluIF9ib290c3RyYXBfaW5uZXIKICAgICAgICAgICAgICAgRmlsZSAiLip0aHJlYWRpbmcucHkiLCBsaW5lIFswLTldKyBpbiBfYm9vdHN0cmFwCiAKLSAgICAgICAgICAgIEN1cnJlbnQgdGhyZWFkIFhYWCBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKToKKyAgICAgICAgICAgIEN1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgogICAgICAgICAgICAgICBGaWxlICI8c3RyaW5nPiIsIGxpbmUge2xpbmVub30gaW4gZHVtcAogICAgICAgICAgICAgICBGaWxlICI8c3RyaW5nPiIsIGxpbmUgMjggaW4gPG1vZHVsZT4kCiAgICAgICAgICAgICAiIiIKQEAgLTYzNyw3ICs2NjksNyBAQAogICAgICAgICB0cmFjZSA9ICdcbicuam9pbih0cmFjZSkKICAgICAgICAgaWYgbm90IHVucmVnaXN0ZXI6CiAgICAgICAgICAgICBpZiBhbGxfdGhyZWFkczoKLSAgICAgICAgICAgICAgICByZWdleCA9ICdDdXJyZW50IHRocmVhZCBYWFggXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6XG4nCisgICAgICAgICAgICAgICAgcmVnZXggPSAnQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6XG4nCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ1N0YWNrIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOlxuJwogICAgICAgICAgICAgcmVnZXggPSBleHBlY3RlZF90cmFjZWJhY2soMTQsIDMyLCByZWdleCkKQEAgLTY5Niw2ICs3MjgsMjIgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5jaGVja19zdGRlcnJfbm9uZSgpOgogICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWduYWwuU0lHVVNSMSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKE1TX1dJTkRPV1MsICdzcGVjaWZpYyB0byBXaW5kb3dzJykKKyAgICBkZWYgdGVzdF9yYWlzZV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGZvciBleGMsIG5hbWUgaW4gKAorICAgICAgICAgICAgKCdFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTicsICdhY2Nlc3MgdmlvbGF0aW9uJyksCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8nLCAnaW50IGRpdmlkZSBieSB6ZXJvJyksCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9TVEFDS19PVkVSRkxPVycsICdzdGFjayBvdmVyZmxvdycpLAorICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5jaGVja193aW5kb3dzX2V4Y2VwdGlvbihmIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5lbmFibGUoKQorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fcmFpc2VfZXhjZXB0aW9uKGZhdWx0aGFuZGxlci5fe2V4Y30pCisgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgbmFtZSkKKworCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggNGUzOTJiNy4uNjdjM2Q4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTM5LDcgKzEzOSw3IEBACiAKICAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCi0gICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIpOgorICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiLCAiVSsiLCAiK1UiLCAiclUrIik6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sIG1vZGUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKaW5kZXggNzg0YmM5Mi4uYmRmNDI1MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKQEAgLTI0LDYgKzI0LDcgQEAKIAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBjaGVja193YXJuaW5ncwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHVubGluayBhcyBzYWZlX3VubGluaworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCiAKIApAQCAtOTIsNyArOTMsMTEgQEAKICAgICAgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiTGluZSAlcyBvZiBmaWxlIDJcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxMCldKQogICAgICAgICAgICAgICAgIHQzID0gd3JpdGVUbXAoMywgWyJMaW5lICVzIG9mIGZpbGUgM1xuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDUpXSkKICAgICAgICAgICAgICAgICB0NCA9IHdyaXRlVG1wKDQsIFsiTGluZSAlcyBvZiBmaWxlIDRcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxKV0pCi0gICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgaWYgYnM6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyLCB0MywgdDQpCiAKQEAgLTk4MSw1ICs5ODYsMTEgQEAKICAgICAgICAgICAgIGNoZWNrKCdyYicsIFsnQVxuJywgJ0JcclxuJywgJ0NccicsICdEXHUyMGFjJ10pCiAKIAorY2xhc3MgTWlzY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWxsKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmaWxlaW5wdXQpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm9ybWF0LnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKaW5kZXggOWIxMzYzMi4uOTkyNGZkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkKQEAgLTMwMCw2ICszMDAsOCBAQAogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCA3LCBiIlx4MDciKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBiIloiLCBiIloiKQogICAgICAgICB0ZXN0Y29tbW9uKGIiJWMiLCBieXRlYXJyYXkoYiJaIiksIGIiWiIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlNWMiLCA2NSwgYiIgICAgQSIpCisgICAgICAgIHRlc3Rjb21tb24oYiIlLTVjIiwgNjUsIGIiQSAgICAiKQogICAgICAgICAjICViIHdpbGwgaW5zZXJ0IGEgc2VyaWVzIG9mIGJ5dGVzLCBlaXRoZXIgZnJvbSBhIHR5cGUgdGhhdCBzdXBwb3J0cwogICAgICAgICAjIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wsIG9yIHNvbWV0aGluZyB0aGF0IGhhcyBhIF9fYnl0ZXNfXyBtZXRob2QKICAgICAgICAgY2xhc3MgRmFrZUJ5dGVzKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weSBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CmluZGV4IDE2OTk4NTIuLjczZDJkZDMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CkBAIC0yNjMsMTMgKzI2MywxMyBAQAogICAgICAgICBuYW4gPSBpbmYgLSBpbmYKICAgICAgICAgIyBidWcgMTY0Njk6IGVycm9yIHR5cGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZmxvYXQgLT4gaW50CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCBpbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgaW5mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgLWluZiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCAtaW5mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBWYWx1ZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgbmFuIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCBuYW4pCiAKICAgICBkZWYgdGVzdEZyb21EZWNpbWFsKHNlbGYpOgpAQCAtMjg0LDE2ICsyODQsMTYgQEAKIAogICAgICAgICAjIGJ1ZyAxNjQ2OTogZXJyb3IgdHlwZXMgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBkZWNpbWFsIC0+IGludAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJpbmYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1JbmZpbml0eSB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoIi1pbmYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IE5hTiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJuYW4iKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IHNOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgic25hbiIpKQogCiAgICAgZGVmIHRlc3RMaW1pdERlbm9taW5hdG9yKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmRlZGYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2ZzdHJpbmcucHkKQEAgLTAsMCArMSw3NDUgQEAKK2ltcG9ydCBhc3QKK2ltcG9ydCB0eXBlcworaW1wb3J0IGRlY2ltYWwKK2ltcG9ydCB1bml0dGVzdAorCithX2dsb2JhbCA9ICdnbG9iYWwgdmFyaWFibGUnCisKKyMgWW91IGNvdWxkIGFyZ3VlIHRoYXQgSSdtIHRvbyBzdHJpY3QgaW4gbG9va2luZyBmb3Igc3BlY2lmaWMgZXJyb3IKKyMgIHZhbHVlcyB3aXRoIGFzc2VydFJhaXNlc1JlZ2V4LCBidXQgd2l0aG91dCBpdCBpdCdzIHdheSB0b28gZWFzeSB0bworIyAgbWFrZSBhIHN5bnRheCBlcnJvciBpbiB0aGUgdGVzdCBzdHJpbmdzLiBFc3BlY2lhbGx5IHdpdGggYWxsIG9mIHRoZQorIyAgdHJpcGxlIHF1b3RlcywgcmF3IHN0cmluZ3MsIGJhY2tzbGFzaGVzLCBldGMuIEkgdGhpbmsgaXQncyBhCisjICB3b3J0aHdoaWxlIHRyYWRlb2ZmLiBXaGVuIEkgc3dpdGNoZWQgdG8gdGhpcyBtZXRob2QsIEkgZm91bmQgbWFueQorIyAgZXhhbXBsZXMgd2hlcmUgSSB3YXNuJ3QgdGVzdGluZyB3aGF0IEkgdGhvdWdodCBJIHdhcy4KKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRBbGxSYWlzZShzZWxmLCBleGNlcHRpb25fdHlwZSwgcmVnZXgsIGVycm9yX3N0cmluZ3MpOgorICAgICAgICBmb3Igc3RyIGluIGVycm9yX3N0cmluZ3M6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzdHI9c3RyKToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoZXhjZXB0aW9uX3R5cGUsIHJlZ2V4KToKKyAgICAgICAgICAgICAgICAgICAgZXZhbChzdHIpCisKKyAgICBkZWYgdGVzdF9fZm9ybWF0X19sb29rdXAoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIF9fZm9ybWF0X18gaXMgbG9va2VkIHVwIG9uIHRoZSB0eXBlLCBub3QgdGhlIGluc3RhbmNlLgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICdjbGFzcycKKworICAgICAgICB4ID0gWCgpCisKKyAgICAgICAgIyBBZGQgYSBib3VuZCBfX2Zvcm1hdF9fIG1ldGhvZCB0byB0aGUgJ3knIGluc3RhbmNlLCBidXQgbm90CisgICAgICAgICMgIHRoZSAneCcgaW5zdGFuY2UuCisgICAgICAgIHkgPSBYKCkKKyAgICAgICAgeS5fX2Zvcm1hdF9fID0gdHlwZXMuTWV0aG9kVHlwZShsYW1iZGEgc2VsZiwgc3BlYzogJ2luc3RhbmNlJywgeSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3l9JywgZm9ybWF0KHkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3l9JywgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeCksIGZvcm1hdCh5KSkKKworICAgICAgICAjIF9fZm9ybWF0X18gaXMgbm90IGNhbGxlZCB0aGlzIHdheSwgYnV0IHN0aWxsIG1ha2Ugc3VyZSBpdAorICAgICAgICAjICByZXR1cm5zIHdoYXQgd2UgZXhwZWN0IChzbyB3ZSBjYW4gbWFrZSBzdXJlIHdlJ3JlIGJ5cGFzc2luZworICAgICAgICAjICBpdCkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2Zvcm1hdF9fKCcnKSwgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fZm9ybWF0X18oJycpLCAnaW5zdGFuY2UnKQorCisgICAgICAgICMgVGhpcyBpcyBob3cgX19mb3JtYXRfXyBpcyBhY3R1YWxseSBjYWxsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh4KS5fX2Zvcm1hdF9fKHgsICcnKSwgJ2NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHkpLl9fZm9ybWF0X18oeSwgJycpLCAnY2xhc3MnKQorCisgICAgZGVmIHRlc3RfYXN0KHNlbGYpOgorICAgICAgICAjIEluc3BpcmVkIGJ5IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDk3NQorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gNAorICAgICAgICB4ID0gWCgpCisgICAgICAgIGV4cHIgPSAiIiIKK2EgPSAxMAorZid7YSAqIHgoKX0nIiIiCisgICAgICAgIHQgPSBhc3QucGFyc2UoZXhwcikKKyAgICAgICAgYyA9IGNvbXBpbGUodCwgJycsICdleGVjJykKKworICAgICAgICAjIE1ha2Ugc3VyZSB4IHdhcyBub3QgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHguY2FsbGVkKQorCisgICAgICAgICMgQWN0dWFsbHkgcnVuIHRoZSBjb2RlLgorICAgICAgICBleGVjKGMpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgeCB3YXMgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWwoc2VsZik6CisgICAgICAgICMgV2l0aCBubyBleHByZXNzaW9ucywgYW4gZi1zdHJpbmcgaXMgb2theS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCJmJ3gnIiksICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCJmJ3gnICd5JyIpLCAneHknKQorCisgICAgICAgICMgQnV0IHRoaXMgc2hvdWxkIHJhaXNlIGFuIGVycm9yLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ21hbGZvcm1lZCBub2RlIG9yIHN0cmluZycpOgorICAgICAgICAgICAgYXN0LmxpdGVyYWxfZXZhbCgiZid4ezN9JyIpCisKKyAgICAgICAgIyBBcyBzaG91bGQgdGhpcywgd2hpY2ggdXNlcyBhIGRpZmZlcmVudCBhc3Qgbm9kZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ21hbGZvcm1lZCBub2RlIG9yIHN0cmluZycpOgorICAgICAgICAgICAgYXN0LmxpdGVyYWxfZXZhbCgiZid7M30nIikKKworICAgIGRlZiB0ZXN0X2FzdF9jb21waWxlX3RpbWVfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gWycnXQorCisgICAgICAgIGV4cHIgPSAiIiJ4WzBdID0gJ2ZvbycgZid7M30nIiIiCisgICAgICAgIHQgPSBhc3QucGFyc2UoZXhwcikKKyAgICAgICAgYyA9IGNvbXBpbGUodCwgJycsICdleGVjJykKKyAgICAgICAgZXhlYyhjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sICdmb28zJykKKworICAgIGRlZiB0ZXN0X2xpdGVyYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2EnLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicgJywgJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x1MDM5NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidcTntUcnVlfScsICdcdTIyYTgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJmJ1xOe1RydWV9JywgcidcTlRydWUnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX29yZGVyKHNlbGYpOgorICAgICAgICAjIG5vdGUgdGhhdCBoZXgob3JkKCd7JykpID09IDB4N2IsIHNvIHRoaXMKKyAgICAgICAgIyAgc3RyaW5nIGJlY29tZXMgZidhezQqMTB9YicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2FcdTAwN2I0KjEwfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHg3YjQqMTB9YicsICdhNDBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2FceDdiNCoxMFxOe1JJR0hUIENVUkxZIEJSQUNLRVR9YicsICdhNDBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSIhXE57TEFUSU4gU01BTEwgTEVUVEVSIFJ9fScsICInYSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwXHgzYTAyWH0nLCAnMEEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOjAyXE57TEFUSU4gQ0FQSVRBTCBMRVRURVIgWH19JywgJzBBJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZidhe1x1MDA3YjQqMTB9YiciIiIsICAgICMgbWlzLW1hdGNoZWQgYnJhY2tldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGxpbmUgY29udGludWF0aW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiIiJmJ3siYSJcIXJ9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYne2FcIXJ9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3VudGVybWluYXRlZF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiIiJmJ3sieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3sieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7KCJ4JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieH0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbWlzbWF0Y2hlZF9wYXJlbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogbWlzbWF0Y2hlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3soKH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9icmFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eycsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7eycsICdheycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7e2InLCAne2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYXt7YicsICdhe2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX0nLCAnYX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1iJywgJ31iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F9fWInLCAnYX1iJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3t7MTB9JywgJ3sxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXsxMH0nLCAnfTEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319e3t7MTB9JywgJ317MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX1he3t7MTB9JywgJ31hezEwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfXt7JywgJzEweycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX0nLCAnMTB9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fXt7JywgJzEwfXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19YXt7JyAnfScsICcxMH1he30nKQorCisgICAgICAgICMgSW5zaWRlIG9mIHN0cmluZ3MsIGRvbid0IGludGVycHJldCBkb3VibGVkIGJyYWNrZXRzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ7e319In0nLCAne3t9fScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShUeXBlRXJyb3IsICd1bmhhc2hhYmxlIHR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7IHt7fX0gfSciLCAjIGRpY3QgaW4gYSBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfdGltZV9jb25jYXQoc2VsZik6CisgICAgICAgIHggPSAnZGVmJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYnIyMge3h9Z2hpJywgJ2FiYyMjIGRlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaGknLCAnYWJjZGVmZ2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJ3t4fScgJ2doJyBmJ2l7eDo0fScsICdhYmNkZWZnaGlkZWYgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eCcgZid7eH0nLCAne3hkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7eH0nIGYne3h9JywgJ3t4fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eH19JyBmJ3t4fScsICd7e3h9fWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eCcgZid7eH0nLCAne3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneH19JyBmJ3t4fScsICd4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAneH19JywgJ2RlZnh9fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScgJycsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYne3h9JywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nICcyJywgJ2RlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScgJzInLCAnMWRlZjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxJyBmJ3t4fScsICcxZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgZicte3h9JywgJ2RlZi1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycgJycgZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnICcnIGYnJyAnJywgJycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMnIGYnfSciLCAgIyBjYW4ndCBjb25jYXQgdG8gZ2V0IGEgdmFsaWQgZi1zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICAjIFRoZXNlIGFyZW4ndCBjb21tZW50cywgc2luY2UgdGhleSdyZSBpbiBzdHJpbmdzLgorICAgICAgICBkID0geycjJzogJ2hhc2gnfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIjIn0nLCAnIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiIyJdfScsICdoYXNoJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezEjfSciLCAgICMgZXJyb3IgYmVjYXVzZSB0aGUgZXhwcmVzc2lvbiBiZWNvbWVzICIoMSMpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MygjKX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21hbnlfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgc3RyaW5nIHdpdGggbWFueSBleHByZXNzaW9ucyBpbiBpdC4gTm90ZSB0aGF0CisgICAgICAgICMgIGJlY2F1c2Ugd2UgaGF2ZSBhIHNwYWNlIGluIGhlcmUgYXMgYSBsaXRlcmFsLCB3ZSdyZSBhY3R1YWxseQorICAgICAgICAjICBnb2luZyB0byB1c2UgdHdpY2UgYXMgbWFueSBhc3Qgbm9kZXM6IG9uZSBmb3IgZWFjaCBsaXRlcmFsCisgICAgICAgICMgIHBsdXMgb25lIGZvciBlYWNoIGV4cHJlc3Npb24uCisgICAgICAgIGRlZiBidWlsZF9mc3RyKG4sIGV4dHJhPScnKToKKyAgICAgICAgICAgIHJldHVybiAiZiciICsgKCd7eH0gJyAqIG4pICsgZXh0cmEgKyAiJyIKKworICAgICAgICB4ID0gJ1gnCisgICAgICAgIHdpZHRoID0gMQorCisgICAgICAgICMgVGVzdCBhcm91bmQgMjU2LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTAsIDI2MCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cihpKSksICh4KycgJykqaSkKKworICAgICAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyAyIGxhcmdzIGZzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYnVpbGRfZnN0cigyNTUpKjI1NiksICh4KycgJykqKDI1NSoyNTYpKQorCisgICAgICAgIHMgPSBidWlsZF9mc3RyKDI1MywgJ3t4Ont3aWR0aH19ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgKHgrJyAnKSoyNTQpCisKKyAgICAgICAgIyBUZXN0IGxvdHMgb2YgZXhwcmVzc2lvbnMgYW5kIGNvbnN0YW50cywgY29uY2F0ZW5hdGVkLgorICAgICAgICBzID0gImYnezF9JyAneCcgJ3knIiAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHMpLCAnMXh5JyAqIDEwMjQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfc3BlY2lmaWVyX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICB3aWR0aCA9IDEwCisgICAgICAgIHByZWNpc2lvbiA9IDQKKyAgICAgICAgdmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwoJzEyLjM0NTY3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aH0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGghcn0ue3ByZWNpc2lvbn19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGg6MH0ue3ByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3Jlc3VsdDoge3ZhbHVlOnsxfXswOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7IDF9eyAwOjB9LnsgcHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MX0weH0nLCAnICAgICAgIDB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6eyIjIn0xezB9eyJ4In19JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDoteyIjIn0xezB9eH0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7LTEwOnsiLSJ9I3sxfTB7IngifX0nLCAnICAgICAgLTB4YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTA6I3szICE9IHs0OjV9IGFuZCB3aWR0aH14fScsICcgICAgICAgMHhhJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiIiJmJ3sicyIhcnsiOjEwIn19JyIiIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbG9va3MgbGlrZSBhIG5lc3RlZCBmb3JtYXQgc3BlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiaW52YWxpZCBzeW50YXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIEludmFsaWQgc3l0YXggaW5zaWRlIGEgbmVzdGVkIHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s0OnsvNX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHByZXNzaW9ucyBuZXN0ZWQgdG9vIGRlZXBseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyMgQ2FuJ3QgbmVzdCBmb3JtYXQgc3BlY2lmaWVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYncmVzdWx0OiB7dmFsdWU6e3dpZHRoOnswfX0ue3ByZWNpc2lvbjoxfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIE5vIGV4cGFuc2lvbiBpbnNpZGUgY29udmVyc2lvbiBvciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgdGhlIDogb3IgISBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiImYneyJzIiF7InIifX0nIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3Rfc2lkZV9lZmZlY3Rfb3JkZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5pID0gMAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYuaSkKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0ge3h9JywgJzEgMicpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogZW1wdHkgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgfSciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJyB7fSAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyFyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICFyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MTA6eyB9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZicgeyB9ICciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne1xuIFxufSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2F0Y2ggdGhlIGVtcHR5IGV4cHJlc3Npb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBpbnZhbGlkIGNvbnZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHJ9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheDp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sheDphfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cjp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyOmF9JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3s6fSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgZmluZCB0aGUgZW1wdHkgZXhwcmVzc2lvbiBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIG1pc3NpbmcgY2xvc2luZyBicmFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyFzOiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7OiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7OngnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3BhcmVuc19pbl9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLH0nLCAnKDMsKScpCisKKyAgICAgICAgIyBBZGQgdGhlc2UgYmVjYXVzZSB3aGVuIGFuIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBwYXJlbnMKKyAgICAgICAgIyAgYXJlIGFkZGVkIGFyb3VuZCBpdC4gQnV0IHdlIHNob3VsZG4ndCBnbyBmcm9tIGFuIGludmFsaWQKKyAgICAgICAgIyAgZXhwcmVzc2lvbiB0byBhIHZhbGlkIG9uZS4gVGhlIGFkZGVkIHBhcmVucyBhcmUganVzdAorICAgICAgICAjICBzdXBwb3NlZCB0byBhbGxvdyB3aGl0ZXNwYWNlIChpbmNsdWRpbmcgbmV3bGluZXMpLgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7LH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyx9JyIsICAjIHRoaXMgaXMgKCwpLCB3aGljaCBpcyBhbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szKSsoNH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnRU9MIHdoaWxlIHNjYW5uaW5nIHN0cmluZyBsaXRlcmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MH0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MFxufScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3swXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMFxufScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tccjBccn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XG4wXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMH0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MytcbjR9JywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMrXFxcbjR9JywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJmJycnezMrCis0fScnJywgJzcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyd7MytcCis0fScnJywgJzcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogZW1wdHkgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7XG59JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CisgICAgICAgIHggPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyfScsICInODg4ODgnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpIXI6MTB9JywgIic4ODg4OCcgICAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iik6MTB9JywgIjg4ODg4ICAgICAiKQorCisgICAgICAgICMgbGFtYmRhIGRvZXNuJ3Qgd29yayB3aXRob3V0IHBhcmVucywgYmVjYXVzZSB0aGUgY29sb24KKyAgICAgICAgIyAgbWFrZXMgdGhlIHBhcnNlciB0aGluayBpdCdzIGEgZm9ybWF0X3NwZWMKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ3VuZXhwZWN0ZWQgRU9GIHdoaWxlIHBhcnNpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7bGFtYmRhIHg6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3lpZWxkKHNlbGYpOgorICAgICAgICAjIE5vdCB0ZXJyaWJseSB1c2VmdWwsIGJ1dCBtYWtlIHN1cmUgdGhlIHlpZWxkIHR1cm5zCisgICAgICAgICMgIGEgZnVuY3Rpb24gaW50byBhIGdlbmVyYXRvcgorICAgICAgICBkZWYgZm4oeSk6CisgICAgICAgICAgICBmJ3k6e3lpZWxkIHkqMn0nCisKKyAgICAgICAgZyA9IGZuKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgOCkKKworICAgIGRlZiB0ZXN0X3lpZWxkX3NlbmQoc2VsZik6CisgICAgICAgIGRlZiBmbih4KToKKyAgICAgICAgICAgIHlpZWxkIGYneDp7eWllbGQgKGxhbWJkYSBpOiB4ICogaSl9JworCisgICAgICAgIGcgPSBmbigxMCkKKyAgICAgICAgdGhlX2xhbWJkYSA9IG5leHQoZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVfbGFtYmRhKDQpLCA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLnNlbmQoJ3N0cmluZycpLCAneDpzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfZXhwcmVzc2lvbnNfd2l0aF90cmlwbGVfcXVvdGVkX3N0cmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycneCcnJ30iLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycnZXJpYydzJycnfSIsICJlcmljJ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiImVyaWNcJ3MiIiJ9JywgImVyaWMncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7JycnZXJpY1wicycnJ30iLCAnZXJpYyJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljInMiIiJ9JywgJ2VyaWMicycpCisKKyAgICAgICAgIyBUZXN0IGNvbmNhdGVuYXRpb24gd2l0aGluIGFuIGV4cHJlc3Npb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieCIgIiIiZXJpYyJzIiIiICJ5In0nLCAneGVyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ4IiAiIiJlcmljInMiIiJ9JywgJ3hlcmljInMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiImVyaWMicyIiIiAieSJ9JywgJ2VyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiIngiIiIgIiIiZXJpYyJzIiIiICJ5In0nLCAneGVyaWMic3knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyIiIngiIiIgIiIiZXJpYyJzIiIiICIiInkiIiJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tyIiIieCIiIiAiIiJlcmljInMiIiIgIiIieSIiIn0nLCAneGVyaWMic3knKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfdmFycyhzZWxmKToKKyAgICAgICAgeCA9IDk4CisgICAgICAgIHkgPSAnYWJjJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9e3l9JywgJzk4YWJjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fXt5fScsICdYOThhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9WHt5fScsICc5OFhhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9e3l9WCcsICc5OGFiY1gnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9WXt5fScsICdYOThZYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH17eX1ZJywgJ1g5OGFiY1knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9WHt5fVknLCAnOThYYWJjWScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH1Ze3l9WicsICdYOThZYWJjWicpCisKKyAgICBkZWYgdGVzdF9jbG9zdXJlKHNlbGYpOgorICAgICAgICBkZWYgb3V0ZXIoeCk6CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZid4Ont4fScKKyAgICAgICAgICAgIHJldHVybiBpbm5lcgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXIoJzk4NycpKCksICd4Ojk4NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZXIoNykoKSwgJ3g6NycpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHkgPSAyCisgICAgICAgIGRlZiBmKHgsIHdpZHRoKToKKyAgICAgICAgICAgIHJldHVybiBmJ3g9e3gqeTp7d2lkdGh9fScKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoJ2ZvbycsIDEwKSwgJ3g9Zm9vZm9vICAgICcpCisgICAgICAgIHggPSAnYmFyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMTAsIDEwKSwgJ3g9ICAgICAgICAyMCcpCisKKyAgICBkZWYgdGVzdF9sb2NhbHMoc2VsZik6CisgICAgICAgIHZhbHVlID0gMTIzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid2Ont2YWx1ZX0nLCAndjoxMjMnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ192YXJpYWJsZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpOgorICAgICAgICAgICAgZid2Ont2YWx1ZX0nCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2Zvcm1hdF9zcGVjKHNlbGYpOgorICAgICAgICBjbGFzcyBPOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNwZWM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKicKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7TygpOnh9JywgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKX0nLCAnKicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7TygpOn0nLCAnKicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szOn0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyFzOn0nLCAnMycpCisKKyAgICBkZWYgdGVzdF9nbG9iYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0nLCAnZzpnbG9iYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLCAiZzonZ2xvYmFsIHZhcmlhYmxlJyIpCisKKyAgICAgICAgYV9sb2NhbCA9ICdsb2NhbCB2YXJpYWJsZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2c6Z2xvYmFsIHZhcmlhYmxlIGw6bG9jYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOidnbG9iYWwgdmFyaWFibGUnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzpnbG9iYWwgdmFyaWFibGUgbDonbG9jYWwgdmFyaWFibGUnIikKKworICAgICAgICBzZWxmLmFzc2VydEluKCJtb2R1bGUgJ3VuaXR0ZXN0JyBmcm9tIiwgZid7dW5pdHRlc3R9JykKKworICAgIGRlZiB0ZXN0X3NoYWRvd2VkX2dsb2JhbChzZWxmKToKKyAgICAgICAgYV9nbG9iYWwgPSAncmVhbGx5IGEgbG9jYWwnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0nLCAnZzpyZWFsbHkgYSBsb2NhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbCFyfScsICJnOidyZWFsbHkgYSBsb2NhbCciKQorCisgICAgICAgIGFfbG9jYWwgPSAnbG9jYWwgdmFyaWFibGUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnOnJlYWxseSBhIGxvY2FsIGw6bG9jYWwgdmFyaWFibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOidyZWFsbHkgYSBsb2NhbCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWwhcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnOnJlYWxseSBhIGxvY2FsIGw6J2xvY2FsIHZhcmlhYmxlJyIpCisKKyAgICBkZWYgdGVzdF9jYWxsKHNlbGYpOgorICAgICAgICBkZWYgZm9vKHgpOgorICAgICAgICAgICAgcmV0dXJuICd4PScgKyBzdHIoeCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2ZvbygxMCl9JywgJ3g9MTAnKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICB5ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2YiezB9IiozfScsICcwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2Yie3l9IiozfScsICc1NTUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2Yie1wneFwnfSIqM30nLCAneHh4JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie3IneCcgZid7XCJzXCJ9J30iLCAneHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie3IneCdyZid7XCJzXCJ9J30iLCAneHMnKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9zdHJpbmdfcHJlZml4ZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImZ1JyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZVJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1RicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVmcicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVyZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1cicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZydScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1ZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZVUicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1cicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2xlYWRpbmdfdHJhaWxpbmdfc3BhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyAzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sgIDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1x0M30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XHRcdDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMgfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szICB9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezNcdH0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7M1x0XHR9JywgJzMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidleHByPXsge3g6IHkgZm9yIHgsIHkgaW4gWygxLCAyKSwgXX19JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcj17MTogMn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZXhwcj17IHt4OiB5IGZvciB4LCB5IGluIFsoMSwgMiksIF19IH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdleHByPXsxOiAyfScpCisKKyAgICBkZWYgdGVzdF9jaGFyYWN0ZXJfbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3s0fVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfXszfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJzRcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t7fX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICd7fVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfTMnKQorCisgICAgZGVmIHRlc3Rfbm90X2VxdWFsKHNlbGYpOgorICAgICAgICAjIFRoZXJlJ3MgYSBzcGVjaWFsIHRlc3QgZm9yIHRoaXMgYmVjYXVzZSB0aGVyZSdzIGEgc3BlY2lhbAorICAgICAgICAjICBjYXNlIGluIHRoZSBmLXN0cmluZyBwYXJzZXIgdG8gbG9vayBmb3IgIT0gYXMgbm90IGVuZGluZyBhbgorICAgICAgICAjICBleHByZXNzaW9uLiBOb3JtYWxseSBpdCB3b3VsZCwgd2hpbGUgbG9va2luZyBmb3IgIXMgb3IgIXIuCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00fScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00On0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzfScsICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIT00IXM6LjN9JywgJ1RydScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OjEwLjEwfScsICcgICAgICAzLjE0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXM6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhcjoxMC4xMH0nLCAnMy4xNCAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFhOjEwLjEwfScsICczLjE0ICAgICAgJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIn0nLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIXJ9JywgIidhJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIWF9JywgIidhJyIpCisKKyAgICAgICAgIyBOb3QgYSBjb252ZXJzaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIXIifScsICJhIXIiKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbiwgYnV0IHNob3cgdGhhdCAhIGlzIGFsbG93ZWQgaW4gYSBmb3JtYXQgc3BlYy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0OiE8MTAuMTB9JywgJzMuMTQhISEhISEnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IlxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSJ9JywgJ1x1MDM5NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IlxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfSIhcn0nLCAiJ1x1MDM5NCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0iIWF9JywgIidcXHUwMzk0JyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnezMhZ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhQX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhIX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhOn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEgc30nIiwgICMgbm8gc3BhY2UgYmVmb3JlIGNvbnZlcnNpb24gY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7eCFcXHgwMDouPDEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3t4IXN7eX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzczp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXNzOnN9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZicnID0gMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3swfScgPSB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3h9JyA9IHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnaW52YWxpZCBzeW50YXgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZGVsIGYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWwgJycgZicnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7e30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t9fX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4fXgnIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhbid0IGhhdmUgeyBvciB9IGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7MzpcXH0+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOn19PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szOnt7PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyEnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhczozJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3h7eCciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MzpzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e319eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3szOlxcez4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIEJ1dCB0aGVzZSBhcmUganVzdCBub3JtYWwgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieyJ9JywgJ3snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJ9In0nLCAnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp7In0ifT4xMH0nLCAnfX19fX19fX19MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mjp7InsifT4xMH0nLCAne3t7e3t7e3t7MicpCisKKyAgICBkZWYgdGVzdF9pZl9jb25kaXRpb25hbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIHNwZWNpYWwgbG9naWMgaW4gY29tcGlsZS5jIHRvIHRlc3QgaWYgdGhlCisgICAgICAgICMgIGNvbmRpdGlvbmFsIGZvciBhbiBpZiAoYW5kIHdoaWxlKSBhcmUgY29uc3RhbnRzLiBFeGVyY2lzZQorICAgICAgICAjICB0aGF0IGNvZGUuCisKKyAgICAgICAgZGVmIHRlc3RfZnN0cmluZyh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9lbXB0eSh4LCBleHBlY3RlZCk6CisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICAgICAgaWYgJycgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIGRlZiB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcgJyBmJ3t4fSc6CisgICAgICAgICAgICAgICAgZmxhZyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmxhZyA9IDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgZXhwZWN0ZWQpCisKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcnLCAyKQorICAgICAgICB0ZXN0X2ZzdHJpbmcoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X2VtcHR5KCcnLCAyKQorICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnICcsIDEpCisKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcnLCAxKQorICAgICAgICB0ZXN0X2NvbmNhdF9ub25fZW1wdHkoJyAnLCAxKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZm9ybWF0X3NwZWNpZmllcihzZWxmKToKKyAgICAgICAgeCA9ICd0ZXN0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3g6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXM6fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4IXI6fScsICIndGVzdCciKQorCisgICAgZGVmIHRlc3Rfc3RyX2Zvcm1hdF9kaWZmZXJlbmNlcyhzZWxmKToKKyAgICAgICAgZCA9IHsnYSc6ICdzdHJpbmcnLAorICAgICAgICAgICAgIDA6ICdpbnRlZ2VyJywKKyAgICAgICAgICAgICB9CisgICAgICAgIGEgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFswXX0nLCAnaW50ZWdlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ZFsiYSJdfScsICdzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbYV19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7ZFthXX0nLmZvcm1hdChkPWQpLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbMF19Jy5mb3JtYXQoZD1kKSwgJ2ludGVnZXInKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3thWzQpfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYne2EoNF19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgMjYyODcKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShUeXBlRXJyb3IsICdub24tZW1wdHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYneyhsYW1iZGE6IDApOnh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7KDAsKTp4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFZhbHVlRXJyb3IsICdVbmtub3duIGZvcm1hdCBjb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3sxMDAwOmp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiZid7MTAwMDpqfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sb29wKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidpOntpfScsICdpOicgKyBzdHIoaSkpCisKKyAgICBkZWYgdGVzdF9kaWN0KHNlbGYpOgorICAgICAgICBkID0geyciJzogJ2RxdW90ZScsCisgICAgICAgICAgICAgIiciOiAnc3F1b3RlJywKKyAgICAgICAgICAgICAnZm9vJzogJ2JhcicsCisgICAgICAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbIlwnIl19JywgJ3NxdW90ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7ZFsnXCInXX0iLCAnZHF1b3RlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyd7ZFsiJyJdfScnJywgJ3NxdW90ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiIiIntkWyciJ119IiIiLCAnZHF1b3RlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbImZvbyJdfScsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbJ2ZvbyddfSIsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbXCdmb29cJ119JywgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiJ7ZFtcImZvb1wiXX0iLCAnYmFyJykKKworICAgIGRlZiB0ZXN0X2VzY2FwZWRfcXVvdGVzKHNlbGYpOgorICAgICAgICBkID0geyciJzogJ2EnLAorICAgICAgICAgICAgICInIjogJ2InfQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnIie2RbJ1wiJ119IiwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyJ3tkWyJcJyJdfScsICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmciJ7J1wiJ30iLCAnIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnIneyJcJyJ9JywgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcXCIzIn0nLCAnIjMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3InJydmJ3siIiJcXH0nICcnJywgICMgQmFja3NsYXNoIGF0IGVuZCBvZiBleHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBsaW5lIGNvbnRpbnVhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IicmYnezNcfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CmluZGV4IGFlZjY2ZGEuLjlkOGRlMjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CkBAIC0xMDQ5LDEwICsxMDQ5LDE5IEBACiAgICAgICAgIGZ0cC5jbG9zZSgpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnTVNHX09PQicsICdGVFBfUE9SVCcsICdNQVhMSU5FJywgJ0NSTEYnLCAnQl9DUkxGJywKKyAgICAgICAgICAgICAgICAgICAgICdFcnJvcicsICdwYXJzZTE1MCcsICdwYXJzZTIyNycsICdwYXJzZTIyOScsICdwYXJzZTI1NycsCisgICAgICAgICAgICAgICAgICAgICAncHJpbnRfbGluZScsICdmdHBjcCcsICd0ZXN0J30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZnRwbGliLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0cyA9IFtUZXN0RlRQQ2xhc3MsIFRlc3RUaW1lb3V0cywKICAgICAgICAgICAgICBUZXN0SVB2NkVudmlyb25tZW50LAotICAgICAgICAgICAgIFRlc3RUTFNfRlRQQ2xhc3NNaXhpbiwgVGVzdFRMU19GVFBDbGFzc10KKyAgICAgICAgICAgICBUZXN0VExTX0ZUUENsYXNzTWl4aW4sIFRlc3RUTFNfRlRQQ2xhc3MsCisgICAgICAgICAgICAgTWlzY1Rlc3RDYXNlXQogCiAgICAgdGhyZWFkX2luZm8gPSBzdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQppbmRleCAzMTkzMGZjLi5hMjJkMmU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1bmN0b29scy5weQpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKICAgICAgICAgICAgIG0gPSBtcm8oRCwgYmFzZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIFtELCBjLk11dGFibGVTZXF1ZW5jZSwgYy5TZXF1ZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZGVmYXVsdGRpY3QsIGRpY3QsIGMuTXV0YWJsZU1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLk1hcHBpbmcsIGMuU2l6ZWQsIGMuSXRlcmFibGUsIGMuQ29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5NYXBwaW5nLCBjLlNpemVkLCBjLlJldmVyc2libGUsIGMuSXRlcmFibGUsIGMuQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0XSkKIAogICAgICAgICAjIENvbnRhaW5lciBhbmQgQ2FsbGFibGUgYXJlIHJlZ2lzdGVyZWQgb24gZGlmZmVyZW50IGJhc2UgY2xhc3NlcyBhbmQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkgYi9MaWIvdGVzdC90ZXN0X2djLnB5CmluZGV4IDFmMDg2N2QuLjg3MmNhNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nYy5weQpAQCAtNjgyLDcgKzY4Miw2IEBACiAgICAgICAgICMgQ3JlYXRlIGEgcmVmZXJlbmNlIGN5Y2xlIHRocm91Z2ggdGhlIF9fbWFpbl9fIG1vZHVsZSBhbmQgY2hlY2sKICAgICAgICAgIyBpdCBnZXRzIGNvbGxlY3RlZCBhdCBpbnRlcnByZXRlciBzaHV0ZG93bi4KICAgICAgICAgY29kZSA9ICIiImlmIDE6Ci0gICAgICAgICAgICBpbXBvcnQgd2Vha3JlZgogICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ19fZGVsX18gY2FsbGVkJykKQEAgLTY5Niw3ICs2OTUsNiBAQAogICAgICAgICAjIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGEgbm9uLV9fbWFpbl9fIG1vZHVsZS4KICAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CiAgICAgICAgICAgICBtb2R1bGUgPSAiIiJpZiAxOgotICAgICAgICAgICAgICAgIGltcG9ydCB3ZWFrcmVmCiAgICAgICAgICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnX19kZWxfXyBjYWxsZWQnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZGIucHkgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQppbmRleCA3OGZjNTVjLi5jY2VmNDIyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dkYi5weQpAQCAtMTc2LDYgKzE3Niw3IEBACiAgICAgICAgIGFyZ3MgPSBbJy0tZXZhbC1jb21tYW5kPSVzJyAlIGNtZCBmb3IgY21kIGluIGNvbW1hbmRzXQogICAgICAgICBhcmdzICs9IFsiLS1hcmdzIiwKICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGVdCisgICAgICAgIGFyZ3MuZXh0ZW5kKHN1YnByb2Nlc3MuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpKQogCiAgICAgICAgIGlmIG5vdCBpbXBvcnRfc2l0ZToKICAgICAgICAgICAgICMgLVMgc3VwcHJlc3NlcyB0aGUgZGVmYXVsdCAnaW1wb3J0IHNpdGUnCkBAIC0xOTgsMjcgKzE5OSwxNyBAQAogICAgICAgICAjIElnbm9yZSBzb21lIGJlbmlnbiBtZXNzYWdlcyBvbiBzdGRlcnIuCiAgICAgICAgIGlnbm9yZV9wYXR0ZXJucyA9ICgKICAgICAgICAgICAgICdGdW5jdGlvbiAiJXMiIG5vdCBkZWZpbmVkLicgJSBicmVha3BvaW50LAotICAgICAgICAgICAgIndhcm5pbmc6IG5vIGxvYWRhYmxlIHNlY3Rpb25zIGZvdW5kIGluIGFkZGVkIHN5bWJvbC1maWxlIgotICAgICAgICAgICAgIiBzeXN0ZW0tc3VwcGxpZWQgRFNPIiwKLSAgICAgICAgICAgICJ3YXJuaW5nOiBVbmFibGUgdG8gZmluZCBsaWJ0aHJlYWRfZGIgbWF0Y2hpbmciCi0gICAgICAgICAgICAiIGluZmVyaW9yJ3MgdGhyZWFkIGxpYnJhcnksIHRocmVhZCBkZWJ1Z2dpbmcgd2lsbCIKLSAgICAgICAgICAgICIgbm90IGJlIGF2YWlsYWJsZS4iLAotICAgICAgICAgICAgIndhcm5pbmc6IENhbm5vdCBpbml0aWFsaXplIHRocmVhZCBkZWJ1Z2dpbmciCi0gICAgICAgICAgICAiIGxpYnJhcnk6IERlYnVnZ2VyIHNlcnZpY2UgZmFpbGVkIiwKLSAgICAgICAgICAgICd3YXJuaW5nOiBDb3VsZCBub3QgbG9hZCBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGZvciAnCi0gICAgICAgICAgICAnbGludXgtdmRzby5zbycsCi0gICAgICAgICAgICAnd2FybmluZzogQ291bGQgbm90IGxvYWQgc2hhcmVkIGxpYnJhcnkgc3ltYm9scyBmb3IgJwotICAgICAgICAgICAgJ2xpbnV4LWdhdGUuc28nLAotICAgICAgICAgICAgJ3dhcm5pbmc6IENvdWxkIG5vdCBsb2FkIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgZm9yICcKLSAgICAgICAgICAgICdsaW51eC12ZHNvNjQuc28nLAogICAgICAgICAgICAgJ0RvIHlvdSBuZWVkICJzZXQgc29saWItc2VhcmNoLXBhdGgiIG9yICcKICAgICAgICAgICAgICcic2V0IHN5c3Jvb3QiPycsCi0gICAgICAgICAgICAnd2FybmluZzogU291cmNlIGZpbGUgaXMgbW9yZSByZWNlbnQgdGhhbiBleGVjdXRhYmxlLicsCi0gICAgICAgICAgICAjIElzc3VlICMxOTc1MzogbWlzc2luZyBzeW1ib2xzIG9uIFN5c3RlbSBaCi0gICAgICAgICAgICAnTWlzc2luZyBzZXBhcmF0ZSBkZWJ1Z2luZm8gZm9yICcsCi0gICAgICAgICAgICAnVHJ5OiB6eXBwZXIgaW5zdGFsbCAtQyAnLAorICAgICAgICAgICAgIyBCRkQ6IC91c3IvbGliL2RlYnVnLyguLi4pOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkZWNvbXByZXNzCisgICAgICAgICAgICAjIHN0YXR1cyBmb3Igc2VjdGlvbiAuZGVidWdfYXJhbmdlcworICAgICAgICAgICAgJ0JGRDogJywKKyAgICAgICAgICAgICMgaWdub3JlIGFsbCB3YXJuaW5ncworICAgICAgICAgICAgJ3dhcm5pbmc6ICcsCiAgICAgICAgICAgICApCiAgICAgICAgIGZvciBsaW5lIGluIGVycmxpbmVzOgorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoaWdub3JlX3BhdHRlcm5zKToKICAgICAgICAgICAgICAgICB1bmV4cGVjdGVkX2VycmxpbmVzLmFwcGVuZChsaW5lKQogCkBAIC0zMDEsNyArMjkyLDkgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGRpY3Rpb25hcmllcycKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHt9KQogICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJ30sICJ7J2Zvbyc6ICdiYXInfSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInLCAnZG91Z2xhcyc6IDQyfSwgInsnZG91Z2xhcyc6IDQyLCAnZm9vJzogJ2Jhcid9IikKKyAgICAgICAgIyBQWVRIT05IQVNIU0VFRCBpcyBuZWVkIHRvIGdldCB0aGUgZXhhY3QgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInLCAnZG91Z2xhcyc6IDQyfSwgInsnZG91Z2xhcyc6IDQyLCAnZm9vJzogJ2Jhcid9IikKIAogICAgIGRlZiB0ZXN0X2xpc3RzKHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgbGlzdHMnCkBAIC0zNjQsOSArMzU3LDEyIEBACiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBzZXRzJwogICAgICAgICBpZiAoZ2RiX21ham9yX3ZlcnNpb24sIGdkYl9taW5vcl92ZXJzaW9uKSA8ICg3LCAzKToKICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInByZXR0eS1wcmludGluZyBvZiBzZXRzIG5lZWRzIGdkYiA3LjMgb3IgbGF0ZXIiKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KCksICdzZXQoKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJywgJ2InXSksICJ7J2EnLCAnYid9IikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbNCwgNSwgNl0pLCAiezQsIDUsIDZ9IikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldCgpLCAic2V0KCkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYSddKSwgInsnYSd9IikKKyAgICAgICAgIyBQWVRIT05IQVNIU0VFRCBpcyBuZWVkIHRvIGdldCB0aGUgZXhhY3QgZnJvemVuc2V0IGl0ZW0gb3JkZXIKKyAgICAgICAgaWYgbm90IHN5cy5mbGFncy5pZ25vcmVfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYScsICdiJ10pLCAieydhJywgJ2InfSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFs0LCA1LCA2XSksICJ7NCwgNSwgNn0iKQogCiAgICAgICAgICMgRW5zdXJlIHRoYXQgd2UgaGFuZGxlIHNldHMgY29udGFpbmluZyB0aGUgImR1bW15IiBrZXkgdmFsdWUsCiAgICAgICAgICMgd2hpY2ggaGFwcGVucyBvbiBkZWxldGlvbjoKQEAgLTM3OSw5ICszNzUsMTIgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGZyb3plbnNldHMnCiAgICAgICAgIGlmIChnZGJfbWFqb3JfdmVyc2lvbiwgZ2RiX21pbm9yX3ZlcnNpb24pIDwgKDcsIDMpOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicHJldHR5LXByaW50aW5nIG9mIGZyb3plbnNldHMgbmVlZHMgZ2RiIDcuMyBvciBsYXRlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoKSwgJ2Zyb3plbnNldCgpJykKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbJ2EnLCAnYiddKSwgImZyb3plbnNldCh7J2EnLCAnYid9KSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWzQsIDUsIDZdKSwgImZyb3plbnNldCh7NCwgNSwgNn0pIikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldCgpLCAiZnJvemVuc2V0KCkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYSddKSwgImZyb3plbnNldCh7J2EnfSkiKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBmcm96ZW5zZXQgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWydhJywgJ2InXSksICJmcm96ZW5zZXQoeydhJywgJ2InfSkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbNCwgNSwgNl0pLCAiZnJvemVuc2V0KHs0LCA1LCA2fSkiKQogCiAgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAgIyBUZXN0IGEgUnVudGltZUVycm9yCkBAIC01MTAsNiArNTA5LDEwIEBACiAKICAgICBkZWYgdGVzdF9idWlsdGluc19oZWxwKHNlbGYpOgogICAgICAgICAnRW5zdXJlIHRoYXQgdGhlIG5ldy1zdHlsZSBjbGFzcyBfSGVscGVyIGluIHNpdGUucHkgY2FuIGJlIGhhbmRsZWQnCisKKyAgICAgICAgaWYgc3lzLmZsYWdzLm5vX3NpdGU6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJuZWVkIHNpdGUgbW9kdWxlLCBidXQgLVMgb3B0aW9uIHdhcyB1c2VkIikKKwogICAgICAgICAjICh0aGlzIHdhcyB0aGUgaXNzdWUgY2F1c2luZyB0cmFjZWJhY2tzIGluCiAgICAgICAgICMgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4MDMyI21zZzEwMDUzNyApCiAgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ2lkKF9fYnVpbHRpbnNfXy5oZWxwKScsIGltcG9ydF9zaXRlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKaW5kZXggYjkyZDVjZS4uMDM4OWI0OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQpAQCAtMjQ1LDExICsyNDUsMTEgQEAKICAgICAgICAgICAgIHlpZWxkCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uKSwgXAotICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgorICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CiAKICAgICAgICAgICAgIG5leHQoZ2VuKCkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yIC4qIHJhaXNlZCBTdG9wSXRlcmF0aW9uIiksIFwKICAgICAgICAgICAgICB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogCkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICAgICAgZyA9IGYoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoZyksIDEpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uKToKICAgICAgICAgICAgICAgICBuZXh0KGcpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CmluZGV4IDg2ZmMyZGUuLjljMjhhNjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpAQCAtMTAsMTEgKzEwLDkgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKLWRlZiBzYWZlX3JtZGlyKGRpcm5hbWUpOgotICAgIHRyeToKLSAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcworZGVmIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBkYXRhPWInZm9vJyk6CisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAneGInLCAwKSBhcyBmcDoKKyAgICAgICAgZnAud3JpdGUoZGF0YSkKIAogCiBjbGFzcyBHZW5lcmljVGVzdDoKQEAgLTk3LDUyICs5NSw0NyBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHMxW246bisxXSwgczJbbjpuKzFdKQogCiAgICAgZGVmIHRlc3RfZ2V0c2l6ZShzZWxmKToKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aG1vZHVsZS5nZXRzaXplKHN1cHBvcnQuVEVTVEZOKSwgMykKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCiAKLSAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAiYWIiKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidIZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUoZmlsZW5hbWUpLCA1KQorICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGInSGVsbG8gV29ybGQhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZShmaWxlbmFtZSksIDEyKQorCisgICAgZGVmIHRlc3RfZmlsZXRpbWUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidmb28nKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgImFiIiwgMCkgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYiJiYXIiKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikKLSAgICAgICAgICAgIGQgPSBmLnJlYWQoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGIiZm9vYmFyIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoCi0gICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldGN0aW1lKHN1cHBvcnQuVEVTVEZOKSwKLSAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0bXRpbWUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICApCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYiJmb29iYXIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldGN0aW1lKGZpbGVuYW1lKSwKKyAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRtdGltZShmaWxlbmFtZSkKKyAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfZXhpc3RzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInhiIikgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgaWYgbm90IHNlbGYucGF0aG1vZHVsZSA9PSBnZW5lcmljcGF0aDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKHN1cHBvcnQuVEVTVEZOKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgICAgICBpZiBub3Qgc2VsZi5wYXRobW9kdWxlID09IGdlbmVyaWNwYXRoOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUubGV4aXN0cyhmaWxlbmFtZSksIFRydWUpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAicGlwZSIpLCAicmVxdWlyZXMgb3MucGlwZSgpIikKICAgICBkZWYgdGVzdF9leGlzdHNfZmQoc2VsZik6CkBAIC0xNTQsNTMgKzE0Nyw2NiBAQAogICAgICAgICAgICAgb3MuY2xvc2UodykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKHIpKQogCi0gICAgZGVmIHRlc3RfaXNkaXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgICAgIG9zLnJlbW92ZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzYWZlX3JtZGlyKHN1cHBvcnQuVEVTVEZOKQorICAgIGRlZiB0ZXN0X2lzZGlyX2ZpbGUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoZmlsZW5hbWUpLCBGYWxzZSkKIAotICAgIGRlZiB0ZXN0X2lzZmlsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKLSAgICAgICAgICAgIG9zLnJlbW92ZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIHNhZmVfcm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQogCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfY3JlYXRlX2ZpbGUoZmlsZW5hbWUpOgotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGInZm9vJykKKyAgICBkZWYgdGVzdF9pc2Rpcl9kaXIoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm1kaXIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIG9zLm1rZGlyKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc2ZpbGVfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzZmlsZV9kaXIoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm1kaXIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKKworICAgICAgICBvcy5ta2RpcihmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKGZpbGVuYW1lKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9zYW1lZmlsZShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbiA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuLCB0ZXN0X2ZuKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4pCisgICAgICAgIGZpbGUxID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgZmlsZTIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGUxKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGUyKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKGZpbGUxLCBmaWxlMSkpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKGZpbGUxLCBmaWxlMikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUpCisKKyAgICBkZWYgX3Rlc3Rfc2FtZWZpbGVfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKKworICAgICAgICBmdW5jKHRlc3RfZm4xLCB0ZXN0X2ZuMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQorICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc2FtZWZpbGVfb25fc3ltbGluayhzZWxmKToKQEAgLTIwOSwzMSArMjE1LDM3IEBACiAgICAgZGVmIHRlc3Rfc2FtZWZpbGVfb25fbGluayhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMob3MubGluaykKIAotICAgIGRlZiBfdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4xKQotCi0gICAgICAgICAgICBmdW5jKHRlc3RfZm4xLCB0ZXN0X2ZuMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUodGVzdF9mbjEsIHRlc3RfZm4yKSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4xKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCiAgICAgZGVmIHRlc3Rfc2FtZXN0YXQoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4gPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbikKLSAgICAgICAgICAgIHRlc3RfZm5zID0gW3Rlc3RfZm5dKjIKLSAgICAgICAgICAgIHN0YXRzID0gbWFwKG9zLnN0YXQsIHRlc3RfZm5zKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCgqc3RhdHMpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4pCisgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4xKQorICAgICAgICBzdGF0MSA9IG9zLnN0YXQodGVzdF9mbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQoc3RhdDEsIG9zLnN0YXQodGVzdF9mbjEpKSkKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMikKKyAgICAgICAgc3RhdDIgPSBvcy5zdGF0KHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChzdGF0MSwgc3RhdDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KQorCisgICAgZGVmIF90ZXN0X3NhbWVzdGF0X29uX2xpbmtfZnVuYyhzZWxmLCBmdW5jKToKKyAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTiArICIxIgorICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjEpCisgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KG9zLnN0YXQodGVzdF9mbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9mbjIpKSkKKyAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChvcy5zdGF0KHRlc3RfZm4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X2ZuMikpKQogCiAgICAgQHN1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluawogICAgIGRlZiB0ZXN0X3NhbWVzdGF0X29uX3N5bWxpbmsoc2VsZik6CkBAIC0yNDIsMzEgKzI1NCwxNyBAQAogICAgIGRlZiB0ZXN0X3NhbWVzdGF0X29uX2xpbmsoc2VsZik6CiAgICAgICAgIHNlbGYuX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKG9zLmxpbmspCiAKLSAgICBkZWYgX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKLSAgICAgICAgICAgIHRlc3RfZm5zID0gKHRlc3RfZm4xLCB0ZXN0X2ZuMikKLSAgICAgICAgICAgIGZ1bmMoKnRlc3RfZm5zKQotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCi0KLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4yKQotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCgqc3RhdHMpKQotCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQogICAgIGRlZiB0ZXN0X3NhbWVvcGVuZmlsZShzZWxmKToKLSAgICAgICAgZm5hbWUgPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJ3YiIpIGFzIGEsIG9wZW4oZm5hbWUsICJ3YiIpIGFzIGI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVvcGVuZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5maWxlbm8oKSwgYi5maWxlbm8oKSkpCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmcDE6CisgICAgICAgICAgICBmZDEgPSBmcDEuZmlsZW5vKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIiwgMCkgYXMgZnAyOgorICAgICAgICAgICAgICAgIGZkMiA9IGZwMi5maWxlbm8oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZW9wZW5maWxlKGZkMSwgZmQyKSkKKwogCiBjbGFzcyBUZXN0R2VuZXJpY1Rlc3QoR2VuZXJpY1Rlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAjIElzc3VlIDE2ODUyOiBHZW5lcmljVGVzdCBjYW4ndCBpbmhlcml0IGZyb20gdW5pdHRlc3QuVGVzdENhc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IDY0OTExMzUuLmJlNzc3YWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtNjM2LDEwICs2MzYsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2VzX2hhc2goJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKSwgYidhYmNceGU5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ2FiY1x4ZTlceDAwJykpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheShiJ3gnKjQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19lc19oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYnl0ZWFycmF5KGIneCcqNCkpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19lc19oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogCiAgICAgZGVmIHRlc3RfZXRfaGFzaChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfZXRfaGFzaApAQCAtNjYyLDEwICs2NjIsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2V0X2hhc2goJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKSwgYidhYmNceGU5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ2FiY1x4ZTlceDAwJykpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheShiJ3gnKjQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19ldF9oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYnl0ZWFycmF5KGIneCcqNCkpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19ldF9oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogCiAgICAgZGVmIHRlc3RfdShzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfdQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5IGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CmluZGV4IGRlNjEwYzcuLjNhOTQzODMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKQEAgLTQ0MCw2ICs0NDAsMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYzJweScsICdFTk9FTlQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBnZXR0ZXh0LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IGQ2OGNjN2QuLjMzMWY0OGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTI5NSw2ICsyOTUsMTAgQEAKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCiAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqKTogcGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZGVmIGYoKiwpOiBwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqLCAqKmt3ZHMpOiBwYXNzIikKKwogICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzIGFmdGVyICphcmdsaXN0CiAgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICByZXR1cm4gYXJncywga3dhcmdzCkBAIC0zNTIsNiArMzU2LDIzIEBACiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqZygxPTIpKSIpCiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqKmcoMT0yKSkiKQogCisgICAgICAgICMgQ2hlY2sgdHJhaWxpbmcgY29tbWFzIGFyZSBwZXJtaXR0ZWQgaW4gZnVuY2RlZiBhcmd1bWVudCBsaXN0CisgICAgICAgIGRlZiBmKGEsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywpOiBwYXNzCisgICAgICAgIGRlZiBmKCoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsIGIsKTogcGFzcworICAgICAgICBkZWYgZigqLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiwgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiwgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsIGIsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICosIGIsICoqa3dkcywpOiBwYXNzCisKICAgICBkZWYgdGVzdF9sYW1iZGVmKHNlbGYpOgogICAgICAgICAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAogICAgICAgICBsMSA9IGxhbWJkYSA6IDAKQEAgLTM3MCw2ICszOTEsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNigxLDIpLCAxKzIrMjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDYoMSwyLGs9MTApLCAxKzIrMTApCiAKKyAgICAgICAgIyBjaGVjayB0aGF0IHRyYWlsaW5nIGNvbW1hcyBhcmUgcGVybWl0dGVkCisgICAgICAgIGwxMCA9IGxhbWJkYSBhLDogMAorICAgICAgICBsMTEgPSBsYW1iZGEgKmFyZ3MsOiAwCisgICAgICAgIGwxMiA9IGxhbWJkYSAqKmt3ZHMsOiAwCisgICAgICAgIGwxMyA9IGxhbWJkYSBhLCAqYXJncyw6IDAKKyAgICAgICAgbDE0ID0gbGFtYmRhIGEsICoqa3dkcyw6IDAKKyAgICAgICAgbDE1ID0gbGFtYmRhICphcmdzLCBiLDogMAorICAgICAgICBsMTYgPSBsYW1iZGEgKiwgYiw6IDAKKyAgICAgICAgbDE3ID0gbGFtYmRhICphcmdzLCAqKmt3ZHMsOiAwCisgICAgICAgIGwxOCA9IGxhbWJkYSBhLCAqYXJncywgYiw6IDAKKyAgICAgICAgbDE5ID0gbGFtYmRhIGEsICosIGIsOiAwCisgICAgICAgIGwyMCA9IGxhbWJkYSBhLCAqYXJncywgKiprd2RzLDogMAorICAgICAgICBsMjEgPSBsYW1iZGEgKmFyZ3MsIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIyID0gbGFtYmRhICosIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIzID0gbGFtYmRhIGEsICphcmdzLCBiLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyNCA9IGxhbWJkYSBhLCAqLCBiLCAqKmt3ZHMsOiAwCisKIAogICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKICAgICAjIFRlc3RlZCBiZWxvdwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncnAucHkgYi9MaWIvdGVzdC90ZXN0X2dycC5weQppbmRleCAyNzJiMDg2Li42OTA5NWEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dycC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dycC5weQpAQCAtOTIsNSArOTIsMTUgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZ3JwLmdldGdyZ2lkLCBmYWtlZ2lkKQogCisgICAgZGVmIHRlc3Rfbm9uaW50ZWdlcl9naWQoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBncnAuZ2V0Z3JhbGwoKQorICAgICAgICBpZiBub3QgZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIGdyb3VwcycpCisgICAgICAgICMgQ2hvb3NlIGFuIGV4aXN0ZW50IGdpZC4KKyAgICAgICAgZ2lkID0gZW50cmllc1swXVsyXQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBmbG9hdChnaWQpKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBzdHIoZ2lkKSkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKaW5kZXggZjM5NmViZC4uMzg1NmQwMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgaHRtbAogaW1wb3J0IGh0dHAuY2xpZW50CiBpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKIGltcG9ydCB1bml0dGVzdApAQCAtMzQzLDcgKzM0NCw3IEBACiAgICAgICAgIHF1b3RlZG5hbWUgPSB1cmxsaWIucGFyc2UucXVvdGUoZmlsZW5hbWUsIGVycm9ycz0nc3Vycm9nYXRlcGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdocmVmPSIlcyInICUgcXVvdGVkbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKGVuYywgJ3N1cnJvZ2F0ZWVzY2FwZScpLCBib2R5KQotICAgICAgICBzZWxmLmFzc2VydEluKCgnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lLCBxdW90ZT1GYWxzZSkpCiAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShlbmMsICdzdXJyb2dhdGVlc2NhcGUnKSwgYm9keSkKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi5iYXNlX3VybCArICcvJyArIHF1b3RlZG5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuT0ssCkBAIC00MjEsNiArNDIyLDI3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UuZ2V0aGVhZGVyKCJMb2NhdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVtcGRpcl9uYW1lICsgIi8/aGk9MSIpCiAKKyAgICBkZWYgdGVzdF9odG1sX2VzY2FwZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSAnPHRlc3QmPi50eHQnCisgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgZmlsZW5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3BlbihmdWxscGF0aCwgJ3cnKS5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ0NhbiBub3QgY3JlYXRlIGZpbGUgJXMgb24gY3VycmVudCBmaWxlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW0nICUgZmlsZW5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi5iYXNlX3VybCArICcvJykKKyAgICAgICAgICAgIGJvZHkgPSBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LKQorICAgICAgICAgICAgZW5jID0gcmVzcG9uc2UuaGVhZGVycy5nZXRfY29udGVudF9jaGFyc2V0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhmdWxscGF0aCkgICMgYXZvaWQgYWZmZWN0aW5nIHRlc3RfdW5kZWNvZGFibGVfZmlsZW5hbWUKKworICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShlbmMpCisgICAgICAgIGh0bWxfdGV4dCA9ICc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lLCBxdW90ZT1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihodG1sX3RleHQuZW5jb2RlKGVuYyksIGJvZHkpCisKIAogY2dpX2ZpbGUxID0gIiIiXAogIyElcwpAQCAtODcxLDcgKzg5Myw3IEBACiAgICAgICAgICMgSXNzdWUgIzY3OTE6IHNhbWUgZm9yIGhlYWRlcnMKICAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgKICAgICAgICAgICAgIGInR0VUIC8gSFRUUC8xLjFcclxuWC1Gb286IGJhcicgKyBiJ3InICogNjU1MzcgKyBiJ1xyXG5cclxuJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDAwIExpbmUgdG9vIGxvbmdcclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDMxIExpbmUgdG9vIGxvbmdcclxuJykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMScpCiAKQEAgLTg4Miw2ICs5MDQsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMScpCiAKKyAgICBkZWYgdGVzdF9odG1sX2VzY2FwZV9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgKKyAgICAgICAgICAgIGInPHNjcmlwdD5hbGVydCgiaGVsbG8iKTwvc2NyaXB0PiAvIEhUVFAvMS4xJykKKyAgICAgICAgcmVzdWx0ID0gYicnLmpvaW4ocmVzdWx0KQorICAgICAgICB0ZXh0ID0gJzxzY3JpcHQ+YWxlcnQoImhlbGxvIik8L3NjcmlwdD4nCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaHRtbC5lc2NhcGUodGV4dCwgcXVvdGU9RmFsc2UpLmVuY29kZSgnYXNjaWknKSwgcmVzdWx0KQorCiAgICAgZGVmIHRlc3RfY2xvc2VfY29ubmVjdGlvbihzZWxmKToKICAgICAgICAgIyBoYW5kbGVfb25lX3JlcXVlc3QoKSBzaG91bGQgYmUgcmVwZWF0ZWRseSBjYWxsZWQgdW50aWwKICAgICAgICAgIyBpdCBzZXRzIGNsb3NlX2Nvbm5lY3Rpb24KQEAgLTg5Nyw2ICs5MjYsMTkgQEAKICAgICAgICAgc2VsZi5oYW5kbGVyLmhhbmRsZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGNsb3NlX3ZhbHVlcykKIAorICAgIGRlZiB0ZXN0X2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgICMgdGhpcyBpcyB0aGUgb2xkIGNvZGUgdGhhdCBmb3JtYXRzIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZShub3cpCisgICAgICAgIGV4cGVjdGVkID0gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci53ZWVrZGF5bmFtZVt3ZF0sCisgICAgICAgICAgICBkYXksCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIubW9udGhuYW1lW21vbnRoXSwKKyAgICAgICAgICAgIHllYXIsIGhoLCBtbSwgc3MKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5kYXRlX3RpbWVfc3RyaW5nKHRpbWVzdGFtcD1ub3cpLCBleHBlY3RlZCkKKworCiBjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiIFRlc3QgdXJsIHBhcnNpbmcgIiIiCiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CmluZGV4IDA3MTU3ZjUuLjhlNDk5MGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKQEAgLTI0Myw2ICsyNDMsNTUgQEAKICAgICAgICAgICAgIGNsaWVudC5zaHV0ZG93bigpCiAKICAgICBAcmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfYnJhY2tldF9mbGFncyhzZWxmKToKKworICAgICAgICAjIFRoaXMgdmlvbGF0ZXMgUkZDIDM1MDEsIHdoaWNoIGRpc2FsbG93cyAnXScgY2hhcmFjdGVycyBpbiB0YWcgbmFtZXMsCisgICAgICAgICMgYnV0IGltYXBsaWIgaGFzIGFsbG93ZWQgcHJvZHVjaW5nIHN1Y2ggdGFncyBmb3JldmVyLCBvdGhlciBwcm9ncmFtcworICAgICAgICAjIGFsc28gcHJvZHVjZSB0aGVtIChlZzogT3RoZXJJbmJveCdzIE9yZ2FuaXplciBhcHAgYXMgb2YgMjAxNDA3MTYpLAorICAgICAgICAjIGFuZCBHbWFpbCwgZm9yIGV4YW1wbGUsIGFjY2VwdHMgdGhlbSBhbmQgcHJvZHVjZXMgdGhlbS4gIFNvIHdlCisgICAgICAgICMgc3VwcG9ydCB0aGVtLiAgU2VlIGlzc3VlICMyMTgxNS4KKworICAgICAgICBjbGFzcyBCcmFja2V0RmxhZ0hhbmRsZXIoU2ltcGxlSU1BUEhhbmRsZXIpOgorCisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBbJ0Fuc3dlcmVkJywgJ0ZsYWdnZWQnLCAnRGVsZXRlZCcsICdTZWVuJywgJ0RyYWZ0J10KKyAgICAgICAgICAgICAgICBzdXBlcigpLmhhbmRsZSgpCisKKyAgICAgICAgICAgIGRlZiBjbWRfQVVUSEVOVElDQVRFKHNlbGYsIHRhZywgYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90ZXh0bGluZSgnKycpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVzcG9uc2UgPSB5aWVsZAorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGFnZ2VkKHRhZywgJ09LJywgJ0ZBS0VBVVRIIHN1Y2Nlc3NmdWwnKQorCisgICAgICAgICAgICBkZWYgY21kX1NFTEVDVChzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIGZsYWdfbXNnID0gJyBcXCcuam9pbihzZWxmLmZsYWdzKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZSgoJyogRkxBR1MgKCVzKScgJSBmbGFnX21zZykuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShiJyogMiBFWElTVFMnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShiJyogMCBSRUNFTlQnKQorICAgICAgICAgICAgICAgIG1zZyA9ICgnKiBPSyBbUEVSTUFORU5URkxBR1MgJXMgXFwqKV0gRmxhZ3MgcGVybWl0dGVkLicKKyAgICAgICAgICAgICAgICAgICAgICAgICUgZmxhZ19tc2cpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKG1zZy5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90YWdnZWQodGFnLCAnT0snLCAnW1JFQUQtV1JJVEVdIFNFTEVDVCBjb21wbGV0ZWQuJykKKworICAgICAgICAgICAgZGVmIGNtZF9TVE9SRShzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIG5ld19mbGFncyA9IGFyZ3NbMl0uc3RyaXAoJygnKS5zdHJpcCgnKScpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWdzLmV4dGVuZChuZXdfZmxhZ3MpCisgICAgICAgICAgICAgICAgZmxhZ3NfbXNnID0gJyhGTEFHUyAoJXMpKScgJSAnIFxcJy5qb2luKHNlbGYuZmxhZ3MpCisgICAgICAgICAgICAgICAgbXNnID0gJyogJXMgRkVUQ0ggJXMnICUgKGFyZ3NbMF0sIGZsYWdzX21zZykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUobXNnLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RhZ2dlZCh0YWcsICdPSycsICdTVE9SRSBjb21wbGV0ZWQuJykKKworICAgICAgICB3aXRoIHNlbGYucmVhcGVkX3BhaXIoQnJhY2tldEZsYWdIYW5kbGVyKSBhcyAoc2VydmVyLCBjbGllbnQpOgorICAgICAgICAgICAgY29kZSwgZGF0YSA9IGNsaWVudC5hdXRoZW50aWNhdGUoJ01ZQVVUSCcsIGxhbWJkYSB4OiBiJ2Zha2UnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlLCAnT0snKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIucmVzcG9uc2UsIGInWm1GclpRPT1cclxuJykKKyAgICAgICAgICAgIGNsaWVudC5zZWxlY3QoJ3Rlc3QnKQorICAgICAgICAgICAgdHlwLCBbZGF0YV0gPSBjbGllbnQuc3RvcmUoYicxJywgIitGTEFHUyIsICJbdGVzdF0iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1t0ZXN0XScsIGRhdGEpCisgICAgICAgICAgICBjbGllbnQuc2VsZWN0KCd0ZXN0JykKKyAgICAgICAgICAgIHR5cCwgW2RhdGFdID0gY2xpZW50LnJlc3BvbnNlKCdQRVJNQU5FTlRGTEFHUycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInW3Rlc3RdJywgZGF0YSkKKworICAgIEByZWFwX3RocmVhZHMKICAgICBkZWYgdGVzdF9pc3N1ZTU5NDkoc2VsZik6CiAKICAgICAgICAgY2xhc3MgRU9GSGFuZGxlcihzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCBlZTllZTFhLi5lZmIwMzg0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtMTIsNyArMTIsNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgaW1wb3J0IGltcAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weQppbmRleCBjN2QzYTJhLi43ZjY0NTQ4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5CkBAIC01LDYgKzUsNyBAQAogCiAiIiIKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCiBmcm9tIC4uIGltcG9ydCB1dGlsCiAKIApAQCAtMzMsMzEgKzM0LDUwIEBACiAKICAgICAiIiIKIAotICAgIGRlZiB0ZXN0X3VzaW5nX19fcGFja2FnZV9fKHNlbGYpOgotICAgICAgICAjIFtfX3BhY2thZ2VfX10KKyAgICBkZWYgaW1wb3J0X21vZHVsZShzZWxmLCBnbG9iYWxzXyk6CiAgICAgICAgIHdpdGggc2VsZi5tb2NrX21vZHVsZXMoJ3BrZy5fX2luaXRfXycsICdwa2cuZmFrZScpIGFzIGltcG9ydGVyOgogICAgICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W2ltcG9ydGVyXSk6CiAgICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdwa2cuZmFrZScpCiAgICAgICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5fX2ltcG9ydF9fKCcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPXsnX19wYWNrYWdlX18nOiAncGtnLmZha2UnfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3Q9WydhdHRyJ10sIGxldmVsPTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFsc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0PVsnYXR0ciddLCBsZXZlbD0yKQorICAgICAgICByZXR1cm4gbW9kdWxlCisKKyAgICBkZWYgdGVzdF91c2luZ19fX3BhY2thZ2VfXyhzZWxmKToKKyAgICAgICAgIyBbX19wYWNrYWdlX19dCisgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7J19fcGFja2FnZV9fJzogJ3BrZy5mYWtlJ30pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKIAotICAgIGRlZiB0ZXN0X3VzaW5nX19fbmFtZV9fKHNlbGYsIHBhY2thZ2VfYXNfTm9uZT1GYWxzZSk6CisgICAgZGVmIHRlc3RfdXNpbmdfX19uYW1lX18oc2VsZik6CiAgICAgICAgICMgW19fbmFtZV9fXQotICAgICAgICBnbG9iYWxzXyA9IHsnX19uYW1lX18nOiAncGtnLmZha2UnLCAnX19wYXRoX18nOiBbXX0KLSAgICAgICAgaWYgcGFja2FnZV9hc19Ob25lOgotICAgICAgICAgICAgZ2xvYmFsc19bJ19fcGFja2FnZV9fJ10gPSBOb25lCi0gICAgICAgIHdpdGggc2VsZi5tb2NrX21vZHVsZXMoJ3BrZy5fX2luaXRfXycsICdwa2cuZmFrZScpIGFzIGltcG9ydGVyOgotICAgICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W2ltcG9ydGVyXSk6Ci0gICAgICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdwa2cuZmFrZScpCi0gICAgICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5fX2ltcG9ydF9fKCcnLCBnbG9iYWxzPSBnbG9iYWxzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0PVsnYXR0ciddLCBsZXZlbD0yKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeydfX25hbWVfXyc6ICdwa2cuZmFrZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3BhdGhfXyc6IFtdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorCisgICAgZGVmIHRlc3Rfd2Fybl93aGVuX3VzaW5nX19fbmFtZV9fKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoSW1wb3J0V2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmltcG9ydF9tb2R1bGUoeydfX25hbWVfXyc6ICdwa2cuZmFrZScsICdfX3BhdGhfXyc6IFtdfSkKIAogICAgIGRlZiB0ZXN0X05vbmVfYXNfX19wYWNrYWdlX18oc2VsZik6CiAgICAgICAgICMgW05vbmVdCi0gICAgICAgIHNlbGYudGVzdF91c2luZ19fX25hbWVfXyhwYWNrYWdlX2FzX05vbmU9VHJ1ZSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsKKyAgICAgICAgICAgICAgICAnX19uYW1lX18nOiAncGtnLmZha2UnLCAnX19wYXRoX18nOiBbXSwgJ19fcGFja2FnZV9fJzogTm9uZSB9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisKKyAgICBkZWYgdGVzdF9zcGVjX2ZhbGxiYWNrKHNlbGYpOgorICAgICAgICAjIElmIF9fcGFja2FnZV9fIGlzbid0IGRlZmluZWQsIGZhbGwgYmFjayBvbiBfX3NwZWNfXy5wYXJlbnQuCisgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7J19fc3BlY19fJzogRmFrZVNwZWMoJ3BrZy5mYWtlJyl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisKKyAgICBkZWYgdGVzdF93YXJuX3doZW5fcGFja2FnZV9hbmRfc3BlY19kaXNhZ3JlZShzZWxmKToKKyAgICAgICAgIyBSYWlzZSBhbiBJbXBvcnRXYXJuaW5nIGlmIF9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudC4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKEltcG9ydFdhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19wYWNrYWdlX18nOiAncGtnLmZha2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX19zcGVjX18nOiBGYWtlU3BlYygncGtnLmZha2VmYWtlJyl9KQogCiAgICAgZGVmIHRlc3RfYmFkX19wYWNrYWdlX18oc2VsZik6CiAgICAgICAgIGdsb2JhbHMgPSB7J19fcGFja2FnZV9fJzogJzxub3QgcmVhbD4nfQpAQCAtNzAsNiArOTAsMTEgQEAKICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnJywgZ2xvYmFscywge30sIFsncmVsaW1wb3J0J10sIDEpCiAKIAorY2xhc3MgRmFrZVNwZWM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisKKwogY2xhc3MgVXNpbmdfX3BhY2thZ2VfX1BFUDMwMihVc2luZ19fcGFja2FnZV9fKToKICAgICBtb2NrX21vZHVsZXMgPSB1dGlsLm1vY2tfbW9kdWxlcwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcmVsYXRpdmVfaW1wb3J0cy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9yZWxhdGl2ZV9pbXBvcnRzLnB5CmluZGV4IDNiYjgxOWYuLjQyZWRjNzggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9yZWxhdGl2ZV9pbXBvcnRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9yZWxhdGl2ZV9pbXBvcnRzLnB5CkBAIC0yLDYgKzIsOCBAQAogZnJvbSAuLiBpbXBvcnQgdXRpbAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKwogCiBjbGFzcyBSZWxhdGl2ZUltcG9ydHM6CiAKQEAgLTY1LDkgKzY3LDExIEBACiAgICAgICAgICAgICAgICAgdW5jYWNoZV9uYW1lcy5hcHBlbmQobmFtZVs6LWxlbignLl9faW5pdF9fJyldKQogICAgICAgICB3aXRoIHV0aWwubW9ja19zcGVjKCpjcmVhdGUpIGFzIGltcG9ydGVyOgogICAgICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W2ltcG9ydGVyXSk6Ci0gICAgICAgICAgICAgICAgZm9yIGdsb2JhbF8gaW4gZ2xvYmFsc186Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggdXRpbC51bmNhY2hlKCp1bmNhY2hlX25hbWVzKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCisgICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgIGZvciBnbG9iYWxfIGluIGdsb2JhbHNfOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1dGlsLnVuY2FjaGUoKnVuY2FjaGVfbmFtZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCiAKIAogICAgIGRlZiB0ZXN0X21vZHVsZV9mcm9tX21vZHVsZShzZWxmKToKQEAgLTIwNCwxMSArMjA4LDE4IEBACiAKICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRfbm9fZ2xvYmFscyhzZWxmKToKICAgICAgICAgIyBObyBnbG9iYWxzIGZvciBhIHJlbGF0aXZlIGltcG9ydCBpcyBhbiBlcnJvci4KLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3N5cycsIGxldmVsPTEpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnc3lzJywgbGV2ZWw9MSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnYScsIHsnX19wYWNrYWdlX18nOiAnJywgJ19fc3BlY19fJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSkKIAogICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlX2V4aXN0c19hYnNvbHV0ZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvcik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdzeXMnLCB7J19fcGFja2FnZV9fJzogJycsICdfX3NwZWNfXyc6IE5vbmV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPTEpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmUxMWYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0iIiJSdW4gUHl0aG9uJ3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZSB1c2luZyBpbXBvcnRsaWIuX19pbXBvcnRfXy4KLQotVGVzdHMga25vd24gdG8gZmFpbCBiZWNhdXNlIG9mIGFzc3VtcHRpb25zIHRoYXQgaW1wb3J0bGliIChwcm9wZXJseSkKLWludmFsaWRhdGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNraXBwZWQgaWYgdGhlIGVudGlyZSB0ZXN0IHN1aXRlIGlzIHJ1bi4KLU90aGVyd2lzZSBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMgdmFsaWQgZm9yIHRlc3QucmVncnRlc3QgYXJlIGFsc28gdmFsaWQgZm9yCi10aGlzIHNjcmlwdC4KLQotIiIiCi1pbXBvcnQgaW1wb3J0bGliCi1pbXBvcnQgc3lzCi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgX19idWlsdGluc19fLl9faW1wb3J0X18gPSBpbXBvcnRsaWIuX19pbXBvcnRfXwotICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKLQotICAgIHJlZ3J0ZXN0Lm1haW4ocXVpZXQ9VHJ1ZSwgdmVyYm9zZTI9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weQppbmRleCBjODkzYmNmLi4wMDViNjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF93aW5kb3dzLnB5CkBAIC00MCw3ICs0MCw3IEBACiAgICAgZWxzZToKICAgICAgICAgcm9vdCA9IG1hY2hpbmVyeS5XaW5kb3dzUmVnaXN0cnlGaW5kZXIuUkVHSVNUUllfS0VZCiAgICAga2V5ID0gcm9vdC5mb3JtYXQoZnVsbG5hbWU9bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj1zeXMudmVyc2lvbls6M10pCisgICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249JyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgIHRyeToKICAgICAgICAgd2l0aCB0ZW1wX21vZHVsZShuYW1lLCAiYSA9IDEiKSBhcyBsb2NhdGlvbjoKICAgICAgICAgICAgIHN1YmtleSA9IENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwga2V5KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDY3MWUwNWEuLjc2Y2ViY2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTMwLDYgKzMwLDcgQEAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlciBhcyBtb2QKIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnQgaW1wb3J0IF9yZWFkeV90b19pbXBvcnQKIApAQCAtMzgsNyArMzksNyBAQAogIyBpc21vZHVsZSwgaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24sIGlzdHJhY2ViYWNrLCBpc2ZyYW1lLCBpc2NvZGUsCiAjIGlzYnVpbHRpbiwgaXNyb3V0aW5lLCBpc2dlbmVyYXRvciwgaXNnZW5lcmF0b3JmdW5jdGlvbiwgZ2V0bWVtYmVycywKICMgZ2V0ZG9jLCBnZXRmaWxlLCBnZXRtb2R1bGUsIGdldHNvdXJjZWZpbGUsIGdldGNvbW1lbnRzLCBnZXRzb3VyY2UsCi0jIGdldGNsYXNzdHJlZSwgZ2V0YXJnc3BlYywgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCisjIGdldGNsYXNzdHJlZSwgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCiAjIGN1cnJlbnRmcmFtZSwgc3RhY2ssIHRyYWNlLCBpc2RhdGFkZXNjcmlwdG9yCiAKICMgTk9URTogVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyByZWxhdGluZyB0byBpbnRlcmFjdGlvbiB3aXRoCkBAIC00MDAsNyArNDAxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUobW9kLnNwYW0pKSwgbW9kZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUoZ2l0LmFidXNlKSksIG1vZGZpbGUpCiAgICAgICAgIGZuID0gIl9ub25fZXhpc3RpbmdfZmlsZW5hbWVfdXNlZF9mb3Jfc291cmNlZmlsZV90ZXN0LnB5IgotICAgICAgICBjbyA9IGNvbXBpbGUoIk5vbmUiLCBmbiwgImV4ZWMiKQorICAgICAgICBjbyA9IGNvbXBpbGUoIng9MSIsIGZuLCAiZXhlYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGNvKSwgTm9uZSkKICAgICAgICAgbGluZWNhY2hlLmNhY2hlW2NvLmNvX2ZpbGVuYW1lXSA9ICgxLCBOb25lLCAiTm9uZSIsIGNvLmNvX2ZpbGVuYW1lKQogICAgICAgICB0cnk6CkBAIC0zNTQzLDE0ICszNTQ0LDE0IEBACiAKICAgICBkZWYgdGVzdF9kZXRhaWxzKHNlbGYpOgogICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgndW5pdHRlc3QnKQotICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctbScsICdpbnNwZWN0JywKKyAgICAgICAgYXJncyA9IHN1cHBvcnQub3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygqYXJncywgJy1tJywgJ2luc3BlY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bml0dGVzdCcsICctLWRldGFpbHMnKQogICAgICAgICBvdXRwdXQgPSBvdXQuZGVjb2RlKCkKICAgICAgICAgIyBKdXN0IGEgcXVpY2sgc2FuaXR5IGNoZWNrIG9uIHRoZSBvdXRwdXQKICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19uYW1lX18sIG91dHB1dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19maWxlX18sIG91dHB1dCkKLSAgICAgICAgaWYgbm90IHN5cy5mbGFncy5vcHRpbWl6ZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fY2FjaGVkX18sIG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19jYWNoZWRfXywgb3V0cHV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CmluZGV4IGE3YmI5NWIuLjFkYWIxNjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pby5weQpAQCAtNDczLDcgKzQ3MywxMSBAQAogICAgIGRlZiB0ZXN0X29wZW5faGFuZGxlc19OVUxfY2hhcnMoc2VsZik6CiAgICAgICAgIGZuX3dpdGhfTlVMID0gJ2Zvb1wwYmFyJwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIGZuX3dpdGhfTlVMLCAndycpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgYnl0ZXMoZm5fd2l0aF9OVUwsICdhc2NpaScpLCAndycpCisKKyAgICAgICAgYnl0ZXNfZm4gPSBieXRlcyhmbl93aXRoX05VTCwgJ2FzY2lpJykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIGJ5dGVzX2ZuLCAndycpCiAKICAgICBkZWYgdGVzdF9yYXdfZmlsZV9pbyhzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKSBhcyBmOgpAQCAtMzE3OCw4ICszMTgyLDcgQEAKIAogY2xhc3MgUHlUZXh0SU9XcmFwcGVyVGVzdChUZXh0SU9XcmFwcGVyVGVzdCk6CiAgICAgaW8gPSBweWlvCi0gICAgI3NodXRkb3duX2Vycm9yID0gIkxvb2t1cEVycm9yOiB1bmtub3duIGVuY29kaW5nOiBhc2NpaSIKLSAgICBzaHV0ZG93bl9lcnJvciA9ICJUeXBlRXJyb3I6ICdOb25lVHlwZScgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIKKyAgICBzaHV0ZG93bl9lcnJvciA9ICJMb29rdXBFcnJvcjogdW5rbm93biBlbmNvZGluZzogYXNjaWkiCiAKIAogY2xhc3MgSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQppbmRleCBmOTQwODUyLi41MDg4YjU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQpAQCAtNjEzLDYgKzYxMyw1NiBAQAogICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKICAgICAgICAgICAgIHNlbGYucGlja2xldGVzdChwcm90bywgY3ljbGUoJ2FiYycpKQogCisgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgIyB0ZXN0IHdpdGggcGFydGlhbCBjb25zdW1lZCBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgaXQgPSBpdGVyKCdhYmNkZScpCisgICAgICAgICAgICBjID0gY3ljbGUoaXQpCisgICAgICAgICAgICBfID0gW25leHQoYykgZm9yIGkgaW4gcmFuZ2UoMildICAgICAgIyBjb25zdW1lIDIgb2YgNSBpbnB1dHMKKyAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoYywgcHJvdG8pCisgICAgICAgICAgICBkID0gcGlja2xlLmxvYWRzKHApICAgICAgICAgICAgICAgICAgIyByZWJ1aWxkIHRoZSBjeWNsZSBvYmplY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgZCksIGxpc3QoJ2NkZWFiY2RlYWJjZGVhYmNkZWFiJykpCisKKyAgICAgICAgICAgICMgdGVzdCB3aXRoIGNvbXBsZXRlbHkgY29uc3VtZWQgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgIGl0ID0gaXRlcignYWJjZGUnKQorICAgICAgICAgICAgYyA9IGN5Y2xlKGl0KQorICAgICAgICAgICAgXyA9IFtuZXh0KGMpIGZvciBpIGluIHJhbmdlKDcpXSAgICAgICMgY29uc3VtZSA3IG9mIDUgaW5wdXRzCisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKGMsIHByb3RvKQorICAgICAgICAgICAgZCA9IHBpY2tsZS5sb2FkcyhwKSAgICAgICAgICAgICAgICAgICMgcmVidWlsZCB0aGUgY3ljbGUgb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGQpLCBsaXN0KCdjZGVhYmNkZWFiY2RlYWJjZGVhYicpKQorCisgICAgZGVmIHRlc3RfY3ljbGVfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IGJvdGggbW9kZXMgZm9yIHJlc3RvcmluZyBzdGF0ZQorCisgICAgICAgICMgTW9kZSAwIGlzIGVmZmljaWVudC4gIEl0IHVzZXMgYW4gaW5jb21wbGV0ZWx5IGNvbnN1bWVkIGlucHV0CisgICAgICAgICMgaXRlcmF0b3IgdG8gYnVpbGQgYSBjeWNsZSBvYmplY3QgYW5kIHRoZW4gcGFzc2VzIGluIHN0YXRlIHdpdGgKKyAgICAgICAgIyBhIGxpc3Qgb2YgcHJldmlvdXNseSBjb25zdW1lZCB2YWx1ZXMuICBUaGVyZSBpcyBubyBkYXRhCisgICAgICAgICMgb3ZlcmxhcCBiZXd0ZWVuIHRoZSB0d28uCisgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgIGMuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmMnKSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgYyksIGxpc3QoJ2RlZmdhYmNkZWZnYWJjZGVmZ2FiJykpCisKKyAgICAgICAgIyBNb2RlIDEgaXMgaW5lZmZpY2llbnQuICBJdCBzdGFydHMgd2l0aCBhIGN5Y2xlIG9iamVjdCBidWlsdAorICAgICAgICAjIGZyb20gYW4gaXRlcmF0b3Igb3ZlciB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIGEgcGFydGlhbAorICAgICAgICAjIGN5Y2xlIGFuZCB0aGVuIHBhc3NlcyBpbiBzdGF0ZSB3aXRoIGFsbCBvZiB0aGUgcHJldmlvdXNseQorICAgICAgICAjIHNlZW4gdmFsdWVzICh0aGlzIG92ZXJsYXBzIHZhbHVlcyBpbmNsdWRlZCBpbiB0aGUgaXRlcmF0b3IpLgorICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICBjLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjZGVmZycpLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjKSwgbGlzdCgnZGVmZ2FiY2RlZmdhYmNkZWZnYWInKSkKKworICAgICAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRzdGF0ZSBuZWVkcyB0byBiZSBhIHR1cGxlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IpOgorICAgICAgICAgICAgY3ljbGUoJ2RlZmcnKS5fX3NldHN0YXRlX18oW2xpc3QoJ2FiY2RlZmcnKSwgMF0pCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgICAgICBjLl9fc2V0c3RhdGVfXygoZGljdC5mcm9ta2V5cygnZGVmZycpLCAwKSkKKyAgICAgICAgICAgIHRha2UoMjAsIGMpCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGN5Y2xlKCdkZWZnJykuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmNkZWZnJyksICd4JykpCisKICAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgogICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgYWNjZXB0cyBhcmd1bWVudHMgY29ycmVjdGx5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZ3JvdXBieShbXSkpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQppbmRleCAyMWVmNzM4Li4yNDBkYjdmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQpAQCAtMyw2ICszLDggQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRva2VuaXplCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCkBAIC0xMCw4ICsxMiw2IEBACiBOT05FWElTVEVOVF9GSUxFTkFNRSA9IEZJTEVOQU1FICsgJy5taXNzaW5nJwogSU5WQUxJRF9OQU1FID0gJyFAJCkoIUAjXzEnCiBFTVBUWSA9ICcnCi1URVNUUyA9ICdpbnNwZWN0X2ZvZGRlciBpbnNwZWN0X2ZvZGRlcjIgbWFwcGluZ190ZXN0cycKLVRFU1RTID0gVEVTVFMuc3BsaXQoKQogVEVTVF9QQVRIID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQogTU9EVUxFUyA9ICJsaW5lY2FjaGUgYWJjIi5zcGxpdCgpCiBNT0RVTEVfUEFUSCA9IG9zLnBhdGguZGlybmFtZShGSUxFTkFNRSkKQEAgLTM3LDYgKzM3LDY1IEBACiAgICAgcmV0dXJuIDMnJycgIyBObyBlbmRpbmcgbmV3bGluZQogCiAKK2NsYXNzIFRlbXBGaWxlOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcigpLnNldFVwKCkKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gZnAubmFtZQorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5maWxlX2J5dGVfc3RyaW5nKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZmlsZV9uYW1lKQorCisKK2NsYXNzIEdldExpbmVUZXN0c0dvb2REYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfbGlzdCAgID0gWydsaXN0XG4nLCAnb2ZcbicsICdnb29kXG4nLCAnc3RyaW5nc1xuJ10KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX2J5dGVfc3RyaW5nID0gJycuam9pbihzZWxmLmZpbGVfbGlzdCkuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKKyAgICAgICAgd2l0aCB0b2tlbml6ZS5vcGVuKHNlbGYuZmlsZV9uYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZnApOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICdcbicKKworICAgICAgICAgICAgICAgIGNhY2hlZF9saW5lID0gbGluZWNhY2hlLmdldGxpbmUoc2VsZi5maWxlX25hbWUsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGNhY2hlZF9saW5lKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBzZWxmLmZpbGVfbGlzdCkKKworCitjbGFzcyBHZXRMaW5lVGVzdHNCYWREYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ0JhZCBkYXRhIGdvZXMgaGVyZScKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUsIHNlbGYuZmlsZV9uYW1lLCAxKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzLCBzZWxmLmZpbGVfbmFtZSkKKworCitjbGFzcyBFbXB0eUZpbGUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbXQorCisKK2NsYXNzIFNpbmdsZUVtcHR5TGluZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFsnXG4nXQorCisKK2NsYXNzIEdvb2RVbmljb2RlKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gWyfDoVxuJywgJ2JcbicsICdhYmNkZWZcbicsICfDocOhw6HDocOhXG4nXQorCisKK2NsYXNzIEJhZFVuaWNvZGUoR2V0TGluZVRlc3RzQmFkRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ1x4ODBhYmMnCisKKwogY2xhc3MgTGluZUNhY2hlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKQEAgLTUzLDEzICsxMTIsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoRU1QVFksIDEpLCBFTVBUWSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKElOVkFMSURfTkFNRSwgMSksIEVNUFRZKQogCi0gICAgICAgICMgQ2hlY2sgd2hldGhlciBsaW5lcyBjb3JyZXNwb25kIHRvIHRob3NlIGZyb20gZmlsZSBpdGVyYXRpb24KLSAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JwotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmaWxlOgotICAgICAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZmlsZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShmaWxlbmFtZSwgaW5kZXggKyAxKSkKLQogICAgICAgICAjIENoZWNrIG1vZHVsZSBsb2FkaW5nCiAgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCkBAIC04MCwxMiArMTMyLDEzIEBACiAKICAgICBkZWYgdGVzdF9jbGVhcmNhY2hlKHNlbGYpOgogICAgICAgICBjYWNoZWQgPSBbXQotICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCisgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCiAgICAgICAgICAgICBjYWNoZWQuYXBwZW5kKGZpbGVuYW1lKQogICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIDEpCiAKICAgICAgICAgIyBBcmUgYWxsIGZpbGVzIGNhY2hlZD8KKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjYWNoZWQsIFtdKQogICAgICAgICBjYWNoZWRfZW1wdHkgPSBbZm4gZm9yIGZuIGluIGNhY2hlZCBpZiBmbiBub3QgaW4gbGluZWNhY2hlLmNhY2hlXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlZF9lbXB0eSwgW10pCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCA5NTU3NWJmLi45YzQzNDRmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC00MTU5LDYgKzQxNTksMTcgQEAKICAgICAgICAgbXNnID0gJ1JlY29yZCBub3QgZm91bmQgaW4gZXZlbnQgbG9nLCB3ZW50IGJhY2sgJWQgcmVjb3JkcycgJSBHT19CQUNLCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgbXNnPW1zZykKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydsb2dUaHJlYWRzJywgJ2xvZ011bHRpcHJvY2Vzc2luZycsCisgICAgICAgICAgICAgICAgICAgICAnbG9nUHJvY2Vzc2VzJywgJ2N1cnJlbnRmcmFtZScsCisgICAgICAgICAgICAgICAgICAgICAnUGVyY2VudFN0eWxlJywgJ1N0ckZvcm1hdFN0eWxlJywgJ1N0cmluZ1RlbXBsYXRlU3R5bGUnLAorICAgICAgICAgICAgICAgICAgICAgJ0ZpbHRlcmVyJywgJ1BsYWNlSG9sZGVyJywgJ01hbmFnZXInLCAnUm9vdExvZ2dlcicsCisgICAgICAgICAgICAgICAgICAgICAncm9vdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGxvZ2dpbmcsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogIyBTZXQgdGhlIGxvY2FsZSB0byB0aGUgcGxhdGZvcm0tZGVwZW5kZW50IGRlZmF1bHQuICBJIGhhdmUgbm8gaWRlYQogIyB3aHkgdGhlIHRlc3QgZG9lcyB0aGlzLCBidXQgaW4gYW55IGNhc2Ugd2Ugc2F2ZSB0aGUgY3VycmVudCBsb2NhbGUKICMgZmlyc3QgYW5kIHJlc3RvcmUgaXQgYXQgdGhlIGVuZC4KQEAgLTQxNzUsNyArNDE4Niw4IEBACiAgICAgICAgIFJvdGF0aW5nRmlsZUhhbmRsZXJUZXN0LCAgTGFzdFJlc29ydFRlc3QsIExvZ1JlY29yZFRlc3QsCiAgICAgICAgIEV4Y2VwdGlvblRlc3QsIFN5c0xvZ0hhbmRsZXJUZXN0LCBIVFRQSGFuZGxlclRlc3QsCiAgICAgICAgIE5URXZlbnRMb2dIYW5kbGVyVGVzdCwgVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyVGVzdCwKLSAgICAgICAgVW5peFNvY2tldEhhbmRsZXJUZXN0LCBVbml4RGF0YWdyYW1IYW5kbGVyVGVzdCwgVW5peFN5c0xvZ0hhbmRsZXJUZXN0KQorICAgICAgICBVbml4U29ja2V0SGFuZGxlclRlc3QsIFVuaXhEYXRhZ3JhbUhhbmRsZXJUZXN0LCBVbml4U3lzTG9nSGFuZGxlclRlc3QsCisgICAgICAgIE1pc2NUZXN0Q2FzZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CmluZGV4IDYyZTY5YTkuLjViOGI0ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKQEAgLTY4OSw2ICs2ODksMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgaW50LCBmbG9hdCgnLWluZicpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIGZsb2F0KCduYW4nKSkKIAorICAgIGRlZiB0ZXN0X21vZF9kaXZpc2lvbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBfID0gMSAlIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzICUgMTAsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEzICUgMTAsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTMgJSAtMTAsIC03KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMyAlIC0xMCwgLTMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIDQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyICUgNCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIC00LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAlIC00LCAwKQorCiAgICAgZGVmIHRlc3RfdHJ1ZV9kaXZpc2lvbihzZWxmKToKICAgICAgICAgaHVnZSA9IDEgPDwgNDAwMDAKICAgICAgICAgbWh1Z2UgPSAtaHVnZQpAQCAtNzIzLDYgKzczNywyNSBAQAogICAgICAgICBmb3IgemVybyBpbiBbImh1Z2UgLyAwIiwgIm1odWdlIC8gMCJdOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGV2YWwsIHplcm8sIG5hbWVzcGFjZSkKIAorICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIF8gPSAxIC8vIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIgLy8gMywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyIC8vIC0zLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAzLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAtMywgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMSAvLyAtMywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTEgLy8gMywgLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEgLy8gLTMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExIC8vIDMsIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIgLy8gLTMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyIC8vIDMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyIC8vIC0zLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAvLyAzLCA0KQorCiAgICAgZGVmIGNoZWNrX3RydWVkaXYoc2VsZiwgYSwgYiwgc2tpcF9zbWFsbD1UcnVlKToKICAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBvZiBhL2IgaXMgY29ycmVjdGx5IHJvdW5kZWQsIGJ5CiAgICAgICAgIGNvbXBhcmluZyBpdCB3aXRoIGEgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgY29ycmVjdGx5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKaW5kZXggYzdkZWY5YS4uYjM3OGZmZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQpAQCAtMTM1LDYgKzEzNSwxMyBAQAogICAgICAgICBmb3IgY29uc3RydWN0b3IgaW4gKHNldCwgZnJvemVuc2V0KToKICAgICAgICAgICAgIHNlbGYuaGVscGVyKGNvbnN0cnVjdG9yKHNlbGYuZC5rZXlzKCkpKQogCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZW1wdHlfZnJvemVuc2V0X3NpbmdsZXRvbihzZWxmKToKKyAgICAgICAgIyBtYXJzaGFsLmxvYWRzKCkgbXVzdCByZXVzZSB0aGUgZW1wdHkgZnJvemVuc2V0IHNpbmdsZXRvbgorICAgICAgICBvYmogPSBmcm96ZW5zZXQoKQorICAgICAgICBvYmoyID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKG9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob2JqMiwgb2JqKQorCiAKIGNsYXNzIEJ1ZmZlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlLCBIZWxwZXJNaXhpbik6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weSBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQppbmRleCAwZjI1NzQyLi5iZTJlNjVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21tYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC03MTMsNiArNzEzLDE0IEBACiAgICAgICAgIGdjX2NvbGxlY3QoKQogICAgICAgICBzZWxmLmFzc2VydElzKHdyKCksIE5vbmUpCiAKKyAgICBkZWYgdGVzdF93cml0ZV9yZXR1cm5pbmdfdGhlX251bWJlcl9vZl9ieXRlc193cml0dGVuKHNlbGYpOgorICAgICAgICBtbSA9IG1tYXAubW1hcCgtMSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiIiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiIngiKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiInl6IiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiJweXRob24iKSwgNikKKworCiBjbGFzcyBMYXJnZU1tYXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQppbmRleCBkYTljOGVmLi41NGZkMWY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKQEAgLTEyMCw2MyArMTIwLDYzIEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWRkKDMsIDQpID09IDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuYWRkKDMsIDQpLCA3KQogCiAgICAgZGVmIHRlc3RfYml0d2lzZV9hbmQoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8sIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSA9PSAweGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuYW5kXygweGYsIDB4YSksIDB4YSkKIAogICAgIGRlZiB0ZXN0X2NvbmNhdChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoJ3B5JywgJ3Rob24nKSA9PSAncHl0aG9uJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSkgPT0gWzEsIDIsIDMsIDRdKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSA9PSBbNSwgNiwgN10pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMihbNSwgNl0pLCBTZXEyKFs3XSkpID09IFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoJ3B5JywgJ3Rob24nKSwgJ3B5dGhvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFsxLCAyXSwgWzMsIDRdKSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChTZXExKFs1LCA2XSksIFNlcTEoWzddKSksIFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoU2VxMihbNSwgNl0pLCBTZXEyKFs3XSkpLCBbNSwgNiwgN10pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0LCAxMywgMjkpCiAKICAgICBkZWYgdGVzdF9jb3VudE9mKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDMpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgNSkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDUpLCAwKQogCiAgICAgZGVmIHRlc3RfZGVsaXRlbShzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBhID0gWzQsIDMsIDIsIDFdCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsaXRlbSwgYSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZGVsaXRlbShhLCAxKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbNCwgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG9wZXJhdG9yLmRlbGl0ZW0oYSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzQsIDIsIDFdKQogCiAgICAgZGVmIHRlc3RfZmxvb3JkaXYoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmZsb29yZGl2KDUsIDIpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuZmxvb3JkaXYoNSwgMiksIDIpCiAKICAgICBkZWYgdGVzdF90cnVlZGl2KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1ZWRpdiwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IudHJ1ZWRpdig1LCAyKSA9PSAyLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IudHJ1ZWRpdig1LCAyKSwgMi41KQogCiAgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBhID0gcmFuZ2UoMTApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBhLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZ2V0aXRlbShhLCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmdldGl0ZW0oYSwgMiksIDIpCiAKICAgICBkZWYgdGVzdF9pbmRleE9mKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpLCAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBbNCwgMywgMiwgMV0sIDApCiAKICAgICBkZWYgdGVzdF9pbnZlcnQoc2VsZik6CkBAIC0xODksMjEgKzE4OSwyMSBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sc2hpZnQoNSwgMSkgPT0gMTApCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sc2hpZnQoNSwgMCkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5sc2hpZnQoNSwgMSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X21vZChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QsIE5vbmUsIDQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubW9kKDUsIDIpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubW9kKDUsIDIpLCAxKQogCiAgICAgZGVmIHRlc3RfbXVsKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm11bCg1LCAyKSA9PSAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5tdWwoNSwgMiksIDEwKQogCiAgICAgZGVmIHRlc3RfbWF0bXVsKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8sIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5vcl8oMHhhLCAweDUpID09IDB4ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5vcl8oMHhhLCAweDUpLCAweGYpCiAKICAgICBkZWYgdGVzdF9wb3Moc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTI1MCw4ICsyNTAsOCBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucnNoaWZ0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMSkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnJzaGlmdCg1LCAxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5yc2hpZnQoNSwgMCksIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCwgMiwgLTEpCiAKICAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKQEAgLTI2NiwxNSArMjY2LDE1IEBACiAgICAgICAgIGEgPSBsaXN0KHJhbmdlKDMpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnNldGl0ZW0oYSwgMCwgMikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gWzIsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShvcGVyYXRvci5zZXRpdGVtKGEsIDAsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFsyLCAxLCAyXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSwgNCwgMikKIAogICAgIGRlZiB0ZXN0X3N1YihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zdWIoNSwgMikgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5zdWIoNSwgMiksIDMpCiAKICAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjkyLDcgKzI5Miw3IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IueG9yLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IueG9yKDB4YiwgMHhjKSA9PSAweDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IueG9yKDB4YiwgMHhjKSwgMHg3KQogCiAgICAgZGVmIHRlc3RfaXMoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IDc2MjFjMjQuLjkxYTAzMTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTYsNiArMTYsNyBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAoraW1wb3J0IG9wdHBhcnNlCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBtYWtlX29wdGlvbiwgT3B0aW9uLCBcCiAgICAgIFRpdGxlZEhlbHBGb3JtYXR0ZXIsIE9wdGlvblBhcnNlciwgT3B0aW9uR3JvdXAsIFwKICAgICAgU1VQUFJFU1NfVVNBR0UsIE9wdGlvbkVycm9yLCBPcHRpb25Db25mbGljdEVycm9yLCBcCkBAIC0xNjUwLDYgKzE2NTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtbDogaW52YWxpZCBpbnRlZ2VyIHZhbHVlOiAnMHgxMngnIikKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydjaGVja19idWlsdGluJywgJ0FtYmlndW91c09wdGlvbkVycm9yJywgJ05PX0RFRkFVTFQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBvcHRwYXJzZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkKaW5kZXggOTAxZDRiMi4uNmZiYzFiNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkKQEAgLTI5OCw5ICsyOTgsMTEgQEAKICAgICAgICAgIyBkbyBub3Qgc2F2ZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGlmIG5vdCBuZWVkZWQKICAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KICAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9kLl9fZGljdF9fLCBkaWN0KQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShvZC5fX3JlZHVjZV9fKClbMl0pCiAgICAgICAgIG9kLnggPSAxMAotICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShvZC5fX3JlZHVjZV9fKClbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuX19kaWN0X19bJ3gnXSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuX19yZWR1Y2VfXygpWzJdLCB7J3gnOiAxMH0pCiAKICAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgogICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKQEAgLTQwMyw2ICs0MDUsMTQgQEAKICAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgqKmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihzeXMuZ2V0c2l6ZW9mKG9kKSwgc3lzLmdldHNpemVvZihkKSkKIAorICAgIGRlZiB0ZXN0X3ZpZXdzKHNlbGYpOgorICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI0Mjg2CisgICAgICAgIHMgPSAndGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciBhIGxhenkgZG9nIHllc3RlcmRheSBiZWZvcmUgZGF3bicuc3BsaXQoKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0LmZyb21rZXlzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Qua2V5cygpLCBkaWN0KG9kKS5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QuaXRlbXMoKSwgZGljdChvZCkuaXRlbXMoKSkKKwogICAgIGRlZiB0ZXN0X292ZXJyaWRlX3VwZGF0ZShzZWxmKToKICAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CiAgICAgICAgICMgVmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdXBkYXRlKCkgd2l0aG91dCBicmVha2luZyBfX2luaXRfXygpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29zLnB5IGIvTGliL3Rlc3QvdGVzdF9vcy5weQppbmRleCA4NzRmOWU0Li4wMTQwNGZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCBtbWFwCiBpbXBvcnQgb3MKIGltcG9ydCBwaWNrbGUKLWltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IHJlCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc2lnbmFsCkBAIC02Niw2ICs2NSw3IEBACiAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKIAorCiByb290X2luX3Bvc2l4ID0gRmFsc2UKIGlmIGhhc2F0dHIob3MsICdnZXRldWlkJyk6CiAgICAgcm9vdF9pbl9wb3NpeCA9IChvcy5nZXRldWlkKCkgPT0gMCkKQEAgLTgyLDYgKzgyLDI4IEBACiAjIElzc3VlICMxNDExMDogU29tZSB0ZXN0cyBmYWlsIG9uIEZyZWVCU0QgaWYgdGhlIHVzZXIgaXMgaW4gdGhlIHdoZWVsIGdyb3VwLgogSEFWRV9XSEVFTF9HUk9VUCA9IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykgYW5kIG9zLmdldGdpZCgpID09IDAKIAorCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncyhtc2dfcmVnZXgsIHF1aWV0PUZhbHNlKToKKyAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKG1zZ19yZWdleCwgRGVwcmVjYXRpb25XYXJuaW5nKSwgcXVpZXQ9cXVpZXQpOgorICAgICAgICB5aWVsZAorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgYnl0ZXNfZmlsZW5hbWVfd2FybihleHBlY3RlZCk6CisgICAgbXNnID0gJ1RoZSBXaW5kb3dzIGJ5dGVzIEFQSSBoYXMgYmVlbiBkZXByZWNhdGVkJworICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgd2l0aCBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MobXNnLCBxdWlldD1ub3QgZXhwZWN0ZWQpOgorICAgICAgICAgICAgeWllbGQKKyAgICBlbHNlOgorICAgICAgICB5aWVsZAorCisKK2RlZiBjcmVhdGVfZmlsZShmaWxlbmFtZSwgY29udGVudD1iJ2NvbnRlbnQnKToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ4YiIsIDApIGFzIGZwOgorICAgICAgICBmcC53cml0ZShjb250ZW50KQorCisKICMgVGVzdHMgY3JlYXRpbmcgVEVTVEZOCiBjbGFzcyBGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTE0MCw5ICsxNjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBJTlRfTUFYIDwgUFlfU1NJWkVfVF9NQVgiKQogICAgIEBzdXBwb3J0LmJpZ21lbXRlc3Qoc2l6ZT1JTlRfTUFYICsgMTAsIG1lbXVzZT0xLCBkcnlfcnVuPUZhbHNlKQogICAgIGRlZiB0ZXN0X2xhcmdlX3JlYWQoc2VsZiwgc2l6ZSk6Ci0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShiJ3Rlc3QnKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYid0ZXN0JykKIAogICAgICAgICAjIElzc3VlICMyMTkzMjogTWFrZSBzdXJlIHRoYXQgb3MucmVhZCgpIGRvZXMgbm90IHJhaXNlIGFuCiAgICAgICAgICMgT3ZlcmZsb3dFcnJvciBmb3Igc2l6ZSBsYXJnZXIgdGhhbiBJTlRfTUFYCkBAIC0xOTksMTEgKzIyMCwxMiBAQAogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgVEVTVEZOMiA9IHN1cHBvcnQuVEVTVEZOICsgIi4yIgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICd3JykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoIjEiKQotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgiMiIpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIFRFU1RGTjIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgVEVTVEZOMikKKworICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYiIxIikKKyAgICAgICAgY3JlYXRlX2ZpbGUoVEVTVEZOMiwgYiIyIikKKwogICAgICAgICBvcy5yZXBsYWNlKHN1cHBvcnQuVEVTVEZOLCBURVNURk4yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhGaWxlTm90Rm91bmRFcnJvciwgb3Muc3RhdCwgc3VwcG9ydC5URVNURk4pCiAgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAncicpIGFzIGY6CkBAIC0yMjYsMTUgKzI0OCw5IEBACiAjIFRlc3QgYXR0cmlidXRlcyBvbiByZXR1cm4gdmFsdWVzIGZyb20gb3MuKnN0YXQqIGZhbWlseS4KIGNsYXNzIFN0YXRBdHRyaWJ1dGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBvcy5ta2RpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5mbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlRFU1RGTiwgImYxIikKLSAgICAgICAgZiA9IG9wZW4oc2VsZi5mbmFtZSwgJ3diJykKLSAgICAgICAgZi53cml0ZShiIkFCQyIpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBvcy51bmxpbmsoc2VsZi5mbmFtZSkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuZm5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZm5hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZm5hbWUsIGIiQUJDIikKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzdGF0JyksICd0ZXN0IG5lZWRzIG9zLnN0YXQoKScpCiAgICAgZGVmIGNoZWNrX3N0YXRfYXR0cmlidXRlcyhzZWxmLCBmbmFtZSk6CkBAIC0zMTAsOCArMzI2LDcgQEAKICAgICAgICAgICAgIGZuYW1lID0gc2VsZi5mbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IGVuY29kZSAlYSBmb3IgdGhlIGZpbGVzeXN0ZW0iICUgc2VsZi5mbmFtZSkKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKGZuYW1lKQogCiAgICAgZGVmIHRlc3Rfc3RhdF9yZXN1bHRfcGlja2xlKHNlbGYpOgpAQCAtNDI2LDcgKzQ0MSwxMSBAQAogICAgICAgICAgICAgMCkKIAogICAgICAgICAjIHRlc3QgZGlyZWN0b3J5IHN0X2ZpbGVfYXR0cmlidXRlcyAoRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZIHNldCkKLSAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZGlybmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgImRpciIKKyAgICAgICAgb3MubWtkaXIoZGlybmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJtZGlyLCBkaXJuYW1lKQorCisgICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoZGlybmFtZSkKICAgICAgICAgc2VsZi5jaGVja19maWxlX2F0dHJpYnV0ZXMocmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgcmVzdWx0LnN0X2ZpbGVfYXR0cmlidXRlcyAmIHN0YXQuRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZLApAQCAtNDQwLDE5ICs0NTksMTQgQEAKIAogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYuZGlybmFtZSkKICAgICAgICAgb3MubWtkaXIoc2VsZi5kaXJuYW1lKQotICAgICAgICB3aXRoIG9wZW4oc2VsZi5mbmFtZSwgJ3diJykgYXMgZnA6Ci0gICAgICAgICAgICBmcC53cml0ZShiIkFCQyIpCisgICAgICAgIGNyZWF0ZV9maWxlKHNlbGYuZm5hbWUpCiAKICAgICAgICAgZGVmIHJlc3RvcmVfZmxvYXRfdGltZXMoc3RhdGUpOgotICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncygnc3RhdF9mbG9hdF90aW1lcycpOgogICAgICAgICAgICAgICAgIG9zLnN0YXRfZmxvYXRfdGltZXMoc3RhdGUpCiAKICAgICAgICAgIyBlbnN1cmUgdGhhdCBzdF9hdGltZSBhbmQgc3RfbXRpbWUgYXJlIGZsb2F0Ci0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotCisgICAgICAgIHdpdGggaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKCdzdGF0X2Zsb2F0X3RpbWVzJyk6CiAgICAgICAgICAgICBvbGRfZmxvYXRfdGltZXMgPSBvcy5zdGF0X2Zsb2F0X3RpbWVzKC0xKQogICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfZmxvYXRfdGltZXMsIG9sZF9mbG9hdF90aW1lcykKIApAQCAtNTQ0LDcgKzU1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImZkIHN1cHBvcnQgZm9yIHV0aW1lIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuIikKICAgICBkZWYgdGVzdF91dGltZV9mZChzZWxmKToKICAgICAgICAgZGVmIHNldF90aW1lKGZpbGVuYW1lLCBucyk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICAjIHVzZSBhIGZpbGUgZGVzY3JpcHRvciB0byB0ZXN0IGZ1dGltZW5zKHRpbWVzcGVjKQogICAgICAgICAgICAgICAgICMgb3IgZnV0aW1lcyh0aW1ldmFsKQogICAgICAgICAgICAgICAgIG9zLnV0aW1lKGZwLmZpbGVubygpLCBucz1ucykKQEAgLTc5OCw2ICs4MTIsNyBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBqb2luID0gb3MucGF0aC5qb2luCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc3VwcG9ydC5URVNURk4pCiAKICAgICAgICAgIyBCdWlsZDoKICAgICAgICAgIyAgICAgVEVTVEZOLwpAQCAtODMwLDkgKzg0NSw4IEBACiAgICAgICAgIG9zLm1ha2VkaXJzKHQyX3BhdGgpCiAKICAgICAgICAgZm9yIHBhdGggaW4gdG1wMV9wYXRoLCB0bXAyX3BhdGgsIHRtcDNfcGF0aCwgdG1wNF9wYXRoOgotICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQotICAgICAgICAgICAgZi53cml0ZSgiSSdtICIgKyBwYXRoICsgIiBhbmQgcHJvdWQgb2YgaXQuICBCbGFtZSB0ZXN0X29zLlxuIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ4IikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJJJ20gIiArIHBhdGggKyAiIGFuZCBwcm91ZCBvZiBpdC4gIEJsYW1lIHRlc3Rfb3MuXG4iKQogCiAgICAgICAgIGlmIHN1cHBvcnQuY2FuX3N5bWxpbmsoKToKICAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5hYnNwYXRoKHQyX3BhdGgpLCBzZWxmLmxpbmtfcGF0aCkKQEAgLTg3OCw3ICs4OTIsNyBAQAogICAgICAgICAjIFdhbGsgYm90dG9tLXVwLgogICAgICAgICBhbGwgPSBsaXN0KHNlbGYud2FsayhzZWxmLndhbGtfcGF0aCwgdG9wZG93bj1GYWxzZSkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsKSwgNCwgYWxsKQogICAgICAgICAjIFdlIGNhbid0IGtub3cgd2hpY2ggb3JkZXIgU1VCMSBhbmQgU1VCMiB3aWxsIGFwcGVhciBpbi4KICAgICAgICAgIyBOb3QgZmxpcHBlZDogIFNVQjExLCBTVUIxLCBTVUIyLCBURVNURk4KICAgICAgICAgIyAgICAgZmxpcHBlZDogIFNVQjIsIFNVQjExLCBTVUIxLCBURVNURk4KQEAgLTkwOCwyMiArOTIyLDYgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGZvbGxvdyBzeW1saW5rIHdpdGggZm9sbG93bGlua3M9VHJ1ZSIpCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICMgVGVhciBldmVyeXRoaW5nIGRvd24uICBUaGlzIGlzIGEgZGVjZW50IHVzZSBmb3IgYm90dG9tLXVwIG9uCi0gICAgICAgICMgV2luZG93cywgd2hpY2ggZG9lc24ndCBoYXZlIGEgcmVjdXJzaXZlIGRlbGV0ZSBjb21tYW5kLiAgVGhlCi0gICAgICAgICMgKG5vdCBzbykgc3VidGxldHkgaXMgdGhhdCBybWRpciB3aWxsIGZhaWwgdW5sZXNzIHRoZSBkaXIncwotICAgICAgICAjIGtpZHMgYXJlIHJlbW92ZWQgZmlyc3QsIHNvIGJvdHRvbSB1cCBpcyBlc3NlbnRpYWwuCi0gICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHN1cHBvcnQuVEVTVEZOLCB0b3Bkb3duPUZhbHNlKToKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgotICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgotICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKLSAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2xpbmsoZGlybmFtZSk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRpcm5hbWUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRpcm5hbWUpCi0gICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotCiAgICAgZGVmIHRlc3Rfd2Fsa19iYWRfZGlyKHNlbGYpOgogICAgICAgICAjIFdhbGsgdG9wLWRvd24uCiAgICAgICAgIGVycm9ycyA9IFtdCkBAIC0xMDA2LDI3ICsxMDA0LDEzIEBACiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgbmV3ZmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZmQsIG1pbmZkKQogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICAjIGNsZWFudXAKLSAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzLCByb290ZmQgaW4gb3MuZndhbGsoc3VwcG9ydC5URVNURk4sIHRvcGRvd249RmFsc2UpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgotICAgICAgICAgICAgICAgIHN0ID0gb3Muc3RhdChuYW1lLCBkaXJfZmQ9cm9vdGZkLCBmb2xsb3dfc3ltbGlua3M9RmFsc2UpCi0gICAgICAgICAgICAgICAgaWYgc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpOgotICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihuYW1lLCBkaXJfZmQ9cm9vdGZkKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lLCBkaXJfZmQ9cm9vdGZkKQotICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLQogY2xhc3MgQnl0ZXNXYWxrVGVzdHMoV2Fsa1Rlc3RzKToKICAgICAiIiJUZXN0cyBmb3Igb3Mud2FsaygpIHdpdGggYnl0ZXMuIiIiCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzdXBlcigpLnNldFVwKCkKICAgICAgICAgc2VsZi5zdGFjayA9IGNvbnRleHRsaWIuRXhpdFN0YWNrKCkKICAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgotICAgICAgICAgICAgc2VsZi5zdGFjay5lbnRlcl9jb250ZXh0KHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCkpCi0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuc3RhY2suZW50ZXJfY29udGV4dChieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5zdGFjay5jbG9zZSgpCkBAIC0xMjAzLDggKzExODcsNyBAQAogICAgICAgICBvcy5ta2RpcihkaXJhKQogICAgICAgICBkaXJiID0gb3MucGF0aC5qb2luKGRpcmEsICdkaXJiJykKICAgICAgICAgb3MubWtkaXIoZGlyYikKLSAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkaXJhLCAnZmlsZS50eHQnKSwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgndGV4dCcpCisgICAgICAgIGNyZWF0ZV9maWxlKG9zLnBhdGguam9pbihkaXJhLCAnZmlsZS50eHQnKSkKICAgICAgICAgb3MucmVtb3ZlZGlycyhkaXJiKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKGRpcmIpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZGlyYSkpCkBAIC0xMjE1LDggKzExOTgsNyBAQAogICAgICAgICBvcy5ta2RpcihkaXJhKQogICAgICAgICBkaXJiID0gb3MucGF0aC5qb2luKGRpcmEsICdkaXJiJykKICAgICAgICAgb3MubWtkaXIoZGlyYikKLSAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkaXJiLCAnZmlsZS50eHQnKSwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgndGV4dCcpCisgICAgICAgIGNyZWF0ZV9maWxlKG9zLnBhdGguam9pbihkaXJiLCAnZmlsZS50eHQnKSkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKToKICAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMoZGlyYikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGRpcmIpKQpAQCAtMTIyNiw3ICsxMjA4LDcgQEAKIAogY2xhc3MgRGV2TnVsbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZXZudWxsKHNlbGYpOgotICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3diJykgYXMgZjoKKyAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICd3YicsIDApIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKGInaGVsbG8nKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAncmInKSBhcyBmOgpAQCAtMTMxMyw5ICsxMjk1LDkgQEAKICAgICBkZWYgdGVzdF91cmFuZG9tX2ZkX3Jlb3BlbmVkKHNlbGYpOgogICAgICAgICAjIElzc3VlICMyMTIwNzogdXJhbmRvbSgpIHNob3VsZCBkZXRlY3QgaXRzIGZkIHRvIC9kZXYvdXJhbmRvbQogICAgICAgICAjIGNoYW5nZWQgdG8gc29tZXRoaW5nIGVsc2UsIGFuZCByZW9wZW4gaXQuCi0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoYiJ4IiAqIDI1NikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBiIngiICogMjU2KQorCiAgICAgICAgIGNvZGUgPSAiIiJpZiAxOgogICAgICAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgICAgICBpbXBvcnQgc3lzCkBAIC0xNDQ0LDYgKzE0MjYsMTggQEAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCiBjbGFzcyBXaW4zMkVycm9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Muc3RhdChzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgZXhpc3RzID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgZXhpc3RzID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5mYWlsKCJmaWxlICVzIG11c3Qgbm90IGV4aXN0OyBvcy5zdGF0IGZhaWxlZCB3aXRoICVzIgorICAgICAgICAgICAgICAgICAgICAgICUgKHN1cHBvcnQuVEVTVEZOLCBleGMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmaWxlICVzIG11c3Qgbm90IGV4aXN0IiAlIHN1cHBvcnQuVEVTVEZOKQorCiAgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5yZW5hbWUsIHN1cHBvcnQuVEVTVEZOLCBzdXBwb3J0LlRFU1RGTisiLmJhayIpCiAKQEAgLTE0NTQsMTIgKzE0NDgsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MuY2hkaXIsIHN1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3RfbWtkaXIoc2VsZik6Ci0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpCi0gICAgICAgIHRyeToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICJ4IikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLm1rZGlyLCBzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgb3MudW5saW5rKHN1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3RfdXRpbWUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLnV0aW1lLCBzdXBwb3J0LlRFU1RGTiwgTm9uZSkKQEAgLTE0NjcsNiArMTQ1OSw3IEBACiAgICAgZGVmIHRlc3RfY2htb2Qoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLmNobW9kLCBzdXBwb3J0LlRFU1RGTiwgMCkKIAorCiBjbGFzcyBUZXN0SW52YWxpZEZEKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBzaW5nbGVzID0gWyJmY2hkaXIiLCAiZHVwIiwgImZkb3BlbiIsICJmZGF0YXN5bmMiLCAiZnN0YXQiLAogICAgICAgICAgICAgICAgImZzdGF0dmZzIiwgImZzeW5jIiwgInRjZ2V0cGdycCIsICJ0dHluYW1lIl0KQEAgLTE1NzgsMTEgKzE1NzEsOSBAQAogICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlKQogCiAgICAgZGVmIF90ZXN0X2xpbmsoc2VsZiwgZmlsZTEsIGZpbGUyKToKLSAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAidyIpIGFzIGYxOgotICAgICAgICAgICAgZjEud3JpdGUoInRlc3QiKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlMSkKIAotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKToKICAgICAgICAgICAgIG9zLmxpbmsoZmlsZTEsIGZpbGUyKQogICAgICAgICB3aXRoIG9wZW4oZmlsZTEsICJyIikgYXMgZjEsIG9wZW4oZmlsZTIsICJyIikgYXMgZjI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5zYW1lb3BlbmZpbGUoZjEuZmlsZW5vKCksIGYyLmZpbGVubygpKSkKQEAgLTE4NzQsMTAgKzE4NjUsMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihzdXBwb3J0LlRFU1RGTikpLAogICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlZF9wYXRocykKKwogICAgICAgICAjIGJ5dGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSksCi0gICAgICAgICAgICAgICAgW29zLmZzZW5jb2RlKHBhdGgpIGZvciBwYXRoIGluIHNlbGYuY3JlYXRlZF9wYXRoc10pCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikpKSwKKyAgICAgICAgICAgICAgICAgICAgW29zLmZzZW5jb2RlKHBhdGgpIGZvciBwYXRoIGluIHNlbGYuY3JlYXRlZF9wYXRoc10pCiAKICAgICBkZWYgdGVzdF9saXN0ZGlyX2V4dGVuZGVkX3BhdGgoc2VsZik6CiAgICAgICAgICIiIlRlc3Qgd2hlbiB0aGUgcGF0aCBzdGFydHMgd2l0aCAnXFxcXD9cXCcuIiIiCkBAIC0xODg3LDExICsxODgwLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIocGF0aCkpLAogICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlZF9wYXRocykKKwogICAgICAgICAjIGJ5dGVzCi0gICAgICAgIHBhdGggPSBiJ1xcXFw/XFwnICsgb3MuZnNlbmNvZGUob3MucGF0aC5hYnNwYXRoKHN1cHBvcnQuVEVTVEZOKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihwYXRoKSksCi0gICAgICAgICAgICAgICAgW29zLmZzZW5jb2RlKHBhdGgpIGZvciBwYXRoIGluIHNlbGYuY3JlYXRlZF9wYXRoc10pCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSk6CisgICAgICAgICAgICBwYXRoID0gYidcXFxcP1xcJyArIG9zLmZzZW5jb2RlKG9zLnBhdGguYWJzcGF0aChzdXBwb3J0LlRFU1RGTikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihwYXRoKSksCisgICAgICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQpAQCAtMTk2Niw1MSArMTk2MSw0NSBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9zLmxzdGF0KGxpbmspLCBvcy5zdGF0KGxpbmspKQogCiAgICAgICAgIGJ5dGVzX2xpbmsgPSBvcy5mc2VuY29kZShsaW5rKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGJ5dGVzX2xpbmspLCBvcy5zdGF0KHRhcmdldCkpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3MubHN0YXQoYnl0ZXNfbGluayksIG9zLnN0YXQoYnl0ZXNfbGluaykpCiAKICAgICBkZWYgdGVzdF8xMjA4NChzZWxmKToKICAgICAgICAgbGV2ZWwxID0gb3MucGF0aC5hYnNwYXRoKHN1cHBvcnQuVEVTVEZOKQogICAgICAgICBsZXZlbDIgPSBvcy5wYXRoLmpvaW4obGV2ZWwxLCAibGV2ZWwyIikKICAgICAgICAgbGV2ZWwzID0gb3MucGF0aC5qb2luKGxldmVsMiwgImxldmVsMyIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgbGV2ZWwxKQorCisgICAgICAgIG9zLm1rZGlyKGxldmVsMSkKKyAgICAgICAgb3MubWtkaXIobGV2ZWwyKQorICAgICAgICBvcy5ta2RpcihsZXZlbDMpCisKKyAgICAgICAgZmlsZTEgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGxldmVsMSwgImZpbGUxIikpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGUxKQorCisgICAgICAgIG9yaWdfZGlyID0gb3MuZ2V0Y3dkKCkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwxKQotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwyKQotICAgICAgICAgICAgb3MubWtkaXIobGV2ZWwzKQorICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwyKQorICAgICAgICAgICAgbGluayA9IG9zLnBhdGguam9pbihsZXZlbDIsICJsaW5rIikKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5yZWxwYXRoKGZpbGUxKSwgImxpbmsiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibGluayIsIG9zLmxpc3RkaXIob3MuZ2V0Y3dkKCkpKQogCi0gICAgICAgICAgICBmaWxlMSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4obGV2ZWwxLCAiZmlsZTEiKSkKKyAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIHRoZSBzYW1lIGRpciBhcyB0aGUgbGluaworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwgb3Muc3RhdCgibGluayIpKQogCi0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZTEsICJ3IikgYXMgZjoKLSAgICAgICAgICAgICAgICBmLndyaXRlKCJmaWxlMSIpCisgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBiZWxvdyB0aGUgbGluaworICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQogCi0gICAgICAgICAgICBvcmlnX2RpciA9IG9zLmdldGN3ZCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwyKQotICAgICAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4obGV2ZWwyLCAibGluayIpCi0gICAgICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLnJlbHBhdGgoZmlsZTEpLCAibGluayIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibGluayIsIG9zLmxpc3RkaXIob3MuZ2V0Y3dkKCkpKQotCi0gICAgICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gdGhlIHNhbWUgZGlyIGFzIHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwgb3Muc3RhdCgibGluayIpKQotCi0gICAgICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYmVsb3cgdGhlIGxpbmsKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGFib3ZlIHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwzKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdfZGlyKQotICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoZXJyKQorICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYWJvdmUgdGhlIGxpbmsKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlMSkKLSAgICAgICAgICAgIHNodXRpbC5ybXRyZWUobGV2ZWwxKQorICAgICAgICAgICAgb3MuY2hkaXIob3JpZ19kaXIpCiAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCkBAIC0yMTQ2LDggKzIxMzUsOCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBuZXdfcHJpbyA9IG9zLmdldHByaW9yaXR5KG9zLlBSSU9fUFJPQ0VTUywgb3MuZ2V0cGlkKCkpCiAgICAgICAgICAgICBpZiBiYXNlID49IDE5IGFuZCBuZXdfcHJpbyA8PSAxOToKLSAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgKLSAgICAgICJ1bmFibGUgdG8gcmVsaWFibHkgdGVzdCBzZXRwcmlvcml0eSBhdCBjdXJyZW50IG5pY2UgbGV2ZWwgb2YgJXMiICUgYmFzZSkKKyAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidW5hYmxlIHRvIHJlbGlhYmx5IHRlc3Qgc2V0cHJpb3JpdHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBjdXJyZW50IG5pY2UgbGV2ZWwgb2YgJXMiICUgYmFzZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfcHJpbywgYmFzZSArIDEpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0yMjU3LDggKzIyNDYsNyBAQAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgIGNscy5rZXkgPSBzdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCi0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoY2xzLkRBVEEpCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBjbHMuREFUQSkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CkBAIC0yNDA4LDEwICsyMzk2LDExIEBACiAgICAgZGVmIHRlc3RfdHJhaWxlcnMoc2VsZik6CiAgICAgICAgIFRFU1RGTjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgogICAgICAgICBmaWxlX2RhdGEgPSBiImFiY2RlZiIKLSAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICd3YicpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGZpbGVfZGF0YSkKLSAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdyYicpYXMgZjoKLSAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIFRFU1RGTjIpCisKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBURVNURk4yKQorICAgICAgICBjcmVhdGVfZmlsZShURVNURk4yLCBmaWxlX2RhdGEpCisKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdyYicpIGFzIGY6CiAgICAgICAgICAgICBvcy5zZW5kZmlsZShzZWxmLnNvY2tubywgZi5maWxlbm8oKSwgMCwgbGVuKGZpbGVfZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGVycz1bYiIxMjM0Il0pCiAgICAgICAgICAgICBzZWxmLmNsaWVudC5jbG9zZSgpCkBAIC0yNDM0LDM1ICsyNDIzLDM3IEBACiBkZWYgc3VwcG9ydHNfZXh0ZW5kZWRfYXR0cmlidXRlcygpOgogICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic2V0eGF0dHIiKToKICAgICAgICAgcmV0dXJuIEZhbHNlCisKICAgICB0cnk6Ci0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZnA6CisgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgInhiIiwgMCkgYXMgZnA6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgb3Muc2V0eGF0dHIoZnAuZmlsZW5vKCksIGIidXNlci50ZXN0IiwgYiIiKQogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgZmluYWxseToKICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCi0gICAgIyBLZXJuZWxzIDwgMi42LjM5IGRvbid0IHJlc3BlY3Qgc2V0eGF0dHIgZmxhZ3MuCi0gICAga2VybmVsX3ZlcnNpb24gPSBwbGF0Zm9ybS5yZWxlYXNlKCkKLSAgICBtID0gcmUubWF0Y2goIjIuNi4oXGR7MSwyfSkiLCBrZXJuZWxfdmVyc2lvbikKLSAgICByZXR1cm4gbSBpcyBOb25lIG9yIGludChtLmdyb3VwKDEpKSA+PSAzOQorCisgICAgcmV0dXJuIFRydWUKIAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzdXBwb3J0c19leHRlbmRlZF9hdHRyaWJ1dGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAibm8gbm9uLWJyb2tlbiBleHRlbmRlZCBhdHRyaWJ1dGUgc3VwcG9ydCIpCisjIEtlcm5lbHMgPCAyLjYuMzkgZG9uJ3QgcmVzcGVjdCBzZXR4YXR0ciBmbGFncy4KK0BzdXBwb3J0LnJlcXVpcmVzX2xpbnV4X3ZlcnNpb24oMiwgNiwgMzkpCiBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCi0KICAgICBkZWYgX2NoZWNrX3hhdHRyc19zdHIoc2VsZiwgcywgZ2V0eGF0dHIsIHNldHhhdHRyLCByZW1vdmV4YXR0ciwgbGlzdHhhdHRyLCAqKmt3YXJncyk6CiAgICAgICAgIGZuID0gc3VwcG9ydC5URVNURk4KLSAgICAgICAgb3BlbihmbiwgIndiIikuY2xvc2UoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZuKQorICAgICAgICBjcmVhdGVfZmlsZShmbikKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgZ2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVOT0RBVEEpCisKICAgICAgICAgaW5pdF94YXR0ciA9IGxpc3R4YXR0cihmbikKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluaXRfeGF0dHIsIGxpc3QpCisKICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiIiIsICoqa3dhcmdzKQogICAgICAgICB4YXR0ciA9IHNldChpbml0X3hhdHRyKQogICAgICAgICB4YXR0ci5hZGQoInVzZXIudGVzdCIpCkBAIC0yNDcwLDE5ICsyNDYxLDI0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0eGF0dHIoZm4sIGIidXNlci50ZXN0IiwgKiprd2FyZ3MpLCBiIiIpCiAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgYiJoZWxsbyIsIG9zLlhBVFRSX1JFUExBQ0UsICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldHhhdHRyKGZuLCBiInVzZXIudGVzdCIsICoqa3dhcmdzKSwgYiJoZWxsbyIpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgYiJieWUiLCBvcy5YQVRUUl9DUkVBVEUsICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUVYSVNUKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0MiIpLCBiImJ5ZSIsIG9zLlhBVFRSX1JFUExBQ0UsICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0MiIpLCBiImZvbyIsIG9zLlhBVFRSX0NSRUFURSwgKiprd2FyZ3MpCiAgICAgICAgIHhhdHRyLmFkZCgidXNlci50ZXN0MiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxpc3R4YXR0cihmbikpLCB4YXR0cikKICAgICAgICAgcmVtb3ZleGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCAqKmt3YXJncykKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgZ2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVOT0RBVEEpCisKICAgICAgICAgeGF0dHIucmVtb3ZlKCJ1c2VyLnRlc3QiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsaXN0eGF0dHIoZm4pKSwgeGF0dHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdDIiKSwgKiprd2FyZ3MpLCBiImZvbyIpCkBAIC0yNDk1LDExICsyNDkxLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxpc3R4YXR0cihmbikpLCBzZXQoaW5pdF94YXR0cikgfCBzZXQobWFueSkpCiAKICAgICBkZWYgX2NoZWNrX3hhdHRycyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgICBkZWYgbWFrZV9ieXRlcyhzKToKLSAgICAgICAgICAgIHJldHVybiBieXRlcyhzLCAiYXNjaWkiKQogICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKHN0ciwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5fY2hlY2tfeGF0dHJzX3N0cihtYWtlX2J5dGVzLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfeGF0dHJzX3N0cihvcy5mc2VuY29kZSwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tfeGF0dHJzKG9zLmdldHhhdHRyLCBvcy5zZXR4YXR0ciwgb3MucmVtb3ZleGF0dHIsCkBAIC0yNTE0LDEwICsyNTEwLDEwIEBACiAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgZnA6CiAgICAgICAgICAgICAgICAgcmV0dXJuIG9zLmdldHhhdHRyKGZwLmZpbGVubygpLCAqYXJncykKICAgICAgICAgZGVmIHNldHhhdHRyKHBhdGgsICphcmdzKToKLSAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvcy5zZXR4YXR0cihmcC5maWxlbm8oKSwgKmFyZ3MpCiAgICAgICAgIGRlZiByZW1vdmV4YXR0cihwYXRoLCAqYXJncyk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgZnA6CisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIiwgMCkgYXMgZnA6CiAgICAgICAgICAgICAgICAgb3MucmVtb3ZleGF0dHIoZnAuZmlsZW5vKCksICphcmdzKQogICAgICAgICBkZWYgbGlzdHhhdHRyKHBhdGgsICphcmdzKToKICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAicmIiKSBhcyBmcDoKQEAgLTI1MzAsMzYgKzI1MjYsMzkgQEAKICAgICBkZWYgdGVzdF9kZXByZWNhdGVkKHNlbGYpOgogICAgICAgICBpbXBvcnQgbnQKICAgICAgICAgZmlsZW5hbWUgPSBvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJlcnJvciIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIGZvciBmdW5jLCAqYXJncyBpbiAoCi0gICAgICAgICAgICAgICAgKG50Ll9nZXRmdWxscGF0aG5hbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAobnQuX2lzZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmFjY2VzcywgZmlsZW5hbWUsIG9zLlJfT0spLAotICAgICAgICAgICAgICAgIChvcy5jaGRpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5jaG1vZCwgZmlsZW5hbWUsIDBvNzc3KSwKLSAgICAgICAgICAgICAgICAob3MuZ2V0Y3dkYiwpLAotICAgICAgICAgICAgICAgIChvcy5saW5rLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5saXN0ZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmxzdGF0LCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLm1rZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLm9wZW4sIGZpbGVuYW1lLCBvcy5PX1JET05MWSksCi0gICAgICAgICAgICAgICAgKG9zLnJlbmFtZSwgZmlsZW5hbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Mucm1kaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Muc3RhcnRmaWxlLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnN0YXQsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MudW5saW5rLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnV0aW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZywgZnVuYywgKmFyZ3MpCisgICAgICAgIGZvciBmdW5jLCAqYXJncyBpbiAoCisgICAgICAgICAgICAobnQuX2dldGZ1bGxwYXRobmFtZSwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG50Ll9pc2RpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLmFjY2VzcywgZmlsZW5hbWUsIG9zLlJfT0spLAorICAgICAgICAgICAgKG9zLmNoZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MuY2htb2QsIGZpbGVuYW1lLCAwbzc3NyksCisgICAgICAgICAgICAob3MuZ2V0Y3dkYiwpLAorICAgICAgICAgICAgKG9zLmxpbmssIGZpbGVuYW1lLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MubGlzdGRpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLmxzdGF0LCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MubWtkaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5vcGVuLCBmaWxlbmFtZSwgb3MuT19SRE9OTFkpLAorICAgICAgICAgICAgKG9zLnJlbmFtZSwgZmlsZW5hbWUsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5ybWRpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnN0YXJ0ZmlsZSwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnN0YXQsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy51bmxpbmssIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy51dGltZSwgZmlsZW5hbWUpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygqYXJncykKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBpZ25vcmUgT1NFcnJvciwgd2Ugb25seSBjYXJlIGFib3V0IERlcHJlY2F0aW9uV2FybmluZworICAgICAgICAgICAgICAgICAgICBwYXNzCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc3ltbGluayhzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKwogICAgICAgICBmaWxlbmFtZSA9IG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImVycm9yIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3ltbGluaywgZmlsZW5hbWUsIGZpbGVuYW1lKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICBvcy5zeW1saW5rKGZpbGVuYW1lLCBmaWxlbmFtZSkKIAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZ2V0X3Rlcm1pbmFsX3NpemUnKSwgInJlcXVpcmVzIG9zLmdldF90ZXJtaW5hbF9zaXplIikKQEAgLTI2OTcsNyArMjY5Niw4IEBACiAgICAgICAgIGZvciBmaWxlbmFtZXMsIGZ1bmMsICpmdW5jX2FyZ3MgaW4gZnVuY3M6CiAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBmdW5jKG5hbWUsICpmdW5jX2FyZ3MpCisgICAgICAgICAgICAgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jKG5hbWUsICpmdW5jX2FyZ3MpCiAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGVyci5maWxlbmFtZSwgbmFtZSkKICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMjgyMCw2ICsyODIwLDggQEAKIAogCiBjbGFzcyBUZXN0U2NhbmRpcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZyA9IHN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZworCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHN1cHBvcnQuVEVTVEZOKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYucGF0aCkKQEAgLTI4MjcsOCArMjgyOSw3IEBACiAKICAgICBkZWYgY3JlYXRlX2ZpbGUoc2VsZiwgbmFtZT0iZmlsZS50eHQiKToKICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYidweXRob24nKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidweXRob24nKQogICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogICAgIGRlZiBnZXRfZW50cmllcyhzZWxmLCBuYW1lcyk6CkBAIC0zMDEwLDcgKzMwMTEsOCBAQAogICAgIGRlZiB0ZXN0X2J5dGVzKHNlbGYpOgogICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLnNjYW5kaXIoYnl0ZXMpIG11c3QgcmFpc2UgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9zLnNjYW5kaXIsIGInLicpCisgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQpAQCAtMzA0Miw2ICszMDQ0LDU2IEBACiAgICAgICAgIGZvciBvYmogaW4gWzEyMzQsIDEuMjM0LCB7fSwgW11dOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBvYmopCiAKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisgICAgICAgICMgbXVsdGlwbGUgY2xvc2VzCisgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggb3Muc2NhbmRpcihzZWxmLnBhdGgpIGFzIGl0ZXJhdG9yOgorICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggb3Muc2NhbmRpcihzZWxmLnBhdGgpIGFzIGl0ZXJhdG9yOgorICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICAgICAgICAgIDEvMAorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKKyAgICBkZWYgdGVzdF9yZXNvdXJjZV93YXJuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIGl0ZXJhdG9yID0gb3Muc2NhbmRpcihzZWxmLnBhdGgpCisgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhSZXNvdXJjZVdhcm5pbmcpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisgICAgICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICAjIGV4aGF1c3RlZCBpdGVyYXRvcgorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBsaXN0KGl0ZXJhdG9yKQorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQppbmRleCAyNDdhNmIzLi5iMzJjOWZiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CkBAIC0xNTAxLDEzICsxNTAxLDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHAuZ2xvYigiZGlyQS8uLi9maWxlKiIpKSwgeyBQKEJBU0UsICJkaXJBLy4uL2ZpbGVBIikgfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocC5nbG9iKCIuLi94eXp6eSIpKSwgc2V0KCkpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfcmVsYXRpdmUoc2VsZiwgcCwgZXhwZWN0ZWQpOgorCisgICAgZGVmIF9jaGVja19yZXNvbHZlKHNlbGYsIHAsIGV4cGVjdGVkKToKICAgICAgICAgcSA9IHAucmVzb2x2ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgZXhwZWN0ZWQpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfYWJzb2x1dGUoc2VsZiwgcCwgZXhwZWN0ZWQpOgotICAgICAgICBxID0gcC5yZXNvbHZlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBleHBlY3RlZCkKKyAgICAjIHRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYm90aCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcmVzb2x1dGlvbnMKKyAgICBfY2hlY2tfcmVzb2x2ZV9yZWxhdGl2ZSA9IF9jaGVja19yZXNvbHZlX2Fic29sdXRlID0gX2NoZWNrX3Jlc29sdmUKIAogICAgIEB3aXRoX3N5bWxpbmtzCiAgICAgZGVmIHRlc3RfcmVzb2x2ZV9jb21tb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CmluZGV4IDQxZTUwOTEuLmIwMzM2NDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CkBAIC0xLDkgKzEsOCBAQAogaW1wb3J0IGRpcwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCi1mcm9tIGlvIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gbWF0aCBpbXBvcnQgY29weXNpZ24KIAogZnJvbSB0ZXN0LmJ5dGVjb2RlX2hlbHBlciBpbXBvcnQgQnl0ZWNvZGVUZXN0Q2FzZQogCkBAIC0zMCwyMiArMjksMjUgQEAKIAogICAgIGRlZiB0ZXN0X2dsb2JhbF9hc19jb25zdGFudChzZWxmKToKICAgICAgICAgIyBMT0FEX0dMT0JBTCBOb25lL1RydWUvRmFsc2UgIC0tPiAgTE9BRF9DT05TVCBOb25lL1RydWUvRmFsc2UKLSAgICAgICAgZGVmIGYoeCk6Ci0gICAgICAgICAgICBOb25lCi0gICAgICAgICAgICBOb25lCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICB4ID0gTm9uZQorICAgICAgICAgICAgeCA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGRlZiBnKHgpOgotICAgICAgICAgICAgVHJ1ZQorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgeCA9IFRydWUKICAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGRlZiBoKHgpOgotICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgIHggPSBGYWxzZQogICAgICAgICAgICAgcmV0dXJuIHgKKwogICAgICAgICBmb3IgZnVuYywgZWxlbSBpbiAoKGYsIE5vbmUpLCAoZywgVHJ1ZSksIChoLCBGYWxzZSkpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbkJ5dGVjb2RlKGZ1bmMsICdMT0FEX0dMT0JBTCcpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluQnl0ZWNvZGUoZnVuYywgJ0xPQURfQ09OU1QnLCBlbGVtKQorCiAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICAnQWRkaW5nIGEgZG9jc3RyaW5nIG1hZGUgdGhpcyB0ZXN0IGZhaWwgaW4gUHkyLjUuMCcKICAgICAgICAgICAgIHJldHVybiBOb25lCisKICAgICAgICAgc2VsZi5hc3NlcnROb3RJbkJ5dGVjb2RlKGYsICdMT0FEX0dMT0JBTCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW5CeXRlY29kZShmLCAnTE9BRF9DT05TVCcsIE5vbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5IGIvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKaW5kZXggZWU3YTY2Ny4uZTJiYTFhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKQEAgLTMzLDggKzMzLDYgQEAKIAogICAgIHVucGlja2xlciA9IHBpY2tsZS5fVW5waWNrbGVyCiAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChJbmRleEVycm9yLCkKLSAgICBiYWRfbWFya19lcnJvcnMgPSAoSW5kZXhFcnJvciwgcGlja2xlLlVucGlja2xpbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgRU9GRXJyb3IpCiAgICAgdHJ1bmNhdGVkX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBFT0ZFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmVycm9yLCBJbmRleEVycm9yLCBJbXBvcnRFcnJvcikKQEAgLTY5LDggKzY3LDYgQEAKICAgICBwaWNrbGVyID0gcGlja2xlLl9QaWNrbGVyCiAgICAgdW5waWNrbGVyID0gcGlja2xlLl9VbnBpY2tsZXIKICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEluZGV4RXJyb3IpCi0gICAgYmFkX21hcmtfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEluZGV4RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKQogICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvciwgSW5kZXhFcnJvciwgSW1wb3J0RXJyb3IpCkBAIC0xMzIsNyArMTI4LDYgQEAKICAgICBjbGFzcyBDVW5waWNrbGVyVGVzdHMoUHlVbnBpY2tsZXJUZXN0cyk6CiAgICAgICAgIHVucGlja2xlciA9IF9waWNrbGUuVW5waWNrbGVyCiAgICAgICAgIGJhZF9zdGFja19lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwpCi0gICAgICAgIGJhZF9tYXJrX2Vycm9ycyA9IChFT0ZFcnJvciwpCiAgICAgICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CmluZGV4IGJiZTY4NzUuLjgwMjIxZjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQpAQCAtNCw2ICs0LDcgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgQWJzdHJhY3RQaWNrbGVUZXN0cwogZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cworaW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIE9wdGltaXplZFBpY2tsZVRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMsIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMpOgogCkBAIC01OSw4ICs2MCw0MCBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEluKHBpY2tsZS5CSU5QVVQsIHBpY2tsZWQyKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2J5dGVzX3R5cGVzJywKKyAgICAgICAgICAgICAgICAgICAgICdVUF9UT19ORVdMSU5FJywgJ1RBS0VOX0ZST01fQVJHVU1FTlQxJywKKyAgICAgICAgICAgICAgICAgICAgICdUQUtFTl9GUk9NX0FSR1VNRU5UNCcsICdUQUtFTl9GUk9NX0FSR1VNRU5UNFUnLAorICAgICAgICAgICAgICAgICAgICAgJ1RBS0VOX0ZST01fQVJHVU1FTlQ4VScsICdBcmd1bWVudERlc2NyaXB0b3InLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdWludDEnLCAncmVhZF91aW50MicsICdyZWFkX2ludDQnLCAncmVhZF91aW50NCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91aW50OCcsICdyZWFkX3N0cmluZ25sJywgJ3JlYWRfc3RyaW5nbmxfbm9lc2NhcGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfc3RyaW5nbmxfbm9lc2NhcGVfcGFpcicsICdyZWFkX3N0cmluZzEnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfc3RyaW5nNCcsICdyZWFkX2J5dGVzMScsICdyZWFkX2J5dGVzNCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9ieXRlczgnLCAncmVhZF91bmljb2Rlc3RyaW5nbmwnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdW5pY29kZXN0cmluZzEnLCAncmVhZF91bmljb2Rlc3RyaW5nNCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91bmljb2Rlc3RyaW5nOCcsICdyZWFkX2RlY2ltYWxubF9zaG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9kZWNpbWFsbmxfbG9uZycsICdyZWFkX2Zsb2F0bmwnLCAncmVhZF9mbG9hdDgnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfbG9uZzEnLCAncmVhZF9sb25nNCcsCisgICAgICAgICAgICAgICAgICAgICAndWludDEnLCAndWludDInLCAnaW50NCcsICd1aW50NCcsICd1aW50OCcsICdzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nbmxfbm9lc2NhcGUnLCAnc3RyaW5nbmxfbm9lc2NhcGVfcGFpcicsICdzdHJpbmcxJywKKyAgICAgICAgICAgICAgICAgICAgICdzdHJpbmc0JywgJ2J5dGVzMScsICdieXRlczQnLCAnYnl0ZXM4JywKKyAgICAgICAgICAgICAgICAgICAgICd1bmljb2Rlc3RyaW5nbmwnLCAndW5pY29kZXN0cmluZzEnLCAndW5pY29kZXN0cmluZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVzdHJpbmc4JywgJ2RlY2ltYWxubF9zaG9ydCcsICdkZWNpbWFsbmxfbG9uZycsCisgICAgICAgICAgICAgICAgICAgICAnZmxvYXRubCcsICdmbG9hdDgnLCAnbG9uZzEnLCAnbG9uZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ1N0YWNrT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICdweWludCcsICdweWxvbmcnLCAncHlpbnRlZ2VyX29yX2Jvb2wnLCAncHlib29sJywgJ3B5ZmxvYXQnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5Ynl0ZXNfb3Jfc3RyJywgJ3B5c3RyaW5nJywgJ3B5Ynl0ZXMnLCAncHl1bmljb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICdweW5vbmUnLCAncHl0dXBsZScsICdweWxpc3QnLCAncHlkaWN0JywgJ3B5c2V0JywKKyAgICAgICAgICAgICAgICAgICAgICdweWZyb3plbnNldCcsICdhbnlvYmplY3QnLCAnbWFya29iamVjdCcsICdzdGFja3NsaWNlJywKKyAgICAgICAgICAgICAgICAgICAgICdPcGNvZGVJbmZvJywgJ29wY29kZXMnLCAnY29kZTJvcCcsCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHBpY2tsZXRvb2xzLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChPcHRpbWl6ZWRQaWNrbGVUZXN0cykKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChNaXNjVGVzdENhc2UpCiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdChwaWNrbGV0b29scykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCAyYTU5YzM4Li4yOGNkZDkwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTQxMSw3ICs0MTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RhdChieXRlYXJyYXkob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgJ2NhblwndCBzcGVjaWZ5IE5vbmUgZm9yIHBhdGggYXJndW1lbnQnLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLAogICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLApAQCAtODYzLDkgKzg2Myw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKICAgICAgICAgICAgIHMyID0gcG9zaXguc3RhdChzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPU5vbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9cG9zaXguZ2V0Y3dkKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciBvciBOb25lLCBub3QnLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPWZsb2F0KGYpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgc3VwcG9ydC5URVNURk4sIGRpcl9mZD0xMCoqMjApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B0eS5weSBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CmluZGV4IGVmNWU5OWUuLjE1Zjg4ZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHR5LnB5CkBAIC0yNzcsNyArMjc3LDYgQEAKICAgICAgICAgc29ja2V0cGFpciA9IHNlbGYuX3NvY2tldHBhaXIoKQogICAgICAgICBtYXN0ZXJzID0gW3MuZmlsZW5vKCkgZm9yIHMgaW4gc29ja2V0cGFpcl0KIAotICAgICAgICBvcy5jbG9zZShtYXN0ZXJzWzFdKQogICAgICAgICBzb2NrZXRwYWlyWzFdLmNsb3NlKCkKICAgICAgICAgb3MuY2xvc2Uod3JpdGVfdG9fc3RkaW5fZmQpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggNmZmYmJiZC4uMDZjMTBjMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAjIFRoZXNlIHdlcmUgb25jZSBhYm91dCB0aGUgMTAgbG9uZ2VzdCBtb2R1bGVzCiAgICAgICAgIGNtKCdyYW5kb20nLCBpZ25vcmU9KCdSYW5kb20nLCkpICAjIGZyb20gX3JhbmRvbSBpbXBvcnQgUmFuZG9tIGFzIENvcmVHZW5lcmF0b3IKICAgICAgICAgY20oJ2NnaScsIGlnbm9yZT0oJ2xvZycsKSkgICAgICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCi0gICAgICAgIGNtKCdwaWNrbGUnKQorICAgICAgICBjbSgncGlja2xlJywgaWdub3JlPSgncGFydGlhbCcsKSkKICAgICAgICAgY20oJ2FpZmMnLCBpZ25vcmU9KCdvcGVuZnAnLCAnX2FpZmNfcGFyYW1zJykpICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCiAgICAgICAgIGNtKCdzcmVfcGFyc2UnLCBpZ25vcmU9KCdkdW1wJywgJ2dyb3VwcycpKSAjIGZyb20gc3JlX2NvbnN0YW50cyBpbXBvcnQgKjsgcHJvcGVydHkKICAgICAgICAgY20oJ3BkYicpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5IGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQppbmRleCA4YWQ1NzA2Li5jZGMxMmVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKQEAgLTg0MSw2ICs4NDEsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9nZXRfc3VtbWFyeV9saW5lKHQud3JhcCksCiAgICAgICAgICAgICAid3JhcCh0ZXh0KSBtZXRob2Qgb2YgdGV4dHdyYXAuVGV4dFdyYXBwZXIgaW5zdGFuY2UiKQogCisgICAgZGVmIHRlc3RfZmllbGRfb3JkZXJfZm9yX25hbWVkX3R1cGxlcyhzZWxmKToKKyAgICAgICAgUGVyc29uID0gbmFtZWR0dXBsZSgnUGVyc29uJywgWyduaWNrbmFtZScsICdmaXJzdG5hbWUnLCAnYWdlZ3JvdXAnXSkKKyAgICAgICAgcyA9IHB5ZG9jLnJlbmRlcl9kb2MoUGVyc29uKQorICAgICAgICBzZWxmLmFzc2VydExlc3Mocy5pbmRleCgnbmlja25hbWUnKSwgcy5pbmRleCgnZmlyc3RuYW1lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzLmluZGV4KCdmaXJzdG5hbWUnKSwgcy5pbmRleCgnYWdlZ3JvdXAnKSkKKworICAgICAgICBjbGFzcyBOb25JdGVyYWJsZUZpZWxkczoKKyAgICAgICAgICAgIF9maWVsZHMgPSBOb25lCisKKyAgICAgICAgY2xhc3MgTm9uSGFzaGFibGVGaWVsZHM6CisgICAgICAgICAgICBfZmllbGRzID0gW1tdXQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZXNlIGRvZXNuJ3QgZmFpbAorICAgICAgICBweWRvYy5yZW5kZXJfZG9jKE5vbkl0ZXJhYmxlRmllbGRzKQorICAgICAgICBweWRvYy5yZW5kZXJfZG9jKE5vbkhhc2hhYmxlRmllbGRzKQorCiAgICAgQHJlcXVpcmVzX2RvY3N0cmluZ3MKICAgICBkZWYgdGVzdF9ib3VuZF9idWlsdGluX21ldGhvZChzZWxmKToKICAgICAgICAgcyA9IFN0cmluZ0lPKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkgYi9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CmluZGV4IGEzOThhNGYuLjIxMzg1M2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQpAQCAtMSwyMSArMSw1MCBAQAogIiIiCiBUZXN0cyBvZiByZWdydGVzdC5weS4KKworTm90ZTogdGVzdF9yZWdydGVzdCBjYW5ub3QgYmUgcnVuIHR3aWNlIGluIHBhcmFsbGVsLgogIiIiCiAKIGltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBmYXVsdGhhbmRsZXIKIGltcG9ydCBnZXRvcHQKK2ltcG9ydCBpbwogaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCByZWdydGVzdCwgc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCBsaWJyZWdydGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKworUHlfREVCVUcgPSBoYXNhdHRyKHN5cywgJ2dldG9iamVjdHMnKQorUk9PVF9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgJy4uJykKK1JPT1RfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoUk9PVF9ESVIpKQorCitURVNUX0lOVEVSUlVQVEVEID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgIGZyb20gc2lnbmFsIGltcG9ydCBTSUdJTlQKKyAgICB0cnk6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCByYWlzZV9zaWduYWwKKyAgICAgICAgcmFpc2Vfc2lnbmFsKFNJR0lOVCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBvcy5raWxsKG9zLmdldHBpZCgpLCBTSUdJTlQpCisgICAgIiIiKQorCiAKIGNsYXNzIFBhcnNlQXJnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgICIiIlRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLiIiIgorICAgICIiIgorICAgIFRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLCBmdW5jdGlvbiBfcGFyc2VfYXJncygpLgorICAgICIiIgogCiAgICAgZGVmIGNoZWNrRXJyb3Ioc2VsZiwgYXJncywgbXNnKToKICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZGVycigpIGFzIGVyciwgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICByZWdydGVzdC5fcGFyc2VfYXJncyhhcmdzKQorICAgICAgICAgICAgbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoYXJncykKICAgICAgICAgc2VsZi5hc3NlcnRJbihtc2csIGVyci5nZXR2YWx1ZSgpKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKQEAgLTIzLDgyICs1Miw4MiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6CiAgICAgICAgICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dCwgXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICAgICAgICAgIHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgICAgICBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuJywgb3V0LmdldHZhbHVlKCkpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigpIHJlcXVpcmVkIikKICAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnRpbWVvdXQsIDQuMikKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10aW1lb3V0J10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRpbWVvdXQnLCAnZm9vJ10sICdpbnZhbGlkIGZsb2F0IHZhbHVlJykKIAogICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXdhaXQnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0td2FpdCddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMud2FpdCkKIAogICAgIGRlZiB0ZXN0X3NsYXZlYXJncyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc2xhdmVhcmdzJywgJ1tbXSwge31dJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXNsYXZlYXJncycsICdbW10sIHt9XSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnNsYXZlYXJncywgJ1tbXSwge31dJykKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1zbGF2ZWFyZ3MnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9zdGFydChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVMnLCAnLS1zdGFydCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnZm9vJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy12J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDEpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMykKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMSkKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAzKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF92ZXJib3NlMihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXcnLCAnLS12ZXJib3NlMic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnZlcmJvc2UyKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZTMoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1XJywgJy0tdmVyYm9zZTMnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy52ZXJib3NlMykKIAogICAgIGRlZiB0ZXN0X3F1aWV0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcScsICctLXF1aWV0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3Rfc2xvdyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW8nLCAnLS1zbG93JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucHJpbnRfc2xvdykKIAogICAgIGRlZiB0ZXN0X2hlYWRlcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0taGVhZGVyJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLWhlYWRlciddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuaGVhZGVyKQogCiAgICAgZGVmIHRlc3RfcmFuZG9taXplKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcicsICctLXJhbmRvbWl6ZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKIAogICAgIGRlZiB0ZXN0X3JhbmRzZWVkKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnJhbmRvbV9zZWVkLCAxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1yYW5kc2VlZCddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKQEAgLTEwNyw3ICsxMzYsNyBAQAogICAgIGRlZiB0ZXN0X2Zyb21maWxlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctZicsICctLWZyb21maWxlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuZnJvbWZpbGUsICdmb28nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nLCAnLXMnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKQEAgLTExNSw0MiArMTQ0LDQyIEBACiAgICAgZGVmIHRlc3RfZXhjbHVkZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXgnLCAnLS1leGNsdWRlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X3NpbmdsZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXMnLCAnLS1zaW5nbGUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5zaW5nbGUpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICctZicsICdmb28nXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKIAogICAgIGRlZiB0ZXN0X21hdGNoKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbScsICctLW1hdGNoJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ3BhdHRlcm4nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdwYXR0ZXJuJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tYXRjaF90ZXN0cywgJ3BhdHRlcm4nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9mYWlsZmFzdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUcnLCAnLS1mYWlsZmFzdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctdiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy12J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZhaWxmYXN0KQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy1XJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLVcnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZmFpbGZhc3QpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVcnKQogCiAgICAgZGVmIHRlc3RfdXNlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdScsICctLXVzZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxuZXR3b3JrJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBbJ2d1aScsICduZXR3b3JrJ10pCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5vbmUsbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxub25lLG5ldHdvcmsnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIFsnbmV0d29yayddKQotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdChyZWdydGVzdC5SRVNPVVJDRV9OQU1FUykKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QobGlicmVncnRlc3QuUkVTT1VSQ0VfTkFNRVMpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucmVtb3ZlKCdndWknKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2FsbCwtZ3VpJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnYWxsLC1ndWknXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgcmVzb3VyY2UnKQpAQCAtMTU4LDMxICsxODcsMzEgQEAKICAgICBkZWYgdGVzdF9tZW1saW1pdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLU0nLCAnLS1tZW1saW1pdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc0RyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzRHJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tZW1saW1pdCwgJzRHJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdGVzdGRpcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50ZXN0ZGlyLCBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRlc3RkaXInXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9ydW5sZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUwnLCAnLS1ydW5sZWFrcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJ1bmxlYWtzKQogCiAgICAgZGVmIHRlc3RfaHVudHJsZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVInLCAnLS1odW50cmxlYWtzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzonXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNiwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6MyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzozJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgMywgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OjM6bGVha3MubG9nJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjozOmxlYWtzLmxvZyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDYsIDMsICdsZWFrcy5sb2cnKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnNiddLApAQCAtMTkzLDI0ICsyMjIsMjMgQEAKICAgICBkZWYgdGVzdF9tdWx0aXByb2Nlc3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1qJywgJy0tbXVsdGlwcm9jZXNzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzInXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcyJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfbXAsIDIpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctVCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctbCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctTScsICc0RyddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogCiAgICAgZGVmIHRlc3RfY292ZXJhZ2Uoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1UJywgJy0tY292ZXJhZ2UnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy50cmFjZSkKIAogICAgIGRlZiB0ZXN0X2NvdmVyZGlyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctRCcsICctLWNvdmVyZGlyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuY292ZXJkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCkBAIC0yMTgsMTMgKzI0NiwxMyBAQAogICAgIGRlZiB0ZXN0X25vY292ZXJkaXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1OJywgJy0tbm9jb3ZlcmRpcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobnMuY292ZXJkaXIpCiAKICAgICBkZWYgdGVzdF90aHJlc2hvbGQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy10JywgJy0tdGhyZXNob2xkJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzEwMDAnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcxMDAwJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50aHJlc2hvbGQsIDEwMDApCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQpAQCAtMjMyLDEzICsyNjAsMTYgQEAKICAgICBkZWYgdGVzdF9ub3dpbmRvd3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1uJywgJy0tbm93aW5kb3dzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZGVycihpby5TdHJpbmdJTygpKSBhcyBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLm5vd2luZG93cykKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkJywgZXJyKQogCiAgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUYnLCAnLS1mb3JldmVyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZm9yZXZlcikKIAogCkBAIC0yNDYsMzAgKzI3Nyw1MDMgQEAKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS14eHgnXSwgJ3VzYWdlOicpCiAKICAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9fcGFydGlhbChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aSddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3R3b19vcHRpb25zKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICctLWV4Y2x1ZGUnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnLS1leGNsdWRlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl93aXRoX2VtcHR5X3N0cmluZ192YWx1ZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc3RhcnQnLCAnJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXN0YXJ0JywgJyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnJykKIAogICAgIGRlZiB0ZXN0X2FyZyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJ2ZvbyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYXJncywgWydmb28nXSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl9hbmRfYXJnKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmFyZ3MsIFsnZm9vJ10pCiAKIAorY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBURVNUX1VOSVFVRV9JRCA9IDEKKyAgICBURVNUTkFNRV9QUkVGSVggPSAndGVzdF9yZWdydGVzdF8nCisgICAgVEVTVE5BTUVfUkVHRVggPSByJ3Rlc3RfW2EtekEtWjAtOV9dKycKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisgICAgICAgIHNlbGYudG1wdGVzdGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYudG1wdGVzdGRpcikKKworICAgIGRlZiBjcmVhdGVfdGVzdChzZWxmLCBuYW1lPU5vbmUsIGNvZGU9JycpOgorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAnbm9vcCVzJyAlIEJhc2VUZXN0Q2FzZS5URVNUX1VOSVFVRV9JRAorICAgICAgICAgICAgQmFzZVRlc3RDYXNlLlRFU1RfVU5JUVVFX0lEICs9IDEKKworICAgICAgICAjIHRlc3RfcmVncnRlc3QgY2Fubm90IGJlIHJ1biB0d2ljZSBpbiBwYXJhbGxlbCBiZWNhdXNlCisgICAgICAgICMgb2Ygc2V0VXAoKSBhbmQgY3JlYXRlX3Rlc3QoKQorICAgICAgICBuYW1lID0gc2VsZi5URVNUTkFNRV9QUkVGSVggKyBuYW1lCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXB0ZXN0ZGlyLCBuYW1lICsgJy5weScpCisKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBwYXRoKQorICAgICAgICAjIFVzZSAneCcgbW9kZSB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgdGVzdHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd4JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoY29kZSkKKyAgICAgICAgZXhjZXB0IFBlcm1pc3Npb25FcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImNhbm5vdCB3cml0ZSAlczogJXMiICUgKHBhdGgsIGV4YykpCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIHJlZ2V4X3NlYXJjaChzZWxmLCByZWdleCwgb3V0cHV0KToKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2gocmVnZXgsIG91dHB1dCwgcmUuTVVMVElMSU5FKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIG5vdCBmb3VuZCBpbiAlciIgJSAocmVnZXgsIG91dHB1dCkpCisgICAgICAgIHJldHVybiBtYXRjaAorCisgICAgZGVmIGNoZWNrX2xpbmUoc2VsZiwgb3V0cHV0LCByZWdleCk6CisgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyJ14nICsgcmVnZXgsIHJlLk1VTFRJTElORSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHBhcnNlX2V4ZWN1dGVkX3Rlc3RzKHNlbGYsIG91dHB1dCk6CisgICAgICAgIHJlZ2V4ID0gKHInXlswLTldKzpbMC05XSs6WzAtOV0rIFxbICpbMC05XSsoPzovICpbMC05XSspP1xdICglcyknCisgICAgICAgICAgICAgICAgICUgc2VsZi5URVNUTkFNRV9SRUdFWCkKKyAgICAgICAgcGFyc2VyID0gcmUuZmluZGl0ZXIocmVnZXgsIG91dHB1dCwgcmUuTVVMVElMSU5FKQorICAgICAgICByZXR1cm4gbGlzdChtYXRjaC5ncm91cCgxKSBmb3IgbWF0Y2ggaW4gcGFyc2VyKQorCisgICAgZGVmIGNoZWNrX2V4ZWN1dGVkX3Rlc3RzKHNlbGYsIG91dHB1dCwgdGVzdHMsIHNraXBwZWQ9KCksIGZhaWxlZD0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZD0oKSwgcmFuZG9taXplPUZhbHNlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgc3RyKToKKyAgICAgICAgICAgIHRlc3RzID0gW3Rlc3RzXQorICAgICAgICBpZiBpc2luc3RhbmNlKHNraXBwZWQsIHN0cik6CisgICAgICAgICAgICBza2lwcGVkID0gW3NraXBwZWRdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbGVkLCBzdHIpOgorICAgICAgICAgICAgZmFpbGVkID0gW2ZhaWxlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvbWl0dGVkLCBzdHIpOgorICAgICAgICAgICAgb21pdHRlZCA9IFtvbWl0dGVkXQorICAgICAgICBudGVzdCA9IGxlbih0ZXN0cykKKyAgICAgICAgbnNraXBwZWQgPSBsZW4oc2tpcHBlZCkKKyAgICAgICAgbmZhaWxlZCA9IGxlbihmYWlsZWQpCisgICAgICAgIG5vbWl0dGVkID0gbGVuKG9taXR0ZWQpCisKKyAgICAgICAgZXhlY3V0ZWQgPSBzZWxmLnBhcnNlX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCkKKyAgICAgICAgaWYgcmFuZG9taXplOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZXhlY3V0ZWQpLCBzZXQodGVzdHMpLCBvdXRwdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4ZWN1dGVkLCB0ZXN0cywgb3V0cHV0KQorCisgICAgICAgIGRlZiBwbHVyYWwoY291bnQpOgorICAgICAgICAgICAgcmV0dXJuICdzJyBpZiBjb3VudCAhPSAxIGVsc2UgJycKKworICAgICAgICBkZWYgbGlzdF9yZWdleChsaW5lX2Zvcm1hdCwgdGVzdHMpOgorICAgICAgICAgICAgY291bnQgPSBsZW4odGVzdHMpCisgICAgICAgICAgICBuYW1lcyA9ICcgJy5qb2luKHNvcnRlZCh0ZXN0cykpCisgICAgICAgICAgICByZWdleCA9IGxpbmVfZm9ybWF0ICUgKGNvdW50LCBwbHVyYWwoY291bnQpKQorICAgICAgICAgICAgcmVnZXggPSByJyVzOlxuICAgICVzJCcgJSAocmVnZXgsIG5hbWVzKQorICAgICAgICAgICAgcmV0dXJuIHJlZ2V4CisKKyAgICAgICAgaWYgc2tpcHBlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIHNraXBwZWQnLCBza2lwcGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgZmFpbGVkJywgZmFpbGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgb21pdHRlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIG9taXR0ZWQnLCBvbWl0dGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgZ29vZCA9IG50ZXN0IC0gbnNraXBwZWQgLSBuZmFpbGVkIC0gbm9taXR0ZWQKKyAgICAgICAgaWYgZ29vZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gciclcyB0ZXN0JXMgT0tcLiQnICUgKGdvb2QsIHBsdXJhbChnb29kKSkKKyAgICAgICAgICAgIGlmIG5vdCBza2lwcGVkIGFuZCBub3QgZmFpbGVkIGFuZCBnb29kID4gMToKKyAgICAgICAgICAgICAgICByZWdleCA9ICdBbGwgJXMnICUgcmVnZXgKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHBhcnNlX3JhbmRvbV9zZWVkKHNlbGYsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidVc2luZyByYW5kb20gc2VlZCAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgcmFuZHNlZWQgPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHJhbmRzZWVkIDw9IDEwMDAwMDAwLCByYW5kc2VlZCkKKyAgICAgICAgcmV0dXJuIHJhbmRzZWVkCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgYXJncywgaW5wdXQ9Tm9uZSwgZXhpdGNvZGU9MCwgKiprdyk6CisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIGlucHV0ID0gJycKKyAgICAgICAgaWYgJ3N0ZGVycicgbm90IGluIGt3OgorICAgICAgICAgICAga3dbJ3N0ZGVyciddID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLnJ1bihhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dD1pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3KQorICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgIT0gZXhpdGNvZGU6CisgICAgICAgICAgICBtc2cgPSAoIkNvbW1hbmQgJXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVzXG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJzdGRvdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICIlc1xuIgorICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAlIChzdHIoYXJncyksIHByb2MucmV0dXJuY29kZSwgcHJvYy5zdGRvdXQpKQorICAgICAgICAgICAgaWYgcHJvYy5zdGRlcnI6CisgICAgICAgICAgICAgICAgbXNnICs9ICgiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAic3RkZXJyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBwcm9jLnN0ZGVycikKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCisgICAgICAgIHJldHVybiBwcm9jCisKKworICAgIGRlZiBydW5fcHl0aG9uKHNlbGYsIGFyZ3MsICoqa3cpOgorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLVgnLCAnZmF1bHRoYW5kbGVyJywgJy1JJywgKmFyZ3NdCisgICAgICAgIHByb2MgPSBzZWxmLnJ1bl9jb21tYW5kKGFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiBwcm9jLnN0ZG91dAorCisKK2NsYXNzIFByb2dyYW1zVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHZhcmlvdXMgd2F5cyB0byBydW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlLiBVc2Ugb3B0aW9ucyBjbG9zZQorICAgIHRvIG9wdGlvbnMgdXNlZCBvbiB0aGUgYnVpbGRib3QuCisgICAgIiIiCisKKyAgICBOVEVTVCA9IDQKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisKKyAgICAgICAgIyBDcmVhdGUgTlRFU1QgdGVzdHMgZG9pbmcgbm90aGluZworICAgICAgICBzZWxmLnRlc3RzID0gW3NlbGYuY3JlYXRlX3Rlc3QoKSBmb3IgaW5kZXggaW4gcmFuZ2Uoc2VsZi5OVEVTVCldCisKKyAgICAgICAgc2VsZi5weXRob25fYXJncyA9IFsnLVdkJywgJy1FJywgJy1iYiddCisgICAgICAgIHNlbGYucmVncnRlc3RfYXJncyA9IFsnLXVhbGwnLCAnLXJ3VycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpcl0KKyAgICAgICAgaWYgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgc2VsZi5yZWdydGVzdF9hcmdzLmV4dGVuZCgoJy0tdGltZW91dCcsICczNjAwJywgJy1qNCcpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHNlbGYucmVncnRlc3RfYXJncy5hcHBlbmQoJy1uJykKKworICAgIGRlZiBjaGVja19vdXRwdXQoc2VsZiwgb3V0cHV0KToKKyAgICAgICAgc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBzZWxmLnRlc3RzLCByYW5kb21pemU9VHJ1ZSkKKworICAgIGRlZiBydW5fdGVzdHMoc2VsZiwgYXJncyk6CisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3B5dGhvbihhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX291dHB1dChvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9zY3JpcHRfcmVncnRlc3Qoc2VsZik6CisgICAgICAgICMgTGliL3Rlc3QvcmVncnRlc3QucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRpciwgJ3JlZ3J0ZXN0LnB5JykKKworICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCBzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3Rlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfcmVncnRlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdC5yZWdydGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdC5yZWdydGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfYXV0b3Rlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdC5hdXRvdGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdC5hdXRvdGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfZnJvbV90ZXN0X2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIGZyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QKKyAgICAgICAgY29kZSA9ICdmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0JworICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIExpYi90ZXN0L2F1dG90ZXN0LnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkaXIsICdhdXRvdGVzdC5weScpCisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsIHNjcmlwdCwgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bl90ZXN0cy5weSBzY3JpcHQgaXMgbm90IGluc3RhbGxlZCcpCisgICAgZGVmIHRlc3RfdG9vbHNfc2NyaXB0X3J1bl90ZXN0cyhzZWxmKToKKyAgICAgICAgIyBUb29scy9zY3JpcHRzL3J1bl90ZXN0cy5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdUb29scycsICdzY3JpcHRzJywgJ3J1bl90ZXN0cy5weScpCisgICAgICAgIGFyZ3MgPSBbc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiBydW5fYmF0Y2goc2VsZiwgKmFyZ3MpOgorICAgICAgICBwcm9jID0gc2VsZi5ydW5fY29tbWFuZChhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX291dHB1dChwcm9jLnN0ZG91dCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5iYXQgc2NyaXB0IGlzIG5vdCBpbnN0YWxsZWQnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAnV2luZG93cyBvbmx5JykKKyAgICBkZWYgdGVzdF90b29sc19idWlsZGJvdF90ZXN0KHNlbGYpOgorICAgICAgICAjIFRvb2xzXGJ1aWxkYm90XHRlc3QuYmF0CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ1Rvb2xzJywgJ2J1aWxkYm90JywgJ3Rlc3QuYmF0JykKKyAgICAgICAgdGVzdF9hcmdzID0gWyctLXRlc3RkaXI9JXMnICUgc2VsZi50bXB0ZXN0ZGlyXQorICAgICAgICBpZiBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSA9PSAnNjRiaXQnOgorICAgICAgICAgICAgdGVzdF9hcmdzLmFwcGVuZCgnLXg2NCcpICAgIyA2NC1iaXQgYnVpbGQKKyAgICAgICAgaWYgbm90IFB5X0RFQlVHOgorICAgICAgICAgICAgdGVzdF9hcmdzLmFwcGVuZCgnK2QnKSAgICAgIyBSZWxlYXNlIGJ1aWxkLCB1c2UgcHl0aG9uLmV4ZQorICAgICAgICBzZWxmLnJ1bl9iYXRjaChzY3JpcHQsICp0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdXaW5kb3dzIG9ubHknKQorICAgIGRlZiB0ZXN0X3BjYnVpbGRfcnQoc2VsZik6CisgICAgICAgICMgUENidWlsZFxydC5iYXQKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCByJ1BDYnVpbGRccnQuYmF0JykKKyAgICAgICAgcnRfYXJncyA9IFsiLXEiXSAgICAgICAgICAgICAjIFF1aWNrLCBkb24ndCBydW4gdGVzdHMgdHdpY2UKKyAgICAgICAgaWYgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0gPT0gJzY0Yml0JzoKKyAgICAgICAgICAgIHJ0X2FyZ3MuYXBwZW5kKCcteDY0JykgICAjIDY0LWJpdCBidWlsZAorICAgICAgICBpZiBQeV9ERUJVRzoKKyAgICAgICAgICAgIHJ0X2FyZ3MuYXBwZW5kKCctZCcpICAgICAjIERlYnVnIGJ1aWxkLCB1c2UgcHl0aG9uX2QuZXhlCisgICAgICAgIHNlbGYucnVuX2JhdGNoKHNjcmlwdCwgKnJ0X2FyZ3MsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzKQorCisKK2NsYXNzIEFyZ3NUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgYXJndW1lbnRzIG9mIHRoZSBQeXRob24gdGVzdCBzdWl0ZS4KKyAgICAiIiIKKworICAgIGRlZiBydW5fdGVzdHMoc2VsZiwgKnRlc3RhcmdzLCAqKmt3KToKKyAgICAgICAgY21kYXJncyA9IFsnLW0nLCAndGVzdCcsICctLXRlc3RkaXI9JXMnICUgc2VsZi50bXB0ZXN0ZGlyLCAqdGVzdGFyZ3NdCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9weXRob24oY21kYXJncywgKiprdykKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfdGVzdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGEgZmFpbGluZyB0ZXN0CisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRmFpbGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X2ZhaWxpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiYnVnIikKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0X29rID0gc2VsZi5jcmVhdGVfdGVzdCgnb2snKQorICAgICAgICB0ZXN0X2ZhaWxpbmcgPSBzZWxmLmNyZWF0ZV90ZXN0KCdmYWlsaW5nJywgY29kZT1jb2RlKQorICAgICAgICB0ZXN0cyA9IFt0ZXN0X29rLCB0ZXN0X2ZhaWxpbmddCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKnRlc3RzLCBleGl0Y29kZT0xKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMsIGZhaWxlZD10ZXN0X2ZhaWxpbmcpCisKKyAgICBkZWYgdGVzdF9yZXNvdXJjZXMoc2VsZik6CisgICAgICAgICMgdGVzdCAtdSBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgIHRlc3RzID0ge30KKyAgICAgICAgZm9yIHJlc291cmNlIGluICgnYXVkaW8nLCAnbmV0d29yaycpOgorICAgICAgICAgICAgY29kZSA9ICdmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnRcbnN1cHBvcnQucmVxdWlyZXMoJXIpJyAlIHJlc291cmNlCisgICAgICAgICAgICB0ZXN0c1tyZXNvdXJjZV0gPSBzZWxmLmNyZWF0ZV90ZXN0KHJlc291cmNlLCBjb2RlKQorICAgICAgICB0ZXN0X25hbWVzID0gc29ydGVkKHRlc3RzLnZhbHVlcygpKQorCisgICAgICAgICMgLXUgYWxsOiAyIHJlc291cmNlcyBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctdScsICdhbGwnLCAqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMpCisKKyAgICAgICAgIyAtdSBhdWRpbzogMSByZXNvdXJjZSBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctdWF1ZGlvJywgKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQ9dGVzdHNbJ25ldHdvcmsnXSkKKworICAgICAgICAjIG5vIG9wdGlvbjogMCByZXNvdXJjZXMgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZD10ZXN0X25hbWVzKQorCisgICAgZGVmIHRlc3RfcmFuZG9tKHNlbGYpOgorICAgICAgICAjIHRlc3QgLXIgYW5kIC0tcmFuZHNlZWQgY29tbWFuZCBsaW5lIG9wdGlvbgorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICAgICAgcHJpbnQoIlRFU1RSQU5ET006ICVzIiAlIHJhbmRvbS5yYW5kaW50KDEsIDEwMDApKQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdyYW5kb20nLCBjb2RlKQorCisgICAgICAgICMgZmlyc3QgcnVuIHRvIGdldCB0aGUgb3V0cHV0IHdpdGggdGhlIHJhbmRvbSBzZWVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctcicsIHRlc3QpCisgICAgICAgIHJhbmRzZWVkID0gc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidURVNUUkFORE9NOiAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgdGVzdF9yYW5kb20gPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisKKyAgICAgICAgIyB0cnkgdG8gcmVwcm9kdWNlIHdpdGggdGhlIHJhbmRvbSBzZWVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctcicsICctLXJhbmRzZWVkPSVzJyAlIHJhbmRzZWVkLCB0ZXN0KQorICAgICAgICByYW5kc2VlZDIgPSBzZWxmLnBhcnNlX3JhbmRvbV9zZWVkKG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5kc2VlZDIsIHJhbmRzZWVkKQorCisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidURVNUUkFORE9NOiAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgdGVzdF9yYW5kb20yID0gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfcmFuZG9tMiwgdGVzdF9yYW5kb20pCisKKyAgICBkZWYgdGVzdF9mcm9tZmlsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tZnJvbWZpbGUKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSg1KV0KKworICAgICAgICAjIFdyaXRlIHRoZSBsaXN0IG9mIGZpbGVzIHVzaW5nIGEgZm9ybWF0IHNpbWlsYXIgdG8gcmVncnRlc3Qgb3V0cHV0OgorICAgICAgICAjIFsxLzJdIHRlc3RfMQorICAgICAgICAjIFsyLzJdIHRlc3RfMgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisKKyAgICAgICAgIyB0ZXN0IGZvcm1hdCAnMDowMDowMCBbMi83XSB0ZXN0X29wY29kZXMgLS0gdGVzdF9ncmFtbWFyIHRvb2sgMCBzZWMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIHByZXZpb3VzID0gTm9uZQorICAgICAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZSh0ZXN0cywgMSk6CisgICAgICAgICAgICAgICAgbGluZSA9ICgiMDA6MDA6JTAyaSBbJXMvJXNdICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAoaW5kZXgsIGluZGV4LCBsZW4odGVzdHMpLCBuYW1lKSkKKyAgICAgICAgICAgICAgICBpZiBwcmV2aW91czoKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSAiIC0tICVzIHRvb2sgMCBzZWMiICUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICBwcmludChsaW5lLCBmaWxlPWZwKQorICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbmFtZQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWZyb21maWxlJywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cykKKworICAgICAgICAjIHRlc3QgZm9ybWF0ICdbMi83XSB0ZXN0X29wY29kZXMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgorICAgICAgICAgICAgICAgIHByaW50KCJbJXMvJXNdICVzIiAlIChpbmRleCwgbGVuKHRlc3RzKSwgbmFtZSksIGZpbGU9ZnApCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZnJvbWZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorCisgICAgICAgICMgdGVzdCBmb3JtYXQgJ3Rlc3Rfb3Bjb2RlcycKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgcHJpbnQobmFtZSwgZmlsZT1mcCkKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlZChzZWxmKToKKyAgICAgICAgY29kZSA9IFRFU1RfSU5URVJSVVBURUQKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ3NpZ2ludCcsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHModGVzdCwgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3QsIG9taXR0ZWQ9dGVzdCkKKworICAgIGRlZiB0ZXN0X3Nsb3coc2VsZik6CisgICAgICAgICMgdGVzdCAtLXNsb3cKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSgzKV0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tc2xvdyIsICp0ZXN0cykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJyg/OiVzOiBbMC05XStcLlswLTldK3Ncbil7JXN9JworICAgICAgICAgICAgICAgICAlIChzZWxmLlRFU1ROQU1FX1JFR0VYLCBsZW4odGVzdHMpKSkKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9zbG93X2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyNTM3MzogdGVzdCAtLXNsb3cgd2l0aCBhbiBpbnRlcnJ1cHRlZCB0ZXN0CisgICAgICAgIGNvZGUgPSBURVNUX0lOVEVSUlVQVEVECisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCJzaWdpbnQiLCBjb2RlPWNvZGUpCisKKyAgICAgICAgZm9yIG11bHRpcHJvY2Vzc2luZyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgaWYgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgICAgIGFyZ3MgPSAoIi0tc2xvdyIsICItajIiLCB0ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzID0gKCItLXNsb3ciLCB0ZXN0KQorICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKmFyZ3MsIGV4aXRjb2RlPTEpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdCwgb21pdHRlZD10ZXN0KQorICAgICAgICAgICAgcmVnZXggPSAoJzEwIHNsb3dlc3QgdGVzdHM6XG4nKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULicpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tY292ZXJhZ2UKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2NvdmVyYWdlJykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tY292ZXJhZ2UiLCB0ZXN0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdKQorICAgICAgICByZWdleCA9ICgnbGluZXMgK2NvdiUgK21vZHVsZSArXChwYXRoXClcbicKKyAgICAgICAgICAgICAgICAgJyg/OiAqWzAtOV0rICpbMC05XXsxLDJ9JSAqW14gXSsgK1woW14pXStcKSspKycpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3Rfd2FpdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0td2FpdAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnd2FpdCcpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCItLXdhaXQiLCB0ZXN0LCBpbnB1dD0na2V5JykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgJ1ByZXNzIGFueSBrZXkgdG8gY29udGludWUnKQorCisgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tZm9yZXZlcgorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IGJ1aWx0aW5zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRm9yZXZlclRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSBzdGF0ZSBpbiB0aGUgYnVpbHRpbnMgbW9kdWxlLCBiZWNhdXNlIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIGlzIHJlbG9hZCBhdCBlYWNoIHJ1bgorICAgICAgICAgICAgICAgICAgICBpZiAnUlVOJyBpbiBidWlsdGlucy5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBidWlsdGlucy5fX2RpY3RfX1snUlVOJ10gPj0gMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZhaWwgYXQgdGhlIDNyZCBydW5zIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSA9IDEKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnZm9yZXZlcicsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZm9yZXZlcicsIHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0qMywgZmFpbGVkPXRlc3QpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgYSBkZWJ1ZyBidWlsZCcpCisgICAgZGVmIHRlc3RfaHVudHJsZWFrc19mZF9sZWFrKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1odW50cmxlYWtzIGZvciBmaWxlIGRlc2NyaXB0b3IgbGVhaworICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgIyBJc3N1ZSAjMjUzMDY6IERpc2FibGUgcG9wdXBzIGFuZCBsb2dzIHRvIHN0ZGVyciBvbiBhc3NlcnRpb24KKyAgICAgICAgICAgICMgZmFpbHVyZXMgaW4gTVNDUlQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICAjIG5vIFdpbmRvd3MsIG8gcmVsZWFzZSBidWlsZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gW21zdmNydC5DUlRfV0FSTiwgbXN2Y3J0LkNSVF9FUlJPUiwgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgICAgICAgICBjbGFzcyBGRExlYWtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9sZWFrKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4oX19maWxlX18sIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgICAgICAgICAjIGJ1ZzogbmV2ZXIgY2xvZXMgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdodW50cmxlYWtzJywgY29kZT1jb2RlKQorCisgICAgICAgIGZpbGVuYW1lID0gJ3JlZmxvZy50eHQnCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWh1bnRybGVha3MnLCAnMzozOicsIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRjb2RlPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIFt0ZXN0XSwgZmFpbGVkPXRlc3QpCisKKyAgICAgICAgbGluZSA9ICdiZWdpbm5pbmcgNiByZXBldGl0aW9uc1xuMTIzNDU2XG4uLi4uLi5cbicKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmUuZXNjYXBlKGxpbmUpKQorCisgICAgICAgIGxpbmUyID0gJyVzIGxlYWtlZCBbMSwgMSwgMV0gZmlsZSBkZXNjcmlwdG9ycywgc3VtPTNcbicgJSB0ZXN0CisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlLmVzY2FwZShsaW5lMikpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIHJlZmxvZyA9IGZwLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZsb2csIGxpbmUyKQorCisgICAgZGVmIHRlc3RfbGlzdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tbGlzdC10ZXN0cworICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGkgaW4gcmFuZ2UoNSldCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWxpc3QtdGVzdHMnLCAqdGVzdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnJzdHJpcCgpLnNwbGl0bGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CmluZGV4IDE1ODJjYWEuLjU4NzI5YTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTI1Myw2ICsyNTMsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPCBiKQogCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNsYXNzIFNwYW06CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IE5vbmUsIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lIDwgNDIsIHIiJzwnIC4qIG9mICdOb25lVHlwZScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA+IE5vbmUsIHIiJz4nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA8IE5vbmUsIHIiJzwnIC4qIG9mICdzdHInIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA+PSA2NjYsIHIiJz49JyAuKiBvZiAnc3RyJyBhbmQgJ2ludCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyIDw9IE5vbmUsIHIiJzw9JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPj0gTm9uZSwgciInPj0nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFtdLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiAoKSA+IFtdLCByIic+JyAuKiBvZiAndHVwbGUnIGFuZCAnbGlzdCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IE5vbmUgPj0gTm9uZSwgciInPj0nIC4qIG9mICdOb25lVHlwZScgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8IDQyLCByIic8JyAuKiBvZiAnU3BhbScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFNwYW0oKSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdTcGFtJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogU3BhbSgpIDw9IFNwYW0oKSwgciInPD0nIC4qIG9mICdTcGFtJyBhbmQgJ1NwYW0nIiksCisgICAgICAgIF0KKyAgICAgICAgZm9yIGksIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRlc3Q9aSk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgdGVzdFsxXSk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RbMF0oKQorCisKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RpY3RzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weSBiL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKaW5kZXggODUzZTc3My4uMGRjMTA4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CkBAIC0xLDExICsxLDEyIEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB1bml0dGVzdC5tb2NrCitmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCiBpbXBvcnQgYnVpbHRpbnMKIGltcG9ydCBybGNvbXBsZXRlcgogCiBjbGFzcyBDb21wbGV0ZU1lOgogICAgICIiIiBUcml2aWFsIGNsYXNzIHVzZWQgaW4gdGVzdGluZyBybGNvbXBsZXRlci5Db21wbGV0ZXIuICIiIgogICAgIHNwYW0gPSAxCisgICAgX2hhbSA9IDIKIAogCiBjbGFzcyBUZXN0Umxjb21wbGV0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTIsMTggKzUzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWydzdHIue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygndHVwbGUuZm9vc3BhbWVnZycpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBzb3J0ZWQoeydOb25lLiVzJXMnICUgKHgsICcoJyBpZiB4ICE9ICdfX2RvY19fJyBlbHNlICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gZGlyKE5vbmUpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fXycpLCBleHBlY3RlZCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBhIGN1c3RvbWl6ZWQgbmFtZXNwYWNlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLnNwJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLnNwYW0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlbWUuZWdnJyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubXJvKCcsICdDb21wbGV0ZU1lLnNwYW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5faGFtJ10pCisgICAgICAgIG1hdGNoZXMgPSBzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuX18nKQorICAgICAgICBmb3IgeCBpbiBtYXRjaGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnQ29tcGxldGVNZS5fXycpLCB4KQorICAgICAgICBzZWxmLmFzc2VydEluKCdDb21wbGV0ZU1lLl9fbmFtZV9fJywgbWF0Y2hlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25ld19fKCcsIG1hdGNoZXMpCiAKLSAgICAgICAgQ29tcGxldGVNZS5tZSA9IENvbXBsZXRlTWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUubWUubWUuc3AnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ2VnZy57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisgICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KENvbXBsZXRlTWUsICJtZSIsIENvbXBsZXRlTWUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5tZS5tZS5zcGFtJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKIAogICAgIGRlZiB0ZXN0X2V4Y2Vzc2l2ZV9nZXRhdHRyKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSBnZXRhdHRyKCkgaXMgaW52b2tlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgYXR0cmlidXRlCkBAIC03OCwxNCArOTMsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuYicsIDApLCAnZi5iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2FsbHMsIDEpCiAKKyAgICBkZWYgdGVzdF91bmNyZWF0ZWRfYXR0cihzZWxmKToKKyAgICAgICAgIyBBdHRyaWJ1dGVzIGxpa2UgcHJvcGVydGllcyBhbmQgc2xvdHMgc2hvdWxkIGJlIGNvbXBsZXRlZCBldmVuIHdoZW4KKyAgICAgICAgIyB0aGV5IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIG9uIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICgiYmFyIiwpCisgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihkaWN0KGY9Rm9vKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZi4nLCAwKSwgJ2YuYmFyJykKKwogICAgIEB1bml0dGVzdC5tb2NrLnBhdGNoKCdybGNvbXBsZXRlci5fcmVhZGxpbmVfYXZhaWxhYmxlJywgRmFsc2UpCiAgICAgZGVmIHRlc3RfY29tcGxldGUoc2VsZik6CiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCcnLCAwKSwgJ1x0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhcycsIDIpLCAnYXNzZXJ0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDApLCAnYW5kICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYW4nLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgncGEnLCAwKSwgJ3Bhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmEnLCAwKSwgJ0ZhbHNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2VsJywgMCksICdlbGlmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDEpLCAnZWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCd0cicsIDApLCAndHJ5OicpCiAKICAgICBkZWYgdGVzdF9kdXBsaWNhdGVfZ2xvYmFscyhzZWxmKToKICAgICAgICAgbmFtZXNwYWNlID0gewpAQCAtOTgsOSArMTI2LDEwIEBACiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihuYW1lc3BhY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDApLCAnRmFsc2UnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ0ZhbHNlJywgMSkpICAjIE5vIGR1cGxpY2F0ZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDApLCAnYXNzZXJ0JykKKyAgICAgICAgIyBTcGFjZSBvciBjb2xvbiBhZGRlZCBkdWUgdG8gYmVpbmcgYSByZXNlcnZlZCBrZXl3b3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCAnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDEpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnk6JykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCd0cnknLCAxKSkKICAgICAgICAgIyBObyBvcGVuaW5nIGJyYWNrZXQgIigiIGJlY2F1c2Ugd2Ugb3ZlcnJvZGUgdGhlIGJ1aWx0LWluIGNsYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdtZW1vcnl2aWV3JywgMCksICdtZW1vcnl2aWV3JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CmluZGV4IGQwMTI2NmYuLjkwYjMwNzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMSw2ICsxLDcgQEAKIGltcG9ydCBpbwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCiBmcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IsIEhUVFBFcnJvcgogZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0xMiw3ICsxMyw4IEBACiAKIAogY2xhc3MgUm9ib3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLCBhZ2VudD1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXg9Tm9uZSwgcGFyc2VyPU5vbmUsIHVybD1Ob25lLCBnb29kPU5vbmUsCisgICAgICAgICAgICAgICAgIGFnZW50PU5vbmUsIHJlcXVlc3RfcmF0ZT1Ob25lLCBjcmF3bF9kZWxheT1Ob25lKToKICAgICAgICAgIyB3b3JrYXJvdW5kIHRvIG1ha2UgdW5pdHRlc3QgZGlzY292ZXJ5IHdvcmsgKHNlZSAjMTcwNjYpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZGV4LCBpbnQpOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0yNSw2ICsyNyw4IEBACiAgICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgIHNlbGYuZ29vZCA9IGdvb2QKICAgICAgICAgc2VsZi5hZ2VudCA9IGFnZW50CisgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlID0gcmVxdWVzdF9yYXRlCisgICAgICAgIHNlbGYuY3Jhd2xfZGVsYXkgPSBjcmF3bF9kZWxheQogCiAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi51cmwsIHR1cGxlKToKQEAgLTM0LDYgKzM4LDE4IEBACiAgICAgICAgICAgICBhZ2VudCA9IHNlbGYuYWdlbnQKICAgICAgICAgaWYgc2VsZi5nb29kOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuY3Jhd2xfZGVsYXkoYWdlbnQpLCBzZWxmLmNyYXdsX2RlbGF5KQorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGFjdHVhbCB2YWx1ZXMgZm9yIHJlcXVlc3QgcmF0ZQorICAgICAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3JhdGUgYW5kIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5yZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUucmVxdWVzdHMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZS5zZWNvbmRzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpLCBzZWxmLnJlcXVlc3RfcmF0ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQogCkBAIC00MywxNSArNTksMTcgQEAKIHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKIAogZGVmIFJvYm90VGVzdChpbmRleCwgcm9ib3RzX3R4dCwgZ29vZF91cmxzLCBiYWRfdXJscywKLSAgICAgICAgICAgICAgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKKyAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSwgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKIAogICAgIGxpbmVzID0gaW8uU3RyaW5nSU8ocm9ib3RzX3R4dCkucmVhZGxpbmVzKCkKICAgICBwYXJzZXIgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgICBwYXJzZXIucGFyc2UobGluZXMpCiAgICAgZm9yIHVybCBpbiBnb29kX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMSwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAgICAgZm9yIHVybCBpbiBiYWRfdXJsczoKLSAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQpKQorICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAwLCBhZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy5odG1sIChmZXRjaGVkIDIwMDIpCiAKQEAgLTY1LDE0ICs4MywxOCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCddCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJywnL3RtcC94eHgnLCcvZm9vLmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAyLgogZG9jID0gIiIiCiAjIHJvYm90cy50eHQgZm9yIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vCiAKIFVzZXItYWdlbnQ6ICoKK0NyYXdsLWRlbGF5OiAxCitSZXF1ZXN0LXJhdGU6IDMvMTUKIERpc2FsbG93OiAvY3liZXJ3b3JsZC9tYXAvICMgVGhpcyBpcyBhbiBpbmZpbml0ZSB2aXJ0dWFsIFVSTCBzcGFjZQogCiAjIEN5YmVybWFwcGVyIGtub3dzIHdoZXJlIHRvIGdvLgpAQCAtODMsOCArMTA1LDEwIEBACiAKIGdvb2QgPSBbJy8nLCcvdGVzdC5odG1sJywoJ2N5YmVybWFwcGVyJywnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnKV0KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZSAgIyBUaGUgcGFyYW1ldGVycyBzaG91bGQgYmUgZXF1YWwgdG8gTm9uZSBzaW5jZSB0aGV5CitjcmF3bF9kZWxheSA9IE5vbmUgICAjIGRvbid0IGFwcGx5IHRvIHRoZSBjeWJlcm1hcHBlciB1c2VyIGFnZW50CiAKLVJvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAzLgogZG9jID0gIiIiCkBAIC05NSwxNCArMTE5LDE4IEBACiAKIGdvb2QgPSBbXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy8nLCcvdG1wLyddCityZXF1ZXN0X3JhdGUgPSBOb25lCitjcmF3bF9kZWxheSA9IE5vbmUKIAotUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KQogCiAjIEV4YW1wbGVzIGZyb20gaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL3djL25vcm9ib3RzLXJmYy5odG1sIChmZXRjaGVkIDIwMDIpCiAKICMgNC4KIGRvYyA9ICIiIgogVXNlci1hZ2VudDogZmlndHJlZQorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS8zMAogRGlzYWxsb3c6IC90bXAKIERpc2FsbG93OiAvYSUzY2QuaHRtbAogRGlzYWxsb3c6IC9hJTJmYi5odG1sCkBAIC0xMTUsOCArMTQzLDE3IEBACiAgICAgICAgJy9+am9lL2luZGV4Lmh0bWwnCiAgICAgICAgXQogCi1Sb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsICdmaWd0cmVlJykKLVJvYm90VGVzdCg1LCBkb2MsIGdvb2QsIGJhZCwgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCityZXF1ZXN0X3JhdGUgPSBuYW1lZHR1cGxlKCdyZXFfcmF0ZScsICdyZXF1ZXN0cyBzZWNvbmRzJykKK3JlcXVlc3RfcmF0ZS5yZXF1ZXN0cyA9IDkKK3JlcXVlc3RfcmF0ZS5zZWNvbmRzID0gMzAKK2NyYXdsX2RlbGF5ID0gMworcmVxdWVzdF9yYXRlX2JhZCA9IE5vbmUgICMgbm90IGFjdHVhbGx5IHRlc3RlZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcGFyc2UgaXQKK2NyYXdsX2RlbGF5X2JhZCA9IE5vbmUgICMgaW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKworCitSb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksICdmaWd0cmVlJyApCitSb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZV9iYWQsIGNyYXdsX2RlbGF5X2JhZCwKKyAgICAgICAgICAnRmlnVHJlZSBSb2JvdCBsaWJ3d3ctcGVybC81LjA0JykKIAogIyA2LgogZG9jID0gIiIiCkBAIC0xMjUsMTQgKzE2MiwxOCBAQAogRGlzYWxsb3c6IC9hJTNDZC5odG1sCiBEaXNhbGxvdzogL2EvYi5odG1sCiBEaXNhbGxvdzogLyU3ZWpvZS9pbmRleC5odG1sCitDcmF3bC1kZWxheTogMworUmVxdWVzdC1yYXRlOiA5L2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy90bXAnLF0gIyBYRkFJTDogJy9hJTJmYi5odG1sJwogYmFkID0gWycvdG1wLycsJy90bXAvYS5odG1sJywKICAgICAgICAnL2ElM2NkLmh0bWwnLCcvYSUzQ2QuaHRtbCcsIi9hL2IuaHRtbCIsCiAgICAgICAgJy8lN0Vqb2UvaW5kZXguaHRtbCddCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgc2luY2UgcmVxdWVzdCByYXRlIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKIAotUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAjIEZyb20gYnVnIHJlcG9ydCAjNTIzMDQxCiAKQEAgLTE0MCwxMiArMTgxLDE2IEBACiBkb2MgPSAiIiIKIFVzZXItQWdlbnQ6ICoKIERpc2FsbG93OiAvLgorQ3Jhd2wtZGVsYXk6IHBlYXJzCiAiIiIKIAogZ29vZCA9IFsnL2Zvby5odG1sJ10KLWJhZCA9IFtdICMgQnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQworYmFkID0gW10gICMgYnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQwogCi1Sb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQpCitjcmF3bF9kZWxheSA9IE5vbmUgICMgc2luY2UgY3Jhd2wgZGVsYXkgaGFzIGludmFsaWQgc3ludGF4LCByZXR1cm4gTm9uZQorcmVxdWVzdF9yYXRlID0gTm9uZQorCitSb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUpCiAKICMgRnJvbSBHb29nbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L3dlYm1hc3RlcnMvYmluL2Fuc3dlci5weT9obD1lbiZhbnN3ZXI9NDAzNjQKIApAQCAtMTU0LDEyICsxOTksMTUgQEAKIFVzZXItYWdlbnQ6IEdvb2dsZWJvdAogQWxsb3c6IC9mb2xkZXIxL215ZmlsZS5odG1sCiBEaXNhbGxvdzogL2ZvbGRlcjEvCitSZXF1ZXN0LXJhdGU6IHdoYWxlL2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy9mb2xkZXIxL215ZmlsZS5odG1sJ10KIGJhZCA9IFsnL2ZvbGRlcjEvYW5vdGhlcmZpbGUuaHRtbCddCitjcmF3bF9kZWxheSA9IE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgaW52YWxpZCBzeW50YXgsIHJldHVybiBub25lCiAKLVJvYm90VGVzdCg4LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUsIGFnZW50PSJHb29nbGVib3QiKQogCiAjIDkuICBUaGlzIGZpbGUgaXMgaW5jb3JyZWN0IGJlY2F1c2UgIkdvb2dsZWJvdCIgaXMgYSBzdWJzdHJpbmcgb2YKICMgICAgICJHb29nbGVib3QtTW9iaWxlIiwgc28gdGVzdCAxMCB3b3JrcyBqdXN0IGxpa2UgdGVzdCA5LgpAQCAtMTc0LDEyICsyMjIsMTIgQEAKIGdvb2QgPSBbXQogYmFkID0gWycvc29tZXRoaW5nLmpwZyddCiAKLVJvYm90VGVzdCg5LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKICMgMTEuICBHZXQgdGhlIG9yZGVyIGNvcnJlY3QuCiBkb2MgPSAiIiIKQEAgLTE5MywxMiArMjQxLDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90IikKK1JvYm90VGVzdCgxMSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gWycvc29tZXRoaW5nLmpwZyddCiBiYWQgPSBbXQogCi1Sb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKIAogIyAxMy4gIEdvb2dsZSBhbHNvIGdvdCB0aGUgb3JkZXIgd3JvbmcgaW4gIzguICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZQpAQCAtMjEyLDcgKzI2MCw3IEBACiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQogCi1Sb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iZ29vZ2xlYm90IikKK1JvYm90VGVzdCgxMywgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJnb29nbGVib3QiKQogCiAKICMgMTQuIEZvciBpc3N1ZSAjNjMyNSAocXVlcnkgc3RyaW5nIHN1cHBvcnQpCkBAIC0yMjQsNyArMjcyLDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoP25hbWU9dmFsdWUnXQogCi1Sb2JvdFRlc3QoMTQsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNS4gRm9yIGlzc3VlICM0MTA4IChvYmV5IGZpcnN0ICogZW50cnkpCiBkb2MgPSAiIiIKQEAgLTIzOCw3ICsyODYsNyBAQAogZ29vZCA9IFsnL2Fub3RoZXIvcGF0aCddCiBiYWQgPSBbJy9zb21lL3BhdGgnXQogCi1Sb2JvdFRlc3QoMTUsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNi4gRW1wdHkgcXVlcnkgKGlzc3VlICMxNzQwMykuIE5vcm1hbGl6aW5nIHRoZSB1cmwgZmlyc3QuCiBkb2MgPSAiIiIKQEAgLTI1MCw3ICsyOTgsNyBAQAogZ29vZCA9IFsnL3NvbWUvcGF0aD8nXQogYmFkID0gWycvYW5vdGhlci9wYXRoPyddCiAKLVJvYm90VGVzdCgxNiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAKIGNsYXNzIFJvYm90SGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsMTIzIEBACisiIiJUZXN0IHRoZSBzZWNyZXRzIG1vZHVsZS4KKworQXMgbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGluIHNlY3JldHMgYXJlIHRoaW4gd3JhcHBlcnMgYXJvdW5kIGZ1bmN0aW9ucworZGVmaW5lZCBlbHNld2hlcmUsIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGVtIGV4aGF1c3RpdmVseS4KKyIiIgorCisKK2ltcG9ydCBzZWNyZXRzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJpbmcKKworCisjID09PSBVbml0IHRlc3RzID09PQorCitjbGFzcyBDb21wYXJlX0RpZ2VzdF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0IGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfZXF1YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wYXJlX2RpZ2VzdCBmdW5jdGlvbmFsaXR5IHdpdGggZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgZm9yIHMgaW4gKCJhIiwgImJjZCIsICJ4eXoxMjMiKToKKyAgICAgICAgICAgIGEgPSBzKjEwMAorICAgICAgICAgICAgYiA9IHMqMTAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEuZW5jb2RlKCd1dGYtOCcpLCBiLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICBkZWYgdGVzdF91bmVxdWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29tcGFyZV9kaWdlc3QgZnVuY3Rpb25hbGl0eSB3aXRoIHVuZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoYiJhYmMiLCBiImFiY2QiKSkKKyAgICAgICAgZm9yIHMgaW4gKCJ4IiwgIm1uIiwgImExYjJjMyIpOgorICAgICAgICAgICAgYSA9IHMqMTAwICsgInEiCisgICAgICAgICAgICBiID0gcyoxMDAgKyAiayIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLmVuY29kZSgndXRmLTgnKSwgYi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgZGVmIHRlc3RfYmFkX3R5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjb21wYXJlX2RpZ2VzdCByYWlzZXMgd2l0aCBtaXhlZCB0eXBlcy4KKyAgICAgICAgYSA9ICdhYmNkZScKKyAgICAgICAgYiA9IGEuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGEsIHN0cikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYiwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VjcmV0cy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0LCBiLCBhKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgY29tcGFyZV9kaWdlc3QgcmV0dXJucyBhIGJvb2wuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjIiksIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAieHl6IiksIGJvb2wpCisKKworY2xhc3MgUmFuZG9tX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHdyYXBwZXJzIGFyb3VuZCBTeXN0ZW1SYW5kb20gbWV0aG9kcy4iIiIKKworICAgIGRlZiB0ZXN0X3JhbmRiaXRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJpdHMuCisgICAgICAgIGVycm1zZyA9ICJyYW5kYml0cyglZCkgcmV0dXJuZWQgJWQiCisgICAgICAgIGZvciBudW1iaXRzIGluICgzLCAxMiwgMzApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICAgICAgbiA9IHNlY3JldHMucmFuZGJpdHMobnVtYml0cykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBuIDwgMioqbnVtYml0cywgZXJybXNnICUgKG51bWJpdHMsIG4pKQorCisgICAgZGVmIHRlc3RfY2hvaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2hvaWNlLgorICAgICAgICBpdGVtcyA9IFsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0XQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jaG9pY2UoaXRlbXMpIGluIGl0ZW1zKQorCisgICAgZGVmIHRlc3RfcmFuZGJlbG93KHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJlbG93LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCAxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlY3JldHMucmFuZGJlbG93KGkpLCByYW5nZShpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VjcmV0cy5yYW5kYmVsb3csIDApCisKKworY2xhc3MgVG9rZW5fVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdG9rZW4gZnVuY3Rpb25zLiIiIgorCisgICAgZGVmIHRlc3RfdG9rZW5fZGVmYXVsdHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRva2VuXyogZnVuY3Rpb25zIGhhbmRsZSBkZWZhdWx0IHNpemUgY29ycmVjdGx5LgorICAgICAgICBmb3IgZnVuYyBpbiAoc2VjcmV0cy50b2tlbl9ieXRlcywgc2VjcmV0cy50b2tlbl9oZXgsCisgICAgICAgICAgICAgICAgICAgICBzZWNyZXRzLnRva2VuX3VybHNhZmUpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBuYW1lID0gZnVuYy5fX25hbWVfXworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoTm9uZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBOb25lIiAlIG5hbWUpCisgICAgICAgIHNpemUgPSBzZWNyZXRzLkRFRkFVTFRfRU5UUk9QWQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKE5vbmUpKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VjcmV0cy50b2tlbl9oZXgoTm9uZSkpLCAyKnNpemUpCisKKyAgICBkZWYgdGVzdF90b2tlbl9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2J5dGVzLgorICAgICAgICBmb3IgbiBpbiAoMSwgOCwgMTcsIDEwMCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLnRva2VuX2J5dGVzKG4pLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKG4pKSwgbikKKworICAgIGRlZiB0ZXN0X3Rva2VuX2hleChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2hleC4KKyAgICAgICAgZm9yIG4gaW4gKDEsIDEyLCAyNSwgOTApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzID0gc2VjcmV0cy50b2tlbl9oZXgobikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAyKm4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIHN0cmluZy5oZXhkaWdpdHMgZm9yIGMgaW4gcykpCisKKyAgICBkZWYgdGVzdF90b2tlbl91cmxzYWZlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5fdXJsc2FmZS4KKyAgICAgICAgbGVnYWwgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnLV8nCisgICAgICAgIGZvciBuIGluICgxLCAxMSwgMjgsIDc2KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcyA9IHNlY3JldHMudG9rZW5fdXJsc2FmZShuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIGxlZ2FsIGZvciBjIGluIHMpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDBiOTlkZmMuLjE1YWU0MmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0xMCw2ICsxMCw4IEBACiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHN0cmluZwogCiBjbGFzcyBQYXNzVGhydShFeGNlcHRpb24pOgogICAgIHBhc3MKQEAgLTcxNCw2ICs3MTYsMjggQEAKICAgICAgICAgICAgIGFkZGhhc2h2YWx1ZShoYXNoKGZyb3plbnNldChbZSBmb3IgZSwgbSBpbiBlbGVtbWFza3MgaWYgbSZpXSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihoYXNodmFsdWVzKSwgMioqbikKIAorICAgICAgICBkZWYgbGV0dGVyX3JhbmdlKG4pOgorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5hc2NpaV9sZXR0ZXJzWzpuXQorCisgICAgICAgIGRlZiB6Zl9yYW5nZShuKToKKyAgICAgICAgICAgICMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2V0LXRoZW9yZXRpY19kZWZpbml0aW9uX29mX25hdHVyYWxfbnVtYmVycworICAgICAgICAgICAgbnVtcyA9IFtmcm96ZW5zZXQoKV0KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4tMSk6CisgICAgICAgICAgICAgICAgbnVtID0gZnJvemVuc2V0KG51bXMpCisgICAgICAgICAgICAgICAgbnVtcy5hcHBlbmQobnVtKQorICAgICAgICAgICAgcmV0dXJuIG51bXNbOm5dCisKKyAgICAgICAgZGVmIHBvd2Vyc2V0KHMpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gbWFwKGZyb3plbnNldCwgaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhzLCBpKSkKKworICAgICAgICBmb3IgbiBpbiByYW5nZSgxOCk6CisgICAgICAgICAgICB0ID0gMiAqKiBuCisgICAgICAgICAgICBtYXNrID0gdCAtIDEKKyAgICAgICAgICAgIGZvciBudW1zIGluIChyYW5nZSwgbGV0dGVyX3JhbmdlLCB6Zl9yYW5nZSk6CisgICAgICAgICAgICAgICAgdSA9IGxlbih7aCAmIG1hc2sgZm9yIGggaW4gbWFwKGhhc2gsIHBvd2Vyc2V0KG51bXMobikpKX0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDQqdSwgdCkKKwogY2xhc3MgRnJvemVuU2V0U3ViY2xhc3MoZnJvemVuc2V0KToKICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKaW5kZXggMWI4MGZmMC4uYWI0MmVkNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKQEAgLTIyLDI5ICsyMiw2IEBACiAgICAgX3Rlc3RjYXBpID0gTm9uZQogCiAKLWNsYXNzIEhhbmRsZXJCQ2FsbGVkKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWRlZiBleGl0X3N1YnByb2Nlc3MoKToKLSAgICAiIiJVc2Ugb3MuX2V4aXQoMCkgdG8gZXhpdCB0aGUgY3VycmVudCBzdWJwcm9jZXNzLgotCi0gICAgT3RoZXJ3aXNlLCB0aGUgdGVzdCBjYXRjaGVzIHRoZSBTeXN0ZW1FeGl0IGFuZCBjb250aW51ZXMgZXhlY3V0aW5nCi0gICAgaW4gcGFyYWxsZWwgd2l0aCB0aGUgb3JpZ2luYWwgdGVzdCwgc28geW91IHdpbmQgdXAgd2l0aCBhbgotICAgIGV4cG9uZW50aWFsIG51bWJlciBvZiB0ZXN0cyBydW5uaW5nIGNvbmN1cnJlbnRseS4KLSAgICAiIiIKLSAgICBvcy5fZXhpdCgwKQotCi0KLWRlZiBpZ25vcmluZ19laW50cihfX2Z1bmMsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gX19mdW5jKCphcmdzLCAqKmt3YXJncykKLSAgICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVJTlRSOgotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotCiBjbGFzcyBHZW5lcmljVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgQHVuaXR0ZXN0LnNraXBJZih0aHJlYWRpbmcgaXMgTm9uZSwgInRlc3QgbmVlZHMgdGhyZWFkaW5nIG1vZHVsZSIpCkBAIC02MywxNDUgKzQwLDYgQEAKIAogCiBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQotY2xhc3MgSW50ZXJQcm9jZXNzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIE1BWF9EVVJBVElPTiA9IDIwICAgIyBFbnRpcmUgdGVzdCBzaG91bGQgbGFzdCBhdCBtb3N0IDIwIHNlYy4KLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi51c2luZ19nYyA9IGdjLmlzZW5hYmxlZCgpCi0gICAgICAgIGdjLmRpc2FibGUoKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnVzaW5nX2djOgotICAgICAgICAgICAgZ2MuZW5hYmxlKCkKLQotICAgIGRlZiBmb3JtYXRfZnJhbWUoc2VsZiwgZnJhbWUsIGxpbWl0PU5vbmUpOgotICAgICAgICByZXR1cm4gJycuam9pbih0cmFjZWJhY2suZm9ybWF0X3N0YWNrKGZyYW1lLCBsaW1pdD1saW1pdCkpCi0KLSAgICBkZWYgaGFuZGxlckEoc2VsZiwgc2lnbnVtLCBmcmFtZSk6Ci0gICAgICAgIHNlbGYuYV9jYWxsZWQgPSBUcnVlCi0KLSAgICBkZWYgaGFuZGxlckIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6Ci0gICAgICAgIHNlbGYuYl9jYWxsZWQgPSBUcnVlCi0gICAgICAgIHJhaXNlIEhhbmRsZXJCQ2FsbGVkKHNpZ251bSwgc2VsZi5mb3JtYXRfZnJhbWUoZnJhbWUpKQotCi0gICAgZGVmIHdhaXQoc2VsZiwgY2hpbGQpOgotICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCB0byBmaW5pc2gsIGlnbm9yaW5nIEVJTlRSLiIiIgotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNoaWxkLndhaXQoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVJTlRSOgotICAgICAgICAgICAgICAgICAgICByYWlzZQotCi0gICAgZGVmIHJ1bl90ZXN0KHNlbGYpOgotICAgICAgICAjIEluc3RhbGwgaGFuZGxlcnMuIFRoaXMgZnVuY3Rpb24gcnVucyBpbiBhIHN1Yi1wcm9jZXNzLCBzbyB3ZQotICAgICAgICAjIGRvbid0IHdvcnJ5IGFib3V0IHJlLXNldHRpbmcgdGhlIGRlZmF1bHQgaGFuZGxlcnMuCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2VsZi5oYW5kbGVyQSkKLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgc2VsZi5oYW5kbGVyQikKLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQotCi0gICAgICAgICMgVmFyaWFibGVzIHRoZSBzaWduYWxzIHdpbGwgbW9kaWZ5OgotICAgICAgICBzZWxmLmFfY2FsbGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5iX2NhbGxlZCA9IEZhbHNlCi0KLSAgICAgICAgIyBMZXQgdGhlIHN1Yi1wcm9jZXNzZXMga25vdyB3aG8gdG8gc2VuZCBzaWduYWxzIHRvLgotICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQotCi0gICAgICAgIGNoaWxkID0gaWdub3JpbmdfZWludHIoc3VicHJvY2Vzcy5Qb3BlbiwgWydraWxsJywgJy1IVVAnLCBzdHIocGlkKV0pCi0gICAgICAgIGlmIGNoaWxkOgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKQotICAgICAgICAgICAgaWYgbm90IHNlbGYuYV9jYWxsZWQ6Ci0gICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxKSAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBiZSBkZWxpdmVyZWQuCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFfY2FsbGVkKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYl9jYWxsZWQpCi0gICAgICAgIHNlbGYuYV9jYWxsZWQgPSBGYWxzZQotCi0gICAgICAgICMgTWFrZSBzdXJlIHRoZSBzaWduYWwgaXNuJ3QgZGVsaXZlcmVkIHdoaWxlIHRoZSBwcmV2aW91cwotICAgICAgICAjIFBvcGVuIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQsIGJlY2F1c2UgX19kZWxfXyBzd2FsbG93cwotICAgICAgICAjIGV4Y2VwdGlvbnMuCi0gICAgICAgIGRlbCBjaGlsZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjaGlsZCA9IHN1YnByb2Nlc3MuUG9wZW4oWydraWxsJywgJy1VU1IxJywgc3RyKHBpZCldKQotICAgICAgICAgICAgIyBUaGlzIHdhaXQgc2hvdWxkIGJlIGludGVycnVwdGVkIGJ5IHRoZSBzaWduYWwncyBleGNlcHRpb24uCi0gICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDEpICAjIEdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGJlIGRlbGl2ZXJlZC4KLSAgICAgICAgICAgIHNlbGYuZmFpbCgnSGFuZGxlckJDYWxsZWQgZXhjZXB0aW9uIG5vdCByYWlzZWQnKQotICAgICAgICBleGNlcHQgSGFuZGxlckJDYWxsZWQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5iX2NhbGxlZCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hX2NhbGxlZCkKLQotICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctVVNSMicsIHN0cihwaWQpXSkKLSAgICAgICAgaWYgY2hpbGQ6Ci0gICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpICAjIE5vdGhpbmcgc2hvdWxkIGhhcHBlbi4KLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKLSAgICAgICAgICAgICMgVGhlIHJhY2UgY29uZGl0aW9uIGluIHBhdXNlIGRvZXNuJ3QgbWF0dGVyIGluIHRoaXMgY2FzZSwKLSAgICAgICAgICAgICMgc2luY2UgYWxhcm0gaXMgZ29pbmcgdG8gcmFpc2UgYSBLZXlib2FyZEV4Y2VwdGlvbiwgd2hpY2gKLSAgICAgICAgICAgICMgd2lsbCBza2lwIHRoZSBjYWxsLgotICAgICAgICAgICAgc2lnbmFsLnBhdXNlKCkKLSAgICAgICAgICAgICMgQnV0IGlmIGFub3RoZXIgc2lnbmFsIGFycml2ZXMgYmVmb3JlIHRoZSBhbGFybSwgcGF1c2UKLSAgICAgICAgICAgICMgbWF5IHJldHVybiBlYXJseS4KLSAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIlNvbWUgb3RoZXIgZXhjZXB0aW9uIHdva2UgdXMgZnJvbSBwYXVzZTogJXMiICUKLSAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2suZm9ybWF0X2V4YygpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsKCJwYXVzZSByZXR1cm5lZCBvZiBpdHMgb3duIGFjY29yZCwgYW5kIHRoZSBzaWduYWwiCi0gICAgICAgICAgICAgICAgICAgICAgIiBkaWRuJ3QgYXJyaXZlIGFmdGVyIGFub3RoZXIgc2Vjb25kLiIpCi0KLSAgICAjIElzc3VlIDM4NjQsIHVua25vd24gaWYgdGhpcyBhZmZlY3RzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZnJlZWJzZCBhbHNvCi0gICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCi0gICAgICAgICdpbnRlciBwcm9jZXNzIHNpZ25hbHMgbm90IHJlbGlhYmxlIChkbyBub3QgbWl4IHdlbGwgd2l0aCB0aHJlYWRpbmcpICcKLSAgICAgICAgJ29uIGZyZWVic2Q2JykKLSAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgotICAgICAgICAjIFRoaXMgZnVuY3Rpb24gc3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB0byBpbnN1bGF0ZSB0aGUgbWFpbgotICAgICAgICAjIHRlc3QtcnVubmluZyBwcm9jZXNzIGZyb20gYWxsIHRoZSBzaWduYWxzLiBJdCB0aGVuCi0gICAgICAgICMgY29tbXVuaWNhdGVzIHdpdGggdGhhdCBjaGlsZCBwcm9jZXNzIG92ZXIgYSBwaXBlIGFuZAotICAgICAgICAjIHJlLXJhaXNlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZXhjZXB0aW9ucyB0aGUgY2hpbGQKLSAgICAgICAgIyByYWlzZXMuIFRoZSByZWFsIHdvcmsgaGFwcGVucyBpbiBzZWxmLnJ1bl90ZXN0KCkuCi0gICAgICAgIG9zX2RvbmVfciwgb3NfZG9uZV93ID0gb3MucGlwZSgpCi0gICAgICAgIHdpdGggY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV9yLCAncmInKSkgYXMgZG9uZV9yLCBcCi0gICAgICAgICAgICAgY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV93LCAnd2InKSkgYXMgZG9uZV93OgotICAgICAgICAgICAgY2hpbGQgPSBvcy5mb3JrKCkKLSAgICAgICAgICAgIGlmIGNoaWxkID09IDA6Ci0gICAgICAgICAgICAgICAgIyBJbiB0aGUgY2hpbGQgcHJvY2VzczsgcnVuIHRoZSB0ZXN0IGFuZCByZXBvcnQgcmVzdWx0cwotICAgICAgICAgICAgICAgICMgdGhyb3VnaCB0aGUgcGlwZS4KLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGRvbmVfci5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgICMgSGF2ZSB0byBjbG9zZSBkb25lX3cgYWdhaW4gaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICMgZXhpdF9zdWJwcm9jZXNzKCkgd2lsbCBza2lwIHRoZSBlbmNsb3Npbmcgd2l0aCBibG9jay4KLSAgICAgICAgICAgICAgICAgICAgd2l0aCBjbG9zaW5nKGRvbmVfdyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXAodHJhY2ViYWNrLmZvcm1hdF9leGMoKSwgZG9uZV93KQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChOb25lLCBkb25lX3cpCi0gICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICBwcmludCgnVWggb2gsIHJhaXNlZCBmcm9tIHBpY2tsZS4nKQotICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBleGl0X3N1YnByb2Nlc3MoKQotCi0gICAgICAgICAgICBkb25lX3cuY2xvc2UoKQotICAgICAgICAgICAgIyBCbG9jayBmb3IgdXAgdG8gTUFYX0RVUkFUSU9OIHNlY29uZHMgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaC4KLSAgICAgICAgICAgIHIsIHcsIHggPSBzZWxlY3Quc2VsZWN0KFtkb25lX3JdLCBbXSwgW10sIHNlbGYuTUFYX0RVUkFUSU9OKQotICAgICAgICAgICAgaWYgZG9uZV9yIGluIHI6Ci0gICAgICAgICAgICAgICAgdGIgPSBwaWNrbGUubG9hZChkb25lX3IpCi0gICAgICAgICAgICAgICAgaWYgdGI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCh0YikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgb3Mua2lsbChjaGlsZCwgc2lnbmFsLlNJR0tJTEwpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdUZXN0IGRlYWRsb2NrZWQgYWZ0ZXIgJWQgc2Vjb25kcy4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NQVhfRFVSQVRJT04pCi0KLQotQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKIGNsYXNzIFBvc2l4VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0cml2aWFsX3NpZ25hbF9oYW5kbGVyKHNlbGYsICphcmdzKToKICAgICAgICAgcGFzcwpAQCAtMjI0LDYgKzYyLDE1IEBACiAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaHVwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0hVUCksIGh1cCkKIAorICAgICMgSXNzdWUgMzg2NCwgdW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybT09J2ZyZWVic2Q2JywKKyAgICAgICAgJ2ludGVyIHByb2Nlc3Mgc2lnbmFscyBub3QgcmVsaWFibGUgKGRvIG5vdCBtaXggd2VsbCB3aXRoIHRocmVhZGluZykgJworICAgICAgICAnb24gZnJlZWJzZDYnKQorICAgIGRlZiB0ZXN0X2ludGVycHJvY2Vzc19zaWduYWwoc2VsZik6CisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCAnc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5JykKKyAgICAgICAgYXNzZXJ0X3B5dGhvbl9vayhzY3JpcHQpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW5kb3dzIHNwZWNpZmljIikKIGNsYXNzIFdpbmRvd3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKaW5kZXggZGEyMGEzZC4uZjY5ODkyNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQpAQCAtNzUsNyArNzUsNyBAQAogICAgIGRlZiB0ZXN0X2luaXRfcGF0aGluZm8oc2VsZik6CiAgICAgICAgIGRpcl9zZXQgPSBzaXRlLl9pbml0X3BhdGhpbmZvKCkKICAgICAgICAgZm9yIGVudHJ5IGluIFtzaXRlLm1ha2VwYXRoKHBhdGgpWzFdIGZvciBwYXRoIGluIHN5cy5wYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKHBhdGgpXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggYW5kIG9zLnBhdGguZXhpc3RzKHBhdGgpXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZW50cnksIGRpcl9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBmcm9tIHN5cy5wYXRoIG5vdCBmb3VuZCBpbiBzZXQgcmV0dXJuZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgX2luaXRfcGF0aGluZm8oKTogJXMiICUgKGVudHJ5LCBkaXJfc2V0KSkKQEAgLTI0MywxMyArMjQzLDE0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKICAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignL0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgIyBPUyBYIG5vbi1mcmFtd2V3b3JrIGJ1aWxkcywgTGludXgsIEZyZWVCU0QsIGV0YwogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDEpCi0gICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzBdLCB3YW50ZWQpCiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDNkNmQyMDUuLjk4MmE5NzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0xMTYxLDYgKzExNjEsMTcgQEAKICAgICAgICAgc29jay5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHNvY2suc2VuZCwgYiJzcGFtIikKIAorICAgIGRlZiB0ZXN0Q2xvc2VFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc29ja2V0LnNvY2tldChmaWxlbm89c29jay5maWxlbm8oKSkuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgIyBXaW5zb2NrIGFwcGFyZW50bHkgcmFpc2VzIEVOT1RTT0NLCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVyci5lcnJubywgKGVycm5vLkVCQURGLCBlcnJuby5FTk9UU09DSykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImNsb3NlKCkgc2hvdWxkIHJhaXNlIEVCQURGL0VOT1RTT0NLIikKKwogICAgIGRlZiB0ZXN0TmV3QXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgIyB0ZXN0aW5nIC5mYW1pbHksIC50eXBlIGFuZCAucHJvdG9jb2wKIApAQCAtMjgyMyw2ICsyODM0LDcgQEAKICAgICAgICAgICAgIG5ieXRlcyA9IHNlbGYuc2VuZG1zZ1RvU2VydmVyKFttc2ddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ieXRlcywgbGVuKG1zZykpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiwgInNlZSBpc3N1ZSAjMjQ3MjUiKQogICAgIGRlZiB0ZXN0RkRQYXNzRW1wdHkoc2VsZik6CiAgICAgICAgICMgVHJ5IHRvIHBhc3MgYW4gZW1wdHkgRkQgYXJyYXkuICBDYW4gcmVjZWl2ZSBlaXRoZXIgbm8gYXJyYXkKICAgICAgICAgIyBvciBhbiBlbXB0eSBhcnJheS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggMGQwZjg2Zi4uNTU0YzEwNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKQEAgLTU4LDYgKzU4LDcgQEAKIAogQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKIGRlZiBzaW1wbGVfc3VicHJvY2Vzcyh0ZXN0Y2FzZSk6CisgICAgIiIiVGVzdHMgdGhhdCBhIGN1c3RvbSBjaGlsZCBwcm9jZXNzIGlzIG5vdCB3YWl0ZWQgb24gKElzc3VlIDE1NDAzODYpIiIiCiAgICAgcGlkID0gb3MuZm9yaygpCiAgICAgaWYgcGlkID09IDA6CiAgICAgICAgICMgRG9uJ3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBpdCB3b3VsZCBiZSBjYXVnaHQgYnkgdGhlIHRlc3QgaGFybmVzcy4KQEAgLTEwMyw3ICsxMDQsNiBAQAogICAgICAgICBjbGFzcyBNeVNlcnZlcihzdnJjbHMpOgogICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQogICAgICAgICAgICAgICAgIHJhaXNlCiAKICAgICAgICAgY2xhc3MgTXlIYW5kbGVyKGhkbHJiYXNlKToKQEAgLTI3OSw2ICsyNzksMTAzIEBACiAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKQogCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICB3aXRoIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIHNlcnZlci5zb2NrZXQuZmlsZW5vKCkpCisKKworY2xhc3MgRXJyb3JIYW5kbGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHRoZSBzZXJ2ZXJzIHBhc3Mgbm9ybWFsIGV4Y2VwdGlvbnMgZnJvbSB0aGUgaGFuZGxlciB0bworICAgIGhhbmRsZV9lcnJvcigpLCBhbmQgdGhhdCBleGl0aW5nIGV4Y2VwdGlvbnMgbGlrZSBTeXN0ZW1FeGl0IGFuZAorICAgIEtleWJvYXJkSW50ZXJydXB0IGFyZSBub3QgcGFzc2VkLiIiIgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0LnN1cHBvcnQudW5saW5rKHRlc3Quc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zeW5jX2hhbmRsZWQoc2VsZik6CisgICAgICAgIEJhc2VFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3luY19ub3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIEJhc2VFcnJvclRlc3RTZXJ2ZXIoU3lzdGVtRXhpdCkKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1GYWxzZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3RfdGhyZWFkaW5nX2hhbmRsZWQoc2VsZik6CisgICAgICAgIFRocmVhZGluZ0Vycm9yVGVzdFNlcnZlcihWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPVRydWUpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X3RocmVhZGluZ19ub3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgVGhyZWFkaW5nRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X2ZvcmtpbmdfaGFuZGxlZChzZWxmKToKKyAgICAgICAgRm9ya2luZ0Vycm9yVGVzdFNlcnZlcihWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPVRydWUpCisKKyAgICBAcmVxdWlyZXNfZm9ya2luZworICAgIGRlZiB0ZXN0X2Zvcmtpbmdfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIEZvcmtpbmdFcnJvclRlc3RTZXJ2ZXIoU3lzdGVtRXhpdCkKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1GYWxzZSkKKworICAgIGRlZiBjaGVja19yZXN1bHQoc2VsZiwgaGFuZGxlZCk6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOKSBhcyBsb2c6CisgICAgICAgICAgICBleHBlY3RlZCA9ICdIYW5kbGVyIGNhbGxlZFxuJyArICdFcnJvciBoYW5kbGVkXG4nICogaGFuZGxlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2cucmVhZCgpLCBleHBlY3RlZCkKKworCitjbGFzcyBCYXNlRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGNlcHRpb24pOgorICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKChIT1NULCAwKSwgQmFkSGFuZGxlcikKKyAgICAgICAgd2l0aCBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oc2VsZi5zZXJ2ZXJfYWRkcmVzcyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICBzZWxmLndhaXRfZG9uZSgpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Quc3VwcG9ydC5URVNURk4sICdhJykgYXMgbG9nOgorICAgICAgICAgICAgbG9nLndyaXRlKCdFcnJvciBoYW5kbGVkXG4nKQorCisgICAgZGVmIHdhaXRfZG9uZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEJhZEhhbmRsZXIoc29ja2V0c2VydmVyLkJhc2VSZXF1ZXN0SGFuZGxlcik6CisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Quc3VwcG9ydC5URVNURk4sICdhJykgYXMgbG9nOgorICAgICAgICAgICAgbG9nLndyaXRlKCdIYW5kbGVyIGNhbGxlZFxuJykKKyAgICAgICAgcmFpc2Ugc2VsZi5zZXJ2ZXIuZXhjZXB0aW9uKCdUZXN0IGVycm9yJykKKworCitjbGFzcyBUaHJlYWRpbmdFcnJvclRlc3RTZXJ2ZXIoc29ja2V0c2VydmVyLlRocmVhZGluZ01peEluLAorICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKnBvcywgKiprdyk6CisgICAgICAgIHNlbGYuZG9uZSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKnBvcywgKiprdykKKworICAgIGRlZiBzaHV0ZG93bl9yZXF1ZXN0KHNlbGYsICpwb3MsICoqa3cpOgorICAgICAgICBzdXBlcigpLnNodXRkb3duX3JlcXVlc3QoKnBvcywgKiprdykKKyAgICAgICAgc2VsZi5kb25lLnNldCgpCisKKyAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICBzZWxmLmRvbmUud2FpdCgpCisKKworY2xhc3MgRm9ya2luZ0Vycm9yVGVzdFNlcnZlcihzb2NrZXRzZXJ2ZXIuRm9ya2luZ01peEluLCBCYXNlRXJyb3JUZXN0U2VydmVyKToKKyAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICBbY2hpbGRdID0gc2VsZi5hY3RpdmVfY2hpbGRyZW4KKyAgICAgICAgb3Mud2FpdHBpZChjaGlsZCwgMCkKKyAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uY2xlYXIoKQorCiAKIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQppbmRleCBiZWE3YWIxLi5lODkzZjNhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Nwd2QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CkBAIC01Niw1ICs1NiwyMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcHdkLmdldHNwbmFtLCBieXRlc19uYW1lKQogCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgJ25vbi1yb290IHVzZXIgcmVxdWlyZWQnKQorY2xhc3MgVGVzdFNwd2ROb25Sb290KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dldHNwbmFtX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgbmFtZSA9ICdiaW4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUGVybWlzc2lvbkVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBzcHdkLmdldHNwbmFtKG5hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBleGM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJzcHdkIGVudHJ5ICVyIGRvZXNuJ3QgZXhpc3Q6ICVzIiAlIChuYW1lLCBleGMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ1tFcnJubyAxM10gUGVybWlzc2lvbiBkZW5pZWQnKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CmluZGV4IDY0NWVjOGQuLjAwZDQzN2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC0yMSw2ICsyMSwxMyBAQAogCiBzc2wgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoInNzbCIpCiAKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2hhdmVfdGhyZWFkcyA9IEZhbHNlCitlbHNlOgorICAgIF9oYXZlX3RocmVhZHMgPSBUcnVlCisKIFBST1RPQ09MUyA9IHNvcnRlZChzc2wuX1BST1RPQ09MX05BTUVTKQogSE9TVCA9IHN1cHBvcnQuSE9TVAogCkBAIC01MywxMCArNjAsMTAgQEAKICMgVHdvIGtleXMgYW5kIGNlcnRzIHNpZ25lZCBieSB0aGUgc2FtZSBDQSAoZm9yIFNOSSB0ZXN0cykKIFNJR05FRF9DRVJURklMRSA9IGRhdGFfZmlsZSgia2V5Y2VydDMucGVtIikKIFNJR05FRF9DRVJURklMRTIgPSBkYXRhX2ZpbGUoImtleWNlcnQ0LnBlbSIpCi1TSUdOSU5HX0NBID0gZGF0YV9maWxlKCJweWNhY2VydC5wZW0iKQorIyBTYW1lIGNlcnRpZmljYXRlIGFzIHB5Y2FjZXJ0LnBlbSwgYnV0IHdpdGhvdXQgZXh0cmEgdGV4dCBpbiBmaWxlCitTSUdOSU5HX0NBID0gZGF0YV9maWxlKCJjYXBhdGgiLCAiY2VmZjE3MTAuMCIpCiAKIFJFTU9URV9IT1NUID0gInNlbGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0IgotUkVNT1RFX1JPT1RfQ0VSVCA9IGRhdGFfZmlsZSgic2VsZnNpZ25lZF9weXRob250ZXN0ZG90bmV0LnBlbSIpCiAKIEVNUFRZQ0VSVCA9IGRhdGFfZmlsZSgibnVsbGNlcnQucGVtIikKIEJBRENFUlQgPSBkYXRhX2ZpbGUoImJhZGNlcnQucGVtIikKQEAgLTMyOCw3ICszMzUsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHNzKQogICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCIiLCBSZXNvdXJjZVdhcm5pbmcpKToKICAgICAgICAgICAgIGRlbCBzcwotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cigpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCiAKICAgICBkZWYgdGVzdF93cmFwcGVkX3VuY29ubmVjdGVkKHNlbGYpOgogICAgICAgICAjIE1ldGhvZHMgb24gYW4gdW5jb25uZWN0ZWQgU1NMU29ja2V0IHByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwKQEAgLTc4Myw2ICs3OTAsMjIgQEAKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfb2soIkZlYiAgOSAwMDowMDowMCAyMDA3IEdNVCIsIDExNzA5NzkyMDAuMCkKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfZmFpbChsb2NhbF9mZWJydWFyeV9uYW1lKCkgKyAiICA5IDAwOjAwOjAwIDIwMDcgR01UIikKIAorICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuY2xvc2UpCisgICAgICAgIHBvcnQgPSBzdXBwb3J0LmJpbmRfcG9ydChzZXJ2ZXIpICAjIFJlc2VydmUgcG9ydCBidXQgZG9uJ3QgbGlzdGVuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKEhPU1QsIHBvcnQpKQorICAgICAgICAjIElzc3VlICMxOTkxOTogV2luZG93cyBtYWNoaW5lcyBvciBWTXMgaG9zdGVkIG9uIFdpbmRvd3MKKyAgICAgICAgIyBtYWNoaW5lcyBzb21ldGltZXMgcmV0dXJuIEVXT1VMREJMT0NLLgorICAgICAgICBlcnJvcnMgPSAoCisgICAgICAgICAgICBlcnJuby5FQ09OTlJFRlVTRUQsIGVycm5vLkVIT1NUVU5SRUFDSCwgZXJybm8uRVRJTUVET1VULAorICAgICAgICAgICAgZXJybm8uRVdPVUxEQkxPQ0ssCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgZXJyb3JzKQorCiAKIGNsYXNzIENvbnRleHRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTEzNjgsMTQwICsxMzkxLDEwMyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpby53cml0ZSwgMSkKIAogCi1jbGFzcyBOZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CitAdW5pdHRlc3Quc2tpcFVubGVzcyhfaGF2ZV90aHJlYWRzLCAiTmVlZHMgdGhyZWFkaW5nIG1vZHVsZSIpCitjbGFzcyBTaW1wbGVCYWNrZ3JvdW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdHMgdGhhdCBjb25uZWN0IHRvIGEgc2ltcGxlIHNlcnZlciBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihTSUdORURfQ0VSVEZJTEUpCisgICAgICAgIHNlbGYuc2VydmVyX2FkZHIgPSAoSE9TVCwgc2VydmVyLnBvcnQpCisgICAgICAgIHNlcnZlci5fX2VudGVyX18oKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLl9fZXhpdF9fLCBOb25lLCBOb25lLCBOb25lKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGhhdmUgbm8gdmVyaWZpY2F0aW9uIGNlcnRzCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIHRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgZGVmIHRlc3RfY29ubmVjdF9mYWlsKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cy4gQ29ubmVjdGlvbgorICAgICAgICAjIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuIGluZGVwZW5kZW50CisgICAgICAgICMgdGVzdCBtZXRob2QuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogY2hlY2sgY29ubmVjdF9leCgpIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHMuY29ubmVjdF9leChzZWxmLnNlcnZlcl9hZGRyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKIAogICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogbm9uLWJsb2NraW5nIGNvbm5lY3RfZXgoKSBzaG91bGQgYWxsb3cgaGFuZHNoYWtlCiAgICAgICAgICMgdG8gcHJvY2VlZCBhZnRlciB0aGUgc29ja2V0IGdldHMgcmVhZHkuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICMgRVdPVUxEQkxPQ0sgdW5kZXIgV2luZG93cywgRUlOUFJPR1JFU1MgZWxzZXdoZXJlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10sIDUuMCkKKyAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCisgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoMCwgZXJybm8uRUlOUFJPR1JFU1MsIGVycm5vLkVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50V3JpdGVFcnJvcjoKICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCi0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF90aW1lb3V0X2Nvbm5lY3RfZXgoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzEyMDY1OiBvbiBhIHRpbWVvdXQsIGNvbm5lY3RfZXgoKSBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbAotICAgICAgICAjIGVycm5vIChtaW1pY2tpbmcgdGhlIGJlaGF2aW91ciBvZiBub24tU1NMIHNvY2tldHMpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9UkVNT1RFX1JPT1RfQ0VSVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgaWYgcmMgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoZXJybm8uRUFHQUlOLCBlcnJuby5FV09VTERCTE9DSykpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQotCi0gICAgZGVmIHRlc3RfY29ubmVjdF9leF9lcnJvcihzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDQpKQotICAgICAgICAgICAgICAgICMgSXNzdWUgIzE5OTE5OiBXaW5kb3dzIG1hY2hpbmVzIG9yIFZNcyBob3N0ZWQgb24gV2luZG93cwotICAgICAgICAgICAgICAgICMgbWFjaGluZXMgc29tZXRpbWVzIHJldHVybiBFV09VTERCTE9DSy4KLSAgICAgICAgICAgICAgICBlcnJvcnMgPSAoCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVDT05OUkVGVVNFRCwgZXJybm8uRUhPU1RVTlJFQUNILCBlcnJuby5FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVXT1VMREJMT0NLLAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCBlcnJvcnMpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIFNTTCBlc3RhYmxpc2hlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHQoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgIyBTYW1lIGFzIHRlc3RfY29ubmVjdCwgYnV0IHdpdGggYSBzZXBhcmF0ZWx5IGNyZWF0ZWQgY29udGV4dAotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIHNlcnZlciBob3N0bmFtZQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPVJFTU9URV9IT1NUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoUkVNT1RFX1JPT1RfQ0VSVCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgU2FtZSBhcyB0ZXN0X2Nvbm5lY3QsIGJ1dCB3aXRoIGEgc2VwYXJhdGVseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgIyBTYW1lIHdpdGggYSBzZXJ2ZXIgaG9zdG5hbWUKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPSJkdW1teSIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgIyBUaGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0CisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU0lHTklOR19DQSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorCisgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHRfZmFpbChzZWxmKToKKyAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMuIENvbm5lY3Rpb24KKyAgICAgICAgIyBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbiBpbmRlcGVuZGVudAorICAgICAgICAjIHRlc3QgbWV0aG9kLgorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0LCBzZWxmLnNlcnZlcl9hZGRyKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYXBhdGgoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHNlcnZlciBjZXJ0aWZpY2F0ZXMgdXNpbmcgdGhlIGBjYXBhdGhgIGFyZ3VtZW50CkBAIC0xNTA5LDE5OCArMTQ5NSwxMzAgQEAKICAgICAgICAgIyBPcGVuU1NMIDAuOS44biBhbmQgMS4wLjAsIGFzIGEgcmVzdWx0IHRoZSBjYXBhdGggZGlyZWN0b3J5IG11c3QKICAgICAgICAgIyBjb250YWluIGJvdGggdmVyc2lvbnMgb2YgZWFjaCBjZXJ0aWZpY2F0ZSAoc2FtZSBjb250ZW50LCBkaWZmZXJlbnQKICAgICAgICAgIyBmaWxlbmFtZSkgZm9yIHRoaXMgdGVzdCB0byBiZSBwb3J0YWJsZSBhY3Jvc3MgT3BlblNTTCByZWxlYXNlcy4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50CisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYWRhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggb3BlbihSRU1PVEVfUk9PVF9DRVJUKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4oU0lHTklOR19DQSkgYXMgZjoKICAgICAgICAgICAgIHBlbSA9IGYucmVhZCgpCiAgICAgICAgIGRlciA9IHNzbC5QRU1fY2VydF90b19ERVJfY2VydChwZW0pCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1wZW0pCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWRhdGE9cGVtKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKLSAgICAgICAgICAgICMgc2FtZSB3aXRoIERFUgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1kZXIpCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgIyBzYW1lIHdpdGggREVSCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPWRlcikKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICJudCIsICJDYW4ndCB1c2UgYSBzb2NrZXQgYXMgYSBmaWxlIHVuZGVyIFdpbmRvd3MiKQogICAgIGRlZiB0ZXN0X21ha2VmaWxlX2Nsb3NlKHNlbGYpOgogICAgICAgICAjIElzc3VlICM1MjM4OiBjcmVhdGluZyBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtYWtlZmlsZSgpIHNob3VsZG4ndAogICAgICAgICAjIGRlbGF5IGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgInJlYWwgc29ja2V0IiAoaGVyZSB0ZXN0ZWQgd2l0aCBpdHMKICAgICAgICAgIyBmaWxlIGRlc2NyaXB0b3IsIGhlbmNlIHNraXBwaW5nIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc3MuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBmZCA9IHNzLmZpbGVubygpCi0gICAgICAgICAgICBmID0gc3MubWFrZWZpbGUoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoZSBmZCBpcyBzdGlsbCBvcGVuCisgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKKyAgICAgICAgZiA9IHNzLm1ha2VmaWxlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgb3MucmVhZChmZCwgMCkKKyAgICAgICAgIyBDbG9zaW5nIHRoZSBTU0wgc29ja2V0IHNob3VsZCBjbG9zZSB0aGUgZmQgdG9vCisgICAgICAgIHNzLmNsb3NlKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgZToKICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KLSAgICAgICAgICAgIHNzLmNsb3NlKCkKLSAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgotICAgICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUJBREYpCiAKICAgICBkZWYgdGVzdF9ub25fYmxvY2tpbmdfaGFuZHNoYWtlKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKLSAgICAgICAgICAgIGNvdW50ID0gMAotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFJlYWRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5OZWVkZWQgJWQgY2FsbHMgdG8gZG9faGFuZHNoYWtlKCkgdG8gZXN0YWJsaXNoIHNlc3Npb24uXG4iICUgY291bnQpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHMuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NdLCBbXSwgW10pCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuTmVlZGVkICVkIGNhbGxzIHRvIGRvX2hhbmRzaGFrZSgpIHRvIGVzdGFibGlzaCBzZXNzaW9uLlxuIiAlIGNvdW50KQogCiAgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmKToKLSAgICAgICAgZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKLSAgICAgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoaG9zdCk6Ci0gICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIG5vdCBwZW06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgKnNlbGYuc2VydmVyX2FkZHIsIGNlcnQ9U0lHTklOR19DQSkKIAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIHg6Ci0gICAgICAgICAgICAgICAgICAgICNzaG91bGQgZmFpbAotICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIlc1xuIiAlIHgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJHb3Qgc2VydmVyIGNlcnRpZmljYXRlICVzIGZvciAlczolcyEiICUgKHBlbSwgaG9zdCwgcG9ydCkpCi0KLSAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Y2VydCkKLSAgICAgICAgICAgICAgICBpZiBub3QgcGVtOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCi0KLSAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShSRU1PVEVfSE9TVCwgNDQzLCBSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICBpZiBzdXBwb3J0LklQVjZfRU5BQkxFRDoKLSAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwoc2VsZik6CisgICAgICAgICMgQ29ubmVjdGlvbiBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbgorICAgICAgICAjIGluZGVwZW5kZW50IHRlc3QgbWV0aG9kCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAqc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6Ci0gICAgICAgIHJlbW90ZSA9IChSRU1PVEVfSE9TVCwgNDQzKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHJlbW90ZVswXSk6Ci0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJBTEwiKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgIyBFcnJvciBjaGVja2luZyBjYW4gaGFwcGVuIGF0IGluc3RhbnRpYXRpb24gb3Igd2hlbiBjb25uZWN0aW5nCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgotICAgICAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKLSAgICAgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKLSAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKLQotICAgIGRlZiB0ZXN0X2FsZ29yaXRobXMoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzg0ODQ6IGFsbCBhbGdvcml0aG1zIHNob3VsZCBiZSBhdmFpbGFibGUgd2hlbiB2ZXJpZnlpbmcgYQotICAgICAgICAjIGNlcnRpZmljYXRlLgotICAgICAgICAjIFNIQTI1NiB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuOAotICAgICAgICBpZiBzc2wuT1BFTlNTTF9WRVJTSU9OX0lORk8gPCAoMCwgOSwgOCwgMCwgMTUpOgotICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0hBMjU2IG5vdCBhdmFpbGFibGUgb24gJXIiICUgc3NsLk9QRU5TU0xfVkVSU0lPTikKLSAgICAgICAgIyBzaGEyNTYudGJzLWludGVybmV0LmNvbSBuZWVkcyBTTkkgdG8gdXNlIHRoZSBjb3JyZWN0IGNlcnRpZmljYXRlCi0gICAgICAgIGlmIG5vdCBzc2wuSEFTX1NOSToKLSAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNOSSBuZWVkZWQgZm9yIHRoaXMgdGVzdCIpCi0gICAgICAgICMgaHR0cHM6Ly9zaGEyLmhib2Vjay5kZS8gd2FzIHVzZWQgdW50aWwgMjAxMS0wMS0wOCAobm8gcm91dGUgdG8gaG9zdCkKLSAgICAgICAgcmVtb3RlID0gKCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIsIDQ0MykKLSAgICAgICAgc2hhMjU2X2NlcnQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgInNoYTI1Ni5wZW0iKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2hhMjU2X2NlcnQpCi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9InNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIikKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5DaXBoZXIgd2l0aCAlciBpcyAlclxuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW90ZSwgcy5jaXBoZXIoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNlcnRpZmljYXRlIGlzOlxuJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHMuZ2V0cGVlcmNlcnQoKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkFMTCIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAjIEVycm9yIGNoZWNraW5nIGNhbiBoYXBwZW4gYXQgaW5zdGFudGlhdGlvbiBvciB3aGVuIGNvbm5lY3RpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgIk5vIGNpcGhlciBjYW4gYmUgc2VsZWN0ZWQiKToKKyAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iXiQ6LDs/Kidkb3JvdGh5eCIpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9nZXRfY2FfY2VydHNfY2FwYXRoKHNlbGYpOgogICAgICAgICAjIGNhcGF0aCBjZXJ0cyBhcmUgbG9hZGVkIG9uIHJlcXVlc3QKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhcGF0aD1DQVBBVEgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQogCiAgICAgQG5lZWRzX3NuaQogICAgIGRlZiB0ZXN0X2NvbnRleHRfc2V0Z2V0KHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGNvbnRleHQgb2YgYSBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSByZXBsYWNlZC4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4MiA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKLSAgICAgICAgICAgICAgICBzcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDIpCi0KLQotY2xhc3MgTmV0d29ya2VkQklPVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICBjdHgyID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKKyAgICAgICAgICAgIHNzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgxKQorICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgyKQogCiAgICAgZGVmIHNzbF9pb19sb29wKHNlbGYsIHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgIyBBIHNpbXBsZSBJTyBsb29wLiBDYWxsIGZ1bmMoKmFyZ3MpIGRlcGVuZGluZyBvbiB0aGUgZXJyb3Igd2UgZ2V0CkBAIC0xNzM2LDY0ICsxNjU0LDEyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjb3VudCwgZnVuYy5fX25hbWVfXykpCiAgICAgICAgIHJldHVybiByZXQKIAotICAgIGRlZiB0ZXN0X2hhbmRzaGFrZShzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHNvY2suY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgY3R4LmNoZWNrX2hvc3RuYW1lID0gVHJ1ZQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UsIFJFTU9URV9IT1NUKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQotICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnVud3JhcCkKLSAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgotICAgICAgICAgICAgICAgICMgc2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQgcHJvYmFibHkgc2h1dHMgZG93biB0aGUgVENQCi0gICAgICAgICAgICAgICAgIyBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCBhbmQKLSAgICAgICAgICAgICAgICAjIHRoaXMgaXMgcmVwb3J0ZWQgYXMgU1NMX0VSUk9SX1NZU0NBTEwKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzc2wuU1NMRXJyb3IsIHNzbG9iai53cml0ZSwgYidmb28nKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9yZWFkX3dyaXRlX2RhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCi0gICAgICAgICAgICBzb2NrLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIG91dGdvaW5nID0gc3NsLk1lbW9yeUJJTygpCi0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfTk9ORQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UpCi0gICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKLSAgICAgICAgICAgIHJlcSA9IGInR0VUIC8gSFRUUC8xLjBcclxuXHJcbicKLSAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoud3JpdGUsIHJlcSkKLSAgICAgICAgICAgIGJ1ZiA9IHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoucmVhZCwgMTAyNCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo1XSwgYidIVFRQLycpCisgICAgZGVmIHRlc3RfYmlvX2hhbmRzaGFrZShzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBzb2NrLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTSUdOSU5HX0NBKQorICAgICAgICBjdHguY2hlY2tfaG9zdG5hbWUgPSBUcnVlCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlLCAnbG9jYWxob3N0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNzbG9iai5nZXRfY2hhbm5lbF9iaW5kaW5nKCd0bHMtdW5pcXVlJykpCisgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoudW53cmFwKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgorICAgICAgICAgICAgIyBJZiB0aGUgc2VydmVyIHNodXRzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhCisgICAgICAgICAgICAjIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCB0aGlzIGlzIHJlcG9ydGVkIGFzIFNTTF9FUlJPUl9TWVNDQUxMCisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNzbC5TU0xFcnJvciwgc3Nsb2JqLndyaXRlLCBiJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9iaW9fcmVhZF93cml0ZV9kYXRhKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKKyAgICAgICAgcmVxID0gYidGT09cbicKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai53cml0ZSwgcmVxKQorICAgICAgICBidWYgPSBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnJlYWQsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBiJ2Zvb1xuJykKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai51bndyYXApCiAKIAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBfaGF2ZV90aHJlYWRzID0gRmFsc2UKLWVsc2U6Ci0gICAgX2hhdmVfdGhyZWFkcyA9IFRydWUKK2NsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKKyAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKKyAgICAgICAgICAgIGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuSVBWNl9FTkFCTEVELCAnTmVlZHMgSVB2NicpCisgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9pcHY2KHNlbGYpOgorICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCdpcHY2Lmdvb2dsZS5jb20nKToKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorCisgICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCisgICAgICAgICMgY2VydGlmaWNhdGUuCisgICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44CisgICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQorICAgICAgICAjIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIG5lZWRzIFNOSSB0byB1c2UgdGhlIGNvcnJlY3QgY2VydGlmaWNhdGUKKyAgICAgICAgaWYgbm90IHNzbC5IQVNfU05JOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU05JIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IikKKyAgICAgICAgIyBodHRwczovL3NoYTIuaGJvZWNrLmRlLyB3YXMgdXNlZCB1bnRpbCAyMDExLTAxLTA4IChubyByb3V0ZSB0byBob3N0KQorICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQorICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIik6CisgICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzaGEyNTZfY2VydCkKKyAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT0ic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbkNpcGhlciB3aXRoICVyIGlzICVyXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3RlLCBzLmNpcGhlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ2VydGlmaWNhdGUgaXM6XG4lc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQocy5nZXRwZWVyY2VydCgpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKworZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUodGVzdCwgaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKKyAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCkpCisgICAgaWYgbm90IHBlbToKKyAgICAgICAgdGVzdC5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gJXM6JXMhIiAlIChob3N0LCBwb3J0KSkKKworICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwgY2FfY2VydHM9Y2VydCkKKyAgICBpZiBub3QgcGVtOgorICAgICAgICB0ZXN0LmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQorICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCisKK2RlZiBfdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwodGVzdCwgaG9zdCwgcG9ydCk6CisgICAgdHJ5OgorICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksIGNhX2NlcnRzPUNFUlRGSUxFKQorICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgeDoKKyAgICAgICAgI3Nob3VsZCBmYWlsCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzXG4iICUgeCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0LmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yICVzOiVzISIgJSAocGVtLCBob3N0LCBwb3J0KSkKKworCitpZiBfaGF2ZV90aHJlYWRzOgogICAgIGZyb20gdGVzdC5zc2xfc2VydmVycyBpbXBvcnQgbWFrZV9odHRwc19zZXJ2ZXIKIAogICAgIGNsYXNzIFRocmVhZGVkRWNob1NlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTE4ODEsNiArMTg2MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN0cmlwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW9mLCBzbyBxdWl0IHRoaXMgaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzZWxmLnNzbGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYW55IHRlc3RzIHNodXQgdGhlIFRDUCBjb25uZWN0aW9uIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFuIFNTTCBzaHV0ZG93bi4gVGhpcyBjYXVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bndyYXAoKSB0byByYWlzZSBPU0Vycm9yIHdpdGggZXJybm89MCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc3RyaXBwZWQgPT0gYidvdmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNvbm5lY3Rpb25jaGF0dHk6CkBAIC0yNzE4LDEyICsyNzA5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBhZGRyID0gcy5yZWN2ZnJvbV9pbnRvKGIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiWzpjb3VudF0KIAotICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCisgICAgICAgICAgICAgICAgIyAobmFtZSwgbWV0aG9kLCBleHBlY3Qgc3VjY2Vzcz8sICphcmdzLCByZXR1cm4gdmFsdWUgZnVuYykKICAgICAgICAgICAgICAgICBzZW5kX21ldGhvZHMgPSBbCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZCcsIHMuc2VuZCwgVHJ1ZSwgW10pLAotICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZGFsbCcsIHMuc2VuZGFsbCwgVHJ1ZSwgW10pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmQnLCBzLnNlbmQsIFRydWUsIFtdLCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSwgbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSwgbGFtYmRhIHg6IE5vbmUpLAogICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIHdoZXRoZXIgdG8gZXhwZWN0IHN1Y2Nlc3MsICphcmdzKQogICAgICAgICAgICAgICAgIHJlY3ZfbWV0aG9kcyA9IFsKICAgICAgICAgICAgICAgICAgICAgKCdyZWN2Jywgcy5yZWN2LCBUcnVlLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICgncmVjdmZyb20nLCBzLnJlY3Zmcm9tLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCkBAIC0yNzMyLDEwICsyNzI0LDEzIEBACiAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgIGRhdGFfcHJlZml4ID0gIlBSRUZJWF8iCiAKLSAgICAgICAgICAgICAgICBmb3IgbWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzIGluIHNlbmRfbWV0aG9kczoKKyAgICAgICAgICAgICAgICBmb3IgKG1ldGhfbmFtZSwgc2VuZF9tZXRoLCBleHBlY3Rfc3VjY2VzcywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWxfbWV0aCkgaW4gc2VuZF9tZXRob2RzOgogICAgICAgICAgICAgICAgICAgICBpbmRhdGEgPSAoZGF0YV9wcmVmaXggKyBtZXRoX25hbWUpLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGgoaW5kYXRhLCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbmRfbWV0aChpbmRhdGEsICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gInNlbmRpbmcgd2l0aCB7fSIuZm9ybWF0KG1ldGhfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCByZXRfdmFsX21ldGgoaW5kYXRhKSwgbXNnPW1zZykKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEgPSBzLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCkBAIC0zMzYwLDE4ICszMzU1LDIwIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICBmb3IgZmlsZW5hbWUgaW4gWwotICAgICAgICBDRVJURklMRSwgUkVNT1RFX1JPT1RfQ0VSVCwgQllURVNfQ0VSVEZJTEUsCisgICAgICAgIENFUlRGSUxFLCBCWVRFU19DRVJURklMRSwKICAgICAgICAgT05MWUNFUlQsIE9OTFlLRVksIEJZVEVTX09OTFlDRVJULCBCWVRFU19PTkxZS0VZLAogICAgICAgICBTSUdORURfQ0VSVEZJTEUsIFNJR05FRF9DRVJURklMRTIsIFNJR05JTkdfQ0EsCiAgICAgICAgIEJBRENFUlQsIEJBREtFWSwgRU1QVFlDRVJUXToKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgIHJhaXNlIHN1cHBvcnQuVGVzdEZhaWxlZCgiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBmaWxlICVyIiAlIGZpbGVuYW1lKQogCi0gICAgdGVzdHMgPSBbQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0c10KKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0cywKKyAgICAgICAgU2ltcGxlQmFja2dyb3VuZFRlc3RzLAorICAgIF0KIAogICAgIGlmIHN1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgnbmV0d29yaycpOgogICAgICAgICB0ZXN0cy5hcHBlbmQoTmV0d29ya2VkVGVzdHMpCi0gICAgICAgIHRlc3RzLmFwcGVuZChOZXR3b3JrZWRCSU9UZXN0cykKIAogICAgIGlmIF9oYXZlX3RocmVhZHM6CiAgICAgICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CmluZGV4IDAwODlhZTguLjlhNTRmZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKQEAgLTY5OSw2ICs2OTksNyBAQAogICAgICAgICAgICAgbnVtLCBkZW4gPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyh4KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBudW0vZGVuKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihUcnVlLCAidGVtcG9yYXJpbHkgZGlzYWJsZWQ6IHNlZSAjMjU5MjgiKQogICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CiAgICAgICAgIEQgPSBEZWNpbWFsCiAgICAgICAgIF9leGFjdF9yYXRpbyA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvCkBAIC03MzAsNiArNzMxLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocmF0aW9bMV0sIE5vbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmF0aW9bMF0pLCB0eXBlKG5hbikpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKFRydWUsICJ0ZW1wb3JhcmlseSBkaXNhYmxlZDogc2VlICMyNTkyOCIpCiAgICAgZGVmIHRlc3RfZGVjaW1hbF9uYW4oc2VsZik6CiAgICAgICAgIE5BTiA9IERlY2ltYWwoIk5BTiIpCiAgICAgICAgIHNOQU4gPSBEZWNpbWFsKCJzTkFOIikKQEAgLTEyNTgsNiArMTI2MCw3IEBACiAgICAgICAgIHdpdGggZGVjaW1hbC5sb2NhbGNvbnRleHQoZGVjaW1hbC5CYXNpY0NvbnRleHQpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGVjaW1hbC5JbnZhbGlkT3BlcmF0aW9uLCBzdGF0aXN0aWNzLl9zdW0sIGRhdGEpCiAKKyAgICBAdW5pdHRlc3Quc2tpcElmKFRydWUsICJ0ZW1wb3JhcmlseSBkaXNhYmxlZDogc2VlICMyNTkyOCIpCiAgICAgZGVmIHRlc3RfZGVjaW1hbF9zbmFuX3JhaXNlcyhzZWxmKToKICAgICAgICAgIyBBZGRpbmcgc05BTiBzaG91bGQgcmFpc2UgSW52YWxpZE9wZXJhdGlvbi4KICAgICAgICAgc05BTiA9IERlY2ltYWwoJ3NOQU4nKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKaW5kZXggODUxMjZlNi4uMWNjOGI0MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CkBAIC0xNTMsOCArMTUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyB1c2luZyAnJXMnOyBncm91cCAnYScgPSAnJXMnLCBncm91cCAnYicgPSAlcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAoZm91bmQuc3RyaW5nLCBmb3VuZC5yZS5wYXR0ZXJuLCBmb3VuZC5ncm91cCgnYScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5ncm91cCgnYicpKSkKLSAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0gnLCdJJywnaicsJ20nLCdNJywncCcsJ1MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywnQScsJ2InLCdCJywnYycsJ2QnLCdHJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnLCd1JywnVScsJ1YnLCd3JywnVycsJ3gnLCdYJywneScsJ1knLCdaJywnJScpOgogICAgICAgICAgICAgY29tcGlsZWQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiJSIgKyBkaXJlY3RpdmUpCiAgICAgICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgIk1hdGNoaW5nIGZhaWxlZCBvbiAnJXMnIHVzaW5nICclcycgcmVnZXgiICUKQEAgLTIxOSw2ICsyMTksMjYgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCInJXMnIGRpZCBub3QgcmFpc2UgVmFsdWVFcnJvciIgJSBiYWRfZm9ybWF0KQogCisgICAgICAgICMgQW1iaWd1b3VzIG9yIGluY29tcGxldGUgY2FzZXMgdXNpbmcgSVNPIHllYXIvd2Vlay93ZWVrZGF5IGRpcmVjdGl2ZXMKKyAgICAgICAgIyAxLiBJU08gd2VlayAoJVYpIGlzIHNwZWNpZmllZCwgYnV0IHRoZSB5ZWFyIGlzIHNwZWNpZmllZCB3aXRoICVZCisgICAgICAgICMgaW5zdGVhZCBvZiAlRworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MCIsICIlWSAlViIpCisgICAgICAgICMgMi4gSVNPIHllYXIgKCVHKSBhbmQgSVNPIHdlZWsgKCVWKSBhcmUgc3BlY2lmaWVkLCBidXQgd2Vla2RheSBpcyBub3QKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTEiLCAiJUcgJVYiKQorICAgICAgICAjIDMuIElTTyB5ZWFyICglRykgYW5kIHdlZWtkYXkgYXJlIHNwZWNpZmllZCwgYnV0IElTTyB3ZWVrICglVikgaXMgbm90CisgICAgICAgIGZvciB3IGluICgnQScsICdhJywgJ3cnLCAndScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUxIiwiJUcgJXt9Ii5mb3JtYXQodykpCisgICAgICAgICMgNC4gSVNPIHllYXIgaXMgc3BlY2lmaWVkIGFsb25lIChlLmcuIHRpbWUuc3RycHRpbWUoJzIwMTUnLCAnJUcnKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjIwMTUiLCAiJUciKQorICAgICAgICAjIDUuIEp1bGlhbi9vcmRpbmFsIGRheSAoJWopIGlzIHNwZWNpZmllZCB3aXRoICVHLCBidXQgbm90ICVZCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDI1NiIsICIlRyAlaiIpCisKKwogICAgIGRlZiB0ZXN0X3N0cnB0aW1lX2V4Y2VwdGlvbl9jb250ZXh0KHNlbGYpOgogICAgICAgICAjIGNoZWNrIHRoYXQgdGhpcyBkb2Vzbid0IGNoYWluIGV4Y2VwdGlvbnMgbmVlZGxlc3NseSAoc2VlICMxNzU3MikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBlOgpAQCAtMjkwLDcgKzMxMCw3IEBACiAKICAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgogICAgICAgICAjIFRlc3Qgd2Vla2RheSBkaXJlY3RpdmVzCi0gICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdBJywgJ2EnLCAndycpOgorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQScsICdhJywgJ3cnLCAndScpOgogICAgICAgICAgICAgc2VsZi5oZWxwZXIoZGlyZWN0aXZlLDYpCiAKICAgICBkZWYgdGVzdF9qdWxpYW4oc2VsZik6CkBAIC00NTcsMTYgKzQ3NywyMCBAQAogICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGluZmVyIGRhdGUgaWYgZ2l2ZW4geWVhciwgd2VlayBvZiB5ZWFyICglVSBvciAlVykKICAgICAgICAgIyBhbmQgZGF5IG9mIHRoZSB3ZWVrCiAgICAgICAgIGRlZiB0ZXN0X2hlbHBlcih5bWRfdHVwbGUsIHRlc3RfcmVhc29uKToKLSAgICAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdXJywgJ1UnKToKLSAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiUlWSAlJSVzICUldyIgJSBkaXJlY3RpdmUKLSAgICAgICAgICAgICAgICBkdF9kYXRlID0gZGF0ZXRpbWVfZGF0ZSgqeW1kX3R1cGxlKQotICAgICAgICAgICAgICAgIHN0cnBfaW5wdXQgPSBkdF9kYXRlLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcpCi0gICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwgZm9ybWF0X3N0cmluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbOjNdID09IHltZF90dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgdGVzdCBmYWlsZWQgdy8gJyVzJzogJXMgIT0gJXMgKCVzICE9ICVzKSIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X3JlYXNvbiwgZGlyZWN0aXZlLCBzdHJwX2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sIGR0X2RhdGUudGltZXR1cGxlKClbN10pKQorICAgICAgICAgICAgZm9yIHllYXJfd2Vla19mb3JtYXQgaW4gKCclWSAlVycsICclWSAlVScsICclRyAlVicpOgorICAgICAgICAgICAgICAgIGZvciB3ZWVrZGF5X2Zvcm1hdCBpbiAoJyV3JywgJyV1JywgJyVhJywgJyVBJyk6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB5ZWFyX3dlZWtfZm9ybWF0ICsgJyAnICsgd2Vla2RheV9mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QodGVzdF9yZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9eW1kX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9Zm9ybWF0X3N0cmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBkdF9kYXRlID0gZGF0ZXRpbWVfZGF0ZSgqeW1kX3R1cGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cnBfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gIiVyOiAlcyAhPSAlcyIgJSAoc3RycF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RycF9vdXRwdXRbOjNdLCB5bWRfdHVwbGUsIG1zZykKICAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDMpLCAid2VlayAwIikKICAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDgpLCAiY29tbW9uIGNhc2UiKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMTMpLCAiZGF5IG9uIFN1bmRheSIpCkBAIC00OTgsMzMgKzUyMiw0OCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodmFsdWUsIGZvcm1hdClbOi0xXSwgZXhwZWN0ZWQpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMCcsICclWSAlVSAldycsIDIwMTQsIDEyLCAyOCwgMCwgMCwgMCwgNiwgMzYyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDAnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorICAgICAgICBjaGVjaygnMjAxNSAxIDEnLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2MykKICAgICAgICAgY2hlY2soJzIwMTUgMCAxJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMScsICclWSAlVyAldycsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzYzKQorICAgICAgICBjaGVjaygnMjAxNSAxIDInLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAyJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMicsICclWSAlVyAldycsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQorICAgICAgICBjaGVjaygnMjAxNSAxIDMnLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMTUgMCAzJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMycsICclWSAlVyAldycsIDIwMTQsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY1KQorICAgICAgICBjaGVjaygnMjAxNSAxIDQnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAxNSAwIDQnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAxNSAwIDQnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQorICAgICAgICBjaGVjaygnMjAxNSAxIDUnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDUnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDUnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQorICAgICAgICBjaGVjaygnMjAxNSAxIDYnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDYnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDYnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQorICAgICAgICBjaGVjaygnMjAxNSAxIDcnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQogCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMCcsICclWSAlVSAldycsIDIwMDgsIDEyLCAyOCwgMCwgMCwgMCwgNiwgMzYzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDAnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorICAgICAgICBjaGVjaygnMjAwOSAxIDEnLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMDkgMCAxJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMScsICclWSAlVyAldycsIDIwMDgsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzY0KQorICAgICAgICBjaGVjaygnMjAwOSAxIDInLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMDkgMCAyJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMicsICclWSAlVyAldycsIDIwMDgsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY1KQorICAgICAgICBjaGVjaygnMjAwOSAxIDMnLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NikKICAgICAgICAgY2hlY2soJzIwMDkgMCAzJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjYpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMycsICclWSAlVyAldycsIDIwMDgsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY2KQorICAgICAgICBjaGVjaygnMjAwOSAxIDQnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAwOSAwIDQnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAwOSAwIDQnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQorICAgICAgICBjaGVjaygnMjAwOSAxIDUnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAwOSAwIDUnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAwOSAwIDUnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQorICAgICAgICBjaGVjaygnMjAwOSAxIDYnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDYnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDYnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQorICAgICAgICBjaGVjaygnMjAwOSAxIDcnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorCiAKIGNsYXNzIENhY2hlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3QgdGhhdCBjYWNoaW5nIHdvcmtzIHByb3Blcmx5LiIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IGI1Yzg2ZjIuLjdmNzBmZDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTI1NDAsOCArMjU0MCw3IEBACiAKICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CiAgICAgICAgICIiIkVuc3VyZSB0aGF0IF9fYWxsX18gaXMgcG9wdWxhdGVkIHByb3Blcmx5LiIiIgotICAgICAgICAjIFNUQVJUVVBJTkZPIGFkZGVkIHRvIF9fYWxsX18gaW4gMy42Ci0gICAgICAgIGludGVudGlvbmFsbHlfZXhjbHVkZWQgPSB7Imxpc3QyY21kbGluZSIsICJTVEFSVFVQSU5GTyIsICJIYW5kbGUifQorICAgICAgICBpbnRlbnRpb25hbGx5X2V4Y2x1ZGVkID0geyJsaXN0MmNtZGxpbmUiLCAiSGFuZGxlIn0KICAgICAgICAgZXhwb3J0ZWQgPSBzZXQoc3VicHJvY2Vzcy5fX2FsbF9fKQogICAgICAgICBwb3NzaWJsZV9leHBvcnRzID0gc2V0KCkKICAgICAgICAgaW1wb3J0IHR5cGVzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggMmMwMDQxNy4uMjY5ZDliZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtOSwxMyArOSwxMSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIFRFU1RGTiA9IHN1cHBvcnQuVEVTVEZOCi1URVNURElSTiA9IG9zLnBhdGguYmFzZW5hbWUodGVtcGZpbGUubWtkdGVtcChkaXI9Jy4nKSkKIAogCiBjbGFzcyBUZXN0U3VwcG9ydCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCi0gICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQogICAgIHRlYXJEb3duID0gc2V0VXAKIAogICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGUoc2VsZik6CkBAIC00OCw2ICs0NiwxMCBAQAogICAgICAgICBzdXBwb3J0LnVubGluayhURVNURk4pCiAKICAgICBkZWYgdGVzdF9ybXRyZWUoc2VsZik6CisgICAgICAgIFRFU1RESVJOID0gb3MucGF0aC5iYXNlbmFtZSh0ZW1wZmlsZS5ta2R0ZW1wKGRpcj0nLicpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIFRFU1RESVJOKQorICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKKwogICAgICAgICBvcy5ta2RpcihURVNURElSTikKICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKFRFU1RESVJOLCBURVNURElSTikpCiAgICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQpAQCAtMjI4LDcgKzIzMCw4IEBACiAKICAgICBkZWYgdGVzdF9jaGVja19zeW50YXhfZXJyb3Ioc2VsZik6CiAgICAgICAgIHN1cHBvcnQuY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJkZWYgY2xhc3MiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc3VwcG9ydC5jaGVja19zeW50YXhfZXJyb3IsIHNlbGYsICIxIikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAieD0xIikKIAogICAgIGRlZiB0ZXN0X0NsZWFuSW1wb3J0KHNlbGYpOgogICAgICAgICBpbXBvcnQgaW1wb3J0bGliCkBAIC0zMTIsNiArMzE1LDI4IEBACiAgICAgICAgICAgICAgICAgc2VsZi5PdGhlckNsYXNzLCBzZWxmLlJlZkNsYXNzLCBpZ25vcmU9aWdub3JlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldCgpLCBtaXNzaW5nX2l0ZW1zKQogCisgICAgZGVmIHRlc3RfY2hlY2tfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsndGVtcGRpcid9CisgICAgICAgIGJsYWNrbGlzdCA9IHsndGVtcGxhdGUnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgICAgICAgZXh0cmEgPSB7J1RleHRUZXN0UmVzdWx0JywgJ2luc3RhbGxIYW5kbGVyJ30KKyAgICAgICAgYmxhY2tsaXN0ID0geydsb2FkX3Rlc3RzJywgIlRlc3RQcm9ncmFtIiwgIkJhc2VUZXN0U3VpdGUifQorCisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInVuaXR0ZXN0LnJlc3VsdCIsICJ1bml0dGVzdC5jYXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5zdWl0ZSIsICJ1bml0dGVzdC5sb2FkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaXR0ZXN0Lm1haW4iLCAidW5pdHRlc3QucnVubmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5zaWduYWxzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBzdXBwb3J0LmNoZWNrX19hbGxfXywgc2VsZiwgdW5pdHRlc3QpCisKICAgICAjIFhYWCAtZm9sbG93cyBhIGxpc3Qgb2YgdW50ZXN0ZWQgQVBJCiAgICAgIyBtYWtlX2xlZ2FjeV9weWMKICAgICAjIGlzX3Jlc291cmNlX2VuYWJsZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5IGIvTGliL3Rlc3QvdGVzdF9zeW1ib2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYjlkZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5CkBAIC0wLDAgKzEsNTUgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CitpbXBvcnQgZmlsZWNtcAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworCisKK1NZTUJPTF9GSUxFICAgICAgICAgICAgICA9IHN1cHBvcnQuZmluZGZpbGUoJ3N5bWJvbC5weScpCitHUkFNTUFSX0ZJTEUgICAgICAgICAgICAgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4nLCAnLi4nLCAnSW5jbHVkZScsICdncmFtaW5pdC5oJykKK1RFU1RfUFlfRklMRSAgICAgICAgICAgICA9ICdzeW1ib2xfdGVzdC5weScKKworCitjbGFzcyBUZXN0U3ltYm9sR2VuZXJhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKHNlbGYsIHNvdXJjZV9maWxlLCBkZXN0X2ZpbGUpOgorICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICB3aXRoIG9wZW4oZGVzdF9maWxlLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1s6bGluZXMuaW5kZXgoIiMtLXN0YXJ0IGNvbnN0YW50cy0tXG4iKSArIDFdKQorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1tsaW5lcy5pbmRleCgiIy0tZW5kIGNvbnN0YW50cy0tXG4iKTpdKQorCisgICAgZGVmIF9nZW5lcmF0ZV9zeW1ib2xzKHNlbGYsIGdyYW1tYXJfZmlsZSwgdGFyZ2V0X3N5bWJvbF9weV9maWxlKToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lNQk9MX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfc3ltYm9sX3B5X2ZpbGVdLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKClbMV0KKyAgICAgICAgcmV0dXJuIHByb2MucmV0dXJuY29kZSwgc3RkZXJyCisKKyAgICBkZWYgY29tcGFyZV9maWxlcyhzZWxmLCBmaWxlMSwgZmlsZTIpOgorICAgICAgICB3aXRoIG9wZW4oZmlsZTEpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMxID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGUyKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzMiA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMxLCBsaW5lczIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBvcy5wYXRoLmV4aXN0cyhHUkFNTUFSX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICAgJ3Rlc3Qgb25seSB3b3JrcyBmcm9tIHNvdXJjZSBidWlsZCBkaXJlY3RvcnknKQorICAgIGRlZiB0ZXN0X3JlYWxfZ3JhbW1hcl9hbmRfc3ltYm9sX2ZpbGUoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgb3V0cHV0KQorCisgICAgICAgIHNlbGYuX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKyAgICAgICAgZXhpdGNvZGUsIHN0ZGVyciA9IHNlbGYuX2dlbmVyYXRlX3N5bWJvbHMoR1JBTU1BUl9GSUxFLCBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXhpdGNvZGUpCisKKyAgICAgICAgc2VsZi5jb21wYXJlX2ZpbGVzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKaW5kZXggYWU4Zjg0NS4uYmI4MzYyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKQEAgLTMzOCw4ICszMzgsOCBAQAogCiAgICAgZGVmIHRlc3RfMTRfb25saW5lcl9pZihzZWxmKToKICAgICAgICAgZGVmIG9ubGluZXJzKCk6Ci0gICAgICAgICAgICBpZiBUcnVlOiBGYWxzZQotICAgICAgICAgICAgZWxzZTogVHJ1ZQorICAgICAgICAgICAgaWYgVHJ1ZTogeD1GYWxzZQorICAgICAgICAgICAgZWxzZTogeD1UcnVlCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKICAgICAgICAgICAgIG9ubGluZXJzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IDE0MTJjYWUuLjAzODc1YWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTE5OTcsNiArMTk5NywyNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgdGFyZmlsZS5pdG4oMHgxMDAwMDAwMDAwMCwgNiwgdGFyZmlsZS5HTlVfRk9STUFUKQogCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J3ZlcnNpb24nLCAnZ3JwJywgJ3B3ZCcsICdzeW1saW5rX2V4Y2VwdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAnTlVMJywgJ0JMT0NLU0laRScsICdSRUNPUkRTSVpFJywgJ0dOVV9NQUdJQycsCisgICAgICAgICAgICAgICAgICAgICAnUE9TSVhfTUFHSUMnLCAnTEVOR1RIX05BTUUnLCAnTEVOR1RIX0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0xFTkdUSF9QUkVGSVgnLCAnUkVHVFlQRScsICdBUkVHVFlQRScsICdMTktUWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdTWU1UWVBFJywgJ0NIUlRZUEUnLCAnQkxLVFlQRScsICdESVJUWVBFJywgJ0ZJRk9UWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdDT05UVFlQRScsICdHTlVUWVBFX0xPTkdOQU1FJywgJ0dOVVRZUEVfTE9OR0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0dOVVRZUEVfU1BBUlNFJywgJ1hIRFRZUEUnLCAnWEdMVFlQRScsICdTT0xBUklTX1hIRFRZUEUnLAorICAgICAgICAgICAgICAgICAgICAgJ1NVUFBPUlRFRF9UWVBFUycsICdSRUdVTEFSX1RZUEVTJywgJ0dOVV9UWVBFUycsCisgICAgICAgICAgICAgICAgICAgICAnUEFYX0ZJRUxEUycsICdQQVhfTkFNRV9GSUVMRFMnLCAnUEFYX05VTUJFUl9GSUVMRFMnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0bicsICdudHMnLCAnbnRpJywgJ2l0bicsICdjYWxjX2Noa3N1bXMnLCAnY29weWZpbGVvYmonLAorICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVtb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICdFbXB0eUhlYWRlckVycm9yJywgJ1RydW5jYXRlZEhlYWRlckVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICdFT0ZIZWFkZXJFcnJvcicsICdJbnZhbGlkSGVhZGVyRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgJ1N1YnNlcXVlbnRIZWFkZXJFcnJvcicsICdFeEZpbGVPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB0YXJmaWxlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiAKIGNsYXNzIENvbW1hbmRMaW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKaW5kZXggNmMyN2MxNi4uNjEwMzc3YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKQEAgLTQyLDYgKzQyLDExIEBACiAgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQogICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdENvbnRleHRNYW5hZ2VyKHNlbGYpOgorICAgICAgICB3aXRoIHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KSBhcyB0bjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHRuLmdldF9zb2NrZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodG4uZ2V0X3NvY2tldCgpKQorCiAgICAgZGVmIHRlc3RUaW1lb3V0RGVmYXVsdChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggYjQ5YTk2MS4uNzFkZjE0YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBzdWJwcm9jZXNzCiAKIGZyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogIyBCZXR3ZWVuIGZvcmsoKSBhbmQgZXhlYygpLCBvbmx5IGFzeW5jLXNhZmUgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIChpc3N1ZXMKQEAgLTEwOTcsNSArMTA5OCwxMiBAQAogY2xhc3MgQmFycmllclRlc3RzKGxvY2tfdGVzdHMuQmFycmllclRlc3RzKToKICAgICBiYXJyaWVydHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQmFycmllcikKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGV4dHJhID0geyJUaHJlYWRFcnJvciJ9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnY3VycmVudFRocmVhZCcsICdhY3RpdmVDb3VudCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHRocmVhZGluZywgKCd0aHJlYWRpbmcnLCAnX3RocmVhZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCA3NmI4OTRlLi5mODgzYzQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xLDYgKzEsOCBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CitpbXBvcnQgZGVjaW1hbAogaW1wb3J0IGVudW0KIGltcG9ydCBsb2NhbGUKK2ltcG9ydCBtYXRoCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKQEAgLTIxLDE3ICsyMywyNyBAQAogVElNRV9NQVhZRUFSID0gKDEgPDwgOCAqIFNJWkVPRl9JTlQgLSAxKSAtIDEKIFRJTUVfTUlOWUVBUiA9IC1USU1FX01BWFlFQVIgLSAxCiAKK1NFQ19UT19VUyA9IDEwICoqIDYKIFVTX1RPX05TID0gMTAgKiogMwogTVNfVE9fTlMgPSAxMCAqKiA2CiBTRUNfVE9fTlMgPSAxMCAqKiA5CitOU19UT19TRUMgPSAxMCAqKiA5CiAKIGNsYXNzIF9QeVRpbWUoZW51bS5JbnRFbnVtKToKICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCiAgICAgUk9VTkRfRkxPT1IgPSAwCiAgICAgIyBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKQogICAgIFJPVU5EX0NFSUxJTkcgPSAxCisgICAgIyBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlcgorICAgIFJPVU5EX0hBTEZfRVZFTiA9IDIKIAotQUxMX1JPVU5ESU5HX01FVEhPRFMgPSAoX1B5VGltZS5ST1VORF9GTE9PUiwgX1B5VGltZS5ST1VORF9DRUlMSU5HKQorIyBSb3VuZGluZyBtb2RlcyBzdXBwb3J0ZWQgYnkgUHlUaW1lCitST1VORElOR19NT0RFUyA9ICgKKyAgICAjIChQeVRpbWUgcm91bmRpbmcgbWV0aG9kLCBkZWNpbWFsIHJvdW5kaW5nIG1ldGhvZCkKKyAgICAoX1B5VGltZS5ST1VORF9GTE9PUiwgZGVjaW1hbC5ST1VORF9GTE9PUiksCisgICAgKF9QeVRpbWUuUk9VTkRfQ0VJTElORywgZGVjaW1hbC5ST1VORF9DRUlMSU5HKSwKKyAgICAoX1B5VGltZS5ST1VORF9IQUxGX0VWRU4sIGRlY2ltYWwuUk9VTkRfSEFMRl9FVkVOKSwKKykKIAogCiBjbGFzcyBUaW1lVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNjA3LDc5ICs2MTksNiBAQAogCiAKIGNsYXNzIFRlc3RQeXRpbWUodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5pbnZhbGlkX3ZhbHVlcyA9ICgKLSAgICAgICAgICAgIC0oMiAqKiAxMDApLCAyICoqIDEwMCwKLSAgICAgICAgICAgIC0oMi4wICoqIDEwMC4wKSwgMi4wICoqIDEwMC4wLAotICAgICAgICApCi0KLSAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKLSAgICBkZWYgdGVzdF90aW1lX3Qoc2VsZik6Ci0gICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdAotICAgICAgICBmb3Igb2JqLCB0aW1lX3QsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCi0gICAgICAgICAgICAoMCwgMCwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEsIC0xLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuOSwgLTIsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMCwgMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS45LCAxLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAwLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS45LCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjAsIDEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS45LCAyLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRpbWVfb2JqZWN0X3RvX3RpbWVfdChvYmosIHJuZCksIHRpbWVfdCkKLQotICAgICAgICBybmQgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIGZvciBpbnZhbGlkIGluIHNlbGYuaW52YWxpZF92YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aW1lX29iamVjdF90b190aW1lX3QsIGludmFsaWQsIHJuZCkKLQotICAgIEBzdXBwb3J0LmNweXRob25fb25seQotICAgIGRlZiB0ZXN0X3RpbWVzcGVjKHNlbGYpOgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lc3BlYwotICAgICAgICBmb3Igb2JqLCB0aW1lc3BlYywgcm5kIGluICgKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBtaW51cyBpbmZpbml0eSAoLWluZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDFlLTEwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS05LCAoLTEsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS0xMCwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4yLCAoLTIsIDgwMDAwMDAwMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDAuOTk5OTk5OTk5OSwgKDAsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5MCwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTAsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MSwgKC0yLCA4NzY1NDMyMTApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMCwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMWUtMTAsICgwLCAxKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtOSwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS0xMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjIsICgtMiwgODAwMDAwMDAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgwLjk5OTk5OTk5OTksICgxLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTAsICgxLCAxMjM0NTY3OTApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc5MCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MCwgKC0yLCA4NzY1NDMyMTEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTEsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXNwZWM9dGltZXNwZWMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aW1lX29iamVjdF90b190aW1lc3BlYyhvYmosIHJuZCksIHRpbWVzcGVjKQotCi0gICAgICAgIHJuZCA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgZm9yIGludmFsaWQgaW4gc2VsZi5pbnZhbGlkX3ZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLCBpbnZhbGlkLCBybmQpCi0KICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aW1lLl9TVFJVQ1RfVE1fSVRFTVMgPT0gMTEsICJuZWVkcyB0bV96b25lIHN1cHBvcnQiKQogICAgIGRlZiB0ZXN0X2xvY2FsdGltZV90aW1lem9uZShzZWxmKToKIApAQCAtNzM0LDI2NiArNjczLDI5MSBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGx0LnRtX3pvbmUsIE5vbmUpCiAKIAotQHVuaXR0ZXN0LnNraXBVbmxlc3MoX3Rlc3RjYXBpIGlzIG5vdCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgJ25lZWQgdGhlIF90ZXN0Y2FwaSBtb2R1bGUnKQotY2xhc3MgVGVzdFB5VGltZV90KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIHRoZSBfdGVzdGNhcGkgbW9kdWxlJykKK2NsYXNzIENQeVRpbWVUZXN0Q2FzZToKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIHRvIHRlc3QgdGhlIEMgX1B5VGltZV90IEFQSS4KKyAgICAiIiIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgU0laRU9GX1RJTUVfVAorICAgICAgICBiaXRzID0gU0laRU9GX1RJTUVfVCAqIDggLSAxCisgICAgICAgIHNlbGYudGltZV90X21pbiA9IC0yICoqIGJpdHMKKyAgICAgICAgc2VsZi50aW1lX3RfbWF4ID0gMiAqKiBiaXRzIC0gMQorCisgICAgZGVmIHRpbWVfdF9maWx0ZXIoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHJldHVybiAoc2VsZi50aW1lX3RfbWluIDw9IHNlY29uZHMgPD0gc2VsZi50aW1lX3RfbWF4KQorCisgICAgZGVmIF9yb3VuZGluZ192YWx1ZXMoc2VsZiwgdXNlX2Zsb2F0KToKKyAgICAgICAgIkJ1aWxkIHRpbWVzdGFtcHMgdXNlZCB0byB0ZXN0IHJvdW5kaW5nLiIKKworICAgICAgICB1bml0cyA9IFsxLCBVU19UT19OUywgTVNfVE9fTlMsIFNFQ19UT19OU10KKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBwaWNvc2Vjb25kcyBhcmUgb25seSB0ZXN0ZWQgdG8gcHl0aW1lX2NvbnZlcnRlciBhY2NlcHRpbmcgZmxvYXRzCisgICAgICAgICAgICB1bml0cy5hcHBlbmQoMWUtMykKKworICAgICAgICB2YWx1ZXMgPSAoCisgICAgICAgICAgICAjIHNtYWxsIHZhbHVlcworICAgICAgICAgICAgMSwgMiwgNSwgNywgMTIzLCA0NTYsIDEyMzQsCisgICAgICAgICAgICAjIDEwXmsgLSAxCisgICAgICAgICAgICA5LAorICAgICAgICAgICAgOTksCisgICAgICAgICAgICA5OTksCisgICAgICAgICAgICA5OTk5LAorICAgICAgICAgICAgOTk5OTksCisgICAgICAgICAgICA5OTk5OTksCisgICAgICAgICAgICAjIHRlc3QgaGFsZiBldmVuIHJvdW5kaW5nIG5lYXIgMC41LCAxLjUsIDIuNSwgMy41LCA0LjUKKyAgICAgICAgICAgIDQ5OSwgNTAwLCA1MDEsCisgICAgICAgICAgICAxNDk5LCAxNTAwLCAxNTAxLAorICAgICAgICAgICAgMjUwMCwKKyAgICAgICAgICAgIDM1MDAsCisgICAgICAgICAgICA0NTAwLAorICAgICAgICApCisKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9IFswXQorICAgICAgICBmb3IgdW5pdCBpbiB1bml0czoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgbnMgPSB2YWx1ZSAqIHVuaXQKKyAgICAgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisgICAgICAgIGZvciBwb3cyIGluICgwLCA1LCAxMCwgMTUsIDIyLCAyMywgMjQsIDMwLCAzMyk6CisgICAgICAgICAgICBucyA9ICgyICoqIHBvdzIpICogU0VDX1RPX05TCisgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoCisgICAgICAgICAgICAgICAgLW5zLTEsIC1ucywgLW5zKzEsCisgICAgICAgICAgICAgICAgbnMtMSwgbnMsIG5zKzEKKyAgICAgICAgICAgICkpCisgICAgICAgIGZvciBzZWNvbmRzIGluIChfdGVzdGNhcGkuSU5UX01JTiwgX3Rlc3RjYXBpLklOVF9NQVgpOgorICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5hcHBlbmQoc2Vjb25kcyAqIFNFQ19UT19OUykKKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBudW1iZXJzIHdpdGggYW4gZXh0cmFjdCByZXByZXNlbnRhdGlvbiBpbiBJRUVFIDc1NCAoYmFzZSAyKQorICAgICAgICAgICAgZm9yIHBvdzIgaW4gKDMsIDcsIDEwLCAxNSk6CisgICAgICAgICAgICAgICAgbnMgPSAyLjAgKiogKC1wb3cyKQorICAgICAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgtbnMsIG5zKSkKKworICAgICAgICAjIHNlY29uZHMgY2xvc2UgdG8gX1B5VGltZV90IHR5cGUgbGltaXQKKyAgICAgICAgbnMgPSAoMiAqKiA2MyAvLyBTRUNfVE9fTlMpICogU0VDX1RPX05TCisgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgtbnMsIG5zKSkKKworICAgICAgICByZXR1cm4gbnNfdGltZXN0YW1wcworCisgICAgZGVmIF9jaGVja19yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Zsb2F0LCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyPU5vbmUpOgorCisgICAgICAgIGRlZiBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKToKKyAgICAgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICAgICB1bml0X3RvX25zID0gU0VDX1RPX05TIC8gZmxvYXQodW5pdF90b19zZWMpCisgICAgICAgICAgICAgICAgdmFsdWVzID0gW25zIC8gdW5pdF90b19ucyBmb3IgbnMgaW4gbnNfdGltZXN0YW1wc10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdW5pdF90b19ucyA9IFNFQ19UT19OUyAvLyB1bml0X3RvX3NlYworICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtucyAvLyB1bml0X3RvX25zIGZvciBucyBpbiBuc190aW1lc3RhbXBzXQorCisgICAgICAgICAgICBpZiB2YWx1ZV9maWx0ZXI6CisgICAgICAgICAgICAgICAgdmFsdWVzID0gZmlsdGVyKHZhbHVlX2ZpbHRlciwgdmFsdWVzKQorCisgICAgICAgICAgICAjIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCBzb3J0CisgICAgICAgICAgICByZXR1cm4gc29ydGVkKHNldCh2YWx1ZXMpKQorCisgICAgICAgICMgdGVzdCByb3VuZGluZworICAgICAgICBuc190aW1lc3RhbXBzID0gc2VsZi5fcm91bmRpbmdfdmFsdWVzKHVzZV9mbG9hdCkKKyAgICAgICAgdmFsaWRfdmFsdWVzID0gY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcykKKyAgICAgICAgZm9yIHRpbWVfcm5kLCBkZWNpbWFsX3JuZCBpbiBST1VORElOR19NT0RFUyA6CisgICAgICAgICAgICBjb250ZXh0ID0gZGVjaW1hbC5nZXRjb250ZXh0KCkKKyAgICAgICAgICAgIGNvbnRleHQucm91bmRpbmcgPSBkZWNpbWFsX3JuZAorCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsaWRfdmFsdWVzOgorICAgICAgICAgICAgICAgIGRlYnVnX2luZm8gPSB7J3ZhbHVlJzogdmFsdWUsICdyb3VuZGluZyc6IGRlY2ltYWxfcm5kfQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHl0aW1lX2NvbnZlcnRlcih2YWx1ZSwgdGltZV9ybmQpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRfZnVuYyh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciBvbiB0aW1lc3RhbXAgY29udmVyc2lvbjogJXMiICUgZGVidWdfaW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfaW5mbykKKworICAgICAgICAjIHRlc3Qgb3ZlcmZsb3cKKyAgICAgICAgbnMgPSBzZWxmLk9WRVJGTE9XX1NFQ09ORFMgKiBTRUNfVE9fTlMKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9ICgtbnMsIG5zKQorICAgICAgICBvdmVyZmxvd192YWx1ZXMgPSBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKQorICAgICAgICBmb3IgdGltZV9ybmQsIF8gaW4gUk9VTkRJTkdfTU9ERVMgOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIG92ZXJmbG93X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvID0geyd2YWx1ZSc6IHZhbHVlLCAncm91bmRpbmcnOiB0aW1lX3JuZH0KKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1zZz1kZWJ1Z19pbmZvKToKKyAgICAgICAgICAgICAgICAgICAgcHl0aW1lX2NvbnZlcnRlcih2YWx1ZSwgdGltZV9ybmQpCisKKyAgICBkZWYgY2hlY2tfaW50X3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3RvX3NlYz0xLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3JvdW5kaW5nKHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyKQorCisgICAgZGVmIGNoZWNrX2Zsb2F0X3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdG9fc2VjPTEsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcm91bmRpbmcocHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcikKKworICAgIGRlZiBkZWNpbWFsX3JvdW5kKHNlbGYsIHgpOgorICAgICAgICBkID0gZGVjaW1hbC5EZWNpbWFsKHgpCisgICAgICAgIGQgPSBkLnF1YW50aXplKDEpCisgICAgICAgIHJldHVybiBpbnQoZCkKKworCitjbGFzcyBUZXN0Q1B5VGltZShDUHlUaW1lVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHRoZSBDIF9QeVRpbWVfdCBBUEkuCisgICAgIiIiCisgICAgIyBfUHlUaW1lX3QgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gbWF0aC5jZWlsKCgyKio2MyArIDEpIC8gU0VDX1RPX05TKQorCiAgICAgZGVmIHRlc3RfRnJvbVNlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfRnJvbVNlY29uZHMKLSAgICAgICAgZm9yIHNlY29uZHMgaW4gKDAsIDMsIC00NTYsIF90ZXN0Y2FwaS5JTlRfTUFYLCBfdGVzdGNhcGkuSU5UX01JTik6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzZWNvbmRzPXNlY29uZHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzKHNlY29uZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAqIFNFQ19UT19OUykKKworICAgICAgICAjIFB5VGltZV9Gcm9tU2Vjb25kcygpIGV4cGVjdHMgYSBDIGludCwgcmVqZWN0IHZhbHVlcyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgZGVmIGNfaW50X2ZpbHRlcihzZWNzKToKKyAgICAgICAgICAgIHJldHVybiAoX3Rlc3RjYXBpLklOVF9NSU4gPD0gc2VjcyA8PSBfdGVzdGNhcGkuSU5UX01BWCkKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgc2Vjcywgcm5kOiBQeVRpbWVfRnJvbVNlY29uZHMoc2VjcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzICogU0VDX1RPX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9Y19pbnRfZmlsdGVyKQogCiAgICAgZGVmIHRlc3RfRnJvbVNlY29uZHNPYmplY3Qoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QKIAotICAgICAgICAjIENvbnZlcnNpb24gZ2l2aW5nIHRoZSBzYW1lIHJlc3VsdCBmb3IgYWxsIHJvdW5kaW5nIG1ldGhvZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBvYmosIHRzIGluICgKLSAgICAgICAgICAgICAgICAjIGludGVnZXJzCi0gICAgICAgICAgICAgICAgKDAsIDApLAotICAgICAgICAgICAgICAgICgxLCBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtMywgLTMgKiBTRUNfVE9fTlMpLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZygKKyAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCwKKyAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzICogU0VDX1RPX05TKQogCi0gICAgICAgICAgICAgICAgIyBmbG9hdDogc3Vic2Vjb25kcwotICAgICAgICAgICAgICAgICgwLjAsIDApLAotICAgICAgICAgICAgICAgICgxZS05LCAxKSwKLSAgICAgICAgICAgICAgICAoMWUtNiwgMTAgKiogMyksCi0gICAgICAgICAgICAgICAgKDFlLTMsIDEwICoqIDYpLAotCi0gICAgICAgICAgICAgICAgIyBmbG9hdDogc2Vjb25kcwotICAgICAgICAgICAgICAgICgyLjAsIDIgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgxMjMuMCwgMTIzICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTcuMCwgLTcgKiBTRUNfVE9fTlMpLAotCi0gICAgICAgICAgICAgICAgIyBuYW5vc2Vjb25kIGFyZSBrZXB0IGZvciB2YWx1ZSA8PSAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjIgLSAxZS05LCAgNDE5NDMwMzk5OTk5OTk5OSksCi0gICAgICAgICAgICAgICAgKDIqKjIyLCAgICAgICAgIDQxOTQzMDQwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyMiArIDFlLTksICA0MTk0MzA0MDAwMDAwMDAxKSwKLSAgICAgICAgICAgICAgICAoMioqMjMgLSAxZS05LCAgODM4ODYwNzk5OTk5OTk5OSksCi0gICAgICAgICAgICAgICAgKDIqKjIzLCAgICAgICAgIDgzODg2MDgwMDAwMDAwMDApLAotCi0gICAgICAgICAgICAgICAgIyBzdGFydCBsb3NpbmcgcHJlY2lzaW9uIGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyMyArIDFlLTksICA4Mzg4NjA4MDAwMDAwMDAyKSwKLQotICAgICAgICAgICAgICAgICMgbmFub3NlY29uZHMgYXJlIGxvc3QgZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjI0IC0gMWUtOSwgMTY3NzcyMTU5OTk5OTk5OTgpLAotICAgICAgICAgICAgICAgICgyKioyNCwgICAgICAgIDE2Nzc3MjE2MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjQgKyAxZS05LCAxNjc3NzIxNjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1IC0gMWUtOSwgMzM1NTQ0MzIwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSAgICAgICAsIDMzNTU0NDMyMDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgKyAxZS05LCAzMzU1NDQzMjAwMDAwMDAwMCksCi0KLSAgICAgICAgICAgICAgICAjIGNsb3NlIHRvIDJeNjMgbmFub3NlY29uZHMgKF9QeVRpbWVfdCBsaW1pdCkKLSAgICAgICAgICAgICAgICAoOTIyMzM3MjAzNiwgOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKDkyMjMzNzIwMzYuMCwgOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC05MjIzMzcyMDM2LCAtOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC05MjIzMzcyMDM2LjAsIC05MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob2JqPW9iaiwgcm91bmQ9cm5kLCB0aW1lc3RhbXA9dHMpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdChvYmosIHJuZCksIHRzKQotCi0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChyb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCg5MjIzMzcyMDM3LCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCg5MjIzMzcyMDM3LjAsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KC05MjIzMzcyMDM3LCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCgtOTIyMzM3MjAzNy4wLCBybmQpCi0KLSAgICAgICAgIyBDb252ZXJzaW9uIGdpdmluZyBkaWZmZXJlbnQgcmVzdWx0cyBkZXBlbmRpbmcgb24gdGhlIHJvdW5kaW5nIG1ldGhvZAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3Igb2JqLCB0cywgcm5kIGluICgKLSAgICAgICAgICAgICMgY2xvc2UgdG8gemVybwotICAgICAgICAgICAgKCAxZS0xMCwgIDAsIEZMT09SKSwKLSAgICAgICAgICAgICggMWUtMTAsICAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtMTAsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTFlLTEwLCAgMCwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgdGVzdCByb3VuZGluZyBvZiB0aGUgbGFzdCBuYW5vc2Vjb25kCi0gICAgICAgICAgICAoIDEuMTIzNDU2Nzg5OSwgIDExMjM0NTY3ODksIEZMT09SKSwKLSAgICAgICAgICAgICggMS4xMjM0NTY3ODk5LCAgMTEyMzQ1Njc5MCwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5OSwgLTExMjM0NTY3OTAsIEZMT09SKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODk5LCAtMTEyMzQ1Njc4OSwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgY2xvc2UgdG8gMSBzZWNvbmQKLSAgICAgICAgICAgICggMC45OTk5OTk5OTk5LCAgIDk5OTk5OTk5OSwgRkxPT1IpLAotICAgICAgICAgICAgKCAwLjk5OTk5OTk5OTksICAxMDAwMDAwMDAwLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMC45OTk5OTk5OTk5LCAtMTAwMDAwMDAwMCwgRkxPT1IpLAotICAgICAgICAgICAgKC0wLjk5OTk5OTk5OTksICAtOTk5OTk5OTk5LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXN0YW1wPXRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdChvYmosIHJuZCksIHRzKQorICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKAorICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0LAorICAgICAgICAgICAgbGFtYmRhIG5zOiBzZWxmLmRlY2ltYWxfcm91bmQobnMgKiBTRUNfVE9fTlMpKQogCiAgICAgZGVmIHRlc3RfQXNTZWNvbmRzRG91YmxlKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzU2Vjb25kc0RvdWJsZQogCi0gICAgICAgIGZvciBuYW5vc2Vjb25kcywgc2Vjb25kcyBpbiAoCi0gICAgICAgICAgICAjIG5lYXIgMSBuYW5vc2Vjb25kCi0gICAgICAgICAgICAoIDAsICAwLjApLAotICAgICAgICAgICAgKCAxLCAgMWUtOSksCi0gICAgICAgICAgICAoLTEsIC0xZS05KSwKKyAgICAgICAgZGVmIGZsb2F0X2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICBpZiBhYnMobnMpICUgU0VDX1RPX05TID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KG5zIC8vIFNFQ19UT19OUykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KG5zKSAvIFNFQ19UT19OUwogCi0gICAgICAgICAgICAjIG5lYXIgMSBzZWNvbmQKLSAgICAgICAgICAgIChTRUNfVE9fTlMgKyAxLCAxLjAgKyAxZS05KSwKLSAgICAgICAgICAgIChTRUNfVE9fTlMsICAgICAxLjApLAotICAgICAgICAgICAgKFNFQ19UT19OUyAtIDEsIDEuMCAtIDFlLTkpLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgbnMsIHJuZDogUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgICAgICAjIGEgZmV3IHNlY29uZHMKLSAgICAgICAgICAgICgxMjMgKiBTRUNfVE9fTlMsIDEyMy4wKSwKLSAgICAgICAgICAgICgtNTY3ICogU0VDX1RPX05TLCAtNTY3LjApLAorICAgIGRlZiBjcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoc2VsZiwgZGVub21pbmF0b3IpOgorICAgICAgICBkZW5vbSA9IGRlY2ltYWwuRGVjaW1hbChkZW5vbWluYXRvcikKIAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kIGFyZSBrZXB0IGZvciB2YWx1ZSA8PSAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICg0MTk0MzAzOTk5OTk5OTk5LCAyKioyMiAtIDFlLTkpLAotICAgICAgICAgICAgKDQxOTQzMDQwMDAwMDAwMDAsIDIqKjIyKSwKLSAgICAgICAgICAgICg0MTk0MzA0MDAwMDAwMDAxLCAyKioyMiArIDFlLTkpLAorICAgICAgICBkZWYgY29udmVydGVyKHZhbHVlKToKKyAgICAgICAgICAgIGQgPSBkZWNpbWFsLkRlY2ltYWwodmFsdWUpIC8gZGVub20KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY2ltYWxfcm91bmQoZCkKIAotICAgICAgICAgICAgIyBzdGFydCBsb3NpbmcgcHJlY2lzaW9uIGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDgzODg2MDgwMDAwMDAwMDIsIDIqKjIzICsgMWUtOSksCisgICAgICAgIHJldHVybiBjb252ZXJ0ZXIKIAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcyBhcmUgbG9zdCBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICgxNjc3NzIxNTk5OTk5OTk5OCwgMioqMjQgLSAxZS05KSwKLSAgICAgICAgICAgICgxNjc3NzIxNTk5OTk5OTk5OSwgMioqMjQgLSAxZS05KSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMCwgMioqMjQgICAgICAgKSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMSwgMioqMjQgICAgICAgKSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMiwgMioqMjQgKyAyZS05KSwKLQotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDAwLCAyKioyNSAgICAgICApLAotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDAyLCAyKioyNSAgICAgICApLAotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDA0LCAyKioyNSArIDRlLTkpLAotCi0gICAgICAgICAgICAjIGNsb3NlIHRvIDJeNjMgbmFub3NlY29uZHMgKF9QeVRpbWVfdCBsaW1pdCkKLSAgICAgICAgICAgICg5MjIzMzcyMDM2ICogU0VDX1RPX05TLCA5MjIzMzcyMDM2LjApLAotICAgICAgICAgICAgKC05MjIzMzcyMDM2ICogU0VDX1RPX05TLCAtOTIyMzM3MjAzNi4wKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5hbm9zZWNvbmRzLCBzZWNvbmRzPXNlY29uZHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShuYW5vc2Vjb25kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKQotCi0gICAgZGVmIHRlc3RfdGltZXZhbChzZWxmKToKKyAgICBkZWYgdGVzdF9Bc1RpbWV2YWwoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNUaW1ldmFsCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pY3Jvc2Vjb25kcwotICAgICAgICAgICAgICAgICgwLCAoMCwgMCkpLAotICAgICAgICAgICAgICAgICgxMDAwLCAoMCwgMSkpLAotICAgICAgICAgICAgICAgICgtMTAwMCwgKC0xLCA5OTk5OTkpKSwKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAoMiwgMCkpLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgKC0zLCAwKSksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWV2YWwobnMsIHJuZCksIHR2KQorICAgICAgICB1c19jb252ZXJ0ZXIgPSBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihVU19UT19OUykKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIHR2LCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsICgwLCAwKSwgRkxPT1IpLAotICAgICAgICAgICAgKDEsICgwLCAxKSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsICgtMSwgOTk5OTk5KSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAoMCwgMCksIENFSUxJTkcpLAorICAgICAgICBkZWYgdGltZXZhbF9jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgdXMgPSB1c19jb252ZXJ0ZXIobnMpCisgICAgICAgICAgICByZXR1cm4gZGl2bW9kKHVzLCBTRUNfVE9fVVMpCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNDU2NzAwMSwgKDEsIDIzNDU2NyksIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0NTY3MDAxLCAoMSwgMjM0NTY4KSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQ1NjcwMDEsICgtMiwgNzY1NDMyKSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0NTY3MDAxLCAoLTIsIDc2NTQzMyksIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1ldmFsKG5zLCBybmQpLCB0dikKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgTE9OR19NSU4sIExPTkdfTUFYCisKKyAgICAgICAgICAgICMgT24gV2luZG93cywgdGltZXZhbC50dl9zZWMgdHlwZSBpcyBhIEMgbG9uZworICAgICAgICAgICAgZGVmIHNlY29uZHNfZmlsdGVyKHNlY3MpOgorICAgICAgICAgICAgICAgIHJldHVybiBMT05HX01JTiA8PSBzZWNzIDw9IExPTkdfTUFYCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWNvbmRzX2ZpbHRlciA9IHNlbGYudGltZV90X2ZpbHRlcgorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc1RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YWxfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWNvbmRzX2ZpbHRlcikKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoX3Rlc3RjYXBpLCAnUHlUaW1lX0FzVGltZXNwZWMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVlZCBfdGVzdGNhcGkuUHlUaW1lX0FzVGltZXNwZWMnKQotICAgIGRlZiB0ZXN0X3RpbWVzcGVjKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzVGltZXNwZWMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNUaW1lc3BlYwotICAgICAgICBmb3IgbnMsIHRzIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgwLCAoMCwgMCkpLAotICAgICAgICAgICAgKDEsICgwLCAxKSksCi0gICAgICAgICAgICAoLTEsICgtMSwgOTk5OTk5OTk5KSksCiAKLSAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsICgyLCAwKSksCi0gICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsICgtMywgMCkpLAorICAgICAgICBkZWYgdGltZXNwZWNfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIHJldHVybiBkaXZtb2QobnMsIFNFQ19UT19OUykKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0NTY3ODkwLCAoMSwgMjM0NTY3ODkwKSksCi0gICAgICAgICAgICAoLTEyMzQ1Njc4OTAsICgtMiwgNzY1NDMyMTEwKSksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXNwZWM9dHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXNwZWMobnMpLCB0cykKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIG5zLCBybmQ6IFB5VGltZV9Bc1RpbWVzcGVjKG5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNwZWNfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCiAKLSAgICBkZWYgdGVzdF9taWxsaXNlY29uZHMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNNaWxsaXNlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNNaWxsaXNlY29uZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBNU19UT19OUywgMSksCi0gICAgICAgICAgICAgICAgKC0yICogTVNfVE9fTlMsIC0yKSwKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAyMDAwKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsIC0zMDAwKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWlsbGlzZWNvbmRzKG5zLCBybmQpLCB0dikKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzTWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihNU19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIG1zLCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsIDAsIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgMCwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNCAqIE1TX1RPX05TICsgMSwgMTIzNCwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQgKiBNU19UT19OUyArIDEsIDEyMzUsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0ICogTVNfVE9fTlMgLSAxLCAtMTIzNSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0ICogTVNfVE9fTlMgLSAxLCAtMTIzNCwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgbWlsbGlzZWNvbmRzPW1zLCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWlsbGlzZWNvbmRzKG5zLCBybmQpLCBtcykKLQotICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kcyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc01pY3Jvc2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc01pY3Jvc2Vjb25kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIFVTX1RPX05TLCAxKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBVU19UT19OUywgLTIpLAogCi0gICAgICAgICAgICAgICAgIyBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIE1TX1RPX05TLCAxMDAwKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBNU19UT19OUywgLTIwMDApLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNNaWNyb3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKFVTX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsIDIwMDAwMDApLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgLTMwMDAwMDApLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWNyb3NlY29uZHMobnMsIHJuZCksIHR2KQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgbXMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgMCwgRkxPT1IpLAotICAgICAgICAgICAgKDEsIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAwLCBDRUlMSU5HKSwKK2NsYXNzIFRlc3RPbGRQeVRpbWUoQ1B5VGltZVRlc3RDYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgb2xkIEMgX1B5VGltZV90IEFQSTogX1B5VGltZV9PYmplY3RUb1hYWCgpIGZ1bmN0aW9ucy4KKyAgICAiIiIKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0ICogVVNfVE9fTlMgKyAxLCAxMjM0LCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNCAqIFVTX1RPX05TICsgMSwgMTIzNSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQgKiBVU19UT19OUyAtIDEsIC0xMjM1LCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQgKiBVU19UT19OUyAtIDEsIC0xMjM0LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCBtaWxsaXNlY29uZHM9bXMsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWNyb3NlY29uZHMobnMsIHJuZCksIG1zKQorICAgICMgdGltZV90IGlzIGEgMzItYml0IG9yIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgIE9WRVJGTE9XX1NFQ09ORFMgPSAyICoqIDY0CisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZV90KHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lX3QKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY2ltYWxfcm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgIGRlZiBjcmVhdGVfY29udmVydGVyKHNlbGYsIHNlY190b191bml0KToKKyAgICAgICAgZGVmIGNvbnZlcnRlcihzZWNzKToKKyAgICAgICAgICAgIGZsb2F0cGFydCwgaW50cGFydCA9IG1hdGgubW9kZihzZWNzKQorICAgICAgICAgICAgaW50cGFydCA9IGludChpbnRwYXJ0KQorICAgICAgICAgICAgZmxvYXRwYXJ0ICo9IHNlY190b191bml0CisgICAgICAgICAgICBmbG9hdHBhcnQgPSBzZWxmLmRlY2ltYWxfcm91bmQoZmxvYXRwYXJ0KQorICAgICAgICAgICAgaWYgZmxvYXRwYXJ0IDwgMDoKKyAgICAgICAgICAgICAgICBmbG9hdHBhcnQgKz0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgICAgICBpbnRwYXJ0IC09IDEKKyAgICAgICAgICAgIGVsaWYgZmxvYXRwYXJ0ID49IHNlY190b191bml0OgorICAgICAgICAgICAgICAgIGZsb2F0cGFydCAtPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgICAgIGludHBhcnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuIChpbnRwYXJ0LCBmbG9hdHBhcnQpCisgICAgICAgIHJldHVybiBjb252ZXJ0ZXIKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1ldmFsKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1ldmFsCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2VjczogKHNlY3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2NvbnZlcnRlcihTRUNfVE9fVVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZXNwZWMoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IChzZWNzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfY29udmVydGVyKFNFQ19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKaW5kZXggM2IxN2NhNi4uOTA0MzhlNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CkBAIC0yNCw4ICsyNCw3IEBACiAgICAgICAgICAgICBpZiB0eXBlID09IEVORE1BUktFUjoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgdHlwZSA9IHRva19uYW1lW3R5cGVdCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgJSh0eXBlKS0xMC4xMHMgJSh0b2tlbiktMTMuMTNyICUoc3RhcnQpcyAlKGVuZClzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscygpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmIiAgICB7dHlwZToxMH0ge3Rva2VuIXI6MTN9IHtzdGFydH0ge2VuZH0iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBbIiAgICBFTkNPRElORyAgICd1dGYtOCcgICAgICAgKDAsIDApICgwLCAwKSJdICsKICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpCkBAIC0xMzIsMTggKzEzMSwxOCBAQAogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJ4ID0gMHhmZmZmZmZmZmZmZiIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCi0gICAgTlVNQkVSICAgICAnMHhmZmZmZmZmZmZmICgxLCA0KSAoMSwgMTcpCisgICAgTlVNQkVSICAgICAnMHhmZmZmZmZmZmZmZicgKDEsIDQpICgxLCAxNykKICAgICAiIiIpCiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAxMjMxNDEyNDIxNTEyNTE2MTYxMTAiLCAiIiJcCiAgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKICAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQotICAgIE5VTUJFUiAgICAgJzEyMzE0MTI0MjE1MSAoMSwgNCkgKDEsIDI1KQorICAgIE5VTUJFUiAgICAgJzEyMzE0MTI0MjE1MTI1MTYxNjExMCcgKDEsIDQpICgxLCAyNSkKICAgICAiIiIpCiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAtMTU5MjE1OTAyMTUwMTI1OTEiLCAiIiJcCiAgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKICAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQogICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgNCkgKDEsIDUpCi0gICAgTlVNQkVSICAgICAnMTU5MjE1OTAyMTUwICgxLCA1KSAoMSwgMjIpCisgICAgTlVNQkVSICAgICAnMTU5MjE1OTAyMTUwMTI1OTEnICgxLCA1KSAoMSwgMjIpCiAgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CkBAIC0zMDcsNiArMzA2LDUwIEBACiAgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyOCkgKDEsIDI5KQogICAgIFNUUklORyAgICAgJ1JCImFiYyInICAgICAoMSwgMzApICgxLCAzNykKICAgICAiIiIpCisgICAgICAgICMgQ2hlY2sgMCwgMSwgYW5kIDIgY2hhcmFjdGVyIHN0cmluZyBwcmVmaXhlcy4KKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJyJhXAorZGVcCitmZyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnImFcXFxcXFxuZGVcXFxcXFxuZmciXCcgKDEsIDApICgzLCAzKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3UiYVwKK2RlIicsICIiIlwKKyAgICBTVFJJTkcgICAgICd1ImFcXFxcXFxuZGUiXCcgICgxLCAwKSAoMiwgMykKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidyYiJhXAorZCInLCAiIiJcCisgICAgU1RSSU5HICAgICAncmIiYVxcXFxcXG5kIlwnICAoMSwgMCkgKDIsIDIpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInIiIiYVwKK2IiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnXCJcIiJhXFxcXFxcbmJcIlwiIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3UiIiJhXAorYiIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICd1XCJcIiJhXFxcXFxcbmJcIlwiIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3JiIiIiYVwKK2JcCitjIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3JiIlwiImFcXFxcXFxuYlxcXFxcXG5jIlwiIicgKDEsIDApICgzLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZiJhYmMiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2YiYWJjIicgICAgICAoMSwgMCkgKDEsIDYpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmUiJhe2J9YyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZlIiYXtifWMiJyAgICgxLCAwKSAoMSwgOSkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2YiIiJhYmMiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZlwiXCJcImFiY1wiXCJcIicgICgxLCAwKSAoMSwgMTApCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInZiJhYmNcCitkZWYiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2YiYWJjXFxcXFxcbmRlZiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidSZiJhYmNcCitkZWYiJywgIiIiXAorICAgIFNUUklORyAgICAgJ1JmImFiY1xcXFxcXG5kZWYiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZnVuY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoImRlZiBkMjIoYSwgYiwgYz0yLCBkPTIsICprKTogcGFzcyIsICIiIlwKQEAgLTUwNSw3ICs1NDgsNyBAQAogICAgICAgICAjIE1ldGhvZHMKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgiQHN0YXRpY21ldGhvZFxuZGVmIGZvbyh4LHkpOiBwYXNzIiwgIiIiXAogICAgIE9QICAgICAgICAgJ0AnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCi0gICAgTkFNRSAgICAgICAnc3RhdGljbWV0aG9kICgxLCAxKSAoMSwgMTMpCisgICAgTkFNRSAgICAgICAnc3RhdGljbWV0aG9kJyAoMSwgMSkgKDEsIDEzKQogICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDEsIDEzKSAoMSwgMTQpCiAgICAgTkFNRSAgICAgICAnZGVmJyAgICAgICAgICgyLCAwKSAoMiwgMykKICAgICBOQU1FICAgICAgICdmb28nICAgICAgICAgKDIsIDQpICgyLCA3KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfdW5wYXJzZS5weQppbmRleCA3MzRiYmMyLi5kOTFhZGU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfdW5wYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfdW5wYXJzZS5weQpAQCAtMTM0LDYgKzEzNCwxNSBAQAogY2xhc3MgVW5wYXJzZVRlc3RDYXNlKEFTVFRlc3RDYXNlKToKICAgICAjIFRlc3RzIGZvciBzcGVjaWZpYyBidWdzIGZvdW5kIGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdW5wYXJzZQogCisgICAgZGVmIHRlc3RfZnN0cmluZ3Moc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlIDI1MTgwCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHIiIiJmJ3tmInswfSIqM30nIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7eX0iKjN9JyIiIikKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2Yie1wneFwnfSIqM30nIiIiKQorCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHInJydmIntyJ3gnIGYne1wic1wifSd9IicnJykKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAocicnJ2Yie3IneCdyZid7XCJzXCJ9J30iJycnKQorCiAgICAgZGVmIHRlc3RfZGVsX3N0YXRlbWVudChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAoImRlbCB4LCB5LCB6IikKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKaW5kZXggMDNkZmY4NC4uMWQ4OTRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CkBAIC0xLDExICsxLDExIEBACiBpbXBvcnQgb3MKLWltcG9ydCBpbwogaW1wb3J0IHN5cwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcm10cmVlLCB1bmxpbmssIGNhcHR1cmVkX3N0ZG91dAorZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiBpbXBvcnQgdW5pdHRlc3QKIAogaW1wb3J0IHRyYWNlCi1mcm9tIHRyYWNlIGltcG9ydCBDb3ZlcmFnZVJlc3VsdHMsIFRyYWNlCitmcm9tIHRyYWNlIGltcG9ydCBUcmFjZQogCiBmcm9tIHRlc3QudHJhY2VkbW9kdWxlcyBpbXBvcnQgdGVzdG1vZAogCkBAIC0zNjUsNTEgKzM2NSwyNyBAQAogICAgICAgICAjIE1hdGNoZWQgYmVmb3JlLgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaWdub3JlLm5hbWVzKGpuKCdiYXInLCAnYmF6LnB5JyksICdiYXonKSkKIAorY2xhc3MgVGVzdENvbW1hbmRMaW5lKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAotY2xhc3MgVGVzdERlcHJlY2F0ZWRNZXRob2RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mYWlsdXJlcyhzZWxmKToKKyAgICAgICAgX2Vycm9ycyA9ICgKKyAgICAgICAgICAgIChiJ2ZpbGVuYW1lIGlzIG1pc3Npbmc6IHJlcXVpcmVkIHdpdGggdGhlIG1haW4gb3B0aW9ucycsICctbCcsICctVCcpLAorICAgICAgICAgICAgKGInY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCknLCAnLWxjJyksCisgICAgICAgICAgICAoYidhcmd1bWVudCAtUi8tLW5vLXJlcG9ydDogbm90IGFsbG93ZWQgd2l0aCBhcmd1bWVudCAtci8tLXJlcG9ydCcsICctclInKSwKKyAgICAgICAgICAgIChiJ211c3Qgc3BlY2lmeSBvbmUgb2YgLS10cmFjZSwgLS1jb3VudCwgLS1yZXBvcnQsIC0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMnLCAnLWcnKSwKKyAgICAgICAgICAgIChiJy1yLy0tcmVwb3J0IHJlcXVpcmVzIC1mLy0tZmlsZScsICctcicpLAorICAgICAgICAgICAgKGInLS1zdW1tYXJ5IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0JywgJy1zVCcpLAorICAgICAgICAgICAgKGIndW5yZWNvZ25pemVkIGFyZ3VtZW50czogLXknLCAnLXknKSkKKyAgICAgICAgZm9yIG1lc3NhZ2UsICphcmdzIGluIF9lcnJvcnM6CisgICAgICAgICAgICAqXywgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctbScsICd0cmFjZScsICphcmdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtZXNzYWdlLCBzdGRlcnIpCiAKLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX3VzYWdlKHNlbGYpOgotICAgICAgICBzaW8gPSBpby5TdHJpbmdJTygpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UudXNhZ2Uoc2lvKQotICAgICAgICBzZWxmLmFzc2VydEluKCdVc2FnZTonLCBzaW8uZ2V0dmFsdWUoKSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfSWdub3JlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLklnbm9yZSgpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX21vZG5hbWUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic3BhbSIsIHRyYWNlLm1vZG5hbWUoInNwYW0iKSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZnVsbG1vZG5hbWUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic3BhbSIsIHRyYWNlLmZ1bGxtb2RuYW1lKCJzcGFtIikpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfbGluZXNfZnJvbV9jb2RlKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIGRlZiBmb28oKToKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICB0cmFjZS5maW5kX2xpbmVzX2Zyb21fY29kZShmb28uX19jb2RlX18sIFsiZWdncyJdKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2xpbmVzKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIGRlZiBmb28oKToKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICB0cmFjZS5maW5kX2xpbmVzKGZvby5fX2NvZGVfXywgWyJlZ2dzIl0pCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfc3RyaW5ncyhzZWxmKToKKyAgICBkZWYgdGVzdF9saXN0ZnVuY3NfZmxhZ19zdWNjZXNzKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGZkOgogICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHVubGluaywgVEVTVEZOKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLmZpbmRfc3RyaW5ncyhmZC5uYW1lKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhzZWxmKToKLSAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmZDoKLSAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmZC5uYW1lKQotCisgICAgICAgICAgICBmZC53cml0ZSgiYSA9IDFcbiIpCisgICAgICAgICAgICBzdGF0dXMsIHN0ZG91dCwgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAndHJhY2UnLCAnLWwnLCBURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInZnVuY3Rpb25zIGNhbGxlZDonLCBzdGRvdXQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CmluZGV4IGI3Njk1ZDYuLjJmNzM5YmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5CkBAIC0xMjksMTIgKzEyOSwxMiBAQAogICAgICAgICBkZWYgZG9fdGVzdChmaXJzdGxpbmVzLCBtZXNzYWdlLCBjaGFyc2V0LCBsaW5lbm8pOgogICAgICAgICAgICAgIyBSYWlzZSB0aGUgbWVzc2FnZSBpbiBhIHN1YnByb2Nlc3MsIGFuZCBjYXRjaCB0aGUgb3V0cHV0CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gb3BlbihURVNURk4sICJ3IiwgZW5jb2Rpbmc9Y2hhcnNldCkKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIiIiezB9aWYgMToKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjazsKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd7MX0nKQotICAgICAgICAgICAgICAgICAgICAiIiIuZm9ybWF0KGZpcnN0bGluZXMsIG1lc3NhZ2UpKQotICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciLCBlbmNvZGluZz1jaGFyc2V0KSBhcyBvdXRwdXQ6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgiIiJ7MH1pZiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignezF9JykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIi5mb3JtYXQoZmlyc3RsaW5lcywgbWVzc2FnZSkpCisKICAgICAgICAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsIFRFU1RGTl0sCiAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKICAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgICAgICAgICBkb190ZXN0KCIgXHRcZlxuIyBjb2Rpbmc6IHswfVxuIi5mb3JtYXQoY2hhcnNldCksCiAgICAgICAgICAgICAgICAgICAgIHRleHQsIGNoYXJzZXQsIDUpCiAgICAgICAgICMgSXNzdWUgIzE4OTYwOiBjb2Rpbmcgc3BlYyBzaG91bGQgaGFzIG5vIGVmZmVjdAotICAgICAgICBkb190ZXN0KCIwXG4jIGNvZGluZzogR0JLXG4iLCAiaFx4ZTkgaG8iLCAndXRmLTgnLCA1KQorICAgICAgICBkb190ZXN0KCJ4PTBcbiMgY29kaW5nOiBHQktcbiIsICJoXHhlOSBobyIsICd1dGYtOCcsIDUpCiAKICAgICBkZWYgdGVzdF9wcmludF90cmFjZWJhY2tfYXRfZXhpdChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjMjI1OTk6IEVuc3VyZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgdHJhY2ViYWNrIG1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weSBiL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkKaW5kZXggZjY1ZTM2MS4uMzU5ZDljMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5CkBAIC0xMSw5ICsxMSwxNSBAQAogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IF90ZXN0Y2FwaQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF90ZXN0Y2FwaSA9IE5vbmUKKwogCiBFTVBUWV9TVFJJTkdfU0laRSA9IHN5cy5nZXRzaXplb2YoYicnKQogCisKIGRlZiBnZXRfZnJhbWVzKG5mcmFtZSwgbGluZW5vX2RlbHRhKToKICAgICBmcmFtZXMgPSBbXQogICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQpAQCAtMzcsMjggKzQzLDMxIEBACiBkZWYgY3JlYXRlX3NuYXBzaG90cygpOgogICAgIHRyYWNlYmFja19saW1pdCA9IDIKIAorICAgICMgX3RyYWNlbWFsbG9jLl9nZXRfdHJhY2VzKCkgcmV0dXJucyBhIGxpc3Qgb2YgKGRvbWFpbiwgc2l6ZSwKKyAgICAjIHRyYWNlYmFja19mcmFtZXMpIHR1cGxlcy4gdHJhY2ViYWNrX2ZyYW1lcyBpcyBhIHR1cGxlIG9mIChmaWxlbmFtZSwKKyAgICAjIGxpbmVfbnVtYmVyKSB0dXBsZXMuCiAgICAgcmF3X3RyYWNlcyA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKIAotICAgICAgICAoNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKICAgICBdCiAgICAgc25hcHNob3QgPSB0cmFjZW1hbGxvYy5TbmFwc2hvdChyYXdfdHJhY2VzLCB0cmFjZWJhY2tfbGltaXQpCiAKICAgICByYXdfdHJhY2VzMiA9IFsKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMiwgNTAwMCwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICg0MDAsICgoJ2MucHknLCA1NzgpLCkpLAorICAgICAgICAoNCwgNDAwLCAoKCdjLnB5JywgNTc4KSwpKSwKICAgICBdCiAgICAgc25hcHNob3QyID0gdHJhY2VtYWxsb2MuU25hcHNob3QocmF3X3RyYWNlczIsIHRyYWNlYmFja19saW1pdCkKIApAQCAtMTI2LDcgKzEzNSw3IEBACiAKICAgICBkZWYgZmluZF90cmFjZShzZWxmLCB0cmFjZXMsIHRyYWNlYmFjayk6CiAgICAgICAgIGZvciB0cmFjZSBpbiB0cmFjZXM6Ci0gICAgICAgICAgICBpZiB0cmFjZVsxXSA9PSB0cmFjZWJhY2suX2ZyYW1lczoKKyAgICAgICAgICAgIGlmIHRyYWNlWzJdID09IHRyYWNlYmFjay5fZnJhbWVzOgogICAgICAgICAgICAgICAgIHJldHVybiB0cmFjZQogCiAgICAgICAgIHNlbGYuZmFpbCgidHJhY2Ugbm90IGZvdW5kIikKQEAgLTE0MCw3ICsxNDksNyBAQAogICAgICAgICB0cmFjZSA9IHNlbGYuZmluZF90cmFjZSh0cmFjZXMsIG9ial90cmFjZWJhY2spCiAKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRyYWNlLCB0dXBsZSkKLSAgICAgICAgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIG9ial9zaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlYmFjaywgb2JqX3RyYWNlYmFjay5fZnJhbWVzKQogCkBAIC0xNjcsOSArMTc2LDggQEAKIAogICAgICAgICB0cmFjZTEgPSBzZWxmLmZpbmRfdHJhY2UodHJhY2VzLCBvYmoxX3RyYWNlYmFjaykKICAgICAgICAgdHJhY2UyID0gc2VsZi5maW5kX3RyYWNlKHRyYWNlcywgb2JqMl90cmFjZWJhY2spCi0gICAgICAgIHNpemUxLCB0cmFjZWJhY2sxID0gdHJhY2UxCi0gICAgICAgIHNpemUyLCB0cmFjZWJhY2syID0gdHJhY2UyCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2ViYWNrMiwgdHJhY2ViYWNrMSkKKyAgICAgICAgZG9tYWluMSwgc2l6ZTEsIHRyYWNlYmFjazEgPSB0cmFjZTEKKyAgICAgICAgZG9tYWluMiwgc2l6ZTIsIHRyYWNlYmFjazIgPSB0cmFjZTIKICAgICAgICAgc2VsZi5hc3NlcnRJcyh0cmFjZWJhY2syLCB0cmFjZWJhY2sxKQogCiAgICAgZGVmIHRlc3RfZ2V0X3RyYWNlZF9tZW1vcnkoc2VsZik6CkBAIC0yOTIsNyArMzAwLDcgQEAKICAgICBtYXhEaWZmID0gNDAwMAogCiAgICAgZGVmIHRlc3RfY3JlYXRlX3NuYXBzaG90KHNlbGYpOgotICAgICAgICByYXdfdHJhY2VzID0gWyg1LCAoKCdhLnB5JywgMiksKSldCisgICAgICAgIHJhd190cmFjZXMgPSBbKDAsIDUsICgoJ2EucHknLCAyKSwpKV0KIAogICAgICAgICB3aXRoIGNvbnRleHRsaWIuRXhpdFN0YWNrKCkgYXMgc3RhY2s6CiAgICAgICAgICAgICBzdGFjay5lbnRlcl9jb250ZXh0KHBhdGNoLm9iamVjdCh0cmFjZW1hbGxvYywgJ2lzX3RyYWNpbmcnLApAQCAtMzIyLDExICszMzAsMTEgQEAKICAgICAgICAgIyBleGNsdWRlIGIucHkKICAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWwotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICg3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCiAgICAgICAgIF0pCiAKICAgICAgICAgIyBmaWx0ZXJfdHJhY2VzKCkgbXVzdCBub3QgdG91Y2ggdGhlIG9yaWdpbmFsIHNuYXBzaG90CkBAIC0zMzUsMTAgKzM0MywxMCBAQAogICAgICAgICAjIG9ubHkgaW5jbHVkZSB0d28gbGluZXMgb2YgYS5weQogICAgICAgICBzbmFwc2hvdDQgPSBzbmFwc2hvdDMuZmlsdGVyX3RyYWNlcygoZmlsdGVyMiwgZmlsdGVyMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3Q0LnRyYWNlcy5fdHJhY2VzLCBbCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKICAgICAgICAgXSkKIAogICAgICAgICAjIE5vIGZpbHRlcjoganVzdCBkdXBsaWNhdGUgdGhlIHNuYXBzaG90CkBAIC0zNDksNiArMzU3LDU0IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzLCBmaWx0ZXIxKQogCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW4oc2VsZik6CisgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKKyAgICAgICAgZmlsdGVyMSA9IHRyYWNlbWFsbG9jLkZpbHRlcihGYWxzZSwgImEucHkiLCBkb21haW49MSkKKyAgICAgICAgZmlsdGVyMiA9IHRyYWNlbWFsbG9jLkZpbHRlcihUcnVlLCAiYS5weSIsIGRvbWFpbj0xKQorCisgICAgICAgIG9yaWdpbmFsX3RyYWNlcyA9IGxpc3Qoc25hcHNob3QudHJhY2VzLl90cmFjZXMpCisKKyAgICAgICAgIyBleGNsdWRlIGEucHkgb2YgZG9tYWluIDEKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAxCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX3RyYWNlc19kb21haW5fZmlsdGVyKHNlbGYpOgorICAgICAgICBzbmFwc2hvdCwgc25hcHNob3QyID0gY3JlYXRlX3NuYXBzaG90cygpCisgICAgICAgIGZpbHRlcjEgPSB0cmFjZW1hbGxvYy5Eb21haW5GaWx0ZXIoRmFsc2UsIGRvbWFpbj0zKQorICAgICAgICBmaWx0ZXIyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIGRvbWFpbj0zKQorCisgICAgICAgICMgZXhjbHVkZSBkb21haW4gMgorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgIF0pCisKKyAgICAgICAgIyBpbmNsdWRlIGRvbWFpbiAyCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgXSkKKwogICAgIGRlZiB0ZXN0X3NuYXBzaG90X2dyb3VwX2J5X2xpbmUoc2VsZik6CiAgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKICAgICAgICAgdGJfMCA9IHRyYWNlYmFja19saW5lbm8oJzx1bmtub3duPicsIDApCkBAIC04MTYsMTIgKzg3MiwxMjEgQEAKICAgICAgICAgYXNzZXJ0X3B5dGhvbl9vaygnLVgnLCAndHJhY2VtYWxsb2MnLCAnLWMnLCBjb2RlKQogCiAKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIF90ZXN0Y2FwaScpCitjbGFzcyBUZXN0Q0FQSSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbWF4RGlmZiA9IDgwICogMjAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgdHJhY2VtYWxsb2MuaXNfdHJhY2luZygpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidHJhY2VtYWxsb2MgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGUgdGVzdCIpCisKKyAgICAgICAgc2VsZi5kb21haW4gPSA1CisgICAgICAgIHNlbGYuc2l6ZSA9IDEyMworICAgICAgICBzZWxmLm9iaiA9IGFsbG9jYXRlX2J5dGVzKHNlbGYuc2l6ZSlbMF0KKworICAgICAgICAjIGZvciB0aGUgdHlwZSAib2JqZWN0IiwgaWQob2JqKSBpcyB0aGUgYWRkcmVzcyBvZiBpdHMgbWVtb3J5IGJsb2NrLgorICAgICAgICAjIFRoaXMgdHlwZSBpcyBub3QgdHJhY2tlZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICAgICAgc2VsZi5wdHIgPSBpZChzZWxmLm9iaikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICBkZWYgZ2V0X3RyYWNlYmFjayhzZWxmKToKKyAgICAgICAgZnJhbWVzID0gX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorICAgICAgICBpZiBmcmFtZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgdHJhY2soc2VsZiwgcmVsZWFzZV9naWw9RmFsc2UsIG5mcmFtZT0xKToKKyAgICAgICAgZnJhbWVzID0gZ2V0X2ZyYW1lcyhuZnJhbWUsIDIpCisgICAgICAgIF90ZXN0Y2FwaS50cmFjZW1hbGxvY190cmFjayhzZWxmLmRvbWFpbiwgc2VsZi5wdHIsIHNlbGYuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfZ2lsKQorICAgICAgICByZXR1cm4gZnJhbWVzCisKKyAgICBkZWYgdW50cmFjayhzZWxmKToKKyAgICAgICAgX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX3VudHJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyKQorCisgICAgZGVmIGdldF90cmFjZWRfbWVtb3J5KHNlbGYpOgorICAgICAgICAjIEdldCB0aGUgdHJhY2VkIHNpemUgaW4gdGhlIGRvbWFpbgorICAgICAgICBzbmFwc2hvdCA9IHRyYWNlbWFsbG9jLnRha2Vfc25hcHNob3QoKQorICAgICAgICBkb21haW5fZmlsdGVyID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKFRydWUsIHNlbGYuZG9tYWluKQorICAgICAgICBzbmFwc2hvdCA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoW2RvbWFpbl9maWx0ZXJdKQorICAgICAgICByZXR1cm4gc3VtKHRyYWNlLnNpemUgZm9yIHRyYWNlIGluIHNuYXBzaG90LnRyYWNlcykKKworICAgIGRlZiBjaGVja190cmFjayhzZWxmLCByZWxlYXNlX2dpbCk6CisgICAgICAgIG5mcmFtZSA9IDUKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQobmZyYW1lKQorCisgICAgICAgIHNpemUgPSB0cmFjZW1hbGxvYy5nZXRfdHJhY2VkX21lbW9yeSgpWzBdCisKKyAgICAgICAgZnJhbWVzID0gc2VsZi50cmFjayhyZWxlYXNlX2dpbCwgbmZyYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlYmFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jLlRyYWNlYmFjayhmcmFtZXMpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCBzZWxmLnNpemUpCisKKyAgICBkZWYgdGVzdF90cmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190cmFjayhGYWxzZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19UcmFjaygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMCisgICAgICAgICMgd29ya3MgdG9vCisgICAgICAgIHNlbGYuY2hlY2tfdHJhY2soVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrX2FscmVhZHlfdHJhY2tlZChzZWxmKToKKyAgICAgICAgbmZyYW1lID0gNQorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydChuZnJhbWUpCisKKyAgICAgICAgIyB0cmFjayBhIGZpcnN0IHRpbWUKKyAgICAgICAgc2VsZi50cmFjaygpCisKKyAgICAgICAgIyBjYWxsaW5nIF9QeVRyYWNlTWFsbG9jX1RyYWNrKCkgbXVzdCByZW1vdmUgdGhlIG9sZCB0cmFjZSBhbmQgYWRkCisgICAgICAgICMgYSBuZXcgdHJhY2Ugd2l0aCB0aGUgbmV3IHRyYWNlYmFjaworICAgICAgICBmcmFtZXMgPSBzZWxmLnRyYWNrKG5mcmFtZT1uZnJhbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2ViYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykpCisKKyAgICBkZWYgdGVzdF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisKKyAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlZF9tZW1vcnkoKSwgc2VsZi5zaXplKQorCisgICAgICAgICMgdW50cmFjayBtdXN0IHJlbW92ZSB0aGUgdHJhY2UKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5nZXRfdHJhY2ViYWNrKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCAwKQorCisgICAgICAgICMgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKCkgbXVsdGlwbGUgdGltZXMgbXVzdCBub3QgY3Jhc2gKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKyAgICAgICAgc2VsZi51bnRyYWNrKCkKKworICAgIGRlZiB0ZXN0X3N0b3BfdHJhY2soc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorCisgICAgZGVmIHRlc3Rfc3RvcF91bnRyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisgICAgICAgIHNlbGYudHJhY2soKQorCisgICAgICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnVudHJhY2soKQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKICAgICAgICAgVGVzdFRyYWNlbWFsbG9jRW5hYmxlZCwKICAgICAgICAgVGVzdFNuYXBzaG90LAogICAgICAgICBUZXN0RmlsdGVycywKICAgICAgICAgVGVzdENvbW1hbmRMaW5lLAorICAgICAgICBUZXN0Q0FQSSwKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKaW5kZXggYzhiMzdlZS4uZTk1NjRmZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpAQCAtMjg5LDEyICsyODksMTIgQEAKICAgICAgICAgZGVmIGh0dHBfc2VydmVyX3dpdGhfYmFzaWNfYXV0aF9oYW5kbGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICByZXR1cm4gQmFzaWNBdXRoSGFuZGxlcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuc2VydmVyID0gTG9vcGJhY2tIdHRwU2VydmVyVGhyZWFkKGh0dHBfc2VydmVyX3dpdGhfYmFzaWNfYXV0aF9oYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5zZXJ2ZXIuc3RvcCkKICAgICAgICAgc2VsZi5zZXJ2ZXJfdXJsID0gJ2h0dHA6Ly8xMjcuMC4wLjE6JXMnICUgc2VsZi5zZXJ2ZXIucG9ydAogICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCiAgICAgICAgIHNlbGYuc2VydmVyLnJlYWR5LndhaXQoKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKICAgICAgICAgc3VwZXIoQmFzaWNBdXRoVGVzdHMsIHNlbGYpLnRlYXJEb3duKCkKIAogICAgIGRlZiB0ZXN0X2Jhc2ljX2F1dGhfc3VjY2VzcyhzZWxmKToKQEAgLTQzOCwxNyArNDM4LDEzIEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cGVyKFRlc3RVcmxvcGVuLCBzZWxmKS5zZXRVcCgpCi0gICAgICAgICMgSWdub3JlIHByb3hpZXMgZm9yIGxvY2FsaG9zdCB0ZXN0cy4KLSAgICAgICAgc2VsZi5vbGRfZW52aXJvbiA9IG9zLmVudmlyb24uY29weSgpCi0gICAgICAgIG9zLmVudmlyb25bJ05PX1BST1hZJ10gPSAnKicKLSAgICAgICAgc2VsZi5zZXJ2ZXIgPSBOb25lCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuc2VydmVyIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCi0gICAgICAgIG9zLmVudmlyb24uY2xlYXIoKQotICAgICAgICBvcy5lbnZpcm9uLnVwZGF0ZShzZWxmLm9sZF9lbnZpcm9uKQotICAgICAgICBzdXBlcihUZXN0VXJsb3Blbiwgc2VsZikudGVhckRvd24oKQorICAgICAgICAjIElnbm9yZSBwcm94aWVzIGZvciBsb2NhbGhvc3QgdGVzdHMuCisgICAgICAgIGRlZiByZXN0b3JlX2Vudmlyb24ob2xkX2Vudmlyb24pOgorICAgICAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgICAgICBvcy5lbnZpcm9uLnVwZGF0ZShvbGRfZW52aXJvbikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfZW52aXJvbiwgb3MuZW52aXJvbi5jb3B5KCkpCisgICAgICAgIG9zLmVudmlyb25bJ05PX1BST1hZJ10gPSAnKicKIAogICAgIGRlZiB1cmxvcGVuKHNlbGYsIHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIGwgPSBbXQpAQCAtNDY5LDYgKzQ2NSw3IEBACiAgICAgICAgIGhhbmRsZXIgPSBHZXRSZXF1ZXN0SGFuZGxlcihyZXNwb25zZXMpCiAKICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBMb29wYmFja0h0dHBTZXJ2ZXJUaHJlYWQoaGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuc2VydmVyLnN0b3ApCiAgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCiAgICAgICAgIHBvcnQgPSBzZWxmLnNlcnZlci5wb3J0CkBAIC01OTIsNyArNTg5LDggQEAKICAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKCkKICAgICAgICAgcmVxID0gdXJsbGliLnJlcXVlc3QuUmVxdWVzdCgiaHR0cDovL2xvY2FsaG9zdDolcy8iICUgaGFuZGxlci5wb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJSYW5nZSI6ICJieXRlcz0yMC0zOSJ9KQotICAgICAgICB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHJlcSkKKyAgICAgICAgd2l0aCB1cmxsaWIucmVxdWVzdC51cmxvcGVuKHJlcSk6CisgICAgICAgICAgICBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlci5oZWFkZXJzX3JlY2VpdmVkWyJSYW5nZSJdLCAiYnl0ZXM9MjAtMzkiKQogCiAgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CkBAIC02MDgsMjIgKzYwNiwyMSBAQAogCiAgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKICAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKAotICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKAorICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICB3aXRoIG9wZW5fdXJsOgogICAgICAgICAgICAgaW5mb19vYmogPSBvcGVuX3VybC5pbmZvKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbmZvX29iaiwgZW1haWwubWVzc2FnZS5NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIG9mIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldF9jb250ZW50X3N1YnR5cGUoKSwgInBsYWluIikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5mb19vYmosIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugb2YgZW1haWwubWVzc2FnZS5NZXNzYWdlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvX29iai5nZXRfY29udGVudF9zdWJ0eXBlKCksICJwbGFpbiIpCiAKICAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHNhbWUgVVJMIGFzIG9wZW5lZCBpcyByZXR1cm5lZCBieSBnZXR1cmwuCiAgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcigpCiAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCi0gICAgICAgIHVybCA9IG9wZW5fdXJsLmdldHVybCgpCisgICAgICAgIHdpdGggb3Blbl91cmw6CisgICAgICAgICAgICB1cmwgPSBvcGVuX3VybC5nZXR1cmwoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybCwgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQogCiAgICAgZGVmIHRlc3RfaXRlcmF0aW9uKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKaW5kZXggODI5OTk3Zi4uOTE2NWQ3MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CkBAIC02MDUsMjkgKzYwNSwyNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgODApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJsKQogCi0gICAgICAgICMgVmVyaWZ5IGFuIGlsbGVnYWwgcG9ydCBpcyByZXR1cm5lZCBhcyBOb25lCisgICAgICAgICMgVmVyaWZ5IGFuIGlsbGVnYWwgcG9ydCByYWlzZXMgVmFsdWVFcnJvcgogICAgICAgICB1cmwgPSBiIkhUVFA6Ly9XV1cuUFlUSE9OLk9SRzo2NTUzNi9kb2MvI2ZyYWciCiAgICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQodXJsKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICJvdXQgb2YgcmFuZ2UiKToKKyAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc19iYWRfcG9ydChzZWxmKToKLSAgICAgICAgIiIiQ2hlY2sgaGFuZGxpbmcgb2Ygbm9uLWludGVnZXIgcG9ydHMuIiIiCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKLQotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgIyBPbmNlIGFnYWluLCByZXBlYXQgb3Vyc2VsdmVzIHRvIHRlc3QgYnl0ZXMKLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChiImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgYiJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShiImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgYiJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisgICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIGludmFsaWQgcG9ydHMuIiIiCisgICAgICAgIGZvciBieXRlcyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgZm9yIHBhcnNlIGluICh1cmxsaWIucGFyc2UudXJsc3BsaXQsIHVybGxpYi5wYXJzZS51cmxwYXJzZSk6CisgICAgICAgICAgICAgICAgZm9yIHBvcnQgaW4gKCJmb28iLCAiMS41IiwgIi0xIiwgIjB4MTAiKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYnl0ZXM9Ynl0ZXMsIHBhcnNlPXBhcnNlLCBwb3J0PXBvcnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gInd3dy5leGFtcGxlLm5ldDoiICsgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly8iICsgbmV0bG9jCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBieXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2MuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHBhcnNlKHVybCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIG5ldGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wb3J0CiAKICAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dpdGhvdXRfbmV0bG9jKHNlbGYpOgogICAgICAgICAjIFRoaXMgZXhhbXBsZSBpcyBzdHJhaWdodCBmcm9tIFJGQyAzMjYxLiAgSXQgbG9va3MgbGlrZSBpdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKaW5kZXggODM1N2Y4Yi4uZjQ0NDU2ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29sbGVjdGlvbnMuVXNlckRpY3Qob25lPTEsIHR3bz0yKSwgZDIpCiAgICAgICAgICMgaXRlbSBzZXF1ZW5jZSBjb25zdHJ1Y3RvcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KFsoJ29uZScsMSksICgndHdvJywyKV0pLCBkMikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29sbGVjdGlvbnMuVXNlckRpY3QoZGljdD1bKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCiAgICAgICAgICMgYm90aCB0b2dldGhlcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KFsoJ29uZScsMSksICgndHdvJywyKV0sIHR3bz0zLCB0aHJlZT01KSwgZDMpCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgNDIpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KHt9LCBkaWN0PU5vbmUpLml0ZW1zKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2RpY3QnLCBOb25lKV0pCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29sbGVjdGlvbnMuVXNlckRpY3QoZGljdD17J2EnOiA0Mn0pLml0ZW1zKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdhJywgNDIpXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2xsZWN0aW9ucy5Vc2VyRGljdCwgNDIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ZlbnYucHkgYi9MaWIvdGVzdC90ZXN0X3ZlbnYucHkKaW5kZXggZDJjOTg2ZS4uNTViZWUyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF92ZW52LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdmVudi5weQpAQCAtMzEsMTggKzMxLDE3IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgdGhyZWFkaW5nID0gTm9uZQogCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGN0eXBlcyA9IE5vbmUKKwogc2tpcEluVmVudiA9IHVuaXR0ZXN0LnNraXBJZihzeXMucHJlZml4ICE9IHN5cy5iYXNlX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3Qgbm90IGFwcHJvcHJpYXRlIGluIGEgdmVudicpCiAKLSMgb3MucGF0aC5leGlzdHMoJ251bCcpIGlzIEZhbHNlOiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1NDEKLWlmIG9zLmRldm51bGwubG93ZXIoKSA9PSAnbnVsJzoKLSAgICBmYWlsc09uV2luZG93cyA9IHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQotZWxzZToKLSAgICBkZWYgZmFpbHNPbldpbmRvd3MoZik6Ci0gICAgICAgIHJldHVybiBmCi0KIGNsYXNzIEJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciB2ZW52IHRlc3RzLiIiIgorICAgIG1heERpZmYgPSA4MCAqIDUwCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuZW52X2RpciA9IG9zLnBhdGgucmVhbHBhdGgodGVtcGZpbGUubWtkdGVtcCgpKQpAQCAtNTIsNyArNTEsNyBAQAogICAgICAgICAgICAgc2VsZi5pbmNsdWRlID0gJ0luY2x1ZGUnCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmJpbmRpciA9ICdiaW4nCi0gICAgICAgICAgICBzZWxmLmxpYiA9ICgnbGliJywgJ3B5dGhvbiVzJyAlIHN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgICAgIHNlbGYubGliID0gKCdsaWInLCAncHl0aG9uJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAgICAgICAgICAgICBzZWxmLmluY2x1ZGUgPSAnaW5jbHVkZScKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAnX19QWVZFTlZfTEFVTkNIRVJfXycgaW4gb3MuZW52aXJvbjoKICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5lbnZpcm9uWydfX1BZVkVOVl9MQVVOQ0hFUl9fJ10KQEAgLTMxMywyMCArMzEyLDI3IEBACiAgICAgICAgIHNlbGYucnVuX3dpdGhfY2FwdHVyZSh2ZW52LmNyZWF0ZSwgc2VsZi5lbnZfZGlyLCB3aXRoX3BpcD1GYWxzZSkKICAgICAgICAgc2VsZi5hc3NlcnRfcGlwX25vdF9pbnN0YWxsZWQoKQogCi0gICAgQGZhaWxzT25XaW5kb3dzCi0gICAgZGVmIHRlc3RfZGV2bnVsbF9leGlzdHNfYW5kX2lzX2VtcHR5KHNlbGYpOgorICAgIGRlZiB0ZXN0X2Rldm51bGwoc2VsZik6CiAgICAgICAgICMgRml4IGZvciBpc3N1ZSAjMjAwNTMgdXNlcyBvcy5kZXZudWxsIHRvIGZvcmNlIGEgY29uZmlnIGZpbGUgdG8KICAgICAgICAgIyBhcHBlYXIgZW1wdHkuIEhvd2V2ZXIgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwNTQxIG1lYW5zCiAgICAgICAgICMgdGhhdCBkb2Vzbid0IGN1cnJlbnRseSB3b3JrIHByb3Blcmx5IG9uIFdpbmRvd3MuIE9uY2UgdGhhdCBpcwogICAgICAgICAjIGZpeGVkLCB0aGUgIndpbl9sb2NhdGlvbiIgcGFydCBvZiB0ZXN0X3dpdGhfcGlwIHNob3VsZCBiZSByZXN0b3JlZAotICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCiAgICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiIiKQogCisgICAgICAgICMgSXNzdWUgIzIwNTQxOiBvcy5wYXRoLmV4aXN0cygnbnVsJykgaXMgRmFsc2Ugb24gV2luZG93cworICAgICAgICBpZiBvcy5kZXZudWxsLmxvd2VyKCkgPT0gJ251bCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKG9zLmRldm51bGwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLmRldm51bGwpKQorCisKICAgICAjIFJlcXVlc3RpbmcgcGlwIGZhaWxzIHdpdGhvdXQgU1NMIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTk3NDQpCiAgICAgQHVuaXR0ZXN0LnNraXBJZihzc2wgaXMgTm9uZSwgZW5zdXJlcGlwLl9NSVNTSU5HX1NTTF9NRVNTQUdFKQogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ3NvbWUgZGVwZW5kZW5jaWVzIG9mIHBpcCBpbXBvcnQgdGhyZWFkaW5nJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBtb2R1bGUgdW5jb25kaXRpb25hbGx5JykKKyAgICAjIElzc3VlICMyNjYxMDogcGlwL3BlcDQyNXRhZ3MucHkgcmVxdWlyZXMgY3R5cGVzCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoY3R5cGVzLCAncGlwIHJlcXVpcmVzIGN0eXBlcycpCiAgICAgZGVmIHRlc3Rfd2l0aF9waXAoc2VsZik6CiAgICAgICAgIHJtdHJlZShzZWxmLmVudl9kaXIpCiAgICAgICAgIHdpdGggRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudnZhcnM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weQppbmRleCBmZmZhZGFkLi40MmM3NjAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkKQEAgLTIsNyArMiw5IEBACiBpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgb3MKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQpAQCAtNjUzLDYgKzY1NSwxNyBAQAogICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4odGV4dCwgcmVzdWx0KQogCisgICAgZGVmIHRlc3Rfc2hvd3dhcm5tc2dfbWlzc2luZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgX3Nob3d3YXJubXNnKCkgbWlzc2luZyBpcyBva2F5LgorICAgICAgICB0ZXh0ID0gJ2RlbCBfc2hvd3dhcm5tc2cgdGVzdCcKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImFsd2F5cyIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgZGVsIHNlbGYubW9kdWxlLl9zaG93d2Fybm1zZworICAgICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX291dHB1dCgnc3RkZXJyJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEluKHRleHQsIHJlc3VsdCkKKwogICAgIGRlZiB0ZXN0X3Nob3d3YXJuaW5nX25vdF9jYWxsYWJsZShzZWxmKToKICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpOgogICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImFsd2F5cyIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQpAQCAtNzU0LDEyICs3NjcsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9vYmplY3QsIGV4cGVjdGVkX2ZpbGVfbGluZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGZpbGVfb2JqZWN0LmdldHZhbHVlKCkpCiAKKwogY2xhc3MgQ1dhcm5pbmdzRGlzcGxheVRlc3RzKFdhcm5pbmdzRGlzcGxheVRlc3RzLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgbW9kdWxlID0gY193YXJuaW5ncwogCiBjbGFzcyBQeVdhcm5pbmdzRGlzcGxheVRlc3RzKFdhcm5pbmdzRGlzcGxheVRlc3RzLCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgbW9kdWxlID0gcHlfd2FybmluZ3MKIAorICAgIGRlZiB0ZXN0X3RyYWNlbWFsbG9jKHNlbGYpOgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorCisgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgICAgICBkZWYgZnVuYygpOgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihfX2ZpbGVfXykKKyAgICAgICAgICAgICAgICAgICAgIyBFbWl0IFJlc291cmNlV2FybmluZworICAgICAgICAgICAgICAgICAgICBmID0gTm9uZQorCisgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAiIiIpKQorCisgICAgICAgIHJlcyA9IGFzc2VydF9weXRob25fb2soJy1XZCcsICctWCcsICd0cmFjZW1hbGxvYz0yJywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgc3RkZXJyID0gcmVzLmVyci5kZWNvZGUoJ2FzY2lpJywgJ3JlcGxhY2UnKQorICAgICAgICAjIG5vcm1hbGl6ZSBuZXdsaW5lcworICAgICAgICBzdGRlcnIgPSAnXG4nLmpvaW4oc3RkZXJyLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc3RkZXJyID0gcmUuc3ViKCc8Lio+JywgJzwuLi4+Jywgc3RkZXJyKQorICAgICAgICBleHBlY3RlZCA9IHRleHR3cmFwLmRlZGVudCgnJycKKyAgICAgICAgICAgIHtmbmFtZX06NTogUmVzb3VyY2VXYXJuaW5nOiB1bmNsb3NlZCBmaWxlIDwuLi4+CisgICAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICBPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgICAgICAgICAgRmlsZSAie2ZuYW1lfSIsIGxpbmVubyAzCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oX19maWxlX18pCisgICAgICAgICAgICAgIEZpbGUgIntmbmFtZX0iLCBsaW5lbm8gNworICAgICAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICAnJycpCisgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQuZm9ybWF0KGZuYW1lPXN1cHBvcnQuVEVTVEZOKS5zdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RkZXJyLCBleHBlY3RlZCkKKwogCiBjbGFzcyBDYXRjaFdhcm5pbmdUZXN0cyhCYXNlVGVzdCk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvZGF0YS9pbXBvcnRfd2FybmluZy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvZGF0YS9pbXBvcnRfd2FybmluZy5weQppbmRleCBkNmVhMmNlLi4zMmRhZWMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL2RhdGEvaW1wb3J0X3dhcm5pbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9kYXRhL2ltcG9ydF93YXJuaW5nLnB5CkBAIC0xLDMgKzEsMyBAQAogaW1wb3J0IHdhcm5pbmdzCiAKLXdhcm5pbmdzLndhcm4oJ21vZHVsZS1sZXZlbCB3YXJuaW5nJywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQord2FybmluZ3Mud2FybignbW9kdWxlLWxldmVsIHdhcm5pbmcnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQppbmRleCAzZWZmNzczLi5hNjdhOGIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhdmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CkBAIC0xLDYgKzEsNyBAQAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IGF1ZGlvdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBhdWRpb29wIGltcG9ydCBieXRlc3dhcAogaW1wb3J0IHN5cwogaW1wb3J0IHdhdmUKQEAgLTEwMyw1ICsxMDQsMTEgQEAKICAgICAgICAgZnJhbWVzID0gYnl0ZXN3YXAoZnJhbWVzLCA0KQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J1dBVkVfRk9STUFUX1BDTSd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHdhdmUsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQppbmRleCBlOGQ3ODliLi4zODE1MDYyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CkBAIC00NTQsNyArNDU0LDcgQEAKICAgICAgICAgICAgIHdpdGggY20oKToKICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQogCiAgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKQEAgLTQ4Miw3ICs0ODIsNyBAQAogICAgICAgICAgICAgd2l0aCBjbSgpOgogICAgICAgICAgICAgICAgIHJhaXNlIG5leHQoaXRlcihbXSkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCiAKICAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCA0NGUzMTQyLi5hNTZmMTU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtOTEsOCArOTEsNiBAQAogCiAKIGNsYXNzIE1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVE9ETzogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCByaWQgb2YgdGhlIGdsb2JhbCBtb2R1bGUgdmFycwotCiAgICAgZGVmIHRlc3Rfc2FuaXR5KHNlbGYpOgogICAgICAgICAjIEltcG9ydCBzYW5pdHkuCiAKQEAgLTEwMCw2ICs5OCwxMCBAQAogICAgICAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKICAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIG5hbWVzID0gKCJ4bWwuZXRyZWUuRWxlbWVudFRyZWUiLCAiX2VsZW1lbnR0cmVlIikKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgRVQsIG5hbWVzLCBibGFja2xpc3Q9KCJIVE1MX0VNUFRZIiwpKQorCiAKIGRlZiBzZXJpYWxpemUoZWxlbSwgdG9fc3RyaW5nPVRydWUsIGVuY29kaW5nPSd1bmljb2RlJywgKipvcHRpb25zKToKICAgICBpZiBlbmNvZGluZyAhPSAndW5pY29kZSc6CkBAIC0xODIsMTAgKzE4NCwxMiBAQAogCiAgICAgICAgIGRlZiBjaGVja19lbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEVULmlzZWxlbWVudChlbGVtZW50KSwgbXNnPSJub3QgYW4gZWxlbWVudCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGFnIiksIG1zZz0ibm8gdGFnIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIiksIG1zZz0ibm8gYXR0cmliIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGV4dCIpLCBtc2c9Im5vIHRleHQgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIiksIG1zZz0ibm8gdGFpbCBtZW1iZXIiKQorICAgICAgICAgICAgZGlyZWxlbSA9IGRpcihlbGVtZW50KQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gJ3RhZycsICdhdHRyaWInLCAndGV4dCcsICd0YWlsJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nbm8gJXMgbWVtYmVyJyAlIGF0dHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdHRyLCBkaXJlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdubyAlcyB2aXNpYmxlIGJ5IGRpcicgJSBhdHRyKQogCiAgICAgICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWcpCiAgICAgICAgICAgICBjaGVja19tYXBwaW5nKGVsZW1lbnQuYXR0cmliKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IDJjMTA4MjEuLjg1ODkzNDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTMsNiArMyw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBpbXBvcnRsaWIudXRpbAoraW1wb3J0IHBvc2l4cGF0aAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB6aXBmaWxlCkBAIC0yMDcxLDUgKzIwNzIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfTFpNQQogCitjbGFzcyBaaXBJbmZvVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Zyb21fZmlsZShzZWxmKToKKyAgICAgICAgemkgPSB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKF9fZmlsZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5iYXNlbmFtZSh6aS5maWxlbmFtZSksICd0ZXN0X3ppcGZpbGUucHknKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHppLmlzX2RpcigpKQorCisgICAgZGVmIHRlc3RfZnJvbV9kaXIoc2VsZik6CisgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgICAgICAgemkgPSB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKGRpcnBhdGgsICdzdGRsaWJfdGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmZpbGVuYW1lLCAnc3RkbGliX3Rlc3RzLycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aS5pc19kaXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZmlsZV9zaXplLCAwKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQppbmRleCAwZGE1OTA2Li4xZjEwMDk1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpAQCAtMzk4LDcgKzM5OCw4IEBACiAgICAgICAgIHBhY2tkaXIyID0gcGFja2RpciArIFRFU1RQQUNLMiArIG9zLnNlcAogICAgICAgICBmaWxlcyA9IHtwYWNrZGlyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKICAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAotICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgInNwYW0iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQogCiAgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCiAgICAgICAgIHRyeToKQEAgLTQxMiw2ICs0MTMsMTQgQEAKICAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5hcmNoaXZlLCBURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSyksIFRydWUpCisKKyAgICAgICAgICAgIGZpbmRfbW9kID0gemkuZmluZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2QpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmluZF9tb2QsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmluZF9tb2QuaXNfcGFja2FnZSgnc3BhbScpKQorICAgICAgICAgICAgbG9hZF9tb2QgPSBmaW5kX21vZC5sb2FkX21vZHVsZSgnc3BhbScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbW9kLmdldF9maWxlbmFtZSgnc3BhbScpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kID0gemkubG9hZF9tb2R1bGUoVEVTVFBBQ0spCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9maWxlbmFtZShURVNUUEFDSyksIG1vZC5fX2ZpbGVfXykKIApAQCAtNDcxLDYgKzQ4MCwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICB6aS5pc19wYWNrYWdlKFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QpLCBGYWxzZSkKIAorICAgICAgICAgICAgcGtnX3BhdGggPSBURU1QX1pJUCArIG9zLnNlcCArIHBhY2tkaXIgKyBURVNUUEFDSzIKKyAgICAgICAgICAgIHppMiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihwa2dfcGF0aCkKKyAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZCA9IHppMi5maW5kX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2RfZG90dGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kX2RvdHRlZCwgemlwaW1wb3J0LnppcGltcG9ydGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6aTIuaXNfcGFja2FnZShURVNUTU9EKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2RfZG90dGVkLmxvYWRfbW9kdWxlKFRFU1RNT0QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZC5nZXRfZmlsZW5hbWUoVEVTVE1PRCksIGxvYWRfbW9kLl9fZmlsZV9fKQorCiAgICAgICAgICAgICBtb2RfcGF0aCA9IFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QKICAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kdWxlX3BhdGhfdG9fZG90dGVkX25hbWUobW9kX3BhdGgpCiAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCAxY2FmY2I1Li4wOTc4Yjc5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0xNjIsNiArMTYyLDEwIEBACiAgICAgICAgIHggPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIEhBTUxFVF9TQ0VORSkKIAorICAgIGRlZiB0ZXN0X2tleXdvcmRzKHNlbGYpOgorICAgICAgICB4ID0gemxpYi5jb21wcmVzcyhkYXRhPUhBTUxFVF9TQ0VORSwgbGV2ZWw9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIEhBTUxFVF9TQ0VORSkKKwogICAgIGRlZiB0ZXN0X3NwZWVjaDEyOChzZWxmKToKICAgICAgICAgIyBjb21wcmVzcyBtb3JlIGRhdGEKICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORSAqIDEyOApkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggODI4MDE5ZC4uMmJmMzNjMSAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC0yMiw5ICsyMiwxMSBAQAogIyB3aXRoIHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLCB3aGljaCBkb2Vzbid0IHByb3ZpZGUgdGhlIG9sZAogIyBKYXZhIGluc3BpcmVkIG5hbWVzLgogCi1fX2FsbF9fID0gWydhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRfdGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCi0gICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsICdCYXJyaWVyJywKLSAgICAgICAgICAgJ1RpbWVyJywgJ1RocmVhZEVycm9yJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCitfX2FsbF9fID0gWydnZXRfaWRlbnQnLCAnYWN0aXZlX2NvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50X3RocmVhZCcsCisgICAgICAgICAgICdlbnVtZXJhdGUnLCAnbWFpbl90aHJlYWQnLCAnVElNRU9VVF9NQVgnLAorICAgICAgICAgICAnRXZlbnQnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdUaHJlYWQnLAorICAgICAgICAgICAnQmFycmllcicsICdCcm9rZW5CYXJyaWVyRXJyb3InLCAnVGltZXInLCAnVGhyZWFkRXJyb3InLAorICAgICAgICAgICAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KIAogIyBSZW5hbWUgc29tZSBzdHVmZiBzbyAiZnJvbSB0aHJlYWRpbmcgaW1wb3J0ICoiIGlzIHNhZmUKIF9zdGFydF9uZXdfdGhyZWFkID0gX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkCmRpZmYgLS1naXQgYS9MaWIvdGltZWl0LnB5IGIvTGliL3RpbWVpdC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDJkZTg4ZjcuLjk4Y2IzZWIKLS0tIGEvTGliL3RpbWVpdC5weQorKysgYi9MaWIvdGltZWl0LnB5CkBAIC0zMTcsMjAgKzMxNywyNiBAQAogICAgIHByaW50KCIlZCBsb29wcywiICUgbnVtYmVyLCBlbmQ9JyAnKQogICAgIHVzZWMgPSBiZXN0ICogMWU2IC8gbnVtYmVyCiAgICAgaWYgdGltZV91bml0IGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyAlcyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjL3VuaXRzW3RpbWVfdW5pdF0sIHRpbWVfdW5pdCkpCisgICAgICAgIHNjYWxlID0gdW5pdHNbdGltZV91bml0XQogICAgIGVsc2U6Ci0gICAgICAgIGlmIHVzZWMgPCAxMDAwOgotICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgdXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sIHVzZWMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbXNlYyA9IHVzZWMgLyAxMDAwCi0gICAgICAgICAgICBpZiBtc2VjIDwgMTAwMDoKLSAgICAgICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyBtc2VjIHBlciBsb29wIiAlIChyZXBlYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCBtc2VjKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VjID0gbXNlYyAvIDEwMDAKLSAgICAgICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyBzZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiwgc2VjKSkKKyAgICAgICAgc2NhbGVzID0gWyhzY2FsZSwgdW5pdCkgZm9yIHVuaXQsIHNjYWxlIGluIHVuaXRzLml0ZW1zKCldCisgICAgICAgIHNjYWxlcy5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgZm9yIHNjYWxlLCB0aW1lX3VuaXQgaW4gc2NhbGVzOgorICAgICAgICAgICAgaWYgdXNlYyA+PSBzY2FsZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnICVzIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlYy9zY2FsZSwgdGltZV91bml0KSkKKyAgICBiZXN0ID0gbWluKHIpCisgICAgdXNlYyA9IGJlc3QgKiAxZTYgLyBudW1iZXIKKyAgICB3b3JzdCA9IG1heChyKQorICAgIGlmIHdvcnN0ID49IGJlc3QgKiA0OgorICAgICAgICB1c2VjID0gd29yc3QgKiAxZTYgLyBudW1iZXIKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm5fZXhwbGljaXQoCisgICAgICAgICAgICAiVGhlIHRlc3QgcmVzdWx0cyBhcmUgbGlrZWx5IHVucmVsaWFibGUuIFRoZSB3b3JzdFxuIgorICAgICAgICAgICAgInRpbWUgKCUuKmcgJXMpIHdhcyBtb3JlIHRoYW4gZm91ciB0aW1lcyBzbG93ZXIgdGhhbiB0aGUgYmVzdCB0aW1lLiIgJQorICAgICAgICAgICAgKHByZWNpc2lvbiwgdXNlYy9zY2FsZSwgdGltZV91bml0KSwKKyAgICAgICAgICAgICBVc2VyV2FybmluZywgJycsIDApCiAgICAgcmV0dXJuIE5vbmUKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL19faW5pdF9fLnB5IGIvTGliL3RraW50ZXIvX19pbml0X18ucHkKaW5kZXggYmU2ZWQ3NS4uNTI3MmIzMCAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvX19pbml0X18ucHkKKysrIGIvTGliL3RraW50ZXIvX19pbml0X18ucHkKQEAgLTg0NSw4ICs4NDUsNyBAQAogICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdoZWlnaHQnLCBzZWxmLl93KSkKICAgICBkZWYgd2luZm9faWQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBpZGVudGlmaWVyIElEIGZvciB0aGlzIHdpZGdldC4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0aW50KAotICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdpZCcsIHNlbGYuX3cpKQorICAgICAgICByZXR1cm4gaW50KHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSwgMCkKICAgICBkZWYgd2luZm9faW50ZXJwcyhzZWxmLCBkaXNwbGF5b2Y9MCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiBhbGwgVGNsIGludGVycHJldGVycyBmb3IgdGhpcyBkaXNwbGF5LiIiIgogICAgICAgICBhcmdzID0gKCd3aW5mbycsICdpbnRlcnBzJykgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKQpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5IGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CmluZGV4IGM5MjRkNTUuLjgxYjUyZWEgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQorKysgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKQEAgLTkxLDkgKzkxLDEwIEBACiAgICAgICAgIHdpZGdldCA9IHNlbGYuY3JlYXRlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXRbJ3VzZSddLCAnJykKICAgICAgICAgcGFyZW50ID0gc2VsZi5jcmVhdGUoY29udGFpbmVyPVRydWUpCi0gICAgICAgIHdpZCA9IHBhcmVudC53aW5mb19pZCgpCi0gICAgICAgIHdpZGdldDIgPSBzZWxmLmNyZWF0ZSh1c2U9d2lkKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh3aWRnZXQyWyd1c2UnXSksIHdpZCkKKyAgICAgICAgd2lkID0gaGV4KHBhcmVudC53aW5mb19pZCgpKQorICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh3aWQ9d2lkKToKKyAgICAgICAgICAgIHdpZGdldDIgPSBzZWxmLmNyZWF0ZSh1c2U9d2lkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aWRnZXQyWyd1c2UnXSwgd2lkKQogCiAKIEBhZGRfc3RhbmRhcmRfb3B0aW9ucyhTdGFuZGFyZE9wdGlvbnNUZXN0cykKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3R0ay5weSBiL0xpYi90a2ludGVyL3R0ay5weQppbmRleCA3ZDg2OGZiLi5lMjJhNGUwIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90dGsucHkKKysrIGIvTGliL3RraW50ZXIvdHRrLnB5CkBAIC0zODEsNyArMzgxLDkgQEAKICAgICAgICAgYSBzZXF1ZW5jZSBpZGVudGlmeWluZyB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uLiIiIgogICAgICAgICBpZiBxdWVyeV9vcHQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBrd1txdWVyeV9vcHRdID0gTm9uZQotICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl9uYW1lLCAiY29uZmlndXJlIiwgc3R5bGUpCisgICAgICAgIHJlc3VsdCA9IF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorICAgICAgICBpZiByZXN1bHQgb3IgcXVlcnlfb3B0OgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAKICAgICBkZWYgbWFwKHNlbGYsIHN0eWxlLCBxdWVyeV9vcHQ9Tm9uZSwgKiprdyk6CkBAIC00NjYsMTIgKzQ2OCwxNCBAQAogCiAgICAgZGVmIGVsZW1lbnRfbmFtZXMoc2VsZik6CiAgICAgICAgICIiIlJldHVybnMgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgY3VycmVudCB0aGVtZS4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJuYW1lcyIpKQorICAgICAgICByZXR1cm4gdHVwbGUobi5sc3RyaXAoJy0nKSBmb3IgbiBpbiBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJuYW1lcyIpKSkKIAogCiAgICAgZGVmIGVsZW1lbnRfb3B0aW9ucyhzZWxmLCBlbGVtZW50bmFtZSk6CiAgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBlbGVtZW50bmFtZSdzIG9wdGlvbnMuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAib3B0aW9ucyIsIGVsZW1lbnRuYW1lKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG8ubHN0cmlwKCctJykgZm9yIG8gaW4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAib3B0aW9ucyIsIGVsZW1lbnRuYW1lKSkpCiAKIAogICAgIGRlZiB0aGVtZV9jcmVhdGUoc2VsZiwgdGhlbWVuYW1lLCBwYXJlbnQ9Tm9uZSwgc2V0dGluZ3M9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvdG9rZW5pemUucHkgYi9MaWIvdG9rZW5pemUucHkKaW5kZXggYjFkMGM4My4uZWM3OWVjOCAxMDA2NDQKLS0tIGEvTGliL3Rva2VuaXplLnB5CisrKyBiL0xpYi90b2tlbml6ZS5weQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGNvbGxlY3Rpb25zCiBmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2ltcG9ydCBpdGVydG9vbHMgYXMgX2l0ZXJ0b29scwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBmcm9tIHRva2VuIGltcG9ydCAqCkBAIC0xMzEsNyArMTMyLDI4IEBACiBJbWFnbnVtYmVyID0gZ3JvdXAocidbMC05XStbakpdJywgRmxvYXRudW1iZXIgKyByJ1tqSl0nKQogTnVtYmVyID0gZ3JvdXAoSW1hZ251bWJlciwgRmxvYXRudW1iZXIsIEludG51bWJlcikKIAotU3RyaW5nUHJlZml4ID0gcicoPzpbYkJdW3JSXT98W3JSXVtiQl0/fFt1VV0pPycKKyMgUmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcsIHBsdXMgYWxsIG9mIHRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuCitkZWYgX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICAjIFRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuIE9ubHkgY29udGFpbiB0aGUgbG93ZXIgY2FzZSB2ZXJzaW9ucywKKyAgICAjICBhbmQgZG9uJ3QgY29udGFpbiBhbnkgcGVybXVhdGlvbnMgKGluY2x1ZGUgJ2ZyJywgYnV0IG5vdAorICAgICMgICdyZicpLiBUaGUgdmFyaW91cyBwZXJtdXRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgX3ZhbGlkX3N0cmluZ19wcmVmaXhlcyA9IFsnYicsICdyJywgJ3UnLCAnZicsICdicicsICdmciddCisgICAgIyBpZiB3ZSBhZGQgYmluYXJ5IGYtc3RyaW5ncywgYWRkOiBbJ2ZiJywgJ2ZiciddCisgICAgcmVzdWx0ID0gc2V0KFsnJ10pCisgICAgZm9yIHByZWZpeCBpbiBfdmFsaWRfc3RyaW5nX3ByZWZpeGVzOgorICAgICAgICBmb3IgdCBpbiBfaXRlcnRvb2xzLnBlcm11dGF0aW9ucyhwcmVmaXgpOgorICAgICAgICAgICAgIyBjcmVhdGUgYSBsaXN0IHdpdGggdXBwZXIgYW5kIGxvd2VyIHZlcnNpb25zIG9mIGVhY2gKKyAgICAgICAgICAgICMgIGNoYXJhY3RlcgorICAgICAgICAgICAgZm9yIHUgaW4gX2l0ZXJ0b29scy5wcm9kdWN0KCpbKGMsIGMudXBwZXIoKSkgZm9yIGMgaW4gdF0pOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoJycuam9pbih1KSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfY29tcGlsZShleHByKToKKyAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorCisjIE5vdGUgdGhhdCBzaW5jZSBfYWxsX3N0cmluZ19wcmVmaXhlcyBpbmNsdWRlcyB0aGUgZW1wdHkgc3RyaW5nLAorIyAgU3RyaW5nUHJlZml4IGNhbiBiZSB0aGUgZW1wdHkgc3RyaW5nIChtYWtpbmcgaXQgb3B0aW9uYWwpLgorU3RyaW5nUHJlZml4ID0gZ3JvdXAoKl9hbGxfc3RyaW5nX3ByZWZpeGVzKCkpCiAKICMgVGFpbCBlbmQgb2YgJyBzdHJpbmcuCiBTaW5nbGUgPSByIlteJ1xcXSooPzpcXC5bXidcXF0qKSonIgpAQCAtMTY5LDUwICsxOTEsMjUgQEAKIFBzZXVkb0V4dHJhcyA9IGdyb3VwKHInXFxccj9cbnxcWicsIENvbW1lbnQsIFRyaXBsZSkKIFBzZXVkb1Rva2VuID0gV2hpdGVzcGFjZSArIGdyb3VwKFBzZXVkb0V4dHJhcywgTnVtYmVyLCBGdW5ueSwgQ29udFN0ciwgTmFtZSkKIAotZGVmIF9jb21waWxlKGV4cHIpOgotICAgIHJldHVybiByZS5jb21waWxlKGV4cHIsIHJlLlVOSUNPREUpCisjIEZvciBhIGdpdmVuIHN0cmluZyBwcmVmaXggcGx1cyBxdW90ZXMsIGVuZHBhdHMgbWFwcyBpdCB0byBhIHJlZ2V4CisjICB0byBtYXRjaCB0aGUgcmVtYWluZGVyIG9mIHRoYXQgc3RyaW5nLiBfcHJlZml4IGNhbiBiZSBlbXB0eSwgZm9yCisjICBhIG5vcm1hbCBzaW5nbGUgb3IgdHJpcGxlIHF1b3RlZCBzdHJpbmcgKHdpdGggbm8gcHJlZml4KS4KK2VuZHBhdHMgPSB7fQorZm9yIF9wcmVmaXggaW4gX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJyJdID0gU2luZ2xlCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyInXSA9IERvdWJsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICInJyciXSA9IFNpbmdsZTMKKyAgICBlbmRwYXRzW19wcmVmaXggKyAnIiIiJ10gPSBEb3VibGUzCiAKLWVuZHBhdHMgPSB7IiciOiBTaW5nbGUsICciJzogRG91YmxlLAotICAgICAgICAgICAiJycnIjogU2luZ2xlMywgJyIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJyJycnIjogU2luZ2xlMywgJ3IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYicnJyI6IFNpbmdsZTMsICdiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlInJyciOiBTaW5nbGUzLCAnUiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJCJycnIjogU2luZ2xlMywgJ0IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYnInJyciOiBTaW5nbGUzLCAnYnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYlInJyciOiBTaW5nbGUzLCAnYlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQnInJyciOiBTaW5nbGUzLCAnQnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQlInJyciOiBTaW5nbGUzLCAnQlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAicmInJyciOiBTaW5nbGUzLCAncmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUmInJyciOiBTaW5nbGUzLCAnUmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAickInJyciOiBTaW5nbGUzLCAnckIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUkInJyciOiBTaW5nbGUzLCAnUkIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAidScnJyI6IFNpbmdsZTMsICd1IiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlUnJyciOiBTaW5nbGUzLCAnVSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICdyJzogTm9uZSwgJ1InOiBOb25lLCAnYic6IE5vbmUsICdCJzogTm9uZSwKLSAgICAgICAgICAgJ3UnOiBOb25lLCAnVSc6IE5vbmV9Ci0KLXRyaXBsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInJyciLCAnIiIiJywKLSAgICAgICAgICAicicnJyIsICdyIiIiJywgIlInJyciLCAnUiIiIicsCi0gICAgICAgICAgImInJyciLCAnYiIiIicsICJCJycnIiwgJ0IiIiInLAotICAgICAgICAgICJicicnJyIsICdiciIiIicsICJCcicnJyIsICdCciIiIicsCi0gICAgICAgICAgImJSJycnIiwgJ2JSIiIiJywgIkJSJycnIiwgJ0JSIiIiJywKLSAgICAgICAgICAicmInJyciLCAncmIiIiInLCAickInJyciLCAnckIiIiInLAotICAgICAgICAgICJSYicnJyIsICdSYiIiIicsICJSQicnJyIsICdSQiIiIicsCi0gICAgICAgICAgInUnJyciLCAndSIiIicsICJVJycnIiwgJ1UiIiInLAotICAgICAgICAgICk6Ci0gICAgdHJpcGxlX3F1b3RlZFt0XSA9IHQKLXNpbmdsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInIiwgJyInLAotICAgICAgICAgICJyJyIsICdyIicsICJSJyIsICdSIicsCi0gICAgICAgICAgImInIiwgJ2IiJywgIkInIiwgJ0IiJywKLSAgICAgICAgICAiYnInIiwgJ2JyIicsICJCciciLCAnQnIiJywKLSAgICAgICAgICAiYlInIiwgJ2JSIicsICJCUiciLCAnQlIiJyAsCi0gICAgICAgICAgInJiJyIsICdyYiInLCAickInIiwgJ3JCIicsCi0gICAgICAgICAgIlJiJyIsICdSYiInLCAiUkInIiwgJ1JCIicgLAotICAgICAgICAgICJ1JyIsICd1IicsICJVJyIsICdVIicsCi0gICAgICAgICAgKToKLSAgICBzaW5nbGVfcXVvdGVkW3RdID0gdAorIyBBIHNldCBvZiBhbGwgb2YgdGhlIHNpbmdsZSBhbmQgdHJpcGxlIHF1b3RlZCBzdHJpbmcgcHJlZml4ZXMsCisjICBpbmNsdWRpbmcgdGhlIG9wZW5pbmcgcXVvdGVzLgorc2luZ2xlX3F1b3RlZCA9IHNldCgpCit0cmlwbGVfcXVvdGVkID0gc2V0KCkKK2ZvciB0IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZm9yIHUgaW4gKHQgKyAnIicsIHQgKyAiJyIpOgorICAgICAgICBzaW5nbGVfcXVvdGVkLmFkZCh1KQorICAgIGZvciB1IGluICh0ICsgJyIiIicsIHQgKyAiJycnIik6CisgICAgICAgIHRyaXBsZV9xdW90ZWQuYWRkKHUpCiAKIHRhYnNpemUgPSA4CiAKQEAgLTYyNiw2ICs2MjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3Rhc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgc3Rhc2hlZCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgeWllbGQgVG9rZW5JbmZvKENPTU1FTlQsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiBpbiB0cmlwbGVfcXVvdGVkOgogICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gX2NvbXBpbGUoZW5kcGF0c1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lLCBwb3MpCkBAIC02MzgsMTkgKzYzNiwzNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciA9IGxpbmVbc3RhcnQ6XQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjJdIGluIHNpbmdsZV9xdW90ZWQgb3IgXAotICAgICAgICAgICAgICAgICAgICB0b2tlbls6M10gaW4gc2luZ2xlX3F1b3RlZDoKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdXAgdG8gdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlIHRva2VuIHRvIHNlZSBpZgorICAgICAgICAgICAgICAgICMgIHRoZXkncmUgaW4gdGhlIHNpbmdsZV9xdW90ZWQgc2V0LiBJZiBzbywgdGhleSBzdGFydAorICAgICAgICAgICAgICAgICMgIGEgc3RyaW5nLgorICAgICAgICAgICAgICAgICMgV2UncmUgdXNpbmcgdGhlIGZpcnN0IDMsIGJlY2F1c2Ugd2UncmUgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAjICAicmInIiAoZm9yIGV4YW1wbGUpIGF0IHRoZSBzdGFydCBvZiB0aGUgdG9rZW4uIElmCisgICAgICAgICAgICAgICAgIyAgd2Ugc3dpdGNoIHRvIGxvbmdlciBwcmVmaXhlcywgdGhpcyBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICMgIGFkanVzdGVkLgorICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IGluaXRpYWwgPT0gdG9rZW5bOjFdLgorICAgICAgICAgICAgICAgICMgQWxzbyBub3RlIHRoYXQgc2luZ2xlIHF1b3RlIGNoZWNraW5nIG11c3QgY29tZSBhZnRlcgorICAgICAgICAgICAgICAgICMgIHRyaXBsZSBxdW90ZSBjaGVja2luZyAoYWJvdmUpLgorICAgICAgICAgICAgICAgIGVsaWYgKGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQpOgogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblstMV0gPT0gJ1xuJzogICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbaW5pdGlhbF0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzFdXSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHNbdG9rZW5bMl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgdXNpbmcgdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjICB0b2tlbi4gVGhpcyBpcyBsb29raW5nIGZvciB0aGUgbWF0Y2hpbmcgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAjICByZWdleCBmb3IgdGhlIGNvcnJlY3QgdHlwZSBvZiBxdW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgY2hhcmFjdGVyLiBTbyBpdCdzIHJlYWxseSBsb29raW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgZW5kcGF0c1siJyJdIG9yIGVuZHBhdHNbJyInXSwgYnkgdHJ5aW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAjICBza2lwIHN0cmluZyBwcmVmaXggY2hhcmFjdGVycywgaWYgYW55LgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHMuZ2V0KGluaXRpYWwpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMV0pIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSBsaW5lW3N0YXJ0Ol0sIDEKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhTVFJJTkcsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsLmlzaWRlbnRpZmllcigpOiAgICAgICAgICAgICAgICMgb3JkaW5hcnkgbmFtZQogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiBpbiAoJ2FzeW5jJywgJ2F3YWl0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhc3luY19kZWY6CmRpZmYgLS1naXQgYS9MaWIvdHJhY2UucHkgYi9MaWIvdHJhY2UucHkKaW5kZXggZjEwODI2Ni4uN2FmYmU3NiAxMDA3NTUKLS0tIGEvTGliL3RyYWNlLnB5CisrKyBiL0xpYi90cmFjZS5weQpAQCAtNDgsNiArNDgsNyBAQAogICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKICIiIgogX19hbGxfXyA9IFsnVHJhY2UnLCAnQ292ZXJhZ2VSZXN1bHRzJ10KK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IG9zCiBpbXBvcnQgcmUKQEAgLTU4LDcgKzU5LDYgQEAKIGltcG9ydCBnYwogaW1wb3J0IGRpcwogaW1wb3J0IHBpY2tsZQotZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybiBhcyBfd2FybgogZnJvbSB0aW1lIGltcG9ydCBtb25vdG9uaWMgYXMgX3RpbWUKIAogdHJ5OgpAQCAtNzcsNTEgKzc3LDYgQEAKICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCiAgICAgICAgIHRocmVhZGluZy5zZXR0cmFjZShOb25lKQogCi1kZWYgX3VzYWdlKG91dGZpbGUpOgotICAgIG91dGZpbGUud3JpdGUoIiIiVXNhZ2U6ICVzIFtPUFRJT05TXSA8ZmlsZT4gW0FSR1NdCi0KLU1ldGEtb3B0aW9uczoKLS0taGVscCAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCB0aGVuIGV4aXQuCi0tLXZlcnNpb24gICAgICAgICAgICAgT3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gdGhlbiBleGl0LgotCi1PdGhlcndpc2UsIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgb3B0aW9ucyBtdXN0IGJlIGdpdmVuOgotLXQsIC0tdHJhY2UgICAgICAgICAgIFByaW50IGVhY2ggbGluZSB0byBzeXMuc3Rkb3V0IGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLS1jLCAtLWNvdW50ICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZAotICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSB0aGUgY291bnRzIHRvIDxtb2R1bGU+LmNvdmVyIGZvciBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGV4ZWN1dGVkLCBpbiB0aGUgbW9kdWxlJ3MgZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIGAtLWNvdmVyZGlyJywgYC0tZmlsZScsIGAtLW5vLXJlcG9ydCcgYmVsb3cuCi0tbCwgLS1saXN0ZnVuY3MgICAgICAgS2VlcCB0cmFjayBvZiB3aGljaCBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGF0IGxlYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgb25jZSBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLgotLVQsIC0tdHJhY2tjYWxscyAgICAgIEtlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLgotLXIsIC0tcmVwb3J0ICAgICAgICAgIEdlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG8gbm90IGV4ZWN1dGUKLSAgICAgICAgICAgICAgICAgICAgICBhbnkgY29kZS4gIGAtLWZpbGUnIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgcmVhZCwgd2hpY2ggbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1bgotICAgICAgICAgICAgICAgICAgICAgIHdpdGggYC0tY291bnQgLS1maWxlPUZJTEUnLgotCi1Nb2RpZmllcnM6Ci0tZiwgLS1maWxlPTxmaWxlPiAgICAgRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucy4KLS1SLCAtLW5vLXJlcG9ydCAgICAgICBEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICBVc2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjdW11bGF0ZSBvdmVyIHNldmVyYWwgcnVucy4KLS1DLCAtLWNvdmVyZGlyPTxkaXI+ICBEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcy4gIFRoZSBjb3ZlcmFnZQotICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IGlzIHdyaXR0ZW4gdG8gZmlsZQotICAgICAgICAgICAgICAgICAgICAgIDxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3Zlci4KLS1tLCAtLW1pc3NpbmcgICAgICAgICBBbm5vdGF0ZSBleGVjdXRhYmxlIGxpbmVzIHRoYXQgd2VyZSBub3QgZXhlY3V0ZWQKLSAgICAgICAgICAgICAgICAgICAgICB3aXRoICc+Pj4+Pj4gJy4KLS1zLCAtLXN1bW1hcnkgICAgICAgICBXcml0ZSBhIGJyaWVmIHN1bW1hcnkgb24gc3Rkb3V0IGZvciBlYWNoIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgKENhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0LikKLS1nLCAtLXRpbWluZyAgICAgICAgICBQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgd2hpbGUgdHJhY2luZy4KLQotRmlsdGVycywgbWF5IGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzOgotLS1pZ25vcmUtbW9kdWxlPTxtb2Q+IElnbm9yZSB0aGUgZ2l2ZW4gbW9kdWxlKHMpIGFuZCBpdHMgc3VibW9kdWxlcwotICAgICAgICAgICAgICAgICAgICAgIChpZiBpdCBpcyBhIHBhY2thZ2UpLiAgQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIG1vZHVsZSBuYW1lcwotLS1pZ25vcmUtZGlyPTxkaXI+ICAgIElnbm9yZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IChtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuCi0iIiIgJSBzeXMuYXJndlswXSkKLQogUFJBR01BX05PQ09WRVIgPSAiI3ByYWdtYSBOTyBDT1ZFUiIKIAogIyBTaW1wbGUgcnggdG8gZmluZCBsaW5lcyB3aXRoIG5vIGNvZGUuCkBAIC0yNjUsNyArMjIwLDEzIEBACiAKICAgICBkZWYgd3JpdGVfcmVzdWx0cyhzZWxmLCBzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1GYWxzZSwgY292ZXJkaXI9Tm9uZSk6CiAgICAgICAgICIiIgotICAgICAgICBAcGFyYW0gY292ZXJkaXIKKyAgICAgICAgV3JpdGUgdGhlIGNvdmVyYWdlIHJlc3VsdHMuCisKKyAgICAgICAgOnBhcmFtIHNob3dfbWlzc2luZzogU2hvdyBsaW5lcyB0aGF0IGhhZCBubyBoaXRzLgorICAgICAgICA6cGFyYW0gc3VtbWFyeTogSW5jbHVkZSBjb3ZlcmFnZSBzdW1tYXJ5IHBlciBtb2R1bGUuCisgICAgICAgIDpwYXJhbSBjb3ZlcmRpcjogSWYgTm9uZSwgdGhlIHJlc3VsdHMgb2YgZWFjaCBtb2R1bGUgYXJlIHBsYWNlZCBpbiBpdCdzCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuY2FsbGVkZnVuY3M6CiAgICAgICAgICAgICBwcmludCgpCkBAIC02NDcsMjEwICs2MDgsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkZnVuY3M9c2VsZi5fY2FsbGVkZnVuY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycz1zZWxmLl9jYWxsZXJzKQogCi1kZWYgX2Vycl9leGl0KG1zZyk6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQotICAgIHN5cy5leGl0KDEpCitkZWYgbWFpbigpOgogCi1kZWYgbWFpbihhcmd2PU5vbmUpOgotICAgIGltcG9ydCBnZXRvcHQKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywgdmVyc2lvbj0ndHJhY2UgMi4wJykKIAotICAgIGlmIGFyZ3YgaXMgTm9uZToKLSAgICAgICAgYXJndiA9IHN5cy5hcmd2CisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTWFpbiBvcHRpb25zJywKKyAgICAgICAgICAgICdPbmUgb2YgdGhlc2UgKG9yIC0tcmVwb3J0KSBtdXN0IGJlIGdpdmVuJykKKworICAgIGdycC5hZGRfYXJndW1lbnQoJy1jJywgJy0tY291bnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQgYW5kIHdyaXRlICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBjb3VudHMgdG8gPG1vZHVsZT4uY292ZXIgZm9yIGVhY2ggbW9kdWxlIGV4ZWN1dGVkLCBpbiAnCisgICAgICAgICAgICAgICAgICd0aGUgbW9kdWxlXCdzIGRpcmVjdG9yeS4gU2VlIGFsc28gLS1jb3ZlcmRpciwgLS1maWxlLCAnCisgICAgICAgICAgICAgICAgICctLW5vLXJlcG9ydCBiZWxvdy4nKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy10JywgJy0tdHJhY2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nUHJpbnQgZWFjaCBsaW5lIHRvIHN5cy5zdGRvdXQgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctbCcsICctLWxpc3RmdW5jcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdLZWVwIHRyYWNrIG9mIHdoaWNoIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSAnCisgICAgICAgICAgICAgICAgICdhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4gJworICAgICAgICAgICAgICAgICAnQ2Fubm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgLS10cmFjZSBvciAtLWNvdW50LicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLVQnLCAnLS10cmFja2NhbGxzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0tlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gJworICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4nKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTW9kaWZpZXJzJykKKworICAgIF9ncnAgPSBncnAuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgX2dycC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmVwb3J0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0dlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG9lcyBub3QgZXhlY3V0ZSBhbnkgJworICAgICAgICAgICAgICAgICAnY29kZS4gLS1maWxlIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvIHJlYWQsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ211c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4gd2l0aCAtLWNvdW50ICcKKyAgICAgICAgICAgICAgICAgJy0tZmlsZT1GSUxFJykKKyAgICBfZ3JwLmFkZF9hcmd1bWVudCgnLVInLCAnLS1uby1yZXBvcnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuICcKKyAgICAgICAgICAgICAgICAgJ1VzZWZ1bCBpZiB5b3Ugd2FudCB0byBhY2N1bXVsYXRlIG92ZXIgc2V2ZXJhbCBydW5zLicpCisKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZicsICctLWZpbGUnLAorICAgICAgICAgICAgaGVscD0nRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLUMnLCAnLS1jb3ZlcmRpcicsCisgICAgICAgICAgICBoZWxwPSdEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcyBnby4gVGhlIGNvdmVyYWdlIHJlcG9ydCAnCisgICAgICAgICAgICAgICAgICdmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IHdpbGwgYmUgd3JpdHRlbiB0byBmaWxlICcKKyAgICAgICAgICAgICAgICAgJzxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3ZlcicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1taXNzaW5nJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0Fubm90YXRlIGV4ZWN1dGFibGUgbGluZXMgdGhhdCB3ZXJlIG5vdCBleGVjdXRlZCB3aXRoICcKKyAgICAgICAgICAgICAgICAgJyI+Pj4+Pj4gIicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zdW1tYXJ5JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J1dyaXRlIGEgYnJpZWYgc3VtbWFyeSBmb3IgZWFjaCBmaWxlIHRvIHN5cy5zdGRvdXQuICcKKyAgICAgICAgICAgICAgICAgJ0NhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0JykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZycsICctLXRpbWluZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4gJworICAgICAgICAgICAgICAgICAnT25seSB1c2VkIHdoaWxlIHRyYWNpbmcnKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnRmlsdGVycycsCisgICAgICAgICAgICAnQ2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtbW9kdWxlJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBnaXZlbiBtb2R1bGUocykgYW5kIGl0cyBzdWJtb2R1bGVzJworICAgICAgICAgICAgICAgICAnKGlmIGl0IGlzIGEgcGFja2FnZSkuIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgJworICAgICAgICAgICAgICAgICAnbW9kdWxlIG5hbWVzLicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtZGlyJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgJworICAgICAgICAgICAgICAgICAnKG11bHRpcGxlIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGVuYW1lJywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgaGVscD0nZmlsZSB0byBydW4gYXMgbWFpbiBwcm9ncmFtJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmd1bWVudHMnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0nKQorCisgICAgb3B0cyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdHMuaWdub3JlX2RpcjoKKyAgICAgICAgcmVsX3BhdGggPSAnbGliJywgJ3B5dGhvbnswLm1ham9yfS57MC5taW5vcn0nLmZvcm1hdChzeXMudmVyc2lvbl9pbmZvKQorICAgICAgICBfcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgKnJlbF9wYXRoKQorICAgICAgICBfZXhlY19wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfZXhlY19wcmVmaXgsICpyZWxfcGF0aCkKKworICAgIGRlZiBwYXJzZV9pZ25vcmVfZGlyKHMpOgorICAgICAgICBzID0gb3MucGF0aC5leHBhbmR1c2VyKG9zLnBhdGguZXhwYW5kdmFycyhzKSkKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnJHByZWZpeCcsIF9wcmVmaXgpLnJlcGxhY2UoJyRleGVjX3ByZWZpeCcsIF9leGVjX3ByZWZpeCkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgocykKKworICAgIG9wdHMuaWdub3JlX21vZHVsZSA9IFttb2Quc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBvcHRzLmlnbm9yZV9tb2R1bGUgZm9yIG1vZCBpbiBpLnNwbGl0KCcsJyldCisgICAgb3B0cy5pZ25vcmVfZGlyID0gW3BhcnNlX2lnbm9yZV9kaXIocykKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gb3B0cy5pZ25vcmVfZGlyIGZvciBzIGluIGkuc3BsaXQob3MucGF0aHNlcCldCisKKyAgICBpZiBvcHRzLnJlcG9ydDoKKyAgICAgICAgaWYgbm90IG9wdHMuZmlsZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcignLXIvLS1yZXBvcnQgcmVxdWlyZXMgLWYvLS1maWxlJykKKyAgICAgICAgcmVzdWx0cyA9IENvdmVyYWdlUmVzdWx0cyhpbmZpbGU9b3B0cy5maWxlLCBvdXRmaWxlPW9wdHMuZmlsZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhvcHRzLm1pc3NpbmcsIG9wdHMuc3VtbWFyeSwgb3B0cy5jb3ZlcmRpcikKKworICAgIGlmIG5vdCBhbnkoW29wdHMudHJhY2UsIG9wdHMuY291bnQsIG9wdHMubGlzdGZ1bmNzLCBvcHRzLnRyYWNrY2FsbHNdKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCdtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAnCisgICAgICAgICAgICAgICAgICAgICAnLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscycpCisKKyAgICBpZiBvcHRzLmxpc3RmdW5jcyBhbmQgKG9wdHMuY291bnQgb3Igb3B0cy50cmFjZSk6CisgICAgICAgIHBhcnNlci5lcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCknKQorCisgICAgaWYgb3B0cy5zdW1tYXJ5IGFuZCBub3Qgb3B0cy5jb3VudDoKKyAgICAgICAgcGFyc2VyLmVycm9yKCctLXN1bW1hcnkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnKQorCisgICAgaWYgb3B0cy5maWxlbmFtZSBpcyBOb25lOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ2ZpbGVuYW1lIGlzIG1pc3Npbmc6IHJlcXVpcmVkIHdpdGggdGhlIG1haW4gb3B0aW9ucycpCisKKyAgICBzeXMuYXJndiA9IG9wdHMuZmlsZW5hbWUsICpvcHRzLmFyZ3VtZW50cworICAgIHN5cy5wYXRoWzBdID0gb3MucGF0aC5kaXJuYW1lKG9wdHMuZmlsZW5hbWUpCisKKyAgICB0ID0gVHJhY2Uob3B0cy5jb3VudCwgb3B0cy50cmFjZSwgY291bnRmdW5jcz1vcHRzLmxpc3RmdW5jcywKKyAgICAgICAgICAgICAgY291bnRjYWxsZXJzPW9wdHMudHJhY2tjYWxscywgaWdub3JlbW9kcz1vcHRzLmlnbm9yZV9tb2R1bGUsCisgICAgICAgICAgICAgIGlnbm9yZWRpcnM9b3B0cy5pZ25vcmVfZGlyLCBpbmZpbGU9b3B0cy5maWxlLAorICAgICAgICAgICAgICBvdXRmaWxlPW9wdHMuZmlsZSwgdGltaW5nPW9wdHMudGltaW5nKQogICAgIHRyeToKLSAgICAgICAgb3B0cywgcHJvZ19hcmd2ID0gZ2V0b3B0LmdldG9wdChhcmd2WzE6XSwgInRjclJmOmQ6bXNDOmxUZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxwIiwgInZlcnNpb24iLCAidHJhY2UiLCAiY291bnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwb3J0IiwgIm5vLXJlcG9ydCIsICJzdW1tYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU9IiwgIm1pc3NpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlLW1vZHVsZT0iLCAiaWdub3JlLWRpcj0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY292ZXJkaXI9IiwgImxpc3RmdW5jcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja2NhbGxzIiwgInRpbWluZyJdKQorICAgICAgICB3aXRoIG9wZW4ob3B0cy5maWxlbmFtZSkgYXMgZnA6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIG9wdHMuZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgIyB0cnkgdG8gZW11bGF0ZSBfX21haW5fXyBuYW1lc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICdfX2ZpbGVfXyc6IG9wdHMuZmlsZW5hbWUsCisgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAorICAgICAgICAgICAgJ19fcGFja2FnZV9fJzogTm9uZSwKKyAgICAgICAgICAgICdfX2NhY2hlZF9fJzogTm9uZSwKKyAgICAgICAgfQorICAgICAgICB0LnJ1bmN0eChjb2RlLCBnbG9icywgZ2xvYnMpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICBzeXMuZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcwogCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlc1xuIiAlIChzeXMuYXJndlswXSwgbXNnKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVHJ5IGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSBzeXMuYXJndlswXSkKLSAgICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXN1bHRzID0gdC5yZXN1bHRzKCkKIAotICAgIHRyYWNlID0gMAotICAgIGNvdW50ID0gMAotICAgIHJlcG9ydCA9IDAKLSAgICBub19yZXBvcnQgPSAwCi0gICAgY291bnRzX2ZpbGUgPSBOb25lCi0gICAgbWlzc2luZyA9IDAKLSAgICBpZ25vcmVfbW9kdWxlcyA9IFtdCi0gICAgaWdub3JlX2RpcnMgPSBbXQotICAgIGNvdmVyZGlyID0gTm9uZQotICAgIHN1bW1hcnkgPSAwCi0gICAgbGlzdGZ1bmNzID0gRmFsc2UKLSAgICBjb3VudGNhbGxlcnMgPSBGYWxzZQotICAgIHRpbWluZyA9IEZhbHNlCi0KLSAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0ID09ICItLWhlbHAiOgotICAgICAgICAgICAgX3VzYWdlKHN5cy5zdGRvdXQpCi0gICAgICAgICAgICBzeXMuZXhpdCgwKQotCi0gICAgICAgIGlmIG9wdCA9PSAiLS12ZXJzaW9uIjoKLSAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInRyYWNlIDIuMFxuIikKLSAgICAgICAgICAgIHN5cy5leGl0KDApCi0KLSAgICAgICAgaWYgb3B0ID09ICItVCIgb3Igb3B0ID09ICItLXRyYWNrY2FsbHMiOgotICAgICAgICAgICAgY291bnRjYWxsZXJzID0gVHJ1ZQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1sIiBvciBvcHQgPT0gIi0tbGlzdGZ1bmNzIjoKLSAgICAgICAgICAgIGxpc3RmdW5jcyA9IFRydWUKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItZyIgb3Igb3B0ID09ICItLXRpbWluZyI6Ci0gICAgICAgICAgICB0aW1pbmcgPSBUcnVlCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXQiIG9yIG9wdCA9PSAiLS10cmFjZSI6Ci0gICAgICAgICAgICB0cmFjZSA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItYyIgb3Igb3B0ID09ICItLWNvdW50IjoKLSAgICAgICAgICAgIGNvdW50ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1yIiBvciBvcHQgPT0gIi0tcmVwb3J0IjoKLSAgICAgICAgICAgIHJlcG9ydCA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItUiIgb3Igb3B0ID09ICItLW5vLXJlcG9ydCI6Ci0gICAgICAgICAgICBub19yZXBvcnQgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLWYiIG9yIG9wdCA9PSAiLS1maWxlIjoKLSAgICAgICAgICAgIGNvdW50c19maWxlID0gdmFsCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLW0iIG9yIG9wdCA9PSAiLS1taXNzaW5nIjoKLSAgICAgICAgICAgIG1pc3NpbmcgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLUMiIG9yIG9wdCA9PSAiLS1jb3ZlcmRpciI6Ci0gICAgICAgICAgICBjb3ZlcmRpciA9IHZhbAotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1zIiBvciBvcHQgPT0gIi0tc3VtbWFyeSI6Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLW1vZHVsZSI6Ci0gICAgICAgICAgICBmb3IgbW9kIGluIHZhbC5zcGxpdCgiLCIpOgotICAgICAgICAgICAgICAgIGlnbm9yZV9tb2R1bGVzLmFwcGVuZChtb2Quc3RyaXAoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItLWlnbm9yZS1kaXIiOgotICAgICAgICAgICAgZm9yIHMgaW4gdmFsLnNwbGl0KG9zLnBhdGhzZXApOgotICAgICAgICAgICAgICAgIHMgPSBvcy5wYXRoLmV4cGFuZHZhcnMocykKLSAgICAgICAgICAgICAgICAjIHNob3VsZCBJIGFsc28gY2FsbCBleHBhbmR1c2VyPyAoYWZ0ZXIgYWxsLCBjb3VsZCB1c2UgJEhPTUUpCi0KLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkcHJlZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzeXMuYmFzZV9wcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkZXhlY19wcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5iYXNlX2V4ZWNfcHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSkpCi0gICAgICAgICAgICAgICAgcyA9IG9zLnBhdGgubm9ybXBhdGgocykKLSAgICAgICAgICAgICAgICBpZ25vcmVfZGlycy5hcHBlbmQocykKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgYXNzZXJ0IDAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCi0KLSAgICBpZiBsaXN0ZnVuY3MgYW5kIChjb3VudCBvciB0cmFjZSk6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCkiKQotCi0gICAgaWYgbm90IChjb3VudCBvciB0cmFjZSBvciByZXBvcnQgb3IgbGlzdGZ1bmNzIG9yIGNvdW50Y2FsbGVycyk6Ci0gICAgICAgIF9lcnJfZXhpdCgibXVzdCBzcGVjaWZ5IG9uZSBvZiAtLXRyYWNlLCAtLWNvdW50LCAtLXJlcG9ydCwgIgotICAgICAgICAgICAgICAgICAgIi0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub19yZXBvcnQ6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlcG9ydCBhbmQgLS1uby1yZXBvcnQiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub3QgY291bnRzX2ZpbGU6Ci0gICAgICAgIF9lcnJfZXhpdCgiLS1yZXBvcnQgcmVxdWlyZXMgYSAtLWZpbGUiKQotCi0gICAgaWYgbm9fcmVwb3J0IGFuZCBsZW4ocHJvZ19hcmd2KSA9PSAwOgotICAgICAgICBfZXJyX2V4aXQoIm1pc3NpbmcgbmFtZSBvZiBmaWxlIHRvIHJ1biIpCi0KLSAgICAjIGV2ZXJ5dGhpbmcgaXMgcmVhZHkKLSAgICBpZiByZXBvcnQ6Ci0gICAgICAgIHJlc3VsdHMgPSBDb3ZlcmFnZVJlc3VsdHMoaW5maWxlPWNvdW50c19maWxlLCBvdXRmaWxlPWNvdW50c19maWxlKQotICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLSAgICBlbHNlOgotICAgICAgICBzeXMuYXJndiA9IHByb2dfYXJndgotICAgICAgICBwcm9nbmFtZSA9IHByb2dfYXJndlswXQotICAgICAgICBzeXMucGF0aFswXSA9IG9zLnBhdGguc3BsaXQocHJvZ25hbWUpWzBdCi0KLSAgICAgICAgdCA9IFRyYWNlKGNvdW50LCB0cmFjZSwgY291bnRmdW5jcz1saXN0ZnVuY3MsCi0gICAgICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9Y291bnRjYWxsZXJzLCBpZ25vcmVtb2RzPWlnbm9yZV9tb2R1bGVzLAotICAgICAgICAgICAgICAgICAgaWdub3JlZGlycz1pZ25vcmVfZGlycywgaW5maWxlPWNvdW50c19maWxlLAotICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1jb3VudHNfZmlsZSwgdGltaW5nPXRpbWluZykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIHByb2duYW1lLCAnZXhlYycpCi0gICAgICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgICAgICAgICBnbG9icyA9IHsKLSAgICAgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKLSAgICAgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAotICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCi0gICAgICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdC5ydW5jdHgoY29kZSwgZ2xvYnMsIGdsb2JzKQotICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBfZXJyX2V4aXQoIkNhbm5vdCBydW4gZmlsZSAlciBiZWNhdXNlOiAlcyIgJSAoc3lzLmFyZ3ZbMF0sIGVycikpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIHJlc3VsdHMgPSB0LnJlc3VsdHMoKQotCi0gICAgICAgIGlmIG5vdCBub19yZXBvcnQ6Ci0gICAgICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLQotIyAgRGVwcmVjYXRlZCBBUEkKLWRlZiB1c2FnZShvdXRmaWxlKToKLSAgICBfd2FybigiVGhlIHRyYWNlLnVzYWdlKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgX3VzYWdlKG91dGZpbGUpCi0KLWNsYXNzIElnbm9yZShfSWdub3JlKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlcz1Ob25lLCBkaXJzPU5vbmUpOgotICAgICAgICBfd2FybigiVGhlIGNsYXNzIHRyYWNlLklnbm9yZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIF9JZ25vcmUuX19pbml0X18oc2VsZiwgbW9kdWxlcywgZGlycykKLQotZGVmIG1vZG5hbWUocGF0aCk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5tb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9tb2RuYW1lKHBhdGgpCi0KLWRlZiBmdWxsbW9kbmFtZShwYXRoKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZ1bGxtb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9mdWxsbW9kbmFtZShwYXRoKQotCi1kZWYgZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzX2Zyb21fY29kZSgpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3RycykKLQotZGVmIGZpbmRfbGluZXMoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2xpbmVzKGNvZGUsIHN0cnMpCi0KLWRlZiBmaW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgotICAgIF93YXJuKCJUaGUgdHJhY2UuZmluZF9zdHJpbmdzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpCi0KLWRlZiBmaW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2V4ZWN1dGFibGVfbGluZW5vcygpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpCisgICAgaWYgbm90IG9wdHMubm9fcmVwb3J0OgorICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMob3B0cy5taXNzaW5nLCBvcHRzLnN1bW1hcnksIG9wdHMuY292ZXJkaXIpCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggOWI2OWRhMC4uMWJhYzZlYiAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC00ODcsMTAgKzQ4Nyw5IEBACiAgICAgICAgICAgICBzZWxmLl9sb2FkX2xpbmVzKCkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBmcm9tX2V4Y2VwdGlvbihzZWxmLCBleGMsICphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIGZyb21fZXhjZXB0aW9uKGNscywgZXhjLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJDcmVhdGUgYSBUcmFjZWJhY2tFeGNlcHRpb24gZnJvbSBhbiBleGNlcHRpb24uIiIiCi0gICAgICAgIHJldHVybiBUcmFjZWJhY2tFeGNlcHRpb24oCi0gICAgICAgICAgICB0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGNscyh0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiBfbG9hZF9saW5lcyhzZWxmKToKICAgICAgICAgIiIiUHJpdmF0ZSBBUEkuIGZvcmNlIGFsbCBsaW5lcyBpbiB0aGUgc3RhY2sgdG8gYmUgbG9hZGVkLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlbWFsbG9jLnB5IGIvTGliL3RyYWNlbWFsbG9jLnB5CmluZGV4IDYyODhkYTguLjc1YjM5MTggMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdHJhY2VtYWxsb2MucHkKQEAgLTI0NCwxNyArMjQ0LDIxIEBACiAgICAgX19zbG90c19fID0gKCJfdHJhY2UiLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFjZSk6Ci0gICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKHNpemUsIHRyYWNlYmFjayksIHNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IKLSAgICAgICAgIyBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2ViYWNrIHR1cGxlCisgICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKGRvbWFpbjogaW50LCBzaXplOiBpbnQsIHRyYWNlYmFjazogdHVwbGUpLgorICAgICAgICAjIFNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNlYmFjayB0dXBsZS4KICAgICAgICAgc2VsZi5fdHJhY2UgPSB0cmFjZQogCiAgICAgQHByb3BlcnR5Ci0gICAgZGVmIHNpemUoc2VsZik6CisgICAgZGVmIGRvbWFpbihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzBdCiAKICAgICBAcHJvcGVydHkKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzFdCisKKyAgICBAcHJvcGVydHkKICAgICBkZWYgdHJhY2ViYWNrKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzFdKQorICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzJdKQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHJldHVybiAoc2VsZi5fdHJhY2UgPT0gb3RoZXIuX3RyYWNlKQpAQCAtMjY2LDggKzI3MCw4IEBACiAgICAgICAgIHJldHVybiAiJXM6ICVzIiAlIChzZWxmLnRyYWNlYmFjaywgX2Zvcm1hdF9zaXplKHNlbGYuc2l6ZSwgRmFsc2UpKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gKCI8VHJhY2Ugc2l6ZT0lcywgdHJhY2ViYWNrPSVyPiIKLSAgICAgICAgICAgICAgICAlIChfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKKyAgICAgICAgcmV0dXJuICgiPFRyYWNlIGRvbWFpbj0lcyBzaXplPSVzLCB0cmFjZWJhY2s9JXI+IgorICAgICAgICAgICAgICAgICUgKHNlbGYuZG9tYWluLCBfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKIAogCiBjbGFzcyBfVHJhY2VzKFNlcXVlbmNlKToKQEAgLTMwMiwxOSArMzA2LDI5IEBACiAgICAgcmV0dXJuIGZpbGVuYW1lCiAKIAotY2xhc3MgRmlsdGVyOgorY2xhc3MgQmFzZUZpbHRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5jbHVzaXZlKToKKyAgICAgICAgc2VsZi5pbmNsdXNpdmUgPSBpbmNsdXNpdmUKKworICAgIGRlZiBfbWF0Y2goc2VsZiwgdHJhY2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgRmlsdGVyKEJhc2VGaWx0ZXIpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmNsdXNpdmUsIGZpbGVuYW1lX3BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIGxpbmVubz1Ob25lLCBhbGxfZnJhbWVzPUZhbHNlKToKKyAgICAgICAgICAgICAgICAgbGluZW5vPU5vbmUsIGFsbF9mcmFtZXM9RmFsc2UsIGRvbWFpbj1Ob25lKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCiAgICAgICAgIHNlbGYuaW5jbHVzaXZlID0gaW5jbHVzaXZlCiAgICAgICAgIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4gPSBfbm9ybWFsaXplX2ZpbGVuYW1lKGZpbGVuYW1lX3BhdHRlcm4pCiAgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCiAgICAgICAgIHNlbGYuYWxsX2ZyYW1lcyA9IGFsbF9mcmFtZXMKKyAgICAgICAgc2VsZi5kb21haW4gPSBkb21haW4KIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBmaWxlbmFtZV9wYXR0ZXJuKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWVfcGF0dGVybgogCi0gICAgZGVmIF9fbWF0Y2hfZnJhbWUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgZGVmIF9tYXRjaF9mcmFtZV9pbXBsKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgogICAgICAgICBmaWxlbmFtZSA9IF9ub3JtYWxpemVfZmlsZW5hbWUoZmlsZW5hbWUpCiAgICAgICAgIGlmIG5vdCBmbm1hdGNoLmZubWF0Y2goZmlsZW5hbWUsIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4pOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0zMjQsMTEgKzMzOCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIChsaW5lbm8gPT0gc2VsZi5saW5lbm8pCiAKICAgICBkZWYgX21hdGNoX2ZyYW1lKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotICAgICAgICByZXR1cm4gc2VsZi5fX21hdGNoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykgXiAobm90IHNlbGYuaW5jbHVzaXZlKQogCiAgICAgZGVmIF9tYXRjaF90cmFjZWJhY2soc2VsZiwgdHJhY2ViYWNrKToKICAgICAgICAgaWYgc2VsZi5hbGxfZnJhbWVzOgotICAgICAgICAgICAgaWYgYW55KHNlbGYuX19tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgaWYgYW55KHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykKICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB0cmFjZWJhY2spOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluY2x1c2l2ZQogICAgICAgICAgICAgZWxzZToKQEAgLTMzNyw2ICszNTEsMzAgQEAKICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSB0cmFjZWJhY2tbMF0KICAgICAgICAgICAgIHJldHVybiBzZWxmLl9tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQogCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmVzID0gc2VsZi5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgaWYgc2VsZi5kb21haW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmluY2x1c2l2ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIGFuZCAoZG9tYWluID09IHNlbGYuZG9tYWluKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIG9yIChkb21haW4gIT0gc2VsZi5kb21haW4pCisgICAgICAgIHJldHVybiByZXMKKworCitjbGFzcyBEb21haW5GaWx0ZXIoQmFzZUZpbHRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluY2x1c2l2ZSwgZG9tYWluKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCisgICAgICAgIHNlbGYuX2RvbWFpbiA9IGRvbWFpbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRvbWFpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbWFpbgorCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmV0dXJuIChkb21haW4gPT0gc2VsZi5kb21haW4pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKwogCiBjbGFzcyBTbmFwc2hvdDoKICAgICAiIiIKQEAgLTM2NSwxMyArNDAzLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gcGlja2xlLmxvYWQoZnApCiAKICAgICBkZWYgX2ZpbHRlcl90cmFjZShzZWxmLCBpbmNsdWRlX2ZpbHRlcnMsIGV4Y2x1ZGVfZmlsdGVycywgdHJhY2UpOgotICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZVsxXQogICAgICAgICBpZiBpbmNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBub3QgYW55KHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIG5vdCBhbnkodHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRyYWNlX2ZpbHRlciBpbiBpbmNsdWRlX2ZpbHRlcnMpOgogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBpZiBleGNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBhbnkobm90IHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIGFueShub3QgdHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2VfZmlsdGVyIGluIGV4Y2x1ZGVfZmlsdGVycyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCkBAIC0zNzksOCArNDE2LDggQEAKICAgICBkZWYgZmlsdGVyX3RyYWNlcyhzZWxmLCBmaWx0ZXJzKToKICAgICAgICAgIiIiCiAgICAgICAgIENyZWF0ZSBhIG5ldyBTbmFwc2hvdCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgdHJhY2VzIHNlcXVlbmNlLCBmaWx0ZXJzCi0gICAgICAgIGlzIGEgbGlzdCBvZiBGaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eSBsaXN0LCByZXR1cm4gYQotICAgICAgICBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KKyAgICAgICAgaXMgYSBsaXN0IG9mIEZpbHRlciBvciBEb21haW5GaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eQorICAgICAgICBsaXN0LCByZXR1cm4gYSBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpbHRlcnMsIEl0ZXJhYmxlKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZmlsdGVycyBtdXN0IGJlIGEgbGlzdCBvZiBmaWx0ZXJzLCBub3QgJXMiCkBAIC00MTIsNyArNDQ5LDcgQEAKICAgICAgICAgdHJhY2ViYWNrcyA9IHt9CiAgICAgICAgIGlmIG5vdCBjdW11bGF0aXZlOgogICAgICAgICAgICAgZm9yIHRyYWNlIGluIHNlbGYudHJhY2VzLl90cmFjZXM6Ci0gICAgICAgICAgICAgICAgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW3RyYWNlX3RyYWNlYmFja10KICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC00MzMsNyArNDcwLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzCiAgICAgICAgICAgICBmb3IgdHJhY2UgaW4gc2VsZi50cmFjZXMuX3RyYWNlczoKLSAgICAgICAgICAgICAgICBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICAgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKICAgICAgICAgICAgICAgICBmb3IgZnJhbWUgaW4gdHJhY2VfdHJhY2ViYWNrOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW2ZyYW1lXQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L21vY2sucHkgYi9MaWIvdW5pdHRlc3QvbW9jay5weQppbmRleCBjYWJhZTE1Li43NDAwZmI3IDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvbW9jay5weQorKysgYi9MaWIvdW5pdHRlc3QvbW9jay5weQpAQCAtNzcyLDYgKzc3MiwyNCBAQAogICAgICAgICAgICAgICAgICAgIChzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snLCBzZWxmLmNhbGxfY291bnQpKQogICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQogCisgICAgZGVmIGFzc2VydF9jYWxsZWQoX21vY2tfc2VsZik6CisgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgYXQgbGVhc3Qgb25jZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IF9tb2NrX3NlbGYKKyAgICAgICAgaWYgc2VsZi5jYWxsX2NvdW50ID09IDA6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZC4iICUKKyAgICAgICAgICAgICAgICAgICBzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQorCisgICAgZGVmIGFzc2VydF9jYWxsZWRfb25jZShfbW9ja19zZWxmKToKKyAgICAgICAgIiIiYXNzZXJ0IHRoYXQgdGhlIG1vY2sgd2FzIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmID0gX21vY2tfc2VsZgorICAgICAgICBpZiBub3Qgc2VsZi5jYWxsX2NvdW50ID09IDE6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZCBvbmNlLiBDYWxsZWQgJXMgdGltZXMuIiAlCisgICAgICAgICAgICAgICAgICAgKHNlbGYuX21vY2tfbmFtZSBvciAnbW9jaycsIHNlbGYuY2FsbF9jb3VudCkpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihtc2cpCisKICAgICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoKF9tb2NrX3NlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KIApAQCAtODIwLDcgKzgzOCw3IEBACiAgICAgICAgICAgICBpZiBleHBlY3RlZCBub3QgaW4gYWxsX2NhbGxzOgogICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAnQ2FsbHMgbm90IGZvdW5kLlxuRXhwZWN0ZWQ6ICVyXG4nCi0gICAgICAgICAgICAgICAgICAgICdBY3R1YWw6ICVyJyAlIChjYWxscywgc2VsZi5tb2NrX2NhbGxzKQorICAgICAgICAgICAgICAgICAgICAnQWN0dWFsOiAlcicgJSAoX0NhbGxMaXN0KGNhbGxzKSwgc2VsZi5tb2NrX2NhbGxzKQogICAgICAgICAgICAgICAgICkgZnJvbSBjYXVzZQogICAgICAgICAgICAgcmV0dXJuCiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3Rtb2NrLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKaW5kZXggMDNjOTVkZS4uNTI2ZWVhYiAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKQEAgLTEyMzksNiArMTIzOSwyNyBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKICAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X25vdF9jYWxsZWQoKQogCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZChzZWxmKToKKyAgICAgICAgbSA9IE1vY2soKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZF9vbmNlKHNlbGYpOgorICAgICAgICBtID0gTW9jaygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorICAgICAgICBtLmhlbGxvKCkKKyAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKwogICAgICNJc3N1ZTIxMjU2IHByaW50b3V0IG9mIGtleXdvcmQgYXJncyBzaG91bGQgYmUgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgIGRlZiB0ZXN0X3NvcnRlZF9jYWxsX3NpZ25hdHVyZShzZWxmKToKICAgICAgICAgbSA9IE1vY2soKQpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9wYXJzZS5weSBiL0xpYi91cmxsaWIvcGFyc2UucHkKaW5kZXggNGQ3ZmNlYy4uOTlhNjk3NyAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9wYXJzZS5weQorKysgYi9MaWIvdXJsbGliL3BhcnNlLnB5CkBAIC0xNTYsOSArMTU2LDggQEAKICAgICAgICAgcG9ydCA9IHNlbGYuX2hvc3RpbmZvWzFdCiAgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQsIDEwKQotICAgICAgICAgICAgIyBSZXR1cm4gTm9uZSBvbiBhbiBpbGxlZ2FsIHBvcnQKICAgICAgICAgICAgIGlmIG5vdCAoIDAgPD0gcG9ydCA8PSA2NTUzNSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQb3J0IG91dCBvZiByYW5nZSAwLTY1NTM1IikKICAgICAgICAgcmV0dXJuIHBvcnQKIAogCkBAIC0yMjUsOCArMjI0LDcxIEBACiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCiAKIF9EZWZyYWdSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgnRGVmcmFnUmVzdWx0JywgJ3VybCBmcmFnbWVudCcpCi1fU3BsaXRSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgnU3BsaXRSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHF1ZXJ5IGZyYWdtZW50JykKLV9QYXJzZVJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKCdQYXJzZVJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcGFyYW1zIHF1ZXJ5IGZyYWdtZW50JykKK19TcGxpdFJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKAorICAgICdTcGxpdFJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcXVlcnkgZnJhZ21lbnQnKQorX1BhcnNlUmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoCisgICAgJ1BhcnNlUmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBwYXJhbXMgcXVlcnkgZnJhZ21lbnQnKQorCitfRGVmcmFnUmVzdWx0QmFzZS5fX2RvY19fID0gIiIiCitEZWZyYWdSZXN1bHQodXJsLCBmcmFnbWVudCkKKworQSAyLXR1cGxlIHRoYXQgY29udGFpbnMgdGhlIHVybCB3aXRob3V0IGZyYWdtZW50IGlkZW50aWZpZXIgYW5kIHRoZSBmcmFnbWVudAoraWRlbnRpZmllciBhcyBhIHNlcGFyYXRlIGFyZ3VtZW50LgorIiIiCisKK19EZWZyYWdSZXN1bHRCYXNlLnVybC5fX2RvY19fID0gIiIiVGhlIFVSTCB3aXRoIG5vIGZyYWdtZW50IGlkZW50aWZpZXIuIiIiCisKK19EZWZyYWdSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18gPSAiIiIKK0ZyYWdtZW50IGlkZW50aWZpZXIgc2VwYXJhdGVkIGZyb20gVVJMLCB0aGF0IGFsbG93cyBpbmRpcmVjdCBpZGVudGlmaWNhdGlvbiBvZiBhCitzZWNvbmRhcnkgcmVzb3VyY2UgYnkgcmVmZXJlbmNlIHRvIGEgcHJpbWFyeSByZXNvdXJjZSBhbmQgYWRkaXRpb25hbCBpZGVudGlmeWluZworaW5mb3JtYXRpb24uCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5fX2RvY19fID0gIiIiCitTcGxpdFJlc3VsdChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50KQorCitBIDUtdHVwbGUgdGhhdCBjb250YWlucyB0aGUgZGlmZmVyZW50IGNvbXBvbmVudHMgb2YgYSBVUkwuIFNpbWlsYXIgdG8KK1BhcnNlUmVzdWx0LCBidXQgZG9lcyBub3Qgc3BsaXQgcGFyYW1zLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2Uuc2NoZW1lLl9fZG9jX18gPSAiIiJTcGVjaWZpZXMgVVJMIHNjaGVtZSBmb3IgdGhlIHJlcXVlc3QuIiIiCisKK19TcGxpdFJlc3VsdEJhc2UubmV0bG9jLl9fZG9jX18gPSAiIiIKK05ldHdvcmsgbG9jYXRpb24gd2hlcmUgdGhlIHJlcXVlc3QgaXMgbWFkZSB0by4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLnBhdGguX19kb2NfXyA9ICIiIgorVGhlIGhpZXJhcmNoaWNhbCBwYXRoLCBzdWNoIGFzIHRoZSBwYXRoIHRvIGEgZmlsZSB0byBkb3dubG9hZC4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLnF1ZXJ5Ll9fZG9jX18gPSAiIiIKK1RoZSBxdWVyeSBjb21wb25lbnQsIHRoYXQgY29udGFpbnMgbm9uLWhpZXJhcmNoaWNhbCBkYXRhLCB0aGF0IGFsb25nIHdpdGggZGF0YQoraW4gcGF0aCBjb21wb25lbnQsIGlkZW50aWZpZXMgYSByZXNvdXJjZSBpbiB0aGUgc2NvcGUgb2YgVVJJJ3Mgc2NoZW1lIGFuZAorbmV0d29yayBsb2NhdGlvbi4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18gPSAiIiIKK0ZyYWdtZW50IGlkZW50aWZpZXIsIHRoYXQgYWxsb3dzIGluZGlyZWN0IGlkZW50aWZpY2F0aW9uIG9mIGEgc2Vjb25kYXJ5IHJlc291cmNlCitieSByZWZlcmVuY2UgdG8gYSBwcmltYXJ5IHJlc291cmNlIGFuZCBhZGRpdGlvbmFsIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLgorIiIiCisKK19QYXJzZVJlc3VsdEJhc2UuX19kb2NfXyA9ICIiIgorUGFyc2VSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgIHF1ZXJ5LCBmcmFnbWVudCkKKworQSA2LXR1cGxlIHRoYXQgY29udGFpbnMgY29tcG9uZW50cyBvZiBhIHBhcnNlZCBVUkwuCisiIiIKKworX1BhcnNlUmVzdWx0QmFzZS5zY2hlbWUuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2Uuc2NoZW1lLl9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UubmV0bG9jLl9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLm5ldGxvYy5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLnBhdGguX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UucGF0aC5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLnBhcmFtcy5fX2RvY19fID0gIiIiCitQYXJhbWV0ZXJzIGZvciBsYXN0IHBhdGggZWxlbWVudCB1c2VkIHRvIGRlcmVmZXJlbmNlIHRoZSBVUkkgaW4gb3JkZXIgdG8gcHJvdmlkZQorYWNjZXNzIHRvIHBlcmZvcm0gc29tZSBvcGVyYXRpb24gb24gdGhlIHJlc291cmNlLgorIiIiCisKK19QYXJzZVJlc3VsdEJhc2UucXVlcnkuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UucXVlcnkuX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fCisKIAogIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFsaWFzIF9OZXRsb2NSZXN1bHRNaXhpblN0cgogIyBSZXN1bHRCYXNlIGlzIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIEFQSSwgYnV0IGl0IGlzCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3JlcXVlc3QucHkgYi9MaWIvdXJsbGliL3JlcXVlc3QucHkKaW5kZXggZmM4ZWY3Zi4uOTA5YzJjZiAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9yZXF1ZXN0LnB5CisrKyBiL0xpYi91cmxsaWIvcmVxdWVzdC5weQpAQCAtMTMzLDExICsxMzMsNzEgQEAKIF0KIAogIyB1c2VkIGluIFVzZXItQWdlbnQgaGVhZGVyIHNlbnQKLV9fdmVyc2lvbl9fID0gc3lzLnZlcnNpb25bOjNdCitfX3ZlcnNpb25fXyA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogCiBfb3BlbmVyID0gTm9uZQogZGVmIHVybG9wZW4odXJsLCBkYXRhPU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgKiwgY2FmaWxlPU5vbmUsIGNhcGF0aD1Ob25lLCBjYWRlZmF1bHQ9RmFsc2UsIGNvbnRleHQ9Tm9uZSk6CisgICAgJycnT3BlbiB0aGUgVVJMIHVybCwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhIFJlcXVlc3Qgb2JqZWN0LgorCisgICAgKmRhdGEqIG11c3QgYmUgYSBieXRlcyBvYmplY3Qgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2VudCB0byB0aGUKKyAgICBzZXJ2ZXIsIG9yIE5vbmUgaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gZGF0YSBtYXkgYWxzbyBiZSBhbiBpdGVyYWJsZQorICAgIG9iamVjdCBhbmQgaW4gdGhhdCBjYXNlIENvbnRlbnQtTGVuZ3RoIHZhbHVlIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZQorICAgIGhlYWRlcnMuIEN1cnJlbnRseSBIVFRQIHJlcXVlc3RzIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgdXNlIGRhdGE7IHRoZSBIVFRQCisgICAgcmVxdWVzdCB3aWxsIGJlIGEgUE9TVCBpbnN0ZWFkIG9mIGEgR0VUIHdoZW4gdGhlIGRhdGEgcGFyYW1ldGVyIGlzCisgICAgcHJvdmlkZWQuCisKKyAgICAqZGF0YSogc2hvdWxkIGJlIGEgYnVmZmVyIGluIHRoZSBzdGFuZGFyZCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKKyAgICBmb3JtYXQuIFRoZSB1cmxsaWIucGFyc2UudXJsZW5jb2RlKCkgZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlCisgICAgb2YgMi10dXBsZXMgYW5kIHJldHVybnMgYW4gQVNDSUkgdGV4dCBzdHJpbmcgaW4gdGhpcyBmb3JtYXQuIEl0IHNob3VsZCBiZQorICAgIGVuY29kZWQgdG8gYnl0ZXMgYmVmb3JlIGJlaW5nIHVzZWQgYXMgdGhlIGRhdGEgcGFyYW1ldGVyLgorCisgICAgdXJsbGliLnJlcXVlc3QgbW9kdWxlIHVzZXMgSFRUUC8xLjEgYW5kIGluY2x1ZGVzIGEgIkNvbm5lY3Rpb246Y2xvc2UiCisgICAgaGVhZGVyIGluIGl0cyBIVFRQIHJlcXVlc3RzLgorCisgICAgVGhlIG9wdGlvbmFsICp0aW1lb3V0KiBwYXJhbWV0ZXIgc3BlY2lmaWVzIGEgdGltZW91dCBpbiBzZWNvbmRzIGZvcgorICAgIGJsb2NraW5nIG9wZXJhdGlvbnMgbGlrZSB0aGUgY29ubmVjdGlvbiBhdHRlbXB0IChpZiBub3Qgc3BlY2lmaWVkLCB0aGUKKyAgICBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgd2lsbCBiZSB1c2VkKS4gVGhpcyBvbmx5IHdvcmtzIGZvciBIVFRQLAorICAgIEhUVFBTIGFuZCBGVFAgY29ubmVjdGlvbnMuCisKKyAgICBJZiAqY29udGV4dCogaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGEgc3NsLlNTTENvbnRleHQgaW5zdGFuY2UgZGVzY3JpYmluZworICAgIHRoZSB2YXJpb3VzIFNTTCBvcHRpb25zLiBTZWUgSFRUUFNDb25uZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBUaGUgb3B0aW9uYWwgKmNhZmlsZSogYW5kICpjYXBhdGgqIHBhcmFtZXRlcnMgc3BlY2lmeSBhIHNldCBvZiB0cnVzdGVkIENBCisgICAgY2VydGlmaWNhdGVzIGZvciBIVFRQUyByZXF1ZXN0cy4gY2FmaWxlIHNob3VsZCBwb2ludCB0byBhIHNpbmdsZSBmaWxlCisgICAgY29udGFpbmluZyBhIGJ1bmRsZSBvZiBDQSBjZXJ0aWZpY2F0ZXMsIHdoZXJlYXMgY2FwYXRoIHNob3VsZCBwb2ludCB0byBhCisgICAgZGlyZWN0b3J5IG9mIGhhc2hlZCBjZXJ0aWZpY2F0ZSBmaWxlcy4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4KKyAgICBzc2wuU1NMQ29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoKS4KKworICAgIFRoZSAqY2FkZWZhdWx0KiBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKworICAgIEZvciBodHRwIGFuZCBodHRwcyB1cmxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBodHRwLmNsaWVudC5IVFRQUmVzcG9uc2UKKyAgICBvYmplY3Qgd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgSFRUUFJlc3BvbnNlIE9iamVjdHMgbWV0aG9kcy4KKworICAgIEZvciBmdHAsIGZpbGUsIGFuZCBkYXRhIHVybHMgYW5kIHJlcXVlc3RzIGV4cGxpY2l0bHkgaGFuZGxlZCBieSBsZWdhY3kKKyAgICBVUkxvcGVuZXIgYW5kIEZhbmN5VVJMb3BlbmVyIGNsYXNzZXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCisgICAgdXJsbGliLnJlc3BvbnNlLmFkZGluZm91cmwgb2JqZWN0IHdoaWNoIGNhbiB3b3JrIGFzIGNvbnRleHQgbWFuYWdlciBhbmQgaGFzCisgICAgbWV0aG9kcyBzdWNoIGFzOgorCisgICAgKiBnZXR1cmwoKSAtIHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSByZXRyaWV2ZWQsIGNvbW1vbmx5IHVzZWQgdG8KKyAgICAgIGRldGVybWluZSBpZiBhIHJlZGlyZWN0IHdhcyBmb2xsb3dlZAorCisgICAgKiBpbmZvKCkgLSByZXR1cm4gdGhlIG1ldGEtaW5mb3JtYXRpb24gb2YgdGhlIHBhZ2UsIHN1Y2ggYXMgaGVhZGVycywgaW4gdGhlCisgICAgICBmb3JtIG9mIGFuIGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoKSBpbnN0YW5jZSAoc2VlIFF1aWNrIFJlZmVyZW5jZSB0bworICAgICAgSFRUUCBIZWFkZXJzKQorCisgICAgKiBnZXRjb2RlKCkgLSByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLiAgUmFpc2VzIFVSTEVycm9yCisgICAgICBvbiBlcnJvcnMuCisKKyAgICBOb3RlIHRoYXQgKk5vbmUmIG1heSBiZSByZXR1cm5lZCBpZiBubyBoYW5kbGVyIGhhbmRsZXMgdGhlIHJlcXVlc3QgKHRob3VnaAorICAgIHRoZSBkZWZhdWx0IGluc3RhbGxlZCBnbG9iYWwgT3BlbmVyRGlyZWN0b3IgdXNlcyBVbmtub3duSGFuZGxlciB0byBlbnN1cmUKKyAgICB0aGlzIG5ldmVyIGhhcHBlbnMpLgorCisgICAgSW4gYWRkaXRpb24sIGlmIHByb3h5IHNldHRpbmdzIGFyZSBkZXRlY3RlZCAoZm9yIGV4YW1wbGUsIHdoZW4gYSAqX3Byb3h5CisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSBodHRwX3Byb3h5IGlzIHNldCksIFByb3h5SGFuZGxlciBpcyBkZWZhdWx0CisgICAgaW5zdGFsbGVkIGFuZCBtYWtlcyBzdXJlIHRoZSByZXF1ZXN0cyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBwcm94eS4KKworICAgICcnJwogICAgIGdsb2JhbCBfb3BlbmVyCiAgICAgaWYgY2FmaWxlIG9yIGNhcGF0aCBvciBjYWRlZmF1bHQ6CiAgICAgICAgIGlmIGNvbnRleHQgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5IGIvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQppbmRleCA0ZmJiMGNiLi40YWM1NTNhIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKQEAgLTEwLDcgKzEwLDkgQEAKICAgICBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvbm9yb2JvdHMtcmZjLnR4dAogIiIiCiAKLWltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0CitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB1cmxsaWIucGFyc2UKK2ltcG9ydCB1cmxsaWIucmVxdWVzdAogCiBfX2FsbF9fID0gWyJSb2JvdEZpbGVQYXJzZXIiXQogCkBAIC0xMjAsMTAgKzEyMiwyOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucnVsZWxpbmVzLmFwcGVuZChSdWxlTGluZShsaW5lWzFdLCBUcnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiY3Jhd2wtZGVsYXkiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWZvcmUgdHJ5aW5nIHRvIGNvbnZlcnQgdG8gaW50IHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdXJlIHRoYXQgcm9ib3RzLnR4dCBoYXMgdmFsaWQgc3ludGF4IG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCB3aWxsIGNyYXNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzFdLnN0cmlwKCkuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRlbGF5ID0gaW50KGxpbmVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gInJlcXVlc3QtcmF0ZSI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzID0gbGluZVsxXS5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGFsbCB2YWx1ZXMgYXJlIHNhbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4obnVtYmVycykgPT0gMiBhbmQgbnVtYmVyc1swXS5zdHJpcCgpLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBudW1iZXJzWzFdLnN0cmlwKCkuaXNkaWdpdCgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfcmF0ZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3JlcV9yYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3RzIHNlY29uZHMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlID0gcmVxX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZS5yZXF1ZXN0cyA9IGludChudW1iZXJzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlLnNlY29uZHMgPSBpbnQobnVtYmVyc1sxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgogICAgICAgICBpZiBzdGF0ZSA9PSAyOgogICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQogCi0KICAgICBkZWYgY2FuX2ZldGNoKHNlbGYsIHVzZXJhZ2VudCwgdXJsKToKICAgICAgICAgIiIidXNpbmcgdGhlIHBhcnNlZCByb2JvdHMudHh0IGRlY2lkZSBpZiB1c2VyYWdlbnQgY2FuIGZldGNoIHVybCIiIgogICAgICAgICBpZiBzZWxmLmRpc2FsbG93X2FsbDoKQEAgLTE1Myw2ICsxNzQsMTggQEAKICAgICAgICAgIyBhZ2VudCBub3QgZm91bmQgPT0+IGFjY2VzcyBncmFudGVkCiAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBkZWYgY3Jhd2xfZGVsYXkoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZGVsYXkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiByZXF1ZXN0X3JhdGUoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucmVxX3JhdGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gJycuam9pbihbc3RyKGVudHJ5KSArICJcbiIgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllc10pCiAKQEAgLTE4MCw2ICsyMTMsOCBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi51c2VyYWdlbnRzID0gW10KICAgICAgICAgc2VsZi5ydWxlbGluZXMgPSBbXQorICAgICAgICBzZWxmLmRlbGF5ID0gTm9uZQorICAgICAgICBzZWxmLnJlcV9yYXRlID0gTm9uZQogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldCA9IFtdCmRpZmYgLS1naXQgYS9MaWIvdmVudi9fX2luaXRfXy5weSBiL0xpYi92ZW52L19faW5pdF9fLnB5CmluZGV4IDc0MjQ1YWIuLmZhM2QyYTMgMTAwNjQ0Ci0tLSBhL0xpYi92ZW52L19faW5pdF9fLnB5CisrKyBiL0xpYi92ZW52L19faW5pdF9fLnB5CkBAIC0zLDI4ICszLDYgQEAKIAogQ29weXJpZ2h0IChDKSAyMDExLTIwMTQgVmluYXkgU2FqaXAuCiBMaWNlbnNlZCB0byB0aGUgUFNGIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgotCi11c2FnZTogcHl0aG9uIC1tIHZlbnYgWy1oXSBbLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlc10gWy0tc3ltbGlua3NdIFstLWNsZWFyXQotICAgICAgICAgICAgWy0tdXBncmFkZV0KLSAgICAgICAgICAgIEVOVl9ESVIgW0VOVl9ESVIgLi4uXQotCi1DcmVhdGVzIHZpcnR1YWwgUHl0aG9uIGVudmlyb25tZW50cyBpbiBvbmUgb3IgbW9yZSB0YXJnZXQgZGlyZWN0b3JpZXMuCi0KLXBvc2l0aW9uYWwgYXJndW1lbnRzOgotICBFTlZfRElSICAgICAgICAgICAgICAgQSBkaXJlY3RvcnkgdG8gY3JlYXRlIHRoZSBlbnZpcm9ubWVudCBpbi4KLQotb3B0aW9uYWwgYXJndW1lbnRzOgotICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotICAtLXN5c3RlbS1zaXRlLXBhY2thZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBHaXZlIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50IGFjY2VzcyB0byB0aGUgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXRlLXBhY2thZ2VzIGRpci4KLSAgLS1zeW1saW5rcyAgICAgICAgICAgIEF0dGVtcHQgdG8gc3ltbGluayByYXRoZXIgdGhhbiBjb3B5LgotICAtLWNsZWFyICAgICAgICAgICAgICAgRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgotICAtLXVwZ3JhZGUgICAgICAgICAgICAgVXBncmFkZSB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IHRvIHVzZSB0aGlzIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIG9mIFB5dGhvbiwgYXNzdW1pbmcgUHl0aG9uIGhhcyBiZWVuIHVwZ3JhZGVkIGluLXBsYWNlLgotICAtLXdpdGhvdXQtcGlwICAgICAgICAgU2tpcHMgaW5zdGFsbGluZyBvciB1cGdyYWRpbmcgcGlwIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCAocGlwIGlzIGJvb3RzdHJhcHBlZCBieSBkZWZhdWx0KQogIiIiCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCkBAIC0zNDksMjMgKzMyNyw3IEBACiAKIGRlZiBjcmVhdGUoZW52X2Rpciwgc3lzdGVtX3NpdGVfcGFja2FnZXM9RmFsc2UsIGNsZWFyPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICBzeW1saW5rcz1GYWxzZSwgd2l0aF9waXA9RmFsc2UpOgotICAgICIiIgotICAgIENyZWF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYSBkaXJlY3RvcnkuCi0KLSAgICBCeSBkZWZhdWx0LCBtYWtlcyB0aGUgc3lzdGVtIChnbG9iYWwpIHNpdGUtcGFja2FnZXMgZGlyICp1biphdmFpbGFibGUgdG8KLSAgICB0aGUgY3JlYXRlZCBlbnZpcm9ubWVudCwgYW5kIHVzZXMgY29weWluZyByYXRoZXIgdGhhbiBzeW1saW5raW5nIGZvciBmaWxlcwotICAgIG9idGFpbmVkIGZyb20gdGhlIHNvdXJjZSBQeXRob24gaW5zdGFsbGF0aW9uLgotCi0gICAgOnBhcmFtIGVudl9kaXI6IFRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIGNyZWF0ZSBhbiBlbnZpcm9ubWVudCBpbi4KLSAgICA6cGFyYW0gc3lzdGVtX3NpdGVfcGFja2FnZXM6IElmIFRydWUsIHRoZSBzeXN0ZW0gKGdsb2JhbCkgc2l0ZS1wYWNrYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyIGlzIGF2YWlsYWJsZSB0byB0aGUgZW52aXJvbm1lbnQuCi0gICAgOnBhcmFtIGNsZWFyOiBJZiBUcnVlLCBkZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYKLSAgICAgICAgICAgICAgICAgIGl0IGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCi0gICAgOnBhcmFtIHN5bWxpbmtzOiBJZiBUcnVlLCBhdHRlbXB0IHRvIHN5bWxpbmsgcmF0aGVyIHRoYW4gY29weSBmaWxlcyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGVudmlyb25tZW50LgotICAgIDpwYXJhbSB3aXRoX3BpcDogSWYgVHJ1ZSwgZW5zdXJlIHBpcCBpcyBpbnN0YWxsZWQgaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50Ci0gICAgIiIiCisgICAgIiIiQ3JlYXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpbiBhIGRpcmVjdG9yeS4iIiIKICAgICBidWlsZGVyID0gRW52QnVpbGRlcihzeXN0ZW1fc2l0ZV9wYWNrYWdlcz1zeXN0ZW1fc2l0ZV9wYWNrYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcj1jbGVhciwgc3ltbGlua3M9c3ltbGlua3MsIHdpdGhfcGlwPXdpdGhfcGlwKQogICAgIGJ1aWxkZXIuY3JlYXRlKGVudl9kaXIpCmRpZmYgLS1naXQgYS9MaWIvd2FybmluZ3MucHkgYi9MaWIvd2FybmluZ3MucHkKaW5kZXggZGZhMTNlZS4uZjRjOGNkYyAxMDA2NDQKLS0tIGEvTGliL3dhcm5pbmdzLnB5CisrKyBiL0xpYi93YXJuaW5ncy5weQpAQCAtMiwzOSArMiwxMTIgQEAKIAogaW1wb3J0IHN5cwogCisKIF9fYWxsX18gPSBbIndhcm4iLCAid2Fybl9leHBsaWNpdCIsICJzaG93d2FybmluZyIsCiAgICAgICAgICAgICJmb3JtYXR3YXJuaW5nIiwgImZpbHRlcndhcm5pbmdzIiwgInNpbXBsZWZpbHRlciIsCiAgICAgICAgICAgICJyZXNldHdhcm5pbmdzIiwgImNhdGNoX3dhcm5pbmdzIl0KIAotCiBkZWYgc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgICAiIiJIb29rIHRvIHdyaXRlIGEgd2FybmluZyB0byBhIGZpbGU7IHJlcGxhY2UgaWYgeW91IGxpa2UuIiIiCi0gICAgaWYgZmlsZSBpcyBOb25lOgotICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgotICAgICAgICBpZiBmaWxlIGlzIE5vbmU6Ci0gICAgICAgICAgICAjIHN5cy5zdGRlcnIgaXMgTm9uZSB3aGVuIHJ1biB3aXRoIHB5dGhvbncuZXhlIC0gd2FybmluZ3MgZ2V0IGxvc3QKLSAgICAgICAgICAgIHJldHVybgotICAgIHRyeToKLSAgICAgICAgZmlsZS53cml0ZShmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lKQorICAgIF9zaG93d2Fybm1zZ19pbXBsKG1zZykKIAogZGVmIGZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CiAgICAgIiIiRnVuY3Rpb24gdG8gZm9ybWF0IGEgd2FybmluZyB0aGUgc3RhbmRhcmQgd2F5LiIiIgotICAgIHMgPSAgIiVzOiVzOiAlczogJXNcbiIgJSAoZmlsZW5hbWUsIGxpbmVubywgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCi0gICAgaWYgbGluZSBpcyBOb25lOgorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBOb25lLCBsaW5lKQorICAgIHJldHVybiBfZm9ybWF0d2Fybm1zZ19pbXBsKG1zZykKKworZGVmIF9zaG93d2Fybm1zZ19pbXBsKG1zZyk6CisgICAgZmlsZSA9IG1zZy5maWxlCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICAjIHN5cy5zdGRlcnIgaXMgTm9uZSB3aGVuIHJ1biB3aXRoIHB5dGhvbncuZXhlOgorICAgICAgICAgICAgIyB3YXJuaW5ncyBnZXQgbG9zdAorICAgICAgICAgICAgcmV0dXJuCisgICAgdGV4dCA9IF9mb3JtYXR3YXJubXNnKG1zZykKKyAgICB0cnk6CisgICAgICAgIGZpbGUud3JpdGUodGV4dCkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KKyAgICAgICAgcGFzcworCitkZWYgX2Zvcm1hdHdhcm5tc2dfaW1wbChtc2cpOgorICAgIHMgPSAgKCIlczolczogJXM6ICVzXG4iCisgICAgICAgICAgJSAobXNnLmZpbGVuYW1lLCBtc2cubGluZW5vLCBtc2cuY2F0ZWdvcnkuX19uYW1lX18sCisgICAgICAgICAgICAgbXNnLm1lc3NhZ2UpKQorCisgICAgaWYgbXNnLmxpbmUgaXMgTm9uZToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IGxpbmVjYWNoZQotICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUobXNnLmZpbGVuYW1lLCBtc2cubGluZW5vKQogICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgIyBXaGVuIGEgd2FybmluZyBpcyBsb2dnZWQgZHVyaW5nIFB5dGhvbiBzaHV0ZG93biwgbGluZWNhY2hlCiAgICAgICAgICAgICAjIGFuZCB0aGUgaW1wb3J0IG1hY2hpbmVyeSBkb24ndCB3b3JrIGFueW1vcmUKICAgICAgICAgICAgIGxpbmUgPSBOb25lCisgICAgICAgICAgICBsaW5lY2FjaGUgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgbGluZSA9IG1zZy5saW5lCiAgICAgaWYgbGluZToKICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICBzICs9ICIgICVzXG4iICUgbGluZQorCisgICAgaWYgbXNnLnNvdXJjZSBpcyBub3QgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlbWFsbG9jCisgICAgICAgICAgICB0YiA9IHRyYWNlbWFsbG9jLmdldF9vYmplY3RfdHJhY2ViYWNrKG1zZy5zb3VyY2UpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAjIFdoZW4gYSB3YXJuaW5nIGlzIGxvZ2dlZCBkdXJpbmcgUHl0aG9uIHNodXRkb3duLCB0cmFjZW1hbGxvYworICAgICAgICAgICAgIyBhbmQgdGhlIGltcG9ydCBtYWNoaW5lcnkgZG9uJ3Qgd29yayBhbnltb3JlCisgICAgICAgICAgICB0YiA9IE5vbmUKKworICAgICAgICBpZiB0YiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHMgKz0gJ09iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuJworICAgICAgICAgICAgZm9yIGZyYW1lIGluIHRiOgorICAgICAgICAgICAgICAgIHMgKz0gKCcgIEZpbGUgIiVzIiwgbGluZW5vICVzXG4nCisgICAgICAgICAgICAgICAgICAgICAgJSAoZnJhbWUuZmlsZW5hbWUsIGZyYW1lLmxpbmVubykpCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVjYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmcmFtZS5maWxlbmFtZSwgZnJhbWUubGluZW5vKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgcyArPSAnICAgICVzXG4nICUgbGluZQogICAgIHJldHVybiBzCiAKKyMgS2VlcCBhIHJlZmVyZW5jZSB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gd2FzIHJlcGxhY2VkCitfc2hvd3dhcm5pbmcgPSBzaG93d2FybmluZworCitkZWYgX3Nob3d3YXJubXNnKG1zZyk6CisgICAgIiIiSG9vayB0byB3cml0ZSBhIHdhcm5pbmcgdG8gYSBmaWxlOyByZXBsYWNlIGlmIHlvdSBsaWtlLiIiIgorICAgIHNob3d3YXJuaW5nID0gZ2xvYmFscygpLmdldCgnc2hvd3dhcm5pbmcnLCBfc2hvd3dhcm5pbmcpCisgICAgaWYgc2hvd3dhcm5pbmcgaXMgbm90IF9zaG93d2FybmluZzoKKyAgICAgICAgIyB3YXJuaW5ncy5zaG93d2FybmluZygpIHdhcyByZXBsYWNlZAorICAgICAgICBpZiBub3QgY2FsbGFibGUoc2hvd3dhcm5pbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvciBtZXRob2QiKQorCisgICAgICAgIHNob3d3YXJuaW5nKG1zZy5tZXNzYWdlLCBtc2cuY2F0ZWdvcnksIG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgbXNnLmZpbGUsIG1zZy5saW5lKQorICAgICAgICByZXR1cm4KKyAgICBfc2hvd3dhcm5tc2dfaW1wbChtc2cpCisKKyMgS2VlcCBhIHJlZmVyZW5jZSB0byBjaGVjayBpZiB0aGUgZnVuY3Rpb24gd2FzIHJlcGxhY2VkCitfZm9ybWF0d2FybmluZyA9IGZvcm1hdHdhcm5pbmcKKworZGVmIF9mb3JtYXR3YXJubXNnKG1zZyk6CisgICAgIiIiRnVuY3Rpb24gdG8gZm9ybWF0IGEgd2FybmluZyB0aGUgc3RhbmRhcmQgd2F5LiIiIgorICAgIGZvcm1hdHdhcm5pbmcgPSBnbG9iYWxzKCkuZ2V0KCdmb3JtYXR3YXJuaW5nJywgX2Zvcm1hdHdhcm5pbmcpCisgICAgaWYgZm9ybWF0d2FybmluZyBpcyBub3QgX2Zvcm1hdHdhcm5pbmc6CisgICAgICAgICMgd2FybmluZ3MuZm9ybWF0d2FybmluZygpIHdhcyByZXBsYWNlZAorICAgICAgICByZXR1cm4gZm9ybWF0d2FybmluZyhtc2cubWVzc2FnZSwgbXNnLmNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8sIGxpbmU9bXNnLmxpbmUpCisgICAgcmV0dXJuIF9mb3JtYXR3YXJubXNnX2ltcGwobXNnKQorCiBkZWYgZmlsdGVyd2FybmluZ3MoYWN0aW9uLCBtZXNzYWdlPSIiLCBjYXRlZ29yeT1XYXJuaW5nLCBtb2R1bGU9IiIsIGxpbmVubz0wLAogICAgICAgICAgICAgICAgICAgIGFwcGVuZD1GYWxzZSk6CiAgICAgIiIiSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGxpc3Qgb2Ygd2FybmluZ3MgZmlsdGVycyAoYXQgdGhlIGZyb250KS4KQEAgLTE4MSw3ICsyNTQsNyBAQAogCiAKICMgQ29kZSB0eXBpY2FsbHkgcmVwbGFjZWQgYnkgX3dhcm5pbmdzCi1kZWYgd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpOgorZGVmIHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xLCBzb3VyY2U9Tm9uZSk6CiAgICAgIiIiSXNzdWUgYSB3YXJuaW5nLCBvciBtYXliZSBpZ25vcmUgaXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLiIiIgogICAgICMgQ2hlY2sgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGEgV2FybmluZyBvYmplY3QKICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIFdhcm5pbmcpOgpAQCAtMjMxLDEwICszMDQsMTEgQEAKICAgICAgICAgICAgIGZpbGVuYW1lID0gbW9kdWxlCiAgICAgcmVnaXN0cnkgPSBnbG9iYWxzLnNldGRlZmF1bHQoIl9fd2FybmluZ3JlZ2lzdHJ5X18iLCB7fSkKICAgICB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgZ2xvYmFscykKKyAgICAgICAgICAgICAgICAgIGdsb2JhbHMsIHNvdXJjZSkKIAogZGVmIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CisgICAgICAgICAgICAgICAgICBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1Ob25lKToKICAgICBsaW5lbm8gPSBpbnQobGluZW5vKQogICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgICBtb2R1bGUgPSBmaWxlbmFtZSBvciAiPHVua25vd24+IgpAQCAtMjk5LDIyICszNzMsMTggQEAKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGFjdGlvbiAoJXIpIGluIHdhcm5pbmdzLmZpbHRlcnM6XG4gJXMiICUKICAgICAgICAgICAgICAgKGFjdGlvbiwgaXRlbSkpCi0gICAgaWYgbm90IGNhbGxhYmxlKHNob3d3YXJuaW5nKToKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ3YXJuaW5ncy5zaG93d2FybmluZygpIG11c3QgYmUgc2V0IHRvIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9yIG1ldGhvZCIpCiAgICAgIyBQcmludCBtZXNzYWdlIGFuZCBjb250ZXh0Ci0gICAgc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgbXNnID0gV2FybmluZ01lc3NhZ2UobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIHNvdXJjZSkKKyAgICBfc2hvd3dhcm5tc2cobXNnKQogCiAKIGNsYXNzIFdhcm5pbmdNZXNzYWdlKG9iamVjdCk6CiAKLSAgICAiIiJIb2xkcyB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlIHNob3d3YXJuaW5nKCkgY2FsbC4iIiIKLQogICAgIF9XQVJOSU5HX0RFVEFJTFMgPSAoIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAiZmlsZW5hbWUiLCAibGluZW5vIiwgImZpbGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUiLCAic291cmNlIikKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgICAgICBsaW5lPU5vbmUpOgorICAgICAgICAgICAgICAgICBsaW5lPU5vbmUsIHNvdXJjZT1Ob25lKToKICAgICAgICAgbG9jYWxfdmFsdWVzID0gbG9jYWxzKCkKICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fV0FSTklOR19ERVRBSUxTOgogICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBsb2NhbF92YWx1ZXNbYXR0cl0pCkBAIC0zNzIsMTEgKzQ0MiwxMiBAQAogICAgICAgICBzZWxmLl9tb2R1bGUuZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnNbOl0KICAgICAgICAgc2VsZi5fbW9kdWxlLl9maWx0ZXJzX211dGF0ZWQoKQogICAgICAgICBzZWxmLl9zaG93d2FybmluZyA9IHNlbGYuX21vZHVsZS5zaG93d2FybmluZworICAgICAgICBzZWxmLl9zaG93d2Fybm1zZyA9IHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cKICAgICAgICAgaWYgc2VsZi5fcmVjb3JkOgogICAgICAgICAgICAgbG9nID0gW10KLSAgICAgICAgICAgIGRlZiBzaG93d2FybmluZygqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoV2FybmluZ01lc3NhZ2UoKmFyZ3MsICoqa3dhcmdzKSkKLSAgICAgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNob3d3YXJuaW5nCisgICAgICAgICAgICBkZWYgc2hvd2Fybm1zZyhtc2cpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQobXNnKQorICAgICAgICAgICAgc2VsZi5fbW9kdWxlLl9zaG93d2Fybm1zZyA9IHNob3dhcm5tc2cKICAgICAgICAgICAgIHJldHVybiBsb2cKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBOb25lCkBAIC0zODcsNiArNDU4LDcgQEAKICAgICAgICAgc2VsZi5fbW9kdWxlLmZpbHRlcnMgPSBzZWxmLl9maWx0ZXJzCiAgICAgICAgIHNlbGYuX21vZHVsZS5fZmlsdGVyc19tdXRhdGVkKCkKICAgICAgICAgc2VsZi5fbW9kdWxlLnNob3d3YXJuaW5nID0gc2VsZi5fc2hvd3dhcm5pbmcKKyAgICAgICAgc2VsZi5fbW9kdWxlLl9zaG93d2Fybm1zZyA9IHNlbGYuX3Nob3d3YXJubXNnCiAKIAogIyBmaWx0ZXJzIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgZmlsdGVyIDUtdHVwbGVzCmRpZmYgLS1naXQgYS9MaWIvd2F2ZS5weSBiL0xpYi93YXZlLnB5CmluZGV4IDhhMTAxZTMuLmY3MWY3ZTUgMTAwNjQ0Ci0tLSBhL0xpYi93YXZlLnB5CisrKyBiL0xpYi93YXZlLnB5CkBAIC03Myw3ICs3Myw3IEBACiAKIGltcG9ydCBidWlsdGlucwogCi1fX2FsbF9fID0gWyJvcGVuIiwgIm9wZW5mcCIsICJFcnJvciJdCitfX2FsbF9fID0gWyJvcGVuIiwgIm9wZW5mcCIsICJFcnJvciIsICJXYXZlX3JlYWQiLCAiV2F2ZV93cml0ZSJdCiAKIGNsYXNzIEVycm9yKEV4Y2VwdGlvbik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weSBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKaW5kZXggZTM5Njc4OC4uZjcxNTYzYSAxMDA2NDQKLS0tIGEvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQorKysgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CkBAIC0xNTYsMTAgKzE1Niw5IEBACiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKLSAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCi0gICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKLSAgICBpbXBvcnQgd2ViYnJvd3NlcgotICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQotICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotICAgIGh0dHBkLnNlcnZlcl9jbG9zZSgpCisgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApIGFzIGh0dHBkOgorICAgICAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQorICAgICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CmluZGV4IGI0ZTExMGQuLjUwZTQyYzggMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtODUsNyArODUsNyBAQAogICAgICJUcmVlQnVpbGRlciIsCiAgICAgIlZFUlNJT04iLAogICAgICJYTUwiLCAiWE1MSUQiLAotICAgICJYTUxQYXJzZXIiLAorICAgICJYTUxQYXJzZXIiLCAiWE1MUHVsbFBhcnNlciIsCiAgICAgInJlZ2lzdGVyX25hbWVzcGFjZSIsCiAgICAgXQogCkBAIC05NSw2ICs5NSw3IEBACiBpbXBvcnQgcmUKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGlvCitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb250ZXh0bGliCiAKIGZyb20gLiBpbXBvcnQgRWxlbWVudFBhdGgKQEAgLTEyMDAsMTYgKzEyMDEsMzcgQEAKICAgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHByb3ZpZGluZyAoZXZlbnQsIGVsZW0pIHBhaXJzLgogCiAgICAgIiIiCisgICAgIyBVc2UgdGhlIGludGVybmFsLCB1bmRvY3VtZW50ZWQgX3BhcnNlciBhcmd1bWVudCBmb3Igbm93OyBXaGVuIHRoZQorICAgICMgcGFyc2VyIGFyZ3VtZW50IG9mIGl0ZXJwYXJzZSBpcyByZW1vdmVkLCB0aGlzIGNhbiBiZSBraWxsZWQuCisgICAgcHVsbHBhcnNlciA9IFhNTFB1bGxQYXJzZXIoZXZlbnRzPWV2ZW50cywgX3BhcnNlcj1wYXJzZXIpCisgICAgZGVmIGl0ZXJhdG9yKCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgeWllbGQgZnJvbSBwdWxscGFyc2VyLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgICAgICAgICAjIGxvYWQgZXZlbnQgYnVmZmVyCisgICAgICAgICAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkKDE2ICogMTAyNCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBwdWxscGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIHJvb3QgPSBwdWxscGFyc2VyLl9jbG9zZV9hbmRfcmV0dXJuX3Jvb3QoKQorICAgICAgICAgICAgeWllbGQgZnJvbSBwdWxscGFyc2VyLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgICAgIGl0LnJvb3QgPSByb290CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBjbG9zZV9zb3VyY2U6CisgICAgICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKKworICAgIGNsYXNzIEl0ZXJQYXJzZUl0ZXJhdG9yKGNvbGxlY3Rpb25zLkl0ZXJhdG9yKToKKyAgICAgICAgX19uZXh0X18gPSBpdGVyYXRvcigpLl9fbmV4dF9fCisgICAgaXQgPSBJdGVyUGFyc2VJdGVyYXRvcigpCisgICAgaXQucm9vdCA9IE5vbmUKKyAgICBkZWwgaXRlcmF0b3IsIEl0ZXJQYXJzZUl0ZXJhdG9yCisKICAgICBjbG9zZV9zb3VyY2UgPSBGYWxzZQogICAgIGlmIG5vdCBoYXNhdHRyKHNvdXJjZSwgInJlYWQiKToKICAgICAgICAgc291cmNlID0gb3Blbihzb3VyY2UsICJyYiIpCiAgICAgICAgIGNsb3NlX3NvdXJjZSA9IFRydWUKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBfSXRlclBhcnNlSXRlcmF0b3Ioc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlKQotICAgIGV4Y2VwdDoKLSAgICAgICAgaWYgY2xvc2Vfc291cmNlOgotICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKLSAgICAgICAgcmFpc2UKKworICAgIHJldHVybiBpdAogCiAKIGNsYXNzIFhNTFB1bGxQYXJzZXI6CkBAIC0xMjE5LDkgKzEyNDEsNyBAQAogICAgICAgICAjIHVwb24gaW4gdXNlciBjb2RlLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE3NzQxIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgICAgICAgIyBfZWxlbWVudHRyZWUuYyBleHBlY3RzIGEgbGlzdCwgbm90IGEgZGVxdWUKLSAgICAgICAgc2VsZi5fZXZlbnRzX3F1ZXVlID0gW10KLSAgICAgICAgc2VsZi5faW5kZXggPSAwCisgICAgICAgIHNlbGYuX2V2ZW50c19xdWV1ZSA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKICAgICAgICAgc2VsZi5fcGFyc2VyID0gX3BhcnNlciBvciBYTUxQYXJzZXIodGFyZ2V0PVRyZWVCdWlsZGVyKCkpCiAgICAgICAgICMgd2lyZSB1cCB0aGUgcGFyc2VyIGZvciBldmVudCByZXBvcnRpbmcKICAgICAgICAgaWYgZXZlbnRzIGlzIE5vbmU6CkBAIC0xMjU5LDY0ICsxMjc5LDE0IEBACiAgICAgICAgIHJldHJpZXZlZCBmcm9tIHRoZSBpdGVyYXRvci4KICAgICAgICAgIiIiCiAgICAgICAgIGV2ZW50cyA9IHNlbGYuX2V2ZW50c19xdWV1ZQotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgaW5kZXggPSBzZWxmLl9pbmRleAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRzW3NlbGYuX2luZGV4XQotICAgICAgICAgICAgICAgICMgQXZvaWQgcmV0YWluaW5nIHJlZmVyZW5jZXMgdG8gcGFzdCBldmVudHMKLSAgICAgICAgICAgICAgICBldmVudHNbc2VsZi5faW5kZXhdID0gTm9uZQotICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGluZGV4ICs9IDEKLSAgICAgICAgICAgICMgQ29tcGFjdCB0aGUgbGlzdCBpbiBhIE8oMSkgYW1vcnRpemVkIGZhc2hpb24KLSAgICAgICAgICAgICMgQXMgbm90ZWQgYWJvdmUsIF9lbGVtZW50cmVlLmMgbmVlZHMgYSBsaXN0LCBub3QgYSBkZXF1ZQotICAgICAgICAgICAgaWYgaW5kZXggKiAyID49IGxlbihldmVudHMpOgotICAgICAgICAgICAgICAgIGV2ZW50c1s6aW5kZXhdID0gW10KLSAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCA9IDAKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5faW5kZXggPSBpbmRleAorICAgICAgICB3aGlsZSBldmVudHM6CisgICAgICAgICAgICBldmVudCA9IGV2ZW50cy5wb3BsZWZ0KCkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIEV4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgcmFpc2UgZXZlbnQKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgeWllbGQgZXZlbnQKIAogCi1jbGFzcyBfSXRlclBhcnNlSXRlcmF0b3I6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlPUZhbHNlKToKLSAgICAgICAgIyBVc2UgdGhlIGludGVybmFsLCB1bmRvY3VtZW50ZWQgX3BhcnNlciBhcmd1bWVudCBmb3Igbm93OyBXaGVuIHRoZQotICAgICAgICAjIHBhcnNlciBhcmd1bWVudCBvZiBpdGVycGFyc2UgaXMgcmVtb3ZlZCwgdGhpcyBjYW4gYmUga2lsbGVkLgotICAgICAgICBzZWxmLl9wYXJzZXIgPSBYTUxQdWxsUGFyc2VyKGV2ZW50cz1ldmVudHMsIF9wYXJzZXI9cGFyc2VyKQotICAgICAgICBzZWxmLl9maWxlID0gc291cmNlCi0gICAgICAgIHNlbGYuX2Nsb3NlX2ZpbGUgPSBjbG9zZV9zb3VyY2UKLSAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdCA9IE5vbmUKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5fcGFyc2VyLnJlYWRfZXZlbnRzKCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudAotICAgICAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNlci5fcGFyc2VyIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgIyBsb2FkIGV2ZW50IGJ1ZmZlcgotICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQoMTYgKiAxMDI0KQotICAgICAgICAgICAgICAgIGlmIGRhdGE6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlci5mZWVkKGRhdGEpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fcm9vdCA9IHNlbGYuX3BhcnNlci5fY2xvc2VfYW5kX3JldHVybl9yb290KCkKLSAgICAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuX3Jvb3QKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2VfZmlsZToKLSAgICAgICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGU6Ci0gICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKLSAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotCi0gICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCi0KIGRlZiBYTUwodGV4dCwgcGFyc2VyPU5vbmUpOgogICAgICIiIlBhcnNlIFhNTCBkb2N1bWVudCBmcm9tIHN0cmluZyBjb25zdGFudC4KIApkaWZmIC0tZ2l0IGEvTGliL3htbHJwYy9jbGllbnQucHkgYi9MaWIveG1scnBjL2NsaWVudC5weQppbmRleCA1NTFkY2U5Li43N2UyMGVjIDEwMDY0NAotLS0gYS9MaWIveG1scnBjL2NsaWVudC5weQorKysgYi9MaWIveG1scnBjL2NsaWVudC5weQpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgcmV0dXJuIHMucmVwbGFjZSgiPiIsICImZ3Q7IiwpCiAKICMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50Ci1fX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQorX192ZXJzaW9uX18gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIAogIyB4bWxycGMgaW50ZWdlciBsaW1pdHMKIE1BWElOVCA9ICAyKiozMS0xCmRpZmYgLS1naXQgYS9MaWIveG1scnBjL3NlcnZlci5weSBiL0xpYi94bWxycGMvc2VydmVyLnB5CmluZGV4IDViNWJmN2MuLjc4NzI4ZjIgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGMvc2VydmVyLnB5CisrKyBiL0xpYi94bWxycGMvc2VydmVyLnB5CkBAIC05NzEsMTYgKzk3MSwxNSBAQAogICAgICAgICAgICAgZGVmIGdldEN1cnJlbnRUaW1lKCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAKLSAgICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQotICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCi0gICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKLSAgICBwcmludCgnSXQgaXMgYWR2aXNhYmxlIHRvIHJ1biB0aGlzIGV4YW1wbGUgc2VydmVyIHdpdGhpbiBhIHNlY3VyZSwgY2xvc2VkIG5ldHdvcmsuJykKLSAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKKyAgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKSBhcyBzZXJ2ZXI6CisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKKyAgICAgICAgcHJpbnQoJ0l0IGlzIGFkdmlzYWJsZSB0byBydW4gdGhpcyBleGFtcGxlIHNlcnZlciB3aXRoaW4gYSBzZWN1cmUsIGNsb3NlZCBuZXR3b3JrLicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvTGliL3ppcGZpbGUucHkgYi9MaWIvemlwZmlsZS5weQppbmRleCA1NmEyNDc5Li5lMDU5OGQyIDEwMDY0NAotLS0gYS9MaWIvemlwZmlsZS5weQorKysgYi9MaWIvemlwZmlsZS5weQpAQCAtMzcxLDcgKzM3MSw3IEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgZmlsZW1vZGU9JXInICUgc3RhdC5maWxlbW9kZShoaSkpCiAgICAgICAgIGlmIGxvOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIGV4dGVybmFsX2F0dHI9JSN4JyAlIGxvKQotICAgICAgICBpc2RpciA9IHNlbGYuZmlsZW5hbWVbLTE6XSA9PSAnLycKKyAgICAgICAgaXNkaXIgPSBzZWxmLmlzX2RpcigpCiAgICAgICAgIGlmIG5vdCBpc2RpciBvciBzZWxmLmZpbGVfc2l6ZToKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyBmaWxlX3NpemU9JXInICUgc2VsZi5maWxlX3NpemUpCiAgICAgICAgIGlmICgobm90IGlzZGlyIG9yIHNlbGYuY29tcHJlc3Nfc2l6ZSkgYW5kCkBAIC00NjksNiArNDY5LDQxIEBACiAKICAgICAgICAgICAgIGV4dHJhID0gZXh0cmFbbG4rNDpdCiAKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9maWxlKGNscywgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhbiBhcHByb3ByaWF0ZSBaaXBJbmZvIGZvciBhIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0uCisKKyAgICAgICAgZmlsZW5hbWUgc2hvdWxkIGJlIHRoZSBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIGZpbGVzeXN0ZW0uCisKKyAgICAgICAgYXJjbmFtZSBpcyB0aGUgbmFtZSB3aGljaCBpdCB3aWxsIGhhdmUgd2l0aGluIHRoZSBhcmNoaXZlIChieSBkZWZhdWx0LAorICAgICAgICB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgZmlsZW5hbWUsIGJ1dCB3aXRob3V0IGEgZHJpdmUgbGV0dGVyIGFuZCB3aXRoCisgICAgICAgIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3JzIHJlbW92ZWQpLgorICAgICAgICAiIiIKKyAgICAgICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQorICAgICAgICBpc2RpciA9IHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQorICAgICAgICBtdGltZSA9IHRpbWUubG9jYWx0aW1lKHN0LnN0X210aW1lKQorICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCisgICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBhcmNuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdKQorICAgICAgICB3aGlsZSBhcmNuYW1lWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICBhcmNuYW1lICs9ICcvJworICAgICAgICB6aW5mbyA9IGNscyhhcmNuYW1lLCBkYXRlX3RpbWUpCisgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAoc3Quc3RfbW9kZSAmIDB4RkZGRikgPDwgMTYgICMgVW5peCBhdHRyaWJ1dGVzCisgICAgICAgIGlmIGlzZGlyOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gMAorICAgICAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciB8PSAweDEwICAjIE1TLURPUyBkaXJlY3RvcnkgZmxhZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gc3Quc3Rfc2l6ZQorCisgICAgICAgIHJldHVybiB6aW5mbworCisgICAgZGVmIGlzX2RpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWVbLTFdID09ICcvJworCiAKIGNsYXNzIF9aaXBEZWNyeXB0ZXI6CiAgICAgIiIiQ2xhc3MgdG8gaGFuZGxlIGRlY3J5cHRpb24gb2YgZmlsZXMgc3RvcmVkIHdpdGhpbiBhIFpJUCBhcmNoaXZlLgpAQCAtMTM4OSw3ICsxNDI0LDcgQEAKICAgICAgICAgaWYgdXBwZXJkaXJzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXBwZXJkaXJzKToKICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHVwcGVyZGlycykKIAotICAgICAgICBpZiBtZW1iZXIuZmlsZW5hbWVbLTFdID09ICcvJzoKKyAgICAgICAgaWYgbWVtYmVyLmlzX2RpcigpOgogICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGFyZ2V0cGF0aCk6CiAgICAgICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCkKICAgICAgICAgICAgIHJldHVybiB0YXJnZXRwYXRoCkBAIC0xNDMwLDI5ICsxNDY1LDE3IEBACiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gd3JpdGUgdG8gWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQogCi0gICAgICAgIHN0ID0gb3Muc3RhdChmaWxlbmFtZSkKLSAgICAgICAgaXNkaXIgPSBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSkKLSAgICAgICAgbXRpbWUgPSB0aW1lLmxvY2FsdGltZShzdC5zdF9tdGltZSkKLSAgICAgICAgZGF0ZV90aW1lID0gbXRpbWVbMDo2XQotICAgICAgICAjIENyZWF0ZSBaaXBJbmZvIGluc3RhbmNlIHRvIHN0b3JlIGZpbGUgaW5mb3JtYXRpb24KLSAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgYXJjbmFtZSA9IGZpbGVuYW1lCi0gICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKVsxXSkKLSAgICAgICAgd2hpbGUgYXJjbmFtZVswXSBpbiAob3Muc2VwLCBvcy5hbHRzZXApOgotICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWVbMTpdCi0gICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgYXJjbmFtZSArPSAnLycKLSAgICAgICAgemluZm8gPSBaaXBJbmZvKGFyY25hbWUsIGRhdGVfdGltZSkKLSAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IChzdFswXSAmIDB4RkZGRikgPDwgMTYgICAgICAjIFVuaXggYXR0cmlidXRlcwotICAgICAgICBpZiBpc2RpcjoKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBaSVBfU1RPUkVECi0gICAgICAgIGVsaWYgY29tcHJlc3NfdHlwZSBpcyBOb25lOgotICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisgICAgICAgIHppbmZvID0gWmlwSW5mby5mcm9tX2ZpbGUoZmlsZW5hbWUsIGFyY25hbWUpCiAKLSAgICAgICAgemluZm8uZmlsZV9zaXplID0gc3Quc3Rfc2l6ZQotICAgICAgICB6aW5mby5mbGFnX2JpdHMgPSAweDAwCisgICAgICAgIGlmIHppbmZvLmlzX2RpcigpOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKwogICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZToKICAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCkBAIC0xNDY0LDExICsxNDg3LDcgQEAKICAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCiAgICAgICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCiAKLSAgICAgICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAotICAgICAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyIHw9IDB4MTAgICMgTVMtRE9TIGRpcmVjdG9yeSBmbGFnCisgICAgICAgICAgICBpZiB6aW5mby5pc19kaXIoKToKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKICAgICAgICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoRmFsc2UpKQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUucHJlLmluIGIvTWFrZWZpbGUucHJlLmluCmluZGV4IDE3YzBiNTcuLjYzODA1ZmMgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLnByZS5pbgorKysgYi9NYWtlZmlsZS5wcmUuaW4KQEAgLTU3MCw3ICs1NzAsNyBAQAogCSQoTElOS0NDKSAkKFBZX0xERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgLW8gJEAgUHJvZ3JhbXMvcHl0aG9uLm8gJChCTERMSUJSQVJZKSAkKExJQlMpICQoTU9ETElCUykgJChTWVNMSUJTKSAkKExETEFTVCkKIAogcGxhdGZvcm06ICQoQlVJTERQWVRIT04pIHB5YnVpbGRkaXIudHh0Ci0JJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLWMgJ2ltcG9ydCBzeXMgOyBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtIDsgcHJpbnQoZ2V0X3BsYXRmb3JtKCkrIi0iK3N5cy52ZXJzaW9uWzA6M10pJyA+cGxhdGZvcm0KKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCgiJXMtJWQuJWQiICUgKGdldF9wbGF0Zm9ybSgpLCAqc3lzLnZlcnNpb25faW5mb1s6Ml0pKScgPnBsYXRmb3JtCiAKICMgQ3JlYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIHN5c2NvbmZpZyBidWlsZC10aW1lIGRhdGEgdGhlcmUuCiAjIHB5YnVpbGRkaXIudHh0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBkaXIgYW5kIGlzIHVzZWQgZm9yCkBAIC05NzYsNyArOTc2LDcgQEAKIFRFU1RPUFRTPQkkKEVYVFJBVEVTVE9QVFMpCiBURVNUUFlUSE9OPQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAkKFRFU1RQWVRIT05PUFRTKQogVEVTVFJVTk5FUj0JJChURVNUUFlUSE9OKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKLVRFU1RUSU1FT1VUPQkzNjAwCitURVNUVElNRU9VVD0JOTAwCiAKICMgUnVuIGEgYmFzaWMgc2V0IG9mIHJlZ3Jlc3Npb24gdGVzdHMuCiAjIFRoaXMgZXhjbHVkZXMgc29tZSB0ZXN0cyB0aGF0IGFyZSBwYXJ0aWN1bGFybHkgcmVzb3VyY2UtaW50ZW5zaXZlLgpAQCAtMTE3Nyw2ICsxMTc3LDcgQEAKIAkJdGVzdC9jamtlbmNvZGluZ3MgdGVzdC9kZWNpbWFsdGVzdGRhdGEgdGVzdC94bWx0ZXN0ZGF0YSBcCiAJCXRlc3QvZWludHJkYXRhIFwKIAkJdGVzdC9pbWdoZHJkYXRhIFwKKwkJdGVzdC9saWJyZWdydGVzdCBcCiAJCXRlc3Qvc3VicHJvY2Vzc2RhdGEgdGVzdC9zbmRoZHJkYXRhIHRlc3Qvc3VwcG9ydCBcCiAJCXRlc3QvdHJhY2VkbW9kdWxlcyB0ZXN0L2VuY29kZWRfbW9kdWxlcyBcCiAJCXRlc3QvdGVzdF9pbXBvcnQgXApkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IGUyOTNkZGMuLmM4ZTNjYzUgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTE1MSw2ICsxNTEsNyBAQAogUGF1bCBCb2RkaWUKIE1hdHRoZXcgQm9lZGlja2VyCiBSb2JpbiBCb2VyZGlqaworTmlrb2xheSBCb2dveWNoZXYKIERhdmlkIEJvbGVuCiBXb3V0ZXIgQm9sc3RlcmxlZQogR2F3YWluIEJvbHRvbgpAQCAtMjM0LDYgKzIzNSw3IEBACiBNaWNoYWVsIENldHJ1bG8KIERhdmUgQ2hhbWJlcnMKIFBhc2NhbCBDaGFtYm9uCitOaWNob2xhcyBDaGFtbWFzCiBKb2huIENoYW5kbGVyCiBIeWUtU2hpayBDaGFuZwogSmVmZnJleSBDaGFuZwpAQCAtMzA3LDYgKzMwOSw3IEBACiBTaW1vbiBDcm9zcwogRmVsaXBlIENydXoKIERyZXcgQ3NpbGxhZworQWxlc3NhbmRybyBDdWNjaQogSm9hcXVpbiBDdWVuY2EgQWJlbGEKIEpvaG4gQ3VnaW5pCiBUb20gQ3VsbGl0b24KQEAgLTM1MCw2ICszNTMsNyBAQAogWXZlcyBEaW9ubmUKIERhbmllbCBEaXR0bWFyCiBKb3NpcCBEam9sb25nYQorV2FsdGVyIETDtnJ3YWxkCiBKYXJvbWlyIERvbGVjZWsKIElzbWFpbCBEb25tZXoKIFJvYmVydCBEb25vaHVlCkBAIC0zNzcsNyArMzgxLDYgQEAKIEthcm1lbiBEeWtzdHJhCiBKb3NpcCBEem9sb25nYQogTWF4aW0gRHp1bWFuZW5rbwotV2FsdGVyIETDtnJ3YWxkCiBIYW5zIEVja2FyZHQKIFJvZG9scGhvIEVja2hhcmR0CiBVbHJpY2ggRWNraGFyZHQKQEAgLTc2OSw2ICs3NzIsNyBAQAogTWFya28gS29odGFsYQogVmFqcmFza3kgS29rCiBHdWlkbyBLb2xsZXJpZQorSmFjZWsgS2/Fgm9kemllagogSmFjZWsgS29uaWVjem55CiBBcmthZHkgS29wbHlhcm92CiBQZXRlciBBLiBLb3JlbgpAQCAtODExLDYgKzgxNSw3IEBACiBUaW5vIExhbmdlCiBHbGVubiBMYW5nZm9yZAogQW5kcmV3IExhbmdtZWFkCitXb2xmZ2FuZyBMYW5nbmVyCiBEZXRsZWYgTGFubmVydAogU29yZW4gTGFyc2VuCiBBbW9zIExhdHRlaWVyCkBAIC04NzMsNiArODc4LDcgQEAKIE1pcmtvIExpc3MKIE5pY2sgTG9ja3dvb2QKIFN0ZXBoYW5pZSBMb2Nrd29vZAorTWFydGluIHZvbiBMw7Z3aXMKIEh1Z28gTG9wZXMgVGF2YXJlcwogR3VpbGxlcm1vIEzDs3Blei1BbmdsYWRhCiBBbm5lIExvcmQKQEAgLTg4MiwxMyArODg4LDEzIEBACiBQZXRlciBMb3ZldHQKIENoYWxtZXIgTG93ZQogSmFzb24gTG93ZQotTWFydGluIHZvbiBMw7Z3aXMKIFRvbnkgTG93bmRzCiBSYXkgTG95emFnYQogS2FuZy1IYW8gKEtlbm55KSBMdQogTHVrYXMgTHVlZwogTG9yZW4gTHVrZQogRnJlZHJpayBMdW5kaAorTWlrZSBMdW5keQogWmhvbmd5dWUgTHVvCiBNYXJrIEx1dHoKIFRhcmFzIEx5YXB1bgpAQCAtMTIyNSw2ICsxMjMxLDcgQEAKIEtldmluIFJvZGdlcnMKIFNlYW4gUm9kbWFuCiBHaWFtcGFvbG8gUm9kb2xhCitNYXVybyBTLiBNLiBSb2RyaWd1ZXMKIEVsc29uIFJvZHJpZ3VlegogQWRpIFJvaWJhbgogTHVpcyBSb2phcwpAQCAtMTI2Niw2ICsxMjczLDcgQEAKIENvbnN0YW50aW5hIFMuCiBQYXRyaWNrIFNhYmluCiBTw6liYXN0aWVuIFNhYmzDqQorQW1pdCBTYWhhCiBTdW1hbiBTYWhhCiBIYWppbWUgU2FpdG91CiBHZW9yZ2UgU2Fra2lzCkBAIC0xMzcwLDYgKzEzNzgsNyBAQAogUm95IFNtaXRoCiBSeWFuIFNtaXRoLVJvYmVydHMKIFJhZmFsIFNtb3RyenlrCitKb3NoIFNuaWRlcgogRXJpYyBTbm93CiBEaXJrIFNvZWRlCiBOaXIgU29mZmVyCkBAIC0xNDI2LDYgKzE0MzUsNyBAQAogSm9obiBTemFrbWVpc3RlcgogQW1pciBTemVrZWx5CiBNYWNpZWogU3p1bGlrCitKb2VsIFRhZGRlaQogQXJmcmV2ZXIgRnJlaHRlcyBUYWlmZXJzYXIgQXJhaGVzaXMKIEhpZGVha2kgVGFrYWhhc2hpCiBUYWthc2UgQXJpaGlybwpAQCAtMTQzNyw2ICsxNDQ3LDcgQEAKIENocmlzdGlhbiBUYW56ZXIKIFN0ZXZlbiBUYXNjaHVrCiBBbXkgVGF5bG9yCitKdWxpYW4gVGF5bG9yCiBNb250eSBUYXlsb3IKIEFuYXRvbHkgVGVjaHRvbmlrCiBHdXN0YXZvIFRlbXBsZQpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IDdiNmI0MTguLmQ0NmJmNDkgMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTIsOCArMiw4IEBACiBQeXRob24gTmV3cwogKysrKysrKysrKysKIAotV2hhdCdzIE5ldyBpbiBQeXRob24gMy41LjIgcmVsZWFzZSBjYW5kaWRhdGUgMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBhbHBoYSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogUmVsZWFzZSBkYXRlOiB0YmEKIApAQCAtMjMsOSArMjMsMzcgQEAKICAgYnl0ZWFycmF5LCBsaXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIE9yZGVyZWREaWN0LCBjb3JyZXNwb25kaW5nCiAgIHZpZXdzIGFuZCBvcy5zY2FuZGlyKCkgaXRlcmF0b3IuCiAKKy0gSXNzdWUgIzI2NTc0OiBPcHRpbWl6ZSBgYGJ5dGVzLnJlcGxhY2UoYicnLCBiJy4nKWBgIGFuZAorICBgYGJ5dGVhcnJheS5yZXBsYWNlKGInJywgYicuJylgYC4gUGF0Y2ggd3JpdHRlbiBieSBKb3NoIFNuaWRlci4KKwogLSBJc3N1ZSAjMjY1ODE6IElmIGNvZGluZyBjb29raWUgaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzIG9uIGEgbGluZSBpbgogICBQeXRob24gc291cmNlIGNvZGUgZmlsZSwgb25seSB0aGUgZmlyc3Qgb25lIGlzIHRha2VuIHRvIGFjY291bnQuCiAKKy0gSXNzdWUgIzI2NTYzOiBEZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHJhaXNlIGEgZmF0YWwKKyAgZXJyb3IgaWYgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGZhbWlseSBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjU2NDogT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZQorICB0aGUgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMKKyAgYWxsb2NhdGVkLgorCistIElzc3VlICMyNjU1ODogVGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yCisgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2Agbm93IGRldGVjdCB3aGVuIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjUxNjogQWRkIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZQorICBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKKy0gSXNzdWUgIzI2NTE2OiBUaGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBjYW4gbm93IGFsc28gYmUKKyAgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorCistIElzc3VlICMyNjUxNjogVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gbm93CisgIGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLiBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZgorICBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCistIElzc3VlICMyNjUxNjogSW4gZGVidWcgbW9kZSwgZGVidWcgaG9va3MgYXJlIG5vdyBhbHNvIGluc3RhbGxlZCBvbiBQeXRob24KKyAgbWVtb3J5IGFsbG9jYXRvcnMgd2hlbiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IHB5bWFsbG9jLgorCiAtIElzc3VlICMyNjQ2NDogRml4IHN0ci50cmFuc2xhdGUoKSB3aGVuIHN0cmluZyBpcyBBU0NJSSBhbmQgZmlyc3QgcmVwbGFjZW1lbnRzCiAgIHJlbW92ZXMgY2hhcmFjdGVyLCBidXQgbmV4dCByZXBsYWNlbWVudCB1c2VzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhCiAgIHN0cmluZyBsb25nZXIgdGhhbiAxIGNoYXJhY3Rlci4gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjUuMC4KQEAgLTM4LDEwICs2NiwzOCBAQAogLSBJc3N1ZSAjMjYzMDI6IENvcnJlY3QgYmVoYXZpb3IgdG8gcmVqZWN0IGNvbW1hIGFzIGEgbGVnYWwgY2hhcmFjdGVyIGZvcgogICBjb29raWUgbmFtZXMuCiAKKy0gSXNzdWUgIzI2MTM2OiBVcGdyYWRlIHRoZSB3YXJuaW5nIHdoZW4gYSBnZW5lcmF0b3IgcmFpc2VzIFN0b3BJdGVyYXRpb24KKyAgZnJvbSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4gIFBhdGNoIGJ5IEFuaXNoCisgIFNoYWguCisKKy0gSXNzdWUgIzI2MjA0OiBUaGUgY29tcGlsZXIgbm93IGlnbm9yZXMgYWxsIGNvbnN0YW50IHN0YXRlbWVudHM6IGJ5dGVzLCBzdHIsCisgIGludCwgZmxvYXQsIGNvbXBsZXgsIG5hbWUgY29uc3RhbnRzIChOb25lLCBGYWxzZSwgVHJ1ZSksIEVsbGlwc2lzCisgIGFuZCBhc3QuQ29uc3RhbnQ7IG5vdCBvbmx5IHN0ciBhbmQgaW50LiBGb3IgZXhhbXBsZSwgYGAxLjBgYCBpcyBub3cgaWdub3JlZAorICBpbiBgYGRlZiBmKCk6IDEuMGBgLgorCiAtIElzc3VlICM0ODA2OiBBdm9pZCBtYXNraW5nIHRoZSBvcmlnaW5hbCBUeXBlRXJyb3IgZXhjZXB0aW9uIHdoZW4gdXNpbmcgc3RhcgogICAoKikgdW5wYWNraW5nIGluIGZ1bmN0aW9uIGNhbGxzLiAgQmFzZWQgb24gcGF0Y2ggYnkgSGFnZW4gRsO8cnN0ZW5hdSBhbmQKICAgRGFuaWVsIFVyYmFuLgogCistIElzc3VlICMyNjE0NjogQWRkIGEgbmV3IGtpbmQgb2YgQVNUIG5vZGU6IGBgYXN0LkNvbnN0YW50YGAuIEl0IGNhbiBiZSB1c2VkCisgIGJ5IGV4dGVybmFsIEFTVCBvcHRpbWl6ZXJzLCBidXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IGVtaXQgZGlyZWN0bHkgc3VjaAorICBub2RlLgorCistIElzc3VlICMyMzYwMTogIFNwZWQtdXAgYWxsb2NhdGlvbiBvZiBkaWN0IGtleSBvYmplY3RzIGJ5IHVzaW5nIFB5dGhvbidzCisgIHNtYWxsIG9iamVjdCBhbGxvY2F0b3IuICAoQ29udHJpYnV0ZWQgYnkgSnVsaWFuIFRheWxvci4pCisKKy0gSXNzdWUgIzE4MDE4OiBJbXBvcnQgcmFpc2VzIEltcG9ydEVycm9yIGluc3RlYWQgb2YgU3lzdGVtRXJyb3IgaWYgYSByZWxhdGl2ZQorICBpbXBvcnQgaXMgYXR0ZW1wdGVkIHdpdGhvdXQgYSBrbm93biBwYXJlbnQgcGFja2FnZS4KKworLSBJc3N1ZSAjMjU4NDM6IFdoZW4gY29tcGlsaW5nIGNvZGUsIGRvbid0IG1lcmdlIGNvbnN0YW50cyBpZiB0aGV5IGFyZSBlcXVhbAorICBidXQgaGF2ZSBhIGRpZmZlcmVudCB0eXBlcy4gRm9yIGV4YW1wbGUsIGBgZjEsIGYyID0gbGFtYmRhOiAxLCBsYW1iZGE6IDEuMGBgCisgIGlzIG5vdyBjb3JyZWN0bHkgY29tcGlsZWQgdG8gdHdvIGRpZmZlcmVudCBmdW5jdGlvbnM6IGBgZjEoKWBgIHJldHVybnMgYGAxYGAKKyAgKGBgaW50YGApIGFuZCBgYGYyKClgYCByZXR1cm5zIGBgMS4wYGAgKGBgaW50YGApLCBldmVuIGlmIGBgMWBgIGFuZCBgYDEuMGBgCisgIGFyZSBlcXVhbC4KKworLSBJc3N1ZSAjMjYxMDc6IFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cworICBjaGFuZ2VzIHRvIHN1cHBvcnQgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuCisKIC0gSXNzdWUgIzI2MTU0OiBBZGQgYSBuZXcgcHJpdmF0ZSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBmdW5jdGlvbiB0byBnZXQKICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZSwgYnV0IGRvbid0IGlzc3VlIGEgZmF0YWwgZXJyb3IgaWYgaXQgaXMgTlVMTC4KICAgVGhpcyBuZXcgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgYWNjZXNzaW5nIGRpcmVjdGx5IHRoZQpAQCAtNDksMjEgKzEwNSwxMSBAQAogICBQeXRob24gMy41LjEgdG8gaGlkZSB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24gb2YgYXRvbWljIEMgdHlwZXMsIHRvIGF2b2lkCiAgIGNvbXBpbGVyIGlzc3Vlcy4KIAotLSBJc3N1ZSAjMjYxOTQ6ICBEZXF1ZS5pbnNlcnQoKSBnYXZlIG9kZCByZXN1bHRzIGZvciBib3VuZGVkIGRlcXVlcyB0aGF0IGhhZAotICByZWFjaGVkIHRoZWlyIG1heGltdW0gc2l6ZS4gIE5vdyBhbiBJbmRleEVycm9yIHdpbGwgYmUgcmFpc2VkIHdoZW4gYXR0ZW1wdGluZwotICB0byBpbnNlcnQgaW50byBhIGZ1bGwgZGVxdWUuCi0KLS0gSXNzdWUgIzI1ODQzOiBXaGVuIGNvbXBpbGluZyBjb2RlLCBkb24ndCBtZXJnZSBjb25zdGFudHMgaWYgdGhleSBhcmUgZXF1YWwKLSAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBgYGYxLCBmMiA9IGxhbWJkYTogMSwgbGFtYmRhOiAxLjBgYAotICBpcyBub3cgY29ycmVjdGx5IGNvbXBpbGVkIHRvIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zOiBgYGYxKClgYCByZXR1cm5zIGBgMWBgCi0gIChgYGludGBgKSBhbmQgYGBmMigpYGAgcmV0dXJucyBgYDEuMGBgIChgYGludGBgKSwgZXZlbiBpZiBgYDFgYCBhbmQgYGAxLjBgYAotICBhcmUgZXF1YWwuCistIElzc3VlICMyNTc5MTogSWYgX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50IG9yIGlmIG5laXRoZXIgX19wYWNrYWdlX18gb3IKKyAgX19zcGVjX18gYXJlIGRlZmluZWQgdGhlbiBJbXBvcnRXYXJuaW5nIGlzIHJhaXNlZC4KIAogLSBJc3N1ZSAjMjU3MzE6IEZpeCBzZXQgYW5kIGRlbGV0aW5nIF9fbmV3X18gb24gYSBjbGFzcy4KIAotLSBJc3N1ZSAjMjI5OTU6IFtVUERBVEVdIENvbW1lbnQgb3V0IHRoZSBvbmUgb2YgdGhlIHBpY2tsZWFiaWxpdHkgdGVzdHMgaW4KLSAgX1B5T2JqZWN0X0dldFN0YXRlKCkgZHVlIHRvIHJlZ3Jlc3Npb25zIG9ic2VydmVkIGluIEN5dGhvbi1iYXNlZCBwcm9qZWN0cy4KLQogLSBJc3N1ZSAjMjU5NjE6IERpc2FsbG93ZWQgbnVsbCBjaGFyYWN0ZXJzIGluIHRoZSB0eXBlIG5hbWUuCiAKIC0gSXNzdWUgIzI1OTczOiBGaXggc2VnZmF1bHQgd2hlbiBhbiBpbnZhbGlkIG5vbmxvY2FsIHN0YXRlbWVudCBiaW5kcyBhIG5hbWUKQEAgLTg1LDYgKzEzMSwxMSBAQAogCiAtIElzc3VlICMyNTcwOTogRml4ZWQgcHJvYmxlbSB3aXRoIGluLXBsYWNlIHN0cmluZyBjb25jYXRlbmF0aW9uIGFuZCB1dGYtOCBjYWNoZS4KIAorLSBJc3N1ZSAjNTMxOTogTmV3IFB5X0ZpbmFsaXplRXgoKSBBUEkgYWxsb3dpbmcgUHl0aG9uIHRvIHNldCBhbiBleGl0IHN0YXR1cworICBvZiAxMjAgb24gZmFpbHVyZSB0byBmbHVzaCBidWZmZXJlZCBzdHJlYW1zLgorCistIElzc3VlICMyNTQ4NTogdGVsbmV0bGliLlRlbG5ldCBpcyBub3cgYSBjb250ZXh0IG1hbmFnZXIuCisKIC0gSXNzdWUgIzI0MDk3OiBGaXhlZCBjcmFzaCBpbiBvYmplY3QuX19yZWR1Y2VfXygpIGlmIHNsb3QgbmFtZSBpcyBmcmVlZCBpbnNpZGUKICAgX19nZXRhdHRyX18uCiAKQEAgLTkyLDYgKzE0Myw4OCBAQAogICBfX2J5dGVzX18sIF9fdHJ1bmNfXywgYW5kIF9fZmxvYXRfXyByZXR1cm5pbmcgaW5zdGFuY2VzIG9mIHN1YmNsYXNzZXMgb2YKICAgYnl0ZXMsIGludCwgYW5kIGZsb2F0IHRvIHN1YmNsYXNzZXMgb2YgYnl0ZXMsIGludCwgYW5kIGZsb2F0IGNvcnJlc3BvbmRpbmdseS4KIAorLSBJc3N1ZSAjMjU2MzA6IEZpeCBhIHBvc3NpYmxlIHNlZ2ZhdWx0IGR1cmluZyBhcmd1bWVudCBwYXJzaW5nIGluIGZ1bmN0aW9ucworICB0aGF0IGFjY2VwdCBmaWxlc3lzdGVtIHBhdGhzLgorCistIElzc3VlICMyMzU2NDogRml4ZWQgYSBwYXJ0aWFsbHkgYnJva2VuIHNhbml0eSBjaGVjayBpbiB0aGUgX3Bvc2l4c3VicHJvY2VzcworICBpbnRlcm5hbHMgcmVnYXJkaW5nIGhvdyBmZHNfdG9fcGFzcyB3ZXJlIHBhc3NlZCB0byB0aGUgY2hpbGQuICBUaGUgYnVnIGhhZAorICBubyBhY3R1YWwgaW1wYWN0IGFzIHN1YnByb2Nlc3MucHkgYWxyZWFkeSBhdm9pZGVkIGl0LgorCistIElzc3VlICMyNTM4ODogRml4ZWQgdG9rZW5pemVyIGNyYXNoIHdoZW4gcHJvY2Vzc2luZyB1bmRlY29kYWJsZSBzb3VyY2UgY29kZQorICB3aXRoIGEgbnVsbCBieXRlLgorCistIElzc3VlICMyNTQ2MjogVGhlIGhhc2ggb2YgdGhlIGtleSBub3cgaXMgY2FsY3VsYXRlZCBvbmx5IG9uY2UgaW4gbW9zdAorICBvcGVyYXRpb25zIGluIEMgaW1wbGVtZW50YXRpb24gb2YgT3JkZXJlZERpY3QuCisKKy0gSXNzdWUgIzIyOTk1OiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIF9fcmVkdWNlX18gYW5kIF9fcmVkdWNlX2V4X18gbm93CisgIHJlamVjdHMgYnVpbHRpbiB0eXBlcyB3aXRoIG5vdCBkZWZpbmVkIF9fbmV3X18uCisKKy0gSXNzdWUgIzI0ODAyOiBBdm9pZCBidWZmZXIgb3ZlcnJlYWRzIHdoZW4gaW50KCksIGZsb2F0KCksIGNvbXBpbGUoKSwgZXhlYygpCisgIGFuZCBldmFsKCkgYXJlIHBhc3NlZCBieXRlcy1saWtlIG9iamVjdHMuICBUaGVzZSBvYmplY3RzIGFyZSBub3QKKyAgbmVjZXNzYXJpbHkgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZSwgYnV0IHRoZSBmdW5jdGlvbnMgYXNzdW1lZCB0aGV5IHdlcmUuCisKKy0gSXNzdWUgIzI1NTU1OiBGaXggcGFyc2VyIGFuZCBBU1Q6IGZpbGwgbGluZW5vIGFuZCBjb2xfb2Zmc2V0IG9mICJhcmciIG5vZGUKKyAgd2hlbiBjb21waWxpbmcgQVNUIGZyb20gUHl0aG9uIG9iamVjdHMuCisKKy0gSXNzdWUgIzI0NzI2OiBGaXhlZCBhIGNyYXNoIGFuZCBsZWFraW5nIE5VTEwgaW4gcmVwcigpIG9mIE9yZGVyZWREaWN0IHRoYXQKKyAgd2FzIG11dGF0ZWQgYnkgZGlyZWN0IGNhbGxzIG9mIGRpY3QgbWV0aG9kcy4KKworLSBJc3N1ZSAjMjU0NDk6IEl0ZXJhdGluZyBPcmRlcmVkRGljdCB3aXRoIGtleXMgd2l0aCB1bnN0YWJsZSBoYXNoIG5vdyByYWlzZXMKKyAgS2V5RXJyb3IgaW4gQyBpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCBhcyBpbiBQeXRob24gaW1wbGVtZW50YXRpb24uCisKKy0gSXNzdWUgIzI1Mzk1OiBGaXhlZCBjcmFzaCB3aGVuIGhpZ2hseSBuZXN0ZWQgT3JkZXJlZERpY3Qgc3RydWN0dXJlcyB3ZXJlCisgIGdhcmJhZ2UgY29sbGVjdGVkLgorCistIElzc3VlICMyNTQwMTogT3B0aW1pemUgYnl0ZXMuZnJvbWhleCgpIGFuZCBieXRlYXJyYXkuZnJvbWhleCgpOiB0aGV5IGFyZSBub3cKKyAgYmV0d2VlbiAyeCBhbmQgMy41eCBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1Mzk5OiBPcHRpbWl6ZSBieXRlYXJyYXkgJSBhcmdzIHVzaW5nIHRoZSBuZXcgcHJpdmF0ZSBfUHlCeXRlc1dyaXRlcgorICBBUEkuIEZvcm1hdHRpbmcgaXMgbm93IGJldHdlZW4gMi41IGFuZCA1IHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjUyNzQ6IHN5cy5zZXRyZWN1cnNpb25saW1pdCgpIG5vdyByYWlzZXMgYSBSZWN1cnNpb25FcnJvciBpZiB0aGUgbmV3CisgIHJlY3Vyc2lvbiBsaW1pdCBpcyB0b28gbG93IGRlcGVuZGluZyBhdCB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguIE1vZGlmeQorICBhbHNvIHRoZSAibG93ZXItd2F0ZXIgbWFyayIgZm9ybXVsYSB0byBtYWtlIGl0IG1vbm90b25pYy4gVGhpcyBtYXJrIGlzIHVzZWQKKyAgdG8gZGVjaWRlIHdoZW4gdGhlIG92ZXJmbG93ZWQgZmxhZyBvZiB0aGUgdGhyZWFkIHN0YXRlIGlzIHJlc2V0LgorCistIElzc3VlICMyNDQwMjogRml4IGlucHV0KCkgdG8gcHJvbXB0IHRvIHRoZSByZWRpcmVjdGVkIHN0ZG91dCB3aGVuCisgIHN5cy5zdGRvdXQuZmlsZW5vKCkgZmFpbHMuCisKKy0gSXNzdWUgIzI1MzQ5OiBPcHRpbWl6ZSBieXRlcyAlIGFyZ3MgdXNpbmcgdGhlIG5ldyBwcml2YXRlIF9QeUJ5dGVzV3JpdGVyIEFQSS4KKyAgRm9ybWF0dGluZyBpcyBub3cgdXAgdG8gMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI0ODA2OiBQcmV2ZW50IGJ1aWx0aW4gdHlwZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgc3ViY2xhc3NlZCBmcm9tCisgIGJlaW5nIHN1YmNsYXNzZWQgdGhyb3VnaCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKworLSBJc3N1ZSAjMjUzMDE6IFRoZSBVVEYtOCBkZWNvZGVyIGlzIG5vdyB1cCB0byAxNSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvcgorICBoYW5kbGVyczogYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAuCisKKy0gSXNzdWUgIzI0ODQ4OiBGaXhlZCBhIG51bWJlciBvZiBidWdzIGluIFVURi03IGRlY29kaW5nIG9mIG1pc2Zvcm1lZCBkYXRhLgorCistIElzc3VlICMyNTI2NzogVGhlIFVURi04IGVuY29kZXIgaXMgbm93IHVwIHRvIDc1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yCisgIGhhbmRsZXJzOiBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAuCisgIFBhdGNoIGNvLXdyaXR0ZW4gd2l0aCBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNTI4MDogSW1wb3J0IHRyYWNlIG1lc3NhZ2VzIGVtaXR0ZWQgaW4gdmVyYm9zZSAoLXYpIG1vZGUgYXJlIG5vCisgIGxvbmdlciBmb3JtYXR0ZWQgdHdpY2UuCisKKy0gSXNzdWUgIzI1MjI3OiBPcHRpbWl6ZSBBU0NJSSBhbmQgbGF0aW4xIGVuY29kZXJzIHdpdGggdGhlIGBgc3Vycm9nYXRlZXNjYXBlYGAKKyAgZXJyb3IgaGFuZGxlcjogdGhlIGVuY29kZXJzIGFyZSBub3cgdXAgdG8gMyB0aW1lcyBhcyBmYXN0LiBJbml0aWFsIHBhdGNoCisgIHdyaXR0ZW4gYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjUwMDM6IE9uIFNvbGFyaXMgMTEuMyBvciBuZXdlciwgb3MudXJhbmRvbSgpIG5vdyB1c2VzIHRoZQorICBnZXRyYW5kb20oKSBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBnZXRlbnRyb3B5KCkgZnVuY3Rpb24uIFRoZSBnZXRlbnRyb3B5KCkKKyAgZnVuY3Rpb24gaXMgYmxvY2tpbmcgdG8gZ2VuZXJhdGUgdmVyeSBnb29kIHF1YWxpdHkgZW50cm9weSwgb3MudXJhbmRvbSgpCisgIGRvZXNuJ3QgbmVlZCBzdWNoIGhpZ2gtcXVhbGl0eSBlbnRyb3B5LgorCistIElzc3VlICM5MjMyOiBNb2RpZnkgUHl0aG9uJ3MgZ3JhbW1hciB0byBhbGxvdyB0cmFpbGluZyBjb21tYXMgaW4gdGhlCisgIGFyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gIEZvciBleGFtcGxlLCAiZGVmIGYoXCosIGEgPQorICAzLCk6IHBhc3MiIGlzIG5vdyBsZWdhbC4gUGF0Y2ggZnJvbSBNYXJrIERpY2tpbnNvbi4KKworLSBJc3N1ZSAjMjQ5NjU6IEltcGxlbWVudCBQRVAgNDk4ICJMaXRlcmFsIFN0cmluZyBJbnRlcnBvbGF0aW9uIi4gVGhpcworICBhbGxvd3MgeW91IHRvIGVtYmVkIGV4cHJlc3Npb25zIGluc2lkZSBmLXN0cmluZ3MsIHdoaWNoIGFyZQorICBjb252ZXJ0ZWQgdG8gbm9ybWFsIHN0cmluZ3MgYXQgcnVuIHRpbWUuIEdpdmVuIHg9MywgdGhlbgorICBmJ3ZhbHVlPXt4fScgPT0gJ3ZhbHVlPTMnLiBQYXRjaCBieSBFcmljIFYuIFNtaXRoLgorCiAtIElzc3VlICMyNjQ3ODogRml4IHNlbWFudGljIGJ1Z3Mgd2hlbiB1c2luZyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggZGljdGlvbmFyeQogICB2aWV3cyBhbmQgdHVwbGVzLgogCkBAIC0xMDAsMzYgKzIzMyw2OSBAQAogCiAtIElzc3VlICMyNTY2MDogRml4IFRBQiBrZXkgYmVoYXZpb3VyIGluIFJFUEwgd2l0aCByZWFkbGluZS4KIAorLSBJc3N1ZSAjMjYyODg6IE9wdGltaXplIFB5TG9uZ19Bc0RvdWJsZS4KKworLSBJc3N1ZXMgIzI2Mjg5IGFuZCAjMjYzMTU6IE9wdGltaXplIGZsb29yIGFuZCBtb2R1bG8gZGl2aXNpb24gZm9yCisgIHNpbmdsZS1kaWdpdCBsb25ncy4gIE1pY3JvYmVuY2htYXJrcyBzaG93IDItMi41eCBpbXByb3ZlbWVudC4gIEJ1aWx0LWluCisgICdkaXZtb2QnIGZ1bmN0aW9uIGlzIG5vdyBhbHNvIH4xMCUgZmFzdGVyLgorCiAtIElzc3VlICMyNTg4NzogUmFpc2UgYSBSdW50aW1lRXJyb3Igd2hlbiBhIGNvcm91dGluZSBvYmplY3QgaXMgYXdhaXRlZAogICBtb3JlIHRoYW4gb25jZS4KIAotCiBMaWJyYXJ5CiAtLS0tLS0tCiAKIC0gSXNzdWUgIzI2NzE3OiBTdG9wIGVuY29kaW5nIExhdGluLTEtaXplZCBXU0dJIHBhdGhzIHdpdGggVVRGLTguICBQYXRjaCBieQogICBBbnRob255IFNvdHRpbGUuCiAKKy0gSXNzdWUgIzI2NzgyOiBBZGQgU1RBUlRVUElORk8gdG8gc3VicHJvY2Vzcy5fX2FsbF9fIG9uIFdpbmRvd3MuCisKKy0gSXNzdWUgIzI2NDA0OiBBZGQgY29udGV4dCBtYW5hZ2VyIHRvIHNvY2tldHNlcnZlci4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NzM1OiBGaXggOmZ1bmM6YG9zLnVyYW5kb21gIG9uIFNvbGFyaXMgMTEuMyBhbmQgbmV3ZXIgd2hlbiByZWFkaW5nCiAgIG1vcmUgdGhhbiAxLDAyNCBieXRlczogY2FsbCBgYGdldHJhbmRvbSgpYGAgbXVsdGlwbGUgdGltZXMgd2l0aCBhIGxpbWl0IG9mCiAgIDEwMjQgYnl0ZXMgcGVyIGNhbGwuCiAKKy0gSXNzdWUgIzI2NTg1OiBFbGltaW5hdGUgaHR0cC5zZXJ2ZXIuX3F1b3RlX2h0bWwoKSBhbmQgdXNlCisgIGh0bWwuZXNjYXBlKHF1b3RlPUZhbHNlKS4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNjY4NTogUmFpc2UgT1NFcnJvciBpZiBjbG9zaW5nIGEgc29ja2V0IGZhaWxzLgorCiAtIElzc3VlICMxNjMyOTogQWRkIC53ZWJtIHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHaWFtcGFvbG8gUm9kb2xhJy4KIAogLSBJc3N1ZSAjMTM5NTI6IEFkZCAuY3N2IHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHZW9mZiBXaWxzb24uCiAKKy0gSXNzdWUgIzI2NTg3OiB0aGUgc2l0ZSBtb2R1bGUgbm93IGFsbG93cyAucHRoIGZpbGVzIHRvIHNwZWNpZnkgZmlsZXMgdG8gYmUKKyAgYWRkZWQgdG8gc3lzLnBhdGggKGUuZy4gemlwIGZpbGVzKS4KKworLSBJc3N1ZSAjMjU2MDk6IEludHJvZHVjZSBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXIgYW5kCisgIHR5cGluZy5Db250ZXh0TWFuYWdlci4KKwogLSBJc3N1ZSAjMjY3MDk6IEZpeGVkIFkyMDM4IHByb2JsZW0gaW4gbG9hZGluZyBiaW5hcnkgUExpc3RzLgogCiAtIElzc3VlICMyMzczNTogSGFuZGxlIHRlcm1pbmFsIHJlc2l6aW5nIHdpdGggUmVhZGxpbmUgNi4zKyBieSBpbnN0YWxsaW5nIG91cgogICBvd24gU0lHV0lOQ0ggaGFuZGxlci4gIFBhdGNoIGJ5IEVyaWMgUHJpY2UuCiAKKy0gSXNzdWUgIzI1OTUxOiBDaGFuZ2UgU1NMU29ja2V0LnNlbmRhbGwoKSB0byByZXR1cm4gTm9uZSwgYXMgZXhwbGljaXRseQorICBkb2N1bWVudGVkIGZvciBwbGFpbiBzb2NrZXQgb2JqZWN0cy4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NTg2OiBJbiBodHRwLnNlcnZlciwgcmVzcG9uZCB3aXRoICI0MTMgUmVxdWVzdCBoZWFkZXIgZmllbGRzIHRvbwogICBsYXJnZSIgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGhlYWRlciBmaWVsZHMgdG8gcGFyc2UsIHJhdGhlciB0aGFuIGtpbGxpbmcKICAgdGhlIGNvbm5lY3Rpb24gYW5kIHJhaXNpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgogCistIElzc3VlICMyNjY3NjogQWRkZWQgbWlzc2luZyBYTUxQdWxsUGFyc2VyIHRvIEVsZW1lbnRUcmVlLl9fYWxsX18uCisKIC0gSXNzdWUgIzIyODU0OiBDaGFuZ2UgQnVmZmVyZWRSZWFkZXIud3JpdGFibGUoKSBhbmQKICAgQnVmZmVyZWRXcml0ZXIucmVhZGFibGUoKSB0byBhbHdheXMgcmV0dXJuIEZhbHNlLgogCistIElzc3VlICMyNjQ5MjogRXhoYXVzdGVkIGl0ZXJhdG9yIG9mIGFycmF5LmFycmF5IG5vdyBjb25mb3JtcyB3aXRoIHRoZSBiZWhhdmlvcgorICBvZiBpdGVyYXRvcnMgb2Ygb3RoZXIgbXV0YWJsZSBzZXF1ZW5jZXM6IGl0IGxlZnRzIGV4aGF1c3RlZCBldmVuIGlmIGl0ZXJhdGVkCisgIGFycmF5IGlzIGV4dGVuZGVkLgorCistIElzc3VlICMyNjY0MTogZG9jdGVzdC5Eb2NGaWxlVGVzdCBhbmQgZG9jdGVzdC50ZXN0ZmlsZSgpIG5vdyBzdXBwb3J0CisgIHBhY2thZ2VzIChtb2R1bGUgc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBkaXJlY3RvcmllcykgZm9yIHRoZSBwYWNrYWdlCisgIHBhcmFtZXRlci4KKwogLSBJc3N1ZSAjMjUxOTU6IEZpeCBhIHJlZ3Jlc3Npb24gaW4gbW9jay5NYWdpY01vY2suIF9DYWxsIGlzIGEgc3ViY2xhc3Mgb2YKICAgdHVwbGUgKGNoYW5nZXNldCAzNjAzYmFlNjNjMTMgb25seSB3b3JrcyBmb3IgY2xhc3Nlcykgc28gd2UgbmVlZCB0bwogICBpbXBsZW1lbnQgX19uZV9fIG91cnNlbHZlcy4gIFBhdGNoIGJ5IEFuZHJldyBQbHVtbWVyLgpAQCAtMTQyLDE2ICszMDgsNDUgQEAKIAogLSBJc3N1ZSAjMjY2MTY6IEZpeGVkIGEgYnVnIGluIGRhdGV0aW1lLmFzdGltZXpvbmUoKSBtZXRob2QuCiAKLS0gSXNzdWUgIzIxOTI1OiA6ZnVuYzpgd2FybmluZ3MuZm9ybWF0d2FybmluZ2Agbm93IGNhdGNoZXMgZXhjZXB0aW9ucyBvbgotICBgYGxpbmVjYWNoZS5nZXRsaW5lKC4uLilgYCB0byBiZSBhYmxlIHRvIGxvZyA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGVtaXR0ZWQKLSAgbGF0ZSBkdXJpbmcgdGhlIFB5dGhvbiBzaHV0ZG93biBwcm9jZXNzLgorLSBJc3N1ZSAjMjY2Mzc6IFRoZSA6bW9kOmBpbXBvcnRsaWJgIG1vZHVsZSBub3cgZW1pdHMgYW4gOmV4YzpgSW1wb3J0RXJyb3JgCisgIHJhdGhlciB0aGFuIGEgOmV4YzpgVHlwZUVycm9yYCBpZiA6ZnVuYzpgX19pbXBvcnRfX2AgaXMgdHJpZWQgZHVyaW5nIHRoZQorICBQeXRob24gc2h1dGRvd24gcHJvY2VzcyBidXQgOmRhdGE6YHN5cy5wYXRoYCBpcyBhbHJlYWR5IGNsZWFyZWQgKHNldCB0bworICBgYE5vbmVgYCkuCisKKy0gSXNzdWUgIzIxOTI1OiA6ZnVuYzpgd2FybmluZ3MuZm9ybWF0d2FybmluZ2Agbm93IGNhdGNoZXMgZXhjZXB0aW9ucyB3aGVuCisgIGNhbGxpbmcgOmZ1bmM6YGxpbmVjYWNoZS5nZXRsaW5lYCBhbmQKKyAgOmZ1bmM6YHRyYWNlbWFsbG9jLmdldF9vYmplY3RfdHJhY2ViYWNrYCB0byBiZSBhYmxlIHRvIGxvZworICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGVtaXR0ZWQgbGF0ZSBkdXJpbmcgdGhlIFB5dGhvbiBzaHV0ZG93biBwcm9jZXNzLgorCistIElzc3VlICMyMzg0ODogT24gV2luZG93cywgZmF1bHRoYW5kbGVyLmVuYWJsZSgpIG5vdyBhbHNvIGluc3RhbGxzIGFuCisgIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGR1bXAgdGhlIHRyYWNlYmFjayBvZiBhbGwgUHl0aG9uIHRocmVhZHMgb24gYW55IFdpbmRvd3MKKyAgZXhjZXB0aW9uLCBub3Qgb25seSBvbiBVTklYIHNpZ25hbHMgKFNJR1NFR1YsIFNJR0ZQRSwgU0lHQUJSVCkuCisKKy0gSXNzdWUgIzI2NTMwOiBBZGQgQyBmdW5jdGlvbnMgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfVHJhY2tgIGFuZAorICA6YzpmdW5jOmBfUHlUcmFjZU1hbGxvY19VbnRyYWNrYCB0byB0cmFjayBtZW1vcnkgYmxvY2tzIHVzaW5nIHRoZQorICA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlLiBBZGQgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrYCB0byBnZXQKKyAgdGhlIHRyYWNlYmFjayBvZiBhbiBvYmplY3QuCisKKy0gSXNzdWUgIzI2NTg4OiBUaGUgX3RyYWNlbWFsbG9jIG5vdyBzdXBwb3J0cyB0cmFjaW5nIG1lbW9yeSBhbGxvY2F0aW9ucyBvZgorICBtdWx0aXBsZSBhZGRyZXNzIHNwYWNlcyAoZG9tYWlucykuCiAKIC0gSXNzdWUgIzI0MjY2OiBDdHJsK0MgZHVyaW5nIFJlYWRsaW5lIGhpc3Rvcnkgc2VhcmNoIG5vdyBjYW5jZWxzIHRoZSBzZWFyY2gKICAgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggUmVhZGxpbmUgNy4KIAorLSBJc3N1ZSAjMjY1OTA6IEltcGxlbWVudCBhIHNhZmUgZmluYWxpemVyIGZvciB0aGUgX3NvY2tldC5zb2NrZXQgdHlwZS4gSXQgbm93CisgIHJlbGVhc2VzIHRoZSBHSUwgdG8gY2xvc2UgdGhlIHNvY2tldC4KKworLSBJc3N1ZSAjMTg3ODc6IHNwd2QuZ2V0c3BuYW0oKSBub3cgcmFpc2VzIGEgUGVybWlzc2lvbkVycm9yIGlmIHRoZSB1c2VyCisgIGRvZXNuJ3QgaGF2ZSBwcml2aWxlZ2VzLgorCiAtIElzc3VlICMyNjU2MDogQXZvaWQgcG90ZW50aWFsIFZhbHVlRXJyb3IgaW4gQmFzZUhhbmRsZXIuc3RhcnRfcmVzcG9uc2UuCiAgIEluaXRpYWwgcGF0Y2ggYnkgUGV0ZXIgSW5nbGVzYnkuCiAKKy0gSXNzdWUgIzI2NTY3OiBBZGQgYSBuZXcgZnVuY3Rpb24gOmM6ZnVuYzpgUHlFcnJfUmVzb3VyY2VXYXJuaW5nYCBmdW5jdGlvbiB0bworICBwYXNzIHRoZSBkZXN0cm95ZWQgb2JqZWN0LiBBZGQgYSAqc291cmNlKiBhdHRyaWJ1dGUgdG8KKyAgOmNsYXNzOmB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZWAuIEFkZCB3YXJuaW5ncy5fc2hvd3dhcm5tc2coKSB3aGljaCB1c2VzCisgIHRyYWNlbWFsbG9jIHRvIGdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIHNvdXJjZSBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKwogLSBJc3N1ZSAjMjYzMTM6IHNzbC5weSBfbG9hZF93aW5kb3dzX3N0b3JlX2NlcnRzIGZhaWxzIGlmIHdpbmRvd3MgY2VydCBzdG9yZQogICBpcyBlbXB0eS4gUGF0Y2ggYnkgQmFqaS4KIApAQCAtMTczLDIzICszNjgsMzggQEAKIC0gSXNzdWUgIzIzNzE4OiBGaXhlZCBwYXJzaW5nIHRpbWUgaW4gd2VlayAwIGJlZm9yZSBKYW4gMS4gIE9yaWdpbmFsIHBhdGNoIGJ5CiAgIFRhbcOhcyBCZW5jZSBHZWRhaS4KIAorLSBJc3N1ZSAjMjYzMjM6IEFkZCBNb2NrLmFzc2VydF9jYWxsZWQoKSBhbmQgTW9jay5hc3NlcnRfY2FsbGVkX29uY2UoKQorICBtZXRob2RzIHRvIHVuaXR0ZXN0Lm1vY2suIFBhdGNoIHdyaXR0ZW4gYnkgQW1pdCBTYWhhLgorCiAtIElzc3VlICMyMDU4OTogSW52b2tpbmcgUGF0aC5vd25lcigpIGFuZCBQYXRoLmdyb3VwKCkgb24gV2luZG93cyBub3cgcmFpc2UKICAgTm90SW1wbGVtZW50ZWRFcnJvciBpbnN0ZWFkIG9mIEltcG9ydEVycm9yLgogCiAtIElzc3VlICMyNjE3NzogRml4ZWQgdGhlIGtleXMoKSBtZXRob2QgZm9yIENhbnZhcyBhbmQgU2Nyb2xsYmFyIHdpZGdldHMuCiAKLS0gSXNzdWUgIzE1MDY4OiBHb3QgcmlkIG9mIGV4Y2Vzc2l2ZSBidWZmZXJpbmcgaW4gdGhlIGZpbGVpbnB1dCBtb2R1bGUuCi0gIFRoZSBidWZzaXplIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KKy0gSXNzdWUgIzE1MDY4OiBHb3QgcmlkIG9mIGV4Y2Vzc2l2ZSBidWZmZXJpbmcgaW4gZmlsZWlucHV0LgorICBUaGUgYnVmc2l6ZSBwYXJhbWV0ZXIgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQuCisKKy0gSXNzdWUgIzE5NDc1OiBBZGRlZCBhbiBvcHRpb25hbCBhcmd1bWVudCB0aW1lc3BlYyB0byB0aGUgZGF0ZXRpbWUKKyAgaXNvZm9ybWF0KCkgbWV0aG9kIHRvIGNob29zZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSB0aW1lIGNvbXBvbmVudC4KIAogLSBJc3N1ZSAjMjIwMjogRml4IFVuYm91bmRMb2NhbEVycm9yIGluCiAgIEFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIuZ2V0X2FsZ29yaXRobV9pbXBscy4gIEluaXRpYWwgcGF0Y2ggYnkgTWF0aGlldSBEdXB1eS4KIAorLSBJc3N1ZSAjMjYxNjc6IE1pbmltaXplZCBvdmVyaGVhZCBpbiBjb3B5LmNvcHkoKSBhbmQgY29weS5kZWVwY29weSgpLgorICBPcHRpbWl6ZWQgY29weWluZyBhbmQgZGVlcGNvcHlpbmcgYnl0ZWFycmF5cywgTm90SW1wbGVtZW50ZWQsIHNsaWNlcywKKyAgc2hvcnQgbGlzdHMsIHR1cGxlcywgZGljdHMsIHNldHMuCisKIC0gSXNzdWUgIzI1NzE4OiBGaXhlZCBwaWNrbGluZyBhbmQgY29weWluZyB0aGUgYWNjdW11bGF0ZSgpIGl0ZXJhdG9yIHdpdGgKICAgdG90YWwgaXMgTm9uZS4KIAogLSBJc3N1ZSAjMjY0NzU6IEZpeGVkIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2l0aCB0aGUgKD94KQogICBmbGFnLgogCistIElzc3VlICMyNjQ4MjogQWxsb3dlZCBwaWNrbGluZyByZWN1cnNpdmUgZGVxdWV1ZXMuCisKKy0gSXNzdWUgIzI2MzM1OiBNYWtlIG1tYXAud3JpdGUoKSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGxpa2UKKyAgb3RoZXIgd3JpdGUgbWV0aG9kcy4gIFBhdGNoIGJ5IEpha3ViIFN0YXNpYWsuCisKIC0gSXNzdWUgIzI2NDU3OiBGaXhlZCB0aGUgc3VibmV0cygpIG1ldGhvZHMgaW4gSVAgbmV0d29yayBjbGFzc2VzIGZvciB0aGUgY2FzZQogICB3aGVuIHJlc3VsdGluZyBwcmVmaXggbGVuZ3RoIGlzIGVxdWFsIHRvIG1heGltYWwgcHJlZml4IGxlbmd0aC4KICAgQmFzZWQgb24gcGF0Y2ggYnkgWGlhbmcgWmhhbmcuCkBAIC0yMDYsNyArNDE2LDcgQEAKIAogLSBJc3N1ZSAjMjYxODY6IFJlbW92ZSBhbiBpbnZhbGlkIHR5cGUgY2hlY2sgaW4gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlci4KIAotLSBJc3N1ZSAjMjYzNjc6IGltcG9ydGxpYi5fX2ltcG9ydF9fKCkgcmFpc2VzIFN5c3RlbUVycm9yIGxpa2UKKy0gSXNzdWUgIzI2MzY3OiBpbXBvcnRsaWIuX19pbXBvcnRfXygpIHJhaXNlcyBJbXBvcnRFcnJvciBsaWtlCiAgIGJ1aWx0aW5zLl9faW1wb3J0X18oKSB3aGVuIGBgbGV2ZWxgYCBpcyBzcGVjaWZpZWQgYnV0IHdpdGhvdXQgYW4gYWNjb21wYW55aW5nCiAgIHBhY2thZ2Ugc3BlY2lmaWVkLgogCkBAIC0yMTQsMTggKzQyNCwzOCBAQAogICB0aGUgY29ubmVjdGVkIHNvY2tldCkgd2hlbiB2ZXJpZnlfcmVxdWVzdCgpIHJldHVybnMgZmFsc2UuICBQYXRjaCBieSBBdml2CiAgIFBhbGl2b2RhLgogCistIElzc3VlICMyMzQzMDogQ2hhbmdlIHRoZSBzb2NrZXRzZXJ2ZXIgbW9kdWxlIHRvIG9ubHkgY2F0Y2ggZXhjZXB0aW9ucworICByYWlzZWQgZnJvbSBhIHJlcXVlc3QgaGFuZGxlciB0aGF0IGFyZSBkZXJpdmVkIGZyb20gRXhjZXB0aW9uIChpbnN0ZWFkIG9mCisgIEJhc2VFeGNlcHRpb24pLiAgVGhlcmVmb3JlIFN5c3RlbUV4aXQgYW5kIEtleWJvYXJkSW50ZXJydXB0IG5vIGxvbmdlcgorICB0cmlnZ2VyIHRoZSBoYW5kbGVfZXJyb3IoKSBtZXRob2QsIGFuZCB3aWxsIG5vdyB0byBzdG9wIGEgc2luZ2xlLXRocmVhZGVkCisgIHNlcnZlci4KKwogLSBJc3N1ZSAjMjU5Mzk6IE9uIFdpbmRvd3Mgb3BlbiB0aGUgY2VydCBzdG9yZSByZWFkb25seSBpbiBzc2wuZW51bV9jZXJ0aWZpY2F0ZXMuCiAKIC0gSXNzdWUgIzI1OTk1OiBvcy53YWxrKCkgbm8gbG9uZ2VyIHVzZXMgRkRzIHByb3BvcnRpb25hbCB0byB0aGUgdHJlZSBkZXB0aC4KIAorLSBJc3N1ZSAjMjU5OTQ6IEFkZGVkIHRoZSBjbG9zZSgpIG1ldGhvZCBhbmQgdGhlIHN1cHBvcnQgb2YgdGhlIGNvbnRleHQgbWFuYWdlcgorICBwcm90b2NvbCBmb3IgdGhlIG9zLnNjYW5kaXIoKSBpdGVyYXRvci4KKworLSBJc3N1ZSAjMjM5OTI6IG11bHRpcHJvY2Vzc2luZzogbWFrZSBNYXBSZXN1bHQgbm90IGZhaWwtZmFzdCB1cG9uIGV4Y2VwdGlvbi4KKworLSBJc3N1ZSAjMjYyNDM6IFN1cHBvcnQga2V5d29yZCBhcmd1bWVudHMgdG8gemxpYi5jb21wcmVzcygpLiAgUGF0Y2ggYnkgQXZpdgorICBQYWxpdm9kYS4KKwogLSBJc3N1ZSAjMjYxMTc6IFRoZSBvcy5zY2FuZGlyKCkgaXRlcmF0b3Igbm93IGNsb3NlcyBmaWxlIGRlc2NyaXB0b3Igbm90IG9ubHkKICAgd2hlbiB0aGUgaXRlcmF0aW9uIGlzIGZpbmlzaGVkLCBidXQgd2hlbiBpdCB3YXMgZmFpbGVkIHdpdGggZXJyb3IuCiAKKy0gSXNzdWUgIzI1OTQ5OiBfX2RpY3RfXyBmb3IgYW4gT3JkZXJlZERpY3QgaW5zdGFuY2UgaXMgbm93IGNyZWF0ZWQgb25seSB3aGVuCisgIG5lZWRlZC4KKwogLSBJc3N1ZSAjMjU5MTE6IFJlc3RvcmVkIHN1cHBvcnQgb2YgYnl0ZXMgcGF0aHMgaW4gb3Mud2FsaygpIG9uIFdpbmRvd3MuCiAKIC0gSXNzdWUgIzI2MDQ1OiBBZGQgVVRGLTggc3VnZ2VzdGlvbiB0byBlcnJvciBtZXNzYWdlIHdoZW4gcG9zdGluZyBhCiAgIG5vbi1MYXRpbi0xIHN0cmluZyB3aXRoIGh0dHAuY2xpZW50LgogCistIElzc3VlICMyNjAzOTogQWRkZWQgemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZSgpIGFuZCB6aXBpbmZvLlppcEluZm8uaXNfZGlyKCkuCisgIFBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgorCiAtIElzc3VlICMxMjkyMzogUmVzZXQgRmFuY3lVUkxvcGVuZXIncyByZWRpcmVjdCBjb3VudGVyIGV2ZW4gaWYgdGhlcmUgaXMgYW4KICAgZXhjZXB0aW9uLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBCcmlhbiBCcmF6aWwgYW5kIERhbmllbCBSb2Njby4KIApAQCAtMjQ2LDYgKzQ3NiwxMCBAQAogICBnZXRob3N0YnluYW1lX2V4KCkgZnVuY3Rpb25zIG9mIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBkZWNvZGUgdGhlIGhvc3RuYW1lCiAgIGZyb20gdGhlIEFOU0kgY29kZSBwYWdlIHJhdGhlciB0aGFuIFVURi04LgogCistIElzc3VlICMyNjA5OTogVGhlIHNpdGUgbW9kdWxlIG5vdyB3cml0ZXMgYW4gZXJyb3IgaW50byBzdGRlcnIgaWYKKyAgc2l0ZWN1c3RvbWl6ZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIGJ1dCBleGVjdXRpbmcgdGhlIG1vZHVsZSByYWlzZSBhbgorICBJbXBvcnRFcnJvci4gU2FtZSBjaGFuZ2UgZm9yIHVzZXJjdXN0b21pemUuCisKIC0gSXNzdWUgIzI2MTQ3OiB4bWxycGMgbm93IHdvcmtzIHdpdGggc3RyaW5ncyBub3QgZW5jb2RhYmxlIHdpdGggdXNlZAogICBub24tVVRGLTggZW5jb2RpbmcuCiAKQEAgLTI1NiwxMyArNDkwLDIxIEBACiAtIElzc3VlICMyNjAxMzogQWRkZWQgY29tcGF0aWJpbGl0eSB3aXRoIGJyb2tlbiBwcm90b2NvbCAyIHBpY2tsZXMgY3JlYXRlZAogICBpbiBvbGQgUHl0aG9uIDMgdmVyc2lvbnMgKDMuNC4zIGFuZCBsb3dlcikuCiAKKy0gSXNzdWUgIzI2MTI5OiBEZXByZWNhdGVkIGFjY2VwdGluZyBub24taW50ZWdlcnMgaW4gZ3JwLmdldGdyZ2lkKCkuCisKIC0gSXNzdWUgIzI1ODUwOiBVc2UgY3Jvc3MtY29tcGlsYXRpb24gYnkgZGVmYXVsdCBmb3IgNjQtYml0IFdpbmRvd3MuCiAKLS0gSXNzdWUgIzE3NjMzOiBJbXByb3ZlIHppcGltcG9ydCdzIHN1cHBvcnQgZm9yIG5hbWVzcGFjZSBwYWNrYWdlcy4KKy0gSXNzdWUgIzI1ODIyOiBBZGQgZG9jc3RyaW5ncyB0byB0aGUgZmllbGRzIG9mIHVybGxpYi5wYXJzZSByZXN1bHRzLgorICBQYXRjaCBjb250cmlidXRlZCBieSBTd2F0aSBKYWlzd2FsLgorCistIElzc3VlICMyMjY0MjogQ29udmVydCB0cmFjZSBtb2R1bGUgb3B0aW9uIHBhcnNpbmcgbWVjaGFuaXNtIHRvIGFyZ3BhcnNlLgorICBQYXRjaCBjb250cmlidXRlZCBieSBTaWxlbnRHaG9zdC4KIAogLSBJc3N1ZSAjMjQ3MDU6IEZpeCBzeXNjb25maWcuX3BhcnNlX21ha2VmaWxlIG5vdCBleHBhbmRpbmcgJHt9IHZhcnMKICAgYXBwZWFyaW5nIGJlZm9yZSAkKCkgdmFycy4KIAorLSBJc3N1ZSAjMjYwNjk6IFJlbW92ZSB0aGUgZGVwcmVjYXRlZCBhcGlzIGluIHRoZSB0cmFjZSBtb2R1bGUuCisKIC0gSXNzdWUgIzIyMTM4OiBGaXggbW9jay5wYXRjaCBiZWhhdmlvciB3aGVuIHBhdGNoaW5nIGRlc2NyaXB0b3JzLiBSZXN0b3JlCiAgIG9yaWdpbmFsIHZhbHVlcyBhZnRlciBwYXRjaGluZy4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2VhbiBNY0N1bGx5LgogCkBAIC0yODEsMTMgKzUyMywyOCBAQAogLSBJc3N1ZSAjMjQxMjA6IElnbm9yZSBQZXJtaXNzaW9uRXJyb3Igd2hlbiB0cmF2ZXJzaW5nIGEgdHJlZSB3aXRoCiAgIHBhdGhsaWIuUGF0aC5bcl1nbG9iKCkuICBQYXRjaCBieSBVbHJpY2ggUGV0cmkuCiAKKy0gSXNzdWUgIzIxODE1OiBBY2NlcHQgXSBjaGFyYWN0ZXJzIGluIHRoZSBkYXRhIHBvcnRpb24gb2YgaW1hcCByZXNwb25zZXMsCisgIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgZmxhZ3Mgd2l0aCBzcXVhcmUgYnJhY2tldHMgYWNjZXB0ZWQgYW5kIHByb2R1Y2VkCisgIGJ5IHNlcnZlcnMgc3VjaCBhcyBnbWFpbC4KKwogLSBJc3N1ZSAjMjU0NDc6IGZpbGVpbnB1dCBub3cgdXNlcyBzeXMuc3RkaW4gYXMtaXMgaWYgaXQgZG9lcyBub3QgaGF2ZSBhCiAgIGJ1ZmZlciBhdHRyaWJ1dGUgKHJlc3RvcmVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgogCistIElzc3VlICMyNTk3MTogT3B0aW1pemVkIGNyZWF0aW5nIEZyYWN0aW9ucyBmcm9tIGZsb2F0cyBieSAyIHRpbWVzIGFuZCBmcm9tCisgIERlY2ltYWxzIGJ5IDMgdGltZXMuCisKKy0gSXNzdWUgIzI1ODAyOiBEb2N1bWVudCBhcyBkZXByZWNhdGVkIHRoZSByZW1haW5pbmcgaW1wbGVtZW50YXRpb25zIG9mCisgIGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlKCkuCisKKy0gSXNzdWUgIzI1OTI4OiBBZGQgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkuCisKIC0gSXNzdWUgIzI1NDQ3OiBDb3B5aW5nIHRoZSBscnVfY2FjaGUoKSB3cmFwcGVyIG9iamVjdCBub3cgYWx3YXlzIHdvcmtzLAotICBpbmRlcGVuZGVkbHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgd3JhcHBlZCBvYmplY3QgKGJ5IHJldHVybmluZyB0aGUgb3JpZ2luYWwKKyAgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG9iamVjdCAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbAogICBvYmplY3QgdW5jaGFuZ2VkKS4KIAorLSBJc3N1ZSAjMjU3Njg6IEhhdmUgdGhlIGZ1bmN0aW9ucyBpbiBjb21waWxlYWxsIHJldHVybiBib29sZWFucyBpbnN0ZWFkIG9mCisgIGludHMgYW5kIGFkZCBwcm9wZXIgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdHMgZm9yIHRoZSByZXR1cm4gdmFsdWVzLgorCiAtIElzc3VlICMyNDEwMzogRml4ZWQgcG9zc2libGUgdXNlIGFmdGVyIGZyZWUgaW4gRWxlbWVudFRyZWUuWE1MUHVsbFBhcnNlci4KIAogLSBJc3N1ZSAjMjU4NjA6IG9zLmZ3YWxrKCkgbm8gbG9uZ2VyIHNraXBzIHJlbWFpbmluZyBkaXJlY3RvcmllcyB3aGVuIGVycm9yCkBAIC0yOTUsOCArNTUyLDIyIEBACiAKIC0gSXNzdWUgIzI1OTE0OiBGaXhlZCBhbmQgc2ltcGxpZmllZCBPcmRlcmVkRGljdC5fX3NpemVvZl9fLgogCistIElzc3VlICMyNTg2OTogT3B0aW1pemVkIGRlZXBjb3B5aW5nIEVsZW1lbnRUcmVlOyBpdCBpcyBub3cgMjAgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNTg3MzogT3B0aW1pemVkIGl0ZXJhdGluZyBFbGVtZW50VHJlZS4gIEl0ZXJhdGluZyBlbGVtZW50cworICBFbGVtZW50Lml0ZXIoKSBpcyBub3cgNDAlIGZhc3RlciwgaXRlcmF0aW5nIHRleHQgRWxlbWVudC5pdGVydGV4dCgpCisgIGlzIG5vdyB1cCB0byAyLjUgdGltZXMgZmFzdGVyLgorCiAtIElzc3VlICMyNTkwMjogRml4ZWQgdmFyaW91cyByZWZjb3VudCBpc3N1ZXMgaW4gRWxlbWVudFRyZWUgaXRlcmF0aW9uLgogCistIElzc3VlICMyMjIyNzogVGhlIFRhckZpbGUgaXRlcmF0b3IgaXMgcmVpbXBsZW1lbnRlZCB1c2luZyBnZW5lcmF0b3IuCisgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc2ltcGxlciB0aGF0IHVzaW5nIGNsYXNzLgorCistIElzc3VlICMyNTYzODogT3B0aW1pemVkIEVsZW1lbnRUcmVlLml0ZXJwYXJzZSgpOyBpdCBpcyBub3cgMnggZmFzdGVyLgorICBPcHRpbWl6ZWQgRWxlbWVudFRyZWUgcGFyc2luZzsgaXQgaXMgbm93IDEwJSBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1NzYxOiBJbXByb3ZlZCBkZXRlY3RpbmcgZXJyb3JzIGluIGJyb2tlbiBwaWNrbGUgZGF0YS4KKwogLSBJc3N1ZSAjMjU3MTc6IFJlc3RvcmUgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiB0b2xlcmF0aW5nIG1vc3QgZnN0YXQoKQogICBlcnJvcnMgd2hlbiBvcGVuaW5nIGZpbGVzLiAgVGhpcyB3YXMgYSByZWdyZXNzaW9uIGluIDMuNWExLCBhbmQgc3RvcHBlZAogICBhbm9ueW1vdXMgdGVtcG9yYXJ5IGZpbGVzIGZyb20gd29ya2luZyBpbiBzcGVjaWFsIGNhc2VzLgpAQCAtMzA4LDYgKzU3OSw5IEBACiAtIElzc3VlICMyNTc2NDogSW4gdGhlIHN1YnByb2Nlc3MgbW9kdWxlLCBwcmVzZXJ2ZSBhbnkgZXhjZXB0aW9uIGNhdXNlZCBieQogICBmb3JrKCkgZmFpbHVyZSB3aGVuIHByZWV4ZWNfZm4gaXMgdXNlZC4KIAorLSBJc3N1ZSAjMjU3NzE6IFR3ZWFrIHRoZSBleGNlcHRpb24gbWVzc2FnZSBmb3IgaW1wb3J0bGliLnV0aWwucmVzb2x2ZV9uYW1lKCkKKyAgd2hlbiAncGFja2FnZScgaXNuJ3Qgc3BlY2lmaWVkIGJ1dCBuZWNlc3NhcnkuCisKIC0gSXNzdWUgIzY0Nzg6IF9zdHJwdGltZSdzIHJlZ2V4cCBjYWNoZSBub3cgaXMgcmVzZXQgYWZ0ZXIgY2hhbmdpbmcgdGltZXpvbmUKICAgd2l0aCB0aW1lLnR6c2V0KCkuCiAKQEAgLTMyOSw2ICs2MDMsOSBAQAogLSBJc3N1ZSAjMTAxMzE6IEZpeGVkIGRlZXAgY29weWluZyBvZiBtaW5pZG9tIGRvY3VtZW50cy4gIEJhc2VkIG9uIHBhdGNoCiAgIGJ5IE1hcmlhbiBHYW5pc2luLgogCistIElzc3VlICM3OTkwOiBkaXIoKSBvbiBFbGVtZW50VHJlZS5FbGVtZW50IG5vdyBsaXN0cyBwcm9wZXJ0aWVzOiAidGFnIiwKKyAgInRleHQiLCAidGFpbCIgYW5kICJhdHRyaWIiLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FudG9zbyBXaWpheWEuCisKIC0gSXNzdWUgIzI1NzI1OiBGaXhlZCBhIHJlZmVyZW5jZSBsZWFrIGluIHBpY2tsZS5sb2FkcygpIHdoZW4gdW5waWNrbGluZwogICBpbnZhbGlkIGRhdGEgaW5jbHVkaW5nIHR1cGxlIGluc3RydWN0aW9ucy4KIApAQCAtMzQ0LDYgKzYyMSwyMDIgQEAKIC0gSXNzdWUgIzI1NjI0OiBaaXBGaWxlIG5vdyBhbHdheXMgd3JpdGVzIGEgWklQX1NUT1JFRCBoZWFkZXIgZm9yIGRpcmVjdG9yeQogICBlbnRyaWVzLiAgUGF0Y2ggYnkgRGluZ3l1YW4gV2FuZy4KIAorLSBJc3N1ZSAjMjU2MjY6IENoYW5nZSB0aHJlZSB6bGliIGZ1bmN0aW9ucyB0byBhY2NlcHQgc2l6ZXMgdGhhdCBmaXQgaW4KKyAgUHlfc3NpemVfdCwgYnV0IGludGVybmFsbHkgY2FwIHRob3NlIHNpemVzIHRvIFVJTlRfTUFYLiAgVGhpcyByZXNvbHZlcyBhCisgIHJlZ3Jlc3Npb24gaW4gMy41IHdoZXJlIEd6aXBGaWxlLnJlYWQoKSBmYWlsZWQgdG8gcmVhZCBjaHVua3MgbGFyZ2VyIHRoYW4gMgorICBvciA0IEdpQi4gIFRoZSBjaGFuZ2UgYWZmZWN0cyB0aGUgemxpYi5EZWNvbXByZXNzLmRlY29tcHJlc3MoKSBtYXhfbGVuZ3RoCisgIHBhcmFtZXRlciwgdGhlIHpsaWIuZGVjb21wcmVzcygpIGJ1ZnNpemUgcGFyYW1ldGVyLCBhbmQgdGhlCisgIHpsaWIuRGVjb21wcmVzcy5mbHVzaCgpIGxlbmd0aCBwYXJhbWV0ZXIuCisKKy0gSXNzdWUgIzI1NTgzOiBBdm9pZCBpbmNvcnJlY3QgZXJyb3JzIHJhaXNlZCBieSBvcy5tYWtlZGlycyhleGlzdF9vaz1UcnVlKQorICB3aGVuIHRoZSBPUyBnaXZlcyBwcmlvcml0eSB0byBlcnJvcnMgc3VjaCBhcyBFQUNDRVMgb3ZlciBFRVhJU1QuCisKKy0gSXNzdWUgIzI1NTkzOiBDaGFuZ2Ugc2VtYW50aWNzIG9mIEV2ZW50TG9vcC5zdG9wKCkgaW4gYXN5bmNpby4KKworLSBJc3N1ZSAjNjk3MzogV2hlbiB3ZSBrbm93IGEgc3VicHJvY2Vzcy5Qb3BlbiBwcm9jZXNzIGhhcyBkaWVkLCBkbworICBub3QgYWxsb3cgdGhlIHNlbmRfc2lnbmFsKCksIHRlcm1pbmF0ZSgpLCBvciBraWxsKCkgbWV0aG9kcyB0byBkbworICBhbnl0aGluZyBhcyB0aGV5IGNvdWxkIHBvdGVudGlhbGx5IHNpZ25hbCBhIGRpZmZlcmVudCBwcm9jZXNzLgorCistIElzc3VlICMyMzg4MzogQWRkZWQgbWlzc2luZyBBUElzIHRvIF9fYWxsX18gdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJcworICBmb3IgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBjYWxlbmRhciwgY3N2LCBlbnVtLCBmaWxlaW5wdXQsIGZ0cGxpYiwgbG9nZ2luZywKKyAgb3B0cGFyc2UsIHRhcmZpbGUsIHRocmVhZGluZyBhbmQgd2F2ZS4gIEFsc28gYWRkZWQgYQorICB0ZXN0LnN1cHBvcnQuY2hlY2tfX2FsbF9fKCkgaGVscGVyLiAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLCBNYXVybworICBTLiBNLiBSb2RyaWd1ZXMgYW5kIEpvZWwgVGFkZGVpLgorCistIElzc3VlICMyNTU5MDogSW4gdGhlIFJlYWRsaW5lIGNvbXBsZXRlciwgb25seSBjYWxsIGdldGF0dHIoKSBvbmNlIHBlcgorICBhdHRyaWJ1dGUuICBBbHNvIGNvbXBsZXRlIG5hbWVzIG9mIGF0dHJpYnV0ZXMgc3VjaCBhcyBwcm9wZXJ0aWVzIGFuZCBzbG90cworICB3aGljaCBhcmUgbGlzdGVkIGJ5IGRpcigpIGJ1dCBub3QgeWV0IGNyZWF0ZWQgb24gYW4gaW5zdGFuY2UuCisKKy0gSXNzdWUgIzI1NDk4OiBGaXggYSBjcmFzaCB3aGVuIGdhcmJhZ2UtY29sbGVjdGluZyBjdHlwZXMgb2JqZWN0cyBjcmVhdGVkCisgIGJ5IHdyYXBwaW5nIGEgbWVtb3J5dmlldy4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBtYWRlIGluIDMuNWExLiAgQmFzZWQKKyAgb24gcGF0Y2ggYnkgRXJ5a3N1bi4KKworLSBJc3N1ZSAjMjU1ODQ6IEFkZGVkICJlc2NhcGUiIHRvIHRoZSBfX2FsbF9fIGxpc3QgaW4gdGhlIGdsb2IgbW9kdWxlLgorCistIElzc3VlICMyNTU4NDogRml4ZWQgcmVjdXJzaXZlIGdsb2IoKSB3aXRoIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggJ1wqXConLgorCistIElzc3VlICMyNTQ0NjogRml4IHJlZ3Jlc3Npb24gaW4gc210cGxpYidzIEFVVEggTE9HSU4gc3VwcG9ydC4KKworLSBJc3N1ZSAjMTgwMTA6IEZpeCB0aGUgcHlkb2Mgd2ViIHNlcnZlcidzIG1vZHVsZSBzZWFyY2ggZnVuY3Rpb24gdG8gaGFuZGxlCisgIGV4Y2VwdGlvbnMgZnJvbSBpbXBvcnRpbmcgcGFja2FnZXMuCisKKy0gSXNzdWUgIzI1NTU0OiBHb3QgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcuCisKKy0gSXNzdWUgIzE4OTczOiBDb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9mIHRoZSBjYWxlbmRhciBtb2R1bGUgbm93IHVzZXMgYXJncGFyc2UKKyAgaW5zdGVhZCBvZiBvcHRwYXJzZS4KKworLSBJc3N1ZSAjMjU1MTA6IGZpbGVpbnB1dC5GaWxlSW5wdXQucmVhZGxpbmUoKSBub3cgcmV0dXJucyBiJycgaW5zdGVhZCBvZiAnJworICBhdCB0aGUgZW5kIGlmIHRoZSBGaWxlSW5wdXQgd2FzIG9wZW5lZCB3aXRoIGJpbmFyeSBtb2RlLgorICBQYXRjaCBieSBSeW9zdWtlIEl0by4KKworLSBJc3N1ZSAjMjU1MDM6IEZpeGVkIGluc3BlY3QuZ2V0ZG9jKCkgZm9yIGluaGVyaXRlZCBkb2NzdHJpbmdzIG9mIHByb3BlcnRpZXMuCisgIE9yaWdpbmFsIHBhdGNoIGJ5IEpvaG4gTWFyayBWYW5kZW5iZXJnLgorCistIElzc3VlICMyNTUxNTogQWx3YXlzIHVzZSBvcy51cmFuZG9tIGFzIGEgc291cmNlIG9mIHJhbmRvbW5lc3MgaW4gdXVpZC51dWlkNC4KKworLSBJc3N1ZSAjMjE4Mjc6IEZpeGVkIHRleHR3cmFwLmRlZGVudCgpIGZvciB0aGUgY2FzZSB3aGVuIGxhcmdlc3QgY29tbW9uCisgIHdoaXRlc3BhY2UgaXMgYSBzdWJzdHJpbmcgb2Ygc21hbGxlc3QgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBCYXNlZCBvbiBwYXRjaCBieSBSb2JlcnQgTGkuCisKKy0gSXNzdWUgIzI1NDQ3OiBUaGUgbHJ1X2NhY2hlKCkgd3JhcHBlciBvYmplY3RzIG5vdyBjYW4gYmUgY29waWVkIGFuZCBwaWNrbGVkCisgIChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIG9iamVjdCB1bmNoYW5nZWQpLgorCistIElzc3VlICMyNTM5MDogdHlwaW5nOiBEb24ndCBjcmFzaCBvbiBVbmlvbltzdHIsIFBhdHRlcm5dLgorCistIElzc3VlICMyNTQ0MTogYXN5bmNpbzogUmFpc2UgZXJyb3IgZnJvbSBkcmFpbigpIHdoZW4gc29ja2V0IGlzIGNsb3NlZC4KKworLSBJc3N1ZSAjMjU0MTA6IENsZWFuZWQgdXAgYW5kIGZpeGVkIG1pbm9yIGJ1Z3MgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZgorICBPcmRlcmVkRGljdC4KKworLSBJc3N1ZSAjMjU0MTE6IEltcHJvdmVkIFVuaWNvZGUgc3VwcG9ydCBpbiBTTVRQSGFuZGxlciB0aHJvdWdoIGJldHRlciB1c2Ugb2YKKyAgdGhlIGVtYWlsIHBhY2thZ2UuIFRoYW5rcyB0byB1c2VyIHNpbW9uMDQgZm9yIHRoZSBwYXRjaC4KKworLSBNb3ZlIHRoZSBpbXAgbW9kdWxlIGZyb20gYSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4KKworLSBJc3N1ZSAjMjU0MDc6IFJlbW92ZSBtZW50aW9ucyBvZiB0aGUgZm9ybWF0dGVyIG1vZHVsZSBiZWluZyByZW1vdmVkIGluCisgIFB5dGhvbiAzLjYuCisKKy0gSXNzdWUgIzI1NDA2OiBGaXhlZCBhIGJ1ZyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0Lm1vdmVfdG9fZW5kKCkKKyAgdGhhdCBjYXVzZWQgc2VnbWVudGF0aW9uIGZhdWx0IG9yIGhhbmcgaW4gaXRlcmF0aW5nIGFmdGVyIG1vdmluZyBzZXZlcmFsCisgIGl0ZW1zIHRvIHRoZSBzdGFydCBvZiBvcmRlcmVkIGRpY3QuCisKKy0gSXNzdWUgIzI1MzgyOiBwaWNrbGV0b29scy5kaXMoKSBub3cgb3V0cHV0cyBpbXBsaWNpdCBtZW1vIGluZGV4IGZvciB0aGUKKyAgTUVNT0laRSBvcGNvZGUuCisKKy0gSXNzdWUgIzI1MzU3OiBBZGQgYW4gb3B0aW9uYWwgbmV3bGluZSBwYXJhbWVyIHRvIGJpbmFzY2lpLmIyYV9iYXNlNjQoKS4KKyAgYmFzZTY0LmI2NGVuY29kZSgpIHVzZXMgaXQgdG8gYXZvaWQgYSBtZW1vcnkgY29weS4KKworLSBJc3N1ZSAjMjQxNjQ6IE9iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cywKKyAgY2FuIG5vdyBiZSBwaWNrbGVkIHVzaW5nIHBpY2tsZSBwcm90b2NvbHMgb2xkZXIgdGhhbiBwcm90b2NvbCB2ZXJzaW9uIDQuCisKKy0gSXNzdWUgIzI1MzY0OiB6aXBmaWxlIG5vdyB3b3JrcyBpbiB0aHJlYWRzIGRpc2FibGVkIGJ1aWxkcy4KKworLSBJc3N1ZSAjMjUzMjg6IHNtdHBkJ3MgU01UUENoYW5uZWwgbm93IGNvcnJlY3RseSByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGJvdGgKKyAgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBhcmUgc2V0IHRvIHRydWUuCisKKy0gSXNzdWUgIzE2MDk5OiBSb2JvdEZpbGVQYXJzZXIgbm93IHN1cHBvcnRzIENyYXdsLWRlbGF5IGFuZCBSZXF1ZXN0LXJhdGUKKyAgZXh0ZW5zaW9ucy4gIFBhdGNoIGJ5IE5pa29sYXkgQm9nb3ljaGV2LgorCistIElzc3VlICMyNTMxNjogZGlzdHV0aWxzIHJhaXNlcyBPU0Vycm9yIGluc3RlYWQgb2YgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorICB3aGVuIE1TVkMgaXMgbm90IGluc3RhbGxlZC4KKworLSBJc3N1ZSAjMjUzODA6IEZpeGVkIHByb3RvY29sIGZvciB0aGUgU1RBQ0tfR0xPQkFMIG9wY29kZSBpbgorICBwaWNrbGV0b29scy5vcGNvZGVzLgorCistIElzc3VlICMyMzk3MjogVXBkYXRlcyBhc3luY2lvIGRhdGFncmFtIGNyZWF0ZSBtZXRob2QgYWxsb3dpbmcgcmV1c2Vwb3J0CisgIGFuZCByZXVzZWFkZHIgc29ja2V0IG9wdGlvbnMgdG8gYmUgc2V0IHByaW9yIHRvIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgTWlycm9yaW5nIHRoZSBleGlzdGluZyBhc3luY2lvIGNyZWF0ZV9zZXJ2ZXIgbWV0aG9kIHRoZSByZXVzZWFkZHIgb3B0aW9uCisgIGZvciBkYXRhZ3JhbSBzb2NrZXRzIGRlZmF1bHRzIHRvIFRydWUgaWYgdGhlIE8vUyBpcyAncG9zaXgnIChleGNlcHQgaWYgdGhlCisgIHBsYXRmb3JtIGlzIEN5Z3dpbikuIFBhdGNoIGJ5IENocmlzIExhd3MuCisKKy0gSXNzdWUgIzI1MzA0OiBBZGQgYXN5bmNpby5ydW5fY29yb3V0aW5lX3RocmVhZHNhZmUoKS4gIFRoaXMgbGV0cyB5b3UKKyAgc3VibWl0IGEgY29yb3V0aW5lIHRvIGEgbG9vcCBmcm9tIGFub3RoZXIgdGhyZWFkLCByZXR1cm5pbmcgYQorICBjb25jdXJyZW50LmZ1dHVyZXMuRnV0dXJlLiAgQnkgVmluY2VudCBNaWNoZWwuCisKKy0gSXNzdWUgIzI1MjMyOiBGaXggQ0dJUmVxdWVzdEhhbmRsZXIgdG8gc3BsaXQgdGhlIHF1ZXJ5IGZyb20gdGhlIFVSTCBhdCB0aGUKKyAgZmlyc3QgcXVlc3Rpb24gbWFyayAoPykgcmF0aGVyIHRoYW4gdGhlIGxhc3QuIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI0NjU3OiBQcmV2ZW50IENHSVJlcXVlc3RIYW5kbGVyIGZyb20gY29sbGFwc2luZyBzbGFzaGVzIGluIHRoZQorICBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwgYXMgaWYgaXQgd2VyZSBhIHBhdGguIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI1Mjg3OiBEb24ndCBhZGQgY3J5cHQuTUVUSE9EX0NSWVBUIHRvIGNyeXB0Lm1ldGhvZHMgaWYgaXQncyBub3QKKyAgc3VwcG9ydGVkLiBDaGVjayBpZiBpdCBpcyBzdXBwb3J0ZWQsIGl0IG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIE9wZW5CU0QgZm9yCisgIGV4YW1wbGUuCisKKy0gSXNzdWUgIzIzNjAwOiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby5mcm9tdXRjKCkgd2FzIHJldHVybmluZworICB3cm9uZyByZXN1bHRzIGluIHNvbWUgY2FzZXMuCisKKy0gSXNzdWUgIzI1MjAzOiBGYWlsZWQgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcl9kZWxpbXMoKSBubyBsb25nZXIgbGVmdCB0aGUKKyAgbW9kdWxlIGluIGluY29uc2lzdGVudCBzdGF0ZS4KKworLSBJc3N1ZSAjMjUwMTE6IHJsY29tcGxldGVyIG5vdyBvbWl0cyBwcml2YXRlIGFuZCBzcGVjaWFsIGF0dHJpYnV0ZSBuYW1lcyB1bmxlc3MKKyAgdGhlIHByZWZpeCBzdGFydHMgd2l0aCB1bmRlcnNjb3Jlcy4KKworLSBJc3N1ZSAjMjUyMDk6IHJsY29tcGxldGVyIG5vdyBjYW4gYWRkIGEgc3BhY2Ugb3IgYSBjb2xvbiBhZnRlciBjb21wbGV0ZWQga2V5d29yZC4KKworLSBJc3N1ZSAjMjIyNDE6IHRpbWV6b25lLnV0YyBuYW1lIGlzIG5vdyBwbGFpbiAnVVRDJywgbm90ICdVVEMtMDA6MDAnLgorCistIElzc3VlICMyMzUxNzogZnJvbXRpbWVzdGFtcCgpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgbWV0aG9kcyBvZgorICBkYXRldGltZS5kYXRldGltZSBub3cgcm91bmQgbWljcm9zZWNvbmRzIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvCisgIG5lYXJlc3QgZXZlbiBpbnRlZ2VyIChST1VORF9IQUxGX0VWRU4pLCBhcyByb3VuZChmbG9hdCksIGluc3RlYWQgb2Ygcm91bmRpbmcKKyAgdG93YXJkcyAtSW5maW5pdHkgKFJPVU5EX0ZMT09SKS4KKworLSBJc3N1ZSAjMjM1NTI6IFRpbWVpdCBub3cgd2FybnMgd2hlbiB0aGVyZSBpcyBzdWJzdGFudGlhbCAoNHgpIHZhcmlhbmNlCisgIGJldHdlZW4gYmVzdCBhbmQgd29yc3QgdGltZXMuIFBhdGNoIGZyb20gU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ2MzM6IHNpdGUtcGFja2FnZXMvUkVBRE1FIC0+IFJFQURNRS50eHQuCisKKy0gSXNzdWUgIzI0ODc5OiBoZWxwKCkgYW5kIHB5ZG9jIGNhbiBub3cgbGlzdCBuYW1lZCB0dXBsZSBmaWVsZHMgaW4gdGhlCisgIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5LiAgVGhlIG9yZGVyaW5nIGlzCisgIGRldGVybWluZWQgYnkgdGhlIF9maWVsZHMgYXR0cmlidXRlIGlmIHByZXNlbnQuCisKKy0gSXNzdWUgIzI0ODc0OiBJbXByb3ZlIHNwZWVkIG9mIGl0ZXJ0b29scy5jeWNsZSgpIGFuZCBtYWtlIGl0cworICBwaWNrbGUgbW9yZSBjb21wYWN0LgorCistIEZpeCBjcmFzaCBpbiBpdGVydG9vbHMuY3ljbGUuX19zZXRzdGF0ZV9fKCkgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgd2Fzbid0CisgIGEgbGlzdC4KKworLSBJc3N1ZSAjMjAwNTk6IHVybGxpYi5wYXJzZSByYWlzZXMgVmFsdWVFcnJvciBvbiBhbGwgaW52YWxpZCBwb3J0cy4KKyAgUGF0Y2ggYnkgTWFydGluIFBhbnRlci4KKworLSBJc3N1ZSAjMjQzNjA6IEltcHJvdmUgX19yZXByX18gb2YgYXJncGFyc2UuTmFtZXNwYWNlKCkgZm9yIGludmFsaWQKKyAgaWRlbnRpZmllcnMuICBQYXRjaCBieSBNYXR0aGlhcyBCdXNzb25uaWVyLgorCistIElzc3VlICMyMzQyNjogcnVuX3NldHVwIHdhcyBicm9rZW4gaW4gZGlzdHV0aWxzLgorICBQYXRjaCBmcm9tIEFsZXhhbmRlciBCZWxvcG9sc2t5LgorCistIElzc3VlICMxMzkzODogMnRvMyBjb252ZXJ0cyBTdHJpbmdUeXBlcyB0byBhIHR1cGxlLiBQYXRjaCBmcm9tIE1hcmsgSGFtbW9uZC4KKworLSBJc3N1ZSAjMjA5MTogb3BlbigpIGFjY2VwdGVkIGEgJ1UnIG1vZGUgc3RyaW5nIGNvbnRhaW5pbmcgJysnLCBidXQgJ1UnIGNhbgorICBvbmx5IGJlIHVzZWQgd2l0aCAncicuIFBhdGNoIGZyb20gSmVmZiBCYWxvZ2ggYW5kIEpvaG4gTydDb25ub3IuCisKKy0gSXNzdWUgIzg1ODU6IGltcHJvdmVkIHRlc3RzIGZvciB6aXBpbXBvcnRlcjIuIFBhdGNoIGZyb20gTWFyayBMYXdyZW5jZS4KKworLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCisgIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCisKKy0gSXNzdWUgIzI0NDI2OiBGYXN0IHNlYXJjaGluZyBvcHRpbWl6YXRpb24gaW4gcmVndWxhciBleHByZXNzaW9ucyBub3cgd29ya3MKKyAgZm9yIHBhdHRlcm5zIHRoYXQgc3RhcnRzIHdpdGggY2FwdHVyaW5nIGdyb3Vwcy4gIEZhc3Qgc2VhcmNoaW5nIG9wdGltaXphdGlvbgorICBub3cgY2FuJ3QgYmUgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgorCistIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCisgIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCisKKy0gSXNzdWUgIzEzMjQ4OiBSZW1vdmUgZGVwcmVjYXRlZCBpbnNwZWN0LmdldG1vZHVsZWluZm8gZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI1NTc4OiBGaXggKGFub3RoZXIpIG1lbW9yeSBsZWFrIGluIFNTTFNvY2tldC5nZXRwZWVyY2VyKCkuCisKKy0gSXNzdWUgIzI1NTMwOiBEaXNhYmxlIHRoZSB2dWxuZXJhYmxlIFNTTHYzIHByb3RvY29sIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZworICBzc2wuU1NMQ29udGV4dC4KKworLSBJc3N1ZSAjMjU1Njk6IEZpeCBtZW1vcnkgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKS4KKworLSBJc3N1ZSAjMjU0NzE6IFNvY2tldHMgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKSBzaG91bGRuJ3QgYXBwZWFyIHRvIGJlCisgIG5vbmJsb2NraW5nLgorCistIElzc3VlICMyNTMxOTogV2hlbiB0aHJlYWRpbmcuRXZlbnQgaXMgcmVpbml0aWFsaXplZCwgdGhlIHVuZGVybHlpbmcgY29uZGl0aW9uCisgIHNob3VsZCB1c2UgYSByZWd1bGFyIGxvY2sgcmF0aGVyIHRoYW4gYSByZWN1cnNpdmUgbG9jay4KKwogLSBTa2lwIGdldGFkZHJpbmZvIGlmIGhvc3QgaXMgYWxyZWFkeSByZXNvbHZlZC4KICAgUGF0Y2ggYnkgQS4gSmVzc2UgSmlyeXUgRGF2aXMuCiAKQEAgLTM1OCw2ICs4MzEsMTAzIEBACiAtIElzc3VlICMyNjQwNjogQXZvaWQgdW5uZWNlc3Nhcnkgc2VyaWFsaXphdGlvbiBvZiBnZXRhZGRyaW5mbygzKSBjYWxscyBvbgogICBjdXJyZW50IHZlcnNpb25zIG9mIE9wZW5CU0QgYW5kIE5ldEJTRC4gIFBhdGNoIGJ5IEEuIEplc3NlIEppcnl1IERhdmlzLgogCitJRExFCistLS0tCisKKy0gSXNzdWUgMTUzNDg6IFN0b3AgdGhlIGRlYnVnZ2VyIGVuZ2luZSAobm9ybWFsbHkgaW4gYSB1c2VyIHByb2Nlc3MpCisgIGJlZm9yZSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aW5kb3cgKHJ1bm5pbmcgaW4gdGhlIElETEUgcHJvY2VzcykuCisgIFRoaXMgcHJldmVudHMgdGhlIFJ1bnRpbWVFcnJvcnMgdGhhdCB3ZXJlIGJlaW5nIGNhdWdodCBhbmQgaWdub3JlZC4KKworLSBJc3N1ZSAjMjQ0NTU6IFByZXZlbnQgSURMRSBmcm9tIGhhbmdpbmcgd2hlbiBhKSBjbG9zaW5nIHRoZSBzaGVsbCB3aGlsZSB0aGUKKyAgZGVidWdnZXIgaXMgYWN0aXZlICgxNTM0Nyk7IGIpIGNsb3NpbmcgdGhlIGRlYnVnZ2VyIHdpdGggdGhlIFtYXSBidXR0b24KKyAgKDE1MzQ4KTsgYW5kIGMpIGFjdGl2YXRpbmcgdGhlIGRlYnVnZ2VyIHdoZW4gYWxyZWFkeSBhY3RpdmUgKDI0NDU1KS4KKyAgVGhlIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbiBkb2VzIHRoaXMgYnkgbWFraW5nIHR3byBjaGFuZ2VzLgorICAxLiBTdXNwZW5kIGFuZCByZXN1bWUgdGhlIGd1aS5pbnRlcmFjdGlvbiBtZXRob2Qgd2l0aCB0aGUgdGNsIHZ3YWl0CisgIG1lY2hhbmlzbSBpbnRlbmRlZCBmb3IgdGhpcyBwdXJwb3NlIChpbnN0ZWFkIG9mIHJvb3QubWFpbmxvb3AgJiAucXVpdCkuCisgIDIuIEluIGd1aS5ydW4sIGFsbG93IGFueSBleGlzdGluZyBpbnRlcmFjdGlvbiB0byB0ZXJtaW5hdGUgZmlyc3QuCisKKy0gQ2hhbmdlICdUaGUgcHJvZ3JhbScgdG8gJ1lvdXIgcHJvZ3JhbScgaW4gYW4gSURMRSAna2lsbCBwcm9ncmFtPycgbWVzc2FnZQorICB0byBtYWtlIGl0IGNsZWFyZXIgdGhhdCB0aGUgcHJvZ3JhbSByZWZlcnJlZCB0byBpcyB0aGUgY3VycmVudGx5IHJ1bm5pbmcKKyAgdXNlciBwcm9ncmFtLCBub3QgSURMRSBpdHNlbGYuCisKKy0gSXNzdWUgIzI0NzUwOiBJbXByb3ZlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBJRExFIGVkaXRvciB3aW5kb3cgc3RhdHVzIGJhci4KKyAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTMxMzogQ2hhbmdlIHRoZSBoYW5kbGluZyBvZiBuZXcgYnVpbHQtaW4gdGV4dCBjb2xvciB0aGVtZXMgdG8gYmV0dGVyCisgIGFkZHJlc3MgdGhlIGNvbXBhdGliaWxpdHkgcHJvYmxlbSBpbnRyb2R1Y2VkIGJ5IHRoZSBhZGRpdGlvbiBvZiBJRExFIERhcmsuCisgIENvbnNpc3RlbnRseSB1c2UgdGhlIHJldmlzZWQgaWRsZUNvbmYuQ3VycmVudFRoZW1lIGV2ZXJ5d2hlcmUgaW4gaWRsZWxpYi4KKworLSBJc3N1ZSAjMjQ3ODI6IEV4dGVuc2lvbiBjb25maWd1cmF0aW9uIGlzIG5vdyBhIHRhYiBpbiB0aGUgSURMRSBQcmVmZXJlbmNlcworICBkaWFsb2cgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBkaWFsb2cuICBUaGUgZm9ybWVyIHRhYnMgYXJlIG5vdyBhIHNvcnRlZAorICBsaXN0LiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyMjcyNjogUmUtYWN0aXZhdGUgdGhlIGNvbmZpZyBkaWFsb2cgaGVscCBidXR0b24gd2l0aCBzb21lIGNvbnRlbnQKKyAgYWJvdXQgdGhlIG90aGVyIGJ1dHRvbnMgYW5kIHRoZSBuZXcgSURMRSBEYXJrIHRoZW1lLgorCistIElzc3VlICMyNDgyMDogSURMRSBub3cgaGFzIGFuICdJRExFIERhcmsnIGJ1aWx0LWluIHRleHQgY29sb3IgdGhlbWUuCisgIEl0IGlzIG1vcmUgb3IgbGVzcyBJRExFIENsYXNzaWMgaW52ZXJ0ZWQsIHdpdGggYSBjb2JhbHQgYmx1ZSBiYWNrZ3JvdW5kLgorICBTdHJpbmdzLCBjb21tZW50cywga2V5d29yZHMsIC4uLiBhcmUgc3RpbGwgZ3JlZW4sIHJlZCwgb3JhbmdlLCAuLi4gLgorICBUbyB1c2UgaXQgd2l0aCBJRExFcyByZWxlYXNlZCBiZWZvcmUgTm92ZW1iZXIgMjAxNSwgaGl0IHRoZQorICAnU2F2ZSBhcyBOZXcgQ3VzdG9tIFRoZW1lJyBidXR0b24gYW5kIGVudGVyIGEgbmV3IG5hbWUsCisgIHN1Y2ggYXMgJ0N1c3RvbSBEYXJrJy4gIFRoZSBjdXN0b20gdGhlbWUgd2lsbCB3b3JrIHdpdGggYW55IElETEUKKyAgcmVsZWFzZSwgYW5kIGNhbiBiZSBtb2RpZmllZC4KKworLSBJc3N1ZSAjMjUyMjQ6IFJFQURNRS50eHQgaXMgbm93IGFuIGlkbGVsaWIgaW5kZXggZm9yIElETEUgZGV2ZWxvcGVycyBhbmQKKyAgY3VyaW91cyB1c2Vycy4gIFRoZSBwcmV2aW91cyB1c2VyIGNvbnRlbnQgaXMgbm93IGluIHRoZSBJRExFIGRvYyBjaGFwdGVyLgorICAnSURMRScgbm93IG1lYW5zICdJbnRlZ3JhdGVkIERldmVsb3BtZW50IGFuZCBMZWFybmluZyBFbnZpcm9ubWVudCcuCisKKy0gSXNzdWUgIzI0ODIwOiBVc2VycyBjYW4gbm93IHNldCBicmVha3BvaW50IGNvbG9ycyBpbgorICBTZXR0aW5ncyAtPiBDdXN0b20gSGlnaGxpZ2h0aW5nLiAgT3JpZ2luYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDk3MjogSW5hY3RpdmUgc2VsZWN0aW9uIGJhY2tncm91bmQgbm93IG1hdGNoZXMgYWN0aXZlIHNlbGVjdGlvbgorICBiYWNrZ3JvdW5kLCBhcyBjb25maWd1cmVkIGJ5IHVzZXJzLCBvbiBhbGwgc3lzdGVtcy4gIEZvdW5kIGl0ZW1zIGFyZSBub3cKKyAgYWx3YXlzIGhpZ2hsaWdodGVkIG9uIFdpbmRvd3MuICBJbml0aWFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ1NzA6IElkbGU6IG1ha2UgY2FsbHRpcCBhbmQgY29tcGxldGlvbiBib3hlcyBhcHBlYXIgb24gTWFjcworICBhZmZlY3RlZCBieSBhIHRrIHJlZ3Jlc3Npb24uICBJbml0aWFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ5ODg6IElkbGUgU2Nyb2xsZWRMaXN0IGNvbnRleHQgbWVudXMgKHVzZWQgaW4gZGVidWdnZXIpCisgIG5vdyB3b3JrIG9uIE1hYyBBcXVhLiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDgwMTogTWFrZSByaWdodC1jbGljayBmb3IgY29udGV4dCBtZW51IHdvcmsgb24gTWFjIEFxdWEuCisgIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUxNzM6IEFzc29jaWF0ZSB0a2ludGVyIG1lc3NhZ2Vib3hlcyB3aXRoIGEgc3BlY2lmaWMgd2lkZ2V0LgorICBGb3IgTWFjIE9TWCwgbWFrZSB0aGVtIGEgJ3NoZWV0Jy4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUxOTg6IEVuaGFuY2UgdGhlIGluaXRpYWwgaHRtbCB2aWV3ZXIgbm93IHVzZWQgZm9yIElkbGUgSGVscC4KKyAgKiBQcm9wZXJseSBpbmRlbnQgZml4ZWQtcGl0Y2ggdGV4dCAocGF0Y2ggYnkgTWFyayBSb3NlbWFuKS4KKyAgKiBHaXZlIGNvZGUgc25pcHBldCBhIHZlcnkgU3BoaW54LWxpa2UgbGlnaHQgYmx1ZWlzaC1ncmF5IGJhY2tncm91bmQuCisgICogUmUtdXNlIGluaXRpYWwgd2lkdGggYW5kIGhlaWdodCBzZXQgYnkgdXNlcnMgZm9yIHNoZWxsIGFuZCBlZGl0b3IuCisgICogV2hlbiB0aGUgVGFibGUgb2YgQ29udGVudHMgKFRPQykgbWVudSBpcyB1c2VkLCBwdXQgdGhlIHNlY3Rpb24gaGVhZGVyCisgIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4KKworLSBJc3N1ZSAjMjUyMjU6IENvbmRlbnNlIGFuZCByZXdyaXRlIElkbGUgZG9jIHNlY3Rpb24gb24gdGV4dCBjb2xvcnMuCisKKy0gSXNzdWUgIzIxOTk1OiBFeHBsYWluIHNvbWUgZGlmZmVyZW5jZXMgYmV0d2VlbiBJRExFIGFuZCBjb25zb2xlIFB5dGhvbi4KKworLSBJc3N1ZSAjMjI4MjA6IEV4cGxhaW4gbmVlZCBmb3IgKnByaW50KiB3aGVuIHJ1bm5pbmcgZmlsZSBmcm9tIElkbGUgZWRpdG9yLgorCistIElzc3VlICMyNTIyNDogRG9jOiBhdWdtZW50IElkbGUgZmVhdHVyZSBsaXN0IGFuZCBuby1zdWJwcm9jZXNzIHNlY3Rpb24uCisKKy0gSXNzdWUgIzI1MjE5OiBVcGRhdGUgZG9jIGZvciBJZGxlIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICBTb21lIHdlcmUgbWlzc2luZyBhbmQgbm90ZXMgd2VyZSBub3QgY29ycmVjdC4KKworLSBJc3N1ZSAjMjQ4NjE6IE1vc3Qgb2YgaWRsZWxpYiBpcyBwcml2YXRlIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgVXNlIGlkbGVpYi5pZGxlLiogdG8gc3RhcnQgSWRsZS4gU2VlIGlkbGVsaWIuX19pbml0X18uX19kb2NfXy4KKworLSBJc3N1ZSAjMjUxOTk6IElkbGU6IGFkZCBzeW5jaHJvbml6YXRpb24gY29tbWVudHMgZm9yIGZ1dHVyZSBtYWludGFpbmVycy4KKworLSBJc3N1ZSAjMTY4OTM6IFJlcGxhY2UgaGVscC50eHQgd2l0aCBoZWxwLmh0bWwgZm9yIElkbGUgZG9jIGRpc3BsYXkuCisgIFRoZSBuZXcgaWRsZWxpYi9oZWxwLmh0bWwgaXMgcnN0cmlwcGVkIERvYy9idWlsZC9odG1sL2xpYnJhcnkvaWRsZS5odG1sLgorICBJdCBsb29rcyBiZXR0ZXIgdGhhbiBoZWxwLnR4dCBhbmQgd2lsbCBiZXR0ZXIgZG9jdW1lbnQgSWRsZSBhcyByZWxlYXNlZC4KKyAgVGhlIHRraW50ZXIgaHRtbCB2aWV3ZXIgdGhhdCB3b3JrcyBmb3IgdGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvc2UgUm9zZW1hbi4KKyAgVGhlIG5vdyB1bnVzZWQgRWRpdG9yV2luZG93LkhlbHBEaWFsb2cgY2xhc3MgYW5kIGhlbHQudHh0IGZpbGUgYXJlIGRlcHJlY2F0ZWQuCisKKy0gSXNzdWUgIzI0MTk5OiBEZXByZWNhdGUgdW51c2VkIGlkbGVsaWIuaWRsZXZlciB3aXRoIHBvc3NpYmxlIHJlbW92YWwgaW4gMy42LgorCistIElzc3VlICMyNDc5MDogUmVtb3ZlIGV4dHJhbmVvdXMgY29kZSAod2hpY2ggYWxzbyBjcmVhdGUgMiAmIDMgY29uZmxpY3RzKS4KKwogRG9jdW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLQogCkBAIC0zNjcsMTIgKzkzNywxNSBAQAogCiAtIElzc3VlICMyMzYwNjogQWRkcyBub3RlIHRvIGN0eXBlcyBkb2N1bWVudGF0aW9uIHJlZ2FyZGluZyBjZGxsLm1zdmNydC4KIAotLSBJc3N1ZSAjMjU1MDA6IEZpeCBkb2N1bWVudGF0aW9uIHRvIG5vdCBjbGFpbSB0aGF0IF9faW1wb3J0X18gaXMgc2VhcmNoZWQgZm9yCi0gIGluIHRoZSBnbG9iYWwgc2NvcGUuCistIElzc3VlICMyNDk1MjogQ2xhcmlmeSB0aGUgZGVmYXVsdCBzaXplIGFyZ3VtZW50IG9mIHN0YWNrX3NpemUoKSBpbgorICB0aGUgInRocmVhZGluZyIgYW5kICJfdGhyZWFkIiBtb2R1bGVzLiBQYXRjaCBmcm9tIE1hdHRpcC4KIAogVGVzdHMKIC0tLS0tCiAKKy0gSXNzdWUgIzI2Mjk1OiBXaGVuIHVzaW5nICJweXRob24zIC1tIHRlc3QgLS10ZXN0ZGlyPVRFU1RESVIiLCByZWdydGVzdAorICBkb2Vzbid0IGFkZCAidGVzdC4iIHByZWZpeCB0byB0ZXN0IG1vZHVsZSBuYW1lcy4KKwogLSBJc3N1ZSAjMjY1MjM6IFRoZSBtdWx0aXByb2Nlc3NpbmcgdGhyZWFkIHBvb2wgKG11bHRpcHJvY2Vzc2luZy5kdW1teS5Qb29sKQogICB3YXMgdW50ZXN0ZWQuCiAKQEAgLTM4MSwxMiArOTU0LDI5IEBACiAtIElzc3VlICMyNjMyNTogQWRkZWQgdGVzdC5zdXBwb3J0LmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKSB0byBjaGVjayB0aGF0CiAgIG5vIFJlc291cmNlV2FybmluZyBpcyBlbWl0dGVkLgogCi0tIElzc3VlICMyNTk0MDogQ2hhbmdlZCB0ZXN0X3NzbCB0byB1c2Ugc2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQuICBUaGlzCistIElzc3VlICMyNTk0MDogQ2hhbmdlZCB0ZXN0X3NzbCB0byB1c2UgaXRzIGludGVybmFsIGxvY2FsIHNlcnZlciBtb3JlLiAgVGhpcwogICBhdm9pZHMgcmVseWluZyBvbiBzdm4ucHl0aG9uLm9yZywgd2hpY2ggcmVjZW50bHkgY2hhbmdlZCByb290IGNlcnRpZmljYXRlLgogCiAtIElzc3VlICMyNTYxNjogVGVzdHMgZm9yIE9yZGVyZWREaWN0IGFyZSBleHRyYWN0ZWQgZnJvbSB0ZXN0X2NvbGxlY3Rpb25zCiAgIGludG8gc2VwYXJhdGUgZmlsZSB0ZXN0X29yZGVyZWRfZGljdC4KIAorLSBJc3N1ZSAjMjU0NDk6IEFkZGVkIHRlc3RzIGZvciBPcmRlcmVkRGljdCBzdWJjbGFzc2VzLgorCistIElzc3VlICMyNTE4ODogQWRkIC1QLy0tcGdvIHRvIHRlc3QucmVncnRlc3QgdG8gc3VwcHJlc3MgZXJyb3Igb3V0cHV0IHdoZW4KKyAgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgdGhlIHB1cnBvc2VzIG9mIGEgUEdPIGJ1aWxkLiBJbml0aWFsIHBhdGNoIGJ5CisgIEFsZWNzYW5kcnUgUGF0cmFzY3UuCisKKy0gSXNzdWUgIzIyODA2OiBBZGQgYGBweXRob24gLW0gdGVzdCAtLWxpc3QtdGVzdHNgYCBjb21tYW5kIHRvIGxpc3QgdGVzdHMuCisKKy0gSXNzdWUgIzE4MTc0OiBgYHB5dGhvbiAtbSB0ZXN0IC0taHVudHJsZWFrcyAuLi5gYCBub3cgYWxzbyBjaGVja3MgZm9yIGxlYWsgb2YKKyAgZmlsZSBkZXNjcmlwdG9ycy4gUGF0Y2ggd3JpdHRlbiBieSBSaWNoYXJkIE91ZGtlcmsuCisKKy0gSXNzdWUgIzI1MjYwOiBGaXggYGBweXRob24gLW0gdGVzdCAtLWNvdmVyYWdlYGAgb24gV2luZG93cy4gUmVtb3ZlIHRoZQorICBsaXN0IG9mIGlnbm9yZWQgZGlyZWN0b3JpZXMuCisKKy0gYGBQQ2J1aWxkXHJ0LmJhdGBgIG5vdyBhY2NlcHRzIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHBhc3MgYWxvbmcKKyAgdG8gcmVncnRlc3QucHkuICBQcmV2aW91c2x5IHRoZXJlIHdhcyBhIGxpbWl0IG9mIDkuCisKIC0gSXNzdWUgIzI2NTgzOiBTa2lwIHRlc3RfdGltZXN0YW1wX292ZXJmbG93IGluIHRlc3RfaW1wb3J0IGlmIGJ5dGVjb2RlCiAgIGZpbGVzIGNhbm5vdCBiZSB3cml0dGVuLgogCkBAIC00MTAsMjAgKzEwMDAsMjIgQEAKIAogLSBJc3N1ZSAjMjY0NjU6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmcuCiAKLS0gSXNzdWUgIzI0NDIxOiBDb21waWxlIE1vZHVsZXMvX21hdGguYyBvbmNlLCBiZWZvcmUgYnVpbGRpbmcgZXh0ZW5zaW9ucy4KLSAgUHJldmlvdXNseSBpdCBjb3VsZCBmYWlsIHRvIGNvbXBpbGUgcHJvcGVybHkgaWYgdGhlIG1hdGggYW5kIGNtYXRoIGJ1aWxkcwotICB3ZXJlIGNvbmN1cnJlbnQuCi0KIC0gSXNzdWUgIzI1MzQ4OiBBZGRlZCBgYC0tcGdvYGAgYW5kIGBgLS1wZ28tam9iYGAgYXJndW1lbnRzIHRvCiAgIGBgUENidWlsZFxidWlsZC5iYXRgYCBmb3IgYnVpbGRpbmcgd2l0aCBQcm9maWxlLUd1aWRlZCBPcHRpbWl6YXRpb24uICBUaGUKLSAgb2xkIGBgUENidWlsZFxidWlsZF9wZ28uYmF0YGAgc2NyaXB0IGlzIG5vdyBkZXByZWNhdGVkLCBhbmQgc2ltcGx5IGNhbGxzCi0gIGBgUENidWlsZFxidWlsZC5iYXQgLS1wZ28gJSpgYC4KKyAgb2xkIGBgUENidWlsZFxidWlsZF9wZ28uYmF0YGAgc2NyaXB0IGlzIHJlbW92ZWQuCiAKIC0gSXNzdWUgIzI1ODI3OiBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2l0aCBJQ0MgdG8gYGBjb25maWd1cmVgYCwgaW5jbHVkaW5nCiAgIGEgbmV3IGBgLS13aXRoLWljY2BgIGZsYWcuCiAKIC0gSXNzdWUgIzI1Njk2OiBGaXggaW5zdGFsbGF0aW9uIG9mIFB5dGhvbiBvbiBVTklYIHdpdGggbWFrZSAtajkuCiAKKy0gSXNzdWUgIzI0OTg2OiBJdCBpcyBub3cgcG9zc2libGUgdG8gYnVpbGQgUHl0aG9uIG9uIFdpbmRvd3Mgd2l0aG91dCBlcnJvcnMKKyAgd2hlbiBleHRlcm5hbCBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUuCisKKy0gSXNzdWUgIzI0NDIxOiBDb21waWxlIE1vZHVsZXMvX21hdGguYyBvbmNlLCBiZWZvcmUgYnVpbGRpbmcgZXh0ZW5zaW9ucy4KKyAgUHJldmlvdXNseSBpdCBjb3VsZCBmYWlsIHRvIGNvbXBpbGUgcHJvcGVybHkgaWYgdGhlIG1hdGggYW5kIGNtYXRoIGJ1aWxkcworICB3ZXJlIGNvbmN1cnJlbnQuCisKIC0gSXNzdWUgIzI2NDY1OiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKICAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yZy4KIApAQCAtNDUwLDYgKzEwNDIsOCBAQAogLSBJc3N1ZSAjMjYwNjU6IEV4Y2x1ZGVzIHZlbnYgZnJvbSBsaWJyYXJ5IHdoZW4gZ2VuZXJhdGluZyBlbWJlZGRhYmxlCiAgIGRpc3Ryby4KIAorLSBJc3N1ZSAjMjUwMjI6IFJlbW92ZWQgdmVyeSBvdXRkYXRlZCBQQy9leGFtcGxlX250LyBkaXJlY3RvcnkuCisKIFRvb2xzL0RlbW9zCiAtLS0tLS0tLS0tLQogCkBAIC00NjEsNiArMTA1NSwyMiBAQAogCiAtIElzc3VlICMyNjMxNjogRml4IHZhcmlhYmxlIG5hbWUgdHlwbyBpbiBBcmd1bWVudCBDbGluaWMuCiAKKy0gSXNzdWUgIzI1NDQwOiBGaXggb3V0cHV0IG9mIHB5dGhvbi1jb25maWcgLS1leHRlbnNpb24tc3VmZml4LgorCistIElzc3VlICMyNTE1NDogVGhlIHB5dmVudiBzY3JpcHQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YKKyAgYHB5dGhvbjMgLW0gdmVudmAuCisKK0MgQVBJCistLS0tLQorCistIElzc3VlICMyNjMxMjogU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZCBpbiBhbGwgcHJvZ3JhbW1pbmcgYnVncyB3aXRoIHVzaW5nCisgIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpLiAgUnVudGltZUVycm9yIGRpZCByYWlzZWQgYmVmb3JlIGluIHNvbWUKKyAgcHJvZ3JhbW1pbmcgYnVncy4KKworLSBJc3N1ZSAjMjYxOTg6IFZhbHVlRXJyb3IgaXMgbm93IHJhaXNlZCBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBidWZmZXIKKyAgb3ZlcmZsb3cgaW4gcGFyc2luZyAiZXMjIiBhbmQgImV0IyIgZm9ybWF0IHVuaXRzLiAgU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZAorICBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBwcm9ncmFtbWljYWwgZXJyb3IgaW4gcGFyc2luZyBmb3JtYXQgc3RyaW5nLgorCiAKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4xIGZpbmFsPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMjEwLDEyICsxODIwLDYgQEAKIAogLSBJc3N1ZSAjMjQ2MzE6IEZpeGVkIHJlZ3Jlc3Npb24gaW4gdGhlIHRpbWVpdCBtb2R1bGUgd2l0aCBtdWx0aWxpbmUgc2V0dXAuCiAKLS0gSXNzdWUgIzE4NjIyOiB1bml0dGVzdC5tb2NrLm1vY2tfb3BlbigpLnJlc2V0X21vY2sgd291bGQgcmVjdXJzZSBpbmZpbml0ZWx5LgotICBQYXRjaCBmcm9tIE5pY29sYSBQYWx1bWJvIGFuZCBMYXVyZW50IERlIEJ1eXN0LgotCi0tIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCi0gIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCi0KIC0gSXNzdWUgIzI0NjA4OiBjaHVuay5DaHVuay5yZWFkKCkgbm93IGFsd2F5cyByZXR1cm5zIGJ5dGVzLCBub3Qgc3RyLgogCiAtIElzc3VlICMxODY4NDogRml4ZWQgcmVhZGluZyBvdXQgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcmUgbW9kdWxlLgpAQCAtMTIyNiw2ICsxODMwLDkgQEAKIC0gSXNzdWUgIzE1MDE0OiBTTVRQLmF1dGgoKSBhbmQgU01UUC5sb2dpbigpIG5vdyBzdXBwb3J0IFJGQyA0OTU0J3Mgb3B0aW9uYWwKICAgaW5pdGlhbC1yZXNwb25zZSBhcmd1bWVudCB0byB0aGUgU01UUCBBVVRIIGNvbW1hbmQuCiAKKy0gSXNzdWUgIzY1NDk6IFJlbW92ZSBoeXBoZW4gZnJvbSB0dGsuU3R5bGUoKS5lbGVtZW50IG9wdGlvbnMuICBPbmx5IHJldHVybiByZXN1bHQKKyAgZnJvbSB0dGsuU3R5bGUoKS5jb25maWd1cmUgaWYgYSByZXN1bHQgd2FzIGdlbmVyYXRlZCBvciBhIHF1ZXJ5IHN1Ym1pdHRlZC4KKwogLSBJc3N1ZSAjMjQ2Njk6IEZpeCBpbnNwZWN0LmdldHNvdXJjZSgpIGZvciAnYXN5bmMgZGVmJyBmdW5jdGlvbnMuCiAgIFBhdGNoIGJ5IEthaSBHcm9uZXIuCiAKQEAgLTEyMzcsNyArMTg0NCw2IEBACiAtIElzc3VlICMyNDYwMzogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIGFuZCBPUyBYIDEwLjUgaW5zdGFsbGVyIHRvIHVzZSBPcGVuU1NMCiAgIDEuMC4yZC4KIAotCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMCBiZXRhIDM/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTEzOTgsNiArMjAwNCw5IEBACiAtIElzc3VlICMyNDI2ODogUEVQIDQ4OTogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbi4KICAgUGF0Y2ggYnkgUGV0ciBWaWt0b3Jpbi4KIAorLSBJc3N1ZSAjMjMzNTk6IE9wdGltaXplIHNldCBvYmplY3QgaW50ZXJuYWxzIGJ5IHNwZWNpYWxpemluZyB0aGUKKyAgaGFzaCB0YWJsZSBzZWFyY2ggaW50byBhIGxvb2t1cCBmdW5jdGlvbiBhbmQgYW4gaW5zZXJ0IGZ1bmN0aW9uLgorCiAtIElzc3VlICMyMzk1NTogQWRkIHB5dmVudi5jZmcgb3B0aW9uIHRvIHN1cHByZXNzIHJlZ2lzdHJ5L2Vudmlyb25tZW50CiAgIGxvb2t1cCBmb3IgZ2VuZXJhdGluZyBzeXMucGF0aCBvbiBXaW5kb3dzLgogCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRS52YWxncmluZCBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCmluZGV4IGI1YTlhMzIuLjkwOGYxMzcgMTAwNjQ0Ci0tLSBhL01pc2MvUkVBRE1FLnZhbGdyaW5kCisrKyBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCkBAIC0yLDYgKzIsOSBAQAogUHl0aG9uLiAgVmFsZ3JpbmQgaXMgdXNlZCBwZXJpb2RpY2FsbHkgYnkgUHl0aG9uIGRldmVsb3BlcnMgdG8gdHJ5CiB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBsZWFrcyBvciBpbnZhbGlkIG1lbW9yeSByZWFkcy93cml0ZXMuCiAKK1VQREFURTogUHl0aG9uIDMuNiBub3cgc3VwcG9ydHMgUFlUSE9OTUFMTE9DPW1hbGxvYyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGljaAorY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHVzYWdlIG9mIHRoZSBtYWxsb2MoKSBhbGxvY2F0b3Igb2YgdGhlIEMgbGlicmFyeS4KKwogSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBhYm91dCB0aGUgZGV0YWlscyBvZiB1c2luZyBWYWxncmluZCwgdGhlcmUKIGFyZSBzdGlsbCB0d28gdGhpbmdzIHlvdSBtdXN0IGRvIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5ncy4gIEZpcnN0LAogeW91IG11c3QgdXNlIGEgc3VwcHJlc3Npb25zIGZpbGUuICBPbmUgaXMgc3VwcGxpZWQgaW4KZGlmZiAtLWdpdCBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CmluZGV4IDMwMDQxNzQuLjRiNjczZmQgMTAwNjQ0Ci0tLSBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKKysrIGIvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dApAQCAtNjUsOSArNjUsOSBAQAogICAgIHNpbXBseSBieSB2aXJ0dWUgb2YgYmVpbmcgaW4gdGhlIGxpc3QuCiAKIGVudnZhciBQWVRIT05EVU1QUkVGUwotICAgIElmIHRoaXMgZW52dmFyIGV4aXN0cywgUHlfRmluYWxpemUoKSBhcnJhbmdlcyB0byBwcmludCBhIGxpc3Qgb2YgYWxsCisgICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBQeV9GaW5hbGl6ZUV4KCkgYXJyYW5nZXMgdG8gcHJpbnQgYSBsaXN0IG9mIGFsbAogICAgIHN0aWxsLWxpdmUgaGVhcCBvYmplY3RzLiAgVGhpcyBpcyBwcmludGVkIHR3aWNlLCBpbiBkaWZmZXJlbnQgZm9ybWF0cywKLSAgICBiZWZvcmUgYW5kIGFmdGVyIFB5X0ZpbmFsaXplIGhhcyBjbGVhbmVkIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuIGNsZWFuIHVwLiAgVGhlCisgICAgYmVmb3JlIGFuZCBhZnRlciBQeV9GaW5hbGl6ZUV4IGhhcyBjbGVhbmVkIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuIGNsZWFuIHVwLiAgVGhlCiAgICAgZmlyc3Qgb3V0cHV0IGJsb2NrIHByb2R1Y2VzIHRoZSByZXByKCkgb2YgZWFjaCBvYmplY3Qgc28gaXMgbW9yZQogICAgIGluZm9ybWF0aXZlOyBob3dldmVyLCBhIGxvdCBvZiBzdHVmZiBkZXN0aW5lZCB0byBkaWUgaXMgc3RpbGwgYWxpdmUgdGhlbi4KICAgICBUaGUgc2Vjb25kIG91dHB1dCBibG9jayBpcyBtdWNoIGhhcmRlciB0byB3b3JrIHdpdGggKHJlcHIoKSBjYW4ndCBiZSBpbnZva2VkCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogZW52dmFyIFBZVEhPTk1BTExPQ1NUQVRTCiAgICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBhIHJlcG9ydCBvZiBweW1hbGxvYyBzdW1tYXJ5IHN0YXRpc3RpY3MgaXMgcHJpbnRlZCB0bwotICAgIHN0ZGVyciB3aGVuZXZlciBhIG5ldyBhcmVuYSBpcyBhbGxvY2F0ZWQsIGFuZCBhbHNvIGJ5IFB5X0ZpbmFsaXplKCkuCisgICAgc3RkZXJyIHdoZW5ldmVyIGEgbmV3IGFyZW5hIGlzIGFsbG9jYXRlZCwgYW5kIGFsc28gYnkgUHlfRmluYWxpemVFeCgpLgogCiBDaGFuZ2VkIGluIDIuNTogIFRoZSBudW1iZXIgb2YgZXh0cmEgYnl0ZXMgYWxsb2NhdGVkIGlzIDQqc2l6ZW9mKHNpemVfdCkuCiBCZWZvcmUgaXQgd2FzIDE2IG9uIGFsbCBib3hlcywgcmVmbGVjdGluZyB0aGF0IFB5dGhvbiBjb3VsZG4ndCBtYWtlIHVzZSBvZgpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICovCiAgICAgaW50IHRwX21heGFsbG9jOwogCi1BbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gY29kZSBrZWVwcyB0aGVzZSBjb3VudHMgdXAgdG8gZGF0ZS4gIFB5X0ZpbmFsaXplKCkKK0FsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBjb2RlIGtlZXBzIHRoZXNlIGNvdW50cyB1cCB0byBkYXRlLiAgUHlfRmluYWxpemVFeCgpCiBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIGluZm8gcmV0dXJuZWQgYnkgc3lzLmdldGNvdW50cygpIChzZWUgYmVsb3cpLCBhbG9uZwogd2l0aCBhc3NvcnRlZCBvdGhlciBzcGVjaWFsIGFsbG9jYXRpb24gY291bnRzIChsaWtlIHRoZSBudW1iZXIgb2YgdHVwbGUKIGFsbG9jYXRpb25zIHNhdGlzZmllZCBieSBhIHR1cGxlIGZyZWUtbGlzdCwgdGhlIG51bWJlciBvZiAxLWNoYXJhY3RlciBzdHJpbmdzCmRpZmYgLS1naXQgYS9NaXNjL2NvdmVyaXR5X21vZGVsLmMgYi9NaXNjL2NvdmVyaXR5X21vZGVsLmMKaW5kZXggNDkzZTdjMS4uZjc3NmQ3NiAxMDA2NDQKLS0tIGEvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCisrKyBiL01pc2MvY292ZXJpdHlfbW9kZWwuYwpAQCAtOTQsNyArOTQsNyBAQAogfQogCiAvKiBQYXJzZXIvcGdlbm1haW4uYyAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSkKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgZ3JhbW1hciAqZzsKICAgICBfX2NvdmVyaXR5X3RhaW50ZWRfZGF0YV9zaW5rX18oZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwppbmRleCAwMmI1NWQxLi4yMmRkYmYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwpAQCAtMTIsNyArMTIsOCBAQAogaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CkBAIC0xMTUsNyArMTE2LDggQEAKIGludGVybmFsX2Jpc2VjdF9sZWZ0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCmluZGV4IDc1NzU3NzMuLjYxMWNhODIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCkBAIC0yMCwxMCArMjAsNiBAQAogICAgICA8ZW5jb2Rpbmc+X2RlY29kZShjaGFyX2J1ZmZlcl9vYmpbLGVycm9ycz0nc3RyaWN0J10pIC0+CiAgICAgICAgIChVbmljb2RlIG9iamVjdCwgYnl0ZXMgY29uc3VtZWQpCiAKLSAgIDxlbmNvZGluZz5fZW5jb2RlKCkgaW50ZXJmYWNlcyBhbHNvIGFjY2VwdCBub24tVW5pY29kZSBvYmplY3QgYXMKLSAgIGlucHV0LiBUaGUgb2JqZWN0cyBhcmUgdGhlbiBjb252ZXJ0ZWQgdG8gVW5pY29kZSB1c2luZwotICAgUHlVbmljb2RlX0Zyb21PYmplY3QoKSBwcmlvciB0byBhcHBseWluZyB0aGUgY29udmVyc2lvbi4KLQogICAgVGhlc2UgPGVuY29kaW5nPnMgYXJlIGF2YWlsYWJsZTogdXRmXzgsIHVuaWNvZGVfZXNjYXBlLAogICAgcmF3X3VuaWNvZGVfZXNjYXBlLCB1bmljb2RlX2ludGVybmFsLCBsYXRpbl8xLCBhc2NpaSAoNy1iaXQpLAogICAgbWJjcyAob24gd2luMzIpLgpAQCAtNzE4LDcgKzcxNCw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzdfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC03MjYsMjQgKzcyMiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzdfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE3YWNjYzQ5NmEzMmI3NTkgaW5wdXQ9ZmQ5MWE3OGYxMDNiMDQyMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE3YWNjYzQ5NmEzMmI3NTkgaW5wdXQ9ZDFhNDc1NzllNzljYmUxNV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjcoc3RyLCAwLCAwLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEY3KHN0ciwgMCwgMCwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzhfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC03NTEsMTkgKzczOCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzhfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVjODMxZDgwZTdhZWRlZGUgaW5wdXQ9MmMyMmQ0MDUzMmYwNzFmM10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVjODMxZDgwZTdhZWRlZGUgaW5wdXQ9NDJlM2JhNzNjNDM5MmVlZl0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHN0ciwgInV0Zi04IiwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qIFRoaXMgdmVyc2lvbiBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJ5dGVvcmRlciBwYXJhbWV0ZXIgb2YgdGhlCkBAIC03NzUsNyArNzUzLDcgQEAKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMTZfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICBieXRlb3JkZXI6IGludCA9IDAKICAgICAvCkBAIC03ODQsMjQgKzc2MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzE2X2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGludCBieXRlb3JkZXIpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTNhYzU4ZTk2MGE5ZWU0ZCBpbnB1dD0zOTM1YTQ4OWIyZDUzODVlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTNhYzU4ZTk2MGE5ZWU0ZCBpbnB1dD1mZjQ2NDE2YjA0ZWRiOTQ0XSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMTZfbGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC04MDksMjQgKzc3OCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzE2X2xlX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDIyYmVkYjhkYTM0ZmI2NiBpbnB1dD1iYzI3ZGYwNWQxZDIwZGZlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDIyYmVkYjhkYTM0ZmI2NiBpbnB1dD1jYjM4NTQ1NWVhOGYyZmUwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2JlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODM0LDE5ICs3OTQsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9iZV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNhYTdlZTk1MDJhY2RkNzcgaW5wdXQ9NWE2OWQ0MTEyNzYzNDYyYl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNhYTdlZTk1MDJhY2RkNzcgaW5wdXQ9OTExOTk5NzA2NmJkYWVmZF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCArMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCArMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBieXRlb3JkZXIgcGFyYW1ldGVyIG9mIHRoZQpAQCAtODU4LDcgKzgwOSw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzMyX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgYnl0ZW9yZGVyOiBpbnQgPSAwCiAgICAgLwpAQCAtODY3LDI0ICs4MTgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8zMl9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgYnl0ZW9yZGVyKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlN2Q1YTAwM2IwMmJhZWQgaW5wdXQ9NDM0YTFlZmE0OTJiOGQ1OF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlN2Q1YTAwM2IwMmJhZWQgaW5wdXQ9YzVlNzdkYTgyZmJlNWMyYV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzMyX2xlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODkyLDI0ICs4MzQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8zMl9sZV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVkZGE2NDFjZDMzZGJmYzIgaW5wdXQ9ZGZhMmQ3ZGM3OGI5OTQyMl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVkZGE2NDFjZDMzZGJmYzIgaW5wdXQ9OTk5M2IyNWZlMDg3Nzg0OF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCAtMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9iZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTkxNywyNCArODUwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfYmVfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jY2NhOGI0NGQ5MWE3YzdhIGlucHV0PTQ1OTU2MTdiMTgxNjkwMDJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jY2NhOGI0NGQ5MWE3YzdhIGlucHV0PWQzZTBjY2FhMDI5MjA0MzFdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgKzEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgKzEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTk0MiwyNCArODY2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mzg5ZjIzZDJiOGY4ZDgwYiBpbnB1dD04MjczNTA2ZjE0MDc2OTEyXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mzg5ZjIzZDJiOGY4ZDgwYiBpbnB1dD02NWQ5ZWVmY2E2NWI0NTVhXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTY3LDI0ICs4ODIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3Jhd191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlYzRlMzlkNmVjMzdhNjIgaW5wdXQ9MTgxNzU1ZDVkZmFjZWYzY10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlYzRlMzlkNmVjMzdhNjIgaW5wdXQ9NWFhMzNlNGExMzMzOTFhYl0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmxhdGluXzFfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05OTIsMjQgKzg5OCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfbGF0aW5fMV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lY2YwMGViOGU0OGM4ODljIGlucHV0PWYwM2Y2ZGNmMWQ4NGJlZTRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lY2YwMGViOGU0OGM4ODljIGlucHV0PTMwYjExYzllNDlhNjUxNTBdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZyhzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MuYXNjaWlfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC0xMDE3LDI0ICs5MTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2FzY2lpX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hOWQxOGZjNmI2YjkxY2ZiIGlucHV0PWQ4N2UyNWExMGE1OTNmZWVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hOWQxOGZjNmI2YjkxY2ZiIGlucHV0PTg0M2ExZDI2OGU2ZGZhOGVdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKHN0ciwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmNoYXJtYXBfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICBtYXBwaW5nOiBvYmplY3QgPSBOVUxMCiAgICAgLwpAQCAtMTA0MywyMiArOTMxLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19jaGFybWFwX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBQeU9iamVjdCAqbWFwcGluZykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNGNhNDJiODM4NTNjNjQzIGlucHV0PTg1ZjQxNzI2NjFlOGRhZDldKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNGNhNDJiODM4NTNjNjQzIGlucHV0PTA3NTJjZGUwN2E2ZDZkMDBdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQogICAgIGlmIChtYXBwaW5nID09IFB5X05vbmUpCiAgICAgICAgIG1hcHBpbmcgPSBOVUxMOwogCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KQEAgLTEwNzgsNyArOTU3LDcgQEAKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5tYmNzX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTA4NiwyNSArOTY1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19tYmNzX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQxYTAxM2JjNjg3OThiZDcgaW5wdXQ9NjVjMDllZTFlNDIwMzI2M10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQxYTAxM2JjNjg3OThiZDcgaW5wdXQ9ZGU0NzFlMDgxNTk0NzU1M10qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCBzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCBzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmNvZGVfcGFnZV9lbmNvZGUKICAgICBjb2RlX3BhZ2U6IGludAotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTExMiwyMSArOTgyLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19jb2RlX3BhZ2VfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgaW50IGNvZGVfcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdHIsIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zYjQwNjYxOGRiZmJjZTI1IGlucHV0PWM4NTYyZWM0NjBjMmUzMDldKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zYjQwNjYxOGRiZmJjZTI1IGlucHV0PTc4NjQyMWFlNjE3ZDY4MGJdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKGNvZGVfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoY29kZV9wYWdlLCBzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAjZW5kaWYgLyogSEFWRV9NQkNTICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCAxMGZiY2ZlLi5kNTdmMWJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogMCA8PSBsZWZ0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleDsgICAgICAvKiAwIDw9IHJpZ2h0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIHNpemVfdCBzdGF0ZTsgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgaW5kaWNlcyBtb3ZlICovCi0gICAgUHlfc3NpemVfdCBtYXhsZW47CisgICAgUHlfc3NpemVfdCBtYXhsZW47ICAgICAgICAgIC8qIG1heGxlbiBpcyAtMSBmb3IgdW5ib3VuZGVkIGRlcXVlcyAqLwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKIH0gZGVxdWVvYmplY3Q7CiAKQEAgLTEwOCwyOSArMTA4LDE4IEBACiAjZGVmaW5lIENIRUNLX05PVF9FTkQobGluaykKICNlbmRpZgogCi0vKiBUbyBwcmV2ZW50IGxlbiBmcm9tIG92ZXJmbG93aW5nIFBZX1NTSVpFX1RfTUFYLCB3ZSByZWZ1c2UgdG8KLSAgIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIG5lYXJpbmcgb3ZlcmZsb3cuCi0qLwotCi0jZGVmaW5lIE1BWF9ERVFVRV9MRU4gKFBZX1NTSVpFX1RfTUFYIC0gMypCTE9DS0xFTikKLQogLyogQSBzaW1wbGUgZnJlZWxpc3Rpbmcgc2NoZW1lIGlzIHVzZWQgdG8gbWluaW1pemUgY2FsbHMgdG8gdGhlIG1lbW9yeQogICAgYWxsb2NhdG9yLiAgSXQgYWNjb21tb2RhdGVzIGNvbW1vbiB1c2UgY2FzZXMgd2hlcmUgbmV3IGJsb2NrcyBhcmUgYmVpbmcKICAgIGFkZGVkIGF0IGFib3V0IHRoZSBzYW1lIHJhdGUgYXMgb2xkIGJsb2NrcyBhcmUgYmVpbmcgZnJlZWQuCiAgKi8KIAotI2RlZmluZSBNQVhGUkVFQkxPQ0tTIDEwCisjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTYKIHN0YXRpYyBQeV9zc2l6ZV90IG51bWZyZWVibG9ja3MgPSAwOwogc3RhdGljIGJsb2NrICpmcmVlYmxvY2tzW01BWEZSRUVCTE9DS1NdOwogCiBzdGF0aWMgYmxvY2sgKgotbmV3YmxvY2soUHlfc3NpemVfdCBsZW4pIHsKK25ld2Jsb2NrKHZvaWQpIHsKICAgICBibG9jayAqYjsKLSAgICBpZiAobGVuID49IE1BWF9ERVFVRV9MRU4pIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CiAgICAgICAgIG51bWZyZWVibG9ja3MtLTsKICAgICAgICAgcmV0dXJuIGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CkBAIC0xNTQsMTIgKzE0Myw2IEBACiAgICAgfQogfQogCi0vKiBYWFggVG9kbzoKLSAgIElmIGFsaWduZWQgbWVtb3J5IGFsbG9jYXRpb25zIGJlY29tZSBhdmFpbGFibGUsIG1ha2UgdGhlCi0gICBkZXF1ZSBvYmplY3QgNjQgYnl0ZSBhbGlnbmVkIHNvIHRoYXQgYWxsIG9mIHRoZSBmaWVsZHMKLSAgIGNhbiBiZSByZXRyaWV2ZWQgb3IgdXBkYXRlZCBpbiBhIHNpbmdsZSBjYWNoZSBsaW5lLgotKi8KLQogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTE3MSw3ICsxNTQsNyBAQAogICAgIGlmIChkZXF1ZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGIgPSBuZXdibG9jaygwKTsKKyAgICBiID0gbmV3YmxvY2soKTsKICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihkZXF1ZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjA3LDcgKzE5MCw3IEBACiAgICAgUHlfU0laRShkZXF1ZSktLTsKICAgICBkZXF1ZS0+c3RhdGUrKzsKIAotICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSAtMSkgeworICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpKSB7CiAgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CiAgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC0yNzAsNDIgKzI1MywyNCBAQAogLyogVGhlIGRlcXVlJ3Mgc2l6ZSBsaW1pdCBpcyBkLm1heGxlbi4gIFRoZSBsaW1pdCBjYW4gYmUgemVybyBvciBwb3NpdGl2ZS4KICAqIElmIHRoZXJlIGlzIG5vIGxpbWl0LCB0aGVuIGQubWF4bGVuID09IC0xLgogICoKLSAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0Ci0gKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgotICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCi0gKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgorICogQWZ0ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byBhIGRlcXVlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaGFzCisgKiBncm93biBwYXN0IHRoZSBsaW1pdC4gSWYgaXQgaGFzLCB3ZSBnZXQgdGhlIHNpemUgYmFjayBkb3duIHRvIHRoZSBsaW1pdAorICogYnkgcG9wcGluZyBhbiBpdGVtIG9mZiBvZiB0aGUgb3Bwb3NpdGUgZW5kLiAgVGhlIG1ldGhvZHMgdGhhdCBjYW4KKyAqIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksIGFwcGVuZGxlZnQoKSwgZXh0ZW5kKCksIGFuZCBleHRlbmRsZWZ0KCkuCisgKgorICogVGhlIG1hY3JvIHRvIGNoZWNrIHdoZXRoZXIgYSBkZXF1ZSBuZWVkcyB0byBiZSB0cmltbWVkIHVzZXMgYSBzaW5nbGUKKyAqIHVuc2lnbmVkIHRlc3QgdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgMCA8PSBtYXhsZW4gPCBQeV9TSVpFKGRlcXVlKS4KICAqLwogCi1zdGF0aWMgdm9pZAotZGVxdWVfdHJpbV9yaWdodChkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkZXF1ZSkgPiBkZXF1ZS0+bWF4bGVuKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpydiA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KKyNkZWZpbmUgTkVFRFNfVFJJTShkZXF1ZSwgbWF4bGVuKSAoKHNpemVfdCkobWF4bGVuKSA8IChzaXplX3QpKFB5X1NJWkUoZGVxdWUpKSkKIAotc3RhdGljIHZvaWQKLWRlcXVlX3RyaW1fbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUpCitpbnQKK2RlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IG1heGxlbikKIHsKLSAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBQeV9TSVpFKGRlcXVlKSA+IGRlcXVlLT5tYXhsZW4pIHsKLSAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQotewotICAgIGRlcXVlLT5zdGF0ZSsrOwogICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKLSAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgaWYgKGIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOwogICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7CiAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOwpAQCAtMzEzLDI0ICsyNzgsMzYgQEAKICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgZGVxdWUtPnJpZ2h0aW5kZXgrKzsKICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOwotICAgIGRlcXVlX3RyaW1fbGVmdChkZXF1ZSk7CisgICAgaWYgKE5FRURTX1RSSU0oZGVxdWUsIG1heGxlbikpIHsKKyAgICAgICAgUHlPYmplY3QgKm9sZGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQoreworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICBpZiAoZGVxdWVfYXBwZW5kX2ludGVybmFsKGRlcXVlLCBpdGVtLCBkZXF1ZS0+bWF4bGVuKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kX2RvYywgIkFkZCBhbiBlbGVtZW50IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBkZXF1ZS4iKTsKIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2FwcGVuZGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKK2ludAorZGVxdWVfYXBwZW5kbGVmdF9pbnRlcm5hbChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IG1heGxlbikKIHsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKICAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSAwKSB7Ci0gICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgIGlmIChiID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYi0+cmlnaHRsaW5rID0gZGVxdWUtPmxlZnRibG9jazsKICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rKTsKICAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwpAQCAtMzM4LDM3ICszMTUsNjUgQEAKICAgICAgICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwogICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47CiAgICAgfQotICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICBQeV9TSVpFKGRlcXVlKSsrOwogICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKKyAgICBpZiAoTkVFRFNfVFJJTShkZXF1ZSwgZGVxdWUtPm1heGxlbikpIHsKKyAgICAgICAgUHlPYmplY3QgKm9sZGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfYXBwZW5kbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQoreworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICBpZiAoZGVxdWVfYXBwZW5kbGVmdF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgZGVxdWUtPm1heGxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZGxlZnRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CiAKK3N0YXRpYyBQeU9iamVjdCoKK2ZpbmFsaXplX2l0ZXJhdG9yKFB5T2JqZWN0ICppdCkKK3sKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CiAKIC8qIFJ1biBhbiBpdGVyYXRvciB0byBleGhhdXN0aW9uLiAgU2hvcnRjdXQgZm9yCiAgICB0aGUgZXh0ZW5kL2V4dGVuZGxlZnQgbWV0aG9kcyB3aGVuIG1heGxlbiA9PSAwLiAqLwogc3RhdGljIFB5T2JqZWN0KgogY29uc3VtZV9pdGVyYXRvcihQeU9iamVjdCAqaXQpCiB7CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwogICAgIFB5T2JqZWN0ICppdGVtOwogCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgfQotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9leHRlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7CiAgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlfc3NpemVfdCBtYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwogCiAgICAgLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwogICAgIGlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewpAQCAtMzgxLDYgKzM4NiwxMyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKG1heGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CisKICAgICAvKiBTcGFjZSBzYXZpbmcgaGV1cmlzdGljLiAgU3RhcnQgZmlsbGluZyBmcm9tIHRoZSBsZWZ0ICovCiAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApIHsKICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwpAQCAtMzg5LDQwICs0MDEsMTUgQEAKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAwOwogICAgIH0KIAotICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0gICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOwotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlcXVlLT5zdGF0ZSsrOwotICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7Ci0gICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKLSAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGItPmxlZnRsaW5rID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0gICAgICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKLSAgICAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgbWF4bGVuKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBQeV9TSVpFKGRlcXVlKSsrOwotICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOwotICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOwotICAgICAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOwogICAgIH0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gZmluYWxpemVfaXRlcmF0b3IoaXQpOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kX2RvYywKQEAgLTQzMiw2ICs0MTksOCBAQAogZGVxdWVfZXh0ZW5kbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeV9zc2l6ZV90IG1heGxlbiA9IGRlcXVlLT5tYXhsZW47CiAKICAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCiAgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CkBAIC00NDQsNiArNDMzLDEzIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobWF4bGVuID09IDApCisgICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKKwogICAgIC8qIFNwYWNlIHNhdmluZyBoZXVyaXN0aWMuICBTdGFydCBmaWxsaW5nIGZyb20gdGhlIHJpZ2h0ICovCiAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApIHsKICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwpAQCAtNDUyLDQwICs0NDgsMTUgQEAKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBCTE9DS0xFTiAtIDI7CiAgICAgfQogCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7Ci0KLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgZGVxdWUtPnN0YXRlKys7Ci0gICAgICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLSAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOwotICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYi0+cmlnaHRsaW5rID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7Ci0gICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLSAgICAgICAgICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlLCBpdGVtLCBtYXhsZW4pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5X1NJWkUoZGVxdWUpKys7Ci0gICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKLSAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIGRlcXVlX3RyaW1fcmlnaHQoZGVxdWUpOwogICAgIH0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gZmluYWxpemVfaXRlcmF0b3IoaXQpOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kbGVmdF9kb2MsCkBAIC01MDQsNyArNDc1LDQwIEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKmRlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKTsKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBkZXF1ZW9iamVjdCAqb2xkX2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWU7CisgICAgaWYgKFB5X1RZUEUoZGVxdWUpID09ICZkZXF1ZV90eXBlKSB7CisgICAgICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKworICAgICAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9uZXcoJmRlcXVlX3R5cGUsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAobmV3X2RlcXVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3X2RlcXVlLT5tYXhsZW4gPSBvbGRfZGVxdWUtPm1heGxlbjsKKyAgICAgICAgLyogRmFzdCBwYXRoIGZvciB0aGUgZGVxdWVfcmVwZWF0KCkgY29tbW9uIGNhc2Ugd2hlcmUgbGVuKGRlcXVlKSA9PSAxICovCisgICAgICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IG9sZF9kZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW29sZF9kZXF1ZS0+bGVmdGluZGV4XTsKKyAgICAgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKG5ld19kZXF1ZSwgaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydiA9IGRlcXVlX2V4dGVuZChuZXdfZGVxdWUsIGRlcXVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdfZGVxdWU7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2xkX2RlcXVlLT5tYXhsZW4gPCAwKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAorICAgICAgICAgICAgZGVxdWUsIG9sZF9kZXF1ZS0+bWF4bGVuLCBOVUxMKTsKK30KKworUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb25jYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqb3RoZXIpCkBAIC01MzQsMzggKzUzOCwxMDIgQEAKICAgICByZXR1cm4gbmV3X2RlcXVlOwogfQogCi1zdGF0aWMgdm9pZCBkZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpOworc3RhdGljIHZvaWQKK2RlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBibG9jayAqYjsKKyAgICBibG9jayAqcHJldmJsb2NrOworICAgIGJsb2NrICpsZWZ0YmxvY2s7CisgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXg7CisgICAgUHlfc3NpemVfdCBuLCBtOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICoqaXRlbXB0ciwgKipsaW1pdDsKKworICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCisgICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCisgICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCisgICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQorICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKKworICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCisgICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgorICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKKyAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgorICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgorICAgICovCisKKyAgICBiID0gbmV3YmxvY2soKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGdvdG8gYWx0ZXJuYXRlX21ldGhvZDsKKyAgICB9CisKKyAgICAvKiBSZW1lbWJlciB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCAqLworICAgIG4gPSBQeV9TSVpFKGRlcXVlKTsKKyAgICBsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisKKyAgICAvKiBTZXQgdGhlIGRlcXVlIHRvIGJlIGVtcHR5IHVzaW5nIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KKyAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CisgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKKyAgICBQeV9TSVpFKGRlcXVlKSA9IDA7CisgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQ0VOVEVSOworICAgIGRlcXVlLT5zdGF0ZSsrOworCisgICAgLyogTm93IHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4IGFyZSBkaXNjb25uZWN0ZWQgZnJvbQorICAgICAgIHRoZSBlbXB0eSBkZXF1ZSBhbmQgd2UgY2FuIHVzZSB0aGVtIHRvIGRlY3JlZiB0aGUgcG9pbnRlcnMuCisgICAgKi8KKyAgICBtID0gKEJMT0NLTEVOIC0gbGVmdGluZGV4ID4gbikgPyBuIDogQkxPQ0tMRU4gLSBsZWZ0aW5kZXg7CisgICAgaXRlbXB0ciA9ICZsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKKyAgICBsaW1pdCA9IGl0ZW1wdHIgKyBtOworICAgIG4gLT0gbTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoaXRlbXB0ciA9PSBsaW1pdCkgeworICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOworICAgICAgICAgICAgcHJldmJsb2NrID0gbGVmdGJsb2NrOworICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7CisgICAgICAgICAgICBtID0gKG4gPiBCTE9DS0xFTikgPyBCTE9DS0xFTiA6IG47CisgICAgICAgICAgICBpdGVtcHRyID0gbGVmdGJsb2NrLT5kYXRhOworICAgICAgICAgICAgbGltaXQgPSBpdGVtcHRyICsgbTsKKyAgICAgICAgICAgIG4gLT0gbTsKKyAgICAgICAgICAgIGZyZWVibG9jayhwcmV2YmxvY2spOworICAgICAgICB9CisgICAgICAgIGl0ZW0gPSAqKGl0ZW1wdHIrKyk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgQ0hFQ0tfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKKyAgICBmcmVlYmxvY2sobGVmdGJsb2NrKTsKKyAgICByZXR1cm47CisKKyAgYWx0ZXJuYXRlX21ldGhvZDoKKyAgICB3aGlsZSAoUHlfU0laRShkZXF1ZSkpIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KK30KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKK2RlcXVlX2NsZWFybWV0aG9kKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLSAgICBkZXF1ZW9iamVjdCAqbmV3X2RlcXVlOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBYWFggYWRkIGEgc3BlY2lhbCBjYXNlIGZvciB3aGVuIG1heGxlbiBpcyBkZWZpbmVkICovCi0gICAgaWYgKG4gPCAwKQotICAgICAgICBuID0gMDsKLSAgICBlbHNlIGlmIChuID4gMCAmJiBQeV9TSVpFKGRlcXVlKSA+IE1BWF9ERVFVRV9MRU4gLyBuKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQotICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX25ldygmZGVxdWVfdHlwZSwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7Ci0gICAgbmV3X2RlcXVlLT5tYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwotCi0gICAgZm9yICggOyBuIDsgbi0tKSB7Ci0gICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZChuZXdfZGVxdWUsIChQeU9iamVjdCAqKWRlcXVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3X2RlcXVlOworICAgIGRlcXVlX2NsZWFyKGRlcXVlKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorUHlEb2NfU1RSVkFSKGNsZWFyX2RvYywgIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuIik7CisKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pbnBsYWNlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKIHsKLSAgICBQeV9zc2l6ZV90IGksIHNpemU7CisgICAgUHlfc3NpemVfdCBpLCBtLCBzaXplOwogICAgIFB5T2JqZWN0ICpzZXE7CiAgICAgUHlPYmplY3QgKnJ2OwogCkBAIC01ODEsMjcgKzY0OSw0NyBAQAogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPiBNQVhfREVRVUVfTEVOIC8gbikgewotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICB9Ci0KICAgICBpZiAoc2l6ZSA9PSAxKSB7CiAgICAgICAgIC8qIGNvbW1vbiBjYXNlLCByZXBlYXRpbmcgYSBzaW5nbGUgZWxlbWVudCAqLwogICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07CiAKLSAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgbiA+IGRlcXVlLT5tYXhsZW4pCisgICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID49IDAgJiYgbiA+IGRlcXVlLT5tYXhsZW4pCiAgICAgICAgICAgICBuID0gZGVxdWUtPm1heGxlbjsKIAotICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IG4tMSA7IGkrKykgewotICAgICAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmQoZGVxdWUsIGl0ZW0pOwotICAgICAgICAgICAgaWYgKHJ2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCBuLTEgOyApIHsKKyAgICAgICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKKyAgICAgICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKGRlcXVlKSArPSBpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICAgICAgICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgICAgICAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0gPSBuIC0gMSAtIGk7CisgICAgICAgICAgICBpZiAobSA+IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4KQorICAgICAgICAgICAgICAgIG0gPSBCTE9DS0xFTiAtIDEgLSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICAgICAgICAgIGkgKz0gbTsKKyAgICAgICAgICAgIHdoaWxlIChtLS0pIHsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIFB5X1NJWkUoZGVxdWUpICs9IGk7CiAgICAgICAgIFB5X0lOQ1JFRihkZXF1ZSk7CiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKICAgICB9CiAKKyAgICBpZiAoKHNpemVfdClzaXplID4gUFlfU1NJWkVfVF9NQVggLyAoc2l6ZV90KW4pIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorCiAgICAgc2VxID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKICAgICBpZiAoc2VxID09IE5VTEwpCiAgICAgICAgIHJldHVybiBzZXE7CkBAIC02MTksNiArNzA3LDIwIEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQoreworICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7CisgICAgUHlPYmplY3QgKnJ2OworCisgICAgbmV3X2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWVfY29weSgoUHlPYmplY3QgKikgZGVxdWUpOworICAgIGlmIChuZXdfZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBkZXF1ZV9pbnBsYWNlX3JlcGVhdChuZXdfZGVxdWUsIG4pOworICAgIFB5X0RFQ1JFRihuZXdfZGVxdWUpOworICAgIHJldHVybiBydjsKK30KKwogLyogVGhlIHJvdGF0ZSgpIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBpcyB1c2VkIGludGVybmFsbHkKIGFzIGEgcHJpbWl0aXZlIGZvciBvdGhlciBtZXRob2RzLgogCkBAIC02NzEsNyArNzczLDcgQEAKICAgICB3aGlsZSAobiA+IDApIHsKICAgICAgICAgaWYgKGxlZnRpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKGxlbik7CisgICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfQpAQCAtNzAyLDcgKzgwNCw3IEBACiAgICAgICAgICAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CiAgICAgICAgICAgICB9IHdoaWxlICgtLW0pOwogICAgICAgICB9Ci0gICAgICAgIGlmIChyaWdodGluZGV4ID09IC0xKSB7CisgICAgICAgIGlmIChyaWdodGluZGV4IDwgMCkgewogICAgICAgICAgICAgYXNzZXJ0KGxlZnRibG9jayAhPSByaWdodGJsb2NrKTsKICAgICAgICAgICAgIGFzc2VydChiID09IE5VTEwpOwogICAgICAgICAgICAgYiA9IHJpZ2h0YmxvY2s7CkBAIC03MTUsNyArODE3LDcgQEAKICAgICB3aGlsZSAobiA8IDApIHsKICAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKGxlbik7CisgICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfQpAQCAtNzkwLDExICs4OTIsMTEgQEAKICAgICBibG9jayAqcmlnaHRibG9jayA9IGRlcXVlLT5yaWdodGJsb2NrOwogICAgIFB5X3NzaXplX3QgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IHJpZ2h0aW5kZXggPSBkZXF1ZS0+cmlnaHRpbmRleDsKLSAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKSAvIDI7Ci0gICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpID4+IDE7CiAgICAgUHlPYmplY3QgKnRtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgbisrOworICAgIHdoaWxlICgtLW4pIHsKICAgICAgICAgLyogVmFsaWRhdGUgdGhhdCBwb2ludGVycyBoYXZlbid0IG1ldCBpbiB0aGUgbWlkZGxlICovCiAgICAgICAgIGFzc2VydChsZWZ0YmxvY2sgIT0gcmlnaHRibG9jayB8fCBsZWZ0aW5kZXggPCByaWdodGluZGV4KTsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2spOwpAQCAtODE0LDcgKzkxNiw3IEBACiAKICAgICAgICAgLyogU3RlcCBiYWNrd2FyZHMgd2l0aCB0aGUgcmlnaHQgYmxvY2svaW5kZXggcGFpciAqLwogICAgICAgICByaWdodGluZGV4LS07Ci0gICAgICAgIGlmIChyaWdodGluZGV4ID09IC0xKSB7CisgICAgICAgIGlmIChyaWdodGluZGV4IDwgMCkgewogICAgICAgICAgICAgcmlnaHRibG9jayA9IHJpZ2h0YmxvY2stPmxlZnRsaW5rOwogICAgICAgICAgICAgcmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKICAgICAgICAgfQpAQCAtODMxLDIwICs5MzMsMTkgQEAKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSk7Ci0gICAgUHlfc3NpemVfdCBpOwogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKICAgICBQeU9iamVjdCAqaXRlbTsKICAgICBpbnQgY21wOwogCi0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICBuKys7CisgICAgd2hpbGUgKC0tbikgewogICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7Ci0gICAgICAgIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY291bnQgKz0gY21wOwogCiAgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC04NzEsMTIgKzk3MiwxMiBAQAogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKTsKLSAgICBQeV9zc2l6ZV90IGk7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIGludCBjbXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIG4rKzsKKyAgICB3aGlsZSAoLS1uKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoYik7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKQEAgLTkwNiwxMSArMTAwNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2luZGV4KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoZGVxdWUpOworICAgIFB5X3NzaXplX3QgaSwgbiwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKGRlcXVlKTsKICAgICBQeU9iamVjdCAqdiwgKml0ZW07CiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKKyAgICBpbnQgY21wOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsCkBAIC05MjgsMjIgKzEwMzAsMzIgQEAKICAgICB9CiAgICAgaWYgKHN0b3AgPiBQeV9TSVpFKGRlcXVlKSkKICAgICAgICAgc3RvcCA9IFB5X1NJWkUoZGVxdWUpOworICAgIGlmIChzdGFydCA+IHN0b3ApCisgICAgICAgIHN0YXJ0ID0gc3RvcDsKKyAgICBhc3NlcnQoMCA8PSBzdGFydCAmJiBzdGFydCA8PSBzdG9wICYmIHN0b3AgPD0gUHlfU0laRShkZXF1ZSkpOwogCi0gICAgZm9yIChpPTAgOyBpPHN0b3AgOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPj0gc3RhcnQpIHsKLSAgICAgICAgICAgIGludCBjbXA7Ci0gICAgICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwotICAgICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwotICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKLSAgICAgICAgICAgIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QoaSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAvKiBYWFggUmVwbGFjZSB0aGlzIGxvb3Agd2l0aCBmYXN0ZXIgY29kZSBmcm9tIGRlcXVlX2l0ZW0oKSAqLworICAgIGZvciAoaT0wIDsgaTxzdGFydCA7IGkrKykgeworICAgICAgICBpbmRleCsrOworICAgICAgICBpZiAoaW5kZXggPT0gQkxPQ0tMRU4pIHsKKyAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gc3RvcCAtIGkgKyAxOworICAgIHdoaWxlICgtLW4pIHsKKyAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKKyAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOworICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3Qoc3RvcCAtIG4pOworICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIGlmIChpbmRleCA9PSBCTE9DS0xFTikgewpAQCAtMTAzNyw4NCArMTE0OSwxMCBAQAogUHlEb2NfU1RSVkFSKHJlbW92ZV9kb2MsCiAiRC5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLiIpOwogCi1zdGF0aWMgdm9pZAotZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKQotewotICAgIGJsb2NrICpiOwotICAgIGJsb2NrICpwcmV2YmxvY2s7Ci0gICAgYmxvY2sgKmxlZnRibG9jazsKLSAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsKLSAgICBQeV9zc2l6ZV90IG47Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0KLSAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIGEgZGVxdWUsIGRlY3JlZnMgY2FuIGNhdXNlIHRoZQotICAgICAgIGRlcXVlIHRvIG11dGF0ZS4gIFRvIGF2b2lkIGZhdGFsIGNvbmZ1c2lvbiwgd2UgaGF2ZSB0byBtYWtlIHRoZQotICAgICAgIGRlcXVlIGVtcHR5IGJlZm9yZSBjbGVhcmluZyB0aGUgYmxvY2tzIGFuZCBuZXZlciByZWZlciB0bwotICAgICAgIGFueXRoaW5nIHZpYSBkZXF1ZS0+cmVmIHdoaWxlIGNsZWFyaW5nLiAgKFRoaXMgaXMgdGhlIHNhbWUKLSAgICAgICB0ZWNobmlxdWUgdXNlZCBmb3IgY2xlYXJpbmcgbGlzdHMsIHNldHMsIGFuZCBkaWN0cy4pCi0KLSAgICAgICBNYWtpbmcgdGhlIGRlcXVlIGVtcHR5IHJlcXVpcmVzIGFsbG9jYXRpbmcgYSBuZXcgZW1wdHkgYmxvY2suICBJbgotICAgICAgIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IG1lbW9yeSBpcyBmdWxsLCB3ZSBmYWxsIGJhY2sgdG8gYW4KLSAgICAgICBhbHRlcm5hdGUgbWV0aG9kIHRoYXQgZG9lc24ndCByZXF1aXJlIGEgbmV3IGJsb2NrLiAgUmVwZWF0aW5nCi0gICAgICAgcG9wcyBpbiBhIHdoaWxlLWxvb3AgaXMgc2xvd2VyLCBwb3NzaWJseSByZS1lbnRyYW50IChhbmQgYSBjbGV2ZXIKLSAgICAgICBhZHZlcnNhcnkgY291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgdGVybWluYXRlKS4KLSAgICAqLwotCi0gICAgYiA9IG5ld2Jsb2NrKDApOwotICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgZ290byBhbHRlcm5hdGVfbWV0aG9kOwotICAgIH0KLQotICAgIC8qIFJlbWVtYmVyIHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4ICovCi0gICAgbGVmdGJsb2NrID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotICAgIG4gPSBQeV9TSVpFKGRlcXVlKTsKLQotICAgIC8qIFNldCB0aGUgZGVxdWUgdG8gYmUgZW1wdHkgdXNpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLwotICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKLSAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOwotICAgIFB5X1NJWkUoZGVxdWUpID0gMDsKLSAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLSAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7Ci0gICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7Ci0gICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7Ci0gICAgZGVxdWUtPnN0YXRlKys7Ci0KLSAgICAvKiBOb3cgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggYXJlIGRpc2Nvbm5lY3RlZCBmcm9tCi0gICAgICAgdGhlIGVtcHR5IGRlcXVlIGFuZCB3ZSBjYW4gdXNlIHRoZW0gdG8gZGVjcmVmIHRoZSBwb2ludGVycy4KLSAgICAqLwotICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgaXRlbSA9IGxlZnRibG9jay0+ZGF0YVtsZWZ0aW5kZXhdOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgIGxlZnRpbmRleCsrOwotICAgICAgICBpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOICYmIG4pIHsKLSAgICAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOwotICAgICAgICAgICAgcHJldmJsb2NrID0gbGVmdGJsb2NrOwotICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7Ci0gICAgICAgICAgICBsZWZ0aW5kZXggPSAwOwotICAgICAgICAgICAgZnJlZWJsb2NrKHByZXZibG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0hFQ0tfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKLSAgICBmcmVlYmxvY2sobGVmdGJsb2NrKTsKLSAgICByZXR1cm47Ci0KLSAgYWx0ZXJuYXRlX21ldGhvZDoKLSAgICB3aGlsZSAoUHlfU0laRShkZXF1ZSkpIHsKLSAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLX0KLQogc3RhdGljIGludAogdmFsaWRfaW5kZXgoUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGxpbWl0KQogewotICAgIC8qIFRoZSBjYXN0IHRvIHNpemVfdCBsZXQgdXMgdXNlIGp1c3QgYSBzaW5nbGUgY29tcGFyaXNvbgorICAgIC8qIFRoZSBjYXN0IHRvIHNpemVfdCBsZXRzIHVzIHVzZSBqdXN0IGEgc2luZ2xlIGNvbXBhcmlzb24KICAgICAgICB0byBjaGVjayB3aGV0aGVyIGkgaXMgaW4gdGhlIHJhbmdlOiAwIDw9IGkgPCBsaW1pdCAqLwogICAgIHJldHVybiAoc2l6ZV90KSBpIDwgKHNpemVfdCkgbGltaXQ7CiB9CkBAIC0xMTQzLDE0ICsxMTgxLDE2IEBACiAgICAgICAgIGkgPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAlIEJMT0NLTEVOKTsKICAgICAgICAgaWYgKGluZGV4IDwgKFB5X1NJWkUoZGVxdWUpID4+IDEpKSB7CiAgICAgICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuID0gKFB5X3NzaXplX3QpKAogICAgICAgICAgICAgICAgICAgICAoKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkpCiAgICAgICAgICAgICAgICAgICAgIC8gQkxPQ0tMRU4gLSBuKTsKICAgICAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKICAgICAgICAgfQogICAgIH0KQEAgLTExOTQsMTQgKzEyMzQsMTYgQEAKICAgICBpID0gKFB5X3NzaXplX3QpKChzaXplX3QpIGkgJSBCTE9DS0xFTik7CiAgICAgaWYgKGluZGV4IDw9IGhhbGZsZW4pIHsKICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7Ci0gICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgIG4rKzsKKyAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbiA9IChQeV9zc2l6ZV90KSgKICAgICAgICAgICAgICAgICAoKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkpCiAgICAgICAgICAgICAgICAgLyBCTE9DS0xFTiAtIG4pOwogICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0gICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgIG4rKzsKKyAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKICAgICB9CiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMTIxMSwxNSArMTI1Myw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgZGVxdWVfY2xlYXIoZGVxdWUpOwotICAgIFB5X1JFVFVSTl9OT05FOwotfQotCi1QeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKLQogc3RhdGljIHZvaWQKIGRlcXVlX2RlYWxsb2MoZGVxdWVvYmplY3QgKmRlcXVlKQogewpAQCAtMTI0Myw2ICsxMjc2LDcgQEAKICAgICBQeU9iamVjdCAqaXRlbTsKICAgICBQeV9zc2l6ZV90IGluZGV4OwogICAgIFB5X3NzaXplX3QgaW5kZXhsbyA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleGhpZ2g7CiAKICAgICBmb3IgKGIgPSBkZXF1ZS0+bGVmdGJsb2NrOyBiICE9IGRlcXVlLT5yaWdodGJsb2NrOyBiID0gYi0+cmlnaHRsaW5rKSB7CiAgICAgICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8IEJMT0NLTEVOIDsgaW5kZXgrKykgewpAQCAtMTI1MSw3ICsxMjg1LDggQEAKICAgICAgICAgfQogICAgICAgICBpbmRleGxvID0gMDsKICAgICB9Ci0gICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDw9IGRlcXVlLT5yaWdodGluZGV4OyBpbmRleCsrKSB7CisgICAgaW5kZXhoaWdoID0gZGVxdWUtPnJpZ2h0aW5kZXg7CisgICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDw9IGluZGV4aGlnaDsgaW5kZXgrKykgewogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIFB5X1ZJU0lUKGl0ZW0pOwogICAgIH0KQEAgLTEyNTksNDUgKzEyOTQsMzMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKQotewotICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gPT0gLTEpCi0gICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk8iLCBkZXF1ZSwgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPaSIsCi0gICAgICAgICAgICBkZXF1ZSwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuLCBOVUxMKTsKLX0KLQotUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yZWR1Y2UoZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIFB5T2JqZWN0ICpkaWN0LCAqcmVzdWx0LCAqYXNsaXN0OworICAgIFB5T2JqZWN0ICpkaWN0LCAqaXQ7CiAgICAgX1B5X0lERU5USUZJRVIoX19kaWN0X18pOwogCiAgICAgZGljdCA9IF9QeU9iamVjdF9HZXRBdHRySWQoKFB5T2JqZWN0ICopZGVxdWUsICZQeUlkX19fZGljdF9fKTsKLSAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICBhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopZGVxdWUpOwotICAgIGlmIChhc2xpc3QgPT0gTlVMTCkgewotICAgICAgICBQeV9YREVDUkVGKGRpY3QpOworICAgICAgICBkaWN0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIH0KKworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcigoUHlPYmplY3QgKilkZXF1ZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKGRpY3QgPT0gTlVMTCkgewotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oTykiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbikiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBkZXF1ZS0+bWF4bGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT08pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIFB5X05vbmUsIGRpY3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBkZXF1ZS0+bWF4bGVuLCBkaWN0KTsKKworICAgIGlmIChkZXF1ZS0+bWF4bGVuIDwgMCkgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTygpTk4iLCBQeV9UWVBFKGRlcXVlKSwgZGljdCwgaXQpOwogICAgIH0KLSAgICBQeV9YREVDUkVGKGRpY3QpOwotICAgIFB5X0RFQ1JFRihhc2xpc3QpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKCgpbilOTiIsIFB5X1RZUEUoZGVxdWUpLCBkZXF1ZS0+bWF4bGVuLCBkaWN0LCBpdCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CkBAIC0xMzIwLDcgKzEzNDMsNyBAQAogICAgICAgICBQeV9SZXByTGVhdmUoZGVxdWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKKyAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID49IDApCiAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJkZXF1ZSglUiwgbWF4bGVuPSV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xpc3QsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbik7CiAgICAgZWxzZQpAQCAtMTM4MSw3ICsxNDA0LDcgQEAKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoeCk7CiAgICAgICAgIFB5X0RFQ1JFRih5KTsKLSAgICAgICAgaWYgKGIgPT0gLTEpCisgICAgICAgIGlmIChiIDwgMCkKICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAgICAgLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIG9uZSBkZXF1ZSBvciBib3RoICovCkBAIC0xNDE2LDggKzE0MzksMTQgQEAKICAgICBQeV9zc2l6ZV90IG1heGxlbiA9IC0xOwogICAgIGNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJtYXhsZW4iLCAwfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoa3dkYXJncyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlcXVlKCkiLCAwLCAyLCAmaXRlcmFibGUsICZtYXhsZW5vYmopKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIGlmIChtYXhsZW5vYmogIT0gTlVMTCAmJiBtYXhsZW5vYmogIT0gUHlfTm9uZSkgewogICAgICAgICBtYXhsZW4gPSBQeUxvbmdfQXNTc2l6ZV90KG1heGxlbm9iaik7CiAgICAgICAgIGlmIChtYXhsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTE0NDYsNyArMTQ3NSw3IEBACiAgICAgUHlfc3NpemVfdCBibG9ja3M7CiAKICAgICByZXMgPSBfUHlPYmplY3RfU0laRShQeV9UWVBFKGRlcXVlKSk7Ci0gICAgYmxvY2tzID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSArIEJMT0NLTEVOIC0gMSkgLyBCTE9DS0xFTjsKKyAgICBibG9ja3MgPSAoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgKyBCTE9DS0xFTiAtIDEpIC8gQkxPQ0tMRU47CiAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSAtIDEgPT0KICAgICAgICAgICAgKGJsb2NrcyAtIDEpICogQkxPQ0tMRU4gKyBkZXF1ZS0+cmlnaHRpbmRleCk7CiAgICAgcmVzICs9IGJsb2NrcyAqIHNpemVvZihibG9jayk7CkBAIC0xNDY1LDcgKzE0OTQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2dldF9tYXhsZW4oZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQorICAgIGlmIChkZXF1ZS0+bWF4bGVuIDwgMCkKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChkZXF1ZS0+bWF4bGVuKTsKIH0KQEAgLTE4MDYsNyArMTgzNSw3IEBACiAgICAgaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07CiAgICAgaXQtPmluZGV4LS07CiAgICAgaXQtPmNvdW50ZXItLTsKLSAgICBpZiAoaXQtPmluZGV4ID09IC0xICYmIGl0LT5jb3VudGVyID4gMCkgeworICAgIGlmIChpdC0+aW5kZXggPCAwICYmIGl0LT5jb3VudGVyID4gMCkgewogICAgICAgICBDSEVDS19OT1RfRU5EKGl0LT5iLT5sZWZ0bGluayk7CiAgICAgICAgIGl0LT5iID0gaXQtPmItPmxlZnRsaW5rOwogICAgICAgICBpdC0+aW5kZXggPSBCTE9DS0xFTiAtIDE7CkBAIC0yMjM1LDEzICsyMjY0LDEzIEBACiAKICAgICAgICAgICAgIG9sZHZhbCA9IF9QeURpY3RfR2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBoYXNoKTsKICAgICAgICAgICAgIGlmIChvbGR2YWwgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgb25lLCBoYXNoKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG9uZSwgaGFzaCkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG5ld3ZhbCA9IFB5TnVtYmVyX0FkZChvbGR2YWwsIG9uZSk7CiAgICAgICAgICAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBuZXd2YWwsIGhhc2gpID09IC0xKQorICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgbmV3dmFsLCBoYXNoKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICBQeV9DTEVBUihuZXd2YWwpOwogICAgICAgICAgICAgfQpAQCAtMjI2Nyw3ICsyMjk2LDcgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGR2YWwpOwogICAgICAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0obWFwcGluZywga2V5LCBuZXd2YWwpID09IC0xKQorICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0obWFwcGluZywga2V5LCBuZXd2YWwpIDwgMCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIFB5X0NMRUFSKG5ld3ZhbCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggMTAxZjQ0OS4uNDI4NDQ3NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTYwLDEwICs2MCwxMCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUXVvdGVTdHlsZSBzdHlsZTsKLSAgICBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CiB9IFN0eWxlRGVzYzsKIAotc3RhdGljIFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBTdHlsZURlc2MgcXVvdGVfc3R5bGVzW10gPSB7CiAgICAgeyBRVU9URV9NSU5JTUFMLCAgICAiUVVPVEVfTUlOSU1BTCIgfSwKICAgICB7IFFVT1RFX0FMTCwgICAgICAgICJRVU9URV9BTEwiIH0sCiAgICAgeyBRVU9URV9OT05OVU1FUklDLCAiUVVPVEVfTk9OTlVNRVJJQyIgfSwKQEAgLTI4Niw3ICsyODYsNyBAQAogc3RhdGljIGludAogZGlhbGVjdF9jaGVja19xdW90aW5nKGludCBxdW90aW5nKQogewotICAgIFN0eWxlRGVzYyAqcXM7CisgICAgY29uc3QgU3R5bGVEZXNjICpxczsKIAogICAgIGZvciAocXMgPSBxdW90ZV9zdHlsZXM7IHFzLT5uYW1lOyBxcysrKSB7CiAgICAgICAgIGlmICgoaW50KXFzLT5zdHlsZSA9PSBxdW90aW5nKQpAQCAtMTYzMyw3ICsxNjMzLDcgQEAKIFB5SW5pdF9fY3N2KHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKm1vZHVsZTsKLSAgICBTdHlsZURlc2MgKnN0eWxlOworICAgIGNvbnN0IFN0eWxlRGVzYyAqc3R5bGU7CiAKICAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCA5NDI2MTI4Li42YjFlNzQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgIHJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDApOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2FkZHJlc3NfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KICJDLmZyb21fYWRkcmVzcyhpbnRlZ2VyKSAtPiBDIGluc3RhbmNlXG5hY2Nlc3MgYSBDIGluc3RhbmNlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NTMsNyArNDUzLDcgQEAKICAgICByZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYnVmKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9idWZmZXJfZG9jW10gPQogIkMuZnJvbV9idWZmZXIob2JqZWN0LCBvZmZzZXQ9MCkgLT4gQyBpbnN0YW5jZVxuY3JlYXRlIGEgQyBpbnN0YW5jZSBmcm9tIGEgd3JpdGVhYmxlIGJ1ZmZlciI7CiAKIHN0YXRpYyBpbnQKQEAgLTUyNCw3ICs1MjQsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9idWZmZXJfY29weV9kb2NbXSA9CiAiQy5mcm9tX2J1ZmZlcl9jb3B5KG9iamVjdCwgb2Zmc2V0PTApIC0+IEMgaW5zdGFuY2VcbmNyZWF0ZSBhIEMgaW5zdGFuY2UgZnJvbSBhIHJlYWRhYmxlIGJ1ZmZlciI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01NjYsNyArNTY2LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBpbl9kbGxfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgaW5fZGxsX2RvY1tdID0KICJDLmluX2RsbChkbGwsIG5hbWUpIC0+IEMgaW5zdGFuY2VcbmFjY2VzcyBhIEMgaW5zdGFuY2UgaW4gYSBkbGwiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjIzLDcgKzYyMyw3IEBACiAgICAgcmV0dXJuIFB5Q0RhdGFfQXRBZGRyZXNzKHR5cGUsIGFkZHJlc3MpOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX3BhcmFtX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQogIkNvbnZlcnQgYSBQeXRob24gb2JqZWN0IGludG8gYSBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlci4iOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ4MSw3ICsxNDgxLDcgQEAKIAogKi8KIAotc3RhdGljIGNoYXIgKlNJTVBMRV9UWVBFX0NIQVJTID0gImNiQmhIaUlsTGRmdXpacVFQWE92P2ciOworc3RhdGljIGNvbnN0IGNoYXIgU0lNUExFX1RZUEVfQ0hBUlNbXSA9ICJjYkJoSGlJbExkZnV6WnFRUFhPdj9nIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfd2NoYXJfcF9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCkBAIC0yMzk5LDcgKzIzOTksNyBAQAogICAgIGNoYXIgKmNwID0gc3RyaW5nOwogICAgIHNpemVfdCBieXRlc19sZWZ0OwogCi0gICAgYXNzZXJ0KHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKICAgICBjcCArPSBzcHJpbnRmKGNwLCAiJXgiLCBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpKTsKICAgICB3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKICAgICAgICAgYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7CkBAIC0zMTk0LDcgKzMxOTQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1fZ2V0X25hbWUoUHlPYmplY3QgKm9iaiwgY2hhciAqKnBuYW1lKQorX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKipwbmFtZSkKIHsKICNpZmRlZiBNU19XSU4zMgogICAgIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgewpAQCAtMzIyMiw3ICszMjIyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGdW5jUHRyX0Zyb21EbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIGludCAoKiBhZGRyZXNzKSh2b2lkKTsKICAgICBQeU9iamVjdCAqZnR1cGxlOwogICAgIFB5T2JqZWN0ICpkbGw7CkBAIC01MTE3LDI5ICs1MTE3LDI4IEBACiAKICNpZmRlZiBNU19XSU4zMgogCi1zdGF0aWMgY2hhciBjb21lcnJvcl9kb2NbXSA9ICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNvbWVycm9yX2RvY1tdID0gIlJhaXNlZCB3aGVuIGEgQ09NIG1ldGhvZCBjYWxsIGZhaWxlZC4iOwogCiBpbnQKIGNvbWVycm9yX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBQeU9iamVjdCAqaHJlc3VsdCwgKnRleHQsICpkZXRhaWxzOwotICAgIFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqYnNlbGY7CiAgICAgUHlPYmplY3QgKmE7CiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwga3dkcykpCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTzpDT01FcnJvciIsICZocmVzdWx0LCAmdGV4dCwgJmRldGFpbHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBhID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAxLCBQeVNlcXVlbmNlX1NpemUoYXJncykpOwogICAgIGlmICghYSkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKICAgICBzdGF0dXMgPSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJhcmdzIiwgYSk7CiAgICAgUHlfREVDUkVGKGEpOwogICAgIGlmIChzdGF0dXMgPCAwKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImhyZXN1bHQiLCBocmVzdWx0KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTUxNTAsOSArNTE0OSw4IEBACiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImRldGFpbHMiLCBkZXRhaWxzKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGJzZWxmID0gKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGY7CiAgICAgUHlfSU5DUkVGKGFyZ3MpOwotICAgIFB5X1NFVFJFRihic2VsZi0+YXJncywgYXJncyk7CisgICAgUHlfU0VUUkVGKCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmFyZ3MsIGFyZ3MpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggN2NkNjE2NC4uMDBlOGU2NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtNzcsNyArNzcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotUHJpbnRFcnJvcihjaGFyICptc2csIC4uLikKK1ByaW50RXJyb3IoY29uc3QgY2hhciAqbXNnLCAuLi4pCiB7CiAgICAgY2hhciBidWZbNTEyXTsKICAgICBQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCmluZGV4IDAzYTkxMWYuLjg3MGEwZDQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCkBAIC05MjgsNyArOTI4LDcgQEAKICAqIFJhaXNlIGEgbmV3IGV4Y2VwdGlvbiAnZXhjX2NsYXNzJywgYWRkaW5nIGFkZGl0aW9uYWwgdGV4dCB0byB0aGUgb3JpZ2luYWwKICAqIGV4Y2VwdGlvbiBzdHJpbmcuCiAgKi8KLXZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pCit2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmFyZ3M7CiAgICAgUHlPYmplY3QgKnRwLCAqdiwgKnRiLCAqcywgKmNsc19zdHIsICptc2dfc3RyOwpAQCAtMTIwMSw3ICsxMjAxLDcgQEAKIAogI2lmZGVmIE1TX1dJTjMyCiAKLXN0YXRpYyBjaGFyIGZvcm1hdF9lcnJvcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmb3JtYXRfZXJyb3JfZG9jW10gPQogIkZvcm1hdEVycm9yKFtpbnRlZ2VyXSkgLT4gc3RyaW5nXG5cCiBcblwKIENvbnZlcnQgYSB3aW4zMiBlcnJvciBjb2RlIGludG8gYSBzdHJpbmcuIElmIHRoZSBlcnJvciBjb2RlIGlzIG5vdFxuXApAQCAtMTIyNSw3ICsxMjI1LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgbG9hZF9saWJyYXJ5X2RvY1tdID0KICJMb2FkTGlicmFyeShuYW1lKSAtPiBoYW5kbGVcblwKIFxuXAogTG9hZCBhbiBleGVjdXRhYmxlICh1c3VhbGx5IGEgRExMKSwgYW5kIHJldHVybiBhIGhhbmRsZSB0byBpdC5cblwKQEAgLTEyNTQsNyArMTI1NCw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGNoYXIgZnJlZV9saWJyYXJ5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyZWVfbGlicmFyeV9kb2NbXSA9CiAiRnJlZUxpYnJhcnkoaGFuZGxlKSAtPiB2b2lkXG5cCiBcblwKIEZyZWUgdGhlIGhhbmRsZSBvZiBhbiBleGVjdXRhYmxlIHByZXZpb3VzbHkgbG9hZGVkIGJ5IExvYWRMaWJyYXJ5LlxuIjsKQEAgLTEyNjksNyArMTI2OSw3IEBACiAgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLXN0YXRpYyBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weV9jb21fcG9pbnRlcl9kb2NbXSA9CiAiQ29weUNvbVBvaW50ZXIoc3JjLCBkc3QpIC0+IEhSRVNVTFQgdmFsdWVcbiI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDM5LDcgKzE0MzksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBmdW5jdGlvbnMKICAqLwotc3RhdGljIGNoYXIgc2l6ZW9mX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHNpemVvZl9kb2NbXSA9CiAic2l6ZW9mKEMgdHlwZSkgLT4gaW50ZWdlclxuIgogInNpemVvZihDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgQyBpbnN0YW5jZSI7CkBAIC0xNDYwLDcgKzE0NjAsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY2hhciBhbGlnbm1lbnRfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYWxpZ25tZW50X2RvY1tdID0KICJhbGlnbm1lbnQoQyB0eXBlKSAtPiBpbnRlZ2VyXG4iCiAiYWxpZ25tZW50KEMgaW5zdGFuY2UpIC0+IGludGVnZXJcbiIKICJSZXR1cm4gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgYSBDIGluc3RhbmNlIjsKQEAgLTE0ODMsNyArMTQ4Myw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjaGFyIGJ5cmVmX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGJ5cmVmX2RvY1tdID0KICJieXJlZihDIGluc3RhbmNlWywgb2Zmc2V0PTBdKSAtPiBieXJlZi1vYmplY3RcbiIKICJSZXR1cm4gYSBwb2ludGVyIGxvb2thbGlrZSB0byBhIEMgaW5zdGFuY2UsIG9ubHkgdXNhYmxlXG4iCiAiYXMgZnVuY3Rpb24gYXJndW1lbnQiOwpAQCAtMTUyNyw3ICsxNTI3LDcgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKIH0KIAotc3RhdGljIGNoYXIgYWRkcmVzc29mX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NvZl9kb2NbXSA9CiAiYWRkcmVzc29mKEMgaW5zdGFuY2UpIC0+IGludGVnZXJcbiIKICJSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIEMgaW5zdGFuY2UgaW50ZXJuYWwgYnVmZmVyIjsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCmluZGV4IDBkM2Y3MjQuLmIwNmJhOGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKQEAgLTMyNyw3ICszMjcsNyBAQAogUHlDRGF0YV9zZXQoUHlPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAogICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAotZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgYmFzZXNwZWMgewogICAgIENEYXRhT2JqZWN0ICpiYXNlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwppbmRleCA3NTliNzMxLi4yNmJmMDk0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYworKysgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwpAQCAtNiw3ICs2LDcgQEAKIAogLyogUmVsZWFzZSBOdW1iZXIgKi8KIAotc3RhdGljIGNoYXIgKlB5Q3Vyc2VzVmVyc2lvbiA9ICIyLjEiOworc3RhdGljIGNvbnN0IGNoYXIgUHlDdXJzZXNWZXJzaW9uW10gPSAiMi4xIjsKIAogLyogSW5jbHVkZXMgKi8KIApAQCAtNTYsNyArNTYsNyBAQAogICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKK1B5Q3Vyc2VzQ2hlY2tFUlIoaW50IGNvZGUsIGNvbnN0IGNoYXIgKmZuYW1lKQogewogICAgIGlmIChjb2RlICE9IEVSUikgewogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jIGIvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYwppbmRleCAwZTUwMDIzLi4yNjFjNGJjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKQEAgLTE4NCwxMiArMTg0LDEyIEBACiAgKiBhbmQgdGhlIG51bWJlciBvZiBkYXlzIGJlZm9yZSB0aGF0IG1vbnRoIGluIHRoZSBzYW1lIHllYXIuICBUaGVzZQogICogYXJlIGNvcnJlY3QgZm9yIG5vbi1sZWFwIHllYXJzIG9ubHkuCiAgKi8KLXN0YXRpYyBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKIH07CiAKLXN0YXRpYyBpbnQgX2RheXNfYmVmb3JlX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0gewogICAgIDAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCiAgICAgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKIH07CkBAIC04NzMsNyArODczLDcgQEAKICAqIHRoaXMgcmV0dXJucyBOVUxMLiAgRWxzZSByZXN1bHQgaXMgcmV0dXJuZWQuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKK2NhbGxfdHppbmZvX21ldGhvZChQeU9iamVjdCAqdHppbmZvLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewogICAgIFB5T2JqZWN0ICpvZmZzZXQ7CiAKQEAgLTEwMDksMTAgKzEwMDksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtYXRfY3RpbWUoUHlEYXRlVGltZV9EYXRlICpkYXRlLCBpbnQgaG91cnMsIGludCBtaW51dGVzLCBpbnQgc2Vjb25kcykKIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqRGF5TmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IERheU5hbWVzW10gPSB7CiAgICAgICAgICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iCiAgICAgfTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqTW9udGhOYW1lc1tdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgTW9udGhOYW1lc1tdID0gewogICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAogICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCiAgICAgfTsKQEAgLTEwNTcsMTAgKzEwNTcsOCBAQAogICAgIH0KICAgICAvKiBPZmZzZXQgaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgbmVnYXRpdmUgaWYgZGF5cyA8IDAgKi8KICAgICBpZiAoR0VUX1REX0RBWVMob2Zmc2V0KSA8IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBvZmZzZXQ7CiAgICAgICAgIHNpZ24gPSAnLSc7Ci0gICAgICAgIG9mZnNldCA9IGRlbHRhX25lZ2F0aXZlKChQeURhdGVUaW1lX0RlbHRhICopb2Zmc2V0KTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBQeV9TRVRSRUYob2Zmc2V0LCBkZWx0YV9uZWdhdGl2ZSgoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCkpOwogICAgICAgICBpZiAob2Zmc2V0ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMjMwNyw3ICsyMzA1LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKLXN0YXRpYyBjaGFyIGRlbHRhX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGRlbHRhX2RvY1tdID0KIFB5RG9jX1NUUigiRGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSB2YWx1ZXMuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGVsdGFfYXNfbnVtYmVyID0gewpAQCAtMjg4Niw3ICsyODg0LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgZGF0ZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRlX2RvY1tdID0KIFB5RG9jX1NUUigiZGF0ZSh5ZWFyLCBtb250aCwgZGF5KSAtLT4gZGF0ZSBvYmplY3QiKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRlX2FzX251bWJlciA9IHsKQEAgLTMwNDcsMTAgKzMwNDUsOCBAQAogICAgIGlmIChkc3QgPT0gUHlfTm9uZSkKICAgICAgICAgZ290byBJbmNvbnNpc3RlbnQ7CiAgICAgaWYgKGRlbHRhX2Jvb2woKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QpICE9IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBGYWlsOwogICAgIH0KQEAgLTMxNTUsNyArMzE1MSw3IEBACiAgICAge05VTEwsIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciB0emluZm9fZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdHppbmZvX2RvY1tdID0KIFB5RG9jX1NUUigiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGltZSB6b25lIGluZm8gb2JqZWN0cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RaSW5mb1R5cGUgPSB7CkBAIC0zMjg3LDYgKzMyODMsMTEgQEAKICAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm5hbWUpOwogICAgICAgICByZXR1cm4gc2VsZi0+bmFtZTsKICAgICB9CisgICAgaWYgKChQeU9iamVjdCAqKXNlbGYgPT0gUHlEYXRlVGltZV9UaW1lWm9uZV9VVEMgfHwKKyAgICAgICAgICAgKEdFVF9URF9EQVlTKHNlbGYtPm9mZnNldCkgPT0gMCAmJgorICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZi0+b2Zmc2V0KSA9PSAwICYmCisgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYtPm9mZnNldCkgPT0gMCkpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygiVVRDIik7CiAgICAgLyogT2Zmc2V0IGlzIG5vcm1hbGl6ZWQsIHNvIGl0IGlzIG5lZ2F0aXZlIGlmIGRheXMgPCAwICovCiAgICAgaWYgKEdFVF9URF9EQVlTKHNlbGYtPm9mZnNldCkgPCAwKSB7CiAgICAgICAgIHNpZ24gPSAnLSc7CkBAIC0zMzgyLDcgKzMzODMsNyBAQAogICAgIHtOVUxMLCBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdGltZXpvbmVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdGltZXpvbmVfZG9jW10gPQogUHlEb2NfU1RSKCJGaXhlZCBvZmZzZXQgZnJvbSBVVEMgaW1wbGVtZW50YXRpb24gb2YgdHppbmZvLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVGltZVpvbmVUeXBlID0gewpAQCAtMzYwNywyMyArMzYwOCw1NiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQordGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIGNoYXIgYnVmWzEwMF07CisgICAgY2hhciAqdGltZXNwZWMgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0aW1lc3BlYyIsIE5VTEx9OwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgc3RhdGljIGNoYXIgKnNwZWNzW11bMl0gPSB7CisgICAgICAgIHsiaG91cnMiLCAiJTAyZCJ9LAorICAgICAgICB7Im1pbnV0ZXMiLCAiJTAyZDolMDJkIn0sCisgICAgICAgIHsic2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZCJ9LAorICAgICAgICB7Im1pbGxpc2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZC4lMDNkIn0sCisgICAgICAgIHsibWljcm9zZWNvbmRzIiwgIiUwMmQ6JTAyZDolMDJkLiUwNmQifSwKKyAgICB9OworICAgIHNpemVfdCBnaXZlbl9zcGVjOwogCi0gICAgaWYgKHVzKQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTA2ZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cyk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8czppc29mb3JtYXQiLCBrZXl3b3JkcywgJnRpbWVzcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAodGltZXNwZWMgPT0gTlVMTCB8fCBzdHJjbXAodGltZXNwZWMsICJhdXRvIikgPT0gMCkgeworICAgICAgICBpZiAodXMgPT0gMCkgeworICAgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSA0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGdpdmVuX3NwZWMgPSAwOyBnaXZlbl9zcGVjIDwgUHlfQVJSQVlfTEVOR1RIKHNwZWNzKTsgZ2l2ZW5fc3BlYysrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKHRpbWVzcGVjLCBzcGVjc1tnaXZlbl9zcGVjXVswXSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnaXZlbl9zcGVjID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgICAgICAgICAgICAgICAgIHVzID0gdXMgLyAxMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnaXZlbl9zcGVjID09IFB5X0FSUkFZX0xFTkdUSChzcGVjcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIHRpbWVzcGVjIHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoc3BlY3NbZ2l2ZW5fc3BlY11bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksIFRJTUVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLCB1cyk7CisgICAgfQogCiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zODQ0LDkgKzM4NzgsMTAgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRpbWVfbWV0aG9kc1tdID0gewogCi0gICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAotICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTU1subW1tbW1tXSIKLSAgICAgICAgICAgICAgICJbK0hIOk1NXS4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsIFtISFs6TU1bOlNTWy5tbW1bdXV1XV1dXV0iCisgICAgICAgICAgICAgICAiWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJ0aW1lc3BlYyBzcGVjaWZpZXMgd2hhdCBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuXG4iKX0sCiAKICAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LApAQCAtMzg3Miw3ICszOTA3LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0aW1lX2RvY1tdID0KIFB5RG9jX1NUUigidGltZShbaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV0pIC0tPiBhIHRpbWUgb2JqZWN0XG5cCiBcblwKIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuIGluc3RhbmNlIG9mXG5cCkBAIC00MDgzLDQ0ICs0MTE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiB9CiAKLXN0YXRpYyB0aW1lX3QKLV9QeVRpbWVfRG91YmxlVG9UaW1ldChkb3VibGUgeCkKLXsKLSAgICB0aW1lX3QgcmVzdWx0OwotICAgIGRvdWJsZSBkaWZmOwotCi0gICAgcmVzdWx0ID0gKHRpbWVfdCl4OwotICAgIC8qIEhvdyBtdWNoIGluZm8gZGlkIHdlIGxvc2U/ICB0aW1lX3QgbWF5IGJlIGFuIGludGVncmFsIG9yCi0gICAgICogZmxvYXRpbmcgdHlwZSwgYW5kIHdlIGRvbid0IGtub3cgd2hpY2guICBJZiBpdCdzIGludGVncmFsLAotICAgICAqIHdlIGRvbid0IGtub3cgd2hldGhlciBDIHRydW5jYXRlcywgcm91bmRzLCByZXR1cm5zIHRoZSBmbG9vciwKLSAgICAgKiBldGMuICBJZiB3ZSBsb3N0IGEgc2Vjb25kIG9yIG1vcmUsIHRoZSBDIHJvdW5kaW5nIGlzCi0gICAgICogdW5yZWFzb25hYmxlLCBvciB0aGUgaW5wdXQganVzdCBkb2Vzbid0IGZpdCBpbiBhIHRpbWVfdDsKLSAgICAgKiBjYWxsIGl0IGFuIGVycm9yIHJlZ2FyZGxlc3MuICBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGNhc3QgdG8KLSAgICAgKiB0aW1lX3QgY2FuIGNhdXNlIGEgQyBlcnJvciB0b28sIGJ1dCBub3RoaW5nIHdlIGNhbiBkbyB0bwotICAgICAqIHdvcm0gYXJvdW5kIHRoYXQuCi0gICAgICovCi0gICAgZGlmZiA9IHggLSAoZG91YmxlKXJlc3VsdDsKLSAgICBpZiAoZGlmZiA8PSAtMS4wIHx8IGRpZmYgPj0gMS4wKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtIHRpbWVfdCIpOwotICAgICAgICByZXN1bHQgPSAodGltZV90KS0xOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBSb3VuZCBhIGRvdWJsZSB0byB0aGUgbmVhcmVzdCBsb25nLiAgfHh8IG11c3QgYmUgc21hbGwgZW5vdWdoIHRvIGZpdAotICogaW4gYSBDIGxvbmc7IHRoaXMgaXMgbm90IGNoZWNrZWQuCi0gKi8KLXN0YXRpYyBkb3VibGUKLV9QeVRpbWVfUm91bmRIYWxmRXZlbihkb3VibGUgeCkKLXsKLSAgICBkb3VibGUgcm91bmRlZCA9IHJvdW5kKHgpOwotICAgIGlmIChmYWJzKHgtcm91bmRlZCkgPT0gMC41KQotICAgICAgICAvKiBoYWxmd2F5IGNhc2U6IHJvdW5kIHRvIGV2ZW4gKi8KLSAgICAgICAgcm91bmRlZCA9IDIuMCpyb3VuZCh4LzIuMCk7Ci0gICAgcmV0dXJuIHJvdW5kZWQ7Ci19Ci0KIC8qIEludGVybmFsIGhlbHBlci4KICAqIEJ1aWxkIGRhdGV0aW1lIGZyb20gYSBQeXRob24gdGltZXN0YW1wLiAgUGFzcyBsb2NhbHRpbWUgb3IgZ210aW1lIGZvciBmLAogICogdG8gY29udHJvbCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHRpbWVzdGFtcC4gIFNpbmNlIGEgZG91YmxlIGRvZXNuJ3QKQEAgLTQxMjksMzIgKzQxMjYsMTcgQEAKICAqIHRvIGdldCB0aGF0IG11Y2ggcHJlY2lzaW9uIChlLmcuLCBDIHRpbWUoKSBpc24ndCBnb29kIGVub3VnaCkuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1kYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIGRvdWJsZSB0aW1lc3RhbXAsCitkYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIFB5T2JqZWN0ICp0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvKQogewogICAgIHRpbWVfdCB0aW1ldDsKLSAgICBkb3VibGUgZnJhY3Rpb247Ci0gICAgaW50IHVzOworICAgIGxvbmcgdXM7CiAKLSAgICB0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOwotICAgIGlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKF9QeVRpbWVfT2JqZWN0VG9UaW1ldmFsKHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWV0LCAmdXMsIF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZnJhY3Rpb24gPSB0aW1lc3RhbXAgLSAoZG91YmxlKXRpbWV0OwotICAgIHVzID0gKGludClfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZnJhY3Rpb24gKiAxZTYpOwotICAgIGlmICh1cyA8IDApIHsKLSAgICAgICAgLyogVHJ1bmNhdGlvbiB0b3dhcmRzIHplcm8gaXMgbm90IHdoYXQgd2Ugd2FudGVkCi0gICAgICAgICAgIGZvciBuZWdhdGl2ZSBudW1iZXJzIChQeXRob24ncyBtb2Qgc2VtYW50aWNzKSAqLwotICAgICAgICB0aW1ldCAtPSAxOwotICAgICAgICB1cyArPSAxMDAwMDAwOwotICAgIH0KLSAgICAvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQotICAgICAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCi0gICAgICogZm9yIHNvbWUgZmxvYXRzLiAqLwotICAgIGlmICh1cyA9PSAxMDAwMDAwKSB7Ci0gICAgICAgIHRpbWV0ICs9IDE7Ci0gICAgICAgIHVzID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOworCisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIChpbnQpdXMsIHR6aW5mbyk7CiB9CiAKIC8qIEludGVybmFsIGhlbHBlci4KQEAgLTQyMDUsMTAgKzQxODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6KTsKICAgICBpZiAoc2VsZiAhPSBOVUxMICYmIHR6ICE9IFB5X05vbmUpIHsKICAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCi0gICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTiIsIHNlbGYpOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTQyMjcsMTEgKzQyMDYsMTEgQEAKIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBQeU9iamVjdCAqc2VsZjsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OwogCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAorICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98Tzpmcm9tdGltZXN0YW1wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMsICZ0aW1lc3RhbXAsICZ0emluZm8pKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQpAQCAtNDI0MywxMCArNDIyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiAgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgewogICAgICAgICAvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLwotICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGY7Ci0KLSAgICAgICAgc2VsZiA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodHppbmZvLCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6aW5mbywgJlB5SWRfZnJvbXV0YywgIk4iLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00MjU1LDEwICs0MjMxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDp1dGNmcm9tdGltZXN0YW1wIiwgJnRpbWVzdGFtcCkpCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQogICAgICAgICByZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDQ2OSw5ICs0NDQ1LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgICAgICAgaWYgKG9mZmRpZmYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZikpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvZmZkaWZmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUzNiwyNSArNDUxMCw1NSBAQAogZGF0ZXRpbWVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgaW50IHNlcCA9ICdUJzsKLSAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsic2VwIiwgTlVMTH07CisgICAgY2hhciAqdGltZXNwZWMgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJzZXAiLCAidGltZXNwZWMiLCBOVUxMfTsKICAgICBjaGFyIGJ1ZmZlclsxMDBdOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgaW50IHVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgc3RhdGljIGNoYXIgKnNwZWNzW11bMl0gPSB7CisgICAgICAgIHsiaG91cnMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQifSwKKyAgICAgICAgeyJtaW51dGVzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQifSwKKyAgICAgICAgeyJzZWNvbmRzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZCJ9LAorICAgICAgICB7Im1pbGxpc2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQuJTAzZCJ9LAorICAgICAgICB7Im1pY3Jvc2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQuJTA2ZCJ9LAorICAgIH07CisgICAgc2l6ZV90IGdpdmVuX3NwZWM7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxDOmlzb2Zvcm1hdCIsIGtleXdvcmRzLCAmc2VwKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxDczppc29mb3JtYXQiLCBrZXl3b3JkcywgJnNlcCwgJnRpbWVzcGVjKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHVzKQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwNmQiLAorCisgICAgaWYgKHRpbWVzcGVjID09IE5VTEwgfHwgc3RyY21wKHRpbWVzcGVjLCAiYXV0byIpID09IDApIHsKKyAgICAgICAgaWYgKHVzID09IDApIHsKKyAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChnaXZlbl9zcGVjID0gMDsgZ2l2ZW5fc3BlYyA8IFB5X0FSUkFZX0xFTkdUSChzcGVjcyk7IGdpdmVuX3NwZWMrKykgeworICAgICAgICAgICAgaWYgKHN0cmNtcCh0aW1lc3BlYywgc3BlY3NbZ2l2ZW5fc3BlY11bMF0pID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2l2ZW5fc3BlYyA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIHVzID0gdXMgLyAxMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnaXZlbl9zcGVjID09IFB5X0FSUkFZX0xFTkdUSChzcGVjcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIHRpbWVzcGVjIHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoc3BlY3NbZ2l2ZW5fc3BlY11bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksIChpbnQpc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwgdXMpOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksIChpbnQpc2VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgfQogCiAgICAgaWYgKCFyZXN1bHQgfHwgIUhBU1RaSU5GTyhzZWxmKSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ3NjYsNyArNDc3MCw3IEBACiAgICAgaWYgKHNlY29uZHMgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBQeV9ERUNSRUYoZGVsdGEpOwotICAgIHRpbWVzdGFtcCA9IFB5TG9uZ19Bc0xvbmcoc2Vjb25kcyk7CisgICAgdGltZXN0YW1wID0gX1B5TG9uZ19Bc1RpbWVfdChzZWNvbmRzKTsKICAgICBQeV9ERUNSRUYoc2Vjb25kcyk7CiAgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUwOTMsOSArNTA5NywxMiBAQAogCiAgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9pc29mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiW3NlcF0gLT4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgIgotICAgICAgICAgICAgICAgIllZWVktTU0tRERUSEg6TU06U1NbLm1tbW1tbV1bK0hIOk1NXS5cblxuIgorICAgICAgICAgICAgICAgIllZWVktTU0tRERUW0hIWzpNTVs6U1NbLm1tbVt1dXVdXV1dXVsrSEg6TU1dLlxuIgogICAgICAgICAgICAgICAgInNlcCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSB5ZWFyIGZyb20gdGhlIHRpbWUsIGFuZCAiCi0gICAgICAgICAgICAgICAiZGVmYXVsdHMgdG8gJ1QnLiIpfSwKKyAgICAgICAgICAgICAgICJkZWZhdWx0cyB0byAnVCcuXG4iCisgICAgICAgICAgICAgICAidGltZXNwZWMgc3BlY2lmaWVzIHdoYXQgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlIgorICAgICAgICAgICAgICAgIiAoYWxsb3dlZCB2YWx1ZXMgYXJlICdhdXRvJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsIgorICAgICAgICAgICAgICAgIiAnbWlsbGlzZWNvbmRzJywgYW5kICdtaWNyb3NlY29uZHMnKS5cbiIpfSwKIAogICAgIHsidXRjb2Zmc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y29mZnNldCwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCkBAIC01MTE4LDcgKzUxMjUsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBkYXRldGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRldGltZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXlbLCBob3VyWywgbWludXRlWywgc2Vjb25kWywgbWljcm9zZWNvbmRbLHR6aW5mb11dXV1dKVxuXAogXG5cCiBUaGUgeWVhciwgbW9udGggYW5kIGRheSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuXG5cCkBAIC01MzgyLDE5ICs1Mzg5LDE5IEBACiAgICAgLyogQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tCiAgICAgICogcGFzdGluZyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0WSA9PSA0ICogMzY1ICsgMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJNFkgPT0gNCAqIDM2NSArIDEpOwogICAgIGFzc2VydChESTRZID09IGRheXNfYmVmb3JlX3llYXIoNCsxKSk7CiAKICAgICAvKiBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkCiAgICAgICogZ2V0IGZyb20gcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKICAgICBhc3NlcnQoREk0MDBZID09IGRheXNfYmVmb3JlX3llYXIoNDAwKzEpKTsKIAogICAgIC8qIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb20KICAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOwogICAgIGFzc2VydChESTEwMFkgPT0gZGF5c19iZWZvcmVfeWVhcigxMDArMSkpOwogCiAgICAgb25lID0gUHlMb25nX0Zyb21Mb25nKDEpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwppbmRleCAwMjg5OWU0Li41ZTdlYzFhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwpAQCAtMTQsMTYgKzE0LDE2IEBACiAgKi8KICNpZiBkZWZpbmVkKEhBVkVfTkRCTV9IKQogI2luY2x1ZGUgPG5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLwogI2VsaWYgZGVmaW5lZChIQVZFX0dEQk1fTkRCTV9IKQogI2luY2x1ZGUgPGdkYm0vbmRibS5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJHTlUgZ2RibSI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJHTlUgZ2RibSI7CiAjZWxpZiBkZWZpbmVkKEhBVkVfR0RCTV9EQVNIX05EQk1fSCkKICNpbmNsdWRlIDxnZGJtLW5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOwogI2VsaWYgZGVmaW5lZChIQVZFX0JFUktEQl9IKQogI2luY2x1ZGUgPGRiLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkJlcmtlbGV5IERCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkJlcmtlbGV5IERCIjsKICNlbHNlCiAjZXJyb3IgIk5vIG5kYm0uaCBhdmFpbGFibGUhIgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMgYi9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKaW5kZXggMTEyYjQ0Zi4uM2MyYWQ4NSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYwpAQCAtMzM4MCw2ICszMzgwLDEwNiBAQAogICAgIHJldHVybiAoUHlPYmplY3QgKikgcHlsb25nOwogfQogCisvKiBDb252ZXJ0IGEgRGVjaW1hbCB0byBpdHMgZXhhY3QgaW50ZWdlciByYXRpbyByZXByZXNlbnRhdGlvbi4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitkZWNfYXNfaW50ZWdlcl9yYXRpbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MgVU5VU0VEKQoreworICAgIFB5T2JqZWN0ICpudW1lcmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkZW5vbWluYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmV4cG9uZW50ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdG1wOworICAgIG1wZF9zc2l6ZV90IGV4cDsKKyAgICBQeU9iamVjdCAqY29udGV4dDsKKyAgICB1aW50MzJfdCBzdGF0dXMgPSAwOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOworCisgICAgaWYgKG1wZF9pc3NwZWNpYWwoTVBEKHNlbGYpKSkgeworICAgICAgICBpZiAobXBkX2lzbmFuKE1QRChzZWxmKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBDVVJSRU5UX0NPTlRFWFQoY29udGV4dCk7CisKKyAgICB0bXAgPSBkZWNfYWxsb2MoKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFtcGRfcWNvcHkoTVBEKHRtcCksIE1QRChzZWxmKSwgJnN0YXR1cykpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGV4cCA9IG1wZF9pc3plcm8oTVBEKHRtcCkpID8gMCA6IE1QRCh0bXApLT5leHA7CisgICAgTVBEKHRtcCktPmV4cCA9IDA7CisKKyAgICAvKiBjb250ZXh0IGFuZCByb3VuZGluZyBhcmUgdW51c2VkIGhlcmU6IHRoZSBjb252ZXJzaW9uIGlzIGV4YWN0ICovCisgICAgbnVtZXJhdG9yID0gZGVjX2FzX2xvbmcodG1wLCBjb250ZXh0LCBNUERfUk9VTkRfRkxPT1IpOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGV4cG9uZW50ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGV4cCA8IDAgPyAtZXhwIDogZXhwKTsKKyAgICBpZiAoZXhwb25lbnQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHRtcCA9IFB5TG9uZ19Gcm9tTG9uZygxMCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgUHlfU0VUUkVGKGV4cG9uZW50LCBsb25nX21ldGhvZHMtPm5iX3Bvd2VyKHRtcCwgZXhwb25lbnQsIFB5X05vbmUpKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBpZiAoZXhwb25lbnQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChleHAgPj0gMCkgeworICAgICAgICBQeV9TRVRSRUYobnVtZXJhdG9yLCBsb25nX21ldGhvZHMtPm5iX211bHRpcGx5KG51bWVyYXRvciwgZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGRlbm9taW5hdG9yID0gUHlMb25nX0Zyb21Mb25nKDEpOworICAgICAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGVub21pbmF0b3IgPSBleHBvbmVudDsKKyAgICAgICAgZXhwb25lbnQgPSBOVUxMOworICAgICAgICB0bXAgPSBfUHlMb25nX0dDRChudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsIGxvbmdfbWV0aG9kcy0+bmJfZmxvb3JfZGl2aWRlKG51bWVyYXRvciwgdG1wKSk7CisgICAgICAgIFB5X1NFVFJFRihkZW5vbWluYXRvciwgbG9uZ19tZXRob2RzLT5uYl9mbG9vcl9kaXZpZGUoZGVub21pbmF0b3IsIHRtcCkpOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMIHx8IGRlbm9taW5hdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihleHBvbmVudCk7CisgICAgUHlfWERFQ1JFRihkZW5vbWluYXRvcik7CisgICAgUHlfWERFQ1JFRihudW1lcmF0b3IpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKIHN0YXRpYyBQeU9iamVjdCAqCiBQeURlY19Ub0ludGVncmFsVmFsdWUoUHlPYmplY3QgKmRlYywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewpAQCAtNDY4OCw2ICs0Nzg4LDcgQEAKICAgLyogTWlzY2VsbGFuZW91cyAqLwogICB7ICJmcm9tX2Zsb2F0IiwgZGVjX2Zyb21fZmxvYXQsIE1FVEhfT3xNRVRIX0NMQVNTLCBkb2NfZnJvbV9mbG9hdCB9LAogICB7ICJhc190dXBsZSIsIFB5RGVjX0FzVHVwbGUsIE1FVEhfTk9BUkdTLCBkb2NfYXNfdHVwbGUgfSwKKyAgeyAiYXNfaW50ZWdlcl9yYXRpbyIsIGRlY19hc19pbnRlZ2VyX3JhdGlvLCBNRVRIX05PQVJHUywgZG9jX2FzX2ludGVnZXJfcmF0aW8gfSwKIAogICAvKiBTcGVjaWFsIG1ldGhvZHMgKi8KICAgeyAiX19jb3B5X18iLCBkZWNfY29weSwgTUVUSF9OT0FSR1MsIE5VTEwgfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oIGIvTW9kdWxlcy9fZGVjaW1hbC9kb2NzdHJpbmdzLmgKaW5kZXggNzEwMjlhOS4uZjdmZDZlNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9kb2NzdHJpbmdzLmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9kb2NzdHJpbmdzLmgKQEAgLTcwLDYgKzcwLDE1IEBACiBSZXR1cm4gYSB0dXBsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyLlxuXAogXG4iKTsKIAorUHlEb2NfU1RSVkFSKGRvY19hc19pbnRlZ2VyX3JhdGlvLAorImFzX2ludGVnZXJfcmF0aW8oJHNlbGYsIC8pXG4tLVxuXG5cCitEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8oKSAtPiAoaW50LCBpbnQpXG5cCitcblwKK1JldHVybiBhIHBhaXIgb2YgaW50ZWdlcnMsIHdob3NlIHJhdGlvIGlzIGV4YWN0bHkgZXF1YWwgdG8gdGhlIG9yaWdpbmFsXG5cCitEZWNpbWFsIGFuZCB3aXRoIGEgcG9zaXRpdmUgZGVub21pbmF0b3IuIFRoZSByYXRpbyBpcyBpbiBsb3dlc3QgdGVybXMuXG5cCitSYWlzZSBPdmVyZmxvd0Vycm9yIG9uIGluZmluaXRpZXMgYW5kIGEgVmFsdWVFcnJvciBvbiBOYU5zLlxuXAorXG4iKTsKKwogUHlEb2NfU1RSVkFSKGRvY19jYW5vbmljYWwsCiAiY2Fub25pY2FsKCRzZWxmLCAvKVxuLS1cblxuXAogUmV0dXJuIHRoZSBjYW5vbmljYWwgZW5jb2Rpbmcgb2YgdGhlIGFyZ3VtZW50LiAgQ3VycmVudGx5LCB0aGUgZW5jb2RpbmdcblwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5jCmluZGV4IDBmNDFmZTUuLjYxZWI2MzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYwpAQCAtMzMsNiArMzMsMTEgQEAKICNpbmNsdWRlICJtZW1vcnkuaCIKIAogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MjMyKQorI2VuZGlmCisKKwogLyogR3VhcmFudGVlZCBtaW5pbXVtIGFsbG9jYXRpb24gZm9yIGEgY29lZmZpY2llbnQuIE1heSBiZSBjaGFuZ2VkIG9uY2UKICAgIGF0IHByb2dyYW0gc3RhcnQgdXNpbmcgbXBkX3NldG1pbmFsbG9jKCkuICovCiBtcGRfc3NpemVfdCBNUERfTUlOQUxMT0MgPSBNUERfTUlOQUxMT0NfTUlOOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaCBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgKaW5kZXggNWNhNzQxMy4uNTZlNDg4NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaAorKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oCkBAIC0xMDgsOSArMTA4LDkgQEAKIAogI2RlZmluZSBNUERfTUFKT1JfVkVSU0lPTiAyCiAjZGVmaW5lIE1QRF9NSU5PUl9WRVJTSU9OIDQKLSNkZWZpbmUgTVBEX01JQ1JPX1ZFUlNJT04gMQorI2RlZmluZSBNUERfTUlDUk9fVkVSU0lPTiAyCiAKLSNkZWZpbmUgTVBEX1ZFUlNJT04gIjIuNC4xIgorI2RlZmluZSBNUERfVkVSU0lPTiAiMi40LjIiCiAKICNkZWZpbmUgTVBEX1ZFUlNJT05fSEVYICgoTVBEX01BSk9SX1ZFUlNJT04gPDwgMjQpIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIChNUERfTUlOT1JfVkVSU0lPTiA8PCAxNikgfCBcCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5IGIvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQppbmRleCBhYjdkNWJkLi5mOTA3NTMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CisrKyBiL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKQEAgLTUwLDggKzUwLDggQEAKICAgICAgICAgJ19fYWJzX18nLCAnX19ib29sX18nLCAnX19jZWlsX18nLCAnX19jb21wbGV4X18nLCAnX19jb3B5X18nLAogICAgICAgICAnX19mbG9vcl9fJywgJ19fZmxvYXRfXycsICdfX2hhc2hfXycsICdfX2ludF9fJywgJ19fbmVnX18nLAogICAgICAgICAnX19wb3NfXycsICdfX3JlZHVjZV9fJywgJ19fcmVwcl9fJywgJ19fc3RyX18nLCAnX190cnVuY19fJywKLSAgICAgICAgJ2FkanVzdGVkJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLCAnY29weV9hYnMnLAotICAgICAgICAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCisgICAgICAgICdhZGp1c3RlZCcsICdhc19pbnRlZ2VyX3JhdGlvJywgJ2FzX3R1cGxlJywgJ2Nhbm9uaWNhbCcsICdjb25qdWdhdGUnLAorICAgICAgICAnY29weV9hYnMnLCAnY29weV9uZWdhdGUnLCAnaXNfY2Fub25pY2FsJywgJ2lzX2Zpbml0ZScsICdpc19pbmZpbml0ZScsCiAgICAgICAgICdpc19uYW4nLCAnaXNfcW5hbicsICdpc19zaWduZWQnLCAnaXNfc25hbicsICdpc196ZXJvJywgJ3JhZGl4JwogICAgICksCiAgICAgIyBVbmFyeSB3aXRoIG9wdGlvbmFsIGNvbnRleHQ6CkBAIC0xMjgsNyArMTI4LDcgQEAKICMgRnVuY3Rpb25zIHRoYXQgcmVxdWlyZSBhIHJlc3RyaWN0ZWQgZXhwb25lbnQgcmFuZ2UgZm9yIHJlYXNvbmFibGUgcnVudGltZXMuCiBVbmFyeVJlc3RyaWN0ZWQgPSBbCiAgICdfX2NlaWxfXycsICdfX2Zsb29yX18nLCAnX19pbnRfXycsICdfX3RydW5jX18nLAotICAndG9faW50ZWdyYWwnLCAndG9faW50ZWdyYWxfdmFsdWUnCisgICdhc19pbnRlZ2VyX3JhdGlvJywgJ3RvX2ludGVncmFsJywgJ3RvX2ludGVncmFsX3ZhbHVlJwogXQogCiBCaW5hcnlSZXN0cmljdGVkID0gWydfX3JvdW5kX18nXQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKaW5kZXggMGYxZDZhMS4uNjM2MzljNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZWxlbWVudHRyZWUuYworKysgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCkBAIC0xMjksMzAgKzEyOSw2IEBACiAvKiBoZWxwZXJzICovCiAKIExPQ0FMKFB5T2JqZWN0KikKLWRlZXBjb3B5KFB5T2JqZWN0KiBvYmplY3QsIFB5T2JqZWN0KiBtZW1vKQotewotICAgIC8qIGRvIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3QgKi8KLSAgICBQeU9iamVjdCogYXJnczsKLSAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIGVsZW1lbnR0cmVlc3RhdGUgKnN0ID0gRVRfU1RBVEVfR0xPQkFMOwotCi0gICAgaWYgKCFzdC0+ZGVlcGNvcHlfb2JqKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZygKLSAgICAgICAgICAgIFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICJkZWVwY29weSBoZWxwZXIgbm90IGZvdW5kIgotICAgICAgICAgICAgKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCBvYmplY3QsIG1lbW8pOwotICAgIGlmICghYXJncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdC0+ZGVlcGNvcHlfb2JqLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTE9DQUwoUHlPYmplY3QqKQogbGlzdF9qb2luKFB5T2JqZWN0KiBsaXN0KQogewogICAgIC8qIGpvaW4gbGlzdCBlbGVtZW50cyAoZGVzdHJveWluZyB0aGUgbGlzdCBpbiB0aGUgcHJvY2VzcykgKi8KQEAgLTQyMCwxMCArMzk2LDggQEAKICAgICBQeV9YREVDUkVGKGF0dHJpYik7CiAKICAgICAvKiBSZXBsYWNlIHRoZSBvYmplY3RzIGFscmVhZHkgcG9pbnRlZCB0byBieSB0YWcsIHRleHQgYW5kIHRhaWwuICovCi0gICAgdG1wID0gc2VsZl9lbGVtLT50YWc7CiAgICAgUHlfSU5DUkVGKHRhZyk7Ci0gICAgc2VsZl9lbGVtLT50YWcgPSB0YWc7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihzZWxmX2VsZW0tPnRhZywgdGFnKTsKIAogICAgIHRtcCA9IHNlbGZfZWxlbS0+dGV4dDsKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC03NDgsNiArNzIyLDkgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0KikgZWxlbWVudDsKIH0KIAorLyogSGVscGVyIGZvciBhIGRlZXAgY29weS4gKi8KK0xPQ0FMKFB5T2JqZWN0ICopIGRlZXBjb3B5KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuRWxlbWVudC5fX2RlZXBjb3B5X18KIApAQCAtODM4LDYgKzgxNSw1NyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitMT0NBTChQeU9iamVjdCAqKQorZGVlcGNvcHkoUHlPYmplY3QgKm9iamVjdCwgUHlPYmplY3QgKm1lbW8pCit7CisgICAgLyogZG8gYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgZWxlbWVudHRyZWVzdGF0ZSAqc3Q7CisKKyAgICAvKiBGYXN0IHBhdGhzICovCisgICAgaWYgKG9iamVjdCA9PSBQeV9Ob25lIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iamVjdCk7CisgICAgICAgIHJldHVybiBvYmplY3Q7CisgICAgfQorCisgICAgaWYgKFB5X1JFRkNOVChvYmplY3QpID09IDEpIHsKKyAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgICAgIGludCBzaW1wbGUgPSAxOworICAgICAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KG9iamVjdCwgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fCAhUHlVbmljb2RlX0NoZWNrRXhhY3QodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaW1wbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RGljdF9Db3B5KG9iamVjdCk7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gZ2VuZXJhbCBjYXNlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRWxlbWVudF9DaGVja0V4YWN0KG9iamVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBfZWxlbWVudHRyZWVfRWxlbWVudF9fX2RlZXBjb3B5X18oKEVsZW1lbnRPYmplY3QgKilvYmplY3QsIG1lbW8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2VuZXJhbCBjYXNlICovCisgICAgc3QgPSBFVF9TVEFURV9HTE9CQUw7CisgICAgaWYgKCFzdC0+ZGVlcGNvcHlfb2JqKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVlcGNvcHkgaGVscGVyIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG9iamVjdCwgbWVtbyk7CisgICAgaWYgKCFhcmdzKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0LT5kZWVwY29weV9vYmosIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5FbGVtZW50Ll9fc2l6ZW9mX18gLT4gUHlfc3NpemVfdAogCkBAIC0xODc5LDkyICsxOTA3LDkwIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWVsZW1lbnRfZ2V0YXR0cm8oRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIG5hbWVvYmopCitlbGVtZW50X3RhZ19nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLSAgICBQeU9iamVjdCogcmVzOwotICAgIGNoYXIgKm5hbWUgPSAiIjsKLQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZW9iaikpCi0gICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzU3RyaW5nKG5hbWVvYmopOwotCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBoYW5kbGUgY29tbW9uIGF0dHJpYnV0ZXMgZmlyc3QgKi8KLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWciKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IHNlbGYtPnRhZzsKLSAgICAgICAgUHlfSU5DUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRleHQiKSA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X3RleHQoc2VsZik7Ci0gICAgICAgIFB5X1hJTkNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICAvKiBtZXRob2RzICovCi0gICAgcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0Kikgc2VsZiwgbmFtZW9iaik7Ci0gICAgaWYgKHJlcykKLSAgICAgICAgcmV0dXJuIHJlczsKLQotICAgIC8qIGxlc3MgY29tbW9uIGF0dHJpYnV0ZXMgKi8KLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWlsIikgPT0gMCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICByZXMgPSBlbGVtZW50X2dldF90YWlsKHNlbGYpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJhdHRyaWIiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X2F0dHJpYihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAoIXJlcykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KKyAgICBQeU9iamVjdCAqcmVzID0gc2VsZi0+dGFnOwogICAgIFB5X0lOQ1JFRihyZXMpOwogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQKLWVsZW1lbnRfc2V0YXR0cm8oRWxlbWVudE9iamVjdCogc2VsZiwgUHlPYmplY3QqIG5hbWVvYmosIFB5T2JqZWN0KiB2YWx1ZSkKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfdGV4dF9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLSAgICBjaGFyICpuYW1lID0gIiI7CisgICAgUHlPYmplY3QgKnJlcyA9IGVsZW1lbnRfZ2V0X3RleHQoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CiAKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIpOwotICAgICAgICByZXR1cm4gLTE7CitzdGF0aWMgUHlPYmplY3QqCitlbGVtZW50X3RhaWxfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgUHlPYmplY3QgKnJlcyA9IGVsZW1lbnRfZ2V0X3RhaWwoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfYXR0cmliX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaWYgKCFzZWxmLT5leHRyYSkgeworICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWVvYmopKQotICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc1N0cmluZyhuYW1lb2JqKTsKLSAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gZWxlbWVudF9nZXRfYXR0cmliKHNlbGYpOworICAgIFB5X1hJTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQogCi0gICAgaWYgKHN0cmNtcChuYW1lLCAidGFnIikgPT0gMCkgewotICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICBQeV9TRVRSRUYoc2VsZi0+dGFnLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRleHQiKSA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50ZXh0KSk7Ci0gICAgICAgIHNlbGYtPnRleHQgPSB2YWx1ZTsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRleHQpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ0YWlsIikgPT0gMCkgewotICAgICAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGFpbCkpOwotICAgICAgICBzZWxmLT50YWlsID0gdmFsdWU7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmLT50YWlsKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiYXR0cmliIikgPT0gMCkgewotICAgICAgICBpZiAoIXNlbGYtPmV4dHJhKSB7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgUHlfU0VUUkVGKHNlbGYtPmV4dHJhLT5hdHRyaWIsIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAiQ2FuJ3Qgc2V0IGFyYml0cmFyeSBhdHRyaWJ1dGVzIG9uIEVsZW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIC0xOworLyogbWFjcm8gZm9yIHNldHRlciB2YWxpZGF0aW9uICovCisjZGVmaW5lIF9WQUxJREFURV9BVFRSX1ZBTFVFKFYpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVikgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeUV4Y19BdHRyaWJ1dGVFcnJvciwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBlbGVtZW50IGF0dHJpYnV0ZSIpOyAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCitzdGF0aWMgaW50CitlbGVtZW50X3RhZ19zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X1NFVFJFRihzZWxmLT50YWcsIHZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF90ZXh0X3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRleHQpKTsKKyAgICBzZWxmLT50ZXh0ID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGFpbF9zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50YWlsKSk7CisgICAgc2VsZi0+dGFpbCA9IHZhbHVlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X2F0dHJpYl9zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBpZiAoIXNlbGYtPmV4dHJhKSB7CisgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X1NFVFJFRihzZWxmLT5leHRyYS0+YXR0cmliLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE5ODQsMjIgKzIwMTAsMjIgQEAKICAqIHByZS1vcmRlciB0cmF2ZXJzYWwuIFRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggc3ViLWVsZW1lbnQgc2hvdWxkIGJlIHJldHVybmVkCiAgKiBuZXh0LCBhIHN0YWNrIG9mIHBhcmVudHMgaXMgbWFpbnRhaW5lZC4gVGhpcyBpcyBhIHN0YW5kYXJkIHN0YWNrLWJhc2VkCiAgKiBpdGVyYXRpdmUgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiBhIHRyZWUuCi0gKiBUaGUgc3RhY2sgaXMgbWFuYWdlZCB1c2luZyBhIHNpbmdsZS1saW5rZWQgbGlzdCBzdGFydGluZyBhdCBwYXJlbnRfc3RhY2suCi0gKiBFYWNoIHN0YWNrIG5vZGUgY29udGFpbnMgdGhlIHNhdmVkIHBhcmVudCB0byB3aGljaCB3ZSBzaG91bGQgcmV0dXJuIGFmdGVyCisgKiBUaGUgc3RhY2sgaXMgbWFuYWdlZCB1c2luZyBhIGNvbnRpbnVvdXMgYXJyYXkuCisgKiBFYWNoIHN0YWNrIGl0ZW0gY29udGFpbnMgdGhlIHNhdmVkIHBhcmVudCB0byB3aGljaCB3ZSBzaG91bGQgcmV0dXJuIGFmdGVyCiAgKiB0aGUgY3VycmVudCBvbmUgaXMgZXhoYXVzdGVkLCBhbmQgdGhlIG5leHQgY2hpbGQgdG8gZXhhbWluZSBpbiB0aGF0IHBhcmVudC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgUGFyZW50TG9jYXRvcl90IHsKICAgICBFbGVtZW50T2JqZWN0ICpwYXJlbnQ7CiAgICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleDsKLSAgICBzdHJ1Y3QgUGFyZW50TG9jYXRvcl90ICpuZXh0OwogfSBQYXJlbnRMb2NhdG9yOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIFBhcmVudExvY2F0b3IgKnBhcmVudF9zdGFjazsKKyAgICBQeV9zc2l6ZV90IHBhcmVudF9zdGFja191c2VkOworICAgIFB5X3NzaXplX3QgcGFyZW50X3N0YWNrX3NpemU7CiAgICAgRWxlbWVudE9iamVjdCAqcm9vdF9lbGVtZW50OwogICAgIFB5T2JqZWN0ICpzb3VnaHRfdGFnOwotICAgIGludCByb290X2RvbmU7CiAgICAgaW50IGdldHRleHQ7CiB9IEVsZW1lbnRJdGVyT2JqZWN0OwogCkBAIC0yMDA3LDEzICsyMDMzLDExIEBACiBzdGF0aWMgdm9pZAogZWxlbWVudGl0ZXJfZGVhbGxvYyhFbGVtZW50SXRlck9iamVjdCAqaXQpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqcCA9IGl0LT5wYXJlbnRfc3RhY2s7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgUGFyZW50TG9jYXRvciAqdGVtcCA9IHA7Ci0gICAgICAgIFB5X1hERUNSRUYocC0+cGFyZW50KTsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgICAgIFB5T2JqZWN0X0ZyZWUodGVtcCk7Ci0gICAgfQorICAgIFB5X3NzaXplX3QgaSA9IGl0LT5wYXJlbnRfc3RhY2tfdXNlZDsKKyAgICBpdC0+cGFyZW50X3N0YWNrX3VzZWQgPSAwOworICAgIHdoaWxlIChpLS0pCisgICAgICAgIFB5X1hERUNSRUYoaXQtPnBhcmVudF9zdGFja1tpXS5wYXJlbnQpOworICAgIFB5TWVtX0ZyZWUoaXQtPnBhcmVudF9zdGFjayk7CiAKICAgICBQeV9YREVDUkVGKGl0LT5zb3VnaHRfdGFnKTsKICAgICBQeV9YREVDUkVGKGl0LT5yb290X2VsZW1lbnQpOwpAQCAtMjAyNSwxMSArMjA0OSw5IEBACiBzdGF0aWMgaW50CiBlbGVtZW50aXRlcl90cmF2ZXJzZShFbGVtZW50SXRlck9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotICAgIFBhcmVudExvY2F0b3IgKnAgPSBpdC0+cGFyZW50X3N0YWNrOwotICAgIHdoaWxlIChwKSB7Ci0gICAgICAgIFB5X1ZJU0lUKHAtPnBhcmVudCk7Ci0gICAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KKyAgICBQeV9zc2l6ZV90IGkgPSBpdC0+cGFyZW50X3N0YWNrX3VzZWQ7CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgUHlfVklTSVQoaXQtPnBhcmVudF9zdGFja1tpXS5wYXJlbnQpOwogCiAgICAgUHlfVklTSVQoaXQtPnJvb3RfZWxlbWVudCk7CiAgICAgUHlfVklTSVQoaXQtPnNvdWdodF90YWcpOwpAQCAtMjAzOCwxNyArMjA2MCwyNSBAQAogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGVsZW1lbnRpdGVyX25leHQuIEFkZCBhIG5ldyBwYXJlbnQgdG8gdGhlIHBhcmVudCBzdGFjay4KICAqLwotc3RhdGljIFBhcmVudExvY2F0b3IgKgotcGFyZW50X3N0YWNrX3B1c2hfbmV3KFBhcmVudExvY2F0b3IgKnN0YWNrLCBFbGVtZW50T2JqZWN0ICpwYXJlbnQpCitzdGF0aWMgaW50CitwYXJlbnRfc3RhY2tfcHVzaF9uZXcoRWxlbWVudEl0ZXJPYmplY3QgKml0LCBFbGVtZW50T2JqZWN0ICpwYXJlbnQpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqbmV3X25vZGUgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFBhcmVudExvY2F0b3IpKTsKLSAgICBpZiAobmV3X25vZGUpIHsKLSAgICAgICAgbmV3X25vZGUtPnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgUHlfSU5DUkVGKHBhcmVudCk7Ci0gICAgICAgIG5ld19ub2RlLT5jaGlsZF9pbmRleCA9IDA7Ci0gICAgICAgIG5ld19ub2RlLT5uZXh0ID0gc3RhY2s7CisgICAgUGFyZW50TG9jYXRvciAqaXRlbTsKKworICAgIGlmIChpdC0+cGFyZW50X3N0YWNrX3VzZWQgPj0gaXQtPnBhcmVudF9zdGFja19zaXplKSB7CisgICAgICAgIFB5X3NzaXplX3QgbmV3X3NpemUgPSBpdC0+cGFyZW50X3N0YWNrX3NpemUgKiAyOyAgLyogbmV2ZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgUGFyZW50TG9jYXRvciAqcGFyZW50X3N0YWNrID0gaXQtPnBhcmVudF9zdGFjazsKKyAgICAgICAgUHlNZW1fUmVzaXplKHBhcmVudF9zdGFjaywgUGFyZW50TG9jYXRvciwgbmV3X3NpemUpOworICAgICAgICBpZiAocGFyZW50X3N0YWNrID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2s7CisgICAgICAgIGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSA9IG5ld19zaXplOwogICAgIH0KLSAgICByZXR1cm4gbmV3X25vZGU7CisgICAgaXRlbSA9IGl0LT5wYXJlbnRfc3RhY2sgKyBpdC0+cGFyZW50X3N0YWNrX3VzZWQrKzsKKyAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICBpdGVtLT5wYXJlbnQgPSBwYXJlbnQ7CisgICAgaXRlbS0+Y2hpbGRfaW5kZXggPSAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMjA2NSwxNTEgKzIwOTUsOTEgQEAKICAgICAgKiAgIC0gaXRlcnRleHQoKSBhbHNvIGhhcyB0byBoYW5kbGUgdGFpbCwgYWZ0ZXIgZmluaXNoaW5nIHdpdGggYWxsIHRoZQogICAgICAqICAgICBjaGlsZHJlbiBvZiBhIG5vZGUuCiAgICAgICovCi0gICAgRWxlbWVudE9iamVjdCAqY3VyX3BhcmVudDsKLSAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4OwogICAgIGludCByYzsKICAgICBFbGVtZW50T2JqZWN0ICplbGVtOworICAgIFB5T2JqZWN0ICp0ZXh0OwogCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgLyogSGFuZGxlIHRoZSBjYXNlIHJlYWNoZWQgaW4gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGl0ZXJhdGlvbiwgd2hlcmUKLSAgICAgICAgICogdGhlIHBhcmVudCBzdGFjayBpcyBlbXB0eS4gVGhlIHJvb3RfZG9uZSBmbGFnIGdpdmVzIHVzIGluZGljYXRpb24KLSAgICAgICAgICogd2hldGhlciB3ZSd2ZSBqdXN0IHN0YXJ0ZWQgaXRlcmF0aW5nIChzbyByb290X2RvbmUgaXMgMCksIGluIHdoaWNoCi0gICAgICAgICAqIGNhc2UgdGhlIHJvb3QgaXMgcmV0dXJuZWQuIElmIHJvb3RfZG9uZSBpcyAxIGFuZCB3ZSdyZSBoZXJlLCB0aGUKKyAgICAgICAgICogdGhlIHBhcmVudCBzdGFjayBpcyBlbXB0eS4gSWYgcm9vdF9lbGVtZW50IGlzIE5VTEwgYW5kIHdlJ3JlIGhlcmUsIHRoZQogICAgICAgICAgKiBpdGVyYXRvciBpcyBleGhhdXN0ZWQuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCkgewotICAgICAgICAgICAgaWYgKGl0LT5yb290X2RvbmUpIHsKKyAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrX3VzZWQpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnJvb3RfZWxlbWVudCkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVsZW0gPSBpdC0+cm9vdF9lbGVtZW50OwotICAgICAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQtPnBhcmVudF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pOwotICAgICAgICAgICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjaykgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaXQtPnJvb3RfZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgcmMgPSAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZXh0ID0gZWxlbWVudF9nZXRfdGV4dChlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gbGVmdCB0byB0cmF2ZXJzZSBpbiB0aGUgY3VycmVudCBwYXJlbnQuIElmCi0gICAgICAgICAqIHllcywgdmlzaXQgdGhlIG5leHQgY2hpbGQuIElmIG5vdCwgcG9wIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgKi8KLSAgICAgICAgY3VyX3BhcmVudCA9IGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudDsKLSAgICAgICAgY2hpbGRfaW5kZXggPSBpdC0+cGFyZW50X3N0YWNrLT5jaGlsZF9pbmRleDsKLSAgICAgICAgaWYgKGN1cl9wYXJlbnQtPmV4dHJhICYmIGNoaWxkX2luZGV4IDwgY3VyX3BhcmVudC0+ZXh0cmEtPmxlbmd0aCkgewotICAgICAgICAgICAgZWxlbSA9IChFbGVtZW50T2JqZWN0ICopY3VyX3BhcmVudC0+ZXh0cmEtPmNoaWxkcmVuW2NoaWxkX2luZGV4XTsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4Kys7Ci0gICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrID0gcGFyZW50X3N0YWNrX3B1c2hfbmV3KGl0LT5wYXJlbnRfc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pOwotICAgICAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOwotICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOwotICAgICAgICAgICAgICAgIGlmICghdGV4dCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyYyA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmMgPSAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbSA9IGl0LT5yb290X2VsZW1lbnQ7ICAvKiBzdGVhbHMgYSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgIGl0LT5yb290X2VsZW1lbnQgPSBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnRhaWw7Ci0gICAgICAgICAgICBQYXJlbnRMb2NhdG9yICpuZXh0OwotICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgICAgIHRhaWwgPSBlbGVtZW50X2dldF90YWlsKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgICAgIGlmICghdGFpbCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGFpbCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV4dCA9IGl0LT5wYXJlbnRfc3RhY2stPm5leHQ7Ci0gICAgICAgICAgICBjdXJfcGFyZW50ID0gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50OwotICAgICAgICAgICAgUHlPYmplY3RfRnJlZShpdC0+cGFyZW50X3N0YWNrKTsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBuZXh0OwotICAgICAgICAgICAgUHlfWERFQ1JFRihjdXJfcGFyZW50KTsKLQotICAgICAgICAgICAgLyogTm90ZSB0aGF0IGV4dHJhIGNvbmRpdGlvbiBvbiBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQgaGVyZTsKLSAgICAgICAgICAgICAqIHRoaXMgaXMgYmVjYXVzZSBpdGVydGV4dCgpIGlzIHN1cHBvc2VkIHRvIG9ubHkgcmV0dXJuICppbm5lcioKLSAgICAgICAgICAgICAqIHRleHQsIG5vdCB0ZXh0IGZvbGxvd2luZyB0aGUgZWxlbWVudCBpdCBiZWdhbiBpdGVyYXRpb24gd2l0aC4KKyAgICAgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgY2hpbGRyZW4gbGVmdCB0byB0cmF2ZXJzZSBpbiB0aGUgY3VycmVudCBwYXJlbnQuIElmCisgICAgICAgICAgICAgKiB5ZXMsIHZpc2l0IHRoZSBuZXh0IGNoaWxkLiBJZiBub3QsIHBvcCB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCkgewotICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRhaWwpOwotICAgICAgICAgICAgICAgIGlmIChyYyA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWlsOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFBhcmVudExvY2F0b3IgKml0ZW0gPSAmaXQtPnBhcmVudF9zdGFja1tpdC0+cGFyZW50X3N0YWNrX3VzZWQgLSAxXTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXggPSBpdGVtLT5jaGlsZF9pbmRleDsKKyAgICAgICAgICAgIEVsZW1lbnRPYmplY3RFeHRyYSAqZXh0cmE7CisgICAgICAgICAgICBlbGVtID0gaXRlbS0+cGFyZW50OworICAgICAgICAgICAgZXh0cmEgPSBlbGVtLT5leHRyYTsKKyAgICAgICAgICAgIGlmICghZXh0cmEgfHwgY2hpbGRfaW5kZXggPj0gZXh0cmEtPmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZC0tOworICAgICAgICAgICAgICAgIC8qIE5vdGUgdGhhdCBleHRyYSBjb25kaXRpb24gb24gaXQtPnBhcmVudF9zdGFja191c2VkIGhlcmU7CisgICAgICAgICAgICAgICAgICogdGhpcyBpcyBiZWNhdXNlIGl0ZXJ0ZXh0KCkgaXMgc3VwcG9zZWQgdG8gb25seSByZXR1cm4gKmlubmVyKgorICAgICAgICAgICAgICAgICAqIHRleHQsIG5vdCB0ZXh0IGZvbGxvd2luZyB0aGUgZWxlbWVudCBpdCBiZWdhbiBpdGVyYXRpb24gd2l0aC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXQtPmdldHRleHQgJiYgaXQtPnBhcmVudF9zdGFja191c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X2dldF90YWlsKGVsZW0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGdldHRleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxlbSA9IChFbGVtZW50T2JqZWN0ICopZXh0cmEtPmNoaWxkcmVuW2NoaWxkX2luZGV4XTsKKyAgICAgICAgICAgIGl0ZW0tPmNoaWxkX2luZGV4Kys7CisgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyZW50X3N0YWNrX3B1c2hfbmV3KGl0LCBlbGVtKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKKyAgICAgICAgICAgIHRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOworICAgICAgICAgICAgZ290byBnZXR0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGl0LT5zb3VnaHRfdGFnID09IFB5X05vbmUpCisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKKworICAgICAgICByYyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbGVtLT50YWcsIGl0LT5zb3VnaHRfdGFnLCBQeV9FUSk7CisgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZWxlbTsKKworICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY29udGludWU7CisKK2dldHRleHQ6CisgICAgICAgIGlmICghdGV4dCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRleHQgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7CisgICAgICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI2MSw2ICsyMjMxLDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAorI2RlZmluZSBJTklUX1BBUkVOVF9TVEFDS19TSVpFIDgKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNyZWF0ZV9lbGVtZW50aXRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFnLCBpbnQgZ2V0dGV4dCkKQEAgLTIyNzMsMjIgKzIyNDQsMjAgQEAKIAogICAgIFB5X0lOQ1JFRih0YWcpOwogICAgIGl0LT5zb3VnaHRfdGFnID0gdGFnOwotICAgIGl0LT5yb290X2RvbmUgPSAwOwogICAgIGl0LT5nZXR0ZXh0ID0gZ2V0dGV4dDsKICAgICBQeV9JTkNSRUYoc2VsZik7CiAgICAgaXQtPnJvb3RfZWxlbWVudCA9IHNlbGY7CiAKICAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CiAKLSAgICBpdC0+cGFyZW50X3N0YWNrID0gUHlPYmplY3RfTWFsbG9jKHNpemVvZihQYXJlbnRMb2NhdG9yKSk7CisgICAgaXQtPnBhcmVudF9zdGFjayA9IFB5TWVtX05ldyhQYXJlbnRMb2NhdG9yLCBJTklUX1BBUkVOVF9TVEFDS19TSVpFKTsKICAgICBpZiAoaXQtPnBhcmVudF9zdGFjayA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQgPSBOVUxMOwotICAgIGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4ID0gMDsKLSAgICBpdC0+cGFyZW50X3N0YWNrLT5uZXh0ID0gTlVMTDsKKyAgICBpdC0+cGFyZW50X3N0YWNrX3VzZWQgPSAwOworICAgIGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSA9IElOSVRfUEFSRU5UX1NUQUNLX1NJWkU7CiAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CkBAIC0yMzEzLDcgKzIyODIsNyBAQAogICAgIFB5T2JqZWN0ICplbGVtZW50X2ZhY3Rvcnk7CiAKICAgICAvKiBlbGVtZW50IHRyYWNpbmcgKi8KLSAgICBQeU9iamVjdCAqZXZlbnRzOyAvKiBsaXN0IG9mIGV2ZW50cywgb3IgTlVMTCBpZiBub3QgY29sbGVjdGluZyAqLworICAgIFB5T2JqZWN0ICpldmVudHNfYXBwZW5kOyAvKiB0aGUgYXBwZW5kIG1ldGhvZCBvZiB0aGUgbGlzdCBvZiBldmVudHMsIG9yIE5VTEwgKi8KICAgICBQeU9iamVjdCAqc3RhcnRfZXZlbnRfb2JqOyAvKiBldmVudCBvYmplY3RzIChOVUxMIHRvIGlnbm9yZSkgKi8KICAgICBQeU9iamVjdCAqZW5kX2V2ZW50X29iajsKICAgICBQeU9iamVjdCAqc3RhcnRfbnNfZXZlbnRfb2JqOwpAQCAtMjM0OCw3ICsyMzE3LDcgQEAKICAgICAgICAgfQogICAgICAgICB0LT5pbmRleCA9IDA7CiAKLSAgICAgICAgdC0+ZXZlbnRzID0gTlVMTDsKKyAgICAgICAgdC0+ZXZlbnRzX2FwcGVuZCA9IE5VTEw7CiAgICAgICAgIHQtPnN0YXJ0X2V2ZW50X29iaiA9IHQtPmVuZF9ldmVudF9vYmogPSBOVUxMOwogICAgICAgICB0LT5zdGFydF9uc19ldmVudF9vYmogPSB0LT5lbmRfbnNfZXZlbnRfb2JqID0gTlVMTDsKICAgICB9CkBAIC0yMzY3LDEzICsyMzM2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplbGVtZW50X2ZhY3RvcnkpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTFjZmE3NTU4OTcwZWU5NiBpbnB1dD0xYjQyNGVlZWZjMzUyNDljXSovCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmIChlbGVtZW50X2ZhY3RvcnkpIHsKICAgICAgICAgUHlfSU5DUkVGKGVsZW1lbnRfZmFjdG9yeSk7Ci0gICAgICAgIHRtcCA9IHNlbGYtPmVsZW1lbnRfZmFjdG9yeTsKLSAgICAgICAgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ID0gZWxlbWVudF9mYWN0b3J5OwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIFB5X1hTRVRSRUYoc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCBlbGVtZW50X2ZhY3RvcnkpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMjM5OCw3ICsyMzYzLDcgQEAKICAgICBQeV9DTEVBUihzZWxmLT5zdGFydF9uc19ldmVudF9vYmopOwogICAgIFB5X0NMRUFSKHNlbGYtPmVuZF9ldmVudF9vYmopOwogICAgIFB5X0NMRUFSKHNlbGYtPnN0YXJ0X2V2ZW50X29iaik7Ci0gICAgUHlfQ0xFQVIoc2VsZi0+ZXZlbnRzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5ldmVudHNfYXBwZW5kKTsKICAgICBQeV9DTEVBUihzZWxmLT5zdGFjayk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+ZGF0YSk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+bGFzdCk7CkBAIC0yNDc5LDEzICsyNDQ0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5vZGUpCiB7CiAgICAgaWYgKGFjdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeVR1cGxlX1BhY2soMiwgYWN0aW9uLCBub2RlKTsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlPYmplY3QgKmV2ZW50ID0gUHlUdXBsZV9QYWNrKDIsIGFjdGlvbiwgbm9kZSk7CisgICAgICAgIGlmIChldmVudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNlbGYtPmV2ZW50c19hcHBlbmQsIGV2ZW50LCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGV2ZW50KTsKICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5ldmVudHMsIHJlcykgPCAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYocmVzKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yNTE0LDEwICsyNDgwLDE3IEBACiAgICAgICAgIHNlbGYtPmRhdGEgPSBOVUxMOwogICAgIH0KIAotICAgIGlmIChzZWxmLT5lbGVtZW50X2ZhY3RvcnkgJiYgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ICE9IFB5X05vbmUpIHsKLSAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKLSAgICB9IGVsc2UgeworICAgIGlmICghc2VsZi0+ZWxlbWVudF9mYWN0b3J5IHx8IHNlbGYtPmVsZW1lbnRfZmFjdG9yeSA9PSBQeV9Ob25lKSB7CiAgICAgICAgIG5vZGUgPSBjcmVhdGVfbmV3X2VsZW1lbnQodGFnLCBhdHRyaWIpOworICAgIH0gZWxzZSBpZiAoYXR0cmliID09IFB5X05vbmUpIHsKKyAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoIWF0dHJpYikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOworICAgICAgICBQeV9ERUNSRUYoYXR0cmliKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7CiAgICAgfQogICAgIGlmICghbm9kZSkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI5NzYsMTIgKzI5NDksOCBAQAogICAgICAgICAgICAgYXR0cmliX2luICs9IDI7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvKiBQYXNzIGFuIGVtcHR5IGRpY3Rpb25hcnkgb24gKi8KLSAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoIWF0dHJpYikgewotICAgICAgICAgICAgUHlfREVDUkVGKHRhZyk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBhdHRyaWIgPSBQeV9Ob25lOwogICAgIH0KIAogICAgIGlmIChUcmVlQnVpbGRlcl9DaGVja0V4YWN0KHNlbGYtPnRhcmdldCkpIHsKQEAgLTI5OTAsNiArMjk1OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBhdHRyaWIpOwogICAgIH0KICAgICBlbHNlIGlmIChzZWxmLT5oYW5kbGVfc3RhcnQpIHsKKyAgICAgICAgaWYgKGF0dHJpYiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXR0cmliKTsKKyAgICAgICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmICghYXR0cmliKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5oYW5kbGVfc3RhcnQsICJPTyIsIHRhZywgYXR0cmliKTsKICAgICB9IGVsc2UKICAgICAgICAgcmVzID0gTlVMTDsKQEAgLTMwNjMsNyArMzA0MCw3IEBACiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmICghdGFyZ2V0LT5ldmVudHMgfHwgIXRhcmdldC0+c3RhcnRfbnNfZXZlbnRfb2JqKQorICAgIGlmICghdGFyZ2V0LT5ldmVudHNfYXBwZW5kIHx8ICF0YXJnZXQtPnN0YXJ0X25zX2V2ZW50X29iaikKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKCF1cmkpCkBAIC0zMDg2LDcgKzMwNjMsNyBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXRhcmdldC0+ZXZlbnRzKQorICAgIGlmICghdGFyZ2V0LT5ldmVudHNfYXBwZW5kKQogICAgICAgICByZXR1cm47CiAKICAgICB0cmVlYnVpbGRlcl9hcHBlbmRfZXZlbnQodGFyZ2V0LCB0YXJnZXQtPmVuZF9uc19ldmVudF9vYmosIFB5X05vbmUpOwpAQCAtMzU3NSw3ICszNTUyLDcgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5YTUxQYXJzZXIuX3NldGV2ZW50cwogCi0gICAgZXZlbnRzX3F1ZXVlOiBvYmplY3Qoc3ViY2xhc3Nfb2Y9JyZQeUxpc3RfVHlwZScpCisgICAgZXZlbnRzX3F1ZXVlOiBvYmplY3QKICAgICBldmVudHNfdG9fcmVwb3J0OiBvYmplY3QgPSBOb25lCiAgICAgLwogCkBAIC0zNTg1LDEyICszNTYyLDEyIEBACiBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19zZXRldmVudHNfaW1wbChYTUxQYXJzZXJPYmplY3QgKnNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXZlbnRzX3F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV2ZW50c190b19yZXBvcnQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQ0MDA5MjkyMmIxM2VkMSBpbnB1dD01OWRiOTc0MjkxMGM2MTc0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQ0MDA5MjkyMmIxM2VkMSBpbnB1dD1hYmY5MDgzMGExYzNiMGZjXSovCiB7CiAgICAgLyogYWN0aXZhdGUgZWxlbWVudCBldmVudCByZXBvcnRpbmcgKi8KICAgICBQeV9zc2l6ZV90IGk7CiAgICAgVHJlZUJ1aWxkZXJPYmplY3QgKnRhcmdldDsKLSAgICBQeU9iamVjdCAqZXZlbnRzX3NlcTsKKyAgICBQeU9iamVjdCAqZXZlbnRzX2FwcGVuZCwgKmV2ZW50c19zZXE7CiAKICAgICBpZiAoIVRyZWVCdWlsZGVyX0NoZWNrRXhhY3Qoc2VsZi0+dGFyZ2V0KSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoCkBAIC0zNjAzLDggKzM1ODAsMTAgQEAKIAogICAgIHRhcmdldCA9IChUcmVlQnVpbGRlck9iamVjdCopIHNlbGYtPnRhcmdldDsKIAotICAgIFB5X0lOQ1JFRihldmVudHNfcXVldWUpOwotICAgIFB5X1hTRVRSRUYodGFyZ2V0LT5ldmVudHMsIGV2ZW50c19xdWV1ZSk7CisgICAgZXZlbnRzX2FwcGVuZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXZlbnRzX3F1ZXVlLCAiYXBwZW5kIik7CisgICAgaWYgKGV2ZW50c19hcHBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfWFNFVFJFRih0YXJnZXQtPmV2ZW50c19hcHBlbmQsIGV2ZW50c19hcHBlbmQpOwogCiAgICAgLyogY2xlYXIgb3V0IGV4aXN0aW5nIGV2ZW50cyAqLwogICAgIFB5X0NMRUFSKHRhcmdldC0+c3RhcnRfZXZlbnRfb2JqKTsKQEAgLTM3MzcsNiArMzcxNiwyNiBAQAogICAgIChvYmpvYmphcmdwcm9jKSBlbGVtZW50X2Fzc19zdWJzY3IsCiB9OwogCitzdGF0aWMgUHlHZXRTZXREZWYgZWxlbWVudF9nZXRzZXRsaXN0W10gPSB7CisgICAgeyJ0YWciLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGFnX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RhZ19zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBpZGVudGlmeWluZyB3aGF0IGtpbmQgb2YgZGF0YSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyJ9LAorICAgIHsidGV4dCIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90ZXh0X2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RleHRfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgb2YgdGV4dCBkaXJlY3RseSBhZnRlciB0aGUgc3RhcnQgdGFnLCBvciBOb25lIn0sCisgICAgeyJ0YWlsIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RhaWxfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGFpbF9zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBvZiB0ZXh0IGRpcmVjdGx5IGFmdGVyIHRoZSBlbmQgdGFnLCBvciBOb25lIn0sCisgICAgeyJhdHRyaWIiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfYXR0cmliX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X2F0dHJpYl9zZXR0ZXIsCisgICAgICAgICJBIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZWxlbWVudCdzIGF0dHJpYnV0ZXMifSwKKyAgICB7TlVMTH0sCit9OworCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEVsZW1lbnRfVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAieG1sLmV0cmVlLkVsZW1lbnRUcmVlLkVsZW1lbnQiLCBzaXplb2YoRWxlbWVudE9iamVjdCksIDAsCkBAIC0zNzUzLDggKzM3NTIsOCBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0gICAgKGdldGF0dHJvZnVuYyllbGVtZW50X2dldGF0dHJvLCAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAoc2V0YXR0cm9mdW5jKWVsZW1lbnRfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCkBAIC0zNzY3LDcgKzM3NjYsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgZWxlbWVudF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICBlbGVtZW50X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZ2RibW1vZHVsZS5jIGIvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCmluZGV4IGYwNzBhMTQuLmJmN2IwMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2dkYm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKQEAgLTYxNSw3ICs2MTUsNyBAQAogICAgIHJldHVybiBuZXdkYm1vYmplY3QobmFtZSwgaWZsYWdzLCBtb2RlKTsKIH0KIAotc3RhdGljIGNoYXIgZGJtbW9kdWxlX29wZW5fZmxhZ3NbXSA9ICJyd2NuIgorc3RhdGljIGNvbnN0IGNoYXIgZGJtbW9kdWxlX29wZW5fZmxhZ3NbXSA9ICJyd2NuIgogI2lmZGVmIEdEQk1fRkFTVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmIgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwppbmRleCAxMzZhYmY1Li5iNDk5ZTFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNzgsNiArNzgsNyBAQAogICAgICAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgY2hpbGRwb3MgKz0gKCh1bnNpZ25lZCljbXAgXiAxKTsgICAvKiBpbmNyZW1lbnQgd2hlbiBjbXA9PTAgKi8KKyAgICAgICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7ICAgICAgICAgLyogYXJyIG1heSBoYXZlIGNoYW5nZWQgKi8KICAgICAgICAgICAgIGlmIChlbmRwb3MgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKQEAgLTg1LDcgKzg2LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwotICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwogICAgICAgICB0bXAxID0gYXJyW2NoaWxkcG9zXTsKICAgICAgICAgdG1wMiA9IGFycltwb3NdOwogICAgICAgICBhcnJbY2hpbGRwb3NdID0gdG1wMjsKQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgIG4gaXMgb2RkID0gMipqKzEsIHRoaXMgaXMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwKICAgICAgICBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgICAqLwotICAgIGZvciAoaSA9IG4vMiAtIDEgOyBpID49IDAgOyBpLS0pCisgICAgZm9yIChpID0gKG4gPj4gMSkgLSAxIDsgaSA+PSAwIDsgaS0tKQogICAgICAgICBpZiAoc2lmdHVwX2Z1bmMoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC00MjAsNyArNDIwLDcgQEAKIAogICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwotICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCisgICAgbGltaXQgPSBlbmRwb3MgPj4gMTsgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KICAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwpAQCAtNDMyLDYgKzQzMiw3IEBACiAgICAgICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBjaGlsZHBvcyArPSAoKHVuc2lnbmVkKWNtcCBeIDEpOyAgIC8qIGluY3JlbWVudCB3aGVuIGNtcD09MCAqLworICAgICAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsgICAgICAgICAvKiBhcnIgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwpAQCAtNDM5LDcgKzQ0MCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLSAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKICAgICAgICAgdG1wMSA9IGFycltjaGlsZHBvc107CiAgICAgICAgIHRtcDIgPSBhcnJbcG9zXTsKICAgICAgICAgYXJyW2NoaWxkcG9zXSA9IHRtcDI7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuYyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCmluZGV4IGVjNjgxNzAuLmQ4YWExZGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2lvL19pb21vZHVsZS5jCkBAIC0yMzgsNyArMjM4LDggQEAKICAgICBpbnQgdGV4dCA9IDAsIGJpbmFyeSA9IDAsIHVuaXZlcnNhbCA9IDA7CiAKICAgICBjaGFyIHJhd21vZGVbNl0sICptOwotICAgIGludCBsaW5lX2J1ZmZlcmluZywgaXNhdHR5OworICAgIGludCBsaW5lX2J1ZmZlcmluZzsKKyAgICBsb25nIGlzYXR0eTsKIAogICAgIFB5T2JqZWN0ICpyYXcsICptb2Rlb2JqID0gTlVMTCwgKmJ1ZmZlciwgKndyYXBwZXIsICpyZXN1bHQgPSBOVUxMOwogCkBAIC0yNDgsOCArMjQ5LDggQEAKICAgICBfUHlfSURFTlRJRklFUihjbG9zZSk7CiAKICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhmaWxlKSAmJgotCSFQeUJ5dGVzX0NoZWNrKGZpbGUpICYmCi0JIVB5TnVtYmVyX0NoZWNrKGZpbGUpKSB7CisgICAgICAgICFQeUJ5dGVzX0NoZWNrKGZpbGUpICYmCisgICAgICAgICFQeU51bWJlcl9DaGVjayhmaWxlKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiaW52YWxpZCBmaWxlOiAlUiIsIGZpbGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMDcsOSArMzA4LDkgQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgdmFsaWRhdGlvbiAqLwogICAgIGlmICh1bml2ZXJzYWwpIHsKLSAgICAgICAgaWYgKHdyaXRpbmcgfHwgYXBwZW5kaW5nKSB7CisgICAgICAgIGlmIChjcmVhdGluZyB8fCB3cml0aW5nIHx8IGFwcGVuZGluZyB8fCB1cGRhdGluZykgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHVzZSBVIGFuZCB3cml0aW5nIG1vZGUgYXQgb25jZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlIFUgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggeCcsICd3JywgJ2EnLCBvciAnKyciKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLApAQCAtNDM3LDEwICs0MzgsMTAgQEAKIAogICAgIC8qIHdyYXBzIGludG8gYSBUZXh0SU9XcmFwcGVyICovCiAgICAgd3JhcHBlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlUZXh0SU9XcmFwcGVyX1R5cGUsCi0JCQkJICAgICJPc3NzaSIsCi0JCQkJICAgIGJ1ZmZlciwKLQkJCQkgICAgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwKLQkJCQkgICAgbGluZV9idWZmZXJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9zc3NpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2J1ZmZlcmluZyk7CiAgICAgaWYgKHdyYXBwZXIgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICByZXN1bHQgPSB3cmFwcGVyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmggYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuaAppbmRleCAwYzZlYWUyLi4zYzQ4ZmYzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuaAorKysgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuaApAQCAtNjAsNyArNjAsNyBAQAogICAgKiBPdGhlcndpc2UsIHRoZSBsaW5lIGVuZGluZyBpcyBzcGVjaWZpZWQgYnkgcmVhZG5sLCBhIHN0ciBvYmplY3QgKi8KIGV4dGVybiBQeV9zc2l6ZV90IF9QeUlPX2ZpbmRfbGluZV9lbmRpbmcoCiAgICAgaW50IHRyYW5zbGF0ZWQsIGludCB1bml2ZXJzYWwsIFB5T2JqZWN0ICpyZWFkbmwsCi0gICAgaW50IGtpbmQsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKTsKKyAgICBpbnQga2luZCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpOwogCiAvKiBSZXR1cm4gMSBpZiBhbiBFbnZpcm9ubWVudEVycm9yIHdpdGggZXJybm8gPT0gRUlOVFIgaXMgc2V0IChhbmQgdGhlbgogICAgY2xlYXJzIHRoZSBlcnJvciBpbmRpY2F0b3IpLCAwIG90aGVyd2lzZS4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYyBiL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYwppbmRleCA2MjVhNjFlLi5mNGQxNzlhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKKysrIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCkBAIC02NTksNyArNjU5LDcgQEAKIAogLyogU2V0cyB0aGUgY3VycmVudCBlcnJvciB0byBCbG9ja2luZ0lPRXJyb3IgKi8KIHN0YXRpYyB2b2lkCi1fc2V0X0Jsb2NraW5nSU9FcnJvcihjaGFyICptc2csIFB5X3NzaXplX3Qgd3JpdHRlbikKK19zZXRfQmxvY2tpbmdJT0Vycm9yKGNvbnN0IGNoYXIgKm1zZywgUHlfc3NpemVfdCB3cml0dGVuKQogewogICAgIFB5T2JqZWN0ICplcnI7CiAgICAgUHlFcnJfQ2xlYXIoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYyBiL01vZHVsZXMvX2lvL2J5dGVzaW8uYwppbmRleCAwNThkZjQ3Li5hZDk2YTkwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9ieXRlc2lvLmMKKysrIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgaW50CiB1bnNoYXJlX2J1ZmZlcihieXRlc2lvICpzZWxmLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBQeU9iamVjdCAqbmV3X2J1ZiwgKm9sZF9idWY7CisgICAgUHlPYmplY3QgKm5ld19idWY7CiAgICAgYXNzZXJ0KFNIQVJFRF9CVUYoc2VsZikpOwogICAgIGFzc2VydChzZWxmLT5leHBvcnRzID09IDApOwogICAgIGFzc2VydChzaXplID49IChzaXplX3Qpc2VsZi0+c3RyaW5nX3NpemUpOwpAQCAtOTYsOSArOTYsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgbWVtY3B5KFB5Qnl0ZXNfQVNfU1RSSU5HKG5ld19idWYpLCBQeUJ5dGVzX0FTX1NUUklORyhzZWxmLT5idWYpLAogICAgICAgICAgICBzZWxmLT5zdHJpbmdfc2l6ZSk7Ci0gICAgb2xkX2J1ZiA9IHNlbGYtPmJ1ZjsKLSAgICBzZWxmLT5idWYgPSBuZXdfYnVmOwotICAgIFB5X0RFQ1JFRihvbGRfYnVmKTsKKyAgICBQeV9TRVRSRUYoc2VsZi0+YnVmLCBuZXdfYnVmKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vZmlsZWlvLmMgYi9Nb2R1bGVzL19pby9maWxlaW8uYwppbmRleCBkYmQ2MDRhLi5hMDJhOWMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9maWxlaW8uYworKysgYi9Nb2R1bGVzL19pby9maWxlaW8uYwpAQCAtOTIsOCArOTIsNyBAQAogICAgIGlmIChzZWxmLT5mZCA+PSAwICYmIHNlbGYtPmNsb3NlZmQpIHsKICAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOwogICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19SZXNvdXJjZVdhcm5pbmcsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmNsb3NlZCBmaWxlICVSIiwgc291cmNlKSkgeworICAgICAgICBpZiAoUHlFcnJfUmVzb3VyY2VXYXJuaW5nKHNvdXJjZSwgMSwgInVuY2xvc2VkIGZpbGUgJVIiLCBzb3VyY2UpKSB7CiAgICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLwogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpCiAgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKSBzZWxmKTsKQEAgLTU0MCw3ICs1MzksNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZXJyX21vZGUoY2hhciAqYWN0aW9uKQorZXJyX21vZGUoY29uc3QgY2hhciAqYWN0aW9uKQogewogICAgIF9QeUlPX1N0YXRlICpzdGF0ZSA9IElPX1NUQVRFKCk7CiAgICAgaWYgKHN0YXRlICE9IE5VTEwpCkBAIC0xMDQzLDcgKzEwNDIsNyBAQAogfQogI2VuZGlmIC8qIEhBVkVfRlRSVU5DQVRFICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIG1vZGVfc3RyaW5nKGZpbGVpbyAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+Y3JlYXRlZCkgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vaW9iYXNlLmMgYi9Nb2R1bGVzL19pby9pb2Jhc2UuYwppbmRleCAwOTA4OTFkLi41MWFiZDMyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9pb2Jhc2UuYworKysgYi9Nb2R1bGVzL19pby9pb2Jhc2UuYwpAQCAtODI3LDcgKzgyNyw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLwotICAgIChkZXN0cnVjdG9yKWlvYmFzZV9maW5hbGl6ZSwgLyogdHBfZmluYWxpemUgKi8KKyAgICBpb2Jhc2VfZmluYWxpemUsICAgICAgICAgICAgLyogdHBfZmluYWxpemUgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vc3RyaW5naW8uYyBiL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKaW5kZXggNzMwMThhNS4uZTg1NmUyYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vc3RyaW5naW8uYworKysgYi9Nb2R1bGVzL19pby9zdHJpbmdpby5jCkBAIC00MzgsNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlJT19zdHJfcmVhZGxpbmUsIE5VTEwpOwogICAgICAgICBpZiAobGluZSAmJiAhUHlVbmljb2RlX0NoZWNrKGxpbmUpKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBzdHIgb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBzdHIgb2JqZWN0LCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUobGluZSktPnRwX25hbWUpOwogICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby90ZXh0aW8uYyBiL01vZHVsZXMvX2lvL3RleHRpby5jCmluZGV4IDA2M2NhYTYuLjk2YzhlN2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL3RleHRpby5jCisrKyBiL01vZHVsZXMvX2lvL3RleHRpby5jCkBAIC03NzIsNyArNzcyLDcgQEAKICAgICBlbmNvZGVmdW5jX3QgZW5jb2RlZnVuYzsKIH0gZW5jb2RlZnVuY2VudHJ5OwogCi1zdGF0aWMgZW5jb2RlZnVuY2VudHJ5IGVuY29kZWZ1bmNzW10gPSB7CitzdGF0aWMgY29uc3QgZW5jb2RlZnVuY2VudHJ5IGVuY29kZWZ1bmNzW10gPSB7CiAgICAgeyJhc2NpaSIsICAgICAgIChlbmNvZGVmdW5jX3QpIGFzY2lpX2VuY29kZX0sCiAgICAgeyJpc284ODU5LTEiLCAgIChlbmNvZGVmdW5jX3QpIGxhdGluMV9lbmNvZGV9LAogICAgIHsidXRmLTgiLCAgICAgICAoZW5jb2RlZnVuY190KSB1dGY4X2VuY29kZX0sCkBAIC0xMDIxLDcgKzEwMjEsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLSAgICAgICAgICAgIGVuY29kZWZ1bmNlbnRyeSAqZSA9IGVuY29kZWZ1bmNzOworICAgICAgICAgICAgY29uc3QgZW5jb2RlZnVuY2VudHJ5ICplID0gZW5jb2RlZnVuY3M7CiAgICAgICAgICAgICB3aGlsZSAoZS0+bmFtZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhyZXMsIGUtPm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmVuY29kZWZ1bmMgPSBlLT5lbmNvZGVmdW5jOwpAQCAtMTY0NCw4ICsxNjQ0LDggQEAKIC8qIE5PVEU6IGBlbmRgIG11c3QgcG9pbnQgdG8gdGhlIHJlYWwgZW5kIG9mIHRoZSBQeV9VQ1M0IHN0b3JhZ2UsCiAgICB0aGF0IGlzIHRvIHRoZSBOVUwgY2hhcmFjdGVyLiBPdGhlcndpc2UgdGhlIGZ1bmN0aW9uIHdpbGwgcHJvZHVjZQogICAgaW5jb3JyZWN0IHJlc3VsdHMuICovCi1zdGF0aWMgY2hhciAqCi1maW5kX2NvbnRyb2xfY2hhcihpbnQga2luZCwgY2hhciAqcywgY2hhciAqZW5kLCBQeV9VQ1M0IGNoKQorc3RhdGljIGNvbnN0IGNoYXIgKgorZmluZF9jb250cm9sX2NoYXIoaW50IGtpbmQsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVuZCwgUHlfVUNTNCBjaCkKIHsKICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICBhc3NlcnQoY2ggPCAyNTYpOwpAQCAtMTY2NSwxMyArMTY2NSwxMyBAQAogUHlfc3NpemVfdAogX1B5SU9fZmluZF9saW5lX2VuZGluZygKICAgICBpbnQgdHJhbnNsYXRlZCwgaW50IHVuaXZlcnNhbCwgUHlPYmplY3QgKnJlYWRubCwKLSAgICBpbnQga2luZCwgY2hhciAqc3RhcnQsIGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpCisgICAgaW50IGtpbmQsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKQogewogICAgIFB5X3NzaXplX3QgbGVuID0gKChjaGFyKillbmQgLSAoY2hhciopc3RhcnQpL2tpbmQ7CiAKICAgICBpZiAodHJhbnNsYXRlZCkgewogICAgICAgICAvKiBOZXdsaW5lcyBhcmUgYWxyZWFkeSB0cmFuc2xhdGVkLCBvbmx5IHNlYXJjaCBmb3IgXG4gKi8KLSAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgJ1xuJyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsICdcbicpOwogICAgICAgICBpZiAocG9zICE9IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gKHBvcyAtIHN0YXJ0KS9raW5kICsgMTsKICAgICAgICAgZWxzZSB7CkBAIC0xNjgzLDcgKzE2ODMsNyBAQAogICAgICAgICAvKiBVbml2ZXJzYWwgbmV3bGluZSBzZWFyY2guIEZpbmQgYW55IG9mIFxyLCBcclxuLCBcbgogICAgICAgICAgKiBUaGUgZGVjb2RlciBlbnN1cmVzIHRoYXQgXHJcbiBhcmUgbm90IHNwbGl0IGluIHR3byBwaWVjZXMKICAgICAgICAgICovCi0gICAgICAgIGNoYXIgKnMgPSBzdGFydDsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0YXJ0OwogICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICBQeV9VQ1M0IGNoOwogICAgICAgICAgICAgLyogRmFzdCBwYXRoIGZvciBub24tY29udHJvbCBjaGFycy4gVGhlIGxvb3AgYWx3YXlzIGVuZHMKQEAgLTE3MTMsMjEgKzE3MTMsMjEgQEAKICAgICAgICAgLyogQXNzdW1lIHRoYXQgcmVhZG5sIGlzIGFuIEFTQ0lJIGNoYXJhY3Rlci4gKi8KICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlYWRubCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOwogICAgICAgICBpZiAocmVhZG5sX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCBubFswXSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCBubFswXSk7CiAgICAgICAgICAgICBpZiAocG9zICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIChwb3MgLSBzdGFydCkva2luZCArIDE7CiAgICAgICAgICAgICAqY29uc3VtZWQgPSBsZW47CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICpzID0gc3RhcnQ7Ci0gICAgICAgICAgICBjaGFyICplID0gZW5kIC0gKHJlYWRubF9sZW4gLSAxKSpraW5kOwotICAgICAgICAgICAgY2hhciAqcG9zOworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0YXJ0OworICAgICAgICAgICAgY29uc3QgY2hhciAqZSA9IGVuZCAtIChyZWFkbmxfbGVuIC0gMSkqa2luZDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvczsKICAgICAgICAgICAgIGlmIChlIDwgcykKICAgICAgICAgICAgICAgICBlID0gczsKICAgICAgICAgICAgIHdoaWxlIChzIDwgZSkgewogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzLCBlbmQsIG5sWzBdKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzLCBlbmQsIG5sWzBdKTsKICAgICAgICAgICAgICAgICBpZiAocG9zID09IE5VTEwgfHwgcG9zID49IGUpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByZWFkbmxfbGVuOyBpKyspIHsKQEAgLTI2ODksNyArMjY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5SU9fc3RyX3JlYWRsaW5lLCBOVUxMKTsKICAgICAgICAgaWYgKGxpbmUgJiYgIVB5VW5pY29kZV9DaGVjayhsaW5lKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gc3RyIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGEgc3RyIG9iamVjdCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKGxpbmUpLT50cF9uYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fanNvbi5jIGIvTW9kdWxlcy9fanNvbi5jCmluZGV4IGY4MmFmMzQuLmQzZGJmOTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2pzb24uYworKysgYi9Nb2R1bGVzL19qc29uLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9lbmNvZGVkX2NvbnN0KFB5T2JqZWN0ICpvYmopOwogc3RhdGljIHZvaWQKLXJhaXNlX2Vycm1zZyhjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCk7CityYWlzZV9lcnJtc2coY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpOwogc3RhdGljIFB5T2JqZWN0ICoKIGVuY29kZXJfZW5jb2RlX3N0cmluZyhQeUVuY29kZXJPYmplY3QgKnMsIFB5T2JqZWN0ICpvYmopOwogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTMyMSw3ICszMjEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcmFpc2VfZXJybXNnKGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQorcmFpc2VfZXJybXNnKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKQogewogICAgIC8qIFVzZSBKU09ORGVjb2RlRXJyb3IgZXhjZXB0aW9uIHRvIHJhaXNlIGEgbmljZSBsb29raW5nIFZhbHVlRXJyb3Igc3ViY2xhc3MgKi8KICAgICBzdGF0aWMgUHlPYmplY3QgKkpTT05EZWNvZGVFcnJvciA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGIxZDZhZGQuLmE5MmZiMTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIC8qIHRoZSBncm91cGluZyBpcyB0ZXJtaW5hdGVkIGJ5IGVpdGhlciAwIG9yIENIQVJfTUFYICovCiBzdGF0aWMgUHlPYmplY3QqCi1jb3B5X2dyb3VwaW5nKGNoYXIqIHMpCitjb3B5X2dyb3VwaW5nKGNvbnN0IGNoYXIqIHMpCiB7CiAgICAgaW50IGk7CiAgICAgUHlPYmplY3QgKnJlc3VsdCwgKnZhbCA9IE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sc3Byb2YuYyBiL01vZHVsZXMvX2xzcHJvZi5jCmluZGV4IDY2ZTUzNGYuLmNjZmI1MTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xzcHJvZi5jCisrKyBiL01vZHVsZXMvX2xzcHJvZi5jCkBAIC03NjIsNyArNzYyLDYgQEAKIHN0YXRpYyBpbnQKIHByb2ZpbGVyX2luaXQoUHJvZmlsZXJPYmplY3QgKnBPYmosIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0gICAgUHlPYmplY3QgKm87CiAgICAgUHlPYmplY3QgKnRpbWVyID0gTlVMTDsKICAgICBkb3VibGUgdGltZXVuaXQgPSAwLjA7CiAgICAgaW50IHN1YmNhbGxzID0gMTsKQEAgLTc3NywxMSArNzc2LDkgQEAKIAogICAgIGlmIChzZXRTdWJjYWxscyhwT2JqLCBzdWJjYWxscykgPCAwIHx8IHNldEJ1aWx0aW5zKHBPYmosIGJ1aWx0aW5zKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBvID0gcE9iai0+ZXh0ZXJuYWxUaW1lcjsKLSAgICBwT2JqLT5leHRlcm5hbFRpbWVyID0gdGltZXI7Ci0gICAgUHlfWElOQ1JFRih0aW1lcik7Ci0gICAgUHlfWERFQ1JFRihvKTsKICAgICBwT2JqLT5leHRlcm5hbFRpbWVyVW5pdCA9IHRpbWV1bml0OworICAgIFB5X1hJTkNSRUYodGltZXIpOworICAgIFB5X1hTRVRSRUYocE9iai0+ZXh0ZXJuYWxUaW1lciwgdGltZXIpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19waWNrbGUuYyBiL01vZHVsZXMvX3BpY2tsZS5jCmluZGV4IDQ3OTc3ZWMuLmZkZDYwZTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3BpY2tsZS5jCisrKyBiL01vZHVsZXMvX3BpY2tsZS5jCkBAIC0xNTMsNiArMTUzLDkgQEAKICAgICBQeU9iamVjdCAqY29kZWNzX2VuY29kZTsKICAgICAvKiBidWlsdGlucy5nZXRhdHRyLCB1c2VkIGZvciBzYXZpbmcgbmVzdGVkIG5hbWVzIHdpdGggcHJvdG9jb2wgPCA0ICovCiAgICAgUHlPYmplY3QgKmdldGF0dHI7CisgICAgLyogZnVuY3Rvb2xzLnBhcnRpYWwsIHVzZWQgZm9yIGltcGxlbWVudGluZyBfX25ld29ial9leF9fIHdpdGggcHJvdG9jb2xzCisgICAgICAgMiBhbmQgMyAqLworICAgIFB5T2JqZWN0ICpwYXJ0aWFsOwogfSBQaWNrbGVTdGF0ZTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgX3BpY2tsZSBtb2R1bGUgZGVmaW5pdGlvbi4gKi8KQEAgLTE5MCw2ICsxOTMsNyBAQAogICAgIFB5X0NMRUFSKHN0LT5pbXBvcnRfbWFwcGluZ18zdG8yKTsKICAgICBQeV9DTEVBUihzdC0+Y29kZWNzX2VuY29kZSk7CiAgICAgUHlfQ0xFQVIoc3QtPmdldGF0dHIpOworICAgIFB5X0NMRUFSKHN0LT5wYXJ0aWFsKTsKIH0KIAogLyogSW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gcGlja2xlIG1vZHVsZSBzdGF0ZS4gKi8KQEAgLTIwMCw2ICsyMDQsNyBAQAogICAgIFB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29tcGF0X3BpY2tsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmNvZGVjcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmN0b29scyA9IE5VTEw7CiAKICAgICBidWlsdGlucyA9IFB5RXZhbF9HZXRCdWlsdGlucygpOwogICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQpAQCAtMzE0LDEyICszMTksMjEgQEAKICAgICB9CiAgICAgUHlfQ0xFQVIoY29kZWNzKTsKIAorICAgIGZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7CisgICAgaWYgKCFmdW5jdG9vbHMpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3QtPnBhcnRpYWwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInBhcnRpYWwiKTsKKyAgICBpZiAoIXN0LT5wYXJ0aWFsKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CisKICAgICByZXR1cm4gMDsKIAogICBlcnJvcjoKICAgICBQeV9DTEVBUihjb3B5cmVnKTsKICAgICBQeV9DTEVBUihjb21wYXRfcGlja2xlKTsKICAgICBQeV9DTEVBUihjb2RlY3MpOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CiAgICAgX1BpY2tsZV9DbGVhclN0YXRlKHN0KTsKICAgICByZXR1cm4gLTE7CiB9CkBAIC0zNTYsMTggKzM3MCwxMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotc3RhY2tfdW5kZXJmbG93KHZvaWQpCi17Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qIEludGVybmFsIGRhdGEgdHlwZSB1c2VkIGFzIHRoZSB1bnBpY2tsaW5nIHN0YWNrLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgUHlPYmplY3QgKipkYXRhOworICAgIGludCBtYXJrX3NldDsgICAgICAgICAgLyogaXMgTUFSSyBzZXQ/ICovCisgICAgUHlfc3NpemVfdCBmZW5jZTsgICAgICAvKiBwb3NpdGlvbiBvZiB0b3AgTUFSSyBvciAwICovCiAgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7ICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KIH0gUGRhdGE7CiAKQEAgLTM5OCw2ICs0MDYsOCBAQAogICAgIGlmICghKHNlbGYgPSBQeU9iamVjdF9OZXcoUGRhdGEsICZQZGF0YV9UeXBlKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1NJWkUoc2VsZikgPSAwOworICAgIHNlbGYtPm1hcmtfc2V0ID0gMDsKKyAgICBzZWxmLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+YWxsb2NhdGVkID0gODsKICAgICBzZWxmLT5kYXRhID0gUHlNZW1fTUFMTE9DKHNlbGYtPmFsbG9jYXRlZCAqIHNpemVvZihQeU9iamVjdCAqKSk7CiAgICAgaWYgKHNlbGYtPmRhdGEpCkBAIC00MTUsOCArNDI1LDcgQEAKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBQeV9TSVpFKHNlbGYpOwogCi0gICAgaWYgKGNsZWFydG8gPCAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgYXNzZXJ0KGNsZWFydG8gPj0gc2VsZi0+ZmVuY2UpOwogICAgIGlmIChjbGVhcnRvID49IGkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC00NTIsNiArNDYxLDE3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50CitQZGF0YV9zdGFja191bmRlcmZsb3coUGRhdGEgKnNlbGYpCit7CisgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXJrX3NldCA/CisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE1BUksgZm91bmQiIDoKKyAgICAgICAgICAgICAgICAgICAgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOworfQorCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4KQEAgLTQ1OSw5ICs0NzksOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcChQZGF0YSAqc2VsZikKIHsKLSAgICBpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5mZW5jZSkgeworICAgICAgICBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc2VsZi0+ZGF0YVstLVB5X1NJWkUoc2VsZildOwpAQCAtNDkzLDYgKzUxMiwxMCBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKICAgICBQeV9zc2l6ZV90IGxlbiwgaSwgajsKIAorICAgIGlmIChzdGFydCA8IHNlbGYtPmZlbmNlKSB7CisgICAgICAgIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGxlbiA9IFB5X1NJWkUoc2VsZikgLSBzdGFydDsKICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC04NjAsNyArODgzLDcgQEAKIHsKICAgICBzaXplX3QgaTsKIAotICAgIGFzc2VydChzaXplb2Yoc2l6ZV90KSA8PSA4KTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPD0gOCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpemVfdCk7IGkrKykgewogICAgICAgICBvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+ICg4ICogaSkpICYgMHhmZik7CkBAIC0yMDk2LDM4ICsyMTE5LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmF3X3VuaWNvZGVfZXNjYXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7Ci0gICAgc2l6ZV90IGV4cGFuZHNpemU7CiAgICAgdm9pZCAqZGF0YTsKICAgICB1bnNpZ25lZCBpbnQga2luZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKG9iaikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShvYmopOwogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChvYmopOwotICAgIGlmIChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKQotICAgICAgICBleHBhbmRzaXplID0gMTA7Ci0gICAgZWxzZQotICAgICAgICBleHBhbmRzaXplID0gNjsKIAotICAgIGlmICgoc2l6ZV90KXNpemUgPiAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIHNpemUpOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHJldHVybiByZXByOwotICAgIGFzc2VydChQeV9SRUZDTlQocmVwcikgPT0gMSk7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChpPTA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwogICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtMjEzOSw4ICsyMTU5LDEzIEBACiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4Zl07CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzW2NoICYgMTVdOwogICAgICAgICB9Ci0gICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLworICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMsICdcXCcgYW5kICdcbicgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMjU2IHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA2LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweGZdOwpAQCAtMjE1MiwxNCArMjE3NywxNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KLSAgICBzaXplID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcHIsIHNpemUpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHApOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50Ci13cml0ZV91dGY4KFBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKmRhdGEsIFB5X3NzaXplX3Qgc2l6ZSkKK3dyaXRlX3V0ZjgoUGlja2xlck9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqZGF0YSwgUHlfc3NpemVfdCBzaXplKQogewogICAgIGNoYXIgaGVhZGVyWzldOwogICAgIFB5X3NzaXplX3QgbGVuOwpAQCAtMzUzMSwxMSArMzU1OCw5IEBACiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotICAgICAgICAgICAgaWYgKHNlbGYtPnByb3RvID49IDQpIHsKLSAgICAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKLSAgICAgICAgICAgICAgICB1c2VfbmV3b2JqX2V4ID0gUHlVbmljb2RlX0NvbXBhcmUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOworICAgICAgICAgICAgdXNlX25ld29ial9leCA9IFB5VW5pY29kZV9Db21wYXJlKAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBfUHlVbmljb2RlX0Zyb21JZCgmUHlJZF9fX25ld29ial9leF9fKSkgPT0gMDsKICAgICAgICAgICAgIGlmICghdXNlX25ld29ial9leCkgewogICAgICAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX18pOwogICAgICAgICAgICAgICAgIHVzZV9uZXdvYmogPSBQeVVuaWNvZGVfQ29tcGFyZSgKQEAgLTM1NzksMTEgKzM2MDQsNTggQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAotICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJm5ld29ial9leF9vcCwgMSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT5wcm90byA+PSA0KSB7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBrd2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZuZXdvYmpfZXhfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdhcmdzOworICAgICAgICAgICAgUHlPYmplY3QgKmNsc19uZXc7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld19fKTsKKworICAgICAgICAgICAgbmV3YXJncyA9IFB5VHVwbGVfTmV3KFB5X1NJWkUoYXJncykgKyAyKTsKKyAgICAgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBjbHNfbmV3ID0gX1B5T2JqZWN0X0dldEF0dHJJZChjbHMsICZQeUlkX19fbmV3X18pOworICAgICAgICAgICAgaWYgKGNsc19uZXcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIGNsc19uZXcpOworICAgICAgICAgICAgUHlfSU5DUkVGKGNscyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDEsIGNscyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhcmdzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIGkgKyAyLCBpdGVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FsbGFibGUgPSBQeU9iamVjdF9DYWxsKHN0LT5wYXJ0aWFsLCBuZXdhcmdzLCBrd2FyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGNhbGxhYmxlLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIG5ld2FyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZyZWR1Y2Vfb3AsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAodXNlX25ld29iaikgewpAQCAtNDM5Myw3ICs0NDY1LDcgQEAKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJ21lbW8nIGF0dHJpYnV0ZSBtdXN0IGJlIGFuIFBpY2tsZXJNZW1vUHJveHkgb2JqZWN0IgorICAgICAgICAgICAgICAgICAgICAgIidtZW1vJyBhdHRyaWJ1dGUgbXVzdCBiZSBhIFBpY2tsZXJNZW1vUHJveHkgb2JqZWN0IgogICAgICAgICAgICAgICAgICAgICAgIm9yIGRpY3QsIG5vdCAlLjIwMHMiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtNDQyMiw4ICs0NDk0LDYgQEAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfc2V0X3BlcnNpZChQaWNrbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTQ0MzUsMTAgKzQ1MDUsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgdG1wID0gc2VsZi0+cGVyc19mdW5jOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgc2VsZi0+cGVyc19mdW5jID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOyAgICAgIC8qIHNlbGYtPnBlcnNfZnVuYyBjYW4gYmUgTlVMTCwgc28gYmUgY2FyZWZ1bC4gKi8KKyAgICBQeV9YU0VUUkVGKHNlbGYtPnBlcnNfZnVuYywgdmFsdWUpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC00NTIwLDEzICs0NTg4LDE5IEBACiBzdGF0aWMgUHlfc3NpemVfdAogbWFya2VyKFVucGlja2xlck9iamVjdCAqc2VsZikKIHsKLSAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CisgICAgUHlfc3NpemVfdCBtYXJrOworCiAgICAgaWYgKHNlbGYtPm51bV9tYXJrcyA8IDEpIHsKKyAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgImNvdWxkIG5vdCBmaW5kIE1BUksiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHJldHVybiBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CisgICAgbWFyayA9IHNlbGYtPm1hcmtzWy0tc2VsZi0+bnVtX21hcmtzXTsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSBzZWxmLT5udW1fbWFya3MgIT0gMDsKKyAgICBzZWxmLT5zdGFjay0+ZmVuY2UgPSBzZWxmLT5udW1fbWFya3MgPworICAgICAgICAgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzIC0gMV0gOiAwOworICAgIHJldHVybiBtYXJrOwogfQogCiBzdGF0aWMgaW50CkBAIC00OTg3LDcgKzUwNjEsNyBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKIAogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8IGxlbikKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKIAogICAgIHR1cGxlID0gUGRhdGFfcG9wdHVwbGUoc2VsZi0+c3RhY2ssIFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gbGVuKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKQEAgLTUwNjksNiArNTE0MywxMyBAQAogICAgIGlmICgoZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogCisgICAgaWYgKChqIC0gaSkgJSAyICE9IDApIHsKKyAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgIm9kZCBudW1iZXIgb2YgaXRlbXMgZm9yIERJQ1QiKTsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgZm9yIChrID0gaSArIDE7IGsgPCBqOyBrICs9IDIpIHsKICAgICAgICAga2V5ID0gc2VsZi0+c3RhY2stPmRhdGFbayAtIDFdOwogICAgICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW2tdOwpAQCAtNTEzNiw3ICs1MjE3LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gaSA8IDEpCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICBhcmdzID0gUGRhdGFfcG9wdHVwbGUoc2VsZi0+c3RhY2ssIGkgKyAxKTsKICAgICBpZiAoYXJncyA9PSBOVUxMKQpAQCAtNTQ1MywxMiArNTUzNCwxNSBAQAogICAgICAqLwogICAgIGlmIChzZWxmLT5udW1fbWFya3MgPiAwICYmIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdID09IGxlbikgewogICAgICAgICBzZWxmLT5udW1fbWFya3MtLTsKLSAgICB9IGVsc2UgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gc2VsZi0+bnVtX21hcmtzICE9IDA7CisgICAgICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IHNlbGYtPm51bV9tYXJrcyA/CisgICAgICAgICAgICAgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzIC0gMV0gOiAwOworICAgIH0gZWxzZSBpZiAobGVuIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CisgICAgZWxzZSB7CiAgICAgICAgIGxlbi0tOwogICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhY2stPmRhdGFbbGVuXSk7CiAgICAgICAgIFB5X1NJWkUoc2VsZi0+c3RhY2spID0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01NDgwLDEwICs1NTY0LDEwIEBACiBsb2FkX2R1cChVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKmxhc3Q7Ci0gICAgUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKIAotICAgIGlmICgobGVuID0gUHlfU0laRShzZWxmLT5zdGFjaykpIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAobGVuIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgbGFzdCA9IHNlbGYtPnN0YWNrLT5kYXRhW2xlbiAtIDFdOwogICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgbGFzdCwgLTEpOwogICAgIHJldHVybiAwOwpAQCAtNTY2Niw4ICs1NzUwLDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmIChsZW4gPCAyKQogICAgICAgICByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBrZXkgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCBOVUxMLCAxMCk7CkBAIC01Njk1LDggKzU3NzksOCBAQAogICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDEpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBpZHggPSBQeV9DSEFSTUFTSyhzWzBdKTsKQEAgLTU3MTQsOCArNTc5OCw4IEBACiAgICAgaWYgKF9VbnBpY2tsZXJfUmVhZChzZWxmLCAmcywgNCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFbUHlfU0laRShzZWxmLT5zdGFjaykgLSAxXTsKIAogICAgIGlkeCA9IGNhbGNfYmluc2l6ZShzLCA0KTsKQEAgLTU3MzMsOCArNTgxNyw4IEBACiB7CiAgICAgUHlPYmplY3QgKnZhbHVlOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICByZXR1cm4gX1VucGlja2xlcl9NZW1vUHV0KHNlbGYsIHNlbGYtPm1lbW9fbGVuLCB2YWx1ZSk7CkBAIC01NzQ4LDggKzU4MzIsOCBAQAogICAgIFB5X3NzaXplX3QgbGVuLCBpOwogCiAgICAgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7Ci0gICAgaWYgKHggPiBsZW4gfHwgeCA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKHggPiBsZW4gfHwgeCA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGlmIChsZW4gPT0geCkgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTU3OTgsOCArNTg4Miw4IEBACiBzdGF0aWMgaW50CiBsb2FkX2FwcGVuZChVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7Ci0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHJldHVybiBkb19hcHBlbmQoc2VsZiwgUHlfU0laRShzZWxmLT5zdGFjaykgLSAxKTsKIH0KIApAQCAtNTgyMSw4ICs1OTA1LDggQEAKICAgICBpbnQgc3RhdHVzID0gMDsKIAogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmICh4ID4gbGVuIHx8IHggPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmICh4ID4gbGVuIHx8IHggPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IHgpICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmICgobGVuIC0geCkgJSAyICE9IDApIHsKQEAgLTU4NzUsOCArNTk1OSw4IEBACiAgICAgaWYgKG1hcmsgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7Ci0gICAgaWYgKG1hcmsgPiBsZW4gfHwgbWFyayA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKG1hcmsgPiBsZW4gfHwgbWFyayA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGlmIChsZW4gPT0gbWFyaykgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTU5MzEsOCArNjAxNSw4IEBACiAgICAgLyogU3RhY2sgaXMgLi4uIGluc3RhbmNlLCBzdGF0ZS4gIFdlIHdhbnQgdG8gbGVhdmUgaW5zdGFuY2UgYXQKICAgICAgKiB0aGUgc3RhY2sgdG9wLCBwb3NzaWJseSBtdXRhdGVkIHZpYSBpbnN0YW5jZS5fX3NldHN0YXRlX18oc3RhdGUpLgogICAgICAqLwotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8IDIpCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgLSAyIDwgc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKIAogICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgc3RhdGUpOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKQpAQCAtNjA2OCw3ICs2MTUyLDggQEAKICAgICAgICAgc2VsZi0+bWFya3Nfc2l6ZSA9IChQeV9zc2l6ZV90KWFsbG9jOwogICAgIH0KIAotICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IDE7CisgICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzKytdID0gc2VsZi0+c3RhY2stPmZlbmNlID0gUHlfU0laRShzZWxmLT5zdGFjayk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTYxNTEsNiArNjIzNiw4IEBACiAgICAgY2hhciAqcyA9IE5VTEw7CiAKICAgICBzZWxmLT5udW1fbWFya3MgPSAwOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IDA7CisgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gMDsKICAgICBzZWxmLT5wcm90byA9IDA7CiAgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spKQogICAgICAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CkBAIC02ODU1LDggKzY5NDIsNiBAQAogc3RhdGljIGludAogVW5waWNrbGVyX3NldF9wZXJzbG9hZChVbnBpY2tsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwpAQCAtNjg2OSwxMCArNjk1NCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB0bXAgPSBzZWxmLT5wZXJzX2Z1bmM7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBzZWxmLT5wZXJzX2Z1bmMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7ICAgICAgLyogc2VsZi0+cGVyc19mdW5jIGNhbiBiZSBOVUxMLCBzbyBiZSBjYXJlZnVsLiAqLworICAgIFB5X1hTRVRSRUYoc2VsZi0+cGVyc19mdW5jLCB2YWx1ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jIGIvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMKaW5kZXggOGJlZGFiNS4uYTAxMDlmYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMKKysrIGIvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogLyogQ29udmVydCBBU0NJSSB0byBhIHBvc2l0aXZlIGludCwgbm8gbGliYyBjYWxsLiBubyBvdmVyZmxvdy4gLTEgb24gZXJyb3IuICovCiBzdGF0aWMgaW50Ci1fcG9zX2ludF9mcm9tX2FzY2lpKGNoYXIgKm5hbWUpCitfcG9zX2ludF9mcm9tX2FzY2lpKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgaW50IG51bSA9IDA7CiAgICAgd2hpbGUgKCpuYW1lID49ICcwJyAmJiAqbmFtZSA8PSAnOScpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggOTVhZDRhNC4uYTg1ZDkwNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTk5LDcgKzk5LDcgQEAKIGdlbnJhbmRfaW50MzIoUmFuZG9tT2JqZWN0ICpzZWxmKQogewogICAgIFBZX1VJTlQzMl9UIHk7Ci0gICAgc3RhdGljIFBZX1VJTlQzMl9UIG1hZzAxWzJdPXsweDBVLCBNQVRSSVhfQX07CisgICAgc3RhdGljIGNvbnN0IFBZX1VJTlQzMl9UIG1hZzAxWzJdID0gezB4MFUsIE1BVFJJWF9BfTsKICAgICAvKiBtYWcwMVt4XSA9IHggKiBNQVRSSVhfQSAgZm9yIHg9MCwxICovCiAgICAgUFlfVUlOVDMyX1QgKm10OwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zY3Byb3h5LmMgYi9Nb2R1bGVzL19zY3Byb3h5LmMKaW5kZXggNjZiNmUzNC4uNjhiZTQ1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc2Nwcm94eS5jCisrKyBiL01vZHVsZXMvX3NjcHJveHkuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9wcm94eShQeU9iamVjdCogcHJveGllcywgY2hhciogcHJvdG8sIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QsCitzZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNvbnN0IGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAogICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGVuYWJsZWRLZXksCiAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdEtleSwgQ0ZTdHJpbmdSZWYgcG9ydEtleSkKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKaW5kZXggMzY4OWE0ZS4uNjJjNTg5MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKQEAgLTI0NCw4ICsyNDQsNyBAQAogICAgICAgICBwdHIgPSBwdHItPm5leHQ7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2FjaGVfbWV0aG9kc1tdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNzU3MDYyNC4uNGJlZWQ3OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0zNDgsOCArMzQ4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyoKQEAgLTg1Nyw4ICs4NTYsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGZ1bmMsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC04ODksOCArODg3LDcgQEAKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhZ2dyZWdhdGVfY2xhc3MsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDI1LDggKzEwMjIsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDU1LDggKzEwNTEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3RyYWNlX2NhbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtMTA4Myw4ICsxMDc4LDcgQEAKICAgICAgICAgc3FsaXRlM190cmFjZShzZWxmLT5kYiwgX3RyYWNlX2NhbGxiYWNrLCB0cmFjZV9jYWxsYmFjayk7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTgpAQCAtMTEwNyw4ICsxMTAxLDcgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBlbmFibGluZyBsb2FkIGV4dGVuc2lvbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTExMzEsOCArMTEyNCw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTE2MjIsNyArMTYxNCw3IEBACiAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCi1zdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IDMwMGRhMjguLjIzZjMwNTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChweXNxbGl0ZV9DdXJzb3IqIHNlbGYpOwogCi1zdGF0aWMgY2hhciogZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFjayA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOworc3RhdGljIGNvbnN0IGNoYXIgZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFja1tdID0gIkN1cnNvciBuZWVkZWQgdG8gYmUgcmVzZXQgYmVjYXVzZSBvZiBjb21taXQvcm9sbGJhY2sgYW5kIGNhbiBubyBsb25nZXIgYmUgZmV0Y2hlZCBmcm9tLiI7CiAKIHN0YXRpYyBweXNxbGl0ZV9TdGF0ZW1lbnRLaW5kIGRldGVjdF9zdGF0ZW1lbnRfdHlwZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQpCiB7CkBAIC0yNDIsOCArMjQyLDcgQEAKICAgICBjb25zdCBjaGFyKiBwb3M7CiAKICAgICBpZiAoIWNvbG5hbWUpIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogCiAgICAgZm9yIChwb3MgPSBjb2xuYW1lOzsgcG9zKyspIHsKQEAgLTkxNCw4ICs5MTMsNyBAQAogCiAgICAgcm93ID0gcHlzcWxpdGVfY3Vyc29yX2l0ZXJuZXh0KHNlbGYpOwogICAgIGlmICghcm93ICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIAogICAgIHJldHVybiByb3c7CkBAIC05OTYsOCArOTk0LDcgQEAKIFB5T2JqZWN0KiBweXNxbGl0ZV9ub29wKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewogICAgIC8qIGRvbid0IGNhcmUsIHJldHVybiBOb25lICovCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeU9iamVjdCogcHlzcWxpdGVfY3Vyc29yX2Nsb3NlKHB5c3FsaXRlX0N1cnNvciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCkBAIC0xMDEzLDggKzEwMTAsNyBAQAogCiAgICAgc2VsZi0+Y2xvc2VkID0gMTsKIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGN1cnNvcl9tZXRob2RzW10gPSB7CkBAIC0xMDUwLDcgKzEwNDYsNyBAQAogICAgIHtOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgY3Vyc29yX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGN1cnNvcl9kb2NbXSA9CiBQeURvY19TVFIoIlNRTGl0ZSBkYXRhYmFzZSBjdXJzb3IgY2xhc3MuIik7CiAKIFB5VHlwZU9iamVjdCBweXNxbGl0ZV9DdXJzb3JUeXBlID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCmluZGV4IDdhN2U4NjAuLjdjZDZkMmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKQEAgLTEzOSw4ICsxMzksNyBAQAogICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgIkNoYW5naW5nIHRoZSBzaGFyZWRfY2FjaGUgZmxhZyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xNzIsOCArMTcxLDcgQEAKICAgICBpZiAocmMgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIobW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXJfZG9jLApAQCAtMjIxLDggKzIxOSw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzX2RvYywKQEAgLTI2MSwxMyArMjU4LDEzIEBACiB9OwogCiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciB7Ci0gICAgY2hhciogY29uc3RhbnRfbmFtZTsKKyAgICBjb25zdCBjaGFyICpjb25zdGFudF9uYW1lOwogICAgIGludCBjb25zdGFudF92YWx1ZTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOwogCi1zdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CitzdGF0aWMgY29uc3QgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CiAgICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAogICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NyZS5jIGIvTW9kdWxlcy9fc3JlLmMKaW5kZXggMTUwMjI5ZC4uZmIwYWIwMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3JlLmMKKysrIGIvTW9kdWxlcy9fc3JlLmMKQEAgLTM1LDcgKzM1LDcgQEAKICAqIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KICAqLwogCi1zdGF0aWMgY2hhciBjb3B5cmlnaHRbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5cmlnaHRbXSA9CiAgICAgIiBTUkUgMi4yLjIgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIgIjsKIAogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCkBAIC02Miw5ICs2Miw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogb3B0aW9uYWwgZmVhdHVyZXMgKi8KIAotLyogZW5hYmxlcyBmYXN0IHNlYXJjaGluZyAqLwotI2RlZmluZSBVU0VfRkFTVF9TRUFSQ0gKLQogLyogZW5hYmxlcyBjb3B5L2RlZXBjb3B5IGhhbmRsaW5nICh3b3JrIGluIHByb2dyZXNzKSAqLwogI3VuZGVmIFVTRV9CVUlMVElOX0NPUFkKIApAQCAtNzE3LDcgKzcxNCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLWNhbGwoY2hhciogbW9kdWxlLCBjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGFyZ3MpCitjYWxsKGNvbnN0IGNoYXIqIG1vZHVsZSwgY29uc3QgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBhcmdzKQogewogICAgIFB5T2JqZWN0KiBuYW1lOwogICAgIFB5T2JqZWN0KiBtb2Q7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IDExMTdiNTUuLmVhZDViMGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC0zNzgsNyArMzc4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLVB5U1NMX1NldEVycm9yKFB5U1NMU29ja2V0ICpvYmosIGludCByZXQsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQorUHlTU0xfU2V0RXJyb3IoUHlTU0xTb2NrZXQgKm9iaiwgaW50IHJldCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7CiAgICAgUHlPYmplY3QgKnR5cGUgPSBQeVNTTEVycm9yT2JqZWN0OwogICAgIGNoYXIgKmVycnN0ciA9IE5VTEw7CkBAIC00NjAsNyArNDYwLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLV9zZXRTU0xFcnJvciAoY2hhciAqZXJyc3RyLCBpbnQgZXJyY29kZSwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pIHsKK19zZXRTU0xFcnJvciAoY29uc3QgY2hhciAqZXJyc3RyLCBpbnQgZXJyY29kZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pIHsKIAogICAgIGlmIChlcnJzdHIgPT0gTlVMTCkKICAgICAgICAgZXJyY29kZSA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3N0cnVjdC5jIGIvTW9kdWxlcy9fc3RydWN0LmMKaW5kZXggZjk2NTU0MS4uZGY4MTkwMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3RydWN0LmMKKysrIGIvTW9kdWxlcy9fc3RydWN0LmMKQEAgLTcyMyw3ICs3MjMsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKICAgICB7J3gnLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIE5VTEx9LAogICAgIHsnYicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIG5wX2J5dGV9LAogICAgIHsnQicsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIG5wX3VieXRlfSwKQEAgLTExODksNyArMTE4OSw3IEBACiAKIAogc3RhdGljIGNvbnN0IGZvcm1hdGRlZiAqCi13aGljaHRhYmxlKGNoYXIgKipwZm10KQord2hpY2h0YWJsZShjb25zdCBjaGFyICoqcGZtdCkKIHsKICAgICBjb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCiAgICAgc3dpdGNoICgqZm10KSB7CkBAIC0xMjY4LDcgKzEyNjgsNyBAQAogCiAgICAgZm10ID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZi0+c19mb3JtYXQpOwogCi0gICAgZiA9IHdoaWNodGFibGUoKGNoYXIgKiopJmZtdCk7CisgICAgZiA9IHdoaWNodGFibGUoJmZtdCk7CiAKICAgICBzID0gZm10OwogICAgIHNpemUgPSAwOwpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXNfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNoYXIgKnN0YXJ0ZnJvbSkgeworc191bnBhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgY29uc3QgY2hhciAqc3RhcnRmcm9tKSB7CiAgICAgZm9ybWF0Y29kZSAqY29kZTsKICAgICBQeV9zc2l6ZV90IGkgPSAwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldyhzb3NlbGYtPnNfbGVuKTsKQEAgLTIyNzksNyArMjI3OSw3IEBACiAKICAgICAvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLwogICAgIHsKLSAgICAgICAgZm9ybWF0ZGVmICpuYXRpdmUgPSBuYXRpdmVfdGFibGU7CisgICAgICAgIGNvbnN0IGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOwogICAgICAgICBmb3JtYXRkZWYgKm90aGVyLCAqcHRyOwogI2lmIFBZX0xJVFRMRV9FTkRJQU4KICAgICAgICAgb3RoZXIgPSBsaWxlbmRpYW5fdGFibGU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0YnVmZmVyLmMgYi9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKaW5kZXggNDNkYjhhOC4uMTNkM2NjYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCisrKyBiL01vZHVsZXMvX3Rlc3RidWZmZXIuYwpAQCAtMTMsNyArMTMsNyBAQAogUHlPYmplY3QgKmNhbGNzaXplID0gTlVMTDsKIAogLyogY2FjaGUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzaW1wbGVfZm10ID0gIkIiOworc3RhdGljIGNvbnN0IGNoYXIgc2ltcGxlX2ZtdFtdID0gIkIiOwogUHlPYmplY3QgKnNpbXBsZV9mb3JtYXQgPSBOVUxMOwogI2RlZmluZSBTSU1QTEVfRk9STUFUKGZtdCkgKGZtdCA9PSBOVUxMIHx8IHN0cmNtcChmbXQsICJCIikgPT0gMCkKICNkZWZpbmUgRklYX0ZPUk1BVChmbXQpIChmbXQgPT0gTlVMTCA/ICJCIiA6IGZtdCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDcxYWE0MTkuLjhjNzk0ODUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtODg3LDcgKzg4Nyw3IEBACiBnZXRhcmdzX2tleXdvcmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIsImFyZzUiLCBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10PSIoaWkpaXwoaShpaSkpKGlpaSlpIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICIoaWkpaXwoaShpaSkpKGlpaSlpIjsKICAgICBpbnQgaW50X2FyZ3NbMTBdPXstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCkBAIC0xMDQ3LDcgKzEwNDcsNyBAQAogICAgIHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhudW0pOwogICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCiAgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCkBAIC0xMDY2LDcgKzEwNjYsNyBAQAogICAgIHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhudW0pOwogICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKICAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0gICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAogICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKQEAgLTI3MzMsNyArMjczMyw5IEBACiBzdGF0aWMgaW50CiBjaGVja190aW1lX3JvdW5kaW5nKGludCByb3VuZCkKIHsKLSAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUiAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKKyAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUgorICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcKKyAgICAgICAgJiYgcm91bmQgIT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIHJvdW5kaW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zNjE0LDYgKzM2MTYsMTM3IEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCAtIDEpOwogfQogCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9idWZmZXJfb3ZlcmZsb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVmZmVyIG92ZXJmbG93IHRvIGNoZWNrIHRoYXQgUHlNZW1fRnJlZSgpIGRldGVjdHMKKyAgICAgICB0aGUgb3ZlcmZsb3cgd2hlbiBkZWJ1ZyBob29rcyBhcmUgaW5zdGFsbGVkLiAqLworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYygxNik7CisgICAgYnVmZmVyWzE2XSA9ICd4JzsKKyAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorcHltZW1fYXBpX21pc3VzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBtaXN1c2FnZSBvZiBQeXRob24gYWxsb2NhdG9yczoKKyAgICAgICBhbGxvY29jYXRlIHdpdGggUHlNZW0gYnV0IHJlbGVhc2Ugd2l0aCBQeU1lbV9SYXcuICovCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDE2KTsKKyAgICBQeU1lbV9SYXdGcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIGJ1ZyB0byB0ZXN0IGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yczoKKyAgICAgICBjYWxsIFB5TWVtX01hbGxvYygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYygxMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIFB5TWVtX0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVnIHRvIHRlc3QgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzOgorICAgICAgIGNhbGwgUHlPYmplY3RfTWFsbG9jKCkgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYnVmZmVyID0gUHlPYmplY3RfTWFsbG9jKDEwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgUHlPYmplY3RfRnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit0cmFjZW1hbGxvY190cmFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICBQeU9iamVjdCAqcHRyX29iajsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGludCByZWxlYXNlX2dpbCA9IDA7CisgICAgaW50IHJlczsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSU9ufGkiLCAmZG9tYWluLCAmcHRyX29iaiwgJnNpemUsICZyZWxlYXNlX2dpbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9IFB5TG9uZ19Bc1ZvaWRQdHIocHRyX29iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHJlbGVhc2VfZ2lsKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX1B5VHJhY2VNYWxsb2NfVHJhY2soZG9tYWluLCAoUHlfdWludHB0cl90KXB0ciwgc2l6ZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19UcmFjayhkb21haW4sIChQeV91aW50cHRyX3QpcHRyLCBzaXplKTsKKyAgICB9CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiX1B5VHJhY2VNYWxsb2NfVHJhY2sgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit0cmFjZW1hbGxvY191bnRyYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluOworICAgIFB5T2JqZWN0ICpwdHJfb2JqOworICAgIHZvaWQgKnB0cjsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJTyIsICZkb21haW4sICZwdHJfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKGRvbWFpbiwgKFB5X3VpbnRwdHJfdClwdHIpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJfUHlUcmFjZU1hbGxvY19UcmFjayBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBkb21haW47CisgICAgUHlPYmplY3QgKnB0cl9vYmo7CisgICAgdm9pZCAqcHRyOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJTyIsICZkb21haW4sICZwdHJfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrKGRvbWFpbiwgKFB5X3VpbnRwdHJfdClwdHIpOworfQorCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUZXN0TWV0aG9kc1tdID0gewogICAgIHsicmFpc2VfZXhjZXB0aW9uIiwgICAgICAgICByYWlzZV9leGNlcHRpb24sICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LApAQCAtMzc5Niw2ICszOTI5LDEzIEBACiAgICAgeyJQeVRpbWVfQXNNaWxsaXNlY29uZHMiLCB0ZXN0X1B5VGltZV9Bc01pbGxpc2Vjb25kcywgTUVUSF9WQVJBUkdTfSwKICAgICB7IlB5VGltZV9Bc01pY3Jvc2Vjb25kcyIsIHRlc3RfUHlUaW1lX0FzTWljcm9zZWNvbmRzLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiZ2V0X3JlY3Vyc2lvbl9kZXB0aCIsIGdldF9yZWN1cnNpb25fZGVwdGgsIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5bWVtX2J1ZmZlcl9vdmVyZmxvdyIsIHB5bWVtX2J1ZmZlcl9vdmVyZmxvdywgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fYXBpX21pc3VzZSIsIHB5bWVtX2FwaV9taXN1c2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5bWVtX21hbGxvY193aXRob3V0X2dpbCIsIHB5bWVtX21hbGxvY193aXRob3V0X2dpbCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHlvYmplY3RfbWFsbG9jX3dpdGhvdXRfZ2lsIiwgcHlvYmplY3RfbWFsbG9jX3dpdGhvdXRfZ2lsLCBNRVRIX05PQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY190cmFjayIsIHRyYWNlbWFsbG9jX3RyYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidHJhY2VtYWxsb2NfdW50cmFjayIsIHRyYWNlbWFsbG9jX3VudHJhY2ssIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrIiwgdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjaywgTUVUSF9WQVJBUkdTfSwKICAgICB7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTM4NTksNyArMzk5OSw3IEBACiAgICAgICAgICJUX0xPTkdMT05HIiwgIlRfVUxPTkdMT05HIiwKICNlbmRpZgogICAgICAgICBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gInxiYkJoSGlJbGtuZmRzIyIKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJ8YmJCaEhpSWxrbmZkcyMiCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgIkxLIgogI2VuZGlmCkBAIC00MjE0LDYgKzQzNTQsNyBAQAogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NQVgiLCBQeUxvbmdfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUlOIiwgUHlMb25nX0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfUFlHQ19IRUFEIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfVElNRV9UIiwgUHlMb25nX0Zyb21Tc2l6ZV90KHNpemVvZih0aW1lX3QpKSk7CiAgICAgUHlfSU5DUkVGKCZQeUluc3RhbmNlTWV0aG9kX1R5cGUpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiaW5zdGFuY2VtZXRob2QiLCAoUHlPYmplY3QgKikmUHlJbnN0YW5jZU1ldGhvZF9UeXBlKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYyBiL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKaW5kZXggMjAwNTIwNS4uMDNlZGEyNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYworKysgYi9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCkBAIC02MSw3ICs2MSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLUV4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK0V4YW1wbGVfc2V0YXR0cihFeGFtcGxlT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGtpbnRlci5jIGIvTW9kdWxlcy9fdGtpbnRlci5jCmluZGV4IDQxYWQ1ZjkuLjc2OGRmODEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3RraW50ZXIuYworKysgYi9Nb2R1bGVzL190a2ludGVyLmMKQEAgLTg0MSw3ICs4NDEsNyBAQAogICAgIFB5X0RFQ1JFRih0cCk7CiB9CiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIgKgogUHlUY2xPYmplY3RfVGNsU3RyaW5nKFB5T2JqZWN0ICpzZWxmKQogewogICAgIHJldHVybiBUY2xfR2V0U3RyaW5nKCgoUHlUY2xPYmplY3QqKXNlbGYpLT52YWx1ZSk7CkBAIC0xNzI2LDcgKzE3MjYsNyBAQAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewogICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKKyAgICBjb25zdCBjaGFyICoqb3V0ID0gKGNvbnN0IGNoYXIqKilfb3V0OwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKGluKSkgewogICAgICAgICBpZiAoUHlCeXRlc19TaXplKGluKSA+IElOVF9NQVgpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiYnl0ZXMgb2JqZWN0IGlzIHRvbyBsb25nIik7CkBAIC0xODQ2LDcgKzE4NDYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncykKIHsKLSAgICBjaGFyICpuYW1lMSwgKm5hbWUyOworICAgIGNvbnN0IGNoYXIgKm5hbWUxLCAqbmFtZTI7CiAgICAgUHlPYmplY3QgKm5ld1ZhbHVlOwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFRjbF9PYmogKm5ld3ZhbCwgKm9rOwpAQCAtMTkxNSw3ICsxOTE1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0gICAgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOworICAgIGNvbnN0IGNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBUY2xfT2JqICp0cmVzOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jIGIvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYwppbmRleCA3OTZhYzBmLi5iZWRhMmI2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jCisrKyBiL01vZHVsZXMvX3RyYWNlbWFsbG9jLmMKQEAgLTM5LDcgKzM5LDExIEBACiAgICAgLyogbGltaXQgb2YgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gYSB0cmFjZWJhY2ssIDEgYnkgZGVmYXVsdC4KICAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KICAgICBpbnQgbWF4X25mcmFtZTsKLX0gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMX07CisKKyAgICAvKiB1c2UgZG9tYWluIGluIHRyYWNlIGtleT8KKyAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KKyAgICBpbnQgdXNlX2RvbWFpbjsKK30gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMSwgMH07CiAKICNpZiBkZWZpbmVkKFRSQUNFX1JBV19NQUxMT0MpICYmIGRlZmluZWQoV0lUSF9USFJFQUQpCiAvKiBUaGlzIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2UgdHJhY2VtYWxsb2NfZnJlZSgpIGlzIGNhbGxlZCB3aXRob3V0CkBAIC01NCwxMCArNTgsMjEgQEAKICMgIGRlZmluZSBUQUJMRVNfVU5MT0NLKCkKICNlbmRpZgogCisKKyNkZWZpbmUgREVGQVVMVF9ET01BSU4gMAorCisvKiBQYWNrIHRoZSBmcmFtZV90IHN0cnVjdHVyZSB0byByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQuICovCit0eXBlZGVmIHN0cnVjdAorI2lmZGVmIF9fR05VQ19fCitfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCit7CisgICAgUHlfdWludHB0cl90IHB0cjsKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW47Cit9IHBvaW50ZXJfdDsKKwogLyogUGFjayB0aGUgZnJhbWVfdCBzdHJ1Y3R1cmUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50IG9uIDY0LWJpdAotICAgYXJjaGl0ZWN0dXJlczogMTIgYnl0ZXMgaW5zdGVhZCBvZiAxNi4gVGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgcHJvZHVjZQotICAgU0lHQlVTIG9uIGFyY2hpdGVjdHVyZXMgbm90IHN1cHBvcnRpbmcgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyAoNjQtYml0Ci0gICBNSVBTIENQVT8pOiBvbiBzdWNoIGFyY2hpdGVjdHVyZSwgdGhlIHN0cnVjdHVyZSBtdXN0IG5vdCBiZSBwYWNrZWQuICovCisgICBhcmNoaXRlY3R1cmVzOiAxMiBieXRlcyBpbnN0ZWFkIG9mIDE2LiAqLwogdHlwZWRlZiBzdHJ1Y3QKICNpZmRlZiBfX0dOVUNfXwogX19hdHRyaWJ1dGVfXygocGFja2VkKSkKQEAgLTY1LDEwICs4MCwxMyBAQAogX2RlY2xzcGVjKGFsaWduKDQpKQogI2VuZGlmCiB7CisgICAgLyogZmlsZW5hbWUgY2Fubm90IGJlIE5VTEw6ICI8dW5rbm93bj4iIGlzIHVzZWQgaWYgdGhlIFB5dGhvbiBmcmFtZQorICAgICAgIGZpbGVuYW1lIGlzIE5VTEwgKi8KICAgICBQeU9iamVjdCAqZmlsZW5hbWU7CiAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKIH0gZnJhbWVfdDsKIAorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlfdWhhc2hfdCBoYXNoOwogICAgIGludCBuZnJhbWU7CkBAIC04MSw2ICs5OSw3IEBACiAjZGVmaW5lIE1BWF9ORlJBTUUgXAogICAgICAgICAoKElOVF9NQVggLSAoaW50KXNpemVvZih0cmFjZWJhY2tfdCkpIC8gKGludClzaXplb2YoZnJhbWVfdCkgKyAxKQogCisKIHN0YXRpYyBQeU9iamVjdCAqdW5rbm93bl9maWxlbmFtZSA9IE5VTEw7CiBzdGF0aWMgdHJhY2ViYWNrX3QgdHJhY2VtYWxsb2NfZW1wdHlfdHJhY2ViYWNrOwogCkBAIC05Myw2ICsxMTIsNyBAQAogICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CiB9IHRyYWNlX3Q7CiAKKwogLyogU2l6ZSBpbiBieXRlcyBvZiBjdXJyZW50bHkgdHJhY2VkIG1lbW9yeS4KICAgIFByb3RlY3RlZCBieSBUQUJMRVNfTE9DSygpLiAqLwogc3RhdGljIHNpemVfdCB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID0gMDsKQEAgLTExOSw2ICsxMzksNyBAQAogICAgUHJvdGVjdGVkIGJ5IFRBQkxFU19MT0NLKCkuICovCiBzdGF0aWMgX1B5X2hhc2h0YWJsZV90ICp0cmFjZW1hbGxvY190cmFjZXMgPSBOVUxMOwogCisKICNpZmRlZiBUUkFDRV9ERUJVRwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtMTMzLDYgKzE1NCw3IEBACiB9CiAjZW5kaWYKIAorCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKQogI2RlZmluZSBSRUVOVFJBTlRfVEhSRUFETE9DQUwKIApAQCAtMTQzLDcgKzE2NSw3IEBACiAjICBlcnJvciAibmVlZCBuYXRpdmUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykiCiAjZW5kaWYKIAotc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5Oworc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5ID0gLTE7CiAKIC8qIEFueSBub24tTlVMTCBwb2ludGVyIGNhbiBiZSB1c2VkICovCiAjZGVmaW5lIFJFRU5UUkFOVCBQeV9UcnVlCkBAIC0xNTEsNyArMTczLDEwIEBACiBzdGF0aWMgaW50CiBnZXRfcmVlbnRyYW50KHZvaWQpCiB7Ci0gICAgdm9pZCAqcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKKyAgICB2b2lkICpwdHI7CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisgICAgcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKICAgICBpZiAocHRyICE9IE5VTEwpIHsKICAgICAgICAgYXNzZXJ0KHB0ciA9PSBSRUVOVFJBTlQpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTE2NCwxMiArMTg5LDE0IEBACiBzZXRfcmVlbnRyYW50KGludCByZWVudHJhbnQpCiB7CiAgICAgYXNzZXJ0KHJlZW50cmFudCA9PSAwIHx8IHJlZW50cmFudCA9PSAxKTsKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisKICAgICBpZiAocmVlbnRyYW50KSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IE5VTEwpOworICAgICAgICBhc3NlcnQoIWdldF9yZWVudHJhbnQoKSk7CiAgICAgICAgIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSwgUkVFTlRSQU5UKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IFJFRU5UUkFOVCk7CisgICAgICAgIGFzc2VydChnZXRfcmVlbnRyYW50KCkpOwogICAgICAgICBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXksIE5VTEwpOwogICAgIH0KIH0KQEAgLTE5NCwyNyArMjIxLDc1IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludAotaGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCisKK3N0YXRpYyBQeV91aGFzaF90CitoYXNodGFibGVfaGFzaF9weW9iamVjdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQogewotICAgIGlmIChrZXkgIT0gTlVMTCAmJiBlbnRyeS0+a2V5ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAoUHlVbmljb2RlX0NvbXBhcmUoKFB5T2JqZWN0ICopa2V5LCAoUHlPYmplY3QgKillbnRyeS0+a2V5KSA9PSAwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBrZXkgPT0gZW50cnktPmtleTsKKyAgICBQeU9iamVjdCAqb2JqOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgb2JqKTsKKyAgICByZXR1cm4gUHlPYmplY3RfSGFzaChvYmopOwogfQogCi1zdGF0aWMgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBoYXNodGFibGVfYWxsb2MgPSB7bWFsbG9jLCBmcmVlfTsKKworc3RhdGljIGludAoraGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQoreworICAgIFB5T2JqZWN0ICprZXkxLCAqa2V5MjsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIGtleTEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBrZXkyKTsKKworICAgIGlmIChrZXkxICE9IE5VTEwgJiYga2V5MiAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VW5pY29kZV9Db21wYXJlKGtleTEsIGtleTIpID09IDApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGtleTEgPT0ga2V5MjsKK30KKworCitzdGF0aWMgUHlfdWhhc2hfdAoraGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCit7CisgICAgcG9pbnRlcl90IHB0cjsKKyAgICBQeV91aGFzaF90IGhhc2g7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBwdHIpOworCisgICAgaGFzaCA9IChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcigodm9pZCopcHRyLnB0cik7CisgICAgaGFzaCBePSBwdHIuZG9tYWluOworICAgIHJldHVybiBoYXNoOworfQorCisKK2ludAoraGFzaHRhYmxlX2NvbXBhcmVfcG9pbnRlcl90KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKK3sKKyAgICBwb2ludGVyX3QgcHRyMSwgcHRyMjsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIHB0cjEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBwdHIyKTsKKworICAgIC8qIGNvbXBhcmUgcG9pbnRlciBiZWZvcmUgZG9tYWluLCBiZWNhdXNlIHBvaW50ZXIgaXMgbW9yZSBsaWtlbHkgdG8gYmUKKyAgICAgICBkaWZmZXJlbnQgKi8KKyAgICByZXR1cm4gKHB0cjEucHRyID09IHB0cjIucHRyICYmIHB0cjEuZG9tYWluID09IHB0cjIuZG9tYWluKTsKKworfQorCiAKIHN0YXRpYyBfUHlfaGFzaHRhYmxlX3QgKgotaGFzaHRhYmxlX25ldyhzaXplX3QgZGF0YV9zaXplLAoraGFzaHRhYmxlX25ldyhzaXplX3Qga2V5X3NpemUsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYywKICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jKQogewotICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGRhdGFfc2l6ZSwgMCwKKyAgICBfUHlfaGFzaHRhYmxlX2FsbG9jYXRvcl90IGhhc2h0YWJsZV9hbGxvYyA9IHttYWxsb2MsIGZyZWV9OworICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX25ld19mdWxsKGtleV9zaXplLCBkYXRhX3NpemUsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9mdW5jLCBjb21wYXJlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgJmhhc2h0YWJsZV9hbGxvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc2h0YWJsZV9hbGxvYyk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiByYXdfbWFsbG9jKHNpemVfdCBzaXplKQogewpAQCAtMjI3LDIxICszMDIsMjggQEAKICAgICBhbGxvY2F0b3JzLnJhdy5mcmVlKGFsbG9jYXRvcnMucmF3LmN0eCwgcHRyKTsKIH0KIAorCiBzdGF0aWMgUHlfdWhhc2hfdAotaGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrKGNvbnN0IHZvaWQgKmtleSkKK2hhc2h0YWJsZV9oYXNoX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQogewotICAgIGNvbnN0IHRyYWNlYmFja190ICp0cmFjZWJhY2sgPSBrZXk7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIHRyYWNlYmFjayk7CiAgICAgcmV0dXJuIHRyYWNlYmFjay0+aGFzaDsKIH0KIAorCiBzdGF0aWMgaW50Ci1oYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2soY29uc3QgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICpoZSkKK2hhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCiB7Ci0gICAgY29uc3QgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazIgPSBoZS0+a2V5OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2sxLCAqdHJhY2ViYWNrMjsKICAgICBjb25zdCBmcmFtZV90ICpmcmFtZTEsICpmcmFtZTI7CiAgICAgaW50IGk7CiAKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCB0cmFjZWJhY2sxKTsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgdHJhY2ViYWNrMik7CisKICAgICBpZiAodHJhY2ViYWNrMS0+bmZyYW1lICE9IHRyYWNlYmFjazItPm5mcmFtZSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTI2MCw2ICszNDIsNyBAQAogICAgIHJldHVybiAxOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19nZXRfZnJhbWUoUHlGcmFtZU9iamVjdCAqcHlmcmFtZSwgZnJhbWVfdCAqZnJhbWUpCiB7CkBAIC0zMTAsMTUgKzM5MywxNSBAQAogICAgIH0KIAogICAgIC8qIGludGVybiB0aGUgZmlsZW5hbWUgKi8KLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUpOworICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBmaWxlbmFtZSk7CiAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKLSAgICAgICAgZmlsZW5hbWUgPSAoUHlPYmplY3QgKillbnRyeS0+a2V5OworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZW50cnksIGZpbGVuYW1lKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIC8qIHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyBpcyByZXNwb25zaWJsZSB0byBrZWVwIGEgcmVmZXJlbmNlCiAgICAgICAgICAgIHRvIHRoZSBmaWxlbmFtZSAqLwogICAgICAgICBQeV9JTkNSRUYoZmlsZW5hbWUpOwotICAgICAgICBpZiAoX1B5X2hhc2h0YWJsZV9zZXQodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBmaWxlbmFtZSwgTlVMTCwgMCkgPCAwKSB7CisgICAgICAgIGlmIChfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBmaWxlbmFtZSkgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoZmlsZW5hbWUpOwogI2lmZGVmIFRSQUNFX0RFQlVHCiAgICAgICAgICAgICB0cmFjZW1hbGxvY19lcnJvcigiZmFpbGVkIHRvIGludGVybiB0aGUgZmlsZW5hbWUiKTsKQEAgLTMzMSw2ICs0MTQsNyBAQAogICAgIGZyYW1lLT5maWxlbmFtZSA9IGZpbGVuYW1lOwogfQogCisKIHN0YXRpYyBQeV91aGFzaF90CiB0cmFjZWJhY2tfaGFzaCh0cmFjZWJhY2tfdCAqdHJhY2ViYWNrKQogewpAQCAtMzU1LDYgKzQzOSw3IEBACiAgICAgcmV0dXJuIHg7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlYmFja19nZXRfZnJhbWVzKHRyYWNlYmFja190ICp0cmFjZWJhY2spCiB7CkBAIC0zODIsNiArNDY3LDcgQEAKICAgICB9CiB9CiAKKwogc3RhdGljIHRyYWNlYmFja190ICoKIHRyYWNlYmFja19uZXcodm9pZCkKIHsKQEAgLTQwMSw5ICs0ODcsOSBAQAogICAgIHRyYWNlYmFjay0+aGFzaCA9IHRyYWNlYmFja19oYXNoKHRyYWNlYmFjayk7CiAKICAgICAvKiBpbnRlcm4gdGhlIHRyYWNlYmFjayAqLwotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgdHJhY2ViYWNrKTsKKyAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIHRyYWNlYmFjayk7CiAgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKLSAgICAgICAgdHJhY2ViYWNrID0gKHRyYWNlYmFja190ICopZW50cnktPmtleTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCBlbnRyeSwgdHJhY2ViYWNrKTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIHRyYWNlYmFja190ICpjb3B5OwpAQCAtNDIwLDcgKzUwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGNvcHksIHRyYWNlYmFjaywgdHJhY2ViYWNrX3NpemUpOwogCi0gICAgICAgIGlmIChfUHlfaGFzaHRhYmxlX3NldCh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCBjb3B5LCBOVUxMLCAwKSA8IDApIHsKKyAgICAgICAgaWYgKF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCBjb3B5KSA8IDApIHsKICAgICAgICAgICAgIHJhd19mcmVlKGNvcHkpOwogI2lmZGVmIFRSQUNFX0RFQlVHCiAgICAgICAgICAgICB0cmFjZW1hbGxvY19lcnJvcigiZmFpbGVkIHRvIGludGVybiB0aGUgdHJhY2ViYWNrOiBwdXRkYXRhIGZhaWxlZCIpOwpAQCAtNDMyLDQ2ICs1MTgsMTU0IEBACiAgICAgcmV0dXJuIHRyYWNlYmFjazsKIH0KIAorCiBzdGF0aWMgaW50Ci10cmFjZW1hbGxvY19hZGRfdHJhY2Uodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3RyYWNlbWFsbG9jX3VzZV9kb21haW5fY2IoX1B5X2hhc2h0YWJsZV90ICpvbGRfdHJhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7Ci0gICAgdHJhY2VfdCB0cmFjZTsKLSAgICBpbnQgcmVzOworICAgIFB5X3VpbnRwdHJfdCBwdHI7CisgICAgcG9pbnRlcl90IGtleTsKKyAgICBfUHlfaGFzaHRhYmxlX3QgKm5ld190cmFjZXMgPSAoX1B5X2hhc2h0YWJsZV90ICopdXNlcl9kYXRhOworICAgIGNvbnN0IHZvaWQgKnBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQShvbGRfdHJhY2VzLCBlbnRyeSk7CiAKLSNpZmRlZiBXSVRIX1RIUkVBRAotICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOwotI2VuZGlmCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShvbGRfdHJhY2VzLCBlbnRyeSwgcHRyKTsKKyAgICBrZXkucHRyID0gcHRyOworICAgIGtleS5kb21haW4gPSBERUZBVUxUX0RPTUFJTjsKIAotICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja19uZXcoKTsKLSAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCisgICAgcmV0dXJuIF9QeV9oYXNodGFibGVfc2V0KG5ld190cmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrZXkpLCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfdHJhY2VzLT5kYXRhX3NpemUsIHBkYXRhKTsKK30KKworCisvKiBDb252ZXJ0IHRyYWNlbWFsbG9jX3RyYWNlcyBmcm9tIGNvbXBhY3Qga2V5IChQeV91aW50cHRyX3QpIHRvIHBvaW50ZXJfdCBrZXkuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gKi8KK3N0YXRpYyBpbnQKK3RyYWNlbWFsbG9jX3VzZV9kb21haW4odm9pZCkKK3sKKyAgICBfUHlfaGFzaHRhYmxlX3QgKm5ld190cmFjZXMgPSBOVUxMOworCisgICAgYXNzZXJ0KCF0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbik7CisKKyAgICBuZXdfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YocG9pbnRlcl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3BvaW50ZXJfdCk7CisgICAgaWYgKG5ld190cmFjZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICB0cmFjZS5zaXplID0gc2l6ZTsKLSAgICB0cmFjZS50cmFjZWJhY2sgPSB0cmFjZWJhY2s7Ci0KLSAgICByZXMgPSBfUHlfSEFTSFRBQkxFX1NFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOwotICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICBhc3NlcnQodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA8PSBQWV9TSVpFX01BWCAtIHNpemUpOwotICAgICAgICB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ICs9IHNpemU7Ci0gICAgICAgIGlmICh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID4gdHJhY2VtYWxsb2NfcGVha190cmFjZWRfbWVtb3J5KQotICAgICAgICAgICAgdHJhY2VtYWxsb2NfcGVha190cmFjZWRfbWVtb3J5ID0gdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVzOworICAgIGlmIChfUHlfaGFzaHRhYmxlX2ZvcmVhY2godHJhY2VtYWxsb2NfdHJhY2VzLCB0cmFjZW1hbGxvY191c2VfZG9tYWluX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3RyYWNlcykgPCAwKQorICAgIHsKKyAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KG5ld190cmFjZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlcyk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gbmV3X3RyYWNlczsKKworICAgIHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluID0gMTsKKworICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCi10cmFjZW1hbGxvY19yZW1vdmVfdHJhY2Uodm9pZCAqcHRyKQordHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0cikKIHsKICAgICB0cmFjZV90IHRyYWNlOworICAgIGludCByZW1vdmVkOwogCi0gICAgaWYgKF9QeV9oYXNodGFibGVfcG9wKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCAmdHJhY2UsIHNpemVvZih0cmFjZSkpKSB7CisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKTsKKworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBwb2ludGVyX3Qga2V5ID0ge3B0ciwgZG9tYWlufTsKKyAgICAgICAgcmVtb3ZlZCA9IF9QeV9IQVNIVEFCTEVfUE9QKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5LCB0cmFjZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZW1vdmVkID0gX1B5X0hBU0hUQUJMRV9QT1AodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKKyAgICB9CisgICAgaWYgKCFyZW1vdmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+PSB0cmFjZS5zaXplKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IC09IHRyYWNlLnNpemU7Cit9CisKKyNkZWZpbmUgUkVNT1ZFX1RSQUNFKHB0cikgXAorICAgICAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKERFRkFVTFRfRE9NQUlOLCAoUHlfdWludHB0cl90KShwdHIpKQorCisKK3N0YXRpYyBpbnQKK3RyYWNlbWFsbG9jX2FkZF90cmFjZShfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCit7CisgICAgcG9pbnRlcl90IGtleSA9IHtwdHIsIGRvbWFpbn07CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKyAgICB0cmFjZV90IHRyYWNlOworICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCogZW50cnk7CisgICAgaW50IHJlczsKKworICAgIGFzc2VydCh0cmFjZW1hbGxvY19jb25maWcudHJhY2luZyk7CisKKyAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tfbmV3KCk7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluICYmIGRvbWFpbiAhPSBERUZBVUxUX0RPTUFJTikgeworICAgICAgICAvKiBmaXJzdCB0cmFjZSB1c2luZyBhIG5vbi16ZXJvIGRvbWFpbiB3aGVyZWFzIHRyYWNlcyB1c2UgY29tcGFjdAorICAgICAgICAgICAoUHlfdWludHB0cl90KSBrZXlzOiBzd2l0Y2ggdG8gcG9pbnRlcl90IGtleXMuICovCisgICAgICAgIGlmICh0cmFjZW1hbGxvY191c2VfZG9tYWluKCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY190cmFjZXMsIGtleSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyKTsKKyAgICB9CisKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkgeworICAgICAgICAvKiB0aGUgbWVtb3J5IGJsb2NrIGlzIGFscmVhZHkgdHJhY2tlZCAqLworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQSh0cmFjZW1hbGxvY190cmFjZXMsIGVudHJ5LCB0cmFjZSk7CiAgICAgICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID49IHRyYWNlLnNpemUpOwogICAgICAgICB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IC09IHRyYWNlLnNpemU7CisKKyAgICAgICAgdHJhY2Uuc2l6ZSA9IHNpemU7CisgICAgICAgIHRyYWNlLnRyYWNlYmFjayA9IHRyYWNlYmFjazsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9XUklURV9EQVRBKHRyYWNlbWFsbG9jX3RyYWNlcywgZW50cnksIHRyYWNlKTsKICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRyYWNlLnNpemUgPSBzaXplOworICAgICAgICB0cmFjZS50cmFjZWJhY2sgPSB0cmFjZWJhY2s7CisKKyAgICAgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgICAgICByZXMgPSBfUHlfSEFTSFRBQkxFX1NFVCh0cmFjZW1hbGxvY190cmFjZXMsIGtleSwgdHJhY2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gX1B5X0hBU0hUQUJMRV9TRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA8PSBQWV9TSVpFX01BWCAtIHNpemUpOworICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgKz0gc2l6ZTsKKyAgICBpZiAodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+IHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSkKKyAgICAgICAgdHJhY2VtYWxsb2NfcGVha190cmFjZWRfbWVtb3J5ID0gdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeTsKKyAgICByZXR1cm4gMDsKIH0KIAorI2RlZmluZSBBRERfVFJBQ0UocHRyLCBzaXplKSBcCisgICAgICAgICAgICB0cmFjZW1hbGxvY19hZGRfdHJhY2UoREVGQVVMVF9ET01BSU4sIChQeV91aW50cHRyX3QpKHB0ciksIHNpemUpCisKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19hbGxvYyhpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CkBAIC00ODgsNyArNjgyLDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBUQUJMRVNfTE9DSygpOwotICAgIGlmICh0cmFjZW1hbGxvY19hZGRfdHJhY2UocHRyLCBuZWxlbSAqIGVsc2l6ZSkgPCAwKSB7CisgICAgaWYgKEFERF9UUkFDRShwdHIsIG5lbGVtICogZWxzaXplKSA8IDApIHsKICAgICAgICAgLyogRmFpbGVkIHRvIGFsbG9jYXRlIGEgdHJhY2UgZm9yIHRoZSBuZXcgbWVtb3J5IGJsb2NrICovCiAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyKTsKQEAgLTQ5OCw2ICs2OTIsNyBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCiB7CkBAIC01MTIsOSArNzA3LDE0IEBACiAgICAgICAgIC8qIGFuIGV4aXN0aW5nIG1lbW9yeSBibG9jayBoYXMgYmVlbiByZXNpemVkICovCiAKICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CiAKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jX2FkZF90cmFjZSgpIHVwZGF0ZXMgdGhlIHRyYWNlIGlmIHRoZXJlIGlzIGFscmVhZHkKKyAgICAgICAgICAgYSB0cmFjZSBhdCBhZGRyZXNzIChkb21haW4sIHB0cjIpICovCisgICAgICAgIGlmIChwdHIyICE9IHB0cikgeworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQUREX1RSQUNFKHB0cjIsIG5ld19zaXplKSA8IDApIHsKICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gVGhlIGVycm9yIGNhbm5vdCBiZSByZXBvcnRlZCB0bwogICAgICAgICAgICAgICAgdGhlIGNhbGxlciwgYmVjYXVzZSByZWFsbG9jKCkgbWF5IGFscmVhZHkgaGF2ZSBzaHJpbmtlZCB0aGUKICAgICAgICAgICAgICAgIG1lbW9yeSBibG9jayBhbmQgc28gcmVtb3ZlZCBieXRlcy4KQEAgLTUzMiw3ICs3MzIsNyBAQAogICAgICAgICAvKiBuZXcgYWxsb2NhdGlvbiAqLwogCiAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgIGlmICh0cmFjZW1hbGxvY19hZGRfdHJhY2UocHRyMiwgbmV3X3NpemUpIDwgMCkgeworICAgICAgICBpZiAoQUREX1RSQUNFKHB0cjIsIG5ld19zaXplKSA8IDApIHsKICAgICAgICAgICAgIC8qIEZhaWxlZCB0byBhbGxvY2F0ZSBhIHRyYWNlIGZvciB0aGUgbmV3IG1lbW9yeSBibG9jayAqLwogICAgICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyMik7CkBAIC01NDMsNiArNzQzLDcgQEAKICAgICByZXR1cm4gcHRyMjsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfZnJlZSh2b2lkICpjdHgsIHZvaWQgKnB0cikKIHsKQEAgLTU1NywxMCArNzU4LDExIEBACiAgICAgYWxsb2MtPmZyZWUoYWxsb2MtPmN0eCwgcHRyKTsKIAogICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CisgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgVEFCTEVTX1VOTE9DSygpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKQEAgLTU4NSwxOCArNzg3LDIxIEBACiAgICAgcmV0dXJuIHB0cjsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX21hbGxvY19naWwodm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKDAsIGN0eCwgMSwgc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19jYWxsb2NfZ2lsKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19hbGxvY19naWwoMSwgY3R4LCBuZWxlbSwgZWxzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3JlYWxsb2NfZ2lsKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCiB7CkBAIC02MTIsNyArODE3LDcgQEAKICAgICAgICAgcHRyMiA9IGFsbG9jLT5yZWFsbG9jKGFsbG9jLT5jdHgsIHB0ciwgbmV3X3NpemUpOwogICAgICAgICBpZiAocHRyMiAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CisgICAgICAgICAgICBSRU1PVkVfVFJBQ0UocHRyKTsKICAgICAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcHRyMjsKQEAgLTYyOSw2ICs4MzQsNyBAQAogICAgIHJldHVybiBwdHIyOwogfQogCisKICNpZmRlZiBUUkFDRV9SQVdfTUFMTE9DCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19hbGxvYyhpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCkBAIC02NjMsMTggKzg2OSwyMSBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfbWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3Jhd19hbGxvYygwLCBjdHgsIDEsIHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X2NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfcmF3X2FsbG9jKDEsIGN0eCwgbmVsZW0sIGVsc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfcmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplKQogewpAQCAtNjkxLDcgKzkwMCw3IEBACiAKICAgICAgICAgaWYgKHB0cjIgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHB0cjI7CkBAIC03MTUsMjIgKzkyNCwzMSBAQAogfQogI2VuZGlmICAgLyogVFJBQ0VfUkFXX01BTExPQyAqLwogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2NsZWFyX2ZpbGVuYW1lKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX2NsZWFyX2ZpbGVuYW1lKF9QeV9oYXNodGFibGVfdCAqaHQsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgUHlPYmplY3QgKmZpbGVuYW1lID0gKFB5T2JqZWN0ICopZW50cnktPmtleTsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgZmlsZW5hbWUpOwogICAgIFB5X0RFQ1JFRihmaWxlbmFtZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2ViYWNrX2ZyZWVfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlYmFja19mcmVlX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX3QgKmh0LCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrID0gKHRyYWNlYmFja190ICopZW50cnktPmtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHRyYWNlYmFjayk7CiAgICAgcmF3X2ZyZWUodHJhY2ViYWNrKTsKICAgICByZXR1cm4gMDsKIH0KIAorCiAvKiByZWVudHJhbnQgZmxhZyBtdXN0IGJlIHNldCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYW5kIEdJTCBtdXN0IGJlIGhlbGQgKi8KIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19jbGVhcl90cmFjZXModm9pZCkKQEAgLTc1Myw2ICs5NzEsNyBAQAogICAgIF9QeV9oYXNodGFibGVfY2xlYXIodHJhY2VtYWxsb2NfZmlsZW5hbWVzKTsKIH0KIAorCiBzdGF0aWMgaW50CiB0cmFjZW1hbGxvY19pbml0KHZvaWQpCiB7CkBAIC03ODksMjEgKzEwMDgsMjkgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyA9IGhhc2h0YWJsZV9uZXcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYylQeU9iamVjdF9IYXNoLAorICAgIHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5T2JqZWN0ICopLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfcHlvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV91bmljb2RlKTsKIAotICAgIHRyYWNlbWFsbG9jX3RyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeV9oYXNodGFibGVfaGFzaF9mdW5jKWhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMpaGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2ViYWNrX3QgKiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayk7CiAKLSAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZih0cmFjZV90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YocG9pbnRlcl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3BvaW50ZXJfdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihQeV91aW50cHRyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QpOworICAgIH0KIAogICAgIGlmICh0cmFjZW1hbGxvY19maWxlbmFtZXMgPT0gTlVMTCB8fCB0cmFjZW1hbGxvY190cmFjZWJhY2tzID09IE5VTEwKLSAgICAgICAgfHwgdHJhY2VtYWxsb2NfdHJhY2VzID09IE5VTEwpCi0gICAgeworICAgICAgIHx8IHRyYWNlbWFsbG9jX3RyYWNlcyA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC04MjMsNiArMTA1MCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2RlaW5pdCh2b2lkKQogewpAQCAtODMzLDkgKzEwNjEsOSBAQAogICAgIHRyYWNlbWFsbG9jX3N0b3AoKTsKIAogICAgIC8qIGRlc3Ryb3kgaGFzaCB0YWJsZXMgKi8KLSAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2VzKTsKICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2ViYWNrcyk7CiAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyk7CisgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlcyk7CiAKICNpZiBkZWZpbmVkKFdJVEhfVEhSRUFEKSAmJiBkZWZpbmVkKFRSQUNFX1JBV19NQUxMT0MpCiAgICAgaWYgKHRhYmxlc19sb2NrICE9IE5VTEwpIHsKQEAgLTg0NiwxMSArMTA3NCwxMyBAQAogCiAjaWZkZWYgUkVFTlRSQU5UX1RIUkVBRExPQ0FMCiAgICAgUHlUaHJlYWRfZGVsZXRlX2tleSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKKyAgICB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5ID0gLTE7CiAjZW5kaWYKIAogICAgIFB5X1hERUNSRUYodW5rbm93bl9maWxlbmFtZSk7CiB9CiAKKwogc3RhdGljIGludAogdHJhY2VtYWxsb2Nfc3RhcnQoaW50IG1heF9uZnJhbWUpCiB7CkBAIC05MDcsNiArMTEzNyw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX3N0b3Aodm9pZCkKIHsKQEAgLTkyMyw4ICsxMTU0LDkgQEAKICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX01FTSwgJmFsbG9jYXRvcnMubWVtKTsKICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jYXRvcnMub2JqKTsKIAotICAgIC8qIHJlbGVhc2UgbWVtb3J5ICovCiAgICAgdHJhY2VtYWxsb2NfY2xlYXJfdHJhY2VzKCk7CisKKyAgICAvKiByZWxlYXNlIG1lbW9yeSAqLwogICAgIHJhd19mcmVlKHRyYWNlbWFsbG9jX3RyYWNlYmFjayk7CiAgICAgdHJhY2VtYWxsb2NfdHJhY2ViYWNrID0gTlVMTDsKIH0KQEAgLTkzNSw2ICsxMTY3LDcgQEAKICAgICAiVHJ1ZSBpZiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlIGlzIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyxcbiIKICAgICAiRmFsc2Ugb3RoZXJ3aXNlLiIpOwogCisKIHN0YXRpYyBQeU9iamVjdCoKIHB5X3RyYWNlbWFsbG9jX2lzX3RyYWNpbmcoUHlPYmplY3QgKnNlbGYpCiB7CkBAIC05NDYsNiArMTE3OSw3IEBACiAgICAgIlxuIgogICAgICJDbGVhciB0cmFjZXMgb2YgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQgYnkgUHl0aG9uLiIpOwogCisKIHN0YXRpYyBQeU9iamVjdCoKIHB5X3RyYWNlbWFsbG9jX2NsZWFyX3RyYWNlcyhQeU9iamVjdCAqc2VsZikKIHsKQEAgLTk1OSw2ICsxMTkzLDcgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCiBmcmFtZV90b19weW9iamVjdChmcmFtZV90ICpmcmFtZSkKIHsKQEAgLTk2OCw4ICsxMjAzLDYgQEAKICAgICBpZiAoZnJhbWVfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKGZyYW1lLT5maWxlbmFtZSA9PSBOVUxMKQotICAgICAgICBmcmFtZS0+ZmlsZW5hbWUgPSBQeV9Ob25lOwogICAgIFB5X0lOQ1JFRihmcmFtZS0+ZmlsZW5hbWUpOwogICAgIFB5VHVwbGVfU0VUX0lURU0oZnJhbWVfb2JqLCAwLCBmcmFtZS0+ZmlsZW5hbWUpOwogCkBAIC05ODMsNiArMTIxNiw3IEBACiAgICAgcmV0dXJuIGZyYW1lX29iajsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2ViYWNrX3QgKnRyYWNlYmFjaywgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdGFibGUpCiB7CkBAIC0xMDIxLDMzICsxMjU1LDQzIEBACiAgICAgcmV0dXJuIGZyYW1lczsKIH0KIAorCiBzdGF0aWMgUHlPYmplY3QqCi10cmFjZV90b19weW9iamVjdCh0cmFjZV90ICp0cmFjZSwgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdHJhY2ViYWNrcykKK3RyYWNlX3RvX3B5b2JqZWN0KF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgdHJhY2VfdCAqdHJhY2UsCisgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX3QgKmludGVybl90cmFjZWJhY2tzKQogewogICAgIFB5T2JqZWN0ICp0cmFjZV9vYmogPSBOVUxMOwotICAgIFB5T2JqZWN0ICpzaXplLCAqdHJhY2ViYWNrOworICAgIFB5T2JqZWN0ICpvYmo7CiAKLSAgICB0cmFjZV9vYmogPSBQeVR1cGxlX05ldygyKTsKKyAgICB0cmFjZV9vYmogPSBQeVR1cGxlX05ldygzKTsKICAgICBpZiAodHJhY2Vfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgc2l6ZSA9IFB5TG9uZ19Gcm9tU2l6ZV90KHRyYWNlLT5zaXplKTsKLSAgICBpZiAoc2l6ZSA9PSBOVUxMKSB7CisgICAgb2JqID0gUHlMb25nX0Zyb21TaXplX3QoZG9tYWluKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHRyYWNlX29iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMCwgc2l6ZSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDAsIG9iaik7CiAKLSAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UtPnRyYWNlYmFjaywgaW50ZXJuX3RyYWNlYmFja3MpOwotICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkgeworICAgIG9iaiA9IFB5TG9uZ19Gcm9tU2l6ZV90KHRyYWNlLT5zaXplKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKHRyYWNlX29iaik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMSwgdHJhY2ViYWNrKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMSwgb2JqKTsKKworICAgIG9iaiA9IHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZS0+dHJhY2ViYWNrLCBpbnRlcm5fdHJhY2ViYWNrcyk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDIsIG9iaik7CiAKICAgICByZXR1cm4gdHJhY2Vfb2JqOwogfQogCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBfUHlfaGFzaHRhYmxlX3QgKnRyYWNlczsKICAgICBfUHlfaGFzaHRhYmxlX3QgKnRyYWNlYmFja3M7CkBAIC0xMDU1LDE2ICsxMjk5LDI2IEBACiB9IGdldF90cmFjZXNfdDsKIAogc3RhdGljIGludAotdHJhY2VtYWxsb2NfZ2V0X3RyYWNlc19maWxsKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX2dldF90cmFjZXNfZmlsbChfUHlfaGFzaHRhYmxlX3QgKnRyYWNlcywgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7CiAgICAgZ2V0X3RyYWNlc190ICpnZXRfdHJhY2VzID0gdXNlcl9kYXRhOwotICAgIHRyYWNlX3QgKnRyYWNlOworICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbjsKKyAgICB0cmFjZV90IHRyYWNlOwogICAgIFB5T2JqZWN0ICp0cmFjZW1hbGxvY19vYmo7CiAgICAgaW50IHJlczsKIAotICAgIHRyYWNlID0gKHRyYWNlX3QgKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoZW50cnkpOworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBwb2ludGVyX3Qga2V5OworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKHRyYWNlcywgZW50cnksIGtleSk7CisgICAgICAgIGRvbWFpbiA9IGtleS5kb21haW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkb21haW4gPSBERUZBVUxUX0RPTUFJTjsKKyAgICB9CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogCi0gICAgdHJhY2VtYWxsb2Nfb2JqID0gdHJhY2VfdG9fcHlvYmplY3QodHJhY2UsIGdldF90cmFjZXMtPnRyYWNlYmFja3MpOworICAgIHRyYWNlbWFsbG9jX29iaiA9IHRyYWNlX3RvX3B5b2JqZWN0KGRvbWFpbiwgJnRyYWNlLCBnZXRfdHJhY2VzLT50cmFjZWJhY2tzKTsKICAgICBpZiAodHJhY2VtYWxsb2Nfb2JqID09IE5VTEwpCiAgICAgICAgIHJldHVybiAxOwogCkBAIC0xMDc2LDE0ICsxMzMwLDE5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKK3RyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYihfUHlfaGFzaHRhYmxlX3QgKnRyYWNlYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgUHlPYmplY3QgKm9iaiA9IChQeU9iamVjdCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2ViYWNrcywgZW50cnksIG9iaik7CiAgICAgUHlfREVDUkVGKG9iaik7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZXNfZG9jLAogICAgICJfZ2V0X3RyYWNlcygpIC0+IGxpc3RcbiIKICAgICAiXG4iCkBAIC0xMTEwLDcgKzEzNjksOCBAQAogCiAgICAgLyogdGhlIHRyYWNlYmFjayBoYXNoIHRhYmxlIGlzIHVzZWQgdGVtcG9yYXJpbHkgdG8gaW50ZXJuIHRyYWNlYmFjayB0dXBsZQogICAgICAgIG9mIChmaWxlbmFtZSwgbGluZW5vKSB0dXBsZXMgKi8KLSAgICBnZXRfdHJhY2VzLnRyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KHNpemVvZihQeU9iamVjdCAqKSwKKyAgICBnZXRfdHJhY2VzLnRyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KHNpemVvZih0cmFjZWJhY2tfdCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeU9iamVjdCAqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKICAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZWJhY2tzID09IE5VTEwpIHsKQEAgLTExNDIsMTUgKzE0MDIsNDMgQEAKIGZpbmFsbHk6CiAgICAgaWYgKGdldF90cmFjZXMudHJhY2ViYWNrcyAhPSBOVUxMKSB7CiAgICAgICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaChnZXRfdHJhY2VzLnRyYWNlYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYiwgTlVMTCk7CiAgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShnZXRfdHJhY2VzLnRyYWNlYmFja3MpOwogICAgIH0KLSAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZXMgIT0gTlVMTCkKKyAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZXMgIT0gTlVMTCkgewogICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koZ2V0X3RyYWNlcy50cmFjZXMpOworICAgIH0KIAogICAgIHJldHVybiBnZXRfdHJhY2VzLmxpc3Q7CiB9CiAKKworc3RhdGljIHRyYWNlYmFja190KgordHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIpCit7CisgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBpbnQgZm91bmQ7CisKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgICAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5LCB0cmFjZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgfQorICAgIFRBQkxFU19VTkxPQ0soKTsKKworICAgIGlmICghZm91bmQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHRyYWNlLnRyYWNlYmFjazsKK30KKworCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X29iamVjdF90cmFjZWJhY2tfZG9jLAogICAgICJfZ2V0X29iamVjdF90cmFjZWJhY2sob2JqKVxuIgogICAgICJcbiIKQEAgLTExNjUsMTEgKzE0NTMsNyBAQAogewogICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKICAgICB2b2lkICpwdHI7Ci0gICAgdHJhY2VfdCB0cmFjZTsKLSAgICBpbnQgZm91bmQ7Ci0KLSAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKQotICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwogCiAgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKICAgICBpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQpAQCAtMTE3NywxNiArMTQ2MSw0OCBAQAogICAgIGVsc2UKICAgICAgICAgcHRyID0gKHZvaWQgKilvYmo7CiAKLSAgICBUQUJMRVNfTE9DSygpOwotICAgIGZvdW5kID0gX1B5X0hBU0hUQUJMRV9HRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKLSAgICBUQUJMRVNfVU5MT0NLKCk7Ci0KLSAgICBpZiAoIWZvdW5kKQorICAgIHRyYWNlYmFjayA9IHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soREVGQVVMVF9ET01BSU4sIChQeV91aW50cHRyX3QpcHRyKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCiAgICAgICAgIFB5X1JFVFVSTl9OT05FOwogCi0gICAgcmV0dXJuIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZS50cmFjZWJhY2ssIE5VTEwpOworICAgIHJldHVybiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2ViYWNrLCBOVUxMKTsKIH0KIAorCisjZGVmaW5lIFBVVFMoZmQsIHN0cikgX1B5X3dyaXRlX25vcmFpc2UoZmQsIHN0ciwgKGludClzdHJsZW4oc3RyKSkKKworc3RhdGljIHZvaWQKK19QeU1lbV9EdW1wRnJhbWUoaW50IGZkLCBmcmFtZV90ICogZnJhbWUpCit7CisgICAgUFVUUyhmZCwgIiAgRmlsZSBcIiIpOworICAgIF9QeV9EdW1wQVNDSUkoZmQsIGZyYW1lLT5maWxlbmFtZSk7CisgICAgUFVUUyhmZCwgIlwiLCBsaW5lICIpOworICAgIF9QeV9EdW1wRGVjaW1hbChmZCwgZnJhbWUtPmxpbmVubyk7CisgICAgUFVUUyhmZCwgIlxuIik7Cit9CisKKy8qIER1bXAgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkIGludG8gZmlsZSBkZXNjcmlwdG9yCisgICBmZC4gVGhlIGZ1bmN0aW9uIG1heSBibG9jayBvbiBUQUJMRVNfTE9DSygpIGJ1dCBpdCBpcyB1bmxpa2VseS4gKi8KK3ZvaWQKK19QeU1lbV9EdW1wVHJhY2ViYWNrKGludCBmZCwgY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisgICAgaW50IGk7CisKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKERFRkFVTFRfRE9NQUlOLCAoUHlfdWludHB0cl90KXB0cik7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBQVVRTKGZkLCAiTWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBhdCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6XG4iKTsKKyAgICBmb3IgKGk9MDsgaSA8IHRyYWNlYmFjay0+bmZyYW1lOyBpKyspIHsKKyAgICAgICAgX1B5TWVtX0R1bXBGcmFtZShmZCwgJnRyYWNlYmFjay0+ZnJhbWVzW2ldKTsKKyAgICB9CisgICAgUFVUUyhmZCwgIlxuIik7Cit9CisKKyN1bmRlZiBQVVRTCisKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX3N0YXJ0X2RvYywKICAgICAic3RhcnQobmZyYW1lOiBpbnQ9MSlcbiIKICAgICAiXG4iCkBAIC0xMjIyLDYgKzE1MzgsNyBAQAogICAgICJTdG9wIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgY2xlYXIgdHJhY2VzXG4iCiAgICAgIm9mIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGJ5IFB5dGhvbi4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19zdG9wKFB5T2JqZWN0ICpzZWxmKQogewpAQCAtMTIyOSw2ICsxNTQ2LDcgQEAKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFja19saW1pdF9kb2MsCiAgICAgImdldF90cmFjZWJhY2tfbGltaXQoKSAtPiBpbnRcbiIKICAgICAiXG4iCkBAIC0xMjQ0LDYgKzE1NjIsNyBAQAogICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodHJhY2VtYWxsb2NfY29uZmlnLm1heF9uZnJhbWUpOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VtYWxsb2NfbWVtb3J5X2RvYywKICAgICAiZ2V0X3RyYWNlbWFsbG9jX21lbW9yeSgpIC0+IGludFxuIgogICAgICJcbiIKQEAgLTEyNjcsNiArMTU4Niw3IEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4iLCBzaXplX29iaik7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZWRfbWVtb3J5X2RvYywKICAgICAiZ2V0X3RyYWNlZF9tZW1vcnkoKSAtPiAoaW50LCBpbnQpXG4iCiAgICAgIlxuIgpAQCAtMTI5Miw2ICsxNjEyLDcgQEAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTk4iLCBzaXplX29iaiwgcGVha19zaXplX29iaik7CiB9CiAKKwogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICAgeyJpc190cmFjaW5nIiwgKFB5Q0Z1bmN0aW9uKXB5X3RyYWNlbWFsbG9jX2lzX3RyYWNpbmcsCiAgICAgIE1FVEhfTk9BUkdTLCB0cmFjZW1hbGxvY19pc190cmFjaW5nX2RvY30sCkBAIC0xMzQyLDYgKzE2NjMsNyBAQAogICAgIHJldHVybiBtOwogfQogCisKIHN0YXRpYyBpbnQKIHBhcnNlX3N5c194b3B0aW9ucyhQeU9iamVjdCAqdmFsdWUpCiB7CkBAIC0xMzcwLDYgKzE2OTIsNyBAQAogICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKG5mcmFtZSwgbG9uZywgaW50KTsKIH0KIAorCiBpbnQKIF9QeVRyYWNlTWFsbG9jX0luaXQodm9pZCkKIHsKQEAgLTE0MjgsNiArMTc1MSw3IEBACiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3N0YXJ0KG5mcmFtZSk7CiB9CiAKKwogdm9pZAogX1B5VHJhY2VNYWxsb2NfRmluaSh2b2lkKQogewpAQCAtMTQzNywzICsxNzYxLDU5IEBACiAgICAgdHJhY2VtYWxsb2NfZGVpbml0KCk7CiB9CiAKK2ludAorX1B5VHJhY2VNYWxsb2NfVHJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCit7CisgICAgaW50IHJlczsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsX3N0YXRlOworI2VuZGlmCisKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jIGlzIG5vdCB0cmFjaW5nOiBkbyBub3RoaW5nICovCisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGdpbF9zdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisjZW5kaWYKKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgcmVzID0gdHJhY2VtYWxsb2NfYWRkX3RyYWNlKGRvbWFpbiwgcHRyLCBzaXplKTsKKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxfc3RhdGUpOworI2VuZGlmCisgICAgcmV0dXJuIHJlczsKK30KKworCitpbnQKK19QeVRyYWNlTWFsbG9jX1VudHJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyKQoreworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpIHsKKyAgICAgICAgLyogdHJhY2VtYWxsb2MgaXMgbm90IHRyYWNpbmc6IGRvIG5vdGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIFRBQkxFU19MT0NLKCk7CisgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKGRvbWFpbiwgcHRyKTsKKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitQeU9iamVjdCoKK19QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIpCit7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKworICAgIHRyYWNlYmFjayA9IHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soZG9tYWluLCBwdHIpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisKKyAgICByZXR1cm4gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFjaywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL193aW5hcGkuYyBiL01vZHVsZXMvX3dpbmFwaS5jCmluZGV4IDNlN2YxODcuLmM0ZDQyNjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3dpbmFwaS5jCisrKyBiL01vZHVsZXMvX3dpbmFwaS5jCkBAIC02NzUsNyArNjc1LDcgQEAKIC8qIGhlbHBlcnMgZm9yIGNyZWF0ZXByb2Nlc3MgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHVsb25nKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCitnZXR1bG9uZyhQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICB1bnNpZ25lZCBsb25nIHJldDsKQEAgLTY5MSw3ICs2OTEsNyBAQAogfQogCiBzdGF0aWMgSEFORExFCi1nZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKK2dldGhhbmRsZShQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICBIQU5ETEUgcmV0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IDZhZjc1YTQuLjMyM2UwYzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBpbnQgaXRlbXNpemU7CiAgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICAgICBpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7Ci0gICAgY2hhciAqZm9ybWF0czsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRzOwogICAgIGludCBpc19pbnRlZ2VyX3R5cGU7CiAgICAgaW50IGlzX3NpZ25lZDsKIH07CkBAIC00MCw3ICs0MCw3IEBACiAgICAgUHlPYmplY3RfVkFSX0hFQUQKICAgICBjaGFyICpvYl9pdGVtOwogICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogICAgIGludCBvYl9leHBvcnRzOyAgLyogTnVtYmVyIG9mIGV4cG9ydGVkIGJ1ZmZlcnMgKi8KIH0gYXJyYXlvYmplY3Q7CkBAIC01MTEsNyArNTExLDcgQEAKICAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgdHlwZWNvZGVfdG9fbWZvcm1hdF9jb2RlKCkgaWYgeW91IGFkZCBhIG5ldwogICogdHlwZWNvZGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyIGRlc2NyaXB0b3JzW10gPSB7CiAgICAgeydiJywgMSwgYl9nZXRpdGVtLCBiX3NldGl0ZW0sICJiIiwgMSwgMX0sCiAgICAgeydCJywgMSwgQkJfZ2V0aXRlbSwgQkJfc2V0aXRlbSwgIkIiLCAxLCAwfSwKICAgICB7J3UnLCBzaXplb2YoUHlfVU5JQ09ERSksIHVfZ2V0aXRlbSwgdV9zZXRpdGVtLCAidSIsIDAsIDB9LApAQCAtNTM5LDcgKzUzOSw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD1hZDQzZDM3ZTk0MmE4ODU0XSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1uZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQorbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKIHsKICAgICBhcnJheW9iamVjdCAqb3A7CiAgICAgc2l6ZV90IG5ieXRlczsKQEAgLTE5NDYsNyArMTk0Niw3IEBACiB7CiAgICAgUHlPYmplY3QgKmNvbnZlcnRlZF9pdGVtczsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICBpZiAoIVB5VHlwZV9DaGVjayhhcnJheXR5cGUpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0yMDg0LDcgKzIwODQsNyBAQAogICAgICAgICBQeV9zc2l6ZV90IGl0ZW1jb3VudCA9IFB5X1NJWkUoaXRlbXMpIC8gbWZfZGVzY3Iuc2l6ZTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtc3RyID0KICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcoaXRlbXMpOwotICAgICAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgICAgICAvKiBJZiBwb3NzaWJsZSwgdHJ5IHRvIHBhY2sgYXJyYXkncyBpdGVtcyB1c2luZyBhIGRhdGEgdHlwZQogICAgICAgICAgKiB0aGF0IGZpdHMgYmV0dGVyLiBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXJyYXkgd2l0aCBuYXJyb3dlcgpAQCAtMjU1NCw3ICsyNTU0LDcgQEAKICAgICB2aWV3LT5mb3JtYXQgPSBOVUxMOwogICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKICAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpIHsKLSAgICAgICAgdmlldy0+Zm9ybWF0ID0gc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CisgICAgICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgPT0gJ3UnKSB7CiAgICAgICAgICAgICB2aWV3LT5mb3JtYXQgPSAidyI7CkBAIC0yNTk1LDcgKzI1OTUsNyBAQAogewogICAgIGludCBjOwogICAgIFB5T2JqZWN0ICppbml0aWFsID0gTlVMTCwgKml0ID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKHR5cGUgPT0gJkFycmF5dHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImFycmF5LmFycmF5KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yODc1LDkgKzI4NzUsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheWl0ZXJfbmV4dChhcnJheWl0ZXJvYmplY3QgKml0KQogeworICAgIGFycmF5b2JqZWN0ICphbzsKKworICAgIGFzc2VydChpdCAhPSBOVUxMKTsKICAgICBhc3NlcnQoUHlBcnJheUl0ZXJfQ2hlY2soaXQpKTsKLSAgICBpZiAoaXQtPmluZGV4IDwgUHlfU0laRShpdC0+YW8pKQotICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoaXQtPmFvLCBpdC0+aW5kZXgrKyk7CisgICAgYW8gPSBpdC0+YW87CisgICAgaWYgKGFvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChhcnJheV9DaGVjayhhbykpOworICAgIGlmIChpdC0+aW5kZXggPCBQeV9TSVpFKGFvKSkgeworICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoYW8sIGl0LT5pbmRleCsrKTsKKyAgICB9CisgICAgaXQtPmFvID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYW8pOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0yOTA2LDggKzI5MTcsMTEgQEAKIGFycmF5X2FycmF5aXRlcmF0b3JfX19yZWR1Y2VfX19pbXBsKGFycmF5aXRlcm9iamVjdCAqc2VsZikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ODk4YTUyZThlNjZlMDE2IGlucHV0PWEwNjJlYTFlOTk1MTQxN2FdKi8KIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFvLCBzZWxmLT5pbmRleCk7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpOworICAgIGlmIChzZWxmLT5hbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOKCgpKSIsIGZ1bmMpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBmdW5jLCBzZWxmLT5hbywgc2VsZi0+aW5kZXgpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0yOTg3LDcgKzMwMDEsNyBAQAogICAgIGNoYXIgYnVmZmVyW1B5X0FSUkFZX0xFTkdUSChkZXNjcmlwdG9ycyldLCAqcDsKICAgICBQeU9iamVjdCAqdHlwZWNvZGVzOwogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5dHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2F1ZGlvb3AuYyBiL01vZHVsZXMvYXVkaW9vcC5jCmluZGV4IDNiMDVhZWMuLmQ5N2EzNjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXVkaW9vcC5jCisrKyBiL01vZHVsZXMvYXVkaW9vcC5jCkBAIC01MSwxMyArNTEsMTUgQEAKICNkZWZpbmUgU0VHX1NISUZUICAgICAgICg0KSAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0IGZvciBzZWdtZW50IG51bWJlci4gKi8KICNkZWZpbmUgU0VHX01BU0sgICAgICAgICgweDcwKSAgICAgICAgICAvKiBTZWdtZW50IGZpZWxkIG1hc2suICovCiAKLXN0YXRpYyBQeUludDE2IHNlZ19hZW5kWzhdID0gezB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRn07Ci1zdGF0aWMgUHlJbnQxNiBzZWdfdWVuZFs4XSA9IHsweDNGLCAweDdGLCAweEZGLCAweDFGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRn07CitzdGF0aWMgY29uc3QgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsKKyAgICAweDFGLCAweDNGLCAweDdGLCAweEZGLCAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRgorfTsKK3N0YXRpYyBjb25zdCBQeUludDE2IHNlZ191ZW5kWzhdID0geworICAgIDB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkYKK307CiAKIHN0YXRpYyBQeUludDE2Ci1zZWFyY2goUHlJbnQxNiB2YWwsIFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKK3NlYXJjaChQeUludDE2IHZhbCwgY29uc3QgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQogewogICAgIGludCBpOwogCkBAIC03MCw3ICs3Miw3IEBACiAjZGVmaW5lIHN0X3VsYXcybGluZWFyMTYodWMpIChfc3RfdWxhdzJsaW5lYXIxNlt1Y10pCiAjZGVmaW5lIHN0X2FsYXcybGluZWFyMTYodWMpIChfc3RfYWxhdzJsaW5lYXIxNlt1Y10pCiAKLXN0YXRpYyBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0gewogICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKICAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCiAgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LApAQCAtMTc2LDcgKzE3OCw3IEBACiAKIH0KIAotc3RhdGljIFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCBQeUludDE2IF9zdF9hbGF3MmxpbmVhcjE2WzI1Nl0gPSB7CiAgICAgIC01NTA0LCAgIC01MjQ4LCAgIC02MDE2LCAgIC01NzYwLCAgIC00NDgwLCAgIC00MjI0LCAgIC00OTkyLAogICAgICAtNDczNiwgICAtNzU1MiwgICAtNzI5NiwgICAtODA2NCwgICAtNzgwOCwgICAtNjUyOCwgICAtNjI3MiwKICAgICAgLTcwNDAsICAgLTY3ODQsICAgLTI3NTIsICAgLTI2MjQsICAgLTMwMDgsICAgLTI4ODAsICAgLTIyNDAsCkBAIC0yNzAsMTIgKzI3MiwxMiBAQAogLyogRW5kIG9mIGNvZGUgdGFrZW4gZnJvbSBzb3ggKi8KIAogLyogSW50ZWwgQURQQ00gc3RlcCB2YXJpYXRpb24gdGFibGUgKi8KLXN0YXRpYyBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IGluZGV4VGFibGVbMTZdID0gewogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogfTsKIAotc3RhdGljIGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7CiAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCiAgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCiAgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKZGlmZiAtLWdpdCBhL01vZHVsZXMvYmluYXNjaWkuYyBiL01vZHVsZXMvYmluYXNjaWkuYwppbmRleCBkOTIwZDIzLi5hMzA2YWNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2JpbmFzY2lpLmMKKysrIGIvTW9kdWxlcy9iaW5hc2NpaS5jCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIFNLSVAgMHg3RQogI2RlZmluZSBGQUlMIDB4N0QKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwogLyogMCovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXGIgICAgXHQgICAgXG4gICAgXksgICAgXkwgICAgXHIgICAgXk4gICAgXk8gICAqLwpAQCAtMTI1LDEwICsxMjUsMTAgQEAKICAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2hxeFtdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCi1zdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogLyogTWF4IGJpbmFyeSBjaHVuayBzaXplOyBsaW1pdGVkIG9ubHkgYnkgYXZhaWxhYmxlIG1lbW9yeSAqLwogI2RlZmluZSBCQVNFNjRfTUFYQklOICgoUFlfU1NJWkVfVF9NQVggLSAzKSAvIDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9iYXNlNjRbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyY3RhYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CiAgICAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBhNSwgMHg2MGM2LCAweDcwZTcsCiAgICAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCiAgICAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCkBAIC0yNTYsNyArMjU2LDggQEAKIGJpbmFzY2lpX2EyYl91dV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01Nzc5ZjM5YjBiNDg0NTlmIGlucHV0PTdjYWZlYWY3M2RmNjNkMWNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwpAQCAtMzQyLDEzICszNDMsMTUgQEAKIGJpbmFzY2lpX2IyYV91dV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xODEwMjFiNjliYjlhNDE0IGlucHV0PTAwZmRmNDU4Y2U4YjQ2NWJdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAgICAgYmluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgYmluX2xlbiA9IGRhdGEtPmxlbjsKICAgICBpZiAoIGJpbl9sZW4gPiA0NSApIHsKQEAgLTM1OCw5ICszNjEsMTAgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKKyAgICBvdXRfbGVuID0gMiArIChiaW5fbGVuICsgMikgLyAzICogNDsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgLyogU3RvcmUgdGhlIGxlbmd0aCAqLwogICAgICphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CkBAIC0zODIsMTcgKzM4NiwxMiBAQAogICAgIH0KICAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIAogc3RhdGljIGludAotYmluYXNjaWlfZmluZF92YWxpZCh1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCitiaW5hc2NpaV9maW5kX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIFB5X3NzaXplX3Qgc2xlbiwgaW50IG51bSkKIHsKICAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAogICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgpAQCAtNDI5LDEzICs0MjgsMTQgQEAKIGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2UzNTFiNzAyYmVkNTZkMiBpbnB1dD01ODcyYWNmNmUxY2FjMjQzXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CiAgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CiAgICAgaW50IHF1YWRfcG9zID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGFzY2lpX2xlbiA9IGRhdGEtPmxlbjsKQEAgLTQ0NywxMSArNDQ3LDEyIEBACiAKICAgICBiaW5fbGVuID0gKChhc2NpaV9sZW4rMykvNCkqMzsgLyogVXBwZXIgYm91bmQsIGNvcnJlY3RlZCBsYXRlciAqLwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGJpbl9sZW4pOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwotICAgIGJpbl9sZW4gPSAwOwogCiAgICAgZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKICAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhOwpAQCAtNDk2LDMxICs0OTcsMTcgQEAKICAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewogICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKICAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0gICAgICAgICAgICBiaW5fbGVuKys7CiAgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobGVmdGJpdHMgIT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvKiBBbmQgc2V0IHN0cmluZyBzaXplIGNvcnJlY3RseS4gSWYgdGhlIHJlc3VsdCBzdHJpbmcgaXMgZW1wdHkKLSAgICAqKiAoYmVjYXVzZSB0aGUgaW5wdXQgd2FzIGFsbCBpbnZhbGlkKSByZXR1cm4gdGhlIHNoYXJlZCBlbXB0eQotICAgICoqIHN0cmluZyBpbnN0ZWFkOyBfUHlCeXRlc19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KLSAgICAqLwotICAgIGlmIChiaW5fbGVuID4gMCkgewotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKIH0KIAogCkBAIC01MjgsMjQgKzUxNSwyNyBAQAogYmluYXNjaWkuYjJhX2Jhc2U2NAogCiAgICAgZGF0YTogUHlfYnVmZmVyCi0gICAgLworICAgICoKKyAgICBuZXdsaW5lOiBpbnQoY19kZWZhdWx0PSIxIikgPSBUcnVlCiAKIEJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2NkNjFmYmVlMjkxMzI4NSBpbnB1dD0xNGVjNGU0NzM3MTE3NGE5XSovCitiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbmV3bGluZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOWUxZGQ3MTlhODkwYjUwIGlucHV0PTdiMmVhNmZhMzhkODkyNGNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCkBAIC01NTUsMTEgKzU0NSwxNCBAQAogICAgIH0KIAogICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCi0gICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCi0gICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApCisgICAgICAgIisyIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzLgorICAgICAgIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgb3V0X2xlbiA9IGJpbl9sZW4qMiArIDI7CisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgIG91dF9sZW4rKzsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCB0aGUgZGF0YSBpbnRvIG91ciBidWZmZXIgKi8KQEAgLTU4MSwxNCArNTc0LDEwIEBACiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0WyhsZWZ0Y2hhciYweGYpIDw8IDJdOwogICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKICAgICB9Ci0gICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KKyAgICBpZiAobmV3bGluZSkKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC02MDQsMTYgKzU5MywxOSBAQAogYmluYXNjaWlfYTJiX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MGJjZGJiZDI4YjEwNWNkIGlucHV0PTBkOTE0YzY4MGUwZWVkNTVdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGludCBkb25lID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNjIzLDkgKzYxNSw5IEBACiAgICAgLyogQWxsb2NhdGUgYSBzdHJpbmcgdGhhdCBpcyB0b28gYmlnIChmaXhlZCBsYXRlcikKICAgICAgICBBZGQgdHdvIHRvIHRoZSBpbml0aWFsIGxlbmd0aCB0byBwcmV2ZW50IGludGVybmluZyB3aGljaAogICAgICAgIHdvdWxkIHByZWNsdWRlIHN1YnNlcXVlbnQgcmVzaXppbmcuICAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiArIDIpOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgewogICAgICAgICAvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KQEAgLTYzNCw3ICs2MjYsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBGQUlMICkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBET05FICkgewpAQCAtNjU2LDIxICs2NDgsMTQgQEAKICAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJpbl9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIHJydjsKLSAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYmluX2RhdGEpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5pIiwgcmVzLCBkb25lKTsKIH0KIAogCkBAIC02ODcsMTEgKzY3MiwxMyBAQAogYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDkwNWRhMzQ0ZGJmMDY0OCBpbnB1dD1lMWYxNzEyNDQ3YTgyYjA5XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKm91dF9kYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgY2g7CiAgICAgUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgbGVuID0gZGF0YS0+bGVuOwogCkBAIC03MDEsOSArNjg4LDkgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBXb3JzdCBjYXNlOiBvdXRwdXQgaXMgdHdpY2UgYXMgYmlnIGFzIGlucHV0IChmaXhlZCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggaW49MDsgaW48bGVuOyBpbisrKSB7CiAgICAgICAgIGNoID0gaW5fZGF0YVtpbl07CkBAIC03MjksMTIgKzcxNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOwogfQogCiAKQEAgLTc1MSwxNSArNzM0LDE3IEBACiBiaW5hc2NpaV9iMmFfaHF4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVhOTg3ODEwZDVlM2NkYmIgaW5wdXQ9OTU5NmViZTAxOWZlMTJiYV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNzY3LDkgKzc1Miw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuICogMiArIDIpOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CiAgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KQEAgLTc4NiwxMiArNzcxLDggQEAKICAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogCkBAIC04MDgsMTMgKzc4OSwxNSBAQAogYmluYXNjaWlfcmxlZGVjb2RlX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mN2FmZDg5Yjc4OTk0NmFiIGlucHV0PTU0Y2RkNDlmYzAxNDQwMmNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIGluX3JlcGVhdDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBpbl9sZW4sIG91dF9sZW4sIG91dF9sZW5fbGVmdDsKKyAgICBQeV9zc2l6ZV90IGluX2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGluX2xlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGluX2xlbiA+PSAwKTsKIApAQCAtODI1LDU5ICs4MDgsNDggQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KLSAgICBvdXRfbGVuID0gaW5fbGVuKjI7Ci0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBvdXRfbGVuKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBpbl9sZW4pOworICAgIGlmIChvdXRfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CisKKyAgICAvKiBVc2Ugb3ZlcmFsbG9jYXRpb24gKi8KKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIC8qCiAgICAgKiogV2UgbmVlZCB0d28gbWFjcm9zIGhlcmUgdG8gZ2V0L3B1dCBieXRlcyBhbmQgaGFuZGxlCiAgICAgKiogZW5kLW9mLWJ1ZmZlciBmb3IgaW5wdXQgYW5kIG91dHB1dCBzdHJpbmdzLgogICAgICovCi0jZGVmaW5lIElOQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLWluX2xlbiA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAotICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgYiA9ICppbl9kYXRhKys7IFwKKyNkZWZpbmUgSU5CWVRFKGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgT1VUQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB7IFB5X1hERUNSRUYocnYpOyByZXR1cm4gTlVMTDsgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRfbGVuOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgKm91dF9kYXRhKysgPSBiOyBcCi0gICAgfSB3aGlsZSgwKQotCi0gICAgICAgIC8qCi0gICAgICAgICoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5Ci0gICAgICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgotICAgICAgICAqLwotICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CisgICAgLyoKKyAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQorICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgorICAgICovCisgICAgSU5CWVRFKGluX2J5dGUpOwogCiAgICAgaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewogICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgc3Vic3RyYWN0IDEgYnl0ZSB0byBwcmV2ZW50IG92ZXJhbGxvY2F0aW9uICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgewogICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKICAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICB9IGVsc2UgewotICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgfQogCiAgICAgd2hpbGUoIGluX2xlbiA+IDAgKSB7CkBAIC04ODUsMjYgKzg1NywzOSBAQAogCiAgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgICAgIHN1YnN0cmFjdCAxIGJ5dGUgdG8gcHJldmVudCBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplLS07CisKICAgICAgICAgICAgIGlmICggaW5fcmVwZWF0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgLyogSnVzdCBhbiBlc2NhcGVkIFJVTkNIQVIgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBPVVRCWVRFKFJVTkNIQVIpOworICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogUGljayB1cCB2YWx1ZSBhbmQgb3V0cHV0IGEgc2VxdWVuY2Ugb2YgaXQgKi8KICAgICAgICAgICAgICAgICBpbl9ieXRlID0gb3V0X2RhdGFbLTFdOworCisgICAgICAgICAgICAgICAgLyogZW5sYXJnZSB0aGUgYnVmZmVyIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGlmIChpbl9yZXBlYXQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIC0xIGJlY2F1c2Ugd2UgYWxyZWFkeSBwcmVhbGxvY2F0ZWQgMSBieXRlICovCisgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3JlcGVhdCAtIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgd2hpbGUgKCAtLWluX3JlcGVhdCA+IDAgKQotICAgICAgICAgICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBOb3JtYWwgYnl0ZSAqLwotICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgICAgICpvdXRfZGF0YSsrID0gaW5fYnl0ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKG91dF9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTkyMiw3ICs5MDcsNyBAQAogYmluYXNjaWlfY3JjX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgdW5zaWduZWQgaW50IGNyYykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNjdjMmRhYzYyNjI1NzE3IGlucHV0PWFkZDhjNTM3MTJjY2NlZGFdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGNyYyAmPSAweGZmZmY7CkBAIC0xMDAwLDcgKzk4NSw3IEBACiAgICAgIHVzaW5nIGJ5dGUtc3dhcCBpbnN0cnVjdGlvbnMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBjcmNfMzJfdGFiWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyY18zMl90YWJbMjU2XSA9IHsKIDB4MDAwMDAwMDBVLCAweDc3MDczMDk2VSwgMHhlZTBlNjEyY1UsIDB4OTkwOTUxYmFVLCAweDA3NmRjNDE5VSwKIDB4NzA2YWY0OGZVLCAweGU5NjNhNTM1VSwgMHg5ZTY0OTVhM1UsIDB4MGVkYjg4MzJVLCAweDc5ZGNiOGE0VSwKIDB4ZTBkNWU5MWVVLCAweDk3ZDJkOTg4VSwgMHgwOWI2NGMyYlUsIDB4N2ViMTdjYmRVLCAweGU3YjgyZDA3VSwKQEAgLTEwNzMsNyArMTA1OCw3IEBACiAjaWZkZWYgVVNFX1pMSUJfQ1JDMzIKIC8qIFRoaXMgd2FzIHRha2VuIGZyb20gemxpYm1vZHVsZS5jIFB5WmxpYl9jcmMzMiAoYnV0IGlzIFBZX1NTSVpFX1RfQ0xFQU4pICovCiB7Ci0gICAgQnl0ZSAqYnVmOworICAgIGNvbnN0IEJ5dGUgKmJ1ZjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBpbnQgc2lnbmVkX3ZhbDsKIApAQCAtMTA4NCw3ICsxMDY5LDcgQEAKIH0KICNlbHNlICAvKiBVU0VfWkxJQl9DUkMzMiAqLwogeyAvKiBCeSBKaW0gQWhsc3Ryb207IEFsbCByaWdodHMgdHJhbnNmZXJyZWQgdG8gQ05SSSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIHVuc2lnbmVkIGludCByZXN1bHQ7CiAKQEAgLTExNjcsNyArMTE1Miw3IEBACiBiaW5hc2NpaV9hMmJfaGV4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpoZXhzdHIpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDYxZGE0NTJiNWM2ZDI5MCBpbnB1dD05ZTFlN2YyZjk0ZGIyNGZkXSovCiB7Ci0gICAgY2hhciogYXJnYnVmOworICAgIGNvbnN0IGNoYXIqIGFyZ2J1ZjsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbjsKICAgICBQeU9iamVjdCAqcmV0dmFsOwogICAgIGNoYXIqIHJldGJ1ZjsKQEAgLTEyMjQsNyArMTIwOSw3IEBACiAgICAgcmV0dXJuIGJpbmFzY2lpX2EyYl9oZXhfaW1wbChtb2R1bGUsIGhleHN0cik7CiB9CiAKLXN0YXRpYyBpbnQgdGFibGVfaGV4WzEyOF0gPSB7CitzdGF0aWMgY29uc3QgaW50IHRhYmxlX2hleFsxMjhdID0gewogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLApAQCAtMTI1NSw3ICsxMjQwLDggQEAKIHsKICAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CiAgICAgY2hhciBjaDsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwOwogICAgIFB5T2JqZWN0ICpydjsKIApAQCAtMTM2MSwxMyArMTM0NywxNCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE4N2NhOWNjYjk0ZTJhOWYgaW5wdXQ9N2YyYTlhYWEwMDhlOTJiMl0qLwogewogICAgIFB5X3NzaXplX3QgaW4sIG91dDsKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhYnVmLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YWJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7CiAgICAgUHlPYmplY3QgKnJ2OwogICAgIHVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIGNoOwogICAgIGludCBjcmxmID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAKICAgICBkYXRhYnVmID0gZGF0YS0+YnVmOwogICAgIGRhdGFsZW4gPSBkYXRhLT5sZW47CkBAIC0xMzc2LDcgKzEzNjMsNyBAQAogICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCiAgICAgICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KICAgICAgKiBoZXJlICovCi0gICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhYnVmLCAnXG4nLCBkYXRhbGVuKTsKKyAgICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGFidWYsICdcbicsIGRhdGFsZW4pOwogICAgIGlmICgocCAhPSBOVUxMKSAmJiAocCA+IGRhdGFidWYpICYmICgqKHAtMSkgPT0gJ1xyJykpCiAgICAgICAgIGNybGYgPSAxOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCmluZGV4IGU5NGJlMTEuLjI5ZjQ2YmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oCkBAIC04NzgsNyArODc4LDcgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfN19lbmNvZGUiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl83X2VuY29kZSIsCiAgICAgICAgICZzdHIsICZlcnJvcnMpKQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfN19lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKQEAgLTkwNiw3ICs5MDYsNyBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl84X2VuY29kZSIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzhfZW5jb2RlIiwKICAgICAgICAgJnN0ciwgJmVycm9ycykpCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl84X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwpAQCAtOTM1LDcgKzkzNSw3IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMTZfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8emk6dXRmXzE2X2VuY29kZSIsCiAgICAgICAgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgYnl0ZW9yZGVyKTsKQEAgLTk2Myw3ICs5NjMsNyBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8xNl9sZV9lbmNvZGUiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8xNl9sZV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2xlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwpAQCAtOTkxLDcgKzk5MSw3IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzE2X2JlX2VuY29kZSIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzE2X2JlX2VuY29kZSIsCiAgICAgICAgICZzdHIsICZlcnJvcnMpKQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfYmVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CkBAIC0xMDIwLDcgKzEwMjAsNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzMyX2VuY29kZSIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8zMl9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CkBAIC0xMDQ4LDcgKzEwNDgsNyBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8zMl9sZV9lbmNvZGUiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8zMl9sZV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2xlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMzJfYmVfZW5jb2RlIiwKICAgICAgICAgJnN0ciwgJmVycm9ycykpCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9iZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKQEAgLTExMDQsNyArMTEwNCw3IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CkBAIC0xMTMyLDcgKzExMzIsNyBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfcmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwpAQCAtMTE2MCw3ICsxMTYwLDcgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6bGF0aW5fMV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbGF0aW5fMV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKQEAgLTExODgsNyArMTE4OCw3IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6YXNjaWlfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejphc2NpaV9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfYXNjaWlfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHpPOmNoYXJtYXBfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ek86Y2hhcm1hcF9lbmNvZGUiLAogICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpCiAgICAgICAgIGdvdG8gZXhpdDsKICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgbWFwcGluZyk7CkBAIC0xMjcyLDcgKzEyNzIsNyBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6Om1iY3NfZW5jb2RlIiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejptYmNzX2VuY29kZSIsCiAgICAgICAgICZzdHIsICZlcnJvcnMpKQogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19tYmNzX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwpAQCAtMTMwNSw3ICsxMzA1LDcgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPfHo6Y29kZV9wYWdlX2VuY29kZSIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpVXx6OmNvZGVfcGFnZV9lbmNvZGUiLAogICAgICAgICAmY29kZV9wYWdlLCAmc3RyLCAmZXJyb3JzKSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY29kZV9wYWdlX2VuY29kZV9pbXBsKG1vZHVsZSwgY29kZV9wYWdlLCBzdHIsIGVycm9ycyk7CkBAIC0xMzkzLDQgKzEzOTMsNCBAQAogI2lmbmRlZiBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19DT0RFX1BBR0VfRU5DT0RFX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Yzk5NjcwNDgwMjdjMWM3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wNDAwN2ExM2M4Mzg3Njg5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCmluZGV4IDg2YjRjNGMuLjkyZTk4Y2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaApAQCAtNjY4LDEyICs2NjgsMTMgQEAKICAgICBQeU9iamVjdCAqZXZlbnRzX3F1ZXVlOwogICAgIFB5T2JqZWN0ICpldmVudHNfdG9fcmVwb3J0ID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8Tzpfc2V0ZXZlbnRzIiwKLSAgICAgICAgJlB5TGlzdF9UeXBlLCAmZXZlbnRzX3F1ZXVlLCAmZXZlbnRzX3RvX3JlcG9ydCkpCisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiX3NldGV2ZW50cyIsCisgICAgICAgIDEsIDIsCisgICAgICAgICZldmVudHNfcXVldWUsICZldmVudHNfdG9fcmVwb3J0KSkKICAgICAgICAgZ290byBleGl0OwogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9YTUxQYXJzZXJfX3NldGV2ZW50c19pbXBsKHNlbGYsIGV2ZW50c19xdWV1ZSwgZXZlbnRzX3RvX3JlcG9ydCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yNWI4YmY3ZTdmMjE1MWNhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOWQ5NGUyZDI3MjZkM2FhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaCBiL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaAppbmRleCBlMzQ4YmVlLi40NmNmYjhlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCkBAIC05MywyNiArOTMsMjkgQEAKIH0KIAogUHlEb2NfU1RSVkFSKGJpbmFzY2lpX2IyYV9iYXNlNjRfX2RvY19fLAotImIyYV9iYXNlNjQoJG1vZHVsZSwgZGF0YSwgLylcbiIKKyJiMmFfYmFzZTY0KCRtb2R1bGUsIC8sIGRhdGEsICosIG5ld2xpbmU9VHJ1ZSlcbiIKICItLVxuIgogIlxuIgogIkJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YS4iKTsKIAogI2RlZmluZSBCSU5BU0NJSV9CMkFfQkFTRTY0X01FVEhPRERFRiAgICBcCi0gICAgeyJiMmFfYmFzZTY0IiwgKFB5Q0Z1bmN0aW9uKWJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfTywgYmluYXNjaWlfYjJhX2Jhc2U2NF9fZG9jX199LAorICAgIHsiYjJhX2Jhc2U2NCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfYmFzZTY0LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYmluYXNjaWlfYjJhX2Jhc2U2NF9fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSk7CitiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbmV3bGluZSk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1iaW5hc2NpaV9iMmFfYmFzZTY0KFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICphcmcpCitiaW5hc2NpaV9iMmFfYmFzZTY0KFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJuZXdsaW5lIiwgTlVMTH07CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CisgICAgaW50IG5ld2xpbmUgPSAxOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfYmFzZTY0IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfCRpOmIyYV9iYXNlNjQiLCBfa2V5d29yZHMsCisgICAgICAgICZkYXRhLCAmbmV3bGluZSkpCiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwobW9kdWxlLCAmZGF0YSk7CisgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEsIG5ld2xpbmUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KQEAgLTUxNiw0ICs1MTksNCBAQAogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iMWEzY2JmNzY2MGViYWE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iMTVhMjQzNTBkMTA1MjUxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaAppbmRleCA5ZWY3MDJhLi5hNDhkZTZhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCkBAIC0yMTE2LDcgKzIxMTYsNyBAQAogInNjaGVkX2dldGFmZmluaXR5KCRtb2R1bGUsIHBpZCwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuXG4iCisiUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS5cbiIKICJcbiIKICJUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLiIpOwogCkBAIC01MTc4LDcgKzUxNzgsMTEgQEAKICJjcHVfY291bnQoJG1vZHVsZSwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuIik7CisiUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtOyByZXR1cm4gTm9uZSBpZiBpbmRldGVybWluYWJsZS5cbiIKKyJcbiIKKyJUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW5cbiIKKyJ1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoXG4iCisiYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAiKTsKIAogI2RlZmluZSBPU19DUFVfQ09VTlRfTUVUSE9EREVGICAgIFwKICAgICB7ImNwdV9jb3VudCIsIChQeUNGdW5jdGlvbilvc19jcHVfY291bnQsIE1FVEhfTk9BUkdTLCBvc19jcHVfY291bnRfX2RvY19ffSwKQEAgLTU3ODgsNCArNTc5Miw0IEBACiAjaWZuZGVmIE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBPU19TRVRfSEFORExFX0lOSEVSSVRBQkxFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk1ODI0YzUyZmQwMzQ2NTQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE1YzliZWY5YWQxMWEyMGIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAppbmRleCAyZDc1YmM5Li4yMjJjYjY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaApAQCAtMywzOCArMywzOSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBQeURvY19TVFJWQVIoemxpYl9jb21wcmVzc19fZG9jX18sCi0iY29tcHJlc3MoJG1vZHVsZSwgYnl0ZXMsIGxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiwgLylcbiIKKyJjb21wcmVzcygkbW9kdWxlLCAvLCBkYXRhLCBsZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04pXG4iCiAiLS1cbiIKICJcbiIKICJSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLlxuIgogIlxuIgotIiAgYnl0ZXNcbiIKKyIgIGRhdGFcbiIKICIgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC5cbiIKICIgIGxldmVsXG4iCi0iICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuIik7CisiICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuIik7CiAKICNkZWZpbmUgWkxJQl9DT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9jb21wcmVzcywgTUVUSF9WQVJBUkdTLCB6bGliX2NvbXByZXNzX19kb2NfX30sCisgICAgeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbil6bGliX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9jb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCk7Cit6bGliX2NvbXByZXNzX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbGV2ZWwpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzcyhQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3psaWJfY29tcHJlc3MoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfYnVmZmVyIGJ5dGVzID0ge05VTEwsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiZGF0YSIsICJsZXZlbCIsIE5VTEx9OworICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogICAgIGludCBsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8aTpjb21wcmVzcyIsCi0gICAgICAgICZieXRlcywgJmxldmVsKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxpOmNvbXByZXNzIiwgX2tleXdvcmRzLAorICAgICAgICAmZGF0YSwgJmxldmVsKSkKICAgICAgICAgZ290byBleGl0OwotICAgIHJldHVybl92YWx1ZSA9IHpsaWJfY29tcHJlc3NfaW1wbChtb2R1bGUsICZieXRlcywgbGV2ZWwpOworICAgIHJldHVybl92YWx1ZSA9IHpsaWJfY29tcHJlc3NfaW1wbChtb2R1bGUsICZkYXRhLCBsZXZlbCk7CiAKIGV4aXQ6Ci0gICAgLyogQ2xlYW51cCBmb3IgYnl0ZXMgKi8KLSAgICBpZiAoYnl0ZXMub2JqKQotICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ5dGVzKTsKKyAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCisgICAgaWYgKGRhdGEub2JqKQorICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOwogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQzOSw0ICs0NDAsNCBAQAogI2lmbmRlZiBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAgICAgI2RlZmluZSBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoWkxJQl9DT01QUkVTU19DT1BZX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jZjgxZTFkZWFlM2FmMGNlIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lNmYzYjc5ZTA1MWVjYzM1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMgYi9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCmluZGV4IGYxZmRhNDguLjU3MGM4NzUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKKysrIGIvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgaGFuZGxlciBmYWlscyBpbiBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoKSAqLwogICAgIHtTSUdTRUdWLCAwLCAiU2VnbWVudGF0aW9uIGZhdWx0IiwgfQogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhdWx0aGFuZGxlcl9uc2lnbmFscyA9IFwKK3N0YXRpYyBjb25zdCBzaXplX3QgZmF1bHRoYW5kbGVyX25zaWduYWxzID0gXAogICAgIFB5X0FSUkFZX0xFTkdUSChmYXVsdGhhbmRsZXJfaGFuZGxlcnMpOwogCiAjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwpAQCAtMjAyLDggKzIwMiw5IEBACiBzdGF0aWMgUHlUaHJlYWRTdGF0ZSoKIGdldF90aHJlYWRfc3RhdGUodm9pZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAvKiBqdXN0IGluIGNhc2UgYnV0IHZlcnkgdW5saWtlbHkuLi4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIzNCwxMSArMjM1LDEyIEBACiAgICAgICAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKS4gKi8KICAgICB0c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwogI2Vsc2UKLSAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIHRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogI2VuZGlmCiAKLSAgICBpZiAoYWxsX3RocmVhZHMpCi0gICAgICAgIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgaW50ZXJwLCB0c3RhdGUpOworICAgIGlmIChhbGxfdGhyZWFkcykgeworICAgICAgICAodm9pZClfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBpZiAodHN0YXRlICE9IE5VTEwpCiAgICAgICAgICAgICBfUHlfRHVtcFRyYWNlYmFjayhmZCwgdHN0YXRlKTsKQEAgLTI3Miw3ICsyNzQsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChhbGxfdGhyZWFkcykgewotICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIHRzdGF0ZS0+aW50ZXJwLCB0c3RhdGUpOworICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CiAgICAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgZXJybXNnKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg4LDYgKzI5MCwxOSBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCitzdGF0aWMgdm9pZAorZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXIpCit7CisgICAgaWYgKCFoYW5kbGVyLT5lbmFibGVkKQorICAgICAgICByZXR1cm47CisgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAodm9pZClzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOworI2Vsc2UKKyAgICAodm9pZClzaWduYWwoaGFuZGxlci0+c2lnbnVtLCBoYW5kbGVyLT5wcmV2aW91cyk7CisjZW5kaWYKK30KKwogCiAvKiBIYW5kbGVyIGZvciBTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQsIFNJR0JVUyBhbmQgU0lHSUxMIHNpZ25hbHMuCiAKQEAgLTMwNiw3ICszMjEsNyBAQAogZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKGludCBzaWdudW0pCiB7CiAgICAgY29uc3QgaW50IGZkID0gZmF0YWxfZXJyb3IuZmQ7Ci0gICAgdW5zaWduZWQgaW50IGk7CisgICAgc2l6ZV90IGk7CiAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gTlVMTDsKICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwogCkBAIC0zMjQsMTIgKzMzOSw3IEBACiAgICAgfQogCiAgICAgLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgaGFuZGxlciAqLwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgKHZvaWQpc2lnYWN0aW9uKHNpZ251bSwgJmhhbmRsZXItPnByZXZpb3VzLCBOVUxMKTsKLSNlbHNlCi0gICAgKHZvaWQpc2lnbmFsKHNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOwotI2VuZGlmCi0gICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisgICAgZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihoYW5kbGVyKTsKIAogICAgIFBVVFMoZmQsICJGYXRhbCBQeXRob24gZXJyb3I6ICIpOwogICAgIFBVVFMoZmQsIGhhbmRsZXItPm5hbWUpOwpAQCAtMzUxLDIwICszNjEsMTE3IEBACiAgICAgcmFpc2Uoc2lnbnVtKTsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKK3N0YXRpYyBMT05HIFdJTkFQSQorZmF1bHRoYW5kbGVyX2V4Y19oYW5kbGVyKHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTICpleGNfaW5mbykKK3sKKyAgICBjb25zdCBpbnQgZmQgPSBmYXRhbF9lcnJvci5mZDsKKyAgICBEV09SRCBjb2RlID0gZXhjX2luZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZTsKKyAgICBEV09SRCBmbGFncyA9IGV4Y19pbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkZsYWdzOworCisgICAgLyogb25seSBsb2cgZmF0YWwgZXhjZXB0aW9ucyAqLworICAgIGlmIChmbGFncyAmIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRSkgeworICAgICAgICAvKiBjYWxsIHRoZSBuZXh0IGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgIH0KKworICAgIFBVVFMoZmQsICJXaW5kb3dzIGZhdGFsIGV4Y2VwdGlvbjogIik7CisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICAvKiBvbmx5IGZvcm1hdCBtb3N0IGNvbW1vbiBlcnJvcnMgKi8KKyAgICBjYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOiBQVVRTKGZkLCAiYWNjZXNzIHZpb2xhdGlvbiIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJmbG9hdCBkaXZpZGUgYnkgemVybyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfT1ZFUkZMT1c6IFBVVFMoZmQsICJmbG9hdCBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJpbnQgZGl2aWRlIGJ5IHplcm8iKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOiBQVVRTKGZkLCAiaW50ZWdlciBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTl9QQUdFX0VSUk9SOiBQVVRTKGZkLCAicGFnZSBlcnJvciIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVzogUFVUUyhmZCwgInN0YWNrIG92ZXJmbG93Iik7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFBVVFMoZmQsICJjb2RlICIpOworICAgICAgICBfUHlfRHVtcERlY2ltYWwoZmQsIGNvZGUpOworICAgIH0KKyAgICBQVVRTKGZkLCAiXG5cbiIpOworCisgICAgaWYgKGNvZGUgPT0gRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04pIHsKKyAgICAgICAgLyogZGlzYWJsZSBzaWduYWwgaGFuZGxlciBmb3IgU0lHU0VHViAqLworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgeworICAgICAgICAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyLT5zaWdudW0gPT0gU0lHU0VHVikgeworICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmYXVsdGhhbmRsZXJfZHVtcF90cmFjZWJhY2soZmQsIGZhdGFsX2Vycm9yLmFsbF90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbF9lcnJvci5pbnRlcnApOworCisgICAgLyogY2FsbCB0aGUgbmV4dCBleGNlcHRpb24gaGFuZGxlciAqLworICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmCisKIC8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGZhdGFsIHNpZ25hbHMsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcigpLiAqLwogCitpbnQKK2ZhdWx0aGFuZGxlcl9lbmFibGUodm9pZCkKK3sKKyAgICBzaXplX3QgaTsKKworICAgIGlmIChmYXRhbF9lcnJvci5lbmFibGVkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmYXRhbF9lcnJvci5lbmFibGVkID0gMTsKKworICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKKyAgICAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyOworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOworI2VuZGlmCisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07CisgICAgICAgIGFzc2VydCghaGFuZGxlci0+ZW5hYmxlZCk7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAgICAgYWN0aW9uLnNhX2hhbmRsZXIgPSBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3I7CisgICAgICAgIHNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7CisgICAgICAgIC8qIERvIG5vdCBwcmV2ZW50IHRoZSBzaWduYWwgZnJvbSBiZWluZyByZWNlaXZlZCBmcm9tIHdpdGhpbgorICAgICAgICAgICBpdHMgb3duIHNpZ25hbCBoYW5kbGVyICovCisgICAgICAgIGFjdGlvbi5zYV9mbGFncyA9IFNBX05PREVGRVI7CisjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSworICAgICAgICBpZiAoc3RhY2suc3Nfc3AgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogQ2FsbCB0aGUgc2lnbmFsIGhhbmRsZXIgb24gYW4gYWx0ZXJuYXRlIHNpZ25hbCBzdGFjaworICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgc2lnYWx0c3RhY2soKSAqLworICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzIHw9IFNBX09OU1RBQ0s7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBlcnIgPSBzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmYWN0aW9uLCAmaGFuZGxlci0+cHJldmlvdXMpOworI2Vsc2UKKyAgICAgICAgaGFuZGxlci0+cHJldmlvdXMgPSBzaWduYWwoaGFuZGxlci0+c2lnbnVtLAorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcik7CisgICAgICAgIGVyciA9IChoYW5kbGVyLT5wcmV2aW91cyA9PSBTSUdfRVJSKTsKKyNlbmRpZgorICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGhhbmRsZXItPmVuYWJsZWQgPSAxOworICAgIH0KKworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICBBZGRWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoMSwgZmF1bHRoYW5kbGVyX2V4Y19oYW5kbGVyKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgUHlPYmplY3QqCi1mYXVsdGhhbmRsZXJfZW5hYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK2ZhdWx0aGFuZGxlcl9weV9lbmFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZSIsICJhbGxfdGhyZWFkcyIsIE5VTEx9OwogICAgIFB5T2JqZWN0ICpmaWxlID0gTlVMTDsKICAgICBpbnQgYWxsX3RocmVhZHMgPSAxOwotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlcjsKLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0aW9uOwotI2VuZGlmCi0gICAgaW50IGVycjsKICAgICBpbnQgZmQ7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogCkBAIC0zODYsMzcgKzQ5MywxMCBAQAogICAgIGZhdGFsX2Vycm9yLmFsbF90aHJlYWRzID0gYWxsX3RocmVhZHM7CiAgICAgZmF0YWxfZXJyb3IuaW50ZXJwID0gdHN0YXRlLT5pbnRlcnA7CiAKLSAgICBpZiAoIWZhdGFsX2Vycm9yLmVuYWJsZWQpIHsKLSAgICAgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDE7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgewotICAgICAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICAgICAgICAgIGFjdGlvbi5zYV9oYW5kbGVyID0gZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yOwotICAgICAgICAgICAgc2lnZW1wdHlzZXQoJmFjdGlvbi5zYV9tYXNrKTsKLSAgICAgICAgICAgIC8qIERvIG5vdCBwcmV2ZW50IHRoZSBzaWduYWwgZnJvbSBiZWluZyByZWNlaXZlZCBmcm9tIHdpdGhpbgotICAgICAgICAgICAgICAgaXRzIG93biBzaWduYWwgaGFuZGxlciAqLwotICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfTk9ERUZFUjsKLSNpZmRlZiBIQVZFX1NJR0FMVFNUQUNLCi0gICAgICAgICAgICBpZiAoc3RhY2suc3Nfc3AgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8qIENhbGwgdGhlIHNpZ25hbCBoYW5kbGVyIG9uIGFuIGFsdGVybmF0ZSBzaWduYWwgc3RhY2sKLSAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBieSBzaWdhbHRzdGFjaygpICovCi0gICAgICAgICAgICAgICAgYWN0aW9uLnNhX2ZsYWdzIHw9IFNBX09OU1RBQ0s7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGVyciA9IHNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZhY3Rpb24sICZoYW5kbGVyLT5wcmV2aW91cyk7Ci0jZWxzZQotICAgICAgICAgICAgaGFuZGxlci0+cHJldmlvdXMgPSBzaWduYWwoaGFuZGxlci0+c2lnbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKTsKLSAgICAgICAgICAgIGVyciA9IChoYW5kbGVyLT5wcmV2aW91cyA9PSBTSUdfRVJSKTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDE7Ci0gICAgICAgIH0KKyAgICBpZiAoZmF1bHRoYW5kbGVyX2VuYWJsZSgpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIApAQCAtNDMwLDE0ICs1MTAsNyBAQAogICAgICAgICBmYXRhbF9lcnJvci5lbmFibGVkID0gMDsKICAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgewogICAgICAgICAgICAgaGFuZGxlciA9ICZmYXVsdGhhbmRsZXJfaGFuZGxlcnNbaV07Ci0gICAgICAgICAgICBpZiAoIWhhbmRsZXItPmVuYWJsZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICAgICAgICAgICh2b2lkKXNpZ2FjdGlvbihoYW5kbGVyLT5zaWdudW0sICZoYW5kbGVyLT5wcmV2aW91cywgTlVMTCk7Ci0jZWxzZQotICAgICAgICAgICAgKHZvaWQpc2lnbmFsKGhhbmRsZXItPnNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOwotI2VuZGlmCi0gICAgICAgICAgICBoYW5kbGVyLT5lbmFibGVkID0gMDsKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2OSw3ICs1NDIsNiBAQAogewogICAgIFB5TG9ja1N0YXR1cyBzdDsKICAgICBjb25zdCBjaGFyKiBlcnJtc2c7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudDsKICAgICBpbnQgb2s7CiAjaWYgZGVmaW5lZChIQVZFX1BUSFJFQURfU0lHTUFTSykgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUFRIUkVBRF9TSUdNQVNLKQogICAgIHNpZ3NldF90IHNldDsKQEAgLTQ4OSwxMiArNTYxLDkgQEAKICAgICAgICAgLyogVGltZW91dCA9PiBkdW1wIHRyYWNlYmFjayAqLwogICAgICAgICBhc3NlcnQoc3QgPT0gUFlfTE9DS19GQUlMVVJFKTsKIAotICAgICAgICAvKiBnZXQgdGhlIHRocmVhZCBob2xkaW5nIHRoZSBHSUwsIE5VTEwgaWYgbm8gdGhyZWFkIGhvbGQgdGhlIEdJTCAqLwotICAgICAgICBjdXJyZW50ID0gX1B5VGhyZWFkU3RhdGVfVW5jaGVja2VkR2V0KCk7Ci0KICAgICAgICAgX1B5X3dyaXRlX25vcmFpc2UodGhyZWFkLmZkLCB0aHJlYWQuaGVhZGVyLCAoaW50KXRocmVhZC5oZWFkZXJfbGVuKTsKIAotICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHModGhyZWFkLmZkLCB0aHJlYWQuaW50ZXJwLCBjdXJyZW50KTsKKyAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKHRocmVhZC5mZCwgdGhyZWFkLmludGVycCwgTlVMTCk7CiAgICAgICAgIG9rID0gKGVycm1zZyA9PSBOVUxMKTsKIAogICAgICAgICBpZiAodGhyZWFkLmV4aXQpCkBAIC04OTQsNyArOTYzLDcgQEAKIGZhdWx0aGFuZGxlcl9zaWdzZWd2KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBpbnQgcmVsZWFzZV9naWwgPSAwOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X3JlYWRfbnVsbCIsICZyZWxlYXNlX2dpbCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfc2lnc2VndiIsICZyZWxlYXNlX2dpbCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKHJlbGVhc2VfZ2lsKSB7CkBAIC05MDcsNiArOTc2LDQ5IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorc3RhdGljIHZvaWQKK2ZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl90aHJlYWQodm9pZCAqcGxvY2spCit7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrICpsb2NrID0gKFB5VGhyZWFkX3R5cGVfbG9jayAqKXBsb2NrOworCisgICAgUHlfRmF0YWxFcnJvcigiaW4gbmV3IHRocmVhZCIpOworCisgICAgLyogbm90aWZ5IHRoZSBjYWxsZXIgdGhhdCB3ZSBhcmUgZG9uZSAqLworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhsb2NrKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2ZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl9jX3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyB0aHJlYWQ7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisKKyAgICBmYXVsdGhhbmRsZXJfc3VwcHJlc3NfY3Jhc2hfcmVwb3J0KCk7CisKKyAgICBsb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmIChsb2NrID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGxvY2ssIFdBSVRfTE9DSyk7CisKKyAgICB0aHJlYWQgPSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl90aHJlYWQsIGxvY2spOworICAgIGlmICh0aHJlYWQgPT0gLTEpIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKGxvY2spOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAidW5hYmxlIHRvIHN0YXJ0IHRoZSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogd2FpdCB1bnRpbCB0aGUgdGhyZWFkIGNvbXBsZXRlczogaXQgd2lsbCBuZXZlciBvY2N1ciwgc2luY2UgUHlfRmF0YWxFcnJvcigpCisgICAgICAgZXhpdHMgdGhlIHByb2Nlc3MgaW1tZWRpYWx0eS4gKi8KKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sobG9jaywgV0FJVF9MT0NLKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobG9jayk7CisgICAgUHlUaHJlYWRfZnJlZV9sb2NrKGxvY2spOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisjZW5kaWYKKwogc3RhdGljIFB5T2JqZWN0ICoKIGZhdWx0aGFuZGxlcl9zaWdmcGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtOTUxLDYgKzEwNjMsOCBAQAogfQogCiAjaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQorI2RlZmluZSBGQVVMVEhBTkRMRVJfU1RBQ0tfT1ZFUkZMT1cKKwogI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKICAgIC8qIElzc3VlICMyMzY1NDogVHVybiBvZmYgSUNDJ3MgdGFpbCBjYWxsIG9wdGltaXphdGlvbiBmb3IgdGhlCiAgICAgKiBzdGFja19vdmVyZmxvdyBnZW5lcmF0b3IuIElDQyB0dXJucyB0aGUgcmVjdXJzaXZlIHRhaWwgY2FsbCBpbnRvCkBAIC05OTQsNyArMTEwOCw3IEBACiAgICAgICAgIHNpemUsIGRlcHRoKTsKICAgICByZXR1cm4gTlVMTDsKIH0KLSNlbmRpZgorI2VuZGlmICAgLyogZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKSAqLwogCiAKIHN0YXRpYyBpbnQKQEAgLTEwMTcsMTIgKzExMzEsMjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKK3N0YXRpYyBQeU9iamVjdCAqCitmYXVsdGhhbmRsZXJfcmFpc2VfZXhjZXB0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgY29kZSwgZmxhZ3MgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSXxJOl9yYWlzZV9leGNlcHRpb24iLCAmY29kZSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmF1bHRoYW5kbGVyX3N1cHByZXNzX2NyYXNoX3JlcG9ydCgpOworICAgIFJhaXNlRXhjZXB0aW9uKGNvZGUsIGZsYWdzLCAwLCBOVUxMKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKyNlbmRpZgorCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKICJmYXVsdGhhbmRsZXIgbW9kdWxlLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKICAgICB7ImVuYWJsZSIsCi0gICAgIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfZW5hYmxlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKKyAgICAgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9weV9lbmFibGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoImVuYWJsZShmaWxlPXN5cy5zdGRlcnIsIGFsbF90aHJlYWRzPVRydWUpOiAiCiAgICAgICAgICAgICAgICAiZW5hYmxlIHRoZSBmYXVsdCBoYW5kbGVyIil9LAogICAgIHsiZGlzYWJsZSIsIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfZGlzYWJsZV9weSwgTUVUSF9OT0FSR1MsCkBAIC0xMDY1LDE2ICsxMTkyLDI1IEBACiAgICAgICAgICAgICAgICAiYSBTSUdTRUdWIG9yIFNJR0JVUyBzaWduYWwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSIpfSwKICAgICB7Il9zaWdzZWd2IiwgZmF1bHRoYW5kbGVyX3NpZ3NlZ3YsIE1FVEhfVkFSQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc2lnc2VndihyZWxlYXNlX2dpbD1GYWxzZSk6IHJhaXNlIGEgU0lHU0VHViBzaWduYWwiKX0sCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICB7Il9mYXRhbF9lcnJvcl9jX3RocmVhZCIsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcl9jX3RocmVhZCwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiZmF0YWxfZXJyb3JfY190aHJlYWQoKTogIgorICAgICAgICAgICAgICAgImNhbGwgUHlfRmF0YWxFcnJvcigpIGluIGEgbmV3IEMgdGhyZWFkLiIpfSwKKyNlbmRpZgogICAgIHsiX3NpZ2FicnQiLCBmYXVsdGhhbmRsZXJfc2lnYWJydCwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ2FicnQoKTogcmFpc2UgYSBTSUdBQlJUIHNpZ25hbCIpfSwKICAgICB7Il9zaWdmcGUiLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX3NpZ2ZwZSwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ2ZwZSgpOiByYWlzZSBhIFNJR0ZQRSBzaWduYWwiKX0sCiAgICAgeyJfZmF0YWxfZXJyb3IiLCBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfcHksIE1FVEhfVkFSQVJHUywKICAgICAgUHlEb2NfU1RSKCJfZmF0YWxfZXJyb3IobWVzc2FnZSk6IGNhbGwgUHlfRmF0YWxFcnJvcihtZXNzYWdlKSIpfSwKLSNpZiBkZWZpbmVkKEhBVkVfU0lHQUxUU1RBQ0spICYmIGRlZmluZWQoSEFWRV9TSUdBQ1RJT04pCisjaWZkZWYgRkFVTFRIQU5ETEVSX1NUQUNLX09WRVJGTE9XCiAgICAgeyJfc3RhY2tfb3ZlcmZsb3ciLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX3N0YWNrX292ZXJmbG93LCBNRVRIX05PQVJHUywKICAgICAgUHlEb2NfU1RSKCJfc3RhY2tfb3ZlcmZsb3coKTogcmVjdXJzaXZlIGNhbGwgdG8gcmFpc2UgYSBzdGFjayBvdmVyZmxvdyIpfSwKICNlbmRpZgorI2lmZGVmIE1TX1dJTkRPV1MKKyAgICB7Il9yYWlzZV9leGNlcHRpb24iLCBmYXVsdGhhbmRsZXJfcmFpc2VfZXhjZXB0aW9uLCBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigicmFpc2VfZXhjZXB0aW9uKGNvZGUsIGZsYWdzPTApOiBDYWxsIFJhaXNlRXhjZXB0aW9uKGNvZGUsIGZsYWdzKS4iKX0sCisjZW5kaWYKICAgICB7TlVMTCwgTlVMTH0gIC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC0xMDkzLDcgKzEyMjksMzMgQEAKIFB5TU9ESU5JVF9GVU5DCiBQeUluaXRfZmF1bHRoYW5kbGVyKHZvaWQpCiB7Ci0gICAgcmV0dXJuIFB5TW9kdWxlX0NyZWF0ZSgmbW9kdWxlX2RlZik7CisgICAgUHlPYmplY3QgKm0gPSBQeU1vZHVsZV9DcmVhdGUoJm1vZHVsZV9kZWYpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQWRkIGNvbnN0YW50cyBmb3IgdW5pdCB0ZXN0cyAqLworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAvKiBSYWlzZUV4Y2VwdGlvbigpIGNvZGVzIChwcmVmaXhlZCBieSBhbiB1bmRlcnNjb3JlKSAqLworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fSU5UX0RJVklERV9CWV9aRVJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX0VYQ0VQVElPTl9TVEFDS19PVkVSRkxPVyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogUmFpc2VFeGNlcHRpb24oKSBmbGFncyAocHJlZml4ZWQgYnkgYW4gdW5kZXJzY29yZSkgKi8KKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fTk9OQ09OVElOVUFCTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fTk9OQ09OVElOVUFCTEUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTikpCisgICAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisKKyAgICByZXR1cm4gbTsKIH0KIAogLyogQ2FsbCBmYXVsdGhhbmRsZXIuZW5hYmxlKCkgaWYgdGhlIFBZVEhPTkZBVUxUSEFORExFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nY21vZHVsZS5jIGIvTW9kdWxlcy9nY21vZHVsZS5jCmluZGV4IGNiNzIyMmQuLjBjNmY0NDQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL2djbW9kdWxlLmMKQEAgLTczOCw3ICs3MzgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotZGVidWdfY3ljbGUoY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCitkZWJ1Z19jeWNsZShjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpvcCkKIHsKICAgICBQeVN5c19Gb3JtYXRTdGRlcnIoImdjOiAlcyA8JXMgJXA+XG4iLAogICAgICAgICAgICAgICAgICAgICAgICBtc2csIFB5X1RZUEUob3ApLT50cF9uYW1lLCBvcCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldGFkZHJpbmZvLmMgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKaW5kZXggZDgxNjdlYS4uYjZmYjUzYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jCisrKyBiL01vZHVsZXMvZ2V0YWRkcmluZm8uYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKiwgaW50KTsKIHN0YXRpYyBpbnQgc3RyX2lzbnVtYmVyKGNvbnN0IGNoYXIgKik7CiAKLXN0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFpX2Vycmxpc3RbXSA9IHsKICAgICAic3VjY2Vzcy4iLAogICAgICJhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZC4iLCAgICAgICAvKiBFQUlfQUREUkZBTUlMWSAqLwogICAgICJ0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24uIiwgICAgICAgICAgICAvKiBFQUlfQUdBSU4gICAgICAqLwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKICNkZWZpbmUgRVJSKGVycikgeyBlcnJvciA9IChlcnIpOyBnb3RvIGJhZDsgfQogCi1jaGFyICoKK2NvbnN0IGNoYXIgKgogZ2FpX3N0cmVycm9yKGludCBlY29kZSkKIHsKICAgICBpZiAoZWNvZGUgPCAwIHx8IGVjb2RlID4gRUFJX01BWCkKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2V0cGF0aC5jIGIvTW9kdWxlcy9nZXRwYXRoLmMKaW5kZXggMDNkMjkyYy4uMzBhMGU5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRwYXRoLmMKKysrIGIvTW9kdWxlcy9nZXRwYXRoLmMKQEAgLTQ3Nyw4ICs0NzcsOCBAQAogewogICAgIGV4dGVybiB3Y2hhcl90ICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKIAotICAgIHN0YXRpYyB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307Ci0gICAgc3RhdGljIHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3QgZGVsaW1pdGVyWzJdID0ge0RFTElNLCAnXDAnfTsKKyAgICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBzZXBhcmF0b3JbMl0gPSB7U0VQLCAnXDAnfTsKICAgICBjaGFyICpfcnRweXBhdGggPSBQeV9HRVRFTlYoIlBZVEhPTlBBVEgiKTsgLyogWFhYIHVzZSB3aWRlIHZlcnNpb24gb24gV2luZG93cyAqLwogICAgIHdjaGFyX3QgKnJ0cHlwYXRoID0gTlVMTDsKICAgICB3Y2hhcl90ICpob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9ncnBtb2R1bGUuYyBiL01vZHVsZXMvZ3JwbW9kdWxlLmMKaW5kZXggNDAzZTQzNC4uNWFkODdmMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9ncnBtb2R1bGUuYworKysgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCkBAIC0xMDAsMTQgKzEwMCwyNSBAQAogICAgIGdpZF90IGdpZDsKICAgICBzdHJ1Y3QgZ3JvdXAgKnA7CiAKLSAgICBweV9pbnRfaWQgPSBQeU51bWJlcl9Mb25nKGlkKTsKLSAgICBpZiAoIXB5X2ludF9pZCkKKyAgICBpZiAoIV9QeV9HaWRfQ29udmVydGVyKGlkLCAmZ2lkKSkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihweV9pbnRfaWQsICZnaWQpKSB7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAgaWQgbXVzdCBiZSBpbnQsIG5vdCAlLjIwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLT5vYl90eXBlLT50cF9uYW1lKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHB5X2ludF9pZCA9IFB5TnVtYmVyX0xvbmcoaWQpOworICAgICAgICBpZiAoIXB5X2ludF9pZCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIV9QeV9HaWRfQ29udmVydGVyKHB5X2ludF9pZCwgJmdpZCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihweV9pbnRfaWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKHB5X2ludF9pZCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKIAogICAgIGlmICgocCA9IGdldGdyZ2lkKGdpZCkpID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKmdpZF9vYmogPSBfUHlMb25nX0Zyb21HaWQoZ2lkKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvaGFzaHRhYmxlLmMgYi9Nb2R1bGVzL2hhc2h0YWJsZS5jCmluZGV4IDEzM2YzMTMuLmI1M2NjMjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaGFzaHRhYmxlLmMKKysrIGIvTW9kdWxlcy9oYXNodGFibGUuYwpAQCAtMSw1ICsxLDUgQEAKLS8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaCB0YWJsZSAoX1B5X2hhc2h0YWJsZV90KSBpcyBiYXNlZCBvbiB0aGUgY2Z1aGFzaAotICAgcHJvamVjdDoKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaGFzaCB0YWJsZSAoX1B5X2hhc2h0YWJsZV90KSBpcyBiYXNlZCBvbiB0aGUKKyAgIGNmdWhhc2ggcHJvamVjdDoKICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbGliY2Z1LwogCiAgICBDb3B5cmlnaHQgb2YgY2Z1aGFzaDoKQEAgLTU5LDcgKzU5LDIxIEBACiAjZGVmaW5lIEVOVFJZX05FWFQoRU5UUlkpIFwKICAgICAgICAgKChfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKilfUHlfU0xJU1RfSVRFTV9ORVhUKEVOVFJZKSkKICNkZWZpbmUgSEFTSFRBQkxFX0lURU1fU0laRShIVCkgXAotICAgICAgICAoc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkgKyAoSFQpLT5kYXRhX3NpemUpCisgICAgICAgIChzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSArIChIVCktPmtleV9zaXplICsgKEhUKS0+ZGF0YV9zaXplKQorCisjZGVmaW5lIEVOVFJZX1JFQURfUERBVEEoVEFCTEUsIEVOVFJZLCBEQVRBX1NJWkUsIFBEQVRBKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydCgoREFUQV9TSVpFKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgoUERBVEEpLCBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKFRBQkxFLCAoRU5UUlkpKSwgXAorICAgICAgICAgICAgICAgICAgKERBVEFfU0laRSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFTlRSWV9XUklURV9QREFUQShUQUJMRSwgRU5UUlksIERBVEFfU0laRSwgUERBVEEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KChEQVRBX1NJWkUpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCh2b2lkICopX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQSgoVEFCTEUpLCAoRU5UUlkpKSwgXAorICAgICAgICAgICAgICAgICAgKFBEQVRBKSwgKERBVEFfU0laRSkpOyBcCisgICAgfSB3aGlsZSAoMCkKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RhdGljIHZvaWQgaGFzaHRhYmxlX3JlaGFzaChfUHlfaGFzaHRhYmxlX3QgKmh0KTsKQEAgLTcwLDYgKzg0LDcgQEAKICAgICBsaXN0LT5oZWFkID0gTlVMTDsKIH0KIAorCiBzdGF0aWMgdm9pZAogX1B5X3NsaXN0X3ByZXBlbmQoX1B5X3NsaXN0X3QgKmxpc3QsIF9QeV9zbGlzdF9pdGVtX3QgKml0ZW0pCiB7CkBAIC03Nyw2ICs5Miw3IEBACiAgICAgbGlzdC0+aGVhZCA9IGl0ZW07CiB9CiAKKwogc3RhdGljIHZvaWQKIF9QeV9zbGlzdF9yZW1vdmUoX1B5X3NsaXN0X3QgKmxpc3QsIF9QeV9zbGlzdF9pdGVtX3QgKnByZXZpb3VzLAogICAgICAgICAgICAgICAgICBfUHlfc2xpc3RfaXRlbV90ICppdGVtKQpAQCAtODcsMjQgKzEwMywyNiBAQAogICAgICAgICBsaXN0LT5oZWFkID0gaXRlbS0+bmV4dDsKIH0KIAotUHlfdWhhc2hfdAotX1B5X2hhc2h0YWJsZV9oYXNoX2ludChjb25zdCB2b2lkICprZXkpCi17Ci0gICAgcmV0dXJuIChQeV91aGFzaF90KWtleTsKLX0KIAogUHlfdWhhc2hfdAotX1B5X2hhc2h0YWJsZV9oYXNoX3B0cihjb25zdCB2b2lkICprZXkpCitfUHlfaGFzaHRhYmxlX2hhc2hfcHRyKHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQogewotICAgIHJldHVybiAoUHlfdWhhc2hfdClfUHlfSGFzaFBvaW50ZXIoKHZvaWQgKilrZXkpOworICAgIHZvaWQgKmtleTsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIGtleSk7CisgICAgcmV0dXJuIChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcihrZXkpOwogfQogCisKIGludAotX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdChjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCitfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCiB7Ci0gICAgcmV0dXJuIGVudHJ5LT5rZXkgPT0ga2V5OworICAgIGNvbnN0IHZvaWQgKnBrZXkyID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKGVudHJ5KTsKKyAgICByZXR1cm4gKG1lbWNtcChwa2V5LCBwa2V5MiwgaHQtPmtleV9zaXplKSA9PSAwKTsKIH0KIAorCiAvKiBtYWtlcyBzdXJlIHRoZSByZWFsIHNpemUgb2YgdGhlIGJ1Y2tldHMgYXJyYXkgaXMgYSBwb3dlciBvZiAyICovCiBzdGF0aWMgc2l6ZV90CiByb3VuZF9zaXplKHNpemVfdCBzKQpAQCAtMTE4LDEzICsxMzYsMTIgQEAKICAgICByZXR1cm4gaTsKIH0KIAorCiBfUHlfaGFzaHRhYmxlX3QgKgotX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgaW5pdF9zaXplLAorX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChzaXplX3Qga2V5X3NpemUsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jIGNvcHlfZGF0YV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2ZyZWVfZGF0YV9mdW5jIGZyZWVfZGF0YV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYyBnZXRfZGF0YV9zaXplX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgKmFsbG9jYXRvcikKIHsKICAgICBfUHlfaGFzaHRhYmxlX3QgKmh0OwpAQCAtMTQ0LDYgKzE2MSw3IEBACiAKICAgICBodC0+bnVtX2J1Y2tldHMgPSByb3VuZF9zaXplKGluaXRfc2l6ZSk7CiAgICAgaHQtPmVudHJpZXMgPSAwOworICAgIGh0LT5rZXlfc2l6ZSA9IGtleV9zaXplOwogICAgIGh0LT5kYXRhX3NpemUgPSBkYXRhX3NpemU7CiAKICAgICBidWNrZXRzX3NpemUgPSBodC0+bnVtX2J1Y2tldHMgKiBzaXplb2YoaHQtPmJ1Y2tldHNbMF0pOwpAQCAtMTU2LDI4ICsxNzQsMjcgQEAKIAogICAgIGh0LT5oYXNoX2Z1bmMgPSBoYXNoX2Z1bmM7CiAgICAgaHQtPmNvbXBhcmVfZnVuYyA9IGNvbXBhcmVfZnVuYzsKLSAgICBodC0+Y29weV9kYXRhX2Z1bmMgPSBjb3B5X2RhdGFfZnVuYzsKLSAgICBodC0+ZnJlZV9kYXRhX2Z1bmMgPSBmcmVlX2RhdGFfZnVuYzsKLSAgICBodC0+Z2V0X2RhdGFfc2l6ZV9mdW5jID0gZ2V0X2RhdGFfc2l6ZV9mdW5jOwogICAgIGh0LT5hbGxvYyA9IGFsbG9jOwogICAgIHJldHVybiBodDsKIH0KIAorCiBfUHlfaGFzaHRhYmxlX3QgKgotX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZV90IGRhdGFfc2l6ZSwKK19QeV9oYXNodGFibGVfbmV3KHNpemVfdCBrZXlfc2l6ZSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYywKICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYykKIHsKLSAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChkYXRhX3NpemUsIEhBU0hUQUJMRV9NSU5fU0laRSwKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChrZXlfc2l6ZSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBU0hUQUJMRV9NSU5fU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Z1bmMsIGNvbXBhcmVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIH0KIAorCiBzaXplX3QKIF9QeV9oYXNodGFibGVfc2l6ZShfUHlfaGFzaHRhYmxlX3QgKmh0KQogewogICAgIHNpemVfdCBzaXplOwotICAgIHNpemVfdCBodjsKIAogICAgIHNpemUgPSBzaXplb2YoX1B5X2hhc2h0YWJsZV90KTsKIApAQCAtMTg3LDIyICsyMDQsMTAgQEAKICAgICAvKiBlbnRyaWVzICovCiAgICAgc2l6ZSArPSBodC0+ZW50cmllcyAqIEhBU0hUQUJMRV9JVEVNX1NJWkUoaHQpOwogCi0gICAgLyogZGF0YSBsaW5rZWQgZnJvbSBlbnRyaWVzICovCi0gICAgaWYgKGh0LT5nZXRfZGF0YV9zaXplX2Z1bmMpIHsKLSAgICAgICAgZm9yIChodiA9IDA7IGh2IDwgaHQtPm51bV9idWNrZXRzOyBodisrKSB7Ci0gICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwotCi0gICAgICAgICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaHYpOyBlbnRyeTsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICAgICAgICAgIHZvaWQgKmRhdGE7Ci0KLSAgICAgICAgICAgICAgICBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBodC0+Z2V0X2RhdGFfc2l6ZV9mdW5jKGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQogICAgIHJldHVybiBzaXplOwogfQogCisKICNpZmRlZiBQeV9ERUJVRwogdm9pZAogX1B5X2hhc2h0YWJsZV9wcmludF9zdGF0cyhfUHlfaGFzaHRhYmxlX3QgKmh0KQpAQCAtMjQzLDM4ICsyNDgsNDUgQEAKIH0KICNlbmRpZgogCi0vKiBHZXQgYW4gZW50cnkuIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QuICovCisKIF9QeV9oYXNodGFibGVfZW50cnlfdCAqCi1fUHlfaGFzaHRhYmxlX2dldF9lbnRyeShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXkpCitfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9zaXplLCBjb25zdCB2b2lkICpwa2V5KQogewogICAgIFB5X3VoYXNoX3Qga2V5X2hhc2g7CiAgICAgc2l6ZV90IGluZGV4OwogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CiAKLSAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoa2V5KTsKKyAgICBhc3NlcnQoa2V5X3NpemUgPT0gaHQtPmtleV9zaXplKTsKKworICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhodCwgcGtleSk7CiAgICAgaW5kZXggPSBrZXlfaGFzaCAmIChodC0+bnVtX2J1Y2tldHMgLSAxKTsKIAogICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBpbmRleCk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gRU5UUllfTkVYVChlbnRyeSkpIHsKLSAgICAgICAgaWYgKGVudHJ5LT5rZXlfaGFzaCA9PSBrZXlfaGFzaCAmJiBodC0+Y29tcGFyZV9mdW5jKGtleSwgZW50cnkpKQorICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoaHQsIHBrZXksIGVudHJ5KSkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHJldHVybiBlbnRyeTsKIH0KIAorCiBzdGF0aWMgaW50Ci1faGFzaHRhYmxlX3BvcF9lbnRyeShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCitfUHlfaGFzaHRhYmxlX3BvcF9lbnRyeShfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQogewogICAgIFB5X3VoYXNoX3Qga2V5X2hhc2g7CiAgICAgc2l6ZV90IGluZGV4OwogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksICpwcmV2aW91czsKIAotICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhrZXkpOworICAgIGFzc2VydChrZXlfc2l6ZSA9PSBodC0+a2V5X3NpemUpOworCisgICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGh0LCBwa2V5KTsKICAgICBpbmRleCA9IGtleV9oYXNoICYgKGh0LT5udW1fYnVja2V0cyAtIDEpOwogCiAgICAgcHJldmlvdXMgPSBOVUxMOwogICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBpbmRleCk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gRU5UUllfTkVYVChlbnRyeSkpIHsKLSAgICAgICAgaWYgKGVudHJ5LT5rZXlfaGFzaCA9PSBrZXlfaGFzaCAmJiBodC0+Y29tcGFyZV9mdW5jKGtleSwgZW50cnkpKQorICAgICAgICBpZiAoZW50cnktPmtleV9oYXNoID09IGtleV9oYXNoICYmIGh0LT5jb21wYXJlX2Z1bmMoaHQsIHBrZXksIGVudHJ5KSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBwcmV2aW91cyA9IGVudHJ5OwogICAgIH0KQEAgLTI4Nyw3ICsyOTksNyBAQAogICAgIGh0LT5lbnRyaWVzLS07CiAKICAgICBpZiAoZGF0YSAhPSBOVUxMKQotICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShodCwgZGF0YSwgZGF0YV9zaXplLCBlbnRyeSk7CisgICAgICAgIEVOVFJZX1JFQURfUERBVEEoaHQsIGVudHJ5LCBkYXRhX3NpemUsIGRhdGEpOwogICAgIGh0LT5hbGxvYy5mcmVlKGVudHJ5KTsKIAogICAgIGlmICgoZmxvYXQpaHQtPmVudHJpZXMgLyAoZmxvYXQpaHQtPm51bV9idWNrZXRzIDwgSEFTSFRBQkxFX0xPVykKQEAgLTI5NSwyNiArMzA3LDI3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKLS8qIEFkZCBhIG5ldyBlbnRyeSB0byB0aGUgaGFzaC4gVGhlIGtleSBtdXN0IG5vdCBiZSBwcmVzZW50IGluIHRoZSBoYXNoIHRhYmxlLgotICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gbWVtb3J5IGVycm9yLiAqLworCiBpbnQKLV9QeV9oYXNodGFibGVfc2V0KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCitfUHlfaGFzaHRhYmxlX3NldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCBjb25zdCB2b2lkICpkYXRhKQogewogICAgIFB5X3VoYXNoX3Qga2V5X2hhc2g7CiAgICAgc2l6ZV90IGluZGV4OwogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CiAKKyAgICBhc3NlcnQoa2V5X3NpemUgPT0gaHQtPmtleV9zaXplKTsKKwogICAgIGFzc2VydChkYXRhICE9IE5VTEwgfHwgZGF0YV9zaXplID09IDApOwogI2lmbmRlZiBOREVCVUcKICAgICAvKiBEb24ndCB3cml0ZSB0aGUgYXNzZXJ0aW9uIG9uIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBpdCBpcyBpbnRlcmVzdGluZwogICAgICAgIHRvIGtub3cgdGhlIGR1cGxpY2F0ZWQgZW50cnkgaWYgdGhlIGFzc2VydGlvbiBmYWlsZWQuIFRoZSBlbnRyeSBjYW4KICAgICAgICBiZSByZWFkIHVzaW5nIGEgZGVidWdnZXIuICovCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShodCwga2V5KTsKKyAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSk7CiAgICAgYXNzZXJ0KGVudHJ5ID09IE5VTEwpOwogI2VuZGlmCiAKLSAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoa2V5KTsKKyAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoaHQsIHBrZXkpOwogICAgIGluZGV4ID0ga2V5X2hhc2ggJiAoaHQtPm51bV9idWNrZXRzIC0gMSk7CiAKICAgICBlbnRyeSA9IGh0LT5hbGxvYy5tYWxsb2MoSEFTSFRBQkxFX0lURU1fU0laRShodCkpOwpAQCAtMzIzLDExICszMzYsOSBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZW50cnktPmtleSA9ICh2b2lkICopa2V5OwogICAgIGVudHJ5LT5rZXlfaGFzaCA9IGtleV9oYXNoOwotCi0gICAgYXNzZXJ0KGRhdGFfc2l6ZSA9PSBodC0+ZGF0YV9zaXplKTsKLSAgICBtZW1jcHkoX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICBQeV9NRU1DUFkoKHZvaWQgKilfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpLCBwa2V5LCBodC0+a2V5X3NpemUpOworICAgIEVOVFJZX1dSSVRFX1BEQVRBKGh0LCBlbnRyeSwgZGF0YV9zaXplLCBkYXRhKTsKIAogICAgIF9QeV9zbGlzdF9wcmVwZW5kKCZodC0+YnVja2V0c1tpbmRleF0sIChfUHlfc2xpc3RfaXRlbV90KillbnRyeSk7CiAgICAgaHQtPmVudHJpZXMrKzsKQEAgLTMzNyw0OCArMzQ4LDUwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIEdldCBkYXRhIGZyb20gYW4gZW50cnkuIENvcHkgZW50cnkgZGF0YSBpbnRvIGRhdGEgYW5kIHJldHVybiAxIGlmIHRoZSBlbnRyeQotICAgZXhpc3RzLCByZXR1cm4gMCBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QuICovCisKIGludAotX1B5X2hhc2h0YWJsZV9nZXQoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQorX1B5X2hhc2h0YWJsZV9nZXQoX1B5X2hhc2h0YWJsZV90ICpodCwgc2l6ZV90IGtleV9zaXplLGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQogewogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CiAKICAgICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKIAotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoaHQsIGtleSk7CisgICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShodCwga2V5X3NpemUsIHBrZXkpOwogICAgIGlmIChlbnRyeSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMDsKLSAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShodCwgZGF0YSwgZGF0YV9zaXplLCBlbnRyeSk7CisgICAgRU5UUllfUkVBRF9QREFUQShodCwgZW50cnksIGRhdGFfc2l6ZSwgZGF0YSk7CiAgICAgcmV0dXJuIDE7CiB9CiAKKwogaW50Ci1fUHlfaGFzaHRhYmxlX3BvcChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXksIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCitfUHlfaGFzaHRhYmxlX3BvcChfUHlfaGFzaHRhYmxlX3QgKmh0LCBzaXplX3Qga2V5X3NpemUsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCB2b2lkICpkYXRhKQogewogICAgIGFzc2VydChkYXRhICE9IE5VTEwpOwotICAgIGFzc2VydChodC0+ZnJlZV9kYXRhX2Z1bmMgPT0gTlVMTCk7Ci0gICAgcmV0dXJuIF9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXksIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgcmV0dXJuIF9QeV9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSwgZGF0YSwgZGF0YV9zaXplKTsKIH0KIAotLyogRGVsZXRlIGFuIGVudHJ5LiBUaGUgZW50cnkgbXVzdCBleGlzdC4gKi8KKworLyogQ29kZSBjb21tZW50ZWQgc2luY2UgdGhlIGZ1bmN0aW9uIGlzIG5vdCBuZWVkZWQgaW4gUHl0aG9uICovCisjaWYgMAogdm9pZAotX1B5X2hhc2h0YWJsZV9kZWxldGUoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5KQorX1B5X2hhc2h0YWJsZV9kZWxldGUoX1B5X2hhc2h0YWJsZV90ICpodCwgc2l6ZV90IGtleV9zaXplLCBjb25zdCB2b2lkICpwa2V5KQogewogI2lmbmRlZiBOREVCVUcKLSAgICBpbnQgZm91bmQgPSBfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5LCBOVUxMLCAwKTsKKyAgICBpbnQgZm91bmQgPSBfUHlfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5X3NpemUsIHBrZXksIE5VTEwsIDApOwogICAgIGFzc2VydChmb3VuZCk7CiAjZWxzZQotICAgICh2b2lkKV9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXksIE5VTEwsIDApOworICAgICh2b2lkKV9QeV9oYXNodGFibGVfcG9wX2VudHJ5KGh0LCBrZXlfc2l6ZSwgcGtleSwgTlVMTCwgMCk7CiAjZW5kaWYKIH0KKyNlbmRpZgogCi0vKiBQcm90b3R5cGUgZm9yIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBmb3JlYWNoCi0gICBrZXkvdmFsdWUgcGFpciBpbiB0aGUgaGFzaCBieSBoYXNodGFibGVfZm9yZWFjaCgpLiAgSXRlcmF0aW9uCi0gICBzdG9wcyBpZiBhIG5vbi16ZXJvIHZhbHVlIGlzIHJldHVybmVkLiAqLworCiBpbnQKIF9QeV9oYXNodGFibGVfZm9yZWFjaChfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZ1bmMpIChfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICphcmcpLAorICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jIGZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQogewogICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnk7CkBAIC0zODYsNyArMzk5LDcgQEAKIAogICAgIGZvciAoaHYgPSAwOyBodiA8IGh0LT5udW1fYnVja2V0czsgaHYrKykgewogICAgICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaHYpOyBlbnRyeTsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICAgICAgaW50IHJlcyA9IGZ1bmMoZW50cnksIGFyZyk7CisgICAgICAgICAgICBpbnQgcmVzID0gZnVuYyhodCwgZW50cnksIGFyZyk7CiAgICAgICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTM5NCw2ICs0MDcsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCiBoYXNodGFibGVfcmVoYXNoKF9QeV9oYXNodGFibGVfdCAqaHQpCiB7CkBAIC00MjUsNyArNDM5LDggQEAKICAgICAgICAgZm9yIChlbnRyeSA9IEJVQ0tFVFNfSEVBRChvbGRfYnVja2V0c1tidWNrZXRdKTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBuZXh0KSB7CiAgICAgICAgICAgICBzaXplX3QgZW50cnlfaW5kZXg7CiAKLSAgICAgICAgICAgIGFzc2VydChodC0+aGFzaF9mdW5jKGVudHJ5LT5rZXkpID09IGVudHJ5LT5rZXlfaGFzaCk7CisKKyAgICAgICAgICAgIGFzc2VydChodC0+aGFzaF9mdW5jKGh0LCBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoZW50cnkpKSA9PSBlbnRyeS0+a2V5X2hhc2gpOwogICAgICAgICAgICAgbmV4dCA9IEVOVFJZX05FWFQoZW50cnkpOwogICAgICAgICAgICAgZW50cnlfaW5kZXggPSBlbnRyeS0+a2V5X2hhc2ggJiAobmV3X3NpemUgLSAxKTsKIApAQCAtNDM2LDYgKzQ1MSw3IEBACiAgICAgaHQtPmFsbG9jLmZyZWUob2xkX2J1Y2tldHMpOwogfQogCisKIHZvaWQKIF9QeV9oYXNodGFibGVfY2xlYXIoX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKQEAgLTQ0NSw4ICs0NjEsNiBAQAogICAgIGZvciAoaT0wOyBpIDwgaHQtPm51bV9idWNrZXRzOyBpKyspIHsKICAgICAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGkpOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IG5leHQpIHsKICAgICAgICAgICAgIG5leHQgPSBFTlRSWV9ORVhUKGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChodC0+ZnJlZV9kYXRhX2Z1bmMpCi0gICAgICAgICAgICAgICAgaHQtPmZyZWVfZGF0YV9mdW5jKF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpKTsKICAgICAgICAgICAgIGh0LT5hbGxvYy5mcmVlKGVudHJ5KTsKICAgICAgICAgfQogICAgICAgICBfUHlfc2xpc3RfaW5pdCgmaHQtPmJ1Y2tldHNbaV0pOwpAQCAtNDU1LDYgKzQ2OSw3IEBACiAgICAgaGFzaHRhYmxlX3JlaGFzaChodCk7CiB9CiAKKwogdm9pZAogX1B5X2hhc2h0YWJsZV9kZXN0cm95KF9QeV9oYXNodGFibGVfdCAqaHQpCiB7CkBAIC00NjQsOCArNDc5LDYgQEAKICAgICAgICAgX1B5X3NsaXN0X2l0ZW1fdCAqZW50cnkgPSBodC0+YnVja2V0c1tpXS5oZWFkOwogICAgICAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICAgICAgIF9QeV9zbGlzdF9pdGVtX3QgKmVudHJ5X25leHQgPSBlbnRyeS0+bmV4dDsKLSAgICAgICAgICAgIGlmIChodC0+ZnJlZV9kYXRhX2Z1bmMpCi0gICAgICAgICAgICAgICAgaHQtPmZyZWVfZGF0YV9mdW5jKF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpKTsKICAgICAgICAgICAgIGh0LT5hbGxvYy5mcmVlKGVudHJ5KTsKICAgICAgICAgICAgIGVudHJ5ID0gZW50cnlfbmV4dDsKICAgICAgICAgfQpAQCAtNDc1LDM5ICs0ODgsMzEgQEAKICAgICBodC0+YWxsb2MuZnJlZShodCk7CiB9CiAKLS8qIFJldHVybiBhIGNvcHkgb2YgdGhlIGhhc2ggdGFibGUgKi8KKwogX1B5X2hhc2h0YWJsZV90ICoKIF9QeV9oYXNodGFibGVfY29weShfUHlfaGFzaHRhYmxlX3QgKnNyYykKIHsKKyAgICBjb25zdCBzaXplX3Qga2V5X3NpemUgPSBzcmMtPmtleV9zaXplOworICAgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSBzcmMtPmRhdGFfc2l6ZTsKICAgICBfUHlfaGFzaHRhYmxlX3QgKmRzdDsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwogICAgIHNpemVfdCBidWNrZXQ7CiAgICAgaW50IGVycjsKLSAgICB2b2lkICpkYXRhLCAqbmV3X2RhdGE7CiAKLSAgICBkc3QgPSBfUHlfaGFzaHRhYmxlX25ld19mdWxsKHNyYy0+ZGF0YV9zaXplLCBzcmMtPm51bV9idWNrZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+aGFzaF9mdW5jLCBzcmMtPmNvbXBhcmVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmNvcHlfZGF0YV9mdW5jLCBzcmMtPmZyZWVfZGF0YV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Z2V0X2RhdGFfc2l6ZV9mdW5jLCAmc3JjLT5hbGxvYyk7CisgICAgZHN0ID0gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChrZXlfc2l6ZSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5udW1fYnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+aGFzaF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5jb21wYXJlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjLT5hbGxvYyk7CiAgICAgaWYgKGRzdCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoYnVja2V0PTA7IGJ1Y2tldCA8IHNyYy0+bnVtX2J1Y2tldHM7IGJ1Y2tldCsrKSB7CiAgICAgICAgIGVudHJ5ID0gVEFCTEVfSEVBRChzcmMsIGJ1Y2tldCk7CiAgICAgICAgIGZvciAoOyBlbnRyeTsgZW50cnkgPSBFTlRSWV9ORVhUKGVudHJ5KSkgewotICAgICAgICAgICAgaWYgKHNyYy0+Y29weV9kYXRhX2Z1bmMpIHsKLSAgICAgICAgICAgICAgICBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSk7Ci0gICAgICAgICAgICAgICAgbmV3X2RhdGEgPSBzcmMtPmNvcHlfZGF0YV9mdW5jKGRhdGEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdfZGF0YSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBlcnIgPSBfUHlfaGFzaHRhYmxlX3NldChkc3QsIGVudHJ5LT5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19kYXRhLCBzcmMtPmRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gX1B5X2hhc2h0YWJsZV9zZXQoZHN0LCBlbnRyeS0+a2V5LCBkYXRhLCBzcmMtPmRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCB2b2lkICpwa2V5ID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKGVudHJ5KTsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBkYXRhID0gX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQShzcmMsIGVudHJ5KTsKKyAgICAgICAgICAgIGVyciA9IF9QeV9oYXNodGFibGVfc2V0KGRzdCwga2V5X3NpemUsIHBrZXksIGRhdGFfc2l6ZSwgcGRhdGEpOwogICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShkc3QpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTE2LDQgKzUyMSwzIEBACiAgICAgfQogICAgIHJldHVybiBkc3Q7CiB9Ci0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaGFzaHRhYmxlLmggYi9Nb2R1bGVzL2hhc2h0YWJsZS5oCmluZGV4IGE5Zjk5OTMuLjE4ZmVkMDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaGFzaHRhYmxlLmgKKysrIGIvTW9kdWxlcy9oYXNodGFibGUuaApAQCAtMSw5ICsxLDEwIEBACiAjaWZuZGVmIFB5X0hBU0hUQUJMRV9ICiAjZGVmaW5lIFB5X0hBU0hUQUJMRV9ICi0KIC8qIFRoZSB3aG9sZSBBUEkgaXMgcHJpdmF0ZSAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogCisvKiBTaW5nbGUgbGlua2VkIGxpc3QgKi8KKwogdHlwZWRlZiBzdHJ1Y3QgX1B5X3NsaXN0X2l0ZW1fcyB7CiAgICAgc3RydWN0IF9QeV9zbGlzdF9pdGVtX3MgKm5leHQ7CiB9IF9QeV9zbGlzdF9pdGVtX3Q7CkBAIC0xNiwzMyArMTcsNjYgQEAKIAogI2RlZmluZSBfUHlfU0xJU1RfSEVBRChTTElTVCkgKCgoX1B5X3NsaXN0X3QgKilTTElTVCktPmhlYWQpCiAKKworLyogX1B5X2hhc2h0YWJsZTogdGFibGUgZW50cnkgKi8KKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIHVzZWQgYnkgX1B5X2hhc2h0YWJsZV90LmJ1Y2tldHMgdG8gbGluayBlbnRyaWVzICovCiAgICAgX1B5X3NsaXN0X2l0ZW1fdCBfUHlfc2xpc3RfaXRlbTsKIAotICAgIGNvbnN0IHZvaWQgKmtleTsKICAgICBQeV91aGFzaF90IGtleV9oYXNoOwogCi0gICAgLyogZGF0YSBmb2xsb3dzICovCisgICAgLyoga2V5IChrZXlfc2l6ZSBieXRlcykgYW5kIHRoZW4gZGF0YSAoZGF0YV9zaXplIGJ5dGVzKSBmb2xsb3dzICovCiB9IF9QeV9oYXNodGFibGVfZW50cnlfdDsKIAotI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoRU5UUlkpIFwKLSAgICAgICAgKChjaGFyICopKEVOVFJZKSArIHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpKQorI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BLRVkoRU5UUlkpIFwKKyAgICAgICAgKChjb25zdCB2b2lkICopKChjaGFyICopKEVOVFJZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpKSkKIAotI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKEVOVFJZKSBcCi0gICAgICAgICgqKHZvaWQgKiopX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKEVOVFJZKSkKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQShUQUJMRSwgRU5UUlkpIFwKKyAgICAgICAgKChjb25zdCB2b2lkICopKChjaGFyICopKEVOVFJZKSBcCisgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKFRBQkxFKS0+a2V5X3NpemUpKQogCi0jZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKFRBQkxFLCBEQVRBLCBEQVRBX1NJWkUsIEVOVFJZKSBcCisvKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBwa2V5OiB1c2UgbWVtY3B5KCkgcmF0aGVyIHRoYW4gYSBwb2ludGVyIGRlcmVmZXJlbmNlCisgICB0byBhdm9pZCBtZW1vcnkgYWxpZ25tZW50IGlzc3Vlcy4gKi8KKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShUQUJMRSwgUEtFWSwgRFNUX0tFWSkgXAogICAgIGRvIHsgXAotICAgICAgICBhc3NlcnQoKERBVEFfU0laRSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAotICAgICAgICBtZW1jcHkoREFUQSwgX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKEVOVFJZKSwgREFUQV9TSVpFKTsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKERTVF9LRVkpID09IChUQUJMRSktPmtleV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoJihEU1RfS0VZKSwgKFBLRVkpLCBzaXplb2YoRFNUX0tFWSkpOyBcCiAgICAgfSB3aGlsZSAoMCkKIAotdHlwZWRlZiBQeV91aGFzaF90ICgqX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMpIChjb25zdCB2b2lkICprZXkpOwotdHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYykgKGNvbnN0IHZvaWQgKmtleSwgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICpoZSk7Ci10eXBlZGVmIHZvaWQqICgqX1B5X2hhc2h0YWJsZV9jb3B5X2RhdGFfZnVuYykodm9pZCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKCpfUHlfaGFzaHRhYmxlX2ZyZWVfZGF0YV9mdW5jKSh2b2lkICpkYXRhKTsKLXR5cGVkZWYgc2l6ZV90ICgqX1B5X2hhc2h0YWJsZV9nZXRfZGF0YV9zaXplX2Z1bmMpKHZvaWQgKmRhdGEpOworI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKFRBQkxFLCBFTlRSWSwgS0VZKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydChzaXplb2YoS0VZKSA9PSAoVEFCTEUpLT5rZXlfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCYoS0VZKSwgX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKEVOVFJZKSwgc2l6ZW9mKEtFWSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShUQUJMRSwgRU5UUlksIERBVEEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KHNpemVvZihEQVRBKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgmKERBVEEpLCBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKFRBQkxFLCAoRU5UUlkpKSwgXAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKERBVEEpKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9XUklURV9EQVRBKFRBQkxFLCBFTlRSWSwgREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKERBVEEpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCh2b2lkICopX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQSgoVEFCTEUpLCAoRU5UUlkpKSwgXAorICAgICAgICAgICAgICAgICAgJihEQVRBKSwgc2l6ZW9mKERBVEEpKTsgXAorICAgIH0gd2hpbGUgKDApCisKKworLyogX1B5X2hhc2h0YWJsZTogcHJvdG90eXBlcyAqLworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90OworCit0eXBlZGVmIFB5X3VoYXNoX3QgKCpfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYykgKHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwa2V5KTsKK3R5cGVkZWYgaW50ICgqX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMpIChzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqaGUpOwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogYWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgKi8KQEAgLTUyLDc3ICs4NiwxMjYgQEAKICAgICB2b2lkICgqZnJlZSkgKHZvaWQgKnB0cik7CiB9IF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3Q7CiAKLXR5cGVkZWYgc3RydWN0IHsKKworLyogX1B5X2hhc2h0YWJsZTogdGFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90IHsKICAgICBzaXplX3QgbnVtX2J1Y2tldHM7CiAgICAgc2l6ZV90IGVudHJpZXM7IC8qIFRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZS4gKi8KICAgICBfUHlfc2xpc3RfdCAqYnVja2V0czsKKyAgICBzaXplX3Qga2V5X3NpemU7CiAgICAgc2l6ZV90IGRhdGFfc2l6ZTsKIAogICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYzsKICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmM7Ci0gICAgX1B5X2hhc2h0YWJsZV9jb3B5X2RhdGFfZnVuYyBjb3B5X2RhdGFfZnVuYzsKLSAgICBfUHlfaGFzaHRhYmxlX2ZyZWVfZGF0YV9mdW5jIGZyZWVfZGF0YV9mdW5jOwotICAgIF9QeV9oYXNodGFibGVfZ2V0X2RhdGFfc2l6ZV9mdW5jIGdldF9kYXRhX3NpemVfZnVuYzsKICAgICBfUHlfaGFzaHRhYmxlX2FsbG9jYXRvcl90IGFsbG9jOwogfSBfUHlfaGFzaHRhYmxlX3Q7CiAKLS8qIGhhc2ggYW5kIGNvbXBhcmUgZnVuY3Rpb25zIGZvciBpbnRlZ2VycyBhbmQgcG9pbnRlcnMgKi8KLVB5QVBJX0ZVTkMoUHlfdWhhc2hfdCkgX1B5X2hhc2h0YWJsZV9oYXNoX3B0cihjb25zdCB2b2lkICprZXkpOwotUHlBUElfRlVOQyhQeV91aGFzaF90KSBfUHlfaGFzaHRhYmxlX2hhc2hfaW50KGNvbnN0IHZvaWQgKmtleSk7Ci1QeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdChjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpOworLyogaGFzaCBhIHBvaW50ZXIgKHZvaWQqKSAqLworUHlBUElfRlVOQyhQeV91aGFzaF90KSBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyKAorICAgIHN0cnVjdCBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIGNvbnN0IHZvaWQgKnBrZXkpOworCisvKiBjb21wYXJpc29uIHVzaW5nIG1lbWNtcCgpICovCitQeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCgKKyAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSk7CiAKIFB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV90ICopIF9QeV9oYXNodGFibGVfbmV3KAorICAgIHNpemVfdCBrZXlfc2l6ZSwKICAgICBzaXplX3QgZGF0YV9zaXplLAogICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYywKICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMpOworCiBQeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfdCAqKSBfUHlfaGFzaHRhYmxlX25ld19mdWxsKAorICAgIHNpemVfdCBrZXlfc2l6ZSwKICAgICBzaXplX3QgZGF0YV9zaXplLAogICAgIHNpemVfdCBpbml0X3NpemUsCiAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYywKLSAgICBfUHlfaGFzaHRhYmxlX2NvcHlfZGF0YV9mdW5jIGNvcHlfZGF0YV9mdW5jLAotICAgIF9QeV9oYXNodGFibGVfZnJlZV9kYXRhX2Z1bmMgZnJlZV9kYXRhX2Z1bmMsCi0gICAgX1B5X2hhc2h0YWJsZV9nZXRfZGF0YV9zaXplX2Z1bmMgZ2V0X2RhdGFfc2l6ZV9mdW5jLAogICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgKmFsbG9jYXRvcik7Ci1QeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfdCAqKSBfUHlfaGFzaHRhYmxlX2NvcHkoX1B5X2hhc2h0YWJsZV90ICpzcmMpOwotUHlBUElfRlVOQyh2b2lkKSBfUHlfaGFzaHRhYmxlX2NsZWFyKF9QeV9oYXNodGFibGVfdCAqaHQpOworCiBQeUFQSV9GVU5DKHZvaWQpIF9QeV9oYXNodGFibGVfZGVzdHJveShfUHlfaGFzaHRhYmxlX3QgKmh0KTsKIAotdHlwZWRlZiBpbnQgKCpfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYykgKF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKmFyZyk7CisvKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIHRhYmxlICovCitQeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfdCAqKSBfUHlfaGFzaHRhYmxlX2NvcHkoX1B5X2hhc2h0YWJsZV90ICpzcmMpOwogCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9oYXNodGFibGVfY2xlYXIoX1B5X2hhc2h0YWJsZV90ICpodCk7CisKK3R5cGVkZWYgaW50ICgqX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMpIChfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKTsKKworLyogQ2FsbCBmdW5jKCkgb24gZWFjaCBlbnRyeSBvZiB0aGUgaGFzaHRhYmxlLgorICAgSXRlcmF0aW9uIHN0b3BzIGlmIGZ1bmMoKSByZXN1bHQgaXMgbm9uLXplcm8sIGluIHRoaXMgY2FzZSBpdCdzIHRoZSByZXN1bHQKKyAgIG9mIHRoZSBjYWxsLiBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAuICovCiBQeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9mb3JlYWNoKAogICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMgZnVuYywgdm9pZCAqYXJnKTsKKyAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYyBmdW5jLAorICAgIHZvaWQgKmFyZyk7CisKIFB5QVBJX0ZVTkMoc2l6ZV90KSBfUHlfaGFzaHRhYmxlX3NpemUoX1B5X2hhc2h0YWJsZV90ICpodCk7CiAKLVB5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV9lbnRyeV90KikgX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXkpOworLyogQWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBoYXNoLiBUaGUga2V5IG11c3Qgbm90IGJlIHByZXNlbnQgaW4gdGhlIGhhc2ggdGFibGUuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBtZW1vcnkgZXJyb3IuCisKKyAgIERvbid0IGNhbGwgZGlyZWN0bHkgdGhpcyBmdW5jdGlvbiwKKyAgIGJ1dCB1c2UgX1B5X0hBU0hUQUJMRV9TRVQoKSBhbmQgX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKCkgbWFjcm9zICovCiBQeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9zZXQoCiAgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXksCi0gICAgdm9pZCAqZGF0YSwKLSAgICBzaXplX3QgZGF0YV9zaXplKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2dldCgKLSAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSwKLSAgICB2b2lkICpkYXRhLAotICAgIHNpemVfdCBkYXRhX3NpemUpOwotUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfcG9wKAotICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5LAotICAgIHZvaWQgKmRhdGEsCi0gICAgc2l6ZV90IGRhdGFfc2l6ZSk7Ci1QeUFQSV9GVU5DKHZvaWQpIF9QeV9oYXNodGFibGVfZGVsZXRlKAotICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5KTsKKyAgICBzaXplX3Qga2V5X3NpemUsCisgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICBzaXplX3QgZGF0YV9zaXplLAorICAgIGNvbnN0IHZvaWQgKmRhdGEpOwogCiAjZGVmaW5lIF9QeV9IQVNIVEFCTEVfU0VUKFRBQkxFLCBLRVksIERBVEEpIFwKLSAgICBfUHlfaGFzaHRhYmxlX3NldChUQUJMRSwgS0VZLCAmKERBVEEpLCBzaXplb2YoREFUQSkpCisgICAgX1B5X2hhc2h0YWJsZV9zZXQoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSksIHNpemVvZihEQVRBKSwgJihEQVRBKSkKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEoVEFCTEUsIEtFWSkgXAorICAgIF9QeV9oYXNodGFibGVfc2V0KFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCAwLCBOVUxMKQorCisKKy8qIEdldCBhbiBlbnRyeS4KKyAgIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QuCisKKyAgIERvbid0IGNhbGwgZGlyZWN0bHkgdGhpcyBmdW5jdGlvbiwgYnV0IHVzZSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSgpCisgICBtYWNybyAqLworUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX2VudHJ5X3QqKSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSgKKyAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5KTsKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWShUQUJMRSwgS0VZKSBcCisgICAgX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSkpCisKKworLyogR2V0IGRhdGEgZnJvbSBhbiBlbnRyeS4gQ29weSBlbnRyeSBkYXRhIGludG8gZGF0YSBhbmQgcmV0dXJuIDEgaWYgdGhlIGVudHJ5CisgICBleGlzdHMsIHJldHVybiAwIGlmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdC4KKworICAgRG9uJ3QgY2FsbCBkaXJlY3RseSB0aGlzIGZ1bmN0aW9uLCBidXQgdXNlIF9QeV9IQVNIVEFCTEVfR0VUKCkgbWFjcm8gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX2dldCgKKyAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAorICAgIHNpemVfdCBrZXlfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgdm9pZCAqZGF0YSk7CiAKICNkZWZpbmUgX1B5X0hBU0hUQUJMRV9HRVQoVEFCTEUsIEtFWSwgREFUQSkgXAotICAgIF9QeV9oYXNodGFibGVfZ2V0KFRBQkxFLCBLRVksICYoREFUQSksIHNpemVvZihEQVRBKSkKKyAgICBfUHlfaGFzaHRhYmxlX2dldChUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSwgc2l6ZW9mKERBVEEpLCAmKERBVEEpKQorCisKKy8qIERvbid0IGNhbGwgZGlyZWN0bHkgdGhpcyBmdW5jdGlvbiwgYnV0IHVzZSBfUHlfSEFTSFRBQkxFX1BPUCgpIG1hY3JvICovCitQeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9wb3AoCisgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICBzaXplX3Qga2V5X3NpemUsCisgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICBzaXplX3QgZGF0YV9zaXplLAorICAgIHZvaWQgKmRhdGEpOworCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfUE9QKFRBQkxFLCBLRVksIERBVEEpIFwKKyAgICBfUHlfaGFzaHRhYmxlX3BvcChUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSwgc2l6ZW9mKERBVEEpLCAmKERBVEEpKQorCiAKICNlbmRpZiAgIC8qIFB5X0xJTUlURURfQVBJICovCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggNDA5OTIyYS4uYzgyYWQ3YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC0xLDQgKzEsNSBAQAogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIApAQCAtNyw3ICs4LDcgQEAKICovCiAKIAotLyogZ3JvdXBieSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBncm91cGJ5IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC03NCw3ICs3NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ3JvdXBieV9uZXh0KGdyb3VwYnlvYmplY3QgKmdibykKIHsKLSAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlciwgKnRtcDsKKyAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyLCAqZ3JvdXBlcjsKIAogICAgIC8qIHNraXAgdG8gbmV4dCBpdGVyYXRpb24gZ3JvdXAgKi8KICAgICBmb3IgKDs7KSB7CkBAIC04NSw4ICs4Niw3IEBACiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaW50IHJjbXA7CiAKLSAgICAgICAgICAgIHJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZ2JvLT50Z3RrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdiby0+Y3VycmtleSwgUHlfRVEpOworICAgICAgICAgICAgcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwgZ2JvLT5jdXJya2V5LCBQeV9FUSk7CiAgICAgICAgICAgICBpZiAocmNtcCA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGVsc2UgaWYgKHJjbXAgPT0gMCkKQEAgLTEwMSwyNyArMTAxLDE5IEBACiAgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsIG5ld3ZhbHVlLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChuZXdrZXkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB0bXAgPSBnYm8tPmN1cnJrZXk7Ci0gICAgICAgIGdiby0+Y3VycmtleSA9IG5ld2tleTsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOwotCi0gICAgICAgIHRtcCA9IGdiby0+Y3VycnZhbHVlOwotICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOwotICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIFB5X1hTRVRSRUYoZ2JvLT5jdXJya2V5LCBuZXdrZXkpOworICAgICAgICBQeV9YU0VUUkVGKGdiby0+Y3VycnZhbHVlLCBuZXd2YWx1ZSk7CiAgICAgfQogCiAgICAgUHlfSU5DUkVGKGdiby0+Y3VycmtleSk7Ci0gICAgdG1wID0gZ2JvLT50Z3RrZXk7Ci0gICAgZ2JvLT50Z3RrZXkgPSBnYm8tPmN1cnJrZXk7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYoZ2JvLT50Z3RrZXksIGdiby0+Y3VycmtleSk7CiAKICAgICBncm91cGVyID0gX2dyb3VwZXJfY3JlYXRlKGdibywgZ2JvLT50Z3RrZXkpOwogICAgIGlmIChncm91cGVyID09IE5VTEwpCkBAIC0xNzMsNyArMTY1LDcgQEAKICAgICAgcmVkdWNlX2RvY30sCiAgICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pZ3JvdXBieV9zZXRzdGF0ZSwgICAgTUVUSF9PLAogICAgICBzZXRzdGF0ZV9kb2N9LAotICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoZ3JvdXBieV9kb2MsCkBAIC0yOTYsOCArMjg4LDcgQEAKICAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOwogICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywgbmV3dmFsdWUsIE5VTEwpOwogICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTMyNSw4ICszMTYsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX3JlZHVjZShfZ3JvdXBlcm9iamVjdCAqbHopCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICBsei0+cGFyZW50LCBsei0+dGd0a2V5KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwgbHotPnBhcmVudCwgbHotPnRndGtleSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBfZ3JvdXBlcl9tZXRob2RzW10gPSB7CkBAIC0zNTksNyArMzQ5LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKV9ncm91cGVyX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylfZ3JvdXBlcl90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTM4MCw4ICszNzAsNyBAQAogfTsKIAogCi0KLS8qIHRlZSBvYmplY3QgYW5kIHdpdGggc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgb2JqZWN0cyAqKioqKioqKioqKioqKiovCisvKiB0ZWUgb2JqZWN0IGFuZCB3aXRoIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIG9iamVjdHMgKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFRoZSB0ZWVkYXRhb2JqZWN0IHByZS1hbGxvY2F0ZXMgc3BhY2UgZm9yIExJTktDRUxMUyBudW1iZXIgb2Ygb2JqZWN0cy4KICAgIFRvIGhlbHAgdGhlIG9iamVjdCBmaXQgbmVhdGx5IGluc2lkZSBjYWNoZSBsaW5lcyAoc3BhY2UgZm9yIDE2IHRvIDMyCkBAIC0zOTYsNyArMzg1LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKml0OwotICAgIGludCBudW1yZWFkOyAgLyogMCA8PSBudW1yZWFkIDw9IExJTktDRUxMUyAqLworICAgIGludCBudW1yZWFkOyAgICAgICAgICAgICAgICAvKiAwIDw9IG51bXJlYWQgPD0gTElOS0NFTExTICovCiAgICAgUHlPYmplY3QgKm5leHRsaW5rOwogICAgIFB5T2JqZWN0ICoodmFsdWVzW0xJTktDRUxMU10pOwogfSB0ZWVkYXRhb2JqZWN0OwpAQCAtNDA0LDcgKzM5Myw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIHRlZWRhdGFvYmplY3QgKmRhdGFvYmo7Ci0gICAgaW50IGluZGV4OyAgICAvKiAwIDw9IGluZGV4IDw9IExJTktDRUxMUyAqLworICAgIGludCBpbmRleDsgICAgICAgICAgICAgICAgICAvKiAwIDw9IGluZGV4IDw9IExJTktDRUxMUyAqLwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKIH0gdGVlb2JqZWN0OwogCkBAIC00NjEsNiArNDUwLDcgQEAKIHRlZWRhdGFvYmplY3RfdHJhdmVyc2UodGVlZGF0YW9iamVjdCAqdGRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKiBhcmcpCiB7CiAgICAgaW50IGk7CisKICAgICBQeV9WSVNJVCh0ZG8tPml0KTsKICAgICBmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCiAgICAgICAgIFB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKQEAgLTUxMCw2ICs1MDAsNyBAQAogICAgIGludCBpOwogICAgIC8qIGNyZWF0ZSBhIHRlbXBvcmFyeSBsaXN0IG9mIGFscmVhZHkgaXRlcmF0ZWQgdmFsdWVzICovCiAgICAgUHlPYmplY3QgKnZhbHVlcyA9IFB5TGlzdF9OZXcodGRvLT5udW1yZWFkKTsKKwogICAgIGlmICghdmFsdWVzKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmb3IgKGk9MCA7IGk8dGRvLT5udW1yZWFkIDsgaSsrKSB7CkBAIC01NzcsNyArNTY4LDcgQEAKIFB5RG9jX1NUUlZBUih0ZWVkYXRhb2JqZWN0X2RvYywgIkRhdGEgY29udGFpbmVyIGNvbW1vbiB0byBtdWx0aXBsZSB0ZWUgb2JqZWN0cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVkYXRhb2JqZWN0X3R5cGUgPSB7Ci0gICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApICAgICAgICAgLyogTXVzdCBmaWxsIGluIHR5cGUgdmFsdWUgbGF0ZXIgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCiAgICAgIml0ZXJ0b29scy5fdGVlX2RhdGFvYmplY3QiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgc2l6ZW9mKHRlZWRhdGFvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCkBAIC01OTcsNyArNTg4LDcgQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAvKiB0cF9mbGFncyAqLwogICAgIHRlZWRhdGFvYmplY3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgKHRyYXZlcnNlcHJvYyl0ZWVkYXRhb2JqZWN0X3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXRlZWRhdGFvYmplY3RfY2xlYXIsICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTc1Miw5ICs3NDMsOSBAQAogIkl0ZXJhdG9yIHdyYXBwZWQgdG8gbWFrZSBpdCBjb3B5YWJsZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdGVlX21ldGhvZHNbXSA9IHsKLSAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbil0ZWVfY29weSwgIE1FVEhfTk9BUkdTLCB0ZWVjb3B5X2RvY30sCi0gICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pdGVlX3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywgcmVkdWNlX2RvY30sCi0gICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pdGVlX3NldHN0YXRlLCAgICBNRVRIX08sIHNldHN0YXRlX2RvY30sCisgICAgeyJfX2NvcHlfXyIsICAgICAgICAoUHlDRnVuY3Rpb24pdGVlX2NvcHksICAgICBNRVRIX05PQVJHUywgdGVlY29weV9kb2N9LAorICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9yZWR1Y2UsICAgTUVUSF9OT0FSR1MsIHJlZHVjZV9kb2N9LAorICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKXRlZV9zZXRzdGF0ZSwgTUVUSF9PLCAgICAgIHNldHN0YXRlX2RvY30sCiAgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKQEAgLTc4NCw3ICs3NzUsNyBAQAogICAgICh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLCAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgKGlucXVpcnkpdGVlX2NsZWFyLCAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIG9mZnNldG9mKHRlZW9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKXRlZV9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIHRlZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KQEAgLTg1MCwxMiArODQxLDEzIEBACiAidGVlKGl0ZXJhYmxlLCBuPTIpIC0tPiB0dXBsZSBvZiBuIGluZGVwZW5kZW50IGl0ZXJhdG9ycy4iKTsKIAogCi0vKiBjeWNsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGN5Y2xlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqaXQ7CiAgICAgUHlPYmplY3QgKnNhdmVkOworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAgICAgaW50IGZpcnN0cGFzczsKIH0gY3ljbGVvYmplY3Q7CiAKQEAgLTg5NSw2ICs4ODcsNyBAQAogICAgIH0KICAgICBsei0+aXQgPSBpdDsKICAgICBsei0+c2F2ZWQgPSBzYXZlZDsKKyAgICBsei0+aW5kZXggPSAwOwogICAgIGx6LT5maXJzdHBhc3MgPSAwOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwpAQCAtOTA0LDE1ICs4OTcsMTYgQEAKIGN5Y2xlX2RlYWxsb2MoY3ljbGVvYmplY3QgKmx6KQogewogICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotICAgIFB5X1hERUNSRUYobHotPnNhdmVkKTsKICAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOwogICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogY3ljbGVfdHJhdmVyc2UoY3ljbGVvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLSAgICBQeV9WSVNJVChsei0+aXQpOworICAgIGlmIChsei0+aXQpCisgICAgICAgIFB5X1ZJU0lUKGx6LT5pdCk7CiAgICAgUHlfVklTSVQobHotPnNhdmVkKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTkyMSw1NiArOTE1LDY5IEBACiBjeWNsZV9uZXh0KGN5Y2xlb2JqZWN0ICpseikKIHsKICAgICBQeU9iamVjdCAqaXRlbTsKLSAgICBQeU9iamVjdCAqaXQ7Ci0gICAgUHlPYmplY3QgKnRtcDsKIAotICAgIHdoaWxlICgxKSB7CisgICAgaWYgKGx6LT5pdCAhPSBOVUxMKSB7CiAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChsei0+aXQpOwogICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIWx6LT5maXJzdHBhc3MgJiYgUHlMaXN0X0FwcGVuZChsei0+c2F2ZWQsIGl0ZW0pKSB7CisgICAgICAgICAgICBpZiAobHotPmZpcnN0cGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSkpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaXRlbTsKICAgICAgICAgfQotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0gICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoUHlMaXN0X1NpemUobHotPnNhdmVkKSA9PSAwKQorICAgICAgICAvKiBOb3RlOiAgU3RvcEl0ZXJhdGlvbiBpcyBhbHJlYWR5IGNsZWFyZWQgYnkgUHlJdGVyX05leHQoKSAqLworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKLSAgICAgICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgdG1wID0gbHotPml0OwotICAgICAgICBsei0+aXQgPSBpdDsKLSAgICAgICAgbHotPmZpcnN0cGFzcyA9IDE7Ci0gICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBQeV9DTEVBUihsei0+aXQpOwogICAgIH0KKyAgICBpZiAoUHlfU0laRShsei0+c2F2ZWQpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0obHotPnNhdmVkLCBsei0+aW5kZXgpOworICAgIGx6LT5pbmRleCsrOworICAgIGlmIChsei0+aW5kZXggPj0gUHlfU0laRShsei0+c2F2ZWQpKQorICAgICAgICBsei0+aW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX3JlZHVjZShjeWNsZW9iamVjdCAqbHopCiB7Ci0gICAgLyogQ3JlYXRlIGEgbmV3IGN5Y2xlIHdpdGggdGhlIGl0ZXJhdG9yIHR1cGxlLCB0aGVuIHNldAotICAgICAqIHRoZSBzYXZlZCBzdGF0ZSBvbiBpdC4KLSAgICAgKi8KLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPKShPaSkiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgbHotPml0LCBsei0+c2F2ZWQsIGx6LT5maXJzdHBhc3MpOworICAgIC8qIENyZWF0ZSBhIG5ldyBjeWNsZSB3aXRoIHRoZSBpdGVyYXRvciB0dXBsZSwgdGhlbiBzZXQgdGhlIHNhdmVkIHN0YXRlICovCisgICAgaWYgKGx6LT5pdCA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGx6LT5pbmRleCAhPSAwKSB7CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX3NldHN0YXRlX18pOworICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoaXQsICZQeUlkX19fc2V0c3RhdGVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuIiwgbHotPmluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhOKShPaSkiLCBQeV9UWVBFKGx6KSwgaXQsIGx6LT5zYXZlZCwgMSk7CiAgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8pKE9pKSIsIFB5X1RZUEUobHopLCBsei0+aXQsIGx6LT5zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsei0+Zmlyc3RwYXNzKTsKK30KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX3NldHN0YXRlKGN5Y2xlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5T2JqZWN0ICpzYXZlZD1OVUxMOwogICAgIGludCBmaXJzdHBhc3M7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiT2kiLCAmc2F2ZWQsICZmaXJzdHBhc3MpKQorCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiTyFpIiwgJlB5TGlzdF9UeXBlLCAmc2F2ZWQsICZmaXJzdHBhc3MpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBQeV9YSU5DUkVGKHNhdmVkKTsKKyAgICBQeV9JTkNSRUYoc2F2ZWQpOwogICAgIFB5X1hTRVRSRUYobHotPnNhdmVkLCBzYXZlZCk7CiAgICAgbHotPmZpcnN0cGFzcyA9IGZpcnN0cGFzcyAhPSAwOworICAgIGx6LT5pbmRleCA9IDA7CiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKQEAgLTEwMzksNyArMTA0Niw3IEBACiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICpmdW5jOwogICAgIFB5T2JqZWN0ICppdDsKLSAgICBsb25nICAgICAgICAgc3RhcnQ7CisgICAgbG9uZyBzdGFydDsKIH0gZHJvcHdoaWxlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRyb3B3aGlsZV90eXBlOwpAQCAtMTEyOSw4ICsxMTM2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkcm9wd2hpbGVfcmVkdWNlKGRyb3B3aGlsZW9iamVjdCAqbHopCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLAotICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdGFydCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLCBsei0+ZnVuYywgbHotPml0LCBsei0+c3RhcnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTE4MSwxMyArMTE4NywxMyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBkcm9wd2hpbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWRyb3B3aGlsZV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWRyb3B3aGlsZV90cmF2ZXJzZSwgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKWRyb3B3aGlsZV9uZXh0LCAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotICAgIGRyb3B3aGlsZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZHJvcHdoaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCkBAIC0xMjA4LDcgKzEyMTQsNyBAQAogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqZnVuYzsKICAgICBQeU9iamVjdCAqaXQ7Ci0gICAgbG9uZyAgICAgICAgIHN0b3A7CisgICAgbG9uZyBzdG9wOwogfSB0YWtld2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGFrZXdoaWxlX3R5cGU7CkBAIC0xMjgzLDcgKzEyODksNyBAQAogICAgIH0KICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKICAgICBQeV9ERUNSRUYoZ29vZCk7Ci0gICAgaWYgKG9rID09IDEpCisgICAgaWYgKG9rID4gMCkKICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgIGlmIChvayA9PSAwKQpAQCAtMTI5NCwxNCArMTMwMCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRha2V3aGlsZV9yZWR1Y2UodGFrZXdoaWxlb2JqZWN0ICpseikKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0b3ApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0b3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGFrZXdoaWxlX3JlZHVjZV9zZXRzdGF0ZSh0YWtld2hpbGVvYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgaW50IHN0b3AgPSBQeU9iamVjdF9Jc1RydWUoc3RhdGUpOworCiAgICAgaWYgKHN0b3AgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBsei0+c3RvcCA9IHN0b3A7CkBAIC0xMzQ1LDcgKzEzNTEsNyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICB0YWtld2hpbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKXRha2V3aGlsZV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXRha2V3aGlsZV90cmF2ZXJzZSwgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtMTM2Niw3ICsxMzcyLDcgQEAKIH07CiAKIAotLyogaXNsaWNlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBpc2xpY2Ugb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0xNDAyLDcgKzE0MDgsOCBAQAogICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOworICAgICAgICAgICAgICAgICAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgIgorICAgICAgICAgICAgICAgICAgICJhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE0MTcsMTQgKzE0MjQsMTYgQEAKICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKKyAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yICIKKyAgICAgICAgICAgICAgICAgICAiYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdGFydDwwIHx8IHN0b3A8LTEpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIE5vbmUgb3IgYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOworICAgICAgICAgICAiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yICIKKyAgICAgICAgICAgImFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xNTIxLDYgKzE1MzAsNyBAQAogICAgICAqIHRoZW4gJ3NldHN0YXRlJyB3aXRoIHRoZSBuZXh0IGFuZCBjb3VudAogICAgICAqLwogICAgIFB5T2JqZWN0ICpzdG9wOworCiAgICAgaWYgKGx6LT5pdCA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICplbXB0eV9saXN0OwogICAgICAgICBQeU9iamVjdCAqZW1wdHlfaXQ7CkBAIC0xNTUwLDYgKzE1NjAsNyBAQAogaXNsaWNlX3NldHN0YXRlKGlzbGljZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBQeV9zc2l6ZV90IGNudCA9IFB5TG9uZ19Bc1NzaXplX3Qoc3RhdGUpOworCiAgICAgaWYgKGNudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBsei0+Y250ID0gY250OwpAQCAtMTc2NCw3ICsxNzc1LDcgQEAKIH07CiAKIAotLyogY2hhaW4gb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNoYWluIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTE4NDAsMzIgKzE4NTEsMzIgQEAKICAgICBQeU9iamVjdCAqaXRlbTsKIAogICAgIGlmIChsei0+c291cmNlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgc3RvcHBlZCAqLworICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgc3RvcHBlZCAqLwogCiAgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewogICAgICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBQeUl0ZXJfTmV4dChsei0+c291cmNlKTsKICAgICAgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBtb3JlIGlucHV0IHNvdXJjZXMgKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBubyBtb3JlIGlucHV0IHNvdXJjZXMgKi8KICAgICAgICAgfQogICAgICAgICBsei0+YWN0aXZlID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVyYWJsZSk7CiAgICAgICAgIGlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KICAgICAgICAgfQogICAgIH0KLSAgICBpdGVtID0gUHlJdGVyX05leHQobHotPmFjdGl2ZSk7CisgICAgaXRlbSA9ICgqUHlfVFlQRShsei0+YWN0aXZlKS0+dHBfaXRlcm5leHQpKGx6LT5hY3RpdmUpOwogICAgIGlmIChpdGVtICE9IE5VTEwpCiAgICAgICAgIHJldHVybiBpdGVtOwogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCByYWlzZWQgYW4gZXhjZXB0aW9uICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogaW5wdXQgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwogICAgIH0KICAgICBQeV9DTEVBUihsei0+YWN0aXZlKTsKLSAgICByZXR1cm4gY2hhaW5fbmV4dChseik7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY3Vyc2UgYW5kIHVzZSBuZXh0IGFjdGl2ZSAqLworICAgIHJldHVybiBjaGFpbl9uZXh0KGx6KTsgICAgICAgICAgICAgIC8qIHJlY3Vyc2UgYW5kIHVzZSBuZXh0IGFjdGl2ZSAqLwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTg5MSw2ICsxOTAyLDcgQEAKIGNoYWluX3NldHN0YXRlKGNoYWlub2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIFB5T2JqZWN0ICpzb3VyY2UsICphY3RpdmU9TlVMTDsKKwogICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJPfE8iLCAmc291cmNlLCAmYWN0aXZlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTE5MTUsMTMgKzE5MjcsMTMgQEAKIHRoYXQgZXZhbHVhdGVzIGxhemlseS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNoYWluX21ldGhvZHNbXSA9IHsKLSAgICB7ImZyb21faXRlcmFibGUiLCAoUHlDRnVuY3Rpb24pIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlLCAgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ0xBU1MsCi0gICAgICAgIGNoYWluX2Zyb21faXRlcmFibGVfZG9jfSwKKyAgICB7ImZyb21faXRlcmFibGUiLCAoUHlDRnVuY3Rpb24pIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlLCBNRVRIX08gfCBNRVRIX0NMQVNTLAorICAgICBjaGFpbl9mcm9tX2l0ZXJhYmxlX2RvY30sCiAgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pY2hhaW5fcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLAogICAgICByZWR1Y2VfZG9jfSwKICAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbiljaGFpbl9zZXRzdGF0ZSwgICAgTUVUSF9PLAogICAgICBzZXRzdGF0ZV9kb2N9LAotICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNoYWluX3R5cGUgPSB7CkBAIC0xOTczLDEwICsxOTg1LDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKnBvb2xzOyAgICAgICAgICAgICAgICAgICAgLyogdHVwbGUgb2YgcG9vbCB0dXBsZXMgKi8KLSAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLSAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHByb2R1Y3QgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3QgKnBvb2xzOyAgICAgICAgLyogdHVwbGUgb2YgcG9vbCB0dXBsZXMgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIHBvb2wgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBwcm9kdWN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHByb2R1Y3RfdHlwZTsKQEAgLTE5OTUsNyArMjAwNyw4IEBACiAgICAgICAgIFB5T2JqZWN0ICp0bXBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAgICAgICAgIGlmICh0bXBhcmdzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLCBrd2xpc3QsICZyZXBlYXQpKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKHRtcGFyZ3MsIGt3ZHMsICJ8bjpwcm9kdWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcmVwZWF0KSkgewogICAgICAgICAgICAgUHlfREVDUkVGKHRtcGFyZ3MpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTIyODQsNyArMjI5Nyw3IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IHByb2R1Y3RfdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAiaXRlcnRvb2xzLnByb2R1Y3QiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0gICAgc2l6ZW9mKHByb2R1Y3RvYmplY3QpLCAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIHNpemVvZihwcm9kdWN0b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKXByb2R1Y3RfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KQEAgLTIzMjYsMTUgKzIzMzksMTUgQEAKIH07CiAKIAotLyogY29tYmluYXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjb21iaW5hdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0gICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KLSAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBjb21iaW5hdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBjb21iaW5hdGlvbnNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY29tYmluYXRpb25zX3R5cGU7CkBAIC0yNTQ0LDE3ICsyNTU3LDE2IEBACiAgICAgUHlfc3NpemVfdCBpOwogICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUobHotPnBvb2wpOwogCi0gICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXRlKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHN0YXRlKSAhPSBsei0+cikKLSAgICB7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXRlKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHN0YXRlKSAhPSBsei0+cikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspIHsKICAgICAgICAgUHlfc3NpemVfdCBtYXg7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpOwogICAgICAgICBQeV9zc2l6ZV90IGluZGV4ID0gUHlMb25nX0FzU3NpemVfdChpbmRleE9iamVjdCk7CisKICAgICAgICAgaWYgKGluZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogbm90IGFuIGludGVnZXIgKi8KICAgICAgICAgbWF4ID0gaSArIG4gLSBsei0+cjsKQEAgLTI2NDAsNyArMjY1Miw3IEBACiB9OwogCiAKLS8qIGNvbWJpbmF0aW9ucyB3aXRoIHJlcGxhY2VtZW50IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29tYmluYXRpb25zIHdpdGggcmVwbGFjZW1lbnQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBFcXVpdmFsZW50IHRvOgogCkBAIC0yNjcwLDExICsyNjgyLDExIEBACiAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLworICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCiAgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0gICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KLSAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBjd3IgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBjd3IgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGN3cm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjd3JfdHlwZTsKQEAgLTI2OTEsOCArMjcwMyw5IEBACiAgICAgUHlfc3NpemVfdCBpOwogICAgIHN0YXRpYyBjaGFyICprd2FyZ3NbXSA9IHsiaXRlcmFibGUiLCAiciIsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9uOmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50Iiwga3dhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJnIpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uOmNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3MsICZpdGVyYWJsZSwgJnIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKQEAgLTI4NTcsOCArMjg3MCw3IEBACiAgICAgICAgIGluZGljZXMgPSBQeVR1cGxlX05ldyhsei0+cik7CiAgICAgICAgIGlmICghaW5kaWNlcykKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaT0wOyBpPGx6LT5yOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0KiBpbmRleCA9IFB5TG9uZ19Gcm9tU3NpemVfdChsei0+aW5kaWNlc1tpXSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4KSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGluZGljZXMpOwpAQCAtMjg4NCwxMCArMjg5NiwxMCBAQAogICAgIH0KIAogICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGx6LT5wb29sKTsKLSAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0KiBpbmRleE9iamVjdCA9IFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpOwogICAgICAgICBQeV9zc2l6ZV90IGluZGV4ID0gUHlMb25nX0FzU3NpemVfdChpbmRleE9iamVjdCk7CisKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIG5vdCBhbiBpbnRlZ2VyICovCiAgICAgICAgIC8qIGNsYW1wIHRoZSBpbmRleCAqLwpAQCAtMjk3MSw3ICsyOTgzLDcgQEAKIH07CiAKIAotLyogcGVybXV0YXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qIHBlcm11dGF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogZGVmIHBlcm11dGF0aW9ucyhpdGVyYWJsZSwgcj1Ob25lKToKICAgICAncGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSAtLT4gKDAsMSkgKDAsMikgKDEsMCkgKDEsMikgKDIsMCkgKDIsMSknCkBAIC0yOTk4LDEyICszMDEwLDEyIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KLSAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLwotICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgICAgICAgICAgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0gICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KLSAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBwZXJtdXRhdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAvKiBvbmUgaW5kZXggcGVyIGVsZW1lbnQgaW4gdGhlIHBvb2wgKi8KKyAgICBQeV9zc2l6ZV90ICpjeWNsZXM7ICAgICAvKiBvbmUgcm9sbG92ZXIgY291bnRlciBwZXIgZWxlbWVudCBpbiB0aGUgcmVzdWx0ICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90IHI7ICAgICAgICAgICAvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLworICAgIGludCBzdG9wcGVkOyAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBwZXJtdXRhdGlvbnNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcGVybXV0YXRpb25zX3R5cGU7CkBAIC0zMjE4LDcgKzMyMzAsNyBAQAogICAgICAgICBpbmRpY2VzID0gUHlUdXBsZV9OZXcobik7CiAgICAgICAgIGlmIChpbmRpY2VzID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKXsKKyAgICAgICAgZm9yIChpPTA7IGk8bjsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCogaW5kZXggPSBQeUxvbmdfRnJvbVNzaXplX3QocG8tPmluZGljZXNbaV0pOwogICAgICAgICAgICAgaWYgKCFpbmRleCkKICAgICAgICAgICAgICAgICBnb3RvIGVycjsKQEAgLTMyMjgsOCArMzI0MCw3IEBACiAgICAgICAgIGN5Y2xlcyA9IFB5VHVwbGVfTmV3KHBvLT5yKTsKICAgICAgICAgaWYgKGN5Y2xlcyA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIGZvciAoaT0wOyBpPHBvLT5yOyBpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpPTAgOyBpPHBvLT5yIDsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCogaW5kZXggPSBQeUxvbmdfRnJvbVNzaXplX3QocG8tPmN5Y2xlc1tpXSk7CiAgICAgICAgICAgICBpZiAoIWluZGV4KQogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwpAQCAtMzI1NywxNSArMzI2OCwxMiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvLT5wb29sKTsKLSAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShpbmRpY2VzKSAhPSBuIHx8Ci0gICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoY3ljbGVzKSAhPSBwby0+cikKLSAgICB7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoaW5kaWNlcykgIT0gbiB8fCBQeVR1cGxlX0dFVF9TSVpFKGN5Y2xlcykgIT0gcG8tPnIpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50cyIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxuOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPG47IGkrKykgewogICAgICAgICBQeU9iamVjdCogaW5kZXhPYmplY3QgPSBQeVR1cGxlX0dFVF9JVEVNKGluZGljZXMsIGkpOwogICAgICAgICBQeV9zc2l6ZV90IGluZGV4ID0gUHlMb25nX0FzU3NpemVfdChpbmRleE9iamVjdCk7CiAgICAgICAgIGlmIChpbmRleCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTMyNzgsOCArMzI4Niw3IEBACiAgICAgICAgIHBvLT5pbmRpY2VzW2ldID0gaW5kZXg7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8cG8tPnI7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8cG8tPnI7IGkrKykgewogICAgICAgICBQeU9iamVjdCogaW5kZXhPYmplY3QgPSBQeVR1cGxlX0dFVF9JVEVNKGN5Y2xlcywgaSk7CiAgICAgICAgIFB5X3NzaXplX3QgaW5kZXggPSBQeUxvbmdfQXNTc2l6ZV90KGluZGV4T2JqZWN0KTsKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMzMyMCwxMSArMzMyNywxMSBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBlcm11dGF0aW9uc190eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJpdGVydG9vbHMucGVybXV0YXRpb25zIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICJpdGVydG9vbHMucGVybXV0YXRpb25zIiwgICAgICAgICAgIC8qIHRwX25hbWUgKi8KICAgICBzaXplb2YocGVybXV0YXRpb25zb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilwZXJtdXRhdGlvbnNfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAoZGVzdHJ1Y3RvcilwZXJtdXRhdGlvbnNfZGVhbGxvYywgICAvKiB0cF9kZWFsbG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwpAQCAtMzM0MSwxMyArMzM0OCwxMyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAgICBwZXJtdXRhdGlvbnNfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLCAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICBwZXJtdXRhdGlvbnNfZG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXBlcm11dGF0aW9uc190cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KLSAgICAoaXRlcm5leHRmdW5jKXBlcm11dGF0aW9uc19uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgKGl0ZXJuZXh0ZnVuYylwZXJtdXRhdGlvbnNfbmV4dCwgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBwZXJtdWF0aW9uc19tZXRob2RzLCAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwpAQCAtMzM1OCwxMSArMzM2NSwxMSBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICBwZXJtdXRhdGlvbnNfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLS8qIGFjY3VtdWxhdGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFjY3VtdWxhdGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMzQyOSw5ICszNDM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhY2N1bXVsYXRlX25leHQoYWNjdW11bGF0ZW9iamVjdCAqbHopCiB7Ci0gICAgUHlPYmplY3QgKnZhbCwgKm9sZHRvdGFsLCAqbmV3dG90YWw7CisgICAgUHlPYmplY3QgKnZhbCwgKm5ld3RvdGFsOwogCi0gICAgdmFsID0gUHlJdGVyX05leHQobHotPml0KTsKKyAgICB2YWwgPSAoKlB5X1RZUEUobHotPml0KS0+dHBfaXRlcm5leHQpKGx6LT5pdCk7CiAgICAgaWYgKHZhbCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMzQ0OSwxMSArMzQ1Niw4IEBACiAgICAgaWYgKG5ld3RvdGFsID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgb2xkdG90YWwgPSBsei0+dG90YWw7Ci0gICAgbHotPnRvdGFsID0gbmV3dG90YWw7Ci0gICAgUHlfREVDUkVGKG9sZHRvdGFsKTsKLQogICAgIFB5X0lOQ1JFRihuZXd0b3RhbCk7CisgICAgUHlfU0VUUkVGKGx6LT50b3RhbCwgbmV3dG90YWwpOwogICAgIHJldHVybiBuZXd0b3RhbDsKIH0KIApAQCAtMzQ4MCw3ICszNDg0LDcgQEAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShseiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPml0LCBsei0+Ymlub3A/bHotPmJpbm9wOlB5X05vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPnRvdGFsP2x6LT50b3RhbDpQeV9Ob25lKTsKLSB9Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhY2N1bXVsYXRlX3NldHN0YXRlKGFjY3VtdWxhdGVvYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCkBAIC0zNjQyLDcgKzM2NDYsNyBAQAogCiAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKHNlbGVjdG9yKTsKICAgICAgICAgUHlfREVDUkVGKHNlbGVjdG9yKTsKLSAgICAgICAgaWYgKG9rID09IDEpCisgICAgICAgIGlmIChvayA+IDApCiAgICAgICAgICAgICByZXR1cm4gZGF0dW07CiAgICAgICAgIFB5X0RFQ1JFRihkYXR1bSk7CiAgICAgICAgIGlmIChvayA8IDApCkBAIC0zNjU1LDcgKzM2NTksNyBAQAogewogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLAogICAgICAgICBsei0+ZGF0YSwgbHotPnNlbGVjdG9ycyk7Ci0gICAgfQorfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tcHJlc3NfbWV0aG9kc1tdID0gewogICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWNvbXByZXNzX3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKQEAgLTM2NzQsNDQgKzM2NzgsNDQgQEAKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAiaXRlcnRvb2xzLmNvbXByZXNzIiwgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgc2l6ZW9mKGNvbXByZXNzb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KICAgICAoZGVzdHJ1Y3Rvciljb21wcmVzc19kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVzZXJ2ZWQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVzZXJ2ZWQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCi0gICAgY29tcHJlc3NfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpY29tcHJlc3NfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgY29tcHJlc3NfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljb21wcmVzc190cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYyljb21wcmVzc19uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBjb21wcmVzc19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0gICAgY29tcHJlc3NfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgY29tcHJlc3NfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjb21wcmVzc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTM3OTIsOCArMzc5Niw3IEBACiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpnb29kOwotICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLCBOVUxMKTsKKyAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zODEyLDkgKzM4MTUsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbHRlcmZhbHNlX3JlZHVjZShmaWx0ZXJmYWxzZW9iamVjdCAqbHopCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksCi0gICAgICAgIGx6LT5mdW5jLCBsei0+aXQpOwotICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwgbHotPmZ1bmMsIGx6LT5pdCk7Cit9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmaWx0ZXJmYWxzZV9tZXRob2RzW10gPSB7CiAgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pZmlsdGVyZmFsc2VfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLApAQCAtMzgzNCw3ICszODM2LDcgQEAKICAgICBzaXplb2YoZmlsdGVyZmFsc2VvYmplY3QpLCAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilmaWx0ZXJmYWxzZV9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAoZGVzdHJ1Y3RvcilmaWx0ZXJmYWxzZV9kZWFsbG9jLCAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwpAQCAtMzg1Miw3ICszODU0LDcgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAogICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgZmlsdGVyZmFsc2VfZG9jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylmaWx0ZXJmYWxzZV90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpZmlsdGVyZmFsc2VfdHJhdmVyc2UsIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC00MDkxLDE1ICs0MDkzLDE1IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIGNvdW50X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpY291bnRfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYyljb3VudF90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYyljb3VudF9uZXh0LCAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBjb3VudF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBjb3VudF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KQEAgLTQyNjUsOSArNDI2Nyw3IEBACiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotLyogemlwbG9uZ2VzdCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiUHl0aG9uLmgiCisvKiB6aXBsb25nZXN0IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC00MzA2LDcgKzQzMDYsNyBAQAogICAgIGl0dHVwbGUgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOwogICAgIGlmIChpdHR1cGxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGZvciAoaT0wOyBpIDwgdHVwbGVzaXplOyArK2kpIHsKKyAgICBmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKICAgICAgICAgUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKICAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKQEAgLTQ0NDcsNiArNDQ0Nyw3IEBACiAgICAgICovCiAgICAgaW50IGk7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldyhQeVR1cGxlX0dFVF9TSVpFKGx6LT5pdHR1cGxlKSk7CisKICAgICBpZiAoYXJncyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmb3IgKGk9MDsgaTxQeVR1cGxlX0dFVF9TSVpFKGx6LT5pdHR1cGxlKTsgaSsrKSB7CkBAIC00NDk3LDcgKzQ0OTgsNyBAQAogICAgIHNpemVvZih6aXBsb25nZXN0b2JqZWN0KSwgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKXppcF9sb25nZXN0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChkZXN0cnVjdG9yKXppcF9sb25nZXN0X2RlYWxsb2MsICAgIC8qIHRwX2RlYWxsb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCkBAIC00NTE0LDggKzQ1MTUsOCBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CiAgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLSAgICB6aXBfbG9uZ2VzdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpemlwX2xvbmdlc3RfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgemlwX2xvbmdlc3RfZG9jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTQ1MzEsNyArNDUzMiw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIHppcF9sb25nZXN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgemlwX2xvbmdlc3RfbmV3LCAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCBlNGM5NTVlLi5iNmRjZGQwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtNDIsMTEgKzQyLDExIEBACiAjZGVmaW5lIFBST0dSQU1fT1BUUyBCQVNFX09QVFMKIAogLyogU2hvcnQgdXNhZ2UgbWVzc2FnZSAod2l0aCAlcyBmb3IgYXJndjApICovCi1zdGF0aWMgY2hhciAqdXNhZ2VfbGluZSA9CitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV9saW5lW10gPQogInVzYWdlOiAlbHMgW29wdGlvbl0gLi4uIFstYyBjbWQgfCAtbSBtb2QgfCBmaWxlIHwgLV0gW2FyZ10gLi4uXG4iOwogCiAvKiBMb25nIHVzYWdlIG1lc3NhZ2UsIHNwbGl0IGludG8gcGFydHMgPCA1MTIgYnl0ZXMgKi8KLXN0YXRpYyBjaGFyICp1c2FnZV8xID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzFbXSA9ICJcCiBPcHRpb25zIGFuZCBhcmd1bWVudHMgKGFuZCBjb3JyZXNwb25kaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyk6XG5cCiAtYiAgICAgOiBpc3N1ZSB3YXJuaW5ncyBhYm91dCBzdHIoYnl0ZXNfaW5zdGFuY2UpLCBzdHIoYnl0ZWFycmF5X2luc3RhbmNlKVxuXAogICAgICAgICAgYW5kIGNvbXBhcmluZyBieXRlcy9ieXRlYXJyYXkgd2l0aCBzdHIuICgtYmI6IGlzc3VlIGVycm9ycylcblwKQEAgLTU2LDcgKzU2LDcgQEAKIC1FICAgICA6IGlnbm9yZSBQWVRIT04qIGVudmlyb25tZW50IHZhcmlhYmxlcyAoc3VjaCBhcyBQWVRIT05QQVRIKVxuXAogLWggICAgIDogcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQgKGFsc28gLS1oZWxwKVxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV8yID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzJbXSA9ICJcCiAtaSAgICAgOiBpbnNwZWN0IGludGVyYWN0aXZlbHkgYWZ0ZXIgcnVubmluZyBzY3JpcHQ7IGZvcmNlcyBhIHByb21wdCBldmVuXG5cCiAgICAgICAgICBpZiBzdGRpbiBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB0ZXJtaW5hbDsgYWxzbyBQWVRIT05JTlNQRUNUPXhcblwKIC1JICAgICA6IGlzb2xhdGUgUHl0aG9uIGZyb20gdGhlIHVzZXIncyBlbnZpcm9ubWVudCAoaW1wbGllcyAtRSBhbmQgLXMpXG5cCkBAIC02Nyw3ICs2Nyw3IEBACiAtcyAgICAgOiBkb24ndCBhZGQgdXNlciBzaXRlIGRpcmVjdG9yeSB0byBzeXMucGF0aDsgYWxzbyBQWVRIT05OT1VTRVJTSVRFXG5cCiAtUyAgICAgOiBkb24ndCBpbXBseSAnaW1wb3J0IHNpdGUnIG9uIGluaXRpYWxpemF0aW9uXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzMgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfM1tdID0gIlwKIC11ICAgICA6IHVuYnVmZmVyZWQgYmluYXJ5IHN0ZG91dCBhbmQgc3RkZXJyLCBzdGRpbiBhbHdheXMgYnVmZmVyZWQ7XG5cCiAgICAgICAgICBhbHNvIFBZVEhPTlVOQlVGRkVSRUQ9eFxuXAogICAgICAgICAgc2VlIG1hbiBwYWdlIGZvciBkZXRhaWxzIG9uIGludGVybmFsIGJ1ZmZlcmluZyByZWxhdGluZyB0byAnLXUnXG5cCkBAIC03OSw3ICs3OSw3IEBACiAteCAgICAgOiBza2lwIGZpcnN0IGxpbmUgb2Ygc291cmNlLCBhbGxvd2luZyB1c2Ugb2Ygbm9uLVVuaXggZm9ybXMgb2YgIyFjbWRcblwKIC1YIG9wdCA6IHNldCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBvcHRpb25cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfNCA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV80W10gPSAiXAogZmlsZSAgIDogcHJvZ3JhbSByZWFkIGZyb20gc2NyaXB0IGZpbGVcblwKIC0gICAgICA6IHByb2dyYW0gcmVhZCBmcm9tIHN0ZGluIChkZWZhdWx0OyBpbnRlcmFjdGl2ZSBtb2RlIGlmIGEgdHR5KVxuXAogYXJnIC4uLjogYXJndW1lbnRzIHBhc3NlZCB0byBwcm9ncmFtIGluIHN5cy5hcmd2WzE6XVxuXG5cCkBAIC04OCwyMiArODgsMjMgQEAKIFBZVEhPTlBBVEggICA6ICclbGMnLXNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIHByZWZpeGVkIHRvIHRoZVxuXAogICAgICAgICAgICAgICAgZGVmYXVsdCBtb2R1bGUgc2VhcmNoIHBhdGguICBUaGUgcmVzdWx0IGlzIHN5cy5wYXRoLlxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV81ID0KK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzVbXSA9CiAiUFlUSE9OSE9NRSAgIDogYWx0ZXJuYXRlIDxwcmVmaXg+IGRpcmVjdG9yeSAob3IgPHByZWZpeD4lbGM8ZXhlY19wcmVmaXg+KS5cbiIKICIgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBtb2R1bGUgc2VhcmNoIHBhdGggdXNlcyAlcy5cbiIKICJQWVRIT05DQVNFT0sgOiBpZ25vcmUgY2FzZSBpbiAnaW1wb3J0JyBzdGF0ZW1lbnRzIChXaW5kb3dzKS5cbiIKICJQWVRIT05JT0VOQ09ESU5HOiBFbmNvZGluZ1s6ZXJyb3JzXSB1c2VkIGZvciBzdGRpbi9zdGRvdXQvc3RkZXJyLlxuIgotIlBZVEhPTkZBVUxUSEFORExFUjogZHVtcCB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMuXG5cCi0iOwotc3RhdGljIGNoYXIgKnVzYWdlXzYgPSAiXAotUFlUSE9OSEFTSFNFRUQ6IGlmIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvICdyYW5kb20nLCBhIHJhbmRvbSB2YWx1ZSBpcyB1c2VkXG5cCi0gICB0byBzZWVkIHRoZSBoYXNoZXMgb2Ygc3RyLCBieXRlcyBhbmQgZGF0ZXRpbWUgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlXG5cCi0gICBzZXQgdG8gYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzAsNDI5NDk2NzI5NV0gdG8gZ2V0IGhhc2ggdmFsdWVzIHdpdGggYVxuXAotICAgcHJlZGljdGFibGUgc2VlZC5cblwKLSI7CisiUFlUSE9ORkFVTFRIQU5ETEVSOiBkdW1wIHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycy5cbiI7CitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV82W10gPQorIlBZVEhPTkhBU0hTRUVEOiBpZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAncmFuZG9tJywgYSByYW5kb20gdmFsdWUgaXMgdXNlZFxuIgorIiAgIHRvIHNlZWQgdGhlIGhhc2hlcyBvZiBzdHIsIGJ5dGVzIGFuZCBkYXRldGltZSBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmVcbiIKKyIgICBzZXQgdG8gYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzAsNDI5NDk2NzI5NV0gdG8gZ2V0IGhhc2ggdmFsdWVzIHdpdGggYVxuIgorIiAgIHByZWRpY3RhYmxlIHNlZWQuXG4iCisiUFlUSE9OTUFMTE9DOiBzZXQgdGhlIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rc1xuIgorIiAgIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycy4gVXNlIFBZVEhPTk1BTExPQz1kZWJ1ZyB0byBpbnN0YWxsIGRlYnVnXG4iCisiICAgaG9va3MuXG4iOwogCiBzdGF0aWMgaW50Ci11c2FnZShpbnQgZXhpdGNvZGUsIHdjaGFyX3QqIHByb2dyYW0pCit1c2FnZShpbnQgZXhpdGNvZGUsIGNvbnN0IHdjaGFyX3QqIHByb2dyYW0pCiB7CiAgICAgRklMRSAqZiA9IGV4aXRjb2RlID8gc3RkZXJyIDogc3Rkb3V0OwogCkBAIC0zNDEsNiArMzQyLDcgQEAKICAgICBpbnQgaGVscCA9IDA7CiAgICAgaW50IHZlcnNpb24gPSAwOwogICAgIGludCBzYXdfdW5idWZmZXJlZF9mbGFnID0gMDsKKyAgICBjaGFyICpvcHQ7CiAgICAgUHlDb21waWxlckZsYWdzIGNmOwogICAgIFB5T2JqZWN0ICp3YXJuaW5nX29wdGlvbiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKndhcm5pbmdfb3B0aW9ucyA9IE5VTEw7CkBAIC0zNjUsNiArMzY3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBvcHQgPSBQeV9HRVRFTlYoIlBZVEhPTk1BTExPQyIpOworICAgIGlmIChfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKG9wdCkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJFcnJvciBpbiBQWVRIT05NQUxMT0M6IHVua25vd24gYWxsb2NhdG9yIFwiJXNcIiFcbiIsIG9wdCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCiAgICAgUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnID0gMTsKICAgICBfUHlSYW5kb21fSW5pdCgpOwogCkBAIC02NTQsNyArNjYzLDcgQEAKICAgICAgICAgICAgIFB5X1NldFByb2dyYW1OYW1lKHdidWYpOwogCiAgICAgICAgICAgICAvKiBEb24ndCBmcmVlIHdidWYsIHRoZSBhcmd1bWVudCB0byBQeV9TZXRQcm9ncmFtTmFtZQotICAgICAgICAgICAgICogbXVzdCByZW1haW4gdmFsaWQgdW50aWwgdGhlIFB5X0ZpbmFsaXplIGlzIGNhbGxlZC4KKyAgICAgICAgICAgICAqIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIFB5X0ZpbmFsaXplRXggaXMgY2FsbGVkLgogICAgICAgICAgICAgICovCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKQEAgLTc4NSw3ICs3OTQsMTEgQEAKICAgICAgICAgc3RzID0gUHlSdW5fQW55RmlsZUZsYWdzKHN0ZGluLCAiPHN0ZGluPiIsICZjZikgIT0gMDsKICAgICB9CiAKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIC8qIFZhbHVlIHVubGlrZWx5IHRvIGJlIGNvbmZ1c2VkIHdpdGggYSBub24tZXJyb3IgZXhpdCBzdGF0dXMgb3IKKyAgICAgICAgb3RoZXIgc3BlY2lhbCBtZWFuaW5nICovCisgICAgICAgIHN0cyA9IDEyMDsKKyAgICB9CiAKICNpZmRlZiBfX0lOU1VSRV9fCiAgICAgLyogSW5zdXJlKysgaXMgYSBtZW1vcnkgYW5hbHlzaXMgdG9vbCB0aGF0IGFpZHMgaW4gZGlzY292ZXJpbmcKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWF0aG1vZHVsZS5jIGIvTW9kdWxlcy9tYXRobW9kdWxlLmMKaW5kZXggYTZjZDE1YS4uN2JiY2Y1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tYXRobW9kdWxlLmMKQEAgLTg3NSw3ICs4NzUsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotbWF0aF8yKFB5T2JqZWN0ICphcmdzLCBkb3VibGUgKCpmdW5jKSAoZG91YmxlLCBkb3VibGUpLCBjaGFyICpmdW5jbmFtZSkKK21hdGhfMihQeU9iamVjdCAqYXJncywgZG91YmxlICgqZnVuYykgKGRvdWJsZSwgZG91YmxlKSwgY29uc3QgY2hhciAqZnVuY25hbWUpCiB7CiAgICAgUHlPYmplY3QgKm94LCAqb3k7CiAgICAgZG91YmxlIHgsIHksIHI7CkBAIC0xNjcyLDcgKzE2NzIsNyBAQAogICAgaW4gdGhhdCBpbnQgaXMgbGFyZ2VyIHRoYW4gUFlfU1NJWkVfVF9NQVguICovCiAKIHN0YXRpYyBQeU9iamVjdCoKLWxvZ2hlbHBlcihQeU9iamVjdCogYXJnLCBkb3VibGUgKCpmdW5jKShkb3VibGUpLCBjaGFyICpmdW5jbmFtZSkKK2xvZ2hlbHBlcihQeU9iamVjdCogYXJnLCBkb3VibGUgKCpmdW5jKShkb3VibGUpLCBjb25zdCBjaGFyICpmdW5jbmFtZSkKIHsKICAgICAvKiBJZiBpdCBpcyBpbnQsIGRvIGl0IG91cnNlbHZlcy4gKi8KICAgICBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvbW1hcG1vZHVsZS5jIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKaW5kZXggYmI5OGE5OS4uNTBjZWMyNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tbWFwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tbWFwbW9kdWxlLmMKQEAgLTM4OSw2ICszODksNyBAQAogICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlfYnVmZmVyIGRhdGE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAogICAgIENIRUNLX1ZBTElEKE5VTEwpOwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSo6d3JpdGUiLCAmZGF0YSkpCkBAIC00MDYsOSArNDA3LDkgQEAKICAgICB9CiAgICAgbWVtY3B5KHNlbGYtPmRhdGEgKyBzZWxmLT5wb3MsIGRhdGEuYnVmLCBkYXRhLmxlbik7CiAgICAgc2VsZi0+cG9zID0gc2VsZi0+cG9zICsgZGF0YS5sZW47CisgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Tc2l6ZV90KGRhdGEubGVuKTsKICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKZGlmZiAtLWdpdCBhL01vZHVsZXMvbmlzbW9kdWxlLmMgYi9Nb2R1bGVzL25pc21vZHVsZS5jCmluZGV4IDY0ZWI1ZGIuLmI2YTg1NWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbmlzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwpAQCAtNzYsMTEgKzc2LDcgQEAKIAogICAgICpwZml4ID0gMDsKICAgICBmb3IgKGk9MDsgYWxpYXNlc1tpXS5hbGlhcyAhPSAwTDsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLmFsaWFzLCBtYXApKSB7Ci0gICAgICAgICAgICAqcGZpeCA9IGFsaWFzZXNbaV0uZml4OwotICAgICAgICAgICAgcmV0dXJuIGFsaWFzZXNbaV0ubWFwOwotICAgICAgICB9Ci0gICAgICAgIGlmICghc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgeworICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSB8fCAhc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgewogICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKICAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYyBiL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKaW5kZXggNjQ3MWI4ZS4uZGVhZTA0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCkBAIC01Myw3ICs1Myw3IEBACiAvKiAgU3RyaW5nIGNvbnN0YW50cyB1c2VkIHRvIGluaXRpYWxpemUgbW9kdWxlIGF0dHJpYnV0ZXMuCiAgKgogICovCi1zdGF0aWMgY2hhciBwYXJzZXJfY29weXJpZ2h0X3N0cmluZ1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHBhcnNlcl9jb3B5cmlnaHRfc3RyaW5nW10gPQogIkNvcHlyaWdodCAxOTk1LTE5OTYgYnkgVmlyZ2luaWEgUG9seXRlY2huaWMgSW5zdGl0dXRlICYgU3RhdGVcblwKIFVuaXZlcnNpdHksIEJsYWNrc2J1cmcsIFZpcmdpbmlhLCBVU0EsIGFuZCBGcmVkIEwuIERyYWtlLCBKci4sIFJlc3RvbixcblwKIFZpcmdpbmlhLCBVU0EuICBQb3J0aW9ucyBjb3B5cmlnaHQgMTk5MS0xOTk1IGJ5IFN0aWNodGluZyBNYXRoZW1hdGlzY2hcblwKQEAgLTYzLDcgKzYzLDcgQEAKIFB5RG9jX1NUUlZBUihwYXJzZXJfZG9jX3N0cmluZywKICJUaGlzIGlzIGFuIGludGVyZmFjZSB0byBQeXRob24ncyBpbnRlcm5hbCBwYXJzZXIuIik7CiAKLXN0YXRpYyBjaGFyIHBhcnNlcl92ZXJzaW9uX3N0cmluZ1tdID0gIjAuNSI7CitzdGF0aWMgY29uc3QgY2hhciBwYXJzZXJfdmVyc2lvbl9zdHJpbmdbXSA9ICIwLjUiOwogCiAKIHR5cGVkZWYgUHlPYmplY3QqICgqU2VxTWFrZXIpIChQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC01NzgsMTMgKzU3OCwxMyBAQAogfQogCiAKLS8qICBlcnJfc3RyaW5nKGNoYXIqIG1lc3NhZ2UpCisvKiAgZXJyX3N0cmluZyhjb25zdCBjaGFyKiBtZXNzYWdlKQogICoKICAqICBTZXRzIHRoZSBlcnJvciBzdHJpbmcgZm9yIGFuIGV4Y2VwdGlvbiBvZiB0eXBlIFBhcnNlckVycm9yLgogICoKICAqLwogc3RhdGljIHZvaWQKLWVycl9zdHJpbmcoY2hhciAqbWVzc2FnZSkKK2Vycl9zdHJpbmcoY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKICAgICBQeUVycl9TZXRTdHJpbmcocGFyc2VyX2Vycm9yLCBtZXNzYWdlKTsKIH0KQEAgLTU5Nyw3ICs1OTcsNyBAQAogICoKICAqLwogc3RhdGljIFB5T2JqZWN0KgotcGFyc2VyX2RvX3BhcnNlKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNoYXIgKmFyZ3NwZWMsIGludCB0eXBlKQorcGFyc2VyX2RvX3BhcnNlKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3csIGNvbnN0IGNoYXIgKmFyZ3NwZWMsIGludCB0eXBlKQogewogICAgIGNoYXIqICAgICBzdHJpbmcgPSAwOwogICAgIFB5T2JqZWN0KiByZXMgICAgPSAwOwpAQCAtOTg0LDcgKzk4NCw3IEBACiAvKgogICogIFZhbGlkYXRpb24gcm91dGluZXMgdXNlZCB3aXRoaW4gdGhlIHZhbGlkYXRpb24gc2VjdGlvbjoKICAqLwotc3RhdGljIGludCB2YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNoYXIgKnN0cmluZyk7CitzdGF0aWMgaW50IHZhbGlkYXRlX3Rlcm1pbmFsKG5vZGUgKnRlcm1pbmFsLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqc3RyaW5nKTsKIAogI2RlZmluZSB2YWxpZGF0ZV9hbXBlcnNhbmQoY2gpICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICBBTVBFUiwgIiYiKQogI2RlZmluZSB2YWxpZGF0ZV9jaXJjdW1mbGV4KGNoKSB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgQ0lSQ1VNRkxFWCwgIl4iKQpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKIAogCiBzdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXJtaW5hbChub2RlICp0ZXJtaW5hbCwgaW50IHR5cGUsIGNoYXIgKnN0cmluZykKK3ZhbGlkYXRlX3Rlcm1pbmFsKG5vZGUgKnRlcm1pbmFsLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqc3RyaW5nKQogewogICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodGVybWluYWwsIHR5cGUpCiAgICAgICAgICAgICAgICAmJiAoKHN0cmluZyA9PSAwKSB8fCAoc3RyY21wKHN0cmluZywgU1RSKHRlcm1pbmFsKSkgPT0gMCkpKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCBjOTU2NjhiLi5hODdiYmJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC02NjksMjEgKzY2OSwyMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLV9mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCwgY29uc3QgY2hhciAqYWxsb3dlZCkKK19mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCkKIHsKICAgICBpbnQgb3ZlcmZsb3c7CiAgICAgbG9uZyBsb25nX3ZhbHVlOwogCiAgICAgUHlPYmplY3QgKmluZGV4ID0gUHlOdW1iZXJfSW5kZXgobyk7CiAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgJXMsIG5vdCAlLjIwMHMiLAotICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCwgUHlfVFlQRShvKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIGFzc2VydChQeUxvbmdfQ2hlY2soaW5kZXgpKTsKICAgICBsb25nX3ZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KGluZGV4LCAmb3ZlcmZsb3cpOwogICAgIFB5X0RFQ1JFRihpbmRleCk7CisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICBpZiAob3ZlcmZsb3cgPiAwIHx8IGxvbmdfdmFsdWUgPiBJTlRfTUFYKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImZkIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CkBAIC03MDYsNyArNzA1LDE1IEBACiAgICAgICAgICooaW50ICopcCA9IERFRkFVTFRfRElSX0ZEOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgcmV0dXJuIF9mZF9jb252ZXJ0ZXIobywgKGludCAqKXAsICJpbnRlZ2VyIik7CisgICAgZWxzZSBpZiAoUHlJbmRleF9DaGVjayhvKSkgeworICAgICAgICByZXR1cm4gX2ZkX2NvbnZlcnRlcihvLCAoaW50ICopcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogCkBAIC04MTYsOSArODIzLDEwIEBACiB9CiAKIHN0YXRpYyBpbnQKLXBhdGhfY29udmVydGVyKFB5T2JqZWN0ICpvLCB2b2lkICpwKSB7CitwYXRoX2NvbnZlcnRlcihQeU9iamVjdCAqbywgdm9pZCAqcCkKK3sKICAgICBwYXRoX3QgKnBhdGggPSAocGF0aF90ICopcDsKLSAgICBQeU9iamVjdCAqdW5pY29kZSwgKmJ5dGVzOworICAgIFB5T2JqZWN0ICpieXRlczsKICAgICBQeV9zc2l6ZV90IGxlbmd0aDsKICAgICBjaGFyICpuYXJyb3c7CiAKQEAgLTgzNywxMiArODQ1LDcgQEAKICAgICAvKiBlbnN1cmUgaXQncyBhbHdheXMgc2FmZSB0byBjYWxsIHBhdGhfY2xlYW51cCgpICovCiAgICAgcGF0aC0+Y2xlYW51cCA9IE5VTEw7CiAKLSAgICBpZiAobyA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIGlmICghcGF0aC0+bnVsbGFibGUpIHsKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc3BlY2lmeSBOb25lIGZvciAlcyBhcmd1bWVudCIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICBpZiAoKG8gPT0gUHlfTm9uZSkgJiYgcGF0aC0+bnVsbGFibGUpIHsKICAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7CiAgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7CiAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7CkBAIC04NTEsMjQgKzg1NCwyMCBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICB1bmljb2RlID0gUHlVbmljb2RlX0Zyb21PYmplY3Qobyk7Ci0gICAgaWYgKHVuaWNvZGUpIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG8pKSB7CiAjaWZkZWYgTVNfV0lORE9XUwogICAgICAgICB3Y2hhcl90ICp3aWRlOwogCi0gICAgICAgIHdpZGUgPSBQeVVuaWNvZGVfQXNVbmljb2RlQW5kU2l6ZSh1bmljb2RlLCAmbGVuZ3RoKTsKKyAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVBbmRTaXplKG8sICZsZW5ndGgpOwogICAgICAgICBpZiAoIXdpZGUpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChsZW5ndGggPiAzMjc2NykgewogICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19WYWx1ZUVycm9yLCAiJXMgdG9vIGxvbmcgZm9yIFdpbmRvd3MiKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIGlmICh3Y3NsZW4od2lkZSkgIT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOworICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19WYWx1ZUVycm9yLCAiZW1iZWRkZWQgbnVsbCBjaGFyYWN0ZXIgaW4gJXMiKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKQEAgLTg3Nyw1MiArODc2LDQ3IEBACiAgICAgICAgIHBhdGgtPmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgcGF0aC0+b2JqZWN0ID0gbzsKICAgICAgICAgcGF0aC0+ZmQgPSAtMTsKLSAgICAgICAgcGF0aC0+Y2xlYW51cCA9IHVuaWNvZGU7Ci0gICAgICAgIHJldHVybiBQeV9DTEVBTlVQX1NVUFBPUlRFRDsKKyAgICAgICAgcmV0dXJuIDE7CiAjZWxzZQotICAgICAgICBpbnQgY29udmVydGVkID0gUHlVbmljb2RlX0ZTQ29udmVydGVyKHVuaWNvZGUsICZieXRlcyk7Ci0gICAgICAgIFB5X0RFQ1JFRih1bmljb2RlKTsKLSAgICAgICAgaWYgKCFjb252ZXJ0ZWQpCi0gICAgICAgICAgICBieXRlcyA9IE5VTEw7CisgICAgICAgIGlmICghUHlVbmljb2RlX0ZTQ29udmVydGVyKG8sICZieXRlcykpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAjZW5kaWYKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcihvKSkKLSAgICAgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tT2JqZWN0KG8pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBieXRlcyA9IE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIobykpIHsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGlmICh3aW4zMl93YXJuX2J5dGVzX2FwaSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tT2JqZWN0KG8pOwogICAgICAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgaWYgKHBhdGgtPmFsbG93X2ZkKSB7Ci0gICAgICAgICAgICAgICAgaW50IGZkOwotICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSBfZmRfY29udmVydGVyKG8sICZmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIiKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPndpZGUgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5uYXJyb3cgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5vYmplY3QgPSBvOwotICAgICAgICAgICAgICAgICAgICBwYXRoLT5mZCA9IGZkOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKCFieXRlcykgewotICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1R5cGVFcnJvciwgImlsbGVnYWwgdHlwZSBmb3IgJXMgcGFyYW1ldGVyIik7CisgICAgZWxzZSBpZiAocGF0aC0+YWxsb3dfZmQgJiYgUHlJbmRleF9DaGVjayhvKSkgeworICAgICAgICBpZiAoIV9mZF9jb252ZXJ0ZXIobywgJnBhdGgtPmZkKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7CisgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7CisgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7CisgICAgICAgIHBhdGgtPm9iamVjdCA9IG87CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzJXMlcyBzaG91bGQgYmUgJXMsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/IHBhdGgtPmZ1bmN0aW9uX25hbWUgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmZ1bmN0aW9uX25hbWUgPyAiOiAiICAgICAgICAgICAgICAgIDogIiIsCisgICAgICAgICAgICBwYXRoLT5hcmd1bWVudF9uYW1lID8gcGF0aC0+YXJndW1lbnRfbmFtZSA6ICJwYXRoIiwKKyAgICAgICAgICAgIHBhdGgtPmFsbG93X2ZkICYmIHBhdGgtPm51bGxhYmxlID8gInN0cmluZywgYnl0ZXMsIGludGVnZXIgb3IgTm9uZSIgOgorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgPyAic3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyIiA6CisgICAgICAgICAgICBwYXRoLT5udWxsYWJsZSA/ICJzdHJpbmcsIGJ5dGVzIG9yIE5vbmUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciBieXRlcyIsCisgICAgICAgICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0jaWZkZWYgTVNfV0lORE9XUwotICAgIGlmICh3aW4zMl93YXJuX2J5dGVzX2FwaSgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihieXRlcyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSNlbmRpZgotCiAgICAgbGVuZ3RoID0gUHlCeXRlc19HRVRfU0laRShieXRlcyk7CiAjaWZkZWYgTVNfV0lORE9XUwogICAgIGlmIChsZW5ndGggPiBNQVhfUEFUSC0xKSB7CkBAIC05NDksNyArOTQzLDggQEAKIH0KIAogc3RhdGljIHZvaWQKLWFyZ3VtZW50X3VuYXZhaWxhYmxlX2Vycm9yKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNoYXIgKmFyZ3VtZW50X25hbWUpIHsKK2FyZ3VtZW50X3VuYXZhaWxhYmxlX2Vycm9yKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGNvbnN0IGNoYXIgKmFyZ3VtZW50X25hbWUpCit7CiAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCiAgICAgICAgICIlcyVzJXMgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIsCiAgICAgICAgIChmdW5jdGlvbl9uYW1lICE9IE5VTEwpID8gZnVuY3Rpb25fbmFtZSA6ICIiLApAQCAtOTcyLDcgKzk2Nyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX3NwZWNpZmllZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQpIHsKK2ZkX3NwZWNpZmllZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQpCit7CiAgICAgaWYgKGZkID09IC0xKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtOTgxLDcgKzk3Nyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGZvbGxvd19zeW1saW5rcykgeworZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmIChmb2xsb3dfc3ltbGlua3MpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC05OTAsNyArOTg3LDggQEAKIH0KIAogc3RhdGljIGludAotcGF0aF9hbmRfZGlyX2ZkX2ludmFsaWQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLCBpbnQgZGlyX2ZkKSB7CitwYXRoX2FuZF9kaXJfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsIGludCBkaXJfZmQpCit7CiAgICAgaWYgKCFwYXRoLT5uYXJyb3cgJiYgIXBhdGgtPndpZGUgJiYgKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgZGlyX2ZkIHdpdGhvdXQgbWF0Y2hpbmcgcGF0aCIsCkBAIC0xMDAxLDcgKzk5OSw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpcl9mZF9hbmRfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpIHsKK2Rpcl9mZF9hbmRfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpCit7CiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpICYmIChmZCAhPSAtMSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgYm90aCBkaXJfZmQgYW5kIGZkIiwKQEAgLTEwMTIsOCArMTAxMSw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykgeworZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmICgoZmQgPiAwKSAmJiAoIWZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCB1c2UgZmQgYW5kIGZvbGxvd19zeW1saW5rcyB0b2dldGhlciIsCkBAIC0xMDI0LDggKzEwMjQsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kaXJfZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2Rpcl9mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkgJiYgKCFmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgdXNlIGRpcl9mZCBhbmQgZm9sbG93X3N5bWxpbmtzIHRvZ2V0aGVyIiwKQEAgLTEyMjAsNyArMTIyMSw3IEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiBzdGF0aWMgUHlPYmplY3QgKgotd2luMzJfZXJyb3IoY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQord2luMzJfZXJyb3IoY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQogewogICAgIC8qIFhYWCBXZSBzaG91bGQgcGFzcyB0aGUgZnVuY3Rpb24gbmFtZSBhbG9uZyBpbiB0aGUgZnV0dXJlLgogICAgICAgICh3aW5yZWcuYyBhbHNvIHdhbnRzIHRvIHBhc3MgdGhlIGZ1bmN0aW9uIG5hbWUuKQpAQCAtMTIzNSw3ICsxMjM2LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbjMyX2Vycm9yX29iamVjdChjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGZpbGVuYW1lKQord2luMzJfZXJyb3Jfb2JqZWN0KGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogZmlsZW5hbWUpCiB7CiAgICAgLyogWFhYIC0gc2VlIHdpbjMyX2Vycm9yIGZvciBjb21tZW50cyBvbiAnZnVuY3Rpb24nICovCiAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTE0NTYsNyArMTQ1Nyw3IEBACiAgICAgaWYoIWJ1Zl9zaXplKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgYnVmX3NpemUrMSk7CisgICAgYnVmID0gKHdjaGFyX3QgKilQeU1lbV9SYXdNYWxsb2MoKGJ1Zl9zaXplICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogICAgIGlmICghYnVmKSB7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9PVVRPRk1FTU9SWSk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE0NjYsMTIgKzE0NjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfc2l6ZSwgVk9MVU1FX05BTUVfRE9TKTsKIAogICAgIGlmKCFyZXN1bHRfbGVuZ3RoKSB7Ci0gICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgUHlNZW1fUmF3RnJlZShidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaWYoIUNsb3NlSGFuZGxlKGhkbCkpIHsKLSAgICAgICAgUHlNZW1fRnJlZShidWYpOworICAgICAgICBQeU1lbV9SYXdGcmVlKGJ1Zik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTE1NTYsNyArMTU1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTE2NDYsNyArMTY0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTIxMDAsNyArMjEwMSw3IEBACiAKIAogc3RhdGljIFB5T2JqZWN0ICoKLXBvc2l4X2RvX3N0YXQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLAorcG9zaXhfZG9fc3RhdChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsCiAgICAgICAgICAgICAgIGludCBkaXJfZmQsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAgICAgU1RSVUNUX1NUQVQgc3Q7CkBAIC0zMzEzLDEyICszMzE0LDIyIEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIGRvIHsKICAgICAgICAgYnVmbGVuICs9IGNodW5rOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIHRtcGJ1ZiA9IFB5TWVtX1Jhd1JlYWxsb2MoYnVmLCBidWZsZW4pOwogICAgICAgICBpZiAodG1wYnVmID09IE5VTEwpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBidWYgPSB0bXBidWY7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCAoaW50KWJ1Zmxlbik7CisjZWxzZQogICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCBidWZsZW4pOworI2VuZGlmCiAgICAgfSB3aGlsZSAoY3dkID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCkBAIC0zNDYwLDEwICszNDcxLDggQEAKICAgICBCT09MIHJlc3VsdDsKICAgICBXSU4zMl9GSU5EX0RBVEEgRmlsZURhdGE7CiAgICAgY2hhciBuYW1lYnVmW01BWF9QQVRIKzRdOyAvKiBPdmVyYWxsb2NhdGUgZm9yICJcKi4qIiAqLwotICAgIGNoYXIgKmJ1ZnB0ciA9IG5hbWVidWY7CiAgICAgLyogb25seSBjbGFpbSB0byBoYXZlIHNwYWNlIGZvciBNQVhfUEFUSCAqLwogICAgIFB5X3NzaXplX3QgbGVuID0gUHlfQVJSQVlfTEVOR1RIKG5hbWVidWYpLTQ7Ci0gICAgUHlPYmplY3QgKnBvID0gTlVMTDsKICAgICB3Y2hhcl90ICp3bmFtZWJ1ZiA9IE5VTEw7CiAKICAgICBpZiAoIXBhdGgtPm5hcnJvdykgewpAQCAtNDU2Myw3ICs0NTcyLDcgQEAKICNpZiBkZWZpbmVkKEhBVkVfRlVUSU1FU0FUKSB8fCBkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKQogCiBzdGF0aWMgaW50Ci11dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCit1dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAjaWZkZWYgSEFWRV9VVElNRU5TQVQKICAgICBpbnQgZmxhZ3MgPSBmb2xsb3dfc3ltbGlua3MgPyAwIDogQVRfU1lNTElOS19OT0ZPTExPVzsKQEAgLTQ2MDUsMTQgKzQ2MTQsMTQgQEAKICAgICAjZGVmaW5lIFBBVEhfVVRJTUVfSEFWRV9GRCAwCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9VVElNRU5TQVQpIHx8IGRlZmluZWQoSEFWRV9MVVRJTUVTKQorIyAgZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNlbmRpZgogCi0jZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MgXAotICAgICAgICAoZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpKQotCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKIAogc3RhdGljIGludAotdXRpbWVfbm9mb2xsb3dfc3ltbGlua3ModXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDYyOCw3ICs0NjM3LDcgQEAKICNpZm5kZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgaW50Ci11dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjaGFyICpwYXRoKQordXRpbWVfZGVmYXVsdCh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDc3MSw3ICs0NzgwLDcgQEAKICAgICAgICAgdXRpbWUubm93ID0gMTsKICAgICB9CiAKLSNpZiAhVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmICFkZWZpbmVkKFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MpCiAgICAgaWYgKGZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoInV0aW1lIiwgZm9sbG93X3N5bWxpbmtzKSkKICAgICAgICAgZ290byBleGl0OwogI2VuZGlmCkBAIC00ODI1LDcgKzQ4MzQsNyBAQAogI2Vsc2UgLyogTVNfV0lORE9XUyAqLwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAotI2lmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNpZmRlZiBVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCiAgICAgaWYgKCghZm9sbG93X3N5bWxpbmtzKSAmJiAoZGlyX2ZkID09IERFRkFVTFRfRElSX0ZEKSkKICAgICAgICAgcmVzdWx0ID0gdXRpbWVfbm9mb2xsb3dfc3ltbGlua3MoJnV0aW1lLCBwYXRoLT5uYXJyb3cpOwogICAgIGVsc2UKQEAgLTU3NTYsMTQgKzU3NjUsMTQgQEAKICAgICBwaWQ6IHBpZF90CiAgICAgLwogCi1SZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkLgorUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS4KIAogVGhlIGFmZmluaXR5IGlzIHJldHVybmVkIGFzIGEgc2V0IG9mIENQVSBpZGVudGlmaWVycy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX3NjaGVkX2dldGFmZmluaXR5X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgcGlkX3QgcGlkKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI0MzFhOGYzMTBlMzY5ZTcgaW5wdXQ9ZWFmMTYxOTM2ODc0YjhhMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI0MzFhOGYzMTBlMzY5ZTcgaW5wdXQ9OTgzY2U3Y2I0YTU2NTk4MF0qLwogewogICAgIGludCBjcHUsIG5jcHVzLCBjb3VudDsKICAgICBzaXplX3Qgc2V0c2l6ZTsKQEAgLTczMjUsNyArNzMzNCw3IEBACiAKIC8qIFJldHVybiBUcnVlIGlmIHRoZSBwYXRoIGF0IHNyYyByZWxhdGl2ZSB0byBkZXN0IGlzIGEgZGlyZWN0b3J5ICovCiBzdGF0aWMgaW50Ci1fY2hlY2tfZGlyQShjaGFyICpzcmMsIGNoYXIgKmRlc3QpCitfY2hlY2tfZGlyQShjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRlc3QpCiB7CiAgICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBzcmNfaW5mbzsKICAgICBjaGFyIGRlc3RfcGFyZW50W01BWF9QQVRIXTsKQEAgLTk0ODEsOCArOTQ5MCw4IEBACiAgKiBzdWZmaWNpZW50bHkgcGVydmFzaXZlIHRoYXQgaXQncyBub3Qgd29ydGggdGhlIGxvc3Mgb2YgcmVhZGFiaWxpdHkuCiAgKi8KIHN0cnVjdCBjb25zdGRlZiB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBsb25nIHZhbHVlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHZhbHVlOwogfTsKIAogc3RhdGljIGludApAQCAtOTQ5MCw3ICs5NDk5LDEwIEBACiAgICAgICAgICAgICAgIHNpemVfdCB0YWJsZXNpemUpCiB7CiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0gICAgICAgICp2YWx1ZXAgPSBQeUxvbmdfQVNfTE9ORyhhcmcpOworICAgICAgICBpbnQgdmFsdWUgPSBfUHlMb25nX0FzSW50KGFyZyk7CisgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGVsc2UgewpAQCAtMTA4MjEsNyArMTA4MzMsNyBAQAogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKICAgICAgICAgc3NpemVfdCByZXN1bHQ7Ci0gICAgICAgIHN0YXRpYyBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0gezEyOCwgWEFUVFJfU0laRV9NQVgsIDB9OworICAgICAgICBzdGF0aWMgY29uc3QgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsxMjgsIFhBVFRSX1NJWkVfTUFYLCAwfTsKICAgICAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplc1tpXTsKICAgICAgICAgaWYgKCFidWZmZXJfc2l6ZSkgewogICAgICAgICAgICAgcGF0aF9lcnJvcihwYXRoKTsKQEAgLTEwOTg3LDcgKzEwOTk5LDcgQEAKICAgICBmb3IgKGkgPSAwOyA7IGkrKykgewogICAgICAgICBjaGFyICpzdGFydCwgKnRyYWNlLCAqZW5kOwogICAgICAgICBzc2l6ZV90IGxlbmd0aDsKLSAgICAgICAgc3RhdGljIFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7IDI1NiwgWEFUVFJfTElTVF9NQVgsIDAgfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7IDI1NiwgWEFUVFJfTElTVF9NQVgsIDAgfTsKICAgICAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplc1tpXTsKICAgICAgICAgaWYgKCFidWZmZXJfc2l6ZSkgewogICAgICAgICAgICAgLyogRVJBTkdFICovCkBAIC0xMTE5OSwxMSArMTEyMTEsMTUgQEAKIG9zLmNwdV9jb3VudAogCiBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW07IHJldHVybiBOb25lIGlmIGluZGV0ZXJtaW5hYmxlLgorCitUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW4KK3VzZS4gIFRoZSBudW1iZXIgb2YgdXNhYmxlIENQVXMgY2FuIGJlIG9idGFpbmVkIHdpdGgKK2BgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvc19jcHVfY291bnRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM1OWVlN2Y2YmNlODMyYjggaW5wdXQ9ZDU1ZTJmOGYzODIzYTYyOF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM1OWVlN2Y2YmNlODMyYjggaW5wdXQ9ZTdjOGY0YmE2ZGJiYWRkM10qLwogewogICAgIGludCBuY3B1ID0gMDsKICNpZmRlZiBNU19XSU5ET1dTCkBAIC0xMTgzMCw3ICsxMTg0Niw3IEBACiAjZWxzZSAvKiBQT1NJWCAqLwogCiBzdGF0aWMgY2hhciAqCi1qb2luX3BhdGhfZmlsZW5hbWUoY2hhciAqcGF0aF9uYXJyb3csIGNoYXIqIGZpbGVuYW1lLCBQeV9zc2l6ZV90IGZpbGVuYW1lX2xlbikKK2pvaW5fcGF0aF9maWxlbmFtZShjb25zdCBjaGFyICpwYXRoX25hcnJvdywgY29uc3QgY2hhciogZmlsZW5hbWUsIFB5X3NzaXplX3QgZmlsZW5hbWVfbGVuKQogewogICAgIFB5X3NzaXplX3QgcGF0aF9sZW47CiAgICAgUHlfc3NpemVfdCBzaXplOwpAQCAtMTE4NjIsNyArMTE4NzgsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotRGlyRW50cnlfZnJvbV9wb3NpeF9pbmZvKHBhdGhfdCAqcGF0aCwgY2hhciAqbmFtZSwgUHlfc3NpemVfdCBuYW1lX2xlbiwKK0RpckVudHJ5X2Zyb21fcG9zaXhfaW5mbyhwYXRoX3QgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbmFtZV9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5vX3QgZF9pbm8KICNpZmRlZiBIQVZFX0RJUkVOVF9EX1RZUEUKICAgICAgICAgICAgICAgICAgICAgICAgICAsIHVuc2lnbmVkIGNoYXIgZF90eXBlCkBAIC0xMTkyNSw4ICsxMTk0MSwxNCBAQAogCiAjaWZkZWYgTVNfV0lORE9XUwogCitzdGF0aWMgaW50CitTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgcmV0dXJuIGl0ZXJhdG9yLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKIHN0YXRpYyB2b2lkCi1TY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQogewogICAgIEhBTkRMRSBoYW5kbGUgPSBpdGVyYXRvci0+aGFuZGxlOwogCkBAIC0xMTk0Niw3ICsxMTk2OCw3IEBACiAgICAgQk9PTCBzdWNjZXNzOwogICAgIFB5T2JqZWN0ICplbnRyeTsKIAotICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlICovCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UsIG9yIGNsb3NlZCBleHBsaWNpdGx5ICovCiAgICAgaWYgKGl0ZXJhdG9yLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xMTk3NywxNCArMTE5OTksMjAgQEAKICAgICB9CiAKICAgICAvKiBFcnJvciBvciBubyBtb3JlIGZpbGVzICovCi0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOwogICAgIHJldHVybiBOVUxMOwogfQogCiAjZWxzZSAvKiBQT1NJWCAqLwogCitzdGF0aWMgaW50CitTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgcmV0dXJuICFpdGVyYXRvci0+ZGlycDsKK30KKwogc3RhdGljIHZvaWQKLVNjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQorU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCiB7CiAgICAgRElSICpkaXJwID0gaXRlcmF0b3ItPmRpcnA7CiAKQEAgLTEyMDA2LDcgKzEyMDM0LDcgQEAKICAgICBpbnQgaXNfZG90OwogICAgIFB5T2JqZWN0ICplbnRyeTsKIAotICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlICovCisgICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UsIG9yIGNsb3NlZCBleHBsaWNpdGx5ICovCiAgICAgaWYgKCFpdGVyYXRvci0+ZGlycCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTEyMDQzLDIxICsxMjA3MSw3NiBAQAogICAgIH0KIAogICAgIC8qIEVycm9yIG9yIG5vIG1vcmUgZmlsZXMgKi8KLSAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihpdGVyYXRvcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbmRpZgogCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKFNjYW5kaXJJdGVyYXRvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKHNlbGYpOworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2VudGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitTY2FuZGlySXRlcmF0b3JfZXhpdChTY2FuZGlySXRlcmF0b3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihzZWxmKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIHZvaWQKK1NjYW5kaXJJdGVyYXRvcl9maW5hbGl6ZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworCisgICAgaWYgKCFTY2FuZGlySXRlcmF0b3JfaXNfY2xvc2VkKGl0ZXJhdG9yKSkgeworICAgICAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOworCisgICAgICAgIGlmIChQeUVycl9SZXNvdXJjZVdhcm5pbmcoKFB5T2JqZWN0ICopaXRlcmF0b3IsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuY2xvc2VkIHNjYW5kaXIgaXRlcmF0b3IgJVIiLCBpdGVyYXRvcikpIHsKKyAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgaXRlcmF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUHlfQ0xFQVIoaXRlcmF0b3ItPnBhdGgub2JqZWN0KTsKKyAgICBwYXRoX2NsZWFudXAoJml0ZXJhdG9yLT5wYXRoKTsKKworICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworfQorCiBzdGF0aWMgdm9pZAogU2NhbmRpckl0ZXJhdG9yX2RlYWxsb2MoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKIHsKLSAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOwotICAgIFB5X1hERUNSRUYoaXRlcmF0b3ItPnBhdGgub2JqZWN0KTsKLSAgICBwYXRoX2NsZWFudXAoJml0ZXJhdG9yLT5wYXRoKTsKKyAgICBpZiAoUHlPYmplY3RfQ2FsbEZpbmFsaXplckZyb21EZWFsbG9jKChQeU9iamVjdCAqKWl0ZXJhdG9yKSA8IDApCisgICAgICAgIHJldHVybjsKKwogICAgIFB5X1RZUEUoaXRlcmF0b3IpLT50cF9mcmVlKChQeU9iamVjdCAqKWl0ZXJhdG9yKTsKIH0KIAorc3RhdGljIFB5TWV0aG9kRGVmIFNjYW5kaXJJdGVyYXRvcl9tZXRob2RzW10gPSB7CisgICAgeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pU2NhbmRpckl0ZXJhdG9yX2VudGVyLCBNRVRIX05PQVJHU30sCisgICAgeyJfX2V4aXRfXyIsIChQeUNGdW5jdGlvbilTY2FuZGlySXRlcmF0b3JfZXhpdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNsb3NlIiwgKFB5Q0Z1bmN0aW9uKVNjYW5kaXJJdGVyYXRvcl9jbG9zZSwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMfQorfTsKKwogc3RhdGljIFB5VHlwZU9iamVjdCBTY2FuZGlySXRlcmF0b3JUeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgIE1PRE5BTUUgIi5TY2FuZGlySXRlcmF0b3IiLCAgICAgICAgICAgICAvKiB0cF9uYW1lICovCkBAIC0xMjA3OSw3ICsxMjE2Miw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVAorICAgICAgICB8IFB5X1RQRkxBR1NfSEFWRV9GSU5BTElaRSwgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTEyMDg3LDYgKzEyMTcxLDI3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAoaXRlcm5leHRmdW5jKVNjYW5kaXJJdGVyYXRvcl9pdGVybmV4dCwgLyogdHBfaXRlcm5leHQgKi8KKyAgICBTY2FuZGlySXRlcmF0b3JfbWV0aG9kcywgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCisgICAgKGRlc3RydWN0b3IpU2NhbmRpckl0ZXJhdG9yX2ZpbmFsaXplLCAgIC8qIHRwX2ZpbmFsaXplICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTIzODAsNyArMTI0ODUsNiBAQAogICAgIEhBTkRMRSB0b2s7CiAgICAgVE9LRU5fUFJJVklMRUdFUyB0b2tfcHJpdjsKICAgICBMVUlEIGx1aWQ7Ci0gICAgaW50IG1ldGhfaWR4ID0gMDsKIAogICAgIGlmICghT3BlblByb2Nlc3NUb2tlbihHZXRDdXJyZW50UHJvY2VzcygpLCBUT0tFTl9BTExfQUNDRVNTLCAmdG9rKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMjgyNCw3ICsxMjkyOCw3IEBACiB9OwogCiAKLXN0YXRpYyBjaGFyICpoYXZlX2Z1bmN0aW9uc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoYXZlX2Z1bmN0aW9uc1tdID0gewogCiAjaWZkZWYgSEFWRV9GQUNDRVNTQVQKICAgICAiSEFWRV9GQUNDRVNTQVQiLApAQCAtMTI5NTksNyArMTMwNjMsNyBAQAogewogICAgIFB5T2JqZWN0ICptLCAqdjsKICAgICBQeU9iamVjdCAqbGlzdDsKLSAgICBjaGFyICoqdHJhY2U7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICp0cmFjZTsKIAogI2lmIGRlZmluZWQoSEFWRV9TWU1MSU5LKSAmJiBkZWZpbmVkKE1TX1dJTkRPV1MpCiAgICAgd2luMzJfY2FuX3N5bWxpbmsgPSBlbmFibGVfc3ltbGluaygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCA5YTZkYTczLi4yZGFmYmIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogZmFsc2Ugb24gYW4gZXhjZXB0aW9uLgogICovCiBzdGF0aWMgaW50Ci1zZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCitzZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotY2FsbF93aXRoX2ZyYW1lKGNoYXIgKmZ1bmNuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCogZnVuYywgUHlPYmplY3QqIGFyZ3MsCitjYWxsX3dpdGhfZnJhbWUoY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0KiBmdW5jLCBQeU9iamVjdCogYXJncywKICAgICAgICAgICAgICAgICB4bWxwYXJzZW9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcmVzOwpAQCAtNzQ3LDcgKzc0Nyw4IEBACiAgICAgICAgIHMgKz0gTUFYX0NIVU5LX1NJWkU7CiAgICAgICAgIHNsZW4gLT0gTUFYX0NIVU5LX1NJWkU7CiAgICAgfQotICAgIGFzc2VydChNQVhfQ0hVTktfU0laRSA8IElOVF9NQVggJiYgc2xlbiA8IElOVF9NQVgpOworICAgIFB5X0JVSUxEX0FTU0VSVChNQVhfQ0hVTktfU0laRSA8PSBJTlRfTUFYKTsKKyAgICBhc3NlcnQoc2xlbiA8PSBJTlRfTUFYKTsKICAgICByYyA9IFhNTF9QYXJzZShzZWxmLT5pdHNlbGYsIHMsIChpbnQpc2xlbiwgaXNmaW5hbCk7CiAKIGRvbmU6CkBAIC03NjUsNyArNzY2LDcgQEAKIHsKICAgICBQeU9iamVjdCAqc3RyOwogICAgIFB5X3NzaXplX3QgbGVuOwotICAgIGNoYXIgKnB0cjsKKyAgICBjb25zdCBjaGFyICpwdHI7CiAKICAgICBzdHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIm4iLCBidWZfc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQpAQCAtMTIyNSwxMiArMTIyNiw4IEBACiAgICAgc2VsZi0+aXRzZWxmID0gTlVMTDsKIAogICAgIGlmIChzZWxmLT5oYW5kbGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wOwotICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+aGFuZGxlcnNbaV0pOwogICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmhhbmRsZXJzKTsKICAgICAgICAgc2VsZi0+aGFuZGxlcnMgPSBOVUxMOwogICAgIH0KQEAgLTEzNDQsNyArMTM0MSw2IEBACiAgICAgaW50IGhhbmRsZXJudW0gPSBoYW5kbGVybmFtZTJpbnQobmFtZSk7CiAgICAgaWYgKGhhbmRsZXJudW0gPj0gMCkgewogICAgICAgICB4bWxoYW5kbGVyIGNfaGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV07CiAKICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewogICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYW5kIGEgY2hhcmFjdGVyCkBAIC0xMzY2LDggKzEzNjIsNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgY19oYW5kbGVyID0gaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLmhhbmRsZXI7CiAgICAgICAgIH0KLSAgICAgICAgc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV0gPSB2OwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICBQeV9YU0VUUkVGKHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dLCB2KTsKICAgICAgICAgaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLnNldHRlcihzZWxmLT5pdHNlbGYsIGNfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE4OTcsMTUgKzE4OTIsMTIgQEAKIGNsZWFyX2hhbmRsZXJzKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBpbnQgaW5pdGlhbCkKIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgUHlPYmplY3QgKnRlbXA7CiAKICAgICBmb3IgKDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGlmIChpbml0aWFsKQogICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggNjNiZTliNC4uYTMyM2I2OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMzIzLDEwICszMjMsOCBAQAogICAgICAgICBQeV9DTEVBUigqaG9va192YXIpOwogICAgIH0KICAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgewotICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOwogICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOwotICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKCpob29rX3ZhciwgZnVuY3Rpb24pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKQEAgLTgyOCw3ICs4MjYsNyBAQAogICAgICAgICBpZiAociA9PSBQeV9Ob25lKQogICAgICAgICAgICAgcmVzdWx0ID0gMDsKICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQeUxvbmdfQXNMb25nKHIpOworICAgICAgICAgICAgcmVzdWx0ID0gX1B5TG9uZ19Bc0ludChyKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwppbmRleCBiM2FjODA3Li5jOGI4NWEwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKQEAgLTE4NDIsNyArMTg0Miw3IEBACiAgICAgUHlPYmplY3QgKnBmZDsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImlkZW50IiwgImZpbHRlciIsICJmbGFncyIsICJmZmxhZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsICJ1ZGF0YSIsIE5VTEx9OwotICAgIHN0YXRpYyBjaGFyICpmbXQgPSAiT3xoSEkiIERBVEFfRk1UX1VOSVQgVUlOVFBUUlRfRk1UX1VOSVQgIjprZXZlbnQiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIk98aEhJIiBEQVRBX0ZNVF9VTklUIFVJTlRQVFJUX0ZNVF9VTklUICI6a2V2ZW50IjsKIAogICAgIEVWX1NFVCgmKHNlbGYtPmUpLCAwLCBFVkZJTFRfUkVBRCwgRVZfQURELCAwLCAwLCAwKTsgLyogZGVmYXVsdHMgKi8KIApAQCAtMjEyNyw3ICsyMTI3LDcgQEAKICAgICAgICAgaWYgKF9QeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoJnRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aW1lb3V0LCBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIDwgMCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGFuIG51bWJlciAiCisgICAgICAgICAgICAgICAgInRpbWVvdXQgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciAiCiAgICAgICAgICAgICAgICAgIm9yIE5vbmUsIGdvdCAlLjIwMHMiLAogICAgICAgICAgICAgICAgIFB5X1RZUEUob3RpbWVvdXQpLT50cF9uYW1lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggOGY1NzFhMi4uZWMzNWZiOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC05MjYsNyArOTI2LDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkOyB0aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuICovCiAKIHN0YXRpYyBpbnQKLXNldGlwYWRkcihjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBzaXplX3QgYWRkcl9yZXRfc2l6ZSwgaW50IGFmKQorc2V0aXBhZGRyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCiB7CiAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwogICAgIGludCBlcnJvcjsKQEAgLTExMDcsNyArMTEwNyw3IEBACiAgICBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogc3RhdGljIGludAotc2V0YmRhZGRyKGNoYXIgKm5hbWUsIGJkYWRkcl90ICpiZGFkZHIpCitzZXRiZGFkZHIoY29uc3QgY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKIHsKICAgICB1bnNpZ25lZCBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNTsKICAgICBjaGFyIGNoOwpAQCAtMTQwMSw3ICsxNDAxLDcgQEAKIGlkbmFfY29udmVydGVyKFB5T2JqZWN0ICpvYmosIHN0cnVjdCBtYXliZV9pZG5hICpkYXRhKQogewogICAgIHNpemVfdCBsZW47Ci0gICAgUHlPYmplY3QgKm9iajIsICpvYmozOworICAgIFB5T2JqZWN0ICpvYmoyOwogICAgIGlmIChvYmogPT0gTlVMTCkgewogICAgICAgICBpZG5hX2NsZWFudXAoZGF0YSk7CiAgICAgICAgIHJldHVybiAxOwpAQCAtMTQxNiwzMSArMTQxNiwyNyBAQAogICAgICAgICBkYXRhLT5idWYgPSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhvYmopOwogICAgICAgICBsZW4gPSBQeUJ5dGVBcnJheV9TaXplKG9iaik7CiAgICAgfQotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopICYmIFB5VW5pY29kZV9SRUFEWShvYmopID09IDAgJiYgUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkob2JqKSkgewotICAgICAgICBkYXRhLT5idWYgPSBQeVVuaWNvZGVfREFUQShvYmopOwotICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkob2JqKSA9PSAwICYmIFB5VW5pY29kZV9JU19DT01QQUNUX0FTQ0lJKG9iaikpIHsKKyAgICAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5VW5pY29kZV9EQVRBKG9iaik7CisgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb2JqMiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAiaWRuYSIsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvYmoyKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kaW5nIG9mIGhvc3RuYW1lIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sob2JqMikpOworICAgICAgICAgICAgZGF0YS0+b2JqID0gb2JqMjsKKyAgICAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG9iajIpOworICAgICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShvYmoyKTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgb2JqMiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgICAgIGlmICghb2JqMikgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cmluZyBvciB1bmljb2RlIHRleHQgYnVmZmVyIGV4cGVjdGVkLCBub3QgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBvYmozID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmoyLCAiaWRuYSIsIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYob2JqMik7Ci0gICAgICAgIGlmICghb2JqMykgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kaW5nIG9mIGhvc3RuYW1lIGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKG9iajMpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYob2JqMyk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIHRvIHJldHVybiBieXRlcyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS0+b2JqID0gb2JqMzsKLSAgICAgICAgZGF0YS0+YnVmID0gUHlCeXRlc19BU19TVFJJTkcob2JqMyk7Ci0gICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUob2JqMyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSBleHBlY3RlZCwgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoc3RybGVuKGRhdGEtPmJ1ZikgIT0gbGVuKSB7CiAgICAgICAgIFB5X0NMRUFSKGRhdGEtPm9iaik7CkBAIC0yNDU4LDEzICsyNDU0LDI2IEBACiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl5KjpzZXRzb2Nrb3B0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZvcHR2YWwpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBpZiAob3B0dmFsLmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9wdHZhbCk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IG9wdGlvbiBpcyBsYXJnZXIgdGhhbiAlaSBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHZhbC5idWYsIChpbnQpb3B0dmFsLmxlbik7CisjZWxzZQogICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwuYnVmLCBvcHR2YWwubGVuKTsKKyNlbmRpZgogICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZvcHR2YWwpOwogICAgIH0KLSAgICBpZiAocmVzIDwgMCkKKyAgICBpZiAocmVzIDwgMCkgewogICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoc2V0c29ja29wdF9kb2MsCkBAIC0yNTYzLDE2ICsyNTcyLDIyIEBACiBzb2NrX2Nsb3NlKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKICAgICBTT0NLRVRfVCBmZDsKKyAgICBpbnQgcmVzOwogCi0gICAgLyogV2UgZG8gbm90IHdhbnQgdG8gcmV0cnkgdXBvbiBFSU5UUjogc2VlIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzU3NjQ3OC8KLSAgICAgKiBhbmQgaHR0cDovL2xpbnV4LmRlcmtlaWxlci5jb20vTWFpbGluZy1MaXN0cy9LZXJuZWwvMjAwNS0wOS8zMDAwLmh0bWwKLSAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLgotICAgICAqLwotICAgIGlmICgoZmQgPSBzLT5zb2NrX2ZkKSAhPSAtMSkgeworICAgIGZkID0gcy0+c29ja19mZDsKKyAgICBpZiAoZmQgIT0gLTEpIHsKICAgICAgICAgcy0+c29ja19mZCA9IC0xOworCisgICAgICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIHJldHJ5IHVwb24gRUlOVFI6IHNlZQorICAgICAgICAgICBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy81NzY0NzgvIGFuZAorICAgICAgICAgICBodHRwOi8vbGludXguZGVya2VpbGVyLmNvbS9NYWlsaW5nLUxpc3RzL0tlcm5lbC8yMDA1LTA5LzMwMDAuaHRtbAorICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAqLwogICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIHJlcyA9IFNPQ0tFVENMT1NFKGZkKTsKICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgfQogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC00MTYzLDIyICs0MTc4LDQ1IEBACiAgICBGaXJzdCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdGlvbi4gKi8KIAogc3RhdGljIHZvaWQKK3NvY2tfZmluYWxpemUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQoreworICAgIFNPQ0tFVF9UIGZkOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworCisgICAgaWYgKHMtPnNvY2tfZmQgIT0gLTEpIHsKKyAgICAgICAgaWYgKFB5RXJyX1Jlc291cmNlV2FybmluZygoUHlPYmplY3QgKilzLCAxLCAidW5jbG9zZWQgJVIiLCBzKSkgeworICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogT25seSBjbG9zZSB0aGUgc29ja2V0ICphZnRlciogbG9nZ2luZyB0aGUgUmVzb3VyY2VXYXJuaW5nIHdhcm5pbmcKKyAgICAgICAgICAgdG8gYWxsb3cgdGhlIGxvZ2dlciB0byBjYWxsIHNvY2tldCBtZXRob2RzIGxpa2UKKyAgICAgICAgICAgc29ja2V0LmdldHNvY2tuYW1lKCkuIElmIHRoZSBzb2NrZXQgaXMgY2xvc2VkIGJlZm9yZSwgc29ja2V0CisgICAgICAgICAgIG1ldGhvZHMgZmFpbHMgd2l0aCB0aGUgRUJBREYgZXJyb3IuICovCisgICAgICAgIGZkID0gcy0+c29ja19mZDsKKyAgICAgICAgcy0+c29ja19mZCA9IC0xOworCisgICAgICAgIC8qIFdlIGRvIG5vdCB3YW50IHRvIHJldHJ5IHVwb24gRUlOVFI6IHNlZSBzb2NrX2Nsb3NlKCkgKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAodm9pZCkgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKworICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworfQorCitzdGF0aWMgdm9pZAogc29ja19kZWFsbG9jKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLSAgICBpZiAocy0+c29ja19mZCAhPSAtMSkgewotICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7Ci0gICAgICAgIFB5X3NzaXplX3Qgb2xkX3JlZmNvdW50ID0gUHlfUkVGQ05UKHMpOwotICAgICAgICArK1B5X1JFRkNOVChzKTsKLSAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLSAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfUmVzb3VyY2VXYXJuaW5nLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5jbG9zZWQgJVIiLCBzKSkKLSAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCi0gICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkKLSAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopIHMpOwotICAgICAgICBQeUVycl9SZXN0b3JlKGV4YywgdmFsLCB0Yik7Ci0gICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShzLT5zb2NrX2ZkKTsKLSAgICAgICAgUHlfUkVGQ05UKHMpID0gb2xkX3JlZmNvdW50OwotICAgIH0KKyAgICBpZiAoUHlPYmplY3RfQ2FsbEZpbmFsaXplckZyb21EZWFsbG9jKChQeU9iamVjdCAqKXMpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCiAgICAgUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKIH0KIApAQCAtNDM5NSw3ICs0NDMzLDggQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFCisgICAgICAgIHwgUHlfVFBGTEFHU19IQVZFX0ZJTkFMSVpFLCAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIHNvY2tfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTQ0MTUsNiArNDQ1NCwxNSBAQAogICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KICAgICBzb2NrX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLworICAgIChkZXN0cnVjdG9yKXNvY2tfZmluYWxpemUsICAgICAgICAgICAgICAgICAgLyogdHBfZmluYWxpemUgKi8KIH07CiAKIApAQCAtNTQ1MCwxMCArNTQ5OCw2IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKHJldHZhbCk7CiAgICAgfQotCi0gICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJpbnZhbGlkIGhhbmRsaW5nIG9mIGluZXRfbnRvcCIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiAjZWxpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IDQ5MzI0ZDUuLmU3MTVkMDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC0xMzcsNyArMTM3LDEwIEBACiAgICAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKGJ5dGVzLCAmbmFtZSwgTlVMTCkgPT0gLTEpCiAgICAgICAgIGdvdG8gb3V0OwogICAgIGlmICgocCA9IGdldHNwbmFtKG5hbWUpKSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgImdldHNwbmFtKCk6IG5hbWUgbm90IGZvdW5kIik7CisgICAgICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAgICAgcmV0dmFsID0gbWtzcGVudChwKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc3JlX2xpYi5oIGIvTW9kdWxlcy9zcmVfbGliLmgKaW5kZXggMTI4YzcxZS4uNzhmN2FjNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zcmVfbGliLmgKKysrIGIvTW9kdWxlcy9zcmVfbGliLmgKQEAgLTM2NywxNCArMzY3LDEyIEBACiAjZGVmaW5lIFJFVFVSTl9PTl9GQUlMVVJFKGkpIFwKICAgICBkbyB7IFJFVFVSTl9PTl9FUlJPUihpKTsgaWYgKGkgPT0gMCkgUkVUVVJOX0ZBSUxVUkU7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgU0ZZKHgpICN4Ci0KICNkZWZpbmUgREFUQV9TVEFDS19BTExPQyhzdGF0ZSwgdHlwZSwgcHRyKSBcCiBkbyB7IFwKICAgICBhbGxvY19wb3MgPSBzdGF0ZS0+ZGF0YV9zdGFja19iYXNlOyBcCiAgICAgVFJBQ0UoKCJhbGxvY2F0aW5nICVzIGluICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgIiBcCiAgICAgICAgICAgICIoJSIgUFlfRk9STUFUX1NJWkVfVCAiZClcbiIsIFwKLSAgICAgICAgICAgU0ZZKHR5cGUpLCBhbGxvY19wb3MsIHNpemVvZih0eXBlKSkpOyBcCisgICAgICAgICAgIFB5X1NUUklOR0lGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAogICAgIGlmIChzaXplb2YodHlwZSkgPiBzdGF0ZS0+ZGF0YV9zdGFja19zaXplIC0gYWxsb2NfcG9zKSB7IFwKICAgICAgICAgaW50IGogPSBkYXRhX3N0YWNrX2dyb3coc3RhdGUsIHNpemVvZih0eXBlKSk7IFwKICAgICAgICAgaWYgKGogPCAwKSByZXR1cm4gajsgXApAQCAtMzg3LDcgKzM4NSw3IEBACiAKICNkZWZpbmUgREFUQV9TVEFDS19MT09LVVBfQVQoc3RhdGUsIHR5cGUsIHB0ciwgcG9zKSBcCiBkbyB7IFwKLSAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgU0ZZKHR5cGUpLCBwb3MpKTsgXAorICAgIFRSQUNFKCgibG9va2luZyB1cCAlcyBhdCAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLCBQeV9TVFJJTkdJRlkodHlwZSksIHBvcykpOyBcCiAgICAgcHRyID0gKHR5cGUqKShzdGF0ZS0+ZGF0YV9zdGFjaytwb3MpOyBcCiB9IHdoaWxlICgwKQogCkBAIC0xMjU2LDcgKzEyNTQsMzIgQEAKICAgICAgICAgICAgcHJlZml4LCBwcmVmaXhfbGVuLCBwcmVmaXhfc2tpcCkpOwogICAgIFRSQUNFKCgiY2hhcnNldCA9ICVwXG4iLCBjaGFyc2V0KSk7CiAKLSNpZiBkZWZpbmVkKFVTRV9GQVNUX1NFQVJDSCkKKyAgICBpZiAocHJlZml4X2xlbiA9PSAxKSB7CisgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3RlciAqLworICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwcmVmaXhbMF07CisjaWYgU0laRU9GX1NSRV9DSEFSIDwgNAorICAgICAgICBpZiAoKFNSRV9DT0RFKSBjICE9IHByZWZpeFswXSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBsaXRlcmFsIGNhbid0IG1hdGNoOiBkb2Vzbid0IGZpdCBpbiBjaGFyIHdpZHRoICovCisjZW5kaWYKKyAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKKyAgICAgICAgd2hpbGUgKHB0ciA8IGVuZCkgeworICAgICAgICAgICAgd2hpbGUgKCpwdHIgIT0gYykgeworICAgICAgICAgICAgICAgIGlmICgrK3B0ciA+PSBlbmQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVFJBQ0UoKCJ8JXB8JXB8U0VBUkNIIExJVEVSQUxcbiIsIHBhdHRlcm4sIHB0cikpOworICAgICAgICAgICAgc3RhdGUtPnN0YXJ0ID0gcHRyOworICAgICAgICAgICAgc3RhdGUtPnB0ciA9IHB0ciArIHByZWZpeF9za2lwOworICAgICAgICAgICAgaWYgKGZsYWdzICYgU1JFX0lORk9fTElURVJBTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogd2UgZ290IGFsbCBvZiBpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gU1JFKG1hdGNoKShzdGF0ZSwgcGF0dGVybiArIDIqcHJlZml4X3NraXAsIDApOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICArK3B0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBpZiAocHJlZml4X2xlbiA+IDEpIHsKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGtub3duIHByZWZpeC4gIHVzZSB0aGUgb3ZlcmxhcAogICAgICAgICAgICB0YWJsZSB0byBza2lwIGZvcndhcmQgYXMgZmFzdCBhcyB3ZSBwb3NzaWJseSBjYW4gKi8KQEAgLTEzMDUsMzIgKzEzMjgsOCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSNlbmRpZgogCi0gICAgaWYgKHBhdHRlcm5bMF0gPT0gU1JFX09QX0xJVEVSQUwpIHsKLSAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGxpdGVyYWwgY2hhcmFjdGVyLiAgdGhpcyBpcyB1c2VkCi0gICAgICAgICAgIGZvciBzaG9ydCBwcmVmaXhlcywgYW5kIGlmIGZhc3Qgc2VhcmNoIGlzIGRpc2FibGVkICovCi0gICAgICAgIFNSRV9DSEFSIGMgPSAoU1JFX0NIQVIpIHBhdHRlcm5bMV07Ci0jaWYgU0laRU9GX1NSRV9DSEFSIDwgNAotICAgICAgICBpZiAoKFNSRV9DT0RFKSBjICE9IHBhdHRlcm5bMV0pCi0gICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLwotI2VuZGlmCi0gICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7Ci0gICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKLSAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKLSAgICAgICAgICAgIHN0YXRlLT5wdHIgPSArK3B0cjsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyLCAwKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoY2hhcnNldCkgeworICAgIGlmIChjaGFyc2V0KSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBjaGFyYWN0ZXIgZnJvbSBhIGtub3duIHNldCAqLwogICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICBmb3IgKDs7KSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCmluZGV4IGQyY2FhY2QuLjBiNmQ0NjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCkBAIC0zMTEsNyArMzExLDcgQEAKICAgIFJldHVybnMgbm9uLXplcm8gb24gc3VjY2VzcyAocGFyYWxsZWxzIFB5QXJnX1BhcnNlVHVwbGUpLgogKi8KIHN0YXRpYyBpbnQKLXBhcnNlX3RpbWVfdF9hcmdzKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIHRpbWVfdCAqcHdoZW4pCitwYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQogewogICAgIFB5T2JqZWN0ICpvdCA9IE5VTEw7CiAgICAgdGltZV90IHdoZW50OwpAQCAtNzMyLDEwICs3MzIsMTAgQEAKIHsKICAgICAvKiBJbnNwaXJlZCBieSBPcGVuIEdyb3VwIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgYXQKICAgICAgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L2Z1bmN0aW9ucy9hc2N0aW1lLmh0bWwgKi8KLSAgICBzdGF0aWMgY2hhciB3ZGF5X25hbWVbN11bNF0gPSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgd2RheV9uYW1lWzddWzRdID0gewogICAgICAgICAiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IgogICAgIH07Ci0gICAgc3RhdGljIGNoYXIgbW9uX25hbWVbMTJdWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgogICAgIH07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggZmU0ZTkwOC4uN2Q1MThmYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAgICAgcmV0dXJuIGg7CiB9CiAKLXN0YXRpYyBjaGFyICpoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhhbmd1bF9zeWxsYWJsZXNbXVszXSA9IHsKICAgICB7ICJHIiwgICJBIiwgICAiIiAgIH0sCiAgICAgeyAiR0ciLCAiQUUiLCAgIkciICB9LAogICAgIHsgIk4iLCAgIllBIiwgICJHRyIgfSwKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAgICAgaW50IGksIGxlbjE7CiAgICAgKmxlbiA9IC0xOwogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CiAgICAgICAgIGxlbjEgPSBQeV9TQUZFX0RPV05DQVNUKHN0cmxlbihzKSwgc2l6ZV90LCBpbnQpOwogICAgICAgICBpZiAobGVuMSA8PSAqbGVuKQogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bGltaXRlZC5jIGIvTW9kdWxlcy94eGxpbWl0ZWQuYwppbmRleCA0MGMxNzYwLi5jMWE5YmU5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bGltaXRlZC5jCisrKyBiL01vZHVsZXMveHhsaW1pdGVkLmMKQEAgLTg5LDcgKzg5LDcgQEAKIH0KIAogc3RhdGljIGludAotWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK1h4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CiAgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMveHhtb2R1bGUuYyBiL01vZHVsZXMveHhtb2R1bGUuYwppbmRleCA4NTIzMGQ5Li4wNzY0NDA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy94eG1vZHVsZS5jCkBAIC03Niw3ICs3Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IGViNjI3MjguLjYxOGEyMmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC01Myw3ICs1Myw3IEBACiB9IGNvbXBvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCi16bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY2hhciAqbXNnKQoremxpYl9lcnJvcih6X3N0cmVhbSB6c3QsIGludCBlcnIsIGNvbnN0IGNoYXIgKm1zZykKIHsKICAgICBjb25zdCBjaGFyICp6bXNnID0gWl9OVUxMOwogICAgIC8qIEluIGNhc2Ugb2YgYSB2ZXJzaW9uIG1pc21hdGNoLCB6c3QubXNnIHdvbid0IGJlIGluaXRpYWxpemVkLgpAQCAtMTM3LDE4ICsxMzcsMTcgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIHpsaWIuY29tcHJlc3MKIAotICAgIGJ5dGVzOiBQeV9idWZmZXIKKyAgICBkYXRhOiBQeV9idWZmZXIKICAgICAgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC4KICAgICBsZXZlbDogaW50KGNfZGVmYXVsdD0iWl9ERUZBVUxUX0NPTVBSRVNTSU9OIikgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04KLSAgICAgICAgQ29tcHJlc3Npb24gbGV2ZWwsIGluIDAtOS4KLSAgICAvCisgICAgICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuCiAKIFJldHVybnMgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyBjb21wcmVzc2VkIGRhdGEuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi16bGliX2NvbXByZXNzX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpieXRlcywgaW50IGxldmVsKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVkN2RkNDU4ODc4OGVmZDMgaW5wdXQ9YmUzYWJlOTkzNGJkYTRiM10qLworemxpYl9jb21wcmVzc19pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IGxldmVsKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTFiOTc1ODkxMzJiMjAzYjQgaW5wdXQ9YWJlZDMwZjRmYTE0ZTIxM10qLwogewogICAgIFB5T2JqZWN0ICpSZXR1cm5WYWwgPSBOVUxMOwogICAgIEJ5dGUgKmlucHV0LCAqb3V0cHV0ID0gTlVMTDsKQEAgLTE1NiwxMyArMTU1LDEzIEBACiAgICAgaW50IGVycjsKICAgICB6X3N0cmVhbSB6c3Q7CiAKLSAgICBpZiAoKHNpemVfdClieXRlcy0+bGVuID4gVUlOVF9NQVgpIHsKKyAgICBpZiAoKHNpemVfdClkYXRhLT5sZW4gPiBVSU5UX01BWCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIGRvZXMgbm90IGZpdCBpbiBhbiB1bnNpZ25lZCBpbnQiKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgaW5wdXQgPSBieXRlcy0+YnVmOwotICAgIGxlbmd0aCA9ICh1bnNpZ25lZCBpbnQpYnl0ZXMtPmxlbjsKKyAgICBpbnB1dCA9IGRhdGEtPmJ1ZjsKKyAgICBsZW5ndGggPSAodW5zaWduZWQgaW50KWRhdGEtPmxlbjsKIAogICAgIHpzdC5hdmFpbF9vdXQgPSBsZW5ndGggKyBsZW5ndGgvMTAwMCArIDEyICsgMTsKIApAQCAtMTMyMyw3ICsxMzIyLDcgQEAKICJ6bGliIGxpYnJhcnksIHdoaWNoIGlzIGJhc2VkIG9uIEdOVSB6aXAuXG4iCiAiXG4iCiAiYWRsZXIzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYW4gQWRsZXItMzIgY2hlY2tzdW0uXG4iCi0iY29tcHJlc3Moc3RyaW5nWywgbGV2ZWxdKSAtLSBDb21wcmVzcyBzdHJpbmcsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgaW4gMC05LlxuIgorImNvbXByZXNzKGRhdGFbLCBsZXZlbF0pIC0tIENvbXByZXNzIGRhdGEsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMC05IG9yIC0xLlxuIgogImNvbXByZXNzb2JqKFtsZXZlbFssIC4uLl1dKSAtLSBSZXR1cm4gYSBjb21wcmVzc29yIG9iamVjdC5cbiIKICJjcmMzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYSBDUkMtMzIgY2hlY2tzdW0uXG4iCiAiZGVjb21wcmVzcyhzdHJpbmcsW3diaXRzXSxbYnVmc2l6ZV0pIC0tIERlY29tcHJlc3NlcyBhIGNvbXByZXNzZWQgc3RyaW5nLlxuIgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IGEwMzYyZTcuLjNlMWZmOTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTE0MSw4ICsxNDEsMTEgQEAKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkKLSAgICAgICAgcmV0dXJuIG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgICAgICBhc3NlcnQoKGl0ZW0gIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAogICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgewogICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CkBAIC0xNTQ0LDggKzE1NDcsMTAgQEAKICAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaSArPSBsOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwppbmRleCA1YTA0ODBjLi5kMDI2MGM5IDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKQEAgLTI3OSwzMSArMjc5LDYgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zvcm1hdChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKmJ5dGVzX2luLCAqYnl0ZXNfb3V0LCAqcmVzOwotICAgIGNoYXIgKmJ5dGVzdHJpbmc7Ci0KLSAgICBpZiAoc2VsZiA9PSBOVUxMIHx8ICFQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSB8fCBhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBieXRlc3RyaW5nID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIGJ5dGVzX2luID0gUHlCeXRlc19Gcm9tU3RyaW5nKGJ5dGVzdHJpbmcpOwotICAgIGlmIChieXRlc19pbiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBieXRlc19vdXQgPSBfUHlCeXRlc19Gb3JtYXQoYnl0ZXNfaW4sIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihieXRlc19pbik7Ci0gICAgaWYgKGJ5dGVzX291dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KGJ5dGVzX291dCk7Ci0gICAgUHlfREVDUkVGKGJ5dGVzX291dCk7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzOwotfQotCiAvKiBGdW5jdGlvbnMgc3R1ZmZlZCBpbnRvIHRoZSB0eXBlIG9iamVjdCAqLwogCiBzdGF0aWMgUHlfc3NpemVfdApAQCAtMTE3MSwxNiArMTE0NiwxNSBAQAogICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CiAgICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKICAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAotICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGUsIG1vZGUpOworICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMSkgeworICAgICAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX2NoYXIoCisgICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfY2hhcigKKyAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZikgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgKnN1Yik7CiAgICAgICAgIGlmIChyZXMgPj0gMCkKICAgICAgICAgICAgIHJlcyArPSBzdGFydDsKICAgICB9CkBAIC0xNzE4LDE3ICsxNjkyLDI3IEBACiAgICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLSAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwotCi0gICAgLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKKyAgICBpZiAodG9fbGVuID4gMSkgeworICAgICAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwogICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIGNvdW50IC09IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHRfc1swXSA9IHRvX3NbMF07CisgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgY291bnQgLT0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgcmVzdWx0X3NbMF0gPSB0b19zWzBdOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCkBAIC0yNTg5LDggKzI1NzMsOCBAQAogLyogWFhYIFRoZXNlIHR3byBoZWxwZXJzIGNvdWxkIGJlIG9wdGltaXplZCBpZiBhcmdzaXplID09IDEgKi8KIAogc3RhdGljIFB5X3NzaXplX3QKLWxzdHJpcF9oZWxwZXIoY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAotICAgICAgICAgICAgICB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKK2xzdHJpcF9oZWxwZXIoY29uc3QgY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAorICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKIHsKICAgICBQeV9zc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChpIDwgbXlzaXplICYmIG1lbWNocihhcmdwdHIsICh1bnNpZ25lZCBjaGFyKSBteXB0cltpXSwgYXJnc2l6ZSkpCkBAIC0yNTk5LDggKzI1ODMsOCBAQAogfQogCiBzdGF0aWMgUHlfc3NpemVfdAotcnN0cmlwX2hlbHBlcihjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCi0gICAgICAgICAgICAgIHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQorcnN0cmlwX2hlbHBlcihjb25zdCBjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQogewogICAgIFB5X3NzaXplX3QgaSA9IG15c2l6ZSAtIDE7CiAgICAgd2hpbGUgKGkgPj0gMCAmJiBtZW1jaHIoYXJncHRyLCAodW5zaWduZWQgY2hhcikgbXlwdHJbaV0sIGFyZ3NpemUpKQpAQCAtMjgwMSwyMiArMjc4NSw2IEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKLWhleF9kaWdpdF90b19pbnQoUHlfVUNTNCBjKQotewotICAgIGlmIChjID49IDEyOCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeV9JU0RJR0lUKGMpKQotICAgICAgICByZXR1cm4gYyAtICcwJzsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5X0lTVVBQRVIoYykpCi0gICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKltjbGluaWMgaW5wdXRdCiBAY2xhc3NtZXRob2QKIGJ5dGVhcnJheS5mcm9taGV4CkBAIC0yODM1LDQ4ICsyODAzLDcgQEAKIGJ5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlPYmplY3QqY2xzLCBQeU9iamVjdCAqc3RyaW5nKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRmM2RhNjAxMjliMzcwMGMgaW5wdXQ9OTA3YmJkMmQzNGQ5MzY3YV0qLwogewotICAgIFB5T2JqZWN0ICpuZXdieXRlczsKLSAgICBjaGFyICpidWY7Ci0gICAgUHlfc3NpemVfdCBoZXhsZW4sIGJ5dGVzbGVuLCBpLCBqOwotICAgIGludCB0b3AsIGJvdDsKLSAgICB2b2lkICpkYXRhOwotICAgIHVuc2lnbmVkIGludCBraW5kOwotCi0gICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhzdHJpbmcpKTsKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cmluZykpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHJpbmcpOwotICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOwotICAgIGhleGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cmluZyk7Ci0KLSAgICBieXRlc2xlbiA9IGhleGxlbi8yOyAvKiBUaGlzIG92ZXJlc3RpbWF0ZXMgaWYgdGhlcmUgYXJlIHNwYWNlcyAqLwotICAgIG5ld2J5dGVzID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXNsZW4pOwotICAgIGlmICghbmV3Ynl0ZXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhuZXdieXRlcyk7Ci0gICAgZm9yIChpID0gaiA9IDA7IGkgPCBoZXhsZW47IGkgKz0gMikgewotICAgICAgICAvKiBza2lwIG92ZXIgc3BhY2VzIGluIHRoZSBpbnB1dCAqLwotICAgICAgICB3aGlsZSAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkgPT0gJyAnKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpZiAoaSA+PSBoZXhsZW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdG9wID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7Ci0gICAgICAgIGJvdCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSsxKSk7Ci0gICAgICAgIGlmICh0b3AgPT0gLTEgfHwgYm90ID09IC0xKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gJXpkIiwgaSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKLSAgICB9Ci0gICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZShuZXdieXRlcywgaikgPCAwKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBuZXdieXRlczsKLQotICBlcnJvcjoKLSAgICBQeV9ERUNSRUYobmV3Ynl0ZXMpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgMSk7CiB9CiAKIFB5RG9jX1NUUlZBUihoZXhfX2RvY19fLApAQCAtMzA3NCw3ICszMDAxLDcgQEAKIHsKICAgICBpZiAoIVB5Qnl0ZUFycmF5X0NoZWNrKHYpKQogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7Ci0gICAgcmV0dXJuIGJ5dGVhcnJheV9mb3JtYXQoKFB5Qnl0ZUFycmF5T2JqZWN0ICopdiwgdyk7CisgICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdEV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyh2KSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUodiksIHcsIDEpOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGJ5dGVhcnJheV9hc19udW1iZXIgPSB7CmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVzX21ldGhvZHMuYyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCmluZGV4IGEyOTk5MTUuLmQwMjUzNTEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCisrKyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIGNoYXJhY3RlcnMsIGFsbCByZW1haW5pbmcgY2FzZWQgY2hhcmFjdGVycyBoYXZlIGxvd2VyY2FzZS4iKTsKIAogdm9pZAotX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKQEAgLTMwNiw3ICszMDYsNyBAQAogYW5kIHRoZSByZXN0IGxvd2VyLWNhc2VkLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAKQEAgLTMzNiw3ICszMzYsNyBAQAogdG8gbG93ZXJjYXNlIEFTQ0lJIGFuZCB2aWNlIHZlcnNhLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ieXRlc29iamVjdC5jIGIvT2JqZWN0cy9ieXRlc29iamVjdC5jCmluZGV4IDQ5NWMzZWIuLjcwMWFlOWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZXNvYmplY3QuYworKysgYi9PYmplY3RzL2J5dGVzb2JqZWN0LmMKQEAgLTMwLDYgKzMwLDEwIEBACiAqLwogI2RlZmluZSBQeUJ5dGVzT2JqZWN0X1NJWkUgKG9mZnNldG9mKFB5Qnl0ZXNPYmplY3QsIG9iX3N2YWwpICsgMSkKIAorLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpIF9QeUJ5dGVzV3JpdGVyX0dldFNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7CisKIC8qCiAgICBGb3IgUHlCeXRlc19Gcm9tU3RyaW5nKCksIHRoZSBwYXJhbWV0ZXIgYHN0cicgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkCiAgICBzdHJpbmcgY29udGFpbmluZyBleGFjdGx5IGBzaXplJyBieXRlcy4KQEAgLTE3NCwxOTAgKzE3OCwxODQgQEAKIFB5T2JqZWN0ICoKIFB5Qnl0ZXNfRnJvbUZvcm1hdFYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogewotICAgIHZhX2xpc3QgY291bnQ7Ci0gICAgUHlfc3NpemVfdCBuID0gMDsKLSAgICBjb25zdCBjaGFyKiBmOwogICAgIGNoYXIgKnM7Ci0gICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBjb25zdCBjaGFyICpmOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBwcmVjOworICAgIGludCBsb25nZmxhZzsKKyAgICBpbnQgc2l6ZV90ZmxhZzsKKyAgICAvKiBMb25nZXN0IDY0LWJpdCBmb3JtYXR0ZWQgbnVtYmVyczoKKyAgICAgICAtICIxODQ0Njc0NDA3MzcwOTU1MTYxNVwwIiAoMjEgYnl0ZXMpCisgICAgICAgLSAiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcMCIgKDIxIGJ5dGVzKQorICAgICAgIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UgKGl0IGlzbid0IGVub3VnaCBmb3Igb2N0YWwuKQogCi0gICAgUHlfVkFfQ09QWShjb3VudCwgdmFyZ3MpOwotICAgIC8qIHN0ZXAgMTogZmlndXJlIG91dCBob3cgbGFyZ2UgYSBidWZmZXIgd2UgbmVlZCAqLwotICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotICAgICAgICBpZiAoKmYgPT0gJyUnKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZjsKLSAgICAgICAgICAgIHdoaWxlICgqKytmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgOworICAgICAgIExvbmdlc3QgNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246CisgICAgICAgIjB4ZmZmZmZmZmZmZmZmZmZmZlwwIiAoMTkgYnl0ZXMpLiAqLworICAgIGNoYXIgYnVmZmVyWzIxXTsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKLSAgICAgICAgICAgIC8qIHNraXAgdGhlICdsJyBvciAneicgaW4geyVsZCwgJXpkLCAlbHUsICV6dX0gc2luY2UKLSAgICAgICAgICAgICAqIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2UgcmVzZXJ2ZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCgqZiA9PSAnbCcgfHwgKmYgPT0gJ3onKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpCi0gICAgICAgICAgICAgICAgKytmOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKLSAgICAgICAgICAgIHN3aXRjaCAoKmYpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjID0gdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5Qnl0ZXNfRnJvbUZvcm1hdFYoKTogJWMgZm9ybWF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RzIGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDI1NV0iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2QnOiBjYXNlICd1JzogY2FzZSAnaSc6IGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogMjAgYnl0ZXMgaXMgZW5vdWdoIHRvIGhvbGQgYSA2NC1iaXQKLSAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLiAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICBUaGlzIGlzbid0IGVub3VnaCBmb3Igb2N0YWwuICovCi0gICAgICAgICAgICAgICAgbiArPSAyMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHMgPSB2YV9hcmcoY291bnQsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogbWF4aW11bSA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKLSAgICAgICAgICAgICAgICAgKiAweGZmZmZmZmZmZmZmZmZmZmYKLSAgICAgICAgICAgICAgICAgKiBzbyAxOSBjaGFyYWN0ZXJzIGlzIGVub3VnaC4KLSAgICAgICAgICAgICAgICAgKiBYWFggSSBjb3VudCAxOCAtLSB3aGF0J3MgdGhlIGV4dHJhIGZvcj8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBuICs9IDE5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBpZiB3ZSBzdHVtYmxlIHVwb24gYW4gdW5rbm93bgotICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgY29kZSwgY29weSB0aGUgcmVzdCBvZgotICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICBzdHJpbmcuICh3ZSBjYW5ub3QganVzdCBza2lwIHRoZQotICAgICAgICAgICAgICAgICAgIGNvZGUsIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLSAgICAgICAgICAgICAgICAgICB3aGF0J3MgaW4gdGhlIGFyZ3VtZW50IGxpc3QpICovCi0gICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICAgICAgZ290byBleHBhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbisrOwotICAgIH0KLSBleHBhbmQ6Ci0gICAgLyogc3RlcCAyOiBmaWxsIHRoZSBidWZmZXIgKi8KLSAgICAvKiBTaW5jZSB3ZSd2ZSBhbmFseXplZCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciB0aGUgd29yc3QgY2FzZSwKLSAgICAgICB1c2Ugc3ByaW50ZiBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBzbG93ZXIgUHlPU19zbnByaW50Zi4gKi8KLSAgICBzdHJpbmcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotICAgIGlmICghc3RyaW5nKQorICAgIHMgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzdHJsZW4oZm9ybWF0KSk7CisgICAgaWYgKHMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICBzID0gUHlCeXRlc19Bc1N0cmluZyhzdHJpbmcpOworI2RlZmluZSBXUklURV9CWVRFUyhzdHIpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgKHN0ciksIHN0cmxlbihzdHIpKTsgXAorICAgICAgICBpZiAocyA9PSBOVUxMKSBcCisgICAgICAgICAgICBnb3RvIGVycm9yOyBcCisgICAgfSB3aGlsZSAoMCkKIAogICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotICAgICAgICBpZiAoKmYgPT0gJyUnKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZisrOworICAgICAgICBpZiAoKmYgIT0gJyUnKSB7CisgICAgICAgICAgICAqcysrID0gKmY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBmKys7CisKKyAgICAgICAgLyogaWdub3JlIHRoZSB3aWR0aCAoZXg6IDEwIGluICIlMTBzIikgKi8KKyAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQorICAgICAgICAgICAgZisrOworCisgICAgICAgIC8qIHBhcnNlIHRoZSBwcmVjaXNpb24gKGV4OiAxMCBpbiAiJS4xMHMiKSAqLworICAgICAgICBwcmVjID0gMDsKKyAgICAgICAgaWYgKCpmID09ICcuJykgeworICAgICAgICAgICAgZisrOworICAgICAgICAgICAgZm9yICg7IFB5X0lTRElHSVQoKmYpOyBmKyspIHsKKyAgICAgICAgICAgICAgICBwcmVjID0gKHByZWMgKiAxMCkgKyAoKmYgLSAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCisgICAgICAgICAgICBmKys7CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcgKCdsJyksIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KKyAgICAgICAgICAgb3RoZXJzIGNhbiBiZSBhZGRlZCB3aGVuIG5lY2Vzc2FyeS4gKi8KKyAgICAgICAgbG9uZ2ZsYWcgPSAwOworICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgIGxvbmdmbGFnID0gMTsKKyAgICAgICAgICAgICsrZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhhbmRsZSB0aGUgc2l6ZV90IGZsYWcgKCd6JykuICovCisgICAgICAgIHNpemVfdGZsYWcgPSAwOworICAgICAgICBpZiAoKmYgPT0gJ3onICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOworICAgICAgICAgICAgKytmOworICAgICAgICB9CisKKyAgICAgICAgLyogc3Vic3RyYWN0IGJ5dGVzIHByZWFsbG9jYXRlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgKGV4OiAyIGZvciAiJXMiKSAqLworICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGYgLSBwICsgMSk7CisKKyAgICAgICAgc3dpdGNoICgqZikgeworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIldSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICB7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOwotICAgICAgICAgICAgaW50IHNpemVfdGZsYWcgPSAwOwotICAgICAgICAgICAgLyogcGFyc2UgdGhlIHdpZHRoLnByZWNpc2lvbiBwYXJ0ICh3ZSdyZSBvbmx5Ci0gICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZSBwcmVjaXNpb24gdmFsdWUsIGlmIGFueSkgKi8KLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQotICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotICAgICAgICAgICAgaWYgKCpmID09ICcuJykgewotICAgICAgICAgICAgICAgIGYrKzsKLSAgICAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworCisgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICAgICAgICBpID0gc3RybGVuKHApOworICAgICAgICAgICAgaWYgKHByZWMgPiAwICYmIGkgPiBwcmVjKQorICAgICAgICAgICAgICAgIGkgPSBwcmVjOworICAgICAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgcCwgaSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCisgICAgICAgICAgICBpZiAoYnVmZmVyWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CisgICAgICAgICAgICBlbHNlIGlmIChidWZmZXJbMV0gIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShidWZmZXIrMiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAnMCc7CisgICAgICAgICAgICAgICAgYnVmZmVyWzFdID0gJ3gnOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcsIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KLSAgICAgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCi0gICAgICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLSAgICAgICAgICAgICAgICBsb25nZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOwotICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICclJzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKmYgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZpeCBtaW5fc2l6ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogYyBoYXMgYmVlbiBjaGVja2VkIGZvciBvdmVyZmxvdyBpbiB0aGUgZmlyc3Qgc3RlcCAqLwotICAgICAgICAgICAgICAgICpzKysgPSAodW5zaWduZWQgY2hhciljOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBpID0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiBpID4gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IG47Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHMsIHAsIGkpOwotICAgICAgICAgICAgICAgIHMgKz0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOwotICAgICAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCi0gICAgICAgICAgICAgICAgaWYgKHNbMV0gPT0gJ1gnKQotICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgKnMrKyA9ICclJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RyY3B5KHMsIHApOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIC8qIGludmFsaWQgZm9ybWF0IHN0cmluZzogY29weSB1bmZvcm1hdHRlZCBzdHJpbmcgYW5kIGV4aXQgKi8KKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKHApOworICAgICAgICAgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKyAgICAgICAgfQogICAgIH0KIAotIGVuZDoKLSAgICBfUHlCeXRlc19SZXNpemUoJnN0cmluZywgcyAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cmluZykpOwotICAgIHJldHVybiBzdHJpbmc7CisjdW5kZWYgV1JJVEVfQllURVMKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcyk7CisKKyBlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC00MDksMTIgKzQwNywxNCBAQAogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIFB5Qnl0ZXMgb2JqZWN0LCBvciBOVUxMIG9uIGZhaWx1cmUuICovCiAKLXN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRmbG9hdChQeU9iamVjdCAqdiwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUpCitzdGF0aWMgY2hhcioKK2Zvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSwKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9yZXN1bHQsIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKIHsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CisgICAgc2l6ZV90IGxlbjsKIAogICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwogICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNDMxLDkgKzQzMSwyMSBAQAogCiAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOworCisgICAgbGVuID0gc3RybGVuKHApOworICAgIGlmICh3cml0ZXIgIT0gTlVMTCkgeworICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBsZW4pOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfTUVNQ1BZKHN0ciwgcCwgbGVuKTsKKyAgICAgICAgc3RyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIGxlbik7CiAgICAgUHlNZW1fRnJlZShwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgICpwX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICByZXR1cm4gc3RyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNTU3LDM2ICs1NjksMzYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pCi0KLSAgIEZPUk1BVEJVRkxFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGludHMgJgotICAgY2hhcnMgYXJlIGZvcm1hdHRlZC4gWFhYIFRoaXMgaXMgYSBtYWdpYyBudW1iZXIuIEVhY2ggZm9ybWF0dGluZwotICAgcm91dGluZSBkb2VzIGJvdW5kcyBjaGVja2luZyB0byBlbnN1cmUgbm8gb3ZlcmZsb3csIGJ1dCBhIGJldHRlcgotICAgc29sdXRpb24gbWF5IGJlIHRvIG1hbGxvYyBhIGJ1ZmZlciBvZiBhcHByb3ByaWF0ZSBzaXplIGZvciBlYWNoCi0gICBmb3JtYXQuIEZvciBub3csIHRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHN1ZmZpY2llbnQuCi0qLwotI2RlZmluZSBGT1JNQVRCVUZMRU4gKHNpemVfdCkxMjAKKy8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKSAqLwogCiBQeU9iamVjdCAqCi1fUHlCeXRlc19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCitfUHlCeXRlc19Gb3JtYXRFeChjb25zdCBjaGFyICpmb3JtYXQsIFB5X3NzaXplX3QgZm9ybWF0X2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBpbnQgdXNlX2J5dGVhcnJheSkKIHsKLSAgICBjaGFyICpmbXQsICpyZXM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgKnJlczsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OwotICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBQeV9zc2l6ZV90IGZtdGNudDsKICAgICBpbnQgYXJnc19vd25lZCA9IDA7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeUJ5dGVzX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdCk7Ci0gICAgZm10Y250ID0gUHlCeXRlc19HRVRfU0laRShmb3JtYXQpOwotICAgIHJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcmVzbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgZm10ID0gZm9ybWF0OworICAgIGZtdGNudCA9IGZvcm1hdF9sZW47CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKKworICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGZtdGNudCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaWYgKCF1c2VfYnl0ZWFycmF5KQorICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKwogICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CiAgICAgICAgIGFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAgICAgICAgIGFyZ2lkeCA9IDA7CkBAIC02MDAsMTggKzYxMiwyMyBAQAogICAgICAgICAhUHlCeXRlQXJyYXlfQ2hlY2soYXJncykpIHsKICAgICAgICAgICAgIGRpY3QgPSBhcmdzOwogICAgIH0KKwogICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CiAgICAgICAgIGlmICgqZm10ICE9ICclJykgewotICAgICAgICAgICAgaWYgKC0tcmVzY250IDwgMCkgewotICAgICAgICAgICAgICAgIHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpyZXMrKyA9ICpmbXQrKzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgY2hhciAqcG9zOworCisgICAgICAgICAgICBwb3MgPSBzdHJjaHIoZm10ICsgMSwgJyUnKTsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBsZW4gPSBwb3MgLSBmbXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0X2xlbiAtIChmbXQgLSBmb3JtYXQpOworICAgICAgICAgICAgYXNzZXJ0KGxlbiAhPSAwKTsKKworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgZm10LCBsZW4pOworICAgICAgICAgICAgcmVzICs9IGxlbjsKKyAgICAgICAgICAgIGZtdCArPSBsZW47CisgICAgICAgICAgICBmbXRjbnQgLT0gKGxlbiAtIDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLwpAQCAtNjI2LDEwICs2NDMsMTQgQEAKICAgICAgICAgICAgIGludCBzaWduOwogICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSAwOwogICAgICAgICAgICAgY2hhciBvbmVjaGFyOyAvKiBGb3IgYnl0ZV9jb252ZXJ0ZXIoKSAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBhbGxvYzsKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgY2hhciAqYmVmb3JlOworI2VuZGlmCiAKICAgICAgICAgICAgIGZtdCsrOwogICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqa2V5c3RhcnQ7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5c3RhcnQ7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlsZW47CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKICAgICAgICAgICAgICAgICBpbnQgcGNvdW50ID0gMTsKQEAgLTY3Myw2ICs2OTQsOCBAQAogICAgICAgICAgICAgICAgIGFyZ2xlbiA9IC0xOwogICAgICAgICAgICAgICAgIGFyZ2lkeCA9IC0yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBmbGFncy4gRXhhbXBsZTogIiUraSIgPT4gZmxhZ3M9Rl9TSUdOLiAqLwogICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSAqZm10KyspIHsKICAgICAgICAgICAgICAgICBjYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7CkBAIC02ODMsNiArNzA2LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIHdpZHRoLiBFeGFtcGxlOiAiJTEwcyIgPT4gd2lkdGg9MTAgKi8KICAgICAgICAgICAgIGlmIChjID09ICcqJykgewogICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKQEAgLTcxNyw2ICs3NDIsOCBAQAogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2UgcHJlY2lzaW9uLiBFeGFtcGxlOiAiJS4zZiIgPT4gcHJlYz0zICovCiAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKICAgICAgICAgICAgICAgICBwcmVjID0gMDsKICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKQEAgLTc3MSwxMyArNzk4LDE5IEBACiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZtdGNudCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBsYXN0IHdyaXRlcjogZGlzYWJsZSB3cml0ZXIgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc2lnbiA9IDA7CiAgICAgICAgICAgICBmaWxsID0gJyAnOwogICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBwYnVmID0gIiUiOwotICAgICAgICAgICAgICAgIGxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKnJlcysrID0gJyUnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAvLyAlciBpcyBvbmx5IGZvciAyLzMgY29kZTsgMyBvbmx5IGNvZGUgc2hvdWxkIHVzZSAlYQogICAgICAgICAgICAgY2FzZSAnYSc6CkBAIC03OTAsNiArODIzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgIC8vICVzIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICViCiAgICAgICAgICAgICBjYXNlICdiJzoKQEAgLTc5OSwxMiArODMzLDQ5IEBACiAgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQogICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnWCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdGVybmF0ZSA9IGZsYWdzICYgRl9BTFQ7CisgICAgICAgICAgICAgICAgICAgIGludCBiYXNlOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwICYmICIndHlwZScgbm90IGluIFtkaXVveFhdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gMjsgLyogc2l6ZSBwcmVhbGxvY2F0ZWQgZm9yICIlZCIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcigmd3JpdGVyLCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYmFzZSwgYWx0ZXJuYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGxvbmcodiwgZmxhZ3MsIHByZWMsIGMpOwogICAgICAgICAgICAgICAgIGlmICghdGVtcCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTgxNSwxNCArODg2LDI1IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICBjYXNlICdGJzoKICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSAmJiBwcmVjID09IC0xCisgICAgICAgICAgICAgICAgICAgICYmICEoZmxhZ3MgJiAoRl9TSUdOIHwgRl9CTEFOSykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVmIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgTlVMTCwgJndyaXRlciwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgJnRlbXAsIE5VTEwsIHJlcykpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHRlbXApOwogICAgICAgICAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUodGVtcCk7CkBAIC04MzAsMjEgKzkxMiwyOCBAQAogICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICAgcGJ1ZiA9ICZvbmVjaGFyOwogICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVfY29udmVydGVyKHYsICZvbmVjaGFyKTsKICAgICAgICAgICAgICAgICBpZiAoIWxlbikKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IG9uZWNoYXI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKICAgICAgICAgICAgICAgICAgICJhdCBpbmRleCAlemQiLAogICAgICAgICAgICAgICAgICAgYywgYywKLSAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0gZm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgewogICAgICAgICAgICAgICAgICAgICBzaWduID0gKnBidWYrKzsKQEAgLTg1OSwyOSArOTQ4LDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod2lkdGggPCBsZW4pCiAgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47Ci0gICAgICAgICAgICBpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgIHJlc2xlbiAtPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7Ci0gICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKLSAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKKworICAgICAgICAgICAgYWxsb2MgPSB3aWR0aDsKKyAgICAgICAgICAgIGlmIChzaWduICE9IDAgJiYgbGVuID09IHdpZHRoKQorICAgICAgICAgICAgICAgIGFsbG9jKys7CisgICAgICAgICAgICAvKiAyOiBzaXplIHByZWFsbG9jYXRlZCBmb3IgJXMgKi8KKyAgICAgICAgICAgIGlmIChhbGxvYyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHJlcywgYWxsb2MgLSAyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisjaWZkZWYgUHlfREVCVUcKKyAgICAgICAgICAgIGJlZm9yZSA9IHJlczsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgc2lnbiBpZiBuZWVkZWQgKi8KICAgICAgICAgICAgIGlmIChzaWduKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwotICAgICAgICAgICAgICAgIHJlc2NudC0tOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikKICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIG51bWVyaWMgcHJlZml4IGZvciAieCIsICJYIiBhbmQgIm8iIGZvcm1hdHMKKyAgICAgICAgICAgICAgIGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkLgorICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHdyaXRlICIweCIgZm9yIHRoZSAiJSN4IiBmb3JtYXQuICovCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKICAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOwpAQCAtODg5LDE4ICs5ODAsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzY250IC09IDI7CiAgICAgICAgICAgICAgICAgd2lkdGggLT0gMjsKICAgICAgICAgICAgICAgICBpZiAod2lkdGggPCAwKQogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhZCBsZWZ0IHdpdGggdGhlIGZpbGwgY2hhcmFjdGVyIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IGZpbGw7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7CisgICAgICAgICAgICAgICAgbWVtc2V0KHJlcywgZmlsbCwgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBwYWRkaW5nIHdpdGggc3BhY2VzOiB3cml0ZSBzaWduIGlmIG5lZWRlZCBhbmQvb3IgbnVtZXJpYworICAgICAgICAgICAgICAgcHJlZml4IGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkICovCiAgICAgICAgICAgICBpZiAoZmlsbCA9PSAnICcpIHsKICAgICAgICAgICAgICAgICBpZiAoc2lnbikKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKQEAgLTkxMiwxMyArMTAwNiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29weSBieXRlcyAqLwogICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKICAgICAgICAgICAgIHJlcyArPSBsZW47Ci0gICAgICAgICAgICByZXNjbnQgLT0gbGVuOwotICAgICAgICAgICAgd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgKnJlcysrID0gJyAnOworCisgICAgICAgICAgICAvKiBQYWQgcmlnaHQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCisgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCAnICcsIHdpZHRoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICByZXMgKz0gKHdpZHRoIC0gbGVuKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwpAQCAtOTI2LDIyICsxMDI0LDMxIEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBjb21wdXRlZCB0aGUgZXhhY3Qgc2l6ZSBmb3IgdGhpcyB3cml0ZSAqLworICAgICAgICAgICAgYXNzZXJ0KChyZXMgLSBiZWZvcmUpID09IGFsbG9jKTsKKyNlbmRpZgogICAgICAgICB9IC8qICclJyAqLworCisgICAgICAgIC8qIElmIG92ZXJhbGxvY2F0aW9uIHdhcyBkaXNhYmxlZCwgZW5zdXJlIHRoYXQgaXQgd2FzIHRoZSBsYXN0CisgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgZm10Y250IDwgMCB8fCB1c2VfYnl0ZWFycmF5KTsKICAgICB9IC8qIHVudGlsIGVuZCAqLworCiAgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKwogICAgIGlmIChhcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcmVzKTsKIAogIGVycm9yOgotICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KQEAgLTk2MSw2ICsxMDY4LDQyIEBACiAgICB0aGUgc3RyaW5nIGlzIFVURi04IGVuY29kZWQgYW5kIHNob3VsZCBiZSByZS1lbmNvZGVkIGluIHRoZQogICAgc3BlY2lmaWVkIGVuY29kaW5nLiAgKi8KIAorc3RhdGljIGNoYXIgKgorX1B5Qnl0ZXNfRGVjb2RlRXNjYXBlUmVjb2RlKGNvbnN0IGNoYXIgKipzLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqcCkKK3sKKyAgICBQeU9iamVjdCAqdSwgKnc7CisgICAgY29uc3QgY2hhciogdDsKKworICAgIHQgPSAqczsKKyAgICAvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLworICAgIHdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKQorICAgICAgICB0Kys7CisgICAgdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KCpzLCB0IC0gKnMsIGVycm9ycyk7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCisgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOworICAgIFB5X0RFQ1JFRih1KTsKKyAgICBpZiAgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOworCisgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCisgICAgd3JpdGVyLT5taW5fc2l6ZS0tOyAgIC8qIHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMod3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUodykpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICpzID0gdDsKKyAgICByZXR1cm4gcDsKK30KKwogUHlPYmplY3QgKlB5Qnl0ZXNfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCkBAIC05NjgsNTQgKzExMTEsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVjb2RlX2VuY29kaW5nKQogewogICAgIGludCBjOwotICAgIGNoYXIgKnAsICpidWY7CisgICAgY2hhciAqcDsKICAgICBjb25zdCBjaGFyICplbmQ7Ci0gICAgUHlPYmplY3QgKnY7Ci0gICAgUHlfc3NpemVfdCBuZXdsZW4gPSByZWNvZGVfZW5jb2RpbmcgPyA0KmxlbjpsZW47Ci0gICAgdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdsZW4pOwotICAgIGlmICh2ID09IE5VTEwpCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4pOworICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHAgPSBidWYgPSBQeUJ5dGVzX0FzU3RyaW5nKHYpOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOworCiAgICAgZW5kID0gcyArIGxlbjsKICAgICB3aGlsZSAocyA8IGVuZCkgewogICAgICAgICBpZiAoKnMgIT0gJ1xcJykgewogICAgICAgICAgIG5vbl9lc2M6Ci0gICAgICAgICAgICBpZiAocmVjb2RlX2VuY29kaW5nICYmICgqcyAmIDB4ODApKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnUsICp3OwotICAgICAgICAgICAgICAgIGNoYXIgKnI7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogdDsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHJuOwotICAgICAgICAgICAgICAgIHQgPSBzOwotICAgICAgICAgICAgICAgIC8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpIHQrKzsKLSAgICAgICAgICAgICAgICB1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgdCAtIHMsIGVycm9ycyk7Ci0gICAgICAgICAgICAgICAgaWYoIXUpIGdvdG8gZmFpbGVkOwotCi0gICAgICAgICAgICAgICAgLyogUmVjb2RlIHRoZW0gaW4gdGFyZ2V0IGVuY29kaW5nLiAqLwotICAgICAgICAgICAgICAgIHcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICB1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICAgICAgICAgIGlmICghdykgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotCi0gICAgICAgICAgICAgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCi0gICAgICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOwotICAgICAgICAgICAgICAgIHIgPSBQeUJ5dGVzX0FTX1NUUklORyh3KTsKLSAgICAgICAgICAgICAgICBybiA9IFB5Qnl0ZXNfR0VUX1NJWkUodyk7Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHAsIHIsIHJuKTsKLSAgICAgICAgICAgICAgICBwICs9IHJuOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKLSAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpKSB7CiAgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBub24tQVNDSUkgY2hhcmFjdGVyIGFuZCBuZWVkIHRvIHJlY29kZSAqLworICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoJnMsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgcmVjb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlciwgcCk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCiAgICAgICAgIHMrKzsKLSAgICAgICAgaWYgKHM9PWVuZCkgeworICAgICAgICBpZiAocyA9PSBlbmQpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFpbGluZyBcXCBpbiBzdHJpbmciKTsKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICB9CisKICAgICAgICAgc3dpdGNoICgqcysrKSB7CiAgICAgICAgIC8qIFhYWCBUaGlzIGFzc3VtZXMgQVNDSUkhICovCiAgICAgICAgIGNhc2UgJ1xuJzogYnJlYWs7CkBAIC0xMDQwLDI4ICsxMTcxLDE4IEBACiAgICAgICAgICAgICAqcCsrID0gYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgIGlmIChzKzEgPCBlbmQgJiYgUHlfSVNYRElHSVQoc1swXSkgJiYgUHlfSVNYRElHSVQoc1sxXSkpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7Ci0gICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKLSAgICAgICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICAgICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgICAgICAgICAgICAgIHggPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnYSc7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB4ID0gMTAgKyBjIC0gJ0EnOwotICAgICAgICAgICAgICAgIHggPSB4IDw8IDQ7Ci0gICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKLSAgICAgICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICAgICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gYyAtICcwJzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChQeV9JU0xPV0VSKGMpKQotICAgICAgICAgICAgICAgICAgICB4ICs9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ0EnOwotICAgICAgICAgICAgICAgICpwKysgPSB4OwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCkgeworICAgICAgICAgICAgICAgIGludCBkaWdpdDEsIGRpZ2l0MjsKKyAgICAgICAgICAgICAgICBkaWdpdDEgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc1swXSldOworICAgICAgICAgICAgICAgIGRpZ2l0MiA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzFdKV07CisgICAgICAgICAgICAgICAgaWYgKGRpZ2l0MSA8IDE2ICYmIGRpZ2l0MiA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoKGRpZ2l0MSA8PCA0KSArIGRpZ2l0Mik7CisgICAgICAgICAgICAgICAgICAgIHMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdHMgKi8KKwogICAgICAgICAgICAgaWYgKCFlcnJvcnMgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgXFx4IGVzY2FwZSBhdCBwb3NpdGlvbiAlZCIsCkBAIC0xMDgzLDYgKzEyMDQsNyBAQAogICAgICAgICAgICAgaWYgKHMgPCBlbmQgJiYgUHlfSVNYRElHSVQoc1swXSkpCiAgICAgICAgICAgICAgICAgcysrOyAvKiBhbmQgYSBoZXhkaWdpdCAqLwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgcy0tOwpAQCAtMTA5MCwxMSArMTIxMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEYtOCBieXRlcyBtYXkgZm9sbG93LiAqLwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwLWJ1ZiA8IG5ld2xlbikKLSAgICAgICAgX1B5Qnl0ZXNfUmVzaXplKCZ2LCBwIC0gYnVmKTsKLSAgICByZXR1cm4gdjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKICAgZmFpbGVkOgotICAgIFB5X0RFQ1JFRih2KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0xODE1LDE2ICsxOTM3LDE1IEBACiAgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKICAgICBpZiAoZW5kIC0gc3RhcnQgPCBzdWJfbGVuKQogICAgICAgICByZXMgPSAtMTsKLSAgICBlbHNlIGlmIChzdWJfbGVuID09IDEKLSNpZm5kZWYgSEFWRV9NRU1SQ0hSCi0gICAgICAgICAgICAmJiBkaXIgPiAwCi0jZW5kaWYKLSAgICApIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSAqc3ViOwotICAgICAgICBpbnQgbW9kZSA9IChkaXIgPiAwKSA/IEZBU1RfU0VBUkNIIDogRkFTVF9SU0VBUkNIOwotICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIoCi0gICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKLSAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlLCBtb2RlKTsKKyAgICBlbHNlIGlmIChzdWJfbGVuID09IDEpIHsKKyAgICAgICAgaWYgKGRpciA+IDApCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9jaGFyKAorICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfY2hhcigKKyAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAqc3ViKTsKICAgICAgICAgaWYgKHJlcyA+PSAwKQogICAgICAgICAgICAgcmVzICs9IHN0YXJ0OwogICAgIH0KQEAgLTIzNDMsMTcgKzI0NjQsMjcgQEAKICAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKICAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLSAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwotCi0gICAgLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKKyAgICBpZiAodG9fbGVuID4gMSkgeworICAgICAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwogICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIGNvdW50IC09IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHRfc1swXSA9IHRvX3NbMF07CisgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgY291bnQgLT0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgcmVzdWx0X3NbMF0gPSB0b19zWzBdOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCkBAIC0yOTc1LDIyICszMTA2LDYgQEAKICAgICAgICAgKTsKIH0KIAotc3RhdGljIGludAotaGV4X2RpZ2l0X3RvX2ludChQeV9VQ1M0IGMpCi17Ci0gICAgaWYgKGMgPj0gMTI4KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIGVsc2UgewotICAgICAgICBpZiAoUHlfSVNVUFBFUihjKSkKLSAgICAgICAgICAgIGMgPSBQeV9UT0xPV0VSKGMpOwotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qW2NsaW5pYyBpbnB1dF0KIEBjbGFzc21ldGhvZAogYnl0ZXMuZnJvbWhleApAQCAtMzAwOCw0NyArMzEyMyw4MyBAQAogYnl0ZXNfZnJvbWhleF9pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnN0cmluZykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wOTczYWNjNjM2NjFiYjJlIGlucHV0PWJmNGQxYzM2MTY3MGFjZDNdKi8KIHsKLSAgICBQeU9iamVjdCAqbmV3c3RyaW5nOworICAgIHJldHVybiBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgMCk7Cit9CisKK1B5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUhleChQeU9iamVjdCAqc3RyaW5nLCBpbnQgdXNlX2J5dGVhcnJheSkKK3sKICAgICBjaGFyICpidWY7Ci0gICAgUHlfc3NpemVfdCBoZXhsZW4sIGJ5dGVzbGVuLCBpLCBqOwotICAgIGludCB0b3AsIGJvdDsKLSAgICB2b2lkICpkYXRhOwotICAgIHVuc2lnbmVkIGludCBraW5kOworICAgIFB5X3NzaXplX3QgaGV4bGVuLCBpbnZhbGlkX2NoYXI7CisgICAgdW5zaWduZWQgaW50IHRvcCwgYm90OworICAgIFB5X1VDUzEgKnN0ciwgKmVuZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKIAogICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2soc3RyaW5nKSk7CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKICAgICBoZXhsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJpbmcpOwogCi0gICAgYnl0ZXNsZW4gPSBoZXhsZW4vMjsgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KLSAgICBuZXdzdHJpbmcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzbGVuKTsKLSAgICBpZiAoIW5ld3N0cmluZykKKyAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShzdHJpbmcpKSB7CisgICAgICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOworICAgICAgICB1bnNpZ25lZCBpbnQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKworICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub24tQVNDSUkgY2hhcmFjdGVyICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZXhsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID49IDEyOCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkX2NoYXIgPSBpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChzdHJpbmcpID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKyAgICBzdHIgPSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOworCisgICAgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KKyAgICBidWYgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBoZXhsZW4gLyAyKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG5ld3N0cmluZyk7Ci0gICAgZm9yIChpID0gaiA9IDA7IGkgPCBoZXhsZW47IGkgKz0gMikgeworCisgICAgZW5kID0gc3RyICsgaGV4bGVuOworICAgIHdoaWxlIChzdHIgPCBlbmQpIHsKICAgICAgICAgLyogc2tpcCBvdmVyIHNwYWNlcyBpbiB0aGUgaW5wdXQgKi8KLSAgICAgICAgd2hpbGUgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID09ICcgJykKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaWYgKGkgPj0gaGV4bGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRvcCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICBib3QgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkrMSkpOwotICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGkpOworICAgICAgICBpZiAoKnN0ciA9PSAnICcpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIgPT0gJyAnKTsKKyAgICAgICAgICAgIGlmIChzdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG9wID0gX1B5TG9uZ19EaWdpdFZhbHVlWypzdHJdOworICAgICAgICBpZiAodG9wID49IDE2KSB7CisgICAgICAgICAgICBpbnZhbGlkX2NoYXIgPSBzdHIgLSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7CisgICAgICAgIHN0cisrOworCisgICAgICAgIGJvdCA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsqc3RyXTsKKyAgICAgICAgaWYgKGJvdCA+PSAxNikgeworICAgICAgICAgICAgaW52YWxpZF9jaGFyID0gc3RyIC0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3RyKys7CisKKyAgICAgICAgKmJ1ZisrID0gKHVuc2lnbmVkIGNoYXIpKCh0b3AgPDwgNCkgKyBib3QpOwogICAgIH0KLSAgICBpZiAoaiAhPSBieXRlc2xlbiAmJiBfUHlCeXRlc19SZXNpemUoJm5ld3N0cmluZywgaikgPCAwKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBuZXdzdHJpbmc7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJ1Zik7CiAKICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihuZXdzdHJpbmcpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGludmFsaWRfY2hhcik7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzEzMSwxMSArMzI4MiwxMyBAQAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX21vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCitieXRlc19tb2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHYpKQorICAgIGlmICghUHlCeXRlc19DaGVjayhzZWxmKSkgewogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7Ci0gICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdCh2LCB3KTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdEV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIDApOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGJ5dGVzX2FzX251bWJlciA9IHsKQEAgLTMyNDQsMTA4ICszMzk3LDkzIEBACiAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbU9iamVjdCh4KTsKIH0KIAotUHlPYmplY3QgKgotUHlCeXRlc19Gcm9tT2JqZWN0KFB5T2JqZWN0ICp4KQorc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUJ1ZmZlcihQeU9iamVjdCAqeCkKIHsKLSAgICBQeU9iamVjdCAqbmV3LCAqaXQ7CisgICAgUHlPYmplY3QgKm5ldzsKKyAgICBQeV9idWZmZXIgdmlldzsKKworICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoeCwgJnZpZXcsIFB5QlVGX0ZVTExfUk8pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHZpZXcubGVuKTsKKyAgICBpZiAoIW5ldykKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXMoKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbCwKKyAgICAgICAgICAgICAgICAmdmlldywgdmlldy5sZW4sICdDJykgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgcmV0dXJuIG5ldzsKKworZmFpbDoKKyAgICBQeV9YREVDUkVGKG5ldyk7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgR0VUX0lURU0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfc3NpemVfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X3NzaXplX3QgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyICpzdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlPYmplY3QgKml0ZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBieXRlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGJ5dGVzID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHIgPSAoKFB5Qnl0ZXNPYmplY3QgKilieXRlcyktPm9iX3N2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXRlbSA9IEdFVF9JVEVNKCh4KSwgaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX1ZhbHVlRXJyb3IpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gYnl0ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUxpc3QoUHlPYmplY3QgKngpCit7CisgICAgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgUHlMaXN0X0dFVF9JVEVNKTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbVR1cGxlKFB5T2JqZWN0ICp4KQoreworICAgIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIFB5VHVwbGVfR0VUX0lURU0pOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKFB5T2JqZWN0ICppdCwgUHlPYmplY3QgKngpCit7CisgICAgY2hhciAqc3RyOwogICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKLQotICAgIGlmICh4ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChQeUJ5dGVzX0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgUHlfSU5DUkVGKHgpOwotICAgICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICAvKiBVc2UgdGhlIG1vZGVybiBidWZmZXIgaW50ZXJmYWNlICovCi0gICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKHgpKSB7Ci0gICAgICAgIFB5X2J1ZmZlciB2aWV3OwotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHgsICZ2aWV3LCBQeUJVRl9GVUxMX1JPKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB2aWV3Lmxlbik7Ci0gICAgICAgIGlmICghbmV3KQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBpZiAoUHlCdWZmZXJfVG9Db250aWd1b3VzKCgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXcsIHZpZXcubGVuLCAnQycpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgICBmYWlsOgotICAgICAgICBQeV9YREVDUkVGKG5ldyk7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVjayh4KSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IHVuaWNvZGUgb2JqZWN0IHRvIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOwotICAgICAgICBpZiAobmV3ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgewotICAgICAgICAgICAgUHlfc3NpemVfdCB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdCgKLSAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oeCwgaSksIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWxbaV0gPSAoY2hhcikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICB9Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOwotICAgICAgICBpZiAobmV3ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgewotICAgICAgICAgICAgUHlfc3NpemVfdCB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdCgKLSAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHgsIGkpLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgfQorICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIC8qIEZvciBpdGVyYXRvciB2ZXJzaW9uLCBjcmVhdGUgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXNpemUgYXMgbmVlZGVkICovCiAgICAgc2l6ZSA9IFB5T2JqZWN0X0xlbmd0aEhpbnQoeCwgNjQpOwogICAgIGlmIChzaXplID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIC8qIEFsbG9jYXRlIGFuIGV4dHJhIGJ5dGUgdG8gcHJldmVudCBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKCkgZnJvbQotICAgICAgIHJldHVybmluZyBhIHNoYXJlZCBlbXB0eSBieXRlcyBzdHJpbmcuIFRoaXMgcmVxdWlyZWQgYmVjYXVzZSB3ZQotICAgICAgIHdhbnQgdG8gY2FsbCBfUHlCeXRlc19SZXNpemUoKSB0aGUgcmV0dXJuZWQgb2JqZWN0LCB3aGljaCB3ZSBjYW4KLSAgICAgICBvbmx5IGRvIG9uIGJ5dGVzIG9iamVjdHMgd2l0aCByZWZjb3VudCA9PSAxLiAqLwotICAgIGlmIChzaXplID09IDApCi0gICAgICAgIHNpemUgPSAxOwotICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7Ci0gICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhc3NlcnQoUHlfUkVGQ05UKG5ldykgPT0gMSk7CiAKLSAgICAvKiBHZXQgdGhlIGl0ZXJhdG9yICovCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOwotICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICBnb3RvIGVycm9yOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKyAgICBzaXplID0gd3JpdGVyLmFsbG9jYXRlZDsKIAogICAgIC8qIFJ1biB0aGUgaXRlcmF0b3IgdG8gZXhoYXVzdGlvbiAqLwogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CkBAIC0zMzc1LDIxICszNTEzLDU4IEBACiAKICAgICAgICAgLyogQXBwZW5kIHRoZSBieXRlICovCiAgICAgICAgIGlmIChpID49IHNpemUpIHsKLSAgICAgICAgICAgIHNpemUgPSAyICogc2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZuZXcsIHNpemUpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKCZ3cml0ZXIsIHN0ciwgc2l6ZSsxKTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHNpemUgPSB3cml0ZXIuYWxsb2NhdGVkOwogICAgICAgICB9Ci0gICAgICAgICgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWxbaV0gPSAoY2hhcikgdmFsdWU7CisgICAgICAgICpzdHIrKyA9IChjaGFyKSB2YWx1ZTsKICAgICB9Ci0gICAgX1B5Qnl0ZXNfUmVzaXplKCZuZXcsIGkpOwogCi0gICAgLyogQ2xlYW4gdXAgYW5kIHJldHVybiBzdWNjZXNzICovCi0gICAgUHlfREVDUkVGKGl0KTsKLSAgICByZXR1cm4gbmV3OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgc3RyKTsKIAogICBlcnJvcjoKLSAgICBQeV9YREVDUkVGKGl0KTsKLSAgICBQeV9YREVDUkVGKG5ldyk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworUHlPYmplY3QgKgorUHlCeXRlc19Gcm9tT2JqZWN0KFB5T2JqZWN0ICp4KQoreworICAgIFB5T2JqZWN0ICppdCwgKnJlc3VsdDsKKworICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChQeUJ5dGVzX0NoZWNrRXhhY3QoeCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICByZXR1cm4geDsKKyAgICB9CisKKyAgICAvKiBVc2UgdGhlIG1vZGVybiBidWZmZXIgaW50ZXJmYWNlICovCisgICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUJ1ZmZlcih4KTsKKworICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIF9QeUJ5dGVzX0Zyb21MaXN0KHgpOworCisgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh4KSkKKyAgICAgICAgcmV0dXJuIF9QeUJ5dGVzX0Zyb21UdXBsZSh4KTsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHgpKSB7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih4KTsKKyAgICAgICAgaWYgKGl0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IF9QeUJ5dGVzX0Zyb21JdGVyYXRvcihpdCwgeCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCAnJS4yMDBzJyBvYmplY3QgdG8gYnl0ZXMiLAorICAgICAgICAgICAgICAgICB4LT5vYl90eXBlLT50cF9uYW1lKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzc0MCwzICszOTE1LDI4MiBAQAogICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpdCk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQorCisKKy8qIF9QeUJ5dGVzV3JpdGVyIEFQSSAqLworCisjaWZkZWYgTVNfV0lORE9XUworICAgLyogT24gV2luZG93cywgb3ZlcmFsbG9jYXRlIGJ5IDUwJSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDIKKyNlbHNlCisgICAvKiBPbiBMaW51eCwgb3ZlcmFsbG9jYXRlIGJ5IDI1JSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDQKKyNlbmRpZgorCit2b2lkCitfUHlCeXRlc1dyaXRlcl9Jbml0KF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpCit7CisgICAgLyogU2V0IGFsbCBhdHRyaWJ1dGVzIGJlZm9yZSBzbWFsbF9idWZmZXIgdG8gMCAqLworICAgIG1lbXNldCh3cml0ZXIsIDAsIG9mZnNldG9mKF9QeUJ5dGVzV3JpdGVyLCBzbWFsbF9idWZmZXIpKTsKKyNpZmRlZiBQeV9ERUJVRworICAgIG1lbXNldCh3cml0ZXItPnNtYWxsX2J1ZmZlciwgMHhDQiwgc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKSk7CisjZW5kaWYKK30KKwordm9pZAorX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyKQoreworICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKK30KKworUHlfTE9DQUxfSU5MSU5FKGNoYXIqKQorX1B5Qnl0ZXNXcml0ZXJfQXNTdHJpbmcoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICBpZiAod3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyKSB7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIHdyaXRlci0+c21hbGxfYnVmZmVyOworICAgIH0KKyAgICBlbHNlIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyICE9IE5VTEwpOworICAgICAgICByZXR1cm4gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICB9Cit9CisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIpCit7CisgICAgY2hhciAqc3RhcnQgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpOworICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0ciA+PSBzdGFydCk7CisgICAgYXNzZXJ0KHN0ciAtIHN0YXJ0IDw9IHdyaXRlci0+YWxsb2NhdGVkKTsKKyAgICByZXR1cm4gc3RyIC0gc3RhcnQ7Cit9CisKK1B5X0xPQ0FMX0lOTElORSh2b2lkKQorX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIpCit7CisjaWZkZWYgUHlfREVCVUcKKyAgICBjaGFyICpzdGFydCwgKmVuZDsKKworICAgIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyICE9IE5VTEwpOworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KQorICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZUFycmF5X0NoZWNrRXhhY3Qod3JpdGVyLT5idWZmZXIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2tFeGFjdCh3cml0ZXItPmJ1ZmZlcikpOworICAgICAgICBhc3NlcnQoUHlfUkVGQ05UKHdyaXRlci0+YnVmZmVyKSA9PSAxKTsKKyAgICB9CisKKyAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgIC8qIGJ5dGVhcnJheSBoYXMgaXRzIG93biBvdmVyYWxsb2NhdGlvbiBhbGdvcml0aG0sCisgICAgICAgICAgIHdyaXRlciBvdmVyYWxsb2NhdGlvbiBtdXN0IGJlIGRpc2FibGVkICovCisgICAgICAgIGFzc2VydCghd3JpdGVyLT5vdmVyYWxsb2NhdGUpOworICAgIH0KKworICAgIGFzc2VydCgwIDw9IHdyaXRlci0+YWxsb2NhdGVkKTsKKyAgICBhc3NlcnQoMCA8PSB3cml0ZXItPm1pbl9zaXplICYmIHdyaXRlci0+bWluX3NpemUgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIC8qIHRoZSBsYXN0IGJ5dGUgbXVzdCBhbHdheXMgYmUgbnVsbCAqLworICAgIHN0YXJ0ID0gX1B5Qnl0ZXNXcml0ZXJfQXNTdHJpbmcod3JpdGVyKTsKKyAgICBhc3NlcnQoc3RhcnRbd3JpdGVyLT5hbGxvY2F0ZWRdID09IDApOworCisgICAgZW5kID0gc3RhcnQgKyB3cml0ZXItPmFsbG9jYXRlZDsKKyAgICBhc3NlcnQoc3RyICE9IE5VTEwpOworICAgIGFzc2VydChzdGFydCA8PSBzdHIgJiYgc3RyIDw9IGVuZCk7CisjZW5kaWYKK30KKwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX1Jlc2l6ZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpzdHIsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZCwgcG9zOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSh3cml0ZXIsIHN0cik7CisgICAgYXNzZXJ0KHdyaXRlci0+YWxsb2NhdGVkIDwgc2l6ZSk7CisKKyAgICBhbGxvY2F0ZWQgPSBzaXplOworICAgIGlmICh3cml0ZXItPm92ZXJhbGxvY2F0ZQorICAgICAgICAmJiBhbGxvY2F0ZWQgPD0gKFBZX1NTSVpFX1RfTUFYIC0gYWxsb2NhdGVkIC8gT1ZFUkFMTE9DQVRFX0ZBQ1RPUikpIHsKKyAgICAgICAgLyogb3ZlcmFsbG9jYXRlIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgcmVhbGxvYygpICovCisgICAgICAgIGFsbG9jYXRlZCArPSBhbGxvY2F0ZWQgLyBPVkVSQUxMT0NBVEVfRkFDVE9SOworICAgIH0KKworICAgIHBvcyA9IF9QeUJ5dGVzV3JpdGVyX0dldFNpemUod3JpdGVyLCBzdHIpOworICAgIGlmICghd3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyKSB7CisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUod3JpdGVyLT5idWZmZXIsIGFsbG9jYXRlZCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIC8qIHdyaXRlci0+YWxsb2NhdGVkIGNhbiBiZSBzbWFsbGVyIHRoYW4gd3JpdGVyLT5idWZmZXItPm9iX2FsbG9jLAorICAgICAgICAgICAgICAgYnV0IHdlIGNhbm5vdCB1c2Ugb2JfYWxsb2MgYmVjYXVzZSBieXRlcyBtYXkgbmVlZCB0byBiZSBtb3ZlZAorICAgICAgICAgICAgICAgdG8gdXNlIHRoZSB3aG9sZSBidWZmZXIuIGJ5dGVhcnJheSB1c2VzIGFuIGludGVybmFsIG9wdGltaXphdGlvbgorICAgICAgICAgICAgICAgdG8gYXZvaWQgbW92aW5nIG9yIGNvcHlpbmcgYnl0ZXMgd2hlbiBieXRlcyBhcmUgcmVtb3ZlZCBhdCB0aGUKKyAgICAgICAgICAgICAgIGJlZ2lubmluZyAoZXg6IGRlbCBieXRlYXJyYXlbOjFdKS4gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJndyaXRlci0+YnVmZmVyLCBhbGxvY2F0ZWQpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGNvbnZlcnQgZnJvbSBzdGFjayBidWZmZXIgdG8gYnl0ZXMgb2JqZWN0IGJ1ZmZlciAqLworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkKKyAgICAgICAgICAgIHdyaXRlci0+YnVmZmVyID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYWxsb2NhdGVkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGFsbG9jYXRlZCk7CisgICAgICAgIGlmICh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICBpZiAocG9zICE9IDApIHsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CisgICAgICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KQorICAgICAgICAgICAgICAgIGRlc3QgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlc3QgPSBQeUJ5dGVzX0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBQeV9NRU1DUFkoZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPnNtYWxsX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBwb3MpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyID0gMDsKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICBtZW1zZXQod3JpdGVyLT5zbWFsbF9idWZmZXIsIDB4REIsIHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcikpOworI2VuZGlmCisgICAgfQorICAgIHdyaXRlci0+YWxsb2NhdGVkID0gYWxsb2NhdGVkOworCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQXNTdHJpbmcod3JpdGVyKSArIHBvczsKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICByZXR1cm4gc3RyOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKHdyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnN0ciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIFB5X3NzaXplX3QgbmV3X21pbl9zaXplOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSh3cml0ZXIsIHN0cik7CisgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICBpZiAod3JpdGVyLT5taW5fc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKHdyaXRlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuZXdfbWluX3NpemUgPSB3cml0ZXItPm1pbl9zaXplICsgc2l6ZTsKKworICAgIGlmIChuZXdfbWluX3NpemUgPiB3cml0ZXItPmFsbG9jYXRlZCkKKyAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKHdyaXRlciwgc3RyLCBuZXdfbWluX3NpemUpOworCisgICAgd3JpdGVyLT5taW5fc2l6ZSA9IG5ld19taW5fc2l6ZTsKKyAgICByZXR1cm4gc3RyOworfQorCisvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIHdyaXRlIHNpemUgYnl0ZXMuCisgICBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBidWZmZXIgZGF0YS4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIC8qIGVuc3VyZSB0aGF0IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCkgaXMgb25seSBjYWxsZWQgb25jZSAqLworICAgIGFzc2VydCh3cml0ZXItPm1pbl9zaXplID09IDAgJiYgd3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisKKyAgICB3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIgPSAxOworI2lmZGVmIFB5X0RFQlVHCisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpIC0gMTsKKyAgICAvKiBJbiBkZWJ1ZyBtb2RlLCBkb24ndCB1c2UgdGhlIGZ1bGwgc21hbGwgYnVmZmVyIGJlY2F1c2UgaXQgaXMgbGVzcworICAgICAgIGVmZmljaWVudCB0aGFuIGJ5dGVzIGFuZCBieXRlYXJyYXkgb2JqZWN0cyB0byBkZXRlY3QgYnVmZmVyIHVuZGVyZmxvdworICAgICAgIGFuZCBidWZmZXIgb3ZlcmZsb3cuIFVzZSAxMCBieXRlcyBvZiB0aGUgc21hbGwgYnVmZmVyIHRvIHRlc3QgYWxzbworICAgICAgIGNvZGUgdXNpbmcgdGhlIHNtYWxsZXIgYnVmZmVyIGluIGRlYnVnIG1vZGUuCisKKyAgICAgICBEb24ndCBtb2RpZnkgdGhlIF9QeUJ5dGVzV3JpdGVyIHN0cnVjdHVyZSAodXNlIGEgc2hvcnRlciBzbWFsbCBidWZmZXIpCisgICAgICAgaW4gZGVidWcgbW9kZSB0byBhbHNvIGJlIGFibGUgdG8gZGV0ZWN0IHN0YWNrIG92ZXJmbG93IHdoZW4gcnVubmluZworICAgICAgIHRlc3RzIGluIGRlYnVnIG1vZGUuIFRoZSBfUHlCeXRlc1dyaXRlciBpcyBsYXJnZSAobW9yZSB0aGFuIDUxMiBieXRlcyksCisgICAgICAgaWYgUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCkgaXMgbm90IHVzZWQgaW4gZGVlcCBDIGNhbGxiYWNrLCB3ZSBtYXkgaGl0IGEKKyAgICAgICBzdGFjayBvdmVyZmxvdy4gKi8KKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IFB5X01JTih3cml0ZXItPmFsbG9jYXRlZCwgMTApOworICAgIC8qIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3koKSByZXF1aXJlcyB0aGUgbGFzdCBieXRlIHRvIGJlIDAsCisgICAgICAgdG8gZGV0ZWN0IGJ1ZmZlciBvdmVyZmxvdyAqLworICAgIHdyaXRlci0+c21hbGxfYnVmZmVyW3dyaXRlci0+YWxsb2NhdGVkXSA9IDA7CisjZWxzZQorICAgIHdyaXRlci0+YWxsb2NhdGVkID0gc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKTsKKyNlbmRpZgorICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgd3JpdGVyLT5zbWFsbF9idWZmZXIsIHNpemUpOworfQorCitQeU9iamVjdCAqCitfUHlCeXRlc1dyaXRlcl9GaW5pc2goX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqc3RyKQoreworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSh3cml0ZXIsIHN0cik7CisKKyAgICBzaXplID0gX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZSh3cml0ZXIsIHN0cik7CisgICAgaWYgKHNpemUgPT0gMCAmJiAhd3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKKyAgICAgICAgLyogR2V0IHRoZSBlbXB0eSBieXRlIHN0cmluZyBzaW5nbGV0b24gKi8KKyAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICB9CisgICAgZWxzZSBpZiAod3JpdGVyLT51c2Vfc21hbGxfYnVmZmVyKSB7CisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKHdyaXRlci0+c21hbGxfYnVmZmVyLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUod3JpdGVyLT5zbWFsbF9idWZmZXIsIHNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHQgPSB3cml0ZXItPmJ1ZmZlcjsKKyAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworCisgICAgICAgIGlmIChzaXplICE9IHdyaXRlci0+YWxsb2NhdGVkKSB7CisgICAgICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KSB7CisgICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZShyZXN1bHQsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZXN1bHQgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ5dGVzLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgY2hhciAqc3RyID0gKGNoYXIgKilwdHI7CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUHlfTUVNQ1BZKHN0ciwgYnl0ZXMsIHNpemUpOworICAgIHN0ciArPSBzaXplOworCisgICAgcmV0dXJuIHN0cjsKK30KZGlmZiAtLWdpdCBhL09iamVjdHMvY29kZW9iamVjdC5jIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKaW5kZXggOTY0YWU2Mi4uZjA4OWY3NSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKQEAgLTY5NCw3ICs2OTQsOCBAQAogICAgICAgICBhZGRyICs9ICpwKys7CiAgICAgICAgIGlmIChhZGRyID4gYWRkcnEpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICBsaW5lICs9IChzaWduZWQgY2hhcikqcDsKKyAgICAgICAgcCsrOwogICAgIH0KICAgICByZXR1cm4gbGluZTsKIH0KQEAgLTcyOSwxNyArNzMwLDE5IEBACiAgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgIGlmICgqcCkKKyAgICAgICAgaWYgKChzaWduZWQgY2hhcikqcCkKICAgICAgICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSBhZGRyOwotICAgICAgICBsaW5lICs9ICpwKys7CisgICAgICAgIGxpbmUgKz0gKHNpZ25lZCBjaGFyKSpwOworICAgICAgICBwKys7CiAgICAgICAgIC0tc2l6ZTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CiAgICAgICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgICAgICBpZiAoKnArKykKKyAgICAgICAgICAgIGlmICgoc2lnbmVkIGNoYXIpKnApCiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CiAgICAgICAgIH0KICAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IGFkZHI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCmluZGV4IGFjMjc1MmUuLjgwZmM2NjIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTIyLDcgKzIyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNoYXIgKmZvcm1hdCkKK2Rlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNvbnN0IGNoYXIgKmZvcm1hdCkKIHsKICAgICBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CiAgICAgaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IGQ3NzQ1ODYuLjMxYzQ1ZWYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogICAgIGFzc2VydChzaXplID49IFB5RGljdF9NSU5TSVpFX1NQTElUKTsKICAgICBhc3NlcnQoSVNfUE9XRVJfT0ZfMihzaXplKSk7Ci0gICAgZGsgPSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpICsKKyAgICBkayA9IFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlEaWN0S2V5c09iamVjdCkgKwogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeURpY3RLZXlFbnRyeSkgKiAoc2l6ZS0xKSk7CiAgICAgaWYgKGRrID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgICAgICBQeV9YREVDUkVGKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgUHlfWERFQ1JFRihlbnRyaWVzW2ldLm1lX3ZhbHVlKTsKICAgICB9Ci0gICAgUHlNZW1fRlJFRShrZXlzKTsKKyAgICBQeU9iamVjdF9GUkVFKGtleXMpOwogfQogCiAjZGVmaW5lIG5ld192YWx1ZXMoc2l6ZSkgUHlNZW1fTkVXKFB5T2JqZWN0ICosIHNpemUpCkBAIC05NjQsNyArOTY0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhc3NlcnQob2xka2V5cy0+ZGtfcmVmY250ID09IDEpOwotICAgICAgICBES19ERUJVR19ERUNSRUYgUHlNZW1fRlJFRShvbGRrZXlzKTsKKyAgICAgICAgREtfREVCVUdfREVDUkVGIFB5T2JqZWN0X0ZSRUUob2xka2V5cyk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTE2MywzOSArMTE2Myw0MiBAQAogICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcihkcCwga3YpOwogfQogCi0vKiBGYXN0IHZlcnNpb24gb2YgZ2xvYmFsIHZhbHVlIGxvb2t1cC4KKy8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwIChMT0FEX0dMT0JBTCkuCiAgKiBMb29rdXAgaW4gZ2xvYmFscywgdGhlbiBidWlsdGlucy4KKyAqCisgKiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkIChleDogY29tcHV0aW5nIHRoZQorICoga2V5IGhhc2ggZmFpbGVkLCBrZXkgY29tcGFyaXNvbiBmYWlsZWQsIC4uLikuIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lc24ndAorICogZXhpc3QuIFJldHVybiB0aGUgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMuCiAgKi8KIFB5T2JqZWN0ICoKIF9QeURpY3RfTG9hZEdsb2JhbChQeURpY3RPYmplY3QgKmdsb2JhbHMsIFB5RGljdE9iamVjdCAqYnVpbHRpbnMsIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgUHlPYmplY3QgKng7Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpIHsKLSAgICAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKWtleSktPmhhc2g7Ci0gICAgICAgIGlmIChoYXNoICE9IC0xKSB7Ci0gICAgICAgICAgICBQeURpY3RLZXlFbnRyeSAqZTsKLSAgICAgICAgICAgIGUgPSBnbG9iYWxzLT5tYV9rZXlzLT5ka19sb29rdXAoZ2xvYmFscywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICAgICAgZSA9IGJ1aWx0aW5zLT5tYV9rZXlzLT5ka19sb29rdXAoYnVpbHRpbnMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCA9ICp2YWx1ZV9hZGRyOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KKyAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBQeURpY3RLZXlFbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHggPSBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcigoUHlPYmplY3QgKilnbG9iYWxzLCBrZXkpOwotICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiB4OwotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorCisgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KKyAgICBlbnRyeSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWJ1aWx0aW5zLCBrZXkpOworICAgIHZhbHVlID0gKnZhbHVlX2FkZHI7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIC8qIG5hbWVzcGFjZSAyOiBidWlsdGlucyAqLworICAgIGVudHJ5ID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAqdmFsdWVfYWRkcjsKIH0KIAogLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKQEAgLTE5MjAsNyArMTkyMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKK2RpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjb25zdCBjaGFyICptZXRobmFtZSkKIHsKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggZDAzYWFkYS4uMmM3Njg4YyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTU5LDE1ICs1OSwxMSBAQAogc3RhdGljIGludAogQmFzZUV4Y2VwdGlvbl9pbml0KFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICB0bXAgPSBzZWxmLT5hcmdzOwotICAgIHNlbGYtPmFyZ3MgPSBhcmdzOwotICAgIFB5X0lOQ1JFRihzZWxmLT5hcmdzKTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIFB5X1hTRVRSRUYoc2VsZi0+YXJncywgYXJncyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTMyOCwxMSArMzI0LDEwIEBACiAKIC8qIFN0ZWFscyBhIHJlZmVyZW5jZSB0byBjYXVzZSAqLwogdm9pZAotUHlFeGNlcHRpb25fU2V0Q2F1c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjYXVzZSkgewotICAgIFB5T2JqZWN0ICpvbGRfY2F1c2UgPSAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZTsKLSAgICAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZSA9IGNhdXNlOworUHlFeGNlcHRpb25fU2V0Q2F1c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjYXVzZSkKK3sKICAgICAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5zdXBwcmVzc19jb250ZXh0ID0gMTsKLSAgICBQeV9YREVDUkVGKG9sZF9jYXVzZSk7CisgICAgUHlfWFNFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZSwgY2F1c2UpOwogfQogCiBQeU9iamVjdCAqCkBAIC0zNDQsMTAgKzMzOSw5IEBACiAKIC8qIFN0ZWFscyBhIHJlZmVyZW5jZSB0byBjb250ZXh0ICovCiB2b2lkCi1QeUV4Y2VwdGlvbl9TZXRDb250ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY29udGV4dCkgewotICAgIFB5T2JqZWN0ICpvbGRfY29udGV4dCA9ICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNvbnRleHQ7Ci0gICAgKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0gICAgUHlfWERFQ1JFRihvbGRfY29udGV4dCk7CitQeUV4Y2VwdGlvbl9TZXRDb250ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY29udGV4dCkKK3sKKyAgICBQeV9YU0VUUkVGKCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNvbnRleHQsIGNvbnRleHQpOwogfQogCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCBkOTJiZWMzLi5lYjYwNjU5IDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0xNDUxLDI5ICsxNDUxLDIzIEBACiAgICAgaW50IGV4cG9uZW50OwogICAgIGludCBpOwogCi0gICAgUHlPYmplY3QgKnByZXY7CiAgICAgUHlPYmplY3QgKnB5X2V4cG9uZW50ID0gTlVMTDsKICAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKICAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXN1bHRfcGFpciA9IE5VTEw7CiAgICAgUHlOdW1iZXJNZXRob2RzICpsb25nX21ldGhvZHMgPSBQeUxvbmdfVHlwZS50cF9hc19udW1iZXI7CiAKLSNkZWZpbmUgSU5QTEFDRV9VUERBVEUob2JqLCBjYWxsKSBcCi0gICAgcHJldiA9IG9iajsgXAotICAgIG9iaiA9IGNhbGw7IFwKLSAgICBQeV9ERUNSRUYocHJldik7IFwKLQogICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHNlbGYpOwogCiAgICAgaWYgKFB5X0lTX0lORklOSVRZKHNlbGYpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgaW5maW5pdHkgdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKLSAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoUHlfSVNfTkFOKHNlbGYpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhc3MgTmFOIHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXNfaW50ZWdlcl9yYXRpbyIsIGdvdG8gZXJyb3IpOwpAQCAtMTQ4OSwyOSArMTQ4MywzMSBAQAogICAgICAgIHRvIGJlIHRydW5jYXRlZCBieSBQeUxvbmdfRnJvbURvdWJsZSgpLiAqLwogCiAgICAgbnVtZXJhdG9yID0gUHlMb25nX0Zyb21Eb3VibGUoZmxvYXRfcGFydCk7Ci0gICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBweV9leHBvbmVudCA9IFB5TG9uZ19Gcm9tTG9uZyhQeV9BQlMoZXhwb25lbnQpKTsKKyAgICBpZiAocHlfZXhwb25lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAogICAgIC8qIGZvbGQgaW4gMioqZXhwb25lbnQgKi8KLSAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKLSAgICBweV9leHBvbmVudCA9IFB5TG9uZ19Gcm9tTG9uZyhsYWJzKChsb25nKWV4cG9uZW50KSk7Ci0gICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0gICAgSU5QTEFDRV9VUERBVEUocHlfZXhwb25lbnQsCi0gICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQoZGVub21pbmF0b3IsIHB5X2V4cG9uZW50KSk7Ci0gICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAgICAgaWYgKGV4cG9uZW50ID4gMCkgewotICAgICAgICBJTlBMQUNFX1VQREFURShudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOwotICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX2xzaGlmdChudW1lcmF0b3IsIHB5X2V4cG9uZW50KSk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBQeV9ERUNSRUYoZGVub21pbmF0b3IpOwotICAgICAgICBkZW5vbWluYXRvciA9IHB5X2V4cG9uZW50OwotICAgICAgICBweV9leHBvbmVudCA9IE5VTEw7CisgICAgICAgIFB5X1NFVFJFRihkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOworICAgICAgICBpZiAoZGVub21pbmF0b3IgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgcmVzdWx0X3BhaXIgPSBQeVR1cGxlX1BhY2soMiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CiAKLSN1bmRlZiBJTlBMQUNFX1VQREFURQogZXJyb3I6CiAgICAgUHlfWERFQ1JFRihweV9leHBvbmVudCk7CiAgICAgUHlfWERFQ1JFRihkZW5vbWluYXRvcik7CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggYmRmMDZkYi4uYTRhODYyYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgICAgIG5ld19sYXN0aSA9IC0xOwogICAgICAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxub3RhYl9sZW47IG9mZnNldCArPSAyKSB7CiAgICAgICAgICAgICBhZGRyICs9IGxub3RhYltvZmZzZXRdOwotICAgICAgICAgICAgbGluZSArPSBsbm90YWJbb2Zmc2V0KzFdOworICAgICAgICAgICAgbGluZSArPSAoc2lnbmVkIGNoYXIpbG5vdGFiW29mZnNldCsxXTsKICAgICAgICAgICAgIGlmIChsaW5lID49IG5ld19saW5lbm8pIHsKICAgICAgICAgICAgICAgICBuZXdfbGFzdGkgPSBhZGRyOwogICAgICAgICAgICAgICAgIG5ld19saW5lbm8gPSBsaW5lOwpAQCAtMzQ5LDE1ICszNDksMTEgQEAKIHN0YXRpYyBpbnQKIGZyYW1lX3NldHRyYWNlKFB5RnJhbWVPYmplY3QgKmYsIFB5T2JqZWN0KiB2LCB2b2lkICpjbG9zdXJlKQogewotICAgIFB5T2JqZWN0KiBvbGRfdmFsdWU7Ci0KICAgICAvKiBXZSByZWx5IG9uIGZfbGluZW5vIGJlaW5nIGFjY3VyYXRlIHdoZW4gZl90cmFjZSBpcyBzZXQuICovCiAgICAgZi0+Zl9saW5lbm8gPSBQeUZyYW1lX0dldExpbmVOdW1iZXIoZik7CiAKLSAgICBvbGRfdmFsdWUgPSBmLT5mX3RyYWNlOwogICAgIFB5X1hJTkNSRUYodik7Ci0gICAgZi0+Zl90cmFjZSA9IHY7Ci0gICAgUHlfWERFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X1hTRVRSRUYoZi0+Zl90cmFjZSwgdik7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZnVuY29iamVjdC5jIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKaW5kZXggZTZjMzI3ZC4uMjYxYzE2ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mdW5jb2JqZWN0LmMKQEAgLTI0OSw3ICsyNDksNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfY29kZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7CiAgICAgUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7CiAKICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19jb2RlIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwpAQCAtMjcwLDEwICsyNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgbmNsb3N1cmUsIG5mcmVlKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19jb2RlOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfY29kZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfY29kZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yODcsOCArMjg0LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X25hbWUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfbmFtZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKICAgICAgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewpAQCAtMjk2LDEwICsyOTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIl9fbmFtZV9fIG11c3QgYmUgc2V0IHRvIGEgc3RyaW5nIG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX25hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19uYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19uYW1lLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMxMyw4ICszMDYsNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfcXVhbG5hbWUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLl9fcXVhbG5hbWVfXyBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKICAgICAgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KICAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewpAQCAtMzIyLDEwICszMTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIl9fcXVhbG5hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19xdWFsbmFtZTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX3F1YWxuYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19xdWFsbmFtZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNDMsOCArMzMyLDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2RlZmF1bHRzKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIExlZ2FsIHRvIGRlbCBmLmZ1bmNfZGVmYXVsdHMuCiAgICAgICogQ2FuIG9ubHkgc2V0IGZ1bmNfZGVmYXVsdHMgdG8gTlVMTCBvciBhIHR1cGxlLiAqLwogICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQpAQCAtMzU0LDEwICszNDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIl9fZGVmYXVsdHNfXyBtdXN0IGJlIHNldCB0byBhIHR1cGxlIG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX2RlZmF1bHRzOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2RlZmF1bHRzID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfZGVmYXVsdHMsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzc1LDggKzM2MCw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9rd2RlZmF1bHRzKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQogICAgICAgICB2YWx1ZSA9IE5VTEw7CiAgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19rd2RlZmF1bHRzLgpAQCAtMzg2LDEwICszNjksOCBAQAogICAgICAgICAgICAgIl9fa3dkZWZhdWx0c19fIG11c3QgYmUgc2V0IHRvIGEgZGljdCBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19rd2RlZmF1bHRzOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2t3ZGVmYXVsdHMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19rd2RlZmF1bHRzLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTQwOCw4ICszODksNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfYW5ub3RhdGlvbnMoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCiAgICAgICAgIHZhbHVlID0gTlVMTDsKICAgICAvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2Fubm90YXRpb25zLgpAQCAtNDIwLDEwICszOTksOCBAQAogICAgICAgICAgICAgIl9fYW5ub3RhdGlvbnNfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Qgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfYW5ub3RhdGlvbnM7CiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfYW5ub3RhdGlvbnMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+ZnVuY19hbm5vdGF0aW9ucywgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL2dlbm9iamVjdC5jIGIvT2JqZWN0cy9nZW5vYmplY3QuYwppbmRleCBmNzRkMDQ0Li5jOTRhNmVkIDEwMDY0NAotLS0gYS9PYmplY3RzL2dlbm9iamVjdC5jCisrKyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICAgICAgLyogUG9wIHRoZSBleGNlcHRpb24gYmVmb3JlIGlzc3VpbmcgYSB3YXJuaW5nLiAqLwogICAgICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKIAotICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0b3IgJyUuNTBTJyByYWlzZWQgU3RvcEl0ZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tPmdpX3F1YWxuYW1lKSkgewogICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgd2FzIGNvbnZlcnRlZCB0byBhbiBlcnJvci4gKi8KQEAgLTUxOSw4ICs1MTksNiBAQAogc3RhdGljIGludAogZ2VuX3NldF9uYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5naV9uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwogICAgICAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwogICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CkBAIC01MjgsMTAgKzUyNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX25hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+Z2lfbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmdpX25hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTQ1LDggKzU0MSw2IEBACiBzdGF0aWMgaW50CiBnZW5fc2V0X3F1YWxuYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5fX3F1YWxuYW1lX18gb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTU1NCwxMCArNTQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX3F1YWxuYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmdpX3F1YWxuYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+Z2lfcXVhbG5hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0b2JqZWN0LmMgYi9PYmplY3RzL2xpc3RvYmplY3QuYwppbmRleCBkNjg4MTc5Li42ZTJkMDI2IDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3RvYmplY3QuYworKysgYi9PYmplY3RzL2xpc3RvYmplY3QuYwpAQCAtMjE2LDcgKzIxNiw2IEBACiBQeUxpc3RfU2V0SXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwKICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdpdGVtKQogewotICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogICAgIFB5T2JqZWN0ICoqcDsKICAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKICAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKQEAgLTIzMCw5ICsyMjksNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHAgPSAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLSAgICBvbGRpdGVtID0gKnA7Ci0gICAgKnAgPSBuZXdpdGVtOwotICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgUHlfWFNFVFJFRigqcCwgbmV3aXRlbSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI1MSw3ICsyNDgsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCisgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAod2hlcmUgPCAwKSB7CkBAIC0yOTEsNyArMjg4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtNzExLDcgKzcwOCw3IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwID0gc2l6ZTsKQEAgLTczMCw3ICs3MjcsNiBAQAogc3RhdGljIGludAogbGlzdF9hc3NfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0gICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKICAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKQEAgLTczOSw5ICs3MzUsNyBAQAogICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBsaXN0X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOwogICAgIFB5X0lOQ1JFRih2KTsKLSAgICBvbGRfdmFsdWUgPSBhLT5vYl9pdGVtW2ldOwotICAgIGEtPm9iX2l0ZW1baV0gPSB2OwotICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X1NFVFJFRihhLT5vYl9pdGVtW2ldLCB2KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODA0LDcgKzc5OCw3IEBACiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgfQogICAgICAgICBtID0gUHlfU0laRShzZWxmKTsKLSAgICAgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgeworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTgzMiw3ICs4MjYsNyBAQAogCiAgICAgLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLwogICAgIG4gPSBQeU9iamVjdF9MZW5ndGhIaW50KGIsIDgpOwotICAgIGlmIChuID09IC0xKSB7CisgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTg0MCw3ICs4MzQsNyBAQAogICAgIG1uID0gbSArIG47CiAgICAgaWYgKG1uID49IG0pIHsKICAgICAgICAgLyogTWFrZSByb29tLiAqLwotICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pID09IC0xKQorICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIC8qIE1ha2UgdGhlIGxpc3Qgc2FuZSBhZ2Fpbi4gKi8KICAgICAgICAgUHlfU0laRShzZWxmKSA9IG07CmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3Rzb3J0LnR4dCBiL09iamVjdHMvbGlzdHNvcnQudHh0CmluZGV4IDgzMmU0ZjIuLmZlZjk4MmYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdHNvcnQudHh0CisrKyBiL09iamVjdHMvbGlzdHNvcnQudHh0CkBAIC00ODYsNyArNDg2LDcgQEAKIEkgZmlyc3QgbGVhcm5lZCBhYm91dCB0aGUgZ2FsbG9waW5nIHN0cmF0ZWd5IGluIGEgcmVsYXRlZCBjb250ZXh0OyBzZWU6CiAKICAgICAiQWRhcHRpdmUgU2V0IEludGVyc2VjdGlvbnMsIFVuaW9ucywgYW5kIERpZmZlcmVuY2VzIiAoMjAwMCkKLSAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBM83Blei1PcnRpeiwgSi4gSWFuIE11bnJvCisgICAgRXJpayBELiBEZW1haW5lLCBBbGVqYW5kcm8gTMOzcGV6LU9ydGl6LCBKLiBJYW4gTXVucm8KIAogYW5kIGl0cyBmb2xsb3d1cChzKS4gIEFuIGVhcmxpZXIgcGFwZXIgY2FsbGVkIHRoZSBzYW1lIHN0cmF0ZWd5CiAiZXhwb25lbnRpYWwgc2VhcmNoIjoKZGlmZiAtLWdpdCBhL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dCBiL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dAppbmRleCBkMjQ3ZWRkLi41MTUzNzU3IDEwMDY0NAotLS0gYS9PYmplY3RzL2xub3RhYl9ub3Rlcy50eHQKKysrIGIvT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0CkBAIC0xMiw0MiArMTIsNDcgQEAKICAgICAgICAgMAkJICAgIDEKICAgICAgICAgNgkJICAgIDIKICAgICAgICA1MAkJICAgIDcKLSAgICAgIDM1MCAgICAgICAgICAgICAgICAgMzA3Ci0gICAgICAzNjEgICAgICAgICAgICAgICAgIDMwOAorICAgICAgMzUwICAgICAgICAgICAgICAgICAyMDcKKyAgICAgIDM2MSAgICAgICAgICAgICAgICAgMjA4CiAKIEluc3RlYWQgb2Ygc3RvcmluZyB0aGVzZSBudW1iZXJzIGxpdGVyYWxseSwgd2UgY29tcHJlc3MgdGhlIGxpc3QgYnkgc3RvcmluZyBvbmx5Ci10aGUgaW5jcmVtZW50cyBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQuICBDb25jZXB0dWFsbHksIHRoZSBzdG9yZWQgbGlzdCBtaWdodAordGhlIGRpZmZlcmVuY2UgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LiAgQ29uY2VwdHVhbGx5LCB0aGUgc3RvcmVkIGxpc3QgbWlnaHQKIGxvb2sgbGlrZToKIAotICAgIDAsIDEsICA2LCAxLCAgNDQsIDUsICAzMDAsIDMwMCwgIDExLCAxCisgICAgMCwgMSwgIDYsIDEsICA0NCwgNSwgIDMwMCwgMjAwLCAgMTEsIDEKIAotVGhlIGFib3ZlIGRvZXNuJ3QgcmVhbGx5IHdvcmssIGJ1dCBpdCdzIGEgc3RhcnQuIE5vdGUgdGhhdCBhbiB1bnNpZ25lZCBieXRlCi1jYW4ndCBob2xkIG5lZ2F0aXZlIHZhbHVlcywgb3IgdmFsdWVzIGxhcmdlciB0aGFuIDI1NSwgYW5kIHRoZSBhYm92ZSBleGFtcGxlCi1jb250YWlucyB0d28gc3VjaCB2YWx1ZXMuIFNvIHdlIG1ha2UgdHdvIHR3ZWFrczoKK1RoZSBhYm92ZSBkb2Vzbid0IHJlYWxseSB3b3JrLCBidXQgaXQncyBhIHN0YXJ0LiBBbiB1bnNpZ25lZCBieXRlIChieXRlIGNvZGUKK29mZnNldCkgY2FuJ3QgaG9sZCBuZWdhdGl2ZSB2YWx1ZXMsIG9yIHZhbHVlcyBsYXJnZXIgdGhhbiAyNTUsIGEgc2lnbmVkIGJ5dGUKKyhsaW5lIG51bWJlcikgY2FuJ3QgaG9sZCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMTI3IG9yIGxlc3MgdGhhbiAtMTI4LCBhbmQgdGhlCithYm92ZSBleGFtcGxlIGNvbnRhaW5zIHR3byBzdWNoIHZhbHVlcy4gU28gd2UgbWFrZSB0d28gdHdlYWtzOgogCi0gKGEpIHRoZXJlJ3MgYSBkZWVwIGFzc3VtcHRpb24gdGhhdCBieXRlIGNvZGUgb2Zmc2V0cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZwotIGxpbmUgI3MgYm90aCBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LCBhbmQKLSAoYikgaWYgYXQgbGVhc3Qgb25lIGNvbHVtbiBqdW1wcyBieSBtb3JlIHRoYW4gMjU1IGZyb20gb25lIHJvdyB0byB0aGUgbmV4dCwKLSBtb3JlIHRoYW4gb25lIHBhaXIgaXMgd3JpdHRlbiB0byB0aGUgdGFibGUuIEluIGNhc2UgI2IsIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLSBmcm9tIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGxhdGVyIGhvdyBtYW55IHdlcmUgd3JpdHRlbi4gIFRoYXQncyB0aGUgZGVsaWNhdGUKLSBwYXJ0LiAgQSB1c2VyIG9mIGNvX2xub3RhYiBkZXNpcmluZyB0byBmaW5kIHRoZSBzb3VyY2UgbGluZSBudW1iZXIKLSBjb3JyZXNwb25kaW5nIHRvIGEgYnl0ZWNvZGUgYWRkcmVzcyBBIHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzCisgKGEpIHRoZXJlJ3MgYSBkZWVwIGFzc3VtcHRpb24gdGhhdCBieXRlIGNvZGUgb2Zmc2V0cyBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LAorIGFuZAorIChiKSBpZiBieXRlIGNvZGUgb2Zmc2V0IGp1bXBzIGJ5IG1vcmUgdGhhbiAyNTUgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LCBvciBpZgorIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyIGp1bXBzIGJ5IG1vcmUgdGhhbiAxMjcgb3IgbGVzcyB0aGFuIC0xMjggZnJvbSBvbmUgcm93CisgdG8gdGhlIG5leHQsIG1vcmUgdGhhbiBvbmUgcGFpciBpcyB3cml0dGVuIHRvIHRoZSB0YWJsZS4gSW4gY2FzZSAjYiwKKyB0aGVyZSdzIG5vIHdheSB0byBrbm93IGZyb20gbG9va2luZyBhdCB0aGUgdGFibGUgbGF0ZXIgaG93IG1hbnkgd2VyZSB3cml0dGVuLgorIFRoYXQncyB0aGUgZGVsaWNhdGUgcGFydC4gIEEgdXNlciBvZiBjb19sbm90YWIgZGVzaXJpbmcgdG8gZmluZCB0aGUgc291cmNlCisgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byBhIGJ5dGVjb2RlIGFkZHJlc3MgQSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UKKyB0aGlzOgogCiAgICAgbGluZW5vID0gYWRkciA9IDAKICAgICBmb3IgYWRkcl9pbmNyLCBsaW5lX2luY3IgaW4gY29fbG5vdGFiOgogICAgICAgICBhZGRyICs9IGFkZHJfaW5jcgogICAgICAgICBpZiBhZGRyID4gQToKICAgICAgICAgICAgIHJldHVybiBsaW5lbm8KKyAgICAgICAgaWYgbGluZV9pbmNyID49IDB4ODA6CisgICAgICAgICAgICBsaW5lX2luY3IgLT0gMHgxMDAKICAgICAgICAgbGluZW5vICs9IGxpbmVfaW5jcgogCiAoSW4gQywgdGhpcyBpcyBpbXBsZW1lbnRlZCBieSBQeUNvZGVfQWRkcjJMaW5lKCkuKSAgSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywKIHdoZW4gdGhlIGFkZHIgZmllbGQgaW5jcmVtZW50cyBieSBtb3JlIHRoYW4gMjU1LCB0aGUgbGluZSAjIGluY3JlbWVudCBpbiBlYWNoCiBwYWlyIGdlbmVyYXRlZCBtdXN0IGJlIDAgdW50aWwgdGhlIHJlbWFpbmluZyBhZGRyIGluY3JlbWVudCBpcyA8IDI1Ni4gIFNvLCBpbgogdGhlIGV4YW1wbGUgYWJvdmUsIGFzc2VtYmxlX2xub3RhYiBpbiBjb21waWxlLmMgc2hvdWxkIG5vdCAoYXMgd2FzIGFjdHVhbGx5IGRvbmUKLXVudGlsIDIuMikgZXhwYW5kIDMwMCwgMzAwIHRvCit1bnRpbCAyLjIpIGV4cGFuZCAzMDAsIDIwMCB0bwogICAgIDI1NSwgMjU1LCA0NSwgNDUsCiBidXQgdG8KLSAgICAyNTUsIDAsIDQ1LCAyNTUsIDAsIDQ1LgorICAgIDI1NSwgMCwgNDUsIDEyOCwgMCwgNzIuCiAKIFRoZSBhYm92ZSBpcyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IGxpbmUgbnVtYmVycyBmb3IgdHJhY2ViYWNrcywgYnV0IG5vdCBmb3IKIGxpbmUgdHJhY2luZy4gIFRyYWNpbmcgaXMgaGFuZGxlZCBieSBQeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKCkgaW4gY29kZW9iamVjdC5jCkBAIC05MCwxNiArOTUsMTYgQEAKICAgICAgICAgICAgICAgNiBQT1BfSlVNUF9JRl9GQUxTRSAgICAgICAxNwogCiAgIDMgICAgICAgICAgIDkgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgMTIgUFJJTlRfSVRFTSAgICAgICAgICAKKyAgICAgICAgICAgICAxMiBQUklOVF9JVEVNCiAKLSAgNCAgICAgICAgICAxMyBCUkVBS19MT09QICAgICAgICAgIAorICA0ICAgICAgICAgIDEzIEJSRUFLX0xPT1AKICAgICAgICAgICAgICAxNCBKVU1QX0FCU09MVVRFICAgICAgICAgICAgMwotICAgICAgICA+PiAgIDE3IFBPUF9CTE9DSyAgICAgICAgICAgCisgICAgICAgID4+ICAgMTcgUE9QX0JMT0NLCiAKICAgNiAgICAgICAgICAxOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKLSAgICAgICAgICAgICAyMSBQUklOVF9JVEVNICAgICAgICAgIAorICAgICAgICAgICAgIDIxIFBSSU5UX0lURU0KICAgICAgICAgPj4gICAyMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAyNSBSRVRVUk5fVkFMVUUgICAgICAgIAorICAgICAgICAgICAgIDI1IFJFVFVSTl9WQUxVRQogCiBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gdGhlIFBPUF9CTE9DSyBpbnN0cnVjdGlvbiBhdCBvZmZzZXQgMTcKIGFuZCB0aGUgY29fbG5vdGFiIHdpbGwgY2xhaW0gdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvIGxpbmUgNCwgd2hpY2ggaXMgd3JvbmcuCmRpZmYgLS1naXQgYS9PYmplY3RzL2xvbmdvYmplY3QuYyBiL09iamVjdHMvbG9uZ29iamVjdC5jCmluZGV4IGQ4MjFlNGIuLjcwZDhjZmMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG9uZ29iamVjdC5jCisrKyBiL09iamVjdHMvbG9uZ29iamVjdC5jCkBAIC0xNTgyLDEwICsxNTgyLDEyIEBACiBzdGF0aWMgaW50CiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKFB5T2JqZWN0ICphYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyICpieXRlc193cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipieXRlc19zdHIpCiB7CiAgICAgUHlMb25nT2JqZWN0ICpzY3JhdGNoLCAqYTsKLSAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpzdHIgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc2l6ZSwgc3RybGVuLCBzaXplX2EsIGksIGo7CiAgICAgZGlnaXQgKnBvdXQsICpwaW4sIHJlbSwgdGVucG93OwogICAgIGludCBuZWdhdGl2ZTsKQEAgLTE2NjIsNyArMTY2NCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGtpbmQgPSB3cml0ZXItPmtpbmQ7Ci0gICAgICAgIHN0ciA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAqYnl0ZXNfc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShieXRlc193cml0ZXIsICpieXRlc19zdHIsIHN0cmxlbik7CisgICAgICAgIGlmICgqYnl0ZXNfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgc3RyID0gUHlVbmljb2RlX05ldyhzdHJsZW4sICc5Jyk7CkBAIC0xNjczLDEzICsxNjgxLDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CiAgICAgfQogCi0jZGVmaW5lIFdSSVRFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAvKiBwb3V0WzBdIHRocm91Z2ggcG91dFtzaXplLTJdIGNvbnRyaWJ1dGUgZXhhY3RseSAgICAgICAgICAgIFwKICAgICAgICAgICAgX1B5TG9uZ19ERUNJTUFMX1NISUZUIGRpZ2l0cyBlYWNoICovICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZSAtIDE7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTY5OSw2ICsxNzAyLDE2IEBACiAgICAgICAgIC8qIGFuZCBzaWduICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAobmVnYXRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICotLXAgPSAnLSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUklURV9ESUdJVFMocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIGNoZWNrIHdlJ3ZlIGNvdW50ZWQgY29ycmVjdGx5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3MDgsMjUgKzE3MjEsMzQgQEAKICAgICB9IHdoaWxlICgwKQogCiAgICAgLyogZmlsbCB0aGUgc3RyaW5nIHJpZ2h0LXRvLWxlZnQgKi8KLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgeworICAgIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgY2hhciAqcCA9ICpieXRlc19zdHIgKyBzdHJsZW47CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgIHdyaXRlci0+cG9zICs9IHN0cmxlbjsKICAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICgqYnl0ZXNfc3RyKSArPSBzdHJsZW47CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHN0ciwgMSkpOwogICAgICAgICAqcF9vdXRwdXQgPSAoUHlPYmplY3QgKilzdHI7CkBAIC0xNzM4LDcgKzE3NjAsNyBAQAogbG9uZ190b19kZWNpbWFsX3N0cmluZyhQeU9iamVjdCAqYWEpCiB7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgaWYgKGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwoYWEsICZ2LCBOVUxMKSA9PSAtMSkKKyAgICBpZiAobG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChhYSwgJnYsIE5VTEwsIE5VTEwsIE5VTEwpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdjsKIH0KQEAgLTE3NTAsMTAgKzE3NzIsMTEgQEAKIAogc3RhdGljIGludAogbG9uZ19mb3JtYXRfYmluYXJ5KFB5T2JqZWN0ICphYSwgaW50IGJhc2UsIGludCBhbHRlcm5hdGUsCi0gICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9vdXRwdXQsIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqYnl0ZXNfd3JpdGVyLCBjaGFyICoqYnl0ZXNfc3RyKQogewogICAgIFB5TG9uZ09iamVjdCAqYSA9IChQeUxvbmdPYmplY3QgKilhYTsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzejsKICAgICBQeV9zc2l6ZV90IHNpemVfYTsKICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CkBAIC0xODEwLDcgKzE4MzMsMTEgQEAKICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN6LCAneCcpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBraW5kID0gd3JpdGVyLT5raW5kOwotICAgICAgICB2ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICpieXRlc19zdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKGJ5dGVzX3dyaXRlciwgKmJ5dGVzX3N0ciwgc3opOworICAgICAgICBpZiAoKmJ5dGVzX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdiA9IFB5VW5pY29kZV9OZXcoc3osICd4Jyk7CkBAIC0xODE5LDEzICsxODQ2LDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHYpOwogICAgIH0KIAotI2RlZmluZSBXUklURV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCi0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChzaXplX2EgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJzAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xODYwLDMwICsxODgyLDUwIEBACiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChuZWdhdGl2ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJy0nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBhc3NlcnQocCA9PSAoKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zKSk7IFwKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFzc2VydChwID09IChUWVBFKilQeVVuaWNvZGVfREFUQSh2KSk7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCi0gICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKKyAgICBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgIGNoYXIgKnAgPSAqYnl0ZXNfc3RyICsgc3o7CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIGlmICh3cml0ZXIpIHsKICAgICAgICAgd3JpdGVyLT5wb3MgKz0gc3o7CiAgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAoKmJ5dGVzX3N0cikgKz0gc3o7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHYsIDEpKTsKICAgICAgICAgKnBfb3V0cHV0ID0gdjsKQEAgLTE4OTcsOSArMTkzOSw5IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBpbnQgZXJyOwogICAgIGlmIChiYXNlID09IDEwKQotICAgICAgICBlcnIgPSBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgJnN0ciwgTlVMTCk7CisgICAgICAgIGVyciA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBlbHNlCi0gICAgICAgIGVyciA9IGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIDEsICZzdHIsIE5VTEwpOworICAgICAgICBlcnIgPSBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCAxLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoZXJyID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gc3RyOwpAQCAtMTkxMSw5ICsxOTUzLDMxIEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSwgaW50IGFsdGVybmF0ZSkKIHsKICAgICBpZiAoYmFzZSA9PSAxMCkKLSAgICAgICAgcmV0dXJuIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosIE5VTEwsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Cit9CisKK2NoYXIqCitfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGludCBhbHRlcm5hdGUpCit7CisgICAgY2hhciAqc3RyMjsKKyAgICBpbnQgcmVzOworICAgIHN0cjIgPSBzdHI7CisgICAgaWYgKGJhc2UgPT0gMTApCisgICAgICAgIHJlcyA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwgJnN0cjIpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCAmc3RyMik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChzdHIyICE9IE5VTEwpOworICAgIHJldHVybiBzdHIyOwogfQogCiAvKiBUYWJsZSBvZiBkaWdpdCB2YWx1ZXMgZm9yIDgtYml0IHN0cmluZyAtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCkBAIC0yNzA1LDYgKzI3NjksMTMgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKICAgICAgICAgcmV0dXJuIC0xLjA7CiAgICAgfQorICAgIGlmIChQeV9BQlMoUHlfU0laRSh2KSkgPD0gMSkgeworICAgICAgICAvKiBGYXN0IHBhdGg7IHNpbmdsZSBkaWdpdCBsb25nICgzMSBiaXRzKSB3aWxsIGNhc3Qgc2FmZWx5CisJICAgdG8gZG91YmxlLiAgVGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvZiBGUC9sb25nIG9wZXJhdGlvbnMKKwkgICBieSAyMCUuCisgICAgICAgICovCisgICAgICAgIHJldHVybiAoZG91YmxlKU1FRElVTV9WQUxVRSgoUHlMb25nT2JqZWN0ICopdik7CisgICAgfQogICAgIHggPSBfUHlMb25nX0ZyZXhwKChQeUxvbmdPYmplY3QgKil2LCAmZXhwb25lbnQpOwogICAgIGlmICgoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHx8IGV4cG9uZW50ID4gREJMX01BWF9FWFApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCkBAIC0zNDMxLDYgKzM1MDIsNTIgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAorLyogRmFzdCBtb2R1bG8gZGl2aXNpb24gZm9yIHNpbmdsZS1kaWdpdCBsb25ncy4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitmYXN0X21vZChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKK3sKKyAgICBzZGlnaXQgbGVmdCA9IGEtPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCByaWdodCA9IGItPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCBtb2Q7CisKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEpOworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShiKSkgPT0gMSk7CisKKyAgICBpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpKSB7CisgICAgICAgIC8qICdhJyBhbmQgJ2InIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICAgICAgbW9kID0gbGVmdCAlIHJpZ2h0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogRWl0aGVyICdhJyBvciAnYicgaXMgbmVnYXRpdmUuICovCisgICAgICAgIG1vZCA9IHJpZ2h0IC0gMSAtIChsZWZ0IC0gMSkgJSByaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKG1vZCAqIChzZGlnaXQpUHlfU0laRShiKSk7Cit9CisKKy8qIEZhc3QgZmxvb3IgZGl2aXNpb24gZm9yIHNpbmdsZS1kaWdpdCBsb25ncy4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCitmYXN0X2Zsb29yX2RpdihQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKK3sKKyAgICBzZGlnaXQgbGVmdCA9IGEtPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCByaWdodCA9IGItPm9iX2RpZ2l0WzBdOworICAgIHNkaWdpdCBkaXY7CisKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEpOworICAgIGFzc2VydChQeV9BQlMoUHlfU0laRShiKSkgPT0gMSk7CisKKyAgICBpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpKSB7CisgICAgICAgIC8qICdhJyBhbmQgJ2InIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICAgICAgZGl2ID0gbGVmdCAvIHJpZ2h0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogRWl0aGVyICdhJyBvciAnYicgaXMgbmVnYXRpdmUuICovCisgICAgICAgIGRpdiA9IC0xIC0gKGxlZnQgLSAxKSAvIHJpZ2h0OworICAgIH0KKworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoZGl2KTsKK30KKwogLyogVGhlIC8gYW5kICUgb3BlcmF0b3JzIGFyZSBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBkaXZtb2QoKS4KICAgIFRoZSBleHByZXNzaW9uIGEgbW9kIGIgaGFzIHRoZSB2YWx1ZSBhIC0gYipmbG9vcihhL2IpLgogICAgVGhlIGxvbmdfZGl2cmVtIGZ1bmN0aW9uIGdpdmVzIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aXNpb24gb2YKQEAgLTM0NTgsNiArMzU3NSwzMCBAQAogewogICAgIFB5TG9uZ09iamVjdCAqZGl2LCAqbW9kOwogCisgICAgaWYgKFB5X0FCUyhQeV9TSVpFKHYpKSA9PSAxICYmIFB5X0FCUyhQeV9TSVpFKHcpKSA9PSAxKSB7CisgICAgICAgIC8qIEZhc3QgcGF0aCBmb3Igc2luZ2xlLWRpZ2l0IGxvbmdzICovCisgICAgICAgIGRpdiA9IE5VTEw7CisgICAgICAgIGlmIChwZGl2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRpdiA9IChQeUxvbmdPYmplY3QgKilmYXN0X2Zsb29yX2Rpdih2LCB3KTsKKyAgICAgICAgICAgIGlmIChkaXYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG1vZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtb2QgPSAoUHlMb25nT2JqZWN0ICopZmFzdF9tb2Qodiwgdyk7CisgICAgICAgICAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGRpdik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBtb2QgPSBtb2Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBkaXYgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogV2Ugb25seSB3YW50IHRvIHNldCBgKnBkaXZgIHdoZW4gYCpwbW9kYCBpcworICAgICAgICAgICAgICAgc2V0IHN1Y2Nlc3NmdWxseS4gKi8KKyAgICAgICAgICAgICpwZGl2ID0gZGl2OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpZiAobG9uZ19kaXZyZW0odiwgdywgJmRpdiwgJm1vZCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKChQeV9TSVpFKG1vZCkgPCAwICYmIFB5X1NJWkUodykgPiAwKSB8fApAQCAtMzUwMiw2ICszNjQzLDExIEBACiAgICAgUHlMb25nT2JqZWN0ICpkaXY7CiAKICAgICBDSEVDS19CSU5PUChhLCBiKTsKKworICAgIGlmIChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSAmJiBQeV9BQlMoUHlfU0laRShiKSkgPT0gMSkgeworICAgICAgICByZXR1cm4gZmFzdF9mbG9vcl9kaXYoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYik7CisgICAgfQorCiAgICAgaWYgKGxfZGl2bW9kKChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIsICZkaXYsIE5VTEwpIDwgMCkKICAgICAgICAgZGl2ID0gTlVMTDsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGl2OwpAQCAtMzc3Nyw2ICszOTIzLDEwIEBACiAKICAgICBDSEVDS19CSU5PUChhLCBiKTsKIAorICAgIGlmIChQeV9BQlMoUHlfU0laRShhKSkgPT0gMSAmJiBQeV9BQlMoUHlfU0laRShiKSkgPT0gMSkgeworICAgICAgICByZXR1cm4gZmFzdF9tb2QoKFB5TG9uZ09iamVjdCopYSwgKFB5TG9uZ09iamVjdCopYik7CisgICAgfQorCiAgICAgaWYgKGxfZGl2bW9kKChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIsIE5VTEwsICZtb2QpIDwgMCkKICAgICAgICAgbW9kID0gTlVMTDsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopbW9kOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9tZW1vcnlvYmplY3QuYyBiL09iamVjdHMvbWVtb3J5b2JqZWN0LmMKaW5kZXggMTAxNjJjYi4uZTM1NWE4MyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9tZW1vcnlvYmplY3QuYworKysgYi9PYmplY3RzL21lbW9yeW9iamVjdC5jCkBAIC0xMTMzLDcgKzExMzMsNyBAQAogICAgIHJldHVybiAtMTsKIH0KIAotUHlfTE9DQUxfSU5MSU5FKGNoYXIgKikKK1B5X0xPQ0FMX0lOTElORShjb25zdCBjaGFyICopCiBnZXRfbmF0aXZlX2ZtdHN0cihjb25zdCBjaGFyICpmbXQpCiB7CiAgICAgaW50IGF0ID0gMDsKQEAgLTEyMjEsNyArMTIyMSw3IEBACiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIHZpZXctPmZvcm1hdCA9IGdldF9uYXRpdmVfZm10c3RyKFB5Qnl0ZXNfQVNfU1RSSU5HKGFzY2lpZm10KSk7CisgICAgdmlldy0+Zm9ybWF0ID0gKGNoYXIgKilnZXRfbmF0aXZlX2ZtdHN0cihQeUJ5dGVzX0FTX1NUUklORyhhc2NpaWZtdCkpOwogICAgIGlmICh2aWV3LT5mb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAvKiBOT1RfUkVBQ0hFRDogZ2V0X25hdGl2ZV9mbXRjaGFyKCkgYWxyZWFkeSB2YWxpZGF0ZXMgdGhlIGZvcm1hdC4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JqZWN0LmMgYi9PYmplY3RzL29iamVjdC5jCmluZGV4IDZmYzRkZjEuLmNjMWIyZmYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vYmplY3QuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAvKiBNYXAgcmljaCBjb21wYXJpc29uIG9wZXJhdG9ycyB0byB0aGVpciBzd2FwcGVkIHZlcnNpb24sIGUuZy4gTFQgPC0tPiBHVCAqLwogaW50IF9QeV9Td2FwcGVkT3BbXSA9IHtQeV9HVCwgUHlfR0UsIFB5X0VRLCBQeV9ORSwgUHlfTFQsIFB5X0xFfTsKIAotc3RhdGljIGNoYXIgKm9wc3RyaW5nc1tdID0geyI8IiwgIjw9IiwgIj09IiwgIiE9IiwgIj4iLCAiPj0ifTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3BzdHJpbmdzW10gPSB7IjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSJ9OwogCiAvKiBQZXJmb3JtIGEgcmljaCBjb21wYXJpc29uLCByYWlzaW5nIFR5cGVFcnJvciB3aGVuIHRoZSByZXF1ZXN0ZWQgY29tcGFyaXNvbgogICAgb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gKi8KQEAgLTY4NiwxMSArNjg2LDEwIEBACiAgICAgICAgIHJlcyA9ICh2ICE9IHcpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICAvKiBYWFggU3BlY2lhbC1jYXNlIE5vbmUgc28gaXQgZG9lc24ndCBzaG93IGFzIE5vbmVUeXBlKCkgKi8KICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJ1bm9yZGVyYWJsZSB0eXBlczogJS4xMDBzKCkgJXMgJS4xMDBzKCkiLAotICAgICAgICAgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICInJXMnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJyUuMTAwcycgYW5kICclLjEwMHMnIiwKICAgICAgICAgICAgICAgICAgICAgIG9wc3RyaW5nc1tvcF0sCisgICAgICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwNDEsOCArMTA0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICBuYW1lLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGVsc2UKLSAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIFB5X0lOQ1JFRihuYW1lKTsKIAogICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKQEAgLTEwNTAsMTAgKzEwNDgsMTAgQEAKICAgICB9CiAKICAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKLSAgICBQeV9YSU5DUkVGKGRlc2NyKTsKIAogICAgIGYgPSBOVUxMOwogICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZXNjcik7CiAgICAgICAgIGYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3JfZ2V0OwogICAgICAgICBpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgewogICAgICAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilvYmotPm9iX3R5cGUpOwpAQCAtMTA3Myw4ICsxMDcxLDkgQEAKICAgICAgICAgICAgICAgICBpZiAodHNpemUgPCAwKQogICAgICAgICAgICAgICAgICAgICB0c2l6ZSA9IC10c2l6ZTsKICAgICAgICAgICAgICAgICBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHNpemUgPD0gUFlfU1NJWkVfVF9NQVgpOwogCi0gICAgICAgICAgICAgICAgZGljdG9mZnNldCArPSAobG9uZylzaXplOworICAgICAgICAgICAgICAgIGRpY3RvZmZzZXQgKz0gKFB5X3NzaXplX3Qpc2l6ZTsKICAgICAgICAgICAgICAgICBhc3NlcnQoZGljdG9mZnNldCA+IDApOwogICAgICAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ICUgU0laRU9GX1ZPSURfUCA9PSAwKTsKICAgICAgICAgICAgIH0KQEAgLTExNDIsMTIgKzExNDEsMTEgQEAKICAgICBQeV9JTkNSRUYobmFtZSk7CiAKICAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKLSAgICBQeV9YSU5DUkVGKGRlc2NyKTsKIAotICAgIGYgPSBOVUxMOwogICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZXNjcik7CiAgICAgICAgIGYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3Jfc2V0OwotICAgICAgICBpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgeworICAgICAgICBpZiAoZiAhPSBOVUxMKSB7CiAgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgfQpAQCAtMTE1NSw0MCArMTE1MywzMiBAQAogCiAgICAgaWYgKGRpY3QgPT0gTlVMTCkgewogICAgICAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKLSAgICAgICAgaWYgKGRpY3RwdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVzID0gX1B5T2JqZWN0RGljdF9TZXRJdGVtKFB5X1RZUEUob2JqKSwgZGljdHB0ciwgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgaWYgKGRpY3RwdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJVUnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyUuNTBzJyBvYmplY3QgYXR0cmlidXRlICclVScgaXMgcmVhZC1vbmx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsIG5hbWUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CisgICAgICAgIHJlcyA9IF9QeU9iamVjdERpY3RfU2V0SXRlbSh0cCwgZGljdHB0ciwgbmFtZSwgdmFsdWUpOwogICAgIH0KLSAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgZWxzZSB7CiAgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCiAgICAgICAgICAgICByZXMgPSBQeURpY3RfRGVsSXRlbShkaWN0LCBuYW1lKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmVzID0gUHlEaWN0X1NldEl0ZW0oZGljdCwgbmFtZSwgdmFsdWUpOwogICAgICAgICBQeV9ERUNSRUYoZGljdCk7Ci0gICAgICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLSAgICAgICAgZ290byBkb25lOwogICAgIH0KKyAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKIAotICAgIGlmIChmICE9IE5VTEwpIHsKLSAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZGVzY3IgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyVVJyIsCi0gICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyVVJyBpcyByZWFkLW9ubHkiLAotICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CiAgIGRvbmU6CiAgICAgUHlfWERFQ1JFRihkZXNjcik7CiAgICAgUHlfREVDUkVGKG5hbWUpOwpAQCAtMTIwNCw3ICsxMTk0LDcgQEAKIGludAogUHlPYmplY3RfR2VuZXJpY1NldERpY3QoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotICAgIFB5T2JqZWN0ICpkaWN0LCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOworICAgIFB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CiAgICAgaWYgKGRpY3RwdHIgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBvYmplY3QgaGFzIG5vIF9fZGljdF9fIik7CkBAIC0xMjIwLDEwICsxMjEwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICJub3QgYSAnJS4yMDBzJyIsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBkaWN0ID0gKmRpY3RwdHI7Ci0gICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgKmRpY3RwdHIgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfWFNFVFJFRigqZGljdHB0ciwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL29ibWFsbG9jLmMgYi9PYmplY3RzL29ibWFsbG9jLmMKaW5kZXggN2NjODg5Zi4uNDBjOWZjZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9vYm1hbGxvYy5jCisrKyBiL09iamVjdHMvb2JtYWxsb2MuYwpAQCAtMSwxNyArMSwzOCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCisKKy8qIERlZmluZWQgaW4gdHJhY2VtYWxsb2MuYyAqLworZXh0ZXJuIHZvaWQgX1B5TWVtX0R1bXBUcmFjZWJhY2soaW50IGZkLCBjb25zdCB2b2lkICpwdHIpOworCisKIC8qIFB5dGhvbidzIG1hbGxvYyB3cmFwcGVycyAoc2VlIHB5bWVtLmgpICovCiAKLSNpZmRlZiBQWU1BTExPQ19ERUJVRyAgIC8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KKy8qCisgKiBCYXNpYyB0eXBlcworICogSSBkb24ndCBjYXJlIGlmIHRoZXNlIGFyZSBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4gb3IgZWxzZXdoZXJlLiBBeGlvbS4KKyAqLworI3VuZGVmICB1Y2hhcgorI2RlZmluZSB1Y2hhciAgIHVuc2lnbmVkIGNoYXIgICAvKiBhc3N1bWluZyA9PSA4IGJpdHMgICovCisKKyN1bmRlZiAgdWludAorI2RlZmluZSB1aW50ICAgIHVuc2lnbmVkIGludCAgICAvKiBhc3N1bWluZyA+PSAxNiBiaXRzICovCisKKyN1bmRlZiB1cHRyCisjZGVmaW5lIHVwdHIgICAgUHlfdWludHB0cl90CisKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSYXdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgdm9pZCogX1B5TWVtX0RlYnVnUmF3Q2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKTsKK3N0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSYXdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgdm9pZCBfUHlNZW1fRGVidWdSYXdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcCk7CisKIHN0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgdm9pZCogX1B5TWVtX0RlYnVnQ2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKTsKLXN0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKIHN0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgdm9pZCBfUHlNZW1fRGVidWdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcCk7CiAKIHN0YXRpYyB2b2lkIF9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzKGNvbnN0IHZvaWQgKnApOwogc3RhdGljIHZvaWQgX1B5TWVtX0RlYnVnQ2hlY2tBZGRyZXNzKGNoYXIgYXBpX2lkLCBjb25zdCB2b2lkICpwKTsKLSNlbmRpZgogCiAjaWYgZGVmaW5lZChfX2hhc19mZWF0dXJlKSAgLyogQ2xhbmcgKi8KICAjaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikgIC8qIGlzIEFTQU4gZW5hYmxlZD8gKi8KQEAgLTE0Nyw3ICsxNjgsNiBAQAogI2VuZGlmCiAjZGVmaW5lIFBZTUVNX0ZVTkNTIFBZUkFXX0ZVTkNTCiAKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFdlIHRhZyBlYWNoIGJsb2NrIHdpdGggYW4gQVBJIElEIGluIG9yZGVyIHRvIHRhZyBBUEkgdmlvbGF0aW9ucyAqLwogICAgIGNoYXIgYXBpX2lkOwpAQCAtMTYzLDE5ICsxODMsMjEgQEAKICAgICB7J28nLCB7TlVMTCwgUFlPQkpfRlVOQ1N9fQogICAgIH07CiAKLSNkZWZpbmUgUFlEQkdfRlVOQ1MgX1B5TWVtX0RlYnVnTWFsbG9jLCBfUHlNZW1fRGVidWdDYWxsb2MsIF9QeU1lbV9EZWJ1Z1JlYWxsb2MsIF9QeU1lbV9EZWJ1Z0ZyZWUKLSNlbmRpZgorI2RlZmluZSBQWVJBV0RCR19GVU5DUyBcCisgICAgX1B5TWVtX0RlYnVnUmF3TWFsbG9jLCBfUHlNZW1fRGVidWdSYXdDYWxsb2MsIF9QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2MsIF9QeU1lbV9EZWJ1Z1Jhd0ZyZWUKKyNkZWZpbmUgUFlEQkdfRlVOQ1MgXAorICAgIF9QeU1lbV9EZWJ1Z01hbGxvYywgX1B5TWVtX0RlYnVnQ2FsbG9jLCBfUHlNZW1fRGVidWdSZWFsbG9jLCBfUHlNZW1fRGVidWdGcmVlCiAKIHN0YXRpYyBQeU1lbUFsbG9jYXRvckV4IF9QeU1lbV9SYXcgPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICAmX1B5TWVtX0RlYnVnLnJhdywgUFlEQkdfRlVOQ1MKKyNpZmRlZiBQeV9ERUJVRworICAgICZfUHlNZW1fRGVidWcucmF3LCBQWVJBV0RCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWVJBV19GVU5DUwogI2VuZGlmCiAgICAgfTsKIAogc3RhdGljIFB5TWVtQWxsb2NhdG9yRXggX1B5TWVtID0gewotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCisjaWZkZWYgUHlfREVCVUcKICAgICAmX1B5TWVtX0RlYnVnLm1lbSwgUFlEQkdfRlVOQ1MKICNlbHNlCiAgICAgTlVMTCwgUFlNRU1fRlVOQ1MKQEAgLTE4MywxNiArMjA1LDc1IEBACiAgICAgfTsKIAogc3RhdGljIFB5TWVtQWxsb2NhdG9yRXggX1B5T2JqZWN0ID0gewotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCisjaWZkZWYgUHlfREVCVUcKICAgICAmX1B5TWVtX0RlYnVnLm9iaiwgUFlEQkdfRlVOQ1MKICNlbHNlCiAgICAgTlVMTCwgUFlPQkpfRlVOQ1MKICNlbmRpZgogICAgIH07CiAKK2ludAorX1B5TWVtX1NldHVwQWxsb2NhdG9ycyhjb25zdCBjaGFyICpvcHQpCit7CisgICAgaWYgKG9wdCA9PSBOVUxMIHx8ICpvcHQgPT0gJ1wwJykgeworICAgICAgICAvKiBQWVRIT05NQUxMT0MgaXMgZW1wdHkgb3IgaXMgbm90IHNldCBvciBpZ25vcmVkICgtRS8tSSBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgb3B0aW9ucyk6IHVzZSBkZWZhdWx0IGFsbG9jYXRvcnMgKi8KKyNpZmRlZiBQeV9ERUJVRworIyAgaWZkZWYgV0lUSF9QWU1BTExPQworICAgICAgICBvcHQgPSAicHltYWxsb2NfZGVidWciOworIyAgZWxzZQorICAgICAgICBvcHQgPSAibWFsbG9jX2RlYnVnIjsKKyMgIGVuZGlmCisjZWxzZQorICAgLyogIVB5X0RFQlVHICovCisjICBpZmRlZiBXSVRIX1BZTUFMTE9DCisgICAgICAgIG9wdCA9ICJweW1hbGxvYyI7CisjICBlbHNlCisgICAgICAgIG9wdCA9ICJtYWxsb2MiOworIyAgZW5kaWYKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChzdHJjbXAob3B0LCAiZGVidWciKSA9PSAwKSB7CisgICAgICAgIFB5TWVtX1NldHVwRGVidWdIb29rcygpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAob3B0LCAibWFsbG9jIikgPT0gMCB8fCBzdHJjbXAob3B0LCAibWFsbG9jX2RlYnVnIikgPT0gMCkKKyAgICB7CisgICAgICAgIFB5TWVtQWxsb2NhdG9yRXggYWxsb2MgPSB7TlVMTCwgUFlSQVdfRlVOQ1N9OworCisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmYWxsb2MpOworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX01FTSwgJmFsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvYyk7CisKKyAgICAgICAgaWYgKHN0cmNtcChvcHQsICJtYWxsb2NfZGVidWciKSA9PSAwKQorICAgICAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorI2lmZGVmIFdJVEhfUFlNQUxMT0MKKyAgICBlbHNlIGlmIChzdHJjbXAob3B0LCAicHltYWxsb2MiKSA9PSAwCisgICAgICAgICAgICAgfHwgc3RyY21wKG9wdCwgInB5bWFsbG9jX2RlYnVnIikgPT0gMCkKKyAgICB7CisgICAgICAgIFB5TWVtQWxsb2NhdG9yRXggbWVtX2FsbG9jID0ge05VTEwsIFBZUkFXX0ZVTkNTfTsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCBvYmpfYWxsb2MgPSB7TlVMTCwgUFlPQkpfRlVOQ1N9OworCisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmbWVtX2FsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9NRU0sICZtZW1fYWxsb2MpOworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJm9ial9hbGxvYyk7CisKKyAgICAgICAgaWYgKHN0cmNtcChvcHQsICJweW1hbGxvY19kZWJ1ZyIpID09IDApCisgICAgICAgICAgICBQeU1lbV9TZXR1cERlYnVnSG9va3MoKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgLyogdW5rbm93biBhbGxvY2F0b3IgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogI3VuZGVmIFBZUkFXX0ZVTkNTCiAjdW5kZWYgUFlNRU1fRlVOQ1MKICN1bmRlZiBQWU9CSl9GVU5DUworI3VuZGVmIFBZUkFXREJHX0ZVTkNTCiAjdW5kZWYgUFlEQkdfRlVOQ1MKIAogc3RhdGljIFB5T2JqZWN0QXJlbmFBbGxvY2F0b3IgX1B5T2JqZWN0X0FyZW5hID0ge05VTEwsCkBAIC0yMDUsMjMgKzI4Niw0NiBAQAogI2VuZGlmCiAgICAgfTsKIAorc3RhdGljIGludAorX1B5TWVtX0RlYnVnRW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiAoX1B5T2JqZWN0Lm1hbGxvYyA9PSBfUHlNZW1fRGVidWdNYWxsb2MpOworfQorCisjaWZkZWYgV0lUSF9QWU1BTExPQworaW50CitfUHlNZW1fUHltYWxsb2NFbmFibGVkKHZvaWQpCit7CisgICAgaWYgKF9QeU1lbV9EZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gKF9QeU1lbV9EZWJ1Zy5vYmouYWxsb2MubWFsbG9jID09IF9QeU9iamVjdF9NYWxsb2MpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChfUHlPYmplY3QubWFsbG9jID09IF9QeU9iamVjdF9NYWxsb2MpOworICAgIH0KK30KKyNlbmRpZgorCiB2b2lkCiBQeU1lbV9TZXR1cERlYnVnSG9va3Modm9pZCkKIHsKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwogICAgIFB5TWVtQWxsb2NhdG9yRXggYWxsb2M7CiAKKyAgICBhbGxvYy5tYWxsb2MgPSBfUHlNZW1fRGVidWdSYXdNYWxsb2M7CisgICAgYWxsb2MuY2FsbG9jID0gX1B5TWVtX0RlYnVnUmF3Q2FsbG9jOworICAgIGFsbG9jLnJlYWxsb2MgPSBfUHlNZW1fRGVidWdSYXdSZWFsbG9jOworICAgIGFsbG9jLmZyZWUgPSBfUHlNZW1fRGVidWdSYXdGcmVlOworCisgICAgaWYgKF9QeU1lbV9SYXcubWFsbG9jICE9IF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYykgeworICAgICAgICBhbGxvYy5jdHggPSAmX1B5TWVtX0RlYnVnLnJhdzsKKyAgICAgICAgUHlNZW1fR2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9SQVcsICZfUHlNZW1fRGVidWcucmF3LmFsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9SQVcsICZhbGxvYyk7CisgICAgfQorCiAgICAgYWxsb2MubWFsbG9jID0gX1B5TWVtX0RlYnVnTWFsbG9jOwogICAgIGFsbG9jLmNhbGxvYyA9IF9QeU1lbV9EZWJ1Z0NhbGxvYzsKICAgICBhbGxvYy5yZWFsbG9jID0gX1B5TWVtX0RlYnVnUmVhbGxvYzsKICAgICBhbGxvYy5mcmVlID0gX1B5TWVtX0RlYnVnRnJlZTsKIAotICAgIGlmIChfUHlNZW1fUmF3Lm1hbGxvYyAhPSBfUHlNZW1fRGVidWdNYWxsb2MpIHsKLSAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5yYXc7Ci0gICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmX1B5TWVtX0RlYnVnLnJhdy5hbGxvYyk7Ci0gICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmYWxsb2MpOwotICAgIH0KLQogICAgIGlmIChfUHlNZW0ubWFsbG9jICE9IF9QeU1lbV9EZWJ1Z01hbGxvYykgewogICAgICAgICBhbGxvYy5jdHggPSAmX1B5TWVtX0RlYnVnLm1lbTsKICAgICAgICAgUHlNZW1fR2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9NRU0sICZfUHlNZW1fRGVidWcubWVtLmFsbG9jKTsKQEAgLTIzMyw3ICszMzcsNiBAQAogICAgICAgICBQeU1lbV9HZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJl9QeU1lbV9EZWJ1Zy5vYmouYWxsb2MpOwogICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jKTsKICAgICB9Ci0jZW5kaWYKIH0KIAogdm9pZApAQCAtMjY0LDcgKzM2Nyw2IEBACiAgICAgY2FzZSBQWU1FTV9ET01BSU5fT0JKOiBfUHlPYmplY3QgPSAqYWxsb2NhdG9yOyBicmVhazsKICAgICAvKiBpZ25vcmUgdW5rbm93biBkb21haW4gKi8KICAgICB9Ci0KIH0KIAogdm9pZApAQCAtNjQyLDIyICs3NDQsNiBAQAogI2RlZmluZSBTSU1QTEVMT0NLX0xPQ0sobG9jaykgICAvKiBhY3F1aXJlIHJlbGVhc2VkIGxvY2sgKi8KICNkZWZpbmUgU0lNUExFTE9DS19VTkxPQ0sobG9jaykgLyogcmVsZWFzZSBhY3F1aXJlZCBsb2NrICovCiAKLS8qCi0gKiBCYXNpYyB0eXBlcwotICogSSBkb24ndCBjYXJlIGlmIHRoZXNlIGFyZSBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4gb3IgZWxzZXdoZXJlLiBBeGlvbS4KLSAqLwotI3VuZGVmICB1Y2hhcgotI2RlZmluZSB1Y2hhciAgIHVuc2lnbmVkIGNoYXIgICAvKiBhc3N1bWluZyA9PSA4IGJpdHMgICovCi0KLSN1bmRlZiAgdWludAotI2RlZmluZSB1aW50ICAgIHVuc2lnbmVkIGludCAgICAvKiBhc3N1bWluZyA+PSAxNiBiaXRzICovCi0KLSN1bmRlZiAgdWxvbmcKLSNkZWZpbmUgdWxvbmcgICB1bnNpZ25lZCBsb25nICAgLyogYXNzdW1pbmcgPj0gMzIgYml0cyAqLwotCi0jdW5kZWYgdXB0cgotI2RlZmluZSB1cHRyICAgIFB5X3VpbnRwdHJfdAotCiAvKiBXaGVuIHlvdSBzYXkgbWVtb3J5LCBteSBtaW5kIHJlYXNvbnMgaW4gdGVybXMgb2YgKHBvaW50ZXJzIHRvKSBibG9ja3MgKi8KIHR5cGVkZWYgdWNoYXIgYmxvY2s7CiAKQEAgLTk0OSwxMSArMTAzNSwxNSBAQAogICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIGFyZW5hb2JqOwogICAgIHVpbnQgZXhjZXNzOyAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGFib3ZlIHBvb2wgYWxpZ25tZW50ICovCiAgICAgdm9pZCAqYWRkcmVzczsKKyAgICBzdGF0aWMgaW50IGRlYnVnX3N0YXRzID0gLTE7CiAKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCisgICAgaWYgKGRlYnVnX3N0YXRzID09IC0xKSB7CisgICAgICAgIGNoYXIgKm9wdCA9IFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DU1RBVFMiKTsKKyAgICAgICAgZGVidWdfc3RhdHMgPSAob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKTsKKyAgICB9CisgICAgaWYgKGRlYnVnX3N0YXRzKQogICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyhzdGRlcnIpOwotI2VuZGlmCisKICAgICBpZiAodW51c2VkX2FyZW5hX29iamVjdHMgPT0gTlVMTCkgewogICAgICAgICB1aW50IGk7CiAgICAgICAgIHVpbnQgbnVtYXJlbmFzOwpAQCAtMTcwOSw3ICsxNzk5LDcgQEAKIAogI2VuZGlmIC8qIFdJVEhfUFlNQUxMT0MgKi8KIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogQSB4LXBsYXRmb3JtIGRlYnVnZ2luZyBhbGxvY2F0b3IuICBUaGlzIGRvZXNuJ3QgbWFuYWdlIG1lbW9yeSBkaXJlY3RseSwKICAqIGl0IHdyYXBzIGEgcmVhbCBhbGxvY2F0b3IsIGFkZGluZyBleHRyYSBkZWJ1Z2dpbmcgaW5mbyB0byB0aGUgbWVtb3J5IGJsb2Nrcy4KQEAgLTE3NjcsMzEgKzE4NTcsNiBAQAogICAgIH0KIH0KIAotI2lmZGVmIFB5X0RFQlVHCi0vKiBJcyB0YXJnZXQgaW4gdGhlIGxpc3Q/ICBUaGUgbGlzdCBpcyB0cmF2ZXJzZWQgdmlhIHRoZSBuZXh0cG9vbCBwb2ludGVycy4KLSAqIFRoZSBsaXN0IG1heSBiZSBOVUxMLXRlcm1pbmF0ZWQsIG9yIGNpcmN1bGFyLiAgUmV0dXJuIDEgaWYgdGFyZ2V0IGlzIGluCi0gKiBsaXN0LCBlbHNlIDAuCi0gKi8KLXN0YXRpYyBpbnQKLXBvb2xfaXNfaW5fbGlzdChjb25zdCBwb29scCB0YXJnZXQsIHBvb2xwIGxpc3QpCi17Ci0gICAgcG9vbHAgb3JpZ2xpc3QgPSBsaXN0OwotICAgIGFzc2VydCh0YXJnZXQgIT0gTlVMTCk7Ci0gICAgaWYgKGxpc3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgZG8gewotICAgICAgICBpZiAodGFyZ2V0ID09IGxpc3QpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgbGlzdCA9IGxpc3QtPm5leHRwb29sOwotICAgIH0gd2hpbGUgKGxpc3QgIT0gTlVMTCAmJiBsaXN0ICE9IG9yaWdsaXN0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgcG9vbF9pc19pbl9saXN0KFgsIFkpIDEKLQotI2VuZGlmICAvKiBQeV9ERUJVRyAqLwotCiAvKiBMZXQgUyA9IHNpemVvZihzaXplX3QpLiAgVGhlIGRlYnVnIG1hbGxvYyBhc2tzIGZvciA0KlMgZXh0cmEgYnl0ZXMgYW5kCiAgICBmaWxscyB0aGVtIHdpdGggdXNlZnVsIHN0dWZmLCBoZXJlIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgbWFsbG9jJ3MgcmVzdWx0IHA6CiAKQEAgLTE4MTksNyArMTg4NCw3IEBACiAqLwogCiBzdGF0aWMgdm9pZCAqCi1fUHlNZW1fRGVidWdBbGxvYyhpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQorX1B5TWVtX0RlYnVnUmF3QWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKIHsKICAgICBkZWJ1Z19hbGxvY19hcGlfdCAqYXBpID0gKGRlYnVnX2FsbG9jX2FwaV90ICopY3R4OwogICAgIHVjaGFyICpwOyAgICAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIG1hbGxvYydlZCBibG9jayAqLwpAQCAtMTg1NiwxOCArMTkyMSwxOCBAQAogfQogCiBzdGF0aWMgdm9pZCAqCi1fUHlNZW1fRGVidWdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQorX1B5TWVtX0RlYnVnUmF3TWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKIHsKLSAgICByZXR1cm4gX1B5TWVtX0RlYnVnQWxsb2MoMCwgY3R4LCBuYnl0ZXMpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdBbGxvYygwLCBjdHgsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyB2b2lkICoKLV9QeU1lbV9EZWJ1Z0NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKK19QeU1lbV9EZWJ1Z1Jhd0NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKICAgICBzaXplX3QgbmJ5dGVzOwogICAgIGFzc2VydChlbHNpemUgPT0gMCB8fCBuZWxlbSA8PSBQWV9TU0laRV9UX01BWCAvIGVsc2l6ZSk7CiAgICAgbmJ5dGVzID0gbmVsZW0gKiBlbHNpemU7Ci0gICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z0FsbG9jKDEsIGN0eCwgbmJ5dGVzKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3QWxsb2MoMSwgY3R4LCBuYnl0ZXMpOwogfQogCiAvKiBUaGUgZGVidWcgZnJlZSBmaXJzdCBjaGVja3MgdGhlIDIqU1NUIGJ5dGVzIG9uIGVhY2ggZW5kIGZvciBzYW5pdHkgKGluCkBAIC0xODc2LDcgKzE5NDEsNyBAQAogICAgVGhlbiBjYWxscyB0aGUgdW5kZXJseWluZyBmcmVlLgogKi8KIHN0YXRpYyB2b2lkCi1fUHlNZW1fRGVidWdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcCkKK19QeU1lbV9EZWJ1Z1Jhd0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKQogewogICAgIGRlYnVnX2FsbG9jX2FwaV90ICphcGkgPSAoZGVidWdfYWxsb2NfYXBpX3QgKiljdHg7CiAgICAgdWNoYXIgKnEgPSAodWNoYXIgKilwIC0gMipTU1Q7ICAvKiBhZGRyZXNzIHJldHVybmVkIGZyb20gbWFsbG9jICovCkBAIC0xODkzLDcgKzE5NTgsNyBAQAogfQogCiBzdGF0aWMgdm9pZCAqCi1fUHlNZW1fRGVidWdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKK19QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQogewogICAgIGRlYnVnX2FsbG9jX2FwaV90ICphcGkgPSAoZGVidWdfYWxsb2NfYXBpX3QgKiljdHg7CiAgICAgdWNoYXIgKnEgPSAodWNoYXIgKilwLCAqb2xkcTsKQEAgLTE5MDMsNyArMTk2OCw3IEBACiAgICAgaW50IGk7CiAKICAgICBpZiAocCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gX1B5TWVtX0RlYnVnQWxsb2MoMCwgY3R4LCBuYnl0ZXMpOworICAgICAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3QWxsb2MoMCwgY3R4LCBuYnl0ZXMpOwogCiAgICAgX1B5TWVtX0RlYnVnQ2hlY2tBZGRyZXNzKGFwaS0+YXBpX2lkLCBwKTsKICAgICBidW1wc2VyaWFsbm8oKTsKQEAgLTE5NDYsNiArMjAxMSw0NCBAQAogICAgIHJldHVybiBxOwogfQogCitzdGF0aWMgdm9pZAorX1B5TWVtX0RlYnVnQ2hlY2tHSUwodm9pZCkKK3sKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmICghUHlHSUxTdGF0ZV9DaGVjaygpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeXRob24gbWVtb3J5IGFsbG9jYXRvciBjYWxsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkICoKK19QeU1lbV9EZWJ1Z01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCit7CisgICAgX1B5TWVtX0RlYnVnQ2hlY2tHSUwoKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3TWFsbG9jKGN0eCwgbmJ5dGVzKTsKK30KKworc3RhdGljIHZvaWQgKgorX1B5TWVtX0RlYnVnQ2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQoreworICAgIF9QeU1lbV9EZWJ1Z0NoZWNrR0lMKCk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYyhjdHgsIG5lbGVtLCBlbHNpemUpOworfQorCitzdGF0aWMgdm9pZAorX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnB0cikKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIF9QeU1lbV9EZWJ1Z1Jhd0ZyZWUoY3R4LCBwdHIpOworfQorCitzdGF0aWMgdm9pZCAqCitfUHlNZW1fRGVidWdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmJ5dGVzKQoreworICAgIF9QeU1lbV9EZWJ1Z0NoZWNrR0lMKCk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2MoY3R4LCBwdHIsIG5ieXRlcyk7Cit9CisKIC8qIENoZWNrIHRoZSBmb3JiaWRkZW4gYnl0ZXMgb24gYm90aCBlbmRzIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBwLgogICogSWYgYW55dGhpbmcgaXMgd3JvbmcsIHByaW50IGluZm8gdG8gc3RkZXJyIHZpYSBfUHlPYmplY3RfRGVidWdEdW1wQWRkcmVzcywKICAqIGFuZCBjYWxsIFB5X0ZhdGFsRXJyb3IgdG8ga2lsbCB0aGUgcHJvZ3JhbS4KQEAgLTIxMDQsOSArMjIwNywxMiBAQAogICAgICAgICB9CiAgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CiAgICAgfQorICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBfUHlNZW1fRHVtcFRyYWNlYmFjayhmaWxlbm8oc3RkZXJyKSwgcCk7CiB9CiAKLSNlbmRpZiAgLyogUFlNQUxMT0NfREVCVUcgKi8KIAogc3RhdGljIHNpemVfdAogcHJpbnRvbmUoRklMRSAqb3V0LCBjb25zdCBjaGFyKiBtc2csIHNpemVfdCB2YWx1ZSkKQEAgLTIxNTgsOCArMjI2NCwzMCBAQAogICAgICh2b2lkKXByaW50b25lKG91dCwgYnVmMiwgbnVtX2Jsb2NrcyAqIHNpemVvZl9ibG9jayk7CiB9CiAKKwogI2lmZGVmIFdJVEhfUFlNQUxMT0MKIAorI2lmZGVmIFB5X0RFQlVHCisvKiBJcyB0YXJnZXQgaW4gdGhlIGxpc3Q/ICBUaGUgbGlzdCBpcyB0cmF2ZXJzZWQgdmlhIHRoZSBuZXh0cG9vbCBwb2ludGVycy4KKyAqIFRoZSBsaXN0IG1heSBiZSBOVUxMLXRlcm1pbmF0ZWQsIG9yIGNpcmN1bGFyLiAgUmV0dXJuIDEgaWYgdGFyZ2V0IGlzIGluCisgKiBsaXN0LCBlbHNlIDAuCisgKi8KK3N0YXRpYyBpbnQKK3Bvb2xfaXNfaW5fbGlzdChjb25zdCBwb29scCB0YXJnZXQsIHBvb2xwIGxpc3QpCit7CisgICAgcG9vbHAgb3JpZ2xpc3QgPSBsaXN0OworICAgIGFzc2VydCh0YXJnZXQgIT0gTlVMTCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZG8geworICAgICAgICBpZiAodGFyZ2V0ID09IGxpc3QpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHRwb29sOworICAgIH0gd2hpbGUgKGxpc3QgIT0gTlVMTCAmJiBsaXN0ICE9IG9yaWdsaXN0KTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCiAvKiBQcmludCBzdW1tYXJ5IGluZm8gdG8gIm91dCIgYWJvdXQgdGhlIHN0YXRlIG9mIHB5bWFsbG9jJ3Mgc3RydWN0dXJlcy4KICAqIEluIFB5X0RFQlVHIG1vZGUsIGFsc28gcGVyZm9ybSBzb21lIGV4cGVuc2l2ZSBpbnRlcm5hbCBjb25zaXN0ZW5jeQogICogY2hlY2tzLgpAQCAtMjIzMyw3ICsyMzYxLDkgQEAKIAogICAgICAgICAgICAgaWYgKHAtPnJlZi5jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLyogY3VycmVudGx5IHVudXNlZCAqLworI2lmZGVmIFB5X0RFQlVHCiAgICAgICAgICAgICAgICAgYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCBhcmVuYXNbaV0uZnJlZXBvb2xzKSk7CisjZW5kaWYKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICsrbnVtcG9vbHNbc3pdOwpAQCAtMjI3Myw5ICsyNDAzLDggQEAKICAgICAgICAgcXVhbnRpemF0aW9uICs9IHAgKiAoKFBPT0xfU0laRSAtIFBPT0xfT1ZFUkhFQUQpICUgc2l6ZSk7CiAgICAgfQogICAgIGZwdXRjKCdcbicsIG91dCk7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICAodm9pZClwcmludG9uZShvdXQsICIjIHRpbWVzIG9iamVjdCBtYWxsb2MgY2FsbGVkIiwgc2VyaWFsbm8pOwotI2VuZGlmCisgICAgaWYgKF9QeU1lbV9EZWJ1Z0VuYWJsZWQoKSkKKyAgICAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKICAgICAodm9pZClwcmludG9uZShvdXQsICIjIGFyZW5hcyBhbGxvY2F0ZWQgdG90YWwiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkKTsKICAgICAodm9pZClwcmludG9uZShvdXQsICIjIGFyZW5hcyByZWNsYWltZWQiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkIC0gbmFyZW5hcyk7CiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyBhcmVuYXMgaGlnaHdhdGVyIG1hcmsiLCBuYXJlbmFzX2hpZ2h3YXRlcik7CkBAIC0yMzAzLDYgKzI0MzIsNyBAQAogCiAjZW5kaWYgLyogI2lmZGVmIFdJVEhfUFlNQUxMT0MgKi8KIAorCiAjaWZkZWYgUHlfVVNJTkdfTUVNT1JZX0RFQlVHR0VSCiAvKiBNYWtlIHRoaXMgZnVuY3Rpb24gbGFzdCBzbyBnY2Mgd29uJ3QgaW5saW5lIGl0IHNpbmNlIHRoZSBkZWZpbml0aW9uIGlzCiAgKiBhZnRlciB0aGUgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9vZGljdG9iamVjdC5jIGIvT2JqZWN0cy9vZGljdG9iamVjdC5jCmluZGV4IDFhYmRkMDIuLmRjY2JiM2UgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL29kaWN0b2JqZWN0LmMKQEAgLTE0MjQsMTQgKzE0MjQsMTMgQEAKICAqIE9yZGVyZWREaWN0IG1lbWJlcnMKICAqLwogCi0vKiB0cF9tZW1iZXJzICovCisvKiB0cF9nZXRzZXQgKi8KIAotc3RhdGljIFB5TWVtYmVyRGVmIG9kaWN0X21lbWJlcnNbXSA9IHsKLSAgICB7Il9fZGljdF9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5T0RpY3RPYmplY3QsIG9kX2luc3RfZGljdCksIFJFQURPTkxZfSwKLSAgICB7MH0KK3N0YXRpYyBQeUdldFNldERlZiBvZGljdF9nZXRzZXRbXSA9IHsKKyAgICB7Il9fZGljdF9fIiwgUHlPYmplY3RfR2VuZXJpY0dldERpY3QsIFB5T2JqZWN0X0dlbmVyaWNTZXREaWN0fSwKKyAgICB7TlVMTH0KIH07CiAKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogT3JkZXJlZERpY3QgdHlwZSBzbG90IG1ldGhvZHMKICAqLwpAQCAtMTY1MywyMCArMTY1MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG9kaWN0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBQeU9iamVjdCAqZGljdDsKICAgICBQeU9EaWN0T2JqZWN0ICpvZDsKIAotICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKGRpY3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KICAgICBvZCA9IChQeU9EaWN0T2JqZWN0ICopUHlEaWN0X1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotICAgIGlmIChvZCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICBpZiAob2QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgb2QtPm9kX2luc3RfZGljdCA9IGRpY3Q7CiAgICAgLyogdHlwZSBjb25zdHJ1Y3RvciBmaWxscyB0aGUgbWVtb3J5IHdpdGggemVyb3MgKHNlZQogICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoKSksIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IHRoZW0gdG8gemVybyBhZ2FpbiAqLwogICAgIGlmIChfb2RpY3RfcmVzaXplKG9kKSA8IDApIHsKQEAgLTE3MDgsOCArMTY5OSw4IEBACiAgICAgKGdldGl0ZXJmdW5jKW9kaWN0X2l0ZXIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIG9kaWN0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwotICAgIG9kaWN0X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgb2RpY3RfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAmUHlEaWN0X1R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zZXRvYmplY3QuYyBiL09iamVjdHMvc2V0b2JqZWN0LmMKaW5kZXggNGVmNjkyZC4uYWM3MWIyYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zZXRvYmplY3QuYworKysgYi9PYmplY3RzL3NldG9iamVjdC5jCkBAIC0yNiw3ICsyNiw2IEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKLSNpbmNsdWRlICJzdHJpbmdsaWIvZXEuaCIKIAogLyogT2JqZWN0IHVzZWQgYXMgZHVtbXkga2V5IHRvIGZpbGwgZGVsZXRlZCBlbnRyaWVzICovCiBzdGF0aWMgUHlPYmplY3QgX2R1bW15X3N0cnVjdDsKQEAgLTQ4LDE5ICs0NywyMCBAQAogc3RhdGljIHNldGVudHJ5ICoKIHNldF9sb29ra2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7Ci0gICAgc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwotICAgIHNldGVudHJ5ICpmcmVlc2xvdCA9IE5VTEw7CisgICAgc2V0ZW50cnkgKnRhYmxlOwogICAgIHNldGVudHJ5ICplbnRyeTsKLSAgICBzaXplX3QgcGVydHVyYiA9IGhhc2g7CisgICAgc2l6ZV90IHBlcnR1cmI7CiAgICAgc2l6ZV90IG1hc2sgPSBzby0+bWFzazsKICAgICBzaXplX3QgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7IC8qIFVuc2lnbmVkIGZvciBkZWZpbmVkIG92ZXJmbG93IGJlaGF2aW9yICovCiAgICAgc2l6ZV90IGo7CiAgICAgaW50IGNtcDsKIAotICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gZW50cnk7CiAKKyAgICBwZXJ0dXJiID0gaGFzaDsKKwogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwpAQCAtNzAsOCArNzAsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKICAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCi0gICAgICAgICAgICAgICAgJiYgdW5pY29kZV9lcShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICAmJiBfUHlVbmljb2RlX0VRKHN0YXJ0a2V5LCBrZXkpKQogICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgIHRhYmxlID0gc28tPnRhYmxlOwogICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOwpAQCAtODMsMTQgKzg0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOyAgICAgICAgICAgICAgICAgLyogaGVscCBhdm9pZCBhIHJlZ2lzdGVyIHNwaWxsICovCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IC0xICYmIGZyZWVzbG90ID09IE5VTEwpCi0gICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OwogCiAgICAgICAgIGlmIChpICsgTElORUFSX1BST0JFUyA8PSBtYXNrKSB7CiAgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IExJTkVBUl9QUk9CRVMgOyBqKyspIHsKICAgICAgICAgICAgICAgICBlbnRyeSsrOwotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gMCAmJiBlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgewogICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOwpAQCAtOTgsOCArOTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiB1bmljb2RlX2VxKHN0YXJ0a2V5LCBrZXkpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CiAgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CkBAIC0xMTEsNyArMTExLDEwNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKKyAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CisKKyAgICAgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KK30KKworc3RhdGljIGludCBzZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICosIFB5X3NzaXplX3QpOworCitzdGF0aWMgaW50CitzZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCit7CisgICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgc2l6ZV90IHBlcnR1cmI7CisgICAgc2l6ZV90IG1hc2s7CisgICAgc2l6ZV90IGk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnNpZ25lZCBmb3IgZGVmaW5lZCBvdmVyZmxvdyBiZWhhdmlvciAqLworICAgIHNpemVfdCBqOworICAgIGludCBjbXA7CisKKyAgICAvKiBQcmUtaW5jcmVtZW50IGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGFyYml0cmFyeSBjb2RlIGluIHRoZSByaWNoCisgICAgICAgY29tcGFyaXNvbiBmcm9tIGRlYWxsb2NhdGluZyB0aGUga2V5IGp1c3QgYmVmb3JlIHRoZSBpbnNlcnRpb24uICovCisgICAgUHlfSU5DUkVGKGtleSk7CisKKyAgcmVzdGFydDoKKworICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICBpID0gKHNpemVfdCloYXNoICYgbWFzazsKKworICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKworICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICBwZXJ0dXJiID0gaGFzaDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgLyogc3RhcnRrZXkgY2Fubm90IGJlIGEgZHVtbXkgYmVjYXVzZSB0aGUgZHVtbXkgaGFzaCBmaWVsZCBpcyAtMSAqLworICAgICAgICAgICAgYXNzZXJ0KHN0YXJ0a2V5ICE9IGR1bW15KTsKKyAgICAgICAgICAgIGlmIChzdGFydGtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQorICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc3RhcnRrZXksIGtleSwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGlmIChjbXAgPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpa2VseSAqLworICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfYWN0aXZlOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgLyogQ29udGludWluZyB0aGUgc2VhcmNoIGZyb20gdGhlIGN1cnJlbnQgZW50cnkgb25seSBtYWtlcworICAgICAgICAgICAgICAgc2Vuc2UgaWYgdGhlIHRhYmxlIGFuZCBlbnRyeSBhcmUgdW5jaGFuZ2VkOyBvdGhlcndpc2UsCisgICAgICAgICAgICAgICB3ZSBoYXZlIHRvIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nICovCisgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOyAgICAgICAgICAgICAgICAgLyogaGVscCBhdm9pZCBhIHJlZ2lzdGVyIHNwaWxsICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisKKyAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTElORUFSX1BST0JFUyA7IGorKykgeworICAgICAgICAgICAgICAgIGVudHJ5Kys7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IDAgJiYgZW50cnktPmtleSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX3VudXNlZF9vcl9kdW1teTsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRrZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjb21wYXJpc29uX2Vycm9yOworICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUgIT0gc28tPnRhYmxlIHx8IGVudHJ5LT5rZXkgIT0gc3RhcnRrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE5LDI5ICsyMTYsNTEgQEAKICAgICAgICAgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVDsKICAgICAgICAgaSA9IChpICogNSArIDEgKyBwZXJ0dXJiKSAmIG1hc2s7CiAKLSAgICAgICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKICAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gZm91bmRfbnVsbDsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfdW51c2VkX29yX2R1bW15OwogICAgIH0KLSAgZm91bmRfbnVsbDoKLSAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7CisKKyAgZm91bmRfdW51c2VkX29yX2R1bW15OgorICAgIGlmIChmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZvdW5kX3VudXNlZDsKKyAgICBzby0+dXNlZCsrOworICAgIGZyZWVzbG90LT5rZXkgPSBrZXk7CisgICAgZnJlZXNsb3QtPmhhc2ggPSBoYXNoOworICAgIHJldHVybiAwOworCisgIGZvdW5kX3VudXNlZDoKKyAgICBzby0+ZmlsbCsrOworICAgIHNvLT51c2VkKys7CisgICAgZW50cnktPmtleSA9IGtleTsKKyAgICBlbnRyeS0+aGFzaCA9IGhhc2g7CisgICAgaWYgKChzaXplX3Qpc28tPmZpbGwqMyA8IG1hc2sqMikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkKTsKKworICBmb3VuZF9hY3RpdmU6CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIDA7CisKKyAgY29tcGFyaXNvbl9lcnJvcjoKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCiBJbnRlcm5hbCByb3V0aW5lIHVzZWQgYnkgc2V0X3RhYmxlX3Jlc2l6ZSgpIHRvIGluc2VydCBhbiBpdGVtIHdoaWNoIGlzCiBrbm93biB0byBiZSBhYnNlbnQgZnJvbSB0aGUgc2V0LiAgVGhpcyByb3V0aW5lIGFsc28gYXNzdW1lcyB0aGF0CiB0aGUgc2V0IGNvbnRhaW5zIG5vIGRlbGV0ZWQgZW50cmllcy4gIEJlc2lkZXMgdGhlIHBlcmZvcm1hbmNlIGJlbmVmaXQsCi11c2luZyBzZXRfaW5zZXJ0X2NsZWFuKCkgaW4gc2V0X3RhYmxlX3Jlc2l6ZSgpIGlzIGRhbmdlcm91cyAoU0YgYnVnICMxNDU2MjA5KS4KLU5vdGUgdGhhdCBubyByZWZjb3VudHMgYXJlIGNoYW5nZWQgYnkgdGhpcyByb3V0aW5lOyBpZiBuZWVkZWQsIHRoZSBjYWxsZXIKLWlzIHJlc3BvbnNpYmxlIGZvciBpbmNyZWYnaW5nIGBrZXlgLgordGhlcmUgaXMgYWxzbyBzYWZldHkgYmVuZWZpdCBzaW5jZSB1c2luZyBzZXRfYWRkX2VudHJ5KCkgcmlza3MgbWFraW5nCithIGNhbGxiYWNrIGluIHRoZSBtaWRkbGUgb2YgYSBzZXRfdGFibGVfcmVzaXplKCksIHNlZSBpc3N1ZSAxNDU2MjA5LgorVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgdGhlIGtleSdzIHJlZmVyZW5jZSBjb3VudCBhbmQKK3RoZSBzZXRvYmplY3QncyBmaWxsIGFuZCB1c2VkIGZpZWxkcy4KICovCiBzdGF0aWMgdm9pZAotc2V0X2luc2VydF9jbGVhbihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQorc2V0X2luc2VydF9jbGVhbihzZXRlbnRyeSAqdGFibGUsIHNpemVfdCBtYXNrLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIHNpemVfdCBwZXJ0dXJiID0gaGFzaDsKLSAgICBzaXplX3QgbWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgc2l6ZV90IGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOwogICAgIHNpemVfdCBqOwogCkBAIC0xNjIsNDUgKzI4MSwxMSBAQAogICBmb3VuZF9udWxsOgogICAgIGVudHJ5LT5rZXkgPSBrZXk7CiAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgIHNvLT5maWxsKys7Ci0gICAgc28tPnVzZWQrKzsKIH0KIAogLyogPT09PT09PT0gRW5kIGxvZ2ljIGZvciBwcm9iaW5nIHRoZSBoYXNoIHRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCi0vKgotSW50ZXJuYWwgcm91dGluZSB0byBpbnNlcnQgYSBuZXcga2V5IGludG8gdGhlIHRhYmxlLgotVXNlZCBieSB0aGUgcHVibGljIGluc2VydCByb3V0aW5lLgotRWF0cyBhIHJlZmVyZW5jZSB0byBrZXkuCi0qLwotc3RhdGljIGludAotc2V0X2luc2VydF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKLXsKLSAgICBzZXRlbnRyeSAqZW50cnk7Ci0KLSAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOwotICAgIGlmIChlbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewotICAgICAgICAvKiBVTlVTRUQgKi8KLSAgICAgICAgZW50cnktPmtleSA9IGtleTsKLSAgICAgICAgZW50cnktPmhhc2ggPSBoYXNoOwotICAgICAgICBzby0+ZmlsbCsrOwotICAgICAgICBzby0+dXNlZCsrOwotICAgIH0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotICAgICAgICAvKiBEVU1NWSAqLwotICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OwotICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgICAgIHNvLT51c2VkKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogQUNUSVZFICovCi0gICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogLyoKIFJlc3RydWN0dXJlIHRoZSB0YWJsZSBieSBhbGxvY2F0aW5nIGEgbmV3IHRhYmxlIGFuZCByZWluc2VydGluZyBhbGwKIGtleXMgYWdhaW4uICBXaGVuIGVudHJpZXMgaGF2ZSBiZWVuIGRlbGV0ZWQsIHRoZSBuZXcgdGFibGUgbWF5CkBAIC0yMTMsMTAgKzI5OCwxMyBAQAogICAgIHNldGVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBvbGRmaWxsID0gc28tPmZpbGw7CiAgICAgUHlfc3NpemVfdCBvbGR1c2VkID0gc28tPnVzZWQ7CisgICAgUHlfc3NpemVfdCBvbGRtYXNrID0gc28tPm1hc2s7CisgICAgc2l6ZV90IG5ld21hc2s7CiAgICAgaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOwogICAgIHNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAKICAgICBhc3NlcnQobWludXNlZCA+PSAwKTsKKyAgICBtaW51c2VkID0gKG1pbnVzZWQgPiA1MDAwMCkgPyBtaW51c2VkICogMiA6IG1pbnVzZWQgKiA0OwogCiAgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCiAgICAgLyogWFhYIHNwZWVkLXVwIHdpdGggaW50cmluc2ljcyAqLwpAQCAtMjY0LDI1ICszNTIsMjQgQEAKICAgICAvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCiAgICAgYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKICAgICBtZW1zZXQobmV3dGFibGUsIDAsIHNpemVvZihzZXRlbnRyeSkgKiBuZXdzaXplKTsKLSAgICBzby0+ZmlsbCA9IDA7Ci0gICAgc28tPnVzZWQgPSAwOworICAgIHNvLT5maWxsID0gb2xkdXNlZDsKKyAgICBzby0+dXNlZCA9IG9sZHVzZWQ7CiAgICAgc28tPm1hc2sgPSBuZXdzaXplIC0gMTsKICAgICBzby0+dGFibGUgPSBuZXd0YWJsZTsKIAogICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKICAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CiAgICAgaWYgKG9sZGZpbGwgPT0gb2xkdXNlZCkgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgb2xkdXNlZC0tOwotICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4oc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKG5ld3RhYmxlLCBuZXdtYXNrLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGVudHJ5ID0gb2xkdGFibGU7IG9sZHVzZWQgPiAwOyBlbnRyeSsrKSB7CisgICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgZW50cnkgPD0gb2xkdGFibGUgKyBvbGRtYXNrOyBlbnRyeSsrKSB7CiAgICAgICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgICAgICBvbGR1c2VkLS07Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4obmV3dGFibGUsIG5ld21hc2ssIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5Miw1NyArMzc5LDMwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIENBVVRJT046IHNldF9hZGRfa2V5L2VudHJ5KCkgbXVzdCBndWFyYW50ZWUgaXQgd29uJ3QgcmVzaXplIHRoZSB0YWJsZSAqLwotCiBzdGF0aWMgaW50Ci1zZXRfYWRkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQorc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7Ci0gICAgUHlfc3NpemVfdCBuX3VzZWQ7Ci0gICAgUHlPYmplY3QgKmtleSA9IGVudHJ5LT5rZXk7Ci0gICAgUHlfaGFzaF90IGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKLSAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLSAgICBuX3VzZWQgPSBzby0+dXNlZDsKLSAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKLX0KLQotc3RhdGljIGludAotc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQotewotICAgIHNldGVudHJ5IGVudHJ5OwotICAgIFB5X2hhc2hfdCBoYXNoOwotCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8Ci0gICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9hZGRfZW50cnkoc28sICZlbnRyeSk7CisgICAgZW50cnkgPSBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVudHJ5LT5rZXkgIT0gTlVMTDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRElTQ0FSRF9OT1RGT1VORCAwCiAjZGVmaW5lIERJU0NBUkRfRk9VTkQgMQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9lbnRyeShQeVNldE9iamVjdCAqc28sIHNldGVudHJ5ICpvbGRlbnRyeSkKK3NldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5T2JqZWN0ICpvbGRfa2V5OwogCi0gICAgZW50cnkgPSBzZXRfbG9va2tleShzbywgb2xkZW50cnktPmtleSwgb2xkZW50cnktPmhhc2gpOworICAgIGVudHJ5ID0gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CiAgICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKICAgICBvbGRfa2V5ID0gZW50cnktPmtleTsKICAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CkBAIC0zNTMsMjIgKzQxMyw0NSBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQorc2V0X2FkZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotICAgIHNldGVudHJ5IGVudHJ5OwogICAgIFB5X2hhc2hfdCBoYXNoOwogCi0gICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CiAgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CiAgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAgICAgICAgIGlmIChoYXNoID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCAmZW50cnkpOworICAgIHJldHVybiBzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworfQorCitzdGF0aWMgaW50CitzZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKK30KKworc3RhdGljIGludAorc2V0X2Rpc2NhcmRfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKK3sKKyAgICBQeV9oYXNoX3QgaGFzaDsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDQ5LDIwICs1MzIsMjIgQEAKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBtYXNrOwotICAgIHNldGVudHJ5ICp0YWJsZTsKKyAgICBzZXRlbnRyeSAqZW50cnk7CiAKICAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAgICAgaSA9ICpwb3NfcHRyOwogICAgIGFzc2VydChpID49IDApOwotICAgIHRhYmxlID0gc28tPnRhYmxlOwogICAgIG1hc2sgPSBzby0+bWFzazsKLSAgICB3aGlsZSAoaSA8PSBtYXNrICYmICh0YWJsZVtpXS5rZXkgPT0gTlVMTCB8fCB0YWJsZVtpXS5rZXkgPT0gZHVtbXkpKQorICAgIGVudHJ5ID0gJnNvLT50YWJsZVtpXTsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkpIHsKICAgICAgICAgaSsrOworICAgICAgICBlbnRyeSsrOworICAgIH0KICAgICAqcG9zX3B0ciA9IGkrMTsKICAgICBpZiAoaSA+IG1hc2spCiAgICAgICAgIHJldHVybiAwOwotICAgIGFzc2VydCh0YWJsZVtpXS5rZXkgIT0gTlVMTCk7Ci0gICAgKmVudHJ5X3B0ciA9ICZ0YWJsZVtpXTsKKyAgICBhc3NlcnQoZW50cnkgIT0gTlVMTCk7CisgICAgKmVudHJ5X3B0ciA9IGVudHJ5OwogICAgIHJldHVybiAxOwogfQogCkBAIC01NjAsOCArNjQ1LDggQEAKICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAogICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgogICAgICAqLwotICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgewotICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKKyAgICBpZiAoKHNvLT5maWxsICsgb3RoZXItPnVzZWQpKjMgPj0gc28tPm1hc2sqMikgeworICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCArIG90aGVyLT51c2VkKSAhPSAwKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHNvX2VudHJ5ID0gc28tPnRhYmxlOwpAQCAtNTg2LDExICs2NzEsMTUgQEAKIAogICAgIC8qIElmIG91ciB0YWJsZSBpcyBlbXB0eSwgd2UgY2FuIHVzZSBzZXRfaW5zZXJ0X2NsZWFuKCkgKi8KICAgICBpZiAoc28tPmZpbGwgPT0gMCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyssIG90aGVyX2VudHJ5KyspIHsKKyAgICAgICAgc2V0ZW50cnkgKm5ld3RhYmxlID0gc28tPnRhYmxlOworICAgICAgICBzaXplX3QgbmV3bWFzayA9IChzaXplX3Qpc28tPm1hc2s7CisgICAgICAgIHNvLT5maWxsID0gb3RoZXItPnVzZWQ7CisgICAgICAgIHNvLT51c2VkID0gb3RoZXItPnVzZWQ7CisgICAgICAgIGZvciAoaSA9IG90aGVyLT5tYXNrICsgMTsgaSA+IDAgOyBpLS0sIG90aGVyX2VudHJ5KyspIHsKICAgICAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgICAgICBpZiAoa2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15KSB7CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CisgICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihuZXd0YWJsZSwgbmV3bWFzaywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC02MDEsNDYgKzY5MCwxMyBAQAogICAgICAgICBvdGhlcl9lbnRyeSA9ICZvdGhlci0+dGFibGVbaV07CiAgICAgICAgIGtleSA9IG90aGVyX2VudHJ5LT5rZXk7CiAgICAgICAgIGlmIChrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXkpIHsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOwotICAgICAgICAgICAgaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgb3RoZXJfZW50cnktPmhhc2gpKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAotc2V0X2NvbnRhaW5zX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQotewotICAgIFB5T2JqZWN0ICprZXk7Ci0gICAgc2V0ZW50cnkgKmx1X2VudHJ5OwotCi0gICAgbHVfZW50cnkgPSBzZXRfbG9va2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotICAgIGlmIChsdV9lbnRyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAga2V5ID0gbHVfZW50cnktPmtleTsKLSAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwotfQotCi1zdGF0aWMgaW50Ci1zZXRfY29udGFpbnNfa2V5KFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKLXsKLSAgICBzZXRlbnRyeSBlbnRyeTsKLSAgICBQeV9oYXNoX3QgaGFzaDsKLQotICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAotICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkgewotICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotICAgICAgICBpZiAoaGFzaCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZW50cnkua2V5ID0ga2V5OwotICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgIHJldHVybiBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci19Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9wKFB5U2V0T2JqZWN0ICpzbykKIHsKQEAgLTY4Miw0MyArNzM4LDY0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoIHZhbHVlcy4KKyAgIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSB1c2UgY2FzZXMgaGF2ZSBtYW55IGNvbWJpbmF0aW9ucyBvZiBhCisgICBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdAorICAgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLworCitzdGF0aWMgUHlfdWhhc2hfdAorX3NodWZmbGVfYml0cyhQeV91aGFzaF90IGgpCit7CisgICAgcmV0dXJuICgoaCBeIDg5ODY5NzQ3VUwpIF4gKGggPDwgMTYpKSAqIDM2NDQ3OTgxNjdVTDsKK30KKworLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob3NlbgorICAgbGFyZ2UgcHJpbWVzIHdpdGggImludGVyZXN0aW5nIGJpdCBwYXR0ZXJucyIgYW5kIHRoYXQgcGFzc2VkIHRlc3RzCisgICBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMgZGF0YXNldHMKKyAgIGluY2x1ZGluZyBwb3dlcnNldHMgYW5kIGdyYXBoIHN0cnVjdHVyZXMgKHN1Y2ggYXMgRGF2aWQgRXBwc3RlaW4ncworICAgZ3JhcGggcmVjaXBlcyBpbiBMaWIvdGVzdC90ZXN0X3NldC5weSkgKi8KKwogc3RhdGljIFB5X2hhc2hfdAogZnJvemVuc2V0X2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgLyogTW9zdCBvZiB0aGUgY29uc3RhbnRzIGluIHRoaXMgaGFzaCBhbGdvcml0aG0gYXJlIHJhbmRvbWx5IGNob29zZW4KLSAgICAgICBsYXJnZSBwcmltZXMgd2l0aCAiaW50ZXJlc3RpbmcgYml0IHBhdHRlcm5zIiBhbmQgdGhhdCBwYXNzZWQKLSAgICAgICB0ZXN0cyBmb3IgZ29vZCBjb2xsaXNpb24gc3RhdGlzdGljcyBvbiBhIHZhcmlldHkgb2YgcHJvYmxlbWF0aWMKLSAgICAgICBkYXRhc2V0cyBzdWNoIGFzOgotCi0gICAgICAgICAgcHMgPSBbXQotICAgICAgICAgIGZvciByIGluIHJhbmdlKDIxKToKLSAgICAgICAgICAgICAgcHMgKz0gaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhyYW5nZSgyMCksIHIpCi0gICAgICAgICAgbnVtX2Rpc3RpbmN0X2hhc2hlcyA9IGxlbih7aGFzaChmcm96ZW5zZXQocykpIGZvciBzIGluIHBzfSkKLQotICAgICovCiAgICAgUHlTZXRPYmplY3QgKnNvID0gKFB5U2V0T2JqZWN0ICopc2VsZjsKLSAgICBQeV91aGFzaF90IGgsIGhhc2ggPSAxOTI3ODY4MjM3VUw7CisgICAgUHlfdWhhc2hfdCBoYXNoID0gMDsKICAgICBzZXRlbnRyeSAqZW50cnk7Ci0gICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCiAgICAgaWYgKHNvLT5oYXNoICE9IC0xKQogICAgICAgICByZXR1cm4gc28tPmhhc2g7CiAKLSAgICBoYXNoICo9IChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMTsKLSAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2gKLSAgICAgICAgICAgdmFsdWVzLiAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkKLSAgICAgICAgICAgY29tYmluYXRpb25zIG9mIGEgc21hbGwgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggbmVhcmJ5Ci0gICAgICAgICAgIGhhc2hlcyBzbyB0aGF0IG1hbnkgZGlzdGluY3QgY29tYmluYXRpb25zIGNvbGxhcHNlIHRvIG9ubHkKLSAgICAgICAgICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLwotICAgICAgICBoID0gZW50cnktPmhhc2g7Ci0gICAgICAgIGhhc2ggXj0gKChoIF4gODk4Njk3NDdVTCkgXiAoaCA8PCAxNikpICogMzY0NDc5ODE2N1VMOwotICAgIH0KLSAgICAvKiBNYWtlIHRoZSBmaW5hbCByZXN1bHQgc3ByZWFkLW91dCBpbiBhIGRpZmZlcmVudCBwYXR0ZXJuCi0gICAgICAgdGhhbiB0aGUgYWxnb3JpdGhtIGZvciB0dXBsZXMgb3Igb3RoZXIgcHl0aG9uIG9iamVjdHMuICovCisgICAgLyogWG9yLWluIHNodWZmbGVkIGJpdHMgZnJvbSBldmVyeSBlbnRyeSdzIGhhc2ggZmllbGQgYmVjYXVzZSB4b3IgaXMKKyAgICAgICBjb21tdXRhdGl2ZSBhbmQgYSBmcm96ZW5zZXQgaGFzaCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2Ygb3JkZXIuCisKKyAgICAgICBGb3Igc3BlZWQsIGluY2x1ZGUgbnVsbCBlbnRyaWVzIGFuZCBkdW1teSBlbnRyaWVzIGFuZCB0aGVuCisgICAgICAgc3VidHJhY3Qgb3V0IHRoZWlyIGVmZmVjdCBhZnRlcndhcmRzIHNvIHRoYXQgdGhlIGZpbmFsIGhhc2gKKyAgICAgICBkZXBlbmRzIG9ubHkgb24gYWN0aXZlIGVudHJpZXMuICBUaGlzIGFsbG93cyB0aGUgY29kZSB0byBiZQorICAgICAgIHZlY3Rvcml6ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBpdCBzYXZlcyB0aGUgdW5wcmVkaWN0YWJsZQorICAgICAgIGJyYW5jaGVzIHRoYXQgd291bGQgYXJpc2Ugd2hlbiB0cnlpbmcgdG8gZXhjbHVkZSBudWxsIGFuZCBkdW1teQorICAgICAgIGVudHJpZXMgb24gZXZlcnkgaXRlcmF0aW9uLiAqLworCisgICAgZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZW50cnkgPD0gJnNvLT50YWJsZVtzby0+bWFza107IGVudHJ5KyspCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cyhlbnRyeS0+aGFzaCk7CisKKyAgICAvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBhbiBvZGQgbnVtYmVyIG9mIE5VTEwgZW50cmllcyAqLworICAgIGlmICgoc28tPm1hc2sgKyAxIC0gc28tPmZpbGwpICYgMSkKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKDApOworCisgICAgLyogUmVtb3ZlIHRoZSBlZmZlY3Qgb2YgYW4gb2RkIG51bWJlciBvZiBkdW1teSBlbnRyaWVzICovCisgICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAmIDEpCisgICAgICAgIGhhc2ggXj0gX3NodWZmbGVfYml0cygtMSk7CisKKyAgICAvKiBGYWN0b3IgaW4gdGhlIG51bWJlciBvZiBhY3RpdmUgZW50cmllcyAqLworICAgIGhhc2ggXj0gKChQeV91aGFzaF90KVB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMSkgKiAxOTI3ODY4MjM3VUw7CisKKyAgICAvKiBEaXNwZXJzZSBwYXR0ZXJucyBhcmlzaW5nIGluIG5lc3RlZCBmcm96ZW5zZXRzICovCiAgICAgaGFzaCA9IGhhc2ggKiA2OTA2OVUgKyA5MDcxMzM5MjNVTDsKKworICAgIC8qIC0xIGlzIHJlc2VydmVkIGFzIGFuIGVycm9yIGNvZGUgKi8KICAgICBpZiAoaGFzaCA9PSAoUHlfdWhhc2hfdCktMSkKICAgICAgICAgaGFzaCA9IDU5MDkyMzcxM1VMOworCiAgICAgc28tPmhhc2ggPSBoYXNoOwogICAgIHJldHVybiBoYXNoOwogfQpAQCAtODY1LDcgKzk0Miw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC05MTAsMTggKzk4NywxNCBAQAogICAgICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBrZXlzLiAgRXhwZWN0CiAgICAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCiAgICAgICAgICovCi0gICAgICAgIGlmIChkaWN0c2l6ZSA9PSAtMSkKKyAgICAgICAgaWYgKGRpY3RzaXplIDwgMCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKChzby0+ZmlsbCArIGRpY3RzaXplKSozID49IChzby0+bWFzaysxKSoyKSB7Ci0gICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgKHNvLT51c2VkICsgZGljdHNpemUpKjIpICE9IDApCisgICAgICAgIGlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSBzby0+bWFzayoyKSB7CisgICAgICAgICAgICBpZiAoc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQgKyBkaWN0c2l6ZSkgIT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwotCi0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpKQorICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTAxNSw3ICsxMDg4LDggQEAKIHsKICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OwogCi0gICAgaWYgKHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJmcm96ZW5zZXQoKSIsIGt3ZHMpKQorICAgIGlmIChrd2RzICE9IE5VTEwgJiYgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZQorICAgICAgICAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCB0eXBlLT50cF9uYW1lLCAwLCAxLCAmaXRlcmFibGUpKQpAQCAtMTA0MiwyNCArMTExNiw5IEBACiAgICAgcmV0dXJuIGVtcHR5ZnJvemVuc2V0OwogfQogCi1pbnQKLVB5U2V0X0NsZWFyRnJlZUxpc3Qodm9pZCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZAotUHlTZXRfRmluaSh2b2lkKQotewotICAgIFB5X0NMRUFSKGVtcHR5ZnJvemVuc2V0KTsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgaWYgKHR5cGUgPT0gJlB5U2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzZXQoKSIsIGt3ZHMpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7CiB9CiAKQEAgLTEyMDEsNiArMTI2MCw4IEBACiB7CiAgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CisgICAgUHlfaGFzaF90IGhhc2g7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQogICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwpAQCAtMTIyMCwxMyArMTI4MSwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJ2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyNDIsMzIgKzEzMDUsMTUgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBpbnQgcnY7Ci0gICAgICAgIHNldGVudHJ5IGVudHJ5OwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQotICAgICAgICBpZiAoaGFzaCA9PSAtMSkgewotICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgZW50cnkua2V5ID0ga2V5OwotICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICBpZiAocnYpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICB9CkBAIC0xMjc3LDYgKzEzMjMsMTEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgIGVycm9yOgorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzYzLDYgKzE0MTQsNyBAQAogc2V0X2lzZGlzam9pbnQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7CiAgICAgUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIGludCBydjsKIAogICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikgewogICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUoc28pID09IDApCkBAIC0xMzgxLDggKzE0MzMsOCBAQAogICAgICAgICAgICAgb3RoZXIgPSB0bXA7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJ2KQogICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTEzOTUsOCArMTQ0Nyw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgaW50IHJ2OwotICAgICAgICBzZXRlbnRyeSBlbnRyeTsKICAgICAgICAgUHlfaGFzaF90IGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKQEAgLTE0MDQsMTEgKzE0NTQsOSBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTE0MzcsNyArMTQ4NSw3IEBACiAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAogICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpCi0gICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUHlPYmplY3QgKmtleSwgKml0OwpAQCAtMTQ0Niw3ICsxNDk0LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTE0NTcsMTAgKzE1MDUsMTAgQEAKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIC8qIElmIG1vcmUgdGhhbiAxLzUgYXJlIGR1bW1pZXMsIHRoZW4gcmVzaXplIHRoZW0gYXdheS4gKi8KLSAgICBpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICogNSA8IHNvLT5tYXNrKQorICAgIC8qIElmIG1vcmUgdGhhbiAxLzR0aCBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLworICAgIGlmICgoc2l6ZV90KShzby0+ZmlsbCAtIHNvLT51c2VkKSA8PSAoc2l6ZV90KXNvLT5tYXNrIC8gNCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDg3LDcgKzE1MzUsNyBAQAogICAgIHJlc3VsdCA9IHNldF9jb3B5KHNvKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpICE9IC0xKQorICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpID09IDApCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNDk3LDggKzE1NDUsMTEgQEAKIHNldF9kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeV9oYXNoX3QgaGFzaDsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIGludCBydjsKIAogICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpICAmJiAhUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CiAgICAgICAgIHJldHVybiBzZXRfY29weV9hbmRfZGlmZmVyZW5jZShzbywgb3RoZXIpOwpAQCAtMTUxNiwxNyArMTU2NywxNSBAQAogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGVudHJ5Y29weTsKLSAgICAgICAgICAgIGludCBydjsKLSAgICAgICAgICAgIGVudHJ5Y29weS5oYXNoID0gZW50cnktPmhhc2g7Ci0gICAgICAgICAgICBlbnRyeWNvcHkua2V5ID0gZW50cnktPmtleTsKLSAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwga2V5LCBoYXNoKTsKICAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsICZlbnRyeWNvcHkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTM3LDEzICsxNTg2LDE1IEBACiAKICAgICAvKiBJdGVyYXRlIG92ZXIgc28sIGNoZWNraW5nIGZvciBjb21tb24gZWxlbWVudHMgaW4gb3RoZXIuICovCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXJ2KSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGVudHJ5KSkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xNjA1LDI5ICsxNjU2LDI0IEBACiAgICAgUHlTZXRPYmplY3QgKm90aGVyc2V0OwogICAgIFB5T2JqZWN0ICprZXk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5X2hhc2hfdCBoYXNoOwogICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCiAgICAgICAgIHJldHVybiBzZXRfY2xlYXIoc28pOwogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdmFsdWU7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgUHlfaGFzaF90IGhhc2g7CiAgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQob3RoZXIsICZwb3MsICZrZXksICZ2YWx1ZSwgJmhhc2gpKSB7Ci0gICAgICAgICAgICBzZXRlbnRyeSBhbl9lbnRyeTsKLQogICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLQotICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgJmFuX2VudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY0NywxMyArMTY5MywxNSBAQAogICAgIH0KIAogICAgIHdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgewotICAgICAgICBpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBlbnRyeSkpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTE3MTUsNiArMTc2Myw3IEBACiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdG1wLCAqcmVzdWx0OwpAQCAtMTcyOSw4ICsxNzc4LDggQEAKICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKCFydikKICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTE4MjEsNyArMTg3MCw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfY29udGFpbnNfa2V5KHNvLCBrZXkpOwotICAgIGlmIChydiA9PSAtMSkgeworICAgIGlmIChydiA8IDApIHsKICAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODQwLDcgKzE4ODksNyBAQAogICAgIGxvbmcgcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gc2V0X2NvbnRhaW5zKHNvLCBrZXkpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgaWYgKHJlc3VsdCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KQEAgLTE4NTQsNyArMTkwMyw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0gICAgaWYgKHJ2ID09IC0xKSB7CisgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMTg2Myw3ICsxOTEyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKICAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTg4Niw3ICsxOTM1LDcgQEAKICAgICBpbnQgcnY7CiAKICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLSAgICBpZiAocnYgPT0gLTEpIHsKKyAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODk1LDcgKzE5NDQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCB0bXBrZXkpOwogICAgICAgICBQeV9ERUNSRUYodG1wa2V5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X1JFVFVSTl9OT05FOwpAQCAtMTk1MSwxMSArMjAwMCwxMiBAQAogCiAgICAgaWYgKCFQeUFueVNldF9DaGVjayhzZWxmKSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeVNldF9DaGVjayhzZWxmKSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCisgICAgaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeVNldF9DaGVjayhzZWxmKSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzZXRfY2xlYXJfaW50ZXJuYWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmZpbGwpCisgICAgICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKICAgICBzZWxmLT5oYXNoID0gLTE7CiAgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMjEyMiw3ICsyMTcyLDcgQEAKICAgICAgY29weV9kb2N9LAogICAgIHsiZGlmZmVyZW5jZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWZmZXJlbmNlX211bHRpLCAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgZGlmZmVyZW5jZV9kb2N9LAotICAgIHsiaW50ZXJzZWN0aW9uIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl9tdWx0aSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICB7ImludGVyc2VjdGlvbiIsICAgIChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICBNRVRIX1ZBUkFSR1MsCiAgICAgIGludGVyc2VjdGlvbl9kb2N9LAogICAgIHsiaXNkaXNqb2ludCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc2Rpc2pvaW50LCAgICBNRVRIX08sCiAgICAgIGlzZGlzam9pbnRfZG9jfSwKQEAgLTIxOTMsNyArMjI0Myw3IEBACiAgICAgKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIChyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIG9mZnNldG9mKFB5U2V0T2JqZWN0LCB3ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgKGdldGl0ZXJmdW5jKXNldF9pdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgZnJvemVuc2V0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwpAQCAtMjI3Nyw2ICsyMzI3LDE4IEBACiB9CiAKIGludAorUHlTZXRfQ2xlYXJGcmVlTGlzdCh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkCitQeVNldF9GaW5pKHZvaWQpCit7CisgICAgUHlfQ0xFQVIoZW1wdHlmcm96ZW5zZXQpOworfQorCitpbnQKIF9QeVNldF9OZXh0RW50cnkoUHlPYmplY3QgKnNldCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlfaGFzaF90ICpoYXNoKQogewogICAgIHNldGVudHJ5ICplbnRyeTsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2NvZGVjcy5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKaW5kZXggMGZjNmI1OC4uMmJlYjYwNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmgKQEAgLTI2Myw0OSArMjYzLDMzIEBACiAjZGVmaW5lIE1BWF9TSE9SVF9VTklDSEFSUyAzMDAgIC8qIGxhcmdlc3Qgc2l6ZSB3ZSdsbCBkbyBvbiB0aGUgc3RhY2sgKi8KIAogICAgIFB5X3NzaXplX3QgaTsgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBzIG9mIG5leHQgaW5wdXQgYnl0ZSAqLwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgLyogcmVzdWx0IHN0cmluZyBvYmplY3QgKi8KICAgICBjaGFyICpwOyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgZnJlZSBieXRlIGluIG91dHB1dCBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IG5hbGxvY2F0ZWQ7ICAgICAgLyogbnVtYmVyIG9mIHJlc3VsdCBieXRlcyBhbGxvY2F0ZWQgKi8KLSAgICBQeV9zc2l6ZV90IG5uZWVkZWQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJlc3VsdCBieXRlcyBuZWVkZWQgKi8KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCi0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVwID0gTlVMTDsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAjZW5kaWYKICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMQogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDI7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiAyXTsKICNlbGlmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAyCiAgICAgY29uc3QgUHlfc3NpemVfdCBtYXhfY2hhcl9zaXplID0gMzsKLSAgICBjaGFyIHN0YWNrYnVmW01BWF9TSE9SVF9VTklDSEFSUyAqIDNdOwogI2Vsc2UgLyogIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSA0ICovCiAgICAgY29uc3QgUHlfc3NpemVfdCBtYXhfY2hhcl9zaXplID0gNDsKLSAgICBjaGFyIHN0YWNrYnVmW01BWF9TSE9SVF9VTklDSEFSUyAqIDRdOwogI2VuZGlmCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgYXNzZXJ0KHNpemUgPj0gMCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAotICAgIGlmIChzaXplIDw9IE1BWF9TSE9SVF9VTklDSEFSUykgewotICAgICAgICAvKiBXcml0ZSBpbnRvIHRoZSBzdGFjayBidWZmZXI7IG5hbGxvY2F0ZWQgY2FuJ3Qgb3ZlcmZsb3cuCi0gICAgICAgICAqIEF0IHRoZSBlbmQsIHdlJ2xsIGFsbG9jYXRlIGV4YWN0bHkgYXMgbXVjaCBoZWFwIHNwYWNlIGFzIGl0Ci0gICAgICAgICAqIHR1cm5zIG91dCB3ZSBuZWVkLgotICAgICAgICAgKi8KLSAgICAgICAgbmFsbG9jYXRlZCA9IFB5X1NBRkVfRE9XTkNBU1Qoc2l6ZW9mKHN0YWNrYnVmKSwgc2l6ZV90LCBpbnQpOwotICAgICAgICByZXN1bHQgPSBOVUxMOyAgIC8qIHdpbGwgYWxsb2NhdGUgYWZ0ZXIgd2UncmUgZG9uZSAqLwotICAgICAgICBwID0gc3RhY2tidWY7CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG1heF9jaGFyX3NpemUpIHsKKyAgICAgICAgLyogaW50ZWdlciBvdmVyZmxvdyAqLworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgfQotICAgICAgICAvKiBPdmVyYWxsb2NhdGUgb24gdGhlIGhlYXAsIGFuZCBnaXZlIHRoZSBleGNlc3MgYmFjayBhdCB0aGUgZW5kLiAqLwotICAgICAgICBuYWxsb2NhdGVkID0gc2l6ZSAqIG1heF9jaGFyX3NpemU7Ci0gICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmFsbG9jYXRlZCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICB9CisKKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSAqIG1heF9jaGFyX3NpemUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7KSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBkYXRhW2krK107CkBAIC0zMjYsNzIgKzMxMCwxMTggQEAKICAgICAgICAgfQogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKICAgICAgICAgZWxzZSBpZiAoUHlfVU5JQ09ERV9JU19TVVJST0dBVEUoY2gpKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3BvczsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVwc2l6ZSwgaywgc3RhcnRwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIG5ld3BvczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgazsKKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCiAgICAgICAgICAgICBzdGFydHBvcyA9IGktMTsKLSAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAotICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLCAidXRmLTgiLCAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIsCi0gICAgICAgICAgICAgICAgICB1bmljb2RlLCAmZXhjLCBzdGFydHBvcywgc3RhcnRwb3MrMSwgJm5ld3Bvcyk7Ci0gICAgICAgICAgICBpZiAoIXJlcCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgZW5kcG9zID0gc3RhcnRwb3MrMTsKIAotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlCeXRlc19HRVRfU0laRShyZXApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApOworICAgICAgICAgICAgd2hpbGUgKChlbmRwb3MgPCBzaXplKSAmJiBQeV9VTklDT0RFX0lTX1NVUlJPR0FURShkYXRhW2VuZHBvc10pKQorICAgICAgICAgICAgICAgIGVuZHBvcysrOwogCi0gICAgICAgICAgICBpZiAocmVwc2l6ZSA+IG1heF9jaGFyX3NpemUpIHsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgIC8qIE9ubHkgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgaWYgaXQncyBub3QgdGhlIGxhc3Qgd3JpdGUgKi8KKyAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAoZW5kcG9zIDwgc2l6ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHAgLSBzdGFja2J1ZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOworICAgICAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBtZW1zZXQocCwgJz8nLCBlbmRwb3MgLSBzdGFydHBvcyk7CisgICAgICAgICAgICAgICAgcCArPSAoZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0aGUgaWdub3JlIGhhbmRsZXIgKi8KKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgaWYgKG5hbGxvY2F0ZWQgPiBQWV9TU0laRV9UX01BWCAtIHJlcHNpemUgKyBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURVBBU1M6CisgICAgICAgICAgICAgICAgZm9yIChrPXN0YXJ0cG9zOyBrPGVuZHBvczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gZGF0YVtrXTsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKSgweGUwIHwgKGNoID4+IDEyKSk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoMHg4MCB8ICgoY2ggPj4gNikgJiAweDNmKSk7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoMHg4MCB8IChjaCAmIDB4M2YpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFsbG9jYXRlZCArPSByZXBzaXplIC0gbWF4X2NoYXJfc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCBuYWxsb2NhdGVkKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmFsbG9jYXRlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIFB5X01FTUNQWShQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpLCBzdGFja2J1Ziwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCkgKyBvZmZzZXQ7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgewotICAgICAgICAgICAgICAgIGNoYXIgKnByZXAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXApOwotICAgICAgICAgICAgICAgIGZvcihrID0gcmVwc2l6ZTsgayA+IDA7IGstLSkKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9ICpwcmVwKys7Ci0gICAgICAgICAgICB9IGVsc2UgLyogcmVwIGlzIHVuaWNvZGUgKi8gewotICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQgcmVwa2luZDsKLSAgICAgICAgICAgICAgICB2b2lkICpyZXBkYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShyZXApIDwgMCkKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSBtYXhfY2hhcl9zaXplICogKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICBwID0gYmFja3NsYXNocmVwbGFjZSgmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIHN0YXJ0cG9zLCBlbmRwb3MpOworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgcmVwa2luZCA9IFB5VW5pY29kZV9LSU5EKHJlcCk7Ci0gICAgICAgICAgICAgICAgcmVwZGF0YSA9IFB5VW5pY29kZV9EQVRBKHJlcCk7CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8cmVwc2l6ZTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgYyA9IFB5VW5pY29kZV9SRUFEKHJlcGtpbmQsIHJlcGRhdGEsIGspOwotICAgICAgICAgICAgICAgICAgICBpZiAoMHg4MCA8PSBjKSB7CisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IG1heF9jaGFyX3NpemUgKiAoZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIHAgPSB4bWxjaGFycmVmcmVwbGFjZSgmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBzdGFydHBvcywgZW5kcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgICAgICAgICBmb3IgKGs9c3RhcnRwb3M7IGs8ZW5kcG9zOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBkYXRhW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoISgweERDODAgPD0gY2ggJiYgY2ggPD0gMHhEQ0ZGKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKGNoICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChrID49IGVuZHBvcykgeworICAgICAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhcnRwb3MgPSBrOworICAgICAgICAgICAgICAgIGFzc2VydChzdGFydHBvcyA8IGVuZHBvcyk7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIHRoZSBkZWZhdWx0IGhhbmRsZXIgKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVwID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosICJ1dGYtOCIsICJzdXJyb2dhdGVzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCAmZXhjLCBzdGFydHBvcywgZW5kcG9zLCAmbmV3cG9zKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gbWF4X2NoYXJfc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShyZXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJlcCBpcyB1bmljb2RlICovCisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0lTX0FTQ0lJKHJlcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgInV0Zi04IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0xLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpYzsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVwKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9EQVRBKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcCkpOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKKworICAgICAgICAgICAgICAgIGkgPSBuZXdwb3M7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9DTEVBUihyZXApOworCisgICAgICAgICAgICAvKiBJZiBvdmVyYWxsb2NhdGlvbiB3YXMgZGlzYWJsZWQsIGVuc3VyZSB0aGF0IGl0IHdhcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgaSA9PSBzaXplKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMgpAQCAtNDE2LDMxICs0NDYsMTggQEAKICNlbmRpZiAvKiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxICovCiAgICAgfQogCi0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIFRoaXMgd2FzIHN0YWNrIGFsbG9jYXRlZC4gKi8KLSAgICAgICAgbm5lZWRlZCA9IHAgLSBzdGFja2J1ZjsKLSAgICAgICAgYXNzZXJ0KG5uZWVkZWQgPD0gbmFsbG9jYXRlZCk7Ci0gICAgICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoc3RhY2tidWYsIG5uZWVkZWQpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogQ3V0IGJhY2sgdG8gc2l6ZSBhY3R1YWxseSBuZWVkZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0KG5uZWVkZWQgPD0gbmFsbG9jYXRlZCk7Ci0gICAgICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCBubmVlZGVkKTsKLSAgICB9Ci0KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCi0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICNlbmRpZgotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKIAogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKICBlcnJvcjoKICAgICBQeV9YREVDUkVGKHJlcCk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmggYi9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKaW5kZXggY2RhNjhlNy4uOTgxNjVhZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaApAQCAtMzIsNTIgKzMyLDk4IEBACiAjZGVmaW5lIFNUUklOR0xJQl9CTE9PTShtYXNrLCBjaCkgICAgIFwKICAgICAoKG1hc2sgJiAgKDFVTCA8PCAoKGNoKSAmIChTVFJJTkdMSUJfQkxPT01fV0lEVEggLTEpKSkpKQogCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKK1NUUklOR0xJQihmaW5kX2NoYXIpKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzLCBQeV9zc2l6ZV90IG4sIFNUUklOR0xJQl9DSEFSIGNoKQoreworICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpwLCAqZTsKKworICAgIHAgPSBzOworICAgIGUgPSBzICsgbjsKKyAgICBpZiAobiA+IDEwKSB7CisjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKKyAgICAgICAgcCA9IG1lbWNocihzLCBjaCwgbik7CisgICAgICAgIGlmIChwICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKHAgLSBzKTsKKyAgICAgICAgcmV0dXJuIC0xOworI2Vsc2UKKyAgICAgICAgLyogdXNlIG1lbWNociBpZiB3ZSBjYW4gY2hvb3NlIGEgbmVlZGxlIHdpdGhvdXQgdHdvIG1hbnkgbGlrZWx5CisgICAgICAgICAgIGZhbHNlIHBvc2l0aXZlcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZSA9IGNoICYgMHhmZjsKKyAgICAgICAgLyogSWYgbG9va2luZyBmb3IgYSBtdWx0aXBsZSBvZiAyNTYsIHdlJ2QgaGF2ZSB0b28KKyAgICAgICAgICAgbWFueSBmYWxzZSBwb3NpdGl2ZXMgbG9va2luZyBmb3IgdGhlICdcMCcgYnl0ZSBpbiBVQ1MyCisgICAgICAgICAgIGFuZCBVQ1M0IHJlcHJlc2VudGF0aW9ucy4gKi8KKyAgICAgICAgaWYgKG5lZWRsZSAhPSAwKSB7CisgICAgICAgICAgICB3aGlsZSAocCA8IGUpIHsKKyAgICAgICAgICAgICAgICB2b2lkICpjYW5kaWRhdGUgPSBtZW1jaHIocCwgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSAtIHApICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcCA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKQorICAgICAgICAgICAgICAgICAgICAgICAgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgICAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgd2hpbGUgKHAgPCBlKSB7CisgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1TVFJJTkdMSUIoZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIpKGNvbnN0IFNUUklOR0xJQl9DSEFSKiBzLCBQeV9zc2l6ZV90IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUklOR0xJQl9DSEFSIGNoLCB1bnNpZ25lZCBjaGFyIG5lZWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpCitTVFJJTkdMSUIocmZpbmRfY2hhcikoY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwgU1RSSU5HTElCX0NIQVIgY2gpCiB7Ci0gICAgaWYgKG1vZGUgPT0gRkFTVF9TRUFSQ0gpIHsKLSAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKnB0ciA9IHM7Ci0gICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICplID0gcyArIG47Ci0gICAgICAgIHdoaWxlIChwdHIgPCBlKSB7Ci0gICAgICAgICAgICB2b2lkICpjYW5kaWRhdGUgPSBtZW1jaHIoKGNvbnN0IHZvaWQgKikgcHRyLCBuZWVkbGUsIChlIC0gcHRyKSAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIHB0ciA9IChjb25zdCBTVFJJTkdMSUJfQ0hBUiAqKSBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotICAgICAgICAgICAgaWYgKHNpemVvZihTVFJJTkdMSUJfQ0hBUikgPT0gMSB8fCAqcHRyID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiAocHRyIC0gcyk7Ci0gICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLwotICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqcDsKICNpZmRlZiBIQVZFX01FTVJDSFIKICAgICAvKiBtZW1yY2hyKCkgaXMgYSBHTlUgZXh0ZW5zaW9uLCBhdmFpbGFibGUgc2luY2UgZ2xpYmMgMi4xLjkxLgogICAgICAgIGl0IGRvZXNuJ3Qgc2VlbSBhcyBvcHRpbWl6ZWQgYXMgbWVtY2hyKCksIGJ1dCBpcyBzdGlsbCBxdWl0ZQotICAgICAgIGZhc3RlciB0aGFuIG91ciBoYW5kLXdyaXR0ZW4gbG9vcCBpbiBGQVNUU0VBUkNIIGJlbG93ICovCi0gICAgZWxzZSBpZiAobW9kZSA9PSBGQVNUX1JTRUFSQ0gpIHsKLSAgICAgICAgd2hpbGUgKG4gPiAwKSB7Ci0gICAgICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqZm91bmQ7Ci0gICAgICAgICAgICB2b2lkICpjYW5kaWRhdGUgPSBtZW1yY2hyKChjb25zdCB2b2lkICopIHMsIG5lZWRsZSwgbiAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGZvdW5kID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBuID0gZm91bmQgLSBzOwotICAgICAgICAgICAgaWYgKHNpemVvZihTVFJJTkdMSUJfQ0hBUikgPT0gMSB8fCAqZm91bmQgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZSAqLwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0jZW5kaWYKLSAgICBlbHNlIHsKLSAgICAgICAgYXNzZXJ0KDApOyAvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgICAgIGZhc3RlciB0aGFuIG91ciBoYW5kLXdyaXR0ZW4gbG9vcCBiZWxvdyAqLwogCi0jdW5kZWYgRE9fTUVNQ0hSCisgICAgaWYgKG4gPiAxMCkgeworI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA9PSAxCisgICAgICAgIHAgPSBtZW1yY2hyKHMsIGNoLCBuKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgICAgICByZXR1cm4gLTE7CisjZWxzZQorICAgICAgICAvKiB1c2UgbWVtcmNociBpZiB3ZSBjYW4gY2hvb3NlIGEgbmVlZGxlIHdpdGhvdXQgdHdvIG1hbnkgbGlrZWx5CisgICAgICAgICAgIGZhbHNlIHBvc2l0aXZlcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZSA9IGNoICYgMHhmZjsKKyAgICAgICAgLyogSWYgbG9va2luZyBmb3IgYSBtdWx0aXBsZSBvZiAyNTYsIHdlJ2QgaGF2ZSB0b28KKyAgICAgICAgICAgbWFueSBmYWxzZSBwb3NpdGl2ZXMgbG9va2luZyBmb3IgdGhlICdcMCcgYnl0ZSBpbiBVQ1MyCisgICAgICAgICAgIGFuZCBVQ1M0IHJlcHJlc2VudGF0aW9ucy4gKi8KKyAgICAgICAgaWYgKG5lZWRsZSAhPSAwKSB7CisgICAgICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgICAgICB2b2lkICpjYW5kaWRhdGUgPSBtZW1yY2hyKHMsIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBwID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIG4gPSBwIC0gczsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gY2gpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZiAgLyogSEFWRV9NRU1SQ0hSICovCisgICAgcCA9IHMgKyBuOworICAgIHdoaWxlIChwID4gcykgeworICAgICAgICBwLS07CisgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKIFB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQpAQCAtOTksMjUgKzE0NSwxMSBAQAogICAgICAgICBpZiAobSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAvKiB1c2Ugc3BlY2lhbCBjYXNlIGZvciAxLWNoYXJhY3RlciBzdHJpbmdzICovCi0gICAgICAgIGlmIChuID4gMTAgJiYgKG1vZGUgPT0gRkFTVF9TRUFSQ0gKLSNpZmRlZiBIQVZFX01FTVJDSFIKLSAgICAgICAgICAgICAgICAgICAgfHwgbW9kZSA9PSBGQVNUX1JTRUFSQ0gKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICApKSB7Ci0gICAgICAgICAgICAvKiB1c2UgbWVtY2hyIGlmIHdlIGNhbiBjaG9vc2UgYSBuZWVkbGUgd2l0aG91dCB0d28gbWFueSBsaWtlbHkKLSAgICAgICAgICAgICAgIGZhbHNlIHBvc2l0aXZlcyAqLwotICAgICAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGU7Ci0gICAgICAgICAgICBuZWVkbGUgPSBwWzBdICYgMHhmZjsKLSNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCi0gICAgICAgICAgICAvKiBJZiBsb29raW5nIGZvciBhIG11bHRpcGxlIG9mIDI1Niwgd2UnZCBoYXZlIHRvbwotICAgICAgICAgICAgICAgbWFueSBmYWxzZSBwb3NpdGl2ZXMgbG9va2luZyBmb3IgdGhlICdcMCcgYnl0ZSBpbiBVQ1MyCi0gICAgICAgICAgICAgICBhbmQgVUNTNCByZXByZXNlbnRhdGlvbnMuICovCi0gICAgICAgICAgICBpZiAobmVlZGxlICE9IDApCi0jZW5kaWYKLSAgICAgICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCKGZhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKQotICAgICAgICAgICAgICAgICAgICAgICAocywgbiwgcFswXSwgbmVlZGxlLCBtb2RlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobW9kZSA9PSBGQVNUX0NPVU5UKSB7CisgICAgICAgIGlmIChtb2RlID09IEZBU1RfU0VBUkNIKQorICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQihmaW5kX2NoYXIpKHMsIG4sIHBbMF0pOworICAgICAgICBlbHNlIGlmIChtb2RlID09IEZBU1RfUlNFQVJDSCkKKyAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUIocmZpbmRfY2hhcikocywgbiwgcFswXSk7CisgICAgICAgIGVsc2UgeyAgLyogRkFTVF9DT1VOVCAqLwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CkBAIC0xMjUsMTQgKzE1Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF4Y291bnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gRkFTVF9TRUFSQ0gpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gcFswXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0gZWxzZSB7ICAgIC8qIEZBU1RfUlNFQVJDSCAqLwotICAgICAgICAgICAgZm9yIChpID0gbiAtIDE7IGkgPiAtMTsgaS0tKQotICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHBbMF0pCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmggYi9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmgKaW5kZXggMTQ4MTVmNi4uYTcwNjVmYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaApAQCAtMTIzLDExICsxMjMsNiBAQAogLyoKIFdyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBlbnN1cmVzIHRoYXQgdGhlCiBmaXJzdCBhcmd1bWVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LgotCi1Ob3RlIHRoYXQgd2UgcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgb2YgdGhlIHN1YnN0cmluZyBvYmplY3QsCi1zbyB3aGVuIHdlIGNyZWF0ZSB0aGF0IG9iamVjdCBpbiB0aGlzIGZ1bmN0aW9uIHdlIGRvbid0IERFQ1JFRiBpdCwKLWJlY2F1c2UgaXQgY29udGludWVzIGxpdmluZyBpbiB0aGUgY2FsbGVyIGZ1bmN0aW9ucyAodGhvc2UgZnVuY3Rpb25zLAotYWZ0ZXIgZmluaXNoaW5nIHVzaW5nIHRoZSBzdWJzdHJpbmcsIG11c3QgREVDUkVGIGl0KS4KICovCiAKIFB5X0xPQ0FMX0lOTElORShpbnQpCkBAIC0xMzUsMTQgKzEzMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1YnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKIHsKLSAgICBQeU9iamVjdCAqdG1wX3N1YnN0cmluZzsKLQotICAgIGlmKFNUUklOR0xJQihwYXJzZV9hcmdzX2ZpbmRzKShmdW5jdGlvbl9uYW1lLCBhcmdzLCAmdG1wX3N1YnN0cmluZywKKyAgICBpZihTVFJJTkdMSUIocGFyc2VfYXJnc19maW5kcykoZnVuY3Rpb25fbmFtZSwgYXJncywgc3Vic3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKSB7Ci0gICAgICAgIHRtcF9zdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCh0bXBfc3Vic3RyaW5nKTsKLSAgICAgICAgaWYgKCF0bXBfc3Vic3RyaW5nKQorICAgICAgICBpZiAoZW5zdXJlX3VuaWNvZGUoKnN1YnN0cmluZykgPCAwKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICpzdWJzdHJpbmcgPSB0bXBfc3Vic3RyaW5nOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaAppbmRleCBiZTA5YjVmLi4xNGZhMjhlIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICByZXR1cm4gUHlVbmljb2RlX1N1YnN0cmluZyhzdHItPnN0ciwgc3RyLT5zdGFydCwgc3RyLT5lbmQpOwogfQogCi0vKiByZXR1cm4gYSBuZXcgc3RyaW5nLiAgaWYgc3RyLT5zdHIgaXMgTlVMTCwgcmV0dXJuIE5vbmUgKi8KKy8qIHJldHVybiBhIG5ldyBzdHJpbmcuICBpZiBzdHItPnN0ciBpcyBOVUxMLCByZXR1cm4gYSBuZXcgZW1wdHkgc3RyaW5nICovCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIFN1YlN0cmluZ19uZXdfb2JqZWN0X29yX2VtcHR5KFN1YlN0cmluZyAqc3RyKQogewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYyBiL09iamVjdHMvc3RydWN0c2VxLmMKaW5kZXggNjY0MzQ0Yi4uZTMxNWNiYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYworKysgYi9PYmplY3RzL3N0cnVjdHNlcS5jCkBAIC00LDkgKzQsOSBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi1zdGF0aWMgY2hhciB2aXNpYmxlX2xlbmd0aF9rZXlbXSA9ICJuX3NlcXVlbmNlX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZpc2libGVfbGVuZ3RoX2tleVtdID0gIm5fc2VxdWVuY2VfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJlYWxfbGVuZ3RoX2tleVtdID0gIm5fZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVubmFtZWRfZmllbGRzX2tleVtdID0gIm5fdW5uYW1lZF9maWVsZHMiOwogCiAvKiBGaWVsZHMgd2l0aCB0aGlzIG5hbWUgaGF2ZSBvbmx5IGEgZmllbGQgaW5kZXgsIG5vdCBhIGZpZWxkIG5hbWUuCiAgICBUaGV5IGFyZSBvbmx5IGFsbG93ZWQgZm9yIGluZGljZXMgPCBuX3Zpc2libGVfZmllbGRzLiAqLwpAQCAtMTYsMTQgKzE2LDE0IEBACiBfUHlfSURFTlRJRklFUihuX3VubmFtZWRfZmllbGRzKTsKIAogI2RlZmluZSBWSVNJQkxFX1NJWkUob3ApIFB5X1NJWkUob3ApCi0jZGVmaW5lIFZJU0lCTEVfU0laRV9UUCh0cCkgUHlMb25nX0FzTG9uZyggXAorI2RlZmluZSBWSVNJQkxFX1NJWkVfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3NlcXVlbmNlX2ZpZWxkcykpCiAKLSNkZWZpbmUgUkVBTF9TSVpFX1RQKHRwKSBQeUxvbmdfQXNMb25nKCBcCisjZGVmaW5lIFJFQUxfU0laRV9UUCh0cCkgUHlMb25nX0FzU3NpemVfdCggXAogICAgICAgICAgICAgICAgICAgICAgIF9QeURpY3RfR2V0SXRlbUlkKCh0cCktPnRwX2RpY3QsICZQeUlkX25fZmllbGRzKSkKICNkZWZpbmUgUkVBTF9TSVpFKG9wKSBSRUFMX1NJWkVfVFAoUHlfVFlQRShvcCkpCiAKLSNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc0xvbmcoIFwKKyNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3VubmFtZWRfZmllbGRzKSkKICNkZWZpbmUgVU5OQU1FRF9GSUVMRFMob3ApIFVOTkFNRURfRklFTERTX1RQKFB5X1RZUEUob3ApKQogCkBAIC0xNjQsNyArMTY0LDggQEAKICNkZWZpbmUgVFlQRV9NQVhTSVpFIDEwMAogCiAgICAgUHlUeXBlT2JqZWN0ICp0eXAgPSBQeV9UWVBFKG9iaik7Ci0gICAgaW50IGksIHJlbW92ZWxhc3QgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgcmVtb3ZlbGFzdCA9IDA7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07CiAgICAgY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOwpAQCAtMjM2LDggKzIzNyw3IEBACiAgICAgUHlPYmplY3QqIHR1cCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIGRpY3QgPSBOVUxMOwogICAgIFB5T2JqZWN0KiByZXN1bHQ7Ci0gICAgUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkczsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG5fZmllbGRzLCBuX3Zpc2libGVfZmllbGRzLCBuX3VubmFtZWRfZmllbGRzLCBpOwogCiAgICAgbl9maWVsZHMgPSBSRUFMX1NJWkUoc2VsZik7CiAgICAgbl92aXNpYmxlX2ZpZWxkcyA9IFZJU0lCTEVfU0laRShzZWxmKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogewogICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5TWVtYmVyRGVmKiBtZW1iZXJzOwotICAgIGludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOworICAgIFB5X3NzaXplX3Qgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKICAgICBQeU9iamVjdCAqdjsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKQEAgLTM3Myw5ICszNzMsOSBAQAogICAgIFB5X0lOQ1JFRih0eXBlKTsKIAogICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OwotI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VUX0RJQ1RfRlJPTV9TSVpFKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tU3NpemVfdCh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh2ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdikgPCAwKSB7ICAgICAgICAgICBcCkBAIC0zODUsOSArMzg1LDkgQEAKICAgICAgICAgUHlfREVDUkVGKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAotICAgIFNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7Ci0gICAgU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOwotICAgIFNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOworICAgIFNFVF9ESUNUX0ZST01fU0laRSh2aXNpYmxlX2xlbmd0aF9rZXksIGRlc2MtPm5faW5fc2VxdWVuY2UpOworICAgIFNFVF9ESUNUX0ZST01fU0laRShyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9TSVpFKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggNzkyMGZlYy4uYTc3NzRlMiAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtMTQ5LDcgKzE0OSw2IEBACiBpbnQKIFB5VHVwbGVfU2V0SXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0gICAgUHlPYmplY3QgKm9sZGl0ZW07CiAgICAgUHlPYmplY3QgKipwOwogICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkgfHwgb3AtPm9iX3JlZmNudCAhPSAxKSB7CiAgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CkBAIC0xNjMsOSArMTYyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBwID0gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9YU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCAzYTA5YWY1Li4xYmFkOWFmIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtNTQ4LDcgKzU0OCw3IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpiZXN0X2Jhc2UoUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IG1yb19pbnRlcm5hbChQeVR5cGVPYmplY3QgKiwgUHlPYmplY3QgKiopOwogUHlfTE9DQUxfSU5MSU5FKGludCkgdHlwZV9pc19zdWJ0eXBlX2Jhc2VfY2hhaW4oUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKLXN0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNoYXIgKik7CitzdGF0aWMgaW50IGNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogc3RhdGljIGludCBhZGRfc3ViY2xhc3MoUHlUeXBlT2JqZWN0KiwgUHlUeXBlT2JqZWN0Kik7CiBzdGF0aWMgaW50IGFkZF9hbGxfc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpiYXNlcyk7CiBzdGF0aWMgdm9pZCByZW1vdmVfc3ViY2xhc3MoUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKQEAgLTg4OCwyNSArODg4LDMzIEBACiAjZW5kaWYKIAogICAgIG9iaiA9IHR5cGUtPnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLSAgICBpZiAob2JqICE9IE5VTEwpIHsKLSAgICAgICAgLyogVWdseSBleGNlcHRpb246IHdoZW4gdGhlIGNhbGwgd2FzIHR5cGUoc29tZXRoaW5nKSwKLSAgICAgICAgICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCi0gICAgICAgIGlmICh0eXBlID09ICZQeVR5cGVfVHlwZSAmJgotICAgICAgICAgICAgUHlUdXBsZV9DaGVjayhhcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKLSAgICAgICAgICAgIChrd2RzID09IE5VTEwgfHwKLSAgICAgICAgICAgICAoUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID09IDApKSkKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIC8qIElmIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHR5cGUsCi0gICAgICAgICAgIGl0IHdvbid0IGJlIGluaXRpYWxpemVkLiAqLwotICAgICAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7Ci0gICAgICAgIGlmICh0eXBlLT50cF9pbml0ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludCByZXMgPSB0eXBlLT50cF9pbml0KG9iaiwgYXJncywga3dkcyk7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOwotICAgICAgICAgICAgICAgIG9iaiA9IE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgb2JqID0gX1B5X0NoZWNrRnVuY3Rpb25SZXN1bHQoKFB5T2JqZWN0Kil0eXBlLCBvYmosIE5VTEwpOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAorICAgICAgIGRvbid0IGNhbGwgdHBfaW5pdCBvbiB0aGUgcmVzdWx0LiAqLworICAgIGlmICh0eXBlID09ICZQeVR5cGVfVHlwZSAmJgorICAgICAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgorICAgICAgICAoa3dkcyA9PSBOVUxMIHx8CisgICAgICAgICAoUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID09IDApKSkKKyAgICAgICAgcmV0dXJuIG9iajsKKworICAgIC8qIElmIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgbm90IGFuIGluc3RhbmNlIG9mIHR5cGUsCisgICAgICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCisgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2JqKSwgdHlwZSkpCisgICAgICAgIHJldHVybiBvYmo7CisKKyAgICB0eXBlID0gUHlfVFlQRShvYmopOworICAgIGlmICh0eXBlLT50cF9pbml0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHJlcyA9IHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKTsKKyAgICAgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICAgICAgb2JqID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydCghUHlFcnJfT2NjdXJyZWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG9iajsKQEAgLTE0MTEsNyArMTQxOSw3IEBACiAgICBhcyBsb29rdXBfbWV0aG9kIHRvIGNhY2hlIHRoZSBpbnRlcm5lZCBuYW1lIHN0cmluZyBvYmplY3QuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX21ldGhvZChQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY2hhciAqZm9ybWF0LCAuLi4pCitjYWxsX21ldGhvZChQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YTsKICAgICBQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOwpAQCAtMTQ0Nyw3ICsxNDU1LDcgQEAKIC8qIENsb25lIG9mIGNhbGxfbWV0aG9kKCkgdGhhdCByZXR1cm5zIE5vdEltcGxlbWVudGVkIHdoZW4gdGhlIGxvb2t1cCBmYWlscy4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNhbGxfbWF5YmUoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNoYXIgKmZvcm1hdCwgLi4uKQorY2FsbF9tYXliZShQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YTsKICAgICBQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOwpAQCAtMjA4NCw3ICsyMDkyLDcgQEAKIHN0YXRpYyBpbnQKIHN1YnR5cGVfc2V0ZGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICoqZGljdHB0cjsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CiAgICAgUHlUeXBlT2JqZWN0ICpiYXNlOwogCiAgICAgYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KFB5X1RZUEUob2JqKSk7CkBAIC0yMTE1LDEwICsyMTIzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICJub3QgYSAnJS4yMDBzJyIsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBkaWN0ID0gKmRpY3RwdHI7CiAgICAgUHlfWElOQ1JFRih2YWx1ZSk7Ci0gICAgKmRpY3RwdHIgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIFB5X1hTRVRSRUYoKmRpY3RwdHIsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjY3MSw3ICsyNjc3LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHNob3J0IHNsb3RvZmZzZXRzW10gPSB7CitzdGF0aWMgY29uc3Qgc2hvcnQgc2xvdG9mZnNldHNbXSA9IHsKICAgICAtMSwgLyogaW52YWxpZCBzbG90ICovCiAjaW5jbHVkZSAidHlwZXNsb3RzLmluYyIKIH07CkBAIC0zNTkwLDcgKzM1OTYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1jb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCogb2xkdG8sIFB5VHlwZU9iamVjdCogbmV3dG8sIGNoYXIqIGF0dHIpCitjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCogb2xkdG8sIFB5VHlwZU9iamVjdCogbmV3dG8sIGNvbnN0IGNoYXIqIGF0dHIpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICpuZXdiYXNlLCAqb2xkYmFzZTsKIApAQCAtMzg2Niw2ICszODcyLDI0IEBACiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQoc2xvdG5hbWVzID09IFB5X05vbmUgfHwgUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpOworICAgICAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgYmFzaWNzaXplID0gUHlCYXNlT2JqZWN0X1R5cGUudHBfYmFzaWNzaXplOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfZGljdG9mZnNldCkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQpCisgICAgICAgICAgICAgICAgYmFzaWNzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGlmIChzbG90bmFtZXMgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopICogUHlfU0laRShzbG90bmFtZXMpOworICAgICAgICAgICAgaWYgKG9iai0+b2JfdHlwZS0+dHBfYmFzaWNzaXplID4gYmFzaWNzaXplKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNsb3RuYW1lcyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcGlja2xlICUuMjAwcyBvYmplY3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzbG90bmFtZXMgIT0gUHlfTm9uZSAmJiBQeV9TSVpFKHNsb3RuYW1lcykgPiAwKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqc2xvdHM7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IHNsb3RuYW1lc19zaXplLCBpOwpAQCAtNDA4OSw3ICs0MTEzLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXJlZHVjZV9uZXdvYmooUHlPYmplY3QgKm9iaiwgaW50IHByb3RvKQorcmVkdWNlX25ld29iaihQeU9iamVjdCAqb2JqKQogewogICAgIFB5T2JqZWN0ICphcmdzID0gTlVMTCwgKmt3YXJncyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmNvcHlyZWc7CkBAIC00MTQyLDcgKzQxNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CiAgICAgfQotICAgIGVsc2UgaWYgKHByb3RvID49IDQpIHsKKyAgICBlbHNlIHsKICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfZXhfXyk7CiAKICAgICAgICAgbmV3b2JqID0gX1B5T2JqZWN0X0dldEF0dHJJZChjb3B5cmVnLCAmUHlJZF9fX25ld29ial9leF9fKTsKQEAgLTQxNjAsMTYgKzQxODQsNiBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgdXNlIHByb3RvY29sIDQgb3IgZ3JlYXRlciB0byBjb3B5IHRoaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdDsgc2luY2UgX19nZXRuZXdhcmdzX2V4X18gcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmQgYXJndW1lbnRzLiIpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihrd2FyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoY29weXJlZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIHN0YXRlID0gX1B5T2JqZWN0X0dldFN0YXRlKG9iaiwKICAgICAgICAgICAgICAgICAhaGFzYXJncyAmJiAhUHlMaXN0X0NoZWNrKG9iaikgJiYgIVB5RGljdF9DaGVjayhvYmopKTsKQEAgLTQyMTUsNyArNDIyOSw3IEBACiAgICAgUHlPYmplY3QgKmNvcHlyZWcsICpyZXM7CiAKICAgICBpZiAocHJvdG8gPj0gMikKLSAgICAgICAgcmV0dXJuIHJlZHVjZV9uZXdvYmooc2VsZiwgcHJvdG8pOworICAgICAgICByZXR1cm4gcmVkdWNlX25ld29iaihzZWxmKTsKIAogICAgIGNvcHlyZWcgPSBpbXBvcnRfY29weXJlZygpOwogICAgIGlmICghY29weXJlZykKQEAgLTUzNDIsNyArNTM1Niw3IEBACiAvKiBIZWxwZXIgdG8gY2hlY2sgZm9yIG9iamVjdC5fX3NldGF0dHJfXyBvciBfX2RlbGF0dHJfXyBhcHBsaWVkIHRvIGEgdHlwZS4KICAgIFRoaXMgaXMgY2FsbGVkIHRoZSBDYXJsbyBWZXJyZSBoYWNrIGFmdGVyIGl0cyBkaXNjb3ZlcmVyLiAqLwogc3RhdGljIGludAotaGFja2NoZWNrKFB5T2JqZWN0ICpzZWxmLCBzZXRhdHRyb2Z1bmMgZnVuYywgY2hhciAqd2hhdCkKK2hhY2tjaGVjayhQeU9iamVjdCAqc2VsZiwgc2V0YXR0cm9mdW5jIGZ1bmMsIGNvbnN0IGNoYXIgKndoYXQpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKICAgICB3aGlsZSAodHlwZSAmJiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCmRpZmYgLS1naXQgYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCmluZGV4IGIxNDZkYTkuLmYxZGUzZDUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAidWNuaGFzaC5oIgogI2luY2x1ZGUgImJ5dGVzX21ldGhvZHMuaCIKKyNpbmNsdWRlICJzdHJpbmdsaWIvZXEuaCIKIAogI2lmZGVmIE1TX1dJTkRPV1MKICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC0xNjIsNiArMTYzLDE0IEBACiAgICAgICAgICAgICAqX3RvKysgPSAodG9fdHlwZSkgKl9pdGVyKys7ICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCisjaWZkZWYgTVNfV0lORE9XUworICAgLyogT24gV2luZG93cywgb3ZlcmFsbG9jYXRlIGJ5IDUwJSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDIKKyNlbHNlCisgICAvKiBPbiBMaW51eCwgb3ZlcmFsbG9jYXRlIGJ5IDI1JSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KKyMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDQKKyNlbmRpZgorCiAvKiBUaGlzIGRpY3Rpb25hcnkgaG9sZHMgYWxsIGludGVybmVkIHVuaWNvZGUgc3RyaW5ncy4gIE5vdGUgdGhhdCByZWZlcmVuY2VzCiAgICB0byBzdHJpbmdzIGluIHRoaXMgZGljdGlvbmFyeSBhcmUgKm5vdCogY291bnRlZCBpbiB0aGUgc3RyaW5nJ3Mgb2JfcmVmY250LgogICAgV2hlbiB0aGUgaW50ZXJuZWQgc3RyaW5nIHJlYWNoZXMgYSByZWZjbnQgb2YgMCB0aGUgc3RyaW5nIGRlYWxsb2NhdGlvbgpAQCAtMjYzLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlYXNvbik7CiAKIC8qIFNhbWUgZm9yIGxpbmVicmVha3MgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzY2lpX2xpbmVicmVha1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYXNjaWlfbGluZWJyZWFrW10gPSB7CiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIC8qICAgICAgICAgMHgwMDBBLCAqIExJTkUgRkVFRCAqLwogLyogICAgICAgICAweDAwMEIsICogTElORSBUQUJVTEFUSU9OICovCkBAIC0yOTIsNiArMzAxLDM4IEBACiAKICNpbmNsdWRlICJjbGluaWMvdW5pY29kZW9iamVjdC5jLmgiCiAKK3R5cGVkZWYgZW51bSB7CisgICAgX1B5X0VSUk9SX1VOS05PV049MCwKKyAgICBfUHlfRVJST1JfU1RSSUNULAorICAgIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEUsCisgICAgX1B5X0VSUk9SX1JFUExBQ0UsCisgICAgX1B5X0VSUk9SX0lHTk9SRSwKKyAgICBfUHlfRVJST1JfQkFDS1NMQVNIUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfU1VSUk9HQVRFUEFTUywKKyAgICBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0UsCisgICAgX1B5X0VSUk9SX09USEVSCit9IF9QeV9lcnJvcl9oYW5kbGVyOworCitzdGF0aWMgX1B5X2Vycm9yX2hhbmRsZXIKK2dldF9lcnJvcl9oYW5kbGVyKGNvbnN0IGNoYXIgKmVycm9ycykKK3sKKyAgICBpZiAoZXJyb3JzID09IE5VTEwgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfU1RSSUNUOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlZXNjYXBlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9SRVBMQUNFOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9JR05PUkU7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJiYWNrc2xhc2hyZXBsYWNlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlcGFzcyIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfU1VSUk9HQVRFUEFTUzsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgInhtbGNoYXJyZWZyZXBsYWNlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRTsKKyAgICByZXR1cm4gX1B5X0VSUk9SX09USEVSOworfQorCiAvKiBUaGUgbWF4IHVuaWNvZGUgdmFsdWUgaXMgYWx3YXlzIDB4MTBGRkZGIHdoaWxlIHVzaW5nIHRoZSBQRVAtMzkzIEFQSS4KICAgIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQgQVBJLiAqLwogUHlfVU5JQ09ERQpAQCAtNTIxLDYgKzU2MiwxMjkgQEAKICAgICAgICAgcmV0dXJuIF9QeVVuaWNvZGVfQ29weSh1bmljb2RlKTsKIH0KIAorLyogSW1wbGVtZW50YXRpb24gb2YgdGhlICJiYWNrc2xhc2hyZXBsYWNlIiBlcnJvciBoYW5kbGVyIGZvciA4LWJpdCBlbmNvZGluZ3M6CisgICBBU0NJSSwgTGF0aW4xLCBVVEYtOCwgZXRjLiAqLworc3RhdGljIGNoYXIqCitiYWNrc2xhc2hyZXBsYWNlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgY29sbHN0YXJ0LCBQeV9zc2l6ZV90IGNvbGxlbmQpCit7CisgICAgUHlfc3NpemVfdCBzaXplLCBpOworICAgIFB5X1VDUzQgY2g7CisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kOworICAgIHZvaWQgKmRhdGE7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0lTX1JFQURZKHVuaWNvZGUpKTsKKyAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CisgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOworCisgICAgc2l6ZSA9IDA7CisgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmNyOworCisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgIGlmIChjaCA8IDB4MTAwKQorICAgICAgICAgICAgaW5jciA9IDIrMjsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAweDEwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworICAgICAgICAgICAgaW5jciA9IDIrODsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5jcjsKKyAgICB9CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgKnN0cisrID0gJ1xcJzsKKyAgICAgICAgaWYgKGNoID49IDB4MDAwMTAwMDApIHsKKyAgICAgICAgICAgICpzdHIrKyA9ICdVJzsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjI4KSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjQpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yMCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjE2KSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTIpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj44KSYweGZdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNoID49IDB4MTAwKSB7CisgICAgICAgICAgICAqc3RyKysgPSAndSc7CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xMikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjgpJjB4Zl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnN0cisrID0gJ3gnOworICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj40KSYweGZdOworICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbY2gmMHhmXTsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworLyogSW1wbGVtZW50YXRpb24gb2YgdGhlICJ4bWxjaGFycmVmcmVwbGFjZSIgZXJyb3IgaGFuZGxlciBmb3IgOC1iaXQgZW5jb2RpbmdzOgorICAgQVNDSUksIExhdGluMSwgVVRGLTgsIGV0Yy4gKi8KK3N0YXRpYyBjaGFyKgoreG1sY2hhcnJlZnJlcGxhY2UoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgY29sbHN0YXJ0LCBQeV9zc2l6ZV90IGNvbGxlbmQpCit7CisgICAgUHlfc3NpemVfdCBzaXplLCBpOworICAgIFB5X1VDUzQgY2g7CisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kOworICAgIHZvaWQgKmRhdGE7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0lTX1JFQURZKHVuaWNvZGUpKTsKKyAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CisgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOworCisgICAgc2l6ZSA9IDA7CisgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpbmNyOworCisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgIGlmIChjaCA8IDEwKQorICAgICAgICAgICAgaW5jciA9IDIrMSsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzIrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrMysxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNCsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzUrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNisxOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisgICAgICAgICAgICBpbmNyID0gMis3KzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGluY3I7CisgICAgfQorCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN0ciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCisgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgIHN0ciArPSBzcHJpbnRmKHN0ciwgIiYjJWQ7IiwgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCiAvKiAtLS0gQmxvb20gRmlsdGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBzdHVmZiB0byBpbXBsZW1lbnQgc2ltcGxlICJibG9vbSBmaWx0ZXJzIiBmb3IgVW5pY29kZSBjaGFyYWN0ZXJzLgpAQCAtNTg3LDYgKzc1MSwxOCBAQAogI3VuZGVmIEJMT09NX1VQREFURQogfQogCitzdGF0aWMgaW50CitlbnN1cmVfdW5pY29kZShQeU9iamVjdCAqb2JqKQoreworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBQeVVuaWNvZGVfUkVBRFkob2JqKTsKK30KKwogLyogQ29tcGlsYXRpb24gb2YgdGVtcGxhdGVkIHJvdXRpbmVzICovCiAKICNpbmNsdWRlICJzdHJpbmdsaWIvYXNjaWlsaWIuaCIKQEAgLTY0NywyNyArODIzLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLCBQeV9VQ1M0IGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7Ci0gICAgaW50IG1vZGUgPSAoZGlyZWN0aW9uID09IDEpID8gRkFTVF9TRUFSQ0ggOiBGQVNUX1JTRUFSQ0g7Ci0KICAgICBzd2l0Y2ggKGtpbmQpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgotICAgICAgICB7Ci0gICAgICAgICAgICBQeV9VQ1MxIGNoMSA9IChQeV9VQ1MxKSBjaDsKLSAgICAgICAgICAgIGlmIChjaDEgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfZmFzdHNlYXJjaCgoUHlfVUNTMSAqKSBzLCBzaXplLCAmY2gxLCAxLCAwLCBtb2RlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKChQeV9VQ1MxKSBjaCAhPSBjaCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9maW5kX2NoYXIoKFB5X1VDUzEgKikgcywgc2l6ZSwgKFB5X1VDUzEpIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfcmZpbmRfY2hhcigoUHlfVUNTMSAqKSBzLCBzaXplLCAoUHlfVUNTMSkgY2gpOwogICAgIGNhc2UgUHlVbmljb2RlXzJCWVRFX0tJTkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFB5X1VDUzIgY2gyID0gKFB5X1VDUzIpIGNoOwotICAgICAgICAgICAgaWYgKGNoMiA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9mYXN0c2VhcmNoKChQeV9VQ1MyICopIHMsIHNpemUsICZjaDIsIDEsIDAsIG1vZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBpZiAoKFB5X1VDUzIpIGNoICE9IGNoKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3MybGliX2ZpbmRfY2hhcigoUHlfVUNTMiAqKSBzLCBzaXplLCAoUHlfVUNTMikgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9yZmluZF9jaGFyKChQeV9VQ1MyICopIHMsIHNpemUsIChQeV9VQ1MyKSBjaCk7CiAgICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDoKLSAgICAgICAgcmV0dXJuIHVjczRsaWJfZmFzdHNlYXJjaCgoUHlfVUNTNCAqKSBzLCBzaXplLCAmY2gsIDEsIDAsIG1vZGUpOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3M0bGliX2ZpbmRfY2hhcigoUHlfVUNTNCAqKSBzLCBzaXplLCBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3M0bGliX3JmaW5kX2NoYXIoKFB5X1VDUzQgKikgcywgc2l6ZSwgY2gpOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFzc2VydCgwKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjkwMyw3ICszMDc4LDcgQEAKICAgICAvKiBSZXRyaWV2ZSBhIGJ5dGVzIGJ1ZmZlciB2aWV3IHRocm91Z2ggdGhlIFBFUCAzMTE4IGJ1ZmZlciBpbnRlcmZhY2UgKi8KICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iaiwgJmJ1ZmZlciwgUHlCVUZfU0lNUExFKSA8IDApIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJjb2VyY2luZyB0byBzdHI6IG5lZWQgYSBieXRlcy1saWtlIG9iamVjdCwgJS44MHMgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgImRlY29kaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCAlLjgwcyBmb3VuZCIsCiAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0zMTY3LDI0ICszMzQyLDIyIEBACiBzdGF0aWMgaW50CiBsb2NhbGVfZXJyb3JfaGFuZGxlcihjb25zdCBjaGFyICplcnJvcnMsIGludCAqc3Vycm9nYXRlZXNjYXBlKQogewotICAgIGlmIChlcnJvcnMgPT0gTlVMTCkgeworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICB7CisgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMDsKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKSB7Ci0gICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVlc2NhcGUiKSA9PSAwKSB7CisgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgogICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAib25seSAnc3RyaWN0JyBhbmQgJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlcnMgIgorICAgICAgICAgICAgICAgICAgICAgImFyZSBzdXBwb3J0ZWQsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJvbmx5ICdzdHJpY3QnIGFuZCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVycyAiCi0gICAgICAgICAgICAgICAgICJhcmUgc3VwcG9ydGVkLCBub3QgJyVzJyIsCi0gICAgICAgICAgICAgICAgIGVycm9ycyk7Ci0gICAgcmV0dXJuIC0xOwogfQogCiBQeU9iamVjdCAqCkBAIC0zNjI2LDE5ICszNzk5LDE3IEBACiAgICAgICAgIG91dHB1dCA9IGFyZzsKICAgICAgICAgUHlfSU5DUkVGKG91dHB1dCk7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBhcmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICBpZiAoIWFyZykKLSAgICAgICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAgICAgICAgIG91dHB1dCA9IFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQoYXJnKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZyk7CiAgICAgICAgIGlmICghb3V0cHV0KQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICghUHlCeXRlc19DaGVjayhvdXRwdXQpKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYob3V0cHV0KTsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlbmNvZGVyIGZhaWxlZCB0byByZXR1cm4gYnl0ZXMiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKG91dHB1dCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciBvciBieXRlcywgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgc2l6ZSA9IFB5Qnl0ZXNfR0VUX1NJWkUob3V0cHV0KTsKICAgICBkYXRhID0gUHlCeXRlc19BU19TVFJJTkcob3V0cHV0KTsKQEAgLTM3MTAsNyArMzg4MSw3IEBACiAKICAgICBpZiAoUHlVbmljb2RlX1VURjgodW5pY29kZSkgPT0gTlVMTCkgewogICAgICAgICBhc3NlcnQoIVB5VW5pY29kZV9JU19DT01QQUNUX0FTQ0lJKHVuaWNvZGUpKTsKLSAgICAgICAgYnl0ZXMgPSBfUHlVbmljb2RlX0FzVVRGOFN0cmluZyh1bmljb2RlLCAic3RyaWN0Iik7CisgICAgICAgIGJ5dGVzID0gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgTlVMTCk7CiAgICAgICAgIGlmIChieXRlcyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIF9QeVVuaWNvZGVfVVRGOCh1bmljb2RlKSA9IFB5T2JqZWN0X01BTExPQyhQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKSArIDEpOwpAQCAtMzk3Niw3ICs0MTQ3LDcgQEAKICAgICBQeV9zc2l6ZV90ICplbmRpbnBvcywgUHlPYmplY3QgKipleGNlcHRpb25PYmplY3QsIGNvbnN0IGNoYXIgKippbnB0ciwKICAgICBQeU9iamVjdCAqKm91dHB1dCwgUHlfc3NpemVfdCAqb3V0cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeU9iamVjdCAqcmVzdHVwbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsKQEAgLTQwODQsNyArNDI1NSw3IEBACiAgICAgUHlfc3NpemVfdCAqZW5kaW5wb3MsIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LCBjb25zdCBjaGFyICoqaW5wdHIsCiAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyIC8qIFB5T2JqZWN0ICoqb3V0cHV0LCBQeV9zc2l6ZV90ICpvdXRwb3MgKi8pCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKIAogICAgIFB5T2JqZWN0ICpyZXN0dXBsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGUgPSBOVUxMOwpAQCAtNDY5MCw4ICs0ODYxLDkgQEAKICAgICBQeV9zc2l6ZV90IHN0YXJ0aW5wb3M7CiAgICAgUHlfc3NpemVfdCBlbmRpbnBvczsKICAgICBjb25zdCBjaGFyICplcnJtc2cgPSAiIjsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKIAogICAgIGlmIChzaXplID09IDApIHsKICAgICAgICAgaWYgKGNvbnN1bWVkKQpAQCAtNDcxNiw2ICs0ODg4LDcgQEAKICAgICB3aGlsZSAocyA8IGVuZCkgewogICAgICAgICBQeV9VQ1M0IGNoOwogICAgICAgICBpbnQga2luZCA9IHdyaXRlci5raW5kOworCiAgICAgICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHdyaXRlci5idWZmZXIpKQogICAgICAgICAgICAgICAgIGNoID0gYXNjaWlsaWJfdXRmOF9kZWNvZGUoJnMsIGVuZCwgd3JpdGVyLmRhdGEsICZ3cml0ZXIucG9zKTsKQEAgLTQ3NTQsMjQgKzQ5MjcsNTYgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgInV0Zi04IiwgZXJybXNnLAotICAgICAgICAgICAgICAgICZzdGFydHMsICZlbmQsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAotICAgICAgICAgICAgICAgICZ3cml0ZXIpKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikgeworICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZSgmd3JpdGVyLCAweGZmZmQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisKKyAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCZ3cml0ZXIsIFB5VW5pY29kZV8yQllURV9LSU5EKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgZm9yIChpPXN0YXJ0aW5wb3M7IGk8ZW5kaW5wb3M7IGkrKykgeworICAgICAgICAgICAgICAgIGNoID0gKFB5X1VDUzQpKHVuc2lnbmVkIGNoYXIpKHN0YXJ0c1tpXSk7CisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKHdyaXRlci5raW5kLCB3cml0ZXIuZGF0YSwgd3JpdGVyLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggKyAweGRjMDApOworICAgICAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgKz0gKGVuZGlucG9zIC0gc3RhcnRpbnBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKKyAgICAgICAgICAgICAgICAgICAgInV0Zi04IiwgZXJybXNnLAorICAgICAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZW5kLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKKyAgICAgICAgICAgICAgICAgICAgJndyaXRlcikpCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICB9CiAgICAgfQogCiBFbmQ6CiAgICAgaWYgKGNvbnN1bWVkKQogICAgICAgICAqY29uc3VtZWQgPSBzIC0gc3RhcnRzOwogCi0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJndyaXRlcik7CiAKIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC01ODYyLDExICs2MDY3LDEwIEBACiBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQogewogICAgIFB5X3NzaXplX3QgaSwgbGVuOwotICAgIFB5T2JqZWN0ICpyZXByOwogICAgIGNoYXIgKnA7CiAgICAgaW50IGtpbmQ7CiAgICAgdm9pZCAqZGF0YTsKLSAgICBQeV9zc2l6ZV90IGV4cGFuZHNpemUgPSAwOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIC8qIEluaXRpYWwgYWxsb2NhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdC1wb3NzaWJsZSBjaGFyYWN0ZXIKICAgICAgICBlc2NhcGUuCkBAIC01ODgyLDM1ICs2MDg2LDI4IEBACiAgICAgfQogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkodW5pY29kZSkgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHVuaWNvZGUpOwogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7Ci0gICAgc3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDQ7IGJyZWFrOwotICAgIGNhc2UgUHlVbmljb2RlXzJCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSA2OyBicmVhazsKLSAgICBjYXNlIFB5VW5pY29kZV80QllURV9LSU5EOiBleHBhbmRzaXplID0gMTA7IGJyZWFrOwotICAgIH0KIAotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7Ci0KLSAgICBpZiAobGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gMiAtIDEpIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0KLSAgICByZXByID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4cGFuZHNpemUqbGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKIAogICAgICAgICAvKiBFc2NhcGUgYmFja3NsYXNoZXMgKi8KICAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgICAgICAgICAgY29udGludWU7CkBAIC01OTE5LDYgKzYxMTYsMTEgQEAKICAgICAgICAgLyogTWFwIDIxLWJpdCBjaGFyYWN0ZXJzIHRvICdcVTAweHh4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAweDEwMDAwKSB7CiAgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAxMC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ1UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjgpICYgMHgwMDAwMDAwRl07CkBAIC01OTM0LDYgKzYxMzYsMTAgQEAKIAogICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgaWYgKGNoID49IDI1NikgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHgwMDBGXTsKQEAgLTU5NDQsMjAgKzYxNTAsMzcgQEAKIAogICAgICAgICAvKiBNYXAgc3BlY2lhbCB3aGl0ZXNwYWNlIHRvICdcdCcsIFxuJywgJ1xyJyAqLwogICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHQnKSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndCc7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ24nOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdyJzsKICAgICAgICAgfQogCiAgICAgICAgIC8qIE1hcCBub24tcHJpbnRhYmxlIFVTIEFTQ0lJIHRvICdceGhoJyAqLwogICAgICAgICBlbHNlIGlmIChjaCA8ICcgJyB8fCBjaCA+PSAweDdGKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDQtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd4JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDQpICYgMHgwMDBGXTsKQEAgLTU5NjksMTAgKzYxOTIsMTEgQEAKICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgfQogCi0gICAgYXNzZXJ0KHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKSA+IDApOwotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcHIsIHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKSkgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVwcjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHApOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC02MTAxLDEzICs2MzI1LDEyIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nKFB5T2JqZWN0ICp1bmljb2RlKQogewotICAgIFB5T2JqZWN0ICpyZXByOwogICAgIGNoYXIgKnA7Ci0gICAgY2hhciAqcTsKLSAgICBQeV9zc2l6ZV90IGV4cGFuZHNpemUsIHBvczsKKyAgICBQeV9zc2l6ZV90IHBvczsKICAgICBpbnQga2luZDsKICAgICB2b2lkICpkYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHVuaWNvZGUpKSB7CiAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CkBAIC02MTE1LDI4ICs2MzM4LDI5IEBACiAgICAgfQogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkodW5pY29kZSkgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CiAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodW5pY29kZSk7Ci0gICAgLyogNCBieXRlIGNoYXJhY3RlcnMgY2FuIHRha2UgdXAgMTAgYnl0ZXMsIDIgYnl0ZSBjaGFyYWN0ZXJzIGNhbiB0YWtlIHVwIDYKLSAgICAgICBieXRlcywgYW5kIDEgYnl0ZSBjaGFyYWN0ZXJzIDQuICovCi0gICAgZXhwYW5kc2l6ZSA9IGtpbmQgKiAyICsgMjsKIAotICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4pOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICByZXByID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBleHBhbmRzaXplICogbGVuKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiByZXByOwotCi0gICAgcCA9IHEgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKICAgICBmb3IgKHBvcyA9IDA7IHBvcyA8IGxlbjsgcG9zKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CiAgICAgICAgIC8qIE1hcCAzMi1iaXQgY2hhcmFjdGVycyB0byAnXFV4eHh4eHh4eCcgKi8KICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApIHsKICAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMTAtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdVJzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4Zl07CkBAIC02MTUwLDYgKzYzNzQsMTEgQEAKICAgICAgICAgfQogICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMjU2KSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07CkBAIC02MTYyLDEwICs2MzkxLDExIEBACiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KIAotICAgIGFzc2VydChwID4gcSk7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgcCAtIHEpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgpAQCAtNjM0Miw3ICs2NTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgZW5kcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqbmV3cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPbjtlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIvYnl0ZXMsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPbjtlbmNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIvYnl0ZXMsIGludCkgdHVwbGUiOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKICAgICBQeU9iamVjdCAqcmVzdW5pY29kZTsKQEAgLTYzOTYsMjUgKzY2MjYsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VuY29kZV91Y3MxKFB5T2JqZWN0ICp1bmljb2RlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUHlfVUNTNCBsaW1pdCkKIHsKICAgICAvKiBpbnB1dCBzdGF0ZSAqLwogICAgIFB5X3NzaXplX3QgcG9zPTAsIHNpemU7CiAgICAgaW50IGtpbmQ7CiAgICAgdm9pZCAqZGF0YTsKLSAgICAvKiBvdXRwdXQgb2JqZWN0ICovCi0gICAgUHlPYmplY3QgKnJlczsKICAgICAvKiBwb2ludGVyIGludG8gdGhlIG91dHB1dCAqLwogICAgIGNoYXIgKnN0cjsKLSAgICAvKiBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiAqLwotICAgIFB5X3NzaXplX3QgcmVzc2l6ZTsKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IChsaW1pdCA9PSAyNTYpID8gImxhdGluLTEiIDogImFzY2lpIjsKICAgICBjb25zdCBjaGFyICpyZWFzb24gPSAobGltaXQgPT0gMjU2KSA/ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgyNTYpIiA6ICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIjsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwotICAgIC8qIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBmb3IgY2FjaGluZyBzdHJpbmcgY29tcGFyaXNvbnMKLSAgICAgKiAtMT1ub3QgaW5pdGlhbGl6ZWQsIDA9dW5rbm93biwgMT1zdHJpY3QsIDI9cmVwbGFjZSwgMz1pZ25vcmUsIDQ9eG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICBpbnQga25vd25fZXJyb3JIYW5kbGVyID0gLTE7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOworICAgIFB5T2JqZWN0ICpyZXAgPSBOVUxMOworICAgIC8qIG91dHB1dCBvYmplY3QgKi8KKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTY0MjUsMTg2ICs2NjUyLDE1NyBAQAogICAgICAgIHJlcGxhY2VtZW50cywgaWYgd2UgbmVlZCBtb3JlLCB3ZSdsbCByZXNpemUgKi8KICAgICBpZiAoc2l6ZSA9PSAwKQogICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKLSAgICByZXMgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotICAgIGlmIChyZXMgPT0gTlVMTCkKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgIHJlc3NpemUgPSBzaXplOwogCiAgICAgd2hpbGUgKHBvcyA8IHNpemUpIHsKLSAgICAgICAgUHlfVUNTNCBjID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKTsKKyAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CiAKICAgICAgICAgLyogY2FuIHdlIGVuY29kZSB0aGlzPyAqLwotICAgICAgICBpZiAoYzxsaW1pdCkgeworICAgICAgICBpZiAoY2ggPCBsaW1pdCkgewogICAgICAgICAgICAgLyogbm8gb3ZlcmZsb3cgY2hlY2ssIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZSBzcGFjZSBpcyBlbm91Z2ggKi8KLSAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKWM7CisgICAgICAgICAgICAqc3RyKysgPSAoY2hhciljaDsKICAgICAgICAgICAgICsrcG9zOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlfc3NpemVfdCByZXF1aXJlZHNpemU7Ci0gICAgICAgICAgICBQeU9iamVjdCAqcmVwdW5pY29kZTsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVwc2l6ZSwgbmV3cG9zLCByZXNwb3MsIGk7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG5ld3BvcywgaTsKICAgICAgICAgICAgIC8qIHN0YXJ0cG9zIGZvciBjb2xsZWN0aW5nIHVuZW5jb2RhYmxlIGNoYXJzICovCiAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxzdGFydCA9IHBvczsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgY29sbGVuZCA9IHBvczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY29sbGVuZCA9IGNvbGxzdGFydCArIDE7CiAgICAgICAgICAgICAvKiBmaW5kIGFsbCB1bmVjb2RhYmxlIGNoYXJhY3RlcnMgKi8KKwogICAgICAgICAgICAgd2hpbGUgKChjb2xsZW5kIDwgc2l6ZSkgJiYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGNvbGxlbmQpID49IGxpbWl0KSkKICAgICAgICAgICAgICAgICArK2NvbGxlbmQ7CisKKyAgICAgICAgICAgIC8qIE9ubHkgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgaWYgaXQncyBub3QgdGhlIGxhc3Qgd3JpdGUgKi8KKyAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAoY29sbGVuZCA8IHNpemUpOworCiAgICAgICAgICAgICAvKiBjYWNoZSBjYWxsYmFjayBuYW1lIGxvb2t1cCAoaWYgbm90IGRvbmUgeWV0LCBpLmUuIGl0J3MgdGhlIGZpcnN0IGVycm9yKSAqLwotICAgICAgICAgICAgaWYgKGtub3duX2Vycm9ySGFuZGxlcj09LTEpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGVycm9ycz09TlVMTCkgfHwgKCFzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikpCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDM7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJ4bWxjaGFycmVmcmVwbGFjZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSA0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa25vd25fZXJyb3JIYW5kbGVyKSB7Ci0gICAgICAgICAgICBjYXNlIDE6IC8qIHN0cmljdCAqLworICAgICAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCwgcmVhc29uKTsKICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICBjYXNlIDI6IC8qIHJlcGxhY2UgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoY29sbHN0YXJ0KysgPCBjb2xsZW5kKQotICAgICAgICAgICAgICAgICAgICAqc3RyKysgPSAnPyc7IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgY2FzZSAzOiAvKiBpZ25vcmUgKi8KKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgICAgICAgICBtZW1zZXQoc3RyLCAnPycsIGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIHN0ciArPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIGlnbm9yZSBlcnJvciBoYW5kbGVyICovCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CiAgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IHJlc3BvczsKLSAgICAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgaW5jcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMTApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMisxKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMiszKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis0KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNSsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis2KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzcrMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IGluY3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIChzaXplIC0gY29sbGVuZCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHNpemUgLSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiByZXNzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplIDw9IFBZX1NTSVpFX1RfTUFYLzIgJiYgcmVxdWlyZWRzaXplIDwgMipyZXNzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gMipyZXNzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlcXVpcmVkc2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciArPSBzcHJpbnRmKHN0ciwgIiYjJWQ7IiwgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgcmVhc29uLCB1bmljb2RlLCAmZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnQsIGNvbGxlbmQsICZuZXdwb3MpOwotICAgICAgICAgICAgICAgIGlmIChyZXB1bmljb2RlID09IE5VTEwgfHwgKFB5VW5pY29kZV9DaGVjayhyZXB1bmljb2RlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEWShyZXB1bmljb2RlKSA9PSAtMSkpCisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgc3RyID0gYmFja3NsYXNocmVwbGFjZSgmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcHVuaWNvZGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdGx5IGNvcHkgYnl0ZXMgcmVzdWx0IHRvIG91dHB1dC4gKi8KLSAgICAgICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5Qnl0ZXNfU2l6ZShyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcHNpemUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHJvb20gZm9yIGFsbCBhZGRpdGlvbmFsIGJ5dGVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXNzaXplK3JlcHNpemUtMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKSArIHJlc3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gcmVwc2l6ZS0xOworICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIHN0ciA9IHhtbGNoYXJyZWZyZXBsYWNlKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoIDwgMHhkYzgwIHx8IDB4ZGNmZiA8IGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3QgYSBVVEYtOGIgc3Vycm9nYXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3RyLCBQeUJ5dGVzX0FzU3RyaW5nKHJlcHVuaWNvZGUpLCByZXBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyICs9IHJlcHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IG5ld3BvczsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOworICAgICAgICAgICAgICAgICAgICAqc3RyKysgPSAoY2hhcikoY2ggLSAweGRjMDApOworICAgICAgICAgICAgICAgICAgICArK3BvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gY29sbGVuZCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBzcGFjZT8gKGF0IGxlYXN0IGVub3VnaCBmb3Igd2hhdCB3ZQotICAgICAgICAgICAgICAgICAgIGhhdmUrdGhlIHJlcGxhY2VtZW50K3RoZSByZXN0IG9mIHRoZSBzdHJpbmcsIHNvCi0gICAgICAgICAgICAgICAgICAgd2Ugd29uJ3QgaGF2ZSB0byBjaGVjayBzcGFjZSBmb3IgZW5jb2RhYmxlIGNoYXJhY3RlcnMpICovCi0gICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gcmVzcG9zOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHJlcHNpemUpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHJlcHNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gKHNpemUgLSBjb2xsZW5kKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgKz0gc2l6ZSAtIGNvbGxlbmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IHJlc3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3NpemUgPD0gUFlfU1NJWkVfVF9NQVgvMiAmJiByZXF1aXJlZHNpemUgPCAyKnJlc3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSAyKnJlc3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgcmVxdWlyZWRzaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOworICAgICAgICAgICAgICAgIGNvbGxzdGFydCA9IHBvczsKKyAgICAgICAgICAgICAgICBhc3NlcnQoY29sbHN0YXJ0ICE9IGNvbGxlbmQpOworICAgICAgICAgICAgICAgIC8qIGZhbGxiYWNrIHRvIGdlbmVyYWwgZXJyb3IgaGFuZGxpbmcgKi8KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXAgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgcmVhc29uLCB1bmljb2RlLCAmZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxzdGFydCwgY29sbGVuZCwgJm5ld3Bvcyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERpcmVjdGx5IGNvcHkgYnl0ZXMgcmVzdWx0IHRvIG91dHB1dC4gKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHJlcCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKSArIHJlc3BvczsKLSAgICAgICAgICAgICAgICAgICAgcmVzc2l6ZSA9IHJlcXVpcmVkc2l6ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdW5lbmNvZGFibGUgaW4gdGhlIHJlcGxhY2VtZW50Ci0gICAgICAgICAgICAgICAgICAgYW5kIGNvcHkgaXQgdG8gdGhlIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IHJlcHNpemUtLT4wOyArK2ksICsrc3RyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHJlcHVuaWNvZGUsIGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyA+PSBsaW1pdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbigmZXhjLCBlbmNvZGluZywgdW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBwb3MrMSwgcmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhyZXApKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHJlcCkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkocmVwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoOiBhbGwgY2hhcmFjdGVycyBhcmUgc21hbGxlciB0aGFuIGxpbWl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobGltaXQgPj0gMTI4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChyZXApID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfREFUQShyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAqc3RyID0gKGNoYXIpYzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHN0ciwgcmVwc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB1bmVuY29kYWJsZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50IGFuZCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IHJlcHNpemUtLT4wOyArK2ksICsrc3RyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHJlcCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49IGxpbWl0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLCBwb3MrMSwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyID0gKGNoYXIpY2g7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcG9zID0gbmV3cG9zOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBQeV9DTEVBUihyZXApOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBvdmVyYWxsb2NhdGlvbiB3YXMgZGlzYWJsZWQsIGVuc3VyZSB0aGF0IGl0IHdhcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgcG9zID09IHNpemUpOwogICAgICAgICB9CiAgICAgfQotICAgIC8qIFJlc2l6ZSBpZiB3ZSBhbGxvY2F0ZWQgdG8gbXVjaCAqLwotICAgIHNpemUgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgIGlmIChzaXplIDwgcmVzc2l6ZSkgeyAvKiBJZiB0aGlzIGZhbGxzIHJlcyB3aWxsIGJlIE5VTEwgKi8KLSAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7Ci0gICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgc2l6ZSkgPCAwKQotICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgIH0KIAotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgcmV0dXJuIHJlczsKLQotICBvdmVyZmxvdzoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHN0cik7CiAKICAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHJlcyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYocmVwKTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY2NjQsOCArNjg2Miw5IEBACiAgICAgUHlfc3NpemVfdCBlbmRpbnBvczsKICAgICBQeV9zc2l6ZV90IG91dHBvczsKICAgICBjb25zdCBjaGFyICplOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogCiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgX1B5X1JFVFVSTl9VTklDT0RFX0VNUFRZKCk7CkBAIC02Njk0LDEyICs2ODkzLDQyIEBACiAgICAgICAgICAgICBQeVVuaWNvZGVfV1JJVEUoa2luZCwgZGF0YSwgd3JpdGVyLnBvcywgYyk7CiAgICAgICAgICAgICB3cml0ZXIucG9zKys7CiAgICAgICAgICAgICArK3M7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKKworICAgICAgICAvKiBieXRlIG91dHNpemUgcmFuZ2UgMHgwMC4uMHg3ZjogY2FsbCB0aGUgZXJyb3IgaGFuZGxlciAqLworCisgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgICAgICB7CisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgICAgIC8qIEZhc3QtcGF0aDogdGhlIGVycm9yIGhhbmRsZXIgb25seSB3cml0ZXMgb25lIGNoYXJhY3RlciwKKyAgICAgICAgICAgICAgIGJ1dCB3ZSBtYXkgc3dpdGNoIHRvIFVDUzIgYXQgdGhlIGZpcnN0IHdyaXRlICovCisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgmd3JpdGVyLCBQeVVuaWNvZGVfMkJZVEVfS0lORCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIGtpbmQgPSB3cml0ZXIua2luZDsKKyAgICAgICAgICAgIGRhdGEgPSB3cml0ZXIuZGF0YTsKKworICAgICAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1JFUExBQ0UpCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIDB4ZmZmZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIGMgKyAweGRjMDApOworICAgICAgICAgICAgd3JpdGVyLnBvcysrOworICAgICAgICAgICAgKytzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgorICAgICAgICAgICAgKytzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXJ0aW5wb3MgPSBzLXN0YXJ0czsKICAgICAgICAgICAgIGVuZGlucG9zID0gc3RhcnRpbnBvcyArIDE7CiAgICAgICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAotICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvckhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLAogICAgICAgICAgICAgICAgICAgICAiYXNjaWkiLCAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSIsCiAgICAgICAgICAgICAgICAgICAgICZzdGFydHMsICZlLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKICAgICAgICAgICAgICAgICAgICAgJndyaXRlcikpCkBAIC02NzA4LDEzICs2OTM3LDEzIEBACiAgICAgICAgICAgICBkYXRhID0gd3JpdGVyLmRhdGE7CiAgICAgICAgIH0KICAgICB9Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJndyaXRlcik7CiAKICAgb25FcnJvcjoKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTY3NjksNyArNjk5OCw3IEBACiAjICBkZWZpbmUgV0NfRVJSX0lOVkFMSURfQ0hBUlMgMHgwMDgwCiAjZW5kaWYKIAotc3RhdGljIGNoYXIqCitzdGF0aWMgY29uc3QgY2hhcioKIGNvZGVfcGFnZV9uYW1lKFVJTlQgY29kZV9wYWdlLCBQeU9iamVjdCAqKm9iaikKIHsKICAgICAqb2JqID0gTlVMTDsKQEAgLTY4NzcsNyArNzEwNiw3IEBACiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX29iaiA9IE5VTEw7Ci0gICAgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAgICAgRFdPUkQgZXJyOwogICAgIGludCByZXQgPSAtMTsKIApAQCAtNzExMyw3ICs3MzQyLDYgQEAKICAgICBCT09MIHVzZWREZWZhdWx0Q2hhciA9IEZBTFNFOwogICAgIEJPT0wgKnB1c2VkRGVmYXVsdENoYXIgPSAmdXNlZERlZmF1bHRDaGFyOwogICAgIGludCBvdXRzaXplOwotICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIHdjaGFyX3QgKnA7CiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIGNvbnN0IERXT1JEIGZsYWdzID0gZW5jb2RlX2NvZGVfcGFnZV9mbGFncyhjb2RlX3BhZ2UsIE5VTEwpOwpAQCAtNzIyMiw3ICs3NDUwLDcgQEAKICAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICBQeU9iamVjdCAqZW5jb2Rpbmdfb2JqID0gTlVMTDsKLSAgICBjaGFyICplbmNvZGluZzsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZzsKICAgICBQeV9zc2l6ZV90IG5ld3BvcywgbmV3b3V0c2l6ZTsKICAgICBQeU9iamVjdCAqcmVwOwogICAgIGludCByZXQgPSAtMTsKQEAgLTgwODAsNyArODMwOCw3IEBACiBjaGFybWFwX2VuY29kaW5nX2Vycm9yKAogICAgIFB5T2JqZWN0ICp1bmljb2RlLCBQeV9zc2l6ZV90ICppbnBvcywgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgUHlPYmplY3QgKipleGNlcHRpb25PYmplY3QsCi0gICAgaW50ICprbm93bl9lcnJvckhhbmRsZXIsIFB5T2JqZWN0ICoqZXJyb3JIYW5kbGVyLCBjb25zdCBjaGFyICplcnJvcnMsCisgICAgX1B5X2Vycm9yX2hhbmRsZXIgKmVycm9yX2hhbmRsZXIsIFB5T2JqZWN0ICoqZXJyb3JfaGFuZGxlcl9vYmosIGNvbnN0IGNoYXIgKmVycm9ycywKICAgICBQeU9iamVjdCAqKnJlcywgUHlfc3NpemVfdCAqcmVzcG9zKQogewogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsgLyogaW5pdGlhbGl6ZSB0byBwcmV2ZW50IGdjYyB3YXJuaW5nICovCkBAIC04MTI3LDIzICs4MzU1LDE1IEBACiAgICAgfQogICAgIC8qIGNhY2hlIGNhbGxiYWNrIG5hbWUgbG9va3VwCiAgICAgICogKGlmIG5vdCBkb25lIHlldCwgaS5lLiBpdCdzIHRoZSBmaXJzdCBlcnJvcikgKi8KLSAgICBpZiAoKmtub3duX2Vycm9ySGFuZGxlcj09LTEpIHsKLSAgICAgICAgaWYgKChlcnJvcnM9PU5VTEwpIHx8ICghc3RyY21wKGVycm9ycywgInN0cmljdCIpKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAxOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAyOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgImlnbm9yZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDM7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSA0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMDsKLSAgICB9Ci0gICAgc3dpdGNoICgqa25vd25fZXJyb3JIYW5kbGVyKSB7Ci0gICAgY2FzZSAxOiAvKiBzdHJpY3QgKi8KKyAgICBpZiAoKmVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICplcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgIHN3aXRjaCAoKmVycm9yX2hhbmRsZXIpIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVFJJQ1Q6CiAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oZXhjZXB0aW9uT2JqZWN0LCBlbmNvZGluZywgdW5pY29kZSwgY29sbHN0YXJ0cG9zLCBjb2xsZW5kcG9zLCByZWFzb24pOwogICAgICAgICByZXR1cm4gLTE7Ci0gICAgY2FzZSAyOiAvKiByZXBsYWNlICovCisKKyAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgogICAgICAgICBmb3IgKGNvbGxwb3MgPSBjb2xsc3RhcnRwb3M7IGNvbGxwb3M8Y29sbGVuZHBvczsgKytjb2xscG9zKSB7CiAgICAgICAgICAgICB4ID0gY2hhcm1hcGVuY29kZV9vdXRwdXQoJz8nLCBtYXBwaW5nLCByZXMsIHJlc3Bvcyk7CiAgICAgICAgICAgICBpZiAoeD09ZW5jX0VYQ0VQVElPTikgewpAQCAtODE1NSwxMCArODM3NSwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgIGNhc2UgMzogLyogaWdub3JlICovCisgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgogICAgICAgICAqaW5wb3MgPSBjb2xsZW5kcG9zOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCisKKyAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKICAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKHRlbXBvcmFyaWx5IChtaXMpdXNlcyBwKSAqLwogICAgICAgICBmb3IgKGNvbGxwb3MgPSBjb2xsc3RhcnRwb3M7IGNvbGxwb3MgPCBjb2xsZW5kcG9zOyArK2NvbGxwb3MpIHsKICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIrMjkrMSsxXTsKQEAgLTgxNzYsOCArODM5Nyw5IEBACiAgICAgICAgIH0KICAgICAgICAgKmlucG9zID0gY29sbGVuZHBvczsKICAgICAgICAgYnJlYWs7CisKICAgICBkZWZhdWx0OgotICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCBlcnJvckhhbmRsZXIsCisgICAgICAgIHJlcHVuaWNvZGUgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsIGVycm9yX2hhbmRsZXJfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgZXhjZXB0aW9uT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0cG9zLCBjb2xsZW5kcG9zLCAmbmV3cG9zKTsKICAgICAgICAgaWYgKHJlcHVuaWNvZGUgPT0gTlVMTCkKQEAgLTgyNDAsMTIgKzg0NjIsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICAvKiBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiAqLwogICAgIFB5X3NzaXplX3QgcmVzcG9zID0gMDsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwotICAgIC8qIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBmb3IgY2FjaGluZyBzdHJpbmcgY29tcGFyaXNvbnMKLSAgICAgKiAtMT1ub3QgaW5pdGlhbGl6ZWQsIDA9dW5rbm93biwgMT1zdHJpY3QsIDI9cmVwbGFjZSwKLSAgICAgKiAzPWlnbm9yZSwgND14bWxjaGFycmVmcmVwbGFjZSAqLwotICAgIGludCBrbm93bl9lcnJvckhhbmRsZXIgPSAtMTsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAgICAgdm9pZCAqZGF0YTsKICAgICBpbnQga2luZDsKIApAQCAtODI3Niw3ICs4NDk1LDcgQEAKICAgICAgICAgaWYgKHg9PWVuY19GQUlMRUQpIHsgLyogdW5lbmNvZGFibGUgY2hhcmFjdGVyICovCiAgICAgICAgICAgICBpZiAoY2hhcm1hcF9lbmNvZGluZ19lcnJvcih1bmljb2RlLCAmaW5wb3MsIG1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub3duX2Vycm9ySGFuZGxlciwgJmVycm9ySGFuZGxlciwgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX2hhbmRsZXIsICZlcnJvcl9oYW5kbGVyX29iaiwgZXJyb3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcywgJnJlc3BvcykpIHsKICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgICAgICAgICB9CkBAIC04MjkyLDEzICs4NTExLDEzIEBACiAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIHJldHVybiByZXM7CiAKICAgb25FcnJvcjoKICAgICBQeV9YREVDUkVGKHJlcyk7CiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtODM2NSw3ICs4NTg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIFB5X3NzaXplX3QgZW5kcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqbmV3cG9zKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO3RyYW5zbGF0aW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeV9zc2l6ZV90IGlfbmV3cG9zOwogICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKQEAgLTg2MjIsNyArODg0MSw3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotUHlPYmplY3QgKgorc3RhdGljIFB5T2JqZWN0ICoKIF9QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChQeU9iamVjdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQpAQCAtODY1MSwxMCArODg3MCw4IEBACiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKGlucHV0KTsKICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoaW5wdXQpOwogCi0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICBQeV9JTkNSRUYoaW5wdXQpOwotICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgfQorICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbU9iamVjdChpbnB1dCk7CiAKICAgICAvKiBhbGxvY2F0ZSBlbm91Z2ggZm9yIGEgc2ltcGxlIDE6MSB0cmFuc2xhdGlvbiB3aXRob3V0CiAgICAgICAgcmVwbGFjZW1lbnRzLCBpZiB3ZSBuZWVkIG1vcmUsIHdlJ2xsIHJlc2l6ZSAqLwpAQCAtODc2NSwxNCArODk4Miw5IEBACiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gX1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpOwogfQogCiBzdGF0aWMgUHlfVUNTNApAQCAtODk1NCw5ICs5MTY2LDEwIEBACiAgICAgfQogCiBzdGF0aWMgUHlfc3NpemVfdAotYW55X2ZpbmRfc2xpY2UoaW50IGRpcmVjdGlvbiwgUHlPYmplY3QqIHMxLCBQeU9iamVjdCogczIsCithbnlfZmluZF9zbGljZShQeU9iamVjdCogczEsIFB5T2JqZWN0KiBzMiwKICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCkKKyAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAorICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwpAQCAtOTEyNSw1NCArOTMzOCwzNSBAQAogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kKQogewogICAgIFB5X3NzaXplX3QgcmVzdWx0OwotICAgIFB5T2JqZWN0KiBzdHJfb2JqOwotICAgIFB5T2JqZWN0KiBzdWJfb2JqOwogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSA9IE5VTEwsICpidWYyID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAKLSAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoIXN0cl9vYmopCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3ViX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1YnN0cik7Ci0gICAgaWYgKCFzdWJfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1Yl9vYmopID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHJfb2JqKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KIAotICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyX29iaik7Ci0gICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJfb2JqKTsKLSAgICBpZiAoa2luZDEgPCBraW5kMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKKyAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHIpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKLSAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyX29iaik7Ci0gICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1Yl9vYmopOworICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOworICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJzdHIpOwogICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbjEpOwotICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCi0gICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cl9vYmopOwotICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJfb2JqKTsKKyAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKyAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3Vic3RyKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKLSAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1Yl9vYmosIGtpbmQxKTsKKyAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1YnN0ciwga2luZDEpOwogICAgICAgICBpZiAoIWJ1ZjIpCiAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6Ci0gICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkoc3RyX29iaikgJiYgUHlVbmljb2RlX0lTX0FTQ0lJKHN1Yl9vYmopKQorICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHN0cikgJiYgUHlVbmljb2RlX0lTX0FTQ0lJKHN1YnN0cikpCiAgICAgICAgICAgICByZXN1bHQgPSBhc2NpaWxpYl9jb3VudCgKICAgICAgICAgICAgICAgICAoKFB5X1VDUzEqKWJ1ZjEpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAogICAgICAgICAgICAgICAgIGJ1ZjIsIGxlbjIsIFBZX1NTSVpFX1RfTUFYCkBAIC05MTk5LDE2ICs5MzkzLDExIEBACiAgICAgICAgIGFzc2VydCgwKTsgcmVzdWx0ID0gMDsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotCiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogICAgIHJldHVybiAtMTsKQEAgLTkyMTYsMzUgKzk0MDUsMTUgQEAKIAogUHlfc3NpemVfdAogUHlVbmljb2RlX0ZpbmQoUHlPYmplY3QgKnN0ciwKLSAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWIsCisgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAogICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKCFzdHIpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTI7Ci0gICAgc3ViID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3ViKTsKLSAgICBpZiAoIXN1YikgewotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIC0yOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoZGlyZWN0aW9uLAotICAgICAgICBzdHIsIHN1Yiwgc3RhcnQsIGVuZAotICAgICAgICApOwotCi0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgUHlfREVDUkVGKHN1Yik7Ci0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBhbnlfZmluZF9zbGljZShzdHIsIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKIH0KIAogUHlfc3NpemVfdApAQCAtOTM0NywyMiArOTUxNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHN1YnN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1YnN0cik7Ci0gICAgaWYgKHN1YnN0ciA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHN0ciwgc3Vic3RyLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIFB5X0RFQ1JFRihzdWJzdHIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHRhaWxtYXRjaChzdHIsIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKIH0KIAogLyogQXBwbHkgZml4ZmN0IGZpbHRlciB0byB0aGUgVW5pY29kZSBvYmplY3Qgc2VsZiBhbmQgcmV0dXJuIGEKQEAgLTk5NjgsMTMgKzEwMTI1LDggQEAKIHsKICAgICBQeU9iamVjdCAqbGlzdDsKIAotICAgIHN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cmluZyk7Ci0gICAgaWYgKHN0cmluZyA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHJpbmcpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBzd2l0Y2ggKFB5VW5pY29kZV9LSU5EKHN0cmluZykpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgpAQCAtMTAwMDEsNyArMTAxNTMsNiBAQAogICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgIGxpc3QgPSAwOwogICAgIH0KLSAgICBQeV9ERUNSRUYoc3RyaW5nKTsKICAgICByZXR1cm4gbGlzdDsKIH0KIApAQCAtMTA1NjIsMjggKzEwNzEzLDI3IEBACiB9CiAKIAotLyogQXJndW1lbnQgY29udmVydGVyLiAgQ29lcmNlcyB0byBhIHNpbmdsZSB1bmljb2RlIGNoYXJhY3RlciAqLworLyogQXJndW1lbnQgY29udmVydGVyLiBBY2NlcHRzIGEgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVyLiAqLwogCiBzdGF0aWMgaW50CiBjb252ZXJ0X3VjKFB5T2JqZWN0ICpvYmosIHZvaWQgKmFkZHIpCiB7CiAgICAgUHlfVUNTNCAqZmlsbGNoYXJsb2MgPSAoUHlfVUNTNCAqKWFkZHI7Ci0gICAgUHlPYmplY3QgKnVuaW9iajsKIAotICAgIHVuaW9iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgaWYgKHVuaW9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbGwgY2hhcmFjdGVyIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSIpOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlsbCBjaGFyYWN0ZXIgbXVzdCBiZSBhIHVuaWNvZGUgY2hhcmFjdGVyLCAiCisgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgodW5pb2JqKSAhPSAxKSB7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaikgIT0gMSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBmaWxsIGNoYXJhY3RlciBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3RlciBsb25nIik7Ci0gICAgICAgIFB5X0RFQ1JFRih1bmlvYmopOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgKmZpbGxjaGFybG9jID0gUHlVbmljb2RlX1JFQURfQ0hBUih1bmlvYmosIDApOwotICAgIFB5X0RFQ1JFRih1bmlvYmopOworICAgICpmaWxsY2hhcmxvYyA9IFB5VW5pY29kZV9SRUFEX0NIQVIob2JqLCAwKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTA4OTksNTkgKzExMDQ5LDQ5IEBACiB9CiAKIGludAotUHlVbmljb2RlX0NvbnRhaW5zKFB5T2JqZWN0ICpjb250YWluZXIsIFB5T2JqZWN0ICplbGVtZW50KQorX1B5VW5pY29kZV9FUShQeU9iamVjdCAqYWEsIFB5T2JqZWN0ICpiYikKIHsKLSAgICBQeU9iamVjdCAqc3RyLCAqc3ViOworICAgIHJldHVybiB1bmljb2RlX2VxKGFhLCBiYik7Cit9CisKK2ludAorUHlVbmljb2RlX0NvbnRhaW5zKFB5T2JqZWN0ICpzdHIsIFB5T2JqZWN0ICpzdWJzdHIpCit7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAgICAgaW50IHJlc3VsdDsKIAotICAgIC8qIENvZXJjZSB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgIHN1YiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGVsZW1lbnQpOwotICAgIGlmICghc3ViKSB7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgbm90ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgIidpbiA8c3RyaW5nPicgcmVxdWlyZXMgc3RyaW5nIGFzIGxlZnQgb3BlcmFuZCwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0ciktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3QoY29udGFpbmVyKTsKLSAgICBpZiAoIXN0cikgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cikgPT0gLTEpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cik7Ci0gICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWIpOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1YnN0cik7CisgICAgaWYgKGtpbmQxIDwga2luZDIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KICAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKTsKLSAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3ViKTsKLSAgICBpZiAobGVuMSA8IGxlbjIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJzdHIpOworICAgIGlmIChsZW4xIDwgbGVuMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHIpOwotICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWIpOworICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHIpOwogICAgIGlmIChsZW4yID09IDEpIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQyLCBidWYyLCAwKTsKICAgICAgICAgcmVzdWx0ID0gZmluZGNoYXIoKGNvbnN0IGNoYXIgKilidWYxLCBraW5kMSwgbGVuMSwgY2gsIDEpICE9IC0xOwotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewotICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3ViLCBraW5kMSk7Ci0gICAgICAgIGlmICghYnVmMikgewotICAgICAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1YnN0ciwga2luZDEpOworICAgICAgICBpZiAoIWJ1ZjIpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CkBAIC0xMDk2OSw5ICsxMTEwOSw2IEBACiAgICAgICAgIGFzc2VydCgwKTsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3ViKTsKLQogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIApAQCAtMTA5ODMsNTYgKzExMTIwLDQwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfQ29uY2F0KFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiB7Ci0gICAgUHlPYmplY3QgKnUgPSBOVUxMLCAqdiA9IE5VTEwsICp3OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlfVUNTNCBtYXhjaGFyLCBtYXhjaGFyMjsKLSAgICBQeV9zc2l6ZV90IHVfbGVuLCB2X2xlbiwgbmV3X2xlbjsKKyAgICBQeV9zc2l6ZV90IGxlZnRfbGVuLCByaWdodF9sZW4sIG5ld19sZW47CiAKLSAgICAvKiBDb2VyY2UgdGhlIHR3byBhcmd1bWVudHMgKi8KLSAgICB1ID0gUHlVbmljb2RlX0Zyb21PYmplY3QobGVmdCk7Ci0gICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOwotICAgIHYgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChyaWdodCk7Ci0gICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGlmIChlbnN1cmVfdW5pY29kZShsZWZ0KSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUocmlnaHQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBTaG9ydGN1dHMgKi8KLSAgICBpZiAodiA9PSB1bmljb2RlX2VtcHR5KSB7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIHU7Ci0gICAgfQotICAgIGlmICh1ID09IHVuaWNvZGVfZW1wdHkpIHsKLSAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICByZXR1cm4gdjsKLSAgICB9CisgICAgaWYgKGxlZnQgPT0gdW5pY29kZV9lbXB0eSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KHJpZ2h0KTsKKyAgICBpZiAocmlnaHQgPT0gdW5pY29kZV9lbXB0eSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KGxlZnQpOwogCi0gICAgdV9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1KTsKLSAgICB2X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHYpOwotICAgIGlmICh1X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gdl9sZW4pIHsKKyAgICBsZWZ0X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGxlZnQpOworICAgIHJpZ2h0X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJpZ2h0KTsKKyAgICBpZiAobGVmdF9sZW4gPiBQWV9TU0laRV9UX01BWCAtIHJpZ2h0X2xlbikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIG5ld19sZW4gPSB1X2xlbiArIHZfbGVuOworICAgIG5ld19sZW4gPSBsZWZ0X2xlbiArIHJpZ2h0X2xlbjsKIAotICAgIG1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUodSk7Ci0gICAgbWF4Y2hhcjIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUodik7CisgICAgbWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRShsZWZ0KTsKKyAgICBtYXhjaGFyMiA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRShyaWdodCk7CiAgICAgbWF4Y2hhciA9IFB5X01BWChtYXhjaGFyLCBtYXhjaGFyMik7CiAKICAgICAvKiBDb25jYXQgdGhlIHR3byBVbmljb2RlIHN0cmluZ3MgKi8KLSAgICB3ID0gUHlVbmljb2RlX05ldyhuZXdfbGVuLCBtYXhjaGFyKTsKLSAgICBpZiAodyA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnModywgMCwgdSwgMCwgdV9sZW4pOwotICAgIF9QeVVuaWNvZGVfRmFzdENvcHlDaGFyYWN0ZXJzKHcsIHVfbGVuLCB2LCAwLCB2X2xlbik7Ci0gICAgUHlfREVDUkVGKHUpOwotICAgIFB5X0RFQ1JFRih2KTsKLSAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHcsIDEpKTsKLSAgICByZXR1cm4gdzsKLQotICBvbkVycm9yOgotICAgIFB5X1hERUNSRUYodSk7Ci0gICAgUHlfWERFQ1JFRih2KTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVVuaWNvZGVfTmV3KG5ld19sZW4sIG1heGNoYXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnMocmVzdWx0LCAwLCBsZWZ0LCAwLCBsZWZ0X2xlbik7CisgICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnMocmVzdWx0LCBsZWZ0X2xlbiwgcmlnaHQsIDAsIHJpZ2h0X2xlbik7CisgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeShyZXN1bHQsIDEpKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkCkBAIC0xMTE0NywyNSArMTEyNjgsMjEgQEAKIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc2VsZik7CiAgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHJpbmcpOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDApOwotICAgIH0KKwogICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzZWxmKTsKICAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3Vic3RyaW5nKTsKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4xKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpCiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMCk7Ci0gICAgfQorCiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHNlbGYpOwogICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHJpbmcpOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewogICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyaW5nLCBraW5kMSk7Ci0gICAgICAgIGlmICghYnVmMikgewotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CiAgICAgfQogICAgIHN3aXRjaCAoa2luZDEpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgpAQCAtMTExOTUsOCArMTEzMTIsNiBAQAogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEzMzQsMTggKzExNDQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgxLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE0MjIsMTggKzExNTI5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgxLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE5NDcsNyArMTIwNDYsNyBAQAogI2RlZmluZSBCT1RIU1RSSVAgMgogCiAvKiBBcnJheXMgaW5kZXhlZCBieSBhYm92ZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnN0cmlwZm9ybWF0W10gPSB7InxPOmxzdHJpcCIsICJ8Tzpyc3RyaXAiLCAifE86c3RyaXAifTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RyaXBmb3JtYXRbXSA9IHsifE86bHN0cmlwIiwgInxPOnJzdHJpcCIsICJ8TzpzdHJpcCJ9OwogCiAjZGVmaW5lIFNUUklQTkFNRShpKSAoc3RyaXBmb3JtYXRbaV0rMykKIApAQCAtMTIyNDIsNDAgKzEyMzQxLDE1IEBACiB9CiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9SZXBsYWNlKFB5T2JqZWN0ICpvYmosCi0gICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vib2JqLAotICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcGxvYmosCitQeVVuaWNvZGVfUmVwbGFjZShQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YnN0ciwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXBsc3RyLAogICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLSAgICBQeU9iamVjdCAqc2VsZjsKLSAgICBQeU9iamVjdCAqc3RyMTsKLSAgICBQeU9iamVjdCAqc3RyMjsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KG9iaik7Ci0gICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDAgfHwKKyAgICAgICAgICAgIGVuc3VyZV91bmljb2RlKHJlcGxzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN0cjEgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBzdHIyID0gUHlVbmljb2RlX0Zyb21PYmplY3QocmVwbG9iaik7Ci0gICAgaWYgKHN0cjIgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEgfHwKLSAgICAgICAgUHlVbmljb2RlX1JFQURZKHN0cjEpID09IC0xIHx8Ci0gICAgICAgIFB5VW5pY29kZV9SRUFEWShzdHIyKSA9PSAtMSkKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IHJlcGxhY2Uoc2VsZiwgc3RyMSwgc3RyMiwgbWF4Y291bnQpOwotICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgUHlfREVDUkVGKHN0cjIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlcGxhY2Uoc3RyLCBzdWJzdHIsIHJlcGxzdHIsIG1heGNvdW50KTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlcGxhY2VfX2RvY19fLApAQCAtMTIyOTEsMjggKzEyMzY1LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cjE7CiAgICAgUHlPYmplY3QgKnN0cjI7CiAgICAgUHlfc3NpemVfdCBtYXhjb3VudCA9IC0xOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfG46cmVwbGFjZSIsICZzdHIxLCAmc3RyMiwgJm1heGNvdW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVVfG46cmVwbGFjZSIsICZzdHIxLCAmc3RyMiwgJm1heGNvdW50KSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cjEpOwotICAgIGlmIChzdHIxID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cjIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIyKTsKLSAgICBpZiAoc3RyMiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyMSkgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cjIpID09IC0xKQotICAgICAgICByZXN1bHQgPSBOVUxMOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7Ci0KLSAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgUHlfREVDUkVGKHN0cjIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlcGxhY2Uoc2VsZiwgc3RyMSwgc3RyMiwgbWF4Y291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTI1MDEsMTggKzEyNTU5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgtMSwgc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kKTsKLQotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMjUzOCwxOCArMTI1ODgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKC0xLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7CiAKICAgICBpZiAocmVzdWx0ID09IC0yKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyNTg5LDI0ICsxMjYzMSwxMCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX1NwbGl0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzID0gUHlVbmljb2RlX0Zyb21PYmplY3Qocyk7Ci0gICAgaWYgKHMgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUocykgPCAwIHx8IChzZXAgIT0gTlVMTCAmJiBlbnN1cmVfdW5pY29kZShzZXApIDwgMCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXAgIT0gTlVMTCkgewotICAgICAgICBzZXAgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXApOwotICAgICAgICBpZiAoc2VwID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7Ci0KLSAgICBQeV9ERUNSRUYocyk7Ci0gICAgUHlfWERFQ1JFRihzZXApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwogfQogCiBQeURvY19TVFJWQVIoc3BsaXRfX2RvY19fLApAQCAtMTI2MzEsMzUgKzEyNjU5LDI2IEBACiAKICAgICBpZiAoc3Vic3RyaW5nID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiBzcGxpdChzZWxmLCBOVUxMLCBtYXhjb3VudCk7Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCiAgICAgICAgIHJldHVybiBzcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfU3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIgb3IgTm9uZSwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9QYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9pbiwgUHlPYmplY3QgKnNlcF9pbikKK1B5VW5pY29kZV9QYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9vYmosIFB5T2JqZWN0ICpzZXBfb2JqKQogewotICAgIFB5T2JqZWN0KiBzdHJfb2JqOwotICAgIFB5T2JqZWN0KiBzZXBfb2JqOwogICAgIFB5T2JqZWN0KiBvdXQ7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAKLSAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyX2luKTsKLSAgICBpZiAoIXN0cl9vYmopCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cl9vYmopIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzZXBfb2JqKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHNlcF9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXBfaW4pOwotICAgIGlmICghc2VwX29iaikgewotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlcF9vYmopID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHJfb2JqKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKICAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHNlcF9vYmopOwpAQCAtMTI2NzMsOCArMTI2OTIsNiBAQAogICAgICAgICAgICAgb3V0ID0gUHlUdXBsZV9QYWNrKDMsIHN0cl9vYmosIHVuaWNvZGVfZW1wdHksIHVuaWNvZGVfZW1wdHkpOwogICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGVfZW1wdHkpOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7CkBAIC0xMjY4Miw3ICsxMjY5OSw3IEBACiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7CiAgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzZXBfb2JqLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEyNzAzLDM5ICsxMjcyMCwyMyBAQAogICAgICAgICBvdXQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIG91dDsKLSAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQotICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiAKIFB5T2JqZWN0ICoKLVB5VW5pY29kZV9SUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfaW4sIFB5T2JqZWN0ICpzZXBfaW4pCitQeVVuaWNvZGVfUlBhcnRpdGlvbihQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHNlcF9vYmo7CiAgICAgUHlPYmplY3QqIG91dDsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJfaW4pOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyX29iaikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHNlcF9vYmopIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc2VwX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcF9pbik7Ci0gICAgaWYgKCFzZXBfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKICAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHNlcF9vYmopOwpAQCAtMTI3NDksOCArMTI3NTAsNiBAQAogICAgICAgICAgICAgb3V0ID0gUHlUdXBsZV9QYWNrKDMsIHVuaWNvZGVfZW1wdHksIHVuaWNvZGVfZW1wdHksIHN0cl9vYmopOwogICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGVfZW1wdHkpOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7CkBAIC0xMjc1OCw3ICsxMjc1Nyw3IEBACiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7CiAgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzZXBfb2JqLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEyNzc5LDE4ICsxMjc3OCwxMCBAQAogICAgICAgICBvdXQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCiAgICAgcmV0dXJuIG91dDsKLSAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgIGlmIChraW5kMiAhPSBraW5kMSAmJiBidWYyKQotICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwotICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocGFydGl0aW9uX19kb2NfXywKQEAgLTEyODIyLDI0ICsxMjgxMywxMCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX1JTcGxpdChQeU9iamVjdCAqcywgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgcyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHMpOwotICAgIGlmIChzID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHMpIDwgMCB8fCAoc2VwICE9IE5VTEwgJiYgZW5zdXJlX3VuaWNvZGUoc2VwKSA8IDApKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2VwICE9IE5VTEwpIHsKLSAgICAgICAgc2VwID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwKTsKLSAgICAgICAgaWYgKHNlcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHJlc3VsdCA9IHJzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKLQotICAgIFB5X0RFQ1JFRihzKTsKLSAgICBQeV9YREVDUkVGKHNlcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcnNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwogfQogCiBQeURvY19TVFJWQVIocnNwbGl0X19kb2NfXywKQEAgLTEyODY0LDEwICsxMjg0MSwxNCBAQAogCiAgICAgaWYgKHN1YnN0cmluZyA9PSBQeV9Ob25lKQogICAgICAgICByZXR1cm4gcnNwbGl0KHNlbGYsIE5VTEwsIG1heGNvdW50KTsKLSAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKICAgICAgICAgcmV0dXJuIHJzcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeVVuaWNvZGVfUlNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOworCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyIG9yIE5vbmUsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoc3BsaXRsaW5lc19fZG9jX18sCkBAIC0xMzE0OCwxMSArMTMxMjksMTUgQEAKICAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CiAgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSkpOwotICAgICAgICAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQorICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBmb3Igc3RhcnRzd2l0aCBtdXN0IG9ubHkgY29udGFpbiBzdHIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkgewpAQCAtMTMxNjIsMTUgKzEzMTQ3LDEzIEBACiAgICAgICAgIC8qIG5vdGhpbmcgbWF0Y2hlZCAqLwogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQotICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RhcnRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3RhcnRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJS4xMDBzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7CiAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwpAQCAtMTMyMDAsMTIgKzEzMTgzLDE1IEBACiAgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewogICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3QoCi0gICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpKTsKLSAgICAgICAgICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHVwbGUgZm9yIGVuZHN3aXRoIG11c3Qgb25seSBjb250YWluIHN0ciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CkBAIC0xMzIxNCwxNSArMTMyMDAsMTMgQEAKICAgICAgICAgfQogICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAgICAgfQotICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Ym9iaik7Ci0gICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZW5kc3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCisgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgKzEpOwotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CkBAIC0xMzIzMSw0NCArMTMyMTUsNTAgQEAKIFB5X0xPQ0FMX0lOTElORSh2b2lkKQogX1B5VW5pY29kZVdyaXRlcl9VcGRhdGUoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQogewotICAgIGlmICghd3JpdGVyLT5yZWFkb25seSkKKyAgICB3cml0ZXItPm1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUod3JpdGVyLT5idWZmZXIpOworICAgIHdyaXRlci0+ZGF0YSA9IFB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKTsKKworICAgIGlmICghd3JpdGVyLT5yZWFkb25seSkgeworICAgICAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfS0lORCh3cml0ZXItPmJ1ZmZlcik7CiAgICAgICAgIHdyaXRlci0+c2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHdyaXRlci0+YnVmZmVyKTsKKyAgICB9CiAgICAgZWxzZSB7CisgICAgICAgIC8qIHVzZSBhIHZhbHVlIHNtYWxsZXIgdGhhbiBQeVVuaWNvZGVfMUJZVEVfS0lORCgpIHNvCisgICAgICAgICAgIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKSB3aWxsIGNvcHkgdGhlIGJ1ZmZlci4gKi8KKyAgICAgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX1dDSEFSX0tJTkQ7CisgICAgICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPD0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworCiAgICAgICAgIC8qIENvcHktb24td3JpdGUgbW9kZTogc2V0IGJ1ZmZlciBzaXplIHRvIDAgc28KICAgICAgICAgICogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlKCkgd2lsbCBjb3B5IChhbmQgZW5sYXJnZSkgdGhlIGJ1ZmZlciBvbgogICAgICAgICAgKiBuZXh0IHdyaXRlLiAqLwogICAgICAgICB3cml0ZXItPnNpemUgPSAwOwogICAgIH0KLSAgICB3cml0ZXItPm1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUod3JpdGVyLT5idWZmZXIpOwotICAgIHdyaXRlci0+ZGF0YSA9IFB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKTsKLSAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfS0lORCh3cml0ZXItPmJ1ZmZlcik7CiB9CiAKIHZvaWQKIF9QeVVuaWNvZGVXcml0ZXJfSW5pdChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIpCiB7CiAgICAgbWVtc2V0KHdyaXRlciwgMCwgc2l6ZW9mKCp3cml0ZXIpKTsKLSNpZmRlZiBQeV9ERUJVRwotICAgIHdyaXRlci0+a2luZCA9IDU7ICAgIC8qIGludmFsaWQga2luZCAqLwotI2VuZGlmCisKKyAgICAvKiBBU0NJSSBpcyB0aGUgYmFyZSBtaW5pbXVtICovCiAgICAgd3JpdGVyLT5taW5fY2hhciA9IDEyNzsKKworICAgIC8qIHVzZSBhIHZhbHVlIHNtYWxsZXIgdGhhbiBQeVVuaWNvZGVfMUJZVEVfS0lORCgpIHNvCisgICAgICAgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgpIHdpbGwgY29weSB0aGUgYnVmZmVyLiAqLworICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9XQ0hBUl9LSU5EOworICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPD0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOwogfQogCiBpbnQKIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuZ3RoLCBQeV9VQ1M0IG1heGNoYXIpCiB7Ci0jaWZkZWYgTVNfV0lORE9XUwotICAgLyogT24gV2luZG93cywgb3ZlcmFsbG9jYXRlIGJ5IDUwJSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KLSMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDIKLSNlbHNlCi0gICAvKiBPbiBMaW51eCwgb3ZlcmFsbG9jYXRlIGJ5IDI1JSBpcyB0aGUgYmVzdCBmYWN0b3IgKi8KLSMgIGRlZmluZSBPVkVSQUxMT0NBVEVfRkFDVE9SIDQKLSNlbmRpZgogICAgIFB5X3NzaXplX3QgbmV3bGVuOwogICAgIFB5T2JqZWN0ICpuZXdidWZmZXI7CiAKLSAgICBhc3NlcnQobGVuZ3RoID4gMCk7CisgICAgLyogZW5zdXJlIHRoYXQgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSBtYWNybyB3YXMgdXNlZCAqLworICAgIGFzc2VydCgobWF4Y2hhciA+IHdyaXRlci0+bWF4Y2hhciAmJiBsZW5ndGggPj0gMCkKKyAgICAgICAgICAgfHwgbGVuZ3RoID4gMCk7CiAKICAgICBpZiAobGVuZ3RoID4gUFlfU1NJWkVfVF9NQVggLSB3cml0ZXItPnBvcykgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtMTMzMzQsNiArMTMzMjQsMjggQEAKICN1bmRlZiBPVkVSQUxMT0NBVEVfRkFDVE9SCiB9CiAKK2ludAorX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQpCit7CisgICAgUHlfVUNTNCBtYXhjaGFyOworCisgICAgLyogZW5zdXJlIHRoYXQgdGhlIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQgbWFjcm8gd2FzIHVzZWQgKi8KKyAgICBhc3NlcnQod3JpdGVyLT5raW5kIDwga2luZCk7CisKKyAgICBzd2l0Y2ggKGtpbmQpCisgICAgeworICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IG1heGNoYXIgPSAweGZmOyBicmVhazsKKyAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBtYXhjaGFyID0gMHhmZmZmOyBicmVhazsKKyAgICBjYXNlIFB5VW5pY29kZV80QllURV9LSU5EOiBtYXhjaGFyID0gMHgxMGZmZmY7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwICYmICJpbnZhbGlkIGtpbmQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbCh3cml0ZXIsIDAsIG1heGNoYXIpOworfQorCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLCBQeV9VQ1M0IGNoKQogewpAQCAtMTM1MDQsMTcgKzEzNTE2LDI2IEBACiAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpID09IHdyaXRlci0+cG9zKTsKICAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKHdyaXRlci0+YnVmZmVyKSAhPSB3cml0ZXItPnBvcykgewotICAgICAgICBQeU9iamVjdCAqbmV3YnVmZmVyOwotICAgICAgICBuZXdidWZmZXIgPSByZXNpemVfY29tcGFjdCh3cml0ZXItPmJ1ZmZlciwgd3JpdGVyLT5wb3MpOwotICAgICAgICBpZiAobmV3YnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci0+YnVmZmVyID0gbmV3YnVmZmVyOworICAgIGlmICh3cml0ZXItPnBvcyA9PSAwKSB7CisgICAgICAgIFB5X0NMRUFSKHdyaXRlci0+YnVmZmVyKTsKKworICAgICAgICAvKiBHZXQgdGhlIGVtcHR5IFVuaWNvZGUgc3RyaW5nIHNpbmdsZXRvbiAoJycpICovCisgICAgICAgIF9QeV9JTkNSRUZfVU5JQ09ERV9FTVBUWSgpOworICAgICAgICBzdHIgID0gdW5pY29kZV9lbXB0eTsKICAgICB9Ci0gICAgc3RyID0gd3JpdGVyLT5idWZmZXI7Ci0gICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBzdHIgPSB3cml0ZXItPmJ1ZmZlcjsKKyAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBOVUxMOworCisgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICE9IHdyaXRlci0+cG9zKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RyMjsKKyAgICAgICAgICAgIHN0cjIgPSByZXNpemVfY29tcGFjdChzdHIsIHdyaXRlci0+cG9zKTsKKyAgICAgICAgICAgIGlmIChzdHIyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzdHIgPSBzdHIyOworICAgICAgICB9CisgICAgfQorCiAgICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeShzdHIsIDEpKTsKICAgICByZXR1cm4gdW5pY29kZV9yZXN1bHRfcmVhZHkoc3RyKTsKIH0KQEAgLTE0NjU1LDEzICsxNDY3NiwxMCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBjdHguZm10c3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3QoZm9ybWF0KTsKLSAgICBpZiAoY3R4LmZtdHN0ciA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShmb3JtYXQpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShjdHguZm10c3RyKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoY3R4LmZtdHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKworICAgIGN0eC5mbXRzdHIgPSBmb3JtYXQ7CiAgICAgY3R4LmZtdGRhdGEgPSBQeVVuaWNvZGVfREFUQShjdHguZm10c3RyKTsKICAgICBjdHguZm10a2luZCA9IFB5VW5pY29kZV9LSU5EKGN0eC5mbXRzdHIpOwogICAgIGN0eC5mbXRjbnQgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChjdHguZm10c3RyKTsKQEAgLTE0NzIxLDExICsxNDczOSw5IEBACiAgICAgaWYgKGN0eC5hcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjdHguYXJncyk7CiAgICAgfQotICAgIFB5X0RFQ1JFRihjdHguZm10c3RyKTsKICAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9GaW5pc2goJmN0eC53cml0ZXIpOwogCiAgIG9uRXJyb3I6Ci0gICAgUHlfREVDUkVGKGN0eC5mbXRzdHIpOwogICAgIF9QeVVuaWNvZGVXcml0ZXJfRGVhbGxvYygmY3R4LndyaXRlcik7CiAgICAgaWYgKGN0eC5hcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihjdHguYXJncyk7CmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IGQ0ZDUyZTYuLmY0MmZlM2QgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIH0KIAogc3RhdGljIGludAotcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAorcGFyc2Vfd2Vha3JlZl9pbml0X2FyZ3MoY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipvYnAsIFB5T2JqZWN0ICoqY2FsbGJhY2twKQogewogICAgIC8qIFhYWCBTaG91bGQgY2hlY2sgdGhhdCBrd2FyZ3MgPT0gTlVMTCBvciBpcyBlbXB0eS4gKi8KZGlmZiAtLWdpdCBhL1BDL19tc2kuYyBiL1BDL19tc2kuYwppbmRleCA4NmE1OTQzLi5iNjZiMThiIDEwMDY0NAotLS0gYS9QQy9fbXNpLmMKKysrIGIvUEMvX21zaS5jCkBAIC0xMDMyLDEyICsxMDMyLDEyIEBACiAgICAgaWYgKG0gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURURJUkVDVCIsIChpbnQpTVNJREJPUEVOX0NSRUFURURJUkVDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEUiLCAoaW50KU1TSURCT1BFTl9DUkVBVEUpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fRElSRUNUIiwgKGludClNU0lEQk9QRU5fRElSRUNUKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1JFQURPTkxZIiwgKGludClNU0lEQk9QRU5fUkVBRE9OTFkpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fVFJBTlNBQ1QiLCAoaW50KU1TSURCT1BFTl9UUkFOU0FDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9QQVRDSEZJTEUiLCAoaW50KU1TSURCT1BFTl9QQVRDSEZJTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGxvbmcpTVNJREJPUEVOX0NSRUFURURJUkVDVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEUiLCAobG9uZylNU0lEQk9QRU5fQ1JFQVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0RJUkVDVCIsIChsb25nKU1TSURCT1BFTl9ESVJFQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUkVBRE9OTFkiLCAobG9uZylNU0lEQk9QRU5fUkVBRE9OTFkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fVFJBTlNBQ1QiLCAobG9uZylNU0lEQk9QRU5fVFJBTlNBQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUEFUQ0hGSUxFIiwgKGxvbmcpTVNJREJPUEVOX1BBVENIRklMRSk7CiAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBNU0lDT0xJTkZPX05BTUVTKTsKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBNU0lDT0xJTkZPX1RZUEVTKTsKZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKaW5kZXggY2IwMzdmZi4uZTAxZGJhNiAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKQEAgLTcxOCw3ICs3MTgsNyBAQAogICogMSBpZiB0aGUgUHl0aG9uLWRsbCBkb2VzIG5vdCBleHBvcnQgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkCiAgKiAyIGlmIG5vIGluc3RhbGwtc2NyaXB0IGlzIHNwZWNpZmllZCBpbiBwYXRobmFtZQogICogMyBpZiB0aGUgaW5zdGFsbC1zY3JpcHQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkCi0gKiB0aGUgcmV0dXJuIHZhbHVlIG9mIFB5UnVuX1NpbXBsZVN0cmluZygpIG90aGVyd2lzZSwKKyAqIHRoZSByZXR1cm4gdmFsdWUgb2YgUHlSdW5fU2ltcGxlU3RyaW5nKCkgb3IgUHlfRmluYWxpemVFeCgpIG90aGVyd2lzZSwKICAqIHdoaWNoIGlzIDAgaWYgZXZlcnl0aGluZyBpcyBvaywgLTEgaWYgYW4gZXhjZXB0aW9uIGhhZCBvY2N1cnJlZAogICogaW4gdGhlIGluc3RhbGwtc2NyaXB0LgogICovCkBAIC03MzEsNyArNzMxLDcgQEAKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlTeXNfU2V0QXJndiwgKGludCwgd2NoYXJfdCAqKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0gICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeV9GaW5hbGl6ZUV4LCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywKICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOwpAQCAtNzM5LDcgKzczOSw3IEBACiAgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CiAKICAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5U3lzX1NldEFyZ3YKLSAgICAgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemUpCisgICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplRXgpCiAgICAgICAgIHJldHVybiAxOwogCiAgICAgaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCkBAIC03ODYsNyArNzg2LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KIAogICAgIGNsb3NlKGZoKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODQ4LDExICs4NTAsMTEgQEAKICAgICBpbnQgcmM7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKHdjaGFyX3QgKikpOwotICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlfRmluYWxpemVFeCwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5RXJyX1ByaW50LCAodm9pZCkpOwogCi0gICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUgfHwKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZUV4IHx8CiAgICAgICAgICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5RXJyX1ByaW50KQogICAgICAgICByZXR1cm4gLTE7CiAKQEAgLTg2Miw3ICs4NjQsOSBAQAogICAgIHJjID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7CiAgICAgaWYgKHJjKQogICAgICAgICBQeUVycl9QcmludCgpOwotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CiAgICAgcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9QQy9nZXRwYXRocC5jIGIvUEMvZ2V0cGF0aHAuYwppbmRleCBjN2RkZjFlLi5jYjlmMWRiIDEwMDY0NAotLS0gYS9QQy9nZXRwYXRocC5jCisrKyBiL1BDL2dldHBhdGhwLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogc3RhdGljIGludAogaXNtb2R1bGUod2NoYXJfdCAqZmlsZW5hbWUsIGludCB1cGRhdGVfZmlsZW5hbWUpIC8qIElzIG1vZHVsZSAtLSBjaGVjayBmb3IgLnB5Yy8ucHlvIHRvbyAqLwogewotICAgIGludCBuOworICAgIHNpemVfdCBuOwogCiAgICAgaWYgKGV4aXN0cyhmaWxlbmFtZSkpCiAgICAgICAgIHJldHVybiAxOwpAQCAtNTUzLDcgKzU1Myw3IEBACiAgICAgICAgICAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgcHl0aG9uaG9tZSA9IGFyZ3YwX3BhdGg7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLyogTG9vayBmb3IgYSAnaG9tZScgdmFyaWFibGUgYW5kIHNldCBhcmd2MF9wYXRoIHRvIGl0LCBpZiBmb3VuZCAqLwogICAgICAgICAgICAgaWYgKGZpbmRfZW52X2NvbmZpZ192YWx1ZShlbnZfZmlsZSwgTCJob21lIiwgdG1wYnVmZmVyKSkgewogICAgICAgICAgICAgICAgIHdjc2NweV9zKGFyZ3YwX3BhdGgsIE1BWFBBVEhMRU4rMSwgdG1wYnVmZmVyKTsKZGlmZiAtLWdpdCBhL1BDL2xhdW5jaGVyLmMgYi9QQy9sYXVuY2hlci5jCmluZGV4IDhhZWY0OWEuLmVhYzAxZjggMTAwNjQ0Ci0tLSBhL1BDL2xhdW5jaGVyLmMKKysrIGIvUEMvbGF1bmNoZXIuYwpAQCAtOTgsNyArOTgsNyBAQAogICAgIE1lc3NhZ2VCb3goTlVMTCwgbWVzc2FnZSwgVEVYVCgiUHl0aG9uIExhdW5jaGVyIGlzIHNvcnJ5IHRvIHNheSAuLi4iKSwKICAgICAgICAgICAgICAgIE1CX09LKTsKICNlbmRpZgotICAgIEV4aXRQcm9jZXNzKHJjKTsKKyAgICBleGl0KHJjKTsKIH0KIAogLyoKQEAgLTY1NSw3ICs2NTUsNyBAQAogICAgIGlmICghb2spCiAgICAgICAgIGVycm9yKFJDX0NSRUFURV9QUk9DRVNTLCBMIkZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MiKTsKICAgICBkZWJ1ZyhMImNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlOiAlZFxuIiwgcmMpOwotICAgIEV4aXRQcm9jZXNzKHJjKTsKKyAgICBleGl0KHJjKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTExMTQsNyArMTExNCw3IEBACiAgKi8KICAgICBGSUxFICogZnA7CiAgICAgZXJybm9fdCByYyA9IF93Zm9wZW5fcygmZnAsICphcmd2LCBMInJiIik7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbQlVGU0laRV07CisgICAgY2hhciBidWZmZXJbQlVGU0laRV07CiAgICAgd2NoYXJfdCBzaGViYW5nX2xpbmVbQlVGU0laRSArIDFdOwogICAgIHNpemVfdCByZWFkOwogICAgIGNoYXIgKnA7CkBAIC0xMTM2LDcgKzExMzYsOCBAQAogICAgICAgICBmY2xvc2UoZnApOwogCiAgICAgICAgIGlmICgocmVhZCA+PSA0KSAmJiAoYnVmZmVyWzNdID09ICdcbicpICYmIChidWZmZXJbMl0gPT0gJ1xyJykpIHsKLSAgICAgICAgICAgIGlwID0gZmluZF9ieV9tYWdpYygoYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF0pICYgMHhGRkZGKTsKKyAgICAgICAgICAgIGlwID0gZmluZF9ieV9tYWdpYygoKCh1bnNpZ25lZCBjaGFyKWJ1ZmZlclsxXSkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclswXSkgJiAweEZGRkYpOwogICAgICAgICAgICAgaWYgKGlwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBkZWJ1ZyhMInNjcmlwdCBmaWxlIGlzIGNvbXBpbGVkIGFnYWluc3QgUHl0aG9uICVsc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBpcC0+dmVyc2lvbik7CkBAIC0xMzYyLDYgKzEzNjMsNyBAQAogICAgIHdjaGFyX3QgKiBhdlsyXTsKICNlbmRpZgogCisgICAgc2V0dmJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCwgX0lPTkJGLCAwKTsKICAgICB3cCA9IGdldF9lbnYoTCJQWUxBVU5DSF9ERUJVRyIpOwogICAgIGlmICgod3AgIT0gTlVMTCkgJiYgKCp3cCAhPSBMJ1wwJykpCiAgICAgICAgIGxvZ19mcCA9IHN0ZGVycjsKZGlmZiAtLWdpdCBhL1BDL21zdmNydG1vZHVsZS5jIGIvUEMvbXN2Y3J0bW9kdWxlLmMKaW5kZXggNTJkNDEwMC4uZDczY2U3OSAxMDA2NDQKLS0tIGEvUEMvbXN2Y3J0bW9kdWxlLmMKKysrIGIvUEMvbXN2Y3J0bW9kdWxlLmMKQEAgLTU0MSw3ICs1NDEsNiBAQAogI2VuZGlmCiAKICAgICAvKiBjb25zdGFudHMgZm9yIHRoZSBjcnQgdmVyc2lvbnMgKi8KLSAgICAodm9pZClzdDsKICNpZmRlZiBfVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4KICAgICBzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJWQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4pOwpAQCAtNTY3LDYgKzU2Niw4IEBACiAgICAgc3QgPSBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNSVF9BU1NFTUJMWV9WRVJTSU9OIiwgdmVyc2lvbik7CiAgICAgaWYgKHN0IDwgMCkgcmV0dXJuIE5VTEw7CiAjZW5kaWYKKyAgICAvKiBtYWtlIGNvbXBpbGVyIHdhcm5pbmcgcXVpZXQgaWYgc3QgaXMgdW51c2VkICovCisgICAgKHZvaWQpc3Q7CiAKICAgICByZXR1cm4gbTsKIH0KZGlmZiAtLWdpdCBhL1BDL3B5Y29uZmlnLmggYi9QQy9weWNvbmZpZy5oCmluZGV4IGQ0NDE3M2EuLjg4NjExNDggMTAwNjQ0Ci0tLSBhL1BDL3B5Y29uZmlnLmgKKysrIGIvUEMvcHljb25maWcuaApAQCAtMzEyLDExICszMTIsMTEgQEAKIAkJCXRoZWlyIE1ha2VmaWxlIChvdGhlciBjb21waWxlcnMgYXJlIGdlbmVyYWxseQogCQkJdGFrZW4gY2FyZSBvZiBieSBkaXN0dXRpbHMuKSAqLwogIwkJCWlmIGRlZmluZWQoX0RFQlVHKQotIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM1X2QubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNl9kLmxpYiIpCiAjCQkJZWxpZiBkZWZpbmVkKFB5X0xJTUlURURfQVBJKQogIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjMubGliIikKICMJCQllbHNlCi0jCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzUubGliIikKKyMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNi5saWIiKQogIwkJCWVuZGlmIC8qIF9ERUJVRyAqLwogIwkJZW5kaWYgLyogX01TQ19WRVIgKi8KICMJZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvUEMvcHl0aG9uMy5kZWYgYi9QQy9weXRob24zLmRlZgppbmRleCA4OGMwNzQyLi5lOGQyZDhjIDEwMDY0NAotLS0gYS9QQy9weXRob24zLmRlZgorKysgYi9QQy9weXRob24zLmRlZgpAQCAtMiw3MTIgKzIsNzEzIEBACiA7IEl0IGlzIHVzZWQgd2hlbiBidWlsZGluZyBweXRob24zZGxsLnZjeHByb2oKIExJQlJBUlkJInB5dGhvbjMiCiBFWFBPUlRTCi0gIFB5QXJnX1BhcnNlPXB5dGhvbjM1LlB5QXJnX1BhcnNlCi0gIFB5QXJnX1BhcnNlVHVwbGU9cHl0aG9uMzUuUHlBcmdfUGFyc2VUdXBsZQotICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzUuUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCi0gIFB5QXJnX1VucGFja1R1cGxlPXB5dGhvbjM1LlB5QXJnX1VucGFja1R1cGxlCi0gIFB5QXJnX1ZhUGFyc2U9cHl0aG9uMzUuUHlBcmdfVmFQYXJzZQotICBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNS5QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcwotICBQeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHM9cHl0aG9uMzUuUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzCi0gIFB5QmFzZU9iamVjdF9UeXBlPXB5dGhvbjM1LlB5QmFzZU9iamVjdF9UeXBlIERBVEEKLSAgUHlCb29sX0Zyb21Mb25nPXB5dGhvbjM1LlB5Qm9vbF9Gcm9tTG9uZwotICBQeUJvb2xfVHlwZT1weXRob24zNS5QeUJvb2xfVHlwZSBEQVRBCi0gIFB5Qnl0ZUFycmF5SXRlcl9UeXBlPXB5dGhvbjM1LlB5Qnl0ZUFycmF5SXRlcl9UeXBlIERBVEEKLSAgUHlCeXRlQXJyYXlfQXNTdHJpbmc9cHl0aG9uMzUuUHlCeXRlQXJyYXlfQXNTdHJpbmcKLSAgUHlCeXRlQXJyYXlfQ29uY2F0PXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0NvbmNhdAotICBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0Zyb21PYmplY3QKLSAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlCeXRlQXJyYXlfUmVzaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1Jlc2l6ZQotICBQeUJ5dGVBcnJheV9TaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1NpemUKLSAgUHlCeXRlQXJyYXlfVHlwZT1weXRob24zNS5QeUJ5dGVBcnJheV9UeXBlIERBVEEKLSAgUHlCeXRlc0l0ZXJfVHlwZT1weXRob24zNS5QeUJ5dGVzSXRlcl9UeXBlIERBVEEKLSAgUHlCeXRlc19Bc1N0cmluZz1weXRob24zNS5QeUJ5dGVzX0FzU3RyaW5nCi0gIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZXNfQ29uY2F0PXB5dGhvbjM1LlB5Qnl0ZXNfQ29uY2F0Ci0gIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsPXB5dGhvbjM1LlB5Qnl0ZXNfQ29uY2F0QW5kRGVsCi0gIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlPXB5dGhvbjM1LlB5Qnl0ZXNfRGVjb2RlRXNjYXBlCi0gIFB5Qnl0ZXNfRnJvbUZvcm1hdD1weXRob24zNS5QeUJ5dGVzX0Zyb21Gb3JtYXQKLSAgUHlCeXRlc19Gcm9tRm9ybWF0Vj1weXRob24zNS5QeUJ5dGVzX0Zyb21Gb3JtYXRWCi0gIFB5Qnl0ZXNfRnJvbU9iamVjdD1weXRob24zNS5QeUJ5dGVzX0Zyb21PYmplY3QKLSAgUHlCeXRlc19Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbVN0cmluZwotICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlCeXRlc19SZXByPXB5dGhvbjM1LlB5Qnl0ZXNfUmVwcgotICBQeUJ5dGVzX1NpemU9cHl0aG9uMzUuUHlCeXRlc19TaXplCi0gIFB5Qnl0ZXNfVHlwZT1weXRob24zNS5QeUJ5dGVzX1R5cGUgREFUQQotICBQeUNGdW5jdGlvbl9DYWxsPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0NhbGwKLSAgUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdD1weXRob24zNS5QeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0Ci0gIFB5Q0Z1bmN0aW9uX0dldEZsYWdzPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldEZsYWdzCi0gIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uCi0gIFB5Q0Z1bmN0aW9uX0dldFNlbGY9cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0U2VsZgotICBQeUNGdW5jdGlvbl9OZXc9cHl0aG9uMzUuUHlDRnVuY3Rpb25fTmV3Ci0gIFB5Q0Z1bmN0aW9uX05ld0V4PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX05ld0V4Ci0gIFB5Q0Z1bmN0aW9uX1R5cGU9cHl0aG9uMzUuUHlDRnVuY3Rpb25fVHlwZSBEQVRBCi0gIFB5Q2FsbEl0ZXJfTmV3PXB5dGhvbjM1LlB5Q2FsbEl0ZXJfTmV3Ci0gIFB5Q2FsbEl0ZXJfVHlwZT1weXRob24zNS5QeUNhbGxJdGVyX1R5cGUgREFUQQotICBQeUNhbGxhYmxlX0NoZWNrPXB5dGhvbjM1LlB5Q2FsbGFibGVfQ2hlY2sKLSAgUHlDYXBzdWxlX0dldENvbnRleHQ9cHl0aG9uMzUuUHlDYXBzdWxlX0dldENvbnRleHQKLSAgUHlDYXBzdWxlX0dldERlc3RydWN0b3I9cHl0aG9uMzUuUHlDYXBzdWxlX0dldERlc3RydWN0b3IKLSAgUHlDYXBzdWxlX0dldE5hbWU9cHl0aG9uMzUuUHlDYXBzdWxlX0dldE5hbWUKLSAgUHlDYXBzdWxlX0dldFBvaW50ZXI9cHl0aG9uMzUuUHlDYXBzdWxlX0dldFBvaW50ZXIKLSAgUHlDYXBzdWxlX0ltcG9ydD1weXRob24zNS5QeUNhcHN1bGVfSW1wb3J0Ci0gIFB5Q2Fwc3VsZV9Jc1ZhbGlkPXB5dGhvbjM1LlB5Q2Fwc3VsZV9Jc1ZhbGlkCi0gIFB5Q2Fwc3VsZV9OZXc9cHl0aG9uMzUuUHlDYXBzdWxlX05ldwotICBQeUNhcHN1bGVfU2V0Q29udGV4dD1weXRob24zNS5QeUNhcHN1bGVfU2V0Q29udGV4dAotICBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3Rvcj1weXRob24zNS5QeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcgotICBQeUNhcHN1bGVfU2V0TmFtZT1weXRob24zNS5QeUNhcHN1bGVfU2V0TmFtZQotICBQeUNhcHN1bGVfU2V0UG9pbnRlcj1weXRob24zNS5QeUNhcHN1bGVfU2V0UG9pbnRlcgotICBQeUNhcHN1bGVfVHlwZT1weXRob24zNS5QeUNhcHN1bGVfVHlwZSBEQVRBCi0gIFB5Q2xhc3NNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM1LlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlIERBVEEKLSAgUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycwotICBQeUNvZGVjX0RlY29kZT1weXRob24zNS5QeUNvZGVjX0RlY29kZQotICBQeUNvZGVjX0RlY29kZXI9cHl0aG9uMzUuUHlDb2RlY19EZWNvZGVyCi0gIFB5Q29kZWNfRW5jb2RlPXB5dGhvbjM1LlB5Q29kZWNfRW5jb2RlCi0gIFB5Q29kZWNfRW5jb2Rlcj1weXRob24zNS5QeUNvZGVjX0VuY29kZXIKLSAgUHlDb2RlY19JZ25vcmVFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19JZ25vcmVFcnJvcnMKLSAgUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXI9cHl0aG9uMzUuUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIKLSAgUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXI9cHl0aG9uMzUuUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIKLSAgUHlDb2RlY19Lbm93bkVuY29kaW5nPXB5dGhvbjM1LlB5Q29kZWNfS25vd25FbmNvZGluZwotICBQeUNvZGVjX0xvb2t1cEVycm9yPXB5dGhvbjM1LlB5Q29kZWNfTG9va3VwRXJyb3IKLSAgUHlDb2RlY19SZWdpc3Rlcj1weXRob24zNS5QeUNvZGVjX1JlZ2lzdGVyCi0gIFB5Q29kZWNfUmVnaXN0ZXJFcnJvcj1weXRob24zNS5QeUNvZGVjX1JlZ2lzdGVyRXJyb3IKLSAgUHlDb2RlY19SZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfUmVwbGFjZUVycm9ycwotICBQeUNvZGVjX1N0cmVhbVJlYWRlcj1weXRob24zNS5QeUNvZGVjX1N0cmVhbVJlYWRlcgotICBQeUNvZGVjX1N0cmVhbVdyaXRlcj1weXRob24zNS5QeUNvZGVjX1N0cmVhbVdyaXRlcgotICBQeUNvZGVjX1N0cmljdEVycm9ycz1weXRob24zNS5QeUNvZGVjX1N0cmljdEVycm9ycwotICBQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMKLSAgUHlDb21wbGV4X0Zyb21Eb3VibGVzPXB5dGhvbjM1LlB5Q29tcGxleF9Gcm9tRG91YmxlcwotICBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlPXB5dGhvbjM1LlB5Q29tcGxleF9JbWFnQXNEb3VibGUKLSAgUHlDb21wbGV4X1JlYWxBc0RvdWJsZT1weXRob24zNS5QeUNvbXBsZXhfUmVhbEFzRG91YmxlCi0gIFB5Q29tcGxleF9UeXBlPXB5dGhvbjM1LlB5Q29tcGxleF9UeXBlIERBVEEKLSAgUHlEZXNjcl9OZXdDbGFzc01ldGhvZD1weXRob24zNS5QeURlc2NyX05ld0NsYXNzTWV0aG9kCi0gIFB5RGVzY3JfTmV3R2V0U2V0PXB5dGhvbjM1LlB5RGVzY3JfTmV3R2V0U2V0Ci0gIFB5RGVzY3JfTmV3TWVtYmVyPXB5dGhvbjM1LlB5RGVzY3JfTmV3TWVtYmVyCi0gIFB5RGVzY3JfTmV3TWV0aG9kPXB5dGhvbjM1LlB5RGVzY3JfTmV3TWV0aG9kCi0gIFB5RGljdEl0ZW1zX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlbXNfVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJJdGVtX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlckl0ZW1fVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJLZXlfVHlwZT1weXRob24zNS5QeURpY3RJdGVyS2V5X1R5cGUgREFUQQotICBQeURpY3RJdGVyVmFsdWVfVHlwZT1weXRob24zNS5QeURpY3RJdGVyVmFsdWVfVHlwZSBEQVRBCi0gIFB5RGljdEtleXNfVHlwZT1weXRob24zNS5QeURpY3RLZXlzX1R5cGUgREFUQQotICBQeURpY3RQcm94eV9OZXc9cHl0aG9uMzUuUHlEaWN0UHJveHlfTmV3Ci0gIFB5RGljdFByb3h5X1R5cGU9cHl0aG9uMzUuUHlEaWN0UHJveHlfVHlwZSBEQVRBCi0gIFB5RGljdFZhbHVlc19UeXBlPXB5dGhvbjM1LlB5RGljdFZhbHVlc19UeXBlIERBVEEKLSAgUHlEaWN0X0NsZWFyPXB5dGhvbjM1LlB5RGljdF9DbGVhcgotICBQeURpY3RfQ29udGFpbnM9cHl0aG9uMzUuUHlEaWN0X0NvbnRhaW5zCi0gIFB5RGljdF9Db3B5PXB5dGhvbjM1LlB5RGljdF9Db3B5Ci0gIFB5RGljdF9EZWxJdGVtPXB5dGhvbjM1LlB5RGljdF9EZWxJdGVtCi0gIFB5RGljdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9EZWxJdGVtU3RyaW5nCi0gIFB5RGljdF9HZXRJdGVtPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtCi0gIFB5RGljdF9HZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtU3RyaW5nCi0gIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yPXB5dGhvbjM1LlB5RGljdF9HZXRJdGVtV2l0aEVycm9yCi0gIFB5RGljdF9JdGVtcz1weXRob24zNS5QeURpY3RfSXRlbXMKLSAgUHlEaWN0X0tleXM9cHl0aG9uMzUuUHlEaWN0X0tleXMKLSAgUHlEaWN0X01lcmdlPXB5dGhvbjM1LlB5RGljdF9NZXJnZQotICBQeURpY3RfTWVyZ2VGcm9tU2VxMj1weXRob24zNS5QeURpY3RfTWVyZ2VGcm9tU2VxMgotICBQeURpY3RfTmV3PXB5dGhvbjM1LlB5RGljdF9OZXcKLSAgUHlEaWN0X05leHQ9cHl0aG9uMzUuUHlEaWN0X05leHQKLSAgUHlEaWN0X1NldEl0ZW09cHl0aG9uMzUuUHlEaWN0X1NldEl0ZW0KLSAgUHlEaWN0X1NldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X1NldEl0ZW1TdHJpbmcKLSAgUHlEaWN0X1NpemU9cHl0aG9uMzUuUHlEaWN0X1NpemUKLSAgUHlEaWN0X1R5cGU9cHl0aG9uMzUuUHlEaWN0X1R5cGUgREFUQQotICBQeURpY3RfVXBkYXRlPXB5dGhvbjM1LlB5RGljdF9VcGRhdGUKLSAgUHlEaWN0X1ZhbHVlcz1weXRob24zNS5QeURpY3RfVmFsdWVzCi0gIFB5RWxsaXBzaXNfVHlwZT1weXRob24zNS5QeUVsbGlwc2lzX1R5cGUgREFUQQotICBQeUVudW1fVHlwZT1weXRob24zNS5QeUVudW1fVHlwZSBEQVRBCi0gIFB5RXJyX0JhZEFyZ3VtZW50PXB5dGhvbjM1LlB5RXJyX0JhZEFyZ3VtZW50Ci0gIFB5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNS5QeUVycl9CYWRJbnRlcm5hbENhbGwKLSAgUHlFcnJfQ2hlY2tTaWduYWxzPXB5dGhvbjM1LlB5RXJyX0NoZWNrU2lnbmFscwotICBQeUVycl9DbGVhcj1weXRob24zNS5QeUVycl9DbGVhcgotICBQeUVycl9EaXNwbGF5PXB5dGhvbjM1LlB5RXJyX0Rpc3BsYXkKLSAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNS5QeUVycl9FeGNlcHRpb25NYXRjaGVzCi0gIFB5RXJyX0ZldGNoPXB5dGhvbjM1LlB5RXJyX0ZldGNoCi0gIFB5RXJyX0Zvcm1hdD1weXRob24zNS5QeUVycl9Gb3JtYXQKLSAgUHlFcnJfRm9ybWF0Vj1weXRob24zNS5QeUVycl9Gb3JtYXRWCi0gIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNS5QeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMKLSAgUHlFcnJfTmV3RXhjZXB0aW9uPXB5dGhvbjM1LlB5RXJyX05ld0V4Y2VwdGlvbgotICBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jPXB5dGhvbjM1LlB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MKLSAgUHlFcnJfTm9NZW1vcnk9cHl0aG9uMzUuUHlFcnJfTm9NZW1vcnkKLSAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbgotICBQeUVycl9PY2N1cnJlZD1weXRob24zNS5QeUVycl9PY2N1cnJlZAotICBQeUVycl9QcmludD1weXRob24zNS5QeUVycl9QcmludAotICBQeUVycl9QcmludEV4PXB5dGhvbjM1LlB5RXJyX1ByaW50RXgKLSAgUHlFcnJfUHJvZ3JhbVRleHQ9cHl0aG9uMzUuUHlFcnJfUHJvZ3JhbVRleHQKLSAgUHlFcnJfUmVzdG9yZT1weXRob24zNS5QeUVycl9SZXN0b3JlCi0gIFB5RXJyX1NldEZyb21FcnJubz1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm8KLSAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lPXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZQotICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3Q9cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0Ci0gIFB5RXJyX1NldEludGVycnVwdD1weXRob24zNS5QeUVycl9TZXRJbnRlcnJ1cHQKLSAgUHlFcnJfU2V0Tm9uZT1weXRob24zNS5QeUVycl9TZXROb25lCi0gIFB5RXJyX1NldE9iamVjdD1weXRob24zNS5QeUVycl9TZXRPYmplY3QKLSAgUHlFcnJfU2V0U3RyaW5nPXB5dGhvbjM1LlB5RXJyX1NldFN0cmluZwotICBQeUVycl9TeW50YXhMb2NhdGlvbj1weXRob24zNS5QeUVycl9TeW50YXhMb2NhdGlvbgotICBQeUVycl9XYXJuRXg9cHl0aG9uMzUuUHlFcnJfV2FybkV4Ci0gIFB5RXJyX1dhcm5FeHBsaWNpdD1weXRob24zNS5QeUVycl9XYXJuRXhwbGljaXQKLSAgUHlFcnJfV2FybkZvcm1hdD1weXRob24zNS5QeUVycl9XYXJuRm9ybWF0Ci0gIFB5RXJyX1dyaXRlVW5yYWlzYWJsZT1weXRob24zNS5QeUVycl9Xcml0ZVVucmFpc2FibGUKLSAgUHlFdmFsX0FjcXVpcmVMb2NrPXB5dGhvbjM1LlB5RXZhbF9BY3F1aXJlTG9jawotICBQeUV2YWxfQWNxdWlyZVRocmVhZD1weXRob24zNS5QeUV2YWxfQWNxdWlyZVRocmVhZAotICBQeUV2YWxfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM1LlB5RXZhbF9DYWxsRnVuY3Rpb24KLSAgUHlFdmFsX0NhbGxNZXRob2Q9cHl0aG9uMzUuUHlFdmFsX0NhbGxNZXRob2QKLSAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHM9cHl0aG9uMzUuUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMKLSAgUHlFdmFsX0V2YWxDb2RlPXB5dGhvbjM1LlB5RXZhbF9FdmFsQ29kZQotICBQeUV2YWxfRXZhbENvZGVFeD1weXRob24zNS5QeUV2YWxfRXZhbENvZGVFeAotICBQeUV2YWxfRXZhbEZyYW1lPXB5dGhvbjM1LlB5RXZhbF9FdmFsRnJhbWUKLSAgUHlFdmFsX0V2YWxGcmFtZUV4PXB5dGhvbjM1LlB5RXZhbF9FdmFsRnJhbWVFeAotICBQeUV2YWxfR2V0QnVpbHRpbnM9cHl0aG9uMzUuUHlFdmFsX0dldEJ1aWx0aW5zCi0gIFB5RXZhbF9HZXRDYWxsU3RhdHM9cHl0aG9uMzUuUHlFdmFsX0dldENhbGxTdGF0cwotICBQeUV2YWxfR2V0RnJhbWU9cHl0aG9uMzUuUHlFdmFsX0dldEZyYW1lCi0gIFB5RXZhbF9HZXRGdW5jRGVzYz1weXRob24zNS5QeUV2YWxfR2V0RnVuY0Rlc2MKLSAgUHlFdmFsX0dldEZ1bmNOYW1lPXB5dGhvbjM1LlB5RXZhbF9HZXRGdW5jTmFtZQotICBQeUV2YWxfR2V0R2xvYmFscz1weXRob24zNS5QeUV2YWxfR2V0R2xvYmFscwotICBQeUV2YWxfR2V0TG9jYWxzPXB5dGhvbjM1LlB5RXZhbF9HZXRMb2NhbHMKLSAgUHlFdmFsX0luaXRUaHJlYWRzPXB5dGhvbjM1LlB5RXZhbF9Jbml0VGhyZWFkcwotICBQeUV2YWxfUmVJbml0VGhyZWFkcz1weXRob24zNS5QeUV2YWxfUmVJbml0VGhyZWFkcwotICBQeUV2YWxfUmVsZWFzZUxvY2s9cHl0aG9uMzUuUHlFdmFsX1JlbGVhc2VMb2NrCi0gIFB5RXZhbF9SZWxlYXNlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9SZWxlYXNlVGhyZWFkCi0gIFB5RXZhbF9SZXN0b3JlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9SZXN0b3JlVGhyZWFkCi0gIFB5RXZhbF9TYXZlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9TYXZlVGhyZWFkCi0gIFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQ9cHl0aG9uMzUuUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZAotICBQeUV4Y19Bcml0aG1ldGljRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXJpdGhtZXRpY0Vycm9yIERBVEEKLSAgUHlFeGNfQXNzZXJ0aW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXNzZXJ0aW9uRXJyb3IgREFUQQotICBQeUV4Y19BdHRyaWJ1dGVFcnJvcj1weXRob24zNS5QeUV4Y19BdHRyaWJ1dGVFcnJvciBEQVRBCi0gIFB5RXhjX0Jhc2VFeGNlcHRpb249cHl0aG9uMzUuUHlFeGNfQmFzZUV4Y2VwdGlvbiBEQVRBCi0gIFB5RXhjX0J1ZmZlckVycm9yPXB5dGhvbjM1LlB5RXhjX0J1ZmZlckVycm9yIERBVEEKLSAgUHlFeGNfQnl0ZXNXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0J5dGVzV2FybmluZyBEQVRBCi0gIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNS5QeUV4Y19EZXByZWNhdGlvbldhcm5pbmcgREFUQQotICBQeUV4Y19FT0ZFcnJvcj1weXRob24zNS5QeUV4Y19FT0ZFcnJvciBEQVRBCi0gIFB5RXhjX0Vudmlyb25tZW50RXJyb3I9cHl0aG9uMzUuUHlFeGNfRW52aXJvbm1lbnRFcnJvciBEQVRBCi0gIFB5RXhjX0V4Y2VwdGlvbj1weXRob24zNS5QeUV4Y19FeGNlcHRpb24gREFUQQotICBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I9cHl0aG9uMzUuUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIERBVEEKLSAgUHlFeGNfRnV0dXJlV2FybmluZz1weXRob24zNS5QeUV4Y19GdXR1cmVXYXJuaW5nIERBVEEKLSAgUHlFeGNfR2VuZXJhdG9yRXhpdD1weXRob24zNS5QeUV4Y19HZW5lcmF0b3JFeGl0IERBVEEKLSAgUHlFeGNfSU9FcnJvcj1weXRob24zNS5QeUV4Y19JT0Vycm9yIERBVEEKLSAgUHlFeGNfSW1wb3J0RXJyb3I9cHl0aG9uMzUuUHlFeGNfSW1wb3J0RXJyb3IgREFUQQotICBQeUV4Y19JbXBvcnRXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0ltcG9ydFdhcm5pbmcgREFUQQotICBQeUV4Y19JbmRlbnRhdGlvbkVycm9yPXB5dGhvbjM1LlB5RXhjX0luZGVudGF0aW9uRXJyb3IgREFUQQotICBQeUV4Y19JbmRleEVycm9yPXB5dGhvbjM1LlB5RXhjX0luZGV4RXJyb3IgREFUQQotICBQeUV4Y19LZXlFcnJvcj1weXRob24zNS5QeUV4Y19LZXlFcnJvciBEQVRBCi0gIFB5RXhjX0tleWJvYXJkSW50ZXJydXB0PXB5dGhvbjM1LlB5RXhjX0tleWJvYXJkSW50ZXJydXB0IERBVEEKLSAgUHlFeGNfTG9va3VwRXJyb3I9cHl0aG9uMzUuUHlFeGNfTG9va3VwRXJyb3IgREFUQQotICBQeUV4Y19NZW1vcnlFcnJvcj1weXRob24zNS5QeUV4Y19NZW1vcnlFcnJvciBEQVRBCi0gIFB5RXhjX01lbW9yeUVycm9ySW5zdD1weXRob24zNS5QeUV4Y19NZW1vcnlFcnJvckluc3QgREFUQQotICBQeUV4Y19OYW1lRXJyb3I9cHl0aG9uMzUuUHlFeGNfTmFtZUVycm9yIERBVEEKLSAgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcj1weXRob24zNS5QeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yIERBVEEKLSAgUHlFeGNfT1NFcnJvcj1weXRob24zNS5QeUV4Y19PU0Vycm9yIERBVEEKLSAgUHlFeGNfT3ZlcmZsb3dFcnJvcj1weXRob24zNS5QeUV4Y19PdmVyZmxvd0Vycm9yIERBVEEKLSAgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNS5QeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKLSAgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0PXB5dGhvbjM1LlB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdCBEQVRBCi0gIFB5RXhjX1JlZmVyZW5jZUVycm9yPXB5dGhvbjM1LlB5RXhjX1JlZmVyZW5jZUVycm9yIERBVEEKLSAgUHlFeGNfUnVudGltZUVycm9yPXB5dGhvbjM1LlB5RXhjX1J1bnRpbWVFcnJvciBEQVRBCi0gIFB5RXhjX1J1bnRpbWVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1J1bnRpbWVXYXJuaW5nIERBVEEKLSAgUHlFeGNfU3RvcEl0ZXJhdGlvbj1weXRob24zNS5QeUV4Y19TdG9wSXRlcmF0aW9uIERBVEEKLSAgUHlFeGNfU3ludGF4RXJyb3I9cHl0aG9uMzUuUHlFeGNfU3ludGF4RXJyb3IgREFUQQotICBQeUV4Y19TeW50YXhXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1N5bnRheFdhcm5pbmcgREFUQQotICBQeUV4Y19TeXN0ZW1FcnJvcj1weXRob24zNS5QeUV4Y19TeXN0ZW1FcnJvciBEQVRBCi0gIFB5RXhjX1N5c3RlbUV4aXQ9cHl0aG9uMzUuUHlFeGNfU3lzdGVtRXhpdCBEQVRBCi0gIFB5RXhjX1RhYkVycm9yPXB5dGhvbjM1LlB5RXhjX1RhYkVycm9yIERBVEEKLSAgUHlFeGNfVHlwZUVycm9yPXB5dGhvbjM1LlB5RXhjX1R5cGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yPXB5dGhvbjM1LlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZURlY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVXYXJuaW5nIERBVEEKLSAgUHlFeGNfVXNlcldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfVXNlcldhcm5pbmcgREFUQQotICBQeUV4Y19WYWx1ZUVycm9yPXB5dGhvbjM1LlB5RXhjX1ZhbHVlRXJyb3IgREFUQQotICBQeUV4Y19XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1dhcm5pbmcgREFUQQotICBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcj1weXRob24zNS5QeUV4Y19aZXJvRGl2aXNpb25FcnJvciBEQVRBCi0gIFB5RXhjZXB0aW9uX0dldENhdXNlPXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldENhdXNlCi0gIFB5RXhjZXB0aW9uX0dldENvbnRleHQ9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0Q29udGV4dAotICBQeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2s9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrCi0gIFB5RXhjZXB0aW9uX1NldENhdXNlPXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldENhdXNlCi0gIFB5RXhjZXB0aW9uX1NldENvbnRleHQ9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0Q29udGV4dAotICBQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2s9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrCi0gIFB5RmlsZV9Gcm9tRmQ9cHl0aG9uMzUuUHlGaWxlX0Zyb21GZAotICBQeUZpbGVfR2V0TGluZT1weXRob24zNS5QeUZpbGVfR2V0TGluZQotICBQeUZpbGVfV3JpdGVPYmplY3Q9cHl0aG9uMzUuUHlGaWxlX1dyaXRlT2JqZWN0Ci0gIFB5RmlsZV9Xcml0ZVN0cmluZz1weXRob24zNS5QeUZpbGVfV3JpdGVTdHJpbmcKLSAgUHlGaWx0ZXJfVHlwZT1weXRob24zNS5QeUZpbHRlcl9UeXBlIERBVEEKLSAgUHlGbG9hdF9Bc0RvdWJsZT1weXRob24zNS5QeUZsb2F0X0FzRG91YmxlCi0gIFB5RmxvYXRfRnJvbURvdWJsZT1weXRob24zNS5QeUZsb2F0X0Zyb21Eb3VibGUKLSAgUHlGbG9hdF9Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5RmxvYXRfRnJvbVN0cmluZwotICBQeUZsb2F0X0dldEluZm89cHl0aG9uMzUuUHlGbG9hdF9HZXRJbmZvCi0gIFB5RmxvYXRfR2V0TWF4PXB5dGhvbjM1LlB5RmxvYXRfR2V0TWF4Ci0gIFB5RmxvYXRfR2V0TWluPXB5dGhvbjM1LlB5RmxvYXRfR2V0TWluCi0gIFB5RmxvYXRfVHlwZT1weXRob24zNS5QeUZsb2F0X1R5cGUgREFUQQotICBQeUZyb3plblNldF9OZXc9cHl0aG9uMzUuUHlGcm96ZW5TZXRfTmV3Ci0gIFB5RnJvemVuU2V0X1R5cGU9cHl0aG9uMzUuUHlGcm96ZW5TZXRfVHlwZSBEQVRBCi0gIFB5R0NfQ29sbGVjdD1weXRob24zNS5QeUdDX0NvbGxlY3QKLSAgUHlHSUxTdGF0ZV9FbnN1cmU9cHl0aG9uMzUuUHlHSUxTdGF0ZV9FbnN1cmUKLSAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGU9cHl0aG9uMzUuUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUKLSAgUHlHSUxTdGF0ZV9SZWxlYXNlPXB5dGhvbjM1LlB5R0lMU3RhdGVfUmVsZWFzZQotICBQeUdldFNldERlc2NyX1R5cGU9cHl0aG9uMzUuUHlHZXRTZXREZXNjcl9UeXBlIERBVEEKLSAgUHlJbXBvcnRfQWRkTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0FkZE1vZHVsZQotICBQeUltcG9ydF9BcHBlbmRJbml0dGFiPXB5dGhvbjM1LlB5SW1wb3J0X0FwcGVuZEluaXR0YWIKLSAgUHlJbXBvcnRfQ2xlYW51cD1weXRob24zNS5QeUltcG9ydF9DbGVhbnVwCi0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlCi0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXg9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeAotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXM9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzCi0gIFB5SW1wb3J0X0dldEltcG9ydGVyPXB5dGhvbjM1LlB5SW1wb3J0X0dldEltcG9ydGVyCi0gIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyPXB5dGhvbjM1LlB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyCi0gIFB5SW1wb3J0X0dldE1hZ2ljVGFnPXB5dGhvbjM1LlB5SW1wb3J0X0dldE1hZ2ljVGFnCi0gIFB5SW1wb3J0X0dldE1vZHVsZURpY3Q9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TW9kdWxlRGljdAotICBQeUltcG9ydF9JbXBvcnQ9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0Ci0gIFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZT1weXRob24zNS5QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZQotICBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbD1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbAotICBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2sKLSAgUHlJbXBvcnRfUmVsb2FkTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X1JlbG9hZE1vZHVsZQotICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXI9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZQotICBQeUludGVycHJldGVyU3RhdGVfTmV3PXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcKLSAgUHlJdGVyX05leHQ9cHl0aG9uMzUuUHlJdGVyX05leHQKLSAgUHlMaXN0SXRlcl9UeXBlPXB5dGhvbjM1LlB5TGlzdEl0ZXJfVHlwZSBEQVRBCi0gIFB5TGlzdFJldkl0ZXJfVHlwZT1weXRob24zNS5QeUxpc3RSZXZJdGVyX1R5cGUgREFUQQotICBQeUxpc3RfQXBwZW5kPXB5dGhvbjM1LlB5TGlzdF9BcHBlbmQKLSAgUHlMaXN0X0FzVHVwbGU9cHl0aG9uMzUuUHlMaXN0X0FzVHVwbGUKLSAgUHlMaXN0X0dldEl0ZW09cHl0aG9uMzUuUHlMaXN0X0dldEl0ZW0KLSAgUHlMaXN0X0dldFNsaWNlPXB5dGhvbjM1LlB5TGlzdF9HZXRTbGljZQotICBQeUxpc3RfSW5zZXJ0PXB5dGhvbjM1LlB5TGlzdF9JbnNlcnQKLSAgUHlMaXN0X05ldz1weXRob24zNS5QeUxpc3RfTmV3Ci0gIFB5TGlzdF9SZXZlcnNlPXB5dGhvbjM1LlB5TGlzdF9SZXZlcnNlCi0gIFB5TGlzdF9TZXRJdGVtPXB5dGhvbjM1LlB5TGlzdF9TZXRJdGVtCi0gIFB5TGlzdF9TZXRTbGljZT1weXRob24zNS5QeUxpc3RfU2V0U2xpY2UKLSAgUHlMaXN0X1NpemU9cHl0aG9uMzUuUHlMaXN0X1NpemUKLSAgUHlMaXN0X1NvcnQ9cHl0aG9uMzUuUHlMaXN0X1NvcnQKLSAgUHlMaXN0X1R5cGU9cHl0aG9uMzUuUHlMaXN0X1R5cGUgREFUQQotICBQeUxvbmdSYW5nZUl0ZXJfVHlwZT1weXRob24zNS5QeUxvbmdSYW5nZUl0ZXJfVHlwZSBEQVRBCi0gIFB5TG9uZ19Bc0RvdWJsZT1weXRob24zNS5QeUxvbmdfQXNEb3VibGUKLSAgUHlMb25nX0FzTG9uZz1weXRob24zNS5QeUxvbmdfQXNMb25nCi0gIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdz1weXRob24zNS5QeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cKLSAgUHlMb25nX0FzTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0xvbmcKLSAgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdz1weXRob24zNS5QeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93Ci0gIFB5TG9uZ19Bc1NpemVfdD1weXRob24zNS5QeUxvbmdfQXNTaXplX3QKLSAgUHlMb25nX0FzU3NpemVfdD1weXRob24zNS5QeUxvbmdfQXNTc2l6ZV90Ci0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmcKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2s9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTWFzawotICBQeUxvbmdfQXNWb2lkUHRyPXB5dGhvbjM1LlB5TG9uZ19Bc1ZvaWRQdHIKLSAgUHlMb25nX0Zyb21Eb3VibGU9cHl0aG9uMzUuUHlMb25nX0Zyb21Eb3VibGUKLSAgUHlMb25nX0Zyb21Mb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tTG9uZwotICBQeUxvbmdfRnJvbUxvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tTG9uZ0xvbmcKLSAgUHlMb25nX0Zyb21TaXplX3Q9cHl0aG9uMzUuUHlMb25nX0Zyb21TaXplX3QKLSAgUHlMb25nX0Zyb21Tc2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Gcm9tU3NpemVfdAotICBQeUxvbmdfRnJvbVN0cmluZz1weXRob24zNS5QeUxvbmdfRnJvbVN0cmluZwotICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZwotICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCi0gIFB5TG9uZ19Gcm9tVm9pZFB0cj1weXRob24zNS5QeUxvbmdfRnJvbVZvaWRQdHIKLSAgUHlMb25nX0dldEluZm89cHl0aG9uMzUuUHlMb25nX0dldEluZm8KLSAgUHlMb25nX1R5cGU9cHl0aG9uMzUuUHlMb25nX1R5cGUgREFUQQotICBQeU1hcF9UeXBlPXB5dGhvbjM1LlB5TWFwX1R5cGUgREFUQQotICBQeU1hcHBpbmdfQ2hlY2s9cHl0aG9uMzUuUHlNYXBwaW5nX0NoZWNrCi0gIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19HZXRJdGVtU3RyaW5nCi0gIFB5TWFwcGluZ19IYXNLZXk9cHl0aG9uMzUuUHlNYXBwaW5nX0hhc0tleQotICBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19IYXNLZXlTdHJpbmcKLSAgUHlNYXBwaW5nX0l0ZW1zPXB5dGhvbjM1LlB5TWFwcGluZ19JdGVtcwotICBQeU1hcHBpbmdfS2V5cz1weXRob24zNS5QeU1hcHBpbmdfS2V5cwotICBQeU1hcHBpbmdfTGVuZ3RoPXB5dGhvbjM1LlB5TWFwcGluZ19MZW5ndGgKLSAgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcKLSAgUHlNYXBwaW5nX1NpemU9cHl0aG9uMzUuUHlNYXBwaW5nX1NpemUKLSAgUHlNYXBwaW5nX1ZhbHVlcz1weXRob24zNS5QeU1hcHBpbmdfVmFsdWVzCi0gIFB5TWVtX0ZyZWU9cHl0aG9uMzUuUHlNZW1fRnJlZQotICBQeU1lbV9NYWxsb2M9cHl0aG9uMzUuUHlNZW1fTWFsbG9jCi0gIFB5TWVtX1JlYWxsb2M9cHl0aG9uMzUuUHlNZW1fUmVhbGxvYwotICBQeU1lbWJlckRlc2NyX1R5cGU9cHl0aG9uMzUuUHlNZW1iZXJEZXNjcl9UeXBlIERBVEEKLSAgUHlNZW1vcnlWaWV3X0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QKLSAgUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXM9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXMKLSAgUHlNZW1vcnlWaWV3X1R5cGU9cHl0aG9uMzUuUHlNZW1vcnlWaWV3X1R5cGUgREFUQQotICBQeU1ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzUuUHlNZXRob2REZXNjcl9UeXBlIERBVEEKLSAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQ9cHl0aG9uMzUuUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQKLSAgUHlNb2R1bGVfQWRkT2JqZWN0PXB5dGhvbjM1LlB5TW9kdWxlX0FkZE9iamVjdAotICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudD1weXRob24zNS5QeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudAotICBQeU1vZHVsZV9DcmVhdGUyPXB5dGhvbjM1LlB5TW9kdWxlX0NyZWF0ZTIKLSAgUHlNb2R1bGVfR2V0RGVmPXB5dGhvbjM1LlB5TW9kdWxlX0dldERlZgotICBQeU1vZHVsZV9HZXREaWN0PXB5dGhvbjM1LlB5TW9kdWxlX0dldERpY3QKLSAgUHlNb2R1bGVfR2V0RmlsZW5hbWU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RmlsZW5hbWUKLSAgUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3Q9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3QKLSAgUHlNb2R1bGVfR2V0TmFtZT1weXRob24zNS5QeU1vZHVsZV9HZXROYW1lCi0gIFB5TW9kdWxlX0dldFN0YXRlPXB5dGhvbjM1LlB5TW9kdWxlX0dldFN0YXRlCi0gIFB5TW9kdWxlX05ldz1weXRob24zNS5QeU1vZHVsZV9OZXcKLSAgUHlNb2R1bGVfVHlwZT1weXRob24zNS5QeU1vZHVsZV9UeXBlIERBVEEKLSAgUHlNb2R1bGVEZWZfSW5pdD1weXRob24zNS5QeU1vZHVsZURlZl9Jbml0Ci0gIFB5TW9kdWxlRGVmX1R5cGU9cHl0aG9uMzUuUHlNb2R1bGVEZWZfVHlwZSBEQVRBCi0gIFB5TnVsbEltcG9ydGVyX1R5cGU9cHl0aG9uMzUuUHlOdWxsSW1wb3J0ZXJfVHlwZSBEQVRBCi0gIFB5TnVtYmVyX0Fic29sdXRlPXB5dGhvbjM1LlB5TnVtYmVyX0Fic29sdXRlCi0gIFB5TnVtYmVyX0FkZD1weXRob24zNS5QeU51bWJlcl9BZGQKLSAgUHlOdW1iZXJfQW5kPXB5dGhvbjM1LlB5TnVtYmVyX0FuZAotICBQeU51bWJlcl9Bc1NzaXplX3Q9cHl0aG9uMzUuUHlOdW1iZXJfQXNTc2l6ZV90Ci0gIFB5TnVtYmVyX0NoZWNrPXB5dGhvbjM1LlB5TnVtYmVyX0NoZWNrCi0gIFB5TnVtYmVyX0Rpdm1vZD1weXRob24zNS5QeU51bWJlcl9EaXZtb2QKLSAgUHlOdW1iZXJfRmxvYXQ9cHl0aG9uMzUuUHlOdW1iZXJfRmxvYXQKLSAgUHlOdW1iZXJfRmxvb3JEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfRmxvb3JEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZUFkZD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlQWRkCi0gIFB5TnVtYmVyX0luUGxhY2VBbmQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUFuZAotICBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUxzaGlmdAotICBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHk9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5Ci0gIFB5TnVtYmVyX0luUGxhY2VPcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlT3IKLSAgUHlOdW1iZXJfSW5QbGFjZVBvd2VyPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VQb3dlcgotICBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIKLSAgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUnNoaWZ0Ci0gIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlU3VidHJhY3QKLSAgUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZVhvcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlWG9yCi0gIFB5TnVtYmVyX0luZGV4PXB5dGhvbjM1LlB5TnVtYmVyX0luZGV4Ci0gIFB5TnVtYmVyX0ludmVydD1weXRob24zNS5QeU51bWJlcl9JbnZlcnQKLSAgUHlOdW1iZXJfTG9uZz1weXRob24zNS5QeU51bWJlcl9Mb25nCi0gIFB5TnVtYmVyX0xzaGlmdD1weXRob24zNS5QeU51bWJlcl9Mc2hpZnQKLSAgUHlOdW1iZXJfTXVsdGlwbHk9cHl0aG9uMzUuUHlOdW1iZXJfTXVsdGlwbHkKLSAgUHlOdW1iZXJfTmVnYXRpdmU9cHl0aG9uMzUuUHlOdW1iZXJfTmVnYXRpdmUKLSAgUHlOdW1iZXJfT3I9cHl0aG9uMzUuUHlOdW1iZXJfT3IKLSAgUHlOdW1iZXJfUG9zaXRpdmU9cHl0aG9uMzUuUHlOdW1iZXJfUG9zaXRpdmUKLSAgUHlOdW1iZXJfUG93ZXI9cHl0aG9uMzUuUHlOdW1iZXJfUG93ZXIKLSAgUHlOdW1iZXJfUmVtYWluZGVyPXB5dGhvbjM1LlB5TnVtYmVyX1JlbWFpbmRlcgotICBQeU51bWJlcl9Sc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfUnNoaWZ0Ci0gIFB5TnVtYmVyX1N1YnRyYWN0PXB5dGhvbjM1LlB5TnVtYmVyX1N1YnRyYWN0Ci0gIFB5TnVtYmVyX1RvQmFzZT1weXRob24zNS5QeU51bWJlcl9Ub0Jhc2UKLSAgUHlOdW1iZXJfVHJ1ZURpdmlkZT1weXRob24zNS5QeU51bWJlcl9UcnVlRGl2aWRlCi0gIFB5TnVtYmVyX1hvcj1weXRob24zNS5QeU51bWJlcl9Yb3IKLSAgUHlPU19BZnRlckZvcms9cHl0aG9uMzUuUHlPU19BZnRlckZvcmsKLSAgUHlPU19Jbml0SW50ZXJydXB0cz1weXRob24zNS5QeU9TX0luaXRJbnRlcnJ1cHRzCi0gIFB5T1NfSW5wdXRIb29rPXB5dGhvbjM1LlB5T1NfSW5wdXRIb29rIERBVEEKLSAgUHlPU19JbnRlcnJ1cHRPY2N1cnJlZD1weXRob24zNS5QeU9TX0ludGVycnVwdE9jY3VycmVkCi0gIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXI9cHl0aG9uMzUuUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciBEQVRBCi0gIFB5T1NfZG91YmxlX3RvX3N0cmluZz1weXRob24zNS5QeU9TX2RvdWJsZV90b19zdHJpbmcKLSAgUHlPU19nZXRzaWc9cHl0aG9uMzUuUHlPU19nZXRzaWcKLSAgUHlPU19teXN0cmljbXA9cHl0aG9uMzUuUHlPU19teXN0cmljbXAKLSAgUHlPU19teXN0cm5pY21wPXB5dGhvbjM1LlB5T1NfbXlzdHJuaWNtcAotICBQeU9TX3NldHNpZz1weXRob24zNS5QeU9TX3NldHNpZwotICBQeU9TX3NucHJpbnRmPXB5dGhvbjM1LlB5T1Nfc25wcmludGYKLSAgUHlPU19zdHJpbmdfdG9fZG91YmxlPXB5dGhvbjM1LlB5T1Nfc3RyaW5nX3RvX2RvdWJsZQotICBQeU9TX3N0cnRvbD1weXRob24zNS5QeU9TX3N0cnRvbAotICBQeU9TX3N0cnRvdWw9cHl0aG9uMzUuUHlPU19zdHJ0b3VsCi0gIFB5T1NfdnNucHJpbnRmPXB5dGhvbjM1LlB5T1NfdnNucHJpbnRmCi0gIFB5T2JqZWN0X0FTQ0lJPXB5dGhvbjM1LlB5T2JqZWN0X0FTQ0lJCi0gIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc0NoYXJCdWZmZXIKLSAgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcj1weXRob24zNS5QeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yCi0gIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc1JlYWRCdWZmZXIKLSAgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9Bc1dyaXRlQnVmZmVyCi0gIFB5T2JqZWN0X0J5dGVzPXB5dGhvbjM1LlB5T2JqZWN0X0J5dGVzCi0gIFB5T2JqZWN0X0NhbGw9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbAotICBQeU9iamVjdF9DYWxsRnVuY3Rpb249cHl0aG9uMzUuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uCi0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncwotICBQeU9iamVjdF9DYWxsTWV0aG9kPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxNZXRob2QKLSAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MKLSAgUHlPYmplY3RfQ2FsbE9iamVjdD1weXRob24zNS5QeU9iamVjdF9DYWxsT2JqZWN0Ci0gIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcj1weXRob24zNS5QeU9iamVjdF9DaGVja1JlYWRCdWZmZXIKLSAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcz1weXRob24zNS5QeU9iamVjdF9DbGVhcldlYWtSZWZzCi0gIFB5T2JqZWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfRGVsSXRlbQotICBQeU9iamVjdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcKLSAgUHlPYmplY3RfRGlyPXB5dGhvbjM1LlB5T2JqZWN0X0RpcgotICBQeU9iamVjdF9Gb3JtYXQ9cHl0aG9uMzUuUHlPYmplY3RfRm9ybWF0Ci0gIFB5T2JqZWN0X0ZyZWU9cHl0aG9uMzUuUHlPYmplY3RfRnJlZQotICBQeU9iamVjdF9HQ19EZWw9cHl0aG9uMzUuUHlPYmplY3RfR0NfRGVsCi0gIFB5T2JqZWN0X0dDX1RyYWNrPXB5dGhvbjM1LlB5T2JqZWN0X0dDX1RyYWNrCi0gIFB5T2JqZWN0X0dDX1VuVHJhY2s9cHl0aG9uMzUuUHlPYmplY3RfR0NfVW5UcmFjawotICBQeU9iamVjdF9HZW5lcmljR2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZW5lcmljR2V0QXR0cgotICBQeU9iamVjdF9HZW5lcmljU2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZW5lcmljU2V0QXR0cgotICBQeU9iamVjdF9HZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dldEF0dHIKLSAgUHlPYmplY3RfR2V0QXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9HZXRBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X0dldEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfR2V0SXRlbQotICBQeU9iamVjdF9HZXRJdGVyPXB5dGhvbjM1LlB5T2JqZWN0X0dldEl0ZXIKLSAgUHlPYmplY3RfSGFzQXR0cj1weXRob24zNS5QeU9iamVjdF9IYXNBdHRyCi0gIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfSGFzQXR0clN0cmluZwotICBQeU9iamVjdF9IYXNoPXB5dGhvbjM1LlB5T2JqZWN0X0hhc2gKLSAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkPXB5dGhvbjM1LlB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZAotICBQeU9iamVjdF9Jbml0PXB5dGhvbjM1LlB5T2JqZWN0X0luaXQKLSAgUHlPYmplY3RfSW5pdFZhcj1weXRob24zNS5QeU9iamVjdF9Jbml0VmFyCi0gIFB5T2JqZWN0X0lzSW5zdGFuY2U9cHl0aG9uMzUuUHlPYmplY3RfSXNJbnN0YW5jZQotICBQeU9iamVjdF9Jc1N1YmNsYXNzPXB5dGhvbjM1LlB5T2JqZWN0X0lzU3ViY2xhc3MKLSAgUHlPYmplY3RfSXNUcnVlPXB5dGhvbjM1LlB5T2JqZWN0X0lzVHJ1ZQotICBQeU9iamVjdF9MZW5ndGg9cHl0aG9uMzUuUHlPYmplY3RfTGVuZ3RoCi0gIFB5T2JqZWN0X01hbGxvYz1weXRob24zNS5QeU9iamVjdF9NYWxsb2MKLSAgUHlPYmplY3RfTm90PXB5dGhvbjM1LlB5T2JqZWN0X05vdAotICBQeU9iamVjdF9SZWFsbG9jPXB5dGhvbjM1LlB5T2JqZWN0X1JlYWxsb2MKLSAgUHlPYmplY3RfUmVwcj1weXRob24zNS5QeU9iamVjdF9SZXByCi0gIFB5T2JqZWN0X1JpY2hDb21wYXJlPXB5dGhvbjM1LlB5T2JqZWN0X1JpY2hDb21wYXJlCi0gIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbD1weXRob24zNS5QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wKLSAgUHlPYmplY3RfU2VsZkl0ZXI9cHl0aG9uMzUuUHlPYmplY3RfU2VsZkl0ZXIKLSAgUHlPYmplY3RfU2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9TZXRBdHRyCi0gIFB5T2JqZWN0X1NldEF0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfU2V0QXR0clN0cmluZwotICBQeU9iamVjdF9TZXRJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X1NldEl0ZW0KLSAgUHlPYmplY3RfU2l6ZT1weXRob24zNS5QeU9iamVjdF9TaXplCi0gIFB5T2JqZWN0X1N0cj1weXRob24zNS5QeU9iamVjdF9TdHIKLSAgUHlPYmplY3RfVHlwZT1weXRob24zNS5QeU9iamVjdF9UeXBlIERBVEEKLSAgUHlPRGljdF9EZWxJdGVtPXB5dGhvbjM1LlB5T0RpY3RfRGVsSXRlbQotICBQeU9EaWN0X05ldz1weXRob24zNS5QeU9EaWN0X05ldwotICBQeU9EaWN0X1NldEl0ZW09cHl0aG9uMzUuUHlPRGljdF9TZXRJdGVtCi0gIFB5T0RpY3RfVHlwZT1weXRob24zNS5QeU9EaWN0X1R5cGUgREFUQQotICBQeU9EaWN0SXRlbXNfVHlwZT1weXRob24zNS5QeU9EaWN0SXRlbXNfVHlwZSBEQVRBCi0gIFB5T0RpY3RJdGVyX1R5cGU9cHl0aG9uMzUuUHlPRGljdEl0ZXJfVHlwZSBEQVRBCi0gIFB5T0RpY3RLZXlzX1R5cGU9cHl0aG9uMzUuUHlPRGljdEtleXNfVHlwZSBEQVRBCi0gIFB5T0RpY3RWYWx1ZXNfVHlwZT1weXRob24zNS5QeU9EaWN0VmFsdWVzX1R5cGUgREFUQQotICBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncz1weXRob24zNS5QeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncwotICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzPXB5dGhvbjM1LlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MKLSAgUHlQcm9wZXJ0eV9UeXBlPXB5dGhvbjM1LlB5UHJvcGVydHlfVHlwZSBEQVRBCi0gIFB5UmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzUuUHlSYW5nZUl0ZXJfVHlwZSBEQVRBCi0gIFB5UmFuZ2VfVHlwZT1weXRob24zNS5QeVJhbmdlX1R5cGUgREFUQQotICBQeVJldmVyc2VkX1R5cGU9cHl0aG9uMzUuUHlSZXZlcnNlZF9UeXBlIERBVEEKLSAgUHlTZXFJdGVyX05ldz1weXRob24zNS5QeVNlcUl0ZXJfTmV3Ci0gIFB5U2VxSXRlcl9UeXBlPXB5dGhvbjM1LlB5U2VxSXRlcl9UeXBlIERBVEEKLSAgUHlTZXF1ZW5jZV9DaGVjaz1weXRob24zNS5QeVNlcXVlbmNlX0NoZWNrCi0gIFB5U2VxdWVuY2VfQ29uY2F0PXB5dGhvbjM1LlB5U2VxdWVuY2VfQ29uY2F0Ci0gIFB5U2VxdWVuY2VfQ29udGFpbnM9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db250YWlucwotICBQeVNlcXVlbmNlX0NvdW50PXB5dGhvbjM1LlB5U2VxdWVuY2VfQ291bnQKLSAgUHlTZXF1ZW5jZV9EZWxJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfRGVsSXRlbQotICBQeVNlcXVlbmNlX0RlbFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfRGVsU2xpY2UKLSAgUHlTZXF1ZW5jZV9GYXN0PXB5dGhvbjM1LlB5U2VxdWVuY2VfRmFzdAotICBQeVNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9HZXRJdGVtCi0gIFB5U2VxdWVuY2VfR2V0U2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9HZXRTbGljZQotICBQeVNlcXVlbmNlX0luPXB5dGhvbjM1LlB5U2VxdWVuY2VfSW4KLSAgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdAotICBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0Ci0gIFB5U2VxdWVuY2VfSW5kZXg9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JbmRleAotICBQeVNlcXVlbmNlX0xlbmd0aD1weXRob24zNS5QeVNlcXVlbmNlX0xlbmd0aAotICBQeVNlcXVlbmNlX0xpc3Q9cHl0aG9uMzUuUHlTZXF1ZW5jZV9MaXN0Ci0gIFB5U2VxdWVuY2VfUmVwZWF0PXB5dGhvbjM1LlB5U2VxdWVuY2VfUmVwZWF0Ci0gIFB5U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNS5QeVNlcXVlbmNlX1NldEl0ZW0KLSAgUHlTZXF1ZW5jZV9TZXRTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX1NldFNsaWNlCi0gIFB5U2VxdWVuY2VfU2l6ZT1weXRob24zNS5QeVNlcXVlbmNlX1NpemUKLSAgUHlTZXF1ZW5jZV9UdXBsZT1weXRob24zNS5QeVNlcXVlbmNlX1R1cGxlCi0gIFB5U2V0SXRlcl9UeXBlPXB5dGhvbjM1LlB5U2V0SXRlcl9UeXBlIERBVEEKLSAgUHlTZXRfQWRkPXB5dGhvbjM1LlB5U2V0X0FkZAotICBQeVNldF9DbGVhcj1weXRob24zNS5QeVNldF9DbGVhcgotICBQeVNldF9Db250YWlucz1weXRob24zNS5QeVNldF9Db250YWlucwotICBQeVNldF9EaXNjYXJkPXB5dGhvbjM1LlB5U2V0X0Rpc2NhcmQKLSAgUHlTZXRfTmV3PXB5dGhvbjM1LlB5U2V0X05ldwotICBQeVNldF9Qb3A9cHl0aG9uMzUuUHlTZXRfUG9wCi0gIFB5U2V0X1NpemU9cHl0aG9uMzUuUHlTZXRfU2l6ZQotICBQeVNldF9UeXBlPXB5dGhvbjM1LlB5U2V0X1R5cGUgREFUQQotICBQeVNsaWNlX0dldEluZGljZXM9cHl0aG9uMzUuUHlTbGljZV9HZXRJbmRpY2VzCi0gIFB5U2xpY2VfR2V0SW5kaWNlc0V4PXB5dGhvbjM1LlB5U2xpY2VfR2V0SW5kaWNlc0V4Ci0gIFB5U2xpY2VfTmV3PXB5dGhvbjM1LlB5U2xpY2VfTmV3Ci0gIFB5U2xpY2VfVHlwZT1weXRob24zNS5QeVNsaWNlX1R5cGUgREFUQQotICBQeVNvcnRXcmFwcGVyX1R5cGU9cHl0aG9uMzUuUHlTb3J0V3JhcHBlcl9UeXBlIERBVEEKLSAgUHlTdGF0ZV9GaW5kTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfRmluZE1vZHVsZQotICBQeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNS5QeVN0YXRlX0FkZE1vZHVsZQotICBQeVN0YXRlX1JlbW92ZU1vZHVsZT1weXRob24zNS5QeVN0YXRlX1JlbW92ZU1vZHVsZQotICBQeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtCi0gIFB5U3RydWN0U2VxdWVuY2VfTmV3PXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfTmV3Ci0gIFB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX05ld1R5cGUKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbQotICBQeVN1cGVyX1R5cGU9cHl0aG9uMzUuUHlTdXBlcl9UeXBlIERBVEEKLSAgUHlTeXNfQWRkV2Fybk9wdGlvbj1weXRob24zNS5QeVN5c19BZGRXYXJuT3B0aW9uCi0gIFB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlPXB5dGhvbjM1LlB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlCi0gIFB5U3lzX0Zvcm1hdFN0ZGVycj1weXRob24zNS5QeVN5c19Gb3JtYXRTdGRlcnIKLSAgUHlTeXNfRm9ybWF0U3Rkb3V0PXB5dGhvbjM1LlB5U3lzX0Zvcm1hdFN0ZG91dAotICBQeVN5c19HZXRPYmplY3Q9cHl0aG9uMzUuUHlTeXNfR2V0T2JqZWN0Ci0gIFB5U3lzX0hhc1dhcm5PcHRpb25zPXB5dGhvbjM1LlB5U3lzX0hhc1dhcm5PcHRpb25zCi0gIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnM9cHl0aG9uMzUuUHlTeXNfUmVzZXRXYXJuT3B0aW9ucwotICBQeVN5c19TZXRBcmd2PXB5dGhvbjM1LlB5U3lzX1NldEFyZ3YKLSAgUHlTeXNfU2V0QXJndkV4PXB5dGhvbjM1LlB5U3lzX1NldEFyZ3ZFeAotICBQeVN5c19TZXRPYmplY3Q9cHl0aG9uMzUuUHlTeXNfU2V0T2JqZWN0Ci0gIFB5U3lzX1NldFBhdGg9cHl0aG9uMzUuUHlTeXNfU2V0UGF0aAotICBQeVN5c19Xcml0ZVN0ZGVycj1weXRob24zNS5QeVN5c19Xcml0ZVN0ZGVycgotICBQeVN5c19Xcml0ZVN0ZG91dD1weXRob24zNS5QeVN5c19Xcml0ZVN0ZG91dAotICBQeVRocmVhZFN0YXRlX0NsZWFyPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfQ2xlYXIKLSAgUHlUaHJlYWRTdGF0ZV9EZWxldGU9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9EZWxldGUKLSAgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudAotICBQeVRocmVhZFN0YXRlX0dldD1weXRob24zNS5QeVRocmVhZFN0YXRlX0dldAotICBQeVRocmVhZFN0YXRlX0dldERpY3Q9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9HZXREaWN0Ci0gIFB5VGhyZWFkU3RhdGVfTmV3PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfTmV3Ci0gIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGM9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YwotICBQeVRocmVhZFN0YXRlX1N3YXA9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9Td2FwCi0gIFB5VHJhY2VCYWNrX0hlcmU9cHl0aG9uMzUuUHlUcmFjZUJhY2tfSGVyZQotICBQeVRyYWNlQmFja19QcmludD1weXRob24zNS5QeVRyYWNlQmFja19QcmludAotICBQeVRyYWNlQmFja19UeXBlPXB5dGhvbjM1LlB5VHJhY2VCYWNrX1R5cGUgREFUQQotICBQeVR1cGxlSXRlcl9UeXBlPXB5dGhvbjM1LlB5VHVwbGVJdGVyX1R5cGUgREFUQQotICBQeVR1cGxlX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzUuUHlUdXBsZV9DbGVhckZyZWVMaXN0Ci0gIFB5VHVwbGVfR2V0SXRlbT1weXRob24zNS5QeVR1cGxlX0dldEl0ZW0KLSAgUHlUdXBsZV9HZXRTbGljZT1weXRob24zNS5QeVR1cGxlX0dldFNsaWNlCi0gIFB5VHVwbGVfTmV3PXB5dGhvbjM1LlB5VHVwbGVfTmV3Ci0gIFB5VHVwbGVfUGFjaz1weXRob24zNS5QeVR1cGxlX1BhY2sKLSAgUHlUdXBsZV9TZXRJdGVtPXB5dGhvbjM1LlB5VHVwbGVfU2V0SXRlbQotICBQeVR1cGxlX1NpemU9cHl0aG9uMzUuUHlUdXBsZV9TaXplCi0gIFB5VHVwbGVfVHlwZT1weXRob24zNS5QeVR1cGxlX1R5cGUgREFUQQotICBQeVR5cGVfQ2xlYXJDYWNoZT1weXRob24zNS5QeVR5cGVfQ2xlYXJDYWNoZQotICBQeVR5cGVfRnJvbVNwZWM9cHl0aG9uMzUuUHlUeXBlX0Zyb21TcGVjCi0gIFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcz1weXRob24zNS5QeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMKLSAgUHlUeXBlX0dlbmVyaWNBbGxvYz1weXRob24zNS5QeVR5cGVfR2VuZXJpY0FsbG9jCi0gIFB5VHlwZV9HZW5lcmljTmV3PXB5dGhvbjM1LlB5VHlwZV9HZW5lcmljTmV3Ci0gIFB5VHlwZV9HZXRGbGFncz1weXRob24zNS5QeVR5cGVfR2V0RmxhZ3MKLSAgUHlUeXBlX0dldFNsb3Q9cHl0aG9uMzUuUHlUeXBlX0dldFNsb3QKLSAgUHlUeXBlX0lzU3VidHlwZT1weXRob24zNS5QeVR5cGVfSXNTdWJ0eXBlCi0gIFB5VHlwZV9Nb2RpZmllZD1weXRob24zNS5QeVR5cGVfTW9kaWZpZWQKLSAgUHlUeXBlX1JlYWR5PXB5dGhvbjM1LlB5VHlwZV9SZWFkeQotICBQeVR5cGVfVHlwZT1weXRob24zNS5QeVR5cGVfVHlwZSBEQVRBCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZT1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2RpbmcKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVJdGVyX1R5cGU9cHl0aG9uMzUuUHlVbmljb2RlSXRlcl9UeXBlIERBVEEKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZV9BcHBlbmQ9cHl0aG9uMzUuUHlVbmljb2RlX0FwcGVuZAotICBQeVVuaWNvZGVfQXBwZW5kQW5kRGVsPXB5dGhvbjM1LlB5VW5pY29kZV9BcHBlbmRBbmREZWwKLSAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcKLSAgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdAotICBQeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZT1weXRob24zNS5QeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZQotICBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlCi0gIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcKLSAgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjE2U3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjMyU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VURjhTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGOFN0cmluZwotICBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKLSAgUHlVbmljb2RlX0FzV2lkZUNoYXI9cHl0aG9uMzUuUHlVbmljb2RlX0FzV2lkZUNoYXIKLSAgUHlVbmljb2RlX0NsZWFyRnJlZWxpc3Q9cHl0aG9uMzUuUHlVbmljb2RlX0NsZWFyRnJlZWxpc3QKLSAgUHlVbmljb2RlX0NvbXBhcmU9cHl0aG9uMzUuUHlVbmljb2RlX0NvbXBhcmUKLSAgUHlVbmljb2RlX0NvbmNhdD1weXRob24zNS5QeVVuaWNvZGVfQ29uY2F0Ci0gIFB5VW5pY29kZV9Db250YWlucz1weXRob24zNS5QeVVuaWNvZGVfQ29udGFpbnMKLSAgUHlVbmljb2RlX0NvdW50PXB5dGhvbjM1LlB5VW5pY29kZV9Db3VudAotICBQeVVuaWNvZGVfRGVjb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGUKLSAgUHlVbmljb2RlX0RlY29kZUFTQ0lJPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVBU0NJSQotICBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcAotICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQKLSAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUKLSAgUHlVbmljb2RlX0RlY29kZUxhdGluMT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlTGF0aW4xCi0gIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYxNj1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMTYKLSAgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVURjMyPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYzMgotICBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVVRGOD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGOAotICBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUKLSAgUHlVbmljb2RlX0ZTQ29udmVydGVyPXB5dGhvbjM1LlB5VW5pY29kZV9GU0NvbnZlcnRlcgotICBQeVVuaWNvZGVfRlNEZWNvZGVyPXB5dGhvbjM1LlB5VW5pY29kZV9GU0RlY29kZXIKLSAgUHlVbmljb2RlX0ZpbmQ9cHl0aG9uMzUuUHlVbmljb2RlX0ZpbmQKLSAgUHlVbmljb2RlX0Zvcm1hdD1weXRob24zNS5QeVVuaWNvZGVfRm9ybWF0Ci0gIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0Zyb21Gb3JtYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21Gb3JtYXQKLSAgUHlVbmljb2RlX0Zyb21Gb3JtYXRWPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRm9ybWF0VgotICBQeVVuaWNvZGVfRnJvbU9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbU9iamVjdAotICBQeVVuaWNvZGVfRnJvbU9yZGluYWw9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21PcmRpbmFsCi0gIFB5VW5pY29kZV9Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tU3RyaW5nCi0gIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKLSAgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcj1weXRob24zNS5QeVVuaWNvZGVfRnJvbVdpZGVDaGFyCi0gIFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZwotICBQeVVuaWNvZGVfR2V0U2l6ZT1weXRob24zNS5QeVVuaWNvZGVfR2V0U2l6ZQotICBQeVVuaWNvZGVfSXNJZGVudGlmaWVyPXB5dGhvbjM1LlB5VW5pY29kZV9Jc0lkZW50aWZpZXIKLSAgUHlVbmljb2RlX0pvaW49cHl0aG9uMzUuUHlVbmljb2RlX0pvaW4KLSAgUHlVbmljb2RlX1BhcnRpdGlvbj1weXRob24zNS5QeVVuaWNvZGVfUGFydGl0aW9uCi0gIFB5VW5pY29kZV9SUGFydGl0aW9uPXB5dGhvbjM1LlB5VW5pY29kZV9SUGFydGl0aW9uCi0gIFB5VW5pY29kZV9SU3BsaXQ9cHl0aG9uMzUuUHlVbmljb2RlX1JTcGxpdAotICBQeVVuaWNvZGVfUmVwbGFjZT1weXRob24zNS5QeVVuaWNvZGVfUmVwbGFjZQotICBQeVVuaWNvZGVfUmVzaXplPXB5dGhvbjM1LlB5VW5pY29kZV9SZXNpemUKLSAgUHlVbmljb2RlX1JpY2hDb21wYXJlPXB5dGhvbjM1LlB5VW5pY29kZV9SaWNoQ29tcGFyZQotICBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcKLSAgUHlVbmljb2RlX1NwbGl0PXB5dGhvbjM1LlB5VW5pY29kZV9TcGxpdAotICBQeVVuaWNvZGVfU3BsaXRsaW5lcz1weXRob24zNS5QeVVuaWNvZGVfU3BsaXRsaW5lcwotICBQeVVuaWNvZGVfVGFpbG1hdGNoPXB5dGhvbjM1LlB5VW5pY29kZV9UYWlsbWF0Y2gKLSAgUHlVbmljb2RlX1RyYW5zbGF0ZT1weXRob24zNS5QeVVuaWNvZGVfVHJhbnNsYXRlCi0gIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwPXB5dGhvbjM1LlB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwCi0gIFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nCi0gIFB5VW5pY29kZV9EZWNvZGVVVEY3PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY3Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0PXB5dGhvbjM1LlB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQKLSAgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcKLSAgUHlVbmljb2RlX0ludGVybkltbW9ydGFsPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbAotICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZT1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuSW5QbGFjZQotICBQeVVuaWNvZGVfVHlwZT1weXRob24zNS5QeVVuaWNvZGVfVHlwZSBEQVRBCi0gIFB5V2Vha3JlZl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlXZWFrcmVmX0dldE9iamVjdCBEQVRBCi0gIFB5V2Vha3JlZl9OZXdQcm94eT1weXRob24zNS5QeVdlYWtyZWZfTmV3UHJveHkKLSAgUHlXZWFrcmVmX05ld1JlZj1weXRob24zNS5QeVdlYWtyZWZfTmV3UmVmCi0gIFB5V3JhcHBlckRlc2NyX1R5cGU9cHl0aG9uMzUuUHlXcmFwcGVyRGVzY3JfVHlwZSBEQVRBCi0gIFB5V3JhcHBlcl9OZXc9cHl0aG9uMzUuUHlXcmFwcGVyX05ldwotICBQeVppcF9UeXBlPXB5dGhvbjM1LlB5WmlwX1R5cGUgREFUQQotICBQeV9BZGRQZW5kaW5nQ2FsbD1weXRob24zNS5QeV9BZGRQZW5kaW5nQ2FsbAotICBQeV9BdEV4aXQ9cHl0aG9uMzUuUHlfQXRFeGl0Ci0gIFB5X0J1aWxkVmFsdWU9cHl0aG9uMzUuUHlfQnVpbGRWYWx1ZQotICBQeV9Db21waWxlU3RyaW5nPXB5dGhvbjM1LlB5X0NvbXBpbGVTdHJpbmcKLSAgUHlfRGVjUmVmPXB5dGhvbjM1LlB5X0RlY1JlZgotICBQeV9FbmRJbnRlcnByZXRlcj1weXRob24zNS5QeV9FbmRJbnRlcnByZXRlcgotICBQeV9FeGl0PXB5dGhvbjM1LlB5X0V4aXQKLSAgUHlfRmF0YWxFcnJvcj1weXRob24zNS5QeV9GYXRhbEVycm9yCi0gIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCi0gIFB5X0ZpbmFsaXplPXB5dGhvbjM1LlB5X0ZpbmFsaXplCi0gIFB5X0dldEJ1aWxkSW5mbz1weXRob24zNS5QeV9HZXRCdWlsZEluZm8KLSAgUHlfR2V0Q29tcGlsZXI9cHl0aG9uMzUuUHlfR2V0Q29tcGlsZXIKLSAgUHlfR2V0Q29weXJpZ2h0PXB5dGhvbjM1LlB5X0dldENvcHlyaWdodAotICBQeV9HZXRFeGVjUHJlZml4PXB5dGhvbjM1LlB5X0dldEV4ZWNQcmVmaXgKLSAgUHlfR2V0UGF0aD1weXRob24zNS5QeV9HZXRQYXRoCi0gIFB5X0dldFBsYXRmb3JtPXB5dGhvbjM1LlB5X0dldFBsYXRmb3JtCi0gIFB5X0dldFByZWZpeD1weXRob24zNS5QeV9HZXRQcmVmaXgKLSAgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoPXB5dGhvbjM1LlB5X0dldFByb2dyYW1GdWxsUGF0aAotICBQeV9HZXRQcm9ncmFtTmFtZT1weXRob24zNS5QeV9HZXRQcm9ncmFtTmFtZQotICBQeV9HZXRQeXRob25Ib21lPXB5dGhvbjM1LlB5X0dldFB5dGhvbkhvbWUKLSAgUHlfR2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuUHlfR2V0UmVjdXJzaW9uTGltaXQKLSAgUHlfR2V0VmVyc2lvbj1weXRob24zNS5QeV9HZXRWZXJzaW9uCi0gIFB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCi0gIFB5X0luY1JlZj1weXRob24zNS5QeV9JbmNSZWYKLSAgUHlfSW5pdGlhbGl6ZT1weXRob24zNS5QeV9Jbml0aWFsaXplCi0gIFB5X0luaXRpYWxpemVFeD1weXRob24zNS5QeV9Jbml0aWFsaXplRXgKLSAgUHlfSXNJbml0aWFsaXplZD1weXRob24zNS5QeV9Jc0luaXRpYWxpemVkCi0gIFB5X01haW49cHl0aG9uMzUuUHlfTWFpbgotICBQeV9NYWtlUGVuZGluZ0NhbGxzPXB5dGhvbjM1LlB5X01ha2VQZW5kaW5nQ2FsbHMKLSAgUHlfTmV3SW50ZXJwcmV0ZXI9cHl0aG9uMzUuUHlfTmV3SW50ZXJwcmV0ZXIKLSAgUHlfUmVwckVudGVyPXB5dGhvbjM1LlB5X1JlcHJFbnRlcgotICBQeV9SZXByTGVhdmU9cHl0aG9uMzUuUHlfUmVwckxlYXZlCi0gIFB5X1NldFByb2dyYW1OYW1lPXB5dGhvbjM1LlB5X1NldFByb2dyYW1OYW1lCi0gIFB5X1NldFB5dGhvbkhvbWU9cHl0aG9uMzUuUHlfU2V0UHl0aG9uSG9tZQotICBQeV9TZXRSZWN1cnNpb25MaW1pdD1weXRob24zNS5QeV9TZXRSZWN1cnNpb25MaW1pdAotICBQeV9TeW10YWJsZVN0cmluZz1weXRob24zNS5QeV9TeW10YWJsZVN0cmluZwotICBQeV9WYUJ1aWxkVmFsdWU9cHl0aG9uMzUuUHlfVmFCdWlsZFZhbHVlCi0gIF9QeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzUuX1B5RXJyX0JhZEludGVybmFsQ2FsbAotICBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUPXB5dGhvbjM1Ll9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKLSAgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQ9cHl0aG9uMzUuX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQKLSAgX1B5T2JqZWN0X0dDX01hbGxvYz1weXRob24zNS5fUHlPYmplY3RfR0NfTWFsbG9jCi0gIF9QeU9iamVjdF9HQ19OZXc9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX05ldwotICBfUHlPYmplY3RfR0NfTmV3VmFyPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19OZXdWYXIKLSAgX1B5T2JqZWN0X0dDX1Jlc2l6ZT1weXRob24zNS5fUHlPYmplY3RfR0NfUmVzaXplCi0gIF9QeU9iamVjdF9OZXc9cHl0aG9uMzUuX1B5T2JqZWN0X05ldwotICBfUHlPYmplY3RfTmV3VmFyPXB5dGhvbjM1Ll9QeU9iamVjdF9OZXdWYXIKLSAgX1B5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM1Ll9QeVN0YXRlX0FkZE1vZHVsZQotICBfUHlUaHJlYWRTdGF0ZV9Jbml0PXB5dGhvbjM1Ll9QeVRocmVhZFN0YXRlX0luaXQKLSAgX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2M9cHl0aG9uMzUuX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MKLSAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyPXB5dGhvbjM1Ll9QeVRyYXNoX2RlbGV0ZV9sYXRlciBEQVRBCi0gIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nPXB5dGhvbjM1Ll9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIERBVEEKLSAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3Q9cHl0aG9uMzUuX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QKLSAgX1B5VHJhc2hfZGVzdHJveV9jaGFpbj1weXRob24zNS5fUHlUcmFzaF9kZXN0cm95X2NoYWluCi0gIF9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSBEQVRBCi0gIF9QeVdlYWtyZWZfUHJveHlUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfUHJveHlUeXBlIERBVEEKLSAgX1B5V2Vha3JlZl9SZWZUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfUmVmVHlwZSBEQVRBCi0gIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9CdWlsZFZhbHVlX1NpemVUCi0gIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1Ll9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0IERBVEEKLSAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbD1weXRob24zNS5fUHlfQ2hlY2tSZWN1cnNpdmVDYWxsCi0gIF9QeV9EZWFsbG9jPXB5dGhvbjM1Ll9QeV9EZWFsbG9jCi0gIF9QeV9FbGxpcHNpc09iamVjdD1weXRob24zNS5fUHlfRWxsaXBzaXNPYmplY3QgREFUQQotICBfUHlfRmFsc2VTdHJ1Y3Q9cHl0aG9uMzUuX1B5X0ZhbHNlU3RydWN0IERBVEEKLSAgX1B5X05vbmVTdHJ1Y3Q9cHl0aG9uMzUuX1B5X05vbmVTdHJ1Y3QgREFUQQotICBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3Q9cHl0aG9uMzUuX1B5X05vdEltcGxlbWVudGVkU3RydWN0IERBVEEKLSAgX1B5X1N3YXBwZWRPcD1weXRob24zNS5fUHlfU3dhcHBlZE9wIERBVEEKLSAgX1B5X1RydWVTdHJ1Y3Q9cHl0aG9uMzUuX1B5X1RydWVTdHJ1Y3QgREFUQQotICBfUHlfVmFCdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZV9TaXplVAotICBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VUdXBsZV9TaXplVAotICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKLSAgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1ZhUGFyc2VfU2l6ZVQKLSAgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAotICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfQnVpbGRWYWx1ZV9TaXplVAorICBQeUFyZ19QYXJzZT1weXRob24zNi5QeUFyZ19QYXJzZQorICBQeUFyZ19QYXJzZVR1cGxlPXB5dGhvbjM2LlB5QXJnX1BhcnNlVHVwbGUKKyAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM2LlB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcworICBQeUFyZ19VbnBhY2tUdXBsZT1weXRob24zNi5QeUFyZ19VbnBhY2tUdXBsZQorICBQeUFyZ19WYVBhcnNlPXB5dGhvbjM2LlB5QXJnX1ZhUGFyc2UKKyAgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzYuUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMKKyAgUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzPXB5dGhvbjM2LlB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cworICBQeUJhc2VPYmplY3RfVHlwZT1weXRob24zNi5QeUJhc2VPYmplY3RfVHlwZSBEQVRBCisgIFB5Qm9vbF9Gcm9tTG9uZz1weXRob24zNi5QeUJvb2xfRnJvbUxvbmcKKyAgUHlCb29sX1R5cGU9cHl0aG9uMzYuUHlCb29sX1R5cGUgREFUQQorICBQeUJ5dGVBcnJheUl0ZXJfVHlwZT1weXRob24zNi5QeUJ5dGVBcnJheUl0ZXJfVHlwZSBEQVRBCisgIFB5Qnl0ZUFycmF5X0FzU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0FzU3RyaW5nCisgIFB5Qnl0ZUFycmF5X0NvbmNhdD1weXRob24zNi5QeUJ5dGVBcnJheV9Db25jYXQKKyAgUHlCeXRlQXJyYXlfRnJvbU9iamVjdD1weXRob24zNi5QeUJ5dGVBcnJheV9Gcm9tT2JqZWN0CisgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplCisgIFB5Qnl0ZUFycmF5X1Jlc2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9SZXNpemUKKyAgUHlCeXRlQXJyYXlfU2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9TaXplCisgIFB5Qnl0ZUFycmF5X1R5cGU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfVHlwZSBEQVRBCisgIFB5Qnl0ZXNJdGVyX1R5cGU9cHl0aG9uMzYuUHlCeXRlc0l0ZXJfVHlwZSBEQVRBCisgIFB5Qnl0ZXNfQXNTdHJpbmc9cHl0aG9uMzYuUHlCeXRlc19Bc1N0cmluZworICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVzX0NvbmNhdD1weXRob24zNi5QeUJ5dGVzX0NvbmNhdAorICBQeUJ5dGVzX0NvbmNhdEFuZERlbD1weXRob24zNi5QeUJ5dGVzX0NvbmNhdEFuZERlbAorICBQeUJ5dGVzX0RlY29kZUVzY2FwZT1weXRob24zNi5QeUJ5dGVzX0RlY29kZUVzY2FwZQorICBQeUJ5dGVzX0Zyb21Gb3JtYXQ9cHl0aG9uMzYuUHlCeXRlc19Gcm9tRm9ybWF0CisgIFB5Qnl0ZXNfRnJvbUZvcm1hdFY9cHl0aG9uMzYuUHlCeXRlc19Gcm9tRm9ybWF0VgorICBQeUJ5dGVzX0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlCeXRlc19Gcm9tT2JqZWN0CisgIFB5Qnl0ZXNfRnJvbVN0cmluZz1weXRob24zNi5QeUJ5dGVzX0Zyb21TdHJpbmcKKyAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCisgIFB5Qnl0ZXNfUmVwcj1weXRob24zNi5QeUJ5dGVzX1JlcHIKKyAgUHlCeXRlc19TaXplPXB5dGhvbjM2LlB5Qnl0ZXNfU2l6ZQorICBQeUJ5dGVzX1R5cGU9cHl0aG9uMzYuUHlCeXRlc19UeXBlIERBVEEKKyAgUHlDRnVuY3Rpb25fQ2FsbD1weXRob24zNi5QeUNGdW5jdGlvbl9DYWxsCisgIFB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzYuUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdAorICBQeUNGdW5jdGlvbl9HZXRGbGFncz1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRGbGFncworICBQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbj1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRGdW5jdGlvbgorICBQeUNGdW5jdGlvbl9HZXRTZWxmPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldFNlbGYKKyAgUHlDRnVuY3Rpb25fTmV3PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX05ldworICBQeUNGdW5jdGlvbl9OZXdFeD1weXRob24zNi5QeUNGdW5jdGlvbl9OZXdFeAorICBQeUNGdW5jdGlvbl9UeXBlPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX1R5cGUgREFUQQorICBQeUNhbGxJdGVyX05ldz1weXRob24zNi5QeUNhbGxJdGVyX05ldworICBQeUNhbGxJdGVyX1R5cGU9cHl0aG9uMzYuUHlDYWxsSXRlcl9UeXBlIERBVEEKKyAgUHlDYWxsYWJsZV9DaGVjaz1weXRob24zNi5QeUNhbGxhYmxlX0NoZWNrCisgIFB5Q2Fwc3VsZV9HZXRDb250ZXh0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXRDb250ZXh0CisgIFB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yCisgIFB5Q2Fwc3VsZV9HZXROYW1lPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXROYW1lCisgIFB5Q2Fwc3VsZV9HZXRQb2ludGVyPXB5dGhvbjM2LlB5Q2Fwc3VsZV9HZXRQb2ludGVyCisgIFB5Q2Fwc3VsZV9JbXBvcnQ9cHl0aG9uMzYuUHlDYXBzdWxlX0ltcG9ydAorICBQeUNhcHN1bGVfSXNWYWxpZD1weXRob24zNi5QeUNhcHN1bGVfSXNWYWxpZAorICBQeUNhcHN1bGVfTmV3PXB5dGhvbjM2LlB5Q2Fwc3VsZV9OZXcKKyAgUHlDYXBzdWxlX1NldENvbnRleHQ9cHl0aG9uMzYuUHlDYXBzdWxlX1NldENvbnRleHQKKyAgUHlDYXBzdWxlX1NldERlc3RydWN0b3I9cHl0aG9uMzYuUHlDYXBzdWxlX1NldERlc3RydWN0b3IKKyAgUHlDYXBzdWxlX1NldE5hbWU9cHl0aG9uMzYuUHlDYXBzdWxlX1NldE5hbWUKKyAgUHlDYXBzdWxlX1NldFBvaW50ZXI9cHl0aG9uMzYuUHlDYXBzdWxlX1NldFBvaW50ZXIKKyAgUHlDYXBzdWxlX1R5cGU9cHl0aG9uMzYuUHlDYXBzdWxlX1R5cGUgREFUQQorICBQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZT1weXRob24zNi5QeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSBEQVRBCisgIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnMKKyAgUHlDb2RlY19EZWNvZGU9cHl0aG9uMzYuUHlDb2RlY19EZWNvZGUKKyAgUHlDb2RlY19EZWNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfRGVjb2RlcgorICBQeUNvZGVjX0VuY29kZT1weXRob24zNi5QeUNvZGVjX0VuY29kZQorICBQeUNvZGVjX0VuY29kZXI9cHl0aG9uMzYuUHlDb2RlY19FbmNvZGVyCisgIFB5Q29kZWNfSWdub3JlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfSWdub3JlRXJyb3JzCisgIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyCisgIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyCisgIFB5Q29kZWNfS25vd25FbmNvZGluZz1weXRob24zNi5QeUNvZGVjX0tub3duRW5jb2RpbmcKKyAgUHlDb2RlY19Mb29rdXBFcnJvcj1weXRob24zNi5QeUNvZGVjX0xvb2t1cEVycm9yCisgIFB5Q29kZWNfUmVnaXN0ZXI9cHl0aG9uMzYuUHlDb2RlY19SZWdpc3RlcgorICBQeUNvZGVjX1JlZ2lzdGVyRXJyb3I9cHl0aG9uMzYuUHlDb2RlY19SZWdpc3RlckVycm9yCisgIFB5Q29kZWNfUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX1JlcGxhY2VFcnJvcnMKKyAgUHlDb2RlY19TdHJlYW1SZWFkZXI9cHl0aG9uMzYuUHlDb2RlY19TdHJlYW1SZWFkZXIKKyAgUHlDb2RlY19TdHJlYW1Xcml0ZXI9cHl0aG9uMzYuUHlDb2RlY19TdHJlYW1Xcml0ZXIKKyAgUHlDb2RlY19TdHJpY3RFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19TdHJpY3RFcnJvcnMKKyAgUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycz1weXRob24zNi5QeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzCisgIFB5Q29tcGxleF9Gcm9tRG91Ymxlcz1weXRob24zNi5QeUNvbXBsZXhfRnJvbURvdWJsZXMKKyAgUHlDb21wbGV4X0ltYWdBc0RvdWJsZT1weXRob24zNi5QeUNvbXBsZXhfSW1hZ0FzRG91YmxlCisgIFB5Q29tcGxleF9SZWFsQXNEb3VibGU9cHl0aG9uMzYuUHlDb21wbGV4X1JlYWxBc0RvdWJsZQorICBQeUNvbXBsZXhfVHlwZT1weXRob24zNi5QeUNvbXBsZXhfVHlwZSBEQVRBCisgIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q9cHl0aG9uMzYuUHlEZXNjcl9OZXdDbGFzc01ldGhvZAorICBQeURlc2NyX05ld0dldFNldD1weXRob24zNi5QeURlc2NyX05ld0dldFNldAorICBQeURlc2NyX05ld01lbWJlcj1weXRob24zNi5QeURlc2NyX05ld01lbWJlcgorICBQeURlc2NyX05ld01ldGhvZD1weXRob24zNi5QeURlc2NyX05ld01ldGhvZAorICBQeURpY3RJdGVtc19UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZW1zX1R5cGUgREFUQQorICBQeURpY3RJdGVySXRlbV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJJdGVtX1R5cGUgREFUQQorICBQeURpY3RJdGVyS2V5X1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlcktleV9UeXBlIERBVEEKKyAgUHlEaWN0SXRlclZhbHVlX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlclZhbHVlX1R5cGUgREFUQQorICBQeURpY3RLZXlzX1R5cGU9cHl0aG9uMzYuUHlEaWN0S2V5c19UeXBlIERBVEEKKyAgUHlEaWN0UHJveHlfTmV3PXB5dGhvbjM2LlB5RGljdFByb3h5X05ldworICBQeURpY3RQcm94eV9UeXBlPXB5dGhvbjM2LlB5RGljdFByb3h5X1R5cGUgREFUQQorICBQeURpY3RWYWx1ZXNfVHlwZT1weXRob24zNi5QeURpY3RWYWx1ZXNfVHlwZSBEQVRBCisgIFB5RGljdF9DbGVhcj1weXRob24zNi5QeURpY3RfQ2xlYXIKKyAgUHlEaWN0X0NvbnRhaW5zPXB5dGhvbjM2LlB5RGljdF9Db250YWlucworICBQeURpY3RfQ29weT1weXRob24zNi5QeURpY3RfQ29weQorICBQeURpY3RfRGVsSXRlbT1weXRob24zNi5QeURpY3RfRGVsSXRlbQorICBQeURpY3RfRGVsSXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfRGVsSXRlbVN0cmluZworICBQeURpY3RfR2V0SXRlbT1weXRob24zNi5QeURpY3RfR2V0SXRlbQorICBQeURpY3RfR2V0SXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfR2V0SXRlbVN0cmluZworICBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcj1weXRob24zNi5QeURpY3RfR2V0SXRlbVdpdGhFcnJvcgorICBQeURpY3RfSXRlbXM9cHl0aG9uMzYuUHlEaWN0X0l0ZW1zCisgIFB5RGljdF9LZXlzPXB5dGhvbjM2LlB5RGljdF9LZXlzCisgIFB5RGljdF9NZXJnZT1weXRob24zNi5QeURpY3RfTWVyZ2UKKyAgUHlEaWN0X01lcmdlRnJvbVNlcTI9cHl0aG9uMzYuUHlEaWN0X01lcmdlRnJvbVNlcTIKKyAgUHlEaWN0X05ldz1weXRob24zNi5QeURpY3RfTmV3CisgIFB5RGljdF9OZXh0PXB5dGhvbjM2LlB5RGljdF9OZXh0CisgIFB5RGljdF9TZXRJdGVtPXB5dGhvbjM2LlB5RGljdF9TZXRJdGVtCisgIFB5RGljdF9TZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9TZXRJdGVtU3RyaW5nCisgIFB5RGljdF9TaXplPXB5dGhvbjM2LlB5RGljdF9TaXplCisgIFB5RGljdF9UeXBlPXB5dGhvbjM2LlB5RGljdF9UeXBlIERBVEEKKyAgUHlEaWN0X1VwZGF0ZT1weXRob24zNi5QeURpY3RfVXBkYXRlCisgIFB5RGljdF9WYWx1ZXM9cHl0aG9uMzYuUHlEaWN0X1ZhbHVlcworICBQeUVsbGlwc2lzX1R5cGU9cHl0aG9uMzYuUHlFbGxpcHNpc19UeXBlIERBVEEKKyAgUHlFbnVtX1R5cGU9cHl0aG9uMzYuUHlFbnVtX1R5cGUgREFUQQorICBQeUVycl9CYWRBcmd1bWVudD1weXRob24zNi5QeUVycl9CYWRBcmd1bWVudAorICBQeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzYuUHlFcnJfQmFkSW50ZXJuYWxDYWxsCisgIFB5RXJyX0NoZWNrU2lnbmFscz1weXRob24zNi5QeUVycl9DaGVja1NpZ25hbHMKKyAgUHlFcnJfQ2xlYXI9cHl0aG9uMzYuUHlFcnJfQ2xlYXIKKyAgUHlFcnJfRGlzcGxheT1weXRob24zNi5QeUVycl9EaXNwbGF5CisgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzYuUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcworICBQeUVycl9GZXRjaD1weXRob24zNi5QeUVycl9GZXRjaAorICBQeUVycl9Gb3JtYXQ9cHl0aG9uMzYuUHlFcnJfRm9ybWF0CisgIFB5RXJyX0Zvcm1hdFY9cHl0aG9uMzYuUHlFcnJfRm9ybWF0VgorICBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzYuUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzCisgIFB5RXJyX05ld0V4Y2VwdGlvbj1weXRob24zNi5QeUVycl9OZXdFeGNlcHRpb24KKyAgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYz1weXRob24zNi5QeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jCisgIFB5RXJyX05vTWVtb3J5PXB5dGhvbjM2LlB5RXJyX05vTWVtb3J5CisgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbj1weXRob24zNi5QeUVycl9Ob3JtYWxpemVFeGNlcHRpb24KKyAgUHlFcnJfT2NjdXJyZWQ9cHl0aG9uMzYuUHlFcnJfT2NjdXJyZWQKKyAgUHlFcnJfUHJpbnQ9cHl0aG9uMzYuUHlFcnJfUHJpbnQKKyAgUHlFcnJfUHJpbnRFeD1weXRob24zNi5QeUVycl9QcmludEV4CisgIFB5RXJyX1Byb2dyYW1UZXh0PXB5dGhvbjM2LlB5RXJyX1Byb2dyYW1UZXh0CisgIFB5RXJyX1Jlc3RvcmU9cHl0aG9uMzYuUHlFcnJfUmVzdG9yZQorICBQeUVycl9TZXRGcm9tRXJybm89cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vCisgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZT1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUKKyAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdAorICBQeUVycl9TZXRJbnRlcnJ1cHQ9cHl0aG9uMzYuUHlFcnJfU2V0SW50ZXJydXB0CisgIFB5RXJyX1NldE5vbmU9cHl0aG9uMzYuUHlFcnJfU2V0Tm9uZQorICBQeUVycl9TZXRPYmplY3Q9cHl0aG9uMzYuUHlFcnJfU2V0T2JqZWN0CisgIFB5RXJyX1NldFN0cmluZz1weXRob24zNi5QeUVycl9TZXRTdHJpbmcKKyAgUHlFcnJfU3ludGF4TG9jYXRpb249cHl0aG9uMzYuUHlFcnJfU3ludGF4TG9jYXRpb24KKyAgUHlFcnJfV2FybkV4PXB5dGhvbjM2LlB5RXJyX1dhcm5FeAorICBQeUVycl9XYXJuRXhwbGljaXQ9cHl0aG9uMzYuUHlFcnJfV2FybkV4cGxpY2l0CisgIFB5RXJyX1dhcm5Gb3JtYXQ9cHl0aG9uMzYuUHlFcnJfV2FybkZvcm1hdAorICBQeUVycl9Xcml0ZVVucmFpc2FibGU9cHl0aG9uMzYuUHlFcnJfV3JpdGVVbnJhaXNhYmxlCisgIFB5RXZhbF9BY3F1aXJlTG9jaz1weXRob24zNi5QeUV2YWxfQWNxdWlyZUxvY2sKKyAgUHlFdmFsX0FjcXVpcmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX0FjcXVpcmVUaHJlYWQKKyAgUHlFdmFsX0NhbGxGdW5jdGlvbj1weXRob24zNi5QeUV2YWxfQ2FsbEZ1bmN0aW9uCisgIFB5RXZhbF9DYWxsTWV0aG9kPXB5dGhvbjM2LlB5RXZhbF9DYWxsTWV0aG9kCisgIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzPXB5dGhvbjM2LlB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzCisgIFB5RXZhbF9FdmFsQ29kZT1weXRob24zNi5QeUV2YWxfRXZhbENvZGUKKyAgUHlFdmFsX0V2YWxDb2RlRXg9cHl0aG9uMzYuUHlFdmFsX0V2YWxDb2RlRXgKKyAgUHlFdmFsX0V2YWxGcmFtZT1weXRob24zNi5QeUV2YWxfRXZhbEZyYW1lCisgIFB5RXZhbF9FdmFsRnJhbWVFeD1weXRob24zNi5QeUV2YWxfRXZhbEZyYW1lRXgKKyAgUHlFdmFsX0dldEJ1aWx0aW5zPXB5dGhvbjM2LlB5RXZhbF9HZXRCdWlsdGlucworICBQeUV2YWxfR2V0Q2FsbFN0YXRzPXB5dGhvbjM2LlB5RXZhbF9HZXRDYWxsU3RhdHMKKyAgUHlFdmFsX0dldEZyYW1lPXB5dGhvbjM2LlB5RXZhbF9HZXRGcmFtZQorICBQeUV2YWxfR2V0RnVuY0Rlc2M9cHl0aG9uMzYuUHlFdmFsX0dldEZ1bmNEZXNjCisgIFB5RXZhbF9HZXRGdW5jTmFtZT1weXRob24zNi5QeUV2YWxfR2V0RnVuY05hbWUKKyAgUHlFdmFsX0dldEdsb2JhbHM9cHl0aG9uMzYuUHlFdmFsX0dldEdsb2JhbHMKKyAgUHlFdmFsX0dldExvY2Fscz1weXRob24zNi5QeUV2YWxfR2V0TG9jYWxzCisgIFB5RXZhbF9Jbml0VGhyZWFkcz1weXRob24zNi5QeUV2YWxfSW5pdFRocmVhZHMKKyAgUHlFdmFsX1JlSW5pdFRocmVhZHM9cHl0aG9uMzYuUHlFdmFsX1JlSW5pdFRocmVhZHMKKyAgUHlFdmFsX1JlbGVhc2VMb2NrPXB5dGhvbjM2LlB5RXZhbF9SZWxlYXNlTG9jaworICBQeUV2YWxfUmVsZWFzZVRocmVhZD1weXRob24zNi5QeUV2YWxfUmVsZWFzZVRocmVhZAorICBQeUV2YWxfUmVzdG9yZVRocmVhZD1weXRob24zNi5QeUV2YWxfUmVzdG9yZVRocmVhZAorICBQeUV2YWxfU2F2ZVRocmVhZD1weXRob24zNi5QeUV2YWxfU2F2ZVRocmVhZAorICBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkPXB5dGhvbjM2LlB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQKKyAgUHlFeGNfQXJpdGhtZXRpY0Vycm9yPXB5dGhvbjM2LlB5RXhjX0FyaXRobWV0aWNFcnJvciBEQVRBCisgIFB5RXhjX0Fzc2VydGlvbkVycm9yPXB5dGhvbjM2LlB5RXhjX0Fzc2VydGlvbkVycm9yIERBVEEKKyAgUHlFeGNfQXR0cmlidXRlRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXR0cmlidXRlRXJyb3IgREFUQQorICBQeUV4Y19CYXNlRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXhjX0Jhc2VFeGNlcHRpb24gREFUQQorICBQeUV4Y19CdWZmZXJFcnJvcj1weXRob24zNi5QeUV4Y19CdWZmZXJFcnJvciBEQVRBCisgIFB5RXhjX0J5dGVzV2FybmluZz1weXRob24zNi5QeUV4Y19CeXRlc1dhcm5pbmcgREFUQQorICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKKyAgUHlFeGNfRU9GRXJyb3I9cHl0aG9uMzYuUHlFeGNfRU9GRXJyb3IgREFUQQorICBQeUV4Y19FbnZpcm9ubWVudEVycm9yPXB5dGhvbjM2LlB5RXhjX0Vudmlyb25tZW50RXJyb3IgREFUQQorICBQeUV4Y19FeGNlcHRpb249cHl0aG9uMzYuUHlFeGNfRXhjZXB0aW9uIERBVEEKKyAgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yPXB5dGhvbjM2LlB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvciBEQVRBCisgIFB5RXhjX0Z1dHVyZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfRnV0dXJlV2FybmluZyBEQVRBCisgIFB5RXhjX0dlbmVyYXRvckV4aXQ9cHl0aG9uMzYuUHlFeGNfR2VuZXJhdG9yRXhpdCBEQVRBCisgIFB5RXhjX0lPRXJyb3I9cHl0aG9uMzYuUHlFeGNfSU9FcnJvciBEQVRBCisgIFB5RXhjX0ltcG9ydEVycm9yPXB5dGhvbjM2LlB5RXhjX0ltcG9ydEVycm9yIERBVEEKKyAgUHlFeGNfSW1wb3J0V2FybmluZz1weXRob24zNi5QeUV4Y19JbXBvcnRXYXJuaW5nIERBVEEKKyAgUHlFeGNfSW5kZW50YXRpb25FcnJvcj1weXRob24zNi5QeUV4Y19JbmRlbnRhdGlvbkVycm9yIERBVEEKKyAgUHlFeGNfSW5kZXhFcnJvcj1weXRob24zNi5QeUV4Y19JbmRleEVycm9yIERBVEEKKyAgUHlFeGNfS2V5RXJyb3I9cHl0aG9uMzYuUHlFeGNfS2V5RXJyb3IgREFUQQorICBQeUV4Y19LZXlib2FyZEludGVycnVwdD1weXRob24zNi5QeUV4Y19LZXlib2FyZEludGVycnVwdCBEQVRBCisgIFB5RXhjX0xvb2t1cEVycm9yPXB5dGhvbjM2LlB5RXhjX0xvb2t1cEVycm9yIERBVEEKKyAgUHlFeGNfTWVtb3J5RXJyb3I9cHl0aG9uMzYuUHlFeGNfTWVtb3J5RXJyb3IgREFUQQorICBQeUV4Y19NZW1vcnlFcnJvckluc3Q9cHl0aG9uMzYuUHlFeGNfTWVtb3J5RXJyb3JJbnN0IERBVEEKKyAgUHlFeGNfTmFtZUVycm9yPXB5dGhvbjM2LlB5RXhjX05hbWVFcnJvciBEQVRBCisgIFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I9cHl0aG9uMzYuUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciBEQVRBCisgIFB5RXhjX09TRXJyb3I9cHl0aG9uMzYuUHlFeGNfT1NFcnJvciBEQVRBCisgIFB5RXhjX092ZXJmbG93RXJyb3I9cHl0aG9uMzYuUHlFeGNfT3ZlcmZsb3dFcnJvciBEQVRBCisgIFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCisgIFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdD1weXRob24zNi5QeUV4Y19SZWN1cnNpb25FcnJvckluc3QgREFUQQorICBQeUV4Y19SZWZlcmVuY2VFcnJvcj1weXRob24zNi5QeUV4Y19SZWZlcmVuY2VFcnJvciBEQVRBCisgIFB5RXhjX1J1bnRpbWVFcnJvcj1weXRob24zNi5QeUV4Y19SdW50aW1lRXJyb3IgREFUQQorICBQeUV4Y19SdW50aW1lV2FybmluZz1weXRob24zNi5QeUV4Y19SdW50aW1lV2FybmluZyBEQVRBCisgIFB5RXhjX1N0b3BJdGVyYXRpb249cHl0aG9uMzYuUHlFeGNfU3RvcEl0ZXJhdGlvbiBEQVRBCisgIFB5RXhjX1N5bnRheEVycm9yPXB5dGhvbjM2LlB5RXhjX1N5bnRheEVycm9yIERBVEEKKyAgUHlFeGNfU3ludGF4V2FybmluZz1weXRob24zNi5QeUV4Y19TeW50YXhXYXJuaW5nIERBVEEKKyAgUHlFeGNfU3lzdGVtRXJyb3I9cHl0aG9uMzYuUHlFeGNfU3lzdGVtRXJyb3IgREFUQQorICBQeUV4Y19TeXN0ZW1FeGl0PXB5dGhvbjM2LlB5RXhjX1N5c3RlbUV4aXQgREFUQQorICBQeUV4Y19UYWJFcnJvcj1weXRob24zNi5QeUV4Y19UYWJFcnJvciBEQVRBCisgIFB5RXhjX1R5cGVFcnJvcj1weXRob24zNi5QeUV4Y19UeXBlRXJyb3IgREFUQQorICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvcj1weXRob24zNi5QeUV4Y19VbmJvdW5kTG9jYWxFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlV2FybmluZz1weXRob24zNi5QeUV4Y19Vbmljb2RlV2FybmluZyBEQVRBCisgIFB5RXhjX1VzZXJXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1VzZXJXYXJuaW5nIERBVEEKKyAgUHlFeGNfVmFsdWVFcnJvcj1weXRob24zNi5QeUV4Y19WYWx1ZUVycm9yIERBVEEKKyAgUHlFeGNfV2FybmluZz1weXRob24zNi5QeUV4Y19XYXJuaW5nIERBVEEKKyAgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IgREFUQQorICBQeUV4Y2VwdGlvbl9HZXRDYXVzZT1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRDYXVzZQorICBQeUV4Y2VwdGlvbl9HZXRDb250ZXh0PXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldENvbnRleHQKKyAgUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrPXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaworICBQeUV4Y2VwdGlvbl9TZXRDYXVzZT1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRDYXVzZQorICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0PXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldENvbnRleHQKKyAgUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrPXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaworICBQeUZpbGVfRnJvbUZkPXB5dGhvbjM2LlB5RmlsZV9Gcm9tRmQKKyAgUHlGaWxlX0dldExpbmU9cHl0aG9uMzYuUHlGaWxlX0dldExpbmUKKyAgUHlGaWxlX1dyaXRlT2JqZWN0PXB5dGhvbjM2LlB5RmlsZV9Xcml0ZU9iamVjdAorICBQeUZpbGVfV3JpdGVTdHJpbmc9cHl0aG9uMzYuUHlGaWxlX1dyaXRlU3RyaW5nCisgIFB5RmlsdGVyX1R5cGU9cHl0aG9uMzYuUHlGaWx0ZXJfVHlwZSBEQVRBCisgIFB5RmxvYXRfQXNEb3VibGU9cHl0aG9uMzYuUHlGbG9hdF9Bc0RvdWJsZQorICBQeUZsb2F0X0Zyb21Eb3VibGU9cHl0aG9uMzYuUHlGbG9hdF9Gcm9tRG91YmxlCisgIFB5RmxvYXRfRnJvbVN0cmluZz1weXRob24zNi5QeUZsb2F0X0Zyb21TdHJpbmcKKyAgUHlGbG9hdF9HZXRJbmZvPXB5dGhvbjM2LlB5RmxvYXRfR2V0SW5mbworICBQeUZsb2F0X0dldE1heD1weXRob24zNi5QeUZsb2F0X0dldE1heAorICBQeUZsb2F0X0dldE1pbj1weXRob24zNi5QeUZsb2F0X0dldE1pbgorICBQeUZsb2F0X1R5cGU9cHl0aG9uMzYuUHlGbG9hdF9UeXBlIERBVEEKKyAgUHlGcm96ZW5TZXRfTmV3PXB5dGhvbjM2LlB5RnJvemVuU2V0X05ldworICBQeUZyb3plblNldF9UeXBlPXB5dGhvbjM2LlB5RnJvemVuU2V0X1R5cGUgREFUQQorICBQeUdDX0NvbGxlY3Q9cHl0aG9uMzYuUHlHQ19Db2xsZWN0CisgIFB5R0lMU3RhdGVfRW5zdXJlPXB5dGhvbjM2LlB5R0lMU3RhdGVfRW5zdXJlCisgIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlPXB5dGhvbjM2LlB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlCisgIFB5R0lMU3RhdGVfUmVsZWFzZT1weXRob24zNi5QeUdJTFN0YXRlX1JlbGVhc2UKKyAgUHlHZXRTZXREZXNjcl9UeXBlPXB5dGhvbjM2LlB5R2V0U2V0RGVzY3JfVHlwZSBEQVRBCisgIFB5SW1wb3J0X0FkZE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9BZGRNb2R1bGUKKyAgUHlJbXBvcnRfQXBwZW5kSW5pdHRhYj1weXRob24zNi5QeUltcG9ydF9BcHBlbmRJbml0dGFiCisgIFB5SW1wb3J0X0NsZWFudXA9cHl0aG9uMzYuUHlJbXBvcnRfQ2xlYW51cAorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZT1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZQorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4PXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzPXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcworICBQeUltcG9ydF9HZXRJbXBvcnRlcj1weXRob24zNi5QeUltcG9ydF9HZXRJbXBvcnRlcgorICBQeUltcG9ydF9HZXRNYWdpY051bWJlcj1weXRob24zNi5QeUltcG9ydF9HZXRNYWdpY051bWJlcgorICBQeUltcG9ydF9HZXRNYWdpY1RhZz1weXRob24zNi5QeUltcG9ydF9HZXRNYWdpY1RhZworICBQeUltcG9ydF9HZXRNb2R1bGVEaWN0PXB5dGhvbjM2LlB5SW1wb3J0X0dldE1vZHVsZURpY3QKKyAgUHlJbXBvcnRfSW1wb3J0PXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydAorICBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGUKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWw9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaz1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrCisgIFB5SW1wb3J0X1JlbG9hZE1vZHVsZT1weXRob24zNi5QeUltcG9ydF9SZWxvYWRNb2R1bGUKKyAgUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyPXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcgorICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlPXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUKKyAgUHlJbnRlcnByZXRlclN0YXRlX05ldz1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfTmV3CisgIFB5SXRlcl9OZXh0PXB5dGhvbjM2LlB5SXRlcl9OZXh0CisgIFB5TGlzdEl0ZXJfVHlwZT1weXRob24zNi5QeUxpc3RJdGVyX1R5cGUgREFUQQorICBQeUxpc3RSZXZJdGVyX1R5cGU9cHl0aG9uMzYuUHlMaXN0UmV2SXRlcl9UeXBlIERBVEEKKyAgUHlMaXN0X0FwcGVuZD1weXRob24zNi5QeUxpc3RfQXBwZW5kCisgIFB5TGlzdF9Bc1R1cGxlPXB5dGhvbjM2LlB5TGlzdF9Bc1R1cGxlCisgIFB5TGlzdF9HZXRJdGVtPXB5dGhvbjM2LlB5TGlzdF9HZXRJdGVtCisgIFB5TGlzdF9HZXRTbGljZT1weXRob24zNi5QeUxpc3RfR2V0U2xpY2UKKyAgUHlMaXN0X0luc2VydD1weXRob24zNi5QeUxpc3RfSW5zZXJ0CisgIFB5TGlzdF9OZXc9cHl0aG9uMzYuUHlMaXN0X05ldworICBQeUxpc3RfUmV2ZXJzZT1weXRob24zNi5QeUxpc3RfUmV2ZXJzZQorICBQeUxpc3RfU2V0SXRlbT1weXRob24zNi5QeUxpc3RfU2V0SXRlbQorICBQeUxpc3RfU2V0U2xpY2U9cHl0aG9uMzYuUHlMaXN0X1NldFNsaWNlCisgIFB5TGlzdF9TaXplPXB5dGhvbjM2LlB5TGlzdF9TaXplCisgIFB5TGlzdF9Tb3J0PXB5dGhvbjM2LlB5TGlzdF9Tb3J0CisgIFB5TGlzdF9UeXBlPXB5dGhvbjM2LlB5TGlzdF9UeXBlIERBVEEKKyAgUHlMb25nUmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzYuUHlMb25nUmFuZ2VJdGVyX1R5cGUgREFUQQorICBQeUxvbmdfQXNEb3VibGU9cHl0aG9uMzYuUHlMb25nX0FzRG91YmxlCisgIFB5TG9uZ19Bc0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzTG9uZworICBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93CisgIFB5TG9uZ19Bc0xvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdMb25nCisgIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdworICBQeUxvbmdfQXNTaXplX3Q9cHl0aG9uMzYuUHlMb25nX0FzU2l6ZV90CisgIFB5TG9uZ19Bc1NzaXplX3Q9cHl0aG9uMzYuUHlMb25nX0FzU3NpemVfdAorICBQeUxvbmdfQXNVbnNpZ25lZExvbmc9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sKKyAgUHlMb25nX0FzVm9pZFB0cj1weXRob24zNi5QeUxvbmdfQXNWb2lkUHRyCisgIFB5TG9uZ19Gcm9tRG91YmxlPXB5dGhvbjM2LlB5TG9uZ19Gcm9tRG91YmxlCisgIFB5TG9uZ19Gcm9tTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbUxvbmcKKyAgUHlMb25nX0Zyb21Mb25nTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbUxvbmdMb25nCisgIFB5TG9uZ19Gcm9tU2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Gcm9tU2l6ZV90CisgIFB5TG9uZ19Gcm9tU3NpemVfdD1weXRob24zNi5QeUxvbmdfRnJvbVNzaXplX3QKKyAgUHlMb25nX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21TdHJpbmcKKyAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKKyAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZworICBQeUxvbmdfRnJvbVZvaWRQdHI9cHl0aG9uMzYuUHlMb25nX0Zyb21Wb2lkUHRyCisgIFB5TG9uZ19HZXRJbmZvPXB5dGhvbjM2LlB5TG9uZ19HZXRJbmZvCisgIFB5TG9uZ19UeXBlPXB5dGhvbjM2LlB5TG9uZ19UeXBlIERBVEEKKyAgUHlNYXBfVHlwZT1weXRob24zNi5QeU1hcF9UeXBlIERBVEEKKyAgUHlNYXBwaW5nX0NoZWNrPXB5dGhvbjM2LlB5TWFwcGluZ19DaGVjaworICBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfR2V0SXRlbVN0cmluZworICBQeU1hcHBpbmdfSGFzS2V5PXB5dGhvbjM2LlB5TWFwcGluZ19IYXNLZXkKKyAgUHlNYXBwaW5nX0hhc0tleVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfSGFzS2V5U3RyaW5nCisgIFB5TWFwcGluZ19JdGVtcz1weXRob24zNi5QeU1hcHBpbmdfSXRlbXMKKyAgUHlNYXBwaW5nX0tleXM9cHl0aG9uMzYuUHlNYXBwaW5nX0tleXMKKyAgUHlNYXBwaW5nX0xlbmd0aD1weXRob24zNi5QeU1hcHBpbmdfTGVuZ3RoCisgIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19TZXRJdGVtU3RyaW5nCisgIFB5TWFwcGluZ19TaXplPXB5dGhvbjM2LlB5TWFwcGluZ19TaXplCisgIFB5TWFwcGluZ19WYWx1ZXM9cHl0aG9uMzYuUHlNYXBwaW5nX1ZhbHVlcworICBQeU1lbV9GcmVlPXB5dGhvbjM2LlB5TWVtX0ZyZWUKKyAgUHlNZW1fTWFsbG9jPXB5dGhvbjM2LlB5TWVtX01hbGxvYworICBQeU1lbV9SZWFsbG9jPXB5dGhvbjM2LlB5TWVtX1JlYWxsb2MKKyAgUHlNZW1iZXJEZXNjcl9UeXBlPXB5dGhvbjM2LlB5TWVtYmVyRGVzY3JfVHlwZSBEQVRBCisgIFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0CisgIFB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzPXB5dGhvbjM2LlB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzCisgIFB5TWVtb3J5Vmlld19UeXBlPXB5dGhvbjM2LlB5TWVtb3J5Vmlld19UeXBlIERBVEEKKyAgUHlNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM2LlB5TWV0aG9kRGVzY3JfVHlwZSBEQVRBCisgIFB5TW9kdWxlX0FkZEludENvbnN0YW50PXB5dGhvbjM2LlB5TW9kdWxlX0FkZEludENvbnN0YW50CisgIFB5TW9kdWxlX0FkZE9iamVjdD1weXRob24zNi5QeU1vZHVsZV9BZGRPYmplY3QKKyAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQ9cHl0aG9uMzYuUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQKKyAgUHlNb2R1bGVfQ3JlYXRlMj1weXRob24zNi5QeU1vZHVsZV9DcmVhdGUyCisgIFB5TW9kdWxlX0dldERlZj1weXRob24zNi5QeU1vZHVsZV9HZXREZWYKKyAgUHlNb2R1bGVfR2V0RGljdD1weXRob24zNi5QeU1vZHVsZV9HZXREaWN0CisgIFB5TW9kdWxlX0dldEZpbGVuYW1lPXB5dGhvbjM2LlB5TW9kdWxlX0dldEZpbGVuYW1lCisgIFB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM2LlB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0CisgIFB5TW9kdWxlX0dldE5hbWU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0TmFtZQorICBQeU1vZHVsZV9HZXRTdGF0ZT1weXRob24zNi5QeU1vZHVsZV9HZXRTdGF0ZQorICBQeU1vZHVsZV9OZXc9cHl0aG9uMzYuUHlNb2R1bGVfTmV3CisgIFB5TW9kdWxlX1R5cGU9cHl0aG9uMzYuUHlNb2R1bGVfVHlwZSBEQVRBCisgIFB5TW9kdWxlRGVmX0luaXQ9cHl0aG9uMzYuUHlNb2R1bGVEZWZfSW5pdAorICBQeU1vZHVsZURlZl9UeXBlPXB5dGhvbjM2LlB5TW9kdWxlRGVmX1R5cGUgREFUQQorICBQeU51bGxJbXBvcnRlcl9UeXBlPXB5dGhvbjM2LlB5TnVsbEltcG9ydGVyX1R5cGUgREFUQQorICBQeU51bWJlcl9BYnNvbHV0ZT1weXRob24zNi5QeU51bWJlcl9BYnNvbHV0ZQorICBQeU51bWJlcl9BZGQ9cHl0aG9uMzYuUHlOdW1iZXJfQWRkCisgIFB5TnVtYmVyX0FuZD1weXRob24zNi5QeU51bWJlcl9BbmQKKyAgUHlOdW1iZXJfQXNTc2l6ZV90PXB5dGhvbjM2LlB5TnVtYmVyX0FzU3NpemVfdAorICBQeU51bWJlcl9DaGVjaz1weXRob24zNi5QeU51bWJlcl9DaGVjaworICBQeU51bWJlcl9EaXZtb2Q9cHl0aG9uMzYuUHlOdW1iZXJfRGl2bW9kCisgIFB5TnVtYmVyX0Zsb2F0PXB5dGhvbjM2LlB5TnVtYmVyX0Zsb2F0CisgIFB5TnVtYmVyX0Zsb29yRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0Zsb29yRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VBZGQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUFkZAorICBQeU51bWJlcl9JblBsYWNlQW5kPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VBbmQKKyAgUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZQorICBQeU51bWJlcl9JblBsYWNlTHNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VMc2hpZnQKKyAgUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VNdWx0aXBseQorICBQeU51bWJlcl9JblBsYWNlT3I9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZU9yCisgIFB5TnVtYmVyX0luUGxhY2VQb3dlcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUG93ZXIKKyAgUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUmVtYWluZGVyCisgIFB5TnVtYmVyX0luUGxhY2VSc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVJzaGlmdAorICBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Q9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0CisgIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VYb3I9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVhvcgorICBQeU51bWJlcl9JbmRleD1weXRob24zNi5QeU51bWJlcl9JbmRleAorICBQeU51bWJlcl9JbnZlcnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW52ZXJ0CisgIFB5TnVtYmVyX0xvbmc9cHl0aG9uMzYuUHlOdW1iZXJfTG9uZworICBQeU51bWJlcl9Mc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfTHNoaWZ0CisgIFB5TnVtYmVyX011bHRpcGx5PXB5dGhvbjM2LlB5TnVtYmVyX011bHRpcGx5CisgIFB5TnVtYmVyX05lZ2F0aXZlPXB5dGhvbjM2LlB5TnVtYmVyX05lZ2F0aXZlCisgIFB5TnVtYmVyX09yPXB5dGhvbjM2LlB5TnVtYmVyX09yCisgIFB5TnVtYmVyX1Bvc2l0aXZlPXB5dGhvbjM2LlB5TnVtYmVyX1Bvc2l0aXZlCisgIFB5TnVtYmVyX1Bvd2VyPXB5dGhvbjM2LlB5TnVtYmVyX1Bvd2VyCisgIFB5TnVtYmVyX1JlbWFpbmRlcj1weXRob24zNi5QeU51bWJlcl9SZW1haW5kZXIKKyAgUHlOdW1iZXJfUnNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX1JzaGlmdAorICBQeU51bWJlcl9TdWJ0cmFjdD1weXRob24zNi5QeU51bWJlcl9TdWJ0cmFjdAorICBQeU51bWJlcl9Ub0Jhc2U9cHl0aG9uMzYuUHlOdW1iZXJfVG9CYXNlCisgIFB5TnVtYmVyX1RydWVEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfVHJ1ZURpdmlkZQorICBQeU51bWJlcl9Yb3I9cHl0aG9uMzYuUHlOdW1iZXJfWG9yCisgIFB5T1NfQWZ0ZXJGb3JrPXB5dGhvbjM2LlB5T1NfQWZ0ZXJGb3JrCisgIFB5T1NfSW5pdEludGVycnVwdHM9cHl0aG9uMzYuUHlPU19Jbml0SW50ZXJydXB0cworICBQeU9TX0lucHV0SG9vaz1weXRob24zNi5QeU9TX0lucHV0SG9vayBEQVRBCisgIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQ9cHl0aG9uMzYuUHlPU19JbnRlcnJ1cHRPY2N1cnJlZAorICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyPXB5dGhvbjM2LlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgREFUQQorICBQeU9TX2RvdWJsZV90b19zdHJpbmc9cHl0aG9uMzYuUHlPU19kb3VibGVfdG9fc3RyaW5nCisgIFB5T1NfZ2V0c2lnPXB5dGhvbjM2LlB5T1NfZ2V0c2lnCisgIFB5T1NfbXlzdHJpY21wPXB5dGhvbjM2LlB5T1NfbXlzdHJpY21wCisgIFB5T1NfbXlzdHJuaWNtcD1weXRob24zNi5QeU9TX215c3RybmljbXAKKyAgUHlPU19zZXRzaWc9cHl0aG9uMzYuUHlPU19zZXRzaWcKKyAgUHlPU19zbnByaW50Zj1weXRob24zNi5QeU9TX3NucHJpbnRmCisgIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZT1weXRob24zNi5QeU9TX3N0cmluZ190b19kb3VibGUKKyAgUHlPU19zdHJ0b2w9cHl0aG9uMzYuUHlPU19zdHJ0b2wKKyAgUHlPU19zdHJ0b3VsPXB5dGhvbjM2LlB5T1Nfc3RydG91bAorICBQeU9TX3ZzbnByaW50Zj1weXRob24zNi5QeU9TX3ZzbnByaW50ZgorICBQeU9iamVjdF9BU0NJST1weXRob24zNi5QeU9iamVjdF9BU0NJSQorICBQeU9iamVjdF9Bc0NoYXJCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNDaGFyQnVmZmVyCisgIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I9cHl0aG9uMzYuUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcgorICBQeU9iamVjdF9Bc1JlYWRCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNSZWFkQnVmZmVyCisgIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcgorICBQeU9iamVjdF9CeXRlcz1weXRob24zNi5QeU9iamVjdF9CeXRlcworICBQeU9iamVjdF9DYWxsPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGwKKyAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxGdW5jdGlvbgorICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MKKyAgUHlPYmplY3RfQ2FsbE1ldGhvZD1weXRob24zNi5QeU9iamVjdF9DYWxsTWV0aG9kCisgIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzCisgIFB5T2JqZWN0X0NhbGxPYmplY3Q9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE9iamVjdAorICBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXI9cHl0aG9uMzYuUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyCisgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnM9cHl0aG9uMzYuUHlPYmplY3RfQ2xlYXJXZWFrUmVmcworICBQeU9iamVjdF9EZWxJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X0RlbEl0ZW0KKyAgUHlPYmplY3RfRGVsSXRlbVN0cmluZz1weXRob24zNi5QeU9iamVjdF9EZWxJdGVtU3RyaW5nCisgIFB5T2JqZWN0X0Rpcj1weXRob24zNi5QeU9iamVjdF9EaXIKKyAgUHlPYmplY3RfRm9ybWF0PXB5dGhvbjM2LlB5T2JqZWN0X0Zvcm1hdAorICBQeU9iamVjdF9GcmVlPXB5dGhvbjM2LlB5T2JqZWN0X0ZyZWUKKyAgUHlPYmplY3RfR0NfRGVsPXB5dGhvbjM2LlB5T2JqZWN0X0dDX0RlbAorICBQeU9iamVjdF9HQ19UcmFjaz1weXRob24zNi5QeU9iamVjdF9HQ19UcmFjaworICBQeU9iamVjdF9HQ19VblRyYWNrPXB5dGhvbjM2LlB5T2JqZWN0X0dDX1VuVHJhY2sKKyAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2VuZXJpY0dldEF0dHIKKyAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2VuZXJpY1NldEF0dHIKKyAgUHlPYmplY3RfR2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZXRBdHRyCisgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfR2V0QXR0clN0cmluZworICBQeU9iamVjdF9HZXRJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X0dldEl0ZW0KKyAgUHlPYmplY3RfR2V0SXRlcj1weXRob24zNi5QeU9iamVjdF9HZXRJdGVyCisgIFB5T2JqZWN0X0hhc0F0dHI9cHl0aG9uMzYuUHlPYmplY3RfSGFzQXR0cgorICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0hhc0F0dHJTdHJpbmcKKyAgUHlPYmplY3RfSGFzaD1weXRob24zNi5QeU9iamVjdF9IYXNoCisgIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZD1weXRob24zNi5QeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQKKyAgUHlPYmplY3RfSW5pdD1weXRob24zNi5QeU9iamVjdF9Jbml0CisgIFB5T2JqZWN0X0luaXRWYXI9cHl0aG9uMzYuUHlPYmplY3RfSW5pdFZhcgorICBQeU9iamVjdF9Jc0luc3RhbmNlPXB5dGhvbjM2LlB5T2JqZWN0X0lzSW5zdGFuY2UKKyAgUHlPYmplY3RfSXNTdWJjbGFzcz1weXRob24zNi5QeU9iamVjdF9Jc1N1YmNsYXNzCisgIFB5T2JqZWN0X0lzVHJ1ZT1weXRob24zNi5QeU9iamVjdF9Jc1RydWUKKyAgUHlPYmplY3RfTGVuZ3RoPXB5dGhvbjM2LlB5T2JqZWN0X0xlbmd0aAorICBQeU9iamVjdF9NYWxsb2M9cHl0aG9uMzYuUHlPYmplY3RfTWFsbG9jCisgIFB5T2JqZWN0X05vdD1weXRob24zNi5QeU9iamVjdF9Ob3QKKyAgUHlPYmplY3RfUmVhbGxvYz1weXRob24zNi5QeU9iamVjdF9SZWFsbG9jCisgIFB5T2JqZWN0X1JlcHI9cHl0aG9uMzYuUHlPYmplY3RfUmVwcgorICBQeU9iamVjdF9SaWNoQ29tcGFyZT1weXRob24zNi5QeU9iamVjdF9SaWNoQ29tcGFyZQorICBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w9cHl0aG9uMzYuUHlPYmplY3RfUmljaENvbXBhcmVCb29sCisgIFB5T2JqZWN0X1NlbGZJdGVyPXB5dGhvbjM2LlB5T2JqZWN0X1NlbGZJdGVyCisgIFB5T2JqZWN0X1NldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfU2V0QXR0cgorICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X1NldEF0dHJTdHJpbmcKKyAgUHlPYmplY3RfU2V0SXRlbT1weXRob24zNi5QeU9iamVjdF9TZXRJdGVtCisgIFB5T2JqZWN0X1NpemU9cHl0aG9uMzYuUHlPYmplY3RfU2l6ZQorICBQeU9iamVjdF9TdHI9cHl0aG9uMzYuUHlPYmplY3RfU3RyCisgIFB5T2JqZWN0X1R5cGU9cHl0aG9uMzYuUHlPYmplY3RfVHlwZSBEQVRBCisgIFB5T0RpY3RfRGVsSXRlbT1weXRob24zNi5QeU9EaWN0X0RlbEl0ZW0KKyAgUHlPRGljdF9OZXc9cHl0aG9uMzYuUHlPRGljdF9OZXcKKyAgUHlPRGljdF9TZXRJdGVtPXB5dGhvbjM2LlB5T0RpY3RfU2V0SXRlbQorICBQeU9EaWN0X1R5cGU9cHl0aG9uMzYuUHlPRGljdF9UeXBlIERBVEEKKyAgUHlPRGljdEl0ZW1zX1R5cGU9cHl0aG9uMzYuUHlPRGljdEl0ZW1zX1R5cGUgREFUQQorICBQeU9EaWN0SXRlcl9UeXBlPXB5dGhvbjM2LlB5T0RpY3RJdGVyX1R5cGUgREFUQQorICBQeU9EaWN0S2V5c19UeXBlPXB5dGhvbjM2LlB5T0RpY3RLZXlzX1R5cGUgREFUQQorICBQeU9EaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzYuUHlPRGljdFZhbHVlc19UeXBlIERBVEEKKyAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3M9cHl0aG9uMzYuUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MKKyAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncz1weXRob24zNi5QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzCisgIFB5UHJvcGVydHlfVHlwZT1weXRob24zNi5QeVByb3BlcnR5X1R5cGUgREFUQQorICBQeVJhbmdlSXRlcl9UeXBlPXB5dGhvbjM2LlB5UmFuZ2VJdGVyX1R5cGUgREFUQQorICBQeVJhbmdlX1R5cGU9cHl0aG9uMzYuUHlSYW5nZV9UeXBlIERBVEEKKyAgUHlSZXZlcnNlZF9UeXBlPXB5dGhvbjM2LlB5UmV2ZXJzZWRfVHlwZSBEQVRBCisgIFB5U2VxSXRlcl9OZXc9cHl0aG9uMzYuUHlTZXFJdGVyX05ldworICBQeVNlcUl0ZXJfVHlwZT1weXRob24zNi5QeVNlcUl0ZXJfVHlwZSBEQVRBCisgIFB5U2VxdWVuY2VfQ2hlY2s9cHl0aG9uMzYuUHlTZXF1ZW5jZV9DaGVjaworICBQeVNlcXVlbmNlX0NvbmNhdD1weXRob24zNi5QeVNlcXVlbmNlX0NvbmNhdAorICBQeVNlcXVlbmNlX0NvbnRhaW5zPXB5dGhvbjM2LlB5U2VxdWVuY2VfQ29udGFpbnMKKyAgUHlTZXF1ZW5jZV9Db3VudD1weXRob24zNi5QeVNlcXVlbmNlX0NvdW50CisgIFB5U2VxdWVuY2VfRGVsSXRlbT1weXRob24zNi5QeVNlcXVlbmNlX0RlbEl0ZW0KKyAgUHlTZXF1ZW5jZV9EZWxTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX0RlbFNsaWNlCisgIFB5U2VxdWVuY2VfRmFzdD1weXRob24zNi5QeVNlcXVlbmNlX0Zhc3QKKyAgUHlTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfR2V0SXRlbQorICBQeVNlcXVlbmNlX0dldFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfR2V0U2xpY2UKKyAgUHlTZXF1ZW5jZV9Jbj1weXRob24zNi5QeVNlcXVlbmNlX0luCisgIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdD1weXRob24zNi5QeVNlcXVlbmNlX0luUGxhY2VDb25jYXQKKyAgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdAorICBQeVNlcXVlbmNlX0luZGV4PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5kZXgKKyAgUHlTZXF1ZW5jZV9MZW5ndGg9cHl0aG9uMzYuUHlTZXF1ZW5jZV9MZW5ndGgKKyAgUHlTZXF1ZW5jZV9MaXN0PXB5dGhvbjM2LlB5U2VxdWVuY2VfTGlzdAorICBQeVNlcXVlbmNlX1JlcGVhdD1weXRob24zNi5QeVNlcXVlbmNlX1JlcGVhdAorICBQeVNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9TZXRJdGVtCisgIFB5U2VxdWVuY2VfU2V0U2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9TZXRTbGljZQorICBQeVNlcXVlbmNlX1NpemU9cHl0aG9uMzYuUHlTZXF1ZW5jZV9TaXplCisgIFB5U2VxdWVuY2VfVHVwbGU9cHl0aG9uMzYuUHlTZXF1ZW5jZV9UdXBsZQorICBQeVNldEl0ZXJfVHlwZT1weXRob24zNi5QeVNldEl0ZXJfVHlwZSBEQVRBCisgIFB5U2V0X0FkZD1weXRob24zNi5QeVNldF9BZGQKKyAgUHlTZXRfQ2xlYXI9cHl0aG9uMzYuUHlTZXRfQ2xlYXIKKyAgUHlTZXRfQ29udGFpbnM9cHl0aG9uMzYuUHlTZXRfQ29udGFpbnMKKyAgUHlTZXRfRGlzY2FyZD1weXRob24zNi5QeVNldF9EaXNjYXJkCisgIFB5U2V0X05ldz1weXRob24zNi5QeVNldF9OZXcKKyAgUHlTZXRfUG9wPXB5dGhvbjM2LlB5U2V0X1BvcAorICBQeVNldF9TaXplPXB5dGhvbjM2LlB5U2V0X1NpemUKKyAgUHlTZXRfVHlwZT1weXRob24zNi5QeVNldF9UeXBlIERBVEEKKyAgUHlTbGljZV9HZXRJbmRpY2VzPXB5dGhvbjM2LlB5U2xpY2VfR2V0SW5kaWNlcworICBQeVNsaWNlX0dldEluZGljZXNFeD1weXRob24zNi5QeVNsaWNlX0dldEluZGljZXNFeAorICBQeVNsaWNlX05ldz1weXRob24zNi5QeVNsaWNlX05ldworICBQeVNsaWNlX1R5cGU9cHl0aG9uMzYuUHlTbGljZV9UeXBlIERBVEEKKyAgUHlTb3J0V3JhcHBlcl9UeXBlPXB5dGhvbjM2LlB5U29ydFdyYXBwZXJfVHlwZSBEQVRBCisgIFB5U3RhdGVfRmluZE1vZHVsZT1weXRob24zNi5QeVN0YXRlX0ZpbmRNb2R1bGUKKyAgUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9BZGRNb2R1bGUKKyAgUHlTdGF0ZV9SZW1vdmVNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9SZW1vdmVNb2R1bGUKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbQorICBQeVN0cnVjdFNlcXVlbmNlX05ldz1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX05ldworICBQeVN0cnVjdFNlcXVlbmNlX05ld1R5cGU9cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlCisgIFB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW0KKyAgUHlTdXBlcl9UeXBlPXB5dGhvbjM2LlB5U3VwZXJfVHlwZSBEQVRBCisgIFB5U3lzX0FkZFdhcm5PcHRpb249cHl0aG9uMzYuUHlTeXNfQWRkV2Fybk9wdGlvbgorICBQeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZT1weXRob24zNi5QeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZQorICBQeVN5c19Gb3JtYXRTdGRlcnI9cHl0aG9uMzYuUHlTeXNfRm9ybWF0U3RkZXJyCisgIFB5U3lzX0Zvcm1hdFN0ZG91dD1weXRob24zNi5QeVN5c19Gb3JtYXRTdGRvdXQKKyAgUHlTeXNfR2V0T2JqZWN0PXB5dGhvbjM2LlB5U3lzX0dldE9iamVjdAorICBQeVN5c19IYXNXYXJuT3B0aW9ucz1weXRob24zNi5QeVN5c19IYXNXYXJuT3B0aW9ucworICBQeVN5c19SZXNldFdhcm5PcHRpb25zPXB5dGhvbjM2LlB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMKKyAgUHlTeXNfU2V0QXJndj1weXRob24zNi5QeVN5c19TZXRBcmd2CisgIFB5U3lzX1NldEFyZ3ZFeD1weXRob24zNi5QeVN5c19TZXRBcmd2RXgKKyAgUHlTeXNfU2V0T2JqZWN0PXB5dGhvbjM2LlB5U3lzX1NldE9iamVjdAorICBQeVN5c19TZXRQYXRoPXB5dGhvbjM2LlB5U3lzX1NldFBhdGgKKyAgUHlTeXNfV3JpdGVTdGRlcnI9cHl0aG9uMzYuUHlTeXNfV3JpdGVTdGRlcnIKKyAgUHlTeXNfV3JpdGVTdGRvdXQ9cHl0aG9uMzYuUHlTeXNfV3JpdGVTdGRvdXQKKyAgUHlUaHJlYWRTdGF0ZV9DbGVhcj1weXRob24zNi5QeVRocmVhZFN0YXRlX0NsZWFyCisgIFB5VGhyZWFkU3RhdGVfRGVsZXRlPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfRGVsZXRlCisgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudD1weXRob24zNi5QeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQKKyAgUHlUaHJlYWRTdGF0ZV9HZXQ9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9HZXQKKyAgUHlUaHJlYWRTdGF0ZV9HZXREaWN0PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfR2V0RGljdAorICBQeVRocmVhZFN0YXRlX05ldz1weXRob24zNi5QeVRocmVhZFN0YXRlX05ldworICBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMKKyAgUHlUaHJlYWRTdGF0ZV9Td2FwPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfU3dhcAorICBQeVRyYWNlQmFja19IZXJlPXB5dGhvbjM2LlB5VHJhY2VCYWNrX0hlcmUKKyAgUHlUcmFjZUJhY2tfUHJpbnQ9cHl0aG9uMzYuUHlUcmFjZUJhY2tfUHJpbnQKKyAgUHlUcmFjZUJhY2tfVHlwZT1weXRob24zNi5QeVRyYWNlQmFja19UeXBlIERBVEEKKyAgUHlUdXBsZUl0ZXJfVHlwZT1weXRob24zNi5QeVR1cGxlSXRlcl9UeXBlIERBVEEKKyAgUHlUdXBsZV9DbGVhckZyZWVMaXN0PXB5dGhvbjM2LlB5VHVwbGVfQ2xlYXJGcmVlTGlzdAorICBQeVR1cGxlX0dldEl0ZW09cHl0aG9uMzYuUHlUdXBsZV9HZXRJdGVtCisgIFB5VHVwbGVfR2V0U2xpY2U9cHl0aG9uMzYuUHlUdXBsZV9HZXRTbGljZQorICBQeVR1cGxlX05ldz1weXRob24zNi5QeVR1cGxlX05ldworICBQeVR1cGxlX1BhY2s9cHl0aG9uMzYuUHlUdXBsZV9QYWNrCisgIFB5VHVwbGVfU2V0SXRlbT1weXRob24zNi5QeVR1cGxlX1NldEl0ZW0KKyAgUHlUdXBsZV9TaXplPXB5dGhvbjM2LlB5VHVwbGVfU2l6ZQorICBQeVR1cGxlX1R5cGU9cHl0aG9uMzYuUHlUdXBsZV9UeXBlIERBVEEKKyAgUHlUeXBlX0NsZWFyQ2FjaGU9cHl0aG9uMzYuUHlUeXBlX0NsZWFyQ2FjaGUKKyAgUHlUeXBlX0Zyb21TcGVjPXB5dGhvbjM2LlB5VHlwZV9Gcm9tU3BlYworICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXM9cHl0aG9uMzYuUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzCisgIFB5VHlwZV9HZW5lcmljQWxsb2M9cHl0aG9uMzYuUHlUeXBlX0dlbmVyaWNBbGxvYworICBQeVR5cGVfR2VuZXJpY05ldz1weXRob24zNi5QeVR5cGVfR2VuZXJpY05ldworICBQeVR5cGVfR2V0RmxhZ3M9cHl0aG9uMzYuUHlUeXBlX0dldEZsYWdzCisgIFB5VHlwZV9HZXRTbG90PXB5dGhvbjM2LlB5VHlwZV9HZXRTbG90CisgIFB5VHlwZV9Jc1N1YnR5cGU9cHl0aG9uMzYuUHlUeXBlX0lzU3VidHlwZQorICBQeVR5cGVfTW9kaWZpZWQ9cHl0aG9uMzYuUHlUeXBlX01vZGlmaWVkCisgIFB5VHlwZV9SZWFkeT1weXRob24zNi5QeVR5cGVfUmVhZHkKKyAgUHlUeXBlX1R5cGU9cHl0aG9uMzYuUHlUeXBlX1R5cGUgREFUQQorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGU9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZworICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlSXRlcl9UeXBlPXB5dGhvbjM2LlB5VW5pY29kZUl0ZXJfVHlwZSBEQVRBCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVfQXBwZW5kPXB5dGhvbjM2LlB5VW5pY29kZV9BcHBlbmQKKyAgUHlVbmljb2RlX0FwcGVuZEFuZERlbD1weXRob24zNi5QeVVuaWNvZGVfQXBwZW5kQW5kRGVsCisgIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nCisgIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZworICBQeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGUKKyAgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZworICBQeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZT1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZQorICBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nCisgIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZworICBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEYxNlN0cmluZworICBQeVVuaWNvZGVfQXNVVEYzMlN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEYzMlN0cmluZworICBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjhTdHJpbmcKKyAgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nCisgIFB5VW5pY29kZV9Bc1dpZGVDaGFyPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1dpZGVDaGFyCisgIFB5VW5pY29kZV9DbGVhckZyZWVsaXN0PXB5dGhvbjM2LlB5VW5pY29kZV9DbGVhckZyZWVsaXN0CisgIFB5VW5pY29kZV9Db21wYXJlPXB5dGhvbjM2LlB5VW5pY29kZV9Db21wYXJlCisgIFB5VW5pY29kZV9Db25jYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0NvbmNhdAorICBQeVVuaWNvZGVfQ29udGFpbnM9cHl0aG9uMzYuUHlVbmljb2RlX0NvbnRhaW5zCisgIFB5VW5pY29kZV9Db3VudD1weXRob24zNi5QeVVuaWNvZGVfQ291bnQKKyAgUHlVbmljb2RlX0RlY29kZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlCisgIFB5VW5pY29kZV9EZWNvZGVBU0NJST1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlQVNDSUkKKyAgUHlVbmljb2RlX0RlY29kZUNoYXJtYXA9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUNoYXJtYXAKKyAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0CisgIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplCisgIFB5VW5pY29kZV9EZWNvZGVMYXRpbjE9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUxhdGluMQorICBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQorICBQeVVuaWNvZGVfRGVjb2RlVVRGMTY9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjE2CisgIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVVEYzMj1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMzIKKyAgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVURjg9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjgKKyAgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlCisgIFB5VW5pY29kZV9GU0NvbnZlcnRlcj1weXRob24zNi5QeVVuaWNvZGVfRlNDb252ZXJ0ZXIKKyAgUHlVbmljb2RlX0ZTRGVjb2Rlcj1weXRob24zNi5QeVVuaWNvZGVfRlNEZWNvZGVyCisgIFB5VW5pY29kZV9GaW5kPXB5dGhvbjM2LlB5VW5pY29kZV9GaW5kCisgIFB5VW5pY29kZV9Gb3JtYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0Zvcm1hdAorICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Gcm9tRm9ybWF0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRm9ybWF0CisgIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vj1weXRob24zNi5QeVVuaWNvZGVfRnJvbUZvcm1hdFYKKyAgUHlVbmljb2RlX0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21PYmplY3QKKyAgUHlVbmljb2RlX0Zyb21PcmRpbmFsPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tT3JkaW5hbAorICBQeVVuaWNvZGVfRnJvbVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfRnJvbVN0cmluZworICBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplCisgIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXI9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21XaWRlQ2hhcgorICBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcKKyAgUHlVbmljb2RlX0dldFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0dldFNpemUKKyAgUHlVbmljb2RlX0lzSWRlbnRpZmllcj1weXRob24zNi5QeVVuaWNvZGVfSXNJZGVudGlmaWVyCisgIFB5VW5pY29kZV9Kb2luPXB5dGhvbjM2LlB5VW5pY29kZV9Kb2luCisgIFB5VW5pY29kZV9QYXJ0aXRpb249cHl0aG9uMzYuUHlVbmljb2RlX1BhcnRpdGlvbgorICBQeVVuaWNvZGVfUlBhcnRpdGlvbj1weXRob24zNi5QeVVuaWNvZGVfUlBhcnRpdGlvbgorICBQeVVuaWNvZGVfUlNwbGl0PXB5dGhvbjM2LlB5VW5pY29kZV9SU3BsaXQKKyAgUHlVbmljb2RlX1JlcGxhY2U9cHl0aG9uMzYuUHlVbmljb2RlX1JlcGxhY2UKKyAgUHlVbmljb2RlX1Jlc2l6ZT1weXRob24zNi5QeVVuaWNvZGVfUmVzaXplCisgIFB5VW5pY29kZV9SaWNoQ29tcGFyZT1weXRob24zNi5QeVVuaWNvZGVfUmljaENvbXBhcmUKKyAgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nCisgIFB5VW5pY29kZV9TcGxpdD1weXRob24zNi5QeVVuaWNvZGVfU3BsaXQKKyAgUHlVbmljb2RlX1NwbGl0bGluZXM9cHl0aG9uMzYuUHlVbmljb2RlX1NwbGl0bGluZXMKKyAgUHlVbmljb2RlX1RhaWxtYXRjaD1weXRob24zNi5QeVVuaWNvZGVfVGFpbG1hdGNoCisgIFB5VW5pY29kZV9UcmFuc2xhdGU9cHl0aG9uMzYuUHlVbmljb2RlX1RyYW5zbGF0ZQorICBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcD1weXRob24zNi5QeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcAorICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZworICBQeVVuaWNvZGVfRGVjb2RlVVRGNz1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGNworICBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwKKyAgUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdD1weXRob24zNi5QeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0CisgIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nCisgIFB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbD1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWwKKyAgUHlVbmljb2RlX0ludGVybkluUGxhY2U9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkluUGxhY2UKKyAgUHlVbmljb2RlX1R5cGU9cHl0aG9uMzYuUHlVbmljb2RlX1R5cGUgREFUQQorICBQeVdlYWtyZWZfR2V0T2JqZWN0PXB5dGhvbjM2LlB5V2Vha3JlZl9HZXRPYmplY3QgREFUQQorICBQeVdlYWtyZWZfTmV3UHJveHk9cHl0aG9uMzYuUHlXZWFrcmVmX05ld1Byb3h5CisgIFB5V2Vha3JlZl9OZXdSZWY9cHl0aG9uMzYuUHlXZWFrcmVmX05ld1JlZgorICBQeVdyYXBwZXJEZXNjcl9UeXBlPXB5dGhvbjM2LlB5V3JhcHBlckRlc2NyX1R5cGUgREFUQQorICBQeVdyYXBwZXJfTmV3PXB5dGhvbjM2LlB5V3JhcHBlcl9OZXcKKyAgUHlaaXBfVHlwZT1weXRob24zNi5QeVppcF9UeXBlIERBVEEKKyAgUHlfQWRkUGVuZGluZ0NhbGw9cHl0aG9uMzYuUHlfQWRkUGVuZGluZ0NhbGwKKyAgUHlfQXRFeGl0PXB5dGhvbjM2LlB5X0F0RXhpdAorICBQeV9CdWlsZFZhbHVlPXB5dGhvbjM2LlB5X0J1aWxkVmFsdWUKKyAgUHlfQ29tcGlsZVN0cmluZz1weXRob24zNi5QeV9Db21waWxlU3RyaW5nCisgIFB5X0RlY1JlZj1weXRob24zNi5QeV9EZWNSZWYKKyAgUHlfRW5kSW50ZXJwcmV0ZXI9cHl0aG9uMzYuUHlfRW5kSW50ZXJwcmV0ZXIKKyAgUHlfRXhpdD1weXRob24zNi5QeV9FeGl0CisgIFB5X0ZhdGFsRXJyb3I9cHl0aG9uMzYuUHlfRmF0YWxFcnJvcgorICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQorICBQeV9GaW5hbGl6ZT1weXRob24zNi5QeV9GaW5hbGl6ZQorICBQeV9GaW5hbGl6ZUV4PXB5dGhvbjM2LlB5X0ZpbmFsaXplRXgKKyAgUHlfR2V0QnVpbGRJbmZvPXB5dGhvbjM2LlB5X0dldEJ1aWxkSW5mbworICBQeV9HZXRDb21waWxlcj1weXRob24zNi5QeV9HZXRDb21waWxlcgorICBQeV9HZXRDb3B5cmlnaHQ9cHl0aG9uMzYuUHlfR2V0Q29weXJpZ2h0CisgIFB5X0dldEV4ZWNQcmVmaXg9cHl0aG9uMzYuUHlfR2V0RXhlY1ByZWZpeAorICBQeV9HZXRQYXRoPXB5dGhvbjM2LlB5X0dldFBhdGgKKyAgUHlfR2V0UGxhdGZvcm09cHl0aG9uMzYuUHlfR2V0UGxhdGZvcm0KKyAgUHlfR2V0UHJlZml4PXB5dGhvbjM2LlB5X0dldFByZWZpeAorICBQeV9HZXRQcm9ncmFtRnVsbFBhdGg9cHl0aG9uMzYuUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoCisgIFB5X0dldFByb2dyYW1OYW1lPXB5dGhvbjM2LlB5X0dldFByb2dyYW1OYW1lCisgIFB5X0dldFB5dGhvbkhvbWU9cHl0aG9uMzYuUHlfR2V0UHl0aG9uSG9tZQorICBQeV9HZXRSZWN1cnNpb25MaW1pdD1weXRob24zNi5QeV9HZXRSZWN1cnNpb25MaW1pdAorICBQeV9HZXRWZXJzaW9uPXB5dGhvbjM2LlB5X0dldFZlcnNpb24KKyAgUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKKyAgUHlfSW5jUmVmPXB5dGhvbjM2LlB5X0luY1JlZgorICBQeV9Jbml0aWFsaXplPXB5dGhvbjM2LlB5X0luaXRpYWxpemUKKyAgUHlfSW5pdGlhbGl6ZUV4PXB5dGhvbjM2LlB5X0luaXRpYWxpemVFeAorICBQeV9Jc0luaXRpYWxpemVkPXB5dGhvbjM2LlB5X0lzSW5pdGlhbGl6ZWQKKyAgUHlfTWFpbj1weXRob24zNi5QeV9NYWluCisgIFB5X01ha2VQZW5kaW5nQ2FsbHM9cHl0aG9uMzYuUHlfTWFrZVBlbmRpbmdDYWxscworICBQeV9OZXdJbnRlcnByZXRlcj1weXRob24zNi5QeV9OZXdJbnRlcnByZXRlcgorICBQeV9SZXByRW50ZXI9cHl0aG9uMzYuUHlfUmVwckVudGVyCisgIFB5X1JlcHJMZWF2ZT1weXRob24zNi5QeV9SZXByTGVhdmUKKyAgUHlfU2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzYuUHlfU2V0UHJvZ3JhbU5hbWUKKyAgUHlfU2V0UHl0aG9uSG9tZT1weXRob24zNi5QeV9TZXRQeXRob25Ib21lCisgIFB5X1NldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2LlB5X1NldFJlY3Vyc2lvbkxpbWl0CisgIFB5X1N5bXRhYmxlU3RyaW5nPXB5dGhvbjM2LlB5X1N5bXRhYmxlU3RyaW5nCisgIFB5X1ZhQnVpbGRWYWx1ZT1weXRob24zNi5QeV9WYUJ1aWxkVmFsdWUKKyAgX1B5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNi5fUHlFcnJfQmFkSW50ZXJuYWxDYWxsCisgIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQ9cHl0aG9uMzYuX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVAorICBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVD1weXRob24zNi5fUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAorICBfUHlPYmplY3RfR0NfTWFsbG9jPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19NYWxsb2MKKyAgX1B5T2JqZWN0X0dDX05ldz1weXRob24zNi5fUHlPYmplY3RfR0NfTmV3CisgIF9QeU9iamVjdF9HQ19OZXdWYXI9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX05ld1ZhcgorICBfUHlPYmplY3RfR0NfUmVzaXplPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19SZXNpemUKKyAgX1B5T2JqZWN0X05ldz1weXRob24zNi5fUHlPYmplY3RfTmV3CisgIF9QeU9iamVjdF9OZXdWYXI9cHl0aG9uMzYuX1B5T2JqZWN0X05ld1ZhcgorICBfUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzYuX1B5U3RhdGVfQWRkTW9kdWxlCisgIF9QeVRocmVhZFN0YXRlX0luaXQ9cHl0aG9uMzYuX1B5VGhyZWFkU3RhdGVfSW5pdAorICBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYz1weXRob24zNi5fUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYworICBfUHlUcmFzaF9kZWxldGVfbGF0ZXI9cHl0aG9uMzYuX1B5VHJhc2hfZGVsZXRlX2xhdGVyIERBVEEKKyAgX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc9cHl0aG9uMzYuX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgREFUQQorICBfUHlUcmFzaF9kZXBvc2l0X29iamVjdD1weXRob24zNi5fUHlUcmFzaF9kZXBvc2l0X29iamVjdAorICBfUHlUcmFzaF9kZXN0cm95X2NoYWluPXB5dGhvbjM2Ll9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4KKyAgX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZT1weXRob24zNi5fUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlIERBVEEKKyAgX1B5V2Vha3JlZl9Qcm94eVR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9Qcm94eVR5cGUgREFUQQorICBfUHlXZWFrcmVmX1JlZlR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9SZWZUeXBlIERBVEEKKyAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKKyAgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgREFUQQorICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsPXB5dGhvbjM2Ll9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwKKyAgX1B5X0RlYWxsb2M9cHl0aG9uMzYuX1B5X0RlYWxsb2MKKyAgX1B5X0VsbGlwc2lzT2JqZWN0PXB5dGhvbjM2Ll9QeV9FbGxpcHNpc09iamVjdCBEQVRBCisgIF9QeV9GYWxzZVN0cnVjdD1weXRob24zNi5fUHlfRmFsc2VTdHJ1Y3QgREFUQQorICBfUHlfTm9uZVN0cnVjdD1weXRob24zNi5fUHlfTm9uZVN0cnVjdCBEQVRBCisgIF9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdD1weXRob24zNi5fUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3QgREFUQQorICBfUHlfU3dhcHBlZE9wPXB5dGhvbjM2Ll9QeV9Td2FwcGVkT3AgREFUQQorICBfUHlfVHJ1ZVN0cnVjdD1weXRob24zNi5fUHlfVHJ1ZVN0cnVjdCBEQVRBCisgIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVAorICBfUHlBcmdfUGFyc2VfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlX1NpemVUCisgIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZVR1cGxlX1NpemVUCisgIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAorICBfUHlBcmdfVmFQYXJzZV9TaXplVD1weXRob24zNi5fUHlBcmdfVmFQYXJzZV9TaXplVAorICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCisgIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9CdWlsZFZhbHVlX1NpemVUCmRpZmYgLS1naXQgYS9QQy90ZXN0cHkucHkgYi9QQy90ZXN0cHkucHkKaW5kZXggNGVmM2Q0Zi4uNzA5ZjM1YyAxMDA2NDQKLS0tIGEvUEMvdGVzdHB5LnB5CisrKyBiL1BDL3Rlc3RweS5weQpAQCAtMjYsNSArMjYsNSBAQAogICAgICAgICAgICAgIyBBZGQgdGhlICJ0ZXN0IiBkaXJlY3RvcnkgdG8gUFlUSE9OUEFUSC4KICAgICAgICAgICAgIHN5cy5wYXRoID0gc3lzLnBhdGggKyBbdGVzdF0KIAotaW1wb3J0IHJlZ3J0ZXN0ICMgU3RhbmRhcmQgUHl0aG9uIHRlc3Rlci4KLXJlZ3J0ZXN0Lm1haW4oKQoraW1wb3J0IGxpYnJlZ3J0ZXN0ICMgU3RhbmRhcmQgUHl0aG9uIHRlc3Rlci4KK2xpYnJlZ3J0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvUENidWlsZC9idWlsZF9wZ28uYmF0IGIvUENidWlsZC9idWlsZF9wZ28uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzJjMzgyLi4wMDAwMDAwCi0tLSBhL1BDYnVpbGQvYnVpbGRfcGdvLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNoby5EZXByZWNhdGlvbldhcm5pbmc6DQotZWNoby4gICAgVGhpcyBzY3JpcHQgaXMgZGVwcmVjYXRlZCwgdXNlIGBidWlsZC5iYXQgLS1wZ29gIGluc3RlYWQuDQotZWNoby4NCi0NCi1jYWxsICIlfmRwMGJ1aWxkLmJhdCIgLS1wZ28gJSoNCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdCBiL1BDYnVpbGQvcHJlcGFyZV9zc2wuYmF0CmluZGV4IDFiZTczZTYuLjJmNDFhZTggMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHJlcGFyZV9zc2wuYmF0CisrKyBiL1BDYnVpbGQvcHJlcGFyZV9zc2wuYmF0CkBAIC0zLDEwICszLDEwIEBACiAgIGlmICIlMSIgRVFVICJEZWJ1ZyIgKA0KICAgICBzaGlmdA0KICAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uX2QuZXhlDQotICAgIGlmIG5vdCBleGlzdCBweXRob24zNV9kLmRsbCBleGl0IDENCisgICAgaWYgbm90IGV4aXN0IHB5dGhvbjM2X2QuZGxsIGV4aXQgMQ0KICAgKSBFTFNFICgNCiAgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbi5leGUNCi0gICAgaWYgbm90IGV4aXN0IHB5dGhvbjM1LmRsbCBleGl0IDENCisgICAgaWYgbm90IGV4aXN0IHB5dGhvbjM2LmRsbCBleGl0IDENCiAgICkNCiApDQogJUhPU1RfUFlUSE9OJSAiJX5kcDBwcmVwYXJlX3NzbC5weSIgJTENCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3JlYWRtZS50eHQgYi9QQ2J1aWxkL3JlYWRtZS50eHQKaW5kZXggZTY4Y2M1Yy4uYmEyNjkyNyAxMDA2NDQKLS0tIGEvUENidWlsZC9yZWFkbWUudHh0CisrKyBiL1BDYnVpbGQvcmVhZG1lLnR4dApAQCAtNDgsNyArNDgsNyBAQAogICAgIFVzZWQgdG8gYnVpbGQgUHl0aG9uIHdpdGggZXh0cmEgZGVidWdnaW5nIGNhcGFiaWxpdGllcywgZXF1aXZhbGVudA0KICAgICB0byB1c2luZyAuL2NvbmZpZ3VyZSAtLXdpdGgtcHlkZWJ1ZyBvbiBVTklYLiAgQWxsIGJpbmFyaWVzIGJ1aWx0DQogICAgIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbiBoYXZlICJfZCIgYWRkZWQgdG8gdGhlaXIgbmFtZToNCi0gICAgcHl0aG9uMzVfZC5kbGwsIHB5dGhvbl9kLmV4ZSwgcGFyc2VyX2QucHlkLCBhbmQgc28gb24uICBCb3RoIHRoZQ0KKyAgICBweXRob24zNl9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gIEJvdGggdGhlDQogICAgIGJ1aWxkIGFuZCBydCAocnVuIHRlc3QpIGJhdGNoIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFjY2VwdCBhIC1kDQogICAgIG9wdGlvbiBmb3IgZGVidWcgYnVpbGRzLiAgSWYgeW91IGFyZSBidWlsZGluZyBQeXRob24gdG8gaGVscCB3aXRoDQogICAgIGRldmVsb3BtZW50IG9mIENQeXRob24sIHlvdSB3aWxsIG1vc3QgbGlrZWx5IHVzZSB0aGlzIGNvbmZpZ3VyYXRpb24uDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9ydC5iYXQgYi9QQ2J1aWxkL3J0LmJhdAppbmRleCAyZDkzYjgwLi43ZDRkMDcxIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3J0LmJhdAorKysgYi9QQ2J1aWxkL3J0LmJhdApAQCAtNDIsNyArNDIsNyBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RhcmdzPSVyZWdydGVzdGFyZ3MlICUxKSAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCiANCiBzZXQgZXhlPSVwcmVmaXglcHl0aG9uJXN1ZmZpeCUuZXhlDQotc2V0IGNtZD0iJWV4ZSUiICVkYXNoTyUgLVdkIC1FIC1iYiAiJXBjYnVpbGQlLi5cbGliXHRlc3RccmVncnRlc3QucHkiICVyZWdydGVzdGFyZ3MlDQorc2V0IGNtZD0iJWV4ZSUiICVkYXNoTyUgLVdkIC1FIC1iYiAtbSB0ZXN0ICVyZWdydGVzdGFyZ3MlDQogaWYgZGVmaW5lZCBxbW9kZSBnb3RvIFFtb2RlDQogDQogZWNobyBEZWxldGluZyAucHljLy5weW8gZmlsZXMgLi4uDQpkaWZmIC0tZ2l0IGEvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvaiBiL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKaW5kZXggMDE0NGZhOS4uOWRiZGM3NyAxMDA2NDQKLS0tIGEvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagorKysgYi9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCkBAIC02Miw3ICs2Miw3IEBACiAgIDwvUHJvcGVydHlHcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXA+CiAgICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtQeV9MSU1JVEVEX0FQST0weDAzMDUwMDAwPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtQeV9MSU1JVEVEX0FQST0weDAzMDYwMDAwPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KICAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPndzb2NrMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CmRpZmYgLS1naXQgYS9QYXJzZXIvUHl0aG9uLmFzZGwgYi9QYXJzZXIvUHl0aG9uLmFzZGwKaW5kZXggY2QwODMyZC4uYWFkZGY2MSAxMDA2NDQKLS0tIGEvUGFyc2VyL1B5dGhvbi5hc2RsCisrKyBiL1BhcnNlci9QeXRob24uYXNkbApAQCAtMSw0ICsxLDggQEAKLS0tIEFTREwncyBzaXggYnVpbHRpbiB0eXBlcyBhcmUgaWRlbnRpZmllciwgaW50LCBzdHJpbmcsIGJ5dGVzLCBvYmplY3QsIHNpbmdsZXRvbgorLS0gQVNETCdzIDcgYnVpbHRpbiB0eXBlcyBhcmU6CistLSBpZGVudGlmaWVyLCBpbnQsIHN0cmluZywgYnl0ZXMsIG9iamVjdCwgc2luZ2xldG9uLCBjb25zdGFudAorLS0KKy0tIHNpbmdsZXRvbjogTm9uZSwgVHJ1ZSBvciBGYWxzZQorLS0gY29uc3RhbnQgY2FuIGJlIE5vbmUsIHdoZXJlYXMgTm9uZSBtZWFucyAibm8gdmFsdWUiIGZvciBvYmplY3QuCiAKIG1vZHVsZSBQeXRob24KIHsKQEAgLTcxLDkgKzc1LDEyIEBACiAgICAgICAgICB8IENhbGwoZXhwciBmdW5jLCBleHByKiBhcmdzLCBrZXl3b3JkKiBrZXl3b3JkcykKICAgICAgICAgIHwgTnVtKG9iamVjdCBuKSAtLSBhIG51bWJlciBhcyBhIFB5T2JqZWN0LgogICAgICAgICAgfCBTdHIoc3RyaW5nIHMpIC0tIG5lZWQgdG8gc3BlY2lmeSByYXcsIHVuaWNvZGUsIGV0Yz8KKyAgICAgICAgIHwgRm9ybWF0dGVkVmFsdWUoZXhwciB2YWx1ZSwgaW50PyBjb252ZXJzaW9uLCBleHByPyBmb3JtYXRfc3BlYykKKyAgICAgICAgIHwgSm9pbmVkU3RyKGV4cHIqIHZhbHVlcykKICAgICAgICAgIHwgQnl0ZXMoYnl0ZXMgcykKICAgICAgICAgIHwgTmFtZUNvbnN0YW50KHNpbmdsZXRvbiB2YWx1ZSkKICAgICAgICAgIHwgRWxsaXBzaXMKKyAgICAgICAgIHwgQ29uc3RhbnQoY29uc3RhbnQgdmFsdWUpCiAKICAgICAgICAgIC0tIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBjYW4gYXBwZWFyIGluIGFzc2lnbm1lbnQgY29udGV4dAogICAgICAgICAgfCBBdHRyaWJ1dGUoZXhwciB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHQgY3R4KQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2FzZGwucHkgYi9QYXJzZXIvYXNkbC5weQppbmRleCAxMjFjZGFiLi42MmY1YzE5IDEwMDY0NAotLS0gYS9QYXJzZXIvYXNkbC5weQorKysgYi9QYXJzZXIvYXNkbC5weQpAQCAtMzMsNyArMzMsOCBAQAogIyBTZWUgdGhlIEVCTkYgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSB0byB1bmRlcnN0YW5kIHRoZSBsb2dpY2FsIGNvbm5lY3Rpb24KICMgYmV0d2VlbiB0aGUgdmFyaW91cyBub2RlIHR5cGVzLgogCi1idWlsdGluX3R5cGVzID0geydpZGVudGlmaWVyJywgJ3N0cmluZycsICdieXRlcycsICdpbnQnLCAnb2JqZWN0JywgJ3NpbmdsZXRvbid9CitidWlsdGluX3R5cGVzID0geydpZGVudGlmaWVyJywgJ3N0cmluZycsICdieXRlcycsICdpbnQnLCAnb2JqZWN0JywgJ3NpbmdsZXRvbicsCisgICAgICAgICAgICAgICAgICdjb25zdGFudCd9CiAKIGNsYXNzIEFTVDoKICAgICBkZWYgX19yZXByX18oc2VsZik6CmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbF9jLnB5IGIvUGFyc2VyL2FzZGxfYy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGYzOGMyNTMuLjE3Yzg1MTcKLS0tIGEvUGFyc2VyL2FzZGxfYy5weQorKysgYi9QYXJzZXIvYXNkbF9jLnB5CkBAIC04MzQsNiArODM0LDcgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0KilvOwogfQogI2RlZmluZSBhc3Qyb2JqX3NpbmdsZXRvbiBhc3Qyb2JqX29iamVjdAorI2RlZmluZSBhc3Qyb2JqX2NvbnN0YW50IGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfaWRlbnRpZmllciBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX3N0cmluZyBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2J5dGVzIGFzdDJvYmpfb2JqZWN0CkBAIC04NzEsNiArODcyLDE5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2JqMmFzdF9jb25zdGFudChQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCit7CisgICAgaWYgKG9iaikgeworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChhcmVuYSwgb2JqKSA8IDApIHsKKyAgICAgICAgICAgICpvdXQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIH0KKyAgICAqb3V0ID0gb2JqOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG9iajJhc3RfaWRlbnRpZmllcihQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCiB7CiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopICYmIG9iaiAhPSBQeV9Ob25lKSB7CkBAIC05MDYsNyArOTIwLDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaSA9IChpbnQpUHlMb25nX0FzTG9uZyhvYmopOworICAgIGkgPSBfUHlMb25nX0FzSW50KG9iaik7CiAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIDE7CiAgICAgKm91dCA9IGk7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2VyLmMgYi9QYXJzZXIvcGFyc2VyLmMKaW5kZXggNTZlYzUxNC4uNDEwNzJjNCAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNlci5jCisrKyBiL1BhcnNlci9wYXJzZXIuYwpAQCAtMTQwLDIxICsxNDAsMjAgQEAKICAgICBpbnQgbiA9IGctPmdfbGwubGxfbmxhYmVsczsKIAogICAgIGlmICh0eXBlID09IE5BTUUpIHsKLSAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0cjsKICAgICAgICAgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOwogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7CiAgICAgICAgICAgICBpZiAobC0+bGJfdHlwZSAhPSBOQU1FIHx8IGwtPmxiX3N0ciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgbC0+bGJfc3RyWzBdICE9IHNbMF0gfHwKLSAgICAgICAgICAgICAgICBzdHJjbXAobC0+bGJfc3RyLCBzKSAhPSAwKQorICAgICAgICAgICAgICAgIGwtPmxiX3N0clswXSAhPSBzdHJbMF0gfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAobC0+bGJfc3RyLCBzdHIpICE9IDApCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiAjaWYgMAogICAgICAgICAgICAgLyogTGVhdmluZyB0aGlzIGluIGFzIGFuIGV4YW1wbGUgKi8KICAgICAgICAgICAgIGlmICghKHBzLT5wX2ZsYWdzICYgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSkgewotICAgICAgICAgICAgICAgIGlmIChzWzBdID09ICd3JyAmJiBzdHJjbXAocywgIndpdGgiKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmIChzdHJbMF0gPT0gJ3cnICYmIHN0cmNtcChzdHIsICJ3aXRoIikgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vdCBhIGtleXdvcmQgeWV0ICovCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc1swXSA9PSAnYScgJiYgc3RyY21wKHMsICJhcyIpID09IDApCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyWzBdID09ICdhJyAmJiBzdHJjbXAoc3RyLCAiYXMiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbm90IGEga2V5d29yZCB5ZXQgKi8KICAgICAgICAgICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNldG9rLmMgYi9QYXJzZXIvcGFyc2V0b2suYwppbmRleCA2MjlkZWU1Li5lYmU5NDk1IDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2V0b2suYworKysgYi9QYXJzZXIvcGFyc2V0b2suYwpAQCAtMTYxLDEwICsxNjEsMTAgQEAKIAogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAogI2lmIDAKLXN0YXRpYyBjaGFyIHdpdGhfbXNnW10gPQorc3RhdGljIGNvbnN0IGNoYXIgd2l0aF9tc2dbXSA9CiAiJXM6JWQ6IFdhcm5pbmc6ICd3aXRoJyB3aWxsIGJlY29tZSBhIHJlc2VydmVkIGtleXdvcmQgaW4gUHl0aG9uIDIuNlxuIjsKIAotc3RhdGljIGNoYXIgYXNfbXNnW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYXNfbXNnW10gPQogIiVzOiVkOiBXYXJuaW5nOiAnYXMnIHdpbGwgYmVjb21lIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBQeXRob24gMi42XG4iOwogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW4uYyBiL1BhcnNlci9wZ2VuLmMKaW5kZXggZjMwMzFhZS4uYmUzNWUwMiAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW4uYworKysgYi9QYXJzZXIvcGdlbi5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogI2lmZGVmIFB5X0RFQlVHCiAKLXN0YXRpYyBjaGFyIFJFUU5GTVRbXSA9ICJtZXRhY29tcGlsZTogbGVzcyB0aGFuICVkIGNoaWxkcmVuXG4iOworc3RhdGljIGNvbnN0IGNoYXIgUkVRTkZNVFtdID0gIm1ldGFjb21waWxlOiBsZXNzIHRoYW4gJWQgY2hpbGRyZW5cbiI7CiAKICNkZWZpbmUgUkVRTihpLCBjb3VudCkgZG8geyBcCiAgICAgaWYgKGkgPCBjb3VudCkgeyBcCkBAIC0zNzksNyArMzc5LDcgQEAKIAogLyogRm9yd2FyZCAqLwogc3RhdGljIHZvaWQgcHJpbnRzc2RmYShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlLCBpbnQgbmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNvbnN0IGNoYXIgKm1zZyk7CiBzdGF0aWMgdm9pZCBzaW1wbGlmeShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIHN0YXRpYyB2b2lkIGNvbnZlcnQoZGZhICpkLCBpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIApAQCAtNDk0LDcgKzQ5NCw3IEBACiAKIHN0YXRpYyB2b2lkCiBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLSAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKQorICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjb25zdCBjaGFyICptc2cpCiB7CiAgICAgaW50IGksIGliaXQsIGlhcmM7CiAgICAgc3Nfc3RhdGUgKnl5OwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW5tYWluLmMgYi9QYXJzZXIvcGdlbm1haW4uYwppbmRleCAwZjA1NWQ2Li5kNWExM2ZlIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbm1haW4uYworKysgYi9QYXJzZXIvcGdlbm1haW4uYwpAQCAtMjcsNyArMjcsNyBAQAogaW50IFB5X0lnbm9yZUVudmlyb25tZW50RmxhZzsKIAogLyogRm9yd2FyZCAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSk7CitncmFtbWFyICpnZXRncmFtbWFyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIAogdm9pZCBQeV9FeGl0KGludCkgX1B5X05PX1JFVFVSTjsKIApAQCAtMzcsNiArMzcsMTQgQEAKICAgICBleGl0KHN0cyk7CiB9CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorLyogRnVuY3Rpb25zIG5lZWRlZCBieSBvYm1hbGxvYy5jICovCitpbnQgUHlHSUxTdGF0ZV9DaGVjayh2b2lkKQoreyByZXR1cm4gMTsgfQordm9pZCBfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cikKK3t9CisjZW5kaWYKKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKQEAgLTc2LDcgKzg0LDcgQEAKIH0KIAogZ3JhbW1hciAqCi1nZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQorZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBGSUxFICpmcDsKICAgICBub2RlICpuOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IDE4NGZmZTcuLjkwYTgyNzAgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTIwMiw4ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfbm9ybWFsX25hbWUoY29uc3QgY2hhciAqcykgIC8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLwogewogICAgIGNoYXIgYnVmWzEzXTsKICAgICBpbnQgaTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7CiAgICAgICAgICAgICAgICAgY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbiwgdG9rKTsKLSAgICAgICAgICAgICAgICBjaGFyKiBxOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHE7CiAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwpAQCAtMTQ3NSwxNyArMTQ3NSwxOSBAQAogICAgIG5vbmFzY2lpID0gMDsKICAgICBpZiAoaXNfcG90ZW50aWFsX2lkZW50aWZpZXJfc3RhcnQoYykpIHsKICAgICAgICAgLyogUHJvY2VzcyBiIiIsIHIiIiwgdSIiLCBiciIiIGFuZCByYiIiICovCi0gICAgICAgIGludCBzYXdfYiA9IDAsIHNhd19yID0gMCwgc2F3X3UgPSAwOworICAgICAgICBpbnQgc2F3X2IgPSAwLCBzYXdfciA9IDAsIHNhd191ID0gMCwgc2F3X2YgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCEoc2F3X2IgfHwgc2F3X3UpICYmIChjID09ICdiJyB8fCBjID09ICdCJykpCisgICAgICAgICAgICBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfZikgJiYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSkKICAgICAgICAgICAgICAgICBzYXdfYiA9IDE7CiAgICAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBsaXRlcmFsIHdlIGRvbid0CiAgICAgICAgICAgICAgICB3YW50IHRvIHN1cHBvcnQgaXQgaW4gYXJiaXRyYXJ5IG9yZGVyIGxpa2UgYnl0ZSBsaXRlcmFscy4gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X3IpICYmIChjID09ICd1JyB8fCBjID09ICdVJykpCisgICAgICAgICAgICBlbHNlIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19yIHx8IHNhd19mKSAmJiAoYyA9PSAndScgfHwgYyA9PSAnVScpKQogICAgICAgICAgICAgICAgIHNhd191ID0gMTsKICAgICAgICAgICAgIC8qIHVyIiIgYW5kIHJ1IiIgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X3IgfHwgc2F3X3UpICYmIChjID09ICdyJyB8fCBjID09ICdSJykpCiAgICAgICAgICAgICAgICAgc2F3X3IgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfZiB8fCBzYXdfYiB8fCBzYXdfdSkgJiYgKGMgPT0gJ2YnIHx8IGMgPT0gJ0YnKSkKKyAgICAgICAgICAgICAgICBzYXdfZiA9IDE7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CkBAIC0xNTg1LDEwICsxNTg3LDYgQEAKICAgICAgICAgaWYgKGMgPT0gJzAnKSB7CiAgICAgICAgICAgICAvKiBIZXgsIG9jdGFsIG9yIGJpbmFyeSAtLSBtYXliZS4gKi8KICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJykKLSAgICAgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOwotICAgICAgICAgICAgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotICAgICAgICAgICAgICAgIGdvdG8gaW1hZ2luYXJ5OwogICAgICAgICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CiAKICAgICAgICAgICAgICAgICAvKiBIZXggKi8KQEAgLTE3MzksNyArMTczNyw3IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBlbmRfcXVvdGVfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykKLSAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL3B5dGhvbi5jIGIvUHJvZ3JhbXMvcHl0aG9uLmMKaW5kZXggMzdiMTBiOC4uYTdhZmJjNyAxMDA2NDQKLS0tIGEvUHJvZ3JhbXMvcHl0aG9uLmMKKysrIGIvUHJvZ3JhbXMvcHl0aG9uLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAgICBpbnQgaSwgcmVzOwogICAgIGNoYXIgKm9sZGxvYzsKIAorICAgIC8qIEZvcmNlIG1hbGxvYygpIGFsbG9jYXRvciB0byBib290c3RyYXAgUHl0aG9uICovCisgICAgKHZvaWQpX1B5TWVtX1NldHVwQWxsb2NhdG9ycygibWFsbG9jIik7CisKICAgICBhcmd2X2NvcHkgPSAod2NoYXJfdCAqKilQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIChhcmdjKzEpKTsKICAgICBhcmd2X2NvcHkyID0gKHdjaGFyX3QgKiopUHlNZW1fUmF3TWFsbG9jKHNpemVvZih3Y2hhcl90KikgKiAoYXJnYysxKSk7CiAgICAgaWYgKCFhcmd2X2NvcHkgfHwgIWFyZ3ZfY29weTIpIHsKQEAgLTYyLDcgKzY1LDEzIEBACiAKICAgICBzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2MpOwogICAgIFB5TWVtX1Jhd0ZyZWUob2xkbG9jKTsKKwogICAgIHJlcyA9IFB5X01haW4oYXJnYywgYXJndl9jb3B5KTsKKworICAgIC8qIEZvcmNlIGFnYWluIG1hbGxvYygpIGFsbG9jYXRvciB0byByZWxlYXNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICAgYmVmb3JlIFB5X01haW4oKSAqLworICAgICh2b2lkKV9QeU1lbV9TZXR1cEFsbG9jYXRvcnMoIm1hbGxvYyIpOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weTJbaV0pOwogICAgIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9QeXRob24tYXN0LmMgYi9QeXRob24vUHl0aG9uLWFzdC5jCmluZGV4IGVkZmNiYWQuLjExOTNjN2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9QeXRob24tYXN0LmMKKysrIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwpAQCAtMjg1LDYgKzI4NSwxOCBAQAogc3RhdGljIGNoYXIgKlN0cl9maWVsZHNbXT17CiAgICAgInMiLAogfTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgKkZvcm1hdHRlZFZhbHVlX3R5cGU7CitfUHlfSURFTlRJRklFUihjb252ZXJzaW9uKTsKK19QeV9JREVOVElGSUVSKGZvcm1hdF9zcGVjKTsKK3N0YXRpYyBjaGFyICpGb3JtYXR0ZWRWYWx1ZV9maWVsZHNbXT17CisgICAgInZhbHVlIiwKKyAgICAiY29udmVyc2lvbiIsCisgICAgImZvcm1hdF9zcGVjIiwKK307CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpKb2luZWRTdHJfdHlwZTsKK3N0YXRpYyBjaGFyICpKb2luZWRTdHJfZmllbGRzW109eworICAgICJ2YWx1ZXMiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkJ5dGVzX3R5cGU7CiBzdGF0aWMgY2hhciAqQnl0ZXNfZmllbGRzW109ewogICAgICJzIiwKQEAgLTI5NCw2ICszMDYsMTAgQEAKICAgICAidmFsdWUiLAogfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkVsbGlwc2lzX3R5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpDb25zdGFudF90eXBlOworc3RhdGljIGNoYXIgKkNvbnN0YW50X2ZpZWxkc1tdPXsKKyAgICAidmFsdWUiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkF0dHJpYnV0ZV90eXBlOwogX1B5X0lERU5USUZJRVIoYXR0cik7CiBfUHlfSURFTlRJRklFUihjdHgpOwpAQCAtNjk3LDYgKzcxMyw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopbzsKIH0KICNkZWZpbmUgYXN0Mm9ial9zaW5nbGV0b24gYXN0Mm9ial9vYmplY3QKKyNkZWZpbmUgYXN0Mm9ial9jb25zdGFudCBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2lkZW50aWZpZXIgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9zdHJpbmcgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9ieXRlcyBhc3Qyb2JqX29iamVjdApAQCAtNzM0LDYgKzc1MSwxOSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9iajJhc3RfY29uc3RhbnQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQoreworICAgIGlmIChvYmopIHsKKyAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYXJlbmEsIG9iaikgPCAwKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICB9CisgICAgKm91dCA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBvYmoyYXN0X2lkZW50aWZpZXIoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQogewogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSAmJiBvYmogIT0gUHlfTm9uZSkgewpAQCAtNzY5LDcgKzc5OSw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGkgPSAoaW50KVB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICBpID0gX1B5TG9uZ19Bc0ludChvYmopOwogICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAxOwogICAgICpvdXQgPSBpOwpAQCAtOTE3LDYgKzk0NywxMSBAQAogICAgIGlmICghTnVtX3R5cGUpIHJldHVybiAwOwogICAgIFN0cl90eXBlID0gbWFrZV90eXBlKCJTdHIiLCBleHByX3R5cGUsIFN0cl9maWVsZHMsIDEpOwogICAgIGlmICghU3RyX3R5cGUpIHJldHVybiAwOworICAgIEZvcm1hdHRlZFZhbHVlX3R5cGUgPSBtYWtlX3R5cGUoIkZvcm1hdHRlZFZhbHVlIiwgZXhwcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVkVmFsdWVfZmllbGRzLCAzKTsKKyAgICBpZiAoIUZvcm1hdHRlZFZhbHVlX3R5cGUpIHJldHVybiAwOworICAgIEpvaW5lZFN0cl90eXBlID0gbWFrZV90eXBlKCJKb2luZWRTdHIiLCBleHByX3R5cGUsIEpvaW5lZFN0cl9maWVsZHMsIDEpOworICAgIGlmICghSm9pbmVkU3RyX3R5cGUpIHJldHVybiAwOwogICAgIEJ5dGVzX3R5cGUgPSBtYWtlX3R5cGUoIkJ5dGVzIiwgZXhwcl90eXBlLCBCeXRlc19maWVsZHMsIDEpOwogICAgIGlmICghQnl0ZXNfdHlwZSkgcmV0dXJuIDA7CiAgICAgTmFtZUNvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIk5hbWVDb25zdGFudCIsIGV4cHJfdHlwZSwKQEAgLTkyNCw2ICs5NTksOCBAQAogICAgIGlmICghTmFtZUNvbnN0YW50X3R5cGUpIHJldHVybiAwOwogICAgIEVsbGlwc2lzX3R5cGUgPSBtYWtlX3R5cGUoIkVsbGlwc2lzIiwgZXhwcl90eXBlLCBOVUxMLCAwKTsKICAgICBpZiAoIUVsbGlwc2lzX3R5cGUpIHJldHVybiAwOworICAgIENvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIkNvbnN0YW50IiwgZXhwcl90eXBlLCBDb25zdGFudF9maWVsZHMsIDEpOworICAgIGlmICghQ29uc3RhbnRfdHlwZSkgcmV0dXJuIDA7CiAgICAgQXR0cmlidXRlX3R5cGUgPSBtYWtlX3R5cGUoIkF0dHJpYnV0ZSIsIGV4cHJfdHlwZSwgQXR0cmlidXRlX2ZpZWxkcywgMyk7CiAgICAgaWYgKCFBdHRyaWJ1dGVfdHlwZSkgcmV0dXJuIDA7CiAgICAgU3Vic2NyaXB0X3R5cGUgPSBtYWtlX3R5cGUoIlN1YnNjcmlwdCIsIGV4cHJfdHlwZSwgU3Vic2NyaXB0X2ZpZWxkcywgMyk7CkBAIC0yMDYzLDYgKzIxMDAsNDIgQEAKIH0KIAogZXhwcl90eQorRm9ybWF0dGVkVmFsdWUoZXhwcl90eSB2YWx1ZSwgaW50IGNvbnZlcnNpb24sIGV4cHJfdHkgZm9ybWF0X3NwZWMsIGludCBsaW5lbm8sCisgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgdmFsdWUgaXMgcmVxdWlyZWQgZm9yIEZvcm1hdHRlZFZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEZvcm1hdHRlZFZhbHVlX2tpbmQ7CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSA9IHZhbHVlOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbiA9IGNvbnZlcnNpb247CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyA9IGZvcm1hdF9zcGVjOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQorSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIHAgPSAoZXhwcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gSm9pbmVkU3RyX2tpbmQ7CisgICAgcC0+di5Kb2luZWRTdHIudmFsdWVzID0gdmFsdWVzOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQogQnl0ZXMoYnl0ZXMgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewogICAgIGV4cHJfdHkgcDsKQEAgLTIxMTQsNiArMjE4NywyNSBAQAogfQogCiBleHByX3R5CitDb25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBDb25zdGFudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBDb25zdGFudF9raW5kOworICAgIHAtPnYuQ29uc3RhbnQudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEF0dHJpYnV0ZShleHByX3R5IHZhbHVlLCBpZGVudGlmaWVyIGF0dHIsIGV4cHJfY29udGV4dF90eSBjdHgsIGludCBsaW5lbm8sIGludAogICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewpAQCAtMzE2NCw2ICszMjU2LDM0IEBACiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhGb3JtYXR0ZWRWYWx1ZV90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdmFsdWUsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfaW50KG8tPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbik7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2NvbnZlcnNpb24sIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfZm9ybWF0X3NwZWMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhKb2luZWRTdHJfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2xpc3Qoby0+di5Kb2luZWRTdHIudmFsdWVzLCBhc3Qyb2JqX2V4cHIpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZXMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEJ5dGVzX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC0zMTg2LDYgKzMzMDYsMTUgQEAKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoRWxsaXBzaXNfdHlwZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhDb25zdGFudF90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfY29uc3RhbnQoby0+di5Db25zdGFudC52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQXR0cmlidXRlX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC02MDI1LDYgKzYxNTQsODYgQEAKICAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgIGludCBjb252ZXJzaW9uOworICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworCisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVcIiBtaXNzaW5nIGZyb20gRm9ybWF0dGVkVmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9jb252ZXJzaW9uKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF9jb252ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2ludCh0bXAsICZjb252ZXJzaW9uLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnNpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9mb3JtYXRfc3BlYykpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfZm9ybWF0X3NwZWMpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcih0bXAsICZmb3JtYXRfc3BlYywgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXRfc3BlYyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IEZvcm1hdHRlZFZhbHVlKHZhbHVlLCBjb252ZXJzaW9uLCBmb3JtYXRfc3BlYywgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgYXJlbmEpOworICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilKb2luZWRTdHJfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGFzZGxfc2VxKiB2YWx1ZXM7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZXMpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayh0bXApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkpvaW5lZFN0ciBmaWVsZCBcInZhbHVlc1wiIG11c3QgYmUgYSBsaXN0LCBub3QgYSAlLjIwMHMiLCB0bXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gUHlMaXN0X0dFVF9TSVpFKHRtcCk7CisgICAgICAgICAgICB2YWx1ZXMgPSBfUHlfYXNkbF9zZXFfbmV3KGxlbiwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKFB5TGlzdF9HRVRfSVRFTSh0bXAsIGkpLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVCh2YWx1ZXMsIGksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZXNcIiBtaXNzaW5nIGZyb20gSm9pbmVkU3RyIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gSm9pbmVkU3RyKHZhbHVlcywgbGluZW5vLCBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUJ5dGVzX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNjA3OSw2ICs2Mjg4LDI4IEBACiAgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUNvbnN0YW50X3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBjb25zdGFudCB2YWx1ZTsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9jb25zdGFudCh0bXAsICZ2YWx1ZSwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZVwiIG1pc3NpbmcgZnJvbSBDb25zdGFudCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IENvbnN0YW50KHZhbHVlLCBsaW5lbm8sIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNzM0NiwxMiArNzU3NywxOCBAQAogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ2FsbCIsIChQeU9iamVjdCopQ2FsbF90eXBlKSA8IDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTnVtIiwgKFB5T2JqZWN0KilOdW1fdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0ciIsIChQeU9iamVjdCopU3RyX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3JtYXR0ZWRWYWx1ZSIsCisgICAgICAgIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpvaW5lZFN0ciIsIChQeU9iamVjdCopSm9pbmVkU3RyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCeXRlcyIsIChQeU9iamVjdCopQnl0ZXNfdHlwZSkgPCAwKSByZXR1cm4KICAgICAgICAgTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5hbWVDb25zdGFudCIsIChQeU9iamVjdCopTmFtZUNvbnN0YW50X3R5cGUpIDwKICAgICAgICAgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFbGxpcHNpcyIsIChQeU9iamVjdCopRWxsaXBzaXNfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbnN0YW50IiwgKFB5T2JqZWN0KilDb25zdGFudF90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXR0cmlidXRlIiwgKFB5T2JqZWN0KilBdHRyaWJ1dGVfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YnNjcmlwdCIsIChQeU9iamVjdCopU3Vic2NyaXB0X3R5cGUpIDwgMCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9fd2FybmluZ3MuYyBiL1B5dGhvbi9fd2FybmluZ3MuYwppbmRleCA5NzhiYWQxLi40MGY1YzhlIDEwMDY0NAotLS0gYS9QeXRob24vX3dhcm5pbmdzLmMKKysrIGIvUHl0aG9uL193YXJuaW5ncy5jCkBAIC00MCwxMiArNDAsMTEgQEAKICAgIEEgTlVMTCByZXR1cm4gdmFsdWUgY2FuIG1lYW4gZmFsc2Ugb3IgYW4gZXJyb3IuCiAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWdldF93YXJuaW5nc19hdHRyKGNvbnN0IGNoYXIgKmF0dHIpCitnZXRfd2FybmluZ3NfYXR0cihjb25zdCBjaGFyICphdHRyLCBpbnQgdHJ5X2ltcG9ydCkKIHsKICAgICBzdGF0aWMgUHlPYmplY3QgKndhcm5pbmdzX3N0ciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFsbF9tb2R1bGVzOwotICAgIFB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGU7Ci0gICAgaW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlLCAqb2JqOwogCiAgICAgaWYgKHdhcm5pbmdzX3N0ciA9PSBOVUxMKSB7CiAgICAgICAgIHdhcm5pbmdzX3N0ciA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCJ3YXJuaW5ncyIpOwpAQCAtNTMsMTUgKzUyLDM0IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLSAgICByZXN1bHQgPSBQeURpY3RfQ29udGFpbnMoYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSB8fCByZXN1bHQgPT0gMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKLSAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKSkKKyAgICAvKiBkb24ndCB0cnkgdG8gaW1wb3J0IGFmdGVyIHRoZSBzdGFydCBvZiB0aGUgUHl0aG9uIGZpbmFsbGl6YXRpb24gKi8KKyAgICBpZiAodHJ5X2ltcG9ydCAmJiBfUHlfRmluYWxpemluZyA9PSBOVUxMKSB7CisgICAgICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydCh3YXJuaW5nc19zdHIpOworICAgICAgICBpZiAod2FybmluZ3NfbW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHRoZSBDIGltcGxlbWVudGF0aW9uIGlmIHdlIGNhbm5vdCBnZXQKKyAgICAgICAgICAgICAgIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKworICAgICAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKKyAgICAgICAgaWYgKHdhcm5pbmdzX21vZHVsZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgUHlfSU5DUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgfQorCisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cikpIHsKKyAgICAgICAgUHlfREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKTsKKyAgICBQeV9ERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiAKQEAgLTcwLDcgKzg4LDcgQEAKIHsKICAgICBQeU9iamVjdCAqcmVnaXN0cnk7CiAKLSAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiKTsKKyAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiLCAwKTsKICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODcsNyArMTA1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqZGVmYXVsdF9hY3Rpb247CiAKLSAgICBkZWZhdWx0X2FjdGlvbiA9IGdldF93YXJuaW5nc19hdHRyKCJkZWZhdWx0YWN0aW9uIik7CisgICAgZGVmYXVsdF9hY3Rpb24gPSBnZXRfd2FybmluZ3NfYXR0cigiZGVmYXVsdGFjdGlvbiIsIDApOwogICAgIGlmIChkZWZhdWx0X2FjdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExMCw3ICsxMjgsNyBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCAqd2FybmluZ3NfZmlsdGVyczsKIAotICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIpOworICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIsIDApOwogICAgIGlmICh3YXJuaW5nc19maWx0ZXJzID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4Nyw4ICszMDUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotc2hvd193YXJuaW5nKFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKnRleHQsIFB5T2JqZWN0Ci0gICAgICAgICAgICAgICAgKmNhdGVnb3J5LCBQeU9iamVjdCAqc291cmNlbGluZSkKK3Nob3dfd2FybmluZyhQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICp0ZXh0LAorICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUpCiB7CiAgICAgUHlPYmplY3QgKmZfc3RkZXJyOwogICAgIFB5T2JqZWN0ICpuYW1lOwpAQCAtMzU5LDEwICszNzcsNjQgQEAKICAgICBQeUVycl9DbGVhcigpOwogfQogCitzdGF0aWMgaW50CitjYWxsX3Nob3dfd2FybmluZyhQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICp0ZXh0LCBQeU9iamVjdCAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKmxpbmVub19vYmosCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlbGluZSwgUHlPYmplY3QgKnNvdXJjZSkKK3sKKyAgICBQeU9iamVjdCAqc2hvd19mbiwgKm1zZywgKnJlcywgKndhcm5tc2dfY2xzID0gTlVMTDsKKworICAgIC8qIElmIHRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzIHNldCwgdHJ5IHRvIGdldCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorICAgICAgIFRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byBsb2cgdGhlIHRyYWNlYmFjayB3aGVyZSB0aGUgc291cmNlCisgICAgICAgd2FzIGFsbG9jYXRlZCwgd2hlcmVhcyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBkb2VzbnQuICovCisgICAgc2hvd19mbiA9IGdldF93YXJuaW5nc19hdHRyKCJfc2hvd3dhcm5tc2ciLCBzb3VyY2UgIT0gTlVMTCk7CisgICAgaWYgKHNob3dfZm4gPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHNob3dfZm4pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIndhcm5pbmdzLl9zaG93d2Fybm1zZygpIG11c3QgYmUgc2V0IHRvIGEgY2FsbGFibGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB3YXJubXNnX2NscyA9IGdldF93YXJuaW5nc19hdHRyKCJXYXJuaW5nTWVzc2FnZSIsIDApOworICAgIGlmICh3YXJubXNnX2NscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgInVuYWJsZSB0byBnZXQgd2FybmluZ3MuV2FybmluZ01lc3NhZ2UiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtc2cgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHdhcm5tc2dfY2xzLCBtZXNzYWdlLCBjYXRlZ29yeSwKKyAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm9fb2JqLCBQeV9Ob25lLCBQeV9Ob25lLCBzb3VyY2UsCisgICAgICAgICAgICBOVUxMKTsKKyAgICBQeV9ERUNSRUYod2Fybm1zZ19jbHMpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19mbiwgbXNnLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoc2hvd19mbik7CisgICAgUHlfREVDUkVGKG1zZyk7CisKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHNob3dfZm4pOworICAgIHJldHVybiAtMTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5fZXhwbGljaXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKICAgICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLAotICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lKQorICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lLAorICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlKQogewogICAgIFB5T2JqZWN0ICprZXkgPSBOVUxMLCAqdGV4dCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMLCAqbGluZW5vX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKml0ZW0gPSBOVUxMOwpAQCAtNDcwLDMxICs1NDIsOSBAQAogICAgIGlmIChyYyA9PSAxKSAgLyogQWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgbW9kdWxlLiAqLwogICAgICAgICBnb3RvIHJldHVybl9ub25lOwogICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpzaG93X2Z4biA9IGdldF93YXJuaW5nc19hdHRyKCJzaG93d2FybmluZyIpOwotICAgICAgICBpZiAoc2hvd19meG4gPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0KLSAgICAgICAgICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhzaG93X2Z4bikpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxhYmxlIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19meG4sIG1lc3NhZ2UsIGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisgICAgICAgIGlmIChjYWxsX3Nob3dfd2FybmluZyhjYXRlZ29yeSwgdGV4dCwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVub19vYmosIHNvdXJjZWxpbmUsIHNvdXJjZSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KICAgICBlbHNlIC8qIGlmIChyYyA9PSAtMSkgKi8KICAgICAgICAgZ290byBjbGVhbnVwOwpAQCAtNzM4LDcgKzc4OCw4IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCitkb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgICAgIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCAqbW9kdWxlLCAqcmVnaXN0cnksICpyZXM7CiAgICAgaW50IGxpbmVubzsKQEAgLTc0Nyw3ICs3OTgsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNvdXJjZSk7CiAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICAgICBQeV9ERUNSRUYocmVnaXN0cnkpOwogICAgIFB5X0RFQ1JFRihtb2R1bGUpOwpAQCAtNzU3LDI1ICs4MDgsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3YXJuaW5nc193YXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmt3X2xpc3RbXSA9IHsgIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAic3RhY2tsZXZlbCIsIDAgfTsKLSAgICBQeU9iamVjdCAqbWVzc2FnZSwgKmNhdGVnb3J5ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dfbGlzdFtdID0geyJtZXNzYWdlIiwgImNhdGVnb3J5IiwgInN0YWNrbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICptZXNzYWdlLCAqY2F0ZWdvcnkgPSBOVUxMLCAqc291cmNlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9uOndhcm4iLCBrd19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T25POndhcm4iLCBrd19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCwgJnNvdXJjZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgY2F0ZWdvcnkgPSBnZXRfY2F0ZWdvcnkobWVzc2FnZSwgY2F0ZWdvcnkpOwogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJldHVybiBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCwgc291cmNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5pbmdzX3dhcm5fZXhwbGljaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dkX2xpc3RbXSA9IHsibWVzc2FnZSIsICJjYXRlZ29yeSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIiwgInJlZ2lzdHJ5IiwgIm1vZHVsZV9nbG9iYWxzIiwgMH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUiLCAicmVnaXN0cnkiLCAibW9kdWxlX2dsb2JhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwgMH07CiAgICAgUHlPYmplY3QgKm1lc3NhZ2U7CiAgICAgUHlPYmplY3QgKmNhdGVnb3J5OwogICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKQEAgLTc4MywxMCArODM2LDExIEBACiAgICAgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlZ2lzdHJ5ID0gTlVMTDsKICAgICBQeU9iamVjdCAqbW9kdWxlX2dsb2JhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzb3VyY2VvYmogPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PVWl8T09POndhcm5fZXhwbGljaXQiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT1VpfE9PT086d2Fybl9leHBsaWNpdCIsCiAgICAgICAgICAgICAgICAga3dkX2xpc3QsICZtZXNzYWdlLCAmY2F0ZWdvcnksICZmaWxlbmFtZSwgJmxpbmVubywgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAmcmVnaXN0cnksICZtb2R1bGVfZ2xvYmFscykpCisgICAgICAgICAgICAgICAgJnJlZ2lzdHJ5LCAmbW9kdWxlX2dsb2JhbHMsICZzb3VyY2VvYmopKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChtb2R1bGVfZ2xvYmFscykgewpAQCAtODQyLDE0ICs4OTYsMTQgQEAKIAogICAgICAgICAvKiBIYW5kbGUgdGhlIHdhcm5pbmcuICovCiAgICAgICAgIHJldHVybmVkID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIHNvdXJjZV9saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSwgc291cmNlb2JqKTsKICAgICAgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKICAgICAgICAgcmV0dXJuIHJldHVybmVkOwogICAgIH0KIAogIHN0YW5kYXJkX2NhbGw6CiAgICAgcmV0dXJuIHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIE5VTEwsIHNvdXJjZW9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC04NjQsMTQgKzkxOCwxNCBAQAogCiBzdGF0aWMgaW50CiB3YXJuX3VuaWNvZGUoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKLSAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKQorICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKIAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogCi0gICAgcmVzID0gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJlcyA9IGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsLCBzb3VyY2UpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtODc5LDEyICs5MzMsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorX1B5RXJyX1dhcm5Gb3JtYXRWKFB5T2JqZWN0ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKK3sKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBpbnQgcmVzOworCisgICAgbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXMgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsLCBzb3VyY2UpOworICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKKyAgICByZXR1cm4gcmVzOworfQorCiBpbnQKIFB5RXJyX1dhcm5Gb3JtYXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLSAgICBpbnQgcmV0OwotICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIGludCByZXM7CiAgICAgdmFfbGlzdCB2YXJnczsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKQEAgLTg5MiwyNSArOTYyLDM4IEBACiAjZWxzZQogICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgotICAgIG1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICByZXQgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsKTsKLSAgICAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldCA9IC0xOworICAgIHJlcyA9IF9QeUVycl9XYXJuRm9ybWF0VihOVUxMLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwsIGZvcm1hdCwgdmFyZ3MpOwogICAgIHZhX2VuZCh2YXJncyk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKK1B5RXJyX1Jlc291cmNlV2FybmluZyhQeU9iamVjdCAqc291cmNlLCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIGludCByZXM7CisgICAgdmFfbGlzdCB2YXJnczsKKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCisgICAgcmVzID0gX1B5RXJyX1dhcm5Gb3JtYXRWKHNvdXJjZSwgUHlFeGNfUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19sZXZlbCwgZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK2ludAogUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqdGV4dCwgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKIHsKICAgICBpbnQgcmV0OwogICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodGV4dCk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwpOworICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwsIE5VTEwpOwogICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtOTIxLDcgKzEwMDQsNyBAQAogI3VuZGVmIFB5RXJyX1dhcm4KIAogUHlBUElfRlVOQyhpbnQpCi1QeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqdGV4dCkKK1B5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjb25zdCBjaGFyICp0ZXh0KQogewogICAgIHJldHVybiBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIHRleHQsIDEpOwogfQpAQCAtOTM2LDcgKzEwMTksNyBAQAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwsIE5VTEwpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtMTAwMCw3ICsxMDgzLDcgQEAKICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9hc3QuYyBiL1B5dGhvbi9hc3QuYwppbmRleCA3NzQzYzMxLi5hZDc3MWNmIDEwMDY0NAotLS0gYS9QeXRob24vYXN0LmMKKysrIGIvUHl0aG9uL2FzdC5jCkBAIC0xMzIsNiArMTMyLDUyIEBACiB9CiAKIHN0YXRpYyBpbnQKK3ZhbGlkYXRlX2NvbnN0YW50KFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSB8fCB2YWx1ZSA9PSBQeV9FbGxpcHNpcykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUZsb2F0X0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5Qm9vbF9DaGVjayh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlCeXRlc19DaGVja0V4YWN0KHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHZhbHVlKSB8fCBQeUZyb3plblNldF9DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICBQeU9iamVjdCAqaXQ7CisKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHZhbHVlKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAogdmFsaWRhdGVfZXhwcihleHByX3R5IGV4cCwgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKICAgICBpbnQgY2hlY2tfY3R4ID0gMTsKQEAgLTI0MCw2ICsyODYsMTQgQEAKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIoZXhwLT52LkNhbGwuZnVuYywgTG9hZCkgJiYKICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHJzKGV4cC0+di5DYWxsLmFyZ3MsIExvYWQsIDApICYmCiAgICAgICAgICAgICB2YWxpZGF0ZV9rZXl3b3JkcyhleHAtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGV4cC0+di5Db25zdGFudC52YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBhbiBpbnZhbGlkIHR5cGUgaW4gQ29uc3RhbnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGV4cC0+di5Db25zdGFudC52YWx1ZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSBOdW1fa2luZDogewogICAgICAgICBQeU9iamVjdCAqbiA9IGV4cC0+di5OdW0ubjsKICAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2tFeGFjdChuKSAmJiAhUHlGbG9hdF9DaGVja0V4YWN0KG4pICYmCkBAIC0yNTcsNiArMzExLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQorICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHBycyhleHAtPnYuSm9pbmVkU3RyLnZhbHVlcywgTG9hZCwgMCk7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICBpZiAodmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUsIExvYWQpID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYywgTG9hZCk7CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgQnl0ZXNfa2luZDogewogICAgICAgICBQeU9iamVjdCAqYiA9IGV4cC0+di5CeXRlcy5zOwogICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2tFeGFjdChiKSkgewpAQCAtNTEyLDggKzU3NCw3IEBACiAKIC8qIERhdGEgc3RydWN0dXJlIHVzZWQgaW50ZXJuYWxseSAqLwogc3RydWN0IGNvbXBpbGluZyB7Ci0gICAgY2hhciAqY19lbmNvZGluZzsgLyogc291cmNlIGVuY29kaW5nICovCi0gICAgUHlBcmVuYSAqY19hcmVuYTsgLyogYXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtZW9yeSAqLworICAgIFB5QXJlbmEgKmNfYXJlbmE7IC8qIEFyZW5hIGZvciBhbGxvY2F0aW5nIG1lbW9yeS4gKi8KICAgICBQeU9iamVjdCAqY19maWxlbmFtZTsgLyogZmlsZW5hbWUgKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemU7IC8qIE5vcm1hbGl6YXRpb24gZnVuY3Rpb24gZnJvbSB1bmljb2RlZGF0YS4gKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemVfYXJnczsgLyogTm9ybWFsaXphdGlvbiBhcmd1bWVudCB0dXBsZS4gKi8KQEAgLTUzNSw5ICs1OTYsNyBAQAogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl9jYWxsKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBleHByX3R5KTsKIAogc3RhdGljIFB5T2JqZWN0ICpwYXJzZW51bWJlcihzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpOwotc3RhdGljIFB5T2JqZWN0ICpwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlc21vZGUpOworc3RhdGljIGV4cHJfdHkgcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbik7CiAKICNkZWZpbmUgQ09NUF9HRU5FWFAgICAwCiAjZGVmaW5lIENPTVBfTElTVENPTVAgMQpAQCAtNzAxLDIzICs3NjAsMTEgQEAKICAgICBjLmNfYXJlbmEgPSBhcmVuYTsKICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICBjLmNfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICBjLmNfbm9ybWFsaXplID0gYy5jX25vcm1hbGl6ZV9hcmdzID0gTlVMTDsKLSAgICBpZiAoZmxhZ3MgJiYgZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9TT1VSQ0VfSVNfVVRGOCkgewotICAgICAgICBjLmNfZW5jb2RpbmcgPSAidXRmLTgiOwotICAgICAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0jaWYgMAotICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJlbmNvZGluZyBkZWNsYXJhdGlvbiBpbiBVbmljb2RlIHN0cmluZyIpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIG4gPSBDSElMRChuLCAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0gICAgICAgIGMuY19lbmNvZGluZyA9IFNUUihuKTsKKyAgICBjLmNfbm9ybWFsaXplID0gTlVMTDsKKyAgICBjLmNfbm9ybWFsaXplX2FyZ3MgPSBOVUxMOworCisgICAgaWYgKFRZUEUobikgPT0gZW5jb2RpbmdfZGVjbCkKICAgICAgICAgbiA9IENISUxEKG4sIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBFUCAzMTIwICovCi0gICAgICAgIGMuY19lbmNvZGluZyA9ICJ1dGYtOCI7Ci0gICAgfQogCiAgICAgayA9IDA7CiAgICAgc3dpdGNoIChUWVBFKG4pKSB7CkBAIC04NjQsNyArOTExLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBGT1JCSURERU5bXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRk9SQklEREVOW10gPSB7CiAgICAgIk5vbmUiLAogICAgICJUcnVlIiwKICAgICAiRmFsc2UiLApAQCAtODgxLDcgKzkyOCw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBpZiAoZnVsbF9jaGVja3MpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnA7CisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKICAgICAgICAgZm9yIChwID0gRk9SQklEREVOOyAqcDsgcCsrKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcobmFtZSwgKnApID09IDApIHsKICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImFzc2lnbm1lbnQgdG8ga2V5d29yZCIpOwpAQCAtOTg2LDYgKzEwMzMsOCBAQAogICAgICAgICBjYXNlIE51bV9raW5kOgogICAgICAgICBjYXNlIFN0cl9raW5kOgogICAgICAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJsaXRlcmFsIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5hbWVDb25zdGFudF9raW5kOgpAQCAtMTI1OSwxNiArMTMwOCwyMCBAQAogICAgICAgIGFuZCB2YXJhcmdzbGlzdCAobGFtYmRhIGRlZmluaXRpb24pLgogCiAgICAgICAgcGFyYW1ldGVyczogJygnIFt0eXBlZGFyZ3NsaXN0XSAnKScKLSAgICAgICB0eXBlZGFyZ3NsaXN0OiAoKHRmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gICAgICAgICAgICgnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0ZnBkZWZdCi0gICAgICAgICAgIHwgJyoqJyB0ZnBkZWYpCi0gICAgICAgICAgIHwgdGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQorICAgICAgIHR5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICAgICAgICAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgICAgICB8ICcqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqKicgdGZwZGVmIFsnLCddKQogICAgICAgIHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi0gICAgICAgdmFyYXJnc2xpc3Q6ICgodmZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAgICAgICAgICAgKCcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogIFsnLCcgJyoqJyB2ZnBkZWZdCi0gICAgICAgICAgIHwgJyoqJyB2ZnBkZWYpCi0gICAgICAgICAgIHwgdmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQorICAgICAgIHZhcmFyZ3NsaXN0OiAodmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICAgICAgfCAnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKionIHZmcGRlZiBbJywnXQorICAgICAgICkKICAgICAgICB2ZnBkZWY6IE5BTUUKKwogICAgICovCiAgICAgaW50IGksIGosIGssIG5wb3NhcmdzID0gMCwgbmt3b25seWFyZ3MgPSAwOwogICAgIGludCBucG9zZGVmYXVsdHMgPSAwLCBmb3VuZF9kZWZhdWx0ID0gMDsKQEAgLTEzNzAsNyArMTQyMyw4IEBACiAgICAgICAgICAgICAgICAgaSArPSAyOyAvKiB0aGUgbmFtZSBhbmQgdGhlIGNvbW1hICovCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNUQVI6Ci0gICAgICAgICAgICAgICAgaWYgKGkrMSA+PSBOQ0gobikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSsxID49IE5DSChuKSB8fAorICAgICAgICAgICAgICAgICAgICAoaSsyID09IE5DSChuKSAmJiBUWVBFKENISUxEKG4sIGkrMSkpID09IENPTU1BKSkgewogICAgICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgQ0hJTEQobiwgaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZWQgYXJndW1lbnRzIG11c3QgZm9sbG93IGJhcmUgKiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE5OTMsNyArMjA0Nyw2IEBACiAgICAgICAgfCAnLi4uJyB8ICdOb25lJyB8ICdUcnVlJyB8ICdGYWxzZScKICAgICAqLwogICAgIG5vZGUgKmNoID0gQ0hJTEQobiwgMCk7Ci0gICAgaW50IGJ5dGVzbW9kZSA9IDA7CiAKICAgICBzd2l0Y2ggKFRZUEUoY2gpKSB7CiAgICAgY2FzZSBOQU1FOiB7CkBAIC0yMDE1LDcgKzIwNjgsNyBAQAogICAgICAgICByZXR1cm4gTmFtZShuYW1lLCBMb2FkLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAgICAgfQogICAgIGNhc2UgU1RSSU5HOiB7Ci0gICAgICAgIFB5T2JqZWN0ICpzdHIgPSBwYXJzZXN0cnBsdXMoYywgbiwgJmJ5dGVzbW9kZSk7CisgICAgICAgIGV4cHJfdHkgc3RyID0gcGFyc2VzdHJwbHVzKGMsIG4pOwogICAgICAgICBpZiAoIXN0cikgewogICAgICAgICAgICAgY29uc3QgY2hhciAqZXJydHlwZSA9IE5VTEw7CiAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Vbmljb2RlRXJyb3IpKQpAQCAtMjAzMiw2ICsyMDg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiKCVzKSAlcyIsIGVycnR5cGUsIHMpOwogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZXJyc3RyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXMpIHVua25vd24gZXJyb3IiLCBlcnJ0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sIGJ1Zik7CkBAIC0yMDQxLDE0ICsyMDk1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGMtPmNfYXJlbmEsIHN0cikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlc21vZGUpCi0gICAgICAgICAgICByZXR1cm4gQnl0ZXMoc3RyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTdHIoc3RyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgICAgIHJldHVybiBzdHI7CiAgICAgfQogICAgIGNhc2UgTlVNQkVSOiB7CiAgICAgICAgIFB5T2JqZWN0ICpweW51bSA9IHBhcnNlbnVtYmVyKGMsIFNUUihjaCkpOwpAQCAtMzIwOCwxNCArMzI1NSwxNCBAQAogICAgICAgICAgICAgYWxpYXNfdHkgaW1wb3J0X2FsaWFzID0gYWxpYXNfZm9yX2ltcG9ydF9uYW1lKGMsIG4sIDEpOwogICAgICAgICAgICAgaWYgKCFpbXBvcnRfYWxpYXMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIDAsIGltcG9ydF9hbGlhcyk7CisgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYWxpYXNlcywgMCwgaW1wb3J0X2FsaWFzKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkgKz0gMikgewogICAgICAgICAgICAgICAgIGFsaWFzX3R5IGltcG9ydF9hbGlhcyA9IGFsaWFzX2Zvcl9pbXBvcnRfbmFtZShjLCBDSElMRChuLCBpKSwgMSk7CiAgICAgICAgICAgICAgICAgaWYgKCFpbXBvcnRfYWxpYXMpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYWxpYXNlcywgaSAvIDIsIGltcG9ydF9hbGlhcyk7CisgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIGkgLyAyLCBpbXBvcnRfYWxpYXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtb2QgIT0gTlVMTCkKQEAgLTM5MzUsODIgKzM5ODIsOTMyIEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kZWNvZGVfdW5pY29kZShzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCBpbnQgcmF3bW9kZSwgY29uc3QgY2hhciAqZW5jb2RpbmcpCitkZWNvZGVfdW5pY29kZV93aXRoX2VzY2FwZXMoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikKIHsKICAgICBQeU9iamVjdCAqdiwgKnU7CiAgICAgY2hhciAqYnVmOwogICAgIGNoYXIgKnA7CiAgICAgY29uc3QgY2hhciAqZW5kOwogCi0gICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLSAgICAgICAgdSA9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KLSAgICAgICAgaWYgKGxlbiA+IFBZX1NJWkVfTUFYIC8gNikKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAvKiAiw6QiICgyIGJ5dGVzKSBtYXkgYmVjb21lICJcVTAwMDAwMEU0IiAoMTAgYnl0ZXMpLCBvciAxOjUKLSAgICAgICAgICAgIlzDpCIgKDMgYnl0ZXMpIG1heSBiZWNvbWUgIlx1MDA1Y1xVMDAwMDAwRTQiICgxNiBieXRlcyksIG9yIH4xOjYgKi8KLSAgICAgICAgdSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBsZW4gKiA2KTsKLSAgICAgICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBwID0gYnVmID0gUHlCeXRlc19Bc1N0cmluZyh1KTsKLSAgICAgICAgZW5kID0gcyArIGxlbjsKLSAgICAgICAgd2hpbGUgKHMgPCBlbmQpIHsKLSAgICAgICAgICAgIGlmICgqcyA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICpzKys7Ci0gICAgICAgICAgICAgICAgaWYgKCpzICYgMHg4MCkgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkocCwgInUwMDVjIik7Ci0gICAgICAgICAgICAgICAgICAgIHAgKz0gNTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKnMgJiAweDgwKSB7IC8qIFhYWCBpbmVmZmljaWVudCAqLwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp3OwotICAgICAgICAgICAgICAgIGludCBraW5kOwotICAgICAgICAgICAgICAgIHZvaWQgKmRhdGE7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sIGk7Ci0gICAgICAgICAgICAgICAgdyA9IGRlY29kZV91dGY4KGMsICZzLCBlbmQpOwotICAgICAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHcpOwotICAgICAgICAgICAgICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh3KTsKLSAgICAgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3KTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjaHIgPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFxVJTA4eCIsIGNocik7Ci0gICAgICAgICAgICAgICAgICAgIHAgKz0gMTA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgYXNzZXJ0KHAgLSBidWYgPD0gUHlfU0laRSh1KSk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLworICAgIGlmIChsZW4gPiBQWV9TSVpFX01BWCAvIDYpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qICLDpCIgKDIgYnl0ZXMpIG1heSBiZWNvbWUgIlxVMDAwMDAwRTQiICgxMCBieXRlcyksIG9yIDE6NQorICAgICAgICJcw6QiICgzIGJ5dGVzKSBtYXkgYmVjb21lICJcdTAwNWNcVTAwMDAwMEU0IiAoMTYgYnl0ZXMpLCBvciB+MTo2ICovCisgICAgdSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBsZW4gKiA2KTsKKyAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gYnVmID0gUHlCeXRlc19Bc1N0cmluZyh1KTsKKyAgICBlbmQgPSBzICsgbGVuOworICAgIHdoaWxlIChzIDwgZW5kKSB7CisgICAgICAgIGlmICgqcyA9PSAnXFwnKSB7CisgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgICAgIGlmICgqcyAmIDB4ODApIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkocCwgInUwMDVjIik7CisgICAgICAgICAgICAgICAgcCArPSA1OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGxlbiA9IHAgLSBidWY7Ci0gICAgICAgIHMgPSBidWY7CisgICAgICAgIGlmICgqcyAmIDB4ODApIHsgLyogWFhYIGluZWZmaWNpZW50ICovCisgICAgICAgICAgICBQeU9iamVjdCAqdzsKKyAgICAgICAgICAgIGludCBraW5kOworICAgICAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBpOworICAgICAgICAgICAgdyA9IGRlY29kZV91dGY4KGMsICZzLCBlbmQpOworICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh3KTsKKyAgICAgICAgICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh3KTsKKyAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHcpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlfVUNTNCBjaHIgPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHAsICJcXFUlMDh4IiwgY2hyKTsKKyAgICAgICAgICAgICAgICBwICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU2hvdWxkIGJlIGltcG9zc2libGUgdG8gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIGFzc2VydChwIC0gYnVmIDw9IFB5X1NJWkUodSkpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJhd21vZGUpCi0gICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOwotICAgIGVsc2UKLSAgICAgICAgdiA9IFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCk7CisgICAgbGVuID0gcCAtIGJ1ZjsKKyAgICBzID0gYnVmOworCisgICAgdiA9IFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCk7CiAgICAgUHlfWERFQ1JFRih1KTsKICAgICByZXR1cm4gdjsKIH0KIAotLyogcyBpcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgaW5jbHVkaW5nIHRoZSBicmFja2V0aW5nIHF1b3RlIGNoYXJhY3RlcnMsCi0gKiBhbmQgciAmL29yIGIgcHJlZml4ZXMgKGlmIGFueSksIGFuZCBlbWJlZGRlZCBlc2NhcGUgc2VxdWVuY2VzIChpZiBhbnkpLgotICogcGFyc2VzdHIgcGFyc2VzIGl0LCBhbmQgcmV0dXJucyB0aGUgZGVjb2RlZCBQeXRob24gc3RyaW5nIG9iamVjdC4KLSAqLworLyogQ29tcGlsZSB0aGlzIGV4cHJlc3Npb24gaW4gdG8gYW4gZXhwcl90eS4gV2Uga25vdyB0aGF0IHdlIGNhbgorICAgdGVtcG9yYXJpbHkgbW9kaWZ5IHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGlzIHN0cmluZworICAgKGl0J3MgJ3snKSwgYW5kIHdlIGtub3cgd2UgY2FuIHRlbXBvcmFyaWx5IG1vZGlmeSB0aGUgY2hhcmFjdGVyCisgICBhZnRlciB0aGlzIHN0cmluZyAoaXQgaXMgYSAnfScpLiAgTGV2ZXJhZ2UgdGhpcyB0byBjcmVhdGUgYQorICAgc3ViLXN0cmluZyB3aXRoIGVub3VnaCByb29tIGZvciB1cyB0byBhZGQgcGFyZW5zIGFyb3VuZCB0aGUKKyAgIGV4cHJlc3Npb24uIFRoaXMgaXMgdG8gYWxsb3cgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIG5ld2xpbmVzLCBmb3IKKyAgIGV4YW1wbGUuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19jb21waWxlX2V4cHIoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCBleHByX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBleHByX2VuZCwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKKworeworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBtb2RfdHkgbW9kOworICAgIGNoYXIgKnV0Zl9leHByOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9VQ1M0IGVuZF9jaCA9IC0xOworICAgIGludCBhbGxfd2hpdGVzcGFjZTsKKyAgICBQeU9iamVjdCAqc3ViID0gTlVMTDsKKworICAgIC8qIFdlIG9ubHkgZGVjcmVmIHN1YiBpZiB3ZSBhbGxvY2F0ZWQgaXQgd2l0aCBhIFB5VW5pY29kZV9TdWJzdHJpbmcuCisgICAgICAgZGVjcmVmX3N1YiByZWNvcmRzIHRoYXQuICovCisgICAgaW50IGRlY3JlZl9zdWIgPSAwOworCisgICAgYXNzZXJ0KHN0cik7CisKKyAgICBhc3NlcnQoZXhwcl9zdGFydCA+PSAwICYmIGV4cHJfc3RhcnQgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPj0gMCAmJiBleHByX2VuZCA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworICAgIGFzc2VydChleHByX2VuZCA+PSBleHByX3N0YXJ0KTsKKworICAgIC8qIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIG9uIGVhY2ggc2lkZSBvZiB0aGUKKyAgICAgICBleHByZXNzaW9uIGluc2lkZSB0aGlzIHN0ci4gVGhpcyB3aWxsIGhhdmUgYmVlbiBjYXVnaHQgYmVmb3JlCisgICAgICAgd2UncmUgY2FsbGVkLiAqLworICAgIGFzc2VydChleHByX3N0YXJ0ID49IDEpOworICAgIGFzc2VydChleHByX2VuZCA8PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpLTEpOworCisgICAgLyogSWYgdGhlIHN1YnN0cmluZyBpcyBhbGwgd2hpdGVzcGFjZSwgaXQncyBhbiBlcnJvci4gV2UgbmVlZCB0bworICAgICAgICBjYXRjaCB0aGlzIGhlcmUsIGFuZCBub3Qgd2hlbiB3ZSBjYWxsIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcsCisgICAgICAgIGJlY2F1c2UgdHVybmluZyB0aGUgZXhwcmVzc2lvbiAnJyBpbiB0byAnKCknIHdvdWxkIGdvIGZyb20KKyAgICAgICAgYmVpbmcgaW52YWxpZCB0byB2YWxpZC4gKi8KKyAgICAvKiBOb3RlIHRoYXQgdGhpcyBjb2RlIHNheXMgYW4gZW1wdHkgc3RyaW5nIGlzIGFsbAorICAgICAgICB3aGl0ZXNwYWNlLiBUaGF0J3MgaW1wb3J0YW50LiBUaGVyZSdzIGEgdGVzdCBmb3IgaXQ6IGYne30nLiAqLworICAgIGFsbF93aGl0ZXNwYWNlID0gMTsKKyAgICBmb3IgKGkgPSBleHByX3N0YXJ0OyBpIDwgZXhwcl9lbmQ7IGkrKykgeworICAgICAgICBpZiAoIVB5X1VOSUNPREVfSVNTUEFDRShQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgaSkpKSB7CisgICAgICAgICAgICBhbGxfd2hpdGVzcGFjZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWxsX3doaXRlc3BhY2UpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZW1wdHkgZXhwcmVzc2lvbiBub3QgYWxsb3dlZCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIElmIHRoZSBzdWJzdHJpbmcgd2lsbCBiZSB0aGUgZW50aXJlIHNvdXJjZSBzdHJpbmcsIHdlIGNhbid0IHVzZQorICAgICAgICBQeVVuaWNvZGVfU3Vic3RyaW5nLCBzaW5jZSBpdCB3aWxsIHJldHVybiBhbm90aGVyIHJlZmVyZW5jZSB0bworICAgICAgICBvdXIgb3JpZ2luYWwgc3RyaW5nLiBCZWNhdXNlIHdlJ3JlIG1vZGlmeWluZyB0aGUgc3RyaW5nIGluCisgICAgICAgIHBsYWNlLCB0aGF0J3MgYSBuby1uby4gU28sIGRldGVjdCB0aGF0IGNhc2UgYW5kIGp1c3QgdXNlIG91cgorICAgICAgICBzdHJpbmcgZGlyZWN0bHkuICovCisKKyAgICBpZiAoZXhwcl9zdGFydC0xID09IDAgJiYgZXhwcl9lbmQrMSA9PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgIC8qIElmIHN0ciBpcyB3ZWxsIGZvcm1lZCwgdGhlbiB0aGUgZmlyc3QgYW5kIGxhc3QgY2hhcnMgbXVzdAorICAgICAgICAgICBiZSAneycgYW5kICd9JywgcmVzcGVjdGl2ZWx5LiBCdXQsIGlmIHRoZXJlJ3MgYSBzeW50YXgKKyAgICAgICAgICAgZXJyb3IsIGZvciBleGFtcGxlIGYnezMhJywgdGhlbiB0aGUgbGFzdCBjaGFyIHdvbid0IGJlIGEKKyAgICAgICAgICAgY2xvc2luZyBicmFjZS4gU28sIHJlbWVtYmVyIHRoZSBsYXN0IGNoYXJhY3RlciB3ZSByZWFkIGluCisgICAgICAgICAgIG9yZGVyIGZvciB1cyB0byByZXN0b3JlIGl0LiAqLworICAgICAgICBlbmRfY2ggPSBQeVVuaWNvZGVfUmVhZENoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEpOworICAgICAgICBhc3NlcnQoZW5kX2NoICE9IChQeV9VQ1M0KS0xKTsKKworICAgICAgICAvKiBJbiBhbGwgY2FzZXMsIGhvd2V2ZXIsIHN0YXJ0X2NoIG11c3QgYmUgJ3snLiAqLworICAgICAgICBhc3NlcnQoUHlVbmljb2RlX1JlYWRDaGFyKHN0ciwgMCkgPT0gJ3snKTsKKworICAgICAgICBzdWIgPSBzdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ3JlYXRlIGEgc3Vic3RyaW5nIG9iamVjdC4gSXQgbXVzdCBiZSBhIG5ldyBvYmplY3QsIHdpdGgKKyAgICAgICAgICAgcmVmY291bnQ9PTEsIHNvIHRoYXQgd2UgY2FuIG1vZGlmeSBpdC4gKi8KKyAgICAgICAgc3ViID0gUHlVbmljb2RlX1N1YnN0cmluZyhzdHIsIGV4cHJfc3RhcnQtMSwgZXhwcl9lbmQrMSk7CisgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgYXNzZXJ0KHN1YiAhPSBzdHIpOyAgLyogTWFrZSBzdXJlIGl0J3MgYSBuZXcgc3RyaW5nLiAqLworICAgICAgICBkZWNyZWZfc3ViID0gMTsgICAgICAvKiBSZW1lbWJlciB0byBkZWFsbG9jYXRlIGl0IG9uIGVycm9yLiAqLworICAgIH0KKworICAgIC8qIFB1dCAoKSBhcm91bmQgdGhlIGV4cHJlc3Npb24uICovCisgICAgaWYgKFB5VW5pY29kZV9Xcml0ZUNoYXIoc3ViLCAwLCAnKCcpIDwgMCB8fAorICAgICAgICBQeVVuaWNvZGVfV3JpdGVDaGFyKHN1YiwgZXhwcl9lbmQtZXhwcl9zdGFydCsxLCAnKScpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIC8qIE5vIG5lZWQgdG8gZnJlZSB0aGUgbWVtb3J5IHJldHVybmVkIGhlcmU6IGl0J3MgbWFuYWdlZCBieSB0aGUKKyAgICAgICBzdHJpbmcuICovCisgICAgdXRmX2V4cHIgPSBQeVVuaWNvZGVfQXNVVEY4KHN1Yik7CisgICAgaWYgKCF1dGZfZXhwcikKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGNmLmNmX2ZsYWdzID0gUHlDRl9PTkxZX0FTVDsKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHV0Zl9leHByLCAiPGZzdHJpbmc+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X2V2YWxfaW5wdXQsICZjZiwgYy0+Y19hcmVuYSk7CisgICAgaWYgKCFtb2QpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBpZiAoc3ViICE9IHN0cikKKyAgICAgICAgLyogQ2xlYXIgaW5zdGVhZCBvZiBkZWNyZWYgaW4gY2FzZSB3ZSBldmVyIG1vZGlmeSB0aGlzIGNvZGUgdG8gY2hhbmdlCisgICAgICAgICAgIHRoZSBlcnJvciBoYW5kbGluZzogdGhpcyBpcyBzYWZlc3QgYmVjYXVzZSB0aGUgWERFQ1JFRiB3b24ndCB0cnkKKyAgICAgICAgICAgYW5kIGRlY3JlZiBpdCB3aGVuIGl0J3MgTlVMTC4gKi8KKyAgICAgICAgLyogTm8gbmVlZCB0byByZXN0b3JlIHRoZSBjaGFycyBpbiBzdWIsIHNpbmNlIHdlIGtub3cgaXQncyBnZXR0aW5nCisgICAgICAgICAgIHJlYWR5IHRvIGdldCBkZWxldGVkIChyZWZjb3VudCBtdXN0IGJlIDEsIHNpbmNlIHdlIGdvdCBhIG5ldyBzdHJpbmcKKyAgICAgICAgICAgaW4gUHlVbmljb2RlX1N1YnN0cmluZykuICovCisgICAgICAgIFB5X0NMRUFSKHN1Yik7CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydCghZGVjcmVmX3N1Yik7CisgICAgICAgIGFzc2VydChlbmRfY2ggIT0gKFB5X1VDUzQpLTEpOworICAgICAgICAvKiBSZXN0b3JlIHN0ciwgd2hpY2ggd2UgZWFybGllciBtb2RpZmllZCBkaXJlY3RseS4gKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCAwLCAneycpIDwgMCB8fAorICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgZW5kX2NoKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXR1cm4gbW9kLT52LkV4cHJlc3Npb24uYm9keTsKKworZXJyb3I6CisgICAgLyogT25seSBkZWNyZWYgc3ViIGlmIGl0IHdhcyB0aGUgcmVzdWx0IG9mIGEgY2FsbCB0byBTdWJTdHJpbmcuICovCisgICAgaWYgKGRlY3JlZl9zdWIpCisgICAgICAgIFB5X1hERUNSRUYoc3ViKTsKKworICAgIGlmIChlbmRfY2ggIT0gKFB5X1VDUzQpLTEpIHsKKyAgICAgICAgLyogV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBtb2RpZmllZCBzdHIuIE1ha2Ugc3VyZSB0aGF0J3MgdGhlCisgICAgICAgICAgIGNhc2U6IHN0ciB3aWxsIGJlIGVxdWFsIHRvIHN1Yi4gKi8KKyAgICAgICAgaWYgKHN0ciA9PSBzdWIpIHsKKyAgICAgICAgICAgIC8qIERvbid0IGNoZWNrIHRoZSBlcnJvciwgYmVjYXVzZSB3ZSd2ZSBhbHJlYWR5IHNldCB0aGUKKyAgICAgICAgICAgICAgIGVycm9yIHN0YXRlICh0aGF0J3Mgd2h5IHdlJ3JlIGluICdlcnJvcicsIGFmdGVyCisgICAgICAgICAgICAgICBhbGwpLiAqLworICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIDAsICd7Jyk7CisgICAgICAgICAgICBQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxLCBlbmRfY2gpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuCisKKyAgIFJldHVybiAwIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGl0ZXJhbC4KKworICAgUmV0dXJuIDEgaWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwsIGJ1dCB3ZSB3YW50CisgICB0aGUgY2FsbGVyIHRvIHByb2Nlc3MgdGhlIGxpdGVyYWwgdXAgdG8gdGhpcyBwb2ludC4gVXNlZCBmb3IKKyAgIGRvdWJsZWQgYnJhY2VzLgorKi8KK3N0YXRpYyBpbnQKK2ZzdHJpbmdfZmluZF9saXRlcmFsKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgUHlPYmplY3QgKipsaXRlcmFsLAorICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3Vyc2VfbHZsLCBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIC8qIEdldCBhbnkgbGl0ZXJhbCBzdHJpbmcuIEl0IGVuZHMgd2hlbiB3ZSBoaXQgYW4gdW4tZG91YmxlZCBicmFjZSwgb3IgdGhlCisgICAgICAgZW5kIG9mIHRoZSBzdHJpbmcuICovCisKKyAgICBQeV9zc2l6ZV90IGxpdGVyYWxfc3RhcnQsIGxpdGVyYWxfZW5kOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKworICAgIGFzc2VydCgqbGl0ZXJhbCA9PSBOVUxMKTsKKworICAgIGxpdGVyYWxfc3RhcnQgPSAqb2ZzOworICAgIGZvciAoOyAqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKTsgKm9mcyArPSAxKSB7CisgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgaWYgKGNoID09ICd7JyB8fCBjaCA9PSAnfScpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBkb3VibGVkIGJyYWNlcywgYnV0IG9ubHkgYXQgdGhlIHRvcCBsZXZlbC4gSWYKKyAgICAgICAgICAgICAgIHdlIGNoZWNrZWQgYXQgZXZlcnkgbGV2ZWwsIHRoZW4gZid7MDp7M319JyB3b3VsZCBmYWlsCisgICAgICAgICAgICAgICB3aXRoIHRoZSB0d28gY2xvc2luZyBicmFjZXMuICovCisgICAgICAgICAgICBpZiAocmVjdXJzZV9sdmwgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICgqb2ZzICsgMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgJiYKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyArIDEpID09IGNoKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGdvaW5nIHRvIHRlbGwgdGhlIGNhbGxlciB0aGF0IHRoZSBsaXRlcmFsIGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgaGVyZSwgYnV0IHRoYXQgdGhleSBzaG91bGQgY29udGludWUgc2Nhbm5pbmcuIEJ1dCBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgIHNraXAgb3ZlciB0aGUgc2Vjb25kIGJyYWNlIHdoZW4gd2UgcmVzdW1lIHNjYW5uaW5nLiAqLworICAgICAgICAgICAgICAgICAgICBsaXRlcmFsX2VuZCA9ICpvZnMgKyAxOworICAgICAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBXaGVyZSBhIHNpbmdsZSAneycgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IGV4cHJlc3Npb24sIGEKKyAgICAgICAgICAgICAgICAgICBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkLiAqLworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXZSdyZSBlaXRoZXIgYXQgYSAneycsIHdoaWNoIG1lYW5zIHdlJ3JlIHN0YXJ0aW5nIGFub3RoZXIKKyAgICAgICAgICAgICAgIGV4cHJlc3Npb247IG9yIGEgJ30nLCB3aGljaCBtZWFucyB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAgICAgICAgIGYtc3RyaW5nIChmb3IgYSBuZXN0ZWQgZm9ybWF0X3NwZWMpLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbGl0ZXJhbF9lbmQgPSAqb2ZzOworCisgICAgYXNzZXJ0KCpvZnMgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAneycgfHwKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ30nKTsKK2RvbmU6CisgICAgaWYgKGxpdGVyYWxfc3RhcnQgIT0gbGl0ZXJhbF9lbmQpIHsKKyAgICAgICAgKmxpdGVyYWwgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHN0ciwgbGl0ZXJhbF9zdGFydCwgbGl0ZXJhbF9lbmQpOworICAgICAgICBpZiAoISpsaXRlcmFsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gYmVjYXVzZSBwYXJzaW5nIGlzIHJlY3Vyc2l2ZS4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX3BhcnNlKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKTsKKworLyogUGFyc2UgdGhlIGYtc3RyaW5nIHN0ciwgc3RhcnRpbmcgYXQgb2ZzLiBXZSBrbm93ICpvZnMgc3RhcnRzIGFuCisgICBleHByZXNzaW9uIChzbyBpdCBtdXN0IGJlIGEgJ3snKS4gUmV0dXJucyB0aGUgRm9ybWF0dGVkVmFsdWUgbm9kZSwKKyAgIHdoaWNoIGluY2x1ZGVzIHRoZSBleHByZXNzaW9uLCBjb252ZXJzaW9uIGNoYXJhY3RlciwgYW5kCisgICBmb3JtYXRfc3BlYyBleHByZXNzaW9uLgorCisgICBOb3RlIHRoYXQgSSBkb24ndCBkbyBhIHBlcmZlY3Qgam9iIGhlcmU6IEkgZG9uJ3QgbWFrZSBzdXJlIHRoYXQgYQorICAgY2xvc2luZyBicmFjZSBkb2Vzbid0IG1hdGNoIGFuIG9wZW5pbmcgcGFyZW4sIGZvciBleGFtcGxlLiBJdAorICAgZG9lc24ndCBuZWVkIHRvIGVycm9yIG9uIGFsbCBpbnZhbGlkIGV4cHJlc3Npb25zLCBqdXN0IGNvcnJlY3RseQorICAgZmluZCB0aGUgZW5kIG9mIGFsbCB2YWxpZCBvbmVzLiBBbnkgZXJyb3JzIGluc2lkZSB0aGUgZXhwcmVzc2lvbgorICAgd2lsbCBiZSBjYXVnaHQgd2hlbiB3ZSBwYXJzZSBpdCBsYXRlci4gKi8KK3N0YXRpYyBpbnQKK2ZzdHJpbmdfZmluZF9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgZXhwcl90eSAqZXhwcmVzc2lvbiwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICAvKiBSZXR1cm4gLTEgb24gZXJyb3IsIGVsc2UgMC4gKi8KKworICAgIFB5X3NzaXplX3QgZXhwcl9zdGFydDsKKyAgICBQeV9zc2l6ZV90IGV4cHJfZW5kOworICAgIGV4cHJfdHkgc2ltcGxlX2V4cHJlc3Npb247CisgICAgZXhwcl90eSBmb3JtYXRfc3BlYyA9IE5VTEw7IC8qIE9wdGlvbmFsIGZvcm1hdCBzcGVjaWZpZXIuICovCisgICAgUHlfVUNTNCBjb252ZXJzaW9uID0gLTE7IC8qIFRoZSBjb252ZXJzaW9uIGNoYXIuIC0xIGlmIG5vdCBzcGVjaWZpZWQuICovCisKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHIpOworICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHIpOworCisgICAgLyogMCBpZiB3ZSdyZSBub3QgaW4gYSBzdHJpbmcsIGVsc2UgdGhlIHF1b3RlIGNoYXIgd2UncmUgdHJ5aW5nIHRvCisgICAgICAgbWF0Y2ggKHNpbmdsZSBvciBkb3VibGUgcXVvdGUpLiAqLworICAgIFB5X1VDUzQgcXVvdGVfY2hhciA9IDA7CisKKyAgICAvKiBJZiB3ZSdyZSBpbnNpZGUgYSBzdHJpbmcsIDE9bm9ybWFsLCAzPXRyaXBsZS1xdW90ZWQuICovCisgICAgaW50IHN0cmluZ190eXBlID0gMDsKKworICAgIC8qIEtlZXAgdHJhY2sgb2YgbmVzdGluZyBsZXZlbCBmb3IgYnJhY2VzL3BhcmVucy9icmFja2V0cyBpbgorICAgICAgIGV4cHJlc3Npb25zLiAqLworICAgIFB5X3NzaXplX3QgbmVzdGVkX2RlcHRoID0gMDsKKworICAgIC8qIENhbiBvbmx5IG5lc3Qgb25lIGxldmVsIGRlZXAuICovCisgICAgaWYgKHJlY3Vyc2VfbHZsID49IDIpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwcmVzc2lvbnMgbmVzdGVkIHRvbyBkZWVwbHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFRoZSBmaXJzdCBjaGFyIG11c3QgYmUgYSBsZWZ0IGJyYWNlLCBvciB3ZSB3b3VsZG4ndCBoYXZlIGdvdHRlbgorICAgICAgIGhlcmUuIFNraXAgb3ZlciBpdC4gKi8KKyAgICBhc3NlcnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ3snKTsKKyAgICAqb2ZzICs9IDE7CisKKyAgICBleHByX3N0YXJ0ID0gKm9mczsKKyAgICBmb3IgKDsgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7ICpvZnMgKz0gMSkgeworICAgICAgICBQeV9VQ1M0IGNoOworCisgICAgICAgIC8qIExvb3AgaW52YXJpYW50cy4gKi8KKyAgICAgICAgYXNzZXJ0KG5lc3RlZF9kZXB0aCA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KCpvZnMgPj0gZXhwcl9zdGFydCk7CisgICAgICAgIGlmIChxdW90ZV9jaGFyKQorICAgICAgICAgICAgYXNzZXJ0KHN0cmluZ190eXBlID09IDEgfHwgc3RyaW5nX3R5cGUgPT0gMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydChzdHJpbmdfdHlwZSA9PSAwKTsKKworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpOworICAgICAgICBpZiAocXVvdGVfY2hhcikgeworICAgICAgICAgICAgLyogV2UncmUgaW5zaWRlIGEgc3RyaW5nLiBTZWUgaWYgd2UncmUgYXQgdGhlIGVuZC4gKi8KKyAgICAgICAgICAgIC8qIFRoaXMgY29kZSBuZWVkcyB0byBpbXBsZW1lbnQgdGhlIHNhbWUgbm9uLWVycm9yIGxvZ2ljCisgICAgICAgICAgICAgICBhcyB0b2tfZ2V0IGZyb20gdG9rZW5pemVyLmMsIGF0IHRoZSBsZXR0ZXJfcXVvdGUKKyAgICAgICAgICAgICAgIGxhYmVsLiBUbyBhY3R1YWxseSBzaGFyZSB0aGF0IGNvZGUgd291bGQgYmUgYQorICAgICAgICAgICAgICAgbmlnaHRtYXJlLiBCdXQsIGl0J3MgdW5saWtlbHkgdG8gY2hhbmdlIGFuZCBpcyBzbWFsbCwKKyAgICAgICAgICAgICAgIHNvIGR1cGxpY2F0ZSBpdCBoZXJlLiBOb3RlIHdlIGRvbid0IG5lZWQgdG8gY2F0Y2ggYWxsCisgICAgICAgICAgICAgICBvZiB0aGUgZXJyb3JzLCBzaW5jZSB0aGV5J2xsIGJlIGNhdWdodCB3aGVuIHBhcnNpbmcgdGhlCisgICAgICAgICAgICAgICBleHByZXNzaW9uLiBXZSBqdXN0IG5lZWQgdG8gbWF0Y2ggdGhlIG5vbi1lcnJvcgorICAgICAgICAgICAgICAgY2FzZXMuIFRodXMgd2UgY2FuIGlnbm9yZSBcbiBpbiBzaW5nbGUtcXVvdGVkIHN0cmluZ3MsCisgICAgICAgICAgICAgICBmb3IgZXhhbXBsZS4gT3Igbm9uLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSBxdW90ZV9jaGFyKSB7CisgICAgICAgICAgICAgICAgLyogRG9lcyB0aGlzIG1hdGNoIHRoZSBzdHJpbmdfdHlwZSAoc2luZ2xlIG9yIHRyaXBsZQorICAgICAgICAgICAgICAgICAgIHF1b3RlZCk/ICovCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ190eXBlID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpvZnMrMiA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gY2ggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMikgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGF0IHRoZSBlbmQgb2YgYSB0cmlwbGUgcXVvdGVkIHN0cmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIGEgbm9ybWFsIHN0cmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogV2UncmUgaW5zaWRlIGEgc3RyaW5nLCBhbmQgbm90IGZpbmlzaGVkIHdpdGggdGhlCisgICAgICAgICAgICAgICBzdHJpbmcuIElmIHRoaXMgaXMgYSBiYWNrc2xhc2gsIHNraXAgdGhlIG5leHQgY2hhciAoaXQKKyAgICAgICAgICAgICAgIG1pZ2h0IGJlIGFuIGVuZCBxdW90ZSB0aGF0IG5lZWRzIHNraXBwaW5nKS4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgICAganVzdCBjb25zdW1lIHRoaXMgY2hhcmFjdGVyIG5vcm1hbGx5LiAqLworICAgICAgICAgICAgaWYgKGNoID09ICdcXCcgJiYgKm9mcysxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICAgICAgICAgIC8qIEp1c3Qgc2tpcCB0aGUgbmV4dCBjaGFyLCB3aGF0ZXZlciBpdCBpcy4gKi8KKyAgICAgICAgICAgICAgICAqb2ZzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wnJyB8fCBjaCA9PSAnIicpIHsKKyAgICAgICAgICAgIC8qIElzIHRoaXMgYSB0cmlwbGUgcXVvdGVkIHN0cmluZz8gKi8KKyAgICAgICAgICAgIGlmICgqb2ZzKzIgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSBjaCAmJgorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMikgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDM7CisgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiBhIG5vcm1hbCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogU3RhcnQgbG9va2luZyBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworICAgICAgICAgICAgcXVvdGVfY2hhciA9IGNoOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdbJyB8fCBjaCA9PSAneycgfHwgY2ggPT0gJygnKSB7CisgICAgICAgICAgICBuZXN0ZWRfZGVwdGgrKzsKKyAgICAgICAgfSBlbHNlIGlmIChuZXN0ZWRfZGVwdGggIT0gMCAmJgorICAgICAgICAgICAgICAgICAgIChjaCA9PSAnXScgfHwgY2ggPT0gJ30nIHx8IGNoID09ICcpJykpIHsKKyAgICAgICAgICAgIG5lc3RlZF9kZXB0aC0tOworICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcjJykgeworICAgICAgICAgICAgLyogRXJyb3I6IGNhbid0IGluY2x1ZGUgYSBjb21tZW50IGNoYXJhY3RlciwgaW5zaWRlIHBhcmVucworICAgICAgICAgICAgICAgb3Igbm90LiAqLworICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZyBjYW5ub3QgaW5jbHVkZSAnIyciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChuZXN0ZWRfZGVwdGggPT0gMCAmJgorICAgICAgICAgICAgICAgICAgIChjaCA9PSAnIScgfHwgY2ggPT0gJzonIHx8IGNoID09ICd9JykpIHsKKyAgICAgICAgICAgIC8qIEZpcnN0LCB0ZXN0IGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mICIhPSIuIFNpbmNlICc9JyBpcworICAgICAgICAgICAgICAgbm90IGFuIGFsbG93ZWQgY29udmVyc2lvbiBjaGFyYWN0ZXIsIG5vdGhpbmcgaXMgbG9zdCBpbgorICAgICAgICAgICAgICAgdGhpcyB0ZXN0LiAqLworICAgICAgICAgICAgaWYgKGNoID09ICchJyAmJiAqb2ZzKzEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09ICc9JykKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzbid0IGEgY29udmVyc2lvbiBjaGFyYWN0ZXIsIGp1c3QgY29udGludWUuICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8qIE5vcm1hbCB3YXkgb3V0IG9mIHRoaXMgbG9vcC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSnVzdCBjb25zdW1lIHRoaXMgY2hhciBhbmQgbG9vcCBhcm91bmQuICovCisgICAgICAgIH0KKyAgICB9CisgICAgZXhwcl9lbmQgPSAqb2ZzOworICAgIC8qIElmIHdlIGxlYXZlIHRoaXMgbG9vcCBpbiBhIHN0cmluZyBvciB3aXRoIG1pc21hdGNoZWQgcGFyZW5zLCB3ZQorICAgICAgIGRvbid0IGNhcmUuIFdlJ2xsIGdldCBhIHN5bnRheCBlcnJvciB3aGVuIGNvbXBpbGluZyB0aGUKKyAgICAgICBleHByZXNzaW9uLiBCdXQsIHdlIGNhbiBwcm9kdWNlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UsIHNvCisgICAgICAgbGV0J3MganVzdCBkbyB0aGF0LiovCisgICAgaWYgKHF1b3RlX2NoYXIpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogdW50ZXJtaW5hdGVkIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChuZXN0ZWRfZGVwdGgpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogbWlzbWF0Y2hlZCAnKCcsICd7Jywgb3IgJ1snIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgIC8qIENvbXBpbGUgdGhlIGV4cHJlc3Npb24gYXMgc29vbiBhcyBwb3NzaWJsZSwgc28gd2Ugc2hvdyBlcnJvcnMKKyAgICAgICByZWxhdGVkIHRvIHRoZSBleHByZXNzaW9uIGJlZm9yZSBlcnJvcnMgcmVsYXRlZCB0byB0aGUKKyAgICAgICBjb252ZXJzaW9uIG9yIGZvcm1hdF9zcGVjLiAqLworICAgIHNpbXBsZV9leHByZXNzaW9uID0gZnN0cmluZ19jb21waWxlX2V4cHIoc3RyLCBleHByX3N0YXJ0LCBleHByX2VuZCwgYywgbik7CisgICAgaWYgKCFzaW1wbGVfZXhwcmVzc2lvbikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogQ2hlY2sgZm9yIGEgY29udmVyc2lvbiBjaGFyLCBpZiBwcmVzZW50LiAqLworICAgIGlmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAnIScpIHsKKyAgICAgICAgKm9mcyArPSAxOworICAgICAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAgICAgY29udmVyc2lvbiA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpOworICAgICAgICAqb2ZzICs9IDE7CisKKyAgICAgICAgLyogVmFsaWRhdGUgdGhlIGNvbnZlcnNpb24uICovCisgICAgICAgIGlmICghKGNvbnZlcnNpb24gPT0gJ3MnIHx8IGNvbnZlcnNpb24gPT0gJ3InCisgICAgICAgICAgICAgIHx8IGNvbnZlcnNpb24gPT0gJ2EnKSkgeworICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogaW52YWxpZCBjb252ZXJzaW9uIGNoYXJhY3RlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAncycsICdyJywgb3IgJ2EnIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgdGhlIGZvcm1hdCBzcGVjLCBpZiBwcmVzZW50LiAqLworICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpCisgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworICAgIGlmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAnOicpIHsKKyAgICAgICAgKm9mcyArPSAxOworICAgICAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAgICAgLyogUGFyc2UgdGhlIGZvcm1hdCBzcGVjLiAqLworICAgICAgICBmb3JtYXRfc3BlYyA9IGZzdHJpbmdfcGFyc2Uoc3RyLCBvZnMsIHJlY3Vyc2VfbHZsKzEsIGMsIG4pOworICAgICAgICBpZiAoIWZvcm1hdF9zcGVjKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSAhPSAnfScpCisgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgLyogV2UncmUgYXQgYSByaWdodCBicmFjZS4gQ29uc3VtZSBpdC4gKi8KKyAgICBhc3NlcnQoKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworICAgIGFzc2VydChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAnfScpOworICAgICpvZnMgKz0gMTsKKworICAgIC8qIEFuZCBub3cgY3JlYXRlIHRoZSBGb3JtYXR0ZWRWYWx1ZSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGlzIGVudGlyZQorICAgICAgIGV4cHJlc3Npb24gd2l0aCB0aGUgY29udmVyc2lvbiBhbmQgZm9ybWF0IHNwZWMuICovCisgICAgKmV4cHJlc3Npb24gPSBGb3JtYXR0ZWRWYWx1ZShzaW1wbGVfZXhwcmVzc2lvbiwgKGludCljb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWMsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CisgICAgaWYgKCEqZXhwcmVzc2lvbikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7CisKK3VuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzoKKyAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIik7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBSZXR1cm4gLTEgb24gZXJyb3IuCisKKyAgIFJldHVybiAwIGlmIHdlIGhhdmUgYSBsaXRlcmFsIChwb3NzaWJsZSB6ZXJvIGxlbmd0aCkgYW5kIGFuCisgICBleHByZXNzaW9uICh6ZXJvIGxlbmd0aCBpZiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisKKyAgIFJldHVybiAxIGlmIHdlIGhhdmUgYSBsaXRlcmFsLCBidXQgbm8gZXhwcmVzc2lvbiwgYW5kIHdlIHdhbnQgdGhlCisgICBjYWxsZXIgdG8gY2FsbCB1cyBhZ2Fpbi4gVGhpcyBpcyB1c2VkIHRvIGRlYWwgd2l0aCBkb3VibGVkCisgICBicmFjZXMuCisKKyAgIFdoZW4gY2FsbGVkIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzdHJpbmcgJ2F7e2J7MH1jJywgdGhpcyBmdW5jdGlvbgorICAgd2lsbCByZXR1cm46CisKKyAgIDEuIHRoZSBsaXRlcmFsICdheycgd2l0aCBubyBleHByZXNzaW9uLCBhbmQgYSByZXR1cm4gdmFsdWUKKyAgICAgIG9mIDEuIERlc3BpdGUgdGhlIGZhY3QgdGhhdCB0aGVyZSdzIG5vIGV4cHJlc3Npb24sIHRoZSByZXR1cm4KKyAgICAgIHZhbHVlIG9mIDEgbWVhbnMgd2UncmUgbm90IGZpbmlzaGVkIHlldC4KKworICAgMi4gdGhlIGxpdGVyYWwgJ2InIGFuZCB0aGUgZXhwcmVzc2lvbiAnMCcsIHdpdGggYSByZXR1cm4gdmFsdWUgb2YKKyAgICAgIDAuIFRoZSBmYWN0IHRoYXQgdGhlcmUncyBhbiBleHByZXNzaW9uIG1lYW5zIHdlJ3JlIG5vdCBmaW5pc2hlZC4KKworICAgMy4gbGl0ZXJhbCAnYycgd2l0aCBubyBleHByZXNzaW9uIGFuZCBhIHJldHVybiB2YWx1ZSBvZiAwLiBUaGUKKyAgICAgIGNvbWJpbmF0aW9uIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgMCB3aXRoIG5vIGV4cHJlc3Npb24gbWVhbnMKKyAgICAgIHdlJ3JlIGZpbmlzaGVkLgorKi8KK3N0YXRpYyBpbnQKK2ZzdHJpbmdfZmluZF9saXRlcmFsX2FuZF9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipsaXRlcmFsLCBleHByX3R5ICpleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICBpbnQgcmVzdWx0OworCisgICAgYXNzZXJ0KCpsaXRlcmFsID09IE5VTEwgJiYgKmV4cHJlc3Npb24gPT0gTlVMTCk7CisKKyAgICAvKiBHZXQgYW55IGxpdGVyYWwgc3RyaW5nLiAqLworICAgIHJlc3VsdCA9IGZzdHJpbmdfZmluZF9saXRlcmFsKHN0ciwgb2ZzLCBsaXRlcmFsLCByZWN1cnNlX2x2bCwgYywgbik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBhc3NlcnQocmVzdWx0ID09IDAgfHwgcmVzdWx0ID09IDEpOworCisgICAgaWYgKHJlc3VsdCA9PSAxKQorICAgICAgICAvKiBXZSBoYXZlIGEgbGl0ZXJhbCwgYnV0IGRvbid0IGxvb2sgYXQgdGhlIGV4cHJlc3Npb24uICovCisgICAgICAgIHJldHVybiAxOworCisgICAgYXNzZXJ0KCpvZnMgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSA9PSAnfScpCisgICAgICAgIC8qIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciB0aGUgZW5kIG9mIGEgbmVzdGVkCisgICAgICAgICAgIGYtc3RyaW5nOiBubyBleHByZXNzaW9uLiBUaGUgdG9wLWxldmVsIGVycm9yIGNhc2Ugd2hlcmUgd2UKKyAgICAgICAgICAgZXhwZWN0IHRvIGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBidXQgd2UncmUgYXQgYSAnfScgaXMKKyAgICAgICAgICAgaGFuZGxlZCBsYXRlci4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBXZSBtdXN0IG5vdyBiZSB0aGUgc3RhcnQgb2YgYW4gZXhwcmVzc2lvbiwgb24gYSAneycuICovCisgICAgYXNzZXJ0KCpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSA9PSAneycpOworCisgICAgaWYgKGZzdHJpbmdfZmluZF9leHByKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwgZXhwcmVzc2lvbiwgYywgbikgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIFB5X0NMRUFSKCpsaXRlcmFsKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgRVhQUkxJU1RfTl9DQUNIRUQgIDY0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBJbmNyZW1lbnRhbGx5IGJ1aWxkIGFuIGFycmF5IG9mIGV4cHJfdHksIHNvIGJlIHVzZWQgaW4gYW4KKyAgICAgICBhc2RsX3NlcS4gQ2FjaGUgc29tZSBzbWFsbCBidXQgcmVhc29uYWJseSBzaXplZCBudW1iZXIgb2YKKyAgICAgICBleHByX3R5J3MsIGFuZCB0aGVuIGFmdGVyIHRoYXQgc3RhcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZywKKyAgICAgICBkb3VibGluZyB0aGUgbnVtYmVyIGFsbG9jYXRlZCBlYWNoIHRpbWUuIE5vdGUgdGhhdCB0aGUgZi1zdHJpbmcKKyAgICAgICBmJ3swfWF7MX0nIGNvbnRhaW5zIDMgZXhwcl90eSdzOiAyIEZvcm1hdHRlZFZhbHVlJ3MsIGFuZCBvbmUKKyAgICAgICBTdHIgZm9yIHRoZSBsaXRlcmFsICdhJy4gU28geW91IGFkZCBleHByX3R5J3MgYWJvdXQgdHdpY2UgYXMKKyAgICAgICBmYXN0IGFzIHlvdSBhZGQgZXhyZXNzaW9ucyBpbiBhbiBmLXN0cmluZy4gKi8KKworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOyAgLyogTnVtYmVyIHdlJ3ZlIGFsbG9jYXRlZC4gKi8KKyAgICBQeV9zc2l6ZV90IHNpemU7ICAgICAgIC8qIE51bWJlciB3ZSd2ZSB1c2VkLiAqLworICAgIGV4cHJfdHkgICAgKnA7ICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgbWVtb3J5IHdlJ3JlIGFjdHVhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZy4gV2lsbCBwb2ludCB0byAnZGF0YScgdW50aWwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcuICovCisgICAgZXhwcl90eSAgICBkYXRhW0VYUFJMSVNUX05fQ0FDSEVEXTsKK30gRXhwckxpc3Q7CisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKQorI2Vsc2UKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKEV4cHJMaXN0ICpsKQoreworICAgIC8qIENoZWNrIG91ciBpbnZhcmlhbnRzLiBNYWtlIHN1cmUgdGhpcyBvYmplY3QgaXMgImxpdmUiLCBhbmQKKyAgICAgICBoYXNuJ3QgYmVlbiBkZWFsbG9jYXRlZC4gKi8KKyAgICBhc3NlcnQobC0+c2l6ZSA+PSAwKTsKKyAgICBhc3NlcnQobC0+cCAhPSBOVUxMKTsKKyAgICBpZiAobC0+c2l6ZSA8PSBFWFBSTElTVF9OX0NBQ0hFRCkKKyAgICAgICAgYXNzZXJ0KGwtPmRhdGEgPT0gbC0+cCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK0V4cHJMaXN0X0luaXQoRXhwckxpc3QgKmwpCit7CisgICAgbC0+YWxsb2NhdGVkID0gRVhQUkxJU1RfTl9DQUNIRUQ7CisgICAgbC0+c2l6ZSA9IDA7CisKKyAgICAvKiBVbnRpbCB3ZSBzdGFydCBhbGxvY2F0aW5nIGR5bmFtaWNhbGx5LCBwIHBvaW50cyB0byBkYXRhLiAqLworICAgIGwtPnAgPSBsLT5kYXRhOworCisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKK30KKworc3RhdGljIGludAorRXhwckxpc3RfQXBwZW5kKEV4cHJMaXN0ICpsLCBleHByX3R5IGV4cCkKK3sKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworICAgIGlmIChsLT5zaXplID49IGwtPmFsbG9jYXRlZCkgeworICAgICAgICAvKiBXZSBuZWVkIHRvIGFsbG9jIChvciByZWFsbG9jKSB0aGUgbWVtb3J5LiAqLworICAgICAgICBQeV9zc2l6ZV90IG5ld19zaXplID0gbC0+YWxsb2NhdGVkICogMjsKKworICAgICAgICAvKiBTZWUgaWYgd2UndmUgZXZlciBhbGxvY2F0ZWQgYW55dGhpbmcgZHluYW1pY2FsbHkuICovCisgICAgICAgIGlmIChsLT5wID09IGwtPmRhdGEpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIC8qIFdlJ3JlIHN0aWxsIHVzaW5nIHRoZSBjYWNoZWQgZGF0YS4gU3dpdGNoIHRvCisgICAgICAgICAgICAgICBhbGxvYy1pbmcuICovCisgICAgICAgICAgICBsLT5wID0gUHlNZW1fUmF3TWFsbG9jKHNpemVvZihleHByX3R5KSAqIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghbC0+cCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAvKiBDb3B5IHRoZSBjYWNoZWQgZGF0YSBpbnRvIHRoZSBuZXcgYnVmZmVyLiAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGwtPnNpemU7IGkrKykKKyAgICAgICAgICAgICAgICBsLT5wW2ldID0gbC0+ZGF0YVtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEp1c3QgcmVhbGxvYy4gKi8KKyAgICAgICAgICAgIGV4cHJfdHkgKnRtcCA9IFB5TWVtX1Jhd1JlYWxsb2MobC0+cCwgc2l6ZW9mKGV4cHJfdHkpICogbmV3X3NpemUpOworICAgICAgICAgICAgaWYgKCF0bXApIHsKKyAgICAgICAgICAgICAgICBQeU1lbV9SYXdGcmVlKGwtPnApOworICAgICAgICAgICAgICAgIGwtPnAgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwtPnAgPSB0bXA7CisgICAgICAgIH0KKworICAgICAgICBsLT5hbGxvY2F0ZWQgPSBuZXdfc2l6ZTsKKyAgICAgICAgYXNzZXJ0KGwtPmFsbG9jYXRlZCA9PSAyICogbC0+c2l6ZSk7CisgICAgfQorCisgICAgbC0+cFtsLT5zaXplKytdID0gZXhwOworCisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK0V4cHJMaXN0X0RlYWxsb2MoRXhwckxpc3QgKmwpCit7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKworICAgIC8qIElmIHRoZXJlJ3MgYmVlbiBhbiBlcnJvciwgb3Igd2UndmUgbmV2ZXIgZHluYW1pY2FsbHkgYWxsb2NhdGVkLAorICAgICAgIGRvIG5vdGhpbmcuICovCisgICAgaWYgKCFsLT5wIHx8IGwtPnAgPT0gbC0+ZGF0YSkgeworICAgICAgICAvKiBEbyBub3RoaW5nLiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFdlIGhhdmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiBGcmVlIHRoZSBtZW1vcnkuICovCisgICAgICAgIFB5TWVtX1Jhd0ZyZWUobC0+cCk7CisgICAgfQorICAgIGwtPnAgPSBOVUxMOworICAgIGwtPnNpemUgPSAtMTsKK30KKworc3RhdGljIGFzZGxfc2VxICoKK0V4cHJMaXN0X0ZpbmlzaChFeHByTGlzdCAqbCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgYXNkbF9zZXEgKnNlcTsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgYXNkbF9zZXEgYW5kIGNvcHkgdGhlIGV4cHJlc3Npb25zIGluIHRvIGl0LiAqLworICAgIHNlcSA9IF9QeV9hc2RsX3NlcV9uZXcobC0+c2l6ZSwgYXJlbmEpOworICAgIGlmIChzZXEpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+c2l6ZTsgaSsrKQorICAgICAgICAgICAgYXNkbF9zZXFfU0VUKHNlcSwgaSwgbC0+cFtpXSk7CisgICAgfQorICAgIEV4cHJMaXN0X0RlYWxsb2MobCk7CisgICAgcmV0dXJuIHNlcTsKK30KKworLyogVGhlIEZzdHJpbmdQYXJzZXIgaXMgZGVzaWduZWQgdG8gYWRkIGEgbWl4IG9mIHN0cmluZ3MgYW5kCisgICBmLXN0cmluZ3MsIGFuZCBjb25jYXQgdGhlbSB0b2dldGhlciBhcyBuZWVkZWQuIFVsdGltYXRlbHksIGl0CisgICBnZW5lcmF0ZXMgYW4gZXhwcl90eS4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdCAqbGFzdF9zdHI7CisgICAgRXhwckxpc3QgZXhwcl9saXN0OworfSBGc3RyaW5nUGFyc2VyOworCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSkKKyNlbHNlCitzdGF0aWMgdm9pZAorRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKEZzdHJpbmdQYXJzZXIgKnN0YXRlKQoreworICAgIGlmIChzdGF0ZS0+bGFzdF9zdHIpCisgICAgICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGF0ZS0+bGFzdF9zdHIpKTsKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKCZzdGF0ZS0+ZXhwcl9saXN0KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorRnN0cmluZ1BhcnNlcl9Jbml0KEZzdHJpbmdQYXJzZXIgKnN0YXRlKQoreworICAgIHN0YXRlLT5sYXN0X3N0ciA9IE5VTEw7CisgICAgRXhwckxpc3RfSW5pdCgmc3RhdGUtPmV4cHJfbGlzdCk7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfRGVhbGxvYyhGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworCisgICAgUHlfWERFQ1JFRihzdGF0ZS0+bGFzdF9zdHIpOworICAgIEV4cHJMaXN0X0RlYWxsb2MoJnN0YXRlLT5leHByX2xpc3QpOworfQorCisvKiBNYWtlIGEgU3RyIG5vZGUsIGJ1dCBkZWNyZWYgdGhlIFB5VW5pY29kZSBvYmplY3QgYmVpbmcgYWRkZWQuICovCitzdGF0aWMgZXhwcl90eQorbWFrZV9zdHJfbm9kZV9hbmRfZGVsKFB5T2JqZWN0ICoqc3RyLCBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlKiBuKQoreworICAgIFB5T2JqZWN0ICpzID0gKnN0cjsKKyAgICAqc3RyID0gTlVMTDsKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3QocykpOworICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGMtPmNfYXJlbmEsIHMpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gU3RyKHMsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKK30KKworLyogQWRkIGEgbm9uLWYtc3RyaW5nICh0aGF0IGlzLCBhIHJlZ3VsYXIgbGl0ZXJhbCBzdHJpbmcpLiBzdHIgaXMKKyAgIGRlY3JlZidkLiAqLworc3RhdGljIGludAorRnN0cmluZ1BhcnNlcl9Db25jYXRBbmREZWwoRnN0cmluZ1BhcnNlciAqc3RhdGUsIFB5T2JqZWN0ICpzdHIpCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdHIpKTsKKworICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgIC8qIFdlIGRpZG4ndCBoYXZlIGEgc3RyaW5nIGJlZm9yZSwgc28ganVzdCByZW1lbWJlciB0aGlzIG9uZS4gKi8KKyAgICAgICAgc3RhdGUtPmxhc3Rfc3RyID0gc3RyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENvbmNhdGVuYXRlIHRoaXMgd2l0aCB0aGUgcHJldmlvdXMgc3RyaW5nLiAqLworICAgICAgICBQeVVuaWNvZGVfQXBwZW5kQW5kRGVsKCZzdGF0ZS0+bGFzdF9zdHIsIHN0cik7CisgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworICAgIHJldHVybiAwOworfQorCisvKiBQYXJzZSBhbiBmLXN0cmluZy4gVGhlIGYtc3RyaW5nIGlzIGluIHN0ciwgc3RhcnRpbmcgYXQgb2ZzLCB3aXRoIG5vICdmJworICAgb3IgcXVvdGVzLiBzdHIgaXMgbm90IGRlY3JlZidkLCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIGl0J3MgdXNlZCBlbHNld2hlcmUuCisgICBBbmQgaWYgd2UncmUgb25seSBsb29raW5nIGF0IGEgcGFydCBvZiBhIHN0cmluZywgdGhlbiBkZWNyZWYnaW5nIGlzCisgICBkZWZpbml0ZWx5IG5vdCB0aGUgcmlnaHQgdGhpbmcgdG8gZG8hICovCitzdGF0aWMgaW50CitGc3RyaW5nUGFyc2VyX0NvbmNhdEZzdHJpbmcoRnN0cmluZ1BhcnNlciAqc3RhdGUsIFB5T2JqZWN0ICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqb2ZzLCBpbnQgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworCisgICAgLyogUGFyc2UgdGhlIGYtc3RyaW5nLiAqLworICAgIHdoaWxlICgxKSB7CisgICAgICAgIFB5T2JqZWN0ICpsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgZXhwcl90eSBleHByZXNzaW9uID0gTlVMTDsKKworICAgICAgICAvKiBJZiB0aGVyZSdzIGEgemVybyBsZW5ndGggbGl0ZXJhbCBpbiBmcm9udCBvZiB0aGUKKyAgICAgICAgICAgZXhwcmVzc2lvbiwgbGl0ZXJhbCB3aWxsIGJlIE5VTEwuIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAgdGhlIGYtc3RyaW5nLCBleHByZXNzaW9uIHdpbGwgYmUgTlVMTCAodW5sZXNzIHJlc3VsdCA9PSAxLAorICAgICAgICAgICBzZWUgYmVsb3cpLiAqLworICAgICAgICBpbnQgcmVzdWx0ID0gZnN0cmluZ19maW5kX2xpdGVyYWxfYW5kX2V4cHIoc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdGVyYWwsICZleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgbik7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIC8qIEFkZCB0aGUgbGl0ZXJhbCwgaWYgYW55LiAqLworICAgICAgICBpZiAoIWxpdGVyYWwpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcuIEp1c3QgbGVhdmUgbGFzdF9zdHIgYWxvbmUgKGFuZCBwb3NzaWJseQorICAgICAgICAgICAgICAgTlVMTCkuICovCisgICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAgICAgc3RhdGUtPmxhc3Rfc3RyID0gbGl0ZXJhbDsKKyAgICAgICAgICAgIGxpdGVyYWwgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBhIGxpdGVyYWwsIGNvbmNhdGVuYXRlIGl0LiAqLworICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9HRVRfTEVOR1RIKGxpdGVyYWwpICE9IDApOworICAgICAgICAgICAgaWYgKEZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKHN0YXRlLCBsaXRlcmFsKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KCFzdGF0ZS0+bGFzdF9zdHIgfHwKKyAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0YXRlLT5sYXN0X3N0cikgIT0gMCk7CisKKyAgICAgICAgLyogV2UndmUgZGVhbHQgd2l0aCB0aGUgbGl0ZXJhbCBub3cuIEl0IGNhbid0IGJlIGxlYWtlZCBvbiBmdXJ0aGVyCisgICAgICAgICAgIGVycm9ycy4gKi8KKyAgICAgICAgYXNzZXJ0KGxpdGVyYWwgPT0gTlVMTCk7CisKKyAgICAgICAgLyogU2VlIGlmIHdlIHNob3VsZCBqdXN0IGxvb3AgYXJvdW5kIHRvIGdldCB0aGUgbmV4dCBsaXRlcmFsCisgICAgICAgICAgIGFuZCBleHByZXNzaW9uLCB3aGlsZSBpZ25vcmluZyB0aGUgZXhwcmVzc2lvbiB0aGlzCisgICAgICAgICAgIHRpbWUuIFRoaXMgaXMgdXNlZCBmb3IgdW4tZG91YmxpbmcgYnJhY2VzLCBhcyBhbgorICAgICAgICAgICBvcHRpbWl6YXRpb24uICovCisgICAgICAgIGlmIChyZXN1bHQgPT0gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICghZXhwcmVzc2lvbikKKyAgICAgICAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGlzIGYtc3RyaW5nLiAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogV2Uga25vdyB3ZSBoYXZlIGFuIGV4cHJlc3Npb24uIENvbnZlcnQgYW55IGV4aXN0aW5nIHN0cmluZworICAgICAgICAgICB0byBhIFN0ciBub2RlLiAqLworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAgICAgLyogRG8gbm90aGluZy4gTm8gcHJldmlvdXMgbGl0ZXJhbC4gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENvbnZlcnQgdGhlIGV4aXN0aW5nIGxhc3Rfc3RyIGxpdGVyYWwgdG8gYSBTdHIgbm9kZS4gKi8KKyAgICAgICAgICAgIGV4cHJfdHkgc3RyID0gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgICAgICAgICAgaWYgKCFzdHIgfHwgRXhwckxpc3RfQXBwZW5kKCZzdGF0ZS0+ZXhwcl9saXN0LCBzdHIpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRXhwckxpc3RfQXBwZW5kKCZzdGF0ZS0+ZXhwcl9saXN0LCBleHByZXNzaW9uKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYXNzZXJ0KCpvZnMgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisKKyAgICAvKiBJZiByZWN1cnNlX2x2bCBpcyB6ZXJvLCB0aGVuIHdlIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgICBzdHJpbmcuIE90aGVyd2lzZSwgd2UgbXVzdCBiZSBhdCBhIHJpZ2h0IGJyYWNlLiAqLworCisgICAgaWYgKHJlY3Vyc2VfbHZsID09IDAgJiYgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogdW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJlY3Vyc2VfbHZsICE9IDAgJiYgUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsICpvZnMpICE9ICd9JykgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworICAgIHJldHVybiAwOworfQorCisvKiBDb252ZXJ0IHRoZSBwYXJ0aWFsIHN0YXRlIHJlZmxlY3RlZCBpbiBsYXN0X3N0ciBhbmQgZXhwcl9saXN0IHRvIGFuCisgICBleHByX3R5LiBUaGUgZXhwcl90eSBjYW4gYmUgYSBTdHIsIG9yIGEgSm9pbmVkU3RyLiAqLworc3RhdGljIGV4cHJfdHkKK0ZzdHJpbmdQYXJzZXJfRmluaXNoKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBzdHJ1Y3QgY29tcGlsaW5nICpjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSAqbikKK3sKKyAgICBhc2RsX3NlcSAqc2VxOworCisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIC8qIElmIHdlJ3JlIGp1c3QgYSBjb25zdGFudCBzdHJpbmcgd2l0aCBubyBleHByZXNzaW9ucywgcmV0dXJuCisgICAgICAgdGhhdC4gKi8KKyAgICBpZihzdGF0ZS0+ZXhwcl9saXN0LnNpemUgPT0gMCkgeworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAgICAgLyogQ3JlYXRlIGEgemVybyBsZW5ndGggc3RyaW5nLiAqLworICAgICAgICAgICAgc3RhdGUtPmxhc3Rfc3RyID0gUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgICAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhIFN0ciBub2RlIG91dCBvZiBsYXN0X3N0ciwgaWYgbmVlZGVkLiBJdCB3aWxsIGJlIHRoZQorICAgICAgIGxhc3Qgbm9kZSBpbiBvdXIgZXhwcmVzc2lvbiBsaXN0LiAqLworICAgIGlmIChzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgZXhwcl90eSBzdHIgPSBtYWtlX3N0cl9ub2RlX2FuZF9kZWwoJnN0YXRlLT5sYXN0X3N0ciwgYywgbik7CisgICAgICAgIGlmICghc3RyIHx8IEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgc3RyKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAvKiBUaGlzIGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuICovCisgICAgYXNzZXJ0KHN0YXRlLT5sYXN0X3N0ciA9PSBOVUxMKTsKKworICAgIHNlcSA9IEV4cHJMaXN0X0ZpbmlzaCgmc3RhdGUtPmV4cHJfbGlzdCwgYy0+Y19hcmVuYSk7CisgICAgaWYgKCFzZXEpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBJZiB0aGVyZSdzIG9ubHkgb25lIGV4cHJlc3Npb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlLCB3ZSBuZWVkCisgICAgICAgdG8gam9pbiB0aGVtIHRvZ2V0aGVyLiAqLworICAgIGlmIChzZXEtPnNpemUgPT0gMSkKKyAgICAgICAgcmV0dXJuIHNlcS0+ZWxlbWVudHNbMF07CisKKyAgICByZXR1cm4gSm9pbmVkU3RyKHNlcSwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworCitlcnJvcjoKKyAgICBGc3RyaW5nUGFyc2VyX0RlYWxsb2Moc3RhdGUpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBHaXZlbiBhbiBmLXN0cmluZyAod2l0aCBubyAnZicgb3IgcXVvdGVzKSB0aGF0J3MgaW4gc3RyIHN0YXJ0aW5nIGF0CisgICBvZnMsIHBhcnNlIGl0IGludG8gYW4gZXhwcl90eS4gUmV0dXJuIE5VTEwgb24gZXJyb3IuIERvZXMgbm90CisgICBkZWNyZWYgc3RyLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfcGFyc2UoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqb2ZzLCBpbnQgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgRnN0cmluZ1BhcnNlciBzdGF0ZTsKKworICAgIEZzdHJpbmdQYXJzZXJfSW5pdCgmc3RhdGUpOworICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEZzdHJpbmcoJnN0YXRlLCBzdHIsIG9mcywgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLCBuKSA8IDApIHsKKyAgICAgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKCZzdGF0ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBGc3RyaW5nUGFyc2VyX0ZpbmlzaCgmc3RhdGUsIGMsIG4pOworfQorCisvKiBuIGlzIGEgUHl0aG9uIHN0cmluZyBsaXRlcmFsLCBpbmNsdWRpbmcgdGhlIGJyYWNrZXRpbmcgcXVvdGUKKyAgIGNoYXJhY3RlcnMsIGFuZCByLCBiLCB1LCAmL29yIGYgcHJlZml4ZXMgKGlmIGFueSksIGFuZCBlbWJlZGRlZAorICAgZXNjYXBlIHNlcXVlbmNlcyAoaWYgYW55KS4gcGFyc2VzdHIgcGFyc2VzIGl0LCBhbmQgcmV0dXJucyB0aGUKKyAgIGRlY29kZWQgUHl0aG9uIHN0cmluZyBvYmplY3QuICBJZiB0aGUgc3RyaW5nIGlzIGFuIGYtc3RyaW5nLCBzZXQKKyAgICpmbW9kZSBhbmQgcmV0dXJuIHRoZSB1bnBhcnNlZCBzdHJpbmcgb2JqZWN0LgorKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1wYXJzZXN0cihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSkKK3BhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCAqYnl0ZXNtb2RlLCBpbnQgKmZtb2RlKQogewogICAgIHNpemVfdCBsZW47CiAgICAgY29uc3QgY2hhciAqcyA9IFNUUihuKTsKICAgICBpbnQgcXVvdGUgPSBQeV9DSEFSTUFTSygqcyk7CiAgICAgaW50IHJhd21vZGUgPSAwOwotICAgIGludCBuZWVkX2VuY29kaW5nOwogICAgIGlmIChQeV9JU0FMUEhBKHF1b3RlKSkgewogICAgICAgICB3aGlsZSAoISpieXRlc21vZGUgfHwgIXJhd21vZGUpIHsKICAgICAgICAgICAgIGlmIChxdW90ZSA9PSAnYicgfHwgcXVvdGUgPT0gJ0InKSB7CkBAIC00MDI0LDE1ICs0OTIxLDI0IEBACiAgICAgICAgICAgICAgICAgcXVvdGUgPSAqKytzOwogICAgICAgICAgICAgICAgIHJhd21vZGUgPSAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVvdGUgPT0gJ2YnIHx8IHF1b3RlID09ICdGJykgeworICAgICAgICAgICAgICAgIHF1b3RlID0gKisrczsKKyAgICAgICAgICAgICAgICAqZm1vZGUgPSAxOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKCpmbW9kZSAmJiAqYnl0ZXNtb2RlKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgaWYgKHF1b3RlICE9ICdcJycgJiYgcXVvdGUgIT0gJ1wiJykgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorICAgIC8qIFNraXAgdGhlIGxlYWRpbmcgcXVvdGUgY2hhci4gKi8KICAgICBzKys7CiAgICAgbGVuID0gc3RybGVuKHMpOwogICAgIGlmIChsZW4gPiBJTlRfTUFYKSB7CkBAIC00MDQxLDIyICs0OTQ3LDI2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoc1stLWxlbl0gIT0gcXVvdGUpIHsKKyAgICAgICAgLyogTGFzdCBxdW90ZSBjaGFyIG11c3QgbWF0Y2ggdGhlIGZpcnN0LiAqLwogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChsZW4gPj0gNCAmJiBzWzBdID09IHF1b3RlICYmIHNbMV0gPT0gcXVvdGUpIHsKKyAgICAgICAgLyogQSB0cmlwbGUgcXVvdGVkIHN0cmluZy4gV2UndmUgYWxyZWFkeSBza2lwcGVkIG9uZSBxdW90ZSBhdAorICAgICAgICAgICB0aGUgc3RhcnQgYW5kIG9uZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIE5vdyBza2lwIHRoZQorICAgICAgICAgICB0d28gYXQgdGhlIHN0YXJ0LiAqLwogICAgICAgICBzICs9IDI7CiAgICAgICAgIGxlbiAtPSAyOworICAgICAgICAvKiBBbmQgY2hlY2sgdGhhdCB0aGUgbGFzdCB0d28gbWF0Y2guICovCiAgICAgICAgIGlmIChzWy0tbGVuXSAhPSBxdW90ZSB8fCBzWy0tbGVuXSAhPSBxdW90ZSkgewogICAgICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoISpieXRlc21vZGUgJiYgIXJhd21vZGUpIHsKLSAgICAgICAgcmV0dXJuIGRlY29kZV91bmljb2RlKGMsIHMsIGxlbiwgcmF3bW9kZSwgYy0+Y19lbmNvZGluZyk7Ci0gICAgfQorICAgIC8qIEF2b2lkIGludm9raW5nIGVzY2FwZSBkZWNvZGluZyByb3V0aW5lcyBpZiBwb3NzaWJsZS4gKi8KKyAgICByYXdtb2RlID0gcmF3bW9kZSB8fCBzdHJjaHIocywgJ1xcJykgPT0gTlVMTDsKICAgICBpZiAoKmJ5dGVzbW9kZSkgewotICAgICAgICAvKiBEaXNhbGxvdyBub24tYXNjaWkgY2hhcmFjdGVycyAoYnV0IG5vdCBlc2NhcGVzKSAqLworICAgICAgICAvKiBEaXNhbGxvdyBub24tQVNDSUkgY2hhcmFjdGVycy4gKi8KICAgICAgICAgY29uc3QgY2hhciAqY2g7CiAgICAgICAgIGZvciAoY2ggPSBzOyAqY2g7IGNoKyspIHsKICAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqY2gpID49IDB4ODApIHsKQEAgLTQwNjUsNzEgKzQ5NzUsOTMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBuZWVkX2VuY29kaW5nID0gKCEqYnl0ZXNtb2RlICYmIGMtPmNfZW5jb2RpbmcgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGMtPmNfZW5jb2RpbmcsICJ1dGYtOCIpICE9IDApOwotICAgIGlmIChyYXdtb2RlIHx8IHN0cmNocihzLCAnXFwnKSA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChuZWVkX2VuY29kaW5nKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdiwgKnUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sIE5VTEwpOwotICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCB8fCAhKmJ5dGVzbW9kZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdTsKLSAgICAgICAgICAgIHYgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHUsIGMtPmNfZW5jb2RpbmcsIE5VTEwpOwotICAgICAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0gZWxzZSBpZiAoKmJ5dGVzbW9kZSkgeworICAgICAgICBpZiAocmF3bW9kZSkKICAgICAgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGMtPmNfZW5jb2RpbmcsICJ1dGYtOCIpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHMsIGxlbiwgTlVMTCk7Ci0gICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCwgLyogaWdub3JlZCAqLyAwLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmF3bW9kZSkKKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsKHMsIGxlbiwgTlVMTCwgTlVMTCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZV93aXRoX2VzY2FwZXMoYywgcywgbGVuKTsKICAgICB9Ci0gICAgcmV0dXJuIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfZW5jb2RpbmcgPyBjLT5jX2VuY29kaW5nIDogTlVMTCk7CiB9CiAKLS8qIEJ1aWxkIGEgUHl0aG9uIHN0cmluZyBvYmplY3Qgb3V0IG9mIGEgU1RSSU5HKyBhdG9tLiAgVGhpcyB0YWtlcyBjYXJlIG9mCi0gKiBjb21waWxlLXRpbWUgbGl0ZXJhbCBjYXRlbmF0aW9uLCBjYWxsaW5nIHBhcnNlc3RyKCkgb24gZWFjaCBwaWVjZSwgYW5kCi0gKiBwYXN0aW5nIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyB0b2dldGhlci4KLSAqLwotc3RhdGljIFB5T2JqZWN0ICoKLXBhcnNlc3RycGx1cyhzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSkKKy8qIEFjY2VwdHMgYSBTVFJJTkcrIGF0b20sIGFuZCBwcm9kdWNlcyBhbiBleHByX3R5IG5vZGUuIFJ1biB0aHJvdWdoCisgICBlYWNoIFNUUklORyBhdG9tLCBhbmQgcHJvY2VzcyBpdCBhcyBuZWVkZWQuIEZvciBieXRlcywganVzdAorICAgY29uY2F0ZW5hdGUgdGhlbSB0b2dldGhlciwgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBhIEJ5dGVzIG5vZGUuIEZvcgorICAgbm9ybWFsIHN0cmluZ3MgYW5kIGYtc3RyaW5ncywgY29uY2F0ZW5hdGUgdGhlbSB0b2dldGhlci4gVGhlIHJlc3VsdAorICAgd2lsbCBiZSBhIFN0ciBub2RlIGlmIHRoZXJlIHdlcmUgbm8gZi1zdHJpbmdzOyBhIEZvcm1hdHRlZFZhbHVlCisgICBub2RlIGlmIHRoZXJlJ3MganVzdCBhbiBmLXN0cmluZyAod2l0aCBubyBsZWFkaW5nIG9yIHRyYWlsaW5nCisgICBsaXRlcmFscyksIG9yIGEgSm9pbmVkU3RyIG5vZGUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGYtc3RyaW5ncyBvcgorICAgYW55IGxpdGVyYWxzIGludm9sdmVkLiAqLworc3RhdGljIGV4cHJfdHkKK3BhcnNlc3RycGx1cyhzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQogewotICAgIFB5T2JqZWN0ICp2OworICAgIGludCBieXRlc21vZGUgPSAwOworICAgIFB5T2JqZWN0ICpieXRlc19zdHIgPSBOVUxMOwogICAgIGludCBpOwotICAgIFJFUShDSElMRChuLCAwKSwgU1RSSU5HKTsKLSAgICB2ID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgMCksIGJ5dGVzbW9kZSk7Ci0gICAgaWYgKHYgIT0gTlVMTCkgewotICAgICAgICAvKiBTdHJpbmcgbGl0ZXJhbCBjb25jYXRlbmF0aW9uICovCi0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBOQ0gobik7IGkrKykgewotICAgICAgICAgICAgUHlPYmplY3QgKnM7Ci0gICAgICAgICAgICBpbnQgc3ViYm0gPSAwOwotICAgICAgICAgICAgcyA9IHBhcnNlc3RyKGMsIENISUxEKG4sIGkpLCAmc3ViYm0pOwotICAgICAgICAgICAgaWYgKHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICBpZiAoKmJ5dGVzbW9kZSAhPSBzdWJibSkgewotICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiY2Fubm90IG1peCBieXRlcyBhbmQgbm9uYnl0ZXMgbGl0ZXJhbHMiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgRnN0cmluZ1BhcnNlciBzdGF0ZTsKKyAgICBGc3RyaW5nUGFyc2VyX0luaXQoJnN0YXRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykgeworICAgICAgICBpbnQgdGhpc19ieXRlc21vZGUgPSAwOworICAgICAgICBpbnQgdGhpc19mbW9kZSA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpzOworCisgICAgICAgIFJFUShDSElMRChuLCBpKSwgU1RSSU5HKTsKKyAgICAgICAgcyA9IHBhcnNlc3RyKGMsIENISUxEKG4sIGkpLCAmdGhpc19ieXRlc21vZGUsICZ0aGlzX2Ztb2RlKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAvKiBDaGVjayB0aGF0IHdlJ3JlIG5vdCBtaXhpbmcgYnl0ZXMgd2l0aCB1bmljb2RlLiAqLworICAgICAgICBpZiAoaSAhPSAwICYmIGJ5dGVzbW9kZSAhPSB0aGlzX2J5dGVzbW9kZSkgeworICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFscyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBieXRlc21vZGUgPSB0aGlzX2J5dGVzbW9kZTsKKworICAgICAgICBhc3NlcnQoYnl0ZXNtb2RlID8gUHlCeXRlc19DaGVja0V4YWN0KHMpIDogUHlVbmljb2RlX0NoZWNrRXhhY3QocykpOworCisgICAgICAgIGlmIChieXRlc21vZGUpIHsKKyAgICAgICAgICAgIC8qIEZvciBieXRlcywgY29uY2F0IGFzIHdlIGdvLiAqLworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHRpbWUsIGp1c3QgcmVtZW1iZXIgdGhpcyB2YWx1ZS4gKi8KKyAgICAgICAgICAgICAgICBieXRlc19zdHIgPSBzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUJ5dGVzX0NvbmNhdEFuZERlbCgmYnl0ZXNfc3RyLCBzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzX3N0cikKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHYpICYmIFB5Qnl0ZXNfQ2hlY2socykpIHsKLSAgICAgICAgICAgICAgICBQeUJ5dGVzX0NvbmNhdEFuZERlbCgmdiwgcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBQeVVuaWNvZGVfQ29uY2F0KHYsIHMpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgdiA9IHRlbXA7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRoaXNfZm1vZGUpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gZi1zdHJpbmcuIENvbmNhdGVuYXRlIGFuZCBkZWNyZWYgaXQuICovCisgICAgICAgICAgICBQeV9zc2l6ZV90IG9mcyA9IDA7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKCZzdGF0ZSwgcywgJm9mcywgMCwgYywgbik7CisgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIHJlZ3VsYXIgc3RyaW5nLiBDb25jYXRlbmF0ZSBpdC4gKi8KKyAgICAgICAgICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbCgmc3RhdGUsIHMpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiB2OworICAgIGlmIChieXRlc21vZGUpIHsKKyAgICAgICAgLyogSnVzdCByZXR1cm4gdGhlIGJ5dGVzIG9iamVjdCBhbmQgd2UncmUgZG9uZS4gKi8KKyAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgYnl0ZXNfc3RyKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICByZXR1cm4gQnl0ZXMoYnl0ZXNfc3RyLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisgICAgfQogCi0gIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRih2KTsKKyAgICAvKiBXZSdyZSBub3QgYSBieXRlcyBzdHJpbmcsIGJ5dGVzX3N0ciBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIHNldC4gKi8KKyAgICBhc3NlcnQoYnl0ZXNfc3RyID09IE5VTEwpOworCisgICAgcmV0dXJuIEZzdHJpbmdQYXJzZXJfRmluaXNoKCZzdGF0ZSwgYywgbik7CisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoYnl0ZXNfc3RyKTsKKyAgICBGc3RyaW5nUGFyc2VyX0RlYWxsb2MoJnN0YXRlKTsKICAgICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKaW5kZXggYTA2ZWY2MS4uMjlmY2ZmZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2JsdGlubW9kdWxlLmMKKysrIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKQEAgLTMzMSw3ICszMzEsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjbXAgPT0gMSkgeworICAgICAgICBpZiAoY21wID4gMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwogICAgICAgICB9CkBAIC00NjksNiArNDY5LDcgQEAKICAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CiAgICAgbG9uZyBvazsKICAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgaW50IGNoZWNrdHJ1ZSA9IGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlOwogCiAgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogICAgIGZvciAoOzspIHsKQEAgLTQ3NiwxMiArNDc3LDExIEBACiAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgaWYgKGNoZWNrdHJ1ZSkgewogICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKLSAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE3NCwxMyArMTE3NCwxNCBAQAogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgUHlfc3NpemVfdCBudW1hcmdzLCBpOwogCi0gICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOworICAgIG51bWFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGx6LT5pdGVycyk7CiAgICAgYXJndHVwbGUgPSBQeVR1cGxlX05ldyhudW1hcmdzKTsKICAgICBpZiAoYXJndHVwbGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBmb3IgKGk9MCA7IGk8bnVtYXJncyA7IGkrKykgewotICAgICAgICB2YWwgPSBQeUl0ZXJfTmV4dChQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdGVycywgaSkpOworICAgICAgICBQeU9iamVjdCAqaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdGVycywgaSk7CisgICAgICAgIHZhbCA9IFB5X1RZUEUoaXQpLT50cF9pdGVybmV4dChpdCk7CiAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3R1cGxlKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTkzMCw5ICsxOTMxLDggQEAKICAgICAgICAgICAgIFB5X0NMRUFSKHN0cmluZ3BvKTsKICAgICAgICAgICAgIGlmIChwbyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gX3JlYWRsaW5lX2Vycm9yczsKLSAgICAgICAgICAgIHByb21wdHN0ciA9IFB5Qnl0ZXNfQXNTdHJpbmcocG8pOwotICAgICAgICAgICAgaWYgKHByb21wdHN0ciA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gX3JlYWRsaW5lX2Vycm9yczsKKyAgICAgICAgICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKHBvKSk7CisgICAgICAgICAgICBwcm9tcHRzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhwbyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBwbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9QeXRob24vY2V2YWwuYyBiL1B5dGhvbi9jZXZhbC5jCmluZGV4IGVlNzljMjEuLmQ2OWI4ZDYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jZXZhbC5jCisrKyBiL1B5dGhvbi9jZXZhbC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAogI2lmZGVmIExMVFJBQ0UKIHN0YXRpYyBpbnQgbGx0cmFjZTsKLXN0YXRpYyBpbnQgcHJ0cmFjZShQeU9iamVjdCAqLCBjaGFyICopOworc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIHN0YXRpYyBpbnQgY2FsbF90cmFjZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqLCBQeUZyYW1lT2JqZWN0ICosCkBAIC0yMzIyLDcgKzIzMjIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMICYmIF9QeUVycl9PQ0NVUlJFRCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTIzNjIsMjYgKzIzNjIsMzMgQEAKICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwogICAgICAgICAgICAgUHlPYmplY3QgKnY7CiAgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZi0+Zl9nbG9iYWxzKQotICAgICAgICAgICAgICAgICYmIFB5RGljdF9DaGVja0V4YWN0KGYtPmZfYnVpbHRpbnMpKSB7CisgICAgICAgICAgICAgICAgJiYgUHlEaWN0X0NoZWNrRXhhY3QoZi0+Zl9idWlsdGlucykpCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdiA9IF9QeURpY3RfTG9hZEdsb2JhbCgoUHlEaWN0T2JqZWN0ICopZi0+Zl9nbG9iYWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGljdE9iamVjdCAqKWYtPmZfYnVpbHRpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghX1B5RXJyX09DQ1VSUkVEKCkpCisgICAgICAgICAgICAgICAgICAgIGlmICghX1B5RXJyX09DQ1VSUkVEKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9QeURpY3RfTG9hZEdsb2JhbCgpIHJldHVybnMgTlVMTCB3aXRob3V0IHJhaXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX05hbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfRVJST1JfTVNHLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBTbG93LXBhdGggaWYgZ2xvYmFscyBvciBidWlsdGlucyBpcyBub3QgYSBkaWN0ICovCisKKyAgICAgICAgICAgICAgICAvKiBuYW1lc3BhY2UgMTogZ2xvYmFscyAqLwogICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAorICAgICAgICAgICAgICAgICAgICAvKiBuYW1lc3BhY2UgMjogYnVpbHRpbnMgKi8KICAgICAgICAgICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKQEAgLTI0NDEsNyArMjQ0OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0zMzgxLDYgKzMzODgsNjQgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBUQVJHRVQoRk9STUFUX1ZBTFVFKSB7CisgICAgICAgICAgICAvKiBIYW5kbGVzIGYtc3RyaW5nIHZhbHVlIGZvcm1hdHRpbmcuICovCisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICAgICAgUHlPYmplY3QgKmZtdF9zcGVjOworICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlOworICAgICAgICAgICAgUHlPYmplY3QgKigqY29udl9mbikoUHlPYmplY3QgKik7CisgICAgICAgICAgICBpbnQgd2hpY2hfY29udmVyc2lvbiA9IG9wYXJnICYgRlZDX01BU0s7CisgICAgICAgICAgICBpbnQgaGF2ZV9mbXRfc3BlYyA9IChvcGFyZyAmIEZWU19NQVNLKSA9PSBGVlNfSEFWRV9TUEVDOworCisgICAgICAgICAgICBmbXRfc3BlYyA9IGhhdmVfZm10X3NwZWMgPyBQT1AoKSA6IE5VTEw7CisgICAgICAgICAgICB2YWx1ZSA9IFBPUCgpOworCisgICAgICAgICAgICAvKiBTZWUgaWYgYW55IGNvbnZlcnNpb24gaXMgc3BlY2lmaWVkLiAqLworICAgICAgICAgICAgc3dpdGNoICh3aGljaF9jb252ZXJzaW9uKSB7CisgICAgICAgICAgICBjYXNlIEZWQ19TVFI6ICAgY29udl9mbiA9IFB5T2JqZWN0X1N0cjsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlZDX1JFUFI6ICBjb252X2ZuID0gUHlPYmplY3RfUmVwcjsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVkNfQVNDSUk6IGNvbnZfZm4gPSBQeU9iamVjdF9BU0NJSTsgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIE11c3QgYmUgMCAobWVhbmluZyBubyBjb252ZXJzaW9uKSwgc2luY2Ugb25seSBmb3VyCisgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIGFsbG93ZWQgYnkgKG9wYXJnICYgRlZDX01BU0spLiAqLworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgIGNvbnZfZm4gPSBOVUxMOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHRoZXJlJ3MgYSBjb252ZXJzaW9uIGZ1bmN0aW9uLCBjYWxsIGl0IGFuZCByZXBsYWNlCisgICAgICAgICAgICAgICB2YWx1ZSB3aXRoIHRoYXQgcmVzdWx0LiBPdGhlcndpc2UsIGp1c3QgdXNlIHZhbHVlLAorICAgICAgICAgICAgICAgd2l0aG91dCBjb252ZXJzaW9uLiAqLworICAgICAgICAgICAgaWYgKGNvbnZfZm4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbnZfZm4odmFsdWUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoZm10X3NwZWMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdmFsdWUgaXMgYSB1bmljb2RlIG9iamVjdCwgYW5kIHRoZXJlJ3Mgbm8gZm10X3NwZWMsCisgICAgICAgICAgICAgICB0aGVuIHdlIGtub3cgdGhlIHJlc3VsdCBvZiBmb3JtYXQodmFsdWUpIGlzIHZhbHVlCisgICAgICAgICAgICAgICBpdHNlbGYuIEluIHRoYXQgY2FzZSwgc2tpcCBjYWxsaW5nIGZvcm1hdCgpLiBJIHBsYW4gdG8KKyAgICAgICAgICAgICAgIG1vdmUgdGhpcyBvcHRpbWl6YXRpb24gaW4gdG8gUHlPYmplY3RfRm9ybWF0KCkKKyAgICAgICAgICAgICAgIGl0c2VsZi4gKi8KKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkgJiYgZm10X3NwZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIERvIG5vdGhpbmcsIGp1c3QgdHJhbnNmZXIgb3duZXJzaGlwIHRvIHJlc3VsdC4gKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQWN0dWFsbHkgY2FsbCBmb3JtYXQoKS4gKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Gb3JtYXQodmFsdWUsIGZtdF9zcGVjKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoZm10X3NwZWMpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUFVTSChyZXN1bHQpOworICAgICAgICAgICAgRElTUEFUQ0goKTsKKyAgICAgICAgfQorCiAgICAgICAgIFRBUkdFVChFWFRFTkRFRF9BUkcpIHsKICAgICAgICAgICAgIG9wY29kZSA9IE5FWFRPUCgpOwogICAgICAgICAgICAgb3BhcmcgPSBvcGFyZzw8MTYgfCBORVhUQVJHKCk7CkBAIC00MjU5LDcgKzQzMjQsNyBAQAogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludAotcHJ0cmFjZShQeU9iamVjdCAqdiwgY2hhciAqc3RyKQorcHJ0cmFjZShQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqc3RyKQogewogICAgIHByaW50ZigiJXMgIiwgc3RyKTsKICAgICBpZiAoUHlPYmplY3RfUHJpbnQodiwgc3Rkb3V0LCAwKSAhPSAwKQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggMWU3MjBlYS4uMjlhMmFkZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC0xNzEsNyArMTcxLDYgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfbyhzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfaShzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBQeV9zc2l6ZV90KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYWRkb3BfaihzdHJ1Y3QgY29tcGlsZXIgKiwgaW50LCBiYXNpY2Jsb2NrICosIGludCk7Ci1zdGF0aWMgYmFzaWNibG9jayAqY29tcGlsZXJfdXNlX25ld19ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKik7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2Vycm9yKHN0cnVjdCBjb21waWxlciAqLCBjb25zdCBjaGFyICopOwogc3RhdGljIGludCBjb21waWxlcl9uYW1lb3Aoc3RydWN0IGNvbXBpbGVyICosIGlkZW50aWZpZXIsIGV4cHJfY29udGV4dF90eSk7CiAKQEAgLTE5Niw3ICsxOTUsNyBAQAogc3RhdGljIGludCBjb21waWxlcl93aXRoKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5LCBpbnQpOwogc3RhdGljIGludCBjb21waWxlcl9hc3luY193aXRoKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5LCBpbnQpOwogc3RhdGljIGludCBjb21waWxlcl9hc3luY19mb3Ioc3RydWN0IGNvbXBpbGVyICosIHN0bXRfdHkpOwotc3RhdGljIGludCBjb21waWxlcl9jYWxsX2hlbHBlcihzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5X3NzaXplX3QgbiwKK3N0YXRpYyBpbnQgY29tcGlsZXJfY2FsbF9oZWxwZXIoc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICprZXl3b3Jkcyk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX3RyeV9leGNlcHQoc3RydWN0IGNvbXBpbGVyICosIHN0bXRfdHkpOwpAQCAtNDc3LDkgKzQ3Niw5IEBACiB7CiAgICAgYmFzaWNibG9jayAqYmxvY2s7CiAgICAgZm9yIChibG9jayA9IHUtPnVfYmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5iX2xpc3QpIHsKLSAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGNiY2JjYmNiKTsKLSAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGZiZmJmYmZiKTsKLSAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGRiZGJkYmRiKTsKKyAgICAgICAgYXNzZXJ0KChQeV91aW50cHRyX3QpYmxvY2sgIT0gMHhjYmNiY2JjYlUpOworICAgICAgICBhc3NlcnQoKFB5X3VpbnRwdHJfdClibG9jayAhPSAweGZiZmJmYmZiVSk7CisgICAgICAgIGFzc2VydCgoUHlfdWludHB0cl90KWJsb2NrICE9IDB4ZGJkYmRiZGJVKTsKICAgICAgICAgaWYgKGJsb2NrLT5iX2luc3RyICE9IE5VTEwpIHsKICAgICAgICAgICAgIGFzc2VydChibG9jay0+Yl9pYWxsb2MgPiAwKTsKICAgICAgICAgICAgIGFzc2VydChibG9jay0+Yl9pdXNlZCA+IDApOwpAQCAtNTIzLDYgKzUyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcGVfdHlwZSwgdm9pZCAqa2V5LCBpbnQgbGluZW5vKQogewogICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1OworICAgIGJhc2ljYmxvY2sgKmJsb2NrOwogCiAgICAgdSA9IChzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxlcl91bml0KSk7CkBAIC02MjAsOCArNjIwLDExIEBACiAgICAgYy0+dSA9IHU7CiAKICAgICBjLT5jX25lc3RsZXZlbCsrOwotICAgIGlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKGMpID09IE5VTEwpCisKKyAgICBibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoYmxvY2sgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7CisgICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwogCiAgICAgaWYgKHUtPnVfc2NvcGVfdHlwZSAhPSBDT01QSUxFUl9TQ09QRV9NT0RVTEUpIHsKICAgICAgICAgaWYgKCFjb21waWxlcl9zZXRfcXVhbG5hbWUoYykpCkBAIC03MzEsNiArNzM0LDcgQEAKICAgICByZXR1cm4gMTsKIH0KIAorCiAvKiBBbGxvY2F0ZSBhIG5ldyBibG9jayBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KICAgIFJldHVybnMgTlVMTCBvbiBlcnJvci4KICovCkBAIC03NTUsMTYgKzc1OSw2IEBACiB9CiAKIHN0YXRpYyBiYXNpY2Jsb2NrICoKLWNvbXBpbGVyX3VzZV9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQotewotICAgIGJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotICAgIGlmIChibG9jayA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7Ci0gICAgcmV0dXJuIGJsb2NrOwotfQotCi1zdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl9uZXh0X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKIHsKICAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKQEAgLTEwNjYsNiArMTA2MCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgR0VUX1lJRUxEX0ZST01fSVRFUjoKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEZPUk1BVF9WQUxVRToKKyAgICAgICAgICAgIC8qIElmIHRoZXJlJ3MgYSBmbXRfc3BlYyBvbiB0aGUgc3RhY2ssIHdlIGdvIGZyb20gMi0+MSwKKyAgICAgICAgICAgICAgIGVsc2UgMS0+MS4gKi8KKyAgICAgICAgICAgIHJldHVybiAob3BhcmcgJiBGVlNfTUFTSykgPT0gRlZTX0hBVkVfU1BFQyA/IC0xIDogMDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBQWV9JTlZBTElEX1NUQUNLX0VGRkVDVDsKICAgICB9CkBAIC0xMTY1LDEwICsxMTYzLDE0IEBACiAgICAgc3RydWN0IGluc3RyICppOwogICAgIGludCBvZmY7CiAKLSAgICAvKiBJbnRlZ2VyIGFyZ3VtZW50cyBhcmUgbGltaXQgdG8gMTYtYml0LiBUaGVyZSBpcyBhbiBleHRlbnNpb24gZm9yIDMyLWJpdAotICAgICAgIGludGVnZXIgYXJndW1lbnRzLiAqLwotICAgIGFzc2VydCgoLTIxNDc0ODM2NDctMSkgPD0gb3BhcmcpOwotICAgIGFzc2VydChvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKKyAgICAvKiBvcGFyZyB2YWx1ZSBpcyB1bnNpZ25lZCwgYnV0IGEgc2lnbmVkIEMgaW50IGlzIHVzdWFsbHkgdXNlZCB0byBzdG9yZQorICAgICAgIGl0IGluIHRoZSBDIGNvZGUgKGxpa2UgUHl0aG9uL2NldmFsLmMpLgorCisgICAgICAgTGltaXQgdG8gMzItYml0IHNpZ25lZCBDIGludCAocmF0aGVyIHRoYW4gSU5UX01BWCkgZm9yIHBvcnRhYmlsaXR5LgorCisgICAgICAgVGhlIGFyZ3VtZW50IG9mIGEgY29uY3JldGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gaXMgbGltaXRlZCB0byAxNi1iaXQuCisgICAgICAgRVhURU5ERURfQVJHIGlzIHVzZWQgZm9yIDMyLWJpdCBhcmd1bWVudHMuICovCisgICAgYXNzZXJ0KDAgPD0gb3BhcmcgJiYgb3BhcmcgPD0gMjE0NzQ4MzY0Nyk7CiAKICAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwogICAgIGlmIChvZmYgPCAwKQpAQCAtMTIwMywyMiArMTIwNSwxMiBAQAogICAgIHJldHVybiAxOwogfQogCi0vKiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBORVdfQkxPQ0sgYW5kIE5FWFRfQkxPQ0sgaXMgc3VidGxlLiAgKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pICBORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCi0gICBpdCBhcyB0aGUgY3VycmVudCBibG9jay4gIE5FWFRfQkxPQ0soKSBhbHNvIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcAotICAgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrLgorLyogTkVYVF9CTE9DSygpIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcCBmcm9tIHRoZSBjdXJyZW50IGJsb2NrCisgICB0byB0aGUgbmV3IGJsb2NrLgorCisgICBUaGUgcmV0dXJucyBpbnNpZGUgdGhpcyBtYWNybyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKKyAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiBMb2NhbCBvYmplY3RzIHNob3VsZCB1c2UgdGhlIGFyZW5hLgogKi8KLQotLyogVGhlIHJldHVybnMgaW5zaWRlIHRoZXNlIG1hY3JvcyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKLSAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiAgTG9jYWwgb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBhcmVuYS4KLSovCi0KLQotI2RlZmluZSBORVdfQkxPQ0soQykgeyBcCi0gICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0gICAgICAgIHJldHVybiAwOyBcCi19Ci0KICNkZWZpbmUgTkVYVF9CTE9DSyhDKSB7IFwKICAgICBpZiAoY29tcGlsZXJfbmV4dF9ibG9jaygoQykpID09IE5VTEwpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEzMDksNyArMTMwMSwxMSBAQAogewogICAgIGlmIChzLT5raW5kICE9IEV4cHJfa2luZCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZDsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzLT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiAvKiBDb21waWxlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgY2hlY2tpbmcgZm9yIGEgZG9jc3RyaW5nLiAqLwpAQCAtMTY4Myw4ICsxNjc5LDEyIEBACiAKICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChib2R5LCAwKTsKICAgICBkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7Ci0gICAgaWYgKGRvY3N0cmluZyAmJiBjLT5jX29wdGltaXplIDwgMikKLSAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIGlmIChkb2NzdHJpbmcgJiYgYy0+Y19vcHRpbWl6ZSA8IDIpIHsKKyAgICAgICAgaWYgKHN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZCkKKyAgICAgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIH0KICAgICBpZiAoY29tcGlsZXJfYWRkX28oYywgYy0+dS0+dV9jb25zdHMsIGZpcnN0X2NvbnN0KSA8IDApICAgICAgewogICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTI1OTUsNiArMjU5NSwzNSBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl92aXNpdF9zdG10X2V4cHIoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IHZhbHVlKQoreworICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgdmFsdWUpOworICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc3dpdGNoICh2YWx1ZS0+a2luZCkKKyAgICB7CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICBjYXNlIE51bV9raW5kOgorICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKKyAgICBjYXNlIENvbnN0YW50X2tpbmQ6CisgICAgICAgIC8qIGlnbm9yZSBjb25zdGFudCBzdGF0ZW1lbnQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBWSVNJVChjLCBleHByLCB2YWx1ZSk7CisgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKIGNvbXBpbGVyX3Zpc2l0X3N0bXQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7CiAgICAgUHlfc3NpemVfdCBpLCBuOwpAQCAtMjY2NCwxNiArMjY5Myw3IEBACiAgICAgY2FzZSBOb25sb2NhbF9raW5kOgogICAgICAgICBicmVhazsKICAgICBjYXNlIEV4cHJfa2luZDoKLSAgICAgICAgaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgewotICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKLSAgICAgICAgICAgIEFERE9QKGMsIFBSSU5UX0VYUFIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBTdHJfa2luZCAmJgotICAgICAgICAgICAgICAgICBzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gTnVtX2tpbmQpIHsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0gICAgICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3Zpc2l0X3N0bXRfZXhwcihjLCBzLT52LkV4cHIudmFsdWUpOwogICAgIGNhc2UgUGFzc19raW5kOgogICAgICAgICBicmVhazsKICAgICBjYXNlIEJyZWFrX2tpbmQ6CkBAIC0zMDc3LDcgKzMwOTcsOCBAQAogc3RhdGljIGludAogY29tcGlsZXJfZGljdChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLSAgICBQeV9zc2l6ZV90IGksIG4sIGNvbnRhaW5lcnMsIGVsZW1lbnRzOworICAgIFB5X3NzaXplX3QgaSwgbiwgZWxlbWVudHM7CisgICAgaW50IGNvbnRhaW5lcnM7CiAgICAgaW50IGlzX3VucGFja2luZyA9IDA7CiAgICAgbiA9IGFzZGxfc2VxX0xFTihlLT52LkRpY3QudmFsdWVzKTsKICAgICBjb250YWluZXJzID0gMDsKQEAgLTMxNjksMTUgKzMxOTAsOTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5DYWxsLmtleXdvcmRzKTsKIH0KIAorc3RhdGljIGludAorY29tcGlsZXJfam9pbmVkX3N0cihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICAvKiBDb25jYXRlbmF0ZSBwYXJ0cyBvZiBhIHN0cmluZyB1c2luZyAnJy5qb2luKHBhcnRzKS4gVGhlcmUgYXJlCisgICAgICAgcHJvYmFibHkgYmV0dGVyIHdheXMgb2YgZG9pbmcgdGhpcy4KKworICAgICAgIFRoaXMgaXMgdXNlZCBmb3IgY29uc3RydWN0cyBsaWtlICIneD0nIGYnezQyfSciLCB3aGljaCBoYXZlIHRvCisgICAgICAgYmUgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZS4gKi8KKworICAgIHN0YXRpYyBQeU9iamVjdCAqZW1wdHlfc3RyaW5nOworICAgIHN0YXRpYyBQeU9iamVjdCAqam9pbl9zdHJpbmc7CisKKyAgICBpZiAoIWVtcHR5X3N0cmluZykgeworICAgICAgICBlbXB0eV9zdHJpbmcgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmICghZW1wdHlfc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgham9pbl9zdHJpbmcpIHsKKyAgICAgICAgam9pbl9zdHJpbmcgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiam9pbiIpOworICAgICAgICBpZiAoIWpvaW5fc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlbXB0eV9zdHJpbmcsIGNvbnN0cyk7CisgICAgQURET1BfTkFNRShjLCBMT0FEX0FUVFIsIGpvaW5fc3RyaW5nLCBuYW1lcyk7CisgICAgVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuSm9pbmVkU3RyLnZhbHVlcyk7CisgICAgQURET1BfSShjLCBCVUlMRF9MSVNULCBhc2RsX3NlcV9MRU4oZS0+di5Kb2luZWRTdHIudmFsdWVzKSk7CisgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogVXNlZCB0byBpbXBsZW1lbnQgZi1zdHJpbmdzLiBGb3JtYXQgYSBzaW5nbGUgdmFsdWUuICovCitzdGF0aWMgaW50Citjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCit7CisgICAgLyogT3VyIG9wYXJnIGVuY29kZXMgMiBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBjb252ZXJzaW9uCisgICAgICAgY2hhcmFjdGVyLCBhbmQgd2hldGhlciBvciBub3QgYSBmb3JtYXRfc3BlYyB3YXMgcHJvdmlkZWQuCisKKyAgICAgICBDb252ZXJ0IHRoZSBjb252ZXJzaW9uIGNoYXIgdG8gMiBiaXRzOgorICAgICAgIE5vbmU6IDAwMCAgMHgwICBGVkNfTk9ORQorICAgICAgICFzICA6IDAwMSAgMHgxICBGVkNfU1RSCisgICAgICAgIXIgIDogMDEwICAweDIgIEZWQ19SRVBSCisgICAgICAgIWEgIDogMDExICAweDMgIEZWQ19BU0NJSQorCisgICAgICAgbmV4dCBiaXQgaXMgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhIGZvcm1hdCBzcGVjOgorICAgICAgIHllcyA6IDEwMCAgMHg0CisgICAgICAgbm8gIDogMDAwICAweDAKKyAgICAqLworCisgICAgaW50IG9wYXJnOworCisgICAgLyogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gYmUgZm9ybWF0dGVkLiAqLworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUpOworCisgICAgc3dpdGNoIChlLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24pIHsKKyAgICBjYXNlICdzJzogb3BhcmcgPSBGVkNfU1RSOyAgIGJyZWFrOworICAgIGNhc2UgJ3InOiBvcGFyZyA9IEZWQ19SRVBSOyAgYnJlYWs7CisgICAgY2FzZSAnYSc6IG9wYXJnID0gRlZDX0FTQ0lJOyBicmVhazsKKyAgICBjYXNlIC0xOiAgb3BhcmcgPSBGVkNfTk9ORTsgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgY29udmVyc2lvbiBjaGFyYWN0ZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKSB7CisgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBmb3JtYXQgc3BlYywgYW5kIHVwZGF0ZSBvdXIgb3Bjb2RlIGFyZy4gKi8KKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIG9wYXJnIHw9IEZWU19IQVZFX1NQRUM7CisgICAgfQorCisgICAgLyogQW5kIHB1c2ggb3VyIG9wY29kZSBhbmQgb3BhcmcgKi8KKyAgICBBRERPUF9JKGMsIEZPUk1BVF9WQUxVRSwgb3BhcmcpOworICAgIHJldHVybiAxOworfQorCiAvKiBzaGFyZWQgY29kZSBiZXR3ZWVuIGNvbXBpbGVyX2NhbGwgYW5kIGNvbXBpbGVyX2NsYXNzICovCiBzdGF0aWMgaW50CiBjb21waWxlcl9jYWxsX2hlbHBlcihzdHJ1Y3QgY29tcGlsZXIgKmMsCi0gICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG4sIC8qIEFyZ3MgYWxyZWFkeSBwdXNoZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBuLCAvKiBBcmdzIGFscmVhZHkgcHVzaGVkICovCiAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYXJncywKICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICprZXl3b3JkcykKIHsKICAgICBpbnQgY29kZSA9IDA7Ci0gICAgUHlfc3NpemVfdCBuZWx0cywgaSwgbnNlZW4sIG5rdzsKKyAgICBQeV9zc2l6ZV90IG5lbHRzLCBpLCBuc2VlbjsKKyAgICBpbnQgbmt3OwogCiAgICAgLyogdGhlIG51bWJlciBvZiB0dXBsZXMgYW5kIGRpY3Rpb25hcmllcyBvbiB0aGUgc3RhY2sgKi8KICAgICBQeV9zc2l6ZV90IG5zdWJhcmdzID0gMCwgbnN1Ymt3YXJncyA9IDA7CkBAIC0zNTQ1LDYgKzM2NDIsOCBAQAogICAgIHN3aXRjaCAoZS0+a2luZCkgewogICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKICAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuQ29uc3RhbnQudmFsdWUpOwogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5OdW0ubik7CiAgICAgY2FzZSBTdHJfa2luZDoKQEAgLTM1ODgsOSArMzY4Nyw5IEBACiAgICAgICAgQkxPQ0sKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQ6Ci0gICAgICAgZXhjID0gY29weSBvZiAoZXhjZXB0aW9uLCBpbnN0YW5jZSwgdHJhY2ViYWNrKQorICAgICAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCiAgICAgICAgZWxzZToKLSAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCiAgICAgICAgaWYgbm90IChhd2FpdCBleGl0KCpleGMpKToKICAgICAgICAgICAgcmFpc2UKICAqLwpAQCAtMzgzMiwxMiArMzkzMSwxOSBAQAogICAgICAgICByZXR1cm4gY29tcGlsZXJfY29tcGFyZShjLCBlKTsKICAgICBjYXNlIENhbGxfa2luZDoKICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NhbGwoYywgZSk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQ29uc3RhbnQudmFsdWUsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5OdW0ubiwgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LlN0ci5zLCBjb25zdHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfam9pbmVkX3N0cihjLCBlKTsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoYywgZSk7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuQnl0ZXMucywgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CkBAIC00MzI5LDcgKzQ0MzUsNiBAQAogICAgIGRfbGluZW5vID0gaS0+aV9saW5lbm8gLSBhLT5hX2xpbmVubzsKIAogICAgIGFzc2VydChkX2J5dGVjb2RlID49IDApOwotICAgIGFzc2VydChkX2xpbmVubyA+PSAwKTsKIAogICAgIGlmKGRfYnl0ZWNvZGUgPT0gMCAmJiBkX2xpbmVubyA9PSAwKQogICAgICAgICByZXR1cm4gMTsKQEAgLTQzNTksOSArNDQ2NCwyMSBAQAogICAgICAgICBkX2J5dGVjb2RlIC09IG5jb2RlcyAqIDI1NTsKICAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CiAgICAgfQotICAgIGFzc2VydChkX2J5dGVjb2RlIDw9IDI1NSk7Ci0gICAgaWYgKGRfbGluZW5vID4gMjU1KSB7Ci0gICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfbGluZW5vIC8gMjU1OworICAgIGFzc2VydCgwIDw9IGRfYnl0ZWNvZGUgJiYgZF9ieXRlY29kZSA8PSAyNTUpOworCisgICAgaWYgKGRfbGluZW5vIDwgLTEyOCB8fCAxMjcgPCBkX2xpbmVubykgeworICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMsIGs7CisgICAgICAgIGlmIChkX2xpbmVubyA8IDApIHsKKyAgICAgICAgICAgIGsgPSAtMTI4OworICAgICAgICAgICAgLyogdXNlIGRpdmlzaW9uIG9uIHBvc2l0aXZlIG51bWJlcnMgKi8KKyAgICAgICAgICAgIG5jb2RlcyA9ICgtZF9saW5lbm8pIC8gMTI4OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgayA9IDEyNzsKKyAgICAgICAgICAgIG5jb2RlcyA9IGRfbGluZW5vIC8gMTI3OworICAgICAgICB9CisgICAgICAgIGRfbGluZW5vIC09IG5jb2RlcyAqIGs7CisgICAgICAgIGFzc2VydChuY29kZXMgPj0gMSk7CiAgICAgICAgIG5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwogICAgICAgICBpZiAobmJ5dGVzID49IGxlbikgewpAQCAtNDM3OSwxNSArNDQ5NiwxNSBAQAogICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQogICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKICAgICAgICAgKmxub3RhYisrID0gZF9ieXRlY29kZTsKLSAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAqbG5vdGFiKysgPSBrOwogICAgICAgICBkX2J5dGVjb2RlID0gMDsKICAgICAgICAgZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7CiAgICAgICAgICAgICAqbG5vdGFiKysgPSAwOwotICAgICAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAgICAgKmxub3RhYisrID0gazsKICAgICAgICAgfQotICAgICAgICBkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7CiAgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwogICAgIH0KKyAgICBhc3NlcnQoLTEyOCA8PSBkX2xpbmVubyAmJiBkX2xpbmVubyA8PSAxMjcpOwogCiAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShhLT5hX2xub3RhYik7CiAgICAgaWYgKGEtPmFfbG5vdGFiX29mZiArIDIgPj0gbGVuKSB7CkBAIC00NzQ1LDQgKzQ4NjIsMyBAQAogewogICAgIHJldHVybiBQeUFTVF9Db21waWxlRXgobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIC0xLCBhcmVuYSk7CiB9Ci0KZGlmZiAtLWdpdCBhL1B5dGhvbi9kdG9hLmMgYi9QeXRob24vZHRvYS5jCmluZGV4IDNkYTU0NmUuLmUwNjY1YjYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9kdG9hLmMKKysrIGIvUHl0aG9uL2R0b2EuYwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiB7CiAgICAgQmlnaW50ICpiMSwgKnA1LCAqcDUxOwogICAgIGludCBpOwotICAgIHN0YXRpYyBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CisgICAgc3RhdGljIGNvbnN0IGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKIAogICAgIGlmICgoaSA9IGsgJiAzKSkgewogICAgICAgICBiID0gbXVsdGFkZChiLCBwMDVbaS0xXSwgMCk7CkBAIC04MDMsNyArODAzLDcgQEAKIHsKICAgICBCaWdpbnQgKmIxLCAqcDUsICpwNTE7CiAgICAgaW50IGk7Ci0gICAgc3RhdGljIGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OwogCiAgICAgaWYgKChpID0gayAmIDMpKSB7CiAgICAgICAgIGIgPSBtdWx0YWRkKGIsIHAwNVtpLTFdLCAwKTsKQEAgLTIzMTUsNyArMjMxNSw3IEBACiB9CiAKIHN0YXRpYyBjaGFyICoKLW5ydl9hbGxvYyhjaGFyICpzLCBjaGFyICoqcnZlLCBpbnQgbikKK25ydl9hbGxvYyhjb25zdCBjaGFyICpzLCBjaGFyICoqcnZlLCBpbnQgbikKIHsKICAgICBjaGFyICpydiwgKnQ7CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggZjJjNzk2ZS4uMDUwNTBjZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTI0LDEyICsyNCwxMCBAQAogI2RlZmluZSBQWURfREVCVUdfU1VGRklYICIiCiAjZW5kaWYKIAotI2RlZmluZSBTVFJJTkdJWkUyKHgpICN4Ci0jZGVmaW5lIFNUUklOR0laRSh4KSBTVFJJTkdJWkUyKHgpCiAjaWZkZWYgUFlEX1BMQVRGT1JNX1RBRwotI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFNUUklOR0laRShQWV9NQUpPUl9WRVJTSU9OKSBTVFJJTkdJWkUoUFlfTUlOT1JfVkVSU0lPTikgIi0iIFBZRF9QTEFURk9STV9UQUcgIi5weWQiCisjZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKSAiLSIgUFlEX1BMQVRGT1JNX1RBRyAiLnB5ZCIKICNlbHNlCi0jZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgU1RSSU5HSVpFKFBZX01BSk9SX1ZFUlNJT04pIFNUUklOR0laRShQWV9NSU5PUl9WRVJTSU9OKSAiLnB5ZCIKKyNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pICIucHlkIgogI2VuZGlmCiAKICNkZWZpbmUgUFlEX1VOVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIucHlkIgpAQCAtNDMsNyArNDEsNyBAQAogLyogQ2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyZSwgdG8gYXZvaWQgYW55IGRlcGVuZGVuY2llcyBvbiBwYXJ0aWN1bGFyCiAgICBDIFJUTCBpbXBsZW1lbnRhdGlvbnMgKi8KIAotc3RhdGljIGludCBzdHJjYXNlY21wIChjaGFyICpzdHJpbmcxLCBjaGFyICpzdHJpbmcyKQorc3RhdGljIGludCBzdHJjYXNlY21wIChjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyKQogewogICAgIGludCBmaXJzdCwgc2Vjb25kOwogCmRpZmYgLS1naXQgYS9QeXRob24vZmlsZXV0aWxzLmMgYi9QeXRob24vZmlsZXV0aWxzLmMKaW5kZXggMDZkNjMyYS4uNGEwZWY0OCAxMDA2NDQKLS0tIGEvUHl0aG9uL2ZpbGV1dGlscy5jCisrKyBiL1B5dGhvbi9maWxldXRpbHMuYwpAQCAtNjgzLDYgKzY4MywxMCBAQAogewogICAgIGludCByZXM7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgcmVzID0gX1B5X2ZzdGF0X25vcmFpc2UoZmQsIHN0YXR1cyk7CiAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKQEAgLTc5NCw3ICs3OTgsNyBAQAogICAgIGludCByZXF1ZXN0OwogICAgIGludCBlcnI7CiAjZW5kaWYKLSAgICBpbnQgZmxhZ3M7CisgICAgaW50IGZsYWdzLCBuZXdfZmxhZ3M7CiAgICAgaW50IHJlczsKICNlbmRpZgogCkBAIC04ODAsMTAgKzg4NCwxOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGluaGVyaXRhYmxlKQotICAgICAgICBmbGFncyAmPSB+RkRfQ0xPRVhFQzsKLSAgICBlbHNlCi0gICAgICAgIGZsYWdzIHw9IEZEX0NMT0VYRUM7CisgICAgaWYgKGluaGVyaXRhYmxlKSB7CisgICAgICAgIG5ld19mbGFncyA9IGZsYWdzICYgfkZEX0NMT0VYRUM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdfZmxhZ3MgPSBmbGFncyB8IEZEX0NMT0VYRUM7CisgICAgfQorCisgICAgaWYgKG5ld19mbGFncyA9PSBmbGFncykgeworICAgICAgICAvKiBGRF9DTE9FWEVDIGZsYWcgYWxyZWFkeSBzZXQvY2xlYXJlZDogbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICByZXMgPSBmY250bChmZCwgRl9TRVRGRCwgZmxhZ3MpOwogICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIGlmIChyYWlzZSkKQEAgLTExNjQsNiArMTE3NiwxMCBAQAogICAgIGludCBlcnI7CiAgICAgaW50IGFzeW5jX2VyciA9IDA7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICAvKiBfUHlfcmVhZCgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQsIG90aGVyd2lzZSB0aGUKICAgICAgKiBjYWxsZXIgbWF5IHRoaW5rIHRoYXQgcmVhZCgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KQEAgLTEzMTksNiArMTMzNSwxMCBAQAogUHlfc3NpemVfdAogX1B5X3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCiB7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgLyogX1B5X3dyaXRlKCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwgb3RoZXJ3aXNlIHRoZQogICAgICAqIGNhbGxlciBtYXkgdGhpbmsgdGhhdCB3cml0ZSgpIHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBhbmQgdGhlIHNpZ25hbAogICAgICAqIGhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gKi8KQEAgLTE0NjgsNiArMTQ4OCwxMCBAQAogICAgIERXT1JEIGZ0eXBlOwogI2VuZGlmCiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICBpZiAoIV9QeVZlcmlmeV9mZChmZCkpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCmluZGV4IDA1NmJiNzYuLmE0MjhmYmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCisrKyBiL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jCkBAIC02NTYsNyArNjU2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNoYXIgbm9fZ3JvdXBpbmdbMV0gPSB7Q0hBUl9NQVh9Oworc3RhdGljIGNvbnN0IGNoYXIgbm9fZ3JvdXBpbmdbMV0gPSB7Q0hBUl9NQVh9OwogCiAvKiBGaW5kIHRoZSBkZWNpbWFsIHBvaW50IGNoYXJhY3RlcihzPyksIHRob3VzYW5kc19zZXBhcmF0b3Iocz8pLCBhbmQKICAgIGdyb3VwaW5nIGRlc2NyaXB0aW9uLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IGxvY2FsZSBpZiB0eXBlIGlzCmRpZmYgLS1naXQgYS9QeXRob24vZnJvemVubWFpbi5jIGIvUHl0aG9uL2Zyb3plbm1haW4uYwppbmRleCBkZThiZDM1Li43NjliMzNkIDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVubWFpbi5jCisrKyBiL1B5dGhvbi9mcm96ZW5tYWluLmMKQEAgLTk5LDcgKzk5LDkgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlXaW5GcmVlemVfRXhlVGVybSgpOwogI2VuZGlmCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiBlcnJvcjoKICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weSk7CmRpZmYgLS1naXQgYS9QeXRob24vZnV0dXJlLmMgYi9QeXRob24vZnV0dXJlLmMKaW5kZXggMTYzZjg3Zi4uNzVmMjEwNyAxMDA2NDQKLS0tIGEvUHl0aG9uL2Z1dHVyZS5jCisrKyBiL1B5dGhvbi9mdXR1cmUuYwpAQCAtNzksNyArNzksMTAgQEAKIAogICAgIGkgPSAwOwogICAgIGZpcnN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKG1vZC0+di5Nb2R1bGUuYm9keSwgaSk7Ci0gICAgaWYgKGZpcnN0LT5raW5kID09IEV4cHJfa2luZCAmJiBmaXJzdC0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kKQorICAgIGlmIChmaXJzdC0+a2luZCA9PSBFeHByX2tpbmQKKyAgICAgICAgJiYgKGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQKKyAgICAgICAgICAgIHx8IChmaXJzdC0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQKKyAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChmaXJzdC0+di5FeHByLnZhbHVlLT52LkNvbnN0YW50LnZhbHVlKSkpKQogICAgICAgICBpKys7CiAKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGFyZ3MuYyBiL1B5dGhvbi9nZXRhcmdzLmMKaW5kZXggOGFhYjA2Ny4uOTg1OGJkNSAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGFyZ3MuYworKysgYi9QeXRob24vZ2V0YXJncy5jCkBAIC0yMCwxMiArMjAsMTIgQEAKIAogI2lmZGVmIEhBVkVfREVDTFNQRUNfRExMCiAvKiBFeHBvcnQgZnVuY3Rpb25zICovCi1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CiBQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKiwgLi4uKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIHZhX2xpc3QpOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiBQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKICNlbmRpZgpAQCAtNTYsMTggKzU2LDE4IEBACiAvKiBGb3J3YXJkICovCiBzdGF0aWMgaW50IHZnZXRhcmdzMShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHNldGVycm9yKFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKiwgaW50ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0aXRlbShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwgaW50ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBzaXplX3QsIGZyZWVsaXN0X3QgKik7Ci1zdGF0aWMgY2hhciAqY29udmVydHR1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiwgY2hhciAqLCBzaXplX3QsIGludCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBjaGFyICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGZyZWVsaXN0X3QgKik7Ci1zdGF0aWMgUHlfc3NpemVfdCBjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICosIHZvaWQgKipwLCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgZ2V0YnVmZmVyKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBjaGFyKiopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKK3N0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNvbnN0IGNoYXIqKik7CiAKIHN0YXRpYyBpbnQgdmdldGFyZ3NrZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKnNraXBpdGVtKGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpza2lwaXRlbShjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiAKIGludAogUHlBcmdfUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtODIsNyArODIsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCitfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICBpbnQgcmV0dmFsOwogICAgIHZhX2xpc3QgdmE7CkBAIC0xMzAsNyArMTMwLDcgQEAKIH0KIAogaW50Ci1fUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQorX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKICAgICB2YV9saXN0IGx2YTsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgaW50IGVuZGZtdCA9IDA7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOwogICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CiAgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKQEAgLTM5NCw3ICszOTQsMTIgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwogICAgICAgICBtZXNzYWdlID0gYnVmOwogICAgIH0KLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAobXNnWzBdID09ICcoJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsIG1lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgfQogfQogCiAKQEAgLTQxNiw3ICs0MjEsNyBAQAogICAgICAgYW5kIG1zZ2J1ZiBpcyByZXR1cm5lZC4KICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnR0dXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICBpbnQgKmxldmVscywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IHRvcGxldmVsLAogICAgICAgICAgICAgIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQpAQCAtNDc0LDcgKzQ3OSw3IEBACiAKICAgICBmb3JtYXQgPSAqcF9mb3JtYXQ7CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBjaGFyICptc2c7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewpAQCAtNTAxLDExICs1MDYsMTEgQEAKIAogLyogQ29udmVydCBhIHNpbmdsZSBpdGVtLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKIAogICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKQEAgLTUzMCw3ICs1MzUsNyBAQAogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewogICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKQEAgLTU3Miw3ICs1NzcsNyBAQAogICAgV2hlbiB5b3UgYWRkIG5ldyBmb3JtYXQgY29kZXMsIHBsZWFzZSBkb24ndCBmb3JnZXQgcG9vciBza2lwaXRlbSgpIGJlbG93LgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCiB7CkBAIC04NTcsNyArODYyLDcgQEAKIAogICAgIGNhc2UgJ3knOiB7LyogYW55IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLSAgICAgICAgY2hhciAqYnVmOworICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CiAgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgewogICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsICZidWYpIDwgMCkKQEAgLTkwNCw3ICs5MDksNyBAQAogICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywgc2FyZywgbGVuLCAxLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICAgICAgfQpAQCAtOTM0LDcgKzkzOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsgLyogcmVhZC1vbmx5IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgICAgICAgICAgLyogWFhYIFJlYWxseT8gKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CkBAIC0xMDUxLDM1ICsxMDU2LDI1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihBc0NoYXJCdWZmZXIgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnU7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLSAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKLSAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLwotICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgIHMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7CiAgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAotICAgICAgICAgICAgICAgICAgICAiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhzKSk7CiAgICAgICAgICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShzKTsKICAgICAgICAgICAgIHB0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHMpOwogICAgICAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHB0ciA9ICIiOwogICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPyAic3RyIiA6ICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLyogV3JpdGUgb3V0cHV0OyBvdXRwdXQgaXMgZ3VhcmFudGVlZCB0byBiZSAwLXRlcm1pbmF0ZWQgKi8KICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CkBAIC0xMTI5LDcgKzExMjQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSArIDEgPiBCVUZGRVJfTEVOKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCBzdHJpbmcgdG9vIGxvbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3Qpc2l6ZSwgKFB5X3NzaXplX3QpKEJVRkZFUl9MRU4tMSkpOwpAQCAtMTI4Myw3ICsxMjc4LDcgQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLWNvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNoYXIgKiplcnJtc2cpCitjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gUHlfVFlQRShhcmcpLT50cF9hc19idWZmZXI7CiAgICAgUHlfc3NpemVfdCBjb3VudDsKQEAgLTEzMDUsNyArMTMwMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldGJ1ZmZlcihQeU9iamVjdCAqYXJnLCBQeV9idWZmZXIgKnZpZXcsIGNoYXIgKiplcnJtc2cpCitnZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCB2aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApIHsKICAgICAgICAgKmVycm1zZyA9ICJieXRlcy1saWtlIG9iamVjdCI7CkBAIC0xNTA3LDcgKzE1MDIsNyBAQAogICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOwogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKICAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICh8IHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MTYsMTQgKzE1MTEsMTQgQEAKICAgICAgICAgICAgIGZvcm1hdCsrOwogCiAgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAoJCBiZWZvcmUgfCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJCcpIHsKICAgICAgICAgICAgIGlmIChtYXggIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICgkIHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1NDEsNyArMTUzNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKElTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUga2V5d29yZCBsaXN0IGVudHJpZXMgKCVkKSB0aGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IHNwZWNpZmllcnMgKCVkKSIsIGxlbiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKQEAgLTE1OTMsMTQgKzE1ODgsMTQgQEAKICAgICAgICAgICoga2V5d29yZCBhcmdzICovCiAgICAgICAgIG1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKICAgICAgICAgaWYgKG1zZykgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIiVzOiAnJXMnIiwgbXNnLAorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiJXM6ICclcyciLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpICYmICgqZm9ybWF0ICE9ICd8JykgJiYgKCpmb3JtYXQgIT0gJyQnKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAibW9yZSBhcmd1bWVudCBzcGVjaWZpZXJzIHRoYW4ga2V5d29yZCBsaXN0IGVudHJpZXMgIgogICAgICAgICAgICAgIihyZW1haW5pbmcgZm9ybWF0OiclcycpIiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CkBAIC0xNjM3LDcgKzE2MzIsNyBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIHNraXBpdGVtKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKQEAgLTE3MzAsNyArMTcyNSw3IEBACiAKICAgICBjYXNlICcoJzogICAgICAgICAgIC8qIGJ5cGFzcyB0dXBsZSwgbm90IGhhbmRsZWQgYXQgYWxsIHByZXZpb3VzbHkgKi8KICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqbXNnOworICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgIGlmICgqZm9ybWF0PT0nKScpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTc2NiwxNiArMTc2MSw5IEBACiAgICAgUHlPYmplY3QgKipvOwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKLSNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCi0gICAgdmFfc3RhcnQodmFyZ3MsIG1heCk7Ci0jZWxzZQotICAgIHZhX3N0YXJ0KHZhcmdzKTsKLSNlbmRpZgotCiAgICAgYXNzZXJ0KG1pbiA+PSAwKTsKICAgICBhc3NlcnQobWluIDw9IG1heCk7CiAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICJQeUFyZ19VbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzkzLDkgKzE3ODEsMTAgQEAKICAgICAgICAgICAgICAgICAidW5wYWNrZWQgdHVwbGUgc2hvdWxkIGhhdmUgJXMlemQgZWxlbWVudHMsIgogICAgICAgICAgICAgICAgICIgYnV0IGhhcyAlemQiLAogICAgICAgICAgICAgICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpZiAobCA9PSAwKQorICAgICAgICByZXR1cm4gMTsKICAgICBpZiAobCA+IG1heCkgewogICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KApAQCAtMTgwOCw5ICsxNzk3LDE0IEBACiAgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKICAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKICAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7Ci0gICAgICAgIHZhX2VuZCh2YXJncyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgbWF4KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCiAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewogICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7CiAgICAgICAgICpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9ncmFtaW5pdC5jIGIvUHl0aG9uL2dyYW1pbml0LmMKaW5kZXggODIxMmIyYS4uMzU0ZGMxMiAxMDA2NDQKLS0tIGEvUHl0aG9uL2dyYW1pbml0LmMKKysrIGIvUHl0aG9uL2dyYW1pbml0LmMKQEAgLTIwNCwxMSArMjA0LDEzIEBACiAgICAgezMyLCA3fSwKICAgICB7MCwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfN1syXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzdbM10gPSB7CiAgICAgezMwLCAxMn0sCiAgICAgezM0LCAzfSwKKyAgICB7MCwgN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfOFsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzhbMl0gPSB7CisgICAgezMyLCAxM30sCiAgICAgezAsIDh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzlbMl0gPSB7CkBAIC0yMjEsMzUgKzIyMywzOSBAQAogICAgIHswLCAxMH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTFbM10gPSB7Ci0gICAgezMwLCAxM30sCi0gICAgezMyLCAxNH0sCisgICAgezMwLCAxNH0sCisgICAgezMyLCAxNX0sCiAgICAgezAsIDExfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xMlszXSA9IHsKICAgICB7MzIsIDd9LAotICAgIHszMSwgMTV9LAorICAgIHszMSwgMTZ9LAogICAgIHswLCAxMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTNbMl0gPSB7Ci0gICAgezMyLCAxNH0sCitzdGF0aWMgYXJjIGFyY3NfOV8xM1sxXSA9IHsKICAgICB7MCwgMTN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzE0WzJdID0gewotICAgIHszMCwgMTZ9LAotICAgIHszNCwgM30sCisgICAgezMyLCAxNX0sCisgICAgezAsIDE0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc185XzE1WzNdID0geworICAgIHszMCwgMTd9LAorICAgIHszNCwgM30sCisgICAgezAsIDE1fSwKK307CitzdGF0aWMgYXJjIGFyY3NfOV8xNlsxXSA9IHsKICAgICB7MjYsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE2WzNdID0gewotICAgIHszMiwgMTR9LAotICAgIHszMSwgMTd9LAotICAgIHswLCAxNn0sCitzdGF0aWMgYXJjIGFyY3NfOV8xN1szXSA9IHsKKyAgICB7MzIsIDE1fSwKKyAgICB7MzEsIDE4fSwKKyAgICB7MCwgMTd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE3WzFdID0gewotICAgIHsyNiwgMTN9LAorc3RhdGljIGFyYyBhcmNzXzlfMThbMV0gPSB7CisgICAgezI2LCAxNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc185WzE4XSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfOVsxOV0gPSB7CiAgICAgezMsIGFyY3NfOV8wfSwKICAgICB7MywgYXJjc185XzF9LAogICAgIHszLCBhcmNzXzlfMn0sCkBAIC0yNTcsMTcgKzI2MywxOCBAQAogICAgIHsxLCBhcmNzXzlfNH0sCiAgICAgezQsIGFyY3NfOV81fSwKICAgICB7MiwgYXJjc185XzZ9LAotICAgIHsyLCBhcmNzXzlfN30sCi0gICAgezEsIGFyY3NfOV84fSwKKyAgICB7MywgYXJjc185Xzd9LAorICAgIHsyLCBhcmNzXzlfOH0sCiAgICAgezIsIGFyY3NfOV85fSwKICAgICB7MywgYXJjc185XzEwfSwKICAgICB7MywgYXJjc185XzExfSwKICAgICB7MywgYXJjc185XzEyfSwKLSAgICB7MiwgYXJjc185XzEzfSwKKyAgICB7MSwgYXJjc185XzEzfSwKICAgICB7MiwgYXJjc185XzE0fSwKLSAgICB7MSwgYXJjc185XzE1fSwKLSAgICB7MywgYXJjc185XzE2fSwKLSAgICB7MSwgYXJjc185XzE3fSwKKyAgICB7MywgYXJjc185XzE1fSwKKyAgICB7MSwgYXJjc185XzE2fSwKKyAgICB7MywgYXJjc185XzE3fSwKKyAgICB7MSwgYXJjc185XzE4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTBfMFsxXSA9IHsKICAgICB7MjMsIDF9LApAQCAtMzE5LDExICszMjYsMTMgQEAKICAgICB7MzIsIDd9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfN1syXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV83WzNdID0gewogICAgIHszNiwgMTJ9LAogICAgIHszNCwgM30sCisgICAgezAsIDd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV84WzFdID0geworc3RhdGljIGFyYyBhcmNzXzExXzhbMl0gPSB7CisgICAgezMyLCAxM30sCiAgICAgezAsIDh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV85WzJdID0gewpAQCAtMzM2LDM1ICszNDUsMzkgQEAKICAgICB7MCwgMTB9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV8xMVszXSA9IHsKLSAgICB7MzYsIDEzfSwKLSAgICB7MzIsIDE0fSwKKyAgICB7MzYsIDE0fSwKKyAgICB7MzIsIDE1fSwKICAgICB7MCwgMTF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV8xMlszXSA9IHsKICAgICB7MzIsIDd9LAotICAgIHszMSwgMTV9LAorICAgIHszMSwgMTZ9LAogICAgIHswLCAxMn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzEzWzJdID0gewotICAgIHszMiwgMTR9LAorc3RhdGljIGFyYyBhcmNzXzExXzEzWzFdID0gewogICAgIHswLCAxM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzE0WzJdID0gewotICAgIHszNiwgMTZ9LAotICAgIHszNCwgM30sCisgICAgezMyLCAxNX0sCisgICAgezAsIDE0fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTVbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfMTVbM10gPSB7CisgICAgezM2LCAxN30sCisgICAgezM0LCAzfSwKKyAgICB7MCwgMTV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc18xMV8xNlsxXSA9IHsKICAgICB7MjYsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xNlszXSA9IHsKLSAgICB7MzIsIDE0fSwKLSAgICB7MzEsIDE3fSwKLSAgICB7MCwgMTZ9LAorc3RhdGljIGFyYyBhcmNzXzExXzE3WzNdID0geworICAgIHszMiwgMTV9LAorICAgIHszMSwgMTh9LAorICAgIHswLCAxN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE3WzFdID0gewotICAgIHsyNiwgMTN9LAorc3RhdGljIGFyYyBhcmNzXzExXzE4WzFdID0geworICAgIHsyNiwgMTR9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfMTFbMThdID0geworc3RhdGljIHN0YXRlIHN0YXRlc18xMVsxOV0gPSB7CiAgICAgezMsIGFyY3NfMTFfMH0sCiAgICAgezMsIGFyY3NfMTFfMX0sCiAgICAgezMsIGFyY3NfMTFfMn0sCkBAIC0zNzIsMTcgKzM4NSwxOCBAQAogICAgIHsxLCBhcmNzXzExXzR9LAogICAgIHs0LCBhcmNzXzExXzV9LAogICAgIHsyLCBhcmNzXzExXzZ9LAotICAgIHsyLCBhcmNzXzExXzd9LAotICAgIHsxLCBhcmNzXzExXzh9LAorICAgIHszLCBhcmNzXzExXzd9LAorICAgIHsyLCBhcmNzXzExXzh9LAogICAgIHsyLCBhcmNzXzExXzl9LAogICAgIHszLCBhcmNzXzExXzEwfSwKICAgICB7MywgYXJjc18xMV8xMX0sCiAgICAgezMsIGFyY3NfMTFfMTJ9LAotICAgIHsyLCBhcmNzXzExXzEzfSwKKyAgICB7MSwgYXJjc18xMV8xM30sCiAgICAgezIsIGFyY3NfMTFfMTR9LAotICAgIHsxLCBhcmNzXzExXzE1fSwKLSAgICB7MywgYXJjc18xMV8xNn0sCi0gICAgezEsIGFyY3NfMTFfMTd9LAorICAgIHszLCBhcmNzXzExXzE1fSwKKyAgICB7MSwgYXJjc18xMV8xNn0sCisgICAgezMsIGFyY3NfMTFfMTd9LAorICAgIHsxLCBhcmNzXzExXzE4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTJfMFsxXSA9IHsKICAgICB7MjMsIDF9LApAQCAtMTg3OSwxMSArMTg5MywxMSBAQAogICAgICAiXDAwMFwwMDBcMTAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjQsICJwYXJhbWV0ZXJzIiwgMCwgNCwgc3RhdGVzXzgsCiAgICAgICJcMDAwXDA0MFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI2NSwgInR5cGVkYXJnc2xpc3QiLCAwLCAxOCwgc3RhdGVzXzksCisgICAgezI2NSwgInR5cGVkYXJnc2xpc3QiLCAwLCAxOSwgc3RhdGVzXzksCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2NiwgInRmcGRlZiIsIDAsIDQsIHN0YXRlc18xMCwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MjY3LCAidmFyYXJnc2xpc3QiLCAwLCAxOCwgc3RhdGVzXzExLAorICAgIHsyNjcsICJ2YXJhcmdzbGlzdCIsIDAsIDE5LCBzdGF0ZXNfMTEsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwNlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2OCwgInZmcGRlZiIsIDAsIDIsIHN0YXRlc18xMiwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnQuYyBiL1B5dGhvbi9pbXBvcnQuYwppbmRleCAwYjg0M2RhLi42ZDcxZjJhIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0LmMKKysrIGIvUHl0aG9uL2ltcG9ydC5jCkBAIC0zOCwxNCArMzgsNiBAQAogCiAjaW5jbHVkZSAiY2xpbmljL2ltcG9ydC5jLmgiCiAKLS8qW3B5dGhvbiBpbnB1dF0KLWNsYXNzIGZzX3VuaWNvZGVfY29udmVydGVyKENDb252ZXJ0ZXIpOgotICAgIHR5cGUgPSAnUHlPYmplY3QgKicKLSAgICBjb252ZXJ0ZXIgPSAnUHlVbmljb2RlX0ZTRGVjb2RlcicKLQotW3B5dGhvbiBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwotLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9OWQ2Nzg2MjMwMTY2MDA2ZV0qLwotCiAvKiBJbml0aWFsaXplIHRoaW5ncyAqLwogCiB2b2lkCkBAIC0zMjAsNyArMzEyLDcgQEAKIAogCiAvKiBMaXN0IG9mIG5hbWVzIHRvIGNsZWFyIGluIHN5cyAqLwotc3RhdGljIGNoYXIqIHN5c19kZWxldGVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c19kZWxldGVzW10gPSB7CiAgICAgInBhdGgiLCAiYXJndiIsICJwczEiLCAicHMyIiwKICAgICAibGFzdF90eXBlIiwgImxhc3RfdmFsdWUiLCAibGFzdF90cmFjZWJhY2siLAogICAgICJwYXRoX2hvb2tzIiwgInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCAibWV0YV9wYXRoIiwKQEAgLTMzMCw3ICszMjIsNyBAQAogICAgIE5VTEwKIH07CiAKLXN0YXRpYyBjaGFyKiBzeXNfZmlsZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2ZpbGVzW10gPSB7CiAgICAgInN0ZGluIiwgIl9fc3RkaW5fXyIsCiAgICAgInN0ZG91dCIsICJfX3N0ZG91dF9fIiwKICAgICAic3RkZXJyIiwgIl9fc3RkZXJyX18iLApAQCAtMzQ3LDcgKzMzOSw3IEBACiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CiAgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CiAgICAgUHlPYmplY3QgKndlYWtsaXN0ID0gTlVMTDsKLSAgICBjaGFyICoqcDsKKyAgICBjb25zdCBjaGFyICogY29uc3QgKnA7CiAKICAgICBpZiAobW9kdWxlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm47IC8qIEFscmVhZHkgZG9uZSAqLwpAQCAtODgzLDEwICs4NzUsOCBAQAogICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZShjby0+Y29fZmlsZW5hbWUsIG9sZG5hbWUpKQogICAgICAgICByZXR1cm47CiAKLSAgICB0bXAgPSBjby0+Y29fZmlsZW5hbWU7Ci0gICAgY28tPmNvX2ZpbGVuYW1lID0gbmV3bmFtZTsKLSAgICBQeV9JTkNSRUYoY28tPmNvX2ZpbGVuYW1lKTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9JTkNSRUYobmV3bmFtZSk7CisgICAgUHlfWFNFVFJFRihjby0+Y29fZmlsZW5hbWUsIG5ld25hbWUpOwogCiAgICAgY29uc3RhbnRzID0gY28tPmNvX2NvbnN0czsKICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShjb25zdGFudHMpOwpAQCAtMTMzMSwxMCArMTMyMSw4IEBACiAgICAgICAgICAgICAoYWx3YXlzX3RyaW0gfHwKICAgICAgICAgICAgICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhjb2RlLT5jb19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9mcmFtZXMpID09IDApKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gKm91dGVyX2xpbms7Ci0gICAgICAgICAgICAqb3V0ZXJfbGluayA9IG5leHQ7CiAgICAgICAgICAgICBQeV9YSU5DUkVGKG5leHQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICBQeV9YU0VUUkVGKCpvdXRlcl9saW5rLCBuZXh0KTsKICAgICAgICAgICAgIHByZXZfbGluayA9IG91dGVyX2xpbms7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CkBAIC0xMzY3LDYgKzEzNTUsNyBAQAogICAgIFB5T2JqZWN0ICpmaW5hbF9tb2QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptb2QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpwYWNrYWdlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3BlYyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpmcm9tbGlzdCA9IE5VTEw7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CkBAIC0xNDIzLDIzICsxNDEyLDYzIEBACiAgICAgfQogICAgIGVsc2UgaWYgKGxldmVsID4gMCkgewogICAgICAgICBwYWNrYWdlID0gX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19wYWNrYWdlX18pOworICAgICAgICBzcGVjID0gX1B5RGljdF9HZXRJdGVtSWQoZ2xvYmFscywgJlB5SWRfX19zcGVjX18pOworCiAgICAgICAgIGlmIChwYWNrYWdlICE9IE5VTEwgJiYgcGFja2FnZSAhPSBQeV9Ob25lKSB7CiAgICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CiAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwYWNrYWdlIG11c3QgYmUgYSBzdHJpbmciKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc3BlYyAhPSBOVUxMICYmIHNwZWMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGludCBlcXVhbDsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqcGFyZW50ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzcGVjLCAicGFyZW50Iik7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXF1YWwgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocGFja2FnZSwgcGFyZW50LCBQeV9FUSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhcmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGVxdWFsIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlcXVhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfSW1wb3J0V2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50IiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNwZWMgIT0gTlVMTCAmJiBzcGVjICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHBhY2thZ2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNwZWMsICJwYXJlbnQiKTsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19zcGVjX18ucGFyZW50IG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHJlc29sdmUgcGFja2FnZSBmcm9tIF9fc3BlY19fIG9yIF9fcGFja2FnZV9fLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGluZyBiYWNrIG9uIF9fbmFtZV9fIGFuZCBfX3BhdGhfXyIsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX25hbWVfXyk7CiAgICAgICAgICAgICBpZiAocGFja2FnZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiJ19fbmFtZV9fJyBub3QgaW4gZ2xvYmFscyIpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIl9fbmFtZV9fIG11c3QgYmUgYSBzdHJpbmciKTsKLSAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhdGhfXykgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJ0aXRpb24gPSBOVUxMOwpAQCAtMTQ1OCw3ICsxNDg3LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCBwYWNrYWdlKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhwYWNrYWdlLCAiIikgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCB3aXRoIG5vIGtub3duIHBhcmVudCBwYWNrYWdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RGljdF9HZXRJdGVtKGludGVycC0+bW9kdWxlcywgcGFja2FnZSkgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAlUiBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAiCiAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQiLCBwYWNrYWdlKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRkbC5jIGIvUHl0aG9uL2ltcG9ydGRsLmMKaW5kZXggMWFhNTg1ZC4uYWMwMzI4OSAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGRsLmMKKysrIGIvUHl0aG9uL2ltcG9ydGRsLmMKQEAgLTIzLDggKzIzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApOwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBjaGFyICphc2NpaV9vbmx5X3ByZWZpeCA9ICJQeUluaXQiOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vbmFzY2lpX3ByZWZpeCA9ICJQeUluaXRVIjsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXNjaWlfb25seV9wcmVmaXggPSAiUHlJbml0IjsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgbm9uYXNjaWlfcHJlZml4ID0gIlB5SW5pdFUiOwogCiAvKiBHZXQgdGhlIHZhcmlhYmxlIHBhcnQgb2YgYSBtb2R1bGUncyBleHBvcnQgc3ltYm9sIG5hbWUuCiAgKiBSZXR1cm5zIGEgYnl0ZXMgaW5zdGFuY2UuIEZvciBub24tQVNDSUktbmFtZWQgbW9kdWxlcywgdGhlIG5hbWUgaXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRsaWIuaCBiL1B5dGhvbi9pbXBvcnRsaWIuaAppbmRleCBmYWI0MzU4Li42ODVjNTFhIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0bGliLmgKKysrIGIvUHl0aG9uL2ltcG9ydGxpYi5oCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogICAgIDEwMCwxMDEsMTE0LDExNSwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwNSwxMTAsMTAzLDMyLDEwMSwxMjAsCiAgICAgMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwOSwxMTcsMTE1LDExNiwKICAgICAzMiw5NywxMDgsMTE1LDExMSwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwMSwzMiw5OSwxMTQsMTAxLAotICAgIDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsOTAsMTAsMTE1LDExNiwKKyAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDIxOCwxMCwxMTUsMTE2LAogICAgIDk3LDk5LDEwNywxMDgsMTAxLDExOCwxMDEsMTA4LDIzMywyLDAsMCwwLDQxLDksMTE0LAogICAgIDQsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMzgsMCwwLDAsMjE4LDksCiAgICAgOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTYsMTA5LAogICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNSwxMTIsMTAxLDk5LDU4LAogICAgIDIsMCwwLDExNSwyMCwwLDAsMCwwLDMsNiwxLDE4LDMsMjEsMSwKLSAgICAxOCwxLDksMiwxMywxLDEyLDEsMTUsMSwxMywxLDExNCwxNDQsMCwwLAorICAgIDE4LDEsOSwyLDEzLDEsMTIsMSwxNSwxLDEzLDEsMTE0LDE0NSwwLDAsCiAgICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCiAgICAgMCwwLDY3LDAsMCwwLDExNSwxNDksMCwwLDAsMTI0LDAsMCwxMDYsMCwKICAgICAwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMDAsMiwwLDExMCw2LDAsCkBAIC0xMTQ5LDcgKzExNDksNyBAQAogICAgIDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMSwwLDgzLDQxLDcsNzgsCiAgICAgMTE0LDkxLDAsMCwwLDExNCwxMzQsMCwwLDAsMTE0LDEzMSwwLDAsMCwxMTQsCiAgICAgMTIxLDAsMCwwLDExNCwzMywwLDAsMCwxMTQsOTUsMCwwLDAsNDEsMTMsCi0gICAgMTE0LDk5LDAsMCwwLDExNCwxNDYsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwKKyAgICAxMTQsOTksMCwwLDAsMTE0LDE0NywwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LAogICAgIDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsOTEsCiAgICAgMCwwLDAsMTE0LDk2LDAsMCwwLDExNCwxLDAsMCwwLDExNCwxMzQsMCwKICAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsOTUsMCwwLApAQCAtMTE1OSw3ICsxMTU5LDcgQEAKICAgICAxMTIsOTcsMTE2LDEwNSw5OCwxMDgsMTAxLDExOCwyLDAsMCwxMTUsNDAsMCwwLDAsCiAgICAgMCw0LDE5LDIsMTYsMSwyNCwxLDMsMSwxNiwxLDEzLDEsNSwxLAogICAgIDI0LDEsMyw0LDEyLDEsMTUsMSwyOSwxLDEzLDEsNSwxLDI0LDEsCi0gICAgMywxLDEzLDEsMTMsMSw1LDEsMTE0LDE0OCwwLDAsMCw5OSwxLDAsCisgICAgMywxLDEzLDEsMTMsMSw1LDEsMTE0LDE0OSwwLDAsMCw5OSwxLDAsCiAgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLAogICAgIDAsMCwxMTUsMTU5LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMCwwLAogICAgIDEwNyw5LDAsMTE0LDQzLDAsMTE2LDEsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLApAQCAtMTE3NCwxNCArMTE3NCwxNCBAQAogICAgIDAsMTA2LDcsMCwyNSw4Myw0MSw0LDc4LDExNCwxMzksMCwwLDAsMTIyLDE0LAogICAgIDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwxNSwKICAgICAwLDAsMCw0MSwxMSwxMTQsOTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDE0OCwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDExMCwKKyAgICAxNDksMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwxMTAsCiAgICAgMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTM5LDAsCiAgICAgMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsNDEsMiwxMTQsODgsCiAgICAgMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKICAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxNCw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMTcsCiAgICAgMTEwLDEwOCwxMTEsOTksMTA3LDEwMSwxMDAsMTQ3LDIsMCwwLDExNSwyMCwwLDAsMCwKICAgICAwLDIsMTUsMiwxOCwxLDEwLDIsMTIsMSwxMywxLDE1LDEsMTUsMSwKLSAgICAyNCwzLDIzLDUsMTE0LDE0OSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAyNCwzLDIzLDUsMTE0LDE1MCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKICAgICAwLDAsMSwwLDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSw0NywKICAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxLDExNiwyLDAsCiAgICAgMTI0LDAsMCwxMDYsMywwLDEzMSwxLDAsMTQzLDE1LDAsMSwxMTYsNCwwLApAQCAtMTE5OCw4ICsxMTk4LDggQEAKICAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsOTcsMTE2LDMyLDEwMSwxMjAsMTA1LDExNSwKICAgICAxMTYsMTA1LDExMCwxMDMsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAzLDEwMSwxMTYsMTE1LAogICAgIDEwLDMyLDMyLDMyLDMyLDk5LDEwOCwxMTEsOTgsOTgsMTAxLDExNCwxMDEsMTAwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDc4LDQxLDUsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwKLSAgICAwLDAsMTE0LDU0LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTQ5LDAsMCwKKyAgICAxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDExNCw1NywwLDAsMCwxMTQsMTQ2LDAsCisgICAgMCwwLDExNCw1NCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE1MCwwLDAsCiAgICAgMCw0MSwxLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCiAgICAgMCwwLDExNCwxMSwwLDAsMCwxMTQsODcsMCwwLDAsMTcwLDIsMCwwLAogICAgIDExNSw2LDAsMCwwLDAsOSwxMCwxLDE2LDEsMTE0LDg3LDAsMCwwLApAQCAtMTI3NCw4ICsxMjc0LDggQEAKICAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKICAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAogICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxNTQsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsCi0gICAgMCwxMTQsNzgsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsODgsMCwwLDAsCisgICAgMTE0LDE1NSwwLDAsMCwxMTQsOTksMCwwLDAsNDEsNCwxMTQsMTUyLDAsMCwKKyAgICAwLDExNCw3OCwwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCw4OCwwLDAsMCwKICAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCiAgICAgMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIxMywyLDAsMCwKICAgICAxMTUsNCwwLDAsMCwwLDksMTgsMSwxMjIsMjcsNjYsMTE3LDEwNSwxMDgsMTE2LApAQCAtMTMxNSw3ICsxMzE1LDcgQEAKICAgICAzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsCiAgICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwKKyAgICAxMCwwLDAsMCw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LDc4LDAsMCwwLAogICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKICAgICA4LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDIzOCwyLDAsMCwxMTUsMiwwLAogICAgIDAsMCwwLDQsMTIyLDI0LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsCkBAIC0xMzI2LDcgKzEzMjYsNyBAQAogICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKICAgICAxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKICAgICA5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAogICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTAsMTAzLDEwMSwxMTYsOTUsMTE1LAogICAgIDExMSwxMTcsMTE0LDk5LDEwMSwyNDQsMiwwLDAsMTE1LDIsMCwwLDAsMCw0LAogICAgIDEyMiwyNiw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKQEAgLTEzMzYsNyArMTMzNiw3IEBACiAgICAgMTE2LDExNywxMTQsMTEwLDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDk3LDExNSwzMiw5OCwxMTcsCiAgICAgMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsCiAgICAgMTE0LDEwMSwzMiwxMTAsMTAxLDExOCwxMDEsMTE0LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwKLSAgICAxMTUsNDYsNzAsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsCisgICAgMTE1LDQ2LDcwLDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LAogICAgIDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAogICAgIDAsMCwwLDExNCwxMDksMCwwLDAsMjUwLDIsMCwwLDExNSwyLDAsMCwKICAgICAwLDAsNCwxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsCkBAIC0xMzQ0LDE0ICsxMzQ0LDE0IEBACiAgICAgMTcsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCiAgICAgMTE0LDMsMCwwLDAsMjE4LDEyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwxMDksMTAxLDExNiwKICAgICAxMDQsMTExLDEwMCwxMTQsOTIsMCwwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwKLSAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNTQsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsCi0gICAgMTM4LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDgxLDAsMCwwLDExNCwxNTYsCi0gICAgMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCw5MCwwLAotICAgIDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTUwLDAsMCwwLAorICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDE1NSwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwKKyAgICAxMzgsMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDE1NywKKyAgICAwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDkwLDAsCisgICAgMCwwLDExNCwxNDcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTEsMCwwLDAsCiAgICAgMTg2LDIsMCwwLDExNSwzMCwwLDAsMCwxMiw3LDYsMiwxOCw5LDMsCiAgICAgMSwyMSw4LDMsMSwxOCwxMSwxOCw4LDE4LDUsMywxLDIxLDUsMywKLSAgICAxLDIxLDUsMywxLDIxLDUsMTE0LDE1MCwwLDAsMCw5OSwwLDAsMCwKKyAgICAxLDIxLDUsMywxLDIxLDUsMTE0LDE1MSwwLDAsMCw5OSwwLDAsMCwKICAgICAwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsMCwKICAgICAwLDExNSwyMTEsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKICAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAxLDQsMCwxMDAsMiwwLDEwMCwzLApAQCAtMTM5OSw5ICsxMzk5LDkgQEAKICAgICAxMjQsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzEsMiwxLDgzLDEwMCwwLDAsCiAgICAgODMsMTAwLDAsMCw4Myw0MSwzLDc4LDExNCwxMDcsMCwwLDAsOTAsNiwxMDIsCiAgICAgMTE0LDExMSwxMjIsMTAxLDExMCw0MSwzLDExNCw1NywwLDAsMCwxMTQsODIsMCwwLAotICAgIDAsMTE0LDg1LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwKLSAgICAwLDAsMTE0LDE1MiwwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTQsMCwwLDAsCisgICAgMCwxMTQsODUsMCwwLDAsNDEsNCwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLAorICAgIDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NSwwLDAsMCwKICAgICAyMSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTUsMSwxOSwyLDEyMiwKICAgICAyNCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKICAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsCkBAIC0xNDE0LDkgKzE0MTQsOSBAQAogICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLAogICAgIDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwKICAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCw1NywKLSAgICAwLDAsMCwxMTQsODIsMCwwLDAsNDEsMywxMTQsMTUxLDAsMCwwLDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTUsMCwwLDAsMjgsMywwLAorICAgIDAsMCwwLDExNCw4MiwwLDAsMCw0MSwzLDExNCwxNTIsMCwwLDAsMTE0LAorICAgIDc4LDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NiwwLDAsMCwyOCwzLDAsCiAgICAgMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCiAgICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLAogICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCkBAIC0xNDI0LDcgKzE0MjQsNyBAQAogICAgIDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LAogICAgIDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsCiAgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsODgsMCwKKyAgICA3OCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw4OCwwLAogICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCiAgICAgMCwxMTQsMTM4LDAsMCwwLDM3LDMsMCwwLDExNSwwLDAsMCwwLDEyMiwKICAgICAyOCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKQEAgLTE0NTcsOCArMTQ1Nyw4IEBACiAgICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSwKICAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAogICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDExNCw5MCwKLSAgICAwLDAsMCw0MSwyLDExNCwxNTEsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNDYsCisgICAgMCwwLDAsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTQ3LAogICAgIDAsMCwwLDUwLDMsMCwwLDExNSwyLDAsMCwwLDAsNywxMjIsMjYsCiAgICAgNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA4LAogICAgIDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLApAQCAtMTQ2Nyw5ICsxNDY3LDkgQEAKICAgICA4Myw0MSwxLDEyMiw0NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAogICAgIDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwKICAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw0Niw0MSwyLDExNCw1NywwLDAsMCwxMTQsMTYyLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NiwwLDAsMCw1OSwzLAorICAgIDEwMSw0Niw0MSwyLDExNCw1NywwLDAsMCwxMTQsMTYzLDAsMCwwLDQxLDIsCisgICAgMTE0LDE1MiwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NywwLDAsMCw1OSwzLAogICAgIDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDIzLDcwLDExNCwxMTEsMTIyLDEwMSwKICAgICAxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKICAgICAxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsCkBAIC0xNDc4LDggKzE0NzgsOCBAQAogICAgIDk3LDExNSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKICAgICAxMTUsMzIsMTAwLDExMSwzMiwxMTAsMTExLDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLAogICAgIDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwxMCwwLDAsMCwKLSAgICA0MSwyLDExNCwxNTEsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTcsMCwwLDAsCisgICAgNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTU4LDAsMCwwLAogICAgIDY1LDMsMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjUsNzAsMTE0LDExMSwKICAgICAxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCiAgICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKQEAgLTE0ODksMjEgKzE0ODksMjEgQEAKICAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAogICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw0MSwKICAgICAyLDExNCw1NywwLDAsMCw5MCwxNywxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDExNCwxNTEsMCwwLDAsCisgICAgMTEwLDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDExNCwxNTIsMCwwLDAsCiAgICAgMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAogICAgIDExLDAsMCwwLDExNCwxMDksMCwwLDAsNzEsMywwLDAsMTE1LDIsMCwKICAgICAwLDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLAogICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKICAgICAxNiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw5MiwwLDAsMCwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsMTM4LAotICAgIDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsODQsMCwKLSAgICAwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLAorICAgIDExNCwzLDAsMCwwLDExNCwxNTksMCwwLDAsMTE0LDkyLDAsMCwwLDExNCwKKyAgICAxNjAsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwxMzgsCisgICAgMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsMTQ3LDAsMCwwLDExNCw4NCwwLAorICAgIDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDEwOSwwLDAsCiAgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTEsMCwwLDAsMTE0LDE2MCwwLDAsMCwzLDMsMCwwLDExNSwzMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDE2MSwwLDAsMCwzLDMsMCwwLDExNSwzMCwKICAgICAwLDAsMCwxMiw3LDYsMiwxOCw5LDMsMSwyMSw2LDMsMSwxOCwKICAgICA4LDE4LDQsMTgsOSwxOCw5LDMsMSwyMSw1LDMsMSwyMSw1LDMsCi0gICAgMSwxMTQsMTYwLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDEsMTE0LDE2MSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKICAgICAwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSw0NiwwLDAsMCwKICAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAogICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCkBAIC0xNTE2LDcgKzE1MTYsNyBAQAogICAgIDE0LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTAwLDEsCiAgICAgMCw4Myw0MSwyLDEyMiwyNCw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwxMDQsCiAgICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LDQxLAotICAgIDIsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwwLDAsNDEsMSwxMTQsMTksMCwKKyAgICAyLDExNCw1NywwLDAsMCwxMTQsMTQ2LDAsMCwwLDQxLDEsMTE0LDE5LDAsCiAgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKICAgICAwLDExNCwyMywwLDAsMCw4NCwzLDAsMCwxMTUsMiwwLDAsMCwwLAogICAgIDIsMTIyLDI4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsCkBAIC0xNTM4LDggKzE1MzgsOCBAQAogICAgIDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsCiAgICAgMCwwLDExNCwyMywwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwKICAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAotICAgIDExNCwxNjUsMCwwLDAsODAsMywwLDAsMTE1LDYsMCwwLDAsMTIsMiwKLSAgICA2LDIsMTIsNCwxMTQsMTY1LDAsMCwwLDk5LDMsMCwwLDAsMCwwLAorICAgIDExNCwxNjYsMCwwLDAsODAsMywwLDAsMTE1LDYsMCwwLDAsMTIsMiwKKyAgICA2LDIsMTIsNCwxMTQsMTY2LDAsMCwwLDk5LDMsMCwwLDAsMCwwLAogICAgIDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg4LAogICAgIDAsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDAsMSwwLDEyNCwyLDAsMTAwLAogICAgIDIsMCwyNCwxMzEsMiwwLDEyNSwzLDAsMTE2LDEsMCwxMjQsMywwLDEzMSwKQEAgLTE1NjIsNDI4ICsxNTYyLDQ2MCBAQAogICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LAogICAgIDExNCwxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSw5NSwxMTAsOTcsMTA5LDEwMSw5MywzLDAsMCwKICAgICAxMTUsMTAsMCwwLDAsMCwyLDIyLDEsMTgsMSwxMiwxLDEwLDEsMTE0LAotICAgIDE3MSwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsCisgICAgMTcyLDAsMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwKICAgICAwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LDAsMCwwLDEyNCwwLAogICAgIDAsMTA2LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsMywwLAogICAgIDEyNCwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwzNCwwLDEwMCwwLDAsODMsCiAgICAgMTE2LDEsMCwxMjQsMSwwLDEyNCwzLDAsMTMxLDIsMCw4Myw0MSwxLDc4LAotICAgIDQxLDIsMTE0LDE1NSwwLDAsMCwxMTQsODUsMCwwLDAsNDEsNCwyMTgsNiwKLSAgICAxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsMTUsMCwwLDAsMTE0LDE1MiwwLDAsMCwKKyAgICA0MSwyLDExNCwxNTYsMCwwLDAsMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDYsCisgICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDE1LDAsMCwwLDExNCwxNTMsMCwwLDAsCiAgICAgMTE0LDk5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAogICAgIDExLDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksCiAgICAgOTUsMTA4LDEwMSwxMDMsOTcsOTksMTIxLDEwMiwzLDAsMCwxMTUsOCwwLDAsMCwKLSAgICAwLDMsMTgsMSwxMiwxLDQsMSwxMTQsMTczLDAsMCwwLDk5LDMsMCwKLSAgICAwLDAsMCwwLDAsMCw5LDAsMCwwLDI3LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw0MiwxLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOSwwLDExNCw0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwKLSAgICAxMjQsMCwwLDExNiwwLDAsMTA2LDUsMCwxMDcsNiwwLDEyNSwzLDAsMTIwLAotICAgIDIzNSwwLDExNiwwLDAsMTA2LDEsMCw2OCw5MywyMjAsMCwxMjUsNCwwLDExNiwKLSAgICA2LDAsMTMxLDAsMCwxNDMsOTAsMCwxLDEyMSwxMywwLDEyNCw0LDAsMTA2LAotICAgIDcsMCwxMjUsNSwwLDg3LDExMCw1MSwwLDQsMTE2LDgsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTQ4LDAsMSwxLDEsMTE2LDksMCwxMjQsNCwwLDEyNCwwLDAsMTI0LAotICAgIDEsMCwxMzEsMywwLDEyNSw2LDAsMTI0LDYsMCwxMDAsMSwwLDEwNyw4LAotICAgIDAsMTE0LDE0NCwwLDExOSw2NiwwLDg5LDExMCwxOSwwLDg4LDEyNCw1LDAsMTI0LAotICAgIDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDMsMCwxMjUsNiwwLDg3LDEwMCwKLSAgICAxLDAsODEsODIsODgsMTI0LDYsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDY2LAotICAgIDAsMTI0LDMsMCwxMiwxMTQsMjYsMSwxMjQsMCwwLDExNiwwLDAsMTA2LDUsCi0gICAgMCwxMDcsNiwwLDExNCwyNiwxLDExNiwwLDAsMTA2LDUsMCwxMjQsMCwwLAotICAgIDI1LDEyNSw3LDAsMTIxLDEzLDAsMTI0LDcsMCwxMDYsMTAsMCwxMjUsOCwwLAotICAgIDg3LDExMCwyMiwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMiwxLDEsMSwKLSAgICAxLDEyNCw2LDAsODMsODksMTEzLDMwLDEsODgsMTI0LDgsMCwxMDAsMSwwLAotICAgIDEwNyw4LDAsMTE0LDE5LDEsMTI0LDYsMCw4MywxMjQsOCwwLDgzLDExMyw2NiwKLSAgICAwLDEyNCw2LDAsODMsMTEzLDY2LDAsODcsMTAwLDEsMCw4MywxMDAsMSwwLAotICAgIDgzLDQxLDMsMTIyLDIzLDcwLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDM5LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDc4LDEyMiwyMiwxMTUsCi0gICAgMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDEwMSwxMDksMTEyLDExNiwxMjEsNDEsMTEsMTE0LDE0LDAsMCwwLDIxOCw5LDEwOSwxMDEsCi0gICAgMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDExNCwxNDEsMCwwLDAsMTE0LDE0MiwwLDAsCi0gICAgMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLAotICAgIDExNCwyMSwwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LAotICAgIDk2LDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDk1LDAsMCwwLDQxLDksCi0gICAgMTE0LDE1LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDE1MywwLDAsMCw5MCwKLSAgICA5LDEwNSwxMTUsOTUsMTE0LDEwMSwxMDgsMTExLDk3LDEwMCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxNTQsMCwwLDAsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTUsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDEwLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMTEsMywKLSAgICAwLDAsMTE1LDQ4LDAsMCwwLDAsMiwyNSwxLDE2LDQsMTUsMSwxNiwKLSAgICAxLDEwLDEsMywxLDEzLDEsMTMsMSwxOCwxLDEyLDEsOCwyLDI1LAotICAgIDEsMTIsMiwyMiwxLDEzLDEsMywxLDEzLDEsMTMsNCw5LDIsMTIsCi0gICAgMSw0LDIsNywyLDgsMiwxMTQsMTc2LDAsMCwwLDk5LDMsMCwwLAotICAgIDAsMCwwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE4NSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTE2LDEsMCwxMzEsCi0gICAgMiwwLDExNSw0MiwwLDExNiwyLDAsMTAwLDEsMCwxMDYsMywwLDExNiw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLAotICAgIDEyNCwyLDAsMTAwLDIsMCwxMDcsMCwwLDExNCw2NiwwLDExNiw1LDAsMTAwLAotICAgIDMsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNyw0LAotICAgIDAsMTE0LDE1MCwwLDExNiwwLDAsMTI0LDEsMCwxMTYsMSwwLDEzMSwyLDAsCi0gICAgMTE1LDEwOCwwLDExNiwyLDAsMTAwLDQsMCwxMzEsMSwwLDEzMCwxLDAsMTEwLAotICAgIDQyLDAsMTI0LDEsMCwxMTYsNiwwLDEwNiw3LDAsMTA3LDcsMCwxMTQsMTUwLAotICAgIDAsMTAwLDUsMCwxMjUsMywwLDExNiw4LDAsMTI0LDMsMCwxMDYsMywwLAotICAgIDEyNCwxLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDAsMCwxMiwKLSAgICAxMTQsMTgxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNywyLDAsMTE0LDE4MSwwLDExNiwKLSAgICA1LDAsMTAwLDYsMCwxMzEsMSwwLDEzMCwxLDAsMTAwLDcsMCw4Myw0MSwKLSAgICA4LDEyMiwyOCw4NiwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwzNCwxMTUsOTcsMTEwLDEwMSwzNCw0NiwxMjIsCi0gICAgMzEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTA5LDExNywxMTUsCi0gICAgMTE2LDMyLDk4LDEwMSwzMiwxMTUsMTE2LDExNCw0NCwzMiwxMTAsMTExLDExNiwzMiwxMjMsMTI1LAotICAgIDExNCwzMywwLDAsMCwxMjIsMTgsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksMTE3LDExNSwKLSAgICAxMTYsMzIsOTgsMTAxLDMyLDYyLDYxLDMyLDQ4LDEyMiwzMSw5NSw5NSwxMTIsOTcsOTksCi0gICAgMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LAotICAgIDExMSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMjIsNjEsODAsOTcsMTE0LDEwMSwKLSAgICAxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsNDQsMzIsOTksOTcsMTEwLDExMCwxMTEsCi0gICAgMTE2LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LAotICAgIDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTIyLDE3LDY5LDEwOSwxMTIsMTE2LDEyMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw3OCw0MSw5LDIxOCwKLSAgICAxMCwxMDUsMTE1LDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDIxOCwzLDExNSwxMTYsMTE0LAotICAgIDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsCi0gICAgMTE0LDEzLDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwKLSAgICAyMSwwLDAsMCwyMTgsMTEsODMsMTIxLDExNSwxMTYsMTAxLDEwOSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsNDEsNCwxMTQsMTUsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTcwLDAsCi0gICAgMCwwLDExNCwxNDcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNSw5NywxMTAsMTA1LDExNiwxMjEsOTUsCi0gICAgOTksMTA0LDEwMSw5OSwxMDcsMTUxLDMsMCwwLDExNSwyNCwwLDAsMCwwLDIsCi0gICAgMTUsMSwyNywxLDEyLDEsMTIsMSwxMiwxLDE1LDEsMTUsMSwxNSwxLAotICAgIDYsMiwyMSwxLDE5LDEsMTE0LDE4MSwwLDAsMCwxMjIsMTYsNzgsMTExLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMjIsNCwxMjMsCi0gICAgMzMsMTE0LDEyNSw5OSwyLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwKLSAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsNDAsMSwwLDAsMTAwLDAsMCwKLSAgICAxMjUsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwyNSwxMjUsMywwLDEyNCwzLDAsMTE0LDE3NSwwLDEyNCwzLDAsMTE2LAotICAgIDEsMCwxMDYsMiwwLDEwNyw3LDAsMTE0LDU5LDAsMTE2LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCwxLDEyNCwwLDAsMTE2LDEsMCwxMDYsMiwKLSAgICAwLDEwNyw2LDAsMTE0LDg1LDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwwLDAsCi0gICAgMjUsODMsMTE2LDEsMCwxMDYsMiwwLDEyNCwzLDAsMjUsMTI1LDQsMCwxMjEsCi0gICAgMTMsMCwxMjQsNCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsNjEsMCw0LAotICAgIDExNiw1LDAsMTA3LDEwLDAsMTE0LDE3NCwwLDEsMSwxLDExNiw2LDAsMTAwLAotICAgIDMsMCwyMywxMDYsNywwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSwKLSAgICA1LDAsMTE2LDgsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwKLSAgICAxLDEwMCwwLDAsMTMwLDIsMCw4OSwxMTAsMSwwLDg4LDExNiw5LDAsMTI0LAotICAgIDAsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMjMyLDAsMTE2LDgsMCwxMTYsNiwwLDEwNiw3LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwKLSAgICAxLDAsMTEwLDEyLDAsMTE2LDEwLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LAotICAgIDAsMTI0LDMsMCwxMTQsMzYsMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDMsMCwKLSAgICAyNSwxMjUsNCwwLDExNiwxMSwwLDEyNCw0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEwMCwxLDAsMTMxLDEsMCwxMDAsNSwwLDI1LDEyNCw3LDAsMTMxLDMsMCwKLSAgICAxLDEyNCw3LDAsODMsNDEsNiw3OCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLAotICAgIDAsMCwxMjIsMjMsNTksMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDExNiwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxNDAsMCwwLDAsNDEsMTIsMTE0LDEyMiwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsMTMxLDAsMCwwLAotICAgIDExNCw5NiwwLDAsMCwyMTgsOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsCi0gICAgNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzYsMCwwLDAsMTE0LDE0OSwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsCi0gICAgNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMTQsMTUyLDAsMCwwLDExNCwxMjMsMCwKLSAgICAwLDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxMTQsMTQ3LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDIzLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LAotICAgIDExNywxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNzEsMywwLDAsMTE1LDQyLDAsMCwKLSAgICAwLDAsMSw2LDEsMTksMSw2LDEsMTUsMSwxMywyLDE1LDEsMTEsCi0gICAgMSwxMywxLDMsMSwxMywxLDEzLDEsMjIsMSwyNiwxLDE1LDEsMTIsCi0gICAgMSwzMCwyLDEyLDEsNiwyLDEzLDEsMjksMSwxMTQsMTg0LDAsMCwwLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEwLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwzNywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxNDMsMTgsMCwxLDExNiwxLDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsODMsODcsMTAwLDEsMCw4MSw4Miw4OCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLDk3LDExMCwxMDAsMzIsMTA4LDExMSw5NywxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCw1NCwwLDAsCi0gICAgMCwxMTQsMTg0LDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwwLDExNCwxODMsMCwKKyAgICAwLDMsMTgsMSwxMiwxLDQsMSwxMTQsMTc0LDAsMCwwLDk5LDMsMCwKKyAgICAwLDAsMCwwLDAsMCwxMCwwLDAsMCwyNywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNTMsMSwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNSwzLDAsCisgICAgMTI0LDMsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDMzLDAsMTE2LDIsMCwxMDAsCisgICAgMiwwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMywwLDExNSw1NSwwLDExNiwzLAorICAgIDAsMTA2LDQsMCwxMDAsMywwLDExNiw1LDAsMTMxLDIsMCwxLDEyNCwwLAorICAgIDAsMTE2LDAsMCwxMDYsNiwwLDEwNyw2LDAsMTI1LDQsMCwxMjAsMjMyLDAsCisgICAgMTI0LDMsMCw2OCw5MywyMjAsMCwxMjUsNSwwLDExNiw3LDAsMTMxLDAsMCwKKyAgICAxNDMsOTAsMCwxLDEyMSwxMywwLDEyNCw1LDAsMTA2LDgsMCwxMjUsNiwwLAorICAgIDg3LDExMCw1MSwwLDQsMTE2LDksMCwxMDcsMTAsMCwxMTQsMTU5LDAsMSwxLAorICAgIDEsMTE2LDEwLDAsMTI0LDUsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDMsMCwKKyAgICAxMjUsNywwLDEyNCw3LDAsMTAwLDEsMCwxMDcsOCwwLDExNCwxNTUsMCwxMTksCisgICAgNzcsMCw4OSwxMTAsMTksMCw4OCwxMjQsNiwwLDEyNCwwLDAsMTI0LDEsMCwKKyAgICAxMjQsMiwwLDEzMSwzLDAsMTI1LDcsMCw4NywxMDAsMSwwLDgxLDgyLDg4LAorICAgIDEyNCw3LDAsMTAwLDEsMCwxMDcsOSwwLDExNCw3NywwLDEyNCw0LDAsMTIsCisgICAgMTE0LDM3LDEsMTI0LDAsMCwxMTYsMCwwLDEwNiw2LDAsMTA3LDYsMCwxMTQsCisgICAgMzcsMSwxMTYsMCwwLDEwNiw2LDAsMTI0LDAsMCwyNSwxMjUsOCwwLDEyMSwKKyAgICAxMywwLDEyNCw4LDAsMTA2LDExLDAsMTI1LDksMCw4NywxMTAsMjIsMCw0LAorICAgIDExNiw5LDAsMTA3LDEwLDAsMTE0LDEzLDEsMSwxLDEsMTI0LDcsMCw4MywKKyAgICA4OSwxMTMsNDEsMSw4OCwxMjQsOSwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzAsCisgICAgMSwxMjQsNywwLDgzLDEyNCw5LDAsODMsMTEzLDc3LDAsMTI0LDcsMCw4MywKKyAgICAxMTMsNzcsMCw4NywxMDAsMSwwLDgzLDEwMCwxLDAsODMsNDEsNCwxMjIsMjMsCisgICAgNzAsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsNzgsMTIyLDUzLDExNSwxMjEsMTE1LDQ2LDEwOSwxMDEsCisgICAgMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDQsCisgICAgMzIsODAsMTIxLDExNiwxMDQsMTExLDExMCwzMiwxMDUsMTE1LDMyLDEwOCwxMDUsMTA3LDEwMSwxMDgsCisgICAgMTIxLDMyLDExNSwxMDQsMTE3LDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMTAwLDExMSwxMTksMTEwLDEyMiwKKyAgICAyMiwxMTUsMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCisgICAgMTE1LDMyLDEwMSwxMDksMTEyLDExNiwxMjEsNDEsMTIsMTE0LDE0LDAsMCwwLDIxOCw5LAorICAgIDEwOSwxMDEsMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDExNCw3NywwLDAsMCwxMTQsMTQyLAorICAgIDAsMCwwLDExNCwxNDMsMCwwLDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTQsMjEsMCwwLDAsMTE0LDE2NiwwLDAsCisgICAgMCwxMTQsMTU1LDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsMTc0LDAsMCwwLAorICAgIDExNCw5NSwwLDAsMCw0MSwxMCwxMTQsMTUsMCwwLDAsMTE0LDE1MywwLDAsCisgICAgMCwxMTQsMTU0LDAsMCwwLDExNCwxNzUsMCwwLDAsOTAsOSwxMDUsMTE1LDk1LAorICAgIDExNCwxMDEsMTA4LDExMSw5NywxMDAsMTE0LDE3MywwLDAsMCwxMTQsMTU1LDAsMCwwLAorICAgIDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDk1LDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMCwKKyAgICA5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTExLDMsMCwwLDExNSw1NCwKKyAgICAwLDAsMCwwLDIsOSwxLDEyLDIsMTIsMyw2LDEsMTYsNSwxNSwKKyAgICAxLDEzLDEsMTAsMSwzLDEsMTMsMSwxMywxLDE4LDEsMTIsMSw4LAorICAgIDIsMjUsMSwxMiwyLDIyLDEsMTMsMSwzLDEsMTMsMSwxMyw0LDksCisgICAgMiwxMiwxLDQsMiw3LDIsOCwyLDExNCwxNzcsMCwwLDAsOTksMywKKyAgICAwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNCwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMjA2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMTYsMSwKKyAgICAwLDEzMSwyLDAsMTE1LDQyLDAsMTE2LDIsMCwxMDAsMSwwLDEwNiwzLDAsCisgICAgMTE2LDQsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwKKyAgICAxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNywwLDAsMTE0LDY2LDAsMTE2LDUsCisgICAgMCwxMDAsMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMiwwLDEwMCwyLDAsCisgICAgMTA3LDQsMCwxMTQsMTcxLDAsMTE2LDAsMCwxMjQsMSwwLDExNiwxLDAsMTMxLAorICAgIDIsMCwxMTUsMTA4LDAsMTE2LDIsMCwxMDAsNCwwLDEzMSwxLDAsMTMwLDEsCisgICAgMCwxMTAsNjMsMCwxMjQsMSwwLDExNSwxMjksMCwxMTYsNiwwLDEwMCw1LDAsCisgICAgMTMxLDEsMCwxMzAsMSwwLDExMCw0MiwwLDEyNCwxLDAsMTE2LDcsMCwxMDYsCisgICAgOCwwLDEwNyw3LDAsMTE0LDE3MSwwLDEwMCw2LDAsMTI1LDMsMCwxMTYsOSwKKyAgICAwLDEyNCwzLDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTMxLDEsMCwKKyAgICAxMzAsMSwwLDEyNCwwLDAsMTIsMTE0LDIwMiwwLDEyNCwyLDAsMTAwLDIsMCwKKyAgICAxMDcsMiwwLDExNCwyMDIsMCwxMTYsNSwwLDEwMCw3LDAsMTMxLDEsMCwxMzAsCisgICAgMSwwLDEwMCw4LDAsODMsNDEsOSwxMjIsMjgsODYsMTAxLDExNCwxMDUsMTAyLDEyMSwKKyAgICAzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsMzIsMzQsCisgICAgMTE1LDk3LDExMCwxMDEsMzQsNDYsMTIyLDMxLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCwKKyAgICA5NywxMDksMTAxLDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDExNiwxMTQsNDQsCisgICAgMzIsMTEwLDExMSwxMTYsMzIsMTIzLDEyNSwxMTQsMzMsMCwwLDAsMTIyLDE4LDEwOCwxMDEsCisgICAgMTE4LDEwMSwxMDgsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiw2Miw2MSwzMiw0OCwKKyAgICAxMjIsMzEsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExMCwxMTEsCisgICAgMTE2LDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsOTcsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwKKyAgICAxMDMsMTIyLDU0LDk3LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LDEwMSwxMDAsMzIsMTE0LDEwMSwxMDgsCisgICAgOTcsMTE2LDEwNSwxMTgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExOSwxMDUsMTE2LAorICAgIDEwNCwzMiwxMTAsMTExLDMyLDEwNywxMTAsMTExLDExOSwxMTAsMzIsMTEyLDk3LDExNCwxMDEsMTEwLAorICAgIDExNiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTIyLDYxLDgwLDk3LDExNCwxMDEsMTEwLAorICAgIDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMTAsMTExLAorICAgIDExNiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDQ0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwKKyAgICAzMiwxMTIsMTAxLDExNCwxMDIsMTExLDExNCwxMDksMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEyMiwxNyw2OSwxMDksMTEyLDExNiwxMjEsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNzgsNDEsMTAsMjE4LDEwLAorICAgIDEwNSwxMTUsMTA1LDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LAorICAgIDksODQsMTIxLDExMiwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCwxMTQsCisgICAgMTMsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE0LAorICAgIDAsMCwwLDExNCwyMSwwLDAsMCwyMTgsMTEsODMsMTIxLDExNSwxMTYsMTAxLDEwOSwKKyAgICA2OSwxMTQsMTE0LDExMSwxMTQsNDEsNCwxMTQsMTUsMCwwLDAsMTE0LDE3MCwwLDAsCisgICAgMCwxMTQsMTcxLDAsMCwwLDExNCwxNDgsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNSw5NywxMTAsCisgICAgMTA1LDExNiwxMjEsOTUsOTksMTA0LDEwMSw5OSwxMDcsMTU4LDMsMCwwLDExNSwyOCwwLAorICAgIDAsMCwwLDIsMTUsMSwyNywxLDEyLDEsMTIsMSwxMiwxLDE1LDEsCisgICAgMTUsMSw2LDEsMTUsMiwxNSwxLDYsMiwyMSwxLDE5LDEsMTE0LDE4MiwKKyAgICAwLDAsMCwxMjIsMTYsNzgsMTExLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCwKKyAgICA5NywxMDksMTAxLDEwMCwzMiwxMjIsNCwxMjMsMzMsMTE0LDEyNSw5OSwyLDAsMCwwLAorICAgIDAsMCwwLDAsOCwwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsNDAsMSwwLDAsMTAwLDAsMCwxMjUsMiwwLDEyNCwwLDAsMTA2LDAsCisgICAgMCwxMDAsMSwwLDEzMSwxLDAsMTAwLDIsMCwyNSwxMjUsMywwLDEyNCwzLAorICAgIDAsMTE0LDE3NSwwLDEyNCwzLDAsMTE2LDEsMCwxMDYsMiwwLDEwNyw3LDAsCisgICAgMTE0LDU5LDAsMTE2LDMsMCwxMjQsMSwwLDEyNCwzLDAsMTMxLDIsMCwxLAorICAgIDEyNCwwLDAsMTE2LDEsMCwxMDYsMiwwLDEwNyw2LDAsMTE0LDg1LDAsMTE2LAorICAgIDEsMCwxMDYsMiwwLDEyNCwwLDAsMjUsODMsMTE2LDEsMCwxMDYsMiwwLAorICAgIDEyNCwzLDAsMjUsMTI1LDQsMCwxMjEsMTMsMCwxMjQsNCwwLDEwNiw0LDAsCisgICAgMTI1LDIsMCw4NywxMTAsNjEsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDE3NCwKKyAgICAwLDEsMSwxLDExNiw2LDAsMTAwLDMsMCwyMywxMDYsNywwLDEyNCwwLAorICAgIDAsMTI0LDMsMCwxMzEsMiwwLDEyNSw1LDAsMTE2LDgsMCwxMjQsNSwwLAorICAgIDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwxLDEwMCwwLDAsMTMwLDIsMCw4OSwKKyAgICAxMTAsMSwwLDg4LDExNiw5LDAsMTI0LDAsMCwxMjQsMiwwLDEzMSwyLDAsCisgICAgMTI1LDYsMCwxMjQsNiwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMjMyLDAsMTE2LAorICAgIDgsMCwxMTYsNiwwLDEwNiw3LDAsMTI0LDAsMCwxMzEsMSwwLDEwMCw0LAorICAgIDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwxLDAsMTEwLDEyLDAsMTE2LDEwLDAsCisgICAgMTI0LDYsMCwxMzEsMSwwLDEyNSw3LDAsMTI0LDMsMCwxMTQsMzYsMSwxMTYsCisgICAgMSwwLDEwNiwyLDAsMTI0LDMsMCwyNSwxMjUsNCwwLDExNiwxMSwwLDEyNCwKKyAgICA0LDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwxLDAsMTMxLDEsMCwxMDAsNSwKKyAgICAwLDI1LDEyNCw3LDAsMTMxLDMsMCwxLDEyNCw3LDAsODMsNDEsNiw3OCwKKyAgICAxMTQsMTIxLDAsMCwwLDExNCwzMywwLDAsMCwxMjIsMjMsNTksMzIsMTIzLDMzLAorICAgIDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMTIsOTcsOTksMTA3LAorICAgIDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLDExNCwxNDEsMCwwLDAsNDEsMTIsMTE0LAorICAgIDEyMiwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCw2NSwKKyAgICAwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCw5NiwwLDAsMCwyMTgsOCw5NSwKKyAgICA2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsNTAsMCwwLDAsMTE0LDc3LDAsMCwKKyAgICAwLDExNCwxNzcsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsNSwwLDAsMCwKKyAgICA0MSw4LDExNCwxNSwwLDAsMCwyMTgsNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwKKyAgICAxMTQsMTUzLDAsMCwwLDExNCwxMjMsMCwwLDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsCisgICAgMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTQ4LDAsMCwwLDExNCw4OCwKKyAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDIzLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywKKyAgICAxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwKKyAgICAxODEsMywwLDAsMTE1LDQyLDAsMCwwLDAsMSw2LDEsMTksMSw2LAorICAgIDEsMTUsMSwxMywyLDE1LDEsMTEsMSwxMywxLDMsMSwxMywxLDEzLAorICAgIDEsMjIsMSwyNiwxLDE1LDEsMTIsMSwzMCwyLDEyLDEsNiwyLDEzLAorICAgIDEsMjksMSwxMTQsMTg1LDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSwzNywwLAorICAgIDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxNDMsMTgsMCwxLDExNiwKKyAgICAxLDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwyLDAsODMsODcsMTAwLDEsMCwKKyAgICA4MSw4Miw4OCwxMDAsMSwwLDgzLDQxLDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLAorICAgIDk3LDExMCwxMDAsMzIsMTA4LDExMSw5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNywKKyAgICA0Niw3OCw0MSwyLDExNCw1NCwwLDAsMCwxMTQsMTg1LDAsMCwwLDQxLDIsCisgICAgMTE0LDE1LDAsMCwwLDExNCwxODQsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE0LDk1LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDIwOCwzLDAsMCwxMTUsNCwwLAorICAgIDAsMCwwLDIsMTMsMSwxMTQsMTg2LDAsMCwwLDExNCwzMywwLDAsMCwKKyAgICA5OSwzLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw0LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxNjYsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAorICAgIDEyNCwxLDAsMTI0LDIsMCwxMzEsMywwLDEsMTI0LDIsMCwxMDAsMSwwLAorICAgIDEwNyw0LDAsMTE0LDQ2LDAsMTE2LDEsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LAorICAgIDIsMCwxMzEsMywwLDEyNSwwLDAsMTE2LDIsMCwxMDYsMywwLDEzMSwwLAorICAgIDAsMSwxMjQsMCwwLDExNiw0LDAsMTA2LDUsMCwxMDcsNywwLDExNCw4NCwKKyAgICAwLDExNiw2LDAsMTI0LDAsMCwxMTYsNywwLDEzMSwyLDAsODMsMTE2LDQsCisgICAgMCwxMDYsNSwwLDEyNCwwLDAsMjUsMTI1LDMsMCwxMjQsMywwLDEwMCwyLAorICAgIDAsMTA3LDgsMCwxMTQsMTUyLDAsMTE2LDIsMCwxMDYsOCwwLDEzMSwwLDAsCisgICAgMSwxMDAsMywwLDEwNiw5LDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsCisgICAgMTE2LDEwLDAsMTI0LDQsMCwxMDAsNCwwLDEyNCwwLDAsMTMxLDEsMSwxMzAsCisgICAgMSwwLDExNiwxMSwwLDEyNCwwLDAsMTMxLDEsMCwxLDEyNCwzLDAsODMsCisgICAgNDEsNSw5Nyw1MCwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk3LDExMCwKKyAgICAxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMDUsMTE2LDExNSwKKyAgICAzMiwxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsMTA4LDEwOCwzMiwxMDUsMTE1LDEwLDMyLAorICAgIDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDksOTcsMTAwLDEwMSwzMiwxMDIsMTE0LAorICAgIDExMSwxMDksNDQsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTAxLDExOCwxMDEsCisgICAgMTA4LDMyLDk3LDEwMCwxMDYsMTE3LDExNSwxMTYsMTA5LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTAzLDExNCwxMDEsOTcsMTE2LDEwMSwxMTUsMTE2LDMyLDk5LDExMSwxMDksMTA5LDExMSwxMTAsMzIsCisgICAgMTAwLDEwMSwxMTAsMTExLDEwOSwxMDUsMTEwLDk3LDExNiwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLAorICAgIDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwxMDUsMTE2LDEyMSwxMCwzMiwzMiwzMiwKKyAgICAzMiw5OCwxMDEsMTE2LDExOSwxMDEsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5NywxMTAsMTAwLDMyLDk1LDk1LDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDk1LDk1LDQ2LDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTA4LAorICAgIDExNywxMDAsMTAxLDExNSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTEyLAorICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDAsMTA1LDEwMCwzMiwxMTAsCisgICAgMTExLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMzMsMCwwLDAsNzgsMTIyLAorICAgIDQwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExMSwxMDIsMzIsMTIzLDEyNSwzMiwxMDQsOTcsCisgICAgMTA4LDExNiwxMDEsMTAwLDU5LDMyLDc4LDExMSwxMTAsMTAxLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwKKyAgICAxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDExNCwxNSwwLDAsMCw0MSwxMiwKKyAgICAxMTQsMTgyLDAsMCwwLDExNCwxNzIsMCwwLDAsMTE0LDU3LDAsMCwwLDExNCwKKyAgICAxNDYsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsMTg2LAorICAgIDAsMCwwLDIxOCwxMSw5NSwxMDMsOTksMTAwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDExNCw1OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwKKyAgICA2MywwLDAsMCw0MSw1LDExNCwxNSwwLDAsMCwxMTQsMTcwLDAsMCwwLAorICAgIDExNCwxNzEsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw3NCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTg3LAorICAgIDAsMCwwLDIxNCwzLDAsMCwxMTUsMjgsMCwwLDAsMCw5LDE2LDEsCisgICAgMTIsMSwxOCwxLDEwLDEsMTUsMSwxMywxLDEzLDEsMTIsMSwxMCwxLAorICAgIDYsMSw5LDEsMTgsMSwxMCwxLDExNCwxODcsMCwwLDAsOTksMywwLAorICAgIDAsMCwwLDAsMCwwLDYsMCwwLDAsMTcsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDIzOSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTAwLDEsMCwKKyAgICAxMzEsMiwwLDExNCwyMzUsMCwxMDAsMiwwLDEyNCwxLDAsMTA3LDYsMCwxMTQsCisgICAgODMsMCwxMTYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMSwwLDEyNCwxLAorICAgIDAsMTA2LDIsMCwxMDAsMiwwLDEzMSwxLDAsMSwxMTYsMCwwLDEyNCwwLAorICAgIDAsMTAwLDMsMCwxMzEsMiwwLDExNCw4MywwLDEyNCwxLDAsMTA2LDMsMCwKKyAgICAxMjQsMCwwLDEwNiw0LDAsMTMxLDEsMCwxLDEyMCwxNDksMCwxMjQsMSwwLAorICAgIDY4LDkzLDE0MSwwLDEyNSwzLDAsMTE2LDAsMCwxMjQsMCwwLDEyNCwzLDAsCisgICAgMTMxLDIsMCwxMTUsOTAsMCwxMDAsNCwwLDEwNiw1LDAsMTI0LDAsMCwxMDYsCisgICAgNiwwLDEyNCwzLDAsMTMxLDIsMCwxMjUsNCwwLDEyMSwxNywwLDExNiw3LAorICAgIDAsMTI0LDIsMCwxMjQsNCwwLDEzMSwyLDAsMSw4NywxMTMsOTAsMCw0LAorICAgIDExNiw4LDAsMTA3LDEwLDAsMTE0LDIzMCwwLDEsMTI1LDUsMCwxLDEyMiw0NywKKyAgICAwLDExNiw5LDAsMTI0LDUsMCwxMzEsMSwwLDEwNiwxMCwwLDExNiwxMSwwLAorICAgIDEzMSwxLDAsMTE0LDIwOSwwLDEyNCw1LDAsMTA2LDEyLDAsMTI0LDQsMCwxMDcsCisgICAgMiwwLDExNCwyMDksMCwxMTksOTAsMCwxMzAsMCwwLDg3LDg5LDEwMCw1LDAsCisgICAgMTAwLDUsMCwxMjUsNSwwLDEyNiw1LDAsODgsMTEzLDkwLDAsODgsMTEzLDkwLAorICAgIDAsODcsMTI0LDAsMCw4Myw0MSw2LDEyMiwyMzgsNzAsMTA1LDEwMywxMTcsMTE0LDEwMSwKKyAgICAzMiwxMTEsMTE3LDExNiwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDk1LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsCisgICAgMTE1LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsOTcsOTgsMTA4LDEwMSwzMiwxMTksMTA0LDEwNSwKKyAgICA5OSwxMDQsMzIsMTE2LDk3LDEwNywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksCisgICAgMTAxLDMyLDExMSwxMDIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE2LDExMSwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw3MywxMTYsMzIsMTA1LDExNSwKKyAgICAzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAwLDEwMSw5OSwKKyAgICAxMTEsMTE3LDExMiwxMDgsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsCisgICAgMTExLDExMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsOTcsMTE1LDExNSwxMTcsMTA5LDEwNSwxMTAsMTAzLAorICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzksMTE1LDEwLDMyLDMyLDMyLAorICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMTQsMTAxLAorICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTMxLDAsMCwwLDI1MCwxLDQyLAorICAgIDIxOCw3LDk1LDk1LDk3LDEwOCwxMDgsOTUsOTUsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LAorICAgIDc4LDQxLDEzLDExNCw0LDAsMCwwLDExNCwxMzAsMCwwLDAsMjE4LDYsMTE0LAorICAgIDEwMSwxMDksMTExLDExOCwxMDEsMjE4LDYsMTAxLDEyMCwxMTYsMTAxLDExMCwxMDAsMTE0LDE4OSwwLAorICAgIDAsMCwxMTQsNTAsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDY1LDAsMCwKKyAgICAwLDExNCw3NywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCw3MSwwLDAsMCwKKyAgICAyMTgsMTUsOTUsNjksODIsODIsOTUsNzcsODMsNzEsOTUsODAsODIsNjksNzAsNzMsCisgICAgODgsMTE0LDE1LDAsMCwwLDQxLDYsMTE0LDg5LDAsMCwwLDIxOCw4LDEwMiwKKyAgICAxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMTE0LDE4NCwwLDAsMCwyMTgsMSwxMjAsOTAsCisgICAgOSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsOTAsMywxMDEsMTIwLDk5LDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiwKKyAgICA5NSwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDk1LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsCisgICAgMjM4LDMsMCwwLDExNSwzNCwwLDAsMCwwLDEwLDE1LDEsMTIsMSwxMiwKKyAgICAxLDEzLDEsMTUsMSwxNiwxLDEzLDEsMTUsMSwyMSwxLDMsMSwxNywKKyAgICAxLDE4LDQsMjEsMSwxNSwxLDMsMSwyNiwxLDExNCwxOTUsMCwwLDAsCisgICAgOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMjE0LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwKKyAgICAxMDAsMSwwLDEzMSwxLDAsMTI1LDEsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLAorICAgIDIsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDEsMCwxMDAsMywwLDEwNyw5LAorICAgIDAsMTE0LDEyOCwwLDEyNCwyLDAsMTAwLDMsMCwxMDcsOSwwLDExNCwxMjQsMCwKKyAgICAxMjQsMSwwLDEyNCwyLDAsMTA2LDEsMCwxMDcsMywwLDExNCwxMjQsMCwxMTYsCisgICAgMiwwLDEwNiwzLDAsMTAwLDQsMCwxMDYsNCwwLDEwMCw1LDAsMTI0LDEsCisgICAgMCwxNTUsMiwwLDEwMCw2LDAsMTI0LDIsMCwxMDYsMSwwLDE1NSwyLDAsCisgICAgMTAwLDcsMCwxMDMsNSwwLDEzMSwxLDAsMTE2LDUsMCwxMDAsOCwwLDEwMCwKKyAgICA5LDAsMTMxLDIsMSwxLDEyNCwxLDAsODMsMTI0LDIsMCwxMDAsMywwLAorICAgIDEwNyw5LDAsMTE0LDE0NywwLDEyNCwyLDAsMTA2LDEsMCw4MywxMTYsMiwwLAorICAgIDEwNiwzLDAsMTAwLDEwLDAsMTE2LDUsMCwxMDAsOCwwLDEwMCw5LDAsMTMxLAorICAgIDIsMSwxLDEyNCwwLDAsMTAwLDExLDAsMjUsMTI1LDEsMCwxMDAsMTIsMCwKKyAgICAxMjQsMCwwLDEwNyw3LDAsMTE0LDIxMCwwLDEyNCwxLDAsMTA2LDYsMCwxMDAsCisgICAgMTMsMCwxMzEsMSwwLDEwMCwxNCwwLDI1LDEyNSwxLDAsMTI0LDEsMCw4MywKKyAgICA0MSwxNSwxMjIsMTY3LDY3LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE5LDEwNCwKKyAgICA5NywxMTYsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExNSwKKyAgICAxMDQsMTExLDExNywxMDgsMTAwLDMyLDk4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NSwKKyAgICA5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTA1LDExNSwzMiwxMTAsMTExLAorICAgIDExNiwzMiwxMDMsMTE3LDk3LDExNCw5NywxMTAsMTE2LDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsCisgICAgOTgsMTAxLDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDEwMCwzMiwxMTEsMTE0LDMyLDk5LDExMSwKKyAgICAxMTcsMTA4LDEwMCwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiw3OCwxMTEsCisgICAgMTEwLDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTExLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LAorICAgIDEwMSwxMTAsMTE2LDMyLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMTE1LDMyLDExMiwxMTQsMTExLAorICAgIDExMiwxMDEsMTE0LDMyLDExOCw5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LAorICAgIDExMCwxMTEsMTE5LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTM0LDAsMCwwLAorICAgIDExNCw5NSwwLDAsMCw3OCwyMTgsMCwxMjIsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDk1LDk1LDMyLDMzLDYxLDMyLDk1LDk1LDExNSwxMTIsMTAxLDk5LDk1LAorICAgIDk1LDQ2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsNDAsMTIyLDQsMzIsMzMsNjEsMzIsCisgICAgMjUwLDEsNDEsMTE0LDE0MCwwLDAsMCwyMzMsMywwLDAsMCwxMjIsODksOTksCisgICAgOTcsMTEwLDM5LDExNiwzMiwxMTQsMTAxLDExNSwxMTEsMTA4LDExOCwxMDEsMzIsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NSw5NSwxMTUsMTEyLDEwMSw5OSwKKyAgICA5NSw5NSwzMiwxMTEsMTE0LDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSwKKyAgICA5NSw0NCwzMiwxMDIsOTcsMTA4LDEwOCwxMDUsMTEwLDEwMywzMiw5OCw5Nyw5OSwxMDcsMzIsCisgICAgMTExLDExMCwzMiw5NSw5NSwxMTAsOTcsMTA5LDEwMSw5NSw5NSwzMiw5NywxMTAsMTAwLDMyLAorICAgIDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDExNCwxLDAsMCwwLDExNCwxMzEsMCwKKyAgICAwLDAsMTE0LDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsNDEsNywxMTQsNDIsCisgICAgMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTQyLDAsMCwwLDExNCwxNDMsMCwKKyAgICAwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwxMjIsMCwwLAorICAgIDAsNDEsMywyMTgsNywxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDExNCwxNzAsMCwwLAorICAgIDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCwxNyw5NSw5OSw5NywxMDgsOTksOTUsOTUsOTUsMTEyLAorICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDE0LDQsMCwwLDExNSwzMCwwLDAsCisgICAgMCwwLDcsMTUsMSwxNSwxLDEyLDEsMjcsMSw0MiwyLDEzLDEsNCwKKyAgICAxLDEyLDEsNywyLDksMiwxMywxLDEwLDEsMTIsMSwxOSwxLDExNCwKKyAgICAyMDAsMCwwLDAsOTksNSwwLDAsMCwwLDAsMCwwLDksMCwwLAorICAgIDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjI3LDAsMCwwLDEyNCw0LAorICAgIDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyNywwLDExNiwwLDAsMTI0LDAsMCwKKyAgICAxMzEsMSwwLDEyNSw1LDAsMTEwLDU0LDAsMTI0LDEsMCwxMDAsMiwwLDEwNywKKyAgICA5LDAsMTE0LDQ1LDAsMTI0LDEsMCwxMTAsMywwLDEwNSwwLDAsMTI1LDYsCisgICAgMCwxMTYsMSwwLDEyNCw2LDAsMTMxLDEsMCwxMjUsNywwLDExNiwwLDAsCisgICAgMTI0LDAsMCwxMjQsNywwLDEyNCw0LDAsMTMxLDMsMCwxMjUsNSwwLDEyNCwKKyAgICAzLDAsMTE1LDIwNywwLDEyNCw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNCwxMjIsCisgICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMywwLDEzMSwxLDAsCisgICAgMTAwLDEsMCwyNSwxMzEsMSwwLDgzLDEyNCwwLDAsMTE1LDEzMiwwLDEyNCw1LAorICAgIDAsODMsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTE2LDMsMCwxMjQsMCwKKyAgICAwLDEwNiwyLDAsMTAwLDMsMCwxMzEsMSwwLDEwMCwxLDAsMjUsMTMxLDEsCisgICAgMCwyNCwxMjUsOCwwLDExNiw0LDAsMTA2LDUsMCwxMjQsNSwwLDEwNiw2LAorICAgIDAsMTAwLDIsMCwxMTYsMywwLDEyNCw1LDAsMTA2LDYsMCwxMzEsMSwwLAorICAgIDEyNCw4LDAsMjQsMTMzLDIsMCwyNSwyNSw4MywxMTAsMTYsMCwxMTYsNywwLAorICAgIDEyNCw1LDAsMTI0LDMsMCwxMTYsMCwwLDEzMSwzLDAsODMsMTAwLDIsMCwKKyAgICA4Myw0MSw0LDk3LDIxNCwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk3LAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwKKyAgICAxMDEsMzIsMzksMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwzOSwzMiw5NywxMTQsMTAzLDExNywKKyAgICAxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwKKyAgICAxMDUsMTEwLDEwMiwxMDEsMTE0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTEsOTksOTksMTE3LDExNCwxMDUsCisgICAgMTEwLDEwMywzMiwxMDIsMTE0LDExMSwxMDksMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMDQsCisgICAgOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMzIsODQsMTA0LDEwMSwzMiwzOSwxMDgsMTExLDk5LAorICAgIDk3LDEwOCwxMTUsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsCisgICAgMzIsMTA1LDEwMywxMTAsMTExLDExNCwxMDEsMTAwLDQ2LDMyLDg0LDEwNCwxMDEsMTAsMzIsMzIsCisgICAgMzIsMzIsMzksMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwzOSwzMiw5NywxMTQsMTAzLAorICAgIDExNywxMDksMTAxLDExMCwxMTYsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDExNSwzMiwKKyAgICAxMTksMTA0LDk3LDExNiwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMDEsMTIwLDEwNSwxMTUsCisgICAgMTE2LDMyLDk3LDExNSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDMyLAorICAgIDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTAsMzIsMzIsCisgICAgMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsCisgICAgMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsNjAsMTAyLDExNCwxMTEsCisgICAgMTA5LDEwOCwxMDUsMTE1LDExNiw2Miw5Niw5Niw0MSw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLAorICAgIDM5LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzksMTAsMzIsMzIsMzIsMzIsOTcsMTE0LDEwMywxMTcsCisgICAgMTA5LDEwMSwxMTAsMTE2LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDExNSwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTA4LDExMSw5OSw5NywKKyAgICAxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsCisgICAgMTE0LDExMSwxMDksMzIsMTA1LDExMCwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwKKyAgICAxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsNDAsMTAxLDQ2LAorICAgIDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsNDYsNDYsMTEyLDEwNywxMDMsMzIsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDExMSwxMDAsOTYsOTYsMzIsMTE5LDExMSwxMTcsCisgICAgMTA4LDEwMCwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5NywzMiwzOSwxMDgsMTAxLDExOCwxMDEsMTA4LAorICAgIDM5LDMyLDExMSwxMDIsMzIsNTAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDMzLAorICAgIDAsMCwwLDc4LDExNCwxMjEsMCwwLDAsNDEsOCwxMTQsMTg3LDAsMCwwLAorICAgIDExNCwyMDAsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwxMDUsMTExLDExMCwKKyAgICAxMTQsMTY4LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LAorICAgIDEsMCwwLDAsMTE0LDE5NSwwLDAsMCw0MSw5LDExNCwxNSwwLDAsMCwKKyAgICAxMTQsMTk5LDAsMCwwLDIxOCw2LDEwOCwxMTEsOTksOTcsMTA4LDExNSwxMTQsMTkzLDAsCisgICAgMCwwLDExNCwxNzEsMCwwLDAsMTE0LDg5LDAsMCwwLDkwLDgsMTAzLDEwOCwKKyAgICAxMTEsOTgsOTcsMTA4LDExNSw5NSwxMTQsMTcwLDAsMCwwLDkwLDcsOTksMTE3LDExNiwKKyAgICA5NSwxMTEsMTAyLDEwMiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwyMTgsMTAsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsOTUsNDEsCisgICAgNCwwLDAsMTE1LDI2LDAsMCwwLDAsMTEsMTIsMSwxNSwyLDI0LDEsCisgICAgMTIsMSwxOCwxLDYsMywxMiwxLDIzLDEsNiwxLDQsNCwzNSwzLAorICAgIDQwLDIsMTE0LDIwMywwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw1MywwLDAsCisgICAgMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsCisgICAgMTI0LDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDQzLDAsMTE2LDIsMCwxMDAsCisgICAgMSwwLDEyNCwwLDAsMjMsMTMxLDEsMCwxMzAsMSwwLDExNiwzLDAsMTI0LAorICAgIDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDI1LDExMCwxMTEsMzIsOTgsMTE3LAorICAgIDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LAorICAgIDEwOSwxMDEsMTAwLDMyLDQxLDQsMTE0LDE1MSwwLDAsMCwxMTQsMTU1LDAsMCwwLAorICAgIDExNCw3NywwLDAsMCwxMTQsMTUwLDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwKKyAgICAwLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMSwwLDAsMCwyMTgsMTgsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsCisgICAgMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDc2LDQsMCwwLDExNSw4LDAsCisgICAgMCwwLDAsMSwxNSwxLDEyLDEsMTYsMSwxMTQsMjA0LDAsMCwwLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwxMiwwLDAsMCwxMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNzQsMSwwLDAsMTI0LDEsMCw5NywwLDAsMTI0LAorICAgIDAsMCw5NywxLDAsMTE2LDIsMCwxMTYsMSwwLDEzMSwxLDAsMTI1LDIsCisgICAgMCwxMjAsMTIzLDAsMTE2LDEsMCwxMDYsMywwLDEwNiw0LDAsMTMxLDAsMCwKKyAgICA2OCw5MywxMDYsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwwLDExNiw1LDAsCisgICAgMTI0LDQsMCwxMjQsMiwwLDEzMSwyLDAsMTE0LDQwLDAsMTI0LDMsMCwxMTYsCisgICAgMSwwLDEwNiw2LDAsMTA3LDYsMCwxMTQsOTEsMCwxMTYsNywwLDEyNSw1LAorICAgIDAsMTEwLDI3LDAsMTE2LDAsMCwxMDYsOCwwLDEyNCwzLDAsMTMxLDEsMCwKKyAgICAxMTQsNDAsMCwxMTYsOSwwLDEyNSw1LDAsMTEwLDMsMCwxMTMsNDAsMCwxMTYsCisgICAgMTAsMCwxMjQsNCwwLDEyNCw1LDAsMTMxLDIsMCwxMjUsNiwwLDExNiwxMSwKKyAgICAwLDEyNCw2LDAsMTI0LDQsMCwxMzEsMiwwLDEsMTEzLDQwLDAsODcsMTE2LAorICAgIDEsMCwxMDYsMywwLDExNiwxMiwwLDI1LDEyNSw3LDAsMTIwLDczLDAsMTAwLAorICAgIDUsMCw2OCw5Myw2NSwwLDEyNSw4LDAsMTI0LDgsMCwxMTYsMSwwLDEwNiwKKyAgICAzLDAsMTA3LDcsMCwxMTQsMjA2LDAsMTE2LDEzLDAsMTI0LDgsMCwxMzEsMSwKKyAgICAwLDEyNSw5LDAsMTEwLDEzLDAsMTE2LDEsMCwxMDYsMywwLDEyNCw4LDAsCisgICAgMjUsMTI1LDksMCwxMTYsMTQsMCwxMjQsNywwLDEyNCw4LDAsMTI0LDksMCwKKyAgICAxMzEsMywwLDEsMTEzLDE3MCwwLDg3LDEyMSwxNiwwLDExNiwxMywwLDEwMCwyLAorICAgIDAsMTMxLDEsMCwxMjUsMTAsMCw4NywxMTAsMjQsMCw0LDExNiwxNSwwLDEwNywKKyAgICAxMCwwLDExNCwyNSwxLDEsMSwxLDEwMCwzLDAsMTI1LDEwLDAsODksMTEwLAorICAgIDEsMCw4OCwxMTYsMTQsMCwxMjQsNywwLDEwMCwyLDAsMTI0LDEwLDAsMTMxLAorICAgIDMsMCwxLDExNiwxMywwLDEwMCw0LDAsMTMxLDEsMCwxMjUsMTEsMCwxMTYsCisgICAgMTQsMCwxMjQsNywwLDEwMCw0LDAsMTI0LDExLDAsMTMxLDMsMCwxLDEwMCwKKyAgICAzLDAsODMsNDEsNiwxMjIsMjUwLDgzLDEwMSwxMTYsMTE3LDExMiwzMiwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsCisgICAgNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwKKyAgICAxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsCisgICAgOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDY1LDExNSwzMiwxMTUsMTIxLDExNSwzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLAorICAgIDEwMCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDExNSwzMiw5Nyw5OSw5OSwxMDEsMTE1LDExNSwzMiw5NywxMTAsMTAwLDMyLDk1LAorICAgIDEwNSwxMDksMTEyLDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTE2LDExMSwKKyAgICAzMiwxMDgsMTExLDk3LDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMTEsMTE1LAorICAgIDEwMSwzMiwxMTYsMTE5LDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA5LDExNywKKyAgICAxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMDEsMTIwLDExMiwxMDgsMTA1LDk5LDEwNSwxMTYsMTA4LDEyMSwKKyAgICAzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsMTE0LDE0MiwwLDAsMCwxMTQsMzQsMCwwLDAsNzgsMTE0LDYyLDAsMCwKKyAgICAwLDQxLDEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDQxLDE2LAorICAgIDExNCw1NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDEzLDAsMCwwLDExNCwKKyAgICAyMSwwLDAsMCwyMTgsNSwxMDUsMTE2LDEwMSwxMDksMTE1LDExNCwxNzgsMCwwLDAsCisgICAgMTE0LDc2LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDgyLDAsMCwwLDExNCwKKyAgICAxNjEsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsMCwwLDExNCwxLAorICAgIDAsMCwwLDExNCwyMDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDc3LDAsCisgICAgMCwwLDQxLDEyLDIxOCwxMCwxMTUsMTIxLDExNSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAyMTgsMTEsOTUsMTA1LDEwOSwxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTEsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDExNCwxNSwwLDAsMCwxMTQsCisgICAgODksMCwwLDAsMTE0LDk5LDAsMCwwLDExNCw4OCwwLDAsMCw5MCwxMSwKKyAgICAxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTIsOTgsMTE3LDEwNSwKKyAgICAxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsMTE3LDEwNSwxMDgsMTE2LAorICAgIDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LAorICAgIDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLAorICAgIDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsNiw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDgzLAorICAgIDQsMCwwLDExNSw1MCwwLDAsMCwwLDksNiwxLDYsMywxMiwxLAorICAgIDI4LDEsMTUsMSwxNSwxLDksMSwxNSwxLDksMiwzLDEsMTUsMSwKKyAgICAxNywzLDEzLDEsMTMsMSwxNSwxLDE1LDIsMTMsMSwyMCwzLDMsMSwKKyAgICAxNiwxLDEzLDIsMTEsMSwxNiwzLDEyLDEsMTE0LDIwOCwwLDAsMCw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw4NywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTI0LAorICAgIDEsMCwxMzEsMiwwLDEsMTE2LDEsMCwxMDYsMiwwLDEwNiwzLDAsMTE2LAorICAgIDQsMCwxMzEsMSwwLDEsMTE2LDEsMCwxMDYsMiwwLDEwNiwzLDAsMTE2LAorICAgIDUsMCwxMzEsMSwwLDEsMTAwLDEsMCwxMDAsMiwwLDEwOCw2LDAsMTI1LAorICAgIDIsMCwxMjQsMiwwLDk3LDcsMCwxMjQsMiwwLDEwNiw4LDAsMTE2LDEsCisgICAgMCwxMDYsOSwwLDExNiwxMCwwLDI1LDEzMSwxLDAsMSwxMDAsMiwwLDgzLAorICAgIDQxLDMsMTIyLDUwLDczLDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsCisgICAgMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTE0LDMzLDAsMCwwLDc4LDQxLDExLDExNCwyMDgsCisgICAgMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwxNzUsMCwwLDAsMTE0LDExMywwLAorICAgIDAsMCwxMTQsMTUxLDAsMCwwLDExNCwxNjEsMCwwLDAsMjE4LDI2LDk1LDEwMiwKKyAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsOTUsCisgICAgMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDExNCwxMTksMCwwLDAsMjE4LDgsOTUsCisgICAgMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTE0LDIxLDAsMCwwLDExNCwxLDAsMCwKKyAgICAwLDQxLDMsMTE0LDIwNiwwLDAsMCwxMTQsMjA3LDAsMCwwLDExNCwyMDksMCwKICAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMjE4LDE0LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsCi0gICAgMTAwLDE5OCwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTMsMSwxMTQsMTg1LAotICAgIDAsMCwwLDExNCwzMywwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLAotICAgIDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxNjYsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMywKLSAgICAwLDEsMTI0LDIsMCwxMDAsMSwwLDEwNyw0LDAsMTE0LDQ2LDAsMTE2LDEsCi0gICAgMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMywwLDEyNSwwLDAsCi0gICAgMTE2LDIsMCwxMDYsMywwLDEzMSwwLDAsMSwxMjQsMCwwLDExNiw0LDAsCi0gICAgMTA2LDUsMCwxMDcsNywwLDExNCw4NCwwLDExNiw2LDAsMTI0LDAsMCwxMTYsCi0gICAgNywwLDEzMSwyLDAsODMsMTE2LDQsMCwxMDYsNSwwLDEyNCwwLDAsMjUsCi0gICAgMTI1LDMsMCwxMjQsMywwLDEwMCwyLDAsMTA3LDgsMCwxMTQsMTUyLDAsMTE2LAotICAgIDIsMCwxMDYsOCwwLDEzMSwwLDAsMSwxMDAsMywwLDEwNiw5LDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDEyNSw0LDAsMTE2LDEwLDAsMTI0LDQsMCwxMDAsNCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMSwxMzAsMSwwLDExNiwxMSwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxLDEyNCwzLDAsODMsNDEsNSw5Nyw1MCwxLDAsMCw3MywKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTExLDExMCwzMiwxMDUsMTE2LDExNSwzMiwxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgOTcsMTA4LDEwOCwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywKLSAgICAzMiwxMDksOTcsMTAwLDEwMSwzMiwxMDIsMTE0LDExMSwxMDksNDQsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDk3LDEwMCwxMDYsMTE3LDExNSwxMTYsCi0gICAgMTA5LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLAotICAgIDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDExNCwxMDEsOTcsMTE2LDEwMSwxMTUsMTE2LAotICAgIDMyLDk5LDExMSwxMDksMTA5LDExMSwxMTAsMzIsMTAwLDEwMSwxMTAsMTExLDEwOSwxMDUsMTEwLDk3LAotICAgIDExNiwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk3LAotICAgIDEwOCwxMDUsMTE2LDEyMSwxMCwzMiwzMiwzMiwzMiw5OCwxMDEsMTE2LDExOSwxMDEsMTAxLDExMCwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5NywKLSAgICAxMTAsMTAwLDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDQ2LDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTA4LDExNywxMDAsMTAxLDExNSwzMiwxMTUsMTAxLDExNiwKLSAgICAxMTYsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LAotICAgIDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwzMiwxMDAsMTA1LDEwMCwzMiwxMTAsMTExLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTQsMzMsMCwwLDAsNzgsMTIyLDQwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDExMSwxMDIsMzIsMTIzLDEyNSwzMiwxMDQsOTcsMTA4LDExNiwxMDEsMTAwLDU5LDMyLDc4LDExMSwKLSAgICAxMTAsMTAxLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDExNCwxNSwwLDAsMCw0MSwxMiwxMTQsMTgxLDAsMCwwLDExNCwxNzEsMCwKLSAgICAwLDAsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwwLDAsMTE0LDE0LDAsMCwKLSAgICAwLDExNCwyMSwwLDAsMCwxMTQsMTg1LDAsMCwwLDIxOCwxMSw5NSwxMDMsOTksCi0gICAgMTAwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDExNCw1OCwwLDAsMCwxMTQsNTAsMCwKLSAgICAwLDAsMTE0LDc3LDAsMCwwLDExNCw2MywwLDAsMCw0MSw1LDExNCwxNSwKLSAgICAwLDAsMCwxMTQsMTY5LDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LDg5LDAsCi0gICAgMCwwLDExNCw3NCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTg2LDAsMCwwLDIwNCwzLDAsMCwxMTUsCi0gICAgMjgsMCwwLDAsMCw5LDE2LDEsMTIsMSwxOCwxLDEwLDEsMTUsMSwKLSAgICAxMywxLDEzLDEsMTIsMSwxMCwxLDYsMSw5LDEsMTgsMSwxMCwxLAotICAgIDExNCwxODYsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDYsMCwKLSAgICAwLDAsMTcsMCwwLDAsNjcsMCwwLDAsMTE1LDIzOSwwLDAsMCwxMTYsCi0gICAgMCwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDExNCwyMzUsMCwxMDAsMiwKLSAgICAwLDEyNCwxLDAsMTA3LDYsMCwxMTQsODMsMCwxMTYsMSwwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCwxMjUsMSwwLDEyNCwxLDAsMTA2LDIsMCwxMDAsMiwwLDEzMSwKLSAgICAxLDAsMSwxMTYsMCwwLDEyNCwwLDAsMTAwLDMsMCwxMzEsMiwwLDExNCwKLSAgICA4MywwLDEyNCwxLDAsMTA2LDMsMCwxMjQsMCwwLDEwNiw0LDAsMTMxLDEsCi0gICAgMCwxLDEyMCwxNDksMCwxMjQsMSwwLDY4LDkzLDE0MSwwLDEyNSwzLDAsMTE2LAotICAgIDAsMCwxMjQsMCwwLDEyNCwzLDAsMTMxLDIsMCwxMTUsOTAsMCwxMDAsNCwKLSAgICAwLDEwNiw1LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwzLDAsMTMxLDIsMCwKLSAgICAxMjUsNCwwLDEyMSwxNywwLDExNiw3LDAsMTI0LDIsMCwxMjQsNCwwLDEzMSwKLSAgICAyLDAsMSw4NywxMTMsOTAsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LDIzMCwKLSAgICAwLDEsMTI1LDUsMCwxLDEyMiw0NywwLDExNiw5LDAsMTI0LDUsMCwxMzEsCi0gICAgMSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLDAsMTE0LDIwOSwwLDEyNCw1LAotICAgIDAsMTA2LDEyLDAsMTI0LDQsMCwxMDcsMiwwLDExNCwyMDksMCwxMTksOTAsMCwKLSAgICAxMzAsMCwwLDg3LDg5LDEwMCw1LDAsMTAwLDUsMCwxMjUsNSwwLDEyNiw1LAotICAgIDAsODgsMTEzLDkwLDAsODgsMTEzLDkwLDAsODcsMTI0LDAsMCw4Myw0MSw2LAotICAgIDEyMiwyMzgsNzAsMTA1LDEwMywxMTcsMTE0LDEwMSwzMiwxMTEsMTE3LDExNiwzMiwxMTksMTA0LDk3LAotICAgIDExNiwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw5NSwzMiwxMTUsMTA0LDExMSwKLSAgICAxMTcsMTA4LDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDMyLDExMiw5NywxMTQsCi0gICAgOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsCi0gICAgOTcsOTgsMTA4LDEwMSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDk3LDEwNywxMDEsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw0NiwzMiw3MywxMTYsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsCi0gICAgMTAwLDMyLDExNiwxMTEsMzIsMTAwLDEwMSw5OSwxMTEsMTE3LDExMiwxMDgsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsCi0gICAgOTcsMTE1LDExNSwxMTcsMTA5LDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKLSAgICAxMDUsOTgsMzksMTE1LDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAotICAgIDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMTQsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICAxMTQsMTMxLDAsMCwwLDI1MCwxLDQyLDIxOCw3LDk1LDk1LDk3LDEwOCwxMDgsOTUsCi0gICAgOTUsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDc4LDQxLDEzLDExNCw0LDAsMCwwLAotICAgIDExNCwxMzAsMCwwLDAsMjE4LDYsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMjE4LDYsMTAxLAotICAgIDEyMCwxMTYsMTAxLDExMCwxMDAsMTE0LDE4OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LAotICAgIDEsMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTc4LAotICAgIDAsMCwwLDExNCw3MSwwLDAsMCwyMTgsMTUsOTUsNjksODIsODIsOTUsNzcsCi0gICAgODMsNzEsOTUsODAsODIsNjksNzAsNzMsODgsMTE0LDE1LDAsMCwwLDQxLDYsCi0gICAgMTE0LDg5LDAsMCwwLDIxOCw4LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMTE0LAotICAgIDE4MywwLDAsMCwyMTgsMSwxMjAsOTAsOSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsMywxMDEsMTIwLDk5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDk1LAotICAgIDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMjI4LDMsMCwwLDExNSwzNCwwLDAsCi0gICAgMCwwLDEwLDE1LDEsMTIsMSwxMiwxLDEzLDEsMTUsMSwxNiwxLDEzLAotICAgIDEsMTUsMSwyMSwxLDMsMSwxNywxLDE4LDQsMjEsMSwxNSwxLDMsCi0gICAgMSwyNiwxLDExNCwxOTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsNzIsMCwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwxLDAsMTMxLDEsMCwxMjUsMSwKLSAgICAwLDEyNCwxLDAsMTAwLDIsMCwxMDcsOCwwLDExNCw2OCwwLDEyNCwwLDAsCi0gICAgMTAwLDMsMCwyNSwxMjUsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMDcsNywwLAotICAgIDExNCw2OCwwLDEyNCwxLDAsMTA2LDEsMCwxMDAsNSwwLDEzMSwxLDAsMTAwLAotICAgIDYsMCwyNSwxMjUsMSwwLDEyNCwxLDAsODMsNDEsNywxMjIsMTY3LDY3LDk3LAotICAgIDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE5LDEwNCw5NywxMTYsMzIsOTUsOTUsMTEyLAotICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLAotICAgIDk4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LAotICAgIDEwMywxMDEsOTUsOTUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDMsMTE3LDk3LDExNCwKLSAgICA5NywxMTAsMTE2LDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwxMDEsMTAyLAotICAgIDEwNSwxMTAsMTAxLDEwMCwzMiwxMTEsMTE0LDMyLDk5LDExMSwxMTcsMTA4LDEwMCwzMiw5OCwxMDEsCi0gICAgMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiw3OCwxMTEsMTEwLDEwMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTExLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDMyLDExNiwxMDQsCi0gICAgOTcsMTE2LDMyLDEwNSwxMTYsMTE1LDMyLDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDMyLDExOCw5NywKLSAgICAxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTQsMTM0LDAsMCwwLDc4LDExNCwxLDAsMCwwLAotICAgIDExNCwxMzEsMCwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsNDEsCi0gICAgMiwxMTQsNDIsMCwwLDAsMTE0LDEyMiwwLDAsMCw0MSwyLDIxOCw3LDEwMywKLSAgICAxMDgsMTExLDk4LDk3LDEwOCwxMTUsMTE0LDE2OSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsOTksOTcsMTA4LAotICAgIDk5LDk1LDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSw0LDQsMCwKLSAgICAwLDExNSwxMiwwLDAsMCwwLDcsMTUsMSwxMiwxLDEwLDEsMTIsMSwKLSAgICAxOSwxLDExNCwxOTYsMCwwLDAsOTksNSwwLDAsMCwwLDAsMCwwLAotICAgIDksMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjI3LDAsMCwKLSAgICAwLDEyNCw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyNywwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEyNSw1LDAsMTEwLDU0LDAsMTI0LDEsMCwxMDAsCi0gICAgMiwwLDEwNyw5LDAsMTE0LDQ1LDAsMTI0LDEsMCwxMTAsMywwLDEwNSwwLAotICAgIDAsMTI1LDYsMCwxMTYsMSwwLDEyNCw2LDAsMTMxLDEsMCwxMjUsNywwLAotICAgIDExNiwwLDAsMTI0LDAsMCwxMjQsNywwLDEyNCw0LDAsMTMxLDMsMCwxMjUsCi0gICAgNSwwLDEyNCwzLDAsMTE1LDIwNywwLDEyNCw0LDAsMTAwLDEsMCwxMDcsMiwKLSAgICAwLDExNCwxMjIsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMywwLAotICAgIDEzMSwxLDAsMTAwLDEsMCwyNSwxMzEsMSwwLDgzLDEyNCwwLDAsMTE1LDEzMiwKLSAgICAwLDEyNCw1LDAsODMsMTE2LDMsMCwxMjQsMCwwLDEzMSwxLDAsMTE2LDMsCi0gICAgMCwxMjQsMCwwLDEwNiwyLDAsMTAwLDMsMCwxMzEsMSwwLDEwMCwxLDAsCi0gICAgMjUsMTMxLDEsMCwyNCwxMjUsOCwwLDExNiw0LDAsMTA2LDUsMCwxMjQsNSwKLSAgICAwLDEwNiw2LDAsMTAwLDIsMCwxMTYsMywwLDEyNCw1LDAsMTA2LDYsMCwKLSAgICAxMzEsMSwwLDEyNCw4LDAsMjQsMTMzLDIsMCwyNSwyNSw4MywxMTAsMTYsMCwKLSAgICAxMTYsNywwLDEyNCw1LDAsMTI0LDMsMCwxMTYsMCwwLDEzMSwzLDAsODMsCi0gICAgMTAwLDIsMCw4Myw0MSw0LDk3LDIxNCwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDg0LDEwNCwxMDEsMzIsMzksMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwzOSwzMiw5NywKLSAgICAxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsCi0gICAgMTE2LDExMSwzMiwxMDUsMTEwLDEwMiwxMDEsMTE0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTEsOTksOTksCi0gICAgMTE3LDExNCwxMDUsMTEwLDEwMywzMiwxMDIsMTE0LDExMSwxMDksMTAsMzIsMzIsMzIsMzIsMTE2LAotICAgIDExMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LAotICAgIDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMzIsODQsMTA0LDEwMSwzMiwzOSwKLSAgICAxMDgsMTExLDk5LDk3LDEwOCwxMTUsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LAotICAgIDMyLDEwNSwxMTUsMzIsMTA1LDEwMywxMTAsMTExLDExNCwxMDEsMTAwLDQ2LDMyLDg0LDEwNCwxMDEsCi0gICAgMTAsMzIsMzIsMzIsMzIsMzksMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwzOSwzMiwKLSAgICA5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsCi0gICAgMTAxLDExNSwzMiwxMTksMTA0LDk3LDExNiwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMDEsCi0gICAgMTIwLDEwNSwxMTUsMTE2LDMyLDk3LDExNSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwKLSAgICAxMDEsMTE1LDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTAsMzIsMzIsMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDEwMSwxMDAsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsNjAsCi0gICAgMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiw2Miw5Niw5Niw0MSw0NiwzMiwzMiw4NCwKLSAgICAxMDQsMTAxLDMyLDM5LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzksMTAsMzIsMzIsMzIsMzIsOTcsCi0gICAgMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsCi0gICAgMTE2LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTA1LDExMCwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywKLSAgICAxMTYsMTA1LDExOCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgNDAsMTAxLDQ2LDEwMyw0NiwzMiw5Niw5NiwxMDIsMTE0LDExMSwxMDksMzIsNDYsNDYsMTEyLAotICAgIDEwNywxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDExMSwxMDAsOTYsOTYsMzIsCi0gICAgMTE5LDExMSwxMTcsMTA4LDEwMCwzMiwxMDQsOTcsMTE4LDEwMSwzMiw5NywzMiwzOSwxMDgsMTAxLAotICAgIDExOCwxMDEsMTA4LDM5LDMyLDExMSwxMDIsMzIsNTAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE0LDMzLDAsMCwwLDc4LDExNCwxMjEsMCwwLDAsNDEsOCwxMTQsMTg2LAotICAgIDAsMCwwLDExNCwxOTYsMCwwLDAsMjE4LDksMTEyLDk3LDExNCwxMTYsMTA1LDExNiwKLSAgICAxMDUsMTExLDExMCwxMTQsMTY3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwKLSAgICAwLDAsMTE0LDEsMCwwLDAsMTE0LDE5NCwwLDAsMCw0MSw5LDExNCwxNSwKLSAgICAwLDAsMCwxMTQsMTk1LDAsMCwwLDIxOCw2LDEwOCwxMTEsOTksOTcsMTA4LDExNSwKLSAgICAxMTQsMTkyLDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LDg5LDAsMCwwLDkwLAotICAgIDgsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSw5NSwxMTQsMTY5LDAsMCwwLDkwLDcsCi0gICAgOTksMTE3LDExNiw5NSwxMTEsMTAyLDEwMiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTAsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCi0gICAgOTUsOTUsMTksNCwwLDAsMTE1LDI2LDAsMCwwLDAsMTEsMTIsMSwxNSwKLSAgICAyLDI0LDEsMTIsMSwxOCwxLDYsMywxMiwxLDIzLDEsNiwxLDQsCi0gICAgNCwzNSwzLDQwLDIsMTE0LDE5OSwwLDAsMCw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICA1MywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLAotICAgIDEyNSwxLDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDQzLDAsMTE2LAotICAgIDIsMCwxMDAsMSwwLDEyNCwwLDAsMjMsMTMxLDEsMCwxMzAsMSwwLDExNiwKLSAgICAzLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDI1LDExMCwxMTEsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDQxLDQsMTE0LDE1MCwwLDAsMCwxMTQsMTU0LAotICAgIDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTQ5LDAsMCwwLDQxLDIsMTE0LAotICAgIDE1LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTgsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDU0LDQsMCwwLAotICAgIDExNSw4LDAsMCwwLDAsMSwxNSwxLDEyLDEsMTYsMSwxMTQsMjAwLDAsCi0gICAgMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCwxMiwwLDAsMCwxMiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNzQsMSwwLDAsMTI0LDEsMCw5NywKLSAgICAwLDAsMTI0LDAsMCw5NywxLDAsMTE2LDIsMCwxMTYsMSwwLDEzMSwxLAotICAgIDAsMTI1LDIsMCwxMjAsMTIzLDAsMTE2LDEsMCwxMDYsMywwLDEwNiw0LDAsCi0gICAgMTMxLDAsMCw2OCw5MywxMDYsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwwLAotICAgIDExNiw1LDAsMTI0LDQsMCwxMjQsMiwwLDEzMSwyLDAsMTE0LDQwLDAsMTI0LAotICAgIDMsMCwxMTYsMSwwLDEwNiw2LDAsMTA3LDYsMCwxMTQsOTEsMCwxMTYsNywKLSAgICAwLDEyNSw1LDAsMTEwLDI3LDAsMTE2LDAsMCwxMDYsOCwwLDEyNCwzLDAsCi0gICAgMTMxLDEsMCwxMTQsNDAsMCwxMTYsOSwwLDEyNSw1LDAsMTEwLDMsMCwxMTMsCi0gICAgNDAsMCwxMTYsMTAsMCwxMjQsNCwwLDEyNCw1LDAsMTMxLDIsMCwxMjUsNiwKLSAgICAwLDExNiwxMSwwLDEyNCw2LDAsMTI0LDQsMCwxMzEsMiwwLDEsMTEzLDQwLAotICAgIDAsODcsMTE2LDEsMCwxMDYsMywwLDExNiwxMiwwLDI1LDEyNSw3LDAsMTIwLAotICAgIDczLDAsMTAwLDUsMCw2OCw5Myw2NSwwLDEyNSw4LDAsMTI0LDgsMCwxMTYsCi0gICAgMSwwLDEwNiwzLDAsMTA3LDcsMCwxMTQsMjA2LDAsMTE2LDEzLDAsMTI0LDgsCi0gICAgMCwxMzEsMSwwLDEyNSw5LDAsMTEwLDEzLDAsMTE2LDEsMCwxMDYsMywwLAotICAgIDEyNCw4LDAsMjUsMTI1LDksMCwxMTYsMTQsMCwxMjQsNywwLDEyNCw4LDAsCi0gICAgMTI0LDksMCwxMzEsMywwLDEsMTEzLDE3MCwwLDg3LDEyMSwxNiwwLDExNiwxMywKLSAgICAwLDEwMCwyLDAsMTMxLDEsMCwxMjUsMTAsMCw4NywxMTAsMjQsMCw0LDExNiwKLSAgICAxNSwwLDEwNywxMCwwLDExNCwyNSwxLDEsMSwxLDEwMCwzLDAsMTI1LDEwLAotICAgIDAsODksMTEwLDEsMCw4OCwxMTYsMTQsMCwxMjQsNywwLDEwMCwyLDAsMTI0LAotICAgIDEwLDAsMTMxLDMsMCwxLDExNiwxMywwLDEwMCw0LDAsMTMxLDEsMCwxMjUsCi0gICAgMTEsMCwxMTYsMTQsMCwxMjQsNywwLDEwMCw0LDAsMTI0LDExLDAsMTMxLDMsCi0gICAgMCwxLDEwMCwzLDAsODMsNDEsNiwxMjIsMjUwLDgzLDEwMSwxMTYsMTE3LDExMiwzMiwKLSAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiw5OCwxMTcsCi0gICAgMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsCi0gICAgMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLAotICAgIDEwOSwxMCwzMiwzMiwzMiwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLAotICAgIDEwOCwxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDY1LDExNSwzMiwxMTUsMTIxLDExNSwzMiwxMDUsMTE1LDMyLAotICAgIDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5Nyw5OSw5OSwxMDEsMTE1LDExNSwzMiw5NywxMTAsCi0gICAgMTAwLDMyLDk1LDEwNSwxMDksMTEyLDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsCi0gICAgMzIsMTE2LDExMSwzMiwxMDgsMTExLDk3LDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LAotICAgIDExMCwxMCwzMiwzMiwzMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LAotICAgIDEwNCwxMTEsMTE1LDEwMSwzMiwxMTYsMTE5LDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCi0gICAgMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMDEsMTIwLDExMiwxMDgsMTA1LDk5LDEwNSwKLSAgICAxMTYsMTA4LDEyMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTE0LDE0MSwwLDAsMCwxMTQsMzQsMCwwLDAsNzgsMTE0LAotICAgIDYyLDAsMCwwLDQxLDEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsCi0gICAgMTE1LDQxLDE2LDExNCw1NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDEzLDAsCi0gICAgMCwwLDExNCwyMSwwLDAsMCwyMTgsNSwxMDUsMTE2LDEwMSwxMDksMTE1LDExNCwxNzcsCi0gICAgMCwwLDAsMTE0LDc2LDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDgyLDAsCi0gICAgMCwwLDExNCwxNjAsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsMCwKLSAgICAwLDExNCwxLDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMTE0LDc3LDAsMCwwLDQxLDEyLDIxOCwxMCwxMTUsMTIxLDExNSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwyMTgsMTEsOTUsMTA1LDEwOSwxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgOTAsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDExNCwxNSwwLAotICAgIDAsMCwxMTQsODksMCwwLDAsMTE0LDk5LDAsMCwwLDExNCw4OCwwLDAsCi0gICAgMCw5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTIsCi0gICAgOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsMTE3LAotICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE2LDEwNCwKLSAgICAxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxNCwxMTksMTAxLDk3LAotICAgIDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsNiw5NSwxMTUsMTAxLDExNiwKLSAgICAxMTcsMTEyLDYxLDQsMCwwLDExNSw1MCwwLDAsMCwwLDksNiwxLDYsCi0gICAgMywxMiwxLDI4LDEsMTUsMSwxNSwxLDksMSwxNSwxLDksMiwzLAotICAgIDEsMTUsMSwxNywzLDEzLDEsMTMsMSwxNSwxLDE1LDIsMTMsMSwyMCwKLSAgICAzLDMsMSwxNiwxLDEzLDIsMTEsMSwxNiwzLDEyLDEsMTE0LDIwNCwwLAotICAgIDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSw4NywwLDAsMCwxMTYsMCwwLDEyNCwKLSAgICAwLDAsMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDEsMCwxMDYsMiwwLDEwNiwKLSAgICAzLDAsMTE2LDQsMCwxMzEsMSwwLDEsMTE2LDEsMCwxMDYsMiwwLDEwNiwKLSAgICAzLDAsMTE2LDUsMCwxMzEsMSwwLDEsMTAwLDEsMCwxMDAsMiwwLDEwOCwKLSAgICA2LDAsMTI1LDIsMCwxMjQsMiwwLDk3LDcsMCwxMjQsMiwwLDEwNiw4LAotICAgIDAsMTE2LDEsMCwxMDYsOSwwLDExNiwxMCwwLDI1LDEzMSwxLDAsMSwxMDAsCi0gICAgMiwwLDgzLDQxLDMsMTIyLDUwLDczLDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTA1LAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwKLSAgICAxMDIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTE0LDMzLDAsMCwwLDc4LDQxLAotICAgIDExLDExNCwyMDQsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwxNzQsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwxNjAsMCwwLDAsMjE4LAotICAgIDI2LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKLSAgICAxMDUsOTgsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDExNCwxMTksMCwwLDAsCi0gICAgMjE4LDgsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTE0LDIxLDAsMCwwLDExNCwKLSAgICAxLDAsMCwwLDQxLDMsMTE0LDIwMiwwLDAsMCwxMTQsMjAzLDAsMCwwLAotICAgIDExNCwyMDUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMDgsNCwwLDAsMTE1LDEyLDAsCi0gICAgMCwwLDAsMiwxMywyLDE2LDEsMTYsMywxMiwxLDYsMSwxMTQsMjA2LAotICAgIDAsMCwwLDQxLDUxLDExNCwzLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LAotICAgIDEyLDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LDU5LAotICAgIDAsMCwwLDExNCw0MSwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDMxLDAsCi0gICAgMCwwLDExNCwzMiwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDU0LDAsMCwKLSAgICAwLDExNCw1NiwwLDAsMCwxMTQsNjMsMCwwLDAsMTE0LDY1LDAsMCwwLAotICAgIDExNCw3NSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDg0LDAsMCwwLDExNCwKLSAgICA5MCwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsODUsMCwwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksMTE2LAotICAgIDkwLDksOTUsODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LDEzMiwwLDAsMCwKLSAgICAxMTQsMTM3LDAsMCwwLDExNCwxNDQsMCwwLDAsMTE0LDk3LDAsMCwwLDExNCwKLSAgICA4NiwwLDAsMCwxMTQsMTQ4LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDg3LAotICAgIDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMTY1LDAsCi0gICAgMCwwLDExNCwxNzEsMCwwLDAsMTE0LDE3MywwLDAsMCwxMTQsMTc2LDAsMCwKLSAgICAwLDExNCwxODEsMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsMTgyLDAsMCwwLAotICAgIDExNCwxODQsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsMTg2LDAsMCwwLDExNCwKLSAgICAxOTQsMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwyMDAsCi0gICAgMCwwLDAsMTE0LDIwNCwwLDAsMCwxMTQsMjA2LDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCi0gICAgMCwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSwKLSAgICA5NiwwLDAsMCw2LDE3LDYsMiwxMiw4LDEyLDQsMTksMjAsNiwyLAotICAgIDYsMywyMiw0LDE5LDY4LDE5LDIxLDE5LDE5LDEyLDE5LDEyLDE5LDEyLDExLAotICAgIDE4LDgsMTIsMTEsMTIsMTIsMTIsMTYsMTIsMzYsMTksMjcsMTksMTAxLDI0LDI2LAotICAgIDksMywxOCw0NSwxOCw2MCwxMiwxOCwxMiwxNywxMiwyNSwxMiwyOSwxMiwyMywKLSAgICAxMiwxNiwxOSw3MywxOSw3NywxOSwxMywxMiw5LDEyLDksMTUsNDAsMTIsMTcsCi0gICAgNiwxLDEwLDIsMTIsMjcsMTIsNiwxOCwyNCwxMiwzMiwxMiwxNSwyNCwzNSwKLSAgICAxMiw3LDEyLDQ3LAorICAgIDAsMTE0LDIxMCwwLDAsMCwxMzAsNCwwLDAsMTE1LDEyLDAsMCwwLDAsCisgICAgMiwxMywyLDE2LDEsMTYsMywxMiwxLDYsMSwxMTQsMjEwLDAsMCwwLAorICAgIDQxLDUxLDExNCwzLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDEyLDAsMCwKKyAgICAwLDExNCwxNiwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LDU5LDAsMCwwLAorICAgIDExNCw0MSwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwKKyAgICAzMiwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDU0LDAsMCwwLDExNCw1NiwKKyAgICAwLDAsMCwxMTQsNjMsMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw3NSwwLAorICAgIDAsMCwxMTQsODEsMCwwLDAsMTE0LDg0LDAsMCwwLDExNCw5MCwwLDAsCisgICAgMCwxMTQsMTAxLDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDEwNiwwLDAsMCwKKyAgICAxMTQsODUsMCwwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksMTE2LDkwLDksOTUsCisgICAgODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsCisgICAgMCwwLDExNCwxNDUsMCwwLDAsMTE0LDk3LDAsMCwwLDExNCw4NiwwLDAsCisgICAgMCwxMTQsMTQ5LDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDg3LDAsMCwwLAorICAgIDExNCwxNTEsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwKKyAgICAxNzIsMCwwLDAsMTE0LDE3NCwwLDAsMCwxMTQsMTc3LDAsMCwwLDExNCwxODIsCisgICAgMCwwLDAsMTE0LDE5MiwwLDAsMCwxMTQsMTgzLDAsMCwwLDExNCwxODUsMCwKKyAgICAwLDAsMTE0LDE4NiwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCwxOTUsMCwwLAorICAgIDAsMTE0LDIwMCwwLDAsMCwxMTQsMjAzLDAsMCwwLDExNCwyMDQsMCwwLDAsCisgICAgMTE0LDIwOCwwLDAsMCwxMTQsMjEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCwKKyAgICA2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSw5NiwwLDAsCisgICAgMCw2LDE3LDYsMiwxMiw4LDEyLDQsMTksMjAsNiwyLDYsMywyMiwKKyAgICA0LDE5LDY4LDE5LDIxLDE5LDE5LDEyLDE5LDEyLDE5LDEyLDExLDE4LDgsMTIsCisgICAgMTEsMTIsMTIsMTIsMTYsMTIsMzYsMTksMjcsMTksMTAxLDI0LDI2LDksMywxOCwKKyAgICA0NSwxOCw2MCwxMiwxOCwxMiwxNywxMiwyNSwxMiwyOSwxMiwyMywxMiwxNiwxOSwKKyAgICA3MywxOSw3NywxOSwxMywxMiw5LDEyLDksMTUsNDcsMTIsMjAsNiwxLDEwLAorICAgIDIsMTIsMjcsMTIsNiwxOCwyNCwxMiwzMiwxMiwyNywyNCwzNSwxMiw3LDEyLAorICAgIDQ3LAogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaCBiL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAppbmRleCBiMjBjZTE3Li44NDBlOWM0IDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKKysrIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCkBAIC0xLDggKzEsOCBAQAogLyogQXV0by1nZW5lcmF0ZWQgYnkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYyAqLwogY29uc3QgdW5zaWduZWQgY2hhciBfUHlfTV9faW1wb3J0bGliX2V4dGVybmFsW10gPSB7CiAgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNywwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMjI4LDIsMCwwLDEwMCwwLDAsOTAsMCwwLAotICAgIDEwMCw5NiwwLDkwLDEsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwKKyAgICAwLDY0LDAsMCwwLDExNSwyMTAsMiwwLDAsMTAwLDAsMCw5MCwwLDAsCisgICAgMTAwLDkyLDAsOTAsMSwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLAogICAgIDIsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCwzLDAsMTAwLDgsCiAgICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsNCwwLDEwMCwxMCwwLDEwMCwxMSwwLAogICAgIDEzMiwwLDAsOTAsNSwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsCkBAIC0yMCw1NjMgKzIwLDU0MSBAQAogICAgIDEsMSw5MCwyNiwwLDEwMCwzNywwLDEwMCwzOCwwLDEzMiwwLDAsOTAsMjcsCiAgICAgMCwxMDAsMzksMCwxMDAsNDAsMCwxMzIsMCwwLDkwLDI4LDAsMTAwLDQxLDAsCiAgICAgMTAwLDQyLDAsMTMyLDAsMCw5MCwyOSwwLDEwMCw0MywwLDEwMCw0NCwwLDEzMiwKLSAgICAwLDAsOTAsMzAsMCwxMDAsNDUsMCwxMDAsNDYsMCwxMDAsNDcsMCwxMDAsNDgsCi0gICAgMCwxMzIsMCwxLDkwLDMxLDAsMTAwLDQ5LDAsMTAwLDUwLDAsMTMyLDAsMCwKLSAgICA5MCwzMiwwLDEwMCw1MSwwLDEwMCw1MiwwLDEzMiwwLDAsOTAsMzMsMCwxMDAsCi0gICAgMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsNTMsMCwxMDAsNTQsMCwxMzIsMywKLSAgICAwLDkwLDM0LDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDU1LDAsCi0gICAgMTAwLDU2LDAsMTMyLDMsMCw5MCwzNSwwLDEwMCw1NywwLDEwMCw1NywwLDEwMCwKLSAgICA1OCwwLDEwMCw1OSwwLDEzMiwyLDAsOTAsMzYsMCwxMDAsNjAsMCwxMDAsNjEsCi0gICAgMCwxMzIsMCwwLDkwLDM3LDAsMTAxLDM4LDAsMTMxLDAsMCw5MCwzOSwwLAotICAgIDEwMCwzMywwLDEwMCw2MiwwLDEwMCwzMywwLDEwMCw2MywwLDEwMSwzOSwwLDEwMCwKLSAgICA2NCwwLDEwMCw2NSwwLDEzMiwxLDIsOTAsNDAsMCw3MSwxMDAsNjYsMCwxMDAsCi0gICAgNjcsMCwxMzIsMCwwLDEwMCw2NywwLDEzMSwyLDAsOTAsNDEsMCw3MSwxMDAsCi0gICAgNjgsMCwxMDAsNjksMCwxMzIsMCwwLDEwMCw2OSwwLDEzMSwyLDAsOTAsNDIsCi0gICAgMCw3MSwxMDAsNzAsMCwxMDAsNzEsMCwxMzIsMCwwLDEwMCw3MSwwLDEwMSw0MiwKLSAgICAwLDEzMSwzLDAsOTAsNDMsMCw3MSwxMDAsNzIsMCwxMDAsNzMsMCwxMzIsMCwKLSAgICAwLDEwMCw3MywwLDEzMSwyLDAsOTAsNDQsMCw3MSwxMDAsNzQsMCwxMDAsNzUsCi0gICAgMCwxMzIsMCwwLDEwMCw3NSwwLDEwMSw0NCwwLDEwMSw0MywwLDEzMSw0LDAsCi0gICAgOTAsNDUsMCw3MSwxMDAsNzYsMCwxMDAsNzcsMCwxMzIsMCwwLDEwMCw3NywwLAotICAgIDEwMSw0NCwwLDEwMSw0MiwwLDEzMSw0LDAsOTAsNDYsMCwxMDMsMCwwLDkwLAotICAgIDQ3LDAsNzEsMTAwLDc4LDAsMTAwLDc5LDAsMTMyLDAsMCwxMDAsNzksMCwxMDEsCi0gICAgNDQsMCwxMDEsNDIsMCwxMzEsNCwwLDkwLDQ4LDAsNzEsMTAwLDgwLDAsMTAwLAotICAgIDgxLDAsMTMyLDAsMCwxMDAsODEsMCwxMzEsMiwwLDkwLDQ5LDAsNzEsMTAwLAotICAgIDgyLDAsMTAwLDgzLDAsMTMyLDAsMCwxMDAsODMsMCwxMzEsMiwwLDkwLDUwLAotICAgIDAsNzEsMTAwLDg0LDAsMTAwLDg1LDAsMTMyLDAsMCwxMDAsODUsMCwxMzEsMiwKLSAgICAwLDkwLDUxLDAsNzEsMTAwLDg2LDAsMTAwLDg3LDAsMTMyLDAsMCwxMDAsODcsCi0gICAgMCwxMzEsMiwwLDkwLDUyLDAsMTAwLDMzLDAsMTAwLDg4LDAsMTAwLDg5LDAsCi0gICAgMTMyLDEsMCw5MCw1MywwLDEwMCw5MCwwLDEwMCw5MSwwLDEzMiwwLDAsOTAsCi0gICAgNTQsMCwxMDAsOTIsMCwxMDAsOTMsMCwxMzIsMCwwLDkwLDU1LDAsMTAwLDk0LAotICAgIDAsMTAwLDk1LDAsMTMyLDAsMCw5MCw1NiwwLDEwMCwzMywwLDgzLDQxLDk3LAotICAgIDk3LDk0LDEsMCwwLDY3LDExMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDEwLDEwLAotICAgIDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsNzgsCi0gICAgNzksODQsMzIsMTA5LDEwMSw5NywxMTAsMTE2LDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDEwMCwKLSAgICAxMDUsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLAotICAgIDMzLDMyLDczLDExNiwzMiwxMDQsOTcsMTE1LDMyLDk4LDEwMSwxMDEsMTEwLDMyLDEwMCwxMDEsCi0gICAgMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDExNyw5OSwxMDQsMTAsMTE2LDEwNCw5NywxMTYsCi0gICAgMzIsMTA1LDExNiwzMiw5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwKLSAgICAxMTYsMTE0LDk3LDExMiwxMTIsMTAxLDEwMCwzMiwxMDUsMTEwLDExNiwxMTEsMzIsODAsMTIxLDExNiwKLSAgICAxMDQsMTExLDExMCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwKLSAgICAxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsNDYsMzIsNjUsMTE1LDEwLDExNSwxMTcsOTksMTA0LDMyLDEwNSwxMTYsMzIsCi0gICAgMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTEwLDEwNiwKLSAgICAxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwKLSAgICAxMDUsOTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsOTcsCi0gICAgMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDExNSwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLAotICAgIDEwMSwxMTQsMzIsMTE2LDExMSwxMCwxMTksMTExLDExNCwxMDcsNDYsMzIsNzksMTEwLDEwMSwzMiwKLSAgICAxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTcsMTE1LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiwxMDgsMTA1LDk4LDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE3LDk4LDEwOCwKLSAgICAxMDUsOTksNDUsMTAyLDk3LDk5LDEwNSwxMTAsMTAzLDMyLDExOCwxMDEsMTE0LDExNSwxMDUsMTExLAotICAgIDExMCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwyMTgsMywxMTksMTA1LDExMCwyMTgsNiw5OSwxMjEsMTAzLDExOSwxMDUsMTEwLAotICAgIDIxOCw2LDEwMCw5NywxMTQsMTE5LDEwNSwxMTAsOTksMCwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsNDksMCwKLSAgICAwLDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTE2LDMsMCwxMzEsMSwKLSAgICAwLDExNCwzMywwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNSwwLDAsCi0gICAgMTEwLDEyLDAsMTAwLDMsMCwxMDAsMiwwLDEzMiwwLDAsMTI1LDAsMCwxMjQsCi0gICAgMCwwLDgzLDQxLDQsNzgsOTksMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCw4MywwLDAsMCwxMTUsMTMsMCwwLDAsCi0gICAgMTAwLDEsMCwxMTYsMCwwLDEwNiwxLDAsMTA3LDYsMCw4Myw0MSwyLDEyMiwKLSAgICA1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LAotICAgIDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywKLSAgICAxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwKLSAgICAxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDExNSwxMiwwLDAsMCw4MCw4OSw4NCw3Miw3OSwKLSAgICA3OCw2Nyw2NSw4Myw2OSw3OSw3NSw0MSwyLDIxOCwzLDk1LDExMSwxMTUsOTAsNywKLSAgICAxMDEsMTEwLDExOCwxMDUsMTE0LDExMSwxMTAsMTY5LDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMjUwLDM4LDYwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsCi0gICAgMTEyLDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCw2MiwyMTgsMTEsOTUsMTE0LDEwMSwKLSAgICAxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsMzAsMCwwLDAsMTE1LDIsMCwwLAotICAgIDAsMCwyLDEyMiwzNyw5NSwxMDksOTcsMTA3LDEwMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsCi0gICAgOTUsOTksOTcsMTE1LDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsCi0gICAgMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCw4MywwLDAsMCwxMTUsCi0gICAgNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUzLDg0LDExNCwxMTcsMTAxLAotICAgIDMyLDEwNSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSwzMiwxMDksMTE3LAotICAgIDExNSwxMTYsMzIsOTgsMTAxLDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwMSwxMDAsMzIsOTksOTcsCi0gICAgMTE1LDEwMSw0NSwxMDUsMTEwLDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LDEwNSwxMTgsMTAxLDEwOCwxMjEsCi0gICAgNDYsNzAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMzQsMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDQxLDQsMjE4LDMsMTE1LAotICAgIDEyMSwxMTUsMjE4LDgsMTEyLDEwOCw5NywxMTYsMTAyLDExMSwxMTQsMTA5LDIxOCwxMCwxMTUsMTE2LAotICAgIDk3LDExNCwxMTYsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsMjcsOTUsNjcsNjUsODMsNjksOTUsCi0gICAgNzMsNzgsODMsNjksNzgsODMsNzMsODQsNzMsODYsNjksOTUsODAsNzYsNjUsODQsCi0gICAgNzAsNzksODIsNzcsODMsNDEsMSwxMTQsNiwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTYsOTUsMTA5LDk3LAotICAgIDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsMjgsMCwwLAotICAgIDAsMTE1LDgsMCwwLDAsMCwxLDE4LDEsMTUsNCwxMiwzLDExNCwxMSwKKyAgICAwLDAsOTAsMzAsMCwxMDAsNDUsMCwxMDAsNDYsMCwxMzIsMCwwLDkwLDMxLAorICAgIDAsMTAwLDQ3LDAsMTAwLDQ4LDAsMTMyLDAsMCw5MCwzMiwwLDEwMCwzMywwLAorICAgIDEwMCwzMywwLDEwMCwzMywwLDEwMCw0OSwwLDEwMCw1MCwwLDEzMiwzLDAsOTAsCisgICAgMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsMzMsMCwxMDAsNTEsMCwxMDAsNTIsCisgICAgMCwxMzIsMywwLDkwLDM0LDAsMTAwLDUzLDAsMTAwLDUzLDAsMTAwLDU0LDAsCisgICAgMTAwLDU1LDAsMTMyLDIsMCw5MCwzNSwwLDEwMCw1NiwwLDEwMCw1NywwLDEzMiwKKyAgICAwLDAsOTAsMzYsMCwxMDEsMzcsMCwxMzEsMCwwLDkwLDM4LDAsMTAwLDMzLAorICAgIDAsMTAwLDU4LDAsMTAwLDMzLDAsMTAwLDU5LDAsMTAxLDM4LDAsMTAwLDYwLDAsCisgICAgMTAwLDYxLDAsMTMyLDEsMiw5MCwzOSwwLDcxLDEwMCw2MiwwLDEwMCw2MywwLAorICAgIDEzMiwwLDAsMTAwLDYzLDAsMTMxLDIsMCw5MCw0MCwwLDcxLDEwMCw2NCwwLAorICAgIDEwMCw2NSwwLDEzMiwwLDAsMTAwLDY1LDAsMTMxLDIsMCw5MCw0MSwwLDcxLAorICAgIDEwMCw2NiwwLDEwMCw2NywwLDEzMiwwLDAsMTAwLDY3LDAsMTAxLDQxLDAsMTMxLAorICAgIDMsMCw5MCw0MiwwLDcxLDEwMCw2OCwwLDEwMCw2OSwwLDEzMiwwLDAsMTAwLAorICAgIDY5LDAsMTMxLDIsMCw5MCw0MywwLDcxLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwKKyAgICAwLDAsMTAwLDcxLDAsMTAxLDQzLDAsMTAxLDQyLDAsMTMxLDQsMCw5MCw0NCwKKyAgICAwLDcxLDEwMCw3MiwwLDEwMCw3MywwLDEzMiwwLDAsMTAwLDczLDAsMTAxLDQzLAorICAgIDAsMTAxLDQxLDAsMTMxLDQsMCw5MCw0NSwwLDEwMywwLDAsOTAsNDYsMCwKKyAgICA3MSwxMDAsNzQsMCwxMDAsNzUsMCwxMzIsMCwwLDEwMCw3NSwwLDEwMSw0MywwLAorICAgIDEwMSw0MSwwLDEzMSw0LDAsOTAsNDcsMCw3MSwxMDAsNzYsMCwxMDAsNzcsMCwKKyAgICAxMzIsMCwwLDEwMCw3NywwLDEzMSwyLDAsOTAsNDgsMCw3MSwxMDAsNzgsMCwKKyAgICAxMDAsNzksMCwxMzIsMCwwLDEwMCw3OSwwLDEzMSwyLDAsOTAsNDksMCw3MSwKKyAgICAxMDAsODAsMCwxMDAsODEsMCwxMzIsMCwwLDEwMCw4MSwwLDEzMSwyLDAsOTAsCisgICAgNTAsMCw3MSwxMDAsODIsMCwxMDAsODMsMCwxMzIsMCwwLDEwMCw4MywwLDEzMSwKKyAgICAyLDAsOTAsNTEsMCwxMDAsMzMsMCwxMDAsODQsMCwxMDAsODUsMCwxMzIsMSwKKyAgICAwLDkwLDUyLDAsMTAwLDg2LDAsMTAwLDg3LDAsMTMyLDAsMCw5MCw1MywwLAorICAgIDEwMCw4OCwwLDEwMCw4OSwwLDEzMiwwLDAsOTAsNTQsMCwxMDAsOTAsMCwxMDAsCisgICAgOTEsMCwxMzIsMCwwLDkwLDU1LDAsMTAwLDMzLDAsODMsNDEsOTMsOTcsOTQsCisgICAgMSwwLDAsNjcsMTExLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKKyAgICAxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsCisgICAgOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTAsMTAsODQsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw3OCw3OSw4NCwKKyAgICAzMiwxMDksMTAxLDk3LDExMCwxMTYsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwNSwxMTQsCisgICAgMTAxLDk5LDExNiwxMDgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzMsMzIsCisgICAgNzMsMTE2LDMyLDEwNCw5NywxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTAwLDEwMSwxMTUsMTA1LAorICAgIDEwMywxMTAsMTAxLDEwMCwzMiwxMTUsMTE3LDk5LDEwNCwxMCwxMTYsMTA0LDk3LDExNiwzMiwxMDUsCisgICAgMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsCisgICAgOTcsMTEyLDExMiwxMDEsMTAwLDMyLDEwNSwxMTAsMTE2LDExMSwzMiw4MCwxMjEsMTE2LDEwNCwxMTEsCisgICAgMTEwLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCisgICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw0NiwzMiw2NSwxMTUsMTAsMTE1LDExNyw5OSwxMDQsMzIsMTA1LDExNiwzMiwxMTQsMTAxLAorICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwKKyAgICAxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NywxMTYsMTE2LAorICAgIDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLDExNCwKKyAgICAzMiwxMTYsMTExLDEwLDExOSwxMTEsMTE0LDEwNyw0NiwzMiw3OSwxMTAsMTAxLDMyLDExNSwxMDQsCisgICAgMTExLDExNywxMDgsMTAwLDMyLDExNywxMTUsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKKyAgICAxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTcsOTgsMTA4LDEwNSw5OSwKKyAgICA0NSwxMDIsOTcsOTksMTA1LDExMCwxMDMsMzIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDMyLAorICAgIDExMSwxMDIsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLAorICAgIDEwLDIxOCwzLDExOSwxMDUsMTEwLDIxOCw2LDk5LDEyMSwxMDMsMTE5LDEwNSwxMTAsMjE4LDYsCisgICAgMTAwLDk3LDExNCwxMTksMTA1LDExMCw5OSwwLDAsMCwwLDAsMCwwLDAsMSwKKyAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw0OSwwLDAsMCwKKyAgICAxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMTYsMywwLDEzMSwxLDAsMTE0LAorICAgIDMzLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsMTI1LDAsMCwxMTAsMTIsCisgICAgMCwxMDAsMywwLDEwMCwyLDAsMTMyLDAsMCwxMjUsMCwwLDEyNCwwLDAsCisgICAgODMsNDEsNCw3OCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDgzLDAsMCwwLDExNSwxMywwLDAsMCwxMDAsMSwKKyAgICAwLDExNiwwLDAsMTA2LDEsMCwxMDcsNiwwLDgzLDQxLDIsMTIyLDUzLDg0LAorICAgIDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNSwKKyAgICAzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwMSwxMDAsCisgICAgMzIsOTksOTcsMTE1LDEwMSw0NSwxMDUsMTEwLDExNSwxMDEsMTEwLDExNSwxMDUsMTE2LDEwNSwxMTgsCisgICAgMTAxLDEwOCwxMjEsNDYsMTE1LDEyLDAsMCwwLDgwLDg5LDg0LDcyLDc5LDc4LDY3LAorICAgIDY1LDgzLDY5LDc5LDc1LDQxLDIsMjE4LDMsOTUsMTExLDExNSw5MCw3LDEwMSwxMTAsCisgICAgMTE4LDEwNSwxMTQsMTExLDExMCwxNjksMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwyNTAsMzgsNjAsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTA4LDEwNSw5OCw0Niw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsCisgICAgMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDYyLDIxOCwxMSw5NSwxMTQsMTAxLDEwOCw5NywKKyAgICAxMjAsOTUsOTksOTcsMTE1LDEwMSwzMCwwLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDIsMTIyLDM3LDk1LDEwOSw5NywxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSwKKyAgICA5NywxMTUsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLAorICAgIDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSw5OSwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDgzLDAsMCwwLDExNSw0LDAsCisgICAgMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LAorICAgIDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwKKyAgICAzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLAorICAgIDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSw0Niw3MCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsNiwwLDAsMCwzNCwwLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDIsNDEsNCwyMTgsMywxMTUsMTIxLDExNSwKKyAgICAyMTgsOCwxMTIsMTA4LDk3LDExNiwxMDIsMTExLDExNCwxMDksMjE4LDEwLDExNSwxMTYsOTcsMTE0LAorICAgIDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCwyNyw5NSw2Nyw2NSw4Myw2OSw5NSw3Myw3OCwKKyAgICA4Myw2OSw3OCw4Myw3Myw4NCw3Myw4Niw2OSw5NSw4MCw3Niw2NSw4NCw3MCw3OSwKKyAgICA4Miw3Nyw4Myw0MSwxLDExNCw2LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNiw5NSwxMDksOTcsMTA3LDEwMSwKKyAgICA5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSwyOCwwLDAsMCwxMTUsCisgICAgOCwwLDAsMCwwLDEsMTgsMSwxNSw0LDEyLDMsMTE0LDExLDAsMCwKKyAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLDExNiwwLDAsMTI0LDAsCisgICAgMCwxMzEsMSwwLDEwMCwxLDAsNjQsMTA2LDEsMCwxMDAsMiwwLDEwMCwzLAorICAgIDAsMTMxLDIsMCw4Myw0MSw0LDEyMiw0Miw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwKKyAgICAzMiw5NywzMiw1MSw1MCw0NSw5OCwxMDUsMTE2LDMyLDEwNSwxMTAsMTE2LDEwMSwxMDMsMTAxLAorICAgIDExNCwzMiwxMTYsMTExLDMyLDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLDQ1LDEwMSwxMTAsMTAwLDEwNSwKKyAgICA5NywxMTAsNDYsMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsMTI3LDMsMCwyMzMsNCwKKyAgICAwLDAsMCwyMTgsNiwxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSw0MSwyLDIxOCwzLDEwNSwKKyAgICAxMTAsMTE2LDIxOCw4LDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDEsMjE4LDEsCisgICAgMTIwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDIxOCw3LDk1LDExOSw5NSwxMDgsMTExLDExMCwxMDMsNDAsMCwwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCwyLDExNCwxNywwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKKyAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwKKyAgICAyLDAsODMsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsNTIsCisgICAgMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsCisgICAgNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiwxMDUsMTEwLAorICAgIDExNiwxMDEsMTAzLDEwMSwxMTQsNDYsMTE0LDEzLDAsMCwwLDQxLDIsMTE0LDE0LDAsCisgICAgMCwwLDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDEsCisgICAgOTAsOSwxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDcsOTUsMTE0LDk1LDEwOCwKKyAgICAxMTEsMTEwLDEwMyw0NSwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDE5LAorICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorICAgIDMsMCwwLDAsNzEsMCwwLDAsMTE1LDI2LDAsMCwwLDExNiwwLDAsCisgICAgMTA2LDEsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjQsMCwwLDY4LAorICAgIDEzMSwxLDAsMTMxLDEsMCw4Myw0MSwzLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5NywKKyAgICA5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LAorICAgIDExNiwxMDQsNDYsMTA2LDExMSwxMDUsMTEwLDQwLDQxLDQ2LDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDQsMCwwLDAsODMsMCwwLDAsMTE1LAorICAgIDM3LDAsMCwwLDEwMywwLDAsMTI0LDAsMCw5MywyNywwLDEyNSwxLDAsCisgICAgMTI0LDEsMCwxMTQsNiwwLDEyNCwxLDAsMTA2LDAsMCwxMTYsMSwwLDEzMSwKKyAgICAxLDAsMTQ1LDIsMCwxMTMsNiwwLDgzLDExNCw0LDAsMCwwLDQxLDIsCisgICAgMjE4LDYsMTE0LDExNSwxMTYsMTE0LDEwNSwxMTIsMjE4LDE1LDExMiw5NywxMTYsMTA0LDk1LDExNSwKKyAgICAxMDEsMTEyLDk3LDExNCw5NywxMTYsMTExLDExNCwxMTUsNDEsMiwyMTgsMiw0Niw0OCwyMTgsCisgICAgNCwxMTIsOTcsMTE0LDExNiwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwyNTAsMTAsNjAsMTA4LDEwNSwxMTUsMTE2LDk5LDExMSwxMDksMTEyLDYyLAorICAgIDUyLDAsMCwwLDExNSwyLDAsMCwwLDksMSwxMjIsMzAsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTA2LDExMSwxMDUsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2MiwKKyAgICA0Niw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNDEsMiwyMTgsOCwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMTUsMTAxLDExMiwyMTgsNCwxMDYsMTExLDEwNSwxMTAsNDEsMSwyMTgsCisgICAgMTAsMTEyLDk3LDExNiwxMDQsOTUsMTEyLDk3LDExNCwxMTYsMTE1LDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNTAsMCwwLDAsMTE1LDQsMCwwLDAsMCwKKyAgICAyLDE1LDEsMTE0LDI4LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDEzNCwwLAorICAgIDAsMCwxMTYsMCwwLDExNiwxLDAsMTMxLDEsMCwxMDAsMSwwLDEwNywyLAorICAgIDAsMTE0LDUyLDAsMTI0LDAsMCwxMDYsMiwwLDExNiwzLDAsMTMxLDEsMCwKKyAgICA5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsMCwxMjQsCisgICAgMywwLDEwMiwyLDAsODMsMTIwLDY5LDAsMTE2LDQsMCwxMjQsMCwwLDEzMSwKKyAgICAxLDAsNjgsOTMsNTUsMCwxMjUsNCwwLDEyNCw0LDAsMTE2LDEsMCwxMDcsCisgICAgNiwwLDExNCw2NSwwLDEyNCwwLDAsMTA2LDUsMCwxMjQsNCwwLDEwMCwyLAorICAgIDAsMTAwLDEsMCwxMzEsMSwxLDkyLDIsMCwxMjUsMSwwLDEyNSwzLDAsCisgICAgMTI0LDEsMCwxMjQsMywwLDEwMiwyLDAsODMsMTEzLDY1LDAsODcsMTAwLDMsCisgICAgMCwxMjQsMCwwLDEwMiwyLDAsODMsNDEsNCwxMjIsMzIsODIsMTAxLDExMiwxMDgsCisgICAgOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiwKKyAgICA5NywxMTYsMTA0LDQ2LDExNSwxMTIsMTA4LDEwNSwxMTYsNDAsNDEsNDYsMjMzLDEsMCwwLAorICAgIDAsOTAsOCwxMDksOTcsMTIwLDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDAsNDEsNiwyMTgsCisgICAgMywxMDgsMTAxLDExMCwxMTQsMjEsMCwwLDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwKKyAgICAxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyNSwwLDAsMCwyMTgsOCwxMTQsMTAxLDExOCwxMDEsCisgICAgMTE0LDExNSwxMDEsMTAwLDIxOCw2LDExNCwxMTUsMTEyLDEwOCwxMDUsMTE2LDQxLDUsMjE4LDQsCisgICAgMTEyLDk3LDExNiwxMDQsOTAsNSwxMDIsMTE0LDExMSwxMTAsMTE2LDIxOCwxLDk1LDIxOCw0LAorICAgIDExNiw5NywxMDUsMTA4LDExNCwxNiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTE1LDExMiwxMDgsMTA1LDExNiw1NiwwLDAsMCwxMTUsMTYsMCwwLDAsMCwyLAorICAgIDE4LDEsMjQsMSwxMCwxLDE5LDEsMTIsMSwyNywxLDE0LDEsMTE0LDM4LAogICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAotICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEwMCwxLDAsNjQsMTA2LDEsMCwxMDAsMiwwLAotICAgIDEwMCwzLDAsMTMxLDIsMCw4Myw0MSw0LDEyMiw0Miw2NywxMTEsMTEwLDExOCwxMDEsCi0gICAgMTE0LDExNiwzMiw5NywzMiw1MSw1MCw0NSw5OCwxMDUsMTE2LDMyLDEwNSwxMTAsMTE2LDEwMSwKLSAgICAxMDMsMTAxLDExNCwzMiwxMTYsMTExLDMyLDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLDQ1LDEwMSwxMTAsCi0gICAgMTAwLDEwNSw5NywxMTAsNDYsMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsMTI3LDMsMCwKLSAgICAyMzMsNCwwLDAsMCwyMTgsNiwxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSw0MSwyLDIxOCwKLSAgICAzLDEwNSwxMTAsMTE2LDIxOCw4LDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDEsCi0gICAgMjE4LDEsMTIwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCi0gICAgMCwwLDIxOCw3LDk1LDExOSw5NSwxMDgsMTExLDExMCwxMDMsNDAsMCwwLDAsMTE1LAotICAgIDIsMCwwLDAsMCwyLDExNCwxNywwLDAsMCw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwxNiwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDAsMCwxMDAsMSwKLSAgICAwLDEzMSwyLDAsODMsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsCi0gICAgMzIsNTIsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA4LDEwNSwxMTYsMTE2LAotICAgIDEwOCwxMDEsNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiwKLSAgICAxMDUsMTEwLDExNiwxMDEsMTAzLDEwMSwxMTQsNDYsMTE0LDEzLDAsMCwwLDQxLDIsMTE0LAotICAgIDE0LDAsMCwwLDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsMTIxLDExNiwxMDEsMTE1LAotICAgIDQxLDEsOTAsOSwxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDcsOTUsMTE0LAotICAgIDk1LDEwOCwxMTEsMTEwLDEwMyw0NSwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsCi0gICAgMTE0LDE5LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsCi0gICAgMCwwLDMsMCwwLDAsNzEsMCwwLDAsMTE1LDI2LDAsMCwwLDExNiwKLSAgICAwLDAsMTA2LDEsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjQsMCwKLSAgICAwLDY4LDEzMSwxLDAsMTMxLDEsMCw4Myw0MSwzLDEyMiwzMSw4MiwxMDEsMTEyLAorICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDExNiwwLDAsCisgICAgMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsODMsNDEsMSwxMjIsMTI2LDgzLDExNiwKKyAgICA5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsNzcsOTcsMTAwLDEwMSwzMiw5NywzMiwxMTUsMTAxLDExMiw5NywxMTQsOTcsMTE2LAorICAgIDEwMSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMDksOTcsCisgICAgMTA3LDEwMSwzMiwxMDUsMTE2LDMyLDEwMSw5NywxMTUsMTA1LDEwMSwxMTQsMzIsMTE2LDExMSwzMiwKKyAgICAxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDEwNSwxMTAsMzIsMTAxLDEyMCwxMTIsMTAxLAorICAgIDExNCwxMDUsMTA5LDEwMSwxMTAsMTE2LDExNSwxMCwzMiwzMiwzMiwzMiw0MCwxMDEsNDYsMTAzLAorICAgIDQ2LDMyLDk5LDk3LDk5LDEwNCwxMDEsMzIsMTE1LDExNiw5NywxMTYsMzIsMTE0LDEwMSwxMTUsCisgICAgMTE3LDEwOCwxMTYsMTE1LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDQxLDIsMTE0LDMsCisgICAgMCwwLDAsOTAsNCwxMTUsMTE2LDk3LDExNiw0MSwxLDExNCwzNSwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsCisgICAgMTAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsNjgsMCwwLDAsMTE1LAorICAgIDIsMCwwLDAsMCw3LDExNCwzOSwwLDAsMCw5OSwyLDAsMCwwLAorICAgIDAsMCwwLDAsMywwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsNTgsMCwwLDAsMTIxLDE2LDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLAorICAgIDAsMTI1LDIsMCw4NywxMTAsMjIsMCw0LDExNiwxLDAsMTA3LDEwLDAsMTE0LAorICAgIDQwLDAsMSwxLDEsMTAwLDEsMCw4Myw4OSwxMTAsMSwwLDg4LDEyNCwyLAorICAgIDAsMTA2LDIsMCwxMDAsMiwwLDY0LDEyNCwxLDAsMTA3LDIsMCw4Myw0MSwKKyAgICAzLDEyMiw0OSw4NCwxMDEsMTE1LDExNiwzMiwxMTksMTA0LDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTYsCisgICAgMTIxLDExMiwxMDEsNDYsNzAsMTA1LDAsMjQwLDAsMCw0MSwzLDExNCwzOSwwLDAsCisgICAgMCwyMTgsNyw3OSw4Myw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDcsMTE1LDExNiw5NSwxMDksCisgICAgMTExLDEwMCwxMDEsNDEsMywxMTQsMzUsMCwwLDAsMjE4LDQsMTA5LDExMSwxMDAsMTAxLAorICAgIDkwLDksMTE1LDExNiw5NywxMTYsOTUsMTA1LDExMCwxMDIsMTExLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxOCw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSwxMDUsMTE1LDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsNzgsMCwKKyAgICAwLDAsMTE1LDEwLDAsMCwwLDAsMiwzLDEsMTYsMSwxMywxLDksCisgICAgMSwxMTQsNDMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsCisgICAgMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsCisgICAgMTE2LDAsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiwKKyAgICAzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LAorICAgIDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsNDYsCisgICAgMTA1LDAsMTI4LDAsMCw0MSwxLDExNCw0MywwLDAsMCw0MSwxLDExNCwzNSwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAorICAgIDAsMCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsCisgICAgODcsMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDExNCw0NCwwLDAsMCwKKyAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwzMSwwLDAsMCwxMjQsMCwwLDExNSwxOCwwLAorICAgIDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEyNSwwLDAsMTE2LDIsMCwxMjQsCisgICAgMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiwzMCw4MiwxMDEsMTEyLAogICAgIDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsCi0gICAgMTEyLDk3LDExNiwxMDQsNDYsMTA2LDExMSwxMDUsMTEwLDQwLDQxLDQ2LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsODMsMCwwLAotICAgIDAsMTE1LDM3LDAsMCwwLDEwMywwLDAsMTI0LDAsMCw5MywyNywwLDEyNSwKLSAgICAxLDAsMTI0LDEsMCwxMTQsNiwwLDEyNCwxLDAsMTA2LDAsMCwxMTYsMSwKLSAgICAwLDEzMSwxLDAsMTQ1LDIsMCwxMTMsNiwwLDgzLDExNCw0LDAsMCwwLAotICAgIDQxLDIsMjE4LDYsMTE0LDExNSwxMTYsMTE0LDEwNSwxMTIsMjE4LDE1LDExMiw5NywxMTYsMTA0LAotICAgIDk1LDExNSwxMDEsMTEyLDk3LDExNCw5NywxMTYsMTExLDExNCwxMTUsNDEsMiwyMTgsMiw0NiwKLSAgICA0OCwyMTgsNCwxMTIsOTcsMTE0LDExNiwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwyNTAsMTAsNjAsMTA4LDEwNSwxMTUsMTE2LDk5LDExMSwxMDksCi0gICAgMTEyLDYyLDUyLDAsMCwwLDExNSwyLDAsMCwwLDksMSwxMjIsMzAsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTA2LDExMSwxMDUsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LAotICAgIDExNSw2Miw0Niw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNDEsMiwyMTgsCi0gICAgOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTAxLDExMiwyMTgsNCwxMDYsMTExLDEwNSwxMTAsNDEsCi0gICAgMSwyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTEyLDk3LDExNCwxMTYsMTE1LDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMCw5NSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNTAsMCwwLDAsMTE1LDQsMCwwLAotICAgIDAsMCwyLDE1LDEsMTE0LDI4LDAsMCwwLDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDEzNCwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTMxLDEsMCwxMDAsMSwwLAotICAgIDEwNywyLDAsMTE0LDUyLDAsMTI0LDAsMCwxMDYsMiwwLDExNiwzLDAsMTMxLAotICAgIDEsMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsCi0gICAgMCwxMjQsMywwLDEwMiwyLDAsODMsMTIwLDY5LDAsMTE2LDQsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsNjgsOTMsNTUsMCwxMjUsNCwwLDEyNCw0LDAsMTE2LDEsCi0gICAgMCwxMDcsNiwwLDExNCw2NSwwLDEyNCwwLDAsMTA2LDUsMCwxMjQsNCwwLAotICAgIDEwMCwyLDAsMTAwLDEsMCwxMzEsMSwxLDkyLDIsMCwxMjUsMSwwLDEyNSwKLSAgICAzLDAsMTI0LDEsMCwxMjQsMywwLDEwMiwyLDAsODMsMTEzLDY1LDAsODcsCi0gICAgMTAwLDMsMCwxMjQsMCwwLDEwMiwyLDAsODMsNDEsNCwxMjIsMzIsODIsMTAxLAotICAgIDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LAotICAgIDQ2LDExMiw5NywxMTYsMTA0LDQ2LDExNSwxMTIsMTA4LDEwNSwxMTYsNDAsNDEsNDYsMjMzLDEsCi0gICAgMCwwLDAsOTAsOCwxMDksOTcsMTIwLDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDAsNDEsCi0gICAgNiwyMTgsMywxMDgsMTAxLDExMCwxMTQsMjEsMCwwLDAsMjE4LDEwLDExNCwxMTIsOTcsCi0gICAgMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyNSwwLDAsMCwyMTgsOCwxMTQsMTAxLAotICAgIDExOCwxMDEsMTE0LDExNSwxMDEsMTAwLDIxOCw2LDExNCwxMTUsMTEyLDEwOCwxMDUsMTE2LDQxLDUsCi0gICAgMjE4LDQsMTEyLDk3LDExNiwxMDQsOTAsNSwxMDIsMTE0LDExMSwxMTAsMTE2LDIxOCwxLDk1LAotICAgIDIxOCw0LDExNiw5NywxMDUsMTA4LDExNCwxNiwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMCwxMDUsMTE0LDQ2LDEwNSwwLDY0LDAsMCwKKyAgICA0MSwzLDExNCwzLDAsMCwwLDIxOCw2LDEwMywxMDEsMTE2LDk5LDExOSwxMDAsMTE0LAorICAgIDQzLDAsMCwwLDQxLDEsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLAogICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LAotICAgIDEwNCw5NSwxMTUsMTEyLDEwOCwxMDUsMTE2LDU2LDAsMCwwLDExNSwxNiwwLDAsMCwKLSAgICAwLDIsMTgsMSwyNCwxLDEwLDEsMTksMSwxMiwxLDI3LDEsMTQsMSwKLSAgICAxMTQsMzgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCw4Myw0MSwxLDEyMiwxMjYsCi0gICAgODMsMTE2LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLDk3LDMyLDExNSwxMDEsMTEyLDk3LDExNCwKLSAgICA5NywxMTYsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLAotICAgIDEwOSw5NywxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLDk3LDExNSwxMDUsMTAxLDExNCwzMiwxMTYsCi0gICAgMTExLDMyLDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LDExMCwzMiwxMDEsMTIwLAotICAgIDExMiwxMDEsMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LDEwLDMyLDMyLDMyLDMyLDQwLDEwMSwKLSAgICA0NiwxMDMsNDYsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMTUsMTE2LDk3LDExNiwzMiwxMTQsCi0gICAgMTAxLDExNSwxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNDEsMiwKLSAgICAxMTQsMywwLDAsMCw5MCw0LDExNSwxMTYsOTcsMTE2LDQxLDEsMTE0LDM1LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiw2OCwwLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDcsMTE0LDM5LDAsMCwwLDk5LDIsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw1OCwwLDAsMCwxMjEsMTYsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxMjUsMiwwLDg3LDExMCwyMiwwLDQsMTE2LDEsMCwxMDcsMTAsCi0gICAgMCwxMTQsNDAsMCwxLDEsMSwxMDAsMSwwLDgzLDg5LDExMCwxLDAsODgsCi0gICAgMTI0LDIsMCwxMDYsMiwwLDEwMCwyLDAsNjQsMTI0LDEsMCwxMDcsMiwwLAotICAgIDgzLDQxLDMsMTIyLDQ5LDg0LDEwMSwxMTUsMTE2LDMyLDExOSwxMDQsMTAxLDExNiwxMDQsMTAxLAotICAgIDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTAxLAotICAgIDMyLDExNiwxMjEsMTEyLDEwMSw0Niw3MCwxMDUsMCwyNDAsMCwwLDQxLDMsMTE0LDM5LAotICAgIDAsMCwwLDIxOCw3LDc5LDgzLDY5LDExNCwxMTQsMTExLDExNCwyMTgsNywxMTUsMTE2LAotICAgIDk1LDEwOSwxMTEsMTAwLDEwMSw0MSwzLDExNCwzNSwwLDAsMCwyMTgsNCwxMDksMTExLAotICAgIDEwMCwxMDEsOTAsOSwxMTUsMTE2LDk3LDExNiw5NSwxMDUsMTEwLDEwMiwxMTEsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE4LDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNSwxMTUsOTUsMTA5LDExMSwxMDAsMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwKLSAgICA3OCwwLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDMsMSwxNiwxLDEzLAotICAgIDEsOSwxLDExNCw0MywwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLAotICAgIDIsMTIyLDMxLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMiwxMDUsMTA4LAotICAgIDEwMSw0NiwxMDUsMCwxMjgsMCwwLDQxLDEsMTE0LDQzLDAsMCwwLDQxLDEsCi0gICAgMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCwxMiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMiwxMDUsCi0gICAgMTA4LDEwMSw4NywwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDQ0LDAsCi0gICAgMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDMxLDAsMCwwLDEyNCwwLDAsMTE1LAotICAgIDE4LDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDAsMCwxMTYsMiwKLSAgICAwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLDIsMTIyLDMwLDgyLAotICAgIDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLAotICAgIDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMCwxMDUsMTE0LDQ2LDEwNSwwLDY0LAotICAgIDAsMCw0MSwzLDExNCwzLDAsMCwwLDIxOCw2LDEwMywxMDEsMTE2LDk5LDExOSwKLSAgICAxMDAsMTE0LDQzLDAsMCwwLDQxLDEsMTE0LDM1LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMCwxMDUsMTE0LDkyLDAsMCwwLDExNSw2LDAsCi0gICAgMCwwLDAsMiw2LDEsMTIsMSwxMTQsNDYsMCwwLDAsMTA1LDE4MiwxLAotICAgIDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTkzLDAsMCwwLDEwMCwxLDAsMTA2LAotICAgIDAsMCwxMjQsMCwwLDExNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwyLAotICAgIDAsMTI1LDMsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDMsMCwxMTYsMiwwLAotICAgIDEwNiw0LDAsMTE2LDIsMCwxMDYsNSwwLDY2LDExNiwyLDAsMTA2LDYsMCwKLSAgICA2NiwxMjQsMiwwLDEwMCwyLDAsNjQsMTMxLDMsMCwxMjUsNCwwLDEyMSw2MSwKLSAgICAwLDExNiw3LDAsMTA2LDgsMCwxMjQsNCwwLDEwMCwzLDAsMTMxLDIsMCwKLSAgICAxNDMsMjAsMCwxMjUsNSwwLDEyNCw1LDAsMTA2LDksMCwxMjQsMSwwLDEzMSwKLSAgICAxLDAsMSw4NywxMDAsNCwwLDgxLDgyLDg4LDExNiwyLDAsMTA2LDEwLDAsCi0gICAgMTI0LDMsMCwxMjQsMCwwLDEzMSwyLDAsMSw4NywxMTAsNTksMCw0LDExNiwKLSAgICAxMSwwLDEwNywxMCwwLDExNCwxODgsMCwxLDEsMSwxMjEsMTcsMCwxMTYsMiwKLSAgICAwLDEwNiwxMiwwLDEyNCwzLDAsMTMxLDEsMCwxLDg3LDExMCwxOCwwLDQsCi0gICAgMTE2LDExLDAsMTA3LDEwLDAsMTE0LDE4MCwwLDEsMSwxLDg5LDExMCwxLDAsCi0gICAgODgsMTMwLDAsMCw4OSwxMTAsMSwwLDg4LDEwMCw0LDAsODMsNDEsNSwxMjIsCi0gICAgMTYyLDY2LDEwMSwxMTUsMTE2LDQ1LDEwMSwxMDIsMTAyLDExMSwxMTQsMTE2LDMyLDEwMiwxMTcsMTEwLAotICAgIDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMzIsMTAwLAotICAgIDk3LDExNiw5NywzMiwxMTYsMTExLDMyLDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDk3LDExNiwKLSAgICAxMTEsMTA5LDEwNSw5OSw5NywxMDgsMTA4LDEyMSw0NiwxMCwzMiwzMiwzMiwzMiw2NiwxMDEsCi0gICAgMzIsMTEyLDExNCwxMDEsMTEyLDk3LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA0LDk3LDExMCwKLSAgICAxMDAsMTA4LDEwMSwzMiw5NywzMiw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsMTA1LDExNSwxMTYsMTE1LAotICAgIDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTAyLDMyLDk5LDExMSwxMTAsOTksMTE3LDExNCwxMTQsCi0gICAgMTAxLDExMCwxMTYsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTE2LDEwMSwxMDksMTEyLDExMSwxMTQsOTcsMTE0LDEyMSwKLSAgICAzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwKLSAgICAxMDEsMTAwLDQ2LDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSwxMDUsMTgyLDEsMCwwLDkwLAotICAgIDIsMTE5LDk4LDc4LDQxLDEzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMjE4LDIsCi0gICAgMTA1LDEwMCwxMTQsMywwLDAsMCw5MCw0LDExMSwxMTIsMTAxLDExMCw5MCw2LDc5LAotICAgIDk1LDY5LDg4LDY3LDc2LDkwLDcsNzksOTUsNjcsODIsNjksNjUsODQsOTAsOCwKLSAgICA3OSw5NSw4Nyw4Miw3OSw3OCw3Niw4OSwyMTgsMyw5NSwxMDUsMTExLDIxOCw2LDcwLAotICAgIDEwNSwxMDgsMTAxLDczLDc5LDIxOCw1LDExOSwxMTQsMTA1LDExNiwxMDEsMjE4LDcsMTE0LDEwMSwKLSAgICAxMTIsMTA4LDk3LDk5LDEwMSwxMTQsNDAsMCwwLDAsOTAsNiwxMTcsMTEwLDEwOCwxMDUsCi0gICAgMTEwLDEwNyw0MSw2LDExNCwzNSwwLDAsMCwyMTgsNCwxMDAsOTcsMTE2LDk3LDExNCwKLSAgICA0MiwwLDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDk1LDExNiwxMDksMTEyLDkwLDIsCi0gICAgMTAyLDEwMCwyMTgsNCwxMDIsMTA1LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDEzLDk1LDExOSwxMTQsMTA1LDExNiwxMDEsOTUsCi0gICAgOTcsMTE2LDExMSwxMDksMTA1LDk5LDk5LDAsMCwwLDExNSwyNiwwLDAsMCwwLAotICAgIDUsMjQsMSw5LDEsMzMsMSwzLDMsMjEsMSwyMCwxLDIwLDEsMTMsCi0gICAgMSwzLDEsMTcsMSwxMywxLDUsMSwxMTQsNTUsMCwwLDAsMTA1LDIyLAotICAgIDEzLDAsMCwyMzMsMiwwLDAsMCwxMTQsMTMsMCwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMTMsMTAsOTAsMTEsOTUsOTUsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDk1LAotICAgIDk1LDEyMiw0LDExMSwxMTIsMTE2LDQ1LDEyMiwzLDQ2LDExMiwxMjEsMTIyLDQsNDYsMTEyLAotICAgIDEyMSw5OSw3OCwyMTgsMTIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLAotICAgIDExMCw5OSwyLDAsMCwwLDEsMCwwLDAsMTEsMCwwLDAsNiwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsODcsMSwwLDAsMTI0LDEsMCwxMDAsMSwKLSAgICAwLDEwNyw5LDAsMTE0LDc2LDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwyLDAsCi0gICAgMTE2LDIsMCwxMzEsMiwwLDEsMTI0LDIsMCwxMDAsMSwwLDEwNyw5LDAsCi0gICAgMTE0LDU4LDAsMTAwLDMsMCwxMjUsMywwLDExNiwzLDAsMTI0LDMsMCwxMzEsCi0gICAgMSwwLDEzMCwxLDAsMTI0LDEsMCwxMTQsNzAsMCwxMDAsNCwwLDExMCwzLAotICAgIDAsMTAwLDUsMCwxMjUsMiwwLDExNiw0LDAsMTI0LDAsMCwxMzEsMSwwLAotICAgIDkyLDIsMCwxMjUsNCwwLDEyNSw1LDAsMTI0LDUsMCwxMDYsNSwwLDEwMCwKLSAgICA2LDAsMTMxLDEsMCw5MiwzLDAsMTI1LDYsMCwxMjUsNywwLDEyNSw4LAotICAgIDAsMTE2LDYsMCwxMDYsNywwLDEwNiw4LDAsMTI1LDksMCwxMjQsOSwwLAotICAgIDEwMCwxLDAsMTA3LDgsMCwxMTQsMTU0LDAsMTE2LDksMCwxMDAsNywwLDEzMSwKLSAgICAxLDAsMTMwLDEsMCwxMDAsNCwwLDEwNiwxMCwwLDEyNCw2LDAsMTE0LDE3MiwKLSAgICAwLDEyNCw2LDAsMTEwLDMsMCwxMjQsOCwwLDEyNCw3LDAsMTI0LDksMCwKLSAgICAxMDMsMywwLDEzMSwxLDAsMTI1LDEwLDAsMTI0LDIsMCwxMDAsMSwwLDEwNywKLSAgICA4LDAsMTE0LDI0MSwwLDExNiw2LDAsMTA2LDExLDAsMTA2LDEyLDAsMTAwLDgsCi0gICAgMCwxMDcsMiwwLDExNCwyMjksMCwxMDAsNCwwLDEyNSwyLDAsMTEwLDEyLDAsCi0gICAgMTE2LDYsMCwxMDYsMTEsMCwxMDYsMTIsMCwxMjUsMiwwLDExNiwxMywwLDEyNCwKLSAgICAyLDAsMTMxLDEsMCwxMjUsMiwwLDEyNCwyLDAsMTAwLDQsMCwxMDcsMywKLSAgICAwLDExNCw2MywxLDEyNCwyLDAsMTA2LDE0LDAsMTMxLDAsMCwxMTUsNDIsMSwKLSAgICAxMTYsMTUsMCwxMDAsOSwwLDEwNiwxNiwwLDEyNCwyLDAsMTMxLDEsMCwxMzEsCi0gICAgMSwwLDEzMCwxLDAsMTAwLDEwLDAsMTA2LDE2LDAsMTI0LDEwLDAsMTE2LDE3LAotICAgIDAsMTI0LDIsMCwxMzEsMywwLDEyNSwxMCwwLDExNiwxOCwwLDEyNCw0LDAsCi0gICAgMTE2LDE5LDAsMTI0LDEwLDAsMTE2LDIwLDAsMTAwLDgsMCwyNSwyMywxMzEsMywKLSAgICAwLDgzLDQxLDExLDk3LDI1NCwyLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLAotICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwKLSAgICAxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwKLSAgICAxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLAotICAgIDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwKLSAgICAxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwKLSAgICAxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKLSAgICAxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDQ2LDExMiwxMjEsOTksMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLAotICAgIDk3LDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDMyLDExOSwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LAotICAgIDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsCi0gICAgMTE2LDEwMSwxMTQsMzIsOTksMTExLDExMCwxMTYsMTE0LDExMSwxMDgsMTE1LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDExMiwxMTQsMTAxLDExNSwxMTcsMTA5LDEwMSwxMDAsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsCi0gICAgMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDExMSwxMDIsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsCi0gICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDczLDEwMiwzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LAotICAgIDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsCi0gICAgNzgsMTExLDExMCwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsCi0gICAgMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTcsMTE0LDEwMywxMTcsMTA5LAotICAgIDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDMyLDk3LDExMCwxMDAsCi0gICAgMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwKLSAgICA5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiw0MCwxMDEsMTA4LAotICAgIDExNSwxMDEsMzIsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDEwLDMyLDMyLAotICAgIDMyLDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0MSw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwKLSAgICAxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwKLSAgICAxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsNzMsCi0gICAgMTAyLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsNDQsMTAsMzIsMzIsCi0gICAgMzIsMzIsOTcsMzIsODQsMTE0LDExNywxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDk3LDEwOSwxMDEsMzIsOTcsMTE1LDMyLDExNSwxMDEsCi0gICAgMTE2LDExNiwxMDUsMTEwLDEwMywzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDM5LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAxLDEwOSwxMTIsMTE2LAotICAgIDEyMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTksMTA0LDEwNSwKLSAgICAxMDgsMTAxLDMyLDk3LDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDExOCw5NywxMDgsMTE3LDEwMSwKLSAgICAzMiwxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LDMyLDExNiwKLSAgICAxMTEsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwzOSw0OSwzOSw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsCi0gICAgMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLAotICAgIDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw3MCwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLAotICAgIDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTIsOTcsMTE0LAotICAgIDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LAotICAgIDk3LDExNiwxMDEsMTAwLDU5LDMyLDExNywxMTUsMTAxLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsCi0gICAgMTIyLDUwLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLAotICAgIDMyLDExMSwxMTQsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsCi0gICAgNzgsMTExLDExMCwxMDEsMTE0LDMwLDAsMCwwLDExNCwyOSwwLDAsMCwyMTgsMSwKLSAgICA0NiwxMjIsMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCi0gICAgOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwKLSAgICAxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDIzMywwLDAsMCwwLDEyMiwyNCwxMjMsMzMsCi0gICAgMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwOCwxMTIsMTA0LDk3LDExMCwKLSAgICAxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDEyMiw3LDEyMywxMjUsNDYsMTIzLDEyNSwxMjMsMTI1LDQxLAotICAgIDIxLDIxOCw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwyMTgsNCwxMTksOTcsCi0gICAgMTE0LDExMCwyMTgsMTgsNjgsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDUsMTExLDExMCw4NywKLSAgICA5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLAotICAgIDExNCwxMTQsMzgsMCwwLDAsMTE0LDMyLDAsMCwwLDExNCw3LDAsMCwwLAotICAgIDIxOCwxNCwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsCi0gICAgMjE4LDksOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDIxOCwxOSw3OCwxMTEsMTE2LAotICAgIDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMTE0LDI2LDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwyMTgsOCwxMTEsMTEyLAotICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLDIxOCwzLDExNSwxMTYsMTE0LDIxOCw3LDEwNSwxMTUsOTcsCi0gICAgMTA4LDExMCwxMTcsMTA5LDIxOCwxMCw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMTE0LDQ3LDAsMCwwLDIxOCw0LDk1LDc5LDgwLDg0LDExNCwyOCwwLDAsMCwKLSAgICAyMTgsOCw5NSw4MCw4OSw2Nyw2NSw2Nyw3Miw2OSwyMTgsMTcsNjYsODksODQsNjksCi0gICAgNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsMTEsMTE0LAotICAgIDM1LDAsMCwwLDkwLDE0LDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsCi0gICAgMTE0LDEwNSwxMDAsMTAxLDExNCw1NywwLDAsMCwyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsCi0gICAgMTAzLDEwMSwyMTgsNCwxMDQsMTAxLDk3LDEwMCwxMTQsMzcsMCwwLDAsOTAsNCw5OCwKLSAgICA5NywxMTUsMTAxLDIxOCwzLDExNSwxMDEsMTEyLDIxOCw0LDExNCwxMDEsMTE1LDExNiw5MCwzLAotICAgIDExNiw5NywxMDMsOTAsMTUsOTcsMTA4LDEwOSwxMTEsMTE1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMjE4LDE3LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjQzLDAsMCwwLDExNSw0NiwwLDAsMCwwLAotICAgIDE4LDEyLDEsOSwxLDcsMSwxMiwxLDYsMSwxMiwxLDE4LDEsMTgsCi0gICAgMSwyNCwxLDEyLDEsMTIsMSwxMiwxLDM2LDEsMTIsMSwxOCwxLDksCi0gICAgMiwxMiwxLDEyLDEsMTIsMSwxMiwxLDIxLDEsMjEsMSwxMTQsNzksMCwKLSAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsNSwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNjIsMSwwLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEwNiwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwzMCwwLDExNiwzLAotICAgIDAsMTAwLDIsMCwxMzEsMSwwLDEzMCwxLDAsMTE2LDQsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsOTIsMiwwLDEyNSwxLDAsMTI1LDIsMCwxMTYsNCwwLDEyNCwKLSAgICAxLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDEsMCwxMjUsMywwLDEyNCwzLAotICAgIDAsMTE2LDUsMCwxMDcsMywwLDExNCwxMDIsMCwxMTYsNiwwLDEwMCwzLDAsCi0gICAgMTA2LDcsMCwxMTYsNSwwLDEyNCwwLDAsMTMxLDIsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDIsMCwxMDYsOCwwLDEwMCw0LDAsMTMxLDEsMCwxMjUsNCwKLSAgICAwLDEyNCw0LDAsMTAwLDExLDAsMTA3LDcsMCwxMTQsMTUzLDAsMTE2LDYsMCwKLSAgICAxMDAsNywwLDEwNiw3LDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMTAsMTI1LDAsMTI0LDQsMCwxMDAsNiwwLDEwNywyLDAsMTE0LDIyLAotICAgIDEsMTI0LDIsMCwxMDYsOSwwLDEwMCw0LDAsMTAwLDUsMCwxMzEsMiwwLAotICAgIDEwMCwxMiwwLDI1LDEyNSw1LDAsMTI0LDUsMCwxMDYsMTAsMCwxMTYsMTEsMCwKLSAgICAxMzEsMSwwLDExNSwyMjMsMCwxMTYsNiwwLDEwMCw4LDAsMTA2LDcsMCwxMTYsCi0gICAgMTEsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwxMjQsNSwwLDExNiwxMiwKLSAgICAwLDExNiwxMSwwLDEzMSwxLDAsMTAwLDEsMCwxMzMsMiwwLDI1LDEyNSw2LAotICAgIDAsMTI0LDYsMCwxMDYsMTMsMCwxMzEsMCwwLDExNSwyMiwxLDExNiw2LDAsCi0gICAgMTAwLDksMCwxMDYsNywwLDEyNCw1LDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDIsMCwxMDYsMTQsMCwxMDAsNCwwLDEzMSwxLDAsMTAwLDEwLAotICAgIDAsMjUsMTI1LDcsMCwxMTYsMTUsMCwxMjQsMSwwLDEyNCw3LDAsMTE2LDE2LAotICAgIDAsMTAwLDEwLDAsMjUsMjMsMTMxLDIsMCw4Myw0MSwxMyw5NywxMTAsMSwwLAotICAgIDAsNzEsMTA1LDExOCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDExNiwxMTEsMzIsOTcsMzIsNDYsMTEyLDEyMSw5OSw0NiwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsCi0gICAgMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsMTE2LDExMSwzMiwxMDUsMTE2LDExNSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsOTksMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTAsMTAxLAotICAgIDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDU5LDMyLDExNiwxMDQsMTA1LAotICAgIDExNSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5OSw5NywKLSAgICAxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LAotICAgIDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLAotICAgIDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsMzIsNzMsMTAyLDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDMyLDEwMCwxMTEsMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTAsMTExLDExNiwzMiw5OSwKLSAgICAxMTEsMTEwLDEwMiwxMTEsMTE0LDEwOSwzMiwxMTYsMTExLDMyLDgwLDY5LDgwLDMyLDUxLDQ5LAotICAgIDUyLDU1LDQ3LDUyLDU2LDU2LDMyLDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsNDQsMzIsODYsCi0gICAgOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5OCwKLSAgICAxMDEsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwzMiw3MywxMDIsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LAorICAgIDEwNCw5NSwxMDUsMTE1LDEwMCwxMDUsMTE0LDkyLDAsMCwwLDExNSw2LDAsMCwwLAorICAgIDAsMiw2LDEsMTIsMSwxMTQsNDYsMCwwLDAsMTA1LDE4MiwxLDAsMCwKKyAgICA5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTkzLDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwKKyAgICAxMjQsMCwwLDExNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwyLDAsMTI1LAorICAgIDMsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDMsMCwxMTYsMiwwLDEwNiw0LAorICAgIDAsMTE2LDIsMCwxMDYsNSwwLDY2LDExNiwyLDAsMTA2LDYsMCw2NiwxMjQsCisgICAgMiwwLDEwMCwyLDAsNjQsMTMxLDMsMCwxMjUsNCwwLDEyMSw2MSwwLDExNiwKKyAgICA3LDAsMTA2LDgsMCwxMjQsNCwwLDEwMCwzLDAsMTMxLDIsMCwxNDMsMjAsCisgICAgMCwxMjUsNSwwLDEyNCw1LDAsMTA2LDksMCwxMjQsMSwwLDEzMSwxLDAsCisgICAgMSw4NywxMDAsNCwwLDgxLDgyLDg4LDExNiwyLDAsMTA2LDEwLDAsMTI0LDMsCisgICAgMCwxMjQsMCwwLDEzMSwyLDAsMSw4NywxMTAsNTksMCw0LDExNiwxMSwwLAorICAgIDEwNywxMCwwLDExNCwxODgsMCwxLDEsMSwxMjEsMTcsMCwxMTYsMiwwLDEwNiwKKyAgICAxMiwwLDEyNCwzLDAsMTMxLDEsMCwxLDg3LDExMCwxOCwwLDQsMTE2LDExLAorICAgIDAsMTA3LDEwLDAsMTE0LDE4MCwwLDEsMSwxLDg5LDExMCwxLDAsODgsMTMwLAorICAgIDAsMCw4OSwxMTAsMSwwLDg4LDEwMCw0LDAsODMsNDEsNSwxMjIsMTYyLDY2LAorICAgIDEwMSwxMTUsMTE2LDQ1LDEwMSwxMDIsMTAyLDExMSwxMTQsMTE2LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMzIsMTAwLDk3LDExNiwKKyAgICA5NywzMiwxMTYsMTExLDMyLDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDk3LDExNiwxMTEsMTA5LAorICAgIDEwNSw5OSw5NywxMDgsMTA4LDEyMSw0NiwxMCwzMiwzMiwzMiwzMiw2NiwxMDEsMzIsMTEyLAorICAgIDExNCwxMDEsMTEyLDk3LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LAorICAgIDEwMSwzMiw5NywzMiw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsMTA1LDExNSwxMTYsMTE1LDY5LDExNCwKKyAgICAxMTQsMTExLDExNCwzMiwxMDUsMTAyLDMyLDk5LDExMSwxMTAsOTksMTE3LDExNCwxMTQsMTAxLDExMCwKKyAgICAxMTYsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsCisgICAgMTAsMzIsMzIsMzIsMzIsMTE2LDEwMSwxMDksMTEyLDExMSwxMTQsOTcsMTE0LDEyMSwzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywxMTYsMTE2LDEwMSwxMDksMTEyLDExNiwxMDEsMTAwLAorICAgIDQ2LDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSwxMDUsMTgyLDEsMCwwLDkwLDIsMTE5LAorICAgIDk4LDc4LDQxLDEzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMjE4LDIsMTA1LDEwMCwKKyAgICAxMTQsMywwLDAsMCw5MCw0LDExMSwxMTIsMTAxLDExMCw5MCw2LDc5LDk1LDY5LAorICAgIDg4LDY3LDc2LDkwLDcsNzksOTUsNjcsODIsNjksNjUsODQsOTAsOCw3OSw5NSwKKyAgICA4Nyw4Miw3OSw3OCw3Niw4OSwyMTgsMyw5NSwxMDUsMTExLDIxOCw2LDcwLDEwNSwxMDgsCisgICAgMTAxLDczLDc5LDIxOCw1LDExOSwxMTQsMTA1LDExNiwxMDEsMjE4LDcsMTE0LDEwMSwxMTIsMTA4LAorICAgIDk3LDk5LDEwMSwxMTQsNDAsMCwwLDAsOTAsNiwxMTcsMTEwLDEwOCwxMDUsMTEwLDEwNywKKyAgICA0MSw2LDExNCwzNSwwLDAsMCwyMTgsNCwxMDAsOTcsMTE2LDk3LDExNCw0MiwwLAorICAgIDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDk1LDExNiwxMDksMTEyLDkwLDIsMTAyLDEwMCwKKyAgICAyMTgsNCwxMDIsMTA1LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMjE4LDEzLDk1LDExOSwxMTQsMTA1LDExNiwxMDEsOTUsOTcsMTE2LAorICAgIDExMSwxMDksMTA1LDk5LDk5LDAsMCwwLDExNSwyNiwwLDAsMCwwLDUsMjQsCisgICAgMSw5LDEsMzMsMSwzLDMsMjEsMSwyMCwxLDIwLDEsMTMsMSwzLAorICAgIDEsMTcsMSwxMywxLDUsMSwxMTQsNTUsMCwwLDAsMTA1LDMzLDEzLDAsCisgICAgMCwyMzMsMiwwLDAsMCwxMTQsMTMsMCwwLDAsMTE1LDIsMCwwLDAsCisgICAgMTMsMTAsOTAsMTEsOTUsOTUsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDk1LDEyMiwKKyAgICA0LDExMSwxMTIsMTE2LDQ1LDEyMiwzLDQ2LDExMiwxMjEsMTIyLDQsNDYsMTEyLDEyMSw5OSwKKyAgICA3OCwyMTgsMTIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCw5OSwKKyAgICAyLDAsMCwwLDEsMCwwLDAsMTEsMCwwLDAsNiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsODcsMSwwLDAsMTI0LDEsMCwxMDAsMSwwLDEwNywKKyAgICA5LDAsMTE0LDc2LDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwyLDAsMTE2LDIsCisgICAgMCwxMzEsMiwwLDEsMTI0LDIsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDU4LAorICAgIDAsMTAwLDMsMCwxMjUsMywwLDExNiwzLDAsMTI0LDMsMCwxMzEsMSwwLAorICAgIDEzMCwxLDAsMTI0LDEsMCwxMTQsNzAsMCwxMDAsNCwwLDExMCwzLDAsMTAwLAorICAgIDUsMCwxMjUsMiwwLDExNiw0LDAsMTI0LDAsMCwxMzEsMSwwLDkyLDIsCisgICAgMCwxMjUsNCwwLDEyNSw1LDAsMTI0LDUsMCwxMDYsNSwwLDEwMCw2LDAsCisgICAgMTMxLDEsMCw5MiwzLDAsMTI1LDYsMCwxMjUsNywwLDEyNSw4LDAsMTE2LAorICAgIDYsMCwxMDYsNywwLDEwNiw4LDAsMTI1LDksMCwxMjQsOSwwLDEwMCwxLAorICAgIDAsMTA3LDgsMCwxMTQsMTU0LDAsMTE2LDksMCwxMDAsNywwLDEzMSwxLDAsCisgICAgMTMwLDEsMCwxMDAsNCwwLDEwNiwxMCwwLDEyNCw2LDAsMTE0LDE3MiwwLDEyNCwKKyAgICA2LDAsMTEwLDMsMCwxMjQsOCwwLDEyNCw3LDAsMTI0LDksMCwxMDMsMywKKyAgICAwLDEzMSwxLDAsMTI1LDEwLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsCisgICAgMTE0LDI0MSwwLDExNiw2LDAsMTA2LDExLDAsMTA2LDEyLDAsMTAwLDgsMCwxMDcsCisgICAgMiwwLDExNCwyMjksMCwxMDAsNCwwLDEyNSwyLDAsMTEwLDEyLDAsMTE2LDYsCisgICAgMCwxMDYsMTEsMCwxMDYsMTIsMCwxMjUsMiwwLDExNiwxMywwLDEyNCwyLDAsCisgICAgMTMxLDEsMCwxMjUsMiwwLDEyNCwyLDAsMTAwLDQsMCwxMDcsMywwLDExNCwKKyAgICA2MywxLDEyNCwyLDAsMTA2LDE0LDAsMTMxLDAsMCwxMTUsNDIsMSwxMTYsMTUsCisgICAgMCwxMDAsOSwwLDEwNiwxNiwwLDEyNCwyLDAsMTMxLDEsMCwxMzEsMSwwLAorICAgIDEzMCwxLDAsMTAwLDEwLDAsMTA2LDE2LDAsMTI0LDEwLDAsMTE2LDE3LDAsMTI0LAorICAgIDIsMCwxMzEsMywwLDEyNSwxMCwwLDExNiwxOCwwLDEyNCw0LDAsMTE2LDE5LAorICAgIDAsMTI0LDEwLDAsMTE2LDIwLDAsMTAwLDgsMCwyNSwyMywxMzEsMywwLDgzLAorICAgIDQxLDExLDk3LDI1NCwyLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsOTksCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsCisgICAgMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksCisgICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LAorICAgIDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDk3LDExNSwKKyAgICAzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLAorICAgIDMyLDExOSwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsCisgICAgMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwKKyAgICAxMTQsMzIsOTksMTExLDExMCwxMTYsMTE0LDExMSwxMDgsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwKKyAgICAxMTQsMTAxLDExNSwxMTcsMTA5LDEwMSwxMDAsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDExMSwxMDIsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDQ2LDMyLDczLDEwMiwzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsCisgICAgOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLAorICAgIDExMCwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMzIsMTE0LAorICAgIDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsCisgICAgMTE2LDMyLDEwNSwxMTUsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDMyLDk3LDExMCwxMDAsMzIsMTE4LAorICAgIDEwMSwxMTQsMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiw5NywxMDgsCisgICAgMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiw0MCwxMDEsMTA4LDExNSwxMDEsCisgICAgMzIsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLAorICAgIDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw4NCwxMDQsMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LAorICAgIDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LAorICAgIDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsNzMsMTAyLDMyLAorICAgIDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDEwNSwKKyAgICAxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsNDQsMTAsMzIsMzIsMzIsMzIsCisgICAgOTcsMzIsODQsMTE0LDExNywxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTE1LDk3LDEwOSwxMDEsMzIsOTcsMTE1LDMyLDExNSwxMDEsMTE2LDExNiwKKyAgICAxMDUsMTEwLDEwMywzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsCisgICAgMTEwLDM5LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAxLDEwOSwxMTIsMTE2LDEyMSwzMiwKKyAgICAxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLAorICAgIDMyLDk3LDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDExOCw5NywxMDgsMTE3LDEwMSwzMiwxMDUsCisgICAgMTE1LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LDMyLDExNiwxMTEsMzIsCisgICAgMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwzOSw0OSwzOSw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwKKyAgICAxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsCisgICAgMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwKKyAgICAzMiw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw3MCwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLDk4LDExNywKKyAgICAxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwKKyAgICAxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwKKyAgICAxMDEsMTAwLDU5LDMyLDExNywxMTUsMTAxLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwKKyAgICA5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsMTIyLDUwLAorICAgIDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMSwKKyAgICAxMTQsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDksCisgICAgMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsNzgsMTExLAorICAgIDExMCwxMDEsMTE0LDMwLDAsMCwwLDExNCwyOSwwLDAsMCwyMTgsMSw0NiwxMjIsCisgICAgMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LAogICAgIDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LAotICAgIDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwKLSAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LAotICAgIDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LAotICAgIDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywKLSAgICAxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwKLSAgICAxMTUsMzIsNzgsMTExLDExMCwxMDEsMTIyLDM3LDEyMywxMjUsMzIsMTEwLDExMSwxMTYsMzIsOTgsCi0gICAgMTExLDExNiwxMTYsMTExLDEwOSw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwMCwxMDUsMTE0LDEwMSwKLSAgICA5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsNTgsMCwKLSAgICAwLDAsMTE0LDU2LDAsMCwwLDIzMywzLDAsMCwwLDEyMiwzMywxMDEsMTIwLAotICAgIDExMiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsMTExLDExMCwxMDgsMTIxLDMyLDUwLDMyLDExMSwxMTQsCi0gICAgMzIsNTEsMzIsMTAwLDExMSwxMTYsMTE1LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTIyLAotICAgIDU3LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksCi0gICAgMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTUsMTE2LDk3LDExNCwxMTYsCi0gICAgMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDEyMywzMywxMTQsMTI1LDEyMiw1MiwxMTEsMTEyLDExNiwxMDUsCi0gICAgMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTIzLAotICAgIDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTAsMzIsOTcsMTA4LAotICAgIDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE4LDk3LDEwOCwxMTcsMTAxLAotICAgIDExNCw1OSwwLDAsMCw2MiwyLDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsCi0gICAgODAsMCwwLDAsMjMzLDI1NCwyNTUsMjU1LDI1NSw0MSwxNywxMTQsNywwLDAsMCwKLSAgICAxMTQsNjQsMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsCi0gICAgMzgsMCwwLDAsMTE0LDczLDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsNDcsCi0gICAgMCwwLDAsMjE4LDUsOTksMTExLDExNywxMTAsMTE2LDExNCwzNCwwLDAsMCwxMTQsCi0gICAgOSwwLDAsMCwxMTQsNzIsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCw3MCwKLSAgICAwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyOCwKLSAgICAwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksOTUsODMsODUsNzAsNzAsCi0gICAgNzMsODgsNjksODMsNDEsOCwxMTQsMzUsMCwwLDAsMTE0LDc2LDAsMCwwLAotICAgIDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTAsOSwxMDAsMTExLDExNiwKLSAgICA5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDU3LDAsMCwwLDkwLDksMTExLDExMiwxMTYsCi0gICAgOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsMTAxLDk1LDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDIsMTE0LDExMSwKLSAgICAxMDksOTUsOTksOTcsOTksMTA0LDEwMSwzMSwxLDAsMCwxMTUsNDQsMCwwLDAsCi0gICAgMCw5LDE4LDEsMTIsMSwxOCwxLDE4LDEsMTIsMSw5LDEsMTUsMSwKLSAgICAxNSwxLDEyLDEsOSwxLDE1LDEsMTIsMSwyMiwxLDE1LDEsOSwxLAotICAgIDEyLDEsMjIsMSwxMiwxLDksMSwxMiwxLDE5LDEsMTE0LDg1LDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDEyLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxNjQsMCwwLDAsMTE2LDAsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyMiwwLDEwMCwyLDAsCi0gICAgODMsMTI0LDAsMCwxMDYsMSwwLDEwMCwzLDAsMTMxLDEsMCw5MiwzLDAsCi0gICAgMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsMCwxMiwxMTUsODEsMCwKLSAgICAxMjQsMywwLDEwNiwyLDAsMTMxLDAsMCwxMDAsNywwLDEwMCw4LDAsMTMzLAotICAgIDIsMCwyNSwxMDAsNiwwLDEwNywzLDAsMTE0LDg1LDAsMTI0LDAsMCw4MywKLSAgICAxMjEsMTYsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwxMjUsNCwwLDg3LAotICAgIDExMCw0MCwwLDQsMTE2LDQsMCwxMTYsNSwwLDEwMiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0MywwLDEsMSwxLDEyNCwwLDAsMTAwLDIsMCwxMDAsOSwwLDEzMywKLSAgICAyLDAsMjUsMTI1LDQsMCw4OSwxMTAsMSwwLDg4LDExNiw2LDAsMTI0LDQsCi0gICAgMCwxMzEsMSwwLDExNCwxNjAsMCwxMjQsNCwwLDgzLDEyNCwwLDAsODMsNDEsCi0gICAgMTAsMTIyLDE4OCw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsCi0gICAgMTE2LDExMSwzMiw5NywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDQwLDEwNSwxMDIsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDQxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsCi0gICAgMTExLDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDExNSwzMiwxMTIsMTE3LDExNCwxMDEsMTA4LDEyMSwKLSAgICAzMiwxMDIsMTExLDExNCwzMiw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsMTE1LDQ1LDk5LAotICAgIDExMSwxMDksMTEyLDk3LDExNiwxMDUsOTgsMTA1LDEwOCwxMDUsMTE2LDEyMSwzMiwxMDIsMTExLDExNCwKLSAgICAxMCwzMiwzMiwzMiwzMiw4MCwxMjEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw2OSwxMjAsCi0gICAgMTAxLDk5LDY3LDExMSwxMDAsMTAxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODcsMTA1LDExNiwxMDQsCi0gICAgNzAsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDQwLDQxLDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsNjcsMzIsNjUsODAsNzMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LAotICAgIDU5LDAsMCwwLDc4LDExNCw1OCwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LAotICAgIDI5LDAsMCwwLDkwLDIsMTEyLDEyMSwyMzMsMjUzLDI1NSwyNTUsMjU1LDIzMywyNTUsMjU1LAotICAgIDI1NSwyNTUsMTE0LDg3LDAsMCwwLDQxLDcsMTE0LDMxLDAsMCwwLDExNCwzMiwKLSAgICAwLDAsMCwyMTgsNSwxMDgsMTExLDExOSwxMDEsMTE0LDExNCw4NSwwLDAsMCwxMTQsCi0gICAgNjYsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCw0NCwwLDAsMCw0MSw1LAotICAgIDIxOCwxMyw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsCi0gICAgNzgsMCwwLDAsMTE0LDM2LDAsMCwwLDkwLDksMTAxLDEyMCwxMTYsMTAxLDExMCwKLSAgICAxMTUsMTA1LDExMSwxMTAsMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTEyLDk3LDExNiwKLSAgICAxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDE1LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDY0LDEsMCwwLDExNSwyMCwwLDAsMCwwLDcsMTgsMSw0LDEsCi0gICAgMjQsMSwzNSwxLDQsMSwzLDEsMTYsMSwxOSwxLDIxLDEsMTE0LDkxLAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAotICAgIDExLDAsMCwwLDY3LDAsMCwwLDExNSw5MiwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTE2LDEsMCwxMTYsMiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsCi0gICAgNTksMCwxMjEsMTQsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCw4Myw4NywKLSAgICAxMTMsODgsMCw0LDExNiw0LDAsMTA3LDEwLDAsMTE0LDU1LDAsMSwxLDEsCi0gICAgODksMTEzLDg4LDAsODgsMTEwLDI5LDAsMTI0LDAsMCwxMDYsMCwwLDExNiwxLAotICAgIDAsMTE2LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDg0LDAsMTI0LDAsMCwKLSAgICA4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMSw3OCw0MSw2LDIxOCw4LAotICAgIDEwMSwxMTAsMTAwLDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTE2LDExNywxMTIsMTA4LDEwMSwxMTQsCi0gICAgODQsMCwwLDAsMTE0LDc5LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsNzQsCi0gICAgMCwwLDAsNDEsMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLAotICAgIDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDgzLDEsMCwwLDExNSwKLSAgICAxNiwwLDAsMCwwLDEsMjEsMSwzLDEsMTQsMSwxMywxLDgsMSwKLSAgICAyMSwxLDQsMiwxMTQsOTUsMCwwLDAsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDYwLAotICAgIDAsMCwwLDEyMSwxOSwwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLDEwNiwKLSAgICAxLDAsMTI1LDEsMCw4NywxMTAsMjQsMCw0LDExNiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDQ1LDAsMSwxLDEsMTAwLDEsMCwxMjUsMSwwLDg5LDExMCwxLDAsCi0gICAgODgsMTI0LDEsMCwxMDAsMiwwLDc5LDEyNSwxLDAsMTI0LDEsMCw4Myw0MSwKLSAgICAzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsCi0gICAgMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLAotICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsMCwwLDIzMywxMjgsMCwwLDAsCi0gICAgNDEsMywxMTQsMzksMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MCwwLDAsCi0gICAgMCw0MSwyLDExNCwzNSwwLDAsMCwxMTQsNDIsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDk5LAotICAgIDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsOTUsMSwwLDAsMTE1LDEyLDAsMCwKLSAgICAwLDAsMiwzLDEsMTksMSwxMywxLDExLDMsMTAsMSwxMTQsOTcsMCwKLSAgICAwLDAsMjE4LDksMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDUsMTE2LDEyMSwxMTQsMjksMCwKLSAgICAwLDAsOTksMSwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNCwKLSAgICAwLDAsMCw3MSwwLDAsMCwxMTUsNzUsMCwwLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEwNiwyLDAsMTI0LDEsMCwxMDcsNSwwLDExNCw3MSwwLDEyNCwwLAotICAgIDAsMTA2LDMsMCwxMDAsNiwwLDEzMSwxLDAsMTE1LDQzLDAsMTAwLDMsMCwKLSAgICAxMjQsMCwwLDIzLDEyNSwwLDAsMTE2LDQsMCwxMjQsMCwwLDEwNiw1LDAsCi0gICAgMTI0LDIsMCwxNDAsMCwwLDEwMCw0LDAsMTE2LDAsMCwxMDYsNiwwLDEzMSwKLSAgICAxLDEsMSwxMDAsNSwwLDgzLDQxLDcsMTIyLDYxLDgwLDExNCwxMDUsMTEwLDExNiwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwzMiwxMTYsMTExLDMyLAotICAgIDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LDMyLDEwNSwxMDIsMzIsNDUsMTE4LDQ3LDgwLDg5LDg0LAotICAgIDcyLDc5LDc4LDg2LDY5LDgyLDY2LDc5LDgzLDY5LDMyLDEwNSwxMTUsMzIsMTE2LDExNywKLSAgICAxMTQsMTEwLDEwMSwxMDAsMzIsMTExLDExMCw0NiwyNTAsMSwzNSwyNTAsNywxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMjIsMiwzNSwzMiwxMTQsNTQsMCwwLDAsNzgsNDEsMiwKLSAgICAxMTQsOTksMCwwLDAsMTE0LDEwMCwwLDAsMCw0MSw3LDExNCw3LDAsMCwKLSAgICAwLDExNCw2NywwLDAsMCwyMTgsNywxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSwxMTQsCi0gICAgOSwwLDAsMCwyMTgsNSwxMTIsMTE0LDEwNSwxMTAsMTE2LDExNCw0NywwLDAsMCwKLSAgICAyMTgsNiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCw0MSwzLDExNCw3NSwwLDAsMCwxMTQsCi0gICAgOTgsMCwwLDAsMjE4LDQsOTcsMTE0LDEwMywxMTUsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDExOCwxMDEsMTE0LDk4LAotICAgIDExMSwxMTUsMTAxLDk1LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDEwNywxLDAsMCwxMTUsCi0gICAgOCwwLDAsMCwwLDIsMTgsMSwxNSwxLDEwLDEsMTE0LDEwNSwwLDAsCi0gICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLAotICAgIDAsMCwzLDAsMCwwLDExNSw4NCwwLDAsMCwxMDAsMSwwLDEzNSwwLAotICAgIDAsMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDEsMCwxMjUsMSwwLAotICAgIDEyMSwxMywwLDExNiwwLDAsMTA2LDEsMCwxMjUsMiwwLDg3LDExMCwzMCwwLAotICAgIDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjYsMCwxLDEsMSwxMDAsNCwwLAotICAgIDEwMCw1LDAsMTMyLDAsMCwxMjUsMiwwLDg5LDExMCwxLDAsODgsMTI0LDIsCi0gICAgMCwxMjQsMSwwLDEzNiwwLDAsMTMxLDIsMCwxLDEyNCwxLDAsODMsNDEsCi0gICAgNiwxMjIsMjUyLDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsCi0gICAgMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEzLAotICAgIDExNywxMDEsMTE1LDExNiwxMDEsMTAwLDMyLDEwOSw5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSw5NywxMTAsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMiwxMDUsMTE0LDExNSwxMTYsCi0gICAgMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDQwLDExNSwxMDEsMTA4LDEwMiw0MSwKLSAgICAzMiwxMDksMTE3LDExNSwxMTYsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTksCi0gICAgMTExLDExMCwxMDAsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMTAsCi0gICAgMzIsMzIsMzIsMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsOTcsMTAzLDk3LAotICAgIDEwNSwxMTAsMTE1LDExNiw0NiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDEwOSwKLSAgICAxMTIsOTcsMTE0LDEwNSwxMTUsMTExLDExMCwzMiwxMDIsOTcsMTA1LDEwOCwxMTUsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTEwLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwKLSAgICAxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsMCwKLSAgICAwLDMxLDAsMCwwLDExNSw4OSwwLDAsMCwxMjQsMSwwLDEwMCwwLDAsCi0gICAgMTA3LDgsMCwxMTQsMjQsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMTAsCi0gICAgNDYsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDcsMywwLDExNCw3MCwKLSAgICAwLDExNiwxLDAsMTAwLDEsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwKLSAgICAxMDIsMiwwLDIyLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsCi0gICAgMTM2LDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywwLDE0MiwKLSAgICAyLDAsODMsNDEsMyw3OCwxMjIsMzAsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsCi0gICAgMTExLDExNCwzMiwzNywxMTUsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTAsCi0gICAgMTAwLDEwOCwxMDEsMzIsMzcsMTE1LDIxOCw0LDExMCw5NywxMDksMTAxLDQxLDIsMTE0LDEwNiwKLSAgICAwLDAsMCwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgNDEsNCwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDEwNiwwLDAsMCwxMTQsMTA0LDAsCi0gICAgMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSw0MSwxLDIxOCw2LDEwOSwxMDEsCisgICAgMzIsNzgsMTExLDExMCwxMDEsMjMzLDAsMCwwLDAsMTIyLDI0LDEyMywzMywxMTQsMTI1LAorICAgIDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTA4LDExMiwxMDQsOTcsMTEwLDExNywxMDksCisgICAgMTAxLDExNCwxMDUsOTksMTIyLDcsMTIzLDEyNSw0NiwxMjMsMTI1LDEyMywxMjUsNDEsMjEsMjE4LAorICAgIDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDIxOCw0LDExOSw5NywxMTQsMTEwLAorICAgIDIxOCwxOCw2OCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDg3LDk3LDExNCwKKyAgICAxMTAsMTA1LDExMCwxMDMsMjE4LDksODQsMTIxLDExMiwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwKKyAgICAzOCwwLDAsMCwxMTQsMzIsMCwwLDAsMTE0LDcsMCwwLDAsMjE4LDE0LAorICAgIDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwyMTgsOSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMjE4LDE5LDc4LDExMSwxMTYsNzMsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMjYsCisgICAgMCwwLDAsMjE4LDUsMTAyLDEwOCw5NywxMDMsMTE1LDIxOCw4LDExMSwxMTIsMTE2LDEwNSwKKyAgICAxMDksMTA1LDEyMiwxMDEsMjE4LDMsMTE1LDExNiwxMTQsMjE4LDcsMTA1LDExNSw5NywxMDgsMTEwLAorICAgIDExNywxMDksMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNDcsCisgICAgMCwwLDAsMjE4LDQsOTUsNzksODAsODQsMTE0LDI4LDAsMCwwLDIxOCw4LAorICAgIDk1LDgwLDg5LDY3LDY1LDY3LDcyLDY5LDIxOCwxNyw2Niw4OSw4NCw2OSw2Nyw3OSwKKyAgICA2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwxMSwxMTQsMzUsMCwKKyAgICAwLDAsOTAsMTQsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LAorICAgIDEwMCwxMDEsMTE0LDU3LDAsMCwwLDIxOCw3LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLAorICAgIDIxOCw0LDEwNCwxMDEsOTcsMTAwLDExNCwzNywwLDAsMCw5MCw0LDk4LDk3LDExNSwKKyAgICAxMDEsMjE4LDMsMTE1LDEwMSwxMTIsMjE4LDQsMTE0LDEwMSwxMTUsMTE2LDkwLDMsMTE2LDk3LAorICAgIDEwMyw5MCwxNSw5NywxMDgsMTA5LDExMSwxMTUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCisgICAgMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCisgICAgMCwyMTgsMTcsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTE1LDExMSwKKyAgICAxMTcsMTE0LDk5LDEwMSwyNDUsMCwwLDAsMTE1LDQ2LDAsMCwwLDAsMTgsMTIsCisgICAgMSw5LDEsNywxLDEyLDEsNiwxLDEyLDEsMTgsMSwxOCwxLDI0LAorICAgIDEsMTIsMSwxMiwxLDEyLDEsMzYsMSwxMiwxLDE4LDEsOSwyLDEyLAorICAgIDEsMTIsMSwxMiwxLDEyLDEsMjEsMSwyMSwxLDExNCw3OSwwLDAsMCwKKyAgICA5OSwxLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCw1LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSw2MiwxLDAsMCwxMTYsMCwwLDEwNiwxLDAsCisgICAgMTA2LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDMwLDAsMTE2LDMsMCwxMDAsCisgICAgMiwwLDEzMSwxLDAsMTMwLDEsMCwxMTYsNCwwLDEyNCwwLDAsMTMxLDEsCisgICAgMCw5MiwyLDAsMTI1LDEsMCwxMjUsMiwwLDExNiw0LDAsMTI0LDEsMCwKKyAgICAxMzEsMSwwLDkyLDIsMCwxMjUsMSwwLDEyNSwzLDAsMTI0LDMsMCwxMTYsCisgICAgNSwwLDEwNywzLDAsMTE0LDEwMiwwLDExNiw2LDAsMTAwLDMsMCwxMDYsNywKKyAgICAwLDExNiw1LDAsMTI0LDAsMCwxMzEsMiwwLDEzMSwxLDAsMTMwLDEsMCwKKyAgICAxMjQsMiwwLDEwNiw4LDAsMTAwLDQsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LAorICAgIDQsMCwxMDAsMTEsMCwxMDcsNywwLDExNCwxNTMsMCwxMTYsNiwwLDEwMCw3LAorICAgIDAsMTA2LDcsMCwxMjQsMiwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLAorICAgIDExMCwxMjUsMCwxMjQsNCwwLDEwMCw2LDAsMTA3LDIsMCwxMTQsMjIsMSwxMjQsCisgICAgMiwwLDEwNiw5LDAsMTAwLDQsMCwxMDAsNSwwLDEzMSwyLDAsMTAwLDEyLAorICAgIDAsMjUsMTI1LDUsMCwxMjQsNSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLAorICAgIDAsMTE1LDIyMywwLDExNiw2LDAsMTAwLDgsMCwxMDYsNywwLDExNiwxMSwwLAorICAgIDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCw1LDAsMTE2LDEyLDAsMTE2LAorICAgIDExLDAsMTMxLDEsMCwxMDAsMSwwLDEzMywyLDAsMjUsMTI1LDYsMCwxMjQsCisgICAgNiwwLDEwNiwxMywwLDEzMSwwLDAsMTE1LDIyLDEsMTE2LDYsMCwxMDAsOSwKKyAgICAwLDEwNiw3LDAsMTI0LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwKKyAgICAxMjQsMiwwLDEwNiwxNCwwLDEwMCw0LDAsMTMxLDEsMCwxMDAsMTAsMCwyNSwKKyAgICAxMjUsNywwLDExNiwxNSwwLDEyNCwxLDAsMTI0LDcsMCwxMTYsMTYsMCwxMDAsCisgICAgMTAsMCwyNSwyMywxMzEsMiwwLDgzLDQxLDEzLDk3LDExMCwxLDAsMCw3MSwKKyAgICAxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwKKyAgICAzMiw5NywzMiw0NiwxMTIsMTIxLDk5LDQ2LDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsCisgICAgMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsCisgICAgMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwKKyAgICAzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLAorICAgIDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwKKyAgICAxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTksMTExLDExNCwxMTQsMTAxLDExNSwKKyAgICAxMTIsMTExLDExMCwxMDAsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDk5LAorICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiwzMiw3MywxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsCisgICAgMTAwLDExMSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMCwxMTEsMTE2LDMyLDk5LDExMSwxMTAsCisgICAgMTAyLDExMSwxMTQsMTA5LDMyLDExNiwxMTEsMzIsODAsNjksODAsMzIsNTEsNDksNTIsNTUsCisgICAgNDcsNTIsNTYsNTYsMzIsMTAyLDExMSwxMTQsMTA5LDk3LDExNiw0NCwzMiw4Niw5NywxMDgsCisgICAgMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk4LDEwMSwzMiwKKyAgICAxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDMyLDczLDEwMiwxMCwzMiwzMiwzMiwzMiwxMTUsCisgICAgMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwKKyAgICAxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsCisgICAgMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsCisgICAgMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLAorICAgIDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDM2LAorICAgIDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsCisgICAgMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiwKKyAgICA3OCwxMTEsMTEwLDEwMSwxMjIsMzcsMTIzLDEyNSwzMiwxMTAsMTExLDExNiwzMiw5OCwxMTEsMTE2LAorICAgIDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwKKyAgICAxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDExNCw1OCwwLDAsMCwKKyAgICAxMTQsNTYsMCwwLDAsMjMzLDMsMCwwLDAsMTIyLDMzLDEwMSwxMjAsMTEyLDEwMSwKKyAgICA5OSwxMTYsMTAxLDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsNTAsMzIsMTExLDExNCwzMiw1MSwKKyAgICAzMiwxMDAsMTExLDExNiwxMTUsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNTcsMTExLAorICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTIsMTExLDExNCwxMTYsCisgICAgMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsCisgICAgMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMTYsOTcsMTE0LDExNiwzMiwxMTksCisgICAgMTA1LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDUyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LAorICAgIDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMjMsMzMsMTE0LAorICAgIDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDExMCwzMiw5NywxMDgsMTEyLDEwNCwKKyAgICA5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMTE0LDU5LAorICAgIDAsMCwwLDYyLDIsMCwwLDAsMTE0LDU2LDAsMCwwLDExNCw4MCwwLAorICAgIDAsMCwyMzMsMjU0LDI1NSwyNTUsMjU1LDQxLDE3LDExNCw3LDAsMCwwLDExNCw2NCwKKyAgICAwLDAsMCwxMTQsNjUsMCwwLDAsMTE0LDY2LDAsMCwwLDExNCwzOCwwLAorICAgIDAsMCwxMTQsNzMsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCw0NywwLDAsCisgICAgMCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDM0LDAsMCwwLDExNCw5LDAsCisgICAgMCwwLDExNCw3MiwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDcwLDAsMCwKKyAgICAwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI4LDAsMCwKKyAgICAwLDIxOCwxNSw4Myw3OSw4NSw4Miw2Nyw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCwKKyAgICA2OSw4Myw0MSw4LDExNCwzNSwwLDAsMCwxMTQsNzYsMCwwLDAsOTAsMTYsCisgICAgMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwKKyAgICA5MCw3LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5MCw5LDEwMCwxMTEsMTE2LDk1LDk5LAorICAgIDExMSwxMTcsMTEwLDExNiwxMTQsNTcsMCwwLDAsOTAsOSwxMTEsMTEyLDExNiw5NSwxMDgsCisgICAgMTAxLDExOCwxMDEsMTA4LDkwLDEzLDk4LDk3LDExNSwxMDEsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCwKKyAgICA5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCisgICAgMCwwLDIxOCwxNywxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDMzLDEsMCwwLDExNSw0NCwwLDAsMCwwLDksCisgICAgMTgsMSwxMiwxLDE4LDEsMTgsMSwxMiwxLDksMSwxNSwxLDE1LDEsCisgICAgMTIsMSw5LDEsMTUsMSwxMiwxLDIyLDEsMTUsMSw5LDEsMTIsMSwKKyAgICAyMiwxLDEyLDEsOSwxLDEyLDEsMTksMSwxMTQsODUsMCwwLDAsOTksCisgICAgMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMTIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDE2NCwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLAorICAgIDEsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDIyLDAsMTAwLDIsMCw4MywxMjQsCisgICAgMCwwLDEwNiwxLDAsMTAwLDMsMCwxMzEsMSwwLDkyLDMsMCwxMjUsMSwKKyAgICAwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwwLDEyLDExNSw4MSwwLDEyNCwzLAorICAgIDAsMTA2LDIsMCwxMzEsMCwwLDEwMCw3LDAsMTAwLDgsMCwxMzMsMiwwLAorICAgIDI1LDEwMCw2LDAsMTA3LDMsMCwxMTQsODUsMCwxMjQsMCwwLDgzLDEyMSwxNiwKKyAgICAwLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsODcsMTEwLDQwLAorICAgIDAsNCwxMTYsNCwwLDExNiw1LDAsMTAyLDIsMCwxMDcsMTAsMCwxMTQsMTQzLAorICAgIDAsMSwxLDEsMTI0LDAsMCwxMDAsMiwwLDEwMCw5LDAsMTMzLDIsMCwKKyAgICAyNSwxMjUsNCwwLDg5LDExMCwxLDAsODgsMTE2LDYsMCwxMjQsNCwwLDEzMSwKKyAgICAxLDAsMTE0LDE2MCwwLDEyNCw0LDAsODMsMTI0LDAsMCw4Myw0MSwxMCwxMjIsCisgICAgMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsCisgICAgMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsNDEsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLAorICAgIDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsMTE0LDEwMSwxMDgsMTIxLDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCwxMTUsNDUsOTksMTExLDEwOSwKKyAgICAxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLDMyLDEwMiwxMTEsMTE0LDEwLDMyLAorICAgIDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDk1LDY5LDEyMCwxMDEsOTksCisgICAgNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4NywxMDUsMTE2LDEwNCw3MCwxMDUsCisgICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsNTksMCwKKyAgICAwLDAsNzgsMTE0LDU4LDAsMCwwLDExNCw4MCwwLDAsMCwxMTQsMjksMCwKKyAgICAwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwyNTUsMjMzLDI1NSwyNTUsMjU1LDI1NSwKKyAgICAxMTQsODcsMCwwLDAsNDEsNywxMTQsMzEsMCwwLDAsMTE0LDMyLDAsMCwKKyAgICAwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg1LDAsMCwwLDExNCw2NiwwLAorICAgIDAsMCwxMTQsNzEsMCwwLDAsMTE0LDQ0LDAsMCwwLDQxLDUsMjE4LDEzLAorICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCw3OCwwLAorICAgIDAsMCwxMTQsMzYsMCwwLDAsOTAsOSwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCisgICAgMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTUsCisgICAgOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMDIsMTA1LDEwOCwxMDEsNjYsCisgICAgMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywxOCwxLDQsMSwyNCwxLAorICAgIDM1LDEsNCwxLDMsMSwxNiwxLDE5LDEsMjEsMSwxMTQsOTEsMCwwLAorICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMTEsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDkyLDAsMCwwLDEyNCwwLDAsMTA2LDAsCisgICAgMCwxMTYsMSwwLDExNiwyLDAsMTMxLDEsMCwxMzEsMSwwLDExNCw1OSwwLAorICAgIDEyMSwxNCwwLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDgzLDg3LDExMyw4OCwKKyAgICAwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsNTUsMCwxLDEsMSw4OSwxMTMsCisgICAgODgsMCw4OCwxMTAsMjksMCwxMjQsMCwwLDEwNiwwLDAsMTE2LDEsMCwxMTYsCisgICAgNSwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsODQsMCwxMjQsMCwwLDgzLDEwMCwKKyAgICAwLDAsODMsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDgsMTAxLDExMCwKKyAgICAxMDAsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNCw4NCwwLAorICAgIDAsMCwxMTQsNzksMCwwLDAsMTE0LDY2LDAsMCwwLDExNCw3NCwwLDAsCisgICAgMCw0MSwxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsMTAzLAorICAgIDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsODUsMSwwLDAsMTE1LDE2LDAsCisgICAgMCwwLDAsMSwyMSwxLDMsMSwxNCwxLDEzLDEsOCwxLDIxLDEsCisgICAgNCwyLDExNCw5NSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNjAsMCwwLAorICAgIDAsMTIxLDE5LDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMTA2LDEsMCwKKyAgICAxMjUsMSwwLDg3LDExMCwyNCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNDUsCisgICAgMCwxLDEsMSwxMDAsMSwwLDEyNSwxLDAsODksMTEwLDEsMCw4OCwxMjQsCisgICAgMSwwLDEwMCwyLDAsNzksMTI1LDEsMCwxMjQsMSwwLDgzLDQxLDMsMTIyLAorICAgIDUxLDY3LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTAxLDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTExLDExMCwxMTUsMzIsCisgICAgMTAyLDExMSwxMTQsMzIsOTcsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDQ2LDEwNSwxODIsMSwwLDAsMjMzLDEyOCwwLDAsMCw0MSwzLAorICAgIDExNCwzOSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQwLDAsMCwwLDQxLAorICAgIDIsMTE0LDM1LDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTAsOTUsOTksOTcsMTA4LAorICAgIDk5LDk1LDEwOSwxMTEsMTAwLDEwMSw5NywxLDAsMCwxMTUsMTIsMCwwLDAsMCwKKyAgICAyLDMsMSwxOSwxLDEzLDEsMTEsMywxMCwxLDExNCw5NywwLDAsMCwKKyAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLDAsCisgICAgMCwzLDAsMCwwLDExNSw4NCwwLDAsMCwxMDAsMSwwLDEzNSwwLDAsCisgICAgMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDEsMCwxMjUsMSwwLDEyMSwKKyAgICAxMywwLDExNiwwLDAsMTA2LDEsMCwxMjUsMiwwLDg3LDExMCwzMCwwLDQsCisgICAgMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjYsMCwxLDEsMSwxMDAsNCwwLDEwMCwKKyAgICA1LDAsMTMyLDAsMCwxMjUsMiwwLDg5LDExMCwxLDAsODgsMTI0LDIsMCwKKyAgICAxMjQsMSwwLDEzNiwwLDAsMTMxLDIsMCwxLDEyNCwxLDAsODMsNDEsNiwKKyAgICAxMjIsMjUyLDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsMTE4LAorICAgIDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEzLDExNywKKyAgICAxMDEsMTE1LDExNiwxMDEsMTAwLDMyLDEwOSw5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA4LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCwzMiw5OSw5NywxMTAsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMiwxMDUsMTE0LDExNSwxMTYsMzIsCisgICAgOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDQwLDExNSwxMDEsMTA4LDEwMiw0MSwzMiwKKyAgICAxMDksMTE3LDExNSwxMTYsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTUsMTEwLDk3LDEwOSwKKyAgICAxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTksMTExLAorICAgIDExMCwxMDAsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMTAsMzIsCisgICAgMzIsMzIsMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsOTcsMTAzLDk3LDEwNSwKKyAgICAxMTAsMTE1LDExNiw0NiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDEwOSwxMTIsCisgICAgOTcsMTE0LDEwNSwxMTUsMTExLDExMCwzMiwxMDIsOTcsMTA1LDEwOCwxMTUsMzIsMTE2LDEwNCwxMDEsCisgICAgMTEwLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsCisgICAgMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsMCwwLAorICAgIDMxLDAsMCwwLDExNSw4OSwwLDAsMCwxMjQsMSwwLDEwMCwwLDAsMTA3LAorICAgIDgsMCwxMTQsMjQsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMTAsNDYsCisgICAgMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDcsMywwLDExNCw3MCwwLAorICAgIDExNiwxLDAsMTAwLDEsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDIsCisgICAgMiwwLDIyLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LAorICAgIDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywwLDE0MiwyLAorICAgIDAsODMsNDEsMyw3OCwxMjIsMzAsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsMTExLAorICAgIDExNCwzMiwzNywxMTUsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTAsMTAwLAorICAgIDEwOCwxMDEsMzIsMzcsMTE1LDIxOCw0LDExMCw5NywxMDksMTAxLDQxLDIsMTE0LDk4LDAsCisgICAgMCwwLDIxOCwxMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCw0MSwKKyAgICA0LDIxOCw0LDExNSwxMDEsMTA4LDEwMiwxMTQsOTgsMCwwLDAsMjE4LDQsOTcsMTE0LAorICAgIDEwMywxMTUsOTAsNiwxMDcsMTE5LDk3LDExNCwxMDMsMTE1LDQxLDEsMjE4LDYsMTA5LDEwMSwKICAgICAxMTYsMTA0LDExMSwxMDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE5LAogICAgIDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwxMTQsOTcsMTEyLAotICAgIDExMiwxMDEsMTE0LDEyMywxLDAsMCwxMTUsMTIsMCwwLDAsMCwxLDEyLDEsCisgICAgMTEyLDEwMSwxMTQsMTE3LDEsMCwwLDExNSwxMiwwLDAsMCwwLDEsMTIsMSwKICAgICAxMiwxLDE1LDEsNiwxLDI1LDEsMTIyLDQwLDk1LDk5LDEwNCwxMDEsOTksMTA3LAogICAgIDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwKICAgICA5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw5NSwxMTksMTE0LDk3LDExMiwxMTIsCkBAIC01OTUsMTcgKzU3MywxNyBAQAogICAgIDExNiw5NywxMTYsMTE2LDExNCwyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LDExNiw5NSw5NSwyMTgsCiAgICAgNiwxMTcsMTEyLDEwMCw5NywxMTYsMTAxLDQxLDMsOTAsMywxMTAsMTAxLDExOSw5MCwzLAogICAgIDExMSwxMDgsMTAwLDExNCw1MiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsNSw5NSwxMTksMTE0LDk3LDExMiwxMzQsMSwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDUsOTUsMTE5LDExNCw5NywxMTIsMTI4LDEsCiAgICAgMCwwLDExNSw4LDAsMCwwLDAsMSwyNSwxLDE1LDEsMjksMSwxMjIsCiAgICAgMjYsOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsNDYsNjAsMTA4LDExMSwKICAgICA5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExOSwxMTQsOTcsMTEyLDQxLDMsMjE4LDEwLDk1LAotICAgIDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTQsMTIwLDAsMCwwLDIxOCw5LAotICAgIDc4LDk3LDEwOSwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDQxLDMsMTE0LDEwOSwwLDAsMCwKLSAgICAxMTQsMTEwLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDQsMCwwLDAsNDEsCi0gICAgMSwxMTQsMTA5LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSw5OSwxMDQsCi0gICAgMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMSwwLDAsMTE1LDE0LDAsMCwKKyAgICA5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTE0LDExMywwLDAsMCwyMTgsOSwKKyAgICA3OCw5NywxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCw0MSwzLDExNCwxMDIsMCwwLDAsCisgICAgMTE0LDEwMywwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCw0LDAsMCwwLDQxLAorICAgIDEsMTE0LDEwMiwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsOTksMTA0LAorICAgIDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsMTA5LDEsMCwwLDExNSwxNCwwLDAsCiAgICAgMCwwLDgsMjEsNywzLDEsMTMsMSwxMywyLDE3LDUsMTMsMSwxMTQsCi0gICAgMTIzLDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwKKyAgICAxMTYsMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLAogICAgIDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODQsMCwwLDAsMTI0LDAsCiAgICAgMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDIsMCwKICAgICAxMjUsMywwLDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCw4MCwwLDExNiwKQEAgLTYyOCwxNCArNjA2LDE0IEBACiAgICAgMTE0LDU5LDAsMCwwLDQxLDYsMjE4LDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLAogICAgIDk3LDEwMCwxMDEsMTE0LDExNCwzMSwwLDAsMCwxMTQsNjAsMCwwLDAsMTE0LDYxLAogICAgIDAsMCwwLDExNCw0NywwLDAsMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICA4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDQxLDUsMTE0LDEwOCwwLDAsMCwyMTgsOCwKKyAgICA4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDQxLDUsMTE0LDEwMCwwLDAsMCwyMTgsOCwKICAgICAxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMjE4LDYsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKICAgICAyMTgsOCwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDIxOCwzLDEwOSwxMTUsMTAzLDExNCwKICAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNywKICAgICA5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsCi0gICAgMTA5LDE0MywxLDAsMCwxMTUsMTAsMCwwLDAsMCwxMCwyMSwxLDI0LDEsCi0gICAgNiwxLDI5LDEsMTE0LDEzMCwwLDAsMCw5OSw0LDAsMCwwLDAsMCwKLSAgICAwLDAsMTEsMCwwLDAsMTksMCwwLDAsNjcsMCwwLDAsMTE1LDI0MCwKKyAgICAxMDksMTM3LDEsMCwwLDExNSwxMCwwLDAsMCwwLDEwLDIxLDEsMjQsMSwKKyAgICA2LDEsMjksMSwxMTQsMTIzLDAsMCwwLDk5LDQsMCwwLDAsMCwwLAorICAgIDAsMCwxMSwwLDAsMCwxOSwwLDAsMCw2NywwLDAsMCwxMTUsMjUyLAogICAgIDEsMCwwLDEwNSwwLDAsMTI1LDQsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LAogICAgIDksMCwxMTQsMzEsMCwxMjQsMiwwLDEyNCw0LDAsMTAwLDIsMCw2MCwxMTAsCiAgICAgNiwwLDEwMCwzLDAsMTI1LDIsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDksCkBAIC02NDMsMTk1NSArNjIxLDE5NzIgQEAKICAgICAwLDEwMCwxLDAsMTAwLDUsMCwxMzMsMiwwLDI1LDEyNSw1LDAsMTI0LDAsCiAgICAgMCwxMDAsNSwwLDEwMCw2LDAsMTMzLDIsMCwyNSwxMjUsNiwwLDEyNCwwLAogICAgIDAsMTAwLDYsMCwxMDAsNywwLDEzMywyLDAsMjUsMTI1LDcsMCwxMjQsNSwKLSAgICAwLDExNiwwLDAsMTA3LDMsMCwxMTQsMTY4LDAsMTAwLDgsMCwxMDYsMSwwLAotICAgIDEyNCwyLDAsMTI0LDUsMCwxMzEsMiwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsCi0gICAgOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiwzLDAsMTI0LDgsMCwxMjQsCi0gICAgNCwwLDE0MSwxLDAsMTMwLDEsMCwxMTAsMTE5LDAsMTE2LDQsMCwxMjQsNiwKLSAgICAwLDEzMSwxLDAsMTAwLDUsMCwxMDcsMywwLDExNCwyMjksMCwxMDAsMTAsMCwKLSAgICAxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLDExNiwyLDAsMTAwLAotICAgIDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsNSwwLDEyNCw4LDAsMTMxLAotICAgIDEsMCwxMzAsMSwwLDExMCw1OCwwLDExNiw0LDAsMTI0LDcsMCwxMzEsMSwKLSAgICAwLDEwMCw1LDAsMTA3LDMsMCwxMTQsMzEsMSwxMDAsMTEsMCwxMDYsMSwwLAotICAgIDEyNCwyLDAsMTMxLDEsMCwxMjUsOCwwLDExNiwyLDAsMTAwLDksMCwxMjQsCi0gICAgOCwwLDEzMSwyLDAsMSwxMTYsNSwwLDEyNCw4LDAsMTMxLDEsMCwxMzAsCi0gICAgMSwwLDEyNCwxLDAsMTAwLDEsMCwxMDcsOSwwLDExNCwyMjYsMSwxMjEsMjAsCi0gICAgMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDEyLDAsMjUsMTMxLDEsMCwxMjUsOSwKLSAgICAwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsODMsMSwxLAotICAgIDEsMSw4OSwxMTAsNjIsMCw4OCwxMTYsOCwwLDEyNCw2LDAsMTMxLDEsMCwKLSAgICAxMjQsOSwwLDEwNywzLDAsMTE0LDE0NSwxLDEwMCwxMywwLDEwNiwxLDAsMTI0LAotICAgIDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsOSwwLDEyNCw4LAotICAgIDAsMTMxLDIsMCwxLDExNiwzLDAsMTI0LDgsMCwxMjQsNCwwLDE0MSwxLAotICAgIDAsMTMwLDEsMCwxMjEsMTgsMCwxMjQsMSwwLDEwMCwxNCwwLDI1LDEwMCwxNSwKLSAgICAwLDY0LDEyNSwxMCwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTgzLDEsMSwxLDEsODksMTEwLDQzLDAsODgsMTE2LDgsMCwxMjQsNywKLSAgICAwLDEzMSwxLDAsMTI0LDEwLDAsMTA3LDMsMCwxMTQsMjI2LDEsMTE2LDMsMCwKLSAgICAxMDAsMTMsMCwxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjQsNCwwLDE0MSwKLSAgICAxLDAsMTMwLDEsMCwxMjQsMCwwLDEwMCw3LDAsMTAwLDEsMCwxMzMsMiwKLSAgICAwLDI1LDgzLDQxLDE2LDk3LDEyMiwxLDAsMCw4Niw5NywxMDgsMTA1LDEwMCw5NywKLSAgICAxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDEwMiwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE1LDExNSwxMDEsMTAwLDQ1LDEwNSwxMTAsMzIsOTgsCi0gICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsOTcsMTAzLDk3LDEwNSwxMTAsMTE1LDExNiwzMiwKLSAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMTYsOTcsMTE2LDExNSwzMiw0MCwxMDUsMTAyLAotICAgIDEwLDMyLDMyLDMyLDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsNDEsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsCi0gICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSw5NywxMTAsMzIsCi0gICAgOTgsMTAxLDMyLDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwzMiw5OCwxMjEsMzIsOTksCi0gICAgMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsCi0gICAgMTA4LDEwOCwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLAotICAgIDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDEsCi0gICAgMTEwLDEwNCw5NywxMTAsOTksMTAxLDMyLDEwMSwxMTQsMTE0LDExMSwxMTQsMzIsMTE0LDEwMSwxMTIsCi0gICAgMTExLDExNCwxMTYsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwKLSAgICAxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksOTcsMTAzLDEwNSwKLSAgICA5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTA1LDExMCw5OSwxMTEsCi0gICAgMTE0LDExNCwxMDEsOTksMTE2LDMyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwxMDIsMTExLDExNywKLSAgICAxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLDExNSwxMTYsOTcsMTA4LDEwMSw0NiwzMiwKLSAgICA2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwKLSAgICAxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsOTcsMTE2LDk3LAotICAgIDMyLDEwNSwxMTUsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMTYsMTE0LDExNywxMTAsOTksOTcsMTE2LDEwMSwxMDAsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsNzgsMTE0LDEwNiwwLDAsMCwxMjIsMTAsNjAsOTgsMTIxLDExNiwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsNjIsMTE0LDM1LDAsMCwwLDExNCwxMiwwLDAsMCwKLSAgICAyMzMsOCwwLDAsMCwyMzMsMTIsMCwwLDAsMTIyLDMwLDk4LDk3LDEwMCwzMiwKLSAgICAxMDksOTcsMTAzLDEwNSw5OSwzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDEwNSwxMTAsMzIsCi0gICAgMTIzLDMzLDExNCwxMjUsNTgsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDIsMTIzLDEyNSwxMjIsNDMsCi0gICAgMTE0LDEwMSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsCi0gICAgMTAxLDMyLDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDUsMTA5LDEwMSwxMTUsMTE2LAotICAgIDk3LDEwOSwxMTIsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNDgsMTE0LDEwMSw5NywKLSAgICA5OSwxMDQsMTAxLDEwMCwzMiw2OSw3OSw3MCwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDExNCwKLSAgICAxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwxMDUsMTIyLDEwMSwzMiwxMTEsMTAyLDMyLDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwyMTgsNSwxMDksCi0gICAgMTE2LDEwNSwxMDksMTAxLDEyMiwyNiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsCi0gICAgMTE1LDMyLDExNSwxMTYsOTcsMTA4LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMjMsMzMsMTE0LDEyNSwKLSAgICAyMTgsNCwxMTUsMTA1LDEyMiwxMDEsMTA4LDMsMCwwLDAsMjU1LDEyNywyNTUsMTI3LDMsCi0gICAgMCw0MSw5LDIxOCwxMiw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCw4NSw3Nyw2Niw2OSwKLSAgICA4MiwxMTQsNDcsMCwwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwwLAotICAgIDExNCwzMSwwLDAsMCwyMTgsOCw2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LAotICAgIDE0LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwxOSwKLSAgICAwLDAsMCw0MSwxMSwxMTQsNTMsMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsCi0gICAgMCwwLDkwLDExLDEwMSwxMjAsOTksOTUsMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsCi0gICAgNSwxMDksOTcsMTAzLDEwNSw5OSw5MCwxMywxMTQsOTcsMTE5LDk1LDExNiwxMDUsMTA5LDEwMSwKLSAgICAxMTUsMTE2LDk3LDEwOSwxMTIsOTAsOCwxMTQsOTcsMTE5LDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsCi0gICAgNzUsMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTA5LDExNiwxMDUsCi0gICAgMTA5LDEwMSwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsMTA1LDEyMiwxMDEsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDI1LAotICAgIDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsMTYwLDEsMCwwLDExNSw3NiwwLAotICAgIDAsMCwwLDExLDYsMSwxMiwxLDEzLDMsNiwxLDEyLDEsMTAsMSwKLSAgICAxNiwxLDE2LDEsMTYsMSwxMiwxLDE4LDEsMTMsMSwxOCwxLDE4LDEsCi0gICAgMTUsMSwxMywxLDE1LDEsMTgsMSwxNSwxLDEzLDEsMTIsMSwxMiwxLAotICAgIDMsMSwyMCwxLDEzLDEsNSwyLDE4LDEsMTUsMSwxMywxLDE1LDEsCi0gICAgMywxLDE4LDEsMTMsMSw1LDIsMTgsMSwxNSwxLDksMSwxMTQsMTQxLAotICAgIDAsMCwwLDk5LDQsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLAotICAgIDYsMCwwLDAsNjcsMCwwLDAsMTE1LDExMiwwLDAsMCwxMTYsMCwwLAotICAgIDEwNiwxLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSw0LDAsMTE2LDIsMCwxMjQsCi0gICAgNCwwLDExNiwzLDAsMTMxLDIsMCwxMTQsNzUsMCwxMTYsNCwwLDEwMCwxLAotICAgIDAsMTI0LDIsMCwxMzEsMiwwLDEsMTI0LDMsMCwxMDAsMiwwLDEwNyw5LAotICAgIDAsMTE0LDcxLDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTI0LDMsMCwKLSAgICAxMzEsMiwwLDEsMTI0LDQsMCw4MywxMTYsNywwLDEwMCwzLDAsMTA2LDgsCi0gICAgMCwxMjQsMiwwLDEzMSwxLDAsMTAwLDQsMCwxMjQsMSwwLDEwMCw1LDAsCi0gICAgMTI0LDIsMCwxMzEsMSwyLDEzMCwxLDAsMTAwLDIsMCw4Myw0MSw2LDEyMiwKLSAgICA2MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLAotICAgIDEwMSwzMiw5NywxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwzMiw5OCwxMjEsCi0gICAgMzIsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksCi0gICAgMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSw0NiwxMjIsMjEsOTksCi0gICAgMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKLSAgICAxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwxMTEsMTAwLDEwMSwzMiwKLSAgICAxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsMTA2LAotICAgIDAsMCwwLDExNCwzNSwwLDAsMCw0MSw5LDIxOCw3LDEwOSw5NywxMTQsMTE1LAotICAgIDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLDEwNSwxMTUsMTA1LDExMCwKLSAgICAxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsMTAxLDk1LDExNiwxMjEsCi0gICAgMTEyLDEwMSwxMTQsMTA1LDAsMCwwLDIxOCw0LDk1LDEwNSwxMDksMTEyLDkwLDE2LDk1LAotICAgIDEwMiwxMDUsMTIwLDk1LDk5LDExMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LAotICAgIDEwNywwLDAsMCwxMTQsNDcsMCwwLDAsNDEsNSwxMTQsNTMsMCwwLDAsCi0gICAgMTE0LDEwNiwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDkwLDAsMCwwLDIxOCwKLSAgICA0LDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDIxOCwxNyw5NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw5NSw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMTUsMSwwLDAsMTE1LDE2LDAsMCwwLAotICAgIDAsMiwxNSwxLDE1LDEsMTMsMSwxMiwxLDE2LDEsNCwyLDE4LDEsCi0gICAgMTE0LDE0NywwLDAsMCwxMTQsNTksMCwwLDAsOTksMywwLDAsMCwwLAotICAgIDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgNzYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLDAsMTI1LDMsMCwKLSAgICAxMjQsMywwLDEwNiwyLDAsMTE2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTMxLAotICAgIDEsMCwxLDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLDEyNCwyLDAsMTMxLAotICAgIDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsMiwwLDExNiw0LDAsMTA2LAotICAgIDUsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwzLDAsODMsCi0gICAgNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsOTcsMzIsOTksMTExLAotICAgIDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsMTE2LDExMSwzMiw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMTksMTE0LDEwNSwxMTYsCi0gICAgMTA1LDExMCwxMDMsMzIsMTExLDExNywxMTYsMzIsMTE2LDExMSwzMiw5NywzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw0NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsMTAsMzIsMzIsMzIsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ2LDQxLDYsMjE4LDksOTgsMTIxLDExNiwxMDEsOTcsMTE0LDExNCw5NywKLSAgICAxMjEsMTE0LDEzNSwwLDAsMCwyMTgsNiwxMDEsMTIwLDExNiwxMDEsMTEwLDEwMCwxMTQsMTcsCi0gICAgMCwwLDAsMTE0LDE0MiwwLDAsMCw5MCw1LDEwMCwxMTcsMTA5LDExMiwxMTUsNDEsCi0gICAgNCwxMTQsMTQ2LDAsMCwwLDExNCwxMzMsMCwwLDAsMTE0LDE0MCwwLDAsMCwKLSAgICAxMTQsNTMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDAsMTAxLDk1LDExNiwxMTEsOTUsOTgsCi0gICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjI3LDEsMCwwLDExNSwxMCwwLDAsMCwKLSAgICAwLDMsMTIsMSwxOSwxLDE5LDEsMjIsMSwxMTQsMTUwLDAsMCwwLDk5LAotICAgIDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDQsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDg5LDAsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMDgsCi0gICAgMCwwLDEyNSwxLDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMDYsMywwLDEyNSwyLDAsMTI0LDEsMCwxMDYsNCwwLDEyNCwyLDAsCi0gICAgMTMxLDEsMCwxMjUsMywwLDExNiwxLDAsMTA2LDUsMCwxMDAsMiwwLDEwMCwKLSAgICAzLDAsMTMxLDIsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LDYsMCwxMjQsMCwKLSAgICAwLDEwNiw2LDAsMTI0LDMsMCwxMDAsMSwwLDI1LDEzMSwxLDAsMTMxLDEsCi0gICAgMCw4Myw0MSw0LDEyMiwxMjEsNjgsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDk4LDEyMSwxMTYsCi0gICAgMTAxLDExNSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwKLSAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDMyLDk3LDExMCwxMDAsMzIsCi0gICAgMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwKLSAgICAxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTEwLDEwNSwxMTgsMTAxLDExNCwxMTUsOTcsCi0gICAgMTA4LDMyLDExMCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwKLSAgICAxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDAsMTAxLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsNDYsMTAsMzIsMzIsMzIsMzIsMTE0LAotICAgIDU5LDAsMCwwLDc4LDg0LDQxLDcsMjE4LDgsMTE2LDExMSwxMDcsMTAxLDExMCwxMDUsCi0gICAgMTIyLDEwMSwxMTQsNDksMCwwLDAsOTAsNyw2NiwxMjEsMTE2LDEwMSwxMTUsNzMsNzksCi0gICAgOTAsOCwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsOTAsMTUsMTAwLDEwMSwxMTYsMTAxLAotICAgIDk5LDExNiw5NSwxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsOTAsMjUsNzMsMTEwLDk5LAotICAgIDExNCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDEwOCw3OCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSw2OCwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsMTE0LDIxOCw2LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsNDEsNSwKLSAgICAyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDE1MSwKLSAgICAwLDAsMCw5MCwyMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDk4LDEyMSwxMTYsMTAxLAotICAgIDExNSw5NSwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsMjE4LDgsMTAxLDExMCw5OSwxMTEsCi0gICAgMTAwLDEwNSwxMTAsMTAzLDkwLDE1LDExMCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSw5NSwxMDAsMTAxLAotICAgIDk5LDExMSwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTMsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTUsMTExLDExNywKLSAgICAxMTQsOTksMTAxLDIzNywxLDAsMCwxMTUsMTAsMCwwLDAsMCw1LDEyLDEsCi0gICAgMTgsMSwxNSwxLDE4LDEsMTE0LDE1NSwwLDAsMCwxMTQsMTI3LDAsMCwwLAotICAgIDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LAotICAgIDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsOTksMiwwLDAsCi0gICAgMCwyLDAsMCwwLDksMCwwLDAsMTksMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDg5LDEsMCwwLDEyNCwxLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwKLSAgICA3MywwLDEwMCwyLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwyLDAsMTAwLDMsCi0gICAgMCwxMzEsMiwwLDExNCw3MywwLDEyMSwxOSwwLDEyNCwyLDAsMTA2LDEsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCw4NywxMTAsMTgsMCw0LDExNiwyLAotICAgIDAsMTA3LDEwLDAsMTE0LDcyLDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMTYsCi0gICAgMywwLDEwNiw0LDAsMTI0LDAsMCwxMjQsMiwwLDEwMCw0LDAsMTI0LDEsCi0gICAgMCwxMzEsMiwxLDEyNSw0LDAsMTAwLDUsMCwxMjQsNCwwLDk1LDUsMCwKLSAgICAxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTk0LDAsMTIwLDczLDAsMTE2LAotICAgIDYsMCwxMzEsMCwwLDY4LDkzLDU4LDAsOTIsMiwwLDEyNSw1LDAsMTI1LAotICAgIDYsMCwxMjQsMSwwLDEwNiw3LDAsMTE2LDgsMCwxMjQsNiwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCwxMTQsMTI4LDAsMTI0LDUsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgMTMxLDIsMCwxMjUsMiwwLDEyNCwyLDAsMTI0LDQsMCw5NSw5LDAsODAsCi0gICAgMTEzLDEyOCwwLDg3LDEwMCwxLDAsODMsMTI0LDMsMCwxMTYsMTAsMCwxMDcsOCwKLSAgICAwLDExNCwyMywxLDExNiwwLDAsMTI0LDIsMCwxMDAsNiwwLDEzMSwyLDAsCi0gICAgMTE0LDMyLDEsMTIxLDE5LDAsMTI0LDIsMCwxMDYsMTEsMCwxMjQsMCwwLDEzMSwKLSAgICAxLDAsMTI1LDcsMCw4NywxMTAsMTgsMCw0LDExNiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDQsMSwxLDEsMSw4OSwxMTMsMzIsMSw4OCwxMjQsNywwLDExNCwzMiwKLSAgICAxLDEwMywwLDAsMTI0LDQsMCw5NSwxMiwwLDExMCw5LDAsMTI0LDMsMCwKLSAgICAxMjQsNCwwLDk1LDEyLDAsMTI0LDQsMCwxMDYsMTIsMCwxMDMsMCwwLDEwNywKLSAgICAyLDAsMTE0LDg1LDEsMTI0LDEsMCwxMTQsODUsMSwxMTYsMTMsMCwxMjQsMSwKLSAgICAwLDEzMSwxLDAsMTAwLDcsMCwyNSwxMjUsOCwwLDEyNCw0LDAsMTA2LDEyLAotICAgIDAsMTA2LDE0LDAsMTI0LDgsMCwxMzEsMSwwLDEsMTI0LDQsMCw4Myw0MSwKLSAgICA4LDk3LDYxLDEsMCwwLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsOTgsOTcsMTE1LDEwMSwxMDAsCi0gICAgMzIsMTExLDExMCwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA4LDExMSw5OSw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTExLDMyLDEwNSwxMTAsMTAwLAotICAgIDEwNSw5OSw5NywxMTYsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywKLSAgICAxMDMsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LDEwLDMyLDMyLDMyLDMyLDExNSwxMTcsOTgsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksCi0gICAgOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTYsMTExLDMyLDk3LDMyLDEwOCwxMDUsMTE1LDExNiwKLSAgICAzMiwxMTEsMTAyLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMTE1LDQ2LDMyLDMyLDY1LDExMCwxMCwzMiwzMiwzMiwzMiwxMDEsMTA5LDExMiwKLSAgICAxMTYsMTIxLDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMDUsMTE1LDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsCi0gICAgOTksMTA1LDEwMSwxMTAsMTE2LDQ0LDMyLDExNiwxMDQsMTExLDExNywxMDMsMTA0LDMyLDEwNSwxMTYsCi0gICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMTE5LDEwNSwxMTUsMTAxLDMyLAotICAgIDExNywxMTUsMTAxLDEwMiwxMTcsMTA4LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMTYsOTcsMTA3LDEwMSwzMiw5NywzMiwxMTUsMTEyLDEwMSwKLSAgICA5OSwzMiw5NywxMTUsMzIsMTA1LDExNiwxMTUsMzIsMTExLDExMCwxMDgsMTIxLDMyLDk1LDk1LAotICAgIDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCw0MSwzMiw5NywxMTQsMTAzLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDc4LDEyMiw5LDYwLDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCw2MiwyMTgsCi0gICAgMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDIxOCw2LDExMSwKLSAgICAxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSwxMTQsNTksMCwwLDAsNDEsMTUsMTE0LDExNSwwLDAsMCwxMTQsMTU3LAotICAgIDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEyMSwwLDAsMCwyMTgsMTAsNzcsCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDkwLDEzLDk1LDExNSwxMDEsMTE2LDk1LAotICAgIDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsMjcsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LAotICAgIDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw5MiwwLDAsMCwxMTQsOTMsMCwwLDAsMTE0LAotICAgIDEyNywwLDAsMCwyMTgsOSw5NSw4MCw3OSw4MCw4NSw3Niw2NSw4NCw2OSwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCwxNTYsMCwwLDAsMTE0LDM4LDAsMCwwLDIxOCw2LAotICAgIDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNDEsOSwxMTQsMTA2LDAsMCwwLDkwLDgsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE0LDEyNywwLDAsMCwxMTQsMTU2LDAsMCwKLSAgICAwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCwxMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDIxOCw4LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMTE0LAotICAgIDE1OSwwLDAsMCw5MCw3LDEwMCwxMDUsMTE0LDExMCw5NywxMDksMTAxLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwyMywxMTUsMTEyLAotICAgIDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDEwOCwxMTEsOTksCi0gICAgOTcsMTE2LDEwNSwxMTEsMTEwLDI1NCwxLDAsMCwxMTUsNjAsMCwwLDAsMCwxMiwKLSAgICAxMiw0LDYsMSwxNSwyLDMsMSwxOSwxLDEzLDEsNSw4LDI0LDEsCi0gICAgOSwzLDEyLDEsMjIsMSwyMSwxLDE1LDEsOSwxLDUsMiw0LDMsCi0gICAgMTIsMiwxNSwxLDMsMSwxOSwxLDEzLDEsNSwyLDYsMSwxMiwyLAotICAgIDksMSwxNSwxLDYsMSwxNiwxLDE2LDIsMTE0LDE2NywwLDAsMCw5OSwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLAotICAgIDY0LDAsMCwwLDExNSwxMjEsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLAotICAgIDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCw5MCw0LAotICAgIDAsMTAwLDMsMCw5MCw1LDAsMTAwLDQsMCw5MCw2LDAsMTAxLDcsMCwKLSAgICAxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDgsMCwxMDEsCi0gICAgNywwLDEwMCw3LDAsMTAwLDgsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOSwKLSAgICAwLDEwMSw3LDAsMTAwLDksMCwxMDAsOSwwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEzMiwyLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSw3LDAsMTAwLDksMCwxMDAsCi0gICAgMTIsMCwxMDAsMTMsMCwxMzIsMSwwLDEzMSwxLDAsOTAsMTEsMCwxMDAsOSwKLSAgICAwLDgzLDQxLDE0LDIxOCwyMSw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLAotICAgIDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsNjIsNzcsMTAxLDExNiwKLSAgICA5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAwLDEwMSw5OSwxMDgsOTcsMTE0LAotICAgIDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LAotICAgIDExNSwzMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDQ2LDEyMiw1OSw4MywxMTEsMTAyLAotICAgIDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDkyLDgwLDEyMSwxMTYsCi0gICAgMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LAotICAgIDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsOTIsMTIzLDEwMiwKLSAgICAxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsMTIyLDY1LDgzLDExMSwxMDIsMTE2LDExOSw5NywKLSAgICAxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCwKLSAgICA2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsCi0gICAgMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLDExNywxMDgsMTA4LAotICAgIDExMCw5NywxMDksMTAxLDEyNSw5Miw2OCwxMDEsOTgsMTE3LDEwMyw3MCw5OSwyLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNjcsMCwwLDAsMTIxLDIzLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwKLSAgICAwLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLDAsODMsODcsMTEwLDM3LDAsCi0gICAgNCwxMTYsMywwLDEwNywxMCwwLDExNCw2MiwwLDEsMSwxLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMTYsMCwwLDEwNiw0LDAsMTI0LDEsMCwxMzEsMiwwLDgzLAotICAgIDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDUsMjE4LDcsCi0gICAgOTUsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsNyw3OSwxMTIsMTAxLDExMCw3NSwxMDEsMTIxLAotICAgIDkwLDE3LDcyLDc1LDY5LDg5LDk1LDY3LDg1LDgyLDgyLDY5LDc4LDg0LDk1LDg1LAotICAgIDgzLDY5LDgyLDExNCw0MCwwLDAsMCw5MCwxOCw3Miw3NSw2OSw4OSw5NSw3NiwKLSAgICA3OSw2Nyw2NSw3Niw5NSw3Nyw2NSw2Nyw3Miw3Myw3OCw2OSw0MSwyLDIxOCwzLAotICAgIDk5LDEwOCwxMTUsMjE4LDMsMTA3LDEwMSwxMjEsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDE0LDk1LDExMSwxMTIsMTAxLDExMCw5NSwxMTQsCi0gICAgMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc2LDIsMCwwLDExNSw4LDAsMCwwLAotICAgIDAsMiwzLDEsMjMsMSwxMywxLDEyMiwzNiw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LAotICAgIDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICA5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5OSwyLAotICAgIDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNiwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsMTQzLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMTQsMjEsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI1LDIsMCwxMTAsOSwwLDEyNCwwLDAsCi0gICAgMTA2LDIsMCwxMjUsMiwwLDEyNCwyLDAsMTA2LDMsMCwxMDAsMSwwLDEyNCwKLSAgICAxLDAsMTAwLDIsMCwxMTYsNCwwLDEwNiw1LDAsMTAwLDAsMCwxMDAsMywKLSAgICAwLDEzMywyLDAsMjUsMTMxLDAsMiwxMjUsMywwLDEyMSw0NywwLDEyNCwwLAotICAgIDAsMTA2LDYsMCwxMjQsMywwLDEzMSwxLDAsMTQzLDI1LDAsMTI1LDQsMCwKLSAgICAxMTYsNywwLDEwNiw4LDAsMTI0LDQsMCwxMDAsNCwwLDEzMSwyLDAsMTI1LAotICAgIDUsMCw4NywxMDAsMCwwLDgxLDgyLDg4LDg3LDExMCwyMiwwLDQsMTE2LDksCi0gICAgMCwxMDcsMTAsMCwxMTQsMTM4LDAsMSwxLDEsMTAwLDAsMCw4Myw4OSwxMTAsCi0gICAgMSwwLDg4LDEyNCw1LDAsODMsNDEsNSw3OCwxMTQsMTI2LDAsMCwwLDkwLAotICAgIDExLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMTQsODAsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDQxLDEwLDIxOCwxMSw2OCw2OSw2Niw4NSw3MSw5NSwKLSAgICA2Niw4NSw3Myw3Niw2OCwyMTgsMTgsODIsNjksNzEsNzMsODMsODQsODIsODksOTUsCi0gICAgNzUsNjksODksOTUsNjgsNjksNjYsODUsNzEsMjE4LDEyLDgyLDY5LDcxLDczLDgzLAotICAgIDg0LDgyLDg5LDk1LDc1LDY5LDg5LDExNCw0NywwLDAsMCwxMTQsNywwLDAsCi0gICAgMCwyMTgsNywxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTE0LDE3MiwwLDAsMCwxMTQsCi0gICAgMTY5LDAsMCwwLDkwLDEwLDgxLDExNywxMDEsMTE0LDEyMSw4Niw5NywxMDgsMTE3LDEwMSwKLSAgICAxMTQsNDAsMCwwLDAsNDEsNiwxMTQsMTcwLDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsOTAsMTIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NSwxMDcsMTAxLDEyMSwxMTQsCi0gICAgMTcxLDAsMCwwLDkwLDQsMTA0LDEwNywxMDEsMTIxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwKLSAgICAxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwyMTgsMTYsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLAotICAgIDEwNSwxMTUsMTE2LDExNCwxMjEsODMsMiwwLDAsMTE1LDIyLDAsMCwwLDAsMiwKLSAgICA5LDEsMTIsMiw5LDEsMTUsMSwyMiwxLDMsMSwxOCwxLDI5LDEsCi0gICAgMTMsMSw5LDEsMTIyLDM4LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCi0gICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExNSwxMDEsOTcsCi0gICAgMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc4LDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCw4LDAsMCwwLDE0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNTgsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAzMSwwLDEwMCwwLDAsODMsMTIxLDE0LDAsMTE2LDEsMCwxMjQsNCwwLDEzMSwKLSAgICAxLDAsMSw4NywxMTAsMjIsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDY5LAotICAgIDAsMSwxLDEsMTAwLDAsMCw4Myw4OSwxMTAsMSwwLDg4LDEyMCw4MSwwLAotICAgIDExNiwzLDAsMTMxLDAsMCw2OCw5Myw3MCwwLDkyLDIsMCwxMjUsNSwwLAotICAgIDEyNSw2LDAsMTI0LDQsMCwxMDYsNCwwLDExNiw1LDAsMTI0LDYsMCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMTE0LDgwLDAsMTE2LDYsMCwxMDYsNywwLDEyNCwxLAotICAgIDAsMTI0LDUsMCwxMjQsMSwwLDEyNCw0LDAsMTMxLDIsMCwxMDAsMSwwLAotICAgIDEyNCw0LDAsMTMxLDIsMSwxMjUsNywwLDEyNCw3LDAsODMsMTEzLDgwLDAsCi0gICAgODcsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwxNTgsMCwwLDAsNDEsOCwxMTQsCi0gICAgMTc4LDAsMCwwLDExNCwzOSwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDE2MSwKLSAgICAwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDkzLDAsMCwwLDExNCwxMjEsMCwKLSAgICAwLDAsMjE4LDE2LDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQxLDgsMTE0LDE3MCwwLDAsMCwxMTQsMTI2LDAsMCwwLAotICAgIDExNCwzNSwwLDAsMCwyMTgsNiwxMTYsOTcsMTE0LDEwMywxMDEsMTE2LDExNCwxNzcsMCwKLSAgICAwLDAsMTE0LDEyNywwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwxNjQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDksMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk4LDIsMCwwLDExNSwKLSAgICAyNiwwLDAsMCwwLDIsMTUsMSwxMiwxLDQsMSwzLDEsMTQsMSwKLSAgICAxMywxLDksMSwyMiwxLDIxLDEsOSwxLDE1LDEsOSwxLDEyMiwzMSwKKyAgICAwLDExNiwwLDAsMTA3LDMsMCwxMTQsMTcxLDAsMTAwLDgsMCwxMDYsMSwwLAorICAgIDEyNCwyLDAsMTI0LDUsMCwxMzEsMiwwLDEyNSw4LDAsMTE2LDIsMCwxMDYsCisgICAgMywwLDEwMCw5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LDQsMCwxMjQsCisgICAgOCwwLDEyNCw0LDAsMTQxLDEsMCwxMzAsMSwwLDExMCwxMjUsMCwxMTYsNSwKKyAgICAwLDEyNCw2LDAsMTMxLDEsMCwxMDAsNSwwLDEwNywzLDAsMTE0LDIzNSwwLAorICAgIDEwMCwxMCwwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LAorICAgIDIsMCwxMDYsMywwLDEwMCw5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LAorICAgIDYsMCwxMjQsOCwwLDEzMSwxLDAsMTMwLDEsMCwxMTAsNjEsMCwxMTYsNSwKKyAgICAwLDEyNCw3LDAsMTMxLDEsMCwxMDAsNSwwLDEwNywzLDAsMTE0LDQwLDEsCisgICAgMTAwLDExLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDgsMCwxMTYsCisgICAgMiwwLDEwNiwzLDAsMTAwLDksMCwxMjQsOCwwLDEzMSwyLDAsMSwxMTYsCisgICAgNiwwLDEyNCw4LDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwxLDAsMTAwLDEsCisgICAgMCwxMDcsOSwwLDExNCwyMzgsMSwxMjEsMjAsMCwxMTYsNywwLDEyNCwxLDAsCisgICAgMTAwLDEyLDAsMjUsMTMxLDEsMCwxMjUsOSwwLDg3LDExMCwxOCwwLDQsMTE2LAorICAgIDgsMCwxMDcsMTAsMCwxMTQsOTIsMSwxLDEsMSw4OSwxMTAsNjUsMCw4OCwKKyAgICAxMTYsOSwwLDEyNCw2LDAsMTMxLDEsMCwxMjQsOSwwLDEwNywzLDAsMTE0LAorICAgIDE1NywxLDEwMCwxMywwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LAorICAgIDAsMTE2LDIsMCwxMDYsMywwLDEwMCw5LDAsMTI0LDgsMCwxMzEsMiwwLAorICAgIDEsMTE2LDQsMCwxMjQsOCwwLDEyNCw0LDAsMTQxLDEsMCwxMzAsMSwwLAorICAgIDEyMSwxOCwwLDEyNCwxLDAsMTAwLDE0LDAsMjUsMTAwLDE1LDAsNjQsMTI1LDEwLAorICAgIDAsODcsMTEwLDE4LDAsNCwxMTYsOCwwLDEwNywxMCwwLDExNCwxOTUsMSwxLAorICAgIDEsMSw4OSwxMTAsNDMsMCw4OCwxMTYsOSwwLDEyNCw3LDAsMTMxLDEsMCwKKyAgICAxMjQsMTAsMCwxMDcsMywwLDExNCwyMzgsMSwxMTYsNCwwLDEwMCwxMywwLDEwNiwKKyAgICAxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCw0LDAsMTQxLDEsMCwxMzAsMSwKKyAgICAwLDEyNCwwLDAsMTAwLDcsMCwxMDAsMSwwLDEzMywyLDAsMjUsODMsNDEsCisgICAgMTYsOTcsMTIyLDEsMCwwLDg2LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsNDUsMTA1LDExMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwKKyAgICAxMTEsMTAwLDEwMSwzMiw5NywxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDMyLDExNSwxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDMyLDQwLDEwNSwxMDIsMTAsMzIsMzIsMzIsCisgICAgMzIsMTAzLDEwNSwxMTgsMTAxLDExMCw0MSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywKKyAgICAxMTQsMTEwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTksCisgICAgMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OSwxMTEsMTA5LDExMiwxMDUsCisgICAgMTA4LDEwMSw0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwxMDgsMTA4LDMyLDExMSwKKyAgICAxMTYsMTA0LDEwMSwxMTQsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDExNSwzMiw5NywKKyAgICAxMTQsMTAxLDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMTAsMTA0LDk3LDExMCwKKyAgICA5OSwxMDEsMzIsMTAxLDExNCwxMTQsMTExLDExNCwzMiwxMTQsMTAxLDExMiwxMTEsMTE0LDExNiwxMDUsCisgICAgMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LAorICAgIDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LAorICAgIDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsCisgICAgMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwKKyAgICAxMTYsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLAorICAgIDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LAorICAgIDExMSwzMiw5OCwxMDEsMzIsMTE1LDExNiw5NywxMDgsMTAxLDQ2LDMyLDY5LDc5LDcwLDY5LAorICAgIDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LAorICAgIDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTA1LDExNSwzMiwKKyAgICAxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLAorICAgIDExNiwxMTQsMTE3LDExMCw5OSw5NywxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICA3OCwxMTQsOTgsMCwwLDAsMTIyLDEwLDYwLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDYyLDExNCwzNSwwLDAsMCwxMTQsMTIsMCwwLDAsMjMzLDgsMCwwLAorICAgIDAsMjMzLDEyLDAsMCwwLDEyMiwzMCw5OCw5NywxMDAsMzIsMTA5LDk3LDEwMywxMDUsCisgICAgOTksMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LAorICAgIDU4LDMyLDEyMywzMywxMTQsMTI1LDEyMiwyLDEyMywxMjUsMTIyLDQzLDExNCwxMDEsOTcsOTksCisgICAgMTA0LDEwMSwxMDAsMzIsNjksNzksNzAsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsMTAxLAorICAgIDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA1LDEwOSwxMDEsMTE1LDExNiw5NywxMDksMTEyLDMyLAorICAgIDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTIyLDQ4LDExNCwxMDEsOTcsOTksMTA0LDEwMSwxMDAsCisgICAgMzIsNjksNzksNzAsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsMTAxLDk3LDEwMCwxMDUsCisgICAgMTEwLDEwMywzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTExLDEwMiwzMiwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMjE4LDUsMTA5LDExNiwxMDUsMTA5LDEwMSwKKyAgICAxMjIsMjYsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwzMiwxMTUsMTE2LAorICAgIDk3LDEwOCwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTIzLDMzLDExNCwxMjUsMjE4LDQsMTE1LDEwNSwKKyAgICAxMjIsMTAxLDEwOCwzLDAsMCwwLDI1NSwxMjcsMjU1LDEyNywzLDAsNDEsMTAsMjE4LAorICAgIDEyLDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCw0NywwLAorICAgIDAsMCwxMTQsMTE0LDAsMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LAorICAgIDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsOTksMCwwLDAsMTE0LDMxLAorICAgIDAsMCwwLDIxOCw4LDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTQsMCwKKyAgICAwLDAsMjE4LDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDE5LDAsMCwKKyAgICAwLDQxLDExLDExNCw1MywwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTE0LDk4LDAsMCwwLDExNCwzNSwwLDAsMCwKKyAgICA5MCwxMSwxMDEsMTIwLDk5LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDUsMTA5LAorICAgIDk3LDEwMywxMDUsOTksOTAsMTMsMTE0LDk3LDExOSw5NSwxMTYsMTA1LDEwOSwxMDEsMTE1LDExNiwKKyAgICA5NywxMDksMTEyLDkwLDgsMTE0LDk3LDExOSw5NSwxMTUsMTA1LDEyMiwxMDEsMTE0LDc1LDAsCisgICAgMCwwLDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsCisgICAgMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDEwNSwxMjIsMTAxLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwyNSw5NSwxMTgsCisgICAgOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKKyAgICA5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDE1NCwxLDAsMCwxMTUsNzYsMCwwLDAsCisgICAgMCwxMSw2LDEsMTIsMSwxMywzLDYsMSwxMiwxLDEwLDEsMTYsMSwKKyAgICAxNiwxLDE2LDEsMTIsMSwxOCwxLDE2LDEsMTgsMSwxOCwxLDE1LDEsCisgICAgMTYsMSwxNSwxLDE4LDEsMTUsMSwxNiwxLDEyLDEsMTIsMSwzLDEsCisgICAgMjAsMSwxMywxLDUsMiwxOCwxLDE1LDEsMTYsMSwxNSwxLDMsMSwKKyAgICAxOCwxLDEzLDEsNSwyLDE4LDEsMTUsMSw5LDEsMTE0LDEzNSwwLDAsCisgICAgMCw5OSw0LDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw2LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxMTUsMCwwLDAsMTE2LDAsMCwxMDYsMSwKKyAgICAwLDEyNCwwLDAsMTMxLDEsMCwxMjUsNCwwLDExNiwyLDAsMTI0LDQsMCwKKyAgICAxMTYsMywwLDEzMSwyLDAsMTE0LDc4LDAsMTE2LDQsMCwxMDYsNSwwLDEwMCwKKyAgICAxLDAsMTI0LDIsMCwxMzEsMiwwLDEsMTI0LDMsMCwxMDAsMiwwLDEwNywKKyAgICA5LDAsMTE0LDc0LDAsMTE2LDYsMCwxMDYsNywwLDEyNCw0LDAsMTI0LDMsCisgICAgMCwxMzEsMiwwLDEsMTI0LDQsMCw4MywxMTYsOCwwLDEwMCwzLDAsMTA2LAorICAgIDksMCwxMjQsMiwwLDEzMSwxLDAsMTAwLDQsMCwxMjQsMSwwLDEwMCw1LAorICAgIDAsMTI0LDIsMCwxMzEsMSwyLDEzMCwxLDAsMTAwLDIsMCw4Myw0MSw2LAorICAgIDEyMiw2MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCisgICAgMTAwLDEwMSwzMiw5NywxMTUsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwzMiw5OCwKKyAgICAxMjEsMzIsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSw0NiwxMjIsMjEsCisgICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwxMTEsMTAwLDEwMSwKKyAgICAzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsCisgICAgOTgsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDEwLDIxOCw3LDEwOSw5NywxMTQsCisgICAgMTE1LDEwNCw5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLDEwNSwxMTUsMTA1LAorICAgIDExMCwxMTUsMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsMTAxLDk1LDExNiwKKyAgICAxMjEsMTEyLDEwMSwxMTQsMTE0LDAsMCwwLDExNCwxMjksMCwwLDAsMjE4LDQsOTUsCisgICAgMTA1LDEwOSwxMTIsOTAsMTYsOTUsMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwxMDUsMTA4LAorICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsOTksMCwwLDAsMTE0LDQ3LDAsMCwwLDQxLAorICAgIDUsMTE0LDUzLDAsMCwwLDExNCw5OCwwLDAsMCwxMTQsODksMCwwLDAsCisgICAgMTE0LDkwLDAsMCwwLDIxOCw0LDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNyw5NSw5OSwxMTEsMTA5LAorICAgIDExMiwxMDUsMTA4LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMDksMSwwLAorICAgIDAsMTE1LDE2LDAsMCwwLDAsMiwxNSwxLDE1LDEsMTYsMSwxMiwxLAorICAgIDE2LDEsNCwyLDE4LDEsMTE0LDE0MSwwLDAsMCwxMTQsNTksMCwwLDAsCisgICAgOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsNzYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLAorICAgIDEzMSwxLDAsMTI1LDMsMCwxMjQsMywwLDEwNiwyLDAsMTE2LDMsMCwxMjQsCisgICAgMSwwLDEzMSwxLDAsMTMxLDEsMCwxLDEyNCwzLDAsMTA2LDIsMCwxMTYsCisgICAgMywwLDEyNCwyLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsCisgICAgMiwwLDExNiw0LDAsMTA2LDUsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDEsCisgICAgMCwxLDEyNCwzLDAsODMsNDEsMSwxMjIsODAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwKKyAgICAxMDEsMzIsOTcsMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLAorICAgIDEwNSwxMTAsMTE2LDExMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDExNywxMTYsMzIsMTE2LDExMSwKKyAgICAzMiw5NywzMiw5OCwxMjEsMTE2LDEwMSw0NSw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsCisgICAgMTAsMzIsMzIsMzIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDQxLDYsMjE4LDksOTgsMTIxLAorICAgIDExNiwxMDEsOTcsMTE0LDExNCw5NywxMjEsMTE0LDEyOCwwLDAsMCwyMTgsNiwxMDEsMTIwLAorICAgIDExNiwxMDEsMTEwLDEwMCwxMTQsMTcsMCwwLDAsMTE0LDEzNiwwLDAsMCw5MCw1LAorICAgIDEwMCwxMTcsMTA5LDExMiwxMTUsNDEsNCwxMTQsMTQwLDAsMCwwLDExNCwxMjYsMCwwLAorICAgIDAsMTE0LDEzNCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDAsCisgICAgMTAxLDk1LDExNiwxMTEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjIxLDEsMCwKKyAgICAwLDExNSwxMCwwLDAsMCwwLDMsMTIsMSwxOSwxLDE5LDEsMjIsMSwKKyAgICAxMTQsMTQ0LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsCisgICAgMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg5LDAsMCwwLDEwMCwKKyAgICAxLDAsMTAwLDIsMCwxMDgsMCwwLDEyNSwxLDAsMTE2LDEsMCwxMDYsMiwKKyAgICAwLDEyNCwwLDAsMTMxLDEsMCwxMDYsMywwLDEyNSwyLDAsMTI0LDEsMCwKKyAgICAxMDYsNCwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDExNiwxLDAsMTA2LAorICAgIDUsMCwxMDAsMiwwLDEwMCwzLDAsMTMxLDIsMCwxMjUsNCwwLDEyNCw0LAorICAgIDAsMTA2LDYsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMDAsMSwwLAorICAgIDI1LDEzMSwxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiwxMjEsNjgsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsCisgICAgMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTEwLAorICAgIDEwNSwxMTgsMTAxLDExNCwxMTUsOTcsMTA4LDMyLDExMCwxMDEsMTE5LDEwOCwxMDUsMTEwLDEwMSwzMiwKKyAgICAxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsCisgICAgMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsNDYsCisgICAgMTAsMzIsMzIsMzIsMzIsMTE0LDU5LDAsMCwwLDc4LDg0LDQxLDcsMjE4LDgsCisgICAgMTE2LDExMSwxMDcsMTAxLDExMCwxMDUsMTIyLDEwMSwxMTQsNDksMCwwLDAsOTAsNyw2NiwKKyAgICAxMjEsMTE2LDEwMSwxMTUsNzMsNzksOTAsOCwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsCisgICAgOTAsMTUsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiw5NSwxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwKKyAgICAxMDMsOTAsMjUsNzMsMTEwLDk5LDExNCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDEwOCw3OCwxMDEsCisgICAgMTE5LDEwOCwxMDUsMTEwLDEwMSw2OCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDIxOCw2LDEwMCwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsNDEsNSwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSw5OCwKKyAgICAxMjEsMTE2LDEwMSwxMTUsMTE0LDE0NSwwLDAsMCw5MCwyMSwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMTQsMTAxLDk3LDEwMCwxMDgsMTA1LDExMCwxMDEsCisgICAgMjE4LDgsMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDkwLDE1LDExMCwxMDEsMTE5LDEwOCwKKyAgICAxMDUsMTEwLDEwMSw5NSwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsMTAwLDEwMSw5OSwxMTEsCisgICAgMTAwLDEwMSw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDIzMSwxLDAsMCwxMTUsMTAsMCwKKyAgICAwLDAsMCw1LDEyLDEsMTgsMSwxNSwxLDE4LDEsMTE0LDE0OSwwLDAsCisgICAgMCwxMTQsMTIwLDAsMCwwLDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLAorICAgIDExMCwxMTUsOTksMiwwLDAsMCwyLDAsMCwwLDksMCwwLDAsMTksCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDg5LDEsMCwwLDEyNCwxLDAsMTAwLAorICAgIDEsMCwxMDcsOCwwLDExNCw3MywwLDEwMCwyLDAsMTI1LDEsMCwxMTYsMCwKKyAgICAwLDEyNCwyLDAsMTAwLDMsMCwxMzEsMiwwLDExNCw3MywwLDEyMSwxOSwwLAorICAgIDEyNCwyLDAsMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCw4NywKKyAgICAxMTAsMTgsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDcyLDAsMSwxLDEsCisgICAgODksMTEwLDEsMCw4OCwxMTYsMywwLDEwNiw0LDAsMTI0LDAsMCwxMjQsMiwKKyAgICAwLDEwMCw0LDAsMTI0LDEsMCwxMzEsMiwxLDEyNSw0LDAsMTAwLDUsMCwKKyAgICAxMjQsNCwwLDk1LDUsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCisgICAgMTk0LDAsMTIwLDczLDAsMTE2LDYsMCwxMzEsMCwwLDY4LDkzLDU4LDAsOTIsCisgICAgMiwwLDEyNSw1LDAsMTI1LDYsMCwxMjQsMSwwLDEwNiw3LDAsMTE2LDgsCisgICAgMCwxMjQsNiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsMTI4LDAsMTI0LDUsMCwKKyAgICAxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCwxMjUsMiwwLDEyNCwyLDAsMTI0LAorICAgIDQsMCw5NSw5LDAsODAsMTEzLDEyOCwwLDg3LDEwMCwxLDAsODMsMTI0LDMsCisgICAgMCwxMTYsMTAsMCwxMDcsOCwwLDExNCwyMywxLDExNiwwLDAsMTI0LDIsMCwKKyAgICAxMDAsNiwwLDEzMSwyLDAsMTE0LDMyLDEsMTIxLDE5LDAsMTI0LDIsMCwxMDYsCisgICAgMTEsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDcsMCw4NywxMTAsMTgsMCw0LAorICAgIDExNiwyLDAsMTA3LDEwLDAsMTE0LDQsMSwxLDEsMSw4OSwxMTMsMzIsMSwKKyAgICA4OCwxMjQsNywwLDExNCwzMiwxLDEwMywwLDAsMTI0LDQsMCw5NSwxMiwwLAorICAgIDExMCw5LDAsMTI0LDMsMCwxMjQsNCwwLDk1LDEyLDAsMTI0LDQsMCwxMDYsCisgICAgMTIsMCwxMDMsMCwwLDEwNywyLDAsMTE0LDg1LDEsMTI0LDEsMCwxMTQsODUsCisgICAgMSwxMTYsMTMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDcsMCwyNSwxMjUsOCwKKyAgICAwLDEyNCw0LDAsMTA2LDEyLDAsMTA2LDE0LDAsMTI0LDgsMCwxMzEsMSwwLAorICAgIDEsMTI0LDQsMCw4Myw0MSw4LDk3LDYxLDEsMCwwLDgyLDEwMSwxMTYsMTE3LAorICAgIDExNCwxMTAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE1LDExMiwxMDEsOTksCisgICAgMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsCisgICAgMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgODQsMTExLDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDMyLDExNiwxMDQsOTcsMTE2LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsCisgICAgMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LDEwLDMyLDMyLAorICAgIDMyLDMyLDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsCisgICAgOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTYsMTExLDMyLAorICAgIDk3LDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsCisgICAgMTExLDExNCwxMjEsMzIsMTEyLDk3LDExNiwxMDQsMTE1LDQ2LDMyLDMyLDY1LDExMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMDUsMTE1LAorICAgIDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsOTksMTA1LDEwMSwxMTAsMTE2LDQ0LDMyLDExNiwxMDQsMTExLAorICAgIDExNywxMDMsMTA0LDMyLDEwNSwxMTYsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMSwxMTYsMTA0LDEwMSwKKyAgICAxMTQsMTE5LDEwNSwxMTUsMTAxLDMyLDExNywxMTUsMTAxLDEwMiwxMTcsMTA4LDMyLDExNiwxMTEsMzIsCisgICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTE1LAorICAgIDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMTYsOTcsMTA3LDEwMSwKKyAgICAzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzMiw5NywxMTUsMzIsMTA1LDExNiwxMTUsMzIsMTExLAorICAgIDExMCwxMDgsMTIxLDMyLDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCw0MSwzMiw5NywKKyAgICAxMTQsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw5LDYwLDExNywxMTAsMTA3LAorICAgIDExMCwxMTEsMTE5LDExMCw2MiwyMTgsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCwKKyAgICA5NywxMDksMTAxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNTksMCwwLDAsNDEsMTUsMTE0LAorICAgIDEwOCwwLDAsMCwxMTQsMTUxLDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTE0LAorICAgIDAsMCwwLDIxOCwxMCw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksOTAsCisgICAgMTMsOTUsMTE1LDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDk3LDExNiwxMTYsMTE0LDIxOCwyNywKKyAgICA5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDIsCisgICAgMTA1LDEwOCwxMDEsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDkyLDAsMCwwLAorICAgIDExNCw5MywwLDAsMCwxMTQsMTIwLDAsMCwwLDIxOCw5LDk1LDgwLDc5LDgwLAorICAgIDg1LDc2LDY1LDg0LDY5LDExNCwxNTMsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsCisgICAgMzgsMCwwLDAsMjE4LDYsOTcsMTEyLDExMiwxMDEsMTEwLDEwMCw0MSw5LDExNCw5OCwKKyAgICAwLDAsMCw5MCw4LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCwxMjAsMCwKKyAgICAwLDAsMTE0LDE1MCwwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsMTIsMTA4LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw5NSw5OSwxMDgsOTcsMTE1LDExNSwyMTgsOCwxMTUsMTE3LDEwMiwKKyAgICAxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwxNTMsMCwwLDAsOTAsNywxMDAsMTA1LDExNCwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAorICAgIDAsMCwyMTgsMjMsMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsCisgICAgMTA4LDEwMSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwyNDgsMSwwLDAsMTE1LAorICAgIDYwLDAsMCwwLDAsMTIsMTIsNCw2LDEsMTUsMiwzLDEsMTksMSwKKyAgICAxMywxLDUsOCwyNCwxLDksMywxMiwxLDIyLDEsMjEsMSwxNSwxLAorICAgIDksMSw1LDIsNCwzLDEyLDIsMTUsMSwzLDEsMTksMSwxMywxLAorICAgIDUsMiw2LDEsMTIsMiw5LDEsMTUsMSw2LDEsMTYsMSwxNiwyLAorICAgIDExNCwxNjEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsNSwwLDAsMCw2NCwwLDAsMCwxMTUsMTIxLDAsMCwwLDEwMSwKKyAgICAwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywKKyAgICAwLDEwMCwyLDAsOTAsNCwwLDEwMCwzLDAsOTAsNSwwLDEwMCw0LDAsCisgICAgOTAsNiwwLDEwMSw3LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwwLDAsMTMxLAorICAgIDEsMCw5MCw4LDAsMTAxLDcsMCwxMDAsNywwLDEwMCw4LDAsMTMyLDAsCisgICAgMCwxMzEsMSwwLDkwLDksMCwxMDEsNywwLDEwMCw5LDAsMTAwLDksMCwKKyAgICAxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMiwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsCisgICAgNywwLDEwMCw5LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDEsMCwxMzEsMSwKKyAgICAwLDkwLDExLDAsMTAwLDksMCw4Myw0MSwxNCwyMTgsMjEsODcsMTA1LDExMCwxMDAsCisgICAgMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsMTIyLDYyLDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLAorICAgIDEwMCwxMDEsOTksMTA4LDk3LDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSwKKyAgICA0NiwxMjIsNTksODMsMTExLDEwMiwxMTYsMTE5LDk3LDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsCisgICAgMTExLDExMCw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsCisgICAgMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMTE1LDkyLDEyMywxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMTI1LDEyMiw2NSwKKyAgICA4MywxMTEsMTAyLDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDkyLAorICAgIDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LDk1LAorICAgIDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCisgICAgOTIsMTIzLDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsOTIsNjgsMTAxLDk4LDExNywKKyAgICAxMDMsNzAsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDY3LDAsMCwwLDEyMSwyMywwLDExNiwKKyAgICAwLDAsMTA2LDEsMCwxMTYsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMiwKKyAgICAwLDgzLDg3LDExMCwzNywwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNjIsMCwKKyAgICAxLDEsMSwxMTYsMCwwLDEwNiwxLDAsMTE2LDAsMCwxMDYsNCwwLDEyNCwKKyAgICAxLDAsMTMxLDIsMCw4Myw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsCisgICAgMSw3OCw0MSw1LDIxOCw3LDk1LDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDkwLDcsNzksCisgICAgMTEyLDEwMSwxMTAsNzUsMTAxLDEyMSw5MCwxNyw3Miw3NSw2OSw4OSw5NSw2Nyw4NSw4MiwKKyAgICA4Miw2OSw3OCw4NCw5NSw4NSw4Myw2OSw4MiwxMTQsNDAsMCwwLDAsOTAsMTgsCisgICAgNzIsNzUsNjksODksOTUsNzYsNzksNjcsNjUsNzYsOTUsNzcsNjUsNjcsNzIsNzMsCisgICAgNzgsNjksNDEsMiwyMTgsMyw5OSwxMDgsMTE1LDIxOCwzLDEwNywxMDEsMTIxLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNCw5NSwKKyAgICAxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwyLDAsCisgICAgMCwxMTUsOCwwLDAsMCwwLDIsMywxLDIzLDEsMTMsMSwxMjIsMzYsCiAgICAgODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LAotICAgIDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDQ1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsMywwLDEyNCwzLDAsMTAwLDEsCi0gICAgMCwxMDcsOSwwLDExNCwzNywwLDEyNCwzLDAsMTA2LDEsMCw4MywxMDAsMSwKLSAgICAwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsMTA4LDcwLDEwNSwxMTAsMTAwLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTAsMTAsMzIsMzIsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LAorICAgIDExNSwxMTYsMTE0LDEyMSw5OSwyLDAsMCwwLDAsMCwwLDAsNiwwLDAsCisgICAgMCwxNiwwLDAsMCw2NywwLDAsMCwxMTUsMTQ3LDAsMCwwLDEyNCwwLAorICAgIDAsMTA2LDAsMCwxMTQsMjEsMCwxMjQsMCwwLDEwNiwxLDAsMTI1LDIsMCwKKyAgICAxMTAsOSwwLDEyNCwwLDAsMTA2LDIsMCwxMjUsMiwwLDEyNCwyLDAsMTA2LAorICAgIDMsMCwxMDAsMSwwLDEyNCwxLDAsMTAwLDIsMCwxMDAsMywwLDExNiw0LAorICAgIDAsMTA2LDUsMCwxMDAsMCwwLDEwMCw0LDAsMTMzLDIsMCwyNSwyMiwxMzEsCisgICAgMCwyLDEyNSwzLDAsMTIxLDQ3LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwzLAorICAgIDAsMTMxLDEsMCwxNDMsMjUsMCwxMjUsNCwwLDExNiw3LDAsMTA2LDgsMCwKKyAgICAxMjQsNCwwLDEwMCw1LDAsMTMxLDIsMCwxMjUsNSwwLDg3LDEwMCwwLDAsCisgICAgODEsODIsODgsODcsMTEwLDIyLDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwxNDIsCisgICAgMCwxLDEsMSwxMDAsMCwwLDgzLDg5LDExMCwxLDAsODgsMTI0LDUsMCwKKyAgICA4Myw0MSw2LDc4LDExNCwxMTksMCwwLDAsOTAsMTEsMTE1LDEyMSwxMTUsOTUsMTE4LAorICAgIDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDEyMiw1LDM3LDEwMCw0NiwzNywxMDAsMTE0LDU2LDAsCisgICAgMCwwLDExNCwzMCwwLDAsMCw0MSwxMCwyMTgsMTEsNjgsNjksNjYsODUsNzEsCisgICAgOTUsNjYsODUsNzMsNzYsNjgsMjE4LDE4LDgyLDY5LDcxLDczLDgzLDg0LDgyLDg5LAorICAgIDk1LDc1LDY5LDg5LDk1LDY4LDY5LDY2LDg1LDcxLDIxOCwxMiw4Miw2OSw3MSw3MywKKyAgICA4Myw4NCw4Miw4OSw5NSw3NSw2OSw4OSwxMTQsNDcsMCwwLDAsMTE0LDcsMCwKKyAgICAwLDAsMjE4LDEyLDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCw5NSwxMDUsMTEwLDEwMiwxMTEsCisgICAgMTE0LDE2NiwwLDAsMCwxMTQsMTYzLDAsMCwwLDkwLDEwLDgxLDExNywxMDEsMTE0LAorICAgIDEyMSw4Niw5NywxMDgsMTE3LDEwMSwxMTQsNDAsMCwwLDAsNDEsNiwxMTQsMTY0LDAsCisgICAgMCwwLDExNCwxMTksMCwwLDAsOTAsMTIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LAorICAgIDEyMSw5NSwxMDcsMTAxLDEyMSwxMTQsMTY1LDAsMCwwLDkwLDQsMTA0LDEwNywxMDEsMTIxLAorICAgIDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTYsOTUsMTE1LDEwMSw5NywxMTQsCisgICAgOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzcsMiwwLDAsMTE1LAorICAgIDIyLDAsMCwwLDAsMiw5LDEsMTIsMiw5LDEsMTUsMSwyNiwxLAorICAgIDMsMSwxOCwxLDI5LDEsMTMsMSw5LDEsMTIyLDM4LDg3LDEwNSwxMTAsMTAwLAorICAgIDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwKKyAgICAxMTQsMTIxLDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw4LDAsMCwwLAorICAgIDE0LDAsMCwwLDY3LDAsMCwwLDExNSwxNTgsMCwwLDAsMTI0LDAsMCwKKyAgICAxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLAorICAgIDAsMCwxMDcsOCwwLDExNCwzMSwwLDEwMCwwLDAsODMsMTIxLDE0LDAsMTE2LAorICAgIDEsMCwxMjQsNCwwLDEzMSwxLDAsMSw4NywxMTAsMjIsMCw0LDExNiwyLAorICAgIDAsMTA3LDEwLDAsMTE0LDY5LDAsMSwxLDEsMTAwLDAsMCw4Myw4OSwxMTAsCisgICAgMSwwLDg4LDEyMCw4MSwwLDExNiwzLDAsMTMxLDAsMCw2OCw5Myw3MCwwLAorICAgIDkyLDIsMCwxMjUsNSwwLDEyNSw2LDAsMTI0LDQsMCwxMDYsNCwwLDExNiwKKyAgICA1LDAsMTI0LDYsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDgwLDAsMTE2LDYsCisgICAgMCwxMDYsNywwLDEyNCwxLDAsMTI0LDUsMCwxMjQsMSwwLDEyNCw0LDAsCisgICAgMTMxLDIsMCwxMDAsMSwwLDEyNCw0LDAsMTMxLDIsMSwxMjUsNywwLDEyNCwKKyAgICA3LDAsODMsMTEzLDgwLDAsODcsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwxNTIsCisgICAgMCwwLDAsNDEsOCwxMTQsMTcyLDAsMCwwLDExNCwzOSwwLDAsMCwxMTQsCisgICAgNDAsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDkzLAorICAgIDAsMCwwLDExNCwxMTQsMCwwLDAsMjE4LDE2LDExNSwxMTIsMTAxLDk5LDk1LDEwMiwKKyAgICAxMTQsMTExLDEwOSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQxLDgsMTE0LDE2NCwwLDAsCisgICAgMCwxMTQsMTE5LDAsMCwwLDExNCwzNSwwLDAsMCwyMTgsNiwxMTYsOTcsMTE0LAorICAgIDEwMywxMDEsMTE2LDExNCwxNzEsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTYwLDAsCisgICAgMCwwLDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMjE4LDksMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLAorICAgIDk5LDkyLDIsMCwwLDExNSwyNiwwLDAsMCwwLDIsMTUsMSwxMiwxLAorICAgIDQsMSwzLDEsMTQsMSwxMywxLDksMSwyMiwxLDIxLDEsOSwxLAorICAgIDE1LDEsOSwxLDEyMiwzMSw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLAorICAgIDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsCisgICAgOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsMCwwLDQsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNDUsMCwwLDAsMTI0LAorICAgIDAsMCwxMDYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLAorICAgIDAsMTI0LDMsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDM3LDAsMTI0LDMsMCwKKyAgICAxMDYsMSwwLDgzLDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxMDgsCisgICAgNzAsMTA1LDExMCwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LAorICAgIDEyMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwKKyAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsCisgICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAorICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwKKyAgICAxNzUsMCwwLDAsMTE0LDEyMCwwLDAsMCw0MSw0LDExNCwxNjQsMCwwLDAsCisgICAgMTE0LDExOSwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsCisgICAgMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEwOCwyLDAsMCwxMTUsCisgICAgOCwwLDAsMCwwLDcsMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LAorICAgIDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLAorICAgIDEyLDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsMCwwLAorICAgIDExNCwxMDcsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTY4LDAsMCwwLDExNCwKKyAgICAxNjcsMCwwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsCisgICAgMTAwLDExNCwxNjYsMCwwLDAsMTE0LDE3MiwwLDAsMCwxMTQsMTc1LDAsMCwwLAorICAgIDExNCwxNzYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE2MiwwLDAsMCw1OCwyLAorICAgIDAsMCwxMTUsMjAsMCwwLDAsMTIsMiw2LDMsNiwzLDYsMiw2LAorICAgIDIsMTgsNywxOCwxNSwzLDEsMjEsMTUsMywxLDExNCwxNjIsMCwwLDAsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsNzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsCisgICAgMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsCisgICAgMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwKKyAgICAwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsCisgICAgMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDgzLAorICAgIDQxLDExLDIxOCwxMyw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwKKyAgICAxMTUsMTIyLDgzLDY2LDk3LDExNSwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwKKyAgICAzMiw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLAorICAgIDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsCisgICAgMzIsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDUsCisgICAgMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsODgsMCwwLDAsCisgICAgMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwKKyAgICAxLDAsMTAwLDEsMCwyNSwxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDAsCisgICAgMiwwLDEwMCwxLDAsMTMxLDIsMCwxMDAsMywwLDI1LDEyNSwzLDAsMTI0LAorICAgIDEsMCwxMDYsMywwLDEwMCwyLDAsMTMxLDEsMCwxMDAsNCwwLDI1LDEyNSwKKyAgICA0LDAsMTI0LDMsMCwxMDAsNSwwLDEwNywyLDAsMTExLDg3LDAsMTI0LDQsCisgICAgMCwxMDAsNSwwLDEwNywzLDAsODMsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksCisgICAgMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLAorICAgIDk4LDEyMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAorICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LAorICAgIDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsCisgICAgMTA1LDExNiw5NSw5NSw0NiwxMTIsMTIxLDM5LDQ2LDExNCwyOSwwLDAsMCwxMTQsNTgsCisgICAgMCwwLDAsMTE0LDU5LDAsMCwwLDExNCw1NiwwLDAsMCwyMTgsOCw5NSwKKyAgICA5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDE1MSwKKyAgICAwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LDMyLDAsMCwwLDQxLDUsMTE0LAorICAgIDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw5NCwwLDAsMCw5MCwxMywKKyAgICAxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiwKKyAgICA5NywxMDUsMTA4LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw1LDAsMCwwLDExNCwxNTMsMCwwLDAsMTI3LDIsMCwwLAorICAgIDExNSw4LDAsMCwwLDAsMywyNSwxLDIyLDEsMTksMSwxMjIsMjQsOTUsCisgICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsCisgICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLAorICAgIDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLAorICAgIDk3LDExNywxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsCisgICAgMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsCisgICAgMTExLDExMCw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDE1OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwyMTgsMTMsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDEzNSwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsCisgICAgMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw4MCwKKyAgICAwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwKKyAgICAxLDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTQsCisgICAgMCwxMTYsMiwwLDEwMCwyLDAsMTA2LDMsMCwxMjQsMSwwLDEwNiwxLDAsCisgICAgMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTE2LDQsMCwxMDYsNSwwLDExNiwKKyAgICA2LDAsMTI0LDIsMCwxMjQsMSwwLDEwNiw3LDAsMTMxLDMsMCwxLDEwMCwKKyAgICAxLDAsODMsNDEsMywxMjIsMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLAorICAgIDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEyMywzMywxMTQsMTI1LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsCisgICAgMTAwLDEwMSw0MCw0MSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwKKyAgICAxMDEsNDEsOCwyMTgsOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTA1LDAsCisgICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDExNCwwLDAsCisgICAgMCwyMTgsMjUsOTUsOTksOTcsMTA4LDEwOCw5NSwxMTksMTA1LDExNiwxMDQsOTUsMTAyLDExNCwKKyAgICA5NywxMDksMTAxLDExNSw5NSwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwxMDAsMjE4LDQsMTAxLDEyMCwKKyAgICAxMDEsOTksMTE0LDExMSwwLDAsMCw0MSwzLDExNCwxMDAsMCwwLDAsMjE4LDYsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE0MCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsMTAxLDEyMCwxMDEsOTksCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTM4LDIsMCwwLDExNSwxMCwwLDAsMCwKKyAgICAwLDIsMTgsMSwxMiwxLDksMSwxNSwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTE2LAorICAgIDAsMCwxMDYsMSwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLAorICAgIDEsMTIyLDI2LDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwKKyAgICAxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0Niw0MSwyLDExNCwKKyAgICAxMTQsMCwwLDAsMjE4LDE3LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDk1LDExNSwxMDQsMTA1LDEwOSw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAorICAgIDAsMCwyMTgsMTEsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTQ2LAorICAgIDIsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjUsOTUsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDc4LDQxLDgsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsCisgICAgMCwwLDExNCwxMDYsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTUzLDAsMCwKKyAgICAwLDExNCwxODAsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsMTg3LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDExNCwxNzgsMCwwLDAsMTIyLDIsMCwwLDExNSwxMCwwLAorICAgIDAsMCwxMiwzLDYsMiwxMiw4LDEyLDMsMTIsOCwxMTQsMTc4LDAsMCwKKyAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwKKyAgICAwLDAsNjQsMCwwLDAsMTE1LDEwNiwwLDAsMCwxMDEsMCwwLDkwLDEsCisgICAgMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwKKyAgICA5MCwzLDAsMTAwLDMsMCwxMDAsNCwwLDEzMiwwLDAsOTAsNCwwLDEwMCwKKyAgICA1LDAsMTAwLDYsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNywwLDEwMCw4LAorICAgIDAsMTMyLDAsMCw5MCw2LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLAorICAgIDkwLDcsMCwxMDAsMTEsMCwxMDAsMTgsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsCisgICAgMCwxLDkwLDgsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMCwwLDkwLDksCisgICAgMCwxMDAsMTcsMCw4Myw0MSwxOSwyMTgsMTIsODMsMTExLDExNywxMTQsOTksMTAxLDc2LAorICAgIDExMSw5NywxMDAsMTAxLDExNCw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLDAsMCwxMTYsCisgICAgMCwwLDEzMCwxLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNzgsNzksMTEyLDExNiwKKyAgICAxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE2LDEwNCw5NywKKyAgICAxMTYsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCisgICAgMTAwLDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTA1LDEwOSwxMDEsMzIsCisgICAgNDAsOTcsMTEwLDMyLDEwNSwxMTAsMTE2LDQxLDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LAorICAgIDEwMSwxMDAsMzIsMTEyLDk3LDExNiwxMDQsNDQsMzIsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDk3LDMyLDExNSwxMTYsMTE0LDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgyLDk3LDEwNSwxMTUsMTAxLDExNSwzMiw3Myw3OSwKKyAgICA2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiw5OCwxMDEsMzIsMTA0LDk3LAorICAgIDExMCwxMDAsMTA4LDEwMSwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsCisgICAgNDEsMSwyMTgsNyw3Myw3OSw2OSwxMTQsMTE0LDExMSwxMTQsNDEsMiwxMTQsMTAwLDAsCisgICAgMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNSwwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsCisgICAgMTA5LDEwMSwxNTMsMiwwLDAsMTE1LDIsMCwwLDAsMCw2LDEyMiwyMyw4MywKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LAorICAgIDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTksMCwwLDAsCisgICAgMTAwLDEsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEwNSwKKyAgICAxLDAsODMsNDEsMiw5NywxNzAsMSwwLDAsNzksMTEyLDExNiwxMDUsMTExLDExMCwKKyAgICA5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMTA1LDExMCwxMDMsMzIsOTcsMzIsMTA5LDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDAsCisgICAgMTA1LDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDExNiwxMTEsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCisgICAgMTA0LDMyLDQwLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDgwLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDEwNywxMDEsMTIxLDExNSw1OCwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0NSwzMiwzOSwxMDksMTE2LDEwNSwxMDksMTAxLAorICAgIDM5LDMyLDQwLDEwOSw5NywxMTAsMTAwLDk3LDExNiwxMTEsMTE0LDEyMSw0MSwzMiwxMDUsMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDExNiwxMDUsMTA5LAorICAgIDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsMTExLDEwMiwzMiwxMDgsOTcsMTE1LDExNiwzMiwxMTUsCisgICAgMTExLDExNywxMTQsOTksMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLAorICAgIDExMCw1OSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0NSwzMiwzOSwxMTUsMTA1LAorICAgIDEyMiwxMDEsMzksMzIsNDAsMTExLDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDQxLDMyLDEwNSwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwNSwxMjIsMTAxLDMyLDEwNSwxMTAsMzIsOTgsMTIxLAorICAgIDExNiwxMDEsMTE1LDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsCisgICAgMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMTQsCisgICAgMTAxLDk3LDEwMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwKKyAgICAxMDEsMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgyLDk3LDEwNSwxMTUsCisgICAgMTAxLDExNSwzMiw3Myw3OSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwKKyAgICA5OCwxMDEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMTE0LDEyNiwwLDAsMCw0MSwxLDExNCwxOTAsMCwwLDAsCisgICAgNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwKKyAgICAxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDE2MSwyLDAsMCwxMTUsMiwwLDAsMCwKKyAgICAwLDExLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLAorICAgIDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxNiwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDIsMCwxMjQsMywKKyAgICAwLDEzMSwyLDAsODMsNDEsMSwxMjIsMjI4LDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsCisgICAgMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksCisgICAgMTE0LDEwNSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDQwLDk4LDEyMSwxMTYsMTAxLAorICAgIDExNSw0MSwzMiwxMTYsMTExLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCwzMiw0MCw5NywzMiwxMTUsMTE2LDExNCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLAorICAgIDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LAorICAgIDExMSwxMTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExOSwxMTQsMTA1LDExNiwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLAorICAgIDEwMiwxMDUsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgODQsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAorICAgIDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwKKyAgICAxMDEsMTE0LDMyLDExNiwxMTEsMzIsOTksMTExLDExNCwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLAorICAgIDExNiwxMTQsOTcsMTEwLDExNSwxMDIsMTAxLDExNCwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsCisgICAgMTA1LDExMSwxMTAsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQxLDEsMjE4LAorICAgIDgsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSw0LDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDkwLDAsMCwwLDkwLDEwLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTEyLDk3LDExNiwKKyAgICAxMDQsMTE0LDUzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDIxOCwxNSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwKKyAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDE3NCwyLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDgsMTIyLDI4LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5OSwKKyAgICAzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsCisgICAgMTUwLDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLAorICAgIDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsCisgICAgMTE2LDk3LDMyLDQwLDk4LDEyMSwxMTYsMTAxLDExNSw0MSwzMiwxMTYsMTExLDMyLDk3LDMyLAorICAgIDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw0MCw5NywzMiwxMTUsMTE2LDExNCwKKyAgICA0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDEwOCwKKyAgICAxMDEsMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDk4LAorICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTUsNDYsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTE0LDQsMCwwLDAsNDEsMywxMTQsCisgICAgMTAwLDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MiwwLAorICAgIDAsMCwxODQsMiwwLDAsMTE1LDAsMCwwLDAsMTIyLDIxLDgzLDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LAorICAgIDExNiw5Nyw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwxNiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTA1LDAsMCwwLDEyNCwwLDAsMTA2LAorICAgIDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjEsMTksMCwxMjQsMCwKKyAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsODcsMTEwLDU4LAorICAgIDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw5NCwwLDEsMTI1LDQsMCwxLAorICAgIDEyMiwyNiwwLDExNiwzLDAsMTAwLDEsMCwxMDAsMiwwLDEyNCwxLDAsMTMxLAorICAgIDEsMSwxMjQsNCwwLDEzMCwyLDAsODcsODksMTAwLDMsMCwxMDAsMywwLAorICAgIDEyNSw0LDAsMTI2LDQsMCw4OCwxMTAsMSwwLDg4LDExNiw0LDAsMTI0LDMsCisgICAgMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDUyLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDYsMTIyLDM5LDExNSwKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTE4LDk3LDEwNSwxMDgsOTcsCisgICAgOTgsMTA4LDEwMSwzMiwxMTYsMTA0LDExNCwxMTEsMTE3LDEwMywxMDQsMzIsMTAzLDEwMSwxMTYsOTUsCisgICAgMTAwLDk3LDExNiw5Nyw0MCw0MSwxMTQsOTgsMCwwLDAsNzgsNDEsNSwxMTQsMTUxLAorICAgIDAsMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsMTE0LDQwLDAsCisgICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTQ5LDAsMCwwLDQxLDUsMTE0LDEwMCwKKyAgICAwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTQ3LDAsCisgICAgMCwwLDIxOCwzLDEwMSwxMjAsOTksMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsMTkxLDIsMCwwLDExNSwxNCwwLDAsMCwwLDIsMTUsMSwzLAorICAgIDEsMTksMSwxOCwxLDksMSwzMSwxLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsMjE4LDksOTUsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDEwMSwxMTQsMjksMCwKKyAgICAwLDAsOTksMywwLDAsMCwxLDAsMCwwLDQsMCwwLDAsOSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTE2LDAsMCwxMDYsCisgICAgMSwwLDExNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEwMCwxLDAsMTAwLDIsCisgICAgMCwxMDAsMywwLDEwMCw0LDAsMTI0LDMsMCwxMzEsNCwyLDgzLDQxLDUsCisgICAgMTIyLDEzMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDAsCisgICAgMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwKKyAgICAxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwxMDAsOTcsMTE2LAorICAgIDk3LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiw5OSw5NywxMTAsMzIsCisgICAgOTgsMTAxLDMyLDk3LDExMCwxMjEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDExNiwxMjEsCisgICAgMTEyLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCwKKyAgICA0MSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDExNCwxODMsMCwwLDAsMjE4LDEyLDEwMCwxMTEsMTEwLDExNiw5NSwKKyAgICAxMDUsMTEwLDEwNCwxMDEsMTE0LDEwNSwxMTYsODQsMTE0LDY4LDAsMCwwLDQxLDMsMTE0LAorICAgIDExNCwwLDAsMCwxMTQsMTgyLDAsMCwwLDIxOCw3LDk5LDExMSwxMDksMTEyLDEwNSwKKyAgICAxMDgsMTAxLDQxLDQsMTE0LDEwMCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDE0LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsCisgICAgMTE2LDExMSw5NSw5OSwxMTEsMTAwLDEwMSwyMDEsMiwwLDAsMTE1LDQsMCwwLDAsCisgICAgMCw1LDIxLDEsMTIyLDI3LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTYsMTExLDk1LDk5LDExMSwxMDAsCisgICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwxMCwwLDAsMCw0MywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTgzLDEsMCwwLDEyNCwwLDAsMTA2LDAsCisgICAgMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwwLDEyNSwzLDAsCisgICAgMTIxLDE2LDAsMTE2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDQsMCw4NywKKyAgICAxMTAsMjQsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDYzLDAsMSwxLDEsCisgICAgMTAwLDEsMCwxMjUsNCwwLDg5LDExMCwyMDUsMCw4OCwxMjEsMTksMCwxMjQsMCwKKyAgICAwLDEwNiwzLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw1LDAsODcsMTEwLDE4LAorICAgIDAsNCwxMTYsNCwwLDEwNywxMCwwLDExNCwxMDMsMCwxLDEsMSw4OSwxMTAsCisgICAgMTY1LDAsODgsMTE2LDUsMCwxMjQsNSwwLDEwMCwyLDAsMjUsMTMxLDEsMCwKKyAgICAxMjUsMywwLDEyMSwxOSwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsNCwwLDEzMSwKKyAgICAxLDAsMTI1LDYsMCw4NywxMTAsMTgsMCw0LDExNiw3LDAsMTA3LDEwLDAsCisgICAgMTE0LDE1OSwwLDEsMSwxLDg5LDExMCwxMDksMCw4OCwxMjEsMzQsMCwxMTYsOCwKKyAgICAwLDEyNCw2LDAsMTAwLDMsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDEsMCwKKyAgICAxMDAsNSwwLDEyNCw0LDAsMTMxLDEsMywxMjUsNywwLDg3LDExMCwyNCwwLAorICAgIDQsMTE2LDksMCwxMTYsMTAsMCwxMDIsMiwwLDEwNywxMCwwLDExNCwyMjAsMCwKKyAgICAxLDEsMSw4OSwxMTAsNDgsMCw4OCwxMTYsMTEsMCwxMDYsMTIsMCwxMDAsNiwKKyAgICAwLDEyNCw0LDAsMTI0LDIsMCwxMzEsMywwLDEsMTE2LDEzLDAsMTI0LDcsCisgICAgMCwxMDAsNCwwLDEyNCwxLDAsMTAwLDcsMCwxMjQsNCwwLDEwMCw4LDAsCisgICAgMTI0LDIsMCwxMzEsMSwzLDgzLDEyNCwwLDAsMTA2LDYsMCwxMjQsMiwwLAorICAgIDEzMSwxLDAsMTI1LDgsMCwxMjQsMCwwLDEwNiwxNCwwLDEyNCw4LDAsMTI0LAorICAgIDIsMCwxMzEsMiwwLDEyNSw5LDAsMTE2LDExLDAsMTA2LDEyLDAsMTAwLDksCisgICAgMCwxMjQsMiwwLDEzMSwyLDAsMSwxMTYsMTUsMCwxMDYsMTYsMCwxMiwxMTQsCisgICAgMTc5LDEsMTI0LDQsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDE3OSwxLDEyNCwzLAorICAgIDAsMTAwLDEsMCwxMDcsOSwwLDExNCwxNzksMSwxMTYsMTcsMCwxMjQsOSwwLAorICAgIDEyNCwzLDAsMTE2LDE4LDAsMTI0LDgsMCwxMzEsMSwwLDEzMSwzLDAsMTI1LAorICAgIDYsMCwxMjEsMzksMCwxMjQsMCwwLDEwNiwxOSwwLDEyNCwyLDAsMTI0LDQsCisgICAgMCwxMjQsNiwwLDEzMSwzLDAsMSwxMTYsMTEsMCwxMDYsMTIsMCwxMDAsMTAsCisgICAgMCwxMjQsNCwwLDEzMSwyLDAsMSw4NywxMTAsMTgsMCw0LDExNiwyLDAsCisgICAgMTA3LDEwLDAsMTE0LDE3OCwxLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDksCisgICAgMCw4Myw0MSwxMSwxMjIsMTkwLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKKyAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAorICAgIDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywKKyAgICAxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDgyLDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LAorICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDQ2LDMyLDg0LDExMSwzMiwKKyAgICAxMTksMTE0LDEwNSwxMTYsMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk4LDEyMSwKKyAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsCisgICAgMzIsMTA5LDExNywxMTUsMTE2LDMyLDk3LDEwOCwxMTUsMTExLDMyLDk4LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDc4LDExNCwxMjYsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsCisgICAgOTgsMCwwLDAsMTE0LDM1LDAsMCwwLDEyMiwxMywxMjMsMTI1LDMyLDEwOSw5NywKKyAgICAxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTIzLDEyNSwxMTQsODksMCwwLDAsMTE0LDkwLDAsCisgICAgMCwwLDEyMiwxOSw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsCisgICAgMTAyLDExNCwxMTEsMTA5LDMyLDEyMywxMjUsMTIyLDEwLDExOSwxMTQsMTExLDExNiwxMDEsMzIsMTIzLAorICAgIDMzLDExNCwxMjUsNDEsMjAsMTE0LDE1MSwwLDAsMCwxMTQsNzksMCwwLDAsMTE0LAorICAgIDY2LDAsMCwwLDExNCwxOTEsMCwwLDAsMTE0LDE4OSwwLDAsMCwxMTQsMTQsCisgICAgMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDEzNSwwLAorICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEzMCwwLDAsMCwxMTQsMTE0LDAsMCwKKyAgICAwLDExNCwxMjksMCwwLDAsMTE0LDE0MSwwLDAsMCwxMTQsMjAwLDAsMCwwLAorICAgIDExNCw3LDAsMCwwLDIxOCwxOSwxMDAsMTExLDExMCwxMTYsOTUsMTE5LDExNCwxMDUsMTE2LAorICAgIDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTQ0LDAsMCwwLDExNCwKKyAgICAzMSwwLDAsMCwxMTQsMTkzLDAsMCwwLDQxLDEwLDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDExOSwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsCisgICAgODksMCwwLDAsMjE4LDIsMTE1LDExNiwxMTQsNTMsMCwwLDAsMjE4LDEwLDk4LAorICAgIDEyMSwxMTYsMTAxLDExNSw5NSwxMDAsOTcsMTE2LDk3LDExNCwxNDcsMCwwLDAsOTAsMTEsCisgICAgOTksMTExLDEwMCwxMDEsOTUsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODEsMCwwLDAsMjA5LAorICAgIDIsMCwwLDExNSw3OCwwLDAsMCwwLDcsMTUsMSw2LDEsMywxLAorICAgIDE2LDEsMTMsMSwxMSwyLDMsMSwxOSwxLDEzLDEsNSwyLDE2LDEsCisgICAgMywxLDE5LDEsMTMsMSw1LDIsMywxLDksMSwxMiwxLDEzLDEsCisgICAgMTksMSw1LDIsMTIsMSw3LDEsMTUsMSw2LDEsNywxLDE1LDEsCisgICAgMTgsMSwxNiwxLDIyLDEsMTIsMSw5LDEsMTUsMSwzLDEsMTksMSwKKyAgICAyMCwxLDEzLDEsNSwxLDEyMiwyMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDc4LDExNCw4NywKKyAgICAwLDAsMCw0MSwxMCwxMTQsMTA1LDAsMCwwLDExNCwxMDQsMCwwLDAsMTE0LAorICAgIDEwNiwwLDAsMCwxMTQsMTkwLDAsMCwwLDExNCwxOTEsMCwwLDAsMTE0LDE5MywKKyAgICAwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCwxOTYsMCwwLDAsMTE0LDIwMCwwLAorICAgIDAsMCwxMTQsMTgxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODgsMCwwLDAsCisgICAgMTUxLDIsMCwwLDExNSwxNCwwLDAsMCwxMiwyLDEyLDgsMTIsMTMsMTIsCisgICAgMTAsMTIsNywxMiwxMCwxOCw4LDExNCwxODgsMCwwLDAsOTksMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwwLDAsMCwKKyAgICAwLDExNSwxMTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKKyAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAorICAgIDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwKKyAgICAxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAxLDcsMCwxMzUsCisgICAgMCwwLDEwMiwxLDAsMTAwLDgsMCwxMDAsOSwwLDEzNCwwLDAsMTMxLDEsCisgICAgMCw5MCw4LDAsMTAxLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLAorICAgIDEzMSwxLDAsOTAsOSwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsOTAsCisgICAgMTAsMCwxMzUsMCwwLDgzLDQxLDE0LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExOSwxMDQsMTA1LAorICAgIDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LDExMSwxMTYsMTExLDk5LDExMSwKKyAgICAxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDEwLDMyLAorICAgIDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsCisgICAgMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsMTAxLDQ2LDk5LDMsMCwKKyAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLDAsCisgICAgMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLAorICAgIDc1LDY3LDk3LDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKKyAgICAxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw3OCw0MSwyLDExNCwKKyAgICA5OCwwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzksMCwwLDAsMTAsMywKKyAgICAwLDAsMTE1LDQsMCwwLDAsMCwzLDksMSwxMjIsMTksNzAsMTA1LDEwOCwKKyAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsCisgICAgMTI0LDEsMCwxMDYsMCwwLDEwNywyLDAsMTExLDMzLDAsMTI0LDAsMCwxMDYsCisgICAgMSwwLDEyNCwxLDAsMTA2LDEsMCwxMDcsMiwwLDgzLDQxLDEsNzgsNDEsCisgICAgMiwyMTgsOSw5NSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSw5NSwxMTQsMTExLDAsMCwKKyAgICAwLDQxLDIsMTE0LDEwMCwwLDAsMCwyMTgsNSwxMTEsMTE2LDEwNCwxMDEsMTE0LDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw2LAorICAgIDk1LDk1LDEwMSwxMTMsOTUsOTUsMTYsMywwLDAsMTE1LDQsMCwwLDAsMCwKKyAgICAxLDE4LDEsMTIyLDE3LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKKyAgICA5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLAorICAgIDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTE2LDAsMCwxMjQsCisgICAgMCwwLDEwNiwyLDAsMTMxLDEsMCw2NSw4Myw0MSwxLDc4LDQxLDMsMjE4LAorICAgIDQsMTA0LDk3LDExNSwxMDQsMTE0LDk4LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwKKyAgICAxLDExNCwxMDAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMjE4LDgsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsMjAsCisgICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwKKyAgICAzLDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTI0LAorICAgIDAsMCwxMzEsMiwwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLAorICAgIDEsMTIyLDEwMCw3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLAorICAgIDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMywyMTgsNSwxMTUsMTE3LDExMiwxMDEsMTE0LAorICAgIDExNCwyMDQsMCwwLDAsMTE0LDE4NywwLDAsMCw0MSwyLDExNCwxMDAsMCwwLAorICAgIDAsMTE0LDExOSwwLDAsMCw0MSwxLDExNCwyMDUsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NywwLDAsMCwyMywzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDEwLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsODMsCisgICAgNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLAorICAgIDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw0MSwxLAorICAgIDExNCwzNSwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKKyAgICAxMTQsMTUxLDAsMCwwLDM1LDMsMCwwLDExNSwyLDAsMCwwLDAsMywKKyAgICAxMjIsMjMsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAorICAgIDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSw0MiwKKyAgICAwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDAsMSwwLDEzMSwKKyAgICAyLDAsMTQzLDE3LDAsMTI1LDIsMCwxMjQsMiwwLDEwNiwyLDAsMTMxLDAsCisgICAgMCw4Myw4NywxMDAsMiwwLDgxLDgyLDg4LDEwMCwyLDAsODMsNDEsMywxMjIsCisgICAgMzksODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsOTcsMTE2LDk3LAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTUsMzIsMTE0LDk3LAorICAgIDExOSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsNDYsMjE4LDEsMTE0LDc4LDQxLDMsMTE0LDQ5LAorICAgIDAsMCwwLDExNCw1MCwwLDAsMCw5MCw0LDExNCwxMDEsOTcsMTAwLDQxLDMsCisgICAgMTE0LDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDU0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTQsCisgICAgMCwwLDAsNDAsMywwLDAsMTE1LDQsMCwwLDAsMCwyLDIxLDEsCisgICAgMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiwKKyAgICA5NSwxMDAsOTcsMTE2LDk3LDQxLDExLDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsCisgICAgMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE3OSwwLDAsMCwKKyAgICAxMTQsMjA3LDAsMCwwLDExNCwyMDksMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsCisgICAgMTg3LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwyMDUsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDIwNCwwLDAsMCw1LDMsMCwwLDExNSwxNCwwLAorICAgIDAsMCwxMiwzLDYsMiwxMiw2LDEyLDQsMTIsMywyNCwxMiwxOCw1LAorICAgIDExNCwyMDQsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsNjQsMCwwLDAsMTAxLAorICAgIDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLAorICAgIDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsCisgICAgMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTAwLAorICAgIDgsMCwxMDAsOSwwLDEzMiwwLDEsOTAsNiwwLDEwMCwxMCwwLDgzLDQxLAorICAgIDExLDIxOCwxNiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDEyMiw2Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICA4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExNywxMTUsMTA1LAorICAgIDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LDExNiwKKyAgICAxMDEsMTA5LDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLAorICAgIDQsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsCisgICAgMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwxMjQsMiwwLDEwNiwKKyAgICAxLDAsMTAwLDIsMCwxMjQsMiwwLDEwNiwyLDAsMTA1LDIsMCw4Myw0MSwKKyAgICAzLDEyMiwzMyw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsCisgICAgMTE2LDk3LDEwMCw5NywxMTYsOTcsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsNDYsMTE0LDEyNiwwLDAsMCwxMTQsMTI3LDAsMCwwLDQxLDMsCisgICAgMTE0LDM5LDAsMCwwLDIxOCw4LDExNSwxMTYsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSw5MCwKKyAgICA3LDExNSwxMTYsOTUsMTE1LDEwNSwxMjIsMTAxLDQxLDMsMTE0LDEwMCwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTkxLDAsMCwwLDUwLDMsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsMiwxMiwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLDAsMCwwLDAsCisgICAgNSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsCisgICAgMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsNCwwLDEyNCwwLDAsCisgICAgMTA2LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsNCwwLDEzMSwKKyAgICAyLDEsODMsNDEsMiw3OCwyMTgsNSw5NSwxMDksMTExLDEwMCwxMDEsNDEsMiwxMTQsCisgICAgOTcsMCwwLDAsMTE0LDE5MiwwLDAsMCw0MSw1LDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDkwLDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LAorICAgIDQyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwxOTMsMCwwLDAsNTUsMywwLDAsMTE1LDQsMCwwLAorICAgIDAsMCwyLDEyLDEsMTIyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE0LDAsMCwwLDEwNSwxODIsMSwwLAorICAgIDAsOTksMywwLDAsMCwxLDAsMCwwLDksMCwwLDAsMTcsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDYyLDEsMCwwLDExNiwwLDAsMTI0LDEsCisgICAgMCwxMzEsMSwwLDkyLDIsMCwxMjUsNCwwLDEyNSw1LDAsMTAzLDAsMCwKKyAgICAxMjUsNiwwLDEyMCw1NCwwLDEyNCw0LDAsMTE0LDgwLDAsMTE2LDEsMCwxMjQsCisgICAgNCwwLDEzMSwxLDAsMTIsMTE0LDgwLDAsMTE2LDAsMCwxMjQsNCwwLDEzMSwKKyAgICAxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDcsMCwxMjQsNiwwLDEwNiwyLAorICAgIDAsMTI0LDcsMCwxMzEsMSwwLDEsMTEzLDI3LDAsODcsMTIwLDEzNSwwLDExNiwKKyAgICAzLDAsMTI0LDYsMCwxMzEsMSwwLDY4LDkzLDEyMSwwLDEyNSw3LDAsMTE2LAorICAgIDQsMCwxMjQsNCwwLDEyNCw3LDAsMTMxLDIsMCwxMjUsNCwwLDEyMSwxNywKKyAgICAwLDExNiw1LDAsMTA2LDYsMCwxMjQsNCwwLDEzMSwxLDAsMSw4NywxMTMsCisgICAgOTQsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LDE1NSwwLDEsMSwxLDExOSwKKyAgICA5NCwwLDg5LDExMyw5NCwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMjE0LDAsCisgICAgMSwxMjUsOCwwLDEsMTIyLDI4LDAsMTE2LDksMCwxMDYsMTAsMCwxMDAsMSwKKyAgICAwLDEyNCw0LDAsMTI0LDgsMCwxMzEsMywwLDEsMTAwLDIsMCw4Myw4NywKKyAgICA4OSwxMDAsMiwwLDEwMCwyLDAsMTI1LDgsMCwxMjYsOCwwLDg4LDExMyw5NCwKKyAgICAwLDg4LDExMyw5NCwwLDg3LDEyMSwzNiwwLDExNiwxMSwwLDEyNCwxLDAsMTI0LAorICAgIDIsMCwxMjQsMywwLDEzMSwzLDAsMSwxMTYsOSwwLDEwNiwxMCwwLDEwMCwKKyAgICAzLDAsMTI0LDEsMCwxMzEsMiwwLDEsODcsMTEwLDU2LDAsNCwxMTYsOCwKKyAgICAwLDEwNywxMCwwLDExNCw1NywxLDEsMTI1LDgsMCwxLDEyMiwyNCwwLDExNiwKKyAgICA5LDAsMTA2LDEwLDAsMTAwLDEsMCwxMjQsMSwwLDEyNCw4LDAsMTMxLDMsCisgICAgMCwxLDg3LDg5LDEwMCwyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsCisgICAgODgsMTEwLDEsMCw4OCwxMDAsMiwwLDgzLDQxLDQsMTIyLDI3LDg3LDExNCwxMDUsCisgICAgMTE2LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMjIsMjcsOTksMTExLDExNywxMDgsMTAwLDMyLAorICAgIDExMCwxMTEsMTE2LDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw1OCwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSw3OCwxMjIsMTIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDEwMCwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSw0MSwxMiwxMTQsMzgsMCwwLDAsMTE0LDQ2LDAsMCwwLAorICAgIDExNCwxNTcsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsCisgICAgMywwLDAsMCw5MCw1LDEwOSwxMDcsMTAwLDEwNSwxMTQsMjE4LDE1LDcwLDEwNSwxMDgsCisgICAgMTAxLDY5LDEyMCwxMDUsMTE1LDExNiwxMTUsNjksMTE0LDExNCwxMTEsMTE0LDExNCw0MCwwLDAsCisgICAgMCwxMTQsMTE0LDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDU1LDAsMCwwLAorICAgIDQxLDksMTE0LDEwMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwKKyAgICAwLDExNCwyMTQsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwxMTQsOTQsCisgICAgMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwxMTQsMTk1LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDExNCwxOTIsMCwwLDAsNjAsMywwLDAsMTE1LDQyLDAsMCwwLDAsCisgICAgMiwxOCwxLDYsMiwyMiwxLDE4LDEsMTcsMiwxOSwxLDE1LDEsMywKKyAgICAxLDE3LDEsMTMsMiw3LDEsMTgsMyw5LDEsMTAsMSwyNywxLDMsCisgICAgMSwxNiwxLDIwLDEsMTgsMiwxMiwxLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LAorICAgIDEwMCw5NywxMTYsOTcsNzgsNDEsNywxMTQsMTA1LDAsMCwwLDExNCwxMDQsMCwwLAorICAgIDAsMTE0LDEwNiwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxOTEsMCwwLDAsCisgICAgMTE0LDE5MywwLDAsMCwxMTQsMTkyLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTIsCisgICAgMCwwLDAsNDYsMywwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsCisgICAgMTIsNSwxMiw1LDExNCwyMTIsMCwwLDAsOTksMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsCisgICAgMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLAorICAgIDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwKKyAgICAwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLAorICAgIDgzLDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLAorICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsNzYsMCwKKyAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwKKyAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwKKyAgICAxMTYsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTI0LAorICAgIDIsMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwwLDEwMCwxLAorICAgIDAsMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiw4Myw0MSw0LAorICAgIDc4LDExNCw5OCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDg5LDAsMCwwLAorICAgIDQxLDQsMTE0LDE1MSwwLDAsMCwxMTQsMTk0LDAsMCwwLDExNCwxMzUsMCwwLAorICAgIDAsMTE0LDE0MSwwLDAsMCw0MSw1LDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwyMDMsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMTE0LDE4MSwwLDAsMCw5NSwzLDAsMCwxMTUsOCwwLDAsMCwwLDEsCisgICAgMTUsMSwxNSwxLDI0LDEsMTIyLDI5LDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLAorICAgIDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAorICAgIDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLAorICAgIDEsMCw4Myw0MSwyLDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwKKyAgICAxMTAsMTAxLDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLAorICAgIDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwKKyAgICA0LDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKKyAgICAxOTYsMCwwLDAsMTAxLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsCisgICAgMzEsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA3OCw0MSw2LDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsCisgICAgMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTk2LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDExNCwyMTcsMCwwLDAsOTEsMywwLDAsMTE1LDYsCisgICAgMCwwLDAsMTIsMiw2LDIsMTIsNiwxMTQsMjE3LDAsMCwwLDk5LDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsCisgICAgMCwwLDAsMTE1LDEzNiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwKKyAgICAwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsCisgICAgMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCisgICAgNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwKKyAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsCisgICAgMTMyLDAsMCw5MCw4LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsMCw5MCwKKyAgICA5LDAsMTAwLDE0LDAsMTAwLDE1LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxNiwKKyAgICAwLDEwMCwxNywwLDEzMiwwLDAsOTAsMTEsMCwxMDEsMTIsMCwxMDAsMTgsMCwKKyAgICAxMDAsMTksMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTMsMCwxMDAsMjAsMCw4MywKKyAgICA0MSwyMSwyMTgsMTksNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDkzLDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwKKyAgICAxMDIsMTExLDExNCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICA5OSwxMTEsMTEwLDExNSwxMTYsMTE0LDExNyw5OSwxMTYsMTExLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwKKyAgICAxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMTksMTExLDExNCwxMDcsMzIsCisgICAgMTE5LDEwNSwxMTYsMTA0LDMyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsOTksMywwLDAsMCwwLDAsMCwwLDMsCisgICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjIsMCwwLDAsCisgICAgMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsCisgICAgMSwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCw5OCwwLDAsMCwKKyAgICAxMTQsMzUsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLDExNCw5OCwwLDAsCisgICAgMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTgsMywwLDAsMTE1LDQsCisgICAgMCwwLDAsMCwxLDksMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCisgICAgMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LAorICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwKKyAgICAwLDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsMCwxMTEsMzMsCisgICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywyLDAsCisgICAgODMsNDEsMSw3OCw0MSwyLDExNCwyMDUsMCwwLDAsMTE0LDExMSwwLDAsMCwKKyAgICA0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjA3LDAsMCwwLAorICAgIDEyMiwzLDAsMCwxMTUsNCwwLDAsMCwwLDEsMTgsMSwxMjIsMjYsNjksCisgICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwKKyAgICAwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDExNiwKKyAgICAwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsMSw3OCwKKyAgICA0MSwzLDExNCwyMDgsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCwzNSwwLDAsCisgICAgMCw0MSwxLDExNCwxMDAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDIwOSwwLDAsMCwxMjYsMywwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKKyAgICAxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsCisgICAgOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw1MCwwLDAsMCwxMTYsCisgICAgMCwwLDEwNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMTMxLDIsCisgICAgMCwxMjUsMiwwLDExNiwwLDAsMTA2LDQsMCwxMDAsMSwwLDEyNCwxLDAsCisgICAgMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTMxLDMsMCwxLDEyNCwyLDAsCisgICAgODMsNDEsMiwxMjIsMzgsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDExMCwzMiwxMTcsCisgICAgMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwKKyAgICAxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDM4LDEwMSwxMjAsMTE2LAorICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKKyAgICAxMTQsMTI1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDQxLDcsMTE0LDExNCwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwKKyAgICAxMzksMCwwLDAsOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwMCwxMjEsMTEwLAorICAgIDk3LDEwOSwxMDUsOTksMTE0LDEyOSwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDQxLDMsMTE0LDEwMCwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwKKyAgICAxODQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMTE0LDE4MCwwLDAsMCwxMjksMywwLDAsMTE1LDEwLDAsMCwKKyAgICAwLDAsMiw2LDEsMTUsMSw5LDEsMTYsMSwxMjIsMzMsNjksMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDQ4LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMTYsMiwKKyAgICAwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMiwwLDEsMTE2LDAsMCwxMDYsNCwKKyAgICAwLDEwMCwxLDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwKKyAgICAxMzEsMywwLDEsMTAwLDIsMCw4Myw0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwKKyAgICAxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwKKyAgICAxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLAorICAgIDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwKKyAgICAxMjUsMzIsMTAxLDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSw3OCw0MSw3LDExNCwxMTQsMCwwLDAsMTE0LDE4MiwwLDAsCisgICAgMCwxMTQsMTM5LDAsMCwwLDkwLDEyLDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLAorICAgIDk3LDEwOSwxMDUsOTksMTE0LDEyOSwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODUsCisgICAgMCwwLDAsMTM3LDMsMCwwLDExNSw2LDAsMCwwLDAsMiwxOSwxLAorICAgIDksMSwxMjIsMzEsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNCwwLDAsMCwzLDAsMCwwLDExNSw0OCwwLDAsMCwxMTYsMCwwLAorICAgIDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDEwMCwxLDAsMjUsMTM3LDAsMCwKKyAgICAxMTYsMiwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LAorICAgIDAsMCwxMTYsMywwLDY4LDEzMSwxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiwKKyAgICA0OSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywKKyAgICAxMDEsNDYsMTE0LDI5LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDQsMCwwLDAsNTEsMCwwLDAsMTE1LDMxLDAsMCwKKyAgICAwLDEyNCwwLDAsOTMsMjEsMCwxMjUsMSwwLDEzNiwwLDAsMTAwLDAsMCwKKyAgICAxMjQsMSwwLDIzLDEwNywyLDAsODYsMSwxMTMsMywwLDEwMCwxLDAsODMsCisgICAgNDEsMiwxMTQsMTc5LDAsMCwwLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LAorICAgIDIyLDAsMCwwLDIxOCw2LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDQxLDEsMjE4LDksCisgICAgMTAyLDEwNSwxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNDYsMywKKyAgICAwLDAsMTE1LDIsMCwwLDAsNiwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsCisgICAgMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsCisgICAgMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwKKyAgICAxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDM4LAorICAgIDAsMCwwLDExNCwzNSwwLDAsMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSwKKyAgICA4OCw4NCw2OSw3OCw4Myw3Myw3OSw3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSwKKyAgICA4Myw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCw0MSwxLDExNCwyMjAsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE1MywKKyAgICAwLDAsMCwxNDMsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE5LDEsCisgICAgMTgsMSwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLAorICAgIDQxLDIsMTIyLDYzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsCisgICAgOTcsMTE1LDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTksMTE0LAorICAgIDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLAorICAgIDk5LDExNiw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsCisgICAgMTE0LDExOSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwxMTQsMTgxLDAsMCwwLDE0OSwzLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDIsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKKyAgICAxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4MywKKyAgICA0MSwyLDEyMiw1Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLAorICAgIDk3LDExNSwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLAorICAgIDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTYsMCwwLDAsMTUzLAorICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICA3LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwKKyAgICAxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwKKyAgICAxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLDEsMTE0LDM1LDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNTEsMCwwLDAsCisgICAgMTU3LDMsMCwwLDExNSwyLDAsMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LAorICAgIDExNCwxMDUsMCwwLDAsMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwKKyAgICAxMDcsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMjA3LDAsMCwwLDExNCwyMDksCisgICAgMCwwLDAsMTE0LDE4MCwwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxNTMsMCwKKyAgICAwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxMTYsMCwwLAorICAgIDAsMTE0LDE1MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjE4LDAsMCwwLDExMCwKKyAgICAzLDAsMCwxMTUsMjAsMCwwLDAsMTIsNiw2LDIsMTIsNCwxMiw0LAorICAgIDEyLDMsMTIsOCwxMiw2LDEyLDYsMTIsNCwxMiw0LDExNCwyMTgsMCwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsMTQyLDAsMCwwLDEwMSwwLDAsOTAsMSwKKyAgICAwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsCisgICAgMTAwLDMsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLAorICAgIDAsMCw5MCw1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwKKyAgICAwLDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwKKyAgICAxMDAsMTEsMCwxMzIsMCwwLDkwLDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsCisgICAgMCwwLDkwLDksMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLAorICAgIDAsMTAwLDE2LDAsMTAwLDE3LDAsMTMyLDAsMCw5MCwxMSwwLDEwMCwxOCwwLAorICAgIDEwMCwxOSwwLDEzMiwwLDAsOTAsMTIsMCwxMDAsMjAsMCwxMDAsMjEsMCwxMzIsCisgICAgMCwwLDkwLDEzLDAsMTAwLDIyLDAsODMsNDEsMjMsMjE4LDE0LDk1LDc4LDk3LAorICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw5NywzOCwxLDAsMCwKKyAgICA4MiwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDExNSwzMiw5NywzMiwxMTAsOTcsMTA5LAorICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzksMTE1LAorICAgIDMyLDExMiw5NywxMTYsMTA0LDQ2LDMyLDMyLDczLDExNiwzMiwxMTcsMTE1LDEwMSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAsCisgICAgMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsMTA1LDExNiwxMTUsMzIsCisgICAgMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiw5NywKKyAgICAxMTAsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTYsCisgICAgMzIsMTA4LDExMSwxMTEsMTA3LDExNSwzMiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsMzksMTE1LDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDk1LDQ2LDMyLDMyLDg3LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwzMiwKKyAgICA5OSwxMDQsOTcsMTEwLDEwMywxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTEsMTE5LDExMCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCisgICAgMTE1LDMyLDExNCwxMDEsOTksMTExLDEwOSwxMTIsMTE3LDExNiwxMDEsMTAwLDQ0LDEwLDMyLDMyLAorICAgIDMyLDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsNDYsMzIsMzIsNzAsMTExLDExNCwzMiwxMTYsMTExLDExMiw0NSwxMDgsMTAxLAorICAgIDExOCwxMDEsMTA4LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwxMDUsMTE1LDMyLDExNSwxMjEsMTE1LAorICAgIDQ2LDExMiw5NywxMTYsMTA0LDQ2LDk5LDQsMCwwLDAsMCwwLDAsMCw0LAorICAgIDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDUyLDAsMCwwLAorICAgIDEyNCwxLDAsMTI0LDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsMCwwLDk1LAorICAgIDEsMCwxMTYsMiwwLDEyNCwwLDAsMTA2LDMsMCwxMzEsMCwwLDEzMSwxLAorICAgIDAsMTI0LDAsMCw5NSw0LDAsMTI0LDMsMCwxMjQsMCwwLDk1LDUsMCwKKyAgICAxMDAsMCwwLDgzLDQxLDEsNzgsNDEsNiwyMTgsNSw5NSwxMTAsOTcsMTA5LDEwMSwKKyAgICAyMTgsNSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsOTMsMCwwLDAsMjE4LDE2LDk1LDEwMywKKyAgICAxMDEsMTE2LDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsMjE4LDE3LAorICAgIDk1LDEwOCw5NywxMTUsMTE2LDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwKKyAgICAxMDQsMjE4LDEyLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQxLAorICAgIDQsMTE0LDEwMCwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDM1LDAsMCwwLAorICAgIDIxOCwxMSwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc5LDAsMCwKKyAgICAwLDE3MCwzLDAsMCwxMTUsOCwwLDAsMCwwLDEsOSwxLDksMSwKKyAgICAyMSwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LAorICAgIDExNiwxMDQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDUzLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEwMCwxLAorICAgIDAsMTMxLDEsMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsCisgICAgMTI0LDIsMCwxMDAsMiwwLDEwNywyLDAsMTE0LDQzLDAsMTAwLDYsMCw4MywKKyAgICAxMjQsMSwwLDEwMCw1LDAsMTAyLDIsMCw4Myw0MSw3LDEyMiw2Miw4MiwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwxMDIsCisgICAgMzIsNDAsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NSwKKyAgICAxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywxMTYsCisgICAgMTA0LDQ1LDk3LDExNiwxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw1OCwwLDAsCisgICAgMCwxMTQsMzAsMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDM1LDAsMCwwLAorICAgIDkwLDgsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsMTIxLAorICAgIDExNSwxMjIsNCwxMTIsOTcsMTE2LDEwNCw0MSwyLDExNCwyMjUsMCwwLDAsMTE0LDMyLAorICAgIDAsMCwwLDQxLDQsMTE0LDEwMCwwLDAsMCwxMTQsMjE2LDAsMCwwLDIxOCwKKyAgICAzLDEwMCwxMTEsMTE2LDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiwKKyAgICA5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LAorICAgIDE3NiwzLDAsMCwxMTUsOCwwLDAsMCwwLDIsMjcsMSwxMiwyLDQsCisgICAgMywxMjIsMzgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsCisgICAgMTA0LDQ2LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDExMCw5NywxMDksMTAxLDExNSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwKKyAgICAwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTMxLDAsMCw5MiwyLDAsMTI1LAorICAgIDEsMCwxMjUsMiwwLDExNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLAorICAgIDAsMjUsMTI0LDIsMCwxMzEsMiwwLDgzLDQxLDEsNzgsNDEsNCwxMTQsMjMyLAorICAgIDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDcsMCwwLDAsMjE4LDcsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQxLDMsMTE0LDEwMCwwLDAsMCw5MCwxOCwxMTIsCisgICAgOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywxMDksCisgICAgMTAxLDkwLDE0LDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsMTE0LDk1LDExMCw5NywxMDksCisgICAgMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDExNCwyMjcsMCwwLDAsMTg2LDMsMCwwLDExNSw0LDAsMCwwLDAsMSwKKyAgICAxOCwxLDEyMiwzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LAorICAgIDExNiwxMDQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKKyAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSwxMTgsMCwwLDAsMTE2LDAsMCwKKyAgICAxMjQsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwxLDAsMTI0LAorICAgIDEsMCwxMjQsMCwwLDEwNiwyLDAsMTA3LDMsMCwxMTQsMTExLDAsMTI0LDAsCisgICAgMCwxMDYsMywwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwwLDEzMSwyLDAsCisgICAgMTI1LDIsMCwxMjQsMiwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTAyLDAsMTI0LAorICAgIDIsMCwxMDYsNSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTAyLDAsMTI0LDIsCisgICAgMCwxMDYsNiwwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiw2LDAsMTI0LDAsMCwKKyAgICA5NSw3LDAsMTI0LDEsMCwxMjQsMCwwLDk1LDIsMCwxMjQsMCwwLDEwNiwKKyAgICA3LDAsODMsNDEsMSw3OCw0MSw4LDExNCw5MywwLDAsMCwxMTQsMjI3LDAsCisgICAgMCwwLDExNCwyMjgsMCwwLDAsMTE0LDIyOSwwLDAsMCwxMTQsMjI1LDAsMCwKKyAgICAwLDExNCwxMjAsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMjI2LDAsMCwwLAorICAgIDQxLDMsMTE0LDEwMCwwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LAorICAgIDExMiw5NywxMTYsMTA0LDExNCwxNTgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsMTA4LAorICAgIDk5LDExNywxMDgsOTcsMTE2LDEwMSwxOTAsMywwLDAsMTE1LDE2LDAsMCwwLDAsCisgICAgMiwxOCwxLDE1LDEsMjEsMywyNywxLDksMSwxMiwxLDksMSwxMjIsCisgICAgMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LAorICAgIDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwxNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCisgICAgMCwwLDEzMSwxLDAsODMsNDEsMSw3OCw0MSwyLDIxOCw0LDEwNSwxMTYsMTAxLAorICAgIDExNCwxMTQsMjM0LDAsMCwwLDQxLDEsMTE0LDEwMCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwKKyAgICAxMDUsMTE2LDEwMSwxMTQsOTUsOTUsMjAzLDMsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMSwxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsCisgICAgMTA0LDQ2LDk1LDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSw5OSwzLDAsMCwwLDAsCisgICAgMCwwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAxNywwLDAsMCwxMjQsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLAorICAgIDYwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwxLDExNCwyMjYsMCwwLDAsNDEsCisgICAgMywxMTQsMTAwLDAsMCwwLDIxOCw1LDEwNSwxMTAsMTAwLDEwMSwxMjAsMTE0LDM1LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDIxOCwxMSw5NSw5NSwxMTUsMTAxLDExNiwxMDUsMTE2LDEwMSwxMDksOTUsOTUsMjA2LDMsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjYsOTUsNzgsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDExNSwxMDEsMTE2LDEwNSwKKyAgICAxMTYsMTAxLDEwOSw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLAorICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMTYsCisgICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsODMsNDEsCisgICAgMSw3OCw0MSwyLDExNCwzMSwwLDAsMCwxMTQsMjM0LDAsMCwwLDQxLDEsCisgICAgMTE0LDEwMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSwyMDksMywwLAorICAgIDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMiw5NSw3OCw5NywxMDksMTAxLDExNSwKKyAgICAxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA4LDEwMSwxMTAsOTUsOTUsCisgICAgOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLAorICAgIDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLDIwLDk1LAorICAgIDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0MCwxMjMsMzMsCisgICAgMTE0LDEyNSw0MSw0MSwyLDExNCw0NywwLDAsMCwxMTQsMjI2LDAsMCwwLDQxLAorICAgIDEsMTE0LDEwMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsMjEyLAorICAgIDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LAorICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDExNCwxMDEsMTEyLAorICAgIDExNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKKyAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMSwwLAorICAgIDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDEwNyw2LDAsODMsNDEsMSw3OCwKKyAgICA0MSwxLDExNCwyMzQsMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLDIxOCw0LAorICAgIDEwNSwxMTYsMTAxLDEwOSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKKyAgICAwLDAsMCwyMTgsMTIsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsOTUsCisgICAgOTUsMjE1LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzgsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDk5LAorICAgIDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDIwLAorICAgIDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLAorICAgIDEsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMjYsMCwwLAorICAgIDAsMTE0LDE1NywwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDI0MSwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCisgICAgMCwxMTQsMTU3LDAsMCwwLDIxOCwzLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LAorICAgIDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLDE0LDExNCwxMDUsMCwwLDAsCisgICAgMTE0LDEwNCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LAorICAgIDE3OSwwLDAsMCwxMTQsMjMyLDAsMCwwLDExNCwyMjcsMCwwLDAsMTE0LDIzNCwKKyAgICAwLDAsMCwxMTQsMjM2LDAsMCwwLDExNCwyMzgsMCwwLDAsMTE0LDIzOSwwLAorICAgIDAsMCwxMTQsMjQwLDAsMCwwLDExNCwyNDIsMCwwLDAsMTE0LDE1NywwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNSwwLDAsMCwxMTQsMjI0LDAsMCwwLDE2MywzLDAsMCwxMTUsMjIsCisgICAgMCwwLDAsMTIsNSw2LDIsMTIsNiwxMiwxMCwxMiw0LDEyLDEzLDEyLAorICAgIDMsMTIsMywxMiwzLDEyLDMsMTIsMywxMTQsMjI0LDAsMCwwLDk5LDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsCisgICAgMCwwLDAsMTE1LDExOCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwKKyAgICAwLDkwLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCw5MCwzLDAsCisgICAgMTAxLDQsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCwxMzEsMSwwLDkwLAorICAgIDUsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDcsCisgICAgMCwxMDAsOCwwLDEzMiwwLDAsOTAsNywwLDEwMCw5LDAsMTAwLDEwLDAsCisgICAgMTMyLDAsMCw5MCw4LDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLDAsMCw5MCwKKyAgICA5LDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxNSwKKyAgICAwLDEwMCwxNiwwLDEzMiwwLDAsOTAsMTEsMCwxMDAsMTcsMCw4Myw0MSwxOCwKKyAgICAyMTgsMTYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNCwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMjUsMCwwLDAsMTE2LDAsMCwxMjQsCisgICAgMSwwLDEyNCwyLDAsMTI0LDMsMCwxMzEsMywwLDEyNCwwLDAsOTUsMSwKKyAgICAwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMjQsMCwwLDAsMTE0LAorICAgIDIyNiwwLDAsMCw0MSw0LDExNCwxMDAsMCwwLDAsMTE0LDk4LDAsMCwwLAorICAgIDExNCwzNSwwLDAsMCwxMTQsMjMwLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzksMCwwLDAsMjI0LDMsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwKKyAgICAxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEwMCwxLAorICAgIDAsMTA2LDAsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCw4Myw0MSwyLAorICAgIDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAorICAgIDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsCisgICAgMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksCisgICAgMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMTIyLDI1LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDMyLDQwLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDYyLAorICAgIDQxLDIsMTE0LDQ3LDAsMCwwLDExNCwxMDUsMCwwLDAsNDEsMiwxMTQsMTY0LAorICAgIDAsMCwwLDExNCwxODQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAorICAgIDExNCwxMDEsMTEyLDExNCwyMjcsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwKKyAgICAyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsODQsMTE0LAorICAgIDQsMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwxMTksMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LAorICAgIDE1MywwLDAsMCwyMzYsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwKKyAgICAyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiw3OCwxMTQsMzAsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwxMTksCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMTE0LDE5NiwwLDAsMCwyMzksMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDYsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLDAsMTAwLDEsMCwxMDAsCisgICAgMiwwLDEwMCwzLDAsMTAwLDQsMCwxMDAsNSwwLDEzMSwzLDEsODMsNDEsCisgICAgNiw3OCwxMTQsMzAsMCwwLDAsMTIyLDgsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsCisgICAgNjIsMTE0LDE4MywwLDAsMCwxMTQsMTk4LDAsMCwwLDg0LDQxLDEsMTE0LDE5OSwKKyAgICAwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTgxLAorICAgIDAsMCwwLDI0MiwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LAorICAgIDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsCisgICAgMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwKKyAgICAxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LAorICAgIDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDAsMCwKKyAgICAwLDAsMTE0LDE1OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNSwwLDAsMCwxMTQsMTgwLDAsMCwwLDI0NSwzLDAsMCwxMTUsCisgICAgMCwwLDAsMCwxMjIsMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsCisgICAgMCw4Myw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMCwwLDAsCisgICAgMCwxMTQsMTg0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDExNCwxODUsMCwwLDAsMjQ4LDMsMCwwLDExNSwyLAorICAgIDAsMCwwLDAsMSwxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LAorICAgIDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMzUsMCwwLDAsMTE2LDAsMCwKKyAgICAxMDYsMSwwLDEwMCwxLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwyLDAsMSwKKyAgICAxMTYsMCwwLDEwNiwzLDAsMTI0LDAsMCwxMjQsMSwwLDEzMSwyLDAsODMsCisgICAgNDEsMiwxMjIsOTgsNzYsMTExLDk3LDEwMCwzMiw5NywzMiwxMTAsOTcsMTA5LDEwMSwxMTUsCisgICAgMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwKICAgICAzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAogICAgIDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsCiAgICAgMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAogICAgIDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxODEsMCwwLDAsMTE0LDEyNywKLSAgICAwLDAsMCw0MSw0LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsCi0gICAgMzUsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNCwyLDAsMCwxMTUsOCwwLDAsMCwwLDcsCi0gICAgMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsCi0gICAgMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwxMTIsMCwwLDAsCi0gICAgMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LAotICAgIDE3NSwwLDAsMCwxMTQsMTc0LDAsMCwwLDExNCwxNzMsMCwwLDAsMjE4LDExLAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNzIsMCwwLDAsCi0gICAgMTE0LDE3OCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE2OCwwLDAsMCw2NCwyLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMTIsMiw2LDMsNiwzLDYsMiw2LDIsMTgsNywxOCwxNSwzLAotICAgIDEsMjEsMTUsMywxLDExNCwxNjgsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwxMDAsOSwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDgzLDQxLDExLDIxOCwxMyw5NSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLDgzLDY2LDk3LDExNSwKLSAgICAxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsCi0gICAgMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwKLSAgICAzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsODMsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsODgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwxLDAsMTAwLDEsMCwyNSwKLSAgICAxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCwxMDAsMywwLDI1LDEyNSwzLDAsMTI0LDEsMCwxMDYsMywwLDEwMCwKLSAgICAyLDAsMTMxLDEsMCwxMDAsNCwwLDI1LDEyNSw0LDAsMTI0LDMsMCwxMDAsCi0gICAgNSwwLDEwNywyLDAsMTExLDg3LDAsMTI0LDQsMCwxMDAsNSwwLDEwNywzLAotICAgIDAsODMsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwKLSAgICAxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwzMiw5OSwxMDQsMTAxLAotICAgIDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCi0gICAgMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LAotICAgIDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0NiwxMTIsCi0gICAgMTIxLDM5LDQ2LDExNCwyOSwwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDU5LDAsCi0gICAgMCwwLDExNCw1NiwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsCi0gICAgOTUsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMzQsMCwKLSAgICAwLDAsMTE0LDMyLDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LAotICAgIDAsMCwwLDExNCw5NCwwLDAsMCw5MCwxMywxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsMTA4LDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwxNTksMCwwLDAsMTMzLDIsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMywyNSwxLDIyLDEsMTksMSwxMjIsMjQsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsCi0gICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwKLSAgICAxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE0MSwyLDAsCi0gICAgMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LAotICAgIDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsCi0gICAgMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTQsMCwxMTYsMiwwLDEwMCwyLAotICAgIDAsMTA2LDMsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCwxMzEsMSwwLAotICAgIDEzMCwxLDAsMTE2LDQsMCwxMDYsNSwwLDExNiw2LDAsMTI0LDIsMCwxMjQsCi0gICAgMSwwLDEwNiw3LDAsMTMxLDMsMCwxLDEwMCwxLDAsODMsNDEsMywxMjIsCi0gICAgMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExOSwKLSAgICAxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0MCw0MSwzMiwxMTQsCi0gICAgMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsOCwyMTgsOCwxMDMsCi0gICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTEyLDAsMCwwLDExNCwxMDcsMCwwLAotICAgIDAsMTE0LDQ3LDAsMCwwLDExNCwxMjEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LAotICAgIDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LAotICAgIDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCwxMTgsMCwwLAotICAgIDAsNDEsMywxMTQsMTA4LDAsMCwwLDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNCwxNDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDE0NCwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDE4LDEsMTIsMSwKLSAgICA5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwKLSAgICAxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsCi0gICAgMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDEyMSwKLSAgICAwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxNTIsMiwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzgsNDEsOCwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLAotICAgIDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxNTksMCwwLDAsCi0gICAgMTE0LDE4NiwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxOTMsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE4NCwwLDAsMCwxMjgsMiwwLDAsMTE1LDEwLDAsMCwKLSAgICAwLDEyLDMsNiwyLDEyLDgsMTIsMywxMiw4LDExNCwxODQsMCwwLDAsCi0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLAotICAgIDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLAotICAgIDMsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDUsCi0gICAgMCwxMDAsNiwwLDEzMiwwLDAsOTAsNSwwLDEwMCw3LDAsMTAwLDgsMCwKLSAgICAxMzIsMCwwLDkwLDYsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwwLDAsOTAsCi0gICAgNywwLDEwMCwxMSwwLDEwMCwxOCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLAotICAgIDEsOTAsOCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLDAsOTAsOSwwLAotICAgIDEwMCwxNywwLDgzLDQxLDE5LDIxOCwxMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwwLAotICAgIDAsMTMwLDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE3OCw3OSwxMTIsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMDUsMTA5LDEwMSwzMiw0MCwKLSAgICA5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMTAsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLAotICAgIDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsMTE1LDMyLDczLDc5LDY5LAotICAgIDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LDEwMSwzMiwxMDQsOTcsMTEwLAotICAgIDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICAxLDIxOCw3LDczLDc5LDY5LDExNCwxMTQsMTExLDExNCw0MSwyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksCi0gICAgMTAxLDE1OCwyLDAsMCwxMTUsMiwwLDAsMCwwLDYsMTIyLDIzLDgzLDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLDAsMCwxMDAsCi0gICAgMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTA1LDEsCi0gICAgMCw4Myw0MSwyLDk3LDE3MCwxLDAsMCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LAotICAgIDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsCi0gICAgMTEwLDEwMywzMiw5NywzMiwxMDksMTAxLDExNiw5NywxMDAsOTcsMTE2LDk3LDMyLDEwMCwxMDUsCi0gICAgOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKLSAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMTE2LDExMSwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsNDAsMTE1LDExNiwxMTQsNDEsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgODAsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsMzIsMTA3LDEwMSwxMjEsMTE1LDU4LDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDEwOSwxMTYsMTA1LDEwOSwxMDEsMzksCi0gICAgMzIsNDAsMTA5LDk3LDExMCwxMDAsOTcsMTE2LDExMSwxMTQsMTIxLDQxLDMyLDEwNSwxMTUsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE2LDEwNSwxMDksMTAxLAotICAgIDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMTEsMTAyLDMyLDEwOCw5NywxMTUsMTE2LDMyLDExNSwxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsOTksCi0gICAgMTExLDEwMCwxMDEsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDU5LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDExNSwxMDUsMTIyLAotICAgIDEwMSwzOSwzMiw0MCwxMTEsMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsNDEsMzIsMTA1LDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTA1LDExMCwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDMyLDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsCi0gICAgMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTYsMTExLDMyLDExNCwxMDEsCi0gICAgOTcsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAxMTUsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsCi0gICAgMTE1LDMyLDczLDc5LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LAotICAgIDEwMSwzMiwxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTQsMTMzLDAsMCwwLDQxLDEsMTE0LDE5NiwwLDAsMCw0MSwKLSAgICAyLDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCwKLSAgICA5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTY2LDIsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMTEsMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDE2LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCw4Myw0MSwxLDEyMiwyMjgsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsCi0gICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsCi0gICAgMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LAotICAgIDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsCi0gICAgMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLAotICAgIDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwKLSAgICAxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwKLSAgICAxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LAotICAgIDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExMSwxMTQsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTE2LAotICAgIDExNCw5NywxMTAsMTE1LDEwMiwxMDEsMTE0LDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsCi0gICAgMTExLDExMCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwyMTgsOCwKLSAgICAxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQxLDQsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgOTAsMCwwLDAsOTAsMTAsOTksOTcsOTksMTA0LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICAxMTQsNTMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDE1LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsMTc5LDIsMCwwLDExNSwyLDAsMCwwLDAsOCwKLSAgICAxMjIsMjgsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk5LDMsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNTAsCi0gICAgNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsCi0gICAgMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsCi0gICAgOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwKLSAgICAxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLAotICAgIDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSw0NiwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsNCwwLDAsMCw0MSwzLDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTk4LDAsMCwKLSAgICAwLDE4OSwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjEsODMsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LAotICAgIDk3LDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDE2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxMDUsMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyMSwxOSwwLDEyNCwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCw4NywxMTAsNTgsMCwKLSAgICA0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxMjUsNCwwLDEsMTIyLAotICAgIDI2LDAsMTE2LDMsMCwxMDAsMSwwLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwKLSAgICAxLDEyNCw0LDAsMTMwLDIsMCw4Nyw4OSwxMDAsMywwLDEwMCwzLDAsMTI1LAotICAgIDQsMCwxMjYsNCwwLDg4LDExMCwxLDAsODgsMTE2LDQsMCwxMjQsMywwLAotICAgIDEzMSwxLDAsODMsNDEsNCwxMjIsNTIsNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLAotICAgIDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwxMjIsMzksMTE1LDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwKLSAgICAxMDgsMTAxLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsMTAxLDExNiw5NSwxMDAsCi0gICAgOTcsMTE2LDk3LDQwLDQxLDExNCwxMDYsMCwwLDAsNzgsNDEsNSwxMTQsMTU3LDAsCi0gICAgMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsMTE0LDQwLDAsMCwKLSAgICAwLDExNCwxMDcsMCwwLDAsMTE0LDE1NSwwLDAsMCw0MSw1LDExNCwxMDgsMCwKLSAgICAwLDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE1MywwLDAsCi0gICAgMCwyMTgsMywxMDEsMTIwLDk5LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDE5NiwyLDAsMCwxMTUsMTQsMCwwLDAsMCwyLDE1LDEsMywxLAotICAgIDE5LDEsMTgsMSw5LDEsMzEsMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsMTE0LDI5LDAsMCwKLSAgICAwLDk5LDMsMCwwLDAsMSwwLDAsMCw0LDAsMCwwLDksMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMSwwLDEwMCwyLDAsCi0gICAgMTAwLDMsMCwxMDAsNCwwLDEyNCwzLDAsMTMxLDQsMiw4Myw0MSw1LDEyMiwKLSAgICAxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwKLSAgICAzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLAotICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksMTAwLDk3LDExNiw5NywKLSAgICAzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsOTksOTcsMTEwLDMyLDk4LAotICAgIDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMTYsMTIxLDExMiwKLSAgICAxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsNDAsNDEsCi0gICAgMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTQsMTg5LDAsMCwwLDIxOCwxMiwxMDAsMTExLDExMCwxMTYsOTUsMTA1LAotICAgIDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw2OCwwLDAsMCw0MSwzLDExNCwxMjEsCi0gICAgMCwwLDAsMTE0LDE4OCwwLDAsMCwyMTgsNyw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LAotICAgIDEwMSw0MSw0LDExNCwxMDgsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCwzNSwwLAotICAgIDAsMCwxMTQsMjAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNiwKLSAgICAxMTEsOTUsOTksMTExLDEwMCwxMDEsMjA2LDIsMCwwLDExNSw0LDAsMCwwLDAsCi0gICAgNSwyMSwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSw5OSwxMTEsMTAwLDEwMSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwwLDAsNDMsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDE3NCwxLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwxMjUsMywwLDEyMSwKLSAgICAxNiwwLDExNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw0LDAsODcsMTEwLAotICAgIDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2MywwLDEsMSwxLDEwMCwKLSAgICAxLDAsMTI1LDQsMCw4OSwxMTAsMjAyLDAsODgsMTIxLDE5LDAsMTI0LDAsMCwKLSAgICAxMDYsMywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsNSwwLDg3LDExMCwxOCwwLAotICAgIDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsMTAzLDAsMSwxLDEsODksMTEwLDE2MiwKLSAgICAwLDg4LDExNiw1LDAsMTI0LDUsMCwxMDAsMiwwLDI1LDEzMSwxLDAsMTI1LAotICAgIDMsMCwxMjEsMTksMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDQsMCwxMzEsMSwKLSAgICAwLDEyNSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCwKLSAgICAxNTksMCwxLDEsMSw4OSwxMTAsMTA2LDAsODgsMTIxLDM0LDAsMTE2LDgsMCwKLSAgICAxMjQsNiwwLDEwMCwzLDAsMTI0LDUsMCwxMDAsNCwwLDEyNCwxLDAsMTAwLAotICAgIDUsMCwxMjQsNCwwLDEzMSwxLDMsMTI1LDcsMCw4NywxMTAsMjQsMCw0LAotICAgIDExNiw5LDAsMTE2LDEwLDAsMTAyLDIsMCwxMDcsMTAsMCwxMTQsMjIwLDAsMSwKLSAgICAxLDEsODksMTEwLDQ1LDAsODgsMTE2LDExLDAsMTAwLDYsMCwxMjQsNCwwLAotICAgIDEyNCwyLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEyNCw3LDAsMTAwLDQsMCwKLSAgICAxMjQsMSwwLDEwMCw3LDAsMTI0LDQsMCwxMDAsOCwwLDEyNCwyLDAsMTMxLAotICAgIDEsMyw4MywxMjQsMCwwLDEwNiw2LDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwKLSAgICA4LDAsMTI0LDAsMCwxMDYsMTMsMCwxMjQsOCwwLDEyNCwyLDAsMTMxLDIsCi0gICAgMCwxMjUsOSwwLDExNiwxMSwwLDEwMCw5LDAsMTI0LDIsMCwxMzEsMiwwLAotICAgIDEsMTE2LDE0LDAsMTA2LDE1LDAsMTIsMTE0LDE3MCwxLDEyNCw0LDAsMTAwLDEsCi0gICAgMCwxMDcsOSwwLDExNCwxNzAsMSwxMjQsMywwLDEwMCwxLDAsMTA3LDksMCwKLSAgICAxMTQsMTcwLDEsMTE2LDE2LDAsMTI0LDksMCwxMjQsMywwLDExNiwxNywwLDEyNCwKLSAgICA4LDAsMTMxLDEsMCwxMzEsMywwLDEyNSw2LDAsMTIxLDM2LDAsMTI0LDAsCi0gICAgMCwxMDYsMTgsMCwxMjQsMiwwLDEyNCw0LDAsMTI0LDYsMCwxMzEsMywwLAotICAgIDEsMTE2LDExLDAsMTAwLDEwLDAsMTI0LDQsMCwxMzEsMiwwLDEsODcsMTEwLAotICAgIDE4LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCwxNjksMSwxLDEsMSw4OSwKLSAgICAxMTAsMSwwLDg4LDEyNCw5LDAsODMsNDEsMTEsMTIyLDE5MCw2NywxMTEsMTEwLDk5LAotICAgIDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLAotICAgIDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTE0LDEwMSwxMTMsMTE3LAotICAgIDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMzIsCi0gICAgMTE2LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLAotICAgIDEwMCw0NiwzMiw4NCwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw0NCwzMiwxMTUsMTAxLAotICAgIDExNiw5NSwxMDAsOTcsMTE2LDk3LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5NywxMDgsMTE1LDExMSwKLSAgICAzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsMTMzLDAsMCwwLAotICAgIDExNCwxMzgsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTIyLAotICAgIDEzLDEyMywxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMjMsMTI1LDExNCw4OSwKLSAgICAwLDAsMCwxMTQsOTAsMCwwLDAsMTIyLDE5LDk5LDExMSwxMDAsMTAxLDMyLDExMSwKLSAgICA5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDEyNSwxMjIsMTAsMTE5LAotICAgIDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwxOSwxMTQsMTU3LDAsMCwwLAotICAgIDExNCw3OSwwLDAsMCwxMTQsNjYsMCwwLDAsMTE0LDE5NywwLDAsMCwxMTQsCi0gICAgMTk1LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjAwLDAsMCwwLDExNCw0MCwKLSAgICAwLDAsMCwxMTQsMTQxLDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEzNiwwLAotICAgIDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDIwNiwwLDAsCi0gICAgMCwxMTQsNywwLDAsMCwyMTgsMTksMTAwLDExMSwxMTAsMTE2LDk1LDExOSwxMTQsMTA1LAotICAgIDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDE1MCwwLDAsMCwKLSAgICAxMTQsMzEsMCwwLDAsMTE0LDE5OSwwLDAsMCw0MSwxMCwxMTQsMTA4LDAsMCwKLSAgICAwLDExNCwxMjYsMCwwLDAsMTE0LDkwLDAsMCwwLDExNCwxMzksMCwwLDAsCi0gICAgMTE0LDg5LDAsMCwwLDIxOCwyLDExNSwxMTYsMTE0LDUzLDAsMCwwLDIxOCwxMCwKLSAgICA5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTAwLDk3LDExNiw5NywxMTQsMTUzLDAsMCwwLDkwLAotICAgIDExLDk5LDExMSwxMDAsMTAxLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsMCwwLAotICAgIDIxNCwyLDAsMCwxMTUsNzgsMCwwLDAsMCw3LDE1LDEsNiwxLDMsCi0gICAgMSwxNiwxLDEzLDEsMTEsMiwzLDEsMTksMSwxMywxLDUsMiwxNiwKLSAgICAxLDMsMSwxOSwxLDEzLDEsNSwyLDMsMSw5LDEsMTIsMSwxMywKLSAgICAxLDE5LDEsNSwyLDksMSw3LDEsMTUsMSw2LDEsNywxLDE1LAotICAgIDEsMTgsMSwxMywxLDIyLDEsMTIsMSw5LDEsMTUsMSwzLDEsMTksCi0gICAgMSwxNywxLDEzLDEsNSwxLDEyMiwyMSw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDc4LDExNCwKLSAgICA4NywwLDAsMCw0MSwxMCwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5OSwwLDAsMCwxMTQsMTk4LDAsMCwwLDExNCwyMDIsMCwwLDAsMTE0LDIwNiwKLSAgICAwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTQsMCwwLAotICAgIDAsMTU2LDIsMCwwLDExNSwxNCwwLDAsMCwxMiwyLDEyLDgsMTIsMTMsCi0gICAgMTIsMTAsMTIsNywxMiwxMCwxOCw4LDExNCwxOTQsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwwLDAsCi0gICAgMCwwLDExNSwxMTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCwKLSAgICA5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwKLSAgICAwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsCi0gICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAxLDcsMCwKLSAgICAxMzUsMCwwLDEwMiwxLDAsMTAwLDgsMCwxMDAsOSwwLDEzNCwwLDAsMTMxLAotICAgIDEsMCw5MCw4LDAsMTAxLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwKLSAgICAwLDEzMSwxLDAsOTAsOSwwLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsCi0gICAgOTAsMTAsMCwxMzUsMCwwLDgzLDQxLDE0LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExOSwxMDQsCi0gICAgMTA1LDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LDExMSwxMTYsMTExLDk5LAotICAgIDExMSwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDEwLAotICAgIDMyLDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsMTAxLDQ2LDk5LDMsCi0gICAgMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLAotICAgIDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMSwwLDgzLDQxLDIsCi0gICAgMTIyLDc1LDY3LDk3LDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICAzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw3OCw0MSwyLAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDMsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg1LDAsMCwwLDE1LAotICAgIDMsMCwwLDExNSw0LDAsMCwwLDAsMyw5LDEsMTIyLDE5LDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsCi0gICAgOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEyNCwxLDAsMTA2LDAsMCwxMDcsMiwwLDExMSwzMywwLDEyNCwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LDIsMCw4Myw0MSwxLDc4LAotICAgIDQxLDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsOTUsMTE0LDExOCwwLAotICAgIDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMjE4LDUsMTExLDExNiwxMDQsMTAxLDExNCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsCi0gICAgNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDIxLDMsMCwwLDExNSw0LDAsMCwwLAotICAgIDAsMSwxOCwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsMSw3OCw0MSwzLAotICAgIDIxOCw0LDEwNCw5NywxMTUsMTA0LDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwKLSAgICAyNSwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDE5LDcwLDEwNSwxMDgsCi0gICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwKLSAgICAwLDMsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLDAsMTE2LDEsMCwKLSAgICAxMjQsMCwwLDEzMSwyLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwxLDAsODMsCi0gICAgNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwKLSAgICAxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwKLSAgICAxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwzLDIxOCw1LDExNSwxMTcsMTEyLDEwMSwKLSAgICAxMTQsMTE0LDIxMCwwLDAsMCwxMTQsMTkzLDAsMCwwLDQxLDIsMTE0LDEwOCwwLAotICAgIDAsMCwxMTQsMTI2LDAsMCwwLDQxLDEsMTE0LDIxMSwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTkzLDAsMCwwLDI4LDMsMCwKLSAgICAwLDExNSwyLDAsMCwwLDAsMTAsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICA4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsCi0gICAgMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLAotICAgIDEsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwxNTcsMCwwLDAsNDAsMywwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAzLDEyMiwyMyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDk5LDIsMCwwLDAsMCwKLSAgICAwLDAsMCwzLDAsMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwMCwxLDAsCi0gICAgMTMxLDIsMCwxNDMsMTcsMCwxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMzEsCi0gICAgMCwwLDgzLDg3LDEwMCwyLDAsODEsODIsODgsMTAwLDIsMCw4Myw0MSwzLAotICAgIDEyMiwzOSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsCi0gICAgOTcsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExMiw5NywxMTYsMTA0LDMyLDk3LDExNSwzMiwxMTQsCi0gICAgOTcsMTE5LDMyLDk4LDEyMSwxMTYsMTAxLDExNSw0NiwyMTgsMSwxMTQsNzgsNDEsMywxMTQsCi0gICAgNDksMCwwLDAsMTE0LDUwLDAsMCwwLDkwLDQsMTE0LDEwMSw5NywxMDAsNDEsCi0gICAgMywxMTQsMTA4LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNTQsMCwwLDAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDM4LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksCisgICAgMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsCisgICAgMTE5LDEwNSwxMTYsMTA0LDMyLDExMiw5NywxMTYsMTA0LDMyLDEyMywzMywxMTQsMTI1LDQxLDQsCisgICAgMTE0LDExNCwwLDAsMCwxMTQsMTI5LDAsMCwwLDExNCwyMjYsMCwwLDAsMTE0LAorICAgIDE4NiwwLDAsMCw0MSwyLDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwKICAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjAwLDAsMCwwLDQ1LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwyMSwKLSAgICAxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSwxMSwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwKLSAgICAwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxODUsMCwwLAotICAgIDAsMTE0LDIxMywwLDAsMCwxMTQsMjE1LDAsMCwwLDExNCwxMjMsMCwwLDAsCi0gICAgMTE0LDE5MywwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMjExLDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDExNCwyMTAsMCwwLDAsMTAsMywwLDAsMTE1LDE0LAotICAgIDAsMCwwLDEyLDMsNiwyLDEyLDYsMTIsNCwxMiwzLDI0LDEyLDE4LAotICAgIDUsMTE0LDIxMCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSw2NCwwLDAsMCwKLSAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAotICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LDAsMTAwLDcsMCwKLSAgICAxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMSw5MCw2LDAsMTAwLDEwLDAsODMsCi0gICAgNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE3LDExNSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsCi0gICAgMTE2LDEwMSwxMDksNDYsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTE2LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwwLDEyNCwyLDAsCi0gICAgMTA2LDEsMCwxMDAsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDUsMiwwLDgzLAotICAgIDQxLDMsMTIyLDMzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAotICAgIDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMTQsMTMzLDAsMCwwLDExNCwxMzQsMCwwLDAsNDEsCi0gICAgMywxMTQsMzksMCwwLDAsMjE4LDgsMTE1LDExNiw5NSwxMDksMTE2LDEwNSwxMDksMTAxLAotICAgIDkwLDcsMTE1LDExNiw5NSwxMTUsMTA1LDEyMiwxMDEsNDEsMywxMTQsMTA4LDAsMCwwLAotICAgIDExNCwzNSwwLDAsMCwxMTQsMjA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTcsMCwwLDAsNTUsMywKLSAgICAwLDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLDI3LDgzLDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMDAsMSwwLDEyNCw0LDAsCi0gICAgMTMxLDIsMSw4Myw0MSwyLDc4LDIxOCw1LDk1LDEwOSwxMTEsMTAwLDEwMSw0MSwyLAotICAgIDExNCw5NywwLDAsMCwxMTQsMTk4LDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsOTAsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw1MywwLDAsMCwKLSAgICAxMTQsNDIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE5OSwwLDAsMCw2MCwzLDAsMCwxMTUsNCwwLAotICAgIDAsMCwwLDIsMTIsMSwxMjIsMzIsODMsMTExLDExNywxMTQsOTksMTAxLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LAotICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMjAsMCwwLDAsMTA1LDE4MiwxLAotICAgIDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsOSwwLDAsMCwxNywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNTMsMSwwLDAsMTE2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMDMsMCwKLSAgICAwLDEyNSw2LDAsMTIwLDU0LDAsMTI0LDQsMCwxMTQsODAsMCwxMTYsMSwwLAotICAgIDEyNCw0LDAsMTMxLDEsMCwxMiwxMTQsODAsMCwxMTYsMCwwLDEyNCw0LDAsCi0gICAgMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNywwLDEyNCw2LDAsMTA2LAotICAgIDIsMCwxMjQsNywwLDEzMSwxLDAsMSwxMTMsMjcsMCw4NywxMjAsMTMyLDAsCi0gICAgMTE2LDMsMCwxMjQsNiwwLDEzMSwxLDAsNjgsOTMsMTE4LDAsMTI1LDcsMCwKLSAgICAxMTYsNCwwLDEyNCw0LDAsMTI0LDcsMCwxMzEsMiwwLDEyNSw0LDAsMTIxLAotICAgIDE3LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTMxLDEsMCwxLDg3LAotICAgIDExMyw5NCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMTU1LDAsMSwxLDEsCi0gICAgMTE5LDk0LDAsODksMTEzLDk0LDAsNCwxMTYsOCwwLDEwNywxMCwwLDExNCwyMTEsCi0gICAgMCwxLDEyNSw4LDAsMSwxMjIsMjUsMCwxMTYsOSwwLDEwMCwxLDAsMTI0LAotICAgIDQsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMDAsMiwwLDgzLDg3LDg5LDEwMCwKLSAgICAyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsMTEzLDk0LDAsODgsCi0gICAgMTEzLDk0LDAsODcsMTIxLDMzLDAsMTE2LDEwLDAsMTI0LDEsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTMxLDMsMCwxLDExNiw5LDAsMTAwLDMsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsMSw4NywxMTAsNTMsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LAotICAgIDQ4LDEsMSwxMjUsOCwwLDEsMTIyLDIxLDAsMTE2LDksMCwxMDAsMSwwLAotICAgIDEyNCwxLDAsMTI0LDgsMCwxMzEsMywwLDEsODcsODksMTAwLDIsMCwxMDAsCi0gICAgMiwwLDEyNSw4LDAsMTI2LDgsMCw4OCwxMTAsMSwwLDg4LDEwMCwyLDAsCi0gICAgODMsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwKLSAgICAzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LAotICAgIDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywKLSAgICAxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwxMiwKLSAgICA5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LDQxLDExLDExNCwzOCwKLSAgICAwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDE2MywwLDAsMCwxMTQsMzMsMCwKLSAgICAwLDAsMTE0LDI4LDAsMCwwLDExNCwzLDAsMCwwLDkwLDUsMTA5LDEwNywKLSAgICAxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsMTE2LDExNSw2OSwKLSAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDQwLDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDU1LAotICAgIDAsMCwwLDQxLDksMTE0LDEwOCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LAotICAgIDUzLDAsMCwwLDExNCwyMjAsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLAotICAgIDExNiwxMTQsOTQsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwKLSAgICAxMTQsMjAxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxOTgsMCwwLDAsNjUsMywwLDAsMTE1LDM4LDAsCi0gICAgMCwwLDAsMiwxOCwxLDYsMiwyMiwxLDE4LDEsMTcsMiwxOSwxLAotICAgIDE1LDEsMywxLDE3LDEsMTMsMiw3LDEsMTgsMywxNiwxLDI3LDEsCi0gICAgMywxLDE2LDEsMTcsMSwxOCwyLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCwKLSAgICA5NywxMTYsOTcsNzgsNDEsNywxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5OSwwLDAsMCwxMTQsMTk4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTgsMCwKLSAgICAwLDAsNTEsMywwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNSwxMiw1LDExNCwyMTgsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDgzLAotICAgIDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsNzYsMCwwLAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLAotICAgIDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsCi0gICAgMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTI0LDIsCi0gICAgMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwwLDEwMCwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiw4Myw0MSw0LDc4LAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw4OSwwLDAsMCw0MSwKLSAgICA0LDExNCwxNTcsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTQxLDAsMCwwLAotICAgIDExNCwxNDcsMCwwLDAsNDEsNSwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsMjA5LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODcsMCwwLDAsOTgsMywwLDAsMTE1LDgsMCwwLDAsMCwxLDE1LAotICAgIDEsMTUsMSwyNCwxLDEyMiwyOSw4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsCi0gICAgMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwKLSAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsMzksODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLAotICAgIDEwMSwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsCi0gICAgMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjAyLAotICAgIDAsMCwwLDEwNCwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDMxLAotICAgIDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNzgsCi0gICAgNDEsNiwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDExMywwLDAsCi0gICAgMCwxMTQsMTE0LDAsMCwwLDExNCwxODcsMCwwLDAsMTE0LDIwMiwwLDAsMCwKKyAgICAxODcsMCwwLDAsMjUxLDMsMCwwLDExNSw2LDAsMCwwLDAsNyw5LAorICAgIDEsMTAsMSwxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsNzgsNDEsMTIsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwxMDYsCisgICAgMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTc3LDAsMCwwLDExNCwyNDQsMCwKKyAgICAwLDAsMTE0LDE1MywwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxODEsMCwwLAorICAgIDAsMTE0LDE4MCwwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxODcsMCwwLDAsCiAgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDIyMywwLDAsMCw5NCwzLDAsMCwxMTUsNiwwLAotICAgIDAsMCwxMiwyLDYsMiwxMiw2LDExNCwyMjMsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLAotICAgIDAsMCwxMTUsMTM2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsCi0gICAgOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsCi0gICAgMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LAotICAgIDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsCi0gICAgMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsCi0gICAgMCwwLDkwLDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLDksCi0gICAgMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE2LDAsCi0gICAgMTAwLDE3LDAsMTMyLDAsMCw5MCwxMSwwLDEwMSwxMiwwLDEwMCwxOCwwLDEwMCwKLSAgICAxOSwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMywwLDEwMCwyMCwwLDgzLDQxLAotICAgIDIxLDIxOCwxOSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsOTMsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDk5LAotICAgIDExMSwxMTAsMTE1LDExNiwxMTQsMTE3LDk5LDExNiwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDExOSwxMTEsMTE0LDEwNywzMiwxMTksCi0gICAgMTA1LDExNiwxMDQsMzIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsOTUsMCwwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLAotICAgIDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDEwNiwwLDAsMCwxMTQsCi0gICAgMzUsMCwwLDAsNDEsMywxMTQsMTA4LDAsMCwwLDExNCwxMDYsMCwwLDAsCi0gICAgMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODUsMCwwLDAsMTIxLDMsMCwwLDExNSw0LDAsCi0gICAgMCwwLDAsMSw5LDEsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKLSAgICAxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsCi0gICAgMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMDYsMCwwLDEwNywyLDAsMTExLDMzLDAsCi0gICAgMTI0LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTA2LDEsMCwxMDcsMiwwLDgzLAotICAgIDQxLDEsNzgsNDEsMiwxMTQsMjExLDAsMCwwLDExNCwxMTgsMCwwLDAsNDEsCi0gICAgMiwxMTQsMTA4LDAsMCwwLDExNCwyMTIsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIxMywwLDAsMCwxMjUsCi0gICAgMywwLDAsMTE1LDQsMCwwLDAsMCwxLDE4LDEsMTIyLDI2LDY5LDEyMCwKLSAgICAxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjYsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCwxMTYsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDY1LDgzLDQxLDEsNzgsNDEsCi0gICAgMywxMTQsMjE0LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwxMTQsMjE1LDAsMCwwLDEyOSwzLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDEsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKLSAgICAxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNCw5NywKLSAgICAxMTUsMTA0LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwKLSAgICAwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LDAsMCwwLDExNiwwLAotICAgIDAsMTA2LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMiwwLAotICAgIDEyNSwyLDAsMTE2LDQsMCwxMDAsMSwwLDEyNCwxLDAsMTA2LDUsMCwxMjQsCi0gICAgMCwwLDEwNiw2LDAsMTMxLDMsMCwxLDEyNCwyLDAsODMsNDEsMiwxMjIsCi0gICAgMzgsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDExMCwzMiwxMTcsMTEwLDEwNSwxMTYsMTA1LAotICAgIDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDM4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDQxLAotICAgIDcsMTE0LDEyMSwwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCwxNDUsMCwwLDAsCi0gICAgOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksCi0gICAgMTE0LDEwNSwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwKLSAgICAzLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsMTkwLDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODYsMCwwLDAsMTMyLDMsMCwwLDExNSwxMCwwLDAsMCwwLDIsNiwKLSAgICAxLDE1LDEsNiwxLDE2LDEsMTIyLDMzLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsCi0gICAgOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICA0NSwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTE2LDIsMCwxMDYsMywwLAotICAgIDEyNCwxLDAsMTMxLDIsMCwxLDExNiw0LDAsMTAwLDEsMCwxMjQsMCwwLAotICAgIDEwNiw1LDAsMTI0LDAsMCwxMDYsNiwwLDEzMSwzLDAsMSwxMDAsMiwwLAotICAgIDgzLDQxLDMsMTIyLDMwLDczLDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMzIsCi0gICAgOTcsMTEwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDEyMiw0MCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsCi0gICAgMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDc4LDQxLDcsCi0gICAgMTE0LDEyMSwwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCwxNDUsMCwwLDAsOTAsCi0gICAgMTIsMTAxLDEyMCwxMDEsOTksOTUsMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSwxMTQsMTA1LDAsCi0gICAgMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwKLSAgICAwLDAsMCwxMTQsMTkwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDExNCwxOTEsMCwwLDAsMTQwLDMsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsMiwxOSwxLDYsMSwxMjIsMzEsNjksMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCwzLDAsMCwKLSAgICAwLDExNSw0OCwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDEwMCwxLDAsMjUsMTM3LDAsMCwxMTYsMiwwLDEzNSwwLDAsMTAyLAotICAgIDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDAsMCwxMTYsMywwLDY4LDEzMSwKLSAgICAxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiw0OSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTAxLDEyMCwxMTYsCi0gICAgMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwKLSAgICAzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsMTE0LDI5LDAsMCwwLAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAotICAgIDAsNTEsMCwwLDAsMTE1LDMxLDAsMCwwLDEyNCwwLDAsOTMsMjEsMCwKLSAgICAxMjUsMSwwLDEzNiwwLDAsMTAwLDAsMCwxMjQsMSwwLDIzLDEwNywyLDAsCi0gICAgODYsMSwxMTMsMywwLDEwMCwxLDAsODMsNDEsMiwxMTQsMTg1LDAsMCwwLAotICAgIDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDIyLDAsMCwwLDIxOCw2LDExNSwKLSAgICAxMTcsMTAyLDEwMiwxMDUsMTIwLDQxLDEsMjE4LDksMTAyLDEwNSwxMDgsMTAxLDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDI1MCw5LDYwLDEwMywKLSAgICAxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNDksMywwLDAsMTE1LDIsMCwwLDAsCi0gICAgNiwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsCi0gICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsCi0gICAgMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDM4LDAsMCwwLDExNCwzNSwwLDAsCi0gICAgMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSw4OCw4NCw2OSw3OCw4Myw3Myw3OSwKLSAgICA3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwyMjYsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE1OSwwLDAsMCwxNDYsMywwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCwyLDE5LDEsMTgsMSwxMjIsMzAsNjksMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDYzLDgyLDEwMSwxMTYsCi0gICAgMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk3LDExMCwzMiwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICA5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiw0Niw3OCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsCi0gICAgMCwwLDE1MiwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI4LDY5LAotICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw1Myw4MiwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMDEsMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA0LDk3LAotICAgIDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsCi0gICAgMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDExNCwyMDIsMCwwLDAsMTU2LDMsMCwwLDExNSwyLDAsMCwKLSAgICAwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLDAsCi0gICAgMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDQxLDEsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwKLSAgICAxMTQsMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxNTcsMCwwLDAsMTYwLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwKLSAgICAxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMTIsMCwwLDAsMTE0LDExMSwKLSAgICAwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LDE4NSwwLAotICAgIDAsMCwxMTQsMjEzLDAsMCwwLDExNCwyMTUsMCwwLDAsMTE0LDE4NiwwLDAsCi0gICAgMCwxMTQsMTkxLDAsMCwwLDExNCwxNTksMCwwLDAsMTE0LDE4NywwLDAsMCwKLSAgICAxMTQsMjAyLDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwxMTQsMjI0LDAsMCwwLDExMywzLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMTIsNiw2LDIsMTIsNCwxMiw0LDEyLDMsMTIsOCwxMiw2LDEyLAotICAgIDYsMTIsNCwxMiw0LDExNCwyMjQsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgMTMwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLAotICAgIDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLDkwLAotICAgIDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDYsCi0gICAgMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsMTAwLDksMCwKLSAgICAxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLDkwLAotICAgIDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLDksMCwxMDAsMTQsCi0gICAgMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE2LDAsMTAwLDE3LDAsCi0gICAgMTMyLDAsMCw5MCwxMSwwLDEwMCwxOCwwLDEwMCwxOSwwLDEzMiwwLDAsOTAsCi0gICAgMTIsMCwxMDAsMjAsMCw4Myw0MSwyMSwyMTgsMTQsOTUsNzgsOTcsMTA5LDEwMSwxMTUsCi0gICAgMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDk3LDM4LDEsMCwwLDgyLDEwMSwxMTIsCi0gICAgMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsCi0gICAgOTcsOTksMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzOSwxMTUsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsNDYsMzIsMzIsNzMsMTE2LDMyLDExNywxMTUsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiwxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LAotICAgIDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDk3LDExMCwxMDAsMzIsCi0gICAgMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExNiwzMiwxMDgsMTExLAotICAgIDExMSwxMDcsMTE1LDMyLDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLAotICAgIDExNiwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsCi0gICAgNDYsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDk5LDEwNCw5NywKLSAgICAxMTAsMTAzLDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMzksMTE1LDMyLDExMSwxMTksMTEwLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTE0LAotICAgIDEwMSw5OSwxMTEsMTA5LDExMiwxMTcsMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMTE3LAotICAgIDExNSwxMDUsMTEwLDEwMywzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKLSAgICA0NiwzMiwzMiw3MCwxMTEsMTE0LDMyLDExNiwxMTEsMTEyLDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKLSAgICAxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsNDYsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNTIsMCwwLDAsMTI0LDEsMCwKLSAgICAxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsMSwwLDExNiwKLSAgICAyLDAsMTI0LDAsMCwxMDYsMywwLDEzMSwwLDAsMTMxLDEsMCwxMjQsMCwKLSAgICAwLDk1LDQsMCwxMjQsMywwLDEyNCwwLDAsOTUsNSwwLDEwMCwwLDAsCi0gICAgODMsNDEsMSw3OCw0MSw2LDIxOCw1LDk1LDExMCw5NywxMDksMTAxLDIxOCw1LDk1LAotICAgIDExMiw5NywxMTYsMTA0LDExNCw5MywwLDAsMCwyMTgsMTYsOTUsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTcsOTUsMTA4LDk3LAotICAgIDExNSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTIsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsNCwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwxMSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg1LDAsMCwwLDE3MywzLAotICAgIDAsMCwxMTUsOCwwLDAsMCwwLDEsOSwxLDksMSwyMSwxLDEyMiwKLSAgICAyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsCi0gICAgOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDUzLDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEwMCwxLDAsMTMxLDEsCi0gICAgMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDIsMCwKLSAgICAxMDAsMiwwLDEwNywyLDAsMTE0LDQzLDAsMTAwLDYsMCw4MywxMjQsMSwwLAotICAgIDEwMCw1LDAsMTAyLDIsMCw4Myw0MSw3LDEyMiw2Miw4MiwxMDEsMTE2LDExNywxMTQsCi0gICAgMTEwLDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwxMDIsMzIsNDAsMTEyLAotICAgIDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NSwxMTAsOTcsMTA5LAotICAgIDEwMSw0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywxMTYsMTA0LDQ1LDk3LAotICAgIDExNiwxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw1OCwwLDAsMCwxMTQsMzAsCi0gICAgMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDM1LDAsMCwwLDkwLDgsOTUsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsMTIxLDExNSwxMjIsNCwKLSAgICAxMTIsOTcsMTE2LDEwNCw0MSwyLDExNCwyMzEsMCwwLDAsMTE0LDMyLDAsMCwwLAotICAgIDQxLDQsMTE0LDEwOCwwLDAsMCwxMTQsMjIyLDAsMCwwLDIxOCwzLDEwMCwxMTEsCi0gICAgMTE2LDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLAotICAgIDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDE3OSwzLDAsCi0gICAgMCwxMTUsOCwwLDAsMCwwLDIsMjcsMSwxMiwyLDQsMywxMjIsMzgsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LAotICAgIDk1LDExMCw5NywxMDksMTAxLDExNSw5OSwxLDAsMCwwLDAsMCwwLDAsMywKLSAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwKLSAgICAxMjQsMCwwLDEwNiwwLDAsMTMxLDAsMCw5MiwyLDAsMTI1LDEsMCwxMjUsCi0gICAgMiwwLDExNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMjUsMTI0LAotICAgIDIsMCwxMzEsMiwwLDgzLDQxLDEsNzgsNDEsNCwxMTQsMjM4LDAsMCwwLAotICAgIDExNCwxMTcsMCwwLDAsMTE0LDcsMCwwLDAsMjE4LDcsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMTE1LDQxLDMsMTE0LDEwOCwwLDAsMCw5MCwxOCwxMTIsOTcsMTE0LDEwMSwKLSAgICAxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LAotICAgIDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsMTE0LDk1LDExMCw5NywxMDksMTAxLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMzMsMCwKLSAgICAwLDAsMTg5LDMsMCwwLDExNSw0LDAsMCwwLDAsMSwxOCwxLDEyMiwKLSAgICAzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsCi0gICAgOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwxMTgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwxLDAsMTI0LDEsMCwxMjQsCi0gICAgMCwwLDEwNiwyLDAsMTA3LDMsMCwxMTQsMTExLDAsMTI0LDAsMCwxMDYsMywKLSAgICAwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwwLDEzMSwyLDAsMTI1LDIsMCwKLSAgICAxMjQsMiwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTAyLDAsMTI0LDIsMCwxMDYsCi0gICAgNSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTAyLDAsMTI0LDIsMCwxMDYsNiwKLSAgICAwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiw2LDAsMTI0LDAsMCw5NSw3LDAsCi0gICAgMTI0LDEsMCwxMjQsMCwwLDk1LDIsMCwxMjQsMCwwLDEwNiw3LDAsODMsCi0gICAgNDEsMSw3OCw0MSw4LDExNCw5MywwLDAsMCwxMTQsMjMzLDAsMCwwLDExNCwKLSAgICAyMzQsMCwwLDAsMTE0LDIzNSwwLDAsMCwxMTQsMjMxLDAsMCwwLDExNCwxMjcsCi0gICAgMCwwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMjMyLDAsMCwwLDQxLDMsMTE0LAotICAgIDEwOCwwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDExNCwxNjQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDUsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LDExNywxMDgsCi0gICAgOTcsMTE2LDEwMSwxOTMsMywwLDAsMTE1LDE2LDAsMCwwLDAsMiwxOCwxLAotICAgIDE1LDEsMjEsMywyNywxLDksMSwxMiwxLDksMSwxMjIsMjcsOTUsNzgsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDExNCwxMDEsCi0gICAgOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKLSAgICAwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwKLSAgICAxLDAsODMsNDEsMSw3OCw0MSwyLDIxOCw0LDEwNSwxMTYsMTAxLDExNCwxMTQsMjQwLAotICAgIDAsMCwwLDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTE2LDEwMSwKLSAgICAxMTQsOTUsOTUsMjA2LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsCi0gICAgODMsNDEsMSw3OCw0MSwyLDExNCwzMSwwLDAsMCwxMTQsMjQwLDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSwyMDksCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMiw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA4LDEwMSwxMTAsCi0gICAgOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLAotICAgIDIwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0MCwKLSAgICAxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw0NywwLDAsMCwxMTQsMjMyLDAsMCwKLSAgICAwLDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsCi0gICAgOTUsMjEyLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDExNCwKLSAgICAxMDEsMTEyLDExNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDEwNyw2LDAsODMsNDEsCi0gICAgMSw3OCw0MSwxLDExNCwyNDAsMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLAotICAgIDIxOCw0LDEwNSwxMTYsMTAxLDEwOSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNSwwLDAsMCwyMTgsMTIsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwKLSAgICAxMTUsOTUsOTUsMjE1LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDk1LDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDIwLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEyNCwxLAotICAgIDAsMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMzIsCi0gICAgMCwwLDAsMTE0LDE2MywwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LAotICAgIDI0NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwxMTQsMTYzLDAsMCwwLDIxOCwzLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLDEzLDExNCwxMTIsMCwKLSAgICAwLDAsMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLAotICAgIDAsMTE0LDE4NSwwLDAsMCwxMTQsMjM4LDAsMCwwLDExNCwyMzMsMCwwLDAsCi0gICAgMTE0LDI0MCwwLDAsMCwxMTQsMjQyLDAsMCwwLDExNCwyNDMsMCwwLDAsMTE0LAotICAgIDI0NCwwLDAsMCwxMTQsMjQ2LDAsMCwwLDExNCwxNjMsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMTE0LDIzMCwwLDAsMCwxNjYsMywwLDAsMTE1LDIwLDAsMCwwLAotICAgIDEyLDUsNiwyLDEyLDYsMTIsMTAsMTIsNCwxMiwxMywxMiwzLDEyLDMsCi0gICAgMTIsMywxMiwzLDExNCwyMzAsMCwwLDAsOTksMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLDAsMCwxMTUsMTE4LAotICAgIDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwKLSAgICAxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLDMsMCwxMDEsNCwwLDEwMCwzLAotICAgIDAsMTAwLDQsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMCw1LDAsCi0gICAgMTAwLDYsMCwxMzIsMCwwLDkwLDYsMCwxMDAsNywwLDEwMCw4LDAsMTMyLAotICAgIDAsMCw5MCw3LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLDkwLDgsCi0gICAgMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMCwwLDkwLDksMCwxMDAsMTMsMCwKLSAgICAxMDAsMTQsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLAotICAgIDAsMCw5MCwxMSwwLDEwMCwxNywwLDgzLDQxLDE4LDIxOCwxNiw5NSw3OCw5NywKLSAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw5OSw0LDAsCi0gICAgMCwwLDAsMCwwLDAsNCwwLDAsMCw0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwyNSwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTI0LDIsMCwKLSAgICAxMjQsMywwLDEzMSwzLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDAsMCw4MywKLSAgICA0MSwxLDc4LDQxLDIsMTE0LDIzMCwwLDAsMCwxMTQsMjMyLDAsMCwwLDQxLAotICAgIDQsMTE0LDEwOCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwzNSwwLDAsMCwKLSAgICAxMTQsMjM2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODUsMCwwLDAsMjI0LDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKLSAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEwNiwxLDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLAotICAgIDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwKLSAgICAxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LAotICAgIDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMTIyLDI1LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLAotICAgIDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDYyLDQxLDIsMTE0LDQ3LDAsCi0gICAgMCwwLDExNCwxMTIsMCwwLDAsNDEsMiwxMTQsMTcwLDAsMCwwLDExNCwxOTAsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMjE4LDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwyMjcsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyOCw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLAotICAgIDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsODQsMTE0LDQsMCwwLDAsNDEsCi0gICAgMiwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE1OSwwLDAsMCwyMzYsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LAotICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwKLSAgICAwLDEwMCwxLDAsODMsNDEsMiw3OCwxMTQsMzAsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIwMiwwLAotICAgIDAsMCwyMzksMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNyw5NSwKLSAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDIyLDAsMCwwLDExNiwwLDAsMTAwLDEsMCwxMDAsMiwwLDEwMCwzLDAsCi0gICAgMTAwLDQsMCwxMDAsNSwwLDEzMSwzLDEsODMsNDEsNiw3OCwxMTQsMzAsMCwKLSAgICAwLDAsMTIyLDgsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjIsMTE0LDE4OSwwLDAsCi0gICAgMCwxMTQsMjA0LDAsMCwwLDg0LDQxLDEsMTE0LDIwNSwwLDAsMCw0MSwyLAotICAgIDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsMCwwLDI0MiwzLAotICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LDc4LDk3LDEwOSwxMDEsCi0gICAgMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAotICAgIDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsCi0gICAgMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0NiwKLSAgICA3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCi0gICAgMCwxMTQsMTg2LDAsMCwwLDI0NSwzLDAsMCwxMTUsMCwwLDAsMCwxMjIsCi0gICAgMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LAotICAgIDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTkwLDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAotICAgIDExNCwxOTEsMCwwLDAsMjQ4LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwKLSAgICAxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsMzIsMCwwLDAsMTE2LDAsMCwxMDAsMSwwLDEyNCwwLAotICAgIDAsMTA2LDEsMCwxMzEsMiwwLDEsMTE2LDIsMCwxMDYsMywwLDEyNCwwLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLDIsMTIyLDk4LDc2LDExMSw5NywxMDAsCi0gICAgMzIsOTcsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LAotICAgIDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwKLSAgICAxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwKLSAgICAxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LAotICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDM4LAotICAgIDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDMyLDEyMywzMywxMTQsMTI1LDQxLDQsMTE0LDEwNSwwLDAsMCwxMTQsMjMyLDAsCi0gICAgMCwwLDExNCwxMjEsMCwwLDAsMTE0LDE5MiwwLDAsMCw0MSwyLDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTkzLDAsMCwwLDI1MSwzLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwwLDcsMTYsMSwxMjIsMjgsOTUsNzgsOTcsMTA5LDEwMSwKLSAgICAxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA4LDExMSw5NywxMDAsCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsMTIsMTE0LDExMiwwLDAsMCwxMTQsCi0gICAgMTExLDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsMTgzLAotICAgIDAsMCwwLDExNCwyNDgsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsMjAyLDAsCi0gICAgMCwwLDExNCwxODcsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsMTkxLDAsMCwKLSAgICAwLDExNCwxOTMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDI0NywwLDAsMCwyMjMsCi0gICAgMywwLDAsMTE1LDE2LDAsMCwwLDEyLDEsMTIsMywxOCw5LDEyLDMsCi0gICAgMTIsMywxMiwzLDEyLDMsMTIsMywxMTQsMjQ3LDAsMCwwLDk5LDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsNjQsMCwKLSAgICAwLDAsMTE1LDE2MCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLAotICAgIDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDEsNCwwLDEwMCwyLDAsMTAwLAotICAgIDMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMSw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsMTMxLDEsMCw5MCw2LDAsMTAxLDQsMCwKLSAgICAxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDcsMCwxMDEsCi0gICAgNCwwLDEwMCw4LDAsMTAwLDksMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwKLSAgICAwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLDEsMCwKLSAgICAxMzEsMSwwLDkwLDksMCwxMDEsNCwwLDEwMCwxMCwwLDEwMCwxMCwwLDEwMCwKLSAgICAxMywwLDEwMCwxNCwwLDEzMiwyLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSw0LAotICAgIDAsMTAwLDEwLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDEsMCwxMzEsMSwwLAotICAgIDkwLDExLDAsMTAwLDEwLDAsODMsNDEsMTcsMjE4LDEwLDgwLDk3LDExNiwxMDQsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsNjIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwKLSAgICAzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwKLSAgICAxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwKLSAgICAzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsCi0gICAgMTE3LDExNiwxMDEsMTE1LDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDU1LDAsMCwwLDEyMCwKLSAgICA0OCwwLDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDEzMSwwLDAsNjgsOTMsCi0gICAgMzEsMCwxMjUsMSwwLDExNiwzLDAsMTI0LDEsMCwxMDAsMSwwLDEzMSwyLAotICAgIDAsMTE0LDE2LDAsMTI0LDEsMCwxMDYsNCwwLDEzMSwwLDAsMSwxMTMsMTYsCi0gICAgMCw4NywxMDAsMiwwLDgzLDQxLDMsMTIyLDEyNSw2Nyw5NywxMDgsMTA4LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsCi0gICAgOTksMTA0LDEwMSwxMTUsNDAsNDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTExLDExMCwKLSAgICAzMiw5NywxMDgsMTA4LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDExNSwxMTYsMTExLDExNCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAorICAgIDUsMCwwLDAsMTE0LDI0MywwLDAsMCwyMjMsMywwLDAsMTE1LDE2LDAsCisgICAgMCwwLDEyLDEsMTIsMywxOCw5LDEyLDMsMTIsMywxMiwzLDEyLDMsCisgICAgMTIsMywxMTQsMjQzLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCwwLDUsMCwwLDAsNjQsMCwwLDAsMTE1LDE2MCwwLDAsCisgICAgMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLAorICAgIDkwLDMsMCwxMDEsNCwwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLDEzMSwKKyAgICAxLDAsOTAsNSwwLDEwMSw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLAorICAgIDAsMTMxLDEsMCw5MCw2LDAsMTAxLDQsMCwxMDAsNiwwLDEwMCw3LDAsCisgICAgMTMyLDAsMCwxMzEsMSwwLDkwLDcsMCwxMDEsNCwwLDEwMCw4LDAsMTAwLAorICAgIDksMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSw0LDAsMTAwLDEwLAorICAgIDAsMTAwLDExLDAsMTAwLDEyLDAsMTMyLDEsMCwxMzEsMSwwLDkwLDksMCwKKyAgICAxMDEsNCwwLDEwMCwxMCwwLDEwMCwxMCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwKKyAgICAyLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSw0LDAsMTAwLDEwLDAsMTAwLDE1LAorICAgIDAsMTAwLDE2LDAsMTMyLDEsMCwxMzEsMSwwLDkwLDExLDAsMTAwLDEwLDAsCisgICAgODMsNDEsMTcsMjE4LDEwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsCisgICAgNjIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiw5NywKKyAgICAxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiw5NSw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSw5NSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDQ2LDk5LAorICAgIDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDU1LDAsMCwwLDEyMCw0OCwwLDExNiwwLDAsMTA2LAorICAgIDEsMCwxMDYsMiwwLDEzMSwwLDAsNjgsOTMsMzEsMCwxMjUsMSwwLDExNiwKKyAgICAzLDAsMTI0LDEsMCwxMDAsMSwwLDEzMSwyLDAsMTE0LDE2LDAsMTI0LDEsCisgICAgMCwxMDYsNCwwLDEzMSwwLDAsMSwxMTMsMTYsMCw4NywxMDAsMiwwLDgzLAorICAgIDQxLDMsMTIyLDEyNSw2Nyw5NywxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTE4LAorICAgIDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsNDAsNDEsCisgICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTExLDExMCwzMiw5NywxMDgsMTA4LDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMTYsMTExLDExNCwxMDEsMTAwLAorICAgIDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSwzMiw0MCwxMTksMTA0LAorICAgIDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNDEsCisgICAgNDYsMjE4LDE3LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSwxMTUsNzgsNDEsNSwxMTQsNywwLDAsMCwyMTgsMTksMTEyLDk3LAogICAgIDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsCi0gICAgMTAxLDExNSwzMiw0MCwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDEwMSwxMDAsNDEsNDYsMjE4LDE3LDEwNSwxMTAsMTE4LDk3LDEwOCwxMDUsMTAwLAotICAgIDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsNzgsNDEsNSwxMTQsNywwLAotICAgIDAsMCwyMTgsMTksMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLAotICAgIDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDIxOCw2LDExOCw5NywxMDgsMTE3LDEwMSwxMTUsMTE0LAotICAgIDExNSwwLDAsMCwxMTQsMjUwLDAsMCwwLDQxLDIsMTE0LDE3MCwwLDAsMCwKLSAgICAyMTgsNiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMjUwLDAsMCwwLDEyLDQsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsNCwyMiwxLDE1LDEsMTIyLDI4LDgwLDk3LDExNiwKLSAgICAxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywKLSAgICAxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LDIsMCwwLDAsMCwwLAotICAgIDAsMCwzLDAsMCwwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwxMDcsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwxLDAsMTA3LDksMCwxMTQsCi0gICAgNDEsMCwxMTYsMCwwLDEwNiwxLDAsMTIsMTE0LDQxLDAsMTE2LDIsMCwxMDYsCi0gICAgMywwLDEwMCwyLDAsMTE2LDQsMCwxMzEsMiwwLDEsMTIwLDU5LDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDY4LDkzLDQ0LDAsMTI1LDIsMCwxMjEsMTQsMCwxMjQsCi0gICAgMiwwLDEyNCwxLDAsMTMxLDEsMCw4Myw4NywxMTMsNTEsMCw0LDExNiw1LAotICAgIDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxLDEsMTE5LDUxLDAsODksMTEzLDUxLAotICAgIDAsODgsMTEzLDUxLDAsODcsMTAwLDEsMCw4MywxMDAsMSwwLDgzLDQxLDMsCi0gICAgMTIyLDExMyw4MywxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMTUsMTAxLDExMywxMTcsMTAxLDExMCw5OSwKLSAgICAxMDEsMzIsMTExLDEwMiwzMiwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LAotICAgIDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDM5LDExMiw5NywxMTYsCi0gICAgMTA0LDM5LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwKLSAgICAzOSwxMDQsMTExLDExMSwxMDcsMTE1LDM5LDMyLDEwNSwxMTUsMzIsMTAyLDk3LDEwOCwxMTUsMTAxLAotICAgIDMyLDExNiwxMDQsMTAxLDExMCwzMiwxMTcsMTE1LDEwMSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDc4LDEyMiwyMywxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsCi0gICAgMTExLDExMSwxMDcsMTE1LDMyLDEwNSwxMTUsMzIsMTAxLDEwOSwxMTIsMTE2LDEyMSw0MSw2LDExNCwKLSAgICA3LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LAotICAgIDExNCw2MCwwLDAsMCwxMTQsNjEsMCwwLDAsMTE0LDEyNSwwLDAsMCwxMTQsCi0gICAgMTA3LDAsMCwwLDQxLDMsMTE0LDE3MCwwLDAsMCwxMTQsMzUsMCwwLDAsCi0gICAgOTAsNCwxMDQsMTExLDExMSwxMDcsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDUsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLAotICAgIDEwNywxMTUsMjAsNCwwLDAsMTE1LDE2LDAsMCwwLDAsNywyNSwxLDE2LAotICAgIDEsMTYsMSwzLDEsMTQsMSwxMywxLDEyLDIsMTIyLDIyLDgwLDk3LDExNiwKLSAgICAxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLAotICAgIDExMSwxMDcsMTE1LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLAotICAgIDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxMjMsMCwwLDAsMTI0LDEsMCwKLSAgICAxMDAsMSwwLDEwNywyLDAsMTE0LDUzLDAsMTIxLDE2LDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEzMSwwLDAsMTI1LDEsMCw4NywxMTAsMjIsMCw0LDExNiwyLDAsCi0gICAgMTA3LDEwLDAsMTE0LDUyLDAsMSwxLDEsMTAwLDIsMCw4Myw4OSwxMTAsMSwKLSAgICAwLDg4LDEyMSwxNywwLDExNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDI1LDEyNSwKLSAgICAyLDAsODcsMTEwLDQ2LDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxMTgsMCwKLSAgICAxLDEsMSwxMjQsMCwwLDEwNiw2LDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwKLSAgICAyLDAsMTI0LDIsMCwxMTYsMywwLDEwNiw0LDAsMTI0LDEsMCw2MCw4OSwKLSAgICAxMTAsMSwwLDg4LDEyNCwyLDAsODMsNDEsMywxMjIsMjEwLDcxLDEwMSwxMTYsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDIsMTE0LAotICAgIDExMSwxMDksMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKLSAgICAzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTA1LDExMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDQ0LDMyLDEwMiwxMDUsMTEwLDEwMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiw5NywxMTIsMTEyLDExNCwxMTEsMTEyLDExNCwxMDUsOTcsMTE2LDEwMSwKLSAgICAzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICA5NywxMTAsMTAwLDMyLDk5LDk3LDk5LDEwNCwxMDEsMzIsMTA1LDExNiw0NiwzMiw3MywxMDIsCi0gICAgMzIsMTEwLDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDk3LDExOCwKLSAgICA5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsNDQsMzIsMTE1LDExNiwxMTEsMTE0LDEwMSwzMiw3OCwKLSAgICAxMTEsMTEwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMzAsCi0gICAgMCwwLDAsNzgsNDEsNywxMTQsMywwLDAsMCwxMTQsNDUsMCwwLDAsCi0gICAgMjE4LDE3LDcwLDEwNSwxMDgsMTAxLDc4LDExMSwxMTYsNzAsMTExLDExNywxMTAsMTAwLDY5LDExNCwKLSAgICAxMTQsMTExLDExNCwxMTQsNywwLDAsMCwxMTQsMjUxLDAsMCwwLDExNCwxMzcsMCwKLSAgICAwLDAsMTE0LDI1NSwwLDAsMCw0MSwzLDExNCwxNzAsMCwwLDAsMTE0LDM1LAotICAgIDAsMCwwLDExNCwyNTMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDIwLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSwzNyw0LDAsCi0gICAgMCwxMTUsMjIsMCwwLDAsMCw4LDEyLDEsMywxLDE2LDEsMTMsMywKLSAgICA5LDEsMywxLDE3LDEsMTMsMSwxNSwxLDE4LDEsMTIyLDMxLDgwLDk3LAotICAgIDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTksMywwLAotICAgIDAsMCwwLDAsMCwwLDYsMCwwLDAsMywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTE5LDAsMCwwLDExNiwwLDAsMTI0LDIsMCwxMDAsMSwwLAotICAgIDEzMSwyLDAsMTE0LDM5LDAsMTI0LDIsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLAotICAgIDEsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwwLDExMCwyMSwwLDEyNCwyLAotICAgIDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDMsMCwxMDMsMCwwLAotICAgIDEyNSw0LDAsMTI0LDMsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDg4LDAsMTE2LAotICAgIDMsMCwxMDYsNCwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsMiwwLDgzLDExNiwKLSAgICAzLDAsMTA2LDUsMCwxMjQsMSwwLDEwMCwwLDAsMTMxLDIsMCwxMjUsNSwKLSAgICAwLDEyNCw0LDAsMTI0LDUsMCw5NSw2LDAsMTI0LDUsMCw4Myw0MSwyLAotICAgIDc4LDExNCwxMjQsMCwwLDAsNDEsNywxMTQsMTE1LDAsMCwwLDExNCwxMjQsMCwKLSAgICAwLDAsMTE0LDE4MiwwLDAsMCwxMTQsMTIxLDAsMCwwLDExNCwxNzksMCwwLAotICAgIDAsMTE0LDE2MCwwLDAsMCwxMTQsMTU2LDAsMCwwLDQxLDYsMTE0LDE3MCwwLAotICAgIDAsMCwxMTQsMTI2LDAsMCwwLDExNCwyNTMsMCwwLDAsMTE0LDEyNywwLDAsCi0gICAgMCwxMTQsMTI4LDAsMCwwLDExNCwxNjQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDEwOCwxMDEsMTAzLAotICAgIDk3LDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw1OSw0LDAsMCwKLSAgICAxMTUsMTgsMCwwLDAsMCw0LDE1LDEsMjQsMiwxNSwxLDYsMSwxMiwKLSAgICAxLDE2LDEsMTgsMSw5LDEsMTIyLDI3LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwKLSAgICAxMDAsMTAxLDExNCw0Niw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTE1LDExMiwxMDEsOTksNzgsOTksNCwwLDAsMCwwLDAsMCwwLDksMCwKLSAgICAwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjQzLDAsMCwwLDEwMywKLSAgICAwLDAsMTI1LDQsMCwxMjAsMjMwLDAsMTI0LDIsMCw2OCw5MywxOTEsMCwxMjUsCi0gICAgNSwwLDExNiwwLDAsMTI0LDUsMCwxMTYsMSwwLDExNiwyLDAsMTAyLDIsCi0gICAgMCwxMzEsMiwwLDExNSw0MywwLDExMywxMywwLDEyNCwwLDAsMTA2LDMsMCwKLSAgICAxMjQsNSwwLDEzMSwxLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwxLDAsMTA3LAotICAgIDksMCwxMTQsMTMsMCwxMTYsNCwwLDEyNCw2LDAsMTAwLDIsMCwxMzEsMiwKLSAgICAwLDExNCwxMDYsMCwxMjQsNiwwLDEwNiw1LDAsMTI0LDEsMCwxMjQsMywwLAotICAgIDEzMSwyLDAsMTI1LDcsMCwxMTAsMTgsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LAotICAgIDEsMCwxMjQsNiwwLDEzMSwyLDAsMTI1LDcsMCwxMjQsNywwLDEwMCwxLAotICAgIDAsMTA3LDgsMCwxMTQsMTM5LDAsMTEzLDEzLDAsMTI0LDcsMCwxMDYsNywwLAotICAgIDEwMCwxLDAsMTA3LDksMCwxMTQsMTU4LDAsMTI0LDcsMCw4MywxMjQsNywwLAotICAgIDEwNiw4LDAsMTI1LDgsMCwxMjQsOCwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgMTkxLDAsMTE2LDksMCwxMDAsMywwLDEzMSwxLDAsMTMwLDEsMCwxMjQsNCwKLSAgICAwLDEwNiwxMCwwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywxMywwLDg3LDExNiwKLSAgICAxMSwwLDEwNiwxMiwwLDEyNCwxLDAsMTAwLDEsMCwxMzEsMiwwLDEyNSw3LAotICAgIDAsMTI0LDQsMCwxMjQsNywwLDk1LDgsMCwxMjQsNywwLDgzLDEwMCwxLAotICAgIDAsODMsNDEsNCwxMjIsNjMsNzAsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTE0LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsCi0gICAgOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NywxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsCi0gICAgMTEwLDk3LDEwOSwxMDEsNDYsNzgsMTE0LDE4MSwwLDAsMCwxMjIsMTksMTE1LDExMiwxMDEsCi0gICAgOTksMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDEsMTMsMTE0LDE0MywwLDAsMCwxMTQsNjksMCwwLDAsMjE4LDUsOTgsMTIxLAotICAgIDExNiwxMDEsMTE1LDExNCwxLDEsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDE4MSwwLAotICAgIDAsMCwxMTQsMiwxLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxNTYsMCwwLAotICAgIDAsMTE0LDEwNywwLDAsMCwxMTQsMTQ5LDAsMCwwLDExNCwxMjEsMCwwLDAsCi0gICAgMTE0LDE2MCwwLDAsMCw0MSw5LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDE4MCwwLDAsMCwyMTgsMTQsMTEwLDk3LDEwOSwKLSAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsNSwxMDEsMTEwLDExNiwKLSAgICAxMTQsMTIxLDExNCwyNTMsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsMTI4LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAotICAgIDIxOCw5LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDc0LDQsMCwwLDExNSwKLSAgICA0MCwwLDAsMCwwLDUsNiwxLDEzLDEsMjEsMSwzLDEsMTUsMSwKLSAgICAxMiwxLDE1LDEsMjEsMiwxOCwxLDEyLDEsMywxLDE1LDEsNCwxLAotICAgIDksMSwxMiwxLDEyLDUsMTcsMiwxOCwxLDksMSwxMjIsMjAsODAsOTcsCi0gICAgMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsCi0gICAgMTAxLDk5LDk5LDQsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDQsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDE0MCwwLDAsMCwxMjQsMiwwLDEwMCwKLSAgICAxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMTYsMCwwLDEwNiwxLDAsMTI1LDIsCi0gICAgMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDMsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLDEsMCwxMDcsOCwwLDExNCwKLSAgICA1OCwwLDEwMCwxLDAsODMsMTI0LDQsMCwxMDYsMywwLDEwMCwxLDAsMTA3LAotICAgIDgsMCwxMTQsMTMyLDAsMTI0LDQsMCwxMDYsNCwwLDEyNSw1LDAsMTI0LDUsCi0gICAgMCwxMTQsMTI1LDAsMTAwLDIsMCwxMjQsNCwwLDk1LDUsMCwxMTYsNiwwLAotICAgIDEyNCwxLDAsMTI0LDUsMCwxMjQsMCwwLDEwNiwyLDAsMTMxLDMsMCwxMjQsCi0gICAgNCwwLDk1LDQsMCwxMjQsNCwwLDgzLDEwMCwxLDAsODMsMTEwLDQsMCwKLSAgICAxMjQsNCwwLDgzLDEwMCwxLDAsODMsNDEsMywxMjIsOTgsMTAyLDEwNSwxMTAsMTAwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwxMTAsMzIsMTE1LAotICAgIDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwKLSAgICAzOSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsNzgsOTAsCi0gICAgOSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0MSw3LDExNCw3LDAsMCwKLSAgICAwLDExNCwzNSwwLDAsMCwxMTQsNSwxLDAsMCwxMTQsMTI3LDAsMCwwLAotICAgIDExNCwxNTYsMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsMjMwLDAsMCwwLDQxLAotICAgIDYsMTE0LDE3MCwwLDAsMCwxMTQsMTI2LDAsMCwwLDExNCwzNSwwLDAsMCwKLSAgICAxMTQsMTgwLDAsMCwwLDExNCwxNjQsMCwwLDAsMTE0LDQsMSwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4MSwKLSAgICAwLDAsMCwxMDYsNCwwLDAsMTE1LDI2LDAsMCwwLDAsNCwxMiwxLAotICAgIDksMSwyMSwxLDEyLDEsNCwxLDE1LDEsOSwxLDYsMyw5LDEsCi0gICAgMjQsMSw0LDIsNywyLDEyMiwyMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLAotICAgIDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDQxLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEyNCwKLSAgICAyLDAsMTMxLDIsMCwxMjUsMywwLDEyNCwzLDAsMTAwLDEsMCwxMDcsOCwKLSAgICAwLDExNCwzNCwwLDEwMCwxLDAsODMsMTI0LDMsMCwxMDYsMSwwLDgzLDQxLAotICAgIDIsMTIyLDE3MCwxMDIsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiwxMTEsCi0gICAgMTE0LDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwKLSAgICAxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwKLSAgICAzMiw5NywxMTAsMTAwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LAorICAgIDEwMSwyMTgsNiwxMTgsOTcsMTA4LDExNywxMDEsMTE1LDExNCwxMDgsMCwwLDAsMTE0LDI0NiwKKyAgICAwLDAsMCw0MSwyLDExNCwxNjQsMCwwLDAsMjE4LDYsMTAyLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAorICAgIDAsMTE0LDI0NiwwLDAsMCwxMyw0LDAsMCwxMTUsNiwwLDAsMCwwLAorICAgIDQsMjIsMSwxNSwxLDEyMiwyOCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwKKyAgICAxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKKyAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsMTA3LDAsMCwwLDExNiwwLDAsCisgICAgMTA2LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDQxLDAsMTE2LDAsMCwxMDYsCisgICAgMSwwLDEyLDExNCw0MSwwLDExNiwyLDAsMTA2LDMsMCwxMDAsMiwwLDExNiwKKyAgICA0LDAsMTMxLDIsMCwxLDEyMCw1OSwwLDExNiwwLDAsMTA2LDEsMCw2OCwKKyAgICA5Myw0NCwwLDEyNSwyLDAsMTIxLDE0LDAsMTI0LDIsMCwxMjQsMSwwLDEzMSwKKyAgICAxLDAsODMsODcsMTEzLDUxLDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCw5NCwKKyAgICAwLDEsMSwxLDExOSw1MSwwLDg5LDExMyw1MSwwLDg4LDExMyw1MSwwLDg3LAorICAgIDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwzLDEyMiwxMTMsODMsMTAxLDk3LDExNCwKKyAgICA5OSwxMDQsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksMTAxLDMyLDExMSwxMDIsMzIsMTA0LAorICAgIDExMSwxMTEsMTA3LDExNSwzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDIsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCwzMiwxMDIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSw0NiwxMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMzksMTA0LDExMSwxMTEsMTA3LDExNSwKKyAgICAzOSwzMiwxMDUsMTE1LDMyLDEwMiw5NywxMDgsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsCisgICAgMTE3LDExNSwxMDEsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsCisgICAgMTA3LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMjIsMjMsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwxMDUsCisgICAgMTE1LDMyLDEwMSwxMDksMTEyLDExNiwxMjEsNDEsNiwxMTQsNywwLDAsMCwyMTgsMTAsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwxMTQsNjAsMCwwLDAsMTE0LAorICAgIDYxLDAsMCwwLDExNCwxMTgsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDMsCisgICAgMTE0LDE2NCwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMDQsMTExLDExMSwxMDcsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LAorICAgIDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMjEsNCwwLDAsCisgICAgMTE1LDE2LDAsMCwwLDAsNywyNSwxLDE2LDEsMTYsMSwzLDEsMTQsCisgICAgMSwxMywxLDEyLDIsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDE5LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxMjMsMCwwLDAsMTI0LDEsMCwxMDAsMSwwLDEwNywyLDAsCisgICAgMTE0LDUzLDAsMTIxLDE2LDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LAorICAgIDEsMCw4NywxMTAsMjIsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDUyLDAsCisgICAgMSwxLDEsMTAwLDIsMCw4Myw4OSwxMTAsMSwwLDg4LDEyMSwxNywwLDExNiwKKyAgICAzLDAsMTA2LDQsMCwxMjQsMSwwLDI1LDEyNSwyLDAsODcsMTEwLDQ2LDAsCisgICAgNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxMTgsMCwxLDEsMSwxMjQsMCwwLAorICAgIDEwNiw2LDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMTYsCisgICAgMywwLDEwNiw0LDAsMTI0LDEsMCw2MCw4OSwxMTAsMSwwLDg4LDEyNCwyLAorICAgIDAsODMsNDEsMywxMjIsMjEwLDcxLDEwMSwxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LDEyMSwxMTUsCiAgICAgNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSwKLSAgICA5Nyw5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAotICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxODEsMCwwLDAsMTE0LDEyNywwLDAsMCw0MSw0LDExNCwxNzAsMCwwLAotICAgIDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE2NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMTgyLDAsMCwwLDEyOCw0LDAsMCwxMTUsOCwwLDAsMCwwLDgsMTgsCi0gICAgMSwxMiwxLDQsMSwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MSwxMiwxMTQsCi0gICAgMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LAotICAgIDAsMCwwLDExNCwxODMsMCwwLDAsMTE0LDI1MCwwLDAsMCwxMTQsMjU1LDAsCi0gICAgMCwwLDExNCwxLDEsMCwwLDExNCwyLDEsMCwwLDExNCw1LDEsMCwKLSAgICAwLDExNCwxODEsMCwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjQ5LDAsMCwwLDgsNCwwLDAsMTE1LDIyLDAsMCwwLDEyLDIsNiwKLSAgICAyLDE4LDgsMTgsMTcsMTgsMjIsMTgsMTUsMywxLDE4LDMxLDMsMSwyMSwKLSAgICAyMSwzLDEsMTE0LDI0OSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSwxMzMsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDEsNiwwLDkwLAotICAgIDcsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw4LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEwMCwxMiwwLDEzMiwxLDAsOTAsMTAsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsCi0gICAgMCwwLDkwLDExLDAsMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsCi0gICAgMCwxMzEsMSwwLDkwLDEzLDAsMTAwLDE3LDAsMTAwLDE4LDAsMTMyLDAsMCwKLSAgICA5MCwxNCwwLDEwMCwxMCwwLDgzLDQxLDE5LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwxNzIsNzAsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsCi0gICAgMTEwLDExNiwxMDEsMTE0LDk3LDk5LDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwKLSAgICAzMiw5NywxMTQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSw5NywxMTAsOTksMTAxLDQ0LDMyLDk4LDEwMSwxMDUsCi0gICAgMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLDExNSwxMDQsMTAxLDEwMCwKLSAgICAzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwKLSAgICAxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsOTcsMTE1LDMyLDk4LAotICAgIDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNSwwLDAsMCw3LDAsMCwwLDExNSwxMjIsMCwwLDAsMTAzLDAsMCwKLSAgICAxMjUsMywwLDEyMCw1MiwwLDEyNCwyLDAsNjgsOTMsNDQsMCw5MiwyLDAsCi0gICAgMTM3LDAsMCwxMjUsNCwwLDEyNCwzLDAsMTA2LDAsMCwxMzUsMCwwLDEwMiwKLSAgICAxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI0LDQsMCw2OCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMjQsMywwLDEyNCwwLDAsCi0gICAgOTUsMSwwLDEyNCwxLDAsMTEyLDc5LDAsMTAwLDMsMCwxMjQsMCwwLDk1LAotICAgIDIsMCwxMDAsNiwwLDEyNCwwLDAsOTUsMywwLDExNiw0LDAsMTMxLDAsCi0gICAgMCwxMjQsMCwwLDk1LDUsMCwxMTYsNCwwLDEzMSwwLDAsMTI0LDAsMCwKLSAgICA5NSw2LDAsMTAwLDUsMCw4Myw0MSw3LDEyMiwxNTQsNzMsMTEwLDEwNSwxMTYsMTA1LAotICAgIDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTExLDExMCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDk3LDMyLDExOCw5NywxMTQsMTA1LDk3LDk4LDEwOCwxMDEsMzIsCi0gICAgMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDUwLDQ1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE1LDMyLDk5LDExMSwxMTAsMTE2LDk3LAotICAgIDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTE3LAotICAgIDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEwMSw5OSwxMTEsMTAzLDExMCwKLSAgICAxMDUsMTIyLDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMywwLDAsMCw1MSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LAotICAgIDAsMCw5MywxNywwLDEyNSwxLDAsMTI0LDEsMCwxMzYsMCwwLDEwMiwyLAotICAgIDAsODYsMSwxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwyMiwwLDAsMCwxMTQsMjI1LDAsMCwwLDQxLDEsCi0gICAgMTE0LDEyNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjI3LDAsMCwwLDE1Nyw0LDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDM4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwKLSAgICAxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsCi0gICAgMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDU4LDAsMCwwLDExNCwyOSwwLDAsCi0gICAgMCw3OCwxMTQsODcsMCwwLDAsNDEsNywxMTQsMTQ5LDAsMCwwLDIxOCw4LAotICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwzNSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMywxMTUsMTAxLDExNiwyMTgsCi0gICAgMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSwyMTgsMTksOTUsMTE0LAotICAgIDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0MSw1LDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwxNCwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDcsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICA0MSwxLDExNCwxMjcsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NSwwLDAsCi0gICAgMCwxNTEsNCwwLDAsMTE1LDE2LDAsMCwwLDAsNCw2LDEsMTksMSwKLSAgICAzNiwxLDksMiwxNSwxLDksMSwxMiwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKLSAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMDAsMywwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEwMCwyLDAsODMsNDEsNCwxMjIsMzEsNzMsMTEwLDExOCw5NywxMDgsMTA1LAotICAgIDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLAotICAgIDExNCwxMjEsMzIsMTA5LDExNiwxMDUsMTA5LDEwMSw0NiwxMTQsMjksMCwwLDAsNzgsMTE0LAotICAgIDg3LDAsMCwwLDQxLDEsMTE0LDgsMSwwLDAsNDEsMSwxMTQsMTA4LDAsCisgICAgOTcsOTksMTA0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywKKyAgICAxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwKKyAgICAzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksCisgICAgOTcsOTksMTA0LDEwMSw0NCwzMiwxMDIsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTcsCisgICAgMTEyLDExMiwxMTQsMTExLDExMiwxMTQsMTA1LDk3LDExNiwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsOTcsMTEwLDEwMCwzMiw5OSw5NywKKyAgICA5OSwxMDQsMTAxLDMyLDEwNSwxMTYsNDYsMzIsNzMsMTAyLDMyLDExMCwxMTEsMzIsMTAyLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsMzIsMTA1LDExNSwzMiw5NywxMTgsOTcsMTA1LDEwOCw5Nyw5OCwxMDgsCisgICAgMTAxLDQ0LDMyLDExNSwxMTYsMTExLDExNCwxMDEsMzIsNzgsMTExLDExMCwxMDEsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDMwLDAsMCwwLDc4LDQxLDcsCisgICAgMTE0LDMsMCwwLDAsMTE0LDQ1LDAsMCwwLDIxOCwxNyw3MCwxMDUsMTA4LDEwMSwKKyAgICA3OCwxMTEsMTE2LDcwLDExMSwxMTcsMTEwLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDcsMCwKKyAgICAwLDAsMTE0LDI0NywwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwyNTEsMCwwLAorICAgIDAsNDEsMywxMTQsMTY0LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMjQ5LDAsCiAgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwyNTAsMCwwLDAsMTY1LDQsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLAotICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDU5LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsCi0gICAgMCwxMTQsMzcsMCwxMDAsMSwwLDEwMywwLDAsMTAyLDIsMCw4MywxMjQsMiwKLSAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMDYsMiwwLDExMiw1NSwwLDEwMywwLDAsCi0gICAgMTAyLDIsMCw4Myw0MSwyLDEyMiwxOTcsODQsMTE0LDEyMSwzMiwxMTYsMTExLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwKLSAgICA0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsCi0gICAgMTExLDExMCwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAotICAgIDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLAotICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsCi0gICAgOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDMsCi0gICAgMTE0LDE4MSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsCi0gICAgMywxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDE2NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMTI0LDAsMCwwLDE3MSw0LDAsMCwxMTUsOCwwLDAsMCwwLDcsMTUsCi0gICAgMSwxMiwxLDEwLDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTksNiwwLAotICAgIDAsMCwwLDAsMCwwLDcsMCwwLDAsNywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNDAsMCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCwxMjUsNiwwLDExNiwwLDAsMTI0LDIsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTI0LDYsMCwxMDAsMiwwLDEyNCw0LDAsMTMxLDIsMiw4Myw0MSwKLSAgICAzLDc4LDExNCwxMjcsMCwwLDAsMTE0LDE1NiwwLDAsMCw0MSwxLDExNCwxNjcsCi0gICAgMCwwLDAsNDEsNywxMTQsMTA4LDAsMCwwLDExNCwxNjUsMCwwLDAsMTE0LAotICAgIDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LAotICAgIDE4MCwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCw1LDEsMCwwLDE4Myw0LDAsCi0gICAgMCwxMTUsNiwwLDAsMCwwLDEsMTUsMSwxOCwxLDEyMiwyMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsCi0gICAgMTAxLDk5LDc4LDk5LDMsMCwwLDAsMCwwLDAsMCwxNCwwLDAsMCwKLSAgICAxNSwwLDAsMCw2NywwLDAsMCwxMTUsMjM0LDEsMCwwLDEwMCwxLDAsCi0gICAgMTI1LDMsMCwxMjQsMSwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsMSwwLDEwMCwKLSAgICAzLDAsMjUsMTI1LDQsMCwxMjEsMzQsMCwxMTYsMSwwLDEyNCwwLDAsMTA2LAotICAgIDIsMCwxMTIsNDksMCwxMTYsMywwLDEwNiw0LDAsMTMxLDAsMCwxMzEsMSwKLSAgICAwLDEwNiw1LDAsMTI1LDUsMCw4NywxMTAsMjQsMCw0LDExNiw2LDAsMTA3LAotICAgIDEwLDAsMTE0LDg1LDAsMSwxLDEsMTAwLDEwLDAsMTI1LDUsMCw4OSwxMTAsCi0gICAgMSwwLDg4LDEyNCw1LDAsMTI0LDAsMCwxMDYsNywwLDEwNywzLDAsMTE0LAotICAgIDEyMCwwLDEyNCwwLDAsMTA2LDgsMCwxMzEsMCwwLDEsMTI0LDUsMCwxMjQsCi0gICAgMCwwLDk1LDcsMCwxMTYsOSwwLDEzMSwwLDAsMTE0LDE1MywwLDEyNCwwLAotICAgIDAsMTA2LDEwLDAsMTI1LDYsMCwxMjQsNCwwLDEwNiwxMSwwLDEzMSwwLDAsCi0gICAgMTI1LDcsMCwxMTAsMTUsMCwxMjQsMCwwLDEwNiwxMiwwLDEyNSw2LDAsMTI0LAotICAgIDQsMCwxMjUsNywwLDEyNCw3LDAsMTI0LDYsMCwxMDcsNiwwLDExNCw0NSwKLSAgICAxLDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEzMSwyLDAsCi0gICAgMTI1LDgsMCwxMjAsMTAwLDAsMTI0LDAsMCwxMDYsMTQsMCw2OCw5Myw3NywwLAotICAgIDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLDEwMCw1LDAsMTI0LDksMCwyMywKLSAgICAxMjUsMTEsMCwxMTYsMTMsMCwxMjQsOCwwLDEyNCwxMSwwLDEzMSwyLDAsMTI1LAotICAgIDEyLDAsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsMCwxMTQsMjA4LDAsMTI0LDAsCi0gICAgMCwxMDYsMTYsMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEyNCw4LDAsCi0gICAgMTAzLDEsMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDIwOCwwLDg3LDExNiwxNywKLSAgICAwLDEyNCw4LDAsMTMxLDEsMCwxMjUsMywwLDEyMCwxMjMsMCwxMjQsMCwwLAotICAgIDEwNiwxNCwwLDY4LDkzLDExMiwwLDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLAotICAgIDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEyNCw5LDAsMjMsCi0gICAgMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTgsMCwxMDAsNiwwLDEwNiwxOSwwLDEyNCwKLSAgICAxMiwwLDEzMSwxLDAsMTAwLDcsMCwxMDAsMywwLDEzMSwxLDEsMSwxMjQsCi0gICAgNywwLDEyNCw5LDAsMjMsMTI0LDYsMCwxMDcsNiwwLDExNCw1NSwxLDExNiwKLSAgICAxNSwwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LDU1LDEsMTI0LDAsMCwxMDYsMTYsCi0gICAgMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEwMCw4LDAsMTI0LDIsMCwKLSAgICAxMzEsNSwwLDgzLDExMyw1NSwxLDg3LDEyNCwzLDAsMTE0LDIzMCwxLDExNiwxOCwKLSAgICAwLDEwMCw5LDAsMTA2LDE5LDAsMTI0LDgsMCwxMzEsMSwwLDEzMSwxLDAsCi0gICAgMSwxMTYsMjAsMCwxMDYsMjEsMCwxMjQsMSwwLDEwMCw4LDAsMTMxLDIsMCwKLSAgICAxMjUsMTMsMCwxMjQsOCwwLDEwMywxLDAsMTI0LDEzLDAsOTUsMjIsMCwxMjQsCi0gICAgMTMsMCw4MywxMDAsOCwwLDgzLDQxLDExLDEyMiwxMjUsODQsMTE0LDEyMSwzMiwxMTYsCi0gICAgMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwKLSAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDExNSw0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDEsNDYsNzAsMTE0LDU4LDAsMCwwLDExNCw1NiwKLSAgICAwLDAsMCwxMTQsMjksMCwwLDAsMTE0LDE4NSwwLDAsMCwxMjIsOSwxMTYsCi0gICAgMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMjMsMTI1LDExNCw5OCwwLDAsMCw3OCwxMjIsMjUsCi0gICAgMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsCi0gICAgOTksMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMywxMjUsMTE0LDg3LDAsMCwwLDQxLDIzLAotICAgIDExNCwzMiwwLDAsMCwxMTQsMzksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKLSAgICAzLDAsMCwwLDExNCw0NSwwLDAsMCwxMTQsMjE5LDAsMCwwLDExNCw0MCwKLSAgICAwLDAsMCwxMTQsOCwxLDAsMCwyMTgsMTEsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTE0LDYsMCwwLDAsMTE0LDExLDEsMCwwLDExNCwKLSAgICA4OCwwLDAsMCwxMTQsMTAsMSwwLDAsMTE0LDI4LDAsMCwwLDExNCw3LAotICAgIDEsMCwwLDExNCw0NCwwLDAsMCwxMTQsNSwxLDAsMCwxMTQsNDYsMCwKLSAgICAwLDAsMTE0LDEwNSwwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDEyMSwwLDAsCi0gICAgMCwxMTQsMTYwLDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsMTQsMTE0LDEwOCwwLAotICAgIDAsMCwxMTQsMTI2LDAsMCwwLDExNCwxODAsMCwwLDAsOTAsMTIsMTA1LDExNSwKLSAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5MCwxMSwxMTYsOTcsMTA1LDEwOCwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTMzLDAsMCwwLDkwLDUsOTksOTcsCi0gICAgOTksMTA0LDEwMSw5MCwxMiw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDkwLDksOTgsOTcsMTE1LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMjI1LDAsMCwKLSAgICAwLDExNCwxNjUsMCwwLDAsOTAsMTMsMTA1LDExMCwxMDUsMTE2LDk1LDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSw5MCw5LDEwMiwxMTcsMTA4LDEwOCw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICAxMTQsMTY0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODEsMCwwLDAsMTg4LDQsMCwwLDExNSw2OCwwLAotICAgIDAsMCwwLDMsNiwxLDE5LDEsMywxLDM0LDEsMTMsMSwxMSwxLAotICAgIDE1LDEsMTAsMSw5LDIsOSwxLDksMSwxNSwyLDksMSw2LDIsCi0gICAgMTIsMSwxOCwxLDIyLDEsMTAsMSwxNSwxLDEyLDEsMzIsNCwxMiwyLAotICAgIDIyLDEsMjIsMSwyNSwxLDE2LDEsMTIsMSwyOSwxLDYsMSwxOSwxLAotICAgIDE4LDEsMTIsMSw0LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCw5LDAsMCwwLDEzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxMSwxLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMjEsCi0gICAgMzEsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwxMTIsMzMsMCwxMTYsMSwKLSAgICAwLDEwNiwzLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwyLDAsODcsMTEwLDMzLAotICAgIDAsNCwxMTYsNCwwLDExNiw1LDAsMTE2LDYsMCwxMDIsMywwLDEwNywxMCwKLSAgICAwLDExNCw3NSwwLDEsMSwxLDEwMywwLDAsMTI1LDIsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDExNiw3LDAsMTA2LDgsMCwxMDYsOSwwLDEwMCwxLDAsMTMxLDEsCi0gICAgMCwxMTUsMTEyLDAsMTE2LDEwLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCwwLDAsCi0gICAgOTUsMTEsMCwxMTAsMTExLDAsMTE2LDEwLDAsMTMxLDAsMCwxMjUsMywwLDEyMCwKLSAgICA5MCwwLDEyNCwyLDAsNjgsOTMsODIsMCwxMjUsNCwwLDEyNCw0LDAsMTA2LAotICAgIDEyLDAsMTAwLDIsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNSwwLDEyNSw2LAotICAgIDAsMTI1LDcsMCwxMjQsNiwwLDExNCwxOTEsMCwxMDAsMywwLDEwNiwxMywwLAotICAgIDEyNCw1LDAsMTI0LDcsMCwxMDYsMTQsMCwxMzEsMCwwLDEzMSwyLDAsMTI1LAotICAgIDgsMCwxMTAsNiwwLDEyNCw1LDAsMTI1LDgsMCwxMjQsMywwLDEwNiwxNSwKLSAgICAwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywxMjgsMCw4NywxMjQsMywwLDEyNCwKLSAgICAwLDAsOTUsMTEsMCwxMTYsNywwLDEwNiw4LDAsMTA2LDksMCwxMTYsMTYsCi0gICAgMCwxMzEsMSwwLDExNCw3LDEsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsCi0gICAgMTI0LDIsMCw2OCwxMzEsMSwwLDEyNCwwLDAsOTUsMTcsMCwxMDAsNiwwLAotICAgIDgzLDQxLDcsMTIyLDY4LDcwLDEwNSwxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LAotICAgIDk5LDEwNCwxMDEsMzIsMTExLDEwMiwzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwKLSAgICAxMDcsOTcsMTAzLDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMCwKLSAgICAxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDYsMTE0LDAsMCwwLDAsMTE0LDU4LAotICAgIDAsMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDgzLDAsMCwwLDExNSwKLSAgICAyOCwwLDAsMCwxMDQsMCwwLDEyNCwwLDAsOTMsMTgsMCwxMjUsMSwwLAotICAgIDEyNCwxLDAsMTA2LDAsMCwxMzEsMCwwLDE0NiwyLDAsMTEzLDYsMCw4MywKLSAgICAxMTQsNCwwLDAsMCw0MSwxLDExNCw4OCwwLDAsMCw0MSwyLDExNCwyMiwKLSAgICAwLDAsMCw5MCwyLDEwMiwxMTAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsCi0gICAgNjIsNiw1LDAsMCwxMTUsMiwwLDAsMCw5LDAsMTIyLDQxLDcwLDEwNSwKLSAgICAxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDExNSwKLSAgICAxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDc4LDQxLDE4LDExNCwzNSwwLDAsMCwxMTQsCi0gICAgMywwLDAsMCw5MCw3LDEwOCwxMDUsMTE1LDExNiwxMDAsMTA1LDExNCwxMTQsNDUsMCwKLSAgICAwLDAsMTE0LDAsMSwwLDAsMjE4LDE1LDgwLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LAotICAgIDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwyMTgsMTgsNzgsMTExLDExNiw2NSw2OCwxMDUsCi0gICAgMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw3LDAsMCwKLSAgICAwLDExNCw4LDAsMCwwLDExNCw5LDAsMCwwLDExNCw5LDEsMCwwLAotICAgIDExNCwxMCwxLDAsMCwxMTQsODMsMCwwLDAsMTE0LDQ3LDAsMCwwLDExNCwKLSAgICA4OCwwLDAsMCwyMTgsMyw5NywxMDAsMTAwLDExNCwxMCwwLDAsMCwxMTQsMTEsCi0gICAgMSwwLDAsNDEsOSwxMTQsMTA4LDAsMCwwLDExNCwzNSwwLDAsMCw5MCwKLSAgICA4LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSw5MCwyMSwxMDgsMTExLDExOSwxMDEsMTE0LAotICAgIDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDk1LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwKLSAgICAxMTQsMjQ1LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDIzNywwLDAsMCwxMTQsCi0gICAgMjI1LDAsMCwwLDkwLDgsMTEwLDEwMSwxMTksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDEzLDEsCi0gICAgMCwwLDIzMyw0LDAsMCwxMTUsMzQsMCwwLDAsMCwyLDksMSwzLAotICAgIDEsMzEsMSwyMiwzLDExLDMsMTgsMSwxOCw3LDksMSwxMywxLDI0LAotICAgIDEsNiwxLDI3LDIsNiwxLDE3LDEsOSwxLDE4LDEsMTIyLDIyLDcwLAotICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKLSAgICAwLDAsMywwLDAsMCw3LDAsMCwwLDExNSwyNSwwLDAsMCwxMzUsCi0gICAgMCwwLDEzNSwxLDAsMTAyLDIsMCwxMDAsMSwwLDEwMCwyLDAsMTM0LDAsCi0gICAgMCwxMjUsMiwwLDEyNCwyLDAsODMsNDEsMyw5NywyMCwxLDAsMCw2NSwKLSAgICAzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LAotICAgIDEwNSw5OSwxMDQsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDk5LDEwOCwKLSAgICAxMTEsMTE1LDExNywxMTQsMTAxLDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTExLDExMCwzMiwKLSAgICAxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMDUsMTA4LDEwOCwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywxMTAsMzIsMTA1LDExMCwxMTUsMTE2LDk3LAotICAgIDExMCw5OSwxMDEsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLAotICAgIDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LAotICAgIDEwOCwxMTEsMTE1LDExNywxMTQsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw0NCwzMiw3MywxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDMsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTE1LDMwLDAsMTE2LDEsMCwxMDAsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwKLSAgICAwLDEzNiwxLDAsMTQwLDEsMCw4Myw0MSwzLDEyMiw0NSw4MCw5NywxMTYsMTA0LAotICAgIDMyLDEwNCwxMTEsMTExLDEwNywzMiwxMDIsMTExLDExNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDgsMTA1LDk4LDQ2LDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSw0Niw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEyMiwzMCwxMTEsMTEwLDEwOCwxMjEsMzIsCi0gICAgMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEwNSwxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsCi0gICAgMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMTE0LDM1LDAsMCwwLDQxLDIsCi0gICAgMTE0LDQ2LDAsMCwwLDExNCwxMDcsMCwwLDAsNDEsMSwxMTQsMzUsMCwwLAotICAgIDAsNDEsMiwxMTQsMTcwLDAsMCwwLDExNCwxMiwxLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMjQsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwKLSAgICAxMTEsMTA3LDk1LDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsMTgsNSwwLDAsMTE1LDYsMCwwLDAsMCwyLDEyLDEsMTgsMSwKLSAgICAxMjIsNTQsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LAotICAgIDEwNCw5NSwxMDQsMTExLDExMSwxMDcsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LAotICAgIDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5NSwxMDIsMTExLDExNCw5NSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDQxLDMsMTE0LAotICAgIDE3MCwwLDAsMCwxMTQsMTIsMSwwLDAsMTE0LDE4LDEsMCwwLDExNCw0LAotICAgIDAsMCwwLDQxLDIsMTE0LDE3MCwwLDAsMCwxMTQsMTIsMSwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDksMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDgsCi0gICAgNSwwLDAsMTE1LDQsMCwwLDAsMCwxMCwyMSw2LDEyMiwyMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsCi0gICAgMTExLDEwNyw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMSwwLDEwNiwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsODMsNDEsMiw3OCwxMjIsCi0gICAgMTYsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0MCwxMjMsMzMsMTE0LDEyNSwKLSAgICA0MSw0MSwyLDExNCw0NywwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMSwxMTQsCi0gICAgMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDExNCwyNDQsMCwwLDAsMjYsNSwwLDAsMTE1LDIsMCwwLAotICAgIDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LAotICAgIDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw0MSwxNSwxMTQsMTEyLDAsMCwwLDExNCwKLSAgICAxMTEsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxODUsCi0gICAgMCwwLDAsMTE0LDI1MCwwLDAsMCwxMTQsMTMwLDAsMCwwLDExNCwxODIsMCwKLSAgICAwLDAsMTE0LDEyNCwwLDAsMCwxMTQsNSwxLDAsMCwxMTQsMTgxLDAsMCwKLSAgICAwLDExNCwxMywxLDAsMCwxMTQsMTgzLDAsMCwwLDExNCwxOSwxLDAsMCwKLSAgICAxMTQsMjQ0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCw2LDEsMCwwLDE0Miw0LAotICAgIDAsMCwxMTUsMjAsMCwwLDAsMTIsNyw2LDIsMTIsMTQsMTIsNCw2LAotICAgIDIsMTIsMTIsMTIsNSwxNSw0NSwxMiwzMSwxOCwxOCwxMTQsNiwxLDAsMCwKLSAgICA5OSw0LDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxMSwwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsMTk1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMDAsMSwwLDEzMSwxLDAsMTI1LDQsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLAotICAgIDIsMCwxMzEsMSwwLDEyNSw1LDAsMTI0LDQsMCwxMTUsOTksMCwxMjQsNSwKLSAgICAwLDExNCw1NCwwLDEyNCw1LDAsMTA2LDEsMCwxMjUsNCwwLDExMCw0NSwwLAotICAgIDEyNCwyLDAsMTI0LDMsMCwxMDcsMiwwLDExNCw4NCwwLDExNiwyLDAsMTI0LAotICAgIDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDQsMCwxMTAsMTUsMCwxMTYsMywKLSAgICAwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSw0LDAsMTI0LDUsMCwKLSAgICAxMTUsMTI2LDAsMTE2LDQsMCwxMjQsMSwwLDEyNCwyLDAsMTAwLDMsMCwxMjQsCi0gICAgNCwwLDEzMSwyLDEsMTI1LDUsMCwxMjEsNDQsMCwxMjQsNSwwLDEyNCwwLAotICAgIDAsMTAwLDIsMCw2MCwxMjQsNCwwLDEyNCwwLDAsMTAwLDEsMCw2MCwxMjQsCi0gICAgMiwwLDEyNCwwLDAsMTAwLDQsMCw2MCwxMjQsMywwLDEyNCwwLDAsMTAwLAotICAgIDUsMCw2MCw4NywxMTAsMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDE5MCwKLSAgICAwLDEsMSwxLDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSw2LDc4LAotICAgIDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk1LDIxOCw4LDk1LDk1LAotICAgIDExNSwxMTIsMTAxLDk5LDk1LDk1LDExNCwxMjcsMCwwLDAsOTAsOCw5NSw5NSwxMDIsCi0gICAgMTA1LDEwOCwxMDEsOTUsOTUsOTAsMTAsOTUsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsOTUsCi0gICAgOTUsNDEsNiwyMTgsMywxMDMsMTAxLDExNiwxMTQsMTI3LDAsMCwwLDExNCwyMjMsMCwKLSAgICAwLDAsMTE0LDIxOCwwLDAsMCwxMTQsMTY3LDAsMCwwLDIxOCw5LDY5LDEyMCwKLSAgICA5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCw0MSw2LDkwLDIsMTEwLDExNSwxMTQsMTA2LDAsCi0gICAgMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwxMDEsOTAsOSw5OSwxMTIsCi0gICAgOTcsMTE2LDEwNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTI3LDAsMCwwLDExNCwxNjQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDE0LDk1LDEwMiwxMDUsMTIwLDk1LDExNywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMzIsNSwwLDAsMTE1LDM0LDAsMCwwLDAsMiwxNSwxLDE1LDEsNiwKLSAgICAxLDYsMSwxMiwxLDEyLDEsMTgsMiwxNSwxLDYsMSwyMSwxLDMsCi0gICAgMSwxMCwxLDEwLDEsMTAsMSwxNCwxLDEzLDIsMTE0LDI0LDEsMCwwLAotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDU1LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwKLSAgICAxMDYsMiwwLDEzMSwwLDAsMTAyLDIsMCwxMjUsMCwwLDExNiwzLDAsMTE2LAotICAgIDQsMCwxMDIsMiwwLDEyNSwxLDAsMTE2LDUsMCwxMTYsNiwwLDEwMiwyLAotICAgIDAsMTI1LDIsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMDMsMywwLAotICAgIDgzLDQxLDEsMTIyLDk1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDEwOCwKLSAgICAxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSw0NSw5OCw5NywxMTUsMTAxLAotICAgIDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw2OSw5Nyw5OSwxMDQsMzIsMTA1LDExNiwxMDEsMTA5LAotICAgIDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE2LDExNywxMTIsMTA4LDEwMSwzMiw0MCwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDQ0LDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsNDEsNDYsMTAsCi0gICAgMzIsMzIsMzIsMzIsNDEsNywxMTQsMjI0LDAsMCwwLDExNCwxNDUsMCwwLDAsCi0gICAgMjE4LDE4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDk1LDExNSwxMTcsMTAyLDEwMiwKLSAgICAxMDUsMTIwLDEwMSwxMTUsMTE0LDIxOCwwLDAsMCwxMTQsODQsMCwwLDAsMTE0LDIyMywKLSAgICAwLDAsMCwxMTQsNzQsMCwwLDAsNDEsMyw5MCwxMCwxMDEsMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCwxMTUsOTAsNiwxMTUsMTExLDExNywxMTQsOTksMTAxLDkwLDgsCi0gICAgOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE2MSwwLDAsMCw1NSw1LDAsMCwKLSAgICAxMTUsOCwwLDAsMCwwLDUsMTgsMSwxMiwxLDEyLDEsMTE0LDE2MSwwLAotICAgIDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMTIsMCwwLDAsMTIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDcwLDIsMCwwLDEyNCwwLDAsOTcsCi0gICAgMCwwLDExNiwwLDAsMTA2LDEsMCw5NywxLDAsMTE2LDAsMCwxMDYsMiwKLSAgICAwLDk3LDIsMCwxMTYsMSwwLDEwNiwzLDAsMTE2LDQsMCwyNSwxMjUsMSwKLSAgICAwLDEyMCw3NiwwLDEwMCwyNiwwLDY4LDkzLDY4LDAsMTI1LDIsMCwxMjQsMiwKLSAgICAwLDExNiwxLDAsMTA2LDMsMCwxMDcsNywwLDExNCw4MywwLDExNiwwLDAsCi0gICAgMTA2LDUsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTAsMTMsMCwxMTYsCi0gICAgMSwwLDEwNiwzLDAsMTI0LDIsMCwyNSwxMjUsMywwLDExNiw2LDAsMTI0LAotICAgIDEsMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxLDExMyw0NCwwLDg3LAotICAgIDEwMCw1LDAsMTAwLDYsMCwxMDMsMSwwLDEwMiwyLDAsMTAwLDcsMCwxMDAsCi0gICAgOCwwLDEwMCw2LDAsMTAzLDIsMCwxMDIsMiwwLDEwMiwyLDAsMTI1LDQsCi0gICAgMCwxMjAsMTQ5LDAsMTI0LDQsMCw2OCw5MywxMjksMCw5MiwyLDAsMTI1LDUsCi0gICAgMCwxMjUsNiwwLDExNiw3LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLAotICAgIDEyNCw2LDAsNjgsMTMxLDEsMCwxMzEsMSwwLDExNSwxOTksMCwxMTYsOCwwLAotICAgIDEzMCwxLDAsMTI0LDYsMCwxMDAsMTEsMCwyNSwxMjUsNywwLDEyNCw1LDAsCi0gICAgMTE2LDEsMCwxMDYsMywwLDEwNyw2LDAsMTE0LDI0MSwwLDExNiwxLDAsMTA2LAotICAgIDMsMCwxMjQsNSwwLDI1LDEyNSw4LDAsODAsMTEzLDE1NiwwLDEyMSwyMCwwLAotICAgIDExNiwwLDAsMTA2LDUsMCwxMjQsNSwwLDEzMSwxLDAsMTI1LDgsMCw4MCwKLSAgICA4NywxMTMsMTU2LDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwyOCwxLDEsMSwKLSAgICAxLDExOSwxNTYsMCw4OSwxMTMsMTU2LDAsODgsMTEzLDE1NiwwLDg3LDExNiw5LDAsCi0gICAgMTAwLDEyLDAsMTMxLDEsMCwxMzAsMSwwLDExNiw2LDAsMTI0LDEsMCwxMDAsCi0gICAgMTMsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLAotICAgIDE0LDAsMTI0LDcsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwKLSAgICAxNSwwLDEwMCwxNiwwLDEwNiwxMCwwLDEyNCw2LDAsMTMxLDEsMCwxMzEsMywKLSAgICAwLDEsMTIxLDE5LDAsMTE2LDAsMCwxMDYsNSwwLDEwMCwxNywwLDEzMSwxLAotICAgIDAsMTI1LDksMCw4NywxMTAsMjQsMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LAotICAgIDE0NywxLDEsMSwxLDEwMCwxOCwwLDEyNSw5LDAsODksMTEwLDEsMCw4OCwKLSAgICAxMTYsNiwwLDEyNCwxLDAsMTAwLDE3LDAsMTI0LDksMCwxMzEsMywwLDEsCi0gICAgMTE2LDAsMCwxMDYsNSwwLDEwMCwxOSwwLDEzMSwxLDAsMTI1LDEwLDAsMTE2LAotICAgIDYsMCwxMjQsMSwwLDEwMCwxOSwwLDEyNCwxMCwwLDEzMSwzLDAsMSwxMjQsCi0gICAgNSwwLDEwMCw3LDAsMTA3LDIsMCwxMTQsMjM4LDEsMTE2LDAsMCwxMDYsNSwKLSAgICAwLDEwMCwyMCwwLDEzMSwxLDAsMTI1LDExLDAsMTE2LDYsMCwxMjQsMSwwLAotICAgIDEwMCwyMSwwLDEyNCwxMSwwLDEzMSwzLDAsMSwxMTYsNiwwLDEyNCwxLDAsCi0gICAgMTAwLDIyLDAsMTE2LDExLDAsMTMxLDAsMCwxMzEsMywwLDEsMTE2LDEyLDAsCi0gICAgMTA2LDEzLDAsMTE2LDIsMCwxMDYsMTQsMCwxMzEsMCwwLDEzMSwxLDAsMSwKLSAgICAxMjQsNSwwLDEwMCw3LDAsMTA3LDIsMCwxMTQsNjYsMiwxMTYsMTUsMCwxMDYsCi0gICAgMTYsMCwxMDAsMjMsMCwxMzEsMSwwLDEsMTAwLDI0LDAsMTE2LDEyLDAsMTA3LAotICAgIDYsMCwxMTQsNjYsMiwxMDAsMjUsMCwxMTYsMTcsMCw5NSwxOCwwLDEwMCwxOCwKLSAgICAwLDgzLDQxLDI3LDEyMiwyMDUsODMsMTAxLDExNiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDEwMSwxMTQsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwKLSAgICAxMDUsOTgsMzIsOTgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLAotICAgIDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDEwLDMyLDMyLDMyLDMyLDk4LDExNywxMDUsMTA4LDExNiwKLSAgICA0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLAotICAgIDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMTA5LDMyLDEwNSwKLSAgICAxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksCi0gICAgMTE2LDEwNCwxMDEsMTE0LDMyLDk5LDExMSwxMDksMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsMTE1LDMyLAotICAgIDk3LDExNCwxMDEsMzIsMTAxLDEyMCwxMTYsMTE0LDk3LDk5LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsCi0gICAgMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTE0LDEwMSwzMiw5OCwxMTEsMTExLDExNiwKLSAgICAxMTUsMTE2LDExNCw5NywxMTIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTE0LDQ5LDAsMCwwLDExNCw2MCwwLDAsMCwyMTgsOCw5OCwKLSAgICAxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwxMTUsMTE0LDE0MiwwLDAsMCw5MCw1LDExMiwxMTEsCi0gICAgMTE1LDEwNSwxMjAsMjUwLDEsNDcsMjE4LDIsMTEwLDExNiwyNTAsMSw5Miw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDExNSwwLAotICAgIDAsMCwxMTUsMzMsMCwwLDAsMTI0LDAsMCw5MywyMywwLDEyNSwxLDAsCi0gICAgMTE2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDAsMCwxMDcsMiwwLDg2LAotICAgIDEsMTEzLDMsMCwxMDAsMSwwLDgzLDQxLDIsMTE0LDI5LDAsMCwwLDc4LAotICAgIDQxLDEsMTE0LDMxLDAsMCwwLDQxLDIsMTE0LDIyLDAsMCwwLDExNCw3NywKKyAgICAwLDIxOCwyMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMzgsNCwwLDAsMTE1LDIyLDAsMCwwLAorICAgIDAsOCwxMiwxLDMsMSwxNiwxLDEzLDMsOSwxLDMsMSwxNywxLAorICAgIDEzLDEsMTUsMSwxOCwxLDEyMiwzMSw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLAorICAgIDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDMsMCwwLDAsMCwwLDAsMCwKKyAgICA2LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDExOSwwLDAsCisgICAgMCwxMTYsMCwwLDEyNCwyLDAsMTAwLDEsMCwxMzEsMiwwLDExNCwzOSwwLAorICAgIDEyNCwyLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSwKKyAgICAzLDAsMTI1LDQsMCwxMTAsMjEsMCwxMjQsMiwwLDEwNiwyLDAsMTI0LDEsCisgICAgMCwxMzEsMSwwLDEyNSwzLDAsMTAzLDAsMCwxMjUsNCwwLDEyNCwzLDAsCisgICAgMTAwLDAsMCwxMDcsOSwwLDExNCw4OCwwLDExNiwzLDAsMTA2LDQsMCwxMjQsCisgICAgMSwwLDEyNCwzLDAsMTMxLDIsMCw4MywxMTYsMywwLDEwNiw1LDAsMTI0LAorICAgIDEsMCwxMDAsMCwwLDEzMSwyLDAsMTI1LDUsMCwxMjQsNCwwLDEyNCw1LAorICAgIDAsOTUsNiwwLDEyNCw1LDAsODMsNDEsMiw3OCwxMTQsMTE3LDAsMCwwLAorICAgIDQxLDcsMTE0LDEwOCwwLDAsMCwxMTQsMTE3LDAsMCwwLDExNCwxNzYsMCwwLAorICAgIDAsMTE0LDExNCwwLDAsMCwxMTQsMTczLDAsMCwwLDExNCwxNTQsMCwwLDAsCisgICAgMTE0LDE1MCwwLDAsMCw0MSw2LDExNCwxNjQsMCwwLDAsMTE0LDExOSwwLDAsCisgICAgMCwxMTQsMjQ5LDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDEyMSwwLDAsMCwKKyAgICAxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDIxOCwxNiw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsMTAzLDEwMSwKKyAgICAxMTYsOTUsMTE1LDExMiwxMDEsOTksNjAsNCwwLDAsMTE1LDE4LDAsMCwwLDAsCisgICAgNCwxNSwxLDI0LDIsMTUsMSw2LDEsMTIsMSwxNiwxLDE4LDEsOSwKKyAgICAxLDEyMiwyNyw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTA4LAorICAgIDEwMSwxMDMsOTcsOTksMTIxLDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDc4LDk5LAorICAgIDQsMCwwLDAsMCwwLDAsMCw5LDAsMCwwLDUsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDI0MywwLDAsMCwxMDMsMCwwLDEyNSw0LDAsMTIwLAorICAgIDIzMCwwLDEyNCwyLDAsNjgsOTMsMTkxLDAsMTI1LDUsMCwxMTYsMCwwLDEyNCwKKyAgICA1LDAsMTE2LDEsMCwxMTYsMiwwLDEwMiwyLDAsMTMxLDIsMCwxMTUsNDMsCisgICAgMCwxMTMsMTMsMCwxMjQsMCwwLDEwNiwzLDAsMTI0LDUsMCwxMzEsMSwwLAorICAgIDEyNSw2LDAsMTI0LDYsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDEzLDAsMTE2LAorICAgIDQsMCwxMjQsNiwwLDEwMCwyLDAsMTMxLDIsMCwxMTQsMTA2LDAsMTI0LDYsCisgICAgMCwxMDYsNSwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSw3LDAsCisgICAgMTEwLDE4LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwxLDAsMTI0LDYsMCwxMzEsCisgICAgMiwwLDEyNSw3LDAsMTI0LDcsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDEzOSwKKyAgICAwLDExMywxMywwLDEyNCw3LDAsMTA2LDcsMCwxMDAsMSwwLDEwNyw5LDAsCisgICAgMTE0LDE1OCwwLDEyNCw3LDAsODMsMTI0LDcsMCwxMDYsOCwwLDEyNSw4LDAsCisgICAgMTI0LDgsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDE5MSwwLDExNiw5LDAsMTAwLAorICAgIDMsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDQsMCwxMDYsMTAsMCwxMjQsOCwKKyAgICAwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMTYsMTEsMCwxMDYsMTIsMCwxMjQsCisgICAgMSwwLDEwMCwxLDAsMTMxLDIsMCwxMjUsNywwLDEyNCw0LDAsMTI0LDcsCisgICAgMCw5NSw4LDAsMTI0LDcsMCw4MywxMDAsMSwwLDgzLDQxLDQsMTIyLDYzLAorICAgIDcwLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsCisgICAgMTExLDExNCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsNDcsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMCw5NywxMDksMTAxLDQ2LDc4LAorICAgIDExNCwxNzUsMCwwLDAsMTIyLDE5LDExNSwxMTIsMTAxLDk5LDMyLDEwOSwxMDUsMTE1LDExNSwKKyAgICAxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQxLDEzLDExNCwxMzcsMCwwLAorICAgIDAsMTE0LDY5LDAsMCwwLDIxOCw1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsMjUzLDAsCisgICAgMCwwLDExNCwxMDgsMCwwLDAsMTE0LDE3NSwwLDAsMCwxMTQsMjU0LDAsMCwKKyAgICAwLDExNCwxMjAsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsOTksMCwwLDAsCisgICAgMTE0LDE0MywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxNTQsMCwwLDAsNDEsCisgICAgOSwxMTQsMTY0LDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDM1LDAsMCwwLAorICAgIDExNCwxNzQsMCwwLDAsMjE4LDE0LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAorICAgIDk1LDExMiw5NywxMTYsMTA0LDkwLDUsMTAxLDExMCwxMTYsMTE0LDEyMSwxMTQsMjQ5LDAsMCwKKyAgICAwLDExNCwxNTgsMCwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOSw5NSwxMDMsMTAxLDExNiwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw3NSw0LDAsMCwxMTUsNDAsMCwwLDAsMCw1LAorICAgIDYsMSwxMywxLDIxLDEsMywxLDE1LDEsMTIsMSwxNSwxLDIxLDIsCisgICAgMTgsMSwxMiwxLDMsMSwxNSwxLDQsMSw5LDEsMTIsMSwxMiw1LAorICAgIDE3LDIsMTgsMSw5LDEsMTIyLDIwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw5OSw0LDAsMCwKKyAgICAwLDAsMCwwLDAsNiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwxNDAsMCwwLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAorICAgIDIxLDAsMTE2LDAsMCwxMDYsMSwwLDEyNSwyLDAsMTI0LDAsMCwxMDYsMiwKKyAgICAwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywwLDEzMSwzLDAsMTI1LDQsMCwKKyAgICAxMjQsNCwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTgsMCwxMDAsMSwwLDgzLAorICAgIDEyNCw0LDAsMTA2LDMsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDEzMiwwLDEyNCwKKyAgICA0LDAsMTA2LDQsMCwxMjUsNSwwLDEyNCw1LDAsMTE0LDEyNSwwLDEwMCwyLAorICAgIDAsMTI0LDQsMCw5NSw1LDAsMTE2LDYsMCwxMjQsMSwwLDEyNCw1LDAsCisgICAgMTI0LDAsMCwxMDYsMiwwLDEzMSwzLDAsMTI0LDQsMCw5NSw0LDAsMTI0LAorICAgIDQsMCw4MywxMDAsMSwwLDgzLDExMCw0LDAsMTI0LDQsMCw4MywxMDAsMSwKKyAgICAwLDgzLDQxLDMsMTIyLDk4LDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsCisgICAgMTA0LDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LDEwMSwKKyAgICAxMDAsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLAorICAgIDExMSwxMDcsMTE1LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLAorICAgIDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDc4LDkwLDksMTEwLDk3LDEwOSwxMDEsMTE1LAorICAgIDExMiw5Nyw5OSwxMDEsNDEsNywxMTQsNywwLDAsMCwxMTQsMzUsMCwwLDAsCisgICAgMTE0LDEsMSwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwKKyAgICAxNTIsMCwwLDAsMTE0LDIyNCwwLDAsMCw0MSw2LDExNCwxNjQsMCwwLDAsCisgICAgMTE0LDExOSwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE3NCwwLDAsMCwxMTQsCisgICAgMTU4LDAsMCwwLDExNCwwLDEsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzUsMCwwLDAsMTA3LDQsMCwKKyAgICAwLDExNSwyNiwwLDAsMCwwLDQsMTIsMSw5LDEsMjEsMSwxMiwxLAorICAgIDQsMSwxNSwxLDksMSw2LDMsOSwxLDI0LDEsNCwyLDcsMiwKKyAgICAxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLAorICAgIDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsNCwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0MSwwLDAsMCwKKyAgICAxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LAorICAgIDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzQsMCwxMDAsMSwKKyAgICAwLDgzLDEyNCwzLDAsMTA2LDEsMCw4Myw0MSwyLDEyMiwxNzAsMTAyLDEwNSwxMTAsCisgICAgMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwxMTAsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LAorICAgIDEwNCwzOSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwKKyAgICAxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsCisgICAgMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDE3NSwwLDAsMCwxMTQsCisgICAgMTIwLDAsMCwwLDQxLDQsMTE0LDE2NCwwLDAsMCwxMTQsMTE5LDAsMCwwLAorICAgIDExNCwzNSwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzYsMCwwLDAsMTI5LDQsCisgICAgMCwwLDExNSw4LDAsMCwwLDAsOCwxOCwxLDEyLDEsNCwxLDEyMiwKKyAgICAyMiw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwxMDUsMCwwLDAsMTE0LDEwNCwKKyAgICAwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE3NywwLAorICAgIDAsMCwxMTQsMjQ2LDAsMCwwLDExNCwyNTEsMCwwLDAsMTE0LDI1MywwLDAsCisgICAgMCwxMTQsMjU0LDAsMCwwLDExNCwxLDEsMCwwLDExNCwxNzUsMCwwLDAsCisgICAgMTE0LDE3NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjQ1LDAsMCwwLDksNCwKKyAgICAwLDAsMTE1LDIyLDAsMCwwLDEyLDIsNiwyLDE4LDgsMTgsMTcsMTgsCisgICAgMjIsMTgsMTUsMywxLDE4LDMxLDMsMSwyMSwyMSwzLDEsMTE0LDI0NSwwLAorICAgIDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLAorICAgIDAsMCwwLDY0LDAsMCwwLDExNSwxMzMsMCwwLDAsMTAxLDAsMCw5MCwKKyAgICAxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsCisgICAgMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwKKyAgICAxMzIsMCwwLDkwLDUsMCwxMDEsNiwwLDkwLDcsMCwxMDAsNiwwLDEwMCwKKyAgICA3LDAsMTMyLDAsMCw5MCw4LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLAorICAgIDAsOTAsOSwwLDEwMCwxMCwwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwxLDAsCisgICAgOTAsMTAsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsMCwwLDkwLDExLDAsMTAxLAorICAgIDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEzLAorICAgIDAsMTAwLDE3LDAsMTAwLDE4LDAsMTMyLDAsMCw5MCwxNCwwLDEwMCwxMCwwLAorICAgIDgzLDQxLDE5LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwKKyAgICAxNzIsNzAsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTEwLDExNiwxMDEsMTE0LDk3LDk5LAorICAgIDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwzMiw5NywxMTQsMTAxLDMyLDk5LAorICAgIDk3LDk5LDEwNCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LAorICAgIDEwOSw5NywxMTAsOTksMTAxLDQ0LDMyLDk4LDEwMSwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwKKyAgICAzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLDExNSwxMDQsMTAxLDEwMCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwNCw5NywxMTAsMTAwLAorICAgIDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsOTcsMTE1LDMyLDk4LDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsCisgICAgMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDUsMCwwLDAsNSwwLDAsMCw3LDAsCisgICAgMCwwLDExNSwxMjIsMCwwLDAsMTAzLDAsMCwxMjUsMywwLDEyMCw1MiwwLAorICAgIDEyNCwyLDAsNjgsOTMsNDQsMCw5MiwyLDAsMTM3LDAsMCwxMjUsNCwwLAorICAgIDEyNCwzLDAsMTA2LDAsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDEsMCwxMDAsCisgICAgMiwwLDEzNCwwLDAsMTI0LDQsMCw2OCwxMzEsMSwwLDEzMSwxLDAsMSwKKyAgICAxMTMsMTMsMCw4NywxMjQsMywwLDEyNCwwLDAsOTUsMSwwLDEyNCwxLDAsCisgICAgMTEyLDc5LDAsMTAwLDMsMCwxMjQsMCwwLDk1LDIsMCwxMDAsNiwwLDEyNCwKKyAgICAwLDAsOTUsMywwLDExNiw0LDAsMTMxLDAsMCwxMjQsMCwwLDk1LDUsCisgICAgMCwxMTYsNCwwLDEzMSwwLDAsMTI0LDAsMCw5NSw2LDAsMTAwLDUsMCwKKyAgICA4Myw0MSw3LDEyMiwxNTQsNzMsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwKKyAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwKKyAgICAzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTExLDExMCwzMiw5NywxMTAsMTAwLDMyLDk3LAorICAgIDMyLDExOCw5NywxMTQsMTA1LDk3LDk4LDEwOCwxMDEsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwKKyAgICAzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDUwLDQ1LDExNiwxMTcsCisgICAgMTEyLDEwOCwxMDEsMTE1LDMyLDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5NywxMTAsMTAwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMTE0LDEwMSw5OSwxMTEsMTAzLDExMCwxMDUsMTIyLDEwMSwxMTUsNDYsOTksCisgICAgMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwKKyAgICA1MSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LDAsMCw5MywxNywwLDEyNSwKKyAgICAxLDAsMTI0LDEsMCwxMzYsMCwwLDEwMiwyLDAsODYsMSwxMTMsMywwLAorICAgIDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyMiwKKyAgICAwLDAsMCwxMTQsMjE5LDAsMCwwLDQxLDEsMTE0LDEyMCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjIxLDAsMCwwLDE1OCw0LAorICAgIDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLDM4LDcwLDEwNSwxMDgsMTAxLDcwLAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLAorICAgIDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsCisgICAgNjIsMTE0LDU4LDAsMCwwLDExNCwyOSwwLDAsMCw3OCwxMTQsODcsMCwwLAorICAgIDAsNDEsNywxMTQsMTQzLDAsMCwwLDIxOCw4LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsMTE1LDExNCwzNSwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA5LAorICAgIDExNiwxMDUsMTA5LDEwMSwyMTgsMywxMTUsMTAxLDExNiwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsCisgICAgOTUsOTksOTcsOTksMTA0LDEwMSwyMTgsMTksOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSw0MSw1LDExNCwxMDAsMCwKKyAgICAwLDAsMTE0LDM1LDAsMCwwLDIxOCwxNCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LAorICAgIDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDcsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsCisgICAgMTE0LDE2MCwwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwxMjAsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMTE0LDE3OSwwLDAsMCwxNTIsNCwwLDAsMTE1LAorICAgIDE2LDAsMCwwLDAsNCw2LDEsMTksMSwzNiwxLDksMiwxNSwxLAorICAgIDksMSwxMiwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywKKyAgICAwLDAsMCwxMDAsMywwLDEyNCwwLDAsOTUsMCwwLDEwMCwyLDAsODMsCisgICAgNDEsNCwxMjIsMzEsNzMsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA5LDExNiwxMDUsCisgICAgMTA5LDEwMSw0NiwxMTQsMjksMCwwLDAsNzgsMTE0LDg3LDAsMCwwLDQxLDEsCisgICAgMTE0LDQsMSwwLDAsNDEsMSwxMTQsMTAwLDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDYsMCwwLDAsCisgICAgMTY2LDQsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjgsNzAsMTA1LDEwOCwKKyAgICAxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywKKyAgICAxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDU5LAorICAgIDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LAorICAgIDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzcsMCwxMDAsMSwKKyAgICAwLDEwMywwLDAsMTAyLDIsMCw4MywxMjQsMiwwLDEwNiwxLDAsMTI0LDIsCisgICAgMCwxMDYsMiwwLDExMiw1NSwwLDEwMywwLDAsMTAyLDIsMCw4Myw0MSwyLAorICAgIDEyMiwxOTcsODQsMTE0LDEyMSwzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsCisgICAgMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LAorICAgIDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywKKyAgICAxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0NiwzMiw4MiwxMDEsMTE2LDExNywKKyAgICAxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LAorICAgIDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwKKyAgICAxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsCisgICAgMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDMsMTE0LDE3NSwwLDAsMCwxMTQsCisgICAgMTIwLDAsMCwwLDExNCwxNTAsMCwwLDAsNDEsMywxMTQsMTAwLDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTE3LDAsMCwwLDE3Miw0LAorICAgIDAsMCwxMTUsOCwwLDAsMCwwLDcsMTUsMSwxMiwxLDEwLDEsMTIyLAorICAgIDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLAorICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTksNiwwLDAsMCwwLDAsMCwwLAorICAgIDcsMCwwLDAsNywwLDAsMCw2NywwLDAsMCwxMTUsNDAsMCwwLAorICAgIDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDIsMCwxMjUsNiwwLAorICAgIDExNiwwLDAsMTI0LDIsMCwxMjQsMywwLDEwMCwxLDAsMTI0LDYsMCwxMDAsCisgICAgMiwwLDEyNCw0LDAsMTMxLDIsMiw4Myw0MSwzLDc4LDExNCwxMjAsMCwwLAorICAgIDAsMTE0LDE1MCwwLDAsMCw0MSwxLDExNCwxNjEsMCwwLDAsNDEsNywxMTQsCisgICAgMTAwLDAsMCwwLDExNCwxNTksMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMzUsCisgICAgMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LDE3NCwwLDAsMCwxMTQsMTIwLAogICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCi0gICAgMCwwLDExNCwyMjcsMCwwLDAsOTEsNSwwLDAsMTE1LDIsMCwwLDAsCi0gICAgNiwwLDEyMiwyNSw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDQ2LDYwLDEwOCwxMTEsOTksOTcsCi0gICAgMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDU5LDAsCi0gICAgMCwwLDEyMiwzMCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDExNCwxMDEsCi0gICAgMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTEyLDExMSwxMTUsMTA1LDEyMCwzMiwxMTEsMTE0LDMyLAotICAgIDExMCwxMTYsMTE0LDMsMCwwLDAsMTE0LDI1LDAsMCwwLDExNCwyMSwwLDAsCi0gICAgMCwxMTQsMzAsMCwwLDAsOTAsNyw5NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDc4LAotICAgIDkwLDgsOTUsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTAsNiwxMTksMTA1LDExMCwxMTQsCi0gICAgMTAxLDEwMywxMTQsMTY5LDAsMCwwLDExNCw2LDAsMCwwLDEyMiw0LDQ2LDExMiwKLSAgICAxMjEsMTE5LDEyMiw2LDk1LDEwMCw0NiwxMTIsMTIxLDEwMCw4NCw0MSw0LDEyMiwzLDk1LAotICAgIDEwNSwxMTEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDEyMiw4LDk4LAotICAgIDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDExNSwxMjIsNywxMDksOTcsMTE0LDExNSwxMDQsOTcsMTA4LAotICAgIDQxLDE5LDExNCwxMjEsMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDE0NSwwLDAsCi0gICAgMCwxMTQsMjM5LDAsMCwwLDExNCwxMTIsMCwwLDAsOTAsMTgsOTUsOTgsMTE3LAotICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDExNCwKLSAgICAxMTYsMCwwLDAsMjE4LDMsOTcsMTA4LDEwOCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LAotICAgIDExNiwxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDEwNywwLDAsMCwxMTQsMjYsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMjksMCwwLDAsMTE0LDE0OSwwLAotICAgIDAsMCwxMTQsMjUsMSwwLDAsMTE0LDg0LDAsMCwwLDExNCwxNjMsMCwwLAotICAgIDAsMTE0LDE2OCwwLDAsMCwxMTQsMTczLDAsMCwwLDQxLDEyLDIxOCwxNyw5NSwKLSAgICA5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgOTAsMTEsMTE1LDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LDExNywxMDUsCi0gICAgMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEwLDExMSwxMTUsOTUsCi0gICAgMTAwLDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsMTAsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCi0gICAgOTUsMTExLDExNSwxMTQsMjEsMCwwLDAsMTE0LDI1LDAsMCwwLDkwLDksMTExLAotICAgIDExNSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsMTA0LDExNCwxMDEsOTcsMTAwLAotICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLAotICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDk1LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCw2LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNjYsNSwwLAotICAgIDAsMTE1LDgyLDAsMCwwLDAsOCw2LDEsOSwxLDksMywxMywxLAotICAgIDEzLDEsMTUsMSwxOCwyLDEzLDEsMjAsMywzMywxLDE5LDIsMzEsMSwKLSAgICAxMCwxLDE1LDEsMTMsMSw0LDIsMywxLDE1LDEsNSwxLDEzLDEsCi0gICAgMTIsMiwxMiwxLDE2LDEsMTYsMSwyNSwzLDMsMSwxOSwxLDEzLDIsCi0gICAgMTEsMSwxNiwzLDE1LDEsMTYsMywxMiwxLDE1LDEsMTYsMywxOSwxLAotICAgIDE5LDEsMTIsMSwxMywxLDEyLDEsMTE0LDMzLDEsMCwwLDk5LDEsMCwKLSAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDExNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwKLSAgICAxLDExNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDExNiwyLDAsMTA2LDMsMCwKLSAgICAxMDYsNCwwLDExNiw1LDAsMTA2LDYsMCwxMjQsMSwwLDE0MCwwLDAsMTAzLAotICAgIDEsMCwxMzEsMSwwLDEsMTE2LDcsMCwxMDYsOCwwLDEwMCwxLDAsMTA3LAotICAgIDIsMCwxMTQsNzgsMCwxMTYsMiwwLDEwNiw5LDAsMTA2LDEwLDAsMTE2LDExLAotICAgIDAsMTMxLDEsMCwxLDExNiwyLDAsMTA2LDksMCwxMDYsMTAsMCwxMTYsMTIsCi0gICAgMCwxMzEsMSwwLDEsMTE2LDUsMCwxMjQsMCwwLDk1LDUsMCwxMTYsMTMsCi0gICAgMCwxMjQsMCwwLDk1LDEzLDAsMTAwLDIsMCw4Myw0MSwzLDEyMiw0MSw3MywKLSAgICAxMTAsMTE1LDExNiw5NywxMDgsMTA4LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ1LAotICAgIDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk5LDExMSwxMDksCi0gICAgMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsMTE1LDQ2LDExNCwyOCwxLDAsMCw3OCw0MSwxNCwKLSAgICAxMTQsMzMsMSwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsNywwLDAsMCwxMTQsCi0gICAgMjU0LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDYsMSwwLDAsMTE0LDE5LAotICAgIDEsMCwwLDExNCwzLDAsMCwwLDExNCwxMTIsMCwwLDAsMjE4LDksMTA5LAotICAgIDEwMSwxMTYsOTcsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2MywwLDAsMCwxMTQsMTY4LDAsCi0gICAgMCwwLDExNCwyNDksMCwwLDAsMTE0LDIxOCwwLDAsMCw0MSwyLDExNCwzMiwKLSAgICAxLDAsMCw5MCwxNywxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNSwwLDAsMCwyMTgsOCw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMzQsCi0gICAgNSwwLDAsMTE1LDE2LDAsMCwwLDAsMiwxMCwxLDksMSwyOCwxLAotICAgIDE1LDEsMTYsMSwxNiw0LDksMSwxMTQsMzUsMSwwLDAsNDEsMywxMjIsCi0gICAgMywxMTksMTA1LDExMCwxMTQsMSwwLDAsMCwxMTQsMiwwLDAsMCw0MSw1NywKLSAgICAxMTQsMTE0LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAotICAgIDE3LDAsMCwwLDExNCwxOSwwLDAsMCwxMTQsMjgsMCwwLDAsMTE0LDM4LAotICAgIDAsMCwwLDExNCwzOSwwLDAsMCwxMTQsNDMsMCwwLDAsMTE0LDQ0LDAsCi0gICAgMCwwLDExNCw0NiwwLDAsMCwxMTQsNTUsMCwwLDAsMjE4LDQsMTE2LDEyMSwKLSAgICAxMTIsMTAxLDIxOCw4LDk1LDk1LDk5LDExMSwxMDAsMTAxLDk1LDk1LDExNCwxNDQsMCwwLAotICAgIDAsMTE0LDE1LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LDE0LDAsMCwwLAotICAgIDExNCwxOCwwLDAsMCw5MCwxNyw5NSw4Miw2NSw4Nyw5NSw3Nyw2NSw3MSw3MywKLSAgICA2Nyw5NSw3OCw4NSw3Nyw2Niw2OSw4MiwxMTQsNzMsMCwwLDAsMTE0LDcyLDAsCi0gICAgMCwwLDExNCw4NCwwLDAsMCwxMTQsNzQsMCwwLDAsOTAsMjMsNjgsNjksCi0gICAgNjYsODUsNzEsOTUsNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsCi0gICAgNzAsNzMsODgsNjksODMsOTAsMjcsNzksODAsODQsNzMsNzcsNzMsOTAsNjksNjgsCi0gICAgOTUsNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsCi0gICAgNjksODMsMTE0LDc5LDAsMCwwLDExNCw4NSwwLDAsMCwxMTQsOTEsMCwwLAotICAgIDAsMTE0LDk1LDAsMCwwLDExNCw5NywwLDAsMCwxMTQsMTA1LDAsMCwwLAotICAgIDExNCwxMjMsMCwwLDAsMTE0LDEzMCwwLDAsMCwxMTQsMTQxLDAsMCwwLDExNCwKLSAgICAxNDcsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMTU1LDAsMCwwLDIxOCw2LAotICAgIDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTQsMTYyLDAsMCwwLDExNCwxNjcsMCwwLDAsCi0gICAgMTE0LDE2OCwwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwxOTQsMCwwLDAsMTE0LAotICAgIDIxMCwwLDAsMCwxMTQsMjE4LDAsMCwwLDExNCwyMjMsMCwwLDAsMTE0LDIyOSwKLSAgICAwLDAsMCwxMTQsMjI0LDAsMCwwLDExNCwyMzAsMCwwLDAsMTE0LDI0NywwLAotICAgIDAsMCwxMTQsMjQ5LDAsMCwwLDExNCw2LDEsMCwwLDExNCwyNCwxLDAsCi0gICAgMCwxMTQsMTYxLDAsMCwwLDExNCwzMywxLDAsMCwxMTQsMzUsMSwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsOCwwLAotICAgIDAsMCwxMTUsMTAwLDAsMCwwLDYsMTcsNiwzLDEyLDEyLDEyLDUsMTIsCi0gICAgNSwxMiw2LDEyLDEyLDEyLDEwLDEyLDksMTIsNSwxMiw3LDE1LDIyLDE1LAotICAgIDExMCwyMiwxLDE4LDIsNiwxLDYsMiw5LDIsOSwyLDEwLDIsMjEsCi0gICAgNDQsMTIsMzMsMTIsMTksMTIsMTIsMTIsMTIsMTgsOCwxMiwyOCwxMiwxNywyMSwKKyAgICAwLDAsMTE0LDEsMSwwLDAsMTg0LDQsMCwwLDExNSw2LDAsMCwwLAorICAgIDAsMSwxNSwxLDE4LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksMywwLAorICAgIDAsMCwwLDAsMCwwLDE0LDAsMCwwLDE1LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwyMjgsMSwwLDAsMTAwLDEsMCwxMjUsMywwLDEyNCwxLDAsCisgICAgMTA2LDAsMCwxMDAsMiwwLDEzMSwxLDAsMTAwLDMsMCwyNSwxMjUsNCwwLAorICAgIDEyMSwzNCwwLDExNiwxLDAsMTI0LDAsMCwxMDYsMiwwLDExMiw0OSwwLDExNiwKKyAgICAzLDAsMTA2LDQsMCwxMzEsMCwwLDEzMSwxLDAsMTA2LDUsMCwxMjUsNSwKKyAgICAwLDg3LDExMCwyNCwwLDQsMTE2LDYsMCwxMDcsMTAsMCwxMTQsODUsMCwxLAorICAgIDEsMSwxMDAsMTAsMCwxMjUsNSwwLDg5LDExMCwxLDAsODgsMTI0LDUsMCwKKyAgICAxMjQsMCwwLDEwNiw3LDAsMTA3LDMsMCwxMTQsMTIwLDAsMTI0LDAsMCwxMDYsCisgICAgOCwwLDEzMSwwLDAsMSwxMjQsNSwwLDEyNCwwLDAsOTUsNywwLDExNiwKKyAgICA5LDAsMTMxLDAsMCwxMTQsMTUzLDAsMTI0LDAsMCwxMDYsMTAsMCwxMjUsNiwKKyAgICAwLDEyNCw0LDAsMTA2LDExLDAsMTMxLDAsMCwxMjUsNywwLDExMCwxNSwwLAorICAgIDEyNCwwLDAsMTA2LDEyLDAsMTI1LDYsMCwxMjQsNCwwLDEyNSw3LDAsMTI0LAorICAgIDcsMCwxMjQsNiwwLDEwNyw2LDAsMTE0LDQ1LDEsMTE2LDEzLDAsMTI0LDAsCisgICAgMCwxMDYsMiwwLDEyNCw0LDAsMTMxLDIsMCwxMjUsOCwwLDEyMCwxMDAsMCwKKyAgICAxMjQsMCwwLDEwNiwxNCwwLDY4LDkzLDc3LDAsOTIsMiwwLDEyNSw5LDAsCisgICAgMTI1LDEwLDAsMTAwLDUsMCwxMjQsOSwwLDIzLDEyNSwxMSwwLDExNiwxMywwLAorICAgIDEyNCw4LDAsMTI0LDExLDAsMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTUsMCwxMjQsCisgICAgMTIsMCwxMzEsMSwwLDExNCwyMDgsMCwxMjQsMCwwLDEwNiwxNiwwLDEyNCwxMCwKKyAgICAwLDEyNCwxLDAsMTI0LDEyLDAsMTI0LDgsMCwxMDMsMSwwLDEyNCwyLDAsCisgICAgMTMxLDUsMCw4MywxMTMsMjA4LDAsODcsMTE2LDE3LDAsMTI0LDgsMCwxMzEsMSwKKyAgICAwLDEyNSwzLDAsMTIwLDEyMCwwLDEyNCwwLDAsMTA2LDE0LDAsNjgsOTMsMTA5LAorICAgIDAsOTIsMiwwLDEyNSw5LDAsMTI1LDEwLDAsMTE2LDEzLDAsMTI0LDAsMCwKKyAgICAxMDYsMiwwLDEyNCw0LDAsMTI0LDksMCwyMywxMzEsMiwwLDEyNSwxMiwwLAorICAgIDExNiwxOCwwLDEwNiwxOSwwLDEwMCw2LDAsMTI0LDEyLDAsMTAwLDcsMCwxMDAsCisgICAgMywwLDEzMSwyLDEsMSwxMjQsNywwLDEyNCw5LDAsMjMsMTI0LDYsMCwKKyAgICAxMDcsNiwwLDExNCw1NSwxLDExNiwxNSwwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LAorICAgIDU1LDEsMTI0LDAsMCwxMDYsMTYsMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwKKyAgICAwLDEwMCw4LDAsMTI0LDIsMCwxMzEsNSwwLDgzLDExMyw1NSwxLDg3LDEyNCwKKyAgICAzLDAsMTE0LDIyNCwxLDExNiwxOCwwLDEwNiwxOSwwLDEwMCw5LDAsMTI0LDgsCisgICAgMCwxMzEsMiwwLDEsMTE2LDE4LDAsMTA2LDIwLDAsMTI0LDEsMCwxMDAsOCwKKyAgICAwLDEzMSwyLDAsMTI1LDEzLDAsMTI0LDgsMCwxMDMsMSwwLDEyNCwxMywwLAorICAgIDk1LDIxLDAsMTI0LDEzLDAsODMsMTAwLDgsMCw4Myw0MSwxMSwxMjIsMTI1LDg0LAorICAgIDExNCwxMjEsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDExMSwxMTQsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMTAsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDUsMTExLDExMCwxMTUsNDYsMzIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsCisgICAgMzIsNDAsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NCwzMiwxMDgsMTA1LDExNSwxMTYsNDUsMTExLAorICAgIDEwMiw0NSwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDQxLDQ2LDcwLDExNCw1OCwwLAorICAgIDAsMCwxMTQsNTYsMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxNzksMCwwLAorICAgIDAsMTIyLDksMTE2LDExNCwxMjEsMTA1LDExMCwxMDMsMzIsMTIzLDEyNSw5MCw5LDExOCwxMDEsCisgICAgMTE0LDk4LDExMSwxMTUsMTA1LDExNiwxMjEsNzgsMTIyLDI1LDExMiwxMTEsMTE1LDExNSwxMDUsOTgsCisgICAgMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDIsMTExLDExNCwKKyAgICAzMiwxMjMsMTI1LDExNCw4NywwLDAsMCw0MSwyMiwxMTQsMzIsMCwwLDAsMTE0LAorICAgIDM5LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMywwLDAsMCwxMTQsNDUsCisgICAgMCwwLDAsMTE0LDIxMywwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDQsMSwKKyAgICAwLDAsMjE4LDExLDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNCwKKyAgICA2LDAsMCwwLDExNCw3LDEsMCwwLDExNCw4OCwwLDAsMCwxMTQsNiwKKyAgICAxLDAsMCwxMTQsMjgsMCwwLDAsMTE0LDMsMSwwLDAsMTE0LDQ0LDAsCisgICAgMCwwLDExNCwxLDEsMCwwLDExNCw0NiwwLDAsMCwxMTQsMTE0LDAsMCwKKyAgICAwLDExNCwxMjksMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsMTUwLDAsMCwwLAorICAgIDQxLDE0LDExNCwxMDAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTc0LDAsMCwKKyAgICAwLDkwLDEyLDEwNSwxMTUsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTAsCisgICAgMTEsMTE2LDk3LDEwNSwxMDgsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDEyNiwwLDAsCisgICAgMCw5MCw1LDk5LDk3LDk5LDEwNCwxMDEsOTAsMTIsOTksOTcsOTksMTA0LDEwMSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCw5LDk4LDk3LDExNSwxMDEsOTUsMTEyLDk3LDExNiwKKyAgICAxMDQsMTE0LDIxOSwwLDAsMCwxMTQsMTU5LDAsMCwwLDkwLDEzLDEwNSwxMTAsMTA1LAorICAgIDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsOSwxMDIsMTE3LDEwOCwxMDgsCisgICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE1OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc1LDAsMCwwLDE4OSw0LAorICAgIDAsMCwxMTUsNzAsMCwwLDAsMCwzLDYsMSwxOSwxLDMsMSwzNCwKKyAgICAxLDEzLDEsMTEsMSwxNSwxLDEwLDEsOSwyLDksMSw5LDEsMTUsCisgICAgMiw5LDEsNiwyLDEyLDEsMTgsMSwyMiwxLDEwLDEsMTUsMSwxMiwKKyAgICAxLDMyLDQsMTIsMiwyMiwxLDIyLDEsMjIsMSwxNiwxLDEyLDEsMTUsCisgICAgMSwxNCwxLDYsMSwxNiwxLDE4LDEsMTIsMSw0LDEsMTIyLDIwLDcwLAorICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwKKyAgICAxMTIsMTAxLDk5LDk5LDEsMCwwLDAsMCwwLDAsMCw5LDAsMCwwLAorICAgIDEzLDAsMCwwLDY3LDAsMCwwLDExNSwxMSwxLDAsMCwxMjQsMCwwLAorICAgIDEwNiwwLDAsMTI1LDEsMCwxMjEsMzEsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LAorICAgIDEsMCwxMTIsMzMsMCwxMTYsMSwwLDEwNiwzLDAsMTMxLDAsMCwxMzEsMSwKKyAgICAwLDEyNSwyLDAsODcsMTEwLDMzLDAsNCwxMTYsNCwwLDExNiw1LDAsMTE2LAorICAgIDYsMCwxMDIsMywwLDEwNywxMCwwLDExNCw3NSwwLDEsMSwxLDEwMywwLAorICAgIDAsMTI1LDIsMCw4OSwxMTAsMSwwLDg4LDExNiw3LDAsMTA2LDgsMCwxMDYsCisgICAgOSwwLDEwMCwxLDAsMTMxLDEsMCwxMTUsMTEyLDAsMTE2LDEwLDAsMTI0LDIsCisgICAgMCwxMzEsMSwwLDEyNCwwLDAsOTUsMTEsMCwxMTAsMTExLDAsMTE2LDEwLDAsCisgICAgMTMxLDAsMCwxMjUsMywwLDEyMCw5MCwwLDEyNCwyLDAsNjgsOTMsODIsMCwKKyAgICAxMjUsNCwwLDEyNCw0LDAsMTA2LDEyLDAsMTAwLDIsMCwxMzEsMSwwLDkyLAorICAgIDMsMCwxMjUsNSwwLDEyNSw2LDAsMTI1LDcsMCwxMjQsNiwwLDExNCwxOTEsCisgICAgMCwxMDAsMywwLDEwNiwxMywwLDEyNCw1LDAsMTI0LDcsMCwxMDYsMTQsMCwKKyAgICAxMzEsMCwwLDEzMSwyLDAsMTI1LDgsMCwxMTAsNiwwLDEyNCw1LDAsMTI1LAorICAgIDgsMCwxMjQsMywwLDEwNiwxNSwwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywKKyAgICAxMjgsMCw4NywxMjQsMywwLDEyNCwwLDAsOTUsMTEsMCwxMTYsNywwLDEwNiwKKyAgICA4LDAsMTA2LDksMCwxMTYsMTYsMCwxMzEsMSwwLDExNCw3LDEsMTAwLDQsCisgICAgMCwxMDAsNSwwLDEzMiwwLDAsMTI0LDIsMCw2OCwxMzEsMSwwLDEyNCwwLAorICAgIDAsOTUsMTcsMCwxMDAsNiwwLDgzLDQxLDcsMTIyLDY4LDcwLDEwNSwxMDgsMTA4LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMzIsMTExLDEwMiwzMiwxMTIsMTExLAorICAgIDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsCisgICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDYsCisgICAgMTE0LDAsMCwwLDAsMTE0LDU4LDAsMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLAorICAgIDEyNSw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsCisgICAgMCwwLDgzLDAsMCwwLDExNSwyOCwwLDAsMCwxMDQsMCwwLDEyNCwwLAorICAgIDAsOTMsMTgsMCwxMjUsMSwwLDEyNCwxLDAsMTA2LDAsMCwxMzEsMCwwLAorICAgIDE0NiwyLDAsMTEzLDYsMCw4MywxMTQsNCwwLDAsMCw0MSwxLDExNCw4OCwKKyAgICAwLDAsMCw0MSwyLDExNCwyMiwwLDAsMCw5MCwyLDEwMiwxMTAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsCisgICAgMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsNjIsOCw1LDAsMCwxMTUsMiwwLDAsCisgICAgMCw5LDAsMTIyLDQxLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCisgICAgOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsNjAsMTA4LDExMSw5OSwKKyAgICA5NywxMDgsMTE1LDYyLDQ2LDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDc4LDQxLAorICAgIDE4LDExNCwzNSwwLDAsMCwxMTQsMywwLDAsMCw5MCw3LDEwOCwxMDUsMTE1LAorICAgIDExNiwxMDAsMTA1LDExNCwxMTQsNDUsMCwwLDAsMTE0LDI1MiwwLDAsMCwyMTgsMTUsCisgICAgODAsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsNjksMTE0LDExNCwxMTEsMTE0LDIxOCwKKyAgICAxOCw3OCwxMTEsMTE2LDY1LDY4LDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw2OSwxMTQsCisgICAgMTE0LDExMSwxMTQsMTE0LDcsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LDksMCwKKyAgICAwLDAsMTE0LDUsMSwwLDAsMTE0LDYsMSwwLDAsMTE0LDgzLDAsMCwKKyAgICAwLDExNCw0NywwLDAsMCwxMTQsODgsMCwwLDAsMjE4LDMsOTcsMTAwLDEwMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDcsMSwwLDAsNDEsOSwxMTQsMTAwLDAsMCwKKyAgICAwLDExNCwzNSwwLDAsMCw5MCw4LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwKKyAgICA5MCwyMSwxMDgsMTExLDExOSwxMDEsMTE0LDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDk1LDk5LAorICAgIDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwxMTQsMjQxLDAsMCwwLDExNCw5OCwwLDAsCisgICAgMCwxMTQsMjMxLDAsMCwwLDExNCwyMTksMCwwLDAsOTAsOCwxMTAsMTAxLDExOSwKKyAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNSwwLDAsMCwxMTQsOSwxLDAsMCwyMzUsNCwwLDAsMTE1LDM0LDAsCisgICAgMCwwLDAsMiw5LDEsMywxLDMxLDEsMjIsMywxMSwzLDE4LDEsCisgICAgMTgsNyw5LDEsMTMsMSwyNCwxLDYsMSwyNywyLDYsMSwxNywxLAorICAgIDksMSwxOCwxLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNywwLDAsCisgICAgMCwxMTUsMjUsMCwwLDAsMTM1LDAsMCwxMzUsMSwwLDEwMiwyLDAsMTAwLAorICAgIDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI1LDIsMCwxMjQsMiwwLDgzLDQxLAorICAgIDMsOTcsMjAsMSwwLDAsNjUsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTA5LDEwMSwKKyAgICAxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsCisgICAgMTEwLDExNSwzMiw5NywzMiw5OSwxMDgsMTExLDExNSwxMTcsMTE0LDEwMSwzMiwxMTYsMTExLDMyLAorICAgIDExNywxMTUsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA0LDExMSwxMTEsMTA3LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExOSwxMDQsMTA1LAorICAgIDk5LDEwNCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsCisgICAgMTEwLDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDMyLDExNywxMTUsMTA1LDExMCwxMDMsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDgsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDExNSwzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk5LDk3LDEwOCwxMDgsCisgICAgMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwOCwxMTEsMTE1LDExNywxMTQsCisgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTExLAorICAgIDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwxMTcsMTE0LDEwMSwzMiwxMDUsMTE1LAorICAgIDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsCisgICAgNDQsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDQsMCwwLDAsMTksMCwwLDAsMTE1LAorICAgIDQzLDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLDExNSwzMCwwLAorICAgIDExNiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEyNCwwLDAsMTMxLDEsMSwxMzAsCisgICAgMSwwLDEzNiwwLDAsMTI0LDAsMCwxMzYsMSwwLDE0MCwxLDAsODMsNDEsCisgICAgMywxMjIsNDUsODAsOTcsMTE2LDEwNCwzMiwxMDQsMTExLDExMSwxMDcsMzIsMTAyLDExMSwxMTQsCisgICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0NiwxMDksOTcsOTksMTA0LDEwNSwKKyAgICAxMTAsMTAxLDExNCwxMjEsNDYsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKKyAgICAxMjIsMzAsMTExLDExMCwxMDgsMTIxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMDUsCisgICAgMTAxLDExNSwzMiw5NywxMTQsMTAxLDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLAorICAgIDExNCwzNSwwLDAsMCw0MSwyLDExNCw0NiwwLDAsMCwxMTQsOTksMCwwLAorICAgIDAsNDEsMSwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsMTY0LDAsMCwwLDExNCwKKyAgICA4LDEsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwyNCwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsNzAsMTA1LAorICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwyMCw1LDAsMCwxMTUsNiwwLDAsCisgICAgMCwwLDIsMTIsMSwxOCwxLDEyMiw1NCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLAorICAgIDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw0Niw2MCwxMDgsCisgICAgMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LAorICAgIDk1LDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LAorICAgIDQsMCwwLDAsNDEsMywxMTQsMTY0LDAsMCwwLDExNCw4LDEsMCwwLAorICAgIDExNCwxNCwxLDAsMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxNjQsMCwwLAorICAgIDAsMTE0LDgsMSwwLDAsMTE0LDUsMCwwLDAsMjE4LDksMTEyLDk3LDExNiwKKyAgICAxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDEwLDUsMCwwLDExNSw0LDAsMCwwLDAsCisgICAgMTAsMjEsNiwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTksMSwwLDAsMCwwLDAsCisgICAgMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsCisgICAgMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCisgICAgMSwwLDgzLDQxLDIsNzgsMTIyLDE2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDAsMTIzLDMzLDExNCwxMjUsNDEsNDEsMiwxMTQsNDcsMCwwLDAsMTE0LAorICAgIDM1LDAsMCwwLDQxLDEsMTE0LDEwMCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjQwLDAsMCwwLDI4LAorICAgIDUsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsCisgICAgNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNDEsCisgICAgMTUsMTE0LDEwNSwwLDAsMCwxMTQsMTA0LDAsMCwwLDExNCwxMDYsMCwwLDAsCisgICAgMTE0LDEwNywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCwyNDYsMCwwLDAsMTE0LAorICAgIDEyMywwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDEsCisgICAgMSwwLDAsMTE0LDE3NSwwLDAsMCwxMTQsOSwxLDAsMCwxMTQsMTc3LDAsCisgICAgMCwwLDExNCwxNSwxLDAsMCwxMTQsMjQwLDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDExNCwyLDEsMCwwLDE0Myw0LDAsMCwxMTUsMjAsMCwwLDAsMTIsNywKKyAgICA2LDIsMTIsMTQsMTIsNCw2LDIsMTIsMTIsMTIsNSwxNSw0NiwxMiwzMSwKKyAgICAxOCwxOCwxMTQsMiwxLDAsMCw5OSw0LDAsMCwwLDAsMCwwLDAsCisgICAgNiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsMTk1LDAsMCwKKyAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTI1LDQsMCwKKyAgICAxMjQsMCwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsMSwwLDEyNSw1LDAsMTI0LAorICAgIDQsMCwxMTUsOTksMCwxMjQsNSwwLDExNCw1NCwwLDEyNCw1LDAsMTA2LDEsCisgICAgMCwxMjUsNCwwLDExMCw0NSwwLDEyNCwyLDAsMTI0LDMsMCwxMDcsMiwwLAorICAgIDExNCw4NCwwLDExNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LAorICAgIDQsMCwxMTAsMTUsMCwxMTYsMywwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwKKyAgICAwLDEyNSw0LDAsMTI0LDUsMCwxMTUsMTI2LDAsMTE2LDQsMCwxMjQsMSwwLAorICAgIDEyNCwyLDAsMTAwLDMsMCwxMjQsNCwwLDEzMSwyLDEsMTI1LDUsMCwxMjEsCisgICAgNDQsMCwxMjQsNSwwLDEyNCwwLDAsMTAwLDIsMCw2MCwxMjQsNCwwLDEyNCwKKyAgICAwLDAsMTAwLDEsMCw2MCwxMjQsMiwwLDEyNCwwLDAsMTAwLDQsMCw2MCwKKyAgICAxMjQsMywwLDEyNCwwLDAsMTAwLDUsMCw2MCw4NywxMTAsMTgsMCw0LDExNiwKKyAgICA1LDAsMTA3LDEwLDAsMTE0LDE5MCwwLDEsMSwxLDg5LDExMCwxLDAsODgsCisgICAgMTAwLDAsMCw4Myw0MSw2LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDk1LDk1LDIxOCw4LDk1LDk1LDExNSwxMTIsMTAxLDk5LDk1LDk1LDExNCwxMjAsMCwKKyAgICAwLDAsOTAsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsOTAsMTAsOTUsOTUsCisgICAgOTksOTcsOTksMTA0LDEwMSwxMDAsOTUsOTUsNDEsNiwyMTgsMywxMDMsMTAxLDExNiwxMTQsCisgICAgMTIwLDAsMCwwLDExNCwyMTcsMCwwLDAsMTE0LDIxMiwwLDAsMCwxMTQsMTYxLAorICAgIDAsMCwwLDIxOCw5LDY5LDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCw0MSw2LAorICAgIDkwLDIsMTEwLDExNSwxMTQsOTgsMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCwxMTAsCisgICAgOTcsMTA5LDEwMSw5MCw5LDk5LDExMiw5NywxMTYsMTA0LDExMCw5NywxMDksMTAxLDExNCwxMjAsCisgICAgMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMTQsOTUsMTAyLDEwNSwxMjAsOTUsMTE3LDExMiwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzNCw1LDAsMCwxMTUsMzQsMCwwLDAsCisgICAgMCwyLDE1LDEsMTUsMSw2LDEsNiwxLDEyLDEsMTIsMSwxOCwyLAorICAgIDE1LDEsNiwxLDIxLDEsMywxLDEwLDEsMTAsMSwxMCwxLDE0LDEsCisgICAgMTMsMiwxMTQsMjAsMSwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNTUsMCwwLAorICAgIDAsMTE2LDAsMCwxMTYsMSwwLDEwNiwyLDAsMTMxLDAsMCwxMDIsMiwwLAorICAgIDEyNSwwLDAsMTE2LDMsMCwxMTYsNCwwLDEwMiwyLDAsMTI1LDEsMCwxMTYsCisgICAgNSwwLDExNiw2LDAsMTAyLDIsMCwxMjUsMiwwLDEyNCwwLDAsMTI0LDEsCisgICAgMCwxMjQsMiwwLDEwMywzLDAsODMsNDEsMSwxMjIsOTUsODIsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCwxMTUsMzIsOTcsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDExMSwxMDIsMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY5LDk3LAorICAgIDk5LDEwNCwzMiwxMDUsMTE2LDEwMSwxMDksMzIsMTA1LDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwKKyAgICAxMDgsMTAxLDMyLDQwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTE1LDExNywxMDIsMTAyLAorICAgIDEwNSwxMjAsMTAxLDExNSw0MSw0NiwxMCwzMiwzMiwzMiwzMiw0MSw3LDExNCwyMTgsMCwKKyAgICAwLDAsMTE0LDEzOSwwLDAsMCwyMTgsMTgsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAorICAgIDExMSwxMTAsOTUsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLDExNSwxMTQsMjEyLDAsMCwwLAorICAgIDExNCw4NCwwLDAsMCwxMTQsMjE3LDAsMCwwLDExNCw3NCwwLDAsMCw0MSwKKyAgICAzLDkwLDEwLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDExNSw5MCw2LDExNSwKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsOTAsOCw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTU1LAorICAgIDAsMCwwLDU3LDUsMCwwLDExNSw4LDAsMCwwLDAsNSwxOCwxLAorICAgIDEyLDEsMTIsMSwxMTQsMTU1LDAsMCwwLDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCwxMiwwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsNzAsCisgICAgMiwwLDAsMTI0LDAsMCw5NywwLDAsMTE2LDAsMCwxMDYsMSwwLDk3LAorICAgIDEsMCwxMTYsMCwwLDEwNiwyLDAsOTcsMiwwLDExNiwxLDAsMTA2LDMsCisgICAgMCwxMTYsNCwwLDI1LDEyNSwxLDAsMTIwLDc2LDAsMTAwLDI2LDAsNjgsOTMsCisgICAgNjgsMCwxMjUsMiwwLDEyNCwyLDAsMTE2LDEsMCwxMDYsMywwLDEwNyw3LAorICAgIDAsMTE0LDgzLDAsMTE2LDAsMCwxMDYsNSwwLDEyNCwyLDAsMTMxLDEsMCwKKyAgICAxMjUsMywwLDExMCwxMywwLDExNiwxLDAsMTA2LDMsMCwxMjQsMiwwLDI1LAorICAgIDEyNSwzLDAsMTE2LDYsMCwxMjQsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMzEsCisgICAgMywwLDEsMTEzLDQ0LDAsODcsMTAwLDUsMCwxMDAsNiwwLDEwMywxLDAsCisgICAgMTAyLDIsMCwxMDAsNywwLDEwMCw4LDAsMTAwLDYsMCwxMDMsMiwwLDEwMiwKKyAgICAyLDAsMTAyLDIsMCwxMjUsNCwwLDEyMCwxNDksMCwxMjQsNCwwLDY4LDkzLAorICAgIDEyOSwwLDkyLDIsMCwxMjUsNSwwLDEyNSw2LDAsMTE2LDcsMCwxMDAsOSwKKyAgICAwLDEwMCwxMCwwLDEzMiwwLDAsMTI0LDYsMCw2OCwxMzEsMSwwLDEzMSwxLAorICAgIDAsMTE1LDE5OSwwLDExNiw4LDAsMTMwLDEsMCwxMjQsNiwwLDEwMCwxMSwwLAorICAgIDI1LDEyNSw3LDAsMTI0LDUsMCwxMTYsMSwwLDEwNiwzLDAsMTA3LDYsMCwKKyAgICAxMTQsMjQxLDAsMTE2LDEsMCwxMDYsMywwLDEyNCw1LDAsMjUsMTI1LDgsMCwKKyAgICA4MCwxMTMsMTU2LDAsMTIxLDIwLDAsMTE2LDAsMCwxMDYsNSwwLDEyNCw1LDAsCisgICAgMTMxLDEsMCwxMjUsOCwwLDgwLDg3LDExMywxNTYsMCw0LDExNiw5LDAsMTA3LAorICAgIDEwLDAsMTE0LDI4LDEsMSwxLDEsMTE5LDE1NiwwLDg5LDExMywxNTYsMCw4OCwKKyAgICAxMTMsMTU2LDAsODcsMTE2LDksMCwxMDAsMTIsMCwxMzEsMSwwLDEzMCwxLDAsCisgICAgMTE2LDYsMCwxMjQsMSwwLDEwMCwxMywwLDEyNCw4LDAsMTMxLDMsMCwxLAorICAgIDExNiw2LDAsMTI0LDEsMCwxMDAsMTQsMCwxMjQsNywwLDEzMSwzLDAsMSwKKyAgICAxMTYsNiwwLDEyNCwxLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTA2LDEwLDAsMTI0LAorICAgIDYsMCwxMzEsMSwwLDEzMSwzLDAsMSwxMjEsMTksMCwxMTYsMCwwLDEwNiwKKyAgICA1LDAsMTAwLDE3LDAsMTMxLDEsMCwxMjUsOSwwLDg3LDExMCwyNCwwLDQsCisgICAgMTE2LDksMCwxMDcsMTAsMCwxMTQsMTQ3LDEsMSwxLDEsMTAwLDE4LDAsMTI1LAorICAgIDksMCw4OSwxMTAsMSwwLDg4LDExNiw2LDAsMTI0LDEsMCwxMDAsMTcsMCwKKyAgICAxMjQsOSwwLDEzMSwzLDAsMSwxMTYsMCwwLDEwNiw1LDAsMTAwLDE5LDAsCisgICAgMTMxLDEsMCwxMjUsMTAsMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDE5LDAsMTI0LAorICAgIDEwLDAsMTMxLDMsMCwxLDEyNCw1LDAsMTAwLDcsMCwxMDcsMiwwLDExNCwKKyAgICAyMzgsMSwxMTYsMCwwLDEwNiw1LDAsMTAwLDIwLDAsMTMxLDEsMCwxMjUsMTEsCisgICAgMCwxMTYsNiwwLDEyNCwxLDAsMTAwLDIxLDAsMTI0LDExLDAsMTMxLDMsMCwKKyAgICAxLDExNiw2LDAsMTI0LDEsMCwxMDAsMjIsMCwxMTYsMTEsMCwxMzEsMCwwLAorICAgIDEzMSwzLDAsMSwxMTYsMTIsMCwxMDYsMTMsMCwxMTYsMiwwLDEwNiwxNCwwLAorICAgIDEzMSwwLDAsMTMxLDEsMCwxLDEyNCw1LDAsMTAwLDcsMCwxMDcsMiwwLAorICAgIDExNCw2NiwyLDExNiwxNSwwLDEwNiwxNiwwLDEwMCwyMywwLDEzMSwxLDAsMSwKKyAgICAxMDAsMjQsMCwxMTYsMTIsMCwxMDcsNiwwLDExNCw2NiwyLDEwMCwyNSwwLDExNiwKKyAgICAxNywwLDk1LDE4LDAsMTAwLDE4LDAsODMsNDEsMjcsMTIyLDIwNSw4MywxMDEsMTE2LAorICAgIDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsOTcsMTE1LDEwMSwKKyAgICAxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMTUsMzIsMTAyLDExMSwxMTQsMzIsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5OCwxMjEsMzIsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMTAsMzIsMzIsCisgICAgMzIsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTEwLDEwMywKKyAgICAzMiwxMTYsMTA0LDEwMSwxMDksMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDEwMywKKyAgICAxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw3OSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksMTExLDEwOSwxMTIsCisgICAgMTExLDExMCwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTIwLDExNiwxMTQsOTcsCisgICAgOTksMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDMyLDk5LDExMSwKKyAgICAxMTQsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsNDksMCwwLDAsMTE0LAorICAgIDYwLDAsMCwwLDIxOCw4LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDExNSwxMTQsMTM2LAorICAgIDAsMCwwLDkwLDUsMTEyLDExMSwxMTUsMTA1LDEyMCwyNTAsMSw0NywyMTgsMiwxMTAsCisgICAgMTE2LDI1MCwxLDkyLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDMsMCwwLDAsMTE1LDAsMCwwLDExNSwzMywwLDAsMCwxMjQsMCwKKyAgICAwLDkzLDIzLDAsMTI1LDEsMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwKKyAgICAxMDAsMCwwLDEwNywyLDAsODYsMSwxMTMsMywwLDEwMCwxLDAsODMsNDEsCisgICAgMiwxMTQsMjksMCwwLDAsNzgsNDEsMSwxMTQsMzEsMCwwLDAsNDEsMiwKKyAgICAxMTQsMjIsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMjEsMCwwLDAsOTMsNSwKKyAgICAwLDAsMTE1LDIsMCwwLDAsNiwwLDEyMiwyNSw5NSwxMTUsMTAxLDExNiwxMTcsCisgICAgMTEyLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsCisgICAgMTIwLDExMiwxMTQsNjIsMTE0LDU5LDAsMCwwLDEyMiwzMCwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDgsMTA1LDk4LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTEyLDExMSwKKyAgICAxMTUsMTA1LDEyMCwzMiwxMTEsMTE0LDMyLDExMCwxMTYsMTE0LDMsMCwwLDAsMTE0LDI1LAorICAgIDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsMzAsMCwwLDAsOTAsNyw5NSwKKyAgICAxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDc4LDkwLDgsOTUsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwKKyAgICAxMDIsOTAsNiwxMTksMTA1LDExMCwxMTQsMTAxLDEwMywxMTQsMTYzLDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDEyMiw0LDQ2LDExMiwxMjEsMTE5LDEyMiw2LDk1LDEwMCw0NiwxMTIsMTIxLAorICAgIDEwMCw4NCw0MSw0LDEyMiwzLDk1LDEwNSwxMTEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsCisgICAgMTA1LDExMCwxMDMsMTE1LDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDExNSwxMjIsNywKKyAgICAxMDksOTcsMTE0LDExNSwxMDQsOTcsMTA4LDQxLDE5LDExNCwxMTQsMCwwLDAsMTE0LDcsCisgICAgMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsMjMzLDAsMCwwLDExNCwxMDUsMCwKKyAgICAwLDAsOTAsMTgsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsCisgICAgMTA5LDk1LDExMCw5NywxMDksMTAxLDExNCwxMDksMCwwLDAsMjE4LDMsOTcsMTA4LDEwOCwKKyAgICAyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsCisgICAgMTE0LDk5LDAsMCwwLDExNCwyNiwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAorICAgIDIyMywwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwyMSwxLDAsMCwxMTQsODQsCisgICAgMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTYyLDAsMCwwLDExNCwxNjcsMCwKKyAgICAwLDAsNDEsMTIsMjE4LDE3LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTAsMTIsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LAorICAgIDEwOSwxMDEsOTAsMTQsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTAsMTAsMTExLDExNSw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCwxMCwKKyAgICA5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMTEsMTE1LDExNCwyMSwwLDAsMCwxMTQsCisgICAgMjUsMCwwLDAsOTAsOSwxMTEsMTE1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLAorICAgIDEzLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTQsCisgICAgMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsCisgICAgMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDYsOTUsMTE1LAorICAgIDEwMSwxMTYsMTE3LDExMiw2OCw1LDAsMCwxMTUsODIsMCwwLDAsMCw4LDYsCisgICAgMSw5LDEsOSwzLDEzLDEsMTMsMSwxNSwxLDE4LDIsMTMsMSwyMCwKKyAgICAzLDMzLDEsMTksMiwzMSwxLDEwLDEsMTUsMSwxMywxLDQsMiwzLAorICAgIDEsMTUsMSw1LDEsMTMsMSwxMiwyLDEyLDEsMTYsMSwxNiwxLDI1LAorICAgIDMsMywxLDE5LDEsMTMsMiwxMSwxLDE2LDMsMTUsMSwxNiwzLDEyLAorICAgIDEsMTUsMSwxNiwzLDE5LDEsMTksMSwxMiwxLDEzLDEsMTIsMSwxMTQsCisgICAgMjksMSwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTE2LDAsMCwwLDExNiwwLAorICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEsMTE2LDEsMCwxMzEsMCwwLDEyNSwxLAorICAgIDAsMTE2LDIsMCwxMDYsMywwLDEwNiw0LDAsMTE2LDUsMCwxMDYsNiwwLAorICAgIDEyNCwxLDAsMTQwLDAsMCwxMDMsMSwwLDEzMSwxLDAsMSwxMTYsNywwLAorICAgIDEwNiw4LDAsMTAwLDEsMCwxMDcsMiwwLDExNCw3OCwwLDExNiwyLDAsMTA2LAorICAgIDksMCwxMDYsMTAsMCwxMTYsMTEsMCwxMzEsMSwwLDEsMTE2LDIsMCwxMDYsCisgICAgOSwwLDEwNiwxMCwwLDExNiwxMiwwLDEzMSwxLDAsMSwxMTYsNSwwLDEyNCwKKyAgICAwLDAsOTUsNSwwLDExNiwxMywwLDEyNCwwLDAsOTUsMTMsMCwxMDAsMiwKKyAgICAwLDgzLDQxLDMsMTIyLDQxLDczLDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMzIsOTksMTExLDEwOSwxMTIsMTExLDExMCwxMDEsMTEwLDExNiwxMTUsNDYsMTE0LAorICAgIDI0LDEsMCwwLDc4LDQxLDE0LDExNCwyOSwxLDAsMCwxMTQsMTU1LDAsMCwKKyAgICAwLDExNCw3LDAsMCwwLDExNCwyNTAsMCwwLDAsMTE0LDE0MywwLDAsMCwKKyAgICAxMTQsMiwxLDAsMCwxMTQsMTUsMSwwLDAsMTE0LDMsMCwwLDAsMTE0LAorICAgIDEwNSwwLDAsMCwyMTgsOSwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsCisgICAgMTU3LDAsMCwwLDExNCwxNjIsMCwwLDAsMTE0LDI0NSwwLDAsMCwxMTQsMjEyLAorICAgIDAsMCwwLDQxLDIsMTE0LDI4LDEsMCwwLDkwLDE3LDExNSwxMTcsMTEyLDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw4LDk1LDEwNSwKKyAgICAxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEzNiw1LDAsMCwxMTUsMTYsMCwwLDAsMCwKKyAgICAyLDEwLDEsOSwxLDI4LDEsMTUsMSwxNiwxLDE2LDQsOSwxLDExNCwKKyAgICAzMSwxLDAsMCw0MSwzLDEyMiwzLDExOSwxMDUsMTEwLDExNCwxLDAsMCwwLAorICAgIDExNCwyLDAsMCwwLDQxLDU2LDExNCwxMDcsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LDE5LDAsMCwwLAorICAgIDExNCwyOCwwLDAsMCwxMTQsMzgsMCwwLDAsMTE0LDM5LDAsMCwwLDExNCwKKyAgICA0MywwLDAsMCwxMTQsNDQsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw1NSwKKyAgICAwLDAsMCwyMTgsNCwxMTYsMTIxLDExMiwxMDEsMjE4LDgsOTUsOTUsOTksMTExLDEwMCwKKyAgICAxMDEsOTUsOTUsMTE0LDEzOCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEyOCwwLAorICAgIDAsMCwxMTQsMTQsMCwwLDAsMTE0LDE4LDAsMCwwLDkwLDE3LDk1LDgyLAorICAgIDY1LDg3LDk1LDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCwKKyAgICA3MywwLDAsMCwxMTQsNzIsMCwwLDAsMTE0LDg0LDAsMCwwLDExNCw3NCwKKyAgICAwLDAsMCw5MCwyMyw2OCw2OSw2Niw4NSw3MSw5NSw2Niw4OSw4NCw2OSw2NywKKyAgICA3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw5MCwyNyw3OSw4MCwKKyAgICA4NCw3Myw3Nyw3Myw5MCw2OSw2OCw5NSw2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSwKKyAgICA5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4MywxMTQsNzksMCwwLDAsMTE0LDg1LAorICAgIDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTUsMCwwLDAsMTE0LDk3LDAsCisgICAgMCwwLDExNCwxMTYsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTM1LDAsMCwKKyAgICAwLDExNCwxNDEsMCwwLDAsMTE0LDE0NCwwLDAsMCwxMTQsMTQ5LDAsMCwwLAorICAgIDIxOCw2LDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTQsMTU2LDAsMCwwLDExNCwxNjEsMCwKKyAgICAwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTc4LDAsMCwwLDExNCwxODgsMCwwLAorICAgIDAsMTE0LDIwNCwwLDAsMCwxMTQsMjEyLDAsMCwwLDExNCwyMTcsMCwwLDAsCisgICAgMTE0LDIyMywwLDAsMCwxMTQsMjE4LDAsMCwwLDExNCwyMjQsMCwwLDAsMTE0LAorICAgIDI0MywwLDAsMCwxMTQsMjQ1LDAsMCwwLDExNCwyLDEsMCwwLDExNCwyMCwKKyAgICAxLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwyOSwxLDAsMCwxMTQsMzEsMSwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsCisgICAgOCwwLDAsMCwxMTUsMTAyLDAsMCwwLDYsMTcsNiwzLDEyLDEyLDEyLAorICAgIDUsMTIsNSwxMiw2LDEyLDEyLDEyLDEwLDEyLDksMTIsNSwxMiw3LDE1LAorICAgIDIyLDE1LDExMiwyMiwxLDE4LDIsNiwxLDYsMiw5LDIsOSwyLDEwLAorICAgIDIsMjEsNDQsMTIsMzMsMTIsMTksMTIsMTIsMTIsMTIsMTIsMjgsMTIsMTcsMjEsCiAgICAgNTUsMjEsMTIsMTgsMTAsMTIsMTQsOSwzLDEyLDEsMTUsNjUsMTksNjQsMTksCi0gICAgMjgsMjIsMTEwLDE5LDQxLDI1LDQzLDI1LDE2LDYsMywyNSw1MywxOSw1NywxOSwKLSAgICA0MSwxOSwxMzQsMTksMTQ2LDE1LDIzLDEyLDExLDEyLDY4LAorICAgIDI5LDIyLDExMCwxOSw0MSwyNSw0NSwyNSwxNiw2LDMsMjUsNTMsMTksNjAsMTksCisgICAgNDIsMTksMTI3LDAsNywxOSwxMjcsMCwyMCwxNSwyMywxMiwxMSwxMiw2OCwKIH07CmRpZmYgLS1naXQgYS9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkgYi9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkKaW5kZXggZDlhMDg1NS4uMDIzYzllNiAxMDA3NTUKLS0tIGEvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5CisrKyBiL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weQpAQCAtMywyNCArMywzNCBAQAogKGZvciBjb21waWxlcnMgc3VwcG9ydGluZyBjb21wdXRlZCBnb3RvcyBvciAibGFiZWxzLWFzLXZhbHVlcyIsIHN1Y2ggYXMgZ2NjKS4KICIiIgogCi0jIFRoaXMgY29kZSBzaG91bGQgc3RheSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYXQgbGVhc3Qgd2hpbGUKLSMgc29tZSBvZiB0aGUgYnVpbGRib3RzIGhhdmUgUHl0aG9uIDIuMyBhcyB0aGVpciBzeXN0ZW0gUHl0aG9uLgotCi1pbXBvcnQgaW1wCiBpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIAogCi1kZWYgZmluZF9tb2R1bGUobW9kbmFtZSk6Ci0gICAgIiIiRmluZHMgYW5kIHJldHVybnMgYSBtb2R1bGUgaW4gdGhlIGxvY2FsIGRpc3QvY2hlY2tvdXQuCi0gICAgIiIiCi0gICAgbW9kcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAiTGliIikKLSAgICByZXR1cm4gaW1wLmxvYWRfbW9kdWxlKG1vZG5hbWUsICppbXAuZmluZF9tb2R1bGUobW9kbmFtZSwgW21vZHBhdGhdKSkKK3RyeToKKyAgICBmcm9tIGltcG9ydGxpYi5tYWNoaW5lcnkgaW1wb3J0IFNvdXJjZUZpbGVMb2FkZXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgaW1wCisKKyAgICBkZWYgZmluZF9tb2R1bGUobW9kbmFtZSk6CisgICAgICAgICIiIkZpbmRzIGFuZCByZXR1cm5zIGEgbW9kdWxlIGluIHRoZSBsb2NhbCBkaXN0L2NoZWNrb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgbW9kcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgIkxpYiIpCisgICAgICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobW9kbmFtZSwgKmltcC5maW5kX21vZHVsZShtb2RuYW1lLCBbbW9kcGF0aF0pKQorZWxzZToKKyAgICBkZWYgZmluZF9tb2R1bGUobW9kbmFtZSk6CisgICAgICAgICIiIkZpbmRzIGFuZCByZXR1cm5zIGEgbW9kdWxlIGluIHRoZSBsb2NhbCBkaXN0L2NoZWNrb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgbW9kcGF0aCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgIkxpYiIsIG1vZG5hbWUgKyAiLnB5IikKKyAgICAgICAgcmV0dXJuIFNvdXJjZUZpbGVMb2FkZXIobW9kbmFtZSwgbW9kcGF0aCkubG9hZF9tb2R1bGUoKQorCiAKIGRlZiB3cml0ZV9jb250ZW50cyhmKToKICAgICAiIiJXcml0ZSBDIGNvZGUgY29udGVudHMgdG8gdGhlIHRhcmdldCBmaWxlIG9iamVjdC4KICAgICAiIiIKLSAgICBvcGNvZGUgPSBmaW5kX21vZHVsZSgib3Bjb2RlIikKKyAgICBvcGNvZGUgPSBmaW5kX21vZHVsZSgnb3Bjb2RlJykKICAgICB0YXJnZXRzID0gWydfdW5rbm93bl9vcGNvZGUnXSAqIDI1NgogICAgIGZvciBvcG5hbWUsIG9wIGluIG9wY29kZS5vcG1hcC5pdGVtcygpOgogICAgICAgICB0YXJnZXRzW29wXSA9ICJUQVJHRVRfJXMiICUgb3BuYW1lCkBAIC0yOSwxNSArMzksMTcgQEAKICAgICBmLndyaXRlKCJcbn07XG4iKQogCiAKLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgaW1wb3J0IHN5cwotICAgIGFzc2VydCBsZW4oc3lzLmFyZ3YpIDwgMywgIlRvbyBtYW55IGFyZ3VtZW50cyIKK2RlZiBtYWluKCk6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA+PSAzOgorICAgICAgICBzeXMuZXhpdCgiVG9vIG1hbnkgYXJndW1lbnRzIikKICAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDI6CiAgICAgICAgIHRhcmdldCA9IHN5cy5hcmd2WzFdCiAgICAgZWxzZToKICAgICAgICAgdGFyZ2V0ID0gIlB5dGhvbi9vcGNvZGVfdGFyZ2V0cy5oIgotICAgIGYgPSBvcGVuKHRhcmdldCwgInciKQotICAgIHRyeToKKyAgICB3aXRoIG9wZW4odGFyZ2V0LCAidyIpIGFzIGY6CiAgICAgICAgIHdyaXRlX2NvbnRlbnRzKGYpCi0gICAgZmluYWxseToKLSAgICAgICAgZi5jbG9zZSgpCisgICAgcHJpbnQoIkp1bXAgdGFibGUgd3JpdHRlbiBpbnRvICVzIiAlIHRhcmdldCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvUHl0aG9uL21hcnNoYWwuYyBiL1B5dGhvbi9tYXJzaGFsLmMKaW5kZXggNWI4ZGU5OS4uNjI3YTg0MiAxMDA2NDQKLS0tIGEvUHl0aG9uL21hcnNoYWwuYworKysgYi9QeXRob24vbWFyc2hhbC5jCkBAIC0yNjMsMTAgKzI2MywxMCBAQAogICAgIGlmIChQeV9SRUZDTlQodikgPT0gMSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KHAtPmhhc2h0YWJsZSwgdik7CisgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWShwLT5oYXNodGFibGUsIHYpOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CiAgICAgICAgIC8qIHdyaXRlIHRoZSByZWZlcmVuY2UgaW5kZXggdG8gdGhlIHN0cmVhbSAqLwotICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShwLT5oYXNodGFibGUsICZ3LCBzaXplb2YodyksIGVudHJ5KTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEocC0+aGFzaHRhYmxlLCBlbnRyeSwgdyk7CiAgICAgICAgIC8qIHdlIGRvbid0IHN0b3JlICJsb25nIiBpbmRpY2VzIGluIHRoZSBkaWN0ICovCiAgICAgICAgIGFzc2VydCgwIDw9IHcgJiYgdyA8PSAweDdmZmZmZmZmKTsKICAgICAgICAgd19ieXRlKFRZUEVfUkVGLCBwKTsKQEAgLTU3MSw3ICs1NzEsOCBAQAogd19pbml0X3JlZnMoV0ZJTEUgKndmLCBpbnQgdmVyc2lvbikKIHsKICAgICBpZiAodmVyc2lvbiA+PSAzKSB7Ci0gICAgICAgIHdmLT5oYXNodGFibGUgPSBfUHlfaGFzaHRhYmxlX25ldyhzaXplb2YoaW50KSwgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKKyAgICAgICAgd2YtPmhhc2h0YWJsZSA9IF9QeV9oYXNodGFibGVfbmV3KHNpemVvZihQeU9iamVjdCAqKSwgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CiAgICAgICAgIGlmICh3Zi0+aGFzaHRhYmxlID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CkBAIC01ODIsOSArNTgzLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLXdfZGVjcmVmX2VudHJ5KF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKlB5X1VOVVNFRChkYXRhKSkKK3dfZGVjcmVmX2VudHJ5KF9QeV9oYXNodGFibGVfdCAqaHQsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICB2b2lkICpQeV9VTlVTRUQoZGF0YSkpCiB7Ci0gICAgUHlfWERFQ1JFRihlbnRyeS0+a2V5KTsKKyAgICBQeU9iamVjdCAqZW50cnlfa2V5OworCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIGVudHJ5X2tleSk7CisgICAgUHlfWERFQ1JFRihlbnRyeV9rZXkpOwogICAgIHJldHVybiAwOwogfQogCkBAIC02NDMsNyArNjQ4LDcgQEAKICAgICBQeU9iamVjdCAqcmVmczsgIC8qIGEgbGlzdCAqLwogfSBSRklMRTsKIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogcl9zdHJpbmcoUHlfc3NpemVfdCBuLCBSRklMRSAqcCkKIHsKICAgICBQeV9zc2l6ZV90IHJlYWQgPSAtMTsKQEAgLTcyOSw3ICs3MzQsNyBAQAogICAgICAgICBjID0gZ2V0YyhwLT5mcCk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBjaGFyICpwdHIgPSByX3N0cmluZygxLCBwKTsKKyAgICAgICAgY29uc3QgY2hhciAqcHRyID0gcl9zdHJpbmcoMSwgcCk7CiAgICAgICAgIGlmIChwdHIgIT0gTlVMTCkKICAgICAgICAgICAgIGMgPSAqKHVuc2lnbmVkIGNoYXIgKikgcHRyOwogICAgIH0KQEAgLTc0MCw5ICs3NDUsOSBAQAogcl9zaG9ydChSRklMRSAqcCkKIHsKICAgICBzaG9ydCB4ID0gLTE7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAotICAgIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDIsIHApOworICAgIGJ1ZmZlciA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDIsIHApOwogICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICB4ID0gYnVmZmVyWzBdOwogICAgICAgICB4IHw9IGJ1ZmZlclsxXSA8PCA4OwpAQCAtNzU2LDkgKzc2MSw5IEBACiByX2xvbmcoUkZJTEUgKnApCiB7CiAgICAgbG9uZyB4ID0gLTE7Ci0gICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAotICAgIGJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDQsIHApOworICAgIGJ1ZmZlciA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDQsIHApOwogICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICB4ID0gYnVmZmVyWzBdOwogICAgICAgICB4IHw9IChsb25nKWJ1ZmZlclsxXSA8PCA4OwpAQCAtOTc4LDcgKzk4Myw4IEBACiAKICAgICBjYXNlIFRZUEVfRkxPQVQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl0sICpwdHI7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgZG91YmxlIGR4OwogICAgICAgICAgICAgbiA9IHJfYnl0ZShwKTsKICAgICAgICAgICAgIGlmIChuID09IEVPRikgewpAQCAtMTAwMSw5ICsxMDA3LDkgQEAKIAogICAgIGNhc2UgVFlQRV9CSU5BUllfRkxPQVQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZjsKICAgICAgICAgICAgIGRvdWJsZSB4OwotICAgICAgICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CisgICAgICAgICAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIHggPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7CkBAIC0xMDE2LDcgKzEwMjIsOCBAQAogCiAgICAgY2FzZSBUWVBFX0NPTVBMRVg6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl0sICpwdHI7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgUHlfY29tcGxleCBjOwogICAgICAgICAgICAgbiA9IHJfYnl0ZShwKTsKICAgICAgICAgICAgIGlmIChuID09IEVPRikgewpAQCAtMTA1MywxNSArMTA2MCwxNSBAQAogCiAgICAgY2FzZSBUWVBFX0JJTkFSWV9DT01QTEVYOgogICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CiAgICAgICAgICAgICBQeV9jb21wbGV4IGM7Ci0gICAgICAgICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOwogICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYy5yZWFsID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwogICAgICAgICAgICAgaWYgKGMucmVhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKKyAgICAgICAgICAgIGJ1ZiA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOwogICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYy5pbWFnID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwpAQCAtMTA3NCw3ICsxMDgxLDcgQEAKIAogICAgIGNhc2UgVFlQRV9TVFJJTkc6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKnB0cjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgICAgICAgICAgIG4gPSByX2xvbmcocCk7CiAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExMTksNyArMTEyNiw3IEBACiAgICAgICAgIH0KICAgICBfcmVhZF9hc2NpaToKICAgICAgICAgewotICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHRyOwogICAgICAgICAgICAgcHRyID0gcl9zdHJpbmcobiwgcCk7CiAgICAgICAgICAgICBpZiAocHRyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTM3LDcgKzExNDQsNyBAQAogICAgICAgICBpc19pbnRlcm5lZCA9IDE7CiAgICAgY2FzZSBUWVBFX1VOSUNPREU6CiAgICAgICAgIHsKLSAgICAgICAgY2hhciAqYnVmZmVyOworICAgICAgICBjb25zdCBjaGFyICpidWZmZXI7CiAKICAgICAgICAgbiA9IHJfbG9uZyhwKTsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCkBAIC0xMjY0LDQxICsxMjcxLDUyIEBACiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEgKHNldCBzaXplIG91dCBvZiByYW5nZSkiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHYgPSAodHlwZSA9PSBUWVBFX1NFVCkgPyBQeVNldF9OZXcoTlVMTCkgOiBQeUZyb3plblNldF9OZXcoTlVMTCk7Ci0gICAgICAgIGlmICh0eXBlID09IFRZUEVfU0VUKSB7Ci0gICAgICAgICAgICBSX1JFRih2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIG11c3QgdXNlIGRlbGF5ZWQgcmVnaXN0cmF0aW9uIG9mIGZyb3plbnNldHMgYmVjYXVzZSB0aGV5IG11c3QKLSAgICAgICAgICAgICAqIGJlIGluaXQgd2l0aCBhIHJlZmNvdW50IG9mIDEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWR4ID0gcl9yZWZfcmVzZXJ2ZShmbGFnLCBwKTsKLSAgICAgICAgICAgIGlmIChpZHggPCAwKQotICAgICAgICAgICAgICAgIFB5X0NMRUFSKHYpOyAvKiBzaWduYWwgZXJyb3IgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgdjIgPSByX29iamVjdChwKTsKLSAgICAgICAgICAgIGlmICggdjIgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIGZvciBzZXQiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgIGlmIChuID09IDAgJiYgdHlwZSA9PSBUWVBFX0ZST1pFTlNFVCkgeworICAgICAgICAgICAgLyogY2FsbCBmcm96ZW5zZXQoKSB0byBnZXQgdGhlIGVtcHR5IGZyb3plbnNldCBzaW5nbGV0b24gKi8KKyAgICAgICAgICAgIHYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFB5U2V0X0FkZCh2LCB2MikgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKLSAgICAgICAgICAgICAgICB2ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgICAgICBSX1JFRih2KTsKKyAgICAgICAgICAgIHJldHZhbCA9IHY7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgIT0gVFlQRV9TRVQpCi0gICAgICAgICAgICB2ID0gcl9yZWZfaW5zZXJ0KHYsIGlkeCwgZmxhZywgcCk7Ci0gICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdiA9ICh0eXBlID09IFRZUEVfU0VUKSA/IFB5U2V0X05ldyhOVUxMKSA6IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFRZUEVfU0VUKSB7CisgICAgICAgICAgICAgICAgUl9SRUYodik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGRlbGF5ZWQgcmVnaXN0cmF0aW9uIG9mIGZyb3plbnNldHMgYmVjYXVzZSB0aGV5IG11c3QKKyAgICAgICAgICAgICAgICAgKiBiZSBpbml0IHdpdGggYSByZWZjb3VudCBvZiAxCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWR4ID0gcl9yZWZfcmVzZXJ2ZShmbGFnLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgUHlfQ0xFQVIodik7IC8qIHNpZ25hbCBlcnJvciAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgIHYyID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEgZm9yIHNldCIpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5U2V0X0FkZCh2LCB2MikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZSAhPSBUWVBFX1NFVCkKKyAgICAgICAgICAgICAgICB2ID0gcl9yZWZfaW5zZXJ0KHYsIGlkeCwgZmxhZywgcCk7CisgICAgICAgICAgICByZXR2YWwgPSB2OworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUWVBFX0NPREU6CmRpZmYgLS1naXQgYS9QeXRob24vbW9kc3VwcG9ydC5jIGIvUHl0aG9uL21vZHN1cHBvcnQuYwppbmRleCA2YzkzOGRkLi43ZTZhNjViIDEwMDY0NAotLS0gYS9QeXRob24vbW9kc3VwcG9ydC5jCisrKyBiL1B5dGhvbi9tb2RzdXBwb3J0LmMKQEAgLTMwMSw3ICszMDEsNyBAQAogICAgICAgICBjYXNlICdVJzogICAvKiBYWFggZGVwcmVjYXRlZCBhbGlhcyAqLwogICAgICAgICB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdjsKLSAgICAgICAgICAgIGNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKICAgICAgICAgICAgIFB5X3NzaXplX3QgbjsKICAgICAgICAgICAgIGlmICgqKnBfZm9ybWF0ID09ICcjJykgewogICAgICAgICAgICAgICAgICsrKnBfZm9ybWF0OwpAQCAtMzM0LDcgKzMzNCw3IEBACiAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdjsKLSAgICAgICAgICAgIGNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKICAgICAgICAgICAgIFB5X3NzaXplX3QgbjsKICAgICAgICAgICAgIGlmICgqKnBfZm9ybWF0ID09ICcjJykgewogICAgICAgICAgICAgICAgICsrKnBfZm9ybWF0OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL215c3RydG91bC5jIGIvUHl0aG9uL215c3RydG91bC5jCmluZGV4IDk4NDI5ZDQuLmE4NTc5MGUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9teXN0cnRvdWwuYworKysgYi9QeXRob24vbXlzdHJ0b3VsLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHNtYWxsbWF4W2Jhc2VdIGlzIHRoZSBsYXJnZXN0IHVuc2lnbmVkIGxvbmcgaSBzdWNoIHRoYXQKICAqIGkgKiBiYXNlIGRvZXNuJ3Qgb3ZlcmZsb3cgdW5zaWduZWQgbG9uZy4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgc21hbGxtYXhbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHNtYWxsbWF4W10gPSB7CiAgICAgMCwgLyogYmFzZXMgMCBhbmQgMSBhcmUgaW52YWxpZCAqLwogICAgIDAsCiAgICAgVUxPTkdfTUFYIC8gMiwKQEAgLTYyLDE0ICs2MiwxNCBAQAogICogTm90ZSB0aGF0IHRoaXMgaXMgcGVzc2ltaXN0aWMgaWYgc2l6ZW9mKGxvbmcpID4gNC4KICAqLwogI2lmIFNJWkVPRl9MT05HID09IDQKLXN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0geworc3RhdGljIGNvbnN0IGludCBkaWdpdGxpbWl0W10gPSB7CiAgICAgMCwgIDAsIDMyLCAyMCwgMTYsIDEzLCAxMiwgMTEsIDEwLCAxMCwgIC8qICAwIC0gIDkgKi8KICAgICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgLyogMTAgLSAxOSAqLwogICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICAvKiAyMCAtIDI5ICovCiAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KICNlbGlmIFNJWkVPRl9MT05HID09IDgKIC8qIFtpbnQobWF0aC5mbG9vcihtYXRoLmxvZygyKio2NCwgaSkpKSBmb3IgaSBpbiByYW5nZSgyLCAzNyldICovCi1zdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgZGlnaXRsaW1pdFtdID0gewogICAgICAgICAgMCwgICAwLCA2NCwgNDAsIDMyLCAyNywgMjQsIDIyLCAyMSwgMjAsICAvKiAgMCAtICA5ICovCiAgICAgMTksICAxOCwgMTcsIDE3LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAgLyogMTAgLSAxOSAqLwogICAgIDE0LCAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgIC8qIDIwIC0gMjkgKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9vcGNvZGVfdGFyZ2V0cy5oIGIvUHl0aG9uL29wY29kZV90YXJnZXRzLmgKaW5kZXggMTkyNTllMS4uMzg3MjI1NiAxMDA2NDQKLS0tIGEvUHl0aG9uL29wY29kZV90YXJnZXRzLmgKKysrIGIvUHl0aG9uL29wY29kZV90YXJnZXRzLmgKQEAgLTE1NCw3ICsxNTQsNyBAQAogICAgICYmVEFSR0VUX0JVSUxEX1RVUExFX1VOUEFDSywKICAgICAmJlRBUkdFVF9CVUlMRF9TRVRfVU5QQUNLLAogICAgICYmVEFSR0VUX1NFVFVQX0FTWU5DX1dJVEgsCi0gICAgJiZfdW5rbm93bl9vcGNvZGUsCisgICAgJiZUQVJHRVRfRk9STUFUX1ZBTFVFLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmX3Vua25vd25fb3Bjb2RlLApkaWZmIC0tZ2l0IGEvUHl0aG9uL3BlZXBob2xlLmMgYi9QeXRob24vcGVlcGhvbGUuYwppbmRleCA1OWFkM2I3Li4yYjJlNGM0IDEwMDY0NAotLS0gYS9QeXRob24vcGVlcGhvbGUuYworKysgYi9QeXRob24vcGVlcGhvbGUuYwpAQCAtMTE4LDkgKzExOCw3IEBACiAgICAgLyogSWYgaXQncyBhIEJVSUxEX1NFVCwgdXNlIHRoZSBQeVR1cGxlIHdlIGp1c3QgYnVpbHQgdG8gY3JlYXRlIGEKICAgICAgIFB5RnJvemVuU2V0LCBhbmQgdXNlIHRoYXQgYXMgdGhlIGNvbnN0YW50IGluc3RlYWQ6ICovCiAgICAgaWYgKGNvZGVzdHJbMF0gPT0gQlVJTERfU0VUKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0dXBsZSA9IG5ld2NvbnN0OwotICAgICAgICBuZXdjb25zdCA9IFB5RnJvemVuU2V0X05ldyh0dXBsZSk7Ci0gICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgICAgIFB5X1hTRVRSRUYobmV3Y29uc3QsIFB5RnJvemVuU2V0X05ldyhuZXdjb25zdCkpOwogICAgICAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTM0OCwxOSArMzQ2LDE5IEBACiAgICBzaW5nbGUgYmFzaWMgYmxvY2suICBBbGwgdHJhbnNmb3JtYXRpb25zIGtlZXAgdGhlIGNvZGUgc2l6ZSB0aGUgc2FtZSBvcgogICAgc21hbGxlci4gIEZvciB0aG9zZSB0aGF0IHJlZHVjZSBzaXplLCB0aGUgZ2FwcyBhcmUgaW5pdGlhbGx5IGZpbGxlZCB3aXRoCiAgICBOT1BzLiAgTGF0ZXIgdGhvc2UgTk9QcyBhcmUgcmVtb3ZlZCBhbmQgdGhlIGp1bXAgYWRkcmVzc2VzIHJldGFyZ2V0ZWQgaW4KLSAgIGEgc2luZ2xlIHBhc3MuICBMaW5lIG51bWJlcmluZyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi8KKyAgIGEgc2luZ2xlIHBhc3MuICBDb2RlIG9mZnNldCBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi8KIAogUHlPYmplY3QgKgogUHlDb2RlX09wdGltaXplKFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCogY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmxpbmVub19vYmopCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxub3RhYl9vYmopCiB7CiAgICAgUHlfc3NpemVfdCBpLCBqLCBjb2RlbGVuOwogICAgIGludCBub3BzLCBoLCBhZGo7CiAgICAgaW50IHRndCwgdGd0dGd0LCBvcGNvZGU7CiAgICAgdW5zaWduZWQgY2hhciAqY29kZXN0ciA9IE5VTEw7Ci0gICAgdW5zaWduZWQgY2hhciAqbGluZW5vOworICAgIHVuc2lnbmVkIGNoYXIgKmxub3RhYjsKICAgICBpbnQgKmFkZHJtYXAgPSBOVUxMOwotICAgIGludCBuZXdfbGluZSwgY3VtX29yaWdfbGluZSwgbGFzdF9saW5lOworICAgIGludCBjdW1fb3JpZ19vZmZzZXQsIGxhc3Rfb2Zmc2V0OwogICAgIFB5X3NzaXplX3QgdGFic2l6OwogICAgIFB5T2JqZWN0ICoqY29uc3Rfc3RhY2sgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgKmxvYWRfY29uc3Rfc3RhY2sgPSBOVUxMOwpAQCAtMzczLDEyICszNzEsMTcgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgZ290byBleGl0RXJyb3I7CiAKLSAgICAvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBpcyB0b28gY29tcGxleCAqLwotICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGxpbmVub19vYmopKTsKLSAgICBsaW5lbm8gPSAodW5zaWduZWQgY2hhciopUHlCeXRlc19BU19TVFJJTkcobGluZW5vX29iaik7Ci0gICAgdGFic2l6ID0gUHlCeXRlc19HRVRfU0laRShsaW5lbm9fb2JqKTsKLSAgICBpZiAobWVtY2hyKGxpbmVubywgMjU1LCB0YWJzaXopICE9IE5VTEwpCisgICAgLyogQnlwYXNzIG9wdGltaXphdGlvbiB3aGVuIHRoZSBsbm90YWIgdGFibGUgaXMgdG9vIGNvbXBsZXggKi8KKyAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhsbm90YWJfb2JqKSk7CisgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIqKVB5Qnl0ZXNfQVNfU1RSSU5HKGxub3RhYl9vYmopOworICAgIHRhYnNpeiA9IFB5Qnl0ZXNfR0VUX1NJWkUobG5vdGFiX29iaik7CisgICAgYXNzZXJ0KHRhYnNpeiA9PSAwIHx8IFB5X1JFRkNOVChsbm90YWJfb2JqKSA9PSAxKTsKKyAgICBpZiAobWVtY2hyKGxub3RhYiwgMjU1LCB0YWJzaXopICE9IE5VTEwpIHsKKyAgICAgICAgLyogMjU1IHZhbHVlIGFyZSB1c2VkIGZvciBtdWx0aWJ5dGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zICovCiAgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKKyAgICB9CisgICAgLyogTm90ZTogLTEyOCBhbmQgMTI3IHNwZWNpYWwgdmFsdWVzIGZvciBsaW5lIG51bWJlciBkZWx0YSBhcmUgb2ssCisgICAgICAgdGhlIHBlZXBob2xlIG9wdGltaXplciBkb2Vzbid0IG1vZGlmeSBsaW5lIG51bWJlcnMuICovCiAKICAgICAvKiBBdm9pZCBzaXR1YXRpb25zIHdoZXJlIGp1bXAgcmV0YXJnZXRpbmcgY291bGQgb3ZlcmZsb3cgKi8KICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhjb2RlKSk7CkBAIC02NjUsMjEgKzY2OCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogRml4dXAgbGluZW5vdGFiICovCisgICAgLyogRml4dXAgbG5vdGFiICovCiAgICAgZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKICAgICAgICAgYXNzZXJ0KGkgLSBub3BzIDw9IElOVF9NQVgpOworICAgICAgICAvKiBvcmlnaW5hbCBjb2RlIG9mZnNldCA9PiBuZXcgY29kZSBvZmZzZXQgKi8KICAgICAgICAgYWRkcm1hcFtpXSA9IChpbnQpKGkgLSBub3BzKTsKICAgICAgICAgaWYgKGNvZGVzdHJbaV0gPT0gTk9QKQogICAgICAgICAgICAgbm9wcysrOwogICAgIH0KLSAgICBjdW1fb3JpZ19saW5lID0gMDsKLSAgICBsYXN0X2xpbmUgPSAwOworICAgIGN1bV9vcmlnX29mZnNldCA9IDA7CisgICAgbGFzdF9vZmZzZXQgPSAwOwogICAgIGZvciAoaT0wIDsgaSA8IHRhYnNpeiA7IGkrPTIpIHsKLSAgICAgICAgY3VtX29yaWdfbGluZSArPSBsaW5lbm9baV07Ci0gICAgICAgIG5ld19saW5lID0gYWRkcm1hcFtjdW1fb3JpZ19saW5lXTsKLSAgICAgICAgYXNzZXJ0IChuZXdfbGluZSAtIGxhc3RfbGluZSA8IDI1NSk7Ci0gICAgICAgIGxpbmVub1tpXSA9KCh1bnNpZ25lZCBjaGFyKShuZXdfbGluZSAtIGxhc3RfbGluZSkpOwotICAgICAgICBsYXN0X2xpbmUgPSBuZXdfbGluZTsKKyAgICAgICAgaW50IG9mZnNldF9kZWx0YSwgbmV3X29mZnNldDsKKyAgICAgICAgY3VtX29yaWdfb2Zmc2V0ICs9IGxub3RhYltpXTsKKyAgICAgICAgbmV3X29mZnNldCA9IGFkZHJtYXBbY3VtX29yaWdfb2Zmc2V0XTsKKyAgICAgICAgb2Zmc2V0X2RlbHRhID0gbmV3X29mZnNldCAtIGxhc3Rfb2Zmc2V0OworICAgICAgICBhc3NlcnQoMCA8PSBvZmZzZXRfZGVsdGEgJiYgb2Zmc2V0X2RlbHRhIDw9IDI1NSk7CisgICAgICAgIGxub3RhYltpXSA9ICh1bnNpZ25lZCBjaGFyKW9mZnNldF9kZWx0YTsKKyAgICAgICAgbGFzdF9vZmZzZXQgPSBuZXdfb2Zmc2V0OwogICAgIH0KIAogICAgIC8qIFJlbW92ZSBOT1BzIGFuZCBmaXh1cCBqdW1wIHRhcmdldHMgKi8KQEAgLTcyOSwxMiArNzM1LDkgQEAKIAogIGV4aXRVbmNoYW5nZWQ6CiAgICAgQ09OU1RfU1RBQ0tfREVMRVRFKCk7Ci0gICAgaWYgKGJsb2NrcyAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7Ci0gICAgaWYgKGFkZHJtYXAgIT0gTlVMTCkKLSAgICAgICAgUHlNZW1fRnJlZShhZGRybWFwKTsKLSAgICBpZiAoY29kZXN0ciAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGNvZGVzdHIpOworICAgIFB5TWVtX0ZyZWUoYmxvY2tzKTsKKyAgICBQeU1lbV9GcmVlKGFkZHJtYXApOworICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CiAgICAgUHlfWElOQ1JFRihjb2RlKTsKICAgICByZXR1cm4gY29kZTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weWxpZmVjeWNsZS5jIGIvUHl0aG9uL3B5bGlmZWN5Y2xlLmMKaW5kZXggY2U1Mjk5MC4uNzRiZGIxOSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5bGlmZWN5Y2xlLmMKKysrIGIvUHl0aG9uL3B5bGlmZWN5Y2xlLmMKQEAgLTE1NCw4ICsxNTQsOCBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiBHbG9iYWwgaW5pdGlhbGl6YXRpb25zLiAgQ2FuIGJlIHVuZG9uZSBieSBQeV9GaW5hbGl6ZSgpLiAgRG9uJ3QKLSAgIGNhbGwgdGhpcyB0d2ljZSB3aXRob3V0IGFuIGludGVydmVuaW5nIFB5X0ZpbmFsaXplKCkgY2FsbC4gIFdoZW4KKy8qIEdsb2JhbCBpbml0aWFsaXphdGlvbnMuICBDYW4gYmUgdW5kb25lIGJ5IFB5X0ZpbmFsaXplRXgoKS4gIERvbid0CisgICBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhbiBpbnRlcnZlbmluZyBQeV9GaW5hbGl6ZUV4KCkgY2FsbC4gIFdoZW4KICAgIGluaXRpYWxpemF0aW9ucyBmYWlsLCBhIGZhdGFsIGVycm9yIGlzIGlzc3VlZCBhbmQgdGhlIGZ1bmN0aW9uIGRvZXMKICAgIG5vdCByZXR1cm4uICBPbiByZXR1cm4sIHRoZSBmaXJzdCB0aHJlYWQgYW5kIGludGVycHJldGVyIHN0YXRlIGhhdmUKICAgIGJlZW4gY3JlYXRlZC4KQEAgLTMyNywxMSArMzI3LDExIEBACiAgICAgKHZvaWQpIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLSAgICAvKiBXZSBjYW4ndCBjYWxsIF9QeUV2YWxfRmluaVRocmVhZHMoKSBpbiBQeV9GaW5hbGl6ZSBiZWNhdXNlCisgICAgLyogV2UgY2FuJ3QgY2FsbCBfUHlFdmFsX0ZpbmlUaHJlYWRzKCkgaW4gUHlfRmluYWxpemVFeCBiZWNhdXNlCiAgICAgICAgZGVzdHJveWluZyB0aGUgR0lMIG1pZ2h0IGZhaWwgd2hlbiBpdCBpcyBiZWluZyByZWZlcmVuY2VkIGZyb20KICAgICAgICBhbm90aGVyIHJ1bm5pbmcgdGhyZWFkIChzZWUgaXNzdWUgIzk5MDEpLgogICAgICAgIEluc3RlYWQgd2UgZGVzdHJveSB0aGUgcHJldmlvdXNseSBjcmVhdGVkIEdJTCBoZXJlLCB3aGljaCBlbnN1cmVzCi0gICAgICAgdGhhdCB3ZSBjYW4gY2FsbCBQeV9Jbml0aWFsaXplIC8gUHlfRmluYWxpemUgbXVsdGlwbGUgdGltZXMuICovCisgICAgICAgdGhhdCB3ZSBjYW4gY2FsbCBQeV9Jbml0aWFsaXplIC8gUHlfRmluYWxpemVFeCBtdWx0aXBsZSB0aW1lcy4gKi8KICAgICBfUHlFdmFsX0ZpbmlUaHJlYWRzKCk7CiAKICAgICAvKiBBdXRvLXRocmVhZC1zdGF0ZSBBUEkgKi8KQEAgLTQ3NywyOCArNDc3LDM1IEBACiAgICAgcmV0dXJuIHIgPiAwOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZmx1c2hfc3RkX2ZpbGVzKHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKmZvdXQgPSBfUHlTeXNfR2V0T2JqZWN0SWQoJlB5SWRfc3Rkb3V0KTsKICAgICBQeU9iamVjdCAqZmVyciA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9zdGRlcnIpOwogICAgIFB5T2JqZWN0ICp0bXA7CisgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBpZiAoZm91dCAhPSBOVUxMICYmIGZvdXQgIT0gUHlfTm9uZSAmJiAhZmlsZV9pc19jbG9zZWQoZm91dCkpIHsKICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmb3V0LCAmUHlJZF9mbHVzaCwgIiIpOwotICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGZvdXQpOworICAgICAgICAgICAgc3RhdHVzID0gLTE7CisgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CiAgICAgfQogCiAgICAgaWYgKGZlcnIgIT0gTlVMTCAmJiBmZXJyICE9IFB5X05vbmUgJiYgIWZpbGVfaXNfY2xvc2VkKGZlcnIpKSB7CiAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQoZmVyciwgJlB5SWRfZmx1c2gsICIiKTsKLSAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvKiBVbmRvIHRoZSBlZmZlY3Qgb2YgUHlfSW5pdGlhbGl6ZSgpLgpAQCAtNTE1LDE0ICs1MjIsMTUgQEAKIAogKi8KIAotdm9pZAotUHlfRmluYWxpemUodm9pZCkKK2ludAorUHlfRmluYWxpemVFeCh2b2lkKQogewogICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBpbnQgc3RhdHVzID0gMDsKIAogICAgIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKIAogICAgIHdhaXRfZm9yX3RocmVhZF9zaHV0ZG93bigpOwogCkBAIC01NDcsNyArNTU1LDkgQEAKICAgICBpbml0aWFsaXplZCA9IDA7CiAKICAgICAvKiBGbHVzaCBzeXMuc3Rkb3V0IGFuZCBzeXMuc3RkZXJyICovCi0gICAgZmx1c2hfc3RkX2ZpbGVzKCk7CisgICAgaWYgKGZsdXNoX3N0ZF9maWxlcygpIDwgMCkgeworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CiAKICAgICAvKiBEaXNhYmxlIHNpZ25hbCBoYW5kbGluZyAqLwogICAgIFB5T1NfRmluaUludGVycnVwdHMoKTsKQEAgLTU3Niw3ICs1ODYsOSBAQAogICAgIFB5SW1wb3J0X0NsZWFudXAoKTsKIAogICAgIC8qIEZsdXNoIHN5cy5zdGRvdXQgYW5kIHN5cy5zdGRlcnIgKGFnYWluLCBpbiBjYXNlIG1vcmUgd2FzIHByaW50ZWQpICovCi0gICAgZmx1c2hfc3RkX2ZpbGVzKCk7CisgICAgaWYgKGZsdXNoX3N0ZF9maWxlcygpIDwgMCkgeworICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICB9CiAKICAgICAvKiBDb2xsZWN0IGZpbmFsIGdhcmJhZ2UuICBUaGlzIGRpc3Bvc2VzIG9mIGN5Y2xlcyBjcmVhdGVkIGJ5CiAgICAgICogY2xhc3MgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlLgpAQCAtNjgwLDYgKzY5Miw3IEBACiAKICAgICAvKiBEZWxldGUgY3VycmVudCB0aHJlYWQuIEFmdGVyIHRoaXMsIG1hbnkgQyBBUEkgY2FsbHMgYmVjb21lIGNyYXNoeS4gKi8KICAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisKICAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCkBAIC02OTAsMTIgKzcwMywyMiBAQAogICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCiAgICAgICAgIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCi0gICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGlmIChfUHlNZW1fUHltYWxsb2NFbmFibGVkKCkpIHsKKyAgICAgICAgY2hhciAqb3B0ID0gUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpOworICAgICAgICBpZiAob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKQorICAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKKyAgICB9CiAjZW5kaWYKIAogICAgIGNhbGxfbGxfZXhpdGZ1bmNzKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorUHlfRmluYWxpemUodm9pZCkKK3sKKyAgICBQeV9GaW5hbGl6ZUV4KCk7CiB9CiAKIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnRlcnByZXRlciBhbmQgdGhyZWFkLCBhbmQgcmV0dXJuIHRoZQpAQCAtNzIxLDYgKzc0NCwxMCBAQAogICAgIGlmICghaW5pdGlhbGl6ZWQpCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X05ld0ludGVycHJldGVyOiBjYWxsIFB5X0luaXRpYWxpemUgZmlyc3QiKTsKIAorICAgIC8qIElzc3VlICMxMDkxNSwgIzE1NzUxOiBUaGUgR0lMIEFQSSBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aXBsZQorICAgICAgIGludGVycHJldGVyczogZGlzYWJsZSBQeUdJTFN0YXRlX0NoZWNrKCkuICovCisgICAgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCA9IDA7CisKICAgICBpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7CiAgICAgaWYgKGludGVycCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc3Nyw3ICs4MDQsNyBAQAogCiAgICAgICAgIGlmIChpbml0c3RkaW8oKSA8IDApCiAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAotICAgICAgICAgICAgIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIHN0YW5kYXJkIHN0cmVhbXMiKTsKKyAgICAgICAgICAgICAgICAiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBzeXMgc3RhbmRhcmQgc3RyZWFtcyIpOwogICAgICAgICBpbml0bWFpbihpbnRlcnApOwogICAgICAgICBpZiAoIVB5X05vU2l0ZUZsYWcpCiAgICAgICAgICAgICBpbml0c2l0ZSgpOwpAQCAtODAzLDcgKzgzMCw3IEBACiAgICBmcmFtZXMsIGFuZCB0aGF0IGl0IGlzIGl0cyBpbnRlcnByZXRlcidzIG9ubHkgcmVtYWluaW5nIHRocmVhZC4KICAgIEl0IGlzIGEgZmF0YWwgZXJyb3IgdG8gdmlvbGF0ZSB0aGVzZSBjb25zdHJhaW50cy4KIAotICAgKFB5X0ZpbmFsaXplKCkgZG9lc24ndCBoYXZlIHRoZXNlIGNvbnN0cmFpbnRzIC0tIGl0IHphcHMKKyAgIChQeV9GaW5hbGl6ZUV4KCkgZG9lc24ndCBoYXZlIHRoZXNlIGNvbnN0cmFpbnRzIC0tIGl0IHphcHMKICAgIGV2ZXJ5dGhpbmcsIHJlZ2FyZGxlc3MuKQogCiAgICBMb2NraW5nOiBhcyBhYm92ZS4KQEAgLTk3Miw2ICs5OTksOSBAQAogICAgIGlmIChmZCA8IDAgfHwgIV9QeVZlcmlmeV9mZChmZCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIF9QeV9CRUdJTl9TVVBQUkVTU19JUEgKKyAgICAvKiBQcmVmZXIgZHVwKCkgb3ZlciBmc3RhdCgpLiBmc3RhdCgpIGNhbiByZXF1aXJlIGlucHV0L291dHB1dCB3aGVyZWFzCisgICAgICAgZHVwKCkgZG9lc24ndCwgdGhlcmUgaXMgYSBsb3cgcmlzayBvZiBFTUZJTEUvRU5GSUxFIGF0IFB5dGhvbgorICAgICAgIHN0YXJ0dXAuICovCiAgICAgZmQyID0gZHVwKGZkKTsKICAgICBpZiAoZmQyID49IDApCiAgICAgICAgIGNsb3NlKGZkMik7CkBAIC05ODIsOCArMTAxMiw4IEBACiAvKiByZXR1cm5zIFB5X05vbmUgaWYgdGhlIGZkIGlzIG5vdCB2YWxpZCAqLwogc3RhdGljIFB5T2JqZWN0KgogY3JlYXRlX3N0ZGlvKFB5T2JqZWN0KiBpbywKLSAgICBpbnQgZmQsIGludCB3cml0ZV9tb2RlLCBjaGFyKiBuYW1lLAotICAgIGNoYXIqIGVuY29kaW5nLCBjaGFyKiBlcnJvcnMpCisgICAgaW50IGZkLCBpbnQgd3JpdGVfbW9kZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICBjb25zdCBjaGFyKiBlbmNvZGluZywgY29uc3QgY2hhciogZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICpidWYgPSBOVUxMLCAqc3RyZWFtID0gTlVMTCwgKnRleHQgPSBOVUxMLCAqcmF3ID0gTlVMTCwgKnJlczsKICAgICBjb25zdCBjaGFyKiBtb2RlOwpAQCAtMTAxMyw3ICsxMDQzLDggQEAKICAgICAgICAgbW9kZSA9ICJyYiI7CiAgICAgYnVmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChpbywgJlB5SWRfb3BlbiwgImlzaU9PT2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIG1vZGUsIGJ1ZmZlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgLyogZW5jb2RpbmcsIGVycm9ycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgMCk7IC8qIG5ld2xpbmUsIGNsb3NlZmQgKi8KICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKQEAgLTEyNDMsMjUgKzEyNzQsMTEgQEAKIHN0YXRpYyB2b2lkCiBfUHlfRmF0YWxFcnJvcl9EdW1wVHJhY2ViYWNrcyhpbnQgZmQpCiB7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCi0jaWZkZWYgV0lUSF9USFJFQUQKLSAgICAvKiBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpIHdvcmtzIGV2ZW4gaWYgdGhlIEdJTCB3YXMgcmVsZWFzZWQgKi8KLSAgICB0c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwotI2Vsc2UKLSAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotI2VuZGlmCi0gICAgaWYgKHRzdGF0ZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygpIHJlcXVpcmVzIHRoZSB0aHJlYWQgc3RhdGUgdG8gZGlzcGxheQotICAgICAgICAgKiBmcmFtZXMgKi8KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CiAgICAgZmZsdXNoKHN0ZGVycik7CiAKICAgICAvKiBkaXNwbGF5IHRoZSBjdXJyZW50IFB5dGhvbiBzdGFjayAqLwotICAgIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgdHN0YXRlLT5pbnRlcnAsIHRzdGF0ZSk7CisgICAgX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCBOVUxMLCBOVUxMKTsKIH0KIAogLyogUHJpbnQgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIChpZiBhbiBleGNlcHRpb24gaXMgc2V0KSB3aXRoIGl0cyB0cmFjZWJhY2ssCkBAIC0xNDYyLDcgKzE0NzksOSBAQAogdm9pZAogUHlfRXhpdChpbnQgc3RzKQogewotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgc3RzID0gMTIwOworICAgIH0KIAogICAgIGV4aXQoc3RzKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0YXRlLmMgYi9QeXRob24vcHlzdGF0ZS5jCmluZGV4IDZkMWM2ZDAuLjA1MDNmMzIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXN0YXRlLmMKKysrIGIvUHl0aG9uL3B5c3RhdGUuYwpAQCAtMzQsNiArMzQsOCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAoraW50IF9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQgPSAxOworCiAjaWZkZWYgV0lUSF9USFJFQUQKICNpbmNsdWRlICJweXRocmVhZC5oIgogc3RhdGljIFB5VGhyZWFkX3R5cGVfbG9jayBoZWFkX211dGV4ID0gTlVMTDsgLyogUHJvdGVjdHMgaW50ZXJwLT50c3RhdGVfaGVhZCAqLwpAQCAtNDUsNyArNDcsNyBAQAogICAgR0lMU3RhdGUgaW1wbGVtZW50YXRpb24KICovCiBzdGF0aWMgUHlJbnRlcnByZXRlclN0YXRlICphdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7Ci1zdGF0aWMgaW50IGF1dG9UTFNrZXkgPSAwOworc3RhdGljIGludCBhdXRvVExTa2V5ID0gLTE7CiAjZWxzZQogI2RlZmluZSBIRUFEX0lOSVQoKSAvKiBOb3RoaW5nICovCiAjZGVmaW5lIEhFQURfTE9DSygpIC8qIE5vdGhpbmcgKi8KQEAgLTQ0OSwxMCArNDUxLDEwIEBACiAgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQogICAgICAgICBQeV9GYXRhbEVycm9yKAogICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudDogbm8gY3VycmVudCB0c3RhdGUiKTsKLSAgICBTRVRfVFNUQVRFKE5VTEwpOworICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CiAgICAgaWYgKGF1dG9JbnRlcnByZXRlclN0YXRlICYmIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSkgPT0gdHN0YXRlKQogICAgICAgICBQeVRocmVhZF9kZWxldGVfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwotICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CisgICAgU0VUX1RTVEFURShOVUxMKTsKICAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsKIH0KICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwpAQCAtNjk2LDcgKzY5OCw3IEBACiB9CiAKIC8qIEludGVybmFsIGluaXRpYWxpemF0aW9uL2ZpbmFsaXphdGlvbiBmdW5jdGlvbnMgY2FsbGVkIGJ5Ci0gICBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplCisgICBQeV9Jbml0aWFsaXplL1B5X0ZpbmFsaXplRXgKICovCiB2b2lkCiBfUHlHSUxTdGF0ZV9Jbml0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaSwgUHlUaHJlYWRTdGF0ZSAqdCkKQEAgLTcxMiwxMCArNzE0LDE3IEBACiAgICAgX1B5R0lMU3RhdGVfTm90ZVRocmVhZFN0YXRlKHQpOwogfQogCitQeUludGVycHJldGVyU3RhdGUgKgorX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSh2b2lkKQoreworICAgIHJldHVybiBhdXRvSW50ZXJwcmV0ZXJTdGF0ZTsKK30KKwogdm9pZAogX1B5R0lMU3RhdGVfRmluaSh2b2lkKQogewogICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXkoYXV0b1RMU2tleSk7CisgICAgYXV0b1RMU2tleSA9IC0xOwogICAgIGF1dG9JbnRlcnByZXRlclN0YXRlID0gTlVMTDsKIH0KIApAQCAtNzg0LDggKzc5MywxOSBAQAogaW50CiBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpCiB7Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gR0VUX1RTVEFURSgpOwotICAgIHJldHVybiB0c3RhdGUgJiYgKHRzdGF0ZSA9PSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisKKyAgICBpZiAoIV9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKGF1dG9UTFNrZXkgPT0gLTEpCisgICAgICAgIHJldHVybiAxOworCisgICAgdHN0YXRlID0gR0VUX1RTVEFURSgpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHRzdGF0ZSA9PSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpKTsKIH0KIAogUHlHSUxTdGF0ZV9TVEFURQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RydG9kLmMgYi9QeXRob24vcHlzdHJ0b2QuYwppbmRleCAyMDljOTA4Li41ZjNhZjkyIDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJ0b2QuYworKysgYi9QeXRob24vcHlzdHJ0b2QuYwpAQCAtODgxLDEyICs4ODEsMTIgQEAKICNkZWZpbmUgT0ZTX0UgMgogCiAvKiBUaGUgbGVuZ3RocyBvZiB0aGVzZSBhcmUga25vd24gdG8gdGhlIGNvZGUgYmVsb3csIHNvIGRvbid0IGNoYW5nZSB0aGVtICovCi1zdGF0aWMgY2hhciAqbGNfZmxvYXRfc3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsY19mbG9hdF9zdHJpbmdzW10gPSB7CiAgICAgImluZiIsCiAgICAgIm5hbiIsCiAgICAgImUiLAogfTsKLXN0YXRpYyBjaGFyICp1Y19mbG9hdF9zdHJpbmdzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKICAgICAiSU5GIiwKICAgICAiTkFOIiwKICAgICAiRSIsCkBAIC05MjUsNyArOTI1LDggQEAKIGZvcm1hdF9mbG9hdF9zaG9ydChkb3VibGUgZCwgY2hhciBmb3JtYXRfY29kZSwKICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IHByZWNpc2lvbiwKICAgICAgICAgICAgICAgICAgICBpbnQgYWx3YXlzX2FkZF9zaWduLCBpbnQgYWRkX2RvdF8wX2lmX2ludGVnZXIsCi0gICAgICAgICAgICAgICAgICAgaW50IHVzZV9hbHRfZm9ybWF0dGluZywgY2hhciAqKmZsb2F0X3N0cmluZ3MsIGludCAqdHlwZSkKKyAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2FsdF9mb3JtYXR0aW5nLCBjb25zdCBjaGFyICogY29uc3QgKmZsb2F0X3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlKQogewogICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CiAgICAgY2hhciAqcCA9IE5VTEw7CkBAIC0xMTc2LDcgKzExNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdHlwZSkKIHsKLSAgICBjaGFyICoqZmxvYXRfc3RyaW5ncyA9IGxjX2Zsb2F0X3N0cmluZ3M7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpmbG9hdF9zdHJpbmdzID0gbGNfZmxvYXRfc3RyaW5nczsKICAgICBpbnQgbW9kZTsKIAogICAgIC8qIFZhbGlkYXRlIGZvcm1hdF9jb2RlLCBhbmQgbWFwIHVwcGVyIGFuZCBsb3dlciBjYXNlLiBDb21wdXRlIHRoZQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5dGhvbnJ1bi5jIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCmluZGV4IGMwM2IwNzMuLmNjMmRlOWEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weXRob25ydW4uYworKysgYi9QeXRob24vcHl0aG9ucnVuLmMKQEAgLTQzMSw3ICs0MzEsNyBAQAogcGFyc2Vfc3ludGF4X2Vycm9yKFB5T2JqZWN0ICplcnIsIFB5T2JqZWN0ICoqbWVzc2FnZSwgUHlPYmplY3QgKipmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBpbnQgKmxpbmVubywgaW50ICpvZmZzZXQsIFB5T2JqZWN0ICoqdGV4dCkKIHsKLSAgICBsb25nIGhvbGQ7CisgICAgaW50IGhvbGQ7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgX1B5X0lERU5USUZJRVIobXNnKTsKICAgICBfUHlfSURFTlRJRklFUihmaWxlbmFtZSk7CkBAIC00NjQsMTEgKzQ2NCwxMSBAQAogICAgIHYgPSBfUHlPYmplY3RfR2V0QXR0cklkKGVyciwgJlB5SWRfbGluZW5vKTsKICAgICBpZiAoIXYpCiAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICBob2xkID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICBob2xkID0gX1B5TG9uZ19Bc0ludCh2KTsKICAgICBQeV9ERUNSRUYodik7CiAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAqbGluZW5vID0gKGludClob2xkOworICAgICpsaW5lbm8gPSBob2xkOwogCiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF9vZmZzZXQpOwogICAgIGlmICghdikKQEAgLTQ3NywxMSArNDc3LDExIEBACiAgICAgICAgICpvZmZzZXQgPSAtMTsKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGhvbGQgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICBob2xkID0gX1B5TG9uZ19Bc0ludCh2KTsKICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKLSAgICAgICAgKm9mZnNldCA9IChpbnQpaG9sZDsKKyAgICAgICAgKm9mZnNldCA9IGhvbGQ7CiAgICAgfQogCiAgICAgdiA9IF9QeU9iamVjdF9HZXRBdHRySWQoZXJyLCAmUHlJZF90ZXh0KTsKQEAgLTc5MSwxMSArNzkxLDExIEBACiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjYXVzZV9tZXNzYWdlID0KK3N0YXRpYyBjb25zdCBjaGFyIGNhdXNlX21lc3NhZ2VbXSA9CiAgICAgIlxuVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSAiCiAgICAgIm9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuXG4iOwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29udGV4dF9tZXNzYWdlID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbnRleHRfbWVzc2FnZVtdID0KICAgICAiXG5EdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgIgogICAgICJhbm90aGVyIGV4Y2VwdGlvbiBvY2N1cnJlZDpcblxuIjsKIApAQCAtMTE0NCw4ICsxMTQ0LDggQEAKIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZU9iamVjdChGSUxFICpmcCwgUHlPYmplY3QgKmZpbGVuYW1lLCBjb25zdCBjaGFyKiBlbmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNoYXIgKnBzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjb25zdCBjaGFyICpwczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewogICAgIG1vZF90eSBtb2Q7CkBAIC0xMTc3LDggKzExNzcsOCBAQAogCiBtb2RfdHkKIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZV9zdHIsIGNvbnN0IGNoYXIqIGVuYywKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY2hhciAqcHMxLAotICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNvbnN0IGNoYXIgKnBzMSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAogICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpCiB7CiAgICAgbW9kX3R5IG1vZDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRpbWUuYyBiL1B5dGhvbi9weXRpbWUuYwppbmRleCA3ZjY1ODI0Li44MTY4MmNhIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aW1lLmMKKysrIGIvUHl0aG9uL3B5dGltZS5jCkBAIC03LDYgKzcsMTEgQEAKICNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPiAgIC8qIG1hY2hfYWJzb2x1dGVfdGltZSgpLCBtYWNoX3RpbWViYXNlX2luZm8oKSAqLwogI2VuZGlmCiAKKyNkZWZpbmUgX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3coYSwgYikgXAorICAgIChhc3NlcnQoYiA+IDApLCBcCisgICAgIChfUHlUaW1lX3QpKGEpIDwgX1B5VGltZV9NSU4gLyAoX1B5VGltZV90KShiKSBcCisgICAgIHx8IF9QeVRpbWVfTUFYIC8gKF9QeVRpbWVfdCkoYikgPCAoX1B5VGltZV90KShhKSkKKwogLyogVG8gbWlsbGlzZWNvbmQgKDEwXi0zKSAqLwogI2RlZmluZSBTRUNfVE9fTVMgMTAwMAogCkBAIC0zOCw3ICs0Myw3IEBACiAgICAgdmFsID0gUHlMb25nX0FzTG9uZ0xvbmcob2JqKTsKICNlbHNlCiAgICAgbG9uZyB2YWw7Ci0gICAgYXNzZXJ0KHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CiAgICAgdmFsID0gUHlMb25nX0FzTG9uZyhvYmopOwogI2VuZGlmCiAgICAgaWYgKHZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CkBAIC01NSw1NSArNjAsODggQEAKICNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiBTSVpFT0ZfVElNRV9UID09IFNJWkVPRl9MT05HX0xPTkcKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXQpOwogI2Vsc2UKLSAgICBhc3NlcnQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRpbWVfdCkgPD0gc2l6ZW9mKGxvbmcpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKXQpOwogI2VuZGlmCiB9CiAKKy8qIFJvdW5kIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvIG5lYXJlc3QgZXZlbiBpbnRlZ2VyCisgICAoX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pICovCitzdGF0aWMgZG91YmxlCitfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZG91YmxlIHgpCit7CisgICAgZG91YmxlIHJvdW5kZWQgPSByb3VuZCh4KTsKKyAgICBpZiAoZmFicyh4LXJvdW5kZWQpID09IDAuNSkKKyAgICAgICAgLyogaGFsZndheSBjYXNlOiByb3VuZCB0byBldmVuICovCisgICAgICAgIHJvdW5kZWQgPSAyLjAqcm91bmQoeC8yLjApOworICAgIHJldHVybiByb3VuZGVkOworfQorCitzdGF0aWMgZG91YmxlCitfUHlUaW1lX1JvdW5kKGRvdWJsZSB4LCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCit7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBkOworCisgICAgZCA9IHg7CisgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKQorICAgICAgICBkID0gX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGQpOworICAgIGVsc2UgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykKKyAgICAgICAgZCA9IGNlaWwoZCk7CisgICAgZWxzZQorICAgICAgICBkID0gZmxvb3IoZCk7CisgICAgcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBpbnQKK19QeVRpbWVfRG91YmxlVG9EZW5vbWluYXRvcihkb3VibGUgZCwgdGltZV90ICpzZWMsIGxvbmcgKm51bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVub21pbmF0b3IsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKK3sKKyAgICBkb3VibGUgaW50cGFydCwgZXJyOworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZmxvYXRwYXJ0OworCisgICAgZmxvYXRwYXJ0ID0gbW9kZihkLCAmaW50cGFydCk7CisKKyAgICBmbG9hdHBhcnQgKj0gZGVub21pbmF0b3I7CisgICAgZmxvYXRwYXJ0ID0gX1B5VGltZV9Sb3VuZChmbG9hdHBhcnQsIHJvdW5kKTsKKyAgICBpZiAoZmxvYXRwYXJ0ID49IGRlbm9taW5hdG9yKSB7CisgICAgICAgIGZsb2F0cGFydCAtPSBkZW5vbWluYXRvcjsKKyAgICAgICAgaW50cGFydCArPSAxLjA7CisgICAgfQorICAgIGVsc2UgaWYgKGZsb2F0cGFydCA8IDApIHsKKyAgICAgICAgZmxvYXRwYXJ0ICs9IGRlbm9taW5hdG9yOworICAgICAgICBpbnRwYXJ0IC09IDEuMDsKKyAgICB9CisgICAgYXNzZXJ0KDAuMCA8PSBmbG9hdHBhcnQgJiYgZmxvYXRwYXJ0IDwgZGVub21pbmF0b3IpOworCisgICAgKnNlYyA9ICh0aW1lX3QpaW50cGFydDsKKyAgICAqbnVtZXJhdG9yID0gKGxvbmcpZmxvYXRwYXJ0OworCisgICAgZXJyID0gaW50cGFydCAtIChkb3VibGUpKnNlYzsKKyAgICBpZiAoZXJyIDw9IC0xLjAgfHwgZXJyID49IDEuMCkgeworICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBsb25nICpudW1lcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlbm9taW5hdG9yLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7Ci0gICAgYXNzZXJ0KGRlbm9taW5hdG9yIDw9IExPTkdfTUFYKTsKKyAgICBhc3NlcnQoZGVub21pbmF0b3IgPD0gKGRvdWJsZSlMT05HX01BWCk7CisKICAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7Ci0gICAgICAgIGRvdWJsZSBkLCBpbnRwYXJ0LCBlcnI7Ci0gICAgICAgIC8qIHZvbGF0aWxlIGF2b2lkcyB1bnNhZmUgb3B0aW1pemF0aW9uIG9uIGZsb2F0IGVuYWJsZWQgYnkgZ2NjIC1PMyAqLwotICAgICAgICB2b2xhdGlsZSBkb3VibGUgZmxvYXRwYXJ0OwotCi0gICAgICAgIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGZsb2F0cGFydCA9IG1vZGYoZCwgJmludHBhcnQpOwotICAgICAgICBpZiAoZmxvYXRwYXJ0IDwgMCkgewotICAgICAgICAgICAgZmxvYXRwYXJ0ID0gMS4wICsgZmxvYXRwYXJ0OwotICAgICAgICAgICAgaW50cGFydCAtPSAxLjA7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdHBhcnQgKj0gZGVub21pbmF0b3I7Ci0gICAgICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKLSAgICAgICAgICAgIGZsb2F0cGFydCA9IGNlaWwoZmxvYXRwYXJ0KTsKLSAgICAgICAgICAgIGlmIChmbG9hdHBhcnQgPj0gZGVub21pbmF0b3IpIHsKLSAgICAgICAgICAgICAgICBmbG9hdHBhcnQgPSAwLjA7Ci0gICAgICAgICAgICAgICAgaW50cGFydCArPSAxLjA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBmbG9hdHBhcnQgPSBmbG9vcihmbG9hdHBhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgKnNlYyA9ICh0aW1lX3QpaW50cGFydDsKLSAgICAgICAgZXJyID0gaW50cGFydCAtIChkb3VibGUpKnNlYzsKLSAgICAgICAgaWYgKGVyciA8PSAtMS4wIHx8IGVyciA+PSAxLjApIHsKLSAgICAgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgKm51bWVyYXRvciA9IChsb25nKWZsb2F0cGFydDsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgICAgICByZXR1cm4gX1B5VGltZV9Eb3VibGVUb0Rlbm9taW5hdG9yKGQsIHNlYywgbnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yLCByb3VuZCk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICAqc2VjID0gX1B5TG9uZ19Bc1RpbWVfdChvYmopOworICAgICAgICAqbnVtZXJhdG9yID0gMDsKICAgICAgICAgaWYgKCpzZWMgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAqbnVtZXJhdG9yID0gMDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQpAQCAtMTEyLDEzICsxNTAsMTIgQEAKIF9QeVRpbWVfT2JqZWN0VG9UaW1lX3QoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKICAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7Ci0gICAgICAgIGRvdWJsZSBkLCBpbnRwYXJ0LCBlcnI7CisgICAgICAgIGRvdWJsZSBpbnRwYXJ0LCBlcnI7CisgICAgICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICAgICAgdm9sYXRpbGUgZG91YmxlIGQ7CiAKICAgICAgICAgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKLSAgICAgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykKLSAgICAgICAgICAgIGQgPSBjZWlsKGQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkID0gZmxvb3IoZCk7CisgICAgICAgIGQgPSBfUHlUaW1lX1JvdW5kKGQsIHJvdW5kKTsKICAgICAgICAgKHZvaWQpbW9kZihkLCAmaW50cGFydCk7CiAKICAgICAgICAgKnNlYyA9ICh0aW1lX3QpaW50cGFydDsKQEAgLTE0MSwxNCArMTc4LDIwIEBACiBfUHlUaW1lX09iamVjdFRvVGltZXNwZWMoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIGxvbmcgKm5zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewotICAgIHJldHVybiBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIG5zZWMsIDFlOSwgcm91bmQpOworICAgIGludCByZXM7CisgICAgcmVzID0gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCBuc2VjLCAxZTksIHJvdW5kKTsKKyAgICBhc3NlcnQoMCA8PSAqbnNlYyAmJiAqbnNlYyA8IFNFQ19UT19OUyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CiBfUHlUaW1lX09iamVjdFRvVGltZXZhbChQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgbG9uZyAqdXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKLSAgICByZXR1cm4gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCB1c2VjLCAxZTYsIHJvdW5kKTsKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgdXNlYywgMWU2LCByb3VuZCk7CisgICAgYXNzZXJ0KDAgPD0gKnVzZWMgJiYgKnVzZWMgPCBTRUNfVE9fVVMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNjIsMTIgKzIwNSwxNSBAQAogX1B5VGltZV9Gcm9tU2Vjb25kcyhpbnQgc2Vjb25kcykKIHsKICAgICBfUHlUaW1lX3QgdDsKKyAgICB0ID0gKF9QeVRpbWVfdClzZWNvbmRzOwogICAgIC8qIGVuc3VyZSB0aGF0IGludGVnZXIgb3ZlcmZsb3cgY2Fubm90IGhhcHBlbiwgaW50IHR5cGUgc2hvdWxkIGhhdmUgMzIKICAgICAgICBiaXRzLCB3aGVyZWFzIF9QeVRpbWVfdCB0eXBlIGhhcyBhdCBsZWFzdCA2NCBiaXRzIChTRUNfVE9fTVMgdGFrZXMgMzAKICAgICAgICBiaXRzKS4gKi8KLSAgICBhc3NlcnQoKHNlY29uZHMgPj0gMCAmJiBzZWNvbmRzIDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKQotICAgICAgICAgICB8fCAoc2Vjb25kcyA8IDAgJiYgc2Vjb25kcyA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUykpOwotICAgIHQgPSAoX1B5VGltZV90KXNlY29uZHMgKiBTRUNfVE9fTlM7CisgICAgUHlfQlVJTERfQVNTRVJUKElOVF9NQVggPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpOworICAgIFB5X0JVSUxEX0FTU0VSVChJTlRfTUlOID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKTsKKyAgICBhc3NlcnQoKHQgPj0gMCAmJiB0IDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKQorICAgICAgICAgICB8fCAodCA8IDAgJiYgdCA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUykpOworICAgIHQgKj0gU0VDX1RPX05TOwogICAgIHJldHVybiB0OwogfQogCkBAIC0xNzUsNyArMjIxLDcgQEAKIF9QeVRpbWVfRnJvbU5hbm9zZWNvbmRzKFBZX0xPTkdfTE9ORyBucykKIHsKICAgICBfUHlUaW1lX3QgdDsKLSAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CiAgICAgdCA9IFB5X1NBRkVfRE9XTkNBU1QobnMsIFBZX0xPTkdfTE9ORywgX1B5VGltZV90KTsKICAgICByZXR1cm4gdDsKIH0KQEAgLTE4NywxMiArMjMzLDE1IEBACiAgICAgX1B5VGltZV90IHQ7CiAgICAgaW50IHJlcyA9IDA7CiAKLSAgICB0ID0gKF9QeVRpbWVfdCl0cy0+dHZfc2VjICogU0VDX1RPX05TOwotICAgIGlmICh0IC8gU0VDX1RPX05TICE9IHRzLT50dl9zZWMpIHsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRzLT50dl9zZWMpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICB0ID0gKF9QeVRpbWVfdCl0cy0+dHZfc2VjOworCisgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHQsIFNFQ19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICByZXMgPSAtMTsKICAgICB9CisgICAgdCA9IHQgKiBTRUNfVE9fTlM7CiAKICAgICB0ICs9IHRzLT50dl9uc2VjOwogCkBAIC0yMDYsMTIgKzI1NSwxNSBAQAogICAgIF9QeVRpbWVfdCB0OwogICAgIGludCByZXMgPSAwOwogCi0gICAgdCA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYyAqIFNFQ19UT19OUzsKLSAgICBpZiAodCAvIFNFQ19UT19OUyAhPSB0di0+dHZfc2VjKSB7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0di0+dHZfc2VjKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgdCA9IChfUHlUaW1lX3QpdHYtPnR2X3NlYzsKKworICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyh0LCBTRUNfVE9fTlMpKSB7CiAgICAgICAgIGlmIChyYWlzZSkKICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgcmVzID0gLTE7CiAgICAgfQorICAgIHQgPSB0ICogU0VDX1RPX05TOwogCiAgICAgdCArPSAoX1B5VGltZV90KXR2LT50dl91c2VjICogVVNfVE9fTlM7CiAKQEAgLTIyMSw1MCArMjczLDU5IEBACiAjZW5kaWYKIAogc3RhdGljIGludAorX1B5VGltZV9Gcm9tRmxvYXRPYmplY3QoX1B5VGltZV90ICp0LCBkb3VibGUgdmFsdWUsIF9QeVRpbWVfcm91bmRfdCByb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW5pdF90b19ucykKK3sKKyAgICBkb3VibGUgZXJyOworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIC8qIGNvbnZlcnQgdG8gYSBudW1iZXIgb2YgbmFub3NlY29uZHMgKi8KKyAgICBkID0gdmFsdWU7CisgICAgZCAqPSAoZG91YmxlKXVuaXRfdG9fbnM7CisgICAgZCA9IF9QeVRpbWVfUm91bmQoZCwgcm91bmQpOworCisgICAgKnQgPSAoX1B5VGltZV90KWQ7CisgICAgZXJyID0gZCAtIChkb3VibGUpKnQ7CisgICAgaWYgKGZhYnMoZXJyKSA+PSAxLjApIHsKKyAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBfUHlUaW1lX0Zyb21PYmplY3QoX1B5VGltZV90ICp0LCBQeU9iamVjdCAqb2JqLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQsCi0gICAgICAgICAgICAgICAgICAgbG9uZyB0b19uYW5vc2Vjb25kcykKKyAgICAgICAgICAgICAgICAgICBsb25nIHVuaXRfdG9fbnMpCiB7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgdW5zYWZlIG9wdGltaXphdGlvbiBvbiBmbG9hdCBlbmFibGVkIGJ5IGdjYyAtTzMgKi8KLSAgICAgICAgdm9sYXRpbGUgZG91YmxlIGQsIGVycjsKLQotICAgICAgICAvKiBjb252ZXJ0IHRvIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzICovCisgICAgICAgIGRvdWJsZSBkOwogICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBkICo9IHRvX25hbm9zZWNvbmRzOwotCi0gICAgICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCi0gICAgICAgICAgICBkID0gY2VpbChkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZCA9IGZsb29yKGQpOwotCi0gICAgICAgICp0ID0gKF9QeVRpbWVfdClkOwotICAgICAgICBlcnIgPSBkIC0gKGRvdWJsZSkqdDsKLSAgICAgICAgaWYgKGZhYnMoZXJyKSA+PSAxLjApIHsKLSAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIF9QeVRpbWVfRnJvbUZsb2F0T2JqZWN0KHQsIGQsIHJvdW5kLCB1bml0X3RvX25zKTsKICAgICB9CiAgICAgZWxzZSB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICAgICAgICAgUFlfTE9OR19MT05HIHNlYzsKKyAgICAgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKwogICAgICAgICBzZWMgPSBQeUxvbmdfQXNMb25nTG9uZyhvYmopOwotICAgICAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOwogI2Vsc2UKICAgICAgICAgbG9uZyBzZWM7CisgICAgICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisKICAgICAgICAgc2VjID0gUHlMb25nX0FzTG9uZyhvYmopOwotICAgICAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOwogI2VuZGlmCiAgICAgICAgIGlmIChzZWMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCiAgICAgICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgICp0ID0gc2VjICogdG9fbmFub3NlY29uZHM7Ci0gICAgICAgIGlmICgqdCAvIHRvX25hbm9zZWNvbmRzICE9IHNlYykgeworCisgICAgICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyhzZWMsIHVuaXRfdG9fbnMpKSB7CiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKyAgICAgICAgKnQgPSBzZWMgKiB1bml0X3RvX25zOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CkBAIC0yODQsMjIgKzM0NSwzMSBAQAogZG91YmxlCiBfUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShfUHlUaW1lX3QgdCkKIHsKLSAgICBfUHlUaW1lX3Qgc2VjLCBuczsKLSAgICAvKiBEaXZpZGUgdXNpbmcgaW50ZWdlcnMgdG8gYXZvaWQgcm91bmRpbmcgaXNzdWVzIG9uIHRoZSBpbnRlZ2VyIHBhcnQuCi0gICAgICAgMWUtOSBjYW5ub3QgYmUgc3RvcmVkIGV4YWN0bHkgaW4gSUVFRSA2NC1iaXQuICovCi0gICAgc2VjID0gdCAvIFNFQ19UT19OUzsKLSAgICBucyA9IHQgJSBTRUNfVE9fTlM7Ci0gICAgcmV0dXJuIChkb3VibGUpc2VjICsgKGRvdWJsZSlucyAqIDFlLTk7CisgICAgLyogdm9sYXRpbGUgYXZvaWRzIG9wdGltaXphdGlvbiBjaGFuZ2luZyBob3cgbnVtYmVycyBhcmUgcm91bmRlZCAqLworICAgIHZvbGF0aWxlIGRvdWJsZSBkOworCisgICAgaWYgKHQgJSBTRUNfVE9fTlMgPT0gMCkgeworICAgICAgICBfUHlUaW1lX3Qgc2VjczsKKyAgICAgICAgLyogRGl2aWRlIHVzaW5nIGludGVnZXJzIHRvIGF2b2lkIHJvdW5kaW5nIGlzc3VlcyBvbiB0aGUgaW50ZWdlciBwYXJ0LgorICAgICAgICAgICAxZS05IGNhbm5vdCBiZSBzdG9yZWQgZXhhY3RseSBpbiBJRUVFIDY0LWJpdC4gKi8KKyAgICAgICAgc2VjcyA9IHQgLyBTRUNfVE9fTlM7CisgICAgICAgIGQgPSAoZG91YmxlKXNlY3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkID0gKGRvdWJsZSl0OworICAgICAgICBkIC89IDFlOTsKKyAgICB9CisgICAgcmV0dXJuIGQ7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeVRpbWVfQXNOYW5vc2Vjb25kc09iamVjdChfUHlUaW1lX3QgdCkKIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotICAgIGFzc2VydChzaXplb2YoUFlfTE9OR19MT05HKSA+PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihQWV9MT05HX0xPTkcpID49IHNpemVvZihfUHlUaW1lX3QpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXQpOwogI2Vsc2UKLSAgICBhc3NlcnQoc2l6ZW9mKGxvbmcpID49IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKGxvbmcpID49IHNpemVvZihfUHlUaW1lX3QpKTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKXQpOwogI2VuZGlmCiB9CkBAIC0zMDksNyArMzc5LDIwIEBACiAgICAgICAgICAgICAgICBjb25zdCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7CiAgICAgYXNzZXJ0KGsgPiAxKTsKLSAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKSB7CisgICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSB7CisgICAgICAgIF9QeVRpbWVfdCB4LCByLCBhYnNfcjsKKyAgICAgICAgeCA9IHQgLyBrOworICAgICAgICByID0gdCAlIGs7CisgICAgICAgIGFic19yID0gUHlfQUJTKHIpOworICAgICAgICBpZiAoYWJzX3IgPiBrIC8gMiB8fCAoYWJzX3IgPT0gayAvIDIgJiYgKFB5X0FCUyh4KSAmIDEpKSkgeworICAgICAgICAgICAgaWYgKHQgPj0gMCkKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeC0tOworICAgICAgICB9CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICBlbHNlIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKICAgICAgICAgaWYgKHQgPj0gMCkKICAgICAgICAgICAgIHJldHVybiAodCArIGsgLSAxKSAvIGs7CiAgICAgICAgIGVsc2UKQEAgLTM3Myw3ICs0NTYsNyBAQAogX1B5VGltZV9Bc1RpbWV2YWxTdHJ1Y3RfaW1wbChfUHlUaW1lX3QgdCwgc3RydWN0IHRpbWV2YWwgKnR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlUaW1lX3JvdW5kX3Qgcm91bmQsIGludCByYWlzZSkKIHsKLSAgICBfUHlUaW1lX3Qgc2VjczsKKyAgICBfUHlUaW1lX3Qgc2Vjcywgc2VjczI7CiAgICAgaW50IHVzOwogICAgIGludCByZXM7CiAKQEAgLTM4Niw3ICs0NjksOCBAQAogI2VuZGlmCiAgICAgdHYtPnR2X3VzZWMgPSB1czsKIAotICAgIGlmIChyZXMgPCAwIHx8IChfUHlUaW1lX3QpdHYtPnR2X3NlYyAhPSBzZWNzKSB7CisgICAgc2VjczIgPSAoX1B5VGltZV90KXR2LT50dl9zZWM7CisgICAgaWYgKHJlcyA8IDAgfHwgc2VjczIgIT0gc2VjcykgewogICAgICAgICBpZiAocmFpc2UpCiAgICAgICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNDI0LDYgKzUwOCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogI2lmIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKSB8fCBkZWZpbmVkKEhBVkVfS1FVRVVFKQogaW50CiBfUHlUaW1lX0FzVGltZXNwZWMoX1B5VGltZV90IHQsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCkBAIC00MzcsMTMgKzUyMiwxMyBAQAogICAgICAgICBzZWNzIC09IDE7CiAgICAgfQogICAgIHRzLT50dl9zZWMgPSAodGltZV90KXNlY3M7Ci0gICAgaWYgKChfUHlUaW1lX3QpdHMtPnR2X3NlYyAhPSBzZWNzKSB7Ci0gICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBhc3NlcnQoMCA8PSBuc2VjICYmIG5zZWMgPCBTRUNfVE9fTlMpOwogICAgIHRzLT50dl9uc2VjID0gbnNlYzsKIAotICAgIGFzc2VydCgwIDw9IHRzLT50dl9uc2VjICYmIHRzLT50dl9uc2VjIDw9IDk5OTk5OTk5OSk7CisgICAgaWYgKChfUHlUaW1lX3QpdHMtPnR2X3NlYyAhPSBzZWNzKSB7CisgICAgICAgIGVycm9yX3RpbWVfdF9vdmVyZmxvdygpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIHJldHVybiAwOwogfQogI2VuZGlmCkBAIC01NTcsMTkgKzY0MiwyMCBAQAogICAgIHJldHVybiBweWdldHRpbWVvZmRheSh0LCBpbmZvLCAxKTsKIH0KIAotCiBzdGF0aWMgaW50CiBweW1vbm90b25pYyhfUHlUaW1lX3QgKnRwLCBfUHlfY2xvY2tfaW5mb190ICppbmZvLCBpbnQgcmFpc2UpCiB7CiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKQotICAgIFVMT05HTE9ORyByZXN1bHQ7CisgICAgVUxPTkdMT05HIHRpY2tzOworICAgIF9QeVRpbWVfdCB0OwogCiAgICAgYXNzZXJ0KGluZm8gPT0gTlVMTCB8fCByYWlzZSk7CiAKLSAgICByZXN1bHQgPSBHZXRUaWNrQ291bnQ2NCgpOworICAgIHRpY2tzID0gR2V0VGlja0NvdW50NjQoKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHRpY2tzKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgdCA9IChfUHlUaW1lX3QpdGlja3M7CiAKLSAgICAqdHAgPSByZXN1bHQgKiBNU19UT19OUzsKLSAgICBpZiAoKnRwIC8gTVNfVE9fTlMgIT0gcmVzdWx0KSB7CisgICAgaWYgKF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KHQsIE1TX1RPX05TKSkgewogICAgICAgICBpZiAocmFpc2UpIHsKICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTU3Nyw2ICs2NjMsNyBAQAogICAgICAgICAvKiBIZWxsbywgdGltZSB0cmF2ZWxlciEgKi8KICAgICAgICAgYXNzZXJ0KDApOwogICAgIH0KKyAgICAqdHAgPSB0ICogTVNfVE9fTlM7CiAKICAgICBpZiAoaW5mbykgewogICAgICAgICBEV09SRCB0aW1lQWRqdXN0bWVudCwgdGltZUluY3JlbWVudDsKQEAgLTY4OSw4ICs3NzYsNSBAQAogICAgIGlmIChfUHlUaW1lX0dldE1vbm90b25pY0Nsb2NrV2l0aEluZm8oJnQsIE5VTEwpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgLyogY2hlY2sgdGhhdCBfUHlUaW1lX0Zyb21TZWNvbmRzKCkgY2Fubm90IG92ZXJmbG93ICovCi0gICAgYXNzZXJ0KElOVF9NQVggPD0gX1B5VGltZV9NQVggLyBTRUNfVE9fTlMpOwotICAgIGFzc2VydChJTlRfTUlOID49IF9QeVRpbWVfTUlOIC8gU0VDX1RPX05TKTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9yYW5kb20uYyBiL1B5dGhvbi9yYW5kb20uYwppbmRleCA3OTE1N2I4Li44MzlkN2FkIDEwMDY0NAotLS0gYS9QeXRob24vcmFuZG9tLmMKKysrIGIvUHl0aG9uL3JhbmRvbS5jCkBAIC0zODYsNyArMzg2LDcgQEAKICAgICBjaGFyICplbnY7CiAgICAgdW5zaWduZWQgY2hhciAqc2VjcmV0ID0gKHVuc2lnbmVkIGNoYXIgKikmX1B5X0hhc2hTZWNyZXQudWM7CiAgICAgUHlfc3NpemVfdCBzZWNyZXRfc2l6ZSA9IHNpemVvZihfUHlfSGFzaFNlY3JldF90KTsKLSAgICBhc3NlcnQoc2VjcmV0X3NpemUgPT0gc2l6ZW9mKF9QeV9IYXNoU2VjcmV0LnVjKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihfUHlfSGFzaFNlY3JldF90KSA9PSBzaXplb2YoX1B5X0hhc2hTZWNyZXQudWMpKTsKIAogICAgIGlmIChfUHlfSGFzaFNlY3JldF9Jbml0aWFsaXplZCkKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5bXRhYmxlLmMgYi9QeXRob24vc3ltdGFibGUuYwppbmRleCA2ZDFhNjJiLi41NThiYjA2IDEwMDY0NAotLS0gYS9QeXRob24vc3ltdGFibGUuYworKysgYi9QeXRob24vc3ltdGFibGUuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiB9OwogCiBzdGF0aWMgaW50IHN5bXRhYmxlX2FuYWx5emUoc3RydWN0IHN5bXRhYmxlICpzdCk7Ci1zdGF0aWMgaW50IHN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY2hhciAqbXNnLCBpbnQgbGluZW5vKTsKK3N0YXRpYyBpbnQgc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjb25zdCBjaGFyICptc2csIGludCBsaW5lbm8pOwogc3RhdGljIGludCBzeW10YWJsZV9lbnRlcl9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9ibG9ja190eSBibG9jaywgdm9pZCAqYXN0LCBpbnQgbGluZW5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCk7CkBAIC05MDgsNyArOTA4LDcgQEAKIAogCiBzdGF0aWMgaW50Ci1zeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubykKK3N5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY29uc3QgY2hhciAqbXNnLCBpbnQgbGluZW5vKQogewogICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobXNnKTsKICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQpAQCAtMTQ0Nyw2ICsxNDQ3LDE1IEBACiAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOwogICAgICAgICBWSVNJVF9TRVFfV0lUSF9OVUxMKHN0LCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CmRpZmYgLS1naXQgYS9QeXRob24vc3lzbW9kdWxlLmMgYi9QeXRob24vc3lzbW9kdWxlLmMKaW5kZXggOGQ3ZTA1YS4uMGM2OGM1NCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5c21vZHVsZS5jCisrKyBiL1B5dGhvbi9zeXNtb2R1bGUuYwpAQCAtMzQ2LDggKzM0NiwxMCBAQAogc3RhdGljIGludAogdHJhY2VfaW5pdCh2b2lkKQogewotICAgIHN0YXRpYyBjaGFyICp3aGF0bmFtZXNbN10gPSB7ImNhbGwiLCAiZXhjZXB0aW9uIiwgImxpbmUiLCAicmV0dXJuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4ifTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHdoYXRuYW1lc1s3XSA9IHsKKyAgICAgICAgImNhbGwiLCAiZXhjZXB0aW9uIiwgImxpbmUiLCAicmV0dXJuIiwKKyAgICAgICAgImNfY2FsbCIsICJjX2V4Y2VwdGlvbiIsICJjX3JldHVybiIKKyAgICB9OwogICAgIFB5T2JqZWN0ICpuYW1lOwogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHsKQEAgLTQzNCwxMCArNDM2LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IFB5X05vbmUpIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBmcmFtZS0+Zl90cmFjZTsKLSAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSBOVUxMOwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IHJlc3VsdDsKKyAgICAgICAgUHlfWFNFVFJFRihmcmFtZS0+Zl90cmFjZSwgcmVzdWx0KTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwpAQCAtMTE1Miw4ICsxMTUxLDEwIEBACiBzeXNfZGVidWdtYWxsb2NzdGF0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZkZWYgV0lUSF9QWU1BTExPQwotICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7Ci0gICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICBpZiAoX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCgpKSB7CisgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgfQogI2VuZGlmCiAgICAgX1B5T2JqZWN0X0RlYnVnVHlwZVN0YXRzKHN0ZGVycik7CiAKQEAgLTE2NDMsMTUgKzE2NDQsMTEgQEAKIC8qIHN5cy5pbXBsZW1lbnRhdGlvbiB2YWx1ZXMgKi8KICNkZWZpbmUgTkFNRSAiY3B5dGhvbiIKIGNvbnN0IGNoYXIgKl9QeVN5c19JbXBsTmFtZSA9IE5BTUU7Ci0jZGVmaW5lIFFVT1RFKGFyZykgI2FyZwotI2RlZmluZSBTVFJJRlkobmFtZSkgUVVPVEUobmFtZSkKLSNkZWZpbmUgTUFKT1IgU1RSSUZZKFBZX01BSk9SX1ZFUlNJT04pCi0jZGVmaW5lIE1JTk9SIFNUUklGWShQWV9NSU5PUl9WRVJTSU9OKQorI2RlZmluZSBNQUpPUiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikKKyNkZWZpbmUgTUlOT1IgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pCiAjZGVmaW5lIFRBRyBOQU1FICItIiBNQUpPUiBNSU5PUgogY29uc3QgY2hhciAqX1B5U3lzX0ltcGxDYWNoZVRhZyA9IFRBRzsKICN1bmRlZiBOQU1FCi0jdW5kZWYgUVVPVEUKLSN1bmRlZiBTVFJJRlkKICN1bmRlZiBNQUpPUgogI3VuZGVmIE1JTk9SCiAjdW5kZWYgVEFHCmRpZmYgLS1naXQgYS9QeXRob24vdHJhY2ViYWNrLmMgYi9QeXRob24vdHJhY2ViYWNrLmMKaW5kZXggOTQxZDFjYi4uNjJhNmIxZSAxMDA2NDQKLS0tIGEvUHl0aG9uL3RyYWNlYmFjay5jCisrKyBiL1B5dGhvbi90cmFjZWJhY2suYwpAQCAtNDc5LDQwICs0NzksMjYgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KIAotc3RhdGljIHZvaWQKLXJldmVyc2Vfc3RyaW5nKGNoYXIgKnRleHQsIGNvbnN0IHNpemVfdCBsZW4pCit2b2lkCitfUHlfRHVtcERlY2ltYWwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotICAgIGNoYXIgdG1wOwotICAgIHNpemVfdCBpLCBqOwotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAoaT0wLCBqPWxlbi0xOyBpIDwgajsgaSsrLCBqLS0pIHsKLSAgICAgICAgdG1wID0gdGV4dFtpXTsKLSAgICAgICAgdGV4dFtpXSA9IHRleHRbal07Ci0gICAgICAgIHRleHRbal0gPSB0bXA7Ci0gICAgfQotfQorICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVxdWlyZWQgZm9yIG91dHB1dCBvZiAlbGxkIG9yICVwLgorICAgICAgIFdlIG5lZWQgYXQgbW9zdCBjZWlsKGxvZzEwKDI1NikqU0laRU9GX0xPTkdfTE9ORykgZGlnaXRzLAorICAgICAgIHBsdXMgMSBmb3IgdGhlIG51bGwgYnl0ZS4gIDUzLzIyIGlzIGFuIHVwcGVyIGJvdW5kIGZvciBsb2cxMCgyNTYpLiAqLworICAgIGNoYXIgYnVmZmVyWzEgKyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjUzLTEpIC8gMjIgKyAxXTsKKyAgICBjaGFyICpwdHIsICplbmQ7CiAKLS8qIEZvcm1hdCBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyA5OTk5OTldIHRvIGRlY2ltYWwsCi0gICBhbmQgd3JpdGUgaXQgaW50byB0aGUgZmlsZSBmZC4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGVjaW1hbChpbnQgZmQsIGludCB2YWx1ZSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls3XTsKLSAgICBpbnQgbGVuOwotICAgIGlmICh2YWx1ZSA8IDAgfHwgOTk5OTk5IDwgdmFsdWUpCi0gICAgICAgIHJldHVybjsKLSAgICBsZW4gPSAwOworICAgIGVuZCA9ICZidWZmZXJbUHlfQVJSQVlfTEVOR1RIKGJ1ZmZlcikgLSAxXTsKKyAgICBwdHIgPSBlbmQ7CisgICAgKnB0ciA9ICdcMCc7CiAgICAgZG8gewotICAgICAgICBidWZmZXJbbGVuXSA9ICcwJyArICh2YWx1ZSAlIDEwKTsKKyAgICAgICAgLS1wdHI7CisgICAgICAgIGFzc2VydChwdHIgPj0gYnVmZmVyKTsKKyAgICAgICAgKnB0ciA9ICcwJyArICh2YWx1ZSAlIDEwKTsKICAgICAgICAgdmFsdWUgLz0gMTA7Ci0gICAgICAgIGxlbisrOwogICAgIH0gd2hpbGUgKHZhbHVlKTsKLSAgICByZXZlcnNlX3N0cmluZyhidWZmZXIsIGxlbik7Ci0gICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIGJ1ZmZlciwgbGVuKTsKKworICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBwdHIsIGVuZCAtIHB0cik7CiB9CiAKIC8qIEZvcm1hdCBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAweGZmZmZmZmZmXSB0byBoZXhhZGVjaW1hbCBvZiAnd2lkdGgnIGRpZ2l0cywKQEAgLTUyMCwyNyArNTA2LDMxIEBACiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCiAKLXN0YXRpYyB2b2lkCi1kdW1wX2hleGFkZWNpbWFsKGludCBmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IHdpZHRoKQordm9pZAorX1B5X0R1bXBIZXhhZGVjaW1hbChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUsIFB5X3NzaXplX3Qgd2lkdGgpCiB7Ci0gICAgaW50IGxlbjsKLSAgICBjaGFyIGJ1ZmZlcltzaXplb2YodW5zaWduZWQgbG9uZykgKiAyICsgMV07Ci0gICAgbGVuID0gMDsKKyAgICBjaGFyIGJ1ZmZlcltzaXplb2YodW5zaWduZWQgbG9uZykgKiAyICsgMV0sICpwdHIsICplbmQ7CisgICAgY29uc3QgUHlfc3NpemVfdCBzaXplID0gUHlfQVJSQVlfTEVOR1RIKGJ1ZmZlcikgLSAxOworCisgICAgaWYgKHdpZHRoID4gc2l6ZSkKKyAgICAgICAgd2lkdGggPSBzaXplOworICAgIC8qIGl0J3Mgb2sgaWYgd2lkdGggaXMgbmVnYXRpdmUgKi8KKworICAgIGVuZCA9ICZidWZmZXJbc2l6ZV07CisgICAgcHRyID0gZW5kOworICAgICpwdHIgPSAnXDAnOwogICAgIGRvIHsKLSAgICAgICAgYnVmZmVyW2xlbl0gPSBQeV9oZXhkaWdpdHNbdmFsdWUgJiAxNV07CisgICAgICAgIC0tcHRyOworICAgICAgICBhc3NlcnQocHRyID49IGJ1ZmZlcik7CisgICAgICAgICpwdHIgPSBQeV9oZXhkaWdpdHNbdmFsdWUgJiAxNV07CiAgICAgICAgIHZhbHVlID4+PSA0OwotICAgICAgICBsZW4rKzsKLSAgICB9IHdoaWxlIChsZW4gPCB3aWR0aCB8fCB2YWx1ZSk7Ci0gICAgcmV2ZXJzZV9zdHJpbmcoYnVmZmVyLCBsZW4pOwotICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBidWZmZXIsIGxlbik7CisgICAgfSB3aGlsZSAoKGVuZCAtIHB0cikgPCB3aWR0aCB8fCB2YWx1ZSk7CisKKyAgICBfUHlfd3JpdGVfbm9yYWlzZShmZCwgcHRyLCBlbmQgLSBwdHIpOwogfQogCi0vKiBXcml0ZSBhbiB1bmljb2RlIG9iamVjdCBpbnRvIHRoZSBmaWxlIGZkIHVzaW5nIGFzY2lpK2JhY2tzbGFzaHJlcGxhY2UuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCi0KLXN0YXRpYyB2b2lkCi1kdW1wX2FzY2lpKGludCBmZCwgUHlPYmplY3QgKnRleHQpCit2b2lkCitfUHlfRHVtcEFTQ0lJKGludCBmZCwgUHlPYmplY3QgKnRleHQpCiB7CiAgICAgUHlBU0NJSU9iamVjdCAqYXNjaWkgPSAoUHlBU0NJSU9iamVjdCAqKXRleHQ7CiAgICAgUHlfc3NpemVfdCBpLCBzaXplOwpAQCAtNTUwLDMyICs1NDAsMzYgQEAKICAgICB3Y2hhcl90ICp3c3RyID0gTlVMTDsKICAgICBQeV9VQ1M0IGNoOwogCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodGV4dCkpCisgICAgICAgIHJldHVybjsKKwogICAgIHNpemUgPSBhc2NpaS0+bGVuZ3RoOwogICAgIGtpbmQgPSBhc2NpaS0+c3RhdGUua2luZDsKLSAgICBpZiAoYXNjaWktPnN0YXRlLmNvbXBhY3QpIHsKKyAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfV0NIQVJfS0lORCkgeworICAgICAgICB3c3RyID0gKChQeUFTQ0lJT2JqZWN0ICopdGV4dCktPndzdHI7CisgICAgICAgIGlmICh3c3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHNpemUgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QgKil0ZXh0KS0+d3N0cl9sZW5ndGg7CisgICAgfQorICAgIGVsc2UgaWYgKGFzY2lpLT5zdGF0ZS5jb21wYWN0KSB7CiAgICAgICAgIGlmIChhc2NpaS0+c3RhdGUuYXNjaWkpCiAgICAgICAgICAgICBkYXRhID0gKChQeUFTQ0lJT2JqZWN0Kil0ZXh0KSArIDE7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGRhdGEgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QqKXRleHQpICsgMTsKICAgICB9Ci0gICAgZWxzZSBpZiAoa2luZCAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCkgeworICAgIGVsc2UgewogICAgICAgICBkYXRhID0gKChQeVVuaWNvZGVPYmplY3QgKil0ZXh0KS0+ZGF0YS5hbnk7CiAgICAgICAgIGlmIChkYXRhID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICB3c3RyID0gKChQeUFTQ0lJT2JqZWN0ICopdGV4dCktPndzdHI7Ci0gICAgICAgIGlmICh3c3RyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNpemUgPSAoKFB5Q29tcGFjdFVuaWNvZGVPYmplY3QgKil0ZXh0KS0+d3N0cl9sZW5ndGg7Ci0gICAgfQogCiAgICAgaWYgKE1BWF9TVFJJTkdfTEVOR1RIIDwgc2l6ZSkgewogICAgICAgICBzaXplID0gTUFYX1NUUklOR19MRU5HVEg7CiAgICAgICAgIHRydW5jYXRlZCA9IDE7CiAgICAgfQotICAgIGVsc2UKKyAgICBlbHNlIHsKICAgICAgICAgdHJ1bmNhdGVkID0gMDsKKyAgICB9CiAKICAgICBmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBpZiAoa2luZCAhPSBQeVVuaWNvZGVfV0NIQVJfS0lORCkKQEAgLTU4OSwxOSArNTgzLDIwIEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPD0gMHhmZikgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxceCIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDIpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDIpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoIDw9IDB4ZmZmZikgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxcdSIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDQpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDQpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgUFVUUyhmZCwgIlxcVSIpOwotICAgICAgICAgICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgY2gsIDgpOworICAgICAgICAgICAgX1B5X0R1bXBIZXhhZGVjaW1hbChmZCwgY2gsIDgpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICh0cnVuY2F0ZWQpCisgICAgaWYgKHRydW5jYXRlZCkgewogICAgICAgICBQVVRTKGZkLCAiLi4uIik7CisgICAgfQogfQogCiAvKiBXcml0ZSBhIGZyYW1lIGludG8gdGhlIGZpbGUgZmQ6ICJGaWxlICJ4eHgiLCBsaW5lIHh4eCBpbiB4eHgiLgpAQCAtNjIwLDcgKzYxNSw3IEBACiAgICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19maWxlbmFtZSkpCiAgICAgewogICAgICAgICBQVVRTKGZkLCAiXCIiKTsKLSAgICAgICAgZHVtcF9hc2NpaShmZCwgY29kZS0+Y29fZmlsZW5hbWUpOworICAgICAgICBfUHlfRHVtcEFTQ0lJKGZkLCBjb2RlLT5jb19maWxlbmFtZSk7CiAgICAgICAgIFBVVFMoZmQsICJcIiIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKQEAgLTYyOSwxNCArNjI0LDIxIEBACiAgICAgLyogUHlGcmFtZV9HZXRMaW5lTnVtYmVyKCkgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuNy4wIGFuZCAzLjIuMCAqLwogICAgIGxpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoY29kZSwgZnJhbWUtPmZfbGFzdGkpOwogICAgIFBVVFMoZmQsICIsIGxpbmUgIik7Ci0gICAgZHVtcF9kZWNpbWFsKGZkLCBsaW5lbm8pOworICAgIGlmIChsaW5lbm8gPj0gMCkgeworICAgICAgICBfUHlfRHVtcERlY2ltYWwoZmQsICh1bnNpZ25lZCBsb25nKWxpbmVubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQVVRTKGZkLCAiPz8/Iik7CisgICAgfQogICAgIFBVVFMoZmQsICIgaW4gIik7CiAKICAgICBpZiAoY29kZSAhPSBOVUxMICYmIGNvZGUtPmNvX25hbWUgIT0gTlVMTAotICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2soY29kZS0+Y29fbmFtZSkpCi0gICAgICAgIGR1bXBfYXNjaWkoZmQsIGNvZGUtPmNvX25hbWUpOwotICAgIGVsc2UKKyAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2soY29kZS0+Y29fbmFtZSkpIHsKKyAgICAgICAgX1B5X0R1bXBBU0NJSShmZCwgY29kZS0+Y29fbmFtZSk7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICBQVVRTKGZkLCAiPz8/Iik7CisgICAgfQogCiAgICAgUFVUUyhmZCwgIlxuIik7CiB9CkBAIC02OTIsNyArNjk0LDkgQEAKICAgICAgICAgUFVUUyhmZCwgIkN1cnJlbnQgdGhyZWFkIDB4Iik7CiAgICAgZWxzZQogICAgICAgICBQVVRTKGZkLCAiVGhyZWFkIDB4Iik7Ci0gICAgZHVtcF9oZXhhZGVjaW1hbChmZCwgKHVuc2lnbmVkIGxvbmcpdHN0YXRlLT50aHJlYWRfaWQsIHNpemVvZih1bnNpZ25lZCBsb25nKSoyKTsKKyAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdHN0YXRlLT50aHJlYWRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyKTsKICAgICBQVVRTKGZkLCAiIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KTpcbiIpOwogfQogCkBAIC03MDQsMTEgKzcwOCw1NiBAQAogICAgaGFuZGxlcnMgaWYgc2lnbmFscyB3ZXJlIHJlY2VpdmVkLiAqLwogY29uc3QgY2hhcioKIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhpbnQgZmQsIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdGhyZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdHN0YXRlKQogewogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKICAgICB1bnNpZ25lZCBpbnQgbnRocmVhZHM7CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGlmIChjdXJyZW50X3RzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygpIGlzIGNhbGxlZCBmcm9tIHNpZ25hbCBoYW5kbGVycyBieQorICAgICAgICAgICBmYXVsdGhhbmRsZXIuCisKKyAgICAgICAgICAgU0lHU0VHViwgU0lHRlBFLCBTSUdBQlJULCBTSUdCVVMgYW5kIFNJR0lMTCBhcmUgc3luY2hyb25vdXMgc2lnbmFscworICAgICAgICAgICBhbmQgYXJlIHRodXMgZGVsaXZlcmVkIHRvIHRoZSB0aHJlYWQgdGhhdCBjYXVzZWQgdGhlIGZhdWx0LiBHZXQgdGhlCisgICAgICAgICAgIFB5dGhvbiB0aHJlYWQgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLgorCisgICAgICAgICAgIFB5VGhyZWFkU3RhdGVfR2V0KCkgZG9lc24ndCBnaXZlIHRoZSBzdGF0ZSBvZiB0aGUgdGhyZWFkIHRoYXQgY2F1c2VkCisgICAgICAgICAgIHRoZSBmYXVsdCBpZiB0aGUgdGhyZWFkIHJlbGVhc2VkIHRoZSBHSUwsIGFuZCBzbyB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgIGNhbm5vdCBiZSB1c2VkLiBSZWFkIHRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZSAoVExTKSBpbnN0ZWFkOiBjYWxsCisgICAgICAgICAgIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkuICovCisgICAgICAgIGN1cnJlbnRfdHN0YXRlID0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludGVycCA9IF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUoKTsKKyAgICAgICAgICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlIGludGVycHJldGVyIHN0YXRlIHRvIGdldCBQeXRob24gdGhyZWFkcyAqLworICAgICAgICAgICAgICAgIHJldHVybiAidW5hYmxlIHRvIGdldCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50ZXJwID0gY3VycmVudF90c3RhdGUtPmludGVycDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgLyogQ2FsbCBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBpbnN0ZWFkIG9mIFB5VGhyZWFkU3RhdGVfR2V0KCkKKyAgICAgICAgICAgdG8gbm90IGZhaWwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIHRoZSB0aHJlYWQgc3RhdGUgaXMgTlVMTC4gKi8KKyAgICAgICAgY3VycmVudF90aHJlYWQgPSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFdlIG5lZWQgdGhlIGludGVycHJldGVyIHN0YXRlIHRvIGdldCBQeXRob24gdGhyZWFkcyAqLworICAgICAgICAgICAgcmV0dXJuICJ1bmFibGUgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSI7CisgICAgICAgIH0KKyAgICAgICAgaW50ZXJwID0gY3VycmVudF90c3RhdGUtPmludGVycDsKKyAgICB9CisjZW5kaWYKKyAgICBhc3NlcnQoaW50ZXJwICE9IE5VTEwpOworCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IGludGVycHJldGVyIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkICovCiAgICAgdHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQoaW50ZXJwKTsKICAgICBpZiAodHN0YXRlID09IE5VTEwpCkBAIC03MjYsNyArNzc1LDcgQEAKICAgICAgICAgICAgIFBVVFMoZmQsICIuLi5cbiIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgd3JpdGVfdGhyZWFkX2lkKGZkLCB0c3RhdGUsIHRzdGF0ZSA9PSBjdXJyZW50X3RocmVhZCk7CisgICAgICAgIHdyaXRlX3RocmVhZF9pZChmZCwgdHN0YXRlLCB0c3RhdGUgPT0gY3VycmVudF90c3RhdGUpOwogICAgICAgICBkdW1wX3RyYWNlYmFjayhmZCwgdHN0YXRlLCAwKTsKICAgICAgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSk7CiAgICAgICAgIG50aHJlYWRzKys7CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggZDU4YzQwOS4uMDI3MDllMyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLVRoaXMgaXMgUHl0aG9uIHZlcnNpb24gMy41LjEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgaXMgUHl0aG9uIHZlcnNpb24gMy42LjAgYWxwaGEgMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSwKIDIwMTIsIDIwMTMsIDIwMTQsIDIwMTUsIDIwMTYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMjgsOSArMjgsOSBAQAogZWxzZXdoZXJlIGl0J3MganVzdCBweXRob24uCiAKIE9uIE1hYyBPUyBYLCBpZiB5b3UgaGF2ZSBjb25maWd1cmVkIFB5dGhvbiB3aXRoIC0tZW5hYmxlLWZyYW1ld29yaywgeW91IHNob3VsZAotdXNlICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgdGhpcyBpbnN0YWxscwotdGhlIFB5dGhvbiBleGVjdXRhYmxlIGluIGEgcGxhY2UgdGhhdCBpcyBub3Qgbm9ybWFsbHkgb24geW91ciBQQVRILCB5b3UgbWF5Ci13YW50IHRvIHNldCB1cCBhIHN5bWxpbmsgaW4gL3Vzci9sb2NhbC9iaW4uCit1c2UgIm1ha2UgZnJhbWV3b3JraW5zdGFsbCIgdG8gZG8gdGhlIGluc3RhbGxhdGlvbi4gIE5vdGUgdGhhdCB0aGlzIGluc3RhbGxzIHRoZQorUHl0aG9uIGV4ZWN1dGFibGUgaW4gYSBwbGFjZSB0aGF0IGlzIG5vdCBub3JtYWxseSBvbiB5b3VyIFBBVEgsIHlvdSBtYXkgd2FudCB0bworc2V0IHVwIGEgc3ltbGluayBpbiAvdXNyL2xvY2FsL2Jpbi4KIAogT24gV2luZG93cywgc2VlIFBDYnVpbGQvcmVhZG1lLnR4dC4KIApAQCAtNzksOSArNzksOSBAQAogLS0tLS0tLS0tLQogCiBXZSBoYXZlIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgIldoYXQncyBOZXcgaW4KLVB5dGhvbiAzLjUiIGRvY3VtZW50LCBmb3VuZCBhdAorUHl0aG9uIDMuNiIgZG9jdW1lbnQsIGZvdW5kIGF0CiAKLSAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNS93aGF0c25ldy8zLjUuaHRtbAorICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy42L3doYXRzbmV3LzMuNi5odG1sCiAKIEZvciBhIG1vcmUgZGV0YWlsZWQgY2hhbmdlIGxvZywgcmVhZCBNaXNjL05FV1MgKHRob3VnaCB0aGlzIGZpbGUsIHRvbywKIGlzIGluY29tcGxldGUsIGFuZCBhbHNvIGRvZXNuJ3QgbGlzdCBhbnl0aGluZyBtZXJnZWQgaW4gZnJvbSB0aGUgMi43CkBAIC05NCw5ICs5NCw5IEBACiBEb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tCiAKLURvY3VtZW50YXRpb24gZm9yIFB5dGhvbiAzLjUgaXMgb25saW5lLCB1cGRhdGVkIGRhaWx5OgorRG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDMuNiBpcyBvbmxpbmUsIHVwZGF0ZWQgZGFpbHk6CiAKLSAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNS8KKyAgICBodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNi8KIAogSXQgY2FuIGFsc28gYmUgZG93bmxvYWRlZCBpbiBtYW55IGZvcm1hdHMgZm9yIGZhc3RlciBhY2Nlc3MuICBUaGUgZG9jdW1lbnRhdGlvbgogaXMgZG93bmxvYWRhYmxlIGluIEhUTUwsIFBERiwgYW5kIHJlU3RydWN0dXJlZFRleHQgZm9ybWF0czsgdGhlIGxhdHRlciB2ZXJzaW9uCkBAIC0xMjEsNyArMTIxLDcgQEAKIEEgc291cmNlLXRvLXNvdXJjZSB0cmFuc2xhdGlvbiB0b29sLCAiMnRvMyIsIGNhbiB0YWtlIGNhcmUgb2YgdGhlIG11bmRhbmUgdGFzawogb2YgY29udmVydGluZyBsYXJnZSBhbW91bnRzIG9mIHNvdXJjZSBjb2RlLiAgSXQgaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gYnV0CiBpcyBjb21wbGVtZW50ZWQgYnkgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIDIuNi4gIFNlZQotaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwOi8vZG9jcy5weXRob24ub3JnLzMuNi9saWJyYXJ5LzJ0bzMuaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAogCiBUZXN0aW5nCkBAIC0xNTEsMTYgKzE1MSwxNiBAQAogCiBPbiBVbml4IGFuZCBNYWMgc3lzdGVtcyBpZiB5b3UgaW50ZW5kIHRvIGluc3RhbGwgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uCiB1c2luZyB0aGUgc2FtZSBpbnN0YWxsYXRpb24gcHJlZml4ICgtLXByZWZpeCBhcmd1bWVudCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCkKLXlvdSBtdXN0IHRha2UgY2FyZSB0aGF0IHlvdXIgcHJpbWFyeSBweXRob24gZXhlY3V0YWJsZSBpcyBub3Qgb3ZlcndyaXR0ZW4gYnkKLXRoZSBpbnN0YWxsYXRpb24gb2YgYSBkaWZmZXJlbnQgdmVyc2lvbi4gIEFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkCi11c2luZyAibWFrZSBhbHRpbnN0YWxsIiBjb250YWluIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBhbmQgY2FuIHRodXMgbGl2ZQotc2lkZS1ieS1zaWRlLiAgIm1ha2UgaW5zdGFsbCIgYWxzbyBjcmVhdGVzICR7cHJlZml4fS9iaW4vcHl0aG9uMyB3aGljaCByZWZlcnMKLXRvICR7cHJlZml4fS9iaW4vcHl0aG9uWC5ZLiAgSWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIHVzaW5nCi10aGUgc2FtZSBwcmVmaXggeW91IG11c3QgZGVjaWRlIHdoaWNoIHZlcnNpb24gKGlmIGFueSkgaXMgeW91ciAicHJpbWFyeSIKLXZlcnNpb24uICBJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyCi12ZXJzaW9ucyB1c2luZyAibWFrZSBhbHRpbnN0YWxsIi4KK3lvdSBtdXN0IHRha2UgY2FyZSB0aGF0IHlvdXIgcHJpbWFyeSBweXRob24gZXhlY3V0YWJsZSBpcyBub3Qgb3ZlcndyaXR0ZW4gYnkgdGhlCitpbnN0YWxsYXRpb24gb2YgYSBkaWZmZXJlbnQgdmVyc2lvbi4gIEFsbCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIiBjb250YWluIHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBhbmQgY2FuIHRodXMgbGl2ZQorc2lkZS1ieS1zaWRlLiAgIm1ha2UgaW5zdGFsbCIgYWxzbyBjcmVhdGVzICR7cHJlZml4fS9iaW4vcHl0aG9uMyB3aGljaCByZWZlcnMgdG8KKyR7cHJlZml4fS9iaW4vcHl0aG9uWC5ZLiAgSWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIHVzaW5nIHRoZQorc2FtZSBwcmVmaXggeW91IG11c3QgZGVjaWRlIHdoaWNoIHZlcnNpb24gKGlmIGFueSkgaXMgeW91ciAicHJpbWFyeSIgdmVyc2lvbi4KK0luc3RhbGwgdGhhdCB2ZXJzaW9uIHVzaW5nICJtYWtlIGluc3RhbGwiLiAgSW5zdGFsbCBhbGwgb3RoZXIgdmVyc2lvbnMgdXNpbmcKKyJtYWtlIGFsdGluc3RhbGwiLgogCi1Gb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNSB3aXRoIDIuNyBiZWluZyB0aGUKK0ZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBpbnN0YWxsIFB5dGhvbiAyLjYsIDIuNyBhbmQgMy42IHdpdGggMi43IGJlaW5nIHRoZQogcHJpbWFyeSB2ZXJzaW9uLCB5b3Ugd291bGQgZXhlY3V0ZSAibWFrZSBpbnN0YWxsIiBpbiB5b3VyIDIuNyBidWlsZCBkaXJlY3RvcnkKIGFuZCAibWFrZSBhbHRpbnN0YWxsIiBpbiB0aGUgb3RoZXJzLgogCkBAIC0xOTYsNyArMTk2LDcgQEAKIFJlbGVhc2UgU2NoZWR1bGUKIC0tLS0tLS0tLS0tLS0tLS0KIAotU2VlIFBFUCA0NzggZm9yIHJlbGVhc2UgZGV0YWlsczogaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDc4LworU2VlIFBFUCA0OTQgZm9yIHJlbGVhc2UgZGV0YWlsczogaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDk0LwogCiAKIENvcHlyaWdodCBhbmQgTGljZW5zZSBJbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3QvdGVzdC5iYXQgYi9Ub29scy9idWlsZGJvdC90ZXN0LmJhdAppbmRleCBmZjdkMTY3Li5jMDE0MDBjIDEwMDY0NAotLS0gYS9Ub29scy9idWlsZGJvdC90ZXN0LmJhdAorKysgYi9Ub29scy9idWlsZGJvdC90ZXN0LmJhdApAQCAtMTYsNCArMTYsNCBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RfYXJncz0lcmVncnRlc3RfYXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIGVjaG8gb24NCi1jYWxsICIlaGVyZSUuLlwuLlxQQ2J1aWxkXHJ0LmJhdCIgJXJ0X29wdHMlIC11YWxsIC1yd1cgLS10aW1lb3V0PTM2MDAgJXJlZ3J0ZXN0X2FyZ3MlDQorY2FsbCAiJWhlcmUlLi5cLi5cUENidWlsZFxydC5iYXQiICVydF9vcHRzJSAtdWFsbCAtcndXIC0tdGltZW91dD05MDAgJXJlZ3J0ZXN0X2FyZ3MlDQpkaWZmIC0tZ2l0IGEvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weSBiL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKaW5kZXggYzA3NTgwNy4uMzg5ZmZmZCAxMDA3NTUKLS0tIGEvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQorKysgYi9Ub29scy9mcmVlemUvZnJlZXplLnB5CkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICBpc2hvbWUgPSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocHJlZml4LCAnUHl0aG9uJywgJ2NldmFsLmMnKSkKIAogICAgICMgbG9jYXRpb25zIGRlcml2ZWQgZnJvbSBvcHRpb25zCi0gICAgdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzozXQorICAgIHZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICBmbGFnZ2VkX3ZlcnNpb24gPSB2ZXJzaW9uICsgc3lzLmFiaWZsYWdzCiAgICAgaWYgd2luOgogICAgICAgICBleHRlbnNpb25zX2MgPSAnZnJvemVuX2V4dGVuc2lvbnMuYycKZGlmZiAtLWdpdCBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5IGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKaW5kZXggM2M2YzE0Yy4uYmU5NDFjNyAxMDA3NTUKLS0tIGEvVG9vbHMvaTE4bi9weWdldHRleHQucHkKKysrIGIvVG9vbHMvaTE4bi9weWdldHRleHQucHkKQEAgLTE1Niw3ICsxNTYsOCBAQAogIiIiKQogCiBpbXBvcnQgb3MKLWltcG9ydCBpbXAKK2ltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CitpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCBzeXMKIGltcG9ydCBnbG9iCiBpbXBvcnQgdGltZQpAQCAtMjYzLDggKzI2NCw3IEBACiAgICAgIyBnZXQgZXh0ZW5zaW9uIGZvciBweXRob24gc291cmNlIGZpbGVzCiAgICAgaWYgJ19weV9leHQnIG5vdCBpbiBnbG9iYWxzKCk6CiAgICAgICAgIGdsb2JhbCBfcHlfZXh0Ci0gICAgICAgIF9weV9leHQgPSBbdHJpcGxlWzBdIGZvciB0cmlwbGUgaW4gaW1wLmdldF9zdWZmaXhlcygpCi0gICAgICAgICAgICAgICAgICAgaWYgdHJpcGxlWzJdID09IGltcC5QWV9TT1VSQ0VdWzBdCisgICAgICAgIF9weV9leHQgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFU1swXQogCiAgICAgIyBkb24ndCByZWN1cnNlIGludG8gQ1ZTIGRpcmVjdG9yaWVzCiAgICAgaWYgJ0NWUycgaW4gbmFtZXM6CkBAIC0yNzcsNDUgKzI3Nyw2IEBACiAgICAgICAgICkKIAogCi1kZWYgX2dldF9tb2Rwa2dfcGF0aChkb3R0ZWRfbmFtZSwgcGF0aGxpc3Q9Tm9uZSk6Ci0gICAgIiIiR2V0IHRoZSBmaWxlc3lzdGVtIHBhdGggZm9yIGEgbW9kdWxlIG9yIGEgcGFja2FnZS4KLQotICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCB0byBhIGZpbGUgZm9yIGEgbW9kdWxlLCBhbmQgdG8gYSBkaXJlY3RvcnkgZm9yCi0gICAgYSBwYWNrYWdlLiBSZXR1cm4gTm9uZSBpZiB0aGUgbmFtZSBpcyBub3QgZm91bmQsIG9yIGlzIGEgYnVpbHRpbiBvcgotICAgIGV4dGVuc2lvbiBtb2R1bGUuCi0gICAgIiIiCi0gICAgIyBzcGxpdCBvZmYgdG9wLW1vc3QgbmFtZQotICAgIHBhcnRzID0gZG90dGVkX25hbWUuc3BsaXQoJy4nLCAxKQotCi0gICAgaWYgbGVuKHBhcnRzKSA+IDE6Ci0gICAgICAgICMgd2UgaGF2ZSBhIGRvdHRlZCBwYXRoLCBpbXBvcnQgdG9wLWxldmVsIHBhY2thZ2UKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKHBhcnRzWzBdLCBwYXRobGlzdCkKLSAgICAgICAgICAgIGlmIGZpbGU6IGZpbGUuY2xvc2UoKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgICMgY2hlY2sgaWYgaXQncyBpbmRlZWQgYSBwYWNrYWdlCi0gICAgICAgIGlmIGRlc2NyaXB0aW9uWzJdID09IGltcC5QS0dfRElSRUNUT1JZOgotICAgICAgICAgICAgIyByZWN1cnNpdmVseSBoYW5kbGUgdGhlIHJlbWFpbmluZyBuYW1lIHBhcnRzCi0gICAgICAgICAgICBwYXRobmFtZSA9IF9nZXRfbW9kcGtnX3BhdGgocGFydHNbMV0sIFtwYXRobmFtZV0pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXRobmFtZSA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICAjIHBsYWluIG5hbWUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKAotICAgICAgICAgICAgICAgIGRvdHRlZF9uYW1lLCBwYXRobGlzdCkKLSAgICAgICAgICAgIGlmIGZpbGU6Ci0gICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSBub3QgaW4gW2ltcC5QWV9TT1VSQ0UsIGltcC5QS0dfRElSRUNUT1JZXToKLSAgICAgICAgICAgICAgICBwYXRobmFtZSA9IE5vbmUKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0KLSAgICByZXR1cm4gcGF0aG5hbWUKLQotCiBkZWYgZ2V0RmlsZXNGb3JOYW1lKG5hbWUpOgogICAgICIiIkdldCBhIGxpc3Qgb2YgbW9kdWxlIGZpbGVzIGZvciBhIGZpbGVuYW1lLCBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUsCiAgICAgb3IgYSBkaXJlY3RvcnkuCkBAIC0zMzAsNyArMjkxLDExIEBACiAgICAgICAgICAgICByZXR1cm4gbGlzdAogCiAgICAgICAgICMgdHJ5IHRvIGZpbmQgbW9kdWxlIG9yIHBhY2thZ2UKLSAgICAgICAgbmFtZSA9IF9nZXRfbW9kcGtnX3BhdGgobmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQorICAgICAgICAgICAgbmFtZSA9IHNwZWMub3JpZ2luCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIG5hbWUgPSBOb25lCiAgICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICAgcmV0dXJuIFtdCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cyBiL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cwppbmRleCBmYTc5YThkLi44MDRhYjAxIDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKKysrIGIvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCkBAIC02NCwxNiArNjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgPFJlZ2lzdHJ5VmFsdWUgS2V5PSJQeXRob25QYXRoIiBUeXBlPSJzdHJpbmciIFZhbHVlPSJbTGliXTtbRExMc10iIC8+CiAgICAgICAgICAgICAgICAgPC9SZWdpc3RyeUtleT4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgotICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iTGliX3NpdGVfcGFja2FnZXNfUkVBRE1FIiBEaXJlY3Rvcnk9IkxpYl9zaXRlX3BhY2thZ2VzIiBHdWlkPSIqIj4KLSAgICAgICAgICAgICAgICA8RmlsZSBJZD0iTGliX3NpdGVfcGFja2FnZXNfUkVBRE1FIiBOYW1lPSJSRUFETUUudHh0IiBTb3VyY2U9IiEoYmluZHBhdGguc3JjKUxpYlxzaXRlLXBhY2thZ2VzXFJFQURNRSIgS2V5UGF0aD0ieWVzIiAvPgotICAgICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgICAgICA8Q29tcG9uZW50IElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmUiIERpcmVjdG9yeT0iTGliX2xpYjJ0bzMiIEd1aWQ9IiQodmFyLlJlbW92ZUxpYjJ0bzNQaWNrbGVDb21wb25lbnRHdWlkKSI+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZpbGUgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZV9maWxlcyIgTmFtZT0iKi5waWNrbGUiIE9uPSJ1bmluc3RhbGwiIC8+CiAgICAgICAgICAgICAgICAgPFJlbW92ZUZvbGRlciBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlX2ZvbGRlciIgT249InVuaW5zdGFsbCIgLz4KICAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICA8L0NvbXBvbmVudEdyb3VwPgotICAgICAgICA8RGlyZWN0b3J5UmVmIElkPSJMaWIiPgotICAgICAgICAgICAgPERpcmVjdG9yeSBJZD0iTGliX3NpdGVfcGFja2FnZXMiIE5hbWU9InNpdGUtcGFja2FnZXMiIC8+Ci0gICAgICAgIDwvRGlyZWN0b3J5UmVmPgogICAgIDwvRnJhZ21lbnQ+CiA8L1dpeD4KZGlmZiAtLWdpdCBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5IGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKaW5kZXggMjg1MDMwZS4uNzIwMzA1NyAxMDA2NDQKLS0tIGEvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKKysrIGIvVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKQEAgLTMyMiw5ICszMjIsNzIgQEAKICAgICBkZWYgX1N0cihzZWxmLCB0cmVlKToKICAgICAgICAgc2VsZi53cml0ZShyZXByKHRyZWUucykpCiAKKyAgICBkZWYgX0pvaW5lZFN0cihzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Kb2luZWRTdHIodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0KToKKyAgICAgICAgc2VsZi53cml0ZSgiZiIpCisgICAgICAgIHN0cmluZyA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZSh0LCBzdHJpbmcud3JpdGUpCisgICAgICAgIHNlbGYud3JpdGUocmVwcihzdHJpbmcuZ2V0dmFsdWUoKSkpCisKKyAgICBkZWYgX2ZzdHJpbmdfSm9pbmVkU3RyKHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgZm9yIHZhbHVlIGluIHQudmFsdWVzOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHZhbHVlKS5fX25hbWVfXykKKyAgICAgICAgICAgIG1ldGgodmFsdWUsIHdyaXRlKQorCisgICAgZGVmIF9mc3RyaW5nX1N0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHZhbHVlID0gdC5zLnJlcGxhY2UoInsiLCAie3siKS5yZXBsYWNlKCJ9IiwgIn19IikKKyAgICAgICAgd3JpdGUodmFsdWUpCisKKyAgICBkZWYgX2ZzdHJpbmdfQ29uc3RhbnQoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0LnZhbHVlLCBzdHIpCisgICAgICAgIHZhbHVlID0gdC52YWx1ZS5yZXBsYWNlKCJ7IiwgInt7IikucmVwbGFjZSgifSIsICJ9fSIpCisgICAgICAgIHdyaXRlKHZhbHVlKQorCisgICAgZGVmIF9mc3RyaW5nX0Zvcm1hdHRlZFZhbHVlKHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgd3JpdGUoInsiKQorICAgICAgICBleHByID0gaW8uU3RyaW5nSU8oKQorICAgICAgICBVbnBhcnNlcih0LnZhbHVlLCBleHByKQorICAgICAgICBleHByID0gZXhwci5nZXR2YWx1ZSgpLnJzdHJpcCgiXG4iKQorICAgICAgICBpZiBleHByLnN0YXJ0c3dpdGgoInsiKToKKyAgICAgICAgICAgIHdyaXRlKCIgIikgICMgU2VwYXJhdGUgcGFpciBvZiBvcGVuaW5nIGJyYWNrZXRzIGFzICJ7IHsiCisgICAgICAgIHdyaXRlKGV4cHIpCisgICAgICAgIGlmIHQuY29udmVyc2lvbiAhPSAtMToKKyAgICAgICAgICAgIGNvbnZlcnNpb24gPSBjaHIodC5jb252ZXJzaW9uKQorICAgICAgICAgICAgYXNzZXJ0IGNvbnZlcnNpb24gaW4gInNyYSIKKyAgICAgICAgICAgIHdyaXRlKGYiIXtjb252ZXJzaW9ufSIpCisgICAgICAgIGlmIHQuZm9ybWF0X3NwZWM6CisgICAgICAgICAgICB3cml0ZSgiOiIpCisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAiX2ZzdHJpbmdfIiArIHR5cGUodC5mb3JtYXRfc3BlYykuX19uYW1lX18pCisgICAgICAgICAgICBtZXRoKHQuZm9ybWF0X3NwZWMsIHdyaXRlKQorICAgICAgICB3cml0ZSgifSIpCisKICAgICBkZWYgX05hbWUoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUodC5pZCkKIAorICAgIGRlZiBfd3JpdGVfY29uc3RhbnQoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoZmxvYXQsIGNvbXBsZXgpKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUocmVwcih2YWx1ZSkucmVwbGFjZSgiaW5mIiwgSU5GU1RSKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUocmVwcih2YWx1ZSkpCisKKyAgICBkZWYgX0NvbnN0YW50KHNlbGYsIHQpOgorICAgICAgICB2YWx1ZSA9IHQudmFsdWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiKCIpCisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfY29uc3RhbnQodmFsdWVbMF0pCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiLCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGludGVybGVhdmUobGFtYmRhOiBzZWxmLndyaXRlKCIsICIpLCBzZWxmLl93cml0ZV9jb25zdGFudCwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLndyaXRlKCIpIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2NvbnN0YW50KHQudmFsdWUpCisKICAgICBkZWYgX05hbWVDb25zdGFudChzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZShyZXByKHQudmFsdWUpKQogCkBAIC00MTMsNyArNDc2LDcgQEAKICAgICBkZWYgX1R1cGxlKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKCIoIikKICAgICAgICAgaWYgbGVuKHQuZWx0cykgPT0gMToKLSAgICAgICAgICAgIChlbHQsKSA9IHQuZWx0cworICAgICAgICAgICAgZWx0ID0gdC5lbHRzWzBdCiAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGVsdCkKICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQogICAgICAgICBlbHNlOgpAQCAtNDYwLDcgKzUyMyw4IEBACiAgICAgICAgICMgU3BlY2lhbCBjYXNlOiAzLl9fYWJzX18oKSBpcyBhIHN5bnRheCBlcnJvciwgc28gaWYgdC52YWx1ZQogICAgICAgICAjIGlzIGFuIGludGVnZXIgbGl0ZXJhbCB0aGVuIHdlIG5lZWQgdG8gZWl0aGVyIHBhcmVudGhlc2l6ZQogICAgICAgICAjIGl0IG9yIGFkZCBhbiBleHRyYSBzcGFjZSB0byBnZXQgMyAuX19hYnNfXygpLgotICAgICAgICBpZiBpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KToKKyAgICAgICAgaWYgKChpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5OdW0pIGFuZCBpc2luc3RhbmNlKHQudmFsdWUubiwgaW50KSkKKyAgICAgICAgICAgb3IgKGlzaW5zdGFuY2UodC52YWx1ZSwgYXN0LkNvbnN0YW50KSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLnZhbHVlLCBpbnQpKSk6CiAgICAgICAgICAgICBzZWxmLndyaXRlKCIgIikKICAgICAgICAgc2VsZi53cml0ZSgiLiIpCiAgICAgICAgIHNlbGYud3JpdGUodC5hdHRyKQpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weSBiL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKaW5kZXggZTEwZTQ5YS4uN2NhOTUyNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQorKysgYi9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CkBAIC02LDcgKzYsNyBAQAogQSBoZWxwZXIgZm9yIGFuYWx5emluZyBQWVRIT05EVU1QUkVGUyBvdXRwdXQuCiAKIFdoZW4gdGhlIFBZVEhPTkRVTVBSRUZTIGVudmFyIGlzIHNldCBpbiBhIGRlYnVnIGJ1aWxkLCBhdCBQeXRob24gc2h1dGRvd24KLXRpbWUgUHlfRmluYWxpemUoKSBwcmludHMgdGhlIGxpc3Qgb2YgYWxsIGxpdmUgb2JqZWN0cyB0d2ljZTogIGZpcnN0IGl0Cit0aW1lIFB5X0ZpbmFsaXplRXgoKSBwcmludHMgdGhlIGxpc3Qgb2YgYWxsIGxpdmUgb2JqZWN0cyB0d2ljZTogIGZpcnN0IGl0CiBwcmludHMgdGhlIHJlcHIoKSBvZiBlYWNoIG9iamVjdCB3aGlsZSB0aGUgaW50ZXJwcmV0ZXIgaXMgc3RpbGwgZnVsbHkgaW50YWN0LgogQWZ0ZXIgY2xlYW5pbmcgdXAgZXZlcnl0aGluZyBpdCBjYW4sIGl0IHByaW50cyBhbGwgcmVtYWluaW5nIGxpdmUgb2JqZWN0cwogYWdhaW4sIGJ1dCB0aGUgc2Vjb25kIHRpbWUganVzdCBwcmludHMgdGhlaXIgYWRkcmVzc2VzLCByZWZjb3VudHMsIGFuZCB0eXBlCkBAIC00MSw3ICs0MSw3IEBACiBvYmplY3RzIHNob3duIGluIHRoZSByZXByOiAgdGhlIHJlcHIgd2FzIGNhcHR1cmVkIGZyb20gdGhlIGZpcnN0IG91dHB1dCBibG9jaywKIGFuZCBzb21lIG9mIHRoZSBjb250YWluZWVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgc2luY2UgdGhlbi4gIEZvciBleGFtcGxlLAogaXQncyBjb21tb24gZm9yIHRoZSBsaW5lIHNob3dpbmcgdGhlIGRpY3Qgb2YgaW50ZXJuZWQgc3RyaW5ncyB0byBkaXNwbGF5Ci1zdHJpbmdzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoZSBlbmQgb2YgUHlfRmluYWxpemU7IHRoaXMgY2FuIGJlIHJlY29nbml6ZWQKK3N0cmluZ3MgdGhhdCBubyBsb25nZXIgZXhpc3QgYXQgdGhlIGVuZCBvZiBQeV9GaW5hbGl6ZUV4OyB0aGlzIGNhbiBiZSByZWNvZ25pemVkCiAoYWxiZWl0IHBhaW5mdWxseSkgYmVjYXVzZSBzdWNoIGNvbnRhaW5lZXMgZG9uJ3QgaGF2ZSBhIGxpbmUgb2YgdGhlaXIgb3duLgogCiBUaGUgb2JqZWN0cyBhcmUgbGlzdGVkIGluIGFsbG9jYXRpb24gb3JkZXIsIHdpdGggbW9zdC1yZWNlbnRseSBhbGxvY2F0ZWQKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5IGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKaW5kZXggOGYwNzU1OS4uODNiYmNkNyAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9ubTJkZWYucHkKQEAgLTM2LDggKzM2LDggQEAKICIiIgogaW1wb3J0IG9zLCBzeXMKIAotUFlUSE9OTElCID0gJ2xpYnB5dGhvbicrc3lzLnZlcnNpb25bOjNdKycuYScKLVBDX1BZVEhPTkxJQiA9ICdQeXRob24nK3N5cy52ZXJzaW9uWzBdK3N5cy52ZXJzaW9uWzJdKycuZGxsJworUFlUSE9OTElCID0gJ2xpYnB5dGhvbiVkLiVkLmEnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KK1BDX1BZVEhPTkxJQiA9ICdQeXRob24lZCVkLmRsbCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogTk0gPSAnbm0gLXAgLWcgJXMnICAgICAgICAgICAgICAgICAgICAgICMgRm9yIExpbnV4LCB1c2UgIm5tIC1nICVzIgogCiBkZWYgc3ltYm9scyhsaWI9UFlUSE9OTElCLHR5cGVzPSgnVCcsJ0MnLCdEJykpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9weXZlbnYgYi9Ub29scy9zY3JpcHRzL3B5dmVudgppbmRleCA5NzhkNjkxLi4xZmI0MmM2IDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL3B5dmVudgorKysgYi9Ub29scy9zY3JpcHRzL3B5dmVudgpAQCAtMSw2ICsxLDEyIEBACiAjIS91c3IvYmluL2VudiBweXRob24zCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgcGF0aGxpYgorCisgICAgZXhlY3V0YWJsZSA9IHBhdGhsaWIuUGF0aChzeXMuZXhlY3V0YWJsZSBvciAncHl0aG9uMycpLm5hbWUKKyAgICBwcmludCgnV0FSTklORzogdGhlIHB5ZW52IHNjcmlwdCBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiAnCisgICAgICAgICAgZidge2V4ZWN1dGFibGV9IC1tIHZlbnZgJywgZmlsZT1zeXMuc3RkZXJyKQorCiAgICAgcmMgPSAxCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnQgdmVudgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDY4OTcwODQuLjNkMjU5NDggMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsNiArMSw2IEBACiAjISAvYmluL3NoCiAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNS4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5IGZvciBweXRob24gMy42LgogIwogIyBSZXBvcnQgYnVncyB0byA8aHR0cDovL2J1Z3MucHl0aG9uLm9yZy8+LgogIwpAQCAtNTgwLDggKzU4MCw4IEBACiAjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KIFBBQ0tBR0VfTkFNRT0ncHl0aG9uJwogUEFDS0FHRV9UQVJOQU1FPSdweXRob24nCi1QQUNLQUdFX1ZFUlNJT049JzMuNScKLVBBQ0tBR0VfU1RSSU5HPSdweXRob24gMy41JworUEFDS0FHRV9WRVJTSU9OPSczLjYnCitQQUNLQUdFX1NUUklORz0ncHl0aG9uIDMuNicKIFBBQ0tBR0VfQlVHUkVQT1JUPSdodHRwOi8vYnVncy5weXRob24ub3JnLycKIFBBQ0tBR0VfVVJMPScnCiAKQEAgLTEzODcsNyArMTM4Nyw3IEBACiAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgogICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCiAgIGNhdCA8PF9BQ0VPRgotXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgcHl0aG9uIDMuNSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCitcYGNvbmZpZ3VyZScgY29uZmlndXJlcyBweXRob24gMy42IHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KIAogVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtWQVI9VkFMVUVdLi4uCiAKQEAgLTE0NTIsNyArMTQ1Miw3IEBACiAKIGlmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCiAgIGNhc2UgJGFjX2luaXRfaGVscCBpbgotICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgcHl0aG9uIDMuNToiOzsKKyAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHB5dGhvbiAzLjY6Ijs7CiAgICBlc2FjCiAgIGNhdCA8PFxfQUNFT0YKIApAQCAtMTYwOSw3ICsxNjA5LDcgQEAKIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiICYmIGV4aXQgJGFjX3N0YXR1cwogaWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgogICBjYXQgPDxcX0FDRU9GCi1weXRob24gY29uZmlndXJlIDMuNQorcHl0aG9uIGNvbmZpZ3VyZSAzLjYKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OQogCiBDb3B5cmlnaHQgKEMpIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0yNDQ4LDcgKzI0NDgsNyBAQAogVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKLUl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK0l0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy42LCB3aGljaCB3YXMKIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKQEAgLTMwMjEsNyArMzAyMSw3IEBACiBtdiBjb25mZGVmcy5oLm5ldyBjb25mZGVmcy5oCiAKIAotVkVSU0lPTj0zLjUKK1ZFUlNJT049My42CiAKICMgVmVyc2lvbiBudW1iZXIgb2YgUHl0aG9uJ3Mgb3duIHNoYXJlZCBsaWJyYXJ5IGZpbGUuCiAKQEAgLTE2OTAxLDcgKzE2OTAxLDcgQEAKICMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgogIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KIGFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy41LCB3aGljaCB3YXMKK1RoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjYsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwpAQCAtMTY5NjMsNyArMTY5NjMsNyBAQAogY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCiBhY19jc19jb25maWc9ImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgIgogYWNfY3NfdmVyc2lvbj0iXFwKLXB5dGhvbiBjb25maWcuc3RhdHVzIDMuNQorcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy42CiBjb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjksCiAgIHdpdGggb3B0aW9ucyBcXCJcJGFjX2NzX2NvbmZpZ1xcIgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggYjEzY2YwNS4uMzI2YWZiYyAxMDA2NDQKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMyw3ICszLDcgQEAKIGRubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAjIFNldCBWRVJTSU9OIHNvIHdlIG9ubHkgbmVlZCB0byBlZGl0IGluIG9uZSBwbGFjZSAoaS5lLiwgaGVyZSkKLW00X2RlZmluZShQWVRIT05fVkVSU0lPTiwgMy41KQorbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjYpCiAKIEFDX1BSRVJFUSgyLjY1KQogCmRpZmYgLS1naXQgYS9zZXR1cC5weSBiL3NldHVwLnB5CmluZGV4IGRlNmU1YWQuLmI3NDgyYmMgMTAwNjQ0Ci0tLSBhL3NldHVwLnB5CisrKyBiL3NldHVwLnB5CkBAIC0yMjQyLDcgKzIyNDIsNyBAQAogICAgIHNldHVwKCMgUHlQSSBNZXRhZGF0YSAoUEVQIDMwMSkKICAgICAgICAgICBuYW1lID0gIlB5dGhvbiIsCiAgICAgICAgICAgdmVyc2lvbiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0sCi0gICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy8lcyIgJSBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy8lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICBtYWludGFpbmVyID0gIkd1aWRvIHZhbiBSb3NzdW0gYW5kIHRoZSBQeXRob24gY29tbXVuaXR5IiwKICAgICAgICAgICBtYWludGFpbmVyX2VtYWlsID0gInB5dGhvbi1kZXZAcHl0aG9uLm9yZyIsCiAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiQSBoaWdoLWxldmVsIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZyBsYW5ndWFnZSIsCg==