LyoKICogQ29weXJpZ2h0IDIwMDMgVWxyaWNoIEN6ZWthbGxhIGZvciBDb2RlV2VhdmVycwogKiBDb3B5cmlnaHQgMjAwNiBNaWtvbGFqIFphbGV3c2tpCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJyZXNvdXJjZS5oIgoKTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVAoKVUlJTlNFUlRPQkpFQ1QgRElBTE9HIERJU0NBUkRBQkxFICAwLCAwLCAzMTAsIDE1MQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJXc3RhdyBvYmlla3QiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBJRENfT0JKVFlQRUxJU1QsODIsMTksMTMxLDY2LExCU19TT1JUIHwKICAgICAgICAgICAgICAgICAgICBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwKICAgICAgICAgICAgICAgICAgICBXU19UQUJTVE9QCiAgICBMVEVYVCAgICAgICAgICAgIlR5cCBvYmlla3R1OiIsSURDX09CSlRZUEVMQkwsODIsNyw1Myw4LFdTX1ZJU0lCTEUKICAgIERFRlBVU0hCVVRUT04gICAiT0siLElET0ssMjI5LDcsNjYsMTQKICAgIFBVU0hCVVRUT04gICAgICAiQW51bHVqIixJRENBTkNFTCwyMjksMjQsNjYsMTQKICAgIEdST1VQQk9YICAgICAgICAiV3luaWsiLElEQ19SRVNVTFQsNywxMDMsMjA4LDQxCiAgICBDT05UUk9MICAgICAgICAgIlV0d/NyeiBub3d5IixJRENfQ1JFQVRFTkVXLCJCdXR0b24iLEJTX0FVVE9SQURJT0JVVFRPTiB8IAogICAgICAgICAgICAgICAgICAgIFdTX0dST1VQLDcsMjAsNjIsMTAKICAgIENPTlRST0wgICAgICAgICAiVXR383J6IGtvbnRyb2xr6iIsSURDX0NSRUFURUNPTlRST0wsIkJ1dHRvbiIsCiAgICAgICAgICAgICAgICAgICAgQlNfQVVUT1JBRElPQlVUVE9OIHwgTk9UIFdTX1ZJU0lCTEUsNyw1NCw3MiwxMAogICAgQ09OVFJPTCAgICAgICAgICJVdHfzcnogeiBwbGlrdSIsSURDX0NSRUFURUZST01GSUxFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9SQURJT0JVVFRPTiw3LDM3LDY3LDEwCiAgICBMVEVYVCAgICAgICAgICAgIiIsSURDX1JFU1VMVERFU0MsNDksMTEyLDE1OSwyMwogICAgUFVTSEJVVFRPTiAgICAgICImRG9kYWoga29udHJvbGvqLi4uIixJRENfQUREQ09OVFJPTCw4MSw4OCw2MywxNCxOT1QgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAgICJXeZx3aWV0bGFqIGpha28gaWtvbuoiLElEQ19BU0lDT04sIkJ1dHRvbiIsQlNfQVVUT0NIRUNLQk9YIHwgCiAgICAgICAgICAgICAgICAgICAgV1NfVEFCU1RPUCB8IE5PVCBXU19WSVNJQkxFLDIyMyw1OCw4NCwxMAogICAgUFVTSEJVVFRPTiAgICAgICJQcnplZ2y5ZGFqLi4uIixJRENfQlJPV1NFLDgzLDUzLDUwLDE0LE5PVCBXU19WSVNJQkxFCiAgICBMVEVYVCAgICAgICAgICAgIlBsaWs6IixJRENfRklMRUxCTCw4MywyNywyMCw4LCBOT1QgV1NfVklTSUJMRQogICAgRURJVFRFWFQgICAgICAgIElEQ19GSUxFLDgzLDM3LDEzMiwxMyxFU19BVVRPSFNDUk9MTCB8IE5PVCBXU19WSVNJQkxFCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogIElEU19SRVNVTFRPQkpERVNDCSJXc3RhdyBub3d5IG9iaWVrdCAlcyBkbyBkb2t1bWVudHUiCiAgSURTX1JFU1VMVEZJTEVPQkpERVNDCSJXc3RhdyB6YXdhcnRvnOYgcGxpa3UgamFrbyBvYmlla3QgZG8gZG9rdW1lbnR1LiBC6mR6aWUgbW+/bmEgZ28gYWt0eXdvd2HmIHW/eXdharljIHByb2dyYW11LCBrdPNyeSBnbyBzdHdvcnp5sy4iCiAgSURTX0JST1dTRSAgICAgICAgICAgICJQcnplZ2y5ZGFqIgogIElEU19OT1RPTEVNT0QgICAgICAgICAiUGxpayBuaWUgd3lkYWplIHNp6iBieeYgcG9wcmF3bnltIG1vZHWzZW0gT0xFLiBOaWUgdWRhs28gc2nqIHphcmVqZXN0cm93YeYga29udHJvbGtpIE9MRS4iCiAgSURTX05PVE9MRU1PRENBUFRJT04gICJEb2RhaiBrb250cm9sa+oiCn0KCklERF9QQVNURVNQRUNJQUw0IERJQUxPRyBESVNDQVJEQUJMRSAzLCAxNSwgMzA5LCAxNDAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIldrbGVqIHNwZWNqYWxuaWUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExURVhUICAgICAgICAgIo9y82SzbzoiLCAtMSwgNiwgOSwgMzAsIDgsIFdTX1ZJU0lCTEUgfCBXU19HUk9VUAogICAgQ09OVFJPTCAgICAgICAiJldrbGVqIiwgSURDX1BTX1BBU1RFLCAiQnV0dG9uIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVklTSUJMRSwKICAgICAgICAgICAgICAgICAgNiwgMzgsIDU1LCAxMAogICAgQ09OVFJPTCAgICAgICAiV2tsZWogJrO5Y3plIiwgSURDX1BTX1BBU1RFTElOSywgIkJ1dHRvbiIsIEJTX0FVVE9SQURJT0JVVFRPTiB8IFdTX1ZJU0lCTEUsCiAgICAgICAgICAgICAgICAgIDYsIDYzLCA1NSwgMTAKICAgIExURVhUICAgICAgICAgIiZKYWtvOiIsIC0xLCA2NSwgMjUsIDE2LCA4LCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgIExJU1RCT1ggICAgICAgSURDX1BTX1BBU1RFTElTVCwgICAgIDY1LCAzNiwgMTUzLCA1NywgTEJTX05PVElGWSB8IExCU19VU0VUQUJTVE9QUyB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIgfCBOT1QgV1NfVklTSUJMRQogICAgTElTVEJPWCAgICAgICBJRENfUFNfUEFTVEVMSU5LTElTVCwgNjUsIDM2LCAxNTMsIDU3LCBMQlNfTk9USUZZIHwgTEJTX1VTRVRBQlNUT1BTIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IE5PVCBXU19WSVNJQkxFCiAgICBMSVNUQk9YICAgICAgIElEQ19QU19ESVNQTEFZTElTVCwgICA2NSwgMzYsIDE1MywgNTcsIExCU19OT1RJRlkgfCBMQlNfVVNFVEFCU1RPUFMgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVklTSUJMRQogICAgQ09OVFJPTCAgICAgICAiT0siLCBJRE9LLCAiQnV0dG9uIiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDIzMiwgNiwgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICJBbnVsdWoiLCBJRENBTkNFTCwgIkJ1dHRvbiIsIEJTX1BVU0hCVVRUT04gfCBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSwgMjMyLCAyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICImUG9tb2MiLCBJRENfT0xFVUlIRUxQLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMzIsIDQyLCA2NiwgMTQKICAgIENPTlRST0wgICAgICAgIlcmeZx3aWV0bGFqIGpha28gaWtvbuoiLCBJRENfUFNfRElTUExBWUFTSUNPTiwgIkJ1dHRvbiIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMjQsIDU5LCA4NCwgMTQKICAgIENPTlRST0wgICAgICAgIiIsIElEQ19QU19JQ09ORElTUExBWSwgIlN0YXRpYyIsIFNTX0lDT04gfCBXU19WSVNJQkxFLCAyMzIsIDc1LCA2NiwgNDQKICAgIENPTlRST0wgICAgICAgIlptaWXxICZpa29u6i4uLiIsIElEQ19QU19DSEFOR0VJQ09OLCAiQnV0dG9uIiwgQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1AgfCBXU19WSVNJQkxFLCAyMzIsIDEyMywgNjYsIDE0CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfUkVTVUxUSU1BR0UsICJTdGF0aWMiLCBTU19JQ09OIHwgV1NfVklTSUJMRSwgOCwgMTAxLCA0MiwgMzQKICAgIENPTlRST0wgICAgICAgIjw8IHJlc3VsdCB0ZXh0IGdvZXMgaGVyZSA+PiIsIElEQ19QU19SRVNVTFRURVhULCAiU3RhdGljIiwgU1NfTk9QUkVGSVggfCBXU19WSVNJQkxFLCA1NCwgMTAwLCAxNTksIDM1CiAgICBDT05UUk9MICAgICAgICJXeW5payIsIC0xLCAiQnV0dG9uIiwgQlNfR1JPVVBCT1ggfCBXU19HUk9VUCB8IFdTX1ZJU0lCTEUsIDYsIDkwLCAyMTIsIDQ4CiAgICBDT05UUk9MICAgICAgICIiLCBJRENfUFNfU09VUkNFVEVYVCwgIkVkaXQiLCBFU19SRUFET05MWSB8IEVTX0FVVE9IU0NST0xMIHwgV1NfVklTSUJMRSwgMzcsIDksIDE4MCwgOApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19QU19QQVNURV9EQVRBICAgICAgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1IGpha28gJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVCAgICAgICAgICAgICAgICAgICAiV3N0YXdpYSB6YXdhcnRvnOYgc2Nob3drYSBkbyBkb2t1bWVudHUsIHRhayBhYnkgbfNnsyBieeYgYWt0eXdvd2FueSB6YSBwb21vY7kgJXMuIgogICAgSURTX1BTX1BBU1RFX09CSkVDVF9BU19JQ09OICAgICAgICAgICAiV3N0YXdpYSB6YXdhcnRvnOYgc2Nob3drYSBkbyBkb2t1bWVudHUsIHRhayBhYnkgbfNnsyBieeYgYWt0eXdvd2FueSB6YSBwb21vY7kgJXMuIELqZHppZSB3eZx3aWV0bGFueSBqYWtvIGlrb25hLiIKICAgIElEU19QU19QQVNURV9MSU5LX0RBVEEgICAgICAgICAgICAgICAgIldzdGF3aWEgemF3YXJ0b5zmIHNjaG93a2EgZG8gZG9rdW1lbnR1IGpha28gJXMuIERhbmUgYupkuSBwb7O5Y3pvbmUgeiBwbGlraWVtIJ9y82Szb3d5bSwgZHpp6mtpIGN6ZW11IHptaWFueSB3IHBsaWt1IGLqZLkgb2R6d2llcmNpZWRsb25lIHcgZG9rdW1lbmNpZS4iCiAgICBJRFNfUFNfUEFTVEVfTElOS19PQkpFQ1QgICAgICAgICAgICAgICJXc3Rhd2lhIHphd2FydG+c5iBzY2hvd2thIGRvIGRva3VtZW50dSBqYWtvIG9icmF6LiBPYnJheiBi6mR6aWUgcG+zuWN6b255IHogcGxpa2llbSCfcvNks293eW0sIGR6aepraSBjemVtdSB6bWlhbnkgdyBwbGlrdSBi6mS5IG9kendpZXJjaWVkbG9uZSB3IGRva3VtZW5jaWUuIgogICAgSURTX1BTX1BBU1RFX0xJTktfT0JKRUNUX0FTX0lDT04gICAgICAiV3N0YXdpYSBkbyBkb2N1bWVudHUgc2ty83QgZG8gemF3YXJ0b5xjaSBzY2hvd2thLiBTa3LzdCBi6mR6aWUgcG+zuWN6b255IHogcGxpa2llbSCfcvNks293eW0sIGR6aepraSBjemVtdSB6bWlhbnkgdyBwbGlrdSBi6mS5IG9kendpZXJjaWVkbG9uZSB3IGRva3VtZW5jaWUuIgogICAgSURTX1BTX05PTl9PTEUgICAgICAgICAgICAgICAgICAgICAgICAiV3N0YXdpYSB6YXdhcnRvnOYgc2Nob3drYSBkbyBkb2t1bWVudHUiCiAgICBJRFNfUFNfVU5LTk9XTl9UWVBFICAgICAgICAgICAgICAgICAgICJOaWV6bmFueSB0eXAiCiAgICBJRFNfUFNfVU5LTk9XTl9TUkMgICAgICAgICAgICAgICAgICAgICJOaWV6bmFuZSCfcvNks28iCiAgICBJRFNfUFNfVU5LTk9XTl9BUFAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtLCBrdPNyeSBnbyBzdHdvcnp5syIKfQo=