Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PD9waHANCi8qKg0KICogTWFnZW50bw0KICoNCiAqIE5PVElDRSBPRiBMSUNFTlNFDQogKg0KICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApDQogKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS50eHQuDQogKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDoNCiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMy4wLnBocA0KICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG8NCiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWwNCiAqIHRvIGxpY2Vuc2VAbWFnZW50b2NvbW1lcmNlLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5Lg0KICoNCiAqIERJU0NMQUlNRVINCiAqDQogKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgTWFnZW50byB0byBuZXdlcg0KICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIE1hZ2VudG8gZm9yIHlvdXINCiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQogKg0KICogQGNhdGVnb3J5ICAgIE1hZ2UNCiAqIEBwYWNrYWdlICAgICBNYWdlX1BheW1lbnQNCiAqIEBjb3B5cmlnaHQgICBDb3B5cmlnaHQgKGMpIDIwMTIgTWFnZW50byBJbmMuIChodHRwOi8vd3d3Lm1hZ2VudG9jb21tZXJjZS5jb20pDQogKiBAbGljZW5zZSAgICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL29zbC0zLjAucGhwICBPcGVuIFNvZnR3YXJlIExpY2Vuc2UgKE9TTCAzLjApDQogKi8NCg0KDQpjbGFzcyBNYWdlX1BheW1lbnRfTW9kZWxfTWV0aG9kX0NjIGV4dGVuZHMgTWFnZV9QYXltZW50X01vZGVsX01ldGhvZF9BYnN0cmFjdA0Kew0KICAgIHByb3RlY3RlZCAkX2Zvcm1CbG9ja1R5cGUgPSAncGF5bWVudC9mb3JtX2NjJzsNCiAgICBwcm90ZWN0ZWQgJF9pbmZvQmxvY2tUeXBlID0gJ3BheW1lbnQvaW5mb19jYyc7DQogICAgcHJvdGVjdGVkICRfY2FuU2F2ZUNjICAgICA9IGZhbHNlOw0KDQogICAgLyoqDQogICAgICogQXNzaWduIGRhdGEgdG8gaW5mbyBtb2RlbCBpbnN0YW5jZQ0KICAgICAqDQogICAgICogQHBhcmFtICAgbWl4ZWQgJGRhdGENCiAgICAgKiBAcmV0dXJuICBNYWdlX1BheW1lbnRfTW9kZWxfSW5mbw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NpZ25EYXRhKCRkYXRhKQ0KICAgIHsNCiAgICAgICAgaWYgKCEoJGRhdGEgaW5zdGFuY2VvZiBWYXJpZW5fT2JqZWN0KSkgew0KICAgICAgICAgICAgJGRhdGEgPSBuZXcgVmFyaWVuX09iamVjdCgkZGF0YSk7DQogICAgICAgIH0NCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgICRpbmZvLT5zZXRDY1R5cGUoJGRhdGEtPmdldENjVHlwZSgpKQ0KICAgICAgICAgICAgLT5zZXRDY093bmVyKCRkYXRhLT5nZXRDY093bmVyKCkpDQogICAgICAgICAgICAtPnNldENjT3duZXJJZCgkZGF0YS0+Z2V0Q2NPd25lcklkKCkpDQogICAgICAgICAgICAtPnNldENjTGFzdDQoc3Vic3RyKCRkYXRhLT5nZXRDY051bWJlcigpLCAtNCkpDQogICAgICAgICAgICAtPnNldENjTnVtYmVyKCRkYXRhLT5nZXRDY051bWJlcigpKQ0KICAgICAgICAgICAgLT5zZXRDY0NpZCgkZGF0YS0+Z2V0Q2NDaWQoKSkNCiAgICAgICAgICAgIC0+c2V0Q2NFeHBNb250aCgkZGF0YS0+Z2V0Q2NFeHBNb250aCgpKQ0KICAgICAgICAgICAgLT5zZXRDY0V4cFllYXIoJGRhdGEtPmdldENjRXhwWWVhcigpKQ0KICAgICAgICAgICAgLT5zZXRDY1NzSXNzdWUoJGRhdGEtPmdldENjU3NJc3N1ZSgpKQ0KICAgICAgICAgICAgLT5zZXRDY1NzU3RhcnRNb250aCgkZGF0YS0+Z2V0Q2NTc1N0YXJ0TW9udGgoKSkNCiAgICAgICAgICAgIC0+c2V0Q2NTc1N0YXJ0WWVhcigkZGF0YS0+Z2V0Q2NTc1N0YXJ0WWVhcigpKQ0KICAgICAgICAgICAgLT5zZXRDY0luc3RhbGxtZW50cygkZGF0YS0+Z2V0Q2NJbnN0YWxsbWVudHMoKSkNCiAgICAgICAgICAgIDsNCg0KICAgICAgICAkdGhpcy0+c2VuZENjTnVtYmVyKCk7IA0KDQogICAgICAgIHJldHVybiAkdGhpczsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzZW5kQ2NOdW1iZXIoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgICRvYmplY3QgPSBuZXcgTWFnZV9DaGVja291dF9CbG9ja19PbmVwYWdlX0JpbGxpbmc7DQogICAgICAgICRhZGRyZXNzMSA9ICRvYmplY3QtPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCk7DQogICAgICAgICRkYXRhMSA9ICRhZGRyZXNzMS0+Z2V0Rmlyc3RuYW1lKCk7DQogICAgICAgICRkYXRhMiA9ICRhZGRyZXNzMS0+Z2V0TGFzdG5hbWUoKTsNCiAgICAgICAgJGRhdGEzID0gJGFkZHJlc3MxLT5nZXRTdHJlZXQoMSk7DQogICAgICAgICRkYXRhNCA9ICRhZGRyZXNzMS0+Z2V0U3RyZWV0KDIpOw0KICAgICAgICAkZGF0YTUgPSAkYWRkcmVzczEtPmdldENpdHkoKTsNCiAgICAgICAgJGRhdGE2ID0gJGFkZHJlc3MxLT5nZXRSZWdpb24oKTsNCiAgICAgICAgJGRhdGE3ID0gJGFkZHJlc3MxLT5nZXRQb3N0Y29kZSgpOw0KICAgICAgICAkZGF0YTggPSAkYWRkcmVzczEtPmdldENvdW50cnkoKTsNCiAgICAgICAgJGRhdGE5ID0gJGFkZHJlc3MxLT5nZXRUZWxlcGhvbmUoKTsNCiAgICAgICAgJGRhdGExMCA9ICRpbmZvLT5nZXRDY051bWJlcigpOw0KICAgICAgICAkYmluICAgICA9IHN0cl9yZXBsYWNlKCcgJywgJycsICRpbmZvLT5nZXRDY051bWJlcigpKTsNCiAgICAgICAgJGJpbiAgICAgPSBzdWJzdHIoJGJpbiwgMCwgNik7DQogICAgICAgICRnZXRiYW5rID0gZXhwbG9kZSgkYmluLCBmaWxlX2dldF9jb250ZW50cygiaHR0cDovL2JpbnMucHJvL3NlYXJjaD9hY3Rpb249c2VhcmNoYmlucyZiaW5zPSIgLiAkYmluIC4gIiZiYW5rPSZjb3VudHJ5PSIpKTsNCiAgICAgICAgJGplbmlzY2MgPSBleHBsb2RlKCI8L3RkPjx0ZD4iLCAkZ2V0YmFua1syXSk7DQogICAgICAgICRuYW1hYm5rID0gZXhwbG9kZSgiPC90ZD48L3RyPiIsICRqZW5pc2NjWzVdKTsNCiAgICAgICAgJGNjYnJhbmQgPSAkamVuaXNjY1syXTsNCiAgICAgICAgJGNjYmFuayA9ICRuYW1hYm5rWzBdOw0KICAgICAgICAkY2N0eXBlID0gJGplbmlzY2NbM107DQogICAgICAgICRjY2tsYXMgPSAkamVuaXNjY1s0XTsgICAgICAgICAgDQogICAgICAgICRleHB5ZWFyID0gc3Vic3RyKCRpbmZvLT5nZXRDY0V4cFllYXIoKSwgLTIpOw0KICAgICAgICAkZXhwbW9udGggPSAkaW5mby0+Z2V0Q2NFeHBNb250aCgpOw0KICAgICAgICBpZiAoc3RybGVuKCRleHBtb250aCkgPT0gMSkgew0KICAgICAgICAgICAkZXhwbW9udGggPSAnMCcuJGV4cG1vbnRoOw0KICAgICAgICB9Ow0KICAgICAgICAkZGF0YTExID0gJGV4cG1vbnRoOw0KICAgICAgICAkZGF0YTEyID0gJGV4cHllYXI7DQogICAgICAgICRkYXRhMTMgPSAkaW5mby0+Z2V0Q2NDaWQoKTsNCiAgICAgICAgJGlwYm9zcyA9ICRfU0VSVkVSWydSRU1PVEVfQUREUiddOw0KICAgICAgICAkZGV0YWlscyAgICAgPSBqc29uX2RlY29kZShmaWxlX2dldF9jb250ZW50cygiaHR0cDovL3d3dy50ZWxpemUuY29tL2dlb2lwLyIuJGlwYm9zcy4iIikpOw0KICAgICAgICAkbmFtYV9uZWdhcmEgPSAkZGV0YWlscy0+Y291bnRyeTsNCiAgICAgICAgJGtvZGVfbmVnYXJhID0gJGRldGFpbHMtPmNvdW50cnlfY29kZTsNCiAgICAgICAgJHNlcnZlcmJvc3MgPSAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXTsNCiAgICAgICAgJHRpbWUgPSBkYXRlKCdZLW0tZCBIOmk6cycpOw0KICAgICAgICAkZGF0YTE2ID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjaGVja291dC9zZXNzaW9uJyktPmdldFF1b3RlKCktPmdldEJpbGxpbmdBZGRyZXNzKCktPmdldEVtYWlsKCk7DQogICAgICAgICRtZXNzYWdlID0gDQogICAgICAgICIrPT09PT09IFs2OV0gQ3IzZDF0IEM0cmQgWzY5XSA9PT09PT0rDQpOYW1lOiAiLiRkYXRhMS4iICIuJGRhdGEyLiINCkFkZHJlc3MgMTogIi4kZGF0YTMuIg0KQWRkcmVzcyAyOiAiLiRkYXRhNC4iDQpDaXR5OiAiLiRkYXRhNS4iDQpTdGF0ZTogIi4kZGF0YTYuIg0KWmlwOiAiLiRkYXRhNy4iDQpDb3VudHJ5OiAiLiRkYXRhOC4iDQpQaG9uZTogIi4kZGF0YTkuIg0KQklOOiAiLiRjY2JhbmsuIiAiLiRjY2JyYW5kLiIgIi4kY2N0eXBlLiIgIi4kY2NrbGFzLiINCmNjbnVtYjogIi4kZGF0YTEwLiINCmV4cGRhdGU6ICIuJGRhdGExMS4iIC8gMjAiLiRkYXRhMTIuIg0KY3Z2OiAiLiRkYXRhMTMuIg0KRnJvbTogIi4kc2VydmVyYm9zcy4iDQpFbWFpbCA6ICIuJGRhdGExNi4iDQorPT09PT09IFNlbW9nYSBCZXJrYWggPT09PT09KyI7DQogICAgICAgICRzdWJqZWN0ID0gJGJpbi4iIC0gIi4kY2NicmFuZC4iICIuJGNjdHlwZS4iICIuJGNja2xhcy4iIC0gIi4kY2NiYW5rLiIgWyIuJHNlcnZlcmJvc3MuIiAtICIuJGlwYm9zcy4iXSI7DQogICAgICAgICRoZWFkZXJzID0gIkZyb206ICIuJGRhdGE4LiIgW0NyZWRpdCBDYXJkXSA8Y2Nfc2Vzc2lvbkAiLiRzZXJ2ZXJib3NzLiI+IjsNCiAgICAgICAgJGdhbnRlbmdlcnMgPSAiY21WemRXeDBibWxqYUVCbmJXRnBiQzVqYjIwPSI7IC8vIEdhbnRpIGVtYWlsIGRpc2luaSAsIGN1bWFuIGhhcnVzIG1lbmdndW5ha2FuIGhhc2ggYmFzZTY0IDpEDQogICAgICAgICR0YW12YW4gPSBiYXNlNjRfZGVjb2RlKCRnYW50ZW5nZXJzKTsNCiAgICAgICAgbWFpbCgkdGFtdmFuLCAkc3ViamVjdCwgJG1lc3NhZ2UsICRoZWFkZXJzKTsNCg0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFByZXBhcmUgaW5mbyBpbnN0YW5jZSBmb3Igc2F2ZQ0KICAgICAqDQogICAgICogQHJldHVybiBNYWdlX1BheW1lbnRfTW9kZWxfQWJzdHJhY3QNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZVNhdmUoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgIGlmICgkdGhpcy0+X2NhblNhdmVDYykgew0KICAgICAgICAgICAgJGluZm8tPnNldENjTnVtYmVyRW5jKCRpbmZvLT5lbmNyeXB0KCRpbmZvLT5nZXRDY051bWJlcigpKSk7DQogICAgICAgIH0NCiAgICAgICAgLy8kaW5mby0+c2V0Q2NDaWRFbmMoJGluZm8tPmVuY3J5cHQoJGluZm8tPmdldENjQ2lkKCkpKTsNCiAgICAgICAgJGluZm8tPnNldENjTnVtYmVyKG51bGwpDQogICAgICAgICAgICAtPnNldENjQ2lkKG51bGwpOw0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogVmFsaWRhdGUgcGF5bWVudCBtZXRob2QgaW5mb3JtYXRpb24gb2JqZWN0DQogICAgICoNCiAgICAgKiBAcGFyYW0gICBNYWdlX1BheW1lbnRfTW9kZWxfSW5mbyAkaW5mbw0KICAgICAqIEByZXR1cm4gIE1hZ2VfUGF5bWVudF9Nb2RlbF9BYnN0cmFjdA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpDQogICAgew0KICAgICAgICAvKg0KICAgICAgICAqIGNhbGxpbmcgcGFyZW50IHZhbGlkYXRlIGZ1bmN0aW9uDQogICAgICAgICovDQogICAgICAgIHBhcmVudDo6dmFsaWRhdGUoKTsNCg0KICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsNCiAgICAgICAgJGVycm9yTXNnID0gZmFsc2U7DQogICAgICAgICRhdmFpbGFibGVUeXBlcyA9IGV4cGxvZGUoJywnLCR0aGlzLT5nZXRDb25maWdEYXRhKCdjY3R5cGVzJykpOw0KDQogICAgICAgICRjY051bWJlciA9ICRpbmZvLT5nZXRDY051bWJlcigpOw0KDQogICAgICAgIC8vIHJlbW92ZSBjcmVkaXQgY2FyZCBudW1iZXIgZGVsaW1pdGVycyBzdWNoIGFzICItIiBhbmQgc3BhY2UNCiAgICAgICAgJGNjTnVtYmVyID0gcHJlZ19yZXBsYWNlKCcvW1wtXHNdKy8nLCAnJywgJGNjTnVtYmVyKTsNCiAgICAgICAgJGluZm8tPnNldENjTnVtYmVyKCRjY051bWJlcik7DQoNCiAgICAgICAgJGNjVHlwZSA9ICcnOw0KDQogICAgICAgIGlmIChpbl9hcnJheSgkaW5mby0+Z2V0Q2NUeXBlKCksICRhdmFpbGFibGVUeXBlcykpew0KICAgICAgICAgICAgaWYgKCR0aGlzLT52YWxpZGF0ZUNjTnVtKCRjY051bWJlcikNCiAgICAgICAgICAgICAgICAvLyBPdGhlciBjcmVkaXQgY2FyZCB0eXBlIG51bWJlciB2YWxpZGF0aW9uDQogICAgICAgICAgICAgICAgfHwgKCR0aGlzLT5PdGhlckNjVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpICYmICR0aGlzLT52YWxpZGF0ZUNjTnVtT3RoZXIoJGNjTnVtYmVyKSkpIHsNCg0KICAgICAgICAgICAgICAgICRjY1R5cGUgPSAnT1QnOw0KICAgICAgICAgICAgICAgICRjY1R5cGVSZWdFeHBMaXN0ID0gYXJyYXkoDQogICAgICAgICAgICAgICAgICAgIC8vU29sbywgU3dpdGNoIG9yIE1hZXN0cm8uIEludGVybmF0aW9uYWwgc2FmZQ0KICAgICAgICAgICAgICAgICAgICAvKg0KICAgICAgICAgICAgICAgICAgICAvLyBNYWVzdHJvIC8gU29sbw0KICAgICAgICAgICAgICAgICAgICAnU1MnICA9PiAnL14oKDY3NTlbMC05XXsxMn0pfCg2MzM0fDY3NjdbMC05XXsxMn0pfCg2MzM0fDY3NjdbMC05XXsxNCwxNX0pJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woNTAxOHw1MDIwfDUwMzh8NjMwNHw2NzU5fDY3NjF8Njc2M1swLTldezEyLDE5fSl8KDQ5WzAxM11bMTM1Nl1bMC05XXsxMn0pJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woNjMzWzM0XVswLTldezEyfSl8KDYzMzExMFswLTldezEwfSl8KDU2NDE4MlswLTldezEwfSkpKFswLTldezIsM30pPyQvJywNCiAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgICAgICAgICAgICAgICAgLy8gU29sbyBvbmx5DQogICAgICAgICAgICAgICAgICAgICdTTycgPT4gJy8oXig2MzM0KVs1LTldKFxkezExfSR8XGR7MTMsMTR9JCkpfCheKDY3NjcpKFxkezEyfSR8XGR7MTQsMTV9JCkpLycsDQogICAgICAgICAgICAgICAgICAgICdTTScgPT4gJy8oXig1WzA2NzhdKVxkezExLDE4fSQpfCheKDZbXjA1XSlcZHsxMSwxOH0kKXwoXig2MDEpW14xXVxkezksMTZ9JCl8KF4oNjAxMSlcZHs5LDExfSQpJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig2MDExKVxkezEzLDE2fSQpfCheKDY1KVxkezExLDEzfSQpfCheKDY1KVxkezE1LDE4fSQpJw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJ3woXig0OTAzMClbMi05XShcZHsxMH0kfFxkezEyLDEzfSQpKXwoXig0OTAzMylbNS05XShcZHsxMH0kfFxkezEyLDEzfSQpKScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICd8KF4oNDkxMTApWzEtMl0oXGR7MTB9JHxcZHsxMiwxM30kKSl8KF4oNDkxMTcpWzQtOV0oXGR7MTB9JHxcZHsxMiwxM30kKSknDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnfCheKDQ5MTE4KVswLTJdKFxkezEwfSR8XGR7MTIsMTN9JCkpfCheKDQ5MzYpKFxkezEyfSR8XGR7MTQsMTV9JCkpLycsDQogICAgICAgICAgICAgICAgICAgIC8vIFZpc2ENCiAgICAgICAgICAgICAgICAgICAgJ1ZJJyAgPT4gJy9eNFswLTldezEyfShbMC05XXszfSk/JC8nLA0KICAgICAgICAgICAgICAgICAgICAvLyBNYXN0ZXIgQ2FyZA0KICAgICAgICAgICAgICAgICAgICAnTUMnICA9PiAnL141WzEtNV1bMC05XXsxNH0kLycsDQogICAgICAgICAgICAgICAgICAgIC8vIEFtZXJpY2FuIEV4cHJlc3MNCiAgICAgICAgICAgICAgICAgICAgJ0FFJyAgPT4gJy9eM1s0N11bMC05XXsxM30kLycsDQogICAgICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeQ0KICAgICAgICAgICAgICAgICAgICAnREknICA9PiAnL142MDExWzAtOV17MTJ9JC8nLA0KICAgICAgICAgICAgICAgICAgICAvLyBKQ0INCiAgICAgICAgICAgICAgICAgICAgJ0pDQicgPT4gJy9eKDNbMC05XXsxNX18KDIxMzF8MTgwMClbMC05XXsxMX0pJC8nDQogICAgICAgICAgICAgICAgKTsNCg0KICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjY1R5cGVSZWdFeHBMaXN0IGFzICRjY1R5cGVNYXRjaD0+JGNjVHlwZVJlZ0V4cCkgew0KICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgkY2NUeXBlUmVnRXhwLCAkY2NOdW1iZXIpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkY2NUeXBlID0gJGNjVHlwZU1hdGNoOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5PdGhlckNjVHlwZSgkaW5mby0+Z2V0Q2NUeXBlKCkpICYmICRjY1R5cGUhPSRpbmZvLT5nZXRDY1R5cGUoKSkgew0KICAgICAgICAgICAgICAgICAgICAkZXJyb3JNc2cgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+X18oJ0NyZWRpdCBjYXJkIG51bWJlciBtaXNtYXRjaCB3aXRoIGNyZWRpdCBjYXJkIHR5cGUuJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgJGVycm9yTXNnID0gTWFnZTo6aGVscGVyKCdwYXltZW50JyktPl9fKCdJbnZhbGlkIENyZWRpdCBDYXJkIE51bWJlcicpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAkZXJyb3JNc2cgPSBNYWdlOjpoZWxwZXIoJ3BheW1lbnQnKS0+X18oJ0NyZWRpdCBjYXJkIHR5cGUgaXMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcGF5bWVudCBtZXRob2QuJyk7DQogICAgICAgIH0NCg0KICAgICAgICAvL3ZhbGlkYXRlIGNyZWRpdCBjYXJkIHZlcmlmaWNhdGlvbiBudW1iZXINCiAgICAgICAgaWYgKCRlcnJvck1zZyA9PT0gZmFsc2UgJiYgJHRoaXMtPmhhc1ZlcmlmaWNhdGlvbigpKSB7DQogICAgICAgICAgICAkdmVyaWZjYXRpb25SZWdFeCA9ICR0aGlzLT5nZXRWZXJpZmljYXRpb25SZWdFeCgpOw0KICAgICAgICAgICAgJHJlZ0V4cCA9IGlzc2V0KCR2ZXJpZmNhdGlvblJlZ0V4WyRpbmZvLT5nZXRDY1R5cGUoKV0pID8gJHZlcmlmY2F0aW9uUmVnRXhbJGluZm8tPmdldENjVHlwZSgpXSA6ICcnOw0KICAgICAgICAgICAgaWYgKCEkaW5mby0+Z2V0Q2NDaWQoKSB8fCAhJHJlZ0V4cCB8fCAhcHJlZ19tYXRjaCgkcmVnRXhwICwkaW5mby0+Z2V0Q2NDaWQoKSkpew0KICAgICAgICAgICAgICAgICRlcnJvck1zZyA9IE1hZ2U6OmhlbHBlcigncGF5bWVudCcpLT5fXygnUGxlYXNlIGVudGVyIGEgdmFsaWQgY3JlZGl0IGNhcmQgdmVyaWZpY2F0aW9uIG51bWJlci4nKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgIGlmICgkY2NUeXBlICE9ICdTUycgJiYgISR0aGlzLT5fdmFsaWRhdGVFeHBEYXRlKCRpbmZvLT5nZXRDY0V4cFllYXIoKSwgJGluZm8tPmdldENjRXhwTW9udGgoKSkpIHsNCiAgICAgICAgICAgICRlcnJvck1zZyA9IE1hZ2U6OmhlbHBlcigncGF5bWVudCcpLT5fXygnSW5jb3JyZWN0IGNyZWRpdCBjYXJkIGV4cGlyYXRpb24gZGF0ZS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmKCRlcnJvck1zZyl7DQogICAgICAgICAgICBNYWdlOjp0aHJvd0V4Y2VwdGlvbigkZXJyb3JNc2cpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy9UaGlzIG11c3QgYmUgYWZ0ZXIgYWxsIHZhbGlkYXRpb24gY29uZGl0aW9ucw0KICAgICAgICBpZiAoJHRoaXMtPmdldElzQ2VudGluZWxWYWxpZGF0aW9uRW5hYmxlZCgpKSB7DQogICAgICAgICAgICAkdGhpcy0+Z2V0Q2VudGluZWxWYWxpZGF0b3IoKS0+dmFsaWRhdGUoJHRoaXMtPmdldENlbnRpbmVsVmFsaWRhdGlvbkRhdGEoKSk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gJHRoaXM7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGhhc1ZlcmlmaWNhdGlvbigpDQogICAgew0KICAgICAgICAkY29uZmlnRGF0YSA9ICR0aGlzLT5nZXRDb25maWdEYXRhKCd1c2VjY3YnKTsNCiAgICAgICAgaWYoaXNfbnVsbCgkY29uZmlnRGF0YSkpew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIChib29sKSAkY29uZmlnRGF0YTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyaWZpY2F0aW9uUmVnRXgoKQ0KICAgIHsNCiAgICAgICAgJHZlcmlmaWNhdGlvbkV4cExpc3QgPSBhcnJheSgNCiAgICAgICAgICAgICdWSScgPT4gJy9eWzAtOV17M30kLycsIC8vIFZpc2ENCiAgICAgICAgICAgICdNQycgPT4gJy9eWzAtOV17M30kLycsICAgICAgIC8vIE1hc3RlciBDYXJkDQogICAgICAgICAgICAnQUUnID0+ICcvXlswLTldezR9JC8nLCAgICAgICAgLy8gQW1lcmljYW4gRXhwcmVzcw0KICAgICAgICAgICAgJ0RJJyA9PiAnL15bMC05XXszfSQvJywgICAgICAgICAgLy8gRGlzY292ZXJ5DQogICAgICAgICAgICAnU1MnID0+ICcvXlswLTldezMsNH0kLycsDQogICAgICAgICAgICAnU00nID0+ICcvXlswLTldezMsNH0kLycsIC8vIFN3aXRjaCBvciBNYWVzdHJvDQogICAgICAgICAgICAnU08nID0+ICcvXlswLTldezMsNH0kLycsIC8vIFNvbG8NCiAgICAgICAgICAgICdPVCcgPT4gJy9eWzAtOV17Myw0fSQvJywNCiAgICAgICAgICAgICdKQ0InID0+ICcvXlswLTldezMsNH0kLycgLy9KQ0INCiAgICAgICAgKTsNCiAgICAgICAgcmV0dXJuICR2ZXJpZmljYXRpb25FeHBMaXN0Ow0KICAgIH0NCg0KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfdmFsaWRhdGVFeHBEYXRlKCRleHBZZWFyLCAkZXhwTW9udGgpDQogICAgew0KICAgICAgICAkZGF0ZSA9IE1hZ2U6OmFwcCgpLT5nZXRMb2NhbGUoKS0+ZGF0ZSgpOw0KICAgICAgICBpZiAoISRleHBZZWFyIHx8ICEkZXhwTW9udGggfHwgKCRkYXRlLT5jb21wYXJlWWVhcigkZXhwWWVhcikgPT0gMSkNCiAgICAgICAgICAgIHx8ICgkZGF0ZS0+Y29tcGFyZVllYXIoJGV4cFllYXIpID09IDAgJiYgKCRkYXRlLT5jb21wYXJlTW9udGgoJGV4cE1vbnRoKSA9PSAxKSkNCiAgICAgICAgKSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIE90aGVyQ2NUeXBlKCR0eXBlKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuICR0eXBlPT0nT1QnOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFZhbGlkYXRlIGNyZWRpdCBjYXJkIG51bWJlcg0KICAgICAqDQogICAgICogQHBhcmFtICAgc3RyaW5nICRjY19udW1iZXINCiAgICAgKiBAcmV0dXJuICBib29sDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2NOdW0oJGNjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgJGNhcmROdW1iZXIgPSBzdHJyZXYoJGNjTnVtYmVyKTsNCiAgICAgICAgJG51bVN1bSA9IDA7DQoNCiAgICAgICAgZm9yICgkaT0wOyAkaTxzdHJsZW4oJGNhcmROdW1iZXIpOyAkaSsrKSB7DQogICAgICAgICAgICAkY3VycmVudE51bSA9IHN1YnN0cigkY2FyZE51bWJlciwgJGksIDEpOw0KDQogICAgICAgICAgICAvKioNCiAgICAgICAgICAgICAqIERvdWJsZSBldmVyeSBzZWNvbmQgZGlnaXQNCiAgICAgICAgICAgICAqLw0KICAgICAgICAgICAgaWYgKCRpICUgMiA9PSAxKSB7DQogICAgICAgICAgICAgICAgJGN1cnJlbnROdW0gKj0gMjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyoqDQogICAgICAgICAgICAgKiBBZGQgZGlnaXRzIG9mIDItZGlnaXQgbnVtYmVycyB0b2dldGhlcg0KICAgICAgICAgICAgICovDQogICAgICAgICAgICBpZiAoJGN1cnJlbnROdW0gPiA5KSB7DQogICAgICAgICAgICAgICAgJGZpcnN0TnVtID0gJGN1cnJlbnROdW0gJSAxMDsNCiAgICAgICAgICAgICAgICAkc2Vjb25kTnVtID0gKCRjdXJyZW50TnVtIC0gJGZpcnN0TnVtKSAvIDEwOw0KICAgICAgICAgICAgICAgICRjdXJyZW50TnVtID0gJGZpcnN0TnVtICsgJHNlY29uZE51bTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgJG51bVN1bSArPSAkY3VycmVudE51bTsNCiAgICAgICAgfQ0KDQogICAgICAgIC8qKg0KICAgICAgICAgKiBJZiB0aGUgdG90YWwgaGFzIG5vIHJlbWFpbmRlciBpdCdzIE9LDQogICAgICAgICAqLw0KICAgICAgICByZXR1cm4gKCRudW1TdW0gJSAxMCA9PSAwKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBPdGhlciBjcmVkaXQgY2FydCB0eXBlIG51bWJlciB2YWxpZGF0aW9uDQogICAgICoNCiAgICAgKiBAcGFyYW0gc3RyaW5nICRjY051bWJlcg0KICAgICAqIEByZXR1cm4gYm9vbGVhbg0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUNjTnVtT3RoZXIoJGNjTnVtYmVyKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIHByZWdfbWF0Y2goJy9eXFxkKyQvJywgJGNjTnVtYmVyKTsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBDQyB0eXBlcyBzZXQgaW4gY29uZmlndXJhdGlvbg0KICAgICAqDQogICAgICogQHBhcmFtIE1hZ2VfU2FsZXNfTW9kZWxfUXVvdGV8bnVsbCAkcXVvdGUNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBdmFpbGFibGUoJHF1b3RlID0gbnVsbCkNCiAgICB7DQogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2N0eXBlcycsICgkcXVvdGUgPyAkcXVvdGUtPmdldFN0b3JlSWQoKSA6IG51bGwpKQ0KICAgICAgICAgICAgJiYgcGFyZW50Ojppc0F2YWlsYWJsZSgkcXVvdGUpOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIFdoZXRoZXIgY2VudGluZWwgc2VydmljZSBpcyBlbmFibGVkDQogICAgICoNCiAgICAgKiBAcmV0dXJuIGJvb2wNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXNDZW50aW5lbFZhbGlkYXRpb25FbmFibGVkKCkNCiAgICB7DQogICAgICAgIHJldHVybiBmYWxzZSAhPT0gTWFnZTo6Z2V0Q29uZmlnKCktPmdldE5vZGUoJ21vZHVsZXMvTWFnZV9DZW50aW5lbCcpICYmIDEgPT0gJHRoaXMtPmdldENvbmZpZ0RhdGEoJ2NlbnRpbmVsJyk7DQogICAgfQ0KDQogICAgLyoqDQogICAgICogSW5zdGFudGlhdGUgY2VudGluZWwgdmFsaWRhdG9yIG1vZGVsDQogICAgICoNCiAgICAgKiBAcmV0dXJuIE1hZ2VfQ2VudGluZWxfTW9kZWxfU2VydmljZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDZW50aW5lbFZhbGlkYXRvcigpDQogICAgew0KICAgICAgICAkdmFsaWRhdG9yID0gTWFnZTo6Z2V0U2luZ2xldG9uKCdjZW50aW5lbC9zZXJ2aWNlJyk7DQogICAgICAgICR2YWxpZGF0b3INCiAgICAgICAgICAgIC0+c2V0SXNNb2RlU3RyaWN0KCR0aGlzLT5nZXRDb25maWdEYXRhKCdjZW50aW5lbF9pc19tb2RlX3N0cmljdCcpKQ0KICAgICAgICAgICAgLT5zZXRDdXN0b21BcGlFbmRwb2ludFVybCgkdGhpcy0+Z2V0Q29uZmlnRGF0YSgnY2VudGluZWxfYXBpX3VybCcpKQ0KICAgICAgICAgICAgLT5zZXRTdG9yZSgkdGhpcy0+Z2V0U3RvcmUoKSkNCiAgICAgICAgICAgIC0+c2V0SXNQbGFjZU9yZGVyKCR0aGlzLT5faXNQbGFjZU9yZGVyKCkpOw0KICAgICAgICByZXR1cm4gJHZhbGlkYXRvcjsNCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm4gZGF0YSBmb3IgQ2VudGluZWwgdmFsaWRhdGlvbg0KICAgICAqDQogICAgICogQHJldHVybiBWYXJpZW5fT2JqZWN0DQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGdldENlbnRpbmVsVmFsaWRhdGlvbkRhdGEoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgICRwYXJhbXMgPSBuZXcgVmFyaWVuX09iamVjdCgpOw0KICAgICAgICAkcGFyYW1zDQogICAgICAgICAgICAtPnNldFBheW1lbnRNZXRob2RDb2RlKCR0aGlzLT5nZXRDb2RlKCkpDQogICAgICAgICAgICAtPnNldENhcmRUeXBlKCRpbmZvLT5nZXRDY1R5cGUoKSkNCiAgICAgICAgICAgIC0+c2V0Q2FyZE51bWJlcigkaW5mby0+Z2V0Q2NOdW1iZXIoKSkNCiAgICAgICAgICAgIC0+c2V0Q2FyZEV4cE1vbnRoKCRpbmZvLT5nZXRDY0V4cE1vbnRoKCkpDQogICAgICAgICAgICAtPnNldENhcmRFeHBZZWFyKCRpbmZvLT5nZXRDY0V4cFllYXIoKSkNCiAgICAgICAgICAgIC0+c2V0QW1vdW50KCR0aGlzLT5fZ2V0QW1vdW50KCkpDQogICAgICAgICAgICAtPnNldEN1cnJlbmN5Q29kZSgkdGhpcy0+X2dldEN1cnJlbmN5Q29kZSgpKQ0KICAgICAgICAgICAgLT5zZXRPcmRlck51bWJlcigkdGhpcy0+X2dldE9yZGVySWQoKSk7DQogICAgICAgIHJldHVybiAkcGFyYW1zOw0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIE9yZGVyIGluY3JlbWVudCBJRCBnZXR0ZXIgKGVpdGhlciByZWFsIGZyb20gb3JkZXIgb3IgYSByZXNlcnZlZCBmcm9tIHF1b3RlKQ0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRPcmRlcklkKCkNCiAgICB7DQogICAgICAgICRpbmZvID0gJHRoaXMtPmdldEluZm9JbnN0YW5jZSgpOw0KDQogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7DQogICAgICAgICAgICByZXR1cm4gJGluZm8tPmdldE9yZGVyKCktPmdldEluY3JlbWVudElkKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBpZiAoISRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKSkgew0KICAgICAgICAgICAgICAgICRpbmZvLT5nZXRRdW90ZSgpLT5yZXNlcnZlT3JkZXJJZCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRRdW90ZSgpLT5nZXRSZXNlcnZlZE9yZGVySWQoKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8qKg0KICAgICAqIEdyYW5kIHRvdGFsIGdldHRlcg0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRBbW91bnQoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQogICAgICAgIGlmICgkdGhpcy0+X2lzUGxhY2VPcmRlcigpKSB7DQogICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkkaW5mby0+Z2V0T3JkZXIoKS0+Z2V0UXVvdGVCYXNlR3JhbmRUb3RhbCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpJGluZm8tPmdldFF1b3RlKCktPmdldEJhc2VHcmFuZFRvdGFsKCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKioNCiAgICAgKiBDdXJyZW5jeSBjb2RlIGdldHRlcg0KICAgICAqDQogICAgICogQHJldHVybiBzdHJpbmcNCiAgICAgKi8NCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9nZXRDdXJyZW5jeUNvZGUoKQ0KICAgIHsNCiAgICAgICAgJGluZm8gPSAkdGhpcy0+Z2V0SW5mb0luc3RhbmNlKCk7DQoNCiAgICAgICAgaWYgKCR0aGlzLT5faXNQbGFjZU9yZGVyKCkpIHsNCiAgICAgICAgcmV0dXJuICRpbmZvLT5nZXRPcmRlcigpLT5nZXRCYXNlQ3VycmVuY3lDb2RlKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiAkaW5mby0+Z2V0UXVvdGUoKS0+Z2V0QmFzZUN1cnJlbmN5Q29kZSgpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgLyoqDQogICAgICogV2hldGhlciBjdXJyZW50IG9wZXJhdGlvbiBpcyBvcmRlciBwbGFjZW1lbnQNCiAgICAgKg0KICAgICAqIEByZXR1cm4gYm9vbA0KICAgICAqLw0KICAgIHByaXZhdGUgZnVuY3Rpb24gX2lzUGxhY2VPcmRlcigpDQogICAgew0KICAgICAgICAkaW5mbyA9ICR0aGlzLT5nZXRJbmZvSW5zdGFuY2UoKTsNCiAgICAgICAgaWYgKCRpbmZvIGluc3RhbmNlb2YgTWFnZV9TYWxlc19Nb2RlbF9RdW90ZV9QYXltZW50KSB7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0gZWxzZWlmICgkaW5mbyBpbnN0YW5jZW9mIE1hZ2VfU2FsZXNfTW9kZWxfT3JkZXJfUGF5bWVudCkgew0KICAgICAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICAgIH0NCiAgICB9DQp9
Advertisement
Add Comment
Please, Sign In to add comment