LyoKICogQ29weXJpZ2h0IDIwMDUgTWlsa28gS3JhY2hvdW5vdgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0JVTEdBUklBTiwgU1VCTEFOR19ERUZBVUxUCgpNRU5VXzAwMSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglNRU5VSVRFTSAiJsPu6+Xs6CDo6u7t6CIsCUZDSURNX1NIVklFV19CSUdJQ09OCglNRU5VSVRFTSAiJszg6+roIOjq7u3oIiwJRkNJRE1fU0hWSUVXX1NNQUxMSUNPTgoJTUVOVUlURU0gIibR7+jx+uoiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCglNRU5VSVRFTSAiJs/u5PDu4e3u8fLoIiwJRkNJRE1fU0hWSUVXX1JFUE9SVFZJRVcKRU5ECgovKgogc2hlbGx2aWV3IGJhY2tncm91bmQgbWVudQoqLwpNRU5VXzAwMiBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgUE9QVVAgIibI5+Pr5eQiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIibD7uvl7Ogg6Oru7egiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICImzODr6ugg6Oru7egiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCgkgICAgTUVOVUlURU0gIibR7+jx+uoiLAkJRkNJRE1fU0hWSUVXX0xJU1RWSUVXCgkgICAgTUVOVUlURU0gIibP7uTw7uHt7vHy6CIsCUZDSURNX1NIVklFV19SRVBPUlRWSUVXCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgUE9QVVAgIs/u5PDl5OggJujq7u3o8uUiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIs/uICbo7OUiLAkJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICLP7iAm8ujvIiwJCTB4MzIJLyogY29sdW1uIDIgKi8KCSAgICBNRU5VSVRFTSAiz+4gJvDg5+zl8CIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIs/uICbk4PLgIiwJMHgzMwoJICAgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICAgIE1FTlVJVEVNICImwOLy7uzg8uj37e4g7+7k8OXm5ODt5SIsCUZDSURNX1NIVklFV19BVVRPQVJSQU5HRQoJICBFTkQKCSAgTUVOVUlURU0gIs/u5PDg4u3oIOjq7u3o8uUiLAkJRkNJRE1fU0hWSUVXX1NOQVBUT0dSSUQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICLO7/Dl8e3oIiwJCQlGQ0lETV9TSFZJRVdfUkVGUkVTSAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIsLs+urt6CIsCQkJRkNJRE1fU0hWSUVXX0lOU0VSVAoJICBNRU5VSVRFTSAiwuz66u3oIOrg8u4g4vD65+rgIiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICLR+ufk4OkiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIs3u4uAgJu/g7+rgIiwJCUZDSURNX1NIVklFV19ORVdGT0xERVIKCSAgICBNRU5VSVRFTSAize7i4CAm4vD65+rgIiwJCUZDSURNX1NIVklFV19ORVdMSU5LCgkgICAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIEVORAoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gItHi7unx8uLgIiwJCQlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKLyoKIHNoZWxsdmlldyBpdGVtIG1lbnUKKi8KTUVOVV9TSFZfRklMRSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglQT1BVUCAiIgoJQkVHSU4KCSAgTUVOVUlURU0gIiZTZWxlY3QiCQlGQ0lETV9TSFZJRVdfT1BFTgoJICBNRU5VSVRFTSAiJtDg5+Pr5eTg6SIsCUZDSURNX1NIVklFV19FWFBMT1JFCgkgIE1FTlVJVEVNICImzvLi7vDoIiwJCUZDSURNX1NIVklFV19PUEVOCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiJsjn8OXm6CIsCQlGQ0lETV9TSFZJRVdfQ1VUCgkgIE1FTlVJVEVNICImyu7v6PDg6SIsCQlGQ0lETV9TSFZJRVdfQ09QWQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gItH65+Tg6SAm4vD65+rgIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIsjnJvLw6OkiLAkJRkNJRE1fU0hWSUVXX0RFTEVURQoJICBNRU5VSVRFTSAiJs/w5ejs5e3z4uDpIiwJRkNJRE1fU0hWSUVXX1JFTkFNRQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIibR4u7p8fLi4CIsCQlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKU0hCUlNGT1JGT0xERVJfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMTg4LCAxOTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBEU18zRExPT0sKQ0FQVElPTiAiyOfh7vAg7eAg7+Dv6uAiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogREVGUFVTSEJVVFRPTiAiT0siLCAxLCA4MCwgMTc2LCA1MCwgMTIsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKIFBVU0hCVVRUT04gIs7y7OXt6CIsIDIsIDEzNCwgMTc2LCA1MCwgMTIsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogTFRFWFQgIiIsIElERF9USVRMRSwgNCwgNCwgMTgwLCAxMgogTFRFWFQgIiIsIElERF9TVEFUVVMsIDQsIDI1LCAxODAsIDEyCiBDT05UUk9MICIiLCBJRERfVFJFRVZJRVcsICJTeXNUcmVlVmlldzMyIiwKIAlUVlNfSEFTQlVUVE9OUyB8IFRWU19IQVNMSU5FUyB8IFRWU19MSU5FU0FUUk9PVCB8CglXU19CT1JERVIgfCBXU19UQUJTVE9QLAoJNCwgNDAsIDE4MCwgMTIwCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLO8u3u8e3uICVzIgpGT05UIDEwLCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDE1MywgMTMzLCA1MCwgMTIsIFdTX1RBQlNUT1AKIExJU1RCT1ggOTksIDgsIDY1LCAxMzcsIDgyLCBMQlNfTk9USUZZIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgogSUNPTiAiIiwgMTA4OCwgMTAsIDEwLCAxNCwgMTYKIExURVhUICIiLCAxMDAsIDMwLCAxMCwgMTM3LCAxMAogTFRFWFQgIiIsIDEwMSwgMzAsIDIyLCAxMzcsIDEwCiBMVEVYVCAiV2luZSDh5fjlIPH65+Tg5OXtIOfgIOLg8SDu8joiLCA5OCwgOCwgNTUsIDEzNywgMTAKfQoKU0hFTExfUlVOX0RMRyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAwLCAwLCAyMjcsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogSUNPTiAiIiwgMTIyOTcsIDcsIDExLCAxOCwgMjAsIFdTX1ZJU0lCTEUKIExURVhUICLC+uLl5OXy5SDo7OUg7eAg7/Du4/Dg7OAsIO/g7+rgLCDk7urz7OXt8iDo6+ggyO3y5fDt5fIg8OXx8/DxIOggV2luZSD55SDj7iDu8uLu8Ogg5+Ag4uDxLiIsIDEyMjg5LCAzNiwgMTEsIDE4MiwgMTgKIExURVhUICImT3BlbjoiLCAxMjMwNSwgNywgMzksIDI0LCAxMAogQ09OVFJPTCAiIiwgMTIyOTgsICJDT01CT0JPWCIsIFdTX1RBQlNUT1AgfCBXU19HUk9VUCB8IFdTX1ZTQ1JPTEwgfCBXU19WSVNJQkxFIHwgQ0JTX0RJU0FCTEVOT1NDUk9MTCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19EUk9QRE9XTiwgMzYsIDM3LCAxODMsIDEwMAogREVGUFVTSEJVVFRPTiAiT0siLCBJRE9LLCA2MiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAizvLs5e3oIiwgSURDQU5DRUwsIDExNiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiJsjn4eXw6C4uLiIsIDEyMjg4LCAxNzAsIDYzLCA1MCwgMTQsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgICAgIC8qIGNvbHVtbnMgaW4gdGhlIHNoZWxsdmlldyAqLwoJSURTX1NIVl9DT0xVTU4xCQki1ODp6yIKCUlEU19TSFZfQ09MVU1OMgkJItDg5+zl8CIKCUlEU19TSFZfQ09MVU1OMwkJItLo7yIKCUlEU19TSFZfQ09MVU1ONAkJIs/w7uzl7eXtIgoJSURTX1NIVl9DT0xVTU41CQkiwPLw6OHz8ugiCglJRFNfU0hWX0NPTFVNTjYJCSLQ4Ofs5fAiCglJRFNfU0hWX0NPTFVNTjcJCSLO8fLg4uD5IPDg5+zl8CIgLyogU2l6ZSBhdmFpbGFibGUsIMri7u7u7u7u7u7u7u7u7iE/ICovCglJRFNfU0hWX0NPTFVNTjgJCSLI7OUiCglJRFNfU0hWX0NPTFVNTjkJCSLK7uzl7fLg8CIKCUlEU19TSFZfQ09MVU1OMTAJItHu4fHy4uXt6OoiCglJRFNfU0hWX0NPTFVNTjExCSLD8PPv4CIKCiAgICAgICAgLyogc3BlY2lhbCBmb2xkZXJzICovCglJRFNfREVTS1RPUAkJItDg4e7y5e0g7+vu8iIKCUlEU19NWUNPTVBVVEVSCQkizO7/8iDq7uzv/vL68CIKCiAgICAgICAgLyogY29udGV4dCBtZW51cyAqLwoJSURTX1ZJRVdfTEFSR0UJCSImw+7r5ezoIOjq7u3oIgoJSURTX1ZJRVdfU01BTEwJCSImzODr6ugg6Oru7egiCglJRFNfVklFV19MSVNUCQkiJtHv6PH66iIKCUlEU19WSUVXX0RFVEFJTFMJIibP7uTw7uHt7vHy6CIKCUlEU19TRUxFQ1QJCSLI5+Hl8OgiCglJRFNfT1BFTgkJIs7y4u7w6CIKCglJRFNfQ1JFQVRFRk9MREVSX0RFTklFRCAiz+Dv6uDy4CDt5SDs7ublIOTgIOH65OUg8frn5ODk5e3gOiDE7vHy+u/68iDu8urg5+DtLiIKCUlEU19DUkVBVEVGT0xERVJfQ0FQVElPTiAiw/Dl+OrgIO/w6CDx+ufk4OLg7eXy7iDt4CDt7uLgIO/g7+rgLiIKCUlEU19ERUxFVEVJVEVNX0NBUFRJT04gIs/u8uL68OTl8uUg6Ofy8Oji4O3l8u4g7eAg9ODp6+AiCglJRFNfREVMRVRFRk9MREVSX0NBUFRJT04gIs/u8uL68OTl8uUg6Ofy8Oji4O3l8u4g7eAg7+Dv6uDy4CIKCUlEU19ERUxFVEVJVEVNX1RFWFQgIs3g6PHy6O3gIOvoIOjx6uDy5SDk4CDo5/Lw6OXy5SAnJTEnPyIKCUlEU19ERUxFVEVNVUxUSVBMRV9URVhUICLN4Ojx8ujt4CDr6CDo8erg8uUg5OAg6Ofy8Ojl8uUg8uXn6CAlMSDl6+Xs5e3y4D8iCglJRFNfREVMRVRFU0VMRUNURURfVEVYVCAizeDo8fLo7eAg6+gg6PHq4PLlIOTgIOjn8vDo5fLlIOjn4fDg7ejy5SDl6+Xs5e3y6D8iCglJRFNfT1ZFUldSSVRFRklMRV9URVhUICJUaGlzIGZvbGRlciBhbHJlYWR5IGNvbnRhaW5zIGEgZmlsZSBjYWxsZWQgJyUxJy5cblxuRG8geW91IHdhbnQgdG8gcmVwbGFjZSBpdD8iCglJRFNfT1ZFUldSSVRFRklMRV9DQVBUSU9OICLP7vLi+vDk5fLlIO/w5efg7+jx4CDt4CD04Onr4CIKCUlEU19PVkVSV1JJVEVGT0xERVJfVEVYVCAiVGhpcyBmb2xkZXIgYWxyZWFkeSBjb250YWlucyBhIGZvbGRlciBuYW1lZCAnJTEnLlxuXG4iXAoJICAgICJJZiB0aGUgZmlsZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIGZpbGVzIGluIHRoZVxuIlwKCSAgICAic2VsZWN0ZWQgZm9sZGVyIHRoZXkgd2lsbCBiZSByZXBsYWNlZC4gRG8geW91IHN0aWxsIHdhbnQgdG8gbW92ZSBvciBjb3B5XG4iXAoJICAgICJ0aGUgZm9sZGVyPyIKCiAgICAgICAgLyogbWVzc2FnZSBib3ggc3RyaW5ncyAqLwogICAgICAgIElEU19SRVNUQVJUX1RJVExFICAgICAgICLQ5fHy4PDy6PDg7eUiCiAgICAgICAgSURTX1JFU1RBUlRfUFJPTVBUICAgICAgIsjx6uDy5SDr6CDk4CDx6Ozz6+jw4PLlIPDl8fLg8PLo8ODt5SDt4CBXaW5kb3dzPyIKICAgICAgICBJRFNfU0hVVERPV05fVElUTEUgICAgICAiyOfq6/734uDt5SIKICAgICAgICBJRFNfU0hVVERPV05fUFJPTVBUICAgICAiyPHq4PLlIOvoIOTgIO/w5erw4PLo8uUg4uD44PLgIFdpbmUg8eXx6P8/IgoKICAgICAgICAvKiBzaGVsbCBmb2xkZXIgcGF0aCBkZWZhdWx0IHZhbHVlcyAqLwogICAgICAgIC8qINLl5+gg7O7m5SDh6CDlIOTu4fDgIOjk5f8g5OAg7vHy4O3g8iDt5e/w5eLl5OXt6CA/ICovCglJRFNfUFJPR1JBTVMgICAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1zIgoJSURTX1BFUlNPTkFMICAgICAgICAgICAgICAgICJNeSBEb2N1bWVudHMiCglJRFNfRkFWT1JJVEVTICAgICAgICAgICAgICAgIkZhdm9yaXRlcyIKCUlEU19TVEFSVFVQICAgICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbXNcXFN0YXJ0VXAiCglJRFNfUkVDRU5UICAgICAgICAgICAgICAgICAgIlJlY2VudCIKCUlEU19TRU5EVE8gICAgICAgICAgICAgICAgICAiU2VuZFRvIgoJSURTX1NUQVJUTUVOVSAgICAgICAgICAgICAgICJTdGFydCBNZW51IgoJSURTX01ZTVVTSUMgICAgICAgICAgICAgICAgICJNeSBNdXNpYyIKCUlEU19NWVZJREVPICAgICAgICAgICAgICAgICAiTXkgVmlkZW8iCglJRFNfREVTS1RPUERJUkVDVE9SWSAgICAgICAgIkRlc2t0b3AiCglJRFNfTkVUSE9PRCAgICAgICAgICAgICAgICAgIk5ldEhvb2QiCglJRFNfVEVNUExBVEVTICAgICAgICAgICAgICAgIlRlbXBsYXRlcyIKCUlEU19BUFBEQVRBICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gRGF0YSIKCUlEU19QUklOVEhPT0QgICAgICAgICAgICAgICAiUHJpbnRIb29kIgoJSURTX0xPQ0FMX0FQUERBVEEgICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcQXBwbGljYXRpb24gRGF0YSIKCUlEU19JTlRFUk5FVF9DQUNIRSAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXFRlbXBvcmFyeSBJbnRlcm5ldCBGaWxlcyIKCUlEU19DT09LSUVTICAgICAgICAgICAgICAgICAiQ29va2llcyIKCUlEU19ISVNUT1JZICAgICAgICAgICAgICAgICAiTG9jYWwgU2V0dGluZ3NcXEhpc3RvcnkiCglJRFNfUFJPR1JBTV9GSUxFUyAgICAgICAgICAgIlByb2dyYW0gRmlsZXMiCglJRFNfTVlQSUNUVVJFUyAgICAgICAgICAgICAgIk15IFBpY3R1cmVzIgoJSURTX1BST0dSQU1fRklMRVNfQ09NTU9OICAgICJQcm9ncmFtIEZpbGVzXFxDb21tb24gRmlsZXMiCglJRFNfQ09NTU9OX0RPQ1VNRU5UUyAgICAgICAgIkRvY3VtZW50cyIKCUlEU19BRE1JTlRPT0xTICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbXNcXEFkbWluaXN0cmF0aXZlIFRvb2xzIgoJSURTX0NPTU1PTl9NVVNJQyAgICAgICAgICAgICJEb2N1bWVudHNcXE15IE11c2ljIgoJSURTX0NPTU1PTl9QSUNUVVJFUyAgICAgICAgICJEb2N1bWVudHNcXE15IFBpY3R1cmVzIgoJSURTX0NPTU1PTl9WSURFTyAgICAgICAgICAgICJEb2N1bWVudHNcXE15IFZpZGVvIgoJSURTX0NEQlVSTl9BUkVBICAgICAgICAgICAgICJMb2NhbCBTZXR0aW5nc1xcQXBwbGljYXRpb24gRGF0YVxcTWljcm9zb2Z0XFxDRCBCdXJuaW5nIgoKCUlEU19ORVdGT0xERVIJCSJOZXcgRm9sZGVyIgp9Cg==