LyoKICogIE5vdGVwYWQgKFNwYW5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTcsOTggTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgogKiAgUHJvb2ZyZWFkIDE5OTggYnkgRGF2aWQgTGVlIExhbWJlcnQgPGxhbWJlcjQ1QGVnci5tc3UuZWR1PgogKiAgUHJvb2ZyZWFkIDE5OTkgYnkgSm9zZSBNYXJjb3MgTG9wZXogPGpvc2UubG9wZXpAdXBjbmV0LnVwYy5lcz4KICogIENvcHlyaWdodCAyMDAyIFN5bHZhaW4gUGV0cmVvbGxlIDxzcGV0cmVvbGxlQHlhaG9vLmZyPgogKiAgQ29weXJpZ2h0IDIwMDMsMjAwNCBKb3PpIE1hbnVlbCBGZXJyZXIgT3J0aXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgIm5vdGVwYWRfcmVzLmgiCgpMQU5HVUFHRSBMQU5HX1NQQU5JU0gsIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZBcmNoaXZvIiB7CiAgTUVOVUlURU0gIiZOdWV2b1x0Q3RybCtOIiwgICAgICAgICAgICAgICAgICAgQ01EX05FVwogIE1FTlVJVEVNICImQWJyaXIuLi5cdEN0cmwrTyIsICAgICAgICAgICAgICBDTURfT1BFTgogIE1FTlVJVEVNICImR3VhcmRhclx0Q3RybCtTIiwgICAgICAgICAgICBDTURfU0FWRQogIE1FTlVJVEVNICJHdWFyZGFyICZjb21vLi4uIiwgICAgICAgICAgICBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIuLi5cdEN0cmwrUCIsICAgICAgICAgICAgICAgICAgIENNRF9QUklOVAogIE1FTlVJVEVNICJDb25maWd1cmFyICZw4WdpbmEuLi4iLCAgICAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJDb25maWd1cmFjafNuICZpbXByZXNvcmEuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImU2FsaXIiLCAgICAgICAgICAgICAgICAgICAgICBDTURfRVhJVAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzaGFjZXJcdEN0cmwrWiIsICAgICAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQ29yJnRhclx0Q3RybCtYIiwgICAgICAgICAgIENNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwgICAgICAgICAgIENNRF9DT1BZCiAgTUVOVUlURU0gIiZQZWdhclx0Q3RybCtWIiwgICAgICAgICAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiJkJvcnJhclx0RGVsIiwgICAgICAgICAgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNjaW9uYXIgdCZvZG9cdEN0cmwrQSIsIENNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIiZIb3JhIHkgZmVjaGFcdEY1IiwgICAgICAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBanVzdGUgZGUgbO1uZWEiLCAgICAgICAgICBDTURfV1JBUAogIE1FTlVJVEVNICJUaXBvIGRlICZsZXRyYS4uLiIsICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZCdXNjYXIiIHsKICBNRU5VSVRFTSAiJkJ1c2Nhci4uLlx0Q3RybCtGIiwgICAgICAgQ01EX1NFQVJDSAogIE1FTlVJVEVNICJCdXNjYXIgJnNpZ3VpZW50ZVx0RjMiLCBDTURfU0VBUkNIX05FWFQKICBNRU5VSVRFTSAiJlJlZW1wbGF6YXIuLi5cdEN0cmwrSCIsIENNRF9SRVBMQUNFCiB9ClBPUFVQICJBJnl1ZGEiIHsKICBNRU5VSVRFTSAizSZuZGljZSIsICAgICAgICAgICAgICAgQ01EX0hFTFBfQ09OVEVOVFMKICBNRU5VSVRFTSAiJkJ1c2Nhci4uLiIsICAgICAgICAgICAgQ01EX0hFTFBfU0VBUkNICiAgTUVOVUlURU0gIkEmeXVkYSBzb2JyZSBsYSBheXVkYSIsIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFib3V0IE5vdGVwYWQiLCBDTURfSEVMUF9BQk9VVF9OT1RFUEFECiB9Cn0KCi8qIERpYWxvZyBgUGFnZSBzZXR1cCcgKi8KCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiQWp1c3RlIGRlIHDhZ2luYSIKewpMVEVYVCAgICAiJkNhYmVjZXJhOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImUGllOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk3hcmdlbmVzIChtbSk6IiwgIDB4MTQ0LCAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImSXpxdWllcmRhOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9MRUZUVkFMVUUsICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJBJnJyaWJhOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZEZXJlY2hhOiIsICAgICAgIDB4MTRCLCAxMDAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfUklHSFRWQUxVRSwgICAxMzAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiQWJhJmpvOiIsICAgICAgMHgxNEUsMTAwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIkFjZXB0YXIiLCAgICAgIElET0ssICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQ2FuY2VsYXIiLCAgICAgSURDQU5DRUwsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIiZBeXVkYSIsICAgICAgIElESEVMUCwgICAgICAgICAgICAgICAgMTgwLCAzOSwgNDAsIDE1LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKU1RSSU5HX1BBR0VTRVRVUF9IRUFERVJWQUxVRSwgICAiJmYiClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsICAgIlDhZ2luYSAmcCIKClNUUklOR19OT1RFUEFELCAgICAgICAgICAgICAgICAgIkJsb2MgZGUgbm90YXMiClNUUklOR19FUlJPUiwgICAgICAgICAgICAgICAgICAgIkVSUk9SIgpTVFJJTkdfV0FSTklORywgICAgICAgICAgICAgICAgICJBRFZFUlRFTkNJQSIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAiSW5mb3JtYWNp824iCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICIoc2luIHTtdHVsbykiCgpTVFJJTkdfQUxMX0ZJTEVTLCAgICAgICAgICAgICAgICJUb2RvcyBsb3MgYXJjaGl2b3MgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgIkRvY3VtZW50b3MgZGUgdGV4dG8gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwgICAgICAgICAgICAgICAgIkVsIGFyY2hpdm8gJyVzJyBlcyBkZW1hc2lhZG8gZ3JhbmRlIHBhcmEgZWwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jIGRlIG5vdGFzLlxuIFVzZSBvdHJvIGVkaXRvci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgIk5vIGVzY3JpYmnzIG5hZGEuXG5Qb3IgZmF2b3IgZXNjcmliYSBhbGdvIGUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnTpbnRlbG8gZGUgbnVldm8iClNUUklOR19ET0VTTk9URVhJU1QsICAgICAgICAgICAgIkVsIGFyY2hpdm8gJyVzJ1xubm8gZXhpc3RlXG5cbiC/RGVzZWEgY3JlYXIgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1biBudWV2byBhcmNoaXZvPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAiRWwgdGV4dG8gZW4gZWwgYXJjaGl2byAnJXMnIGhhIGNhbWJpYWRvXG5cbiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIL9EZXNlYSBndWFyZGFyIGxvcyBjYW1iaW9zPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAiTm8gc2UgZW5jb250cvMgJyVzJy4iClNUUklOR19PVVRfT0ZfTUVNT1JZLCAgICAgICAgICAgIk5vIGhheSBzdWZpY2llbnRlIG1lbW9yaWEgcGFyYSB0ZXJtaW5hciBlc3RhIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZWEuXG5DaWVycmUgdW5hIG8gbeFzIGFwbGljYWNpb25lcyBwYXJhIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVtZW50YXIgbGEgY2FudGlkYWRcbmRlIG1lbW9yaWEgbGlicmUuIgoKfQo=