UNPKG

tractjs

Version:

A library for running ONNX and TensorFlow inference in the browser.

1 lines 7.61 MB
var tractjs=function(U){"use strict";var F=Worker;const Q=new F("data:application/javascript;base64,CmZ1bmN0aW9uIF9sb2FkV2FzbU1vZHVsZSAoc3luYywgc3JjLCBpbXBvcnRzKSB7CiAgICAgICAgdmFyIGJ1ZiA9IG51bGwKICAgICAgICB2YXIgaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MudmVyc2lvbnMgIT0gbnVsbCAmJiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgIT0gbnVsbAogICAgICAgIGlmIChpc05vZGUpIHsKICAgICAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKHNyYywgJ2Jhc2U2NCcpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciByYXcgPSBnbG9iYWxUaGlzLmF0b2Ioc3JjKQogICAgICAgICAgdmFyIHJhd0xlbmd0aCA9IHJhdy5sZW5ndGgKICAgICAgICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KG5ldyBBcnJheUJ1ZmZlcihyYXdMZW5ndGgpKQogICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHJhd0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBidWZbaV0gPSByYXcuY2hhckNvZGVBdChpKQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGltcG9ydHMgJiYgIXN5bmMpIHsKICAgICAgICAgIHJldHVybiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShidWYsIGltcG9ydHMpCiAgICAgICAgfSBlbHNlIGlmICghaW1wb3J0cyAmJiAhc3luYykgewogICAgICAgICAgcmV0dXJuIFdlYkFzc2VtYmx5LmNvbXBpbGUoYnVmKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgbW9kID0gbmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShidWYpCiAgICAgICAgICByZXR1cm4gaW1wb3J0cyA/IG5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShtb2QsIGltcG9ydHMpIDogbW9kCiAgICAgICAgfQogICAgICB9CihmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioNCiAgICogQSBUZW5zb3IuIFRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IHR5cGUuDQogICAqDQogICAqIERlZmluZWQgYnkgYSBbVHlwZWRBcnJheV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvVHlwZWRBcnJheSkgYW5kIGEgc2hhcGUuDQogICAqDQogICAqIERhdGEgaXMgc3RvcmVkIGluIHN0YW5kYXJkIG9yZGVyIGkuIGUuIGBuZXcgVGVuc29yKG5ldyBGbG9hdDMyQXJyYXkoWzEsIDIsIDMsIDRdKSwgWzIsIDJdKWAgaXMgY29tcGFyYWJsZSB0byBgW1sxLCAyXSwgWzMsIDRdXWAuDQogICAqLw0KICBjbGFzcyBUZW5zb3Igew0KICAgICAgY29uc3RydWN0b3IoZGF0YSwgc2hhcGUpIHsNCiAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOw0KICAgICAgICAgIHRoaXMuc2hhcGUgPSBzaGFwZTsNCiAgICAgIH0NCiAgfQoKICBsZXQgd2FzbTsKCiAgY29uc3QgaGVhcCA9IG5ldyBBcnJheSgzMikuZmlsbCh1bmRlZmluZWQpOwoKICBoZWFwLnB1c2godW5kZWZpbmVkLCBudWxsLCB0cnVlLCBmYWxzZSk7CgogIGZ1bmN0aW9uIGdldE9iamVjdChpZHgpIHsgcmV0dXJuIGhlYXBbaWR4XTsgfQoKICBsZXQgaGVhcF9uZXh0ID0gaGVhcC5sZW5ndGg7CgogIGZ1bmN0aW9uIGRyb3BPYmplY3QoaWR4KSB7CiAgICAgIGlmIChpZHggPCAzNikgcmV0dXJuOwogICAgICBoZWFwW2lkeF0gPSBoZWFwX25leHQ7CiAgICAgIGhlYXBfbmV4dCA9IGlkeDsKICB9CgogIGZ1bmN0aW9uIHRha2VPYmplY3QoaWR4KSB7CiAgICAgIGNvbnN0IHJldCA9IGdldE9iamVjdChpZHgpOwogICAgICBkcm9wT2JqZWN0KGlkeCk7CiAgICAgIHJldHVybiByZXQ7CiAgfQoKICBsZXQgY2FjaGVkVGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JywgeyBpZ25vcmVCT006IHRydWUsIGZhdGFsOiB0cnVlIH0pOwoKICBjYWNoZWRUZXh0RGVjb2Rlci5kZWNvZGUoKTsKCiAgbGV0IGNhY2hlZ2V0VWludDhNZW1vcnkwID0gbnVsbDsKICBmdW5jdGlvbiBnZXRVaW50OE1lbW9yeTAoKSB7CiAgICAgIGlmIChjYWNoZWdldFVpbnQ4TWVtb3J5MCA9PT0gbnVsbCB8fCBjYWNoZWdldFVpbnQ4TWVtb3J5MC5idWZmZXIgIT09IHdhc20ubWVtb3J5LmJ1ZmZlcikgewogICAgICAgICAgY2FjaGVnZXRVaW50OE1lbW9yeTAgPSBuZXcgVWludDhBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZWdldFVpbnQ4TWVtb3J5MDsKICB9CgogIGZ1bmN0aW9uIGdldFN0cmluZ0Zyb21XYXNtMChwdHIsIGxlbikgewogICAgICByZXR1cm4gY2FjaGVkVGV4dERlY29kZXIuZGVjb2RlKGdldFVpbnQ4TWVtb3J5MCgpLnN1YmFycmF5KHB0ciwgcHRyICsgbGVuKSk7CiAgfQoKICBmdW5jdGlvbiBhZGRIZWFwT2JqZWN0KG9iaikgewogICAgICBpZiAoaGVhcF9uZXh0ID09PSBoZWFwLmxlbmd0aCkgaGVhcC5wdXNoKGhlYXAubGVuZ3RoICsgMSk7CiAgICAgIGNvbnN0IGlkeCA9IGhlYXBfbmV4dDsKICAgICAgaGVhcF9uZXh0ID0gaGVhcFtpZHhdOwoKICAgICAgaGVhcFtpZHhdID0gb2JqOwogICAgICByZXR1cm4gaWR4OwogIH0KCiAgZnVuY3Rpb24gaXNMaWtlTm9uZSh4KSB7CiAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQgfHwgeCA9PT0gbnVsbDsKICB9CgogIGxldCBjYWNoZWdldEZsb2F0NjRNZW1vcnkwID0gbnVsbDsKICBmdW5jdGlvbiBnZXRGbG9hdDY0TWVtb3J5MCgpIHsKICAgICAgaWYgKGNhY2hlZ2V0RmxvYXQ2NE1lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVnZXRGbG9hdDY0TWVtb3J5MC5idWZmZXIgIT09IHdhc20ubWVtb3J5LmJ1ZmZlcikgewogICAgICAgICAgY2FjaGVnZXRGbG9hdDY0TWVtb3J5MCA9IG5ldyBGbG9hdDY0QXJyYXkod2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgICAgfQogICAgICByZXR1cm4gY2FjaGVnZXRGbG9hdDY0TWVtb3J5MDsKICB9CgogIGxldCBjYWNoZWdldEludDMyTWVtb3J5MCA9IG51bGw7CiAgZnVuY3Rpb24gZ2V0SW50MzJNZW1vcnkwKCkgewogICAgICBpZiAoY2FjaGVnZXRJbnQzMk1lbW9yeTAgPT09IG51bGwgfHwgY2FjaGVnZXRJbnQzMk1lbW9yeTAuYnVmZmVyICE9PSB3YXNtLm1lbW9yeS5idWZmZXIpIHsKICAgICAgICAgIGNhY2hlZ2V0SW50MzJNZW1vcnkwID0gbmV3IEludDMyQXJyYXkod2FzbS5tZW1vcnkuYnVmZmVyKTsKICAgICAgfQogICAgICByZXR1cm4gY2FjaGVnZXRJbnQzMk1lbW9yeTA7CiAgfQoKICBsZXQgV0FTTV9WRUNUT1JfTEVOID0gMDsKCiAgbGV0IGNhY2hlZFRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCd1dGYtOCcpOwoKICBjb25zdCBlbmNvZGVTdHJpbmcgPSAodHlwZW9mIGNhY2hlZFRleHRFbmNvZGVyLmVuY29kZUludG8gPT09ICdmdW5jdGlvbicKICAgICAgPyBmdW5jdGlvbiAoYXJnLCB2aWV3KSB7CiAgICAgIHJldHVybiBjYWNoZWRUZXh0RW5jb2Rlci5lbmNvZGVJbnRvKGFyZywgdmlldyk7CiAgfQogICAgICA6IGZ1bmN0aW9uIChhcmcsIHZpZXcpIHsKICAgICAgY29uc3QgYnVmID0gY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7CiAgICAgIHZpZXcuc2V0KGJ1Zik7CiAgICAgIHJldHVybiB7CiAgICAgICAgICByZWFkOiBhcmcubGVuZ3RoLAogICAgICAgICAgd3JpdHRlbjogYnVmLmxlbmd0aAogICAgICB9OwogIH0pOwoKICBmdW5jdGlvbiBwYXNzU3RyaW5nVG9XYXNtMChhcmcsIG1hbGxvYywgcmVhbGxvYykgewoKICAgICAgaWYgKHJlYWxsb2MgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgY29uc3QgYnVmID0gY2FjaGVkVGV4dEVuY29kZXIuZW5jb2RlKGFyZyk7CiAgICAgICAgICBjb25zdCBwdHIgPSBtYWxsb2MoYnVmLmxlbmd0aCk7CiAgICAgICAgICBnZXRVaW50OE1lbW9yeTAoKS5zdWJhcnJheShwdHIsIHB0ciArIGJ1Zi5sZW5ndGgpLnNldChidWYpOwogICAgICAgICAgV0FTTV9WRUNUT1JfTEVOID0gYnVmLmxlbmd0aDsKICAgICAgICAgIHJldHVybiBwdHI7CiAgICAgIH0KCiAgICAgIGxldCBsZW4gPSBhcmcubGVuZ3RoOwogICAgICBsZXQgcHRyID0gbWFsbG9jKGxlbik7CgogICAgICBjb25zdCBtZW0gPSBnZXRVaW50OE1lbW9yeTAoKTsKCiAgICAgIGxldCBvZmZzZXQgPSAwOwoKICAgICAgZm9yICg7IG9mZnNldCA8IGxlbjsgb2Zmc2V0KyspIHsKICAgICAgICAgIGNvbnN0IGNvZGUgPSBhcmcuY2hhckNvZGVBdChvZmZzZXQpOwogICAgICAgICAgaWYgKGNvZGUgPiAweDdGKSBicmVhazsKICAgICAgICAgIG1lbVtwdHIgKyBvZmZzZXRdID0gY29kZTsKICAgICAgfQoKICAgICAgaWYgKG9mZnNldCAhPT0gbGVuKSB7CiAgICAgICAgICBpZiAob2Zmc2V0ICE9PSAwKSB7CiAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKG9mZnNldCk7CiAgICAgICAgICB9CiAgICAgICAgICBwdHIgPSByZWFsbG9jKHB0ciwgbGVuLCBsZW4gPSBvZmZzZXQgKyBhcmcubGVuZ3RoICogMyk7CiAgICAgICAgICBjb25zdCB2aWV3ID0gZ2V0VWludDhNZW1vcnkwKCkuc3ViYXJyYXkocHRyICsgb2Zmc2V0LCBwdHIgKyBsZW4pOwogICAgICAgICAgY29uc3QgcmV0ID0gZW5jb2RlU3RyaW5nKGFyZywgdmlldyk7CgogICAgICAgICAgb2Zmc2V0ICs9IHJldC53cml0dGVuOwogICAgICB9CgogICAgICBXQVNNX1ZFQ1RPUl9MRU4gPSBvZmZzZXQ7CiAgICAgIHJldHVybiBwdHI7CiAgfQoKICBmdW5jdGlvbiBkZWJ1Z1N0cmluZyh2YWwpIHsKICAgICAgLy8gcHJpbWl0aXZlIHR5cGVzCiAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsOwogICAgICBpZiAodHlwZSA9PSAnbnVtYmVyJyB8fCB0eXBlID09ICdib29sZWFuJyB8fCB2YWwgPT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuICBgJHt2YWx9YDsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAnc3RyaW5nJykgewogICAgICAgICAgcmV0dXJuIGAiJHt2YWx9ImA7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gJ3N5bWJvbCcpIHsKICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdmFsLmRlc2NyaXB0aW9uOwogICAgICAgICAgaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgICByZXR1cm4gJ1N5bWJvbCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBgU3ltYm9sKCR7ZGVzY3JpcHRpb259KWA7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgY29uc3QgbmFtZSA9IHZhbC5uYW1lOwogICAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09ICdzdHJpbmcnICYmIG5hbWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIHJldHVybiBgRnVuY3Rpb24oJHtuYW1lfSlgOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gJ0Z1bmN0aW9uJzsKICAgICAgICAgIH0KICAgICAgfQogICAgICAvLyBvYmplY3RzCiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHsKICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbC5sZW5ndGg7CiAgICAgICAgICBsZXQgZGVidWcgPSAnWyc7CiAgICAgICAgICBpZiAobGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGRlYnVnICs9IGRlYnVnU3RyaW5nKHZhbFswXSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBkZWJ1ZyArPSAnLCAnICsgZGVidWdTdHJpbmcodmFsW2ldKTsKICAgICAgICAgIH0KICAgICAgICAgIGRlYnVnICs9ICddJzsKICAgICAgICAgIHJldHVybiBkZWJ1ZzsKICAgICAgfQogICAgICAvLyBUZXN0IGZvciBidWlsdC1pbgogICAgICBjb25zdCBidWlsdEluTWF0Y2hlcyA9IC9cW29iamVjdCAoW15cXV0rKVxdLy5leGVjKHRvU3RyaW5nLmNhbGwodmFsKSk7CiAgICAgIGxldCBjbGFzc05hbWU7CiAgICAgIGlmIChidWlsdEluTWF0Y2hlcy5sZW5ndGggPiAxKSB7CiAgICAgICAgICBjbGFzc05hbWUgPSBidWlsdEluTWF0Y2hlc1sxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEZhaWxlZCB0byBtYXRjaCB0aGUgc3RhbmRhcmQgJ1tvYmplY3QgQ2xhc3NOYW1lXScKICAgICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCk7CiAgICAgIH0KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnT2JqZWN0JykgewogICAgICAgICAgLy8gd2UncmUgYSB1c2VyIGRlZmluZWQgY2xhc3Mgb3IgT2JqZWN0CiAgICAgICAgICAvLyBKU09OLnN0cmluZ2lmeSBhdm9pZHMgcHJvYmxlbXMgd2l0aCBjeWNsZXMsIGFuZCBpcyBnZW5lcmFsbHkgbXVjaAogICAgICAgICAgLy8gZWFzaWVyIHRoYW4gbG9vcGluZyB0aHJvdWdoIG93blByb3BlcnRpZXMgb2YgYHZhbGAuCiAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJldHVybiAnT2JqZWN0KCcgKyBKU09OLnN0cmluZ2lmeSh2YWwpICsgJyknOwogICAgICAgICAgfSBjYXRjaCAoXykgewogICAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JzsKICAgICAgICAgIH0KICAgICAgfQogICAgICAvLyBlcnJvcnMKICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICByZXR1cm4gYCR7dmFsLm5hbWV9OiAke3ZhbC5tZXNzYWdlfVxuJHt2YWwuc3RhY2t9YDsKICAgICAgfQogICAgICAvLyBUT0RPIHdlIGNvdWxkIHRlc3QgZm9yIG1vcmUgdGhpbmdzIGhlcmUsIGxpa2UgYFNldGBzIGFuZCBgTWFwYHMuCiAgICAgIHJldHVybiBjbGFzc05hbWU7CiAgfQoKICBmdW5jdGlvbiBfYXNzZXJ0Q2xhc3MoaW5zdGFuY2UsIGtsYXNzKSB7CiAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2Yga2xhc3MpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGV4cGVjdGVkIGluc3RhbmNlIG9mICR7a2xhc3MubmFtZX1gKTsKICAgICAgfQogICAgICByZXR1cm4gaW5zdGFuY2UucHRyOwogIH0KCiAgbGV0IGNhY2hlZ2V0VWludDMyTWVtb3J5MCA9IG51bGw7CiAgZnVuY3Rpb24gZ2V0VWludDMyTWVtb3J5MCgpIHsKICAgICAgaWYgKGNhY2hlZ2V0VWludDMyTWVtb3J5MCA9PT0gbnVsbCB8fCBjYWNoZWdldFVpbnQzMk1lbW9yeTAuYnVmZmVyICE9PSB3YXNtLm1lbW9yeS5idWZmZXIpIHsKICAgICAgICAgIGNhY2hlZ2V0VWludDMyTWVtb3J5MCA9IG5ldyBVaW50MzJBcnJheSh3YXNtLm1lbW9yeS5idWZmZXIpOwogICAgICB9CiAgICAgIHJldHVybiBjYWNoZWdldFVpbnQzMk1lbW9yeTA7CiAgfQoKICBmdW5jdGlvbiBnZXRBcnJheVUzMkZyb21XYXNtMChwdHIsIGxlbikgewogICAgICByZXR1cm4gZ2V0VWludDMyTWVtb3J5MCgpLnN1YmFycmF5KHB0ciAvIDQsIHB0ciAvIDQgKyBsZW4pOwogIH0KCiAgZnVuY3Rpb24gcGFzc0FycmF5OFRvV2FzbTAoYXJnLCBtYWxsb2MpIHsKICAgICAgY29uc3QgcHRyID0gbWFsbG9jKGFyZy5sZW5ndGggKiAxKTsKICAgICAgZ2V0VWludDhNZW1vcnkwKCkuc2V0KGFyZywgcHRyIC8gMSk7CiAgICAgIFdBU01fVkVDVE9SX0xFTiA9IGFyZy5sZW5ndGg7CiAgICAgIHJldHVybiBwdHI7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVFcnJvcihmLCBhcmdzKSB7CiAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgd2FzbS5fX3diaW5kZ2VuX2V4bl9zdG9yZShhZGRIZWFwT2JqZWN0KGUpKTsKICAgICAgfQogIH0KICAvKioKICAqLwogIGNsYXNzIENvcmVNb2RlbCB7CgogICAgICBzdGF0aWMgX193cmFwKHB0cikgewogICAgICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShDb3JlTW9kZWwucHJvdG90eXBlKTsKICAgICAgICAgIG9iai5wdHIgPSBwdHI7CgogICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQoKICAgICAgX19kZXN0cm95X2ludG9fcmF3KCkgewogICAgICAgICAgY29uc3QgcHRyID0gdGhpcy5wdHI7CiAgICAgICAgICB0aGlzLnB0ciA9IDA7CgogICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgfQoKICAgICAgZnJlZSgpIHsKICAgICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7CiAgICAgICAgICB3YXNtLl9fd2JnX2NvcmVtb2RlbF9mcmVlKHB0cik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhCiAgICAgICogQHBhcmFtIHtib29sZWFufSB1c2Vfb25ueAogICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW1pemUKICAgICAgKiBAcGFyYW0ge0FycmF5PGFueT4gfCB1bmRlZmluZWR9IGlucHV0cwogICAgICAqIEBwYXJhbSB7QXJyYXk8YW55PiB8IHVuZGVmaW5lZH0gb3V0cHV0cwogICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dF9mYWN0cwogICAgICAqIEByZXR1cm5zIHtDb3JlTW9kZWx9CiAgICAgICovCiAgICAgIHN0YXRpYyBsb2FkKGRhdGEsIHVzZV9vbm54LCBvcHRpbWl6ZSwgaW5wdXRzLCBvdXRwdXRzLCBpbnB1dF9mYWN0cykgewogICAgICAgICAgdmFyIHB0cjAgPSBwYXNzQXJyYXk4VG9XYXNtMChkYXRhLCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jKTsKICAgICAgICAgIHZhciBsZW4wID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgdmFyIHJldCA9IHdhc20uY29yZW1vZGVsX2xvYWQocHRyMCwgbGVuMCwgdXNlX29ubngsIG9wdGltaXplLCBpc0xpa2VOb25lKGlucHV0cykgPyAwIDogYWRkSGVhcE9iamVjdChpbnB1dHMpLCBpc0xpa2VOb25lKG91dHB1dHMpID8gMCA6IGFkZEhlYXBPYmplY3Qob3V0cHV0cyksIGFkZEhlYXBPYmplY3QoaW5wdXRfZmFjdHMpKTsKICAgICAgICAgIHJldHVybiBDb3JlTW9kZWwuX193cmFwKHJldCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICogQHJldHVybnMge2FueX0KICAgICAgKi8KICAgICAgbWV0YWRhdGEoKSB7CiAgICAgICAgICB2YXIgcmV0ID0gd2FzbS5jb3JlbW9kZWxfbWV0YWRhdGEodGhpcy5wdHIpOwogICAgICAgICAgcmV0dXJuIHRha2VPYmplY3QocmV0KTsKICAgICAgfQogICAgICAvKioKICAgICAgKiBAcGFyYW0ge0NvcmVUZW5zb3JWZWN9IGRhdGEKICAgICAgKiBAcmV0dXJucyB7Q29yZVRlbnNvclZlY30KICAgICAgKi8KICAgICAgcHJlZGljdChkYXRhKSB7CiAgICAgICAgICBfYXNzZXJ0Q2xhc3MoZGF0YSwgQ29yZVRlbnNvclZlYyk7CiAgICAgICAgICB2YXIgcHRyMCA9IGRhdGEucHRyOwogICAgICAgICAgZGF0YS5wdHIgPSAwOwogICAgICAgICAgdmFyIHJldCA9IHdhc20uY29yZW1vZGVsX3ByZWRpY3QodGhpcy5wdHIsIHB0cjApOwogICAgICAgICAgcmV0dXJuIENvcmVUZW5zb3JWZWMuX193cmFwKHJldCk7CiAgICAgIH0KICB9CiAgLyoqCiAgKi8KICBjbGFzcyBDb3JlVGVuc29yIHsKCiAgICAgIHN0YXRpYyBfX3dyYXAocHRyKSB7CiAgICAgICAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKENvcmVUZW5zb3IucHJvdG90eXBlKTsKICAgICAgICAgIG9iai5wdHIgPSBwdHI7CgogICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgfQoKICAgICAgX19kZXN0cm95X2ludG9fcmF3KCkgewogICAgICAgICAgY29uc3QgcHRyID0gdGhpcy5wdHI7CiAgICAgICAgICB0aGlzLnB0ciA9IDA7CgogICAgICAgICAgcmV0dXJuIHB0cjsKICAgICAgfQoKICAgICAgZnJlZSgpIHsKICAgICAgICAgIGNvbnN0IHB0ciA9IHRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7CiAgICAgICAgICB3YXNtLl9fd2JnX2NvcmV0ZW5zb3JfZnJlZShwdHIpOwogICAgICB9CiAgICAgIC8qKgogICAgICAqIEBwYXJhbSB7VHlwZWRBcnJheX0gZGF0YQogICAgICAqIEBwYXJhbSB7VWludDMyQXJyYXl9IHNoYXBlCiAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKGRhdGEsIHNoYXBlKSB7CiAgICAgICAgICB2YXIgcmV0ID0gd2FzbS5jb3JldGVuc29yX25ldyhhZGRIZWFwT2JqZWN0KGRhdGEpLCBhZGRIZWFwT2JqZWN0KHNoYXBlKSk7CiAgICAgICAgICByZXR1cm4gQ29yZVRlbnNvci5fX3dyYXAocmV0KTsKICAgICAgfQogICAgICAvKioKICAgICAgKiBAcmV0dXJucyB7YW55fQogICAgICAqLwogICAgICBkYXRhKCkgewogICAgICAgICAgdmFyIHJldCA9IHdhc20uY29yZXRlbnNvcl9kYXRhKHRoaXMucHRyKTsKICAgICAgICAgIHJldHVybiB0YWtlT2JqZWN0KHJldCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICogQHJldHVybnMge1VpbnQzMkFycmF5fQogICAgICAqLwogICAgICBzaGFwZSgpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgY29uc3QgcmV0cHRyID0gd2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKC0xNik7CiAgICAgICAgICAgICAgd2FzbS5jb3JldGVuc29yX3NoYXBlKHJldHB0ciwgdGhpcy5wdHIpOwogICAgICAgICAgICAgIHZhciByMCA9IGdldEludDMyTWVtb3J5MCgpW3JldHB0ciAvIDQgKyAwXTsKICAgICAgICAgICAgICB2YXIgcjEgPSBnZXRJbnQzMk1lbW9yeTAoKVtyZXRwdHIgLyA0ICsgMV07CiAgICAgICAgICAgICAgdmFyIHYwID0gZ2V0QXJyYXlVMzJGcm9tV2FzbTAocjAsIHIxKS5zbGljZSgpOwogICAgICAgICAgICAgIHdhc20uX193YmluZGdlbl9mcmVlKHIwLCByMSAqIDQpOwogICAgICAgICAgICAgIHJldHVybiB2MDsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgd2FzbS5fX3diaW5kZ2VuX2FkZF90b19zdGFja19wb2ludGVyKDE2KTsKICAgICAgICAgIH0KICAgICAgfQogIH0KICAvKioKICAqLwogIGNsYXNzIENvcmVUZW5zb3JWZWMgewoKICAgICAgc3RhdGljIF9fd3JhcChwdHIpIHsKICAgICAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoQ29yZVRlbnNvclZlYy5wcm90b3R5cGUpOwogICAgICAgICAgb2JqLnB0ciA9IHB0cjsKCiAgICAgICAgICByZXR1cm4gb2JqOwogICAgICB9CgogICAgICBfX2Rlc3Ryb3lfaW50b19yYXcoKSB7CiAgICAgICAgICBjb25zdCBwdHIgPSB0aGlzLnB0cjsKICAgICAgICAgIHRoaXMucHRyID0gMDsKCiAgICAgICAgICByZXR1cm4gcHRyOwogICAgICB9CgogICAgICBmcmVlKCkgewogICAgICAgICAgY29uc3QgcHRyID0gdGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTsKICAgICAgICAgIHdhc20uX193YmdfY29yZXRlbnNvcnZlY19mcmVlKHB0cik7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgdmFyIHJldCA9IHdhc20uY29yZXRlbnNvcnZlY19uZXcoKTsKICAgICAgICAgIHJldHVybiBDb3JlVGVuc29yVmVjLl9fd3JhcChyZXQpOwogICAgICB9CiAgICAgIC8qKgogICAgICAqIEBwYXJhbSB7Q29yZVRlbnNvcn0gdGVuc29yCiAgICAgICovCiAgICAgIHB1c2godGVuc29yKSB7CiAgICAgICAgICBfYXNzZXJ0Q2xhc3ModGVuc29yLCBDb3JlVGVuc29yKTsKICAgICAgICAgIHZhciBwdHIwID0gdGVuc29yLnB0cjsKICAgICAgICAgIHRlbnNvci5wdHIgPSAwOwogICAgICAgICAgd2FzbS5jb3JldGVuc29ydmVjX3B1c2godGhpcy5wdHIsIHB0cjApOwogICAgICB9CiAgICAgIC8qKgogICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICovCiAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICB2YXIgcmV0ID0gd2FzbS5jb3JldGVuc29ydmVjX2xlbmd0aCh0aGlzLnB0cik7CiAgICAgICAgICByZXR1cm4gcmV0ID4+PiAwOwogICAgICB9CiAgICAgIC8qKgogICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHgKICAgICAgKiBAcmV0dXJucyB7Q29yZVRlbnNvcn0KICAgICAgKi8KICAgICAgZ2V0KGlkeCkgewogICAgICAgICAgdmFyIHJldCA9IHdhc20uY29yZXRlbnNvcnZlY19nZXQodGhpcy5wdHIsIGlkeCk7CiAgICAgICAgICByZXR1cm4gQ29yZVRlbnNvci5fX3dyYXAocmV0KTsKICAgICAgfQogIH0KCiAgYXN5bmMgZnVuY3Rpb24gbG9hZChtb2R1bGUsIGltcG9ydHMpIHsKICAgICAgaWYgKHR5cGVvZiBSZXNwb25zZSA9PT0gJ2Z1bmN0aW9uJyAmJiBtb2R1bGUgaW5zdGFuY2VvZiBSZXNwb25zZSkgewogICAgICAgICAgaWYgKHR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhtb2R1bGUsIGltcG9ydHMpOwoKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpICE9ICdhcHBsaWNhdGlvbi93YXNtJykgewogICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIHdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIiwgZSk7CgogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBieXRlcyA9IGF3YWl0IG1vZHVsZS5hcnJheUJ1ZmZlcigpOwogICAgICAgICAgcmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJ5dGVzLCBpbXBvcnRzKTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG1vZHVsZSwgaW1wb3J0cyk7CgogICAgICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2UpIHsKICAgICAgICAgICAgICByZXR1cm4geyBpbnN0YW5jZSwgbW9kdWxlIH07CgogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICAgICAgICB9CiAgICAgIH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIGluaXQoaW5wdXQpIHsKICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIGlucHV0ID0gbmV3IFVSTCgndHJhY3Rqc19jb3JlX2JnLndhc20nLCAndW5rbm93bicudXJsKTsKICAgICAgfQogICAgICBjb25zdCBpbXBvcnRzID0ge307CiAgICAgIGltcG9ydHMud2JnID0ge307CiAgICAgIGltcG9ydHMud2JnLl9fd2JpbmRnZW5fb2JqZWN0X2Ryb3BfcmVmID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdGFrZU9iamVjdChhcmcwKTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmluZGdlbl9qc29uX3BhcnNlID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgdmFyIHJldCA9IEpTT04ucGFyc2UoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld181OWNiNzRlNDIzNzU4ZWRlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IEVycm9yKCk7CiAgICAgICAgICByZXR1cm4gYWRkSGVhcE9iamVjdChyZXQpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19zdGFja181NThiYTU5MTdiNDY2ZWRkID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcxKS5zdGFjazsKICAgICAgICAgIHZhciBwdHIwID0gcGFzc1N0cmluZ1RvV2FzbTAocmV0LCB3YXNtLl9fd2JpbmRnZW5fbWFsbG9jLCB3YXNtLl9fd2JpbmRnZW5fcmVhbGxvYyk7CiAgICAgICAgICB2YXIgbGVuMCA9IFdBU01fVkVDVE9SX0xFTjsKICAgICAgICAgIGdldEludDMyTWVtb3J5MCgpW2FyZzAgLyA0ICsgMV0gPSBsZW4wOwogICAgICAgICAgZ2V0SW50MzJNZW1vcnkwKClbYXJnMCAvIDQgKyAwXSA9IHB0cjA7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2Vycm9yXzRiYjZjMmE5NzQwNzEyOWEgPSBmdW5jdGlvbihhcmcwLCBhcmcxKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpKTsKICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgd2FzbS5fX3diaW5kZ2VuX2ZyZWUoYXJnMCwgYXJnMSk7CiAgICAgICAgICB9CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2dldF9iN2JiZjUwYWRjYzk0Mjk0ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKVthcmcxID4+PiAwXTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF81NTVmODM2NTY0YmYxNDhkID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX3N0cmluZ19uZXcgPSBmdW5jdGlvbihhcmcwLCBhcmcxKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0U3RyaW5nRnJvbVdhc20wKGFyZzAsIGFyZzEpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfaXNBcnJheV85MmQ0ZDE4MmY2ZWJjODk2ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IEFycmF5LmlzQXJyYXkoZ2V0T2JqZWN0KGFyZzApKTsKICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld18zZTFlZTc0NmZlMzA4YzlmID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBFcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCwgYXJnMSkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfaW5zdGFuY2VvZl9PYmplY3RfYjBjNTdiZjU2MjhiYzI2YyA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBnZXRPYmplY3QoYXJnMCkgaW5zdGFuY2VvZiBPYmplY3Q7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19rZXlzX2E1NmYzZjE1ODdlYjc3ZTkgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gT2JqZWN0LmtleXMoZ2V0T2JqZWN0KGFyZzApKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX3ZhbHVlc18zNGQ4ODI0ODVjODkwMjU4ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IE9iamVjdC52YWx1ZXMoZ2V0T2JqZWN0KGFyZzApKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2dldF84MDAwOThjOTgwYjMxZWEyID0gZnVuY3Rpb24oKSB7IHJldHVybiBoYW5kbGVFcnJvcihmdW5jdGlvbiAoYXJnMCwgYXJnMSkgewogICAgICAgICAgdmFyIHJldCA9IFJlZmxlY3QuZ2V0KGdldE9iamVjdChhcmcwKSwgZ2V0T2JqZWN0KGFyZzEpKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH0sIGFyZ3VtZW50cykgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfYnVmZmVyXzllMTg0ZDZmNzg1ZGU1ZWQgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApLmJ1ZmZlcjsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2JiODc2MDhlNWE1MDZiOWMgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IEludDhBcnJheShnZXRPYmplY3QoYXJnMCksIGFyZzEgPj4+IDAsIGFyZzIgPj4+IDApOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfbmV3XzA5M2RiNzJhMDMyMmZlZTYgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IEludDhBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0X2MwMjUzMGM3OTExMjNlYzIgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF9mYzAzMTRiYjcyNGYwZjk0ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lY2QxN2JmNzQ3YTZlN2I1ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBJbnQxNkFycmF5KGdldE9iamVjdChhcmcwKSwgYXJnMSA+Pj4gMCwgYXJnMiA+Pj4gMCk7CiAgICAgICAgICByZXR1cm4gYWRkSGVhcE9iamVjdChyZXQpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXdfYWNhNWFlYzkwODAyM2VjZSA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBuZXcgSW50MTZBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0X2MxNjBkNWE2ZDdmMzExZmYgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF9lMzQzZDBhMjczNmU4YTRiID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF8yNWVlZjJhMDMyNzcxMjI4ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBJbnQzMkFycmF5KGdldE9iamVjdChhcmcwKSwgYXJnMSA+Pj4gMCwgYXJnMiA+Pj4gMCk7CiAgICAgICAgICByZXR1cm4gYWRkSGVhcE9iamVjdChyZXQpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXdfMzVhOTQ4YjI5NWJhY2Y5YyA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBuZXcgSW50MzJBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0X2ZmMTIwZjFkOWNjNDkzYTYgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF9lNTc4MGM3OWVjNGZlZjU2ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lNTdhZDFmMmNlODEyYzAzID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBVaW50OEFycmF5KGdldE9iamVjdChhcmcwKSwgYXJnMSA+Pj4gMCwgYXJnMiA+Pj4gMCk7CiAgICAgICAgICByZXR1cm4gYWRkSGVhcE9iamVjdChyZXQpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXdfZTgxMDEzMTllNGNmOTVmYyA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBuZXcgVWludDhBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0X2U4YWU3YjI3MzE0ZThiOTggPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF8yZDU2Y2IzNzA3NWZjZmIxID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXdfNTQwMjZmMTk1YmQ5NDU5YSA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZ2V0T2JqZWN0KGFyZzApKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX3NldF8xMGY0NjJiOWQ2NjY3OWIxID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgZ2V0T2JqZWN0KGFyZzApLnNldChnZXRPYmplY3QoYXJnMSksIGFyZzIgPj4+IDApOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19sZW5ndGhfZjA2MmZmYjJmYTM1MjdlMSA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBnZXRPYmplY3QoYXJnMCkubGVuZ3RoOwogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfbmV3d2l0aGJ5dGVvZmZzZXRhbmRsZW5ndGhfOWYwNTU4ZjNjMTc0MGIwYSA9IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgIHZhciByZXQgPSBuZXcgVWludDE2QXJyYXkoZ2V0T2JqZWN0KGFyZzApLCBhcmcxID4+PiAwLCBhcmcyID4+PiAwKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld18wZjNlMWY2ODU0MzdmMzYzID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBVaW50MTZBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0XzQwZGMzYzNiZjIwOGM2MWUgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF81MDIzMGFkYzM2NmJhYjgyID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9kOTJkZmRkNzhjMzBjNTVhID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBVaW50MzJBcnJheShnZXRPYmplY3QoYXJnMCksIGFyZzEgPj4+IDAsIGFyZzIgPj4+IDApOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfbmV3XzcxZGUyMzY1ZDE3NTAzZTcgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE9iamVjdChhcmcwKSk7CiAgICAgICAgICByZXR1cm4gYWRkSGVhcE9iamVjdChyZXQpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19zZXRfNGVkMjJlYmQ4ZTExMjQ0ZSA9IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgICAgICAgIGdldE9iamVjdChhcmcwKS5zZXQoZ2V0T2JqZWN0KGFyZzEpLCBhcmcyID4+PiAwKTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfbGVuZ3RoXzdiNDEwZTQ5MDkyN2UzZTIgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApLmxlbmd0aDsKICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld3dpdGhieXRlb2Zmc2V0YW5kbGVuZ3RoX2FiZmMyNGM1N2ZkMDhlNmQgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShnZXRPYmplY3QoYXJnMCksIGFyZzEgPj4+IDAsIGFyZzIgPj4+IDApOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfbmV3X2Q2OWJiZTNkYjQ4NWQ0NTcgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShnZXRPYmplY3QoYXJnMCkpOwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193Ymdfc2V0XzBmYTU2Y2E3OTJkNjU4NjEgPSBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyKSB7CiAgICAgICAgICBnZXRPYmplY3QoYXJnMCkuc2V0KGdldE9iamVjdChhcmcxKSwgYXJnMiA+Pj4gMCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2xlbmd0aF81MjNjZjRhMDEwNDFhN2E2ID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19uZXd3aXRoYnl0ZW9mZnNldGFuZGxlbmd0aF9lMThjYWY4MDk1NzI1MjZlID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBGbG9hdDY0QXJyYXkoZ2V0T2JqZWN0KGFyZzApLCBhcmcxID4+PiAwLCBhcmcyID4+PiAwKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX25ld182M2I2NWE0NmFmN2RkMTZhID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IG5ldyBGbG9hdDY0QXJyYXkoZ2V0T2JqZWN0KGFyZzApKTsKICAgICAgICAgIHJldHVybiBhZGRIZWFwT2JqZWN0KHJldCk7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX3NldF9iZDk1MWUxYjMzNjM3NWM2ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSwgYXJnMikgewogICAgICAgICAgZ2V0T2JqZWN0KGFyZzApLnNldChnZXRPYmplY3QoYXJnMSksIGFyZzIgPj4+IDApOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19sZW5ndGhfYjYxZDYxZGU3NjRlOWU1ZiA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBnZXRPYmplY3QoYXJnMCkubGVuZ3RoOwogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfaW5zdGFuY2VvZl9JbnQ4QXJyYXlfNDQyYjVjODcwZTJlY2JlMyA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBnZXRPYmplY3QoYXJnMCkgaW5zdGFuY2VvZiBJbnQ4QXJyYXk7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19pbnN0YW5jZW9mX0ludDE2QXJyYXlfY2JiZjBkZTMwNDdkMTdiNCA9IGZ1bmN0aW9uKGFyZzApIHsKICAgICAgICAgIHZhciByZXQgPSBnZXRPYmplY3QoYXJnMCkgaW5zdGFuY2VvZiBJbnQxNkFycmF5OwogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmdfaW5zdGFuY2VvZl9JbnQzMkFycmF5XzQ0Mzc4M2MwMDcwOTI3MzggPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApIGluc3RhbmNlb2YgSW50MzJBcnJheTsKICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV8wNDkwOTIzOWUxNDcwYmUxID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19pbnN0YW5jZW9mX1VpbnQ4Q2xhbXBlZEFycmF5X2YwOTI1Y2U2NWY4MGY2ZjEgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19pbnN0YW5jZW9mX1VpbnQxNkFycmF5Xzc0ZGFiM2I5MmU3NWNjYzUgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApIGluc3RhbmNlb2YgVWludDE2QXJyYXk7CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diZ19pbnN0YW5jZW9mX0Zsb2F0MzJBcnJheV9mYWVhZmYxOGZhMDMyNWQxID0gZnVuY3Rpb24oYXJnMCkgewogICAgICAgICAgdmFyIHJldCA9IGdldE9iamVjdChhcmcwKSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheTsKICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgIH07CiAgICAgIGltcG9ydHMud2JnLl9fd2JnX2luc3RhbmNlb2ZfRmxvYXQ2NEFycmF5XzFiODk1YTM5ZTNkYmU0ZjEgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB2YXIgcmV0ID0gZ2V0T2JqZWN0KGFyZzApIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5OwogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmluZGdlbl9udW1iZXJfZ2V0ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0KGFyZzEpOwogICAgICAgICAgdmFyIHJldCA9IHR5cGVvZihvYmopID09PSAnbnVtYmVyJyA/IG9iaiA6IHVuZGVmaW5lZDsKICAgICAgICAgIGdldEZsb2F0NjRNZW1vcnkwKClbYXJnMCAvIDggKyAxXSA9IGlzTGlrZU5vbmUocmV0KSA/IDAgOiByZXQ7CiAgICAgICAgICBnZXRJbnQzMk1lbW9yeTAoKVthcmcwIC8gNCArIDBdID0gIWlzTGlrZU5vbmUocmV0KTsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmluZGdlbl9zdHJpbmdfZ2V0ID0gZnVuY3Rpb24oYXJnMCwgYXJnMSkgewogICAgICAgICAgY29uc3Qgb2JqID0gZ2V0T2JqZWN0KGFyZzEpOwogICAgICAgICAgdmFyIHJldCA9IHR5cGVvZihvYmopID09PSAnc3RyaW5nJyA/IG9iaiA6IHVuZGVmaW5lZDsKICAgICAgICAgIHZhciBwdHIwID0gaXNMaWtlTm9uZShyZXQpID8gMCA6IHBhc3NTdHJpbmdUb1dhc20wKHJldCwgd2FzbS5fX3diaW5kZ2VuX21hbGxvYywgd2FzbS5fX3diaW5kZ2VuX3JlYWxsb2MpOwogICAgICAgICAgdmFyIGxlbjAgPSBXQVNNX1ZFQ1RPUl9MRU47CiAgICAgICAgICBnZXRJbnQzMk1lbW9yeTAoKVthcmcwIC8gNCArIDFdID0gbGVuMDsKICAgICAgICAgIGdldEludDMyTWVtb3J5MCgpW2FyZzAgLyA0ICsgMF0gPSBwdHIwOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX2RlYnVnX3N0cmluZyA9IGZ1bmN0aW9uKGFyZzAsIGFyZzEpIHsKICAgICAgICAgIHZhciByZXQgPSBkZWJ1Z1N0cmluZyhnZXRPYmplY3QoYXJnMSkpOwogICAgICAgICAgdmFyIHB0cjAgPSBwYXNzU3RyaW5nVG9XYXNtMChyZXQsIHdhc20uX193YmluZGdlbl9tYWxsb2MsIHdhc20uX193YmluZGdlbl9yZWFsbG9jKTsKICAgICAgICAgIHZhciBsZW4wID0gV0FTTV9WRUNUT1JfTEVOOwogICAgICAgICAgZ2V0SW50MzJNZW1vcnkwKClbYXJnMCAvIDQgKyAxXSA9IGxlbjA7CiAgICAgICAgICBnZXRJbnQzMk1lbW9yeTAoKVthcmcwIC8gNCArIDBdID0gcHRyMDsKICAgICAgfTsKICAgICAgaW1wb3J0cy53YmcuX193YmluZGdlbl90aHJvdyA9IGZ1bmN0aW9uKGFyZzAsIGFyZzEpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihnZXRTdHJpbmdGcm9tV2FzbTAoYXJnMCwgYXJnMSkpOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX3JldGhyb3cgPSBmdW5jdGlvbihhcmcwKSB7CiAgICAgICAgICB0aHJvdyB0YWtlT2JqZWN0KGFyZzApOwogICAgICB9OwogICAgICBpbXBvcnRzLndiZy5fX3diaW5kZ2VuX21lbW9yeSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHJldCA9IHdhc20ubWVtb3J5OwogICAgICAgICAgcmV0dXJuIGFkZEhlYXBPYmplY3QocmV0KTsKICAgICAgfTsKCiAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8ICh0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3QpIHx8ICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nICYmIGlucHV0IGluc3RhbmNlb2YgVVJMKSkgewogICAgICAgICAgaW5wdXQgPSBmZXRjaChpbnB1dCk7CiAgICAgIH0KCgoKICAgICAgY29uc3QgeyBpbnN0YW5jZSwgbW9kdWxlIH0gPSBhd2FpdCBsb2FkKGF3YWl0IGlucHV0LCBpbXBvcnRzKTsKCiAgICAgIHdhc20gPSBpbnN0YW5jZS5leHBvcnRzOwogICAgICBpbml0Ll9fd2JpbmRnZW5fd2FzbV9tb2R1bGUgPSBtb2R1bGU7CgogICAgICByZXR1cm4gd2FzbTsKICB9CgogIGZ1bmN0aW9uIHdhc20kMShpbXBvcnRzKXtyZXR1cm4gX2xvYWRXYXNtTW9kdWxlKDAsICdBR0Z6YlFFQUFBQUJod2QwWUFKL2Z3QmdBMzkvZndCZ0FYOEFZQUovZndGL1lBUi9mMzkvQUdBRGYzOS9BWDlnQVg4QmYyQUJmd0YrWUFWL2YzOS9md0JnQm45L2YzOS9md0JnQjM5L2YzOS9mMzhBWUFSL2YzOS9BWDlnQm45L2YzOS9md0YvWUFWL2YzOS9md0YvWUFOL2YzOEJmbUFDZjM4QmZtQUlmMzkvZjM5L2YzOEFZQU4vZjM0QmYyQUNmMzRBWUFsL2YzOS9mMzkvZjM4QVlBQUJmMkFEZjM1L0FHQUJmUUY5WUFSL2ZuOS9BR0FDZjM0QmYyQUJmQUY4WUFOL2YzNEFZQUovZlFCZ0MzOS9mMzkvZjM5L2YzOS9BWDlnQkg5L2ZuNEJmbUFKZjM5L2YzOS9mMzkvQVg5Z0FuOS9BWDFnQVg4QmZXQUJmd0Y4WUFBQVlBVi9mMzkvZlFCZ0EzOStmZ0JnQW45OEFHQUVmMzkvZmdGL1lBUi9mMzUrQVg5Z0FuMTlBWDFnQW54OEFYeGdCSDkrZm44QVlBTi9mWDBBWUFSL2YzOS9BWDVnQW45L0FYeGdBMzk5ZndCZ0EzOStmd0YvWUFwL2YzOS9mMzkvZjM5L0FHQUhmMzkvZjM5OWZ3QmdCWDkrZjM5L0FHQUZmMzUrZjM4QVlBUi9mMzUvQVg5Z0JYOS9mbjUvQVg5Z0FYMEJmMkFDZm44QmZtQUxmMzkvZjM5L2YzOS9mMzhBWUF4L2YzOS9mMzkvZjM5L2YzOEFZQkYvZjM5L2YzOS9mMzkvZjM5L2YzOS9md0JnQ0g5L2YzOS9mMzk5QUdBR2YzOS9mMzkrQUdBRWYzOS9mZ0JnQlg5L2YzMS9BR0FFZjM5K2Z3QmdBMzkvZlFCZ0EzOS9mQUJnQW4xL0FHQUhmMzkvZjM5L2Z3Ri9ZQWgvZjM5L2YzOS9md0YvWUFSL2ZYOS9BWDlnQkg5OGYzOEJmMkFCZmdGL1lBSitmd0YvWUFGOEFYOWdCWDkvZjM5L0FYNWdCbjkvZjM5L2Z3RitZQUovZmdGK1lBSitmd0Y5WUExL2YzOS9mMzkvZjM5L2YzOS9BR0FRZjM5L2YzOS9mMzkvZjM5L2YzOS9md0JnQ1g5L2YzOS9mMzUrZmdCZ0JYOS9mMzkrQUdBSGYzOS9mMzEvZndCZ0JYOS9mMzUvQUdBR2YzOS9mbjkvQUdBRmYzOS9mbjRBWUFSL2YzOTlBR0FFZjM5L2ZBQmdCWDkvZm45L0FHQUZmMzkrZm44QVlBVi9mMzEvZndCZ0JYOS9mWDk5QUdBRmYzOThmMzhBWUFSL2ZuNStBR0FFZjMxL2Z3QmdCWDk5ZjM5L0FHQURmM3gvQUdBRWYzeC9md0JnQkg5K2YzOEJmMkFEZjMxOUFYOWdBMzUvZndGL1lBQUJmbUFGZjM5L2ZuOEJmbUFEZjM5K0FYNWdCSDkvZlg4QmZtQUVmMzEvZndGK1lBUitmbjkvQVg1Z0EzOS9md0Y5WUFSL2YzNTlBWDFnQTM5L2ZRRjlZQUo5ZndGOVlBTi9mMzhCZkdBRWYzOStmQUY4WUFOL2Yzd0JmR0FDZm44QmZHQURmSHgvQVh3Q25STkFBM2RpWnhwZlgzZGlhVzVrWjJWdVgyOWlhbVZqZEY5a2NtOXdYM0psWmdBQ0EzZGlaeFZmWDNkaWFXNWtaMlZ1WDJwemIyNWZjR0Z5YzJVQUF3TjNZbWNhWDE5M1ltZGZibVYzWHpVNVkySTNOR1UwTWpNM05UaGxaR1VBRkFOM1ltY2NYMTkzWW1kZmMzUmhZMnRmTlRVNFltRTFPVEUzWWpRMk5tVmtaQUFBQTNkaVp4eGZYM2RpWjE5bGNuSnZjbDgwWW1JMll6SmhPVGMwTURjeE1qbGhBQUFEZDJKbkdsOWZkMkpuWDJkbGRGOWlOMkppWmpVd1lXUmpZemswTWprMEFBTURkMkpuSFY5ZmQySm5YMnhsYm1kMGFGODFOVFZtT0RNMk5UWTBZbVl4TkRoa0FBWURkMkpuRlY5ZmQySnBibVJuWlc1ZmMzUnlhVzVuWDI1bGR3QURBM2RpWng1ZlgzZGlaMTlwYzBGeWNtRjVYemt5WkRSa01UZ3laalpsWW1NNE9UWUFCZ04zWW1jYVgxOTNZbWRmYm1WM1h6TmxNV1ZsTnpRMlptVXpNRGhqT1dZQUF3TjNZbWNvWDE5M1ltZGZhVzV6ZEdGdVkyVnZabDlQWW1wbFkzUmZZakJqTlRkaVpqVTJNamhpWXpJMll3QUdBM2RpWnh0ZlgzZGlaMTlyWlhselgyRTFObVl6WmpFMU9EZGxZamMzWlRrQUJnTjNZbWNkWDE5M1ltZGZkbUZzZFdWelh6TTBaRGc0TWpRNE5XTTRPVEF5TlRnQUJnTjNZbWNhWDE5M1ltZGZaMlYwWHpnd01EQTVPR001T0RCaU16RmxZVElBQXdOM1ltY2RYMTkzWW1kZlluVm1abVZ5WHpsbE1UZzBaRFptTnpnMVpHVTFaV1FBQmdOM1ltY3hYMTkzWW1kZmJtVjNkMmwwYUdKNWRHVnZabVp6WlhSaGJtUnNaVzVuZEdoZlltSTROell3T0dVMVlUVXdObUk1WXdBRkEzZGlaeHBmWDNkaVoxOXVaWGRmTURrelpHSTNNbUV3TXpJeVptVmxOZ0FHQTNkaVp4cGZYM2RpWjE5elpYUmZZekF5TlRNd1l6YzVNVEV5TTJWak1nQUJBM2RpWngxZlgzZGlaMTlzWlc1bmRHaGZabU13TXpFMFltSTNNalJtTUdZNU5BQUdBM2RpWnpGZlgzZGlaMTl1WlhkM2FYUm9ZbmwwWlc5bVpuTmxkR0Z1Wkd4bGJtZDBhRjlsWTJReE4ySm1OelEzWVRabE4ySTFBQVVEZDJKbkdsOWZkMkpuWDI1bGQxOWhZMkUxWVdWak9UQTRNREl6WldObEFBWURkMkpuR2w5ZmQySm5YM05sZEY5ak1UWXdaRFZoTm1RM1pqTXhNV1ptQUFFRGQySm5IVjlmZDJKblgyeGxibWQwYUY5bE16UXpaREJoTWpjek5tVTRZVFJpQUFZRGQySm5NVjlmZDJKblgyNWxkM2RwZEdoaWVYUmxiMlptYzJWMFlXNWtiR1Z1WjNSb1h6STFaV1ZtTW1Fd016STNOekV5TWpnQUJRTjNZbWNhWDE5M1ltZGZibVYzWHpNMVlUazBPR0l5T1RWaVlXTm1PV01BQmdOM1ltY2FYMTkzWW1kZmMyVjBYMlptTVRJd1pqRmtPV05qTkRrellUWUFBUU4zWW1jZFgxOTNZbWRmYkdWdVozUm9YMlUxTnpnd1l6YzVaV00wWm1WbU5UWUFCZ04zWW1jeFgxOTNZbWRmYm1WM2QybDBhR0o1ZEdWdlptWnpaWFJoYm1Sc1pXNW5kR2hmWlRVM1lXUXhaakpqWlRneE1tTXdNd0FGQTNkaVp4cGZYM2RpWjE5dVpYZGZaVGd4TURFek1UbGxOR05tT1RWbVl3QUdBM2RpWnhwZlgzZGlaMTl6WlhSZlpUaGhaVGRpTWpjek1UUmxPR0k1T0FBQkEzZGlaeDFmWDNkaVoxOXNaVzVuZEdoZk1tUTFObU5pTXpjd056Vm1ZMlppTVFBR0EzZGlaeHBmWDNkaVoxOXVaWGRmTlRRd01qWm1NVGsxWW1RNU5EVTVZUUFHQTNkaVp4cGZYM2RpWjE5elpYUmZNVEJtTkRZeVlqbGtOalkyTnpsaU1RQUJBM2RpWngxZlgzZGlaMTlzWlc1bmRHaGZaakEyTW1abVlqSm1ZVE0xTWpkbE1RQUdBM2RpWnpGZlgzZGlaMTl1WlhkM2FYUm9ZbmwwWlc5bVpuTmxkR0Z1Wkd4bGJtZDBhRjg1WmpBMU5UaG1NMk14TnpRd1lqQmhBQVVEZDJKbkdsOWZkMkpuWDI1bGQxOHdaak5sTVdZMk9EVTBNemRtTXpZekFBWURkMkpuR2w5ZmQySm5YM05sZEY4ME1HUmpNMk16WW1ZeU1EaGpOakZsQUFFRGQySm5IVjlmZDJKblgyeGxibWQwYUY4MU1ESXpNR0ZrWXpNMk5tSmhZamd5QUFZRGQySm5NVjlmZDJKblgyNWxkM2RwZEdoaWVYUmxiMlptYzJWMFlXNWtiR1Z1WjNSb1gyUTVNbVJtWkdRM09HTXpNR00xTldFQUJRTjNZbWNhWDE5M1ltZGZibVYzWHpjeFpHVXlNelkxWkRFM05UQXpaVGNBQmdOM1ltY2FYMTkzWW1kZmMyVjBYelJsWkRJeVpXSmtPR1V4TVRJME5HVUFBUU4zWW1jZFgxOTNZbWRmYkdWdVozUm9YemRpTkRFd1pUUTVNRGt5TjJVelpUSUFCZ04zWW1jeFgxOTNZbWRmYm1WM2QybDBhR0o1ZEdWdlptWnpaWFJoYm1Sc1pXNW5kR2hmWVdKbVl6STBZelUzWm1Rd09HVTJaQUFGQTNkaVp4cGZYM2RpWjE5dVpYZGZaRFk1WW1KbE0yUmlORGcxWkRRMU53QUdBM2RpWnhwZlgzZGlaMTl6WlhSZk1HWmhOVFpqWVRjNU1tUTJOVGcyTVFBQkEzZGlaeDFmWDNkaVoxOXNaVzVuZEdoZk5USXpZMlkwWVRBeE1EUXhZVGRoTmdBR0EzZGlaekZmWDNkaVoxOXVaWGQzYVhSb1lubDBaVzltWm5ObGRHRnVaR3hsYm1kMGFGOWxNVGhqWVdZNE1EazFOekkxTWpabEFBVURkMkpuR2w5ZmQySm5YMjVsZDE4Mk0ySTJOV0UwTm1GbU4yUmtNVFpoQUFZRGQySm5HbDlmZDJKblgzTmxkRjlpWkRrMU1XVXhZak16TmpNM05XTTJBQUVEZDJKbkhWOWZkMkpuWDJ4bGJtZDBhRjlpTmpGa05qRmtaVGMyTkdVNVpUVm1BQVlEZDJKbksxOWZkMkpuWDJsdWMzUmhibU5sYjJaZlNXNTBPRUZ5Y21GNVh6UTBNbUkxWXpnM01HVXlaV05pWlRNQUJnTjNZbWNzWDE5M1ltZGZhVzV6ZEdGdVkyVnZabDlKYm5ReE5rRnljbUY1WDJOaVltWXdaR1V6TURRM1pERTNZalFBQmdOM1ltY3NYMTkzWW1kZmFXNXpkR0Z1WTJWdlpsOUpiblF6TWtGeWNtRjVYelEwTXpjNE0yTXdNRGN3T1RJM016Z0FCZ04zWW1jc1gxOTNZbWRmYVc1emRHRnVZMlZ2Wmw5VmFXNTBPRUZ5Y21GNVh6QTBPVEE1TWpNNVpURTBOekJpWlRFQUJnTjNZbWN6WDE5M1ltZGZhVzV6ZEdGdVkyVnZabDlWYVc1ME9FTnNZVzF3WldSQmNuSmhlVjltTURreU5XTmxOalZtT0RCbU5tWXhBQVlEZDJKbkxWOWZkMkpuWDJsdWMzUmhibU5sYjJaZlZXbHVkREUyUVhKeVlYbGZOelJrWVdJellqa3laVGMxWTJOak5RQUdBM2RpWnk1ZlgzZGlaMTlwYm5OMFlXNWpaVzltWDBac2IyRjBNekpCY25KaGVWOW1ZV1ZoWm1ZeE9HWmhNRE15TldReEFBWURkMkpuTGw5ZmQySm5YMmx1YzNSaGJtTmxiMlpmUm14dllYUTJORUZ5Y21GNVh6RmlPRGsxWVRNNVpUTmtZbVUwWmpFQUJnTjNZbWNWWDE5M1ltbHVaR2RsYmw5dWRXMWlaWEpmWjJWMEFBQURkMkpuRlY5ZmQySnBibVJuWlc1ZmMzUnlhVzVuWDJkbGRBQUFBM2RpWnhkZlgzZGlhVzVrWjJWdVgyUmxZblZuWDNOMGNtbHVad0FBQTNkaVp4QmZYM2RpYVc1a1oyVnVYM1JvY205M0FBQURkMkpuRWw5ZmQySnBibVJuWlc1ZmNtVjBhSEp2ZHdBQ0EzZGlaeEZmWDNkaWFXNWtaMlZ1WDIxbGJXOXllUUFVQTRSWWdsZ0JFQUVFRUFFQkFRUUVBUUVLQUU4SUN3c0xBUXNMRUFRS0N3UUZCUUVMQ3dzTEJRVUtDQXNMQndBQkFSQUJCQXNMQVFVRkFRUUpBUVVGQkFvRkJRRUxDd29GQlFVRkJRVUZCUW9BQlFVQ0FnSUNCUVVDQWdnRkJRRUtBQUlGQlFvQk9nVUtBQUFGQUFFREFRa0VCQVVGRXdNRkJRb0tDZ01EQkFNSkNBRUJFQW9CT2drR0JBUUVCQVFFQkFRRUJBUUVEUVFRQVFFS0FRcE9CQWdLQVFvS0V3RUJPQVFCQkFVRUJBUUVDd3NMQVJ3Y0hCd2NIQVlFQ2dRQUJBSUNDQUFDQ3dRREFRZ0tDZ0VFQVFNSUF3Z0RBUU1EQkFRRUJBUUVCQVFFQkFRREF3QURBd01EQXdNREF3TURBd01EQXdVQUhCd2NCUVVCQkFRQkFRRUVBUVFFQkFRRkJSTU5BQVFLQUFFQUFBQUlBQUFBQUFBQUNBQUFBQUFNQVFrRUJBTUlBU2tFQkFRRUJBME5CQUVBQ2cwTkNBZ05CQWdLRUFRS0FBZ0VBUWdCQ2dvS0pRb0ZBd0FBQUFBRUFRZ0JBUUFBQXdRQUJBb0VBQUFFQUFBQkFpZ0VBQUFBQ2dFS0FBQUFCQVFFQkFRRUJBUUVCQVFFQkFRRUNRa0tCQWtCQ2drS0Nna0JDZ2tLQ2drSkNRb0pDZ2tLQ0FrQUFBQUFBQUFBQUFBQUFBQUFBQUFFRUFvS1Vnb0tDZ29LQVFrS0NRa0pDUW9UQVFFQkJBUUVCQVFFQkFnS0Nnb0FDZ2tNQ1FrQkRBb0lEQUVFQkFvSUNRa0lBQWdGQkFnSkNRZ0lFQVFLQ1F3SkNnb0tDZ29JQ1ZRSUNRa0tDd1lCQVJBUUFRby9DZ1JUQVFvTEFROEJDZ0VCQVFFQkRBd0tBUVVBQUFBQkVBQUtDZ0FFQVFBRUNRQUtBUVVHQVFvSkNnb0VBd1FFQkFvS0FRZ0FCQVFCQkFrQkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFvRUFRRUVFd2dJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lSZ1FJQ0FnSUNBZ0JEZ3RGQlFVRkJRa0pDUVFCQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lBUWtCQ0FrTkNBa0pBUWdJQ0FnSUNBZ0lDQWdJQ0FnS0NRUUJCUVVGQlFrSkJRUUVDUUFhQWhZQUFBQUZBQUVXRFFrQkNBa0lDQWdBQVFBTkRRME5EUTBGRFEwTEN3c0VBQUVMQ2dFRUFRUUpDZ1FBQUFBQUJBa05BQTBFQ2dCR0FBRUpEUTBORFEwRkRVVUFEaE1CQ1FBRUNBZ0ZBUVFDQUFnQUFBQUFBQVFFRUFBQkFRUUVCQUVFQVFFRUFRUUJBUUVCQVFFQkFRQUFBUVVCQkE4QkZnb0VBUUVBQlFvRUJCQUJBQVVLRFFFQUVBVUlBUUVBQVFFTEFRa05BUW9BQkFFQUFBRUFBUVFFQUFBQUFBWUFDZ0VRQ0F3SkJBa1RDQWdJQUFRQUFBc0JDZ29FQVFBQUJBRUFDZ0FGQVFRRUFBRUFBQUFBQUFBQUFBQUFBQWdURXhNVEFBQUFEUWdLQVFFQkNRRURBUWdKQ1FZQUNnQUlDZ0VEQVFBS0NnQUFVUWtMQlFRQkFBa0pDUUVCQUFBQUFBQUFBUUVLQkFvQUFBY01DZ2tHQUFvQUFBUUFBQW9CQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQkFBUUFCQUFBTlFnQUNpMEVCQUVCQUFFQUFBQUVDQThMTUI4QUFRQUFBQUFBQUFBQUFBQUFBd1FFQ0FFRUFBd0VBQUFLQUFBQUFBQUJBUUFBQUFBQkFBQUFDZ1FaQVFVS0RnQUVDQUVBQUFBSkRBc0JBUUVQQUFVQkJRRUFCQVFFQVFFWkNnUUJPQUFFQ2dBQkFBUUVDZ1FCQUFRRURRQUZBUUFBQUFnRUJRRUJBQUVCQVFFQUJRa0dCUUFCQUFBQUJBUUVCQUVGQUFNQUJBRVdCZ01MSHdFQkFRUVpBUVFFQXdNUExSOEVBQUFBQkFRRENnUUFBQUFBQVE4QkFBQUVCQUVEQUFFRUFRQUpCZ1FBQkFBQUFBRUxDZ0VBQWdNQUFBRUVBQTRBQVFFRUJRUWRBQU1FQVFFREFBQU9BQUFBQ0FFQUJBQUlBQUFBQUFBQkFBSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQVFFQkFBRUJBQUFBQUFnQkFRRUlBQVVFQkFRRUJBTUFBQUFNQWdBQkFBUUJBUVFFQUFVTEJBZ0FBeGtBQVFJQUFBWUFBQUVBQUFBQUNCRUFBQUFJQUFBR0FRRUFBQUFCQUFFQkNRRUFBQUlDQUFBT0FRQUVCQUVCQkFBQUFRQUJBZ0lDQWdJQ0FnSUNBZ0lCQXdRQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUU1BQ3dRRUJBRUpDQXdBQXdrQUJBQUJGZ0VBQmdFQkFRRUJBUUVCQVFNREtRTUVDd0VBQUFBQUFBRURBQUFEQXdBQkFRRUFBQUFNQVE4T0FBQUFBQUFBQkFBS0JBQURBd3dCQUFFQUFBRUtCQUVCQVFFQkF3UUVDZ0VCQXdBaUtBOEVCQVVFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkE4QkFBTURBd01BQVFRTUFBQUFBQUVQQUFFQUJBUUVCQUFMQVFFQUFRQUJBQUVPQUFBQkJBUUFBUVlEQVFFQ0FRRUJBUUVCQVFFQkFRRUJBUUVBQVFFQkFRRUJBUUVCQVFFQkFROE9BQUFQR1FFTUFBRUFBQk1BQkFRRUJBUUVCQXNNQUFFQkFBQUFBQUFCQVFBQUJnTUFBQVVBQVFBQkN3c0FBQWtEQUE0QkNnQUJBZ0lDQWdJQ0FnSUJBd0FQQVFRQkFROERBQUFCQVFFRENnTURBZ0FCQVFBQ0JBZ0JBQUFBQWdKUUFBQUlDQWdJQ0FnSURRRUJBUUVCQVFFQkFRTUJBUUVCQVFFQUFBRUJCQUlDQWdJQ0FnSUNBZ0lDQWdJQUFnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUJBUUVCQVFFQkFSY0JBUUVCQlFVQkZ4Y0ZCUUFMRndBQUFRRUJBUUVCQVFFQkFRRUJBUUVCQkFNRkJRQUxBd0VCQVFFQkFRRUJBUUVEQkFFQkFRQUJBQUFBQVFFQkFBQUFBQUFBQUFBQkFBRUFCZ1lBQjNGdEVSY0FBQUFKQUFBQkZ4Y1pEUUVSREFVQkFRSVhBMG9ERHdNQUZ4Y0VEZ0FBQVFFQkFBQURHUUFBQUFBQUN3TUlYd0FBQXdRQUFBQUFBQUVFQVFzS0FRd0FBUU1FQkFReUFROHlCRElEQUFRRUJBUUVCQmNJQ0FnQUZ3QUFBUVlYQUFFTUFRQUFFVlVGQlFVRUJBUUpMQUFBR1FBQkFBQUVMQUVCQVFFQkN3QUVGd0FBQUFBQkFRRUZCUU1GQXdVRkJRVUJBUUFCQUVzQUFBQUFBQUFBQUFBQUFBQUtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVVBQUFBQUFRQUFBQUFBQUFBRUFBQURKZzBBQVFBR0F3QUFBQUVHQUFBQUJRVUZCUVVBQVFzQkFBQU1BQUVCQWdJQkFBRUdBQU1EQXdVREJRTUZBd1VEQXdBQUF3UUNDd1FHQmdJQ0FnSUNBZ0lDQWdJQ0JFb0FCUVVQQVFORERSWUxCQVFORFFBUERBd0dCZ0VCQXdBREFpd0dBQU1EQXdNREF3TURBd01EQXdNREF3UUFBQUFBQUFBQUFBQUFBQUFJQ0NBZ0J3WUdJUWNoQVFFRUFBa0FBQVFFQkFBQkFBQUFBUU1BQUFBQUFBSUNBUUVHQmdFREFBUUJIeDhBQVFRQUF3WUFBQUFBQUFBREFBTUJEZ2NHQmlFR0JpQUdCZ1lKQUFBQUFBQUJBUUVCQXdFQkRBc0xDQWdJQ0FnSUNBZ0lCQU1FQUFnQkFRZ0JCUVVBQkFBQUFRRUJBUUVCQVFFQUFRRUJCQVFFQkFRRUJBUUNCQUFMQlF3QkF3RUJBd0VCQkFRQkJBUUdCZ1lCQkFBR0RFc0JBUXdCQkFFQkFRRUVCQVFFQkFRRUJBUUVCQVFFQkFRQUFRRVdBUUVCQVFFQkFBRUJEQVFFQkFFQUFRRUJBUThQQVFFQkFRRVBBUUVCQVFzQUFBcHpFUU1MQUFVTENBQURDUUFEQlFzRkJRME1Bd3dNREF3RkFRRUVCQVFFQlFBREFBVUFIUUFCQUFBTERBZ0lBd2dBQ3dZQUFRRUVDQUVHQkFNTUFnQUFDUWtKQ1FrSkNRa0pBUUVCQVFRR1pBQU1CUWdBQXdRRUJBUUVCQUFCQkFBRUFBUUVBUVFEQmdRRUJBUUVBUUVFQkFJREF3OFpBd3NCQkFRQUJBUUVCQUVCQ0FNQkF3TUREQU1HQUFNREJRSUNBZ0lDQWdJQ0FCWUFCQWdBQXdRQUF3UUFBd01EQXc4Q0FBQUJDZ1FBQkE4UER3OFBEdzhQRHc4UER3RUJBUU1CQUFFQUFBd0JBUUVBQUFBQUF3OFBEdzhEQWdzRUJBRUJBQUVDQWdFQUJRQUdCUXNBQUFFQUFBRUFDQVVCREJRSUJRRUJDQVlBQXdBTUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUVFERFFFQkJBUURCQVFFQkFRRUJBUURBZ0FJREMwQkFBa0FDQUFFQVFFQkFRRUJBUUVBQ0FFQkFRQUJBUUVCTFI4QkFBQUFBUUVERVF3QUFRQUVCZ01JQkFFQkFRUUVBQUVCSHdFQkFRUUVCQUVFQUFvQUZBVUJCQVFOQkNBaEJBWUtDZ1FCREFBQUFBd0NDd0VDQVFRQUFnSUNBZ0lDQWdJQ0FBQUFDeG9CTHd3SkF3UVFCQVFKQ1FrS0NRa0dBQUVCQUFBRUFBRUFBQUFBQUFFQ0FnRUJBUUVCQVFBRUFBRUJKd0FCRUFnQUFRRURCd0FCQUFRRUJBUUVCQVFFQkFFQUFRQUVBQUFKY2dFQkFRRUJBUUVCQVFBQkNnZ0FEQUFGQUFFTUFBQU1CUVV2QVFFQkNBSUVBUUVCU1FNRkN3UUVBQVFBRVFzTUFBVURBQXdBQVFVQkFBQUdBUUFCQVFBQ0FRWUFDUW9CREFRQUF3QUFCQUFFQUFBR0FBZ0FBZ2dLQUFNQ0F3RUpBUUFNQ3dFQkFnQUFBQVFFQXdBQUN3QUVBUWdEQVFFQkF3QUJBUVVGQkFVRkFRTUJBQUlEQlFVRkJRa0hOZ01GQlFVQkFRRUJBUUVGQlFnQUFBQUVDQlFOQkFRSUJBQUFBUXdEQUFZQUFRRURDZ29FQlM4RUJnRUJBQU1BQVFFQUFRUUtBUUFCQVFnQkF3QUFDQUVJRlFRQUFRRUVCUWtBQUFBSkFnQUFBQWdJQUFFQUFRRUJBUUVCQVFzTEFBRUJBUVFBQVE0QkFBQUFBQUFCTFI4RUZBMElBQUVBQkFFREZnRUFBQU1EQXdNREJBUUVCQVFFQkFRQ0FRRUJBUUVCVFFrRUFRRUJCQVFCWWdFUUFRUUJRd0VCQVE0QUFBQWxBUUlCQUFBQUFBQUNBd01BQUFFRUJBWUdBd1FEQXdNQkFBRUlDQUVNQVFNV0FBVUZCQUVGQlFBTUFRTUxCUUFCRFFFTEFBUUtBZ1lCQUFBQUFBd0FBQUFGQlFFQUNBQUVDZ0FEQUFRQkFBWUFBd01iSlFNQUFBQU1Bd01HSmdvQUF3UUVCQVFFQXdBRUJBWUVBd0FJRGdNQUFBZ0lDQUVCQUFJSUFRVUJDZ3NLQXdNQkJBb0VDZ0FBQTBGQUdnRUJBUUVCQVFFQkJBUURQQVFBQUFBRUJBQUFBQUFBREFFQUFBQUFCZ0VCQWdBRUJBTUVBQUVCQVFFQkJBQURCUVVCQVFFRUFBQUJBUUVCQVFadkFBQUJCQUVCQVFFQ0FnSUNBZ0FCQUFRRERBUUVCQUVCQVFBQUFnQUJBUUVCQWhFREF3TURBdzRDQXdNREF3a0JBUVVCQVFFQkFRRUJBUUVCQ1FRQUFBQUJBUUVBQVFBQUFBQUVBUUFBQXdZREF3Z0lFUWdJQ0F3TURBZ01EQXhsTndFRUFBSUVBZ3NBQUFBQUFBUUVCRDhFQkFRQUFBQUFBQUFCQkE0QUJnUUhBQUVBQUFBREJnWUdCZ1lHQmdZR0JnWURBUUVHREFZR0FRQUdBQVlHQUFBQkJnTURBQVFFQkFRQUFBQUZBUUZZRFFNQUJBZ0lEQWtEQWdJREFBQURBd0FBQVFRRUFRRUJBUUVCQlFVREFRRUJBUUVCQVFBQUJBQUNBQVFFQkFRRUJBUUVCQVFFQkFRRUJBSXhBQUVJQUFBQ0JBWUdheUVBRFFzQUFDOEFCUVFJQ0FFQkFRTUVCQUFBQUFNTkFRRUJBUUVBQUFNREFBQUFCQVFFQkFBQUFBQUFEQVFCQVFFUkFBUUFDd3NCQ3dzQkFRRUJBUUVCQVFFQkFRRUJBUUVNQXdBQUFnTURBd01FQVFVSkJBTUREd0FCR3d3QUFRQUJBQUVGQlFBQUJRVUJCUVVEQXdFQkFRRUJBUUVCQVFRRkJRQVpBUUVCQVFBR0FBQUFBUXdNQUFFQUFRRUJBUUFFQkRrSUFBRUJBQWdBQUEwQkRBSUFBQUVFREV3SUFBQTNBQVVCQVFRWkFRQUNOQUFJQ0FJQUFBNEFBUUVCQVFFQ0F3c0dCZ0VCQVFFS0NnRUFBQUFBQURNQUFBRUJBQUFBQUFBQUFBTUFBUUFBQVFNQU9SVUJBUlVBQUFBQUJXa01EQVFSQUFBQ0FBQUFBQUVBQ0F3QUFBQUFBQUFBQUFBQUJnWUJBUUlBQmhZQ0FRRUJBQUFBQkFFQURBTURBUUFEQXdnQkFCUUFBUVVGVnoxV0JBVUZEUUVDQXdBQUFBQUJEQUVCQVFFQUFBc0FBQUFBSHdZZkJnY0dCd1lFQUFBQUFRQUFBd0FBQUFBQUFBQUFBUUVCQVFBQUFBd01BQVlHQUFBQUFRTURCQUFBQUFBQUFBQUFBQUFXQVFBQUJnSURBUVlCQWdRQURBRUFBQUFCQWdBR0lTRWdJQVlCQVFRQUFBQUFBQUFBQUFBRUlBWURBd01BRGdBQUFBQUFBQUFBQUFBQUxBRUdBd0VCQUFBQUFRSThBQUVCQVFVRkFRVUZGUlVWQVFFQ0JRd0JBUVFFQkFRQUdnRkFBVUVDQWdZR0JnWUdCZ2NBQWdJQUF3QUFBQUFBQkFVQkFRRUVBQUVDQlFFRUFBQUJBUUVCQVFNREFBQUFCUUFDQUFFQkFRRUJBUUVCQUFBQUFBRUJBUUVCQXdVQ0FBc0xBd01GQ3dNRkN3VUZBd1VGQ3dVRkFnUUVCQVFFQkFRRUJBVURBd1VGQ3dVREN3VURDd3NMQ3dRRUJBUUVCQUVFQVFFQUF3TUNBQXdEQWdRREF3TUJBUUVnSVFBQ0FnSUNBZ0lDQWdJQ0FRRUVBUUVEQXdNQkFRRUJBUUVCQVFFQkFBQUFBQUFBQUFFQkJBQUJBUUVKQUFBQkJBQWFEUUFCQUFFQkFRRUJBUUVCQVFBQkFRQUNBZ0lDQmdjQUJEQUFBQUFDQWdJQ0FnY0dBQU1EQXc0REFBTUJBd0FBQXdNREF3TURBd01EQXdNREFRQURBd1lHQmdFQ0FnUUVBQUFXQmdBQ0FBUUVCQVFCQVFJQUFBQU5BUUVCQWdjQUhRUUVCQUVCQVFFQUJBQURBd01EQVFNQkFRRUJBUUVNQkFRRUJBUUVCQVFFQkFRRUJBUUNBZ0lDQUFFQkFRRUFBQUFBQUFFSk1BQUJBUUFBQUFBQUFBQUFBUUFBQlFBQUFBQUFBQUFDQUFVSUNBZ0lCQXdBQUFJQ0J3RUJBQUFBQUFFQUFBQUZBQUFBQkFBREJnQUNBZ0lEQVFRQUFBRUFBQUFSQWdBQURRQUFBQUFBQUFFQUFBRUFCQVFFQkFRRUJBUUVBQVFCQVFBRkJBUUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCQVFFQkFRRUFBUUVCQVFBQUFBQkFRRUJBUUVBRmhrM0FnMEFBQUFBQUFBQkFnQUFBQUFBQUFJQkFRSUNBZ0lBQmdGQ0JRQUJDd0lEQUFBQUFRRUFBUUVCQUFFQUFBQUFBUUVCQVFBUUFCSUVBUkVBQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJEZ2NIRWcwQkFRZ0lBQUVBRVFJQkFRTURFUVlBQkFJQkJBUUJBUUVCQVFFN093WUdCQU1DQUFFQkFRQUxEUXNOQ3dZTkN3c1ZGUlVCQVFFQkJBQUFBUUVBQUF3QUFBSUNBUUVBQWdJQ0FnSUNBZ0lDQWdJQ0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQUFBSUVBZ0FCQUFFREFnSU1BQUlCQVFFQUFBRUJBUUVHQVFBQkFob0RBeGtBQmdBUkFBQUFBQUFBQUFBQ0FBQUdBZ1FFQkFBQUFBRUJBUUVLQUNvQUFBRUFCaW9xS2dRTUFBQUFBQUFBQUFBQUFBTURCQVFCQVFFQkFRRUJBUUVCQkFvS0Nnb0pBQUFBQUFBQkF3SUJCZ01HQXdNREJnWUJBUUVCQXdNREFRTURBUUVEQXdNQkFRRUVBUUVCQVFFREF3RUdBd01EQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQUFZSkNRa0pBd01BQXdnQUF3TURBd01BQUFZQ0FBQUJBd1VBQUFBQkJnQUlDQWdJQUFZQkFRQUFBQUFBQUFBQUJnRUdCQVFFQVFFQ0FnUUVCQVFFQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBQUFFQUFFQkFRRUJBd01aQWdFQkFRRUJBUUVCQVFBQUFHWUJBQU1BQVFFQkF3QUJEQU1CQXdBQUFBQUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQWdJQkFRRUJBUUFCQUFFRUJnUUNBUUFBQmdFRUF3SUJBZ0VCQkFFQUFBQUVBUUlCQVFBQUFnTUVBUUVBQUFRQUFBQUFBUUFHQmdZR0JnWUdCZ1lHQmdNQUFnQUlBd0FHQXdFQUFBQUFBQUFBQUFBQUFBUURBd01EQXdNREF3QUFBQUZDQUFBQUJoSVJBQUE5QVFvS0NnQUFGZ0FBQWdBQUFBQUFBQUVBQUFNREJnRUJBUU1HQXdBQUFBRUFBQUFBQWdJQ0FnSUNBQUFBQUFBQUFBQUFCZ0FBQUFBQkFRUUREZ2dBQUFBQURnQUNBQVFBQUFFQkFRRUJBUVlCQUFFQkFBRUNBZ0FBQUFBQUFBZ0FZQUFBQUFBQUFnQUJBQUFBQ1FFQ0FBSUFBUWNBQkFRQUFBQUJBUUFBQUFFVkFRQUNBZ0FFQUFBRUJBUUVCQVFFQVFFREFob0FCd01CQmdNREFBWUFBd0FBQXdFQUFBQVFDZ29MTGdZRkJnWUdCZ1lHQmdNQkFRTUFBQUFBQUFnQ0FSVVFBQUVCQUFFQUFBQUJBUUVCQUFBQUFnSUNBQVlBQUFBRUJnWURBd0FBQUFBQUF3TURBQUFBQUJFQUFoRUJBd0lCQWdJQ0FnSUNDZ0FHQkFJQ0FnSUNBZ0lDQWdBQkF5UURBd1lEQWdFR0JBUUVEZ0FFQXdNREF3TUFBQU1EQXdNREF3RURBd01EQXdNREN3RUNBZ0lJQ0FnSUFRUUFBQUFEQXdNREF3TURBZ0FBQmdnQUFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkJBQUVCQUFCQUFBQUF3SUJBZ0lBQUFJQ0FnTUpBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFB