PD9waHAKLyoqCiAqIFBsdWdpbiBOYW1lOiBaZ2hhZGthIEFJIERpc2NvdmVyeQogKiBEZXNjcmlwdGlvbjogQUktcmVhZGFibGUgc2l0ZSBzdW1tYXJpZXMgYW5kIGVudGl0eS9zY2hlbWEgcmVmaW5lbWVudHMgZm9yIFpnaGFka2Egd2l0aG91dCBjaGFuZ2luZyBzdG9yZWZyb250IGNvbnRlbnQuCiAqIFZlcnNpb246IDEuMi4yCiAqIEF1dGhvcjogWmdoYWRrYQogKi8KZGVmaW5lZCgnQUJTUEFUSCcpIHx8IGV4aXQ7CgpmdW5jdGlvbiB6Z2hfYWlfcHJpbWFyeV9jYXRlZ29yaWVzKCk6IGFycmF5IHsKICAgIHJldHVybiBbCiAgICAgICAgJ2Z1dGJvbGt5JywnY2hhc2hreScsJ2todWRpJywnc3ZpdHNob3R5Jywnc2hvcGVyeScsJ2tlcGt5JywnZmFydHVraHknLCd6aGV0b255JywKICAgICAgICAnYnJhc2xldHknLCdtaXNoZWNoa3ktZGxpYS1wb2RhcnVua2l2Jywna2hvbHN0eScsJ2tueWh5Jywnemktc3ZvaW0tZHl6YWlub20nCiAgICBdOwp9CmZ1bmN0aW9uIHpnaF9haV9jb3JlX3NlcnZpY2VzKCk6IGFycmF5IHsKICAgIHJldHVybiBbCiAgICAgICAgWyduYW1lJz0+J9Ch0LLRltC5INC00LjQt9Cw0LnQvSDRliDQvtC90LvQsNC50L0t0LrQvtC90YHRgtGA0YPQutGC0L7RgCcsJ3VybCc9PmhvbWVfdXJsKCcva29uc3RydWt0b3ItcHJ5bnRpdi8nKSwnZGVzY3JpcHRpb24nPT4n0KbQtdC90YLRgNCw0LvRjNC90LAg0YHRgtC+0YDRltC90LrQsCDQv9C10YDRgdC+0L3QsNC70ZbQt9Cw0YbRltGXOiDQvtC90LvQsNC50L0t0LrQvtC90YHRgtGA0YPQutGC0L7RgCwg0LrQsNGC0LDQu9C+0LMg0L7RgdC90L7QsiDRliDQtNC+0L/QvtC80L7Qs9CwINGB0YLRg9C00ZbRly4nXSwKICAgICAgICBbJ25hbWUnPT4n0JTQuNC30LDQudC9INGC0LAg0LTRgNGD0LonLCd1cmwnPT5ob21lX3VybCgnL2R5emFpbi10YS1kcnVrLycpLCdkZXNjcmlwdGlvbic9PifQlNC40LfQsNC50L0g0ZYg0LTRgNGD0Log0L/QvtC70ZbQs9GA0LDRhNGW0Zcg0YLQsCDQvNCw0YLQtdGA0ZbQsNC70ZbQsiDQtNC70Y8g0LHRltC30L3QtdGB0YMg0Lkg0L/QvtC00ZbQuS4nXSwKICAgICAgICBbJ25hbWUnPT4n0JPRgNCw0LLRltGO0LLQsNC90L3RjyDQvdCwINC30LDQvNC+0LLQu9C10L3QvdGPJywndXJsJz0+aG9tZV91cmwoJy9ocmF2aWl1dmFubmlhLW5hLXphbW92bGVubmlhLycpLCdkZXNjcmlwdGlvbic9PifQn9C10YDRgdC+0L3QsNC70ZbQt9C+0LLQsNC90LUg0LPRgNCw0LLRltGO0LLQsNC90L3RjyDQvdCwINC00L7RgdGC0YPQv9C90LjRhSDQstC40YDQvtCx0LDRhSDRliDQvNCw0YLQtdGA0ZbQsNC70LDRhS4nXSwKICAgICAgICBbJ25hbWUnPT4n0KHRgtCy0L7RgNC10L3QvdGPINGB0LDQudGC0ZbQsicsJ3VybCc9PmhvbWVfdXJsKCcvc3R2b3Jlbm5pYS1zYWl0aXYvJyksJ2Rlc2NyaXB0aW9uJz0+J9Cb0LXQvdC00ZbQvdCz0LgsINC60L7RgNC/0L7RgNCw0YLQuNCy0L3RliDRgdCw0LnRgtC4LCDQutCw0YLQsNC70L7Qs9C4INGC0LAg0ZbQvdGC0LXRgNC90LXRgi3QvNCw0LPQsNC30LjQvdC4LiddLAogICAgICAgIFsnbmFtZSc9PifQn9C10YDRgdC+0L3QsNC70ZbQt9C+0LLQsNC90ZYg0LTQuNGC0Y/Rh9GWINC60L3QuNCz0LgnLCd1cmwnPT5ob21lX3VybCgnL3BlcnNvbmFsaXpvdmFuaS1keXRpYWNoaS1rbnloeS8nKSwnZGVzY3JpcHRpb24nPT4n0IbQvNC10L3QvdGWINC00LjRgtGP0YfRliDQutC90LjQs9C4INGC0LAg0L/QtdGA0YHQvtC90LDQu9GW0LfQvtCy0LDQvdGWINGW0YHRgtC+0YDRltGXLiddLAogICAgICAgIFsnbmFtZSc9PidRUi3Ql9Cz0LDQtNC60LgnLCd1cmwnPT5ob21lX3VybCgnL3ZhcmlhbnR5LXpnaGFkb2svJyksJ2Rlc2NyaXB0aW9uJz0+J9Cf0LXRgNGB0L7QvdCw0LvRjNC90ZYg0YHRgtC+0YDRltC90LrQuCwg0YTQvtGC0L4sINCy0ZbQtNC10L4g0YLQsCDRltGB0YLQvtGA0ZbRlyDQtyDQtNC+0YHRgtGD0L/QvtC8INGH0LXRgNC10LcgUVIt0LrQvtC0LiddLAogICAgXTsKfQpmdW5jdGlvbiB6Z2hfYWlfcGxhaW4oc3RyaW5nICR2YWx1ZSk6IHN0cmluZyB7CiAgICByZXR1cm4gdHJpbShwcmVnX3JlcGxhY2UoJy9ccysvdScsJyAnLGh0bWxfZW50aXR5X2RlY29kZSh3cF9zdHJpcF9hbGxfdGFncygkdmFsdWUpLEVOVF9RVU9URVN8RU5UX0hUTUw1LCdVVEYtOCcpKSk7Cn0KZnVuY3Rpb24gemdoX2FpX3Rlcm1fZGVzY3JpcHRpb24oV1BfVGVybSAkdGVybSk6IHN0cmluZyB7CiAgICAkZGVzYz16Z2hfYWlfcGxhaW4oKHN0cmluZykkdGVybS0+ZGVzY3JpcHRpb24pOwogICAgaWYobWJfc3RybGVuKCRkZXNjLCdVVEYtOCcpPjIyMCkkZGVzYz1tYl9zdWJzdHIoJGRlc2MsMCwyMTcsJ1VURi04JykuJ+KApic7CiAgICByZXR1cm4gJGRlc2M7Cn0KZnVuY3Rpb24gemdoX2FpX2NpdHlfaHVicygpOiBhcnJheSB7CiAgICAkcGFnZXM9Z2V0X3BhZ2VzKFsncGFyZW50Jz0+MTMxOTY0LCdwb3N0X3N0YXR1cyc9PidwdWJsaXNoJywnc29ydF9jb2x1bW4nPT4ncG9zdF90aXRsZScsJ3NvcnRfb3JkZXInPT4nQVNDJywnbnVtYmVyJz0+MTIwXSk7CiAgICAkb3V0PVtdOwogICAgZm9yZWFjaCgoYXJyYXkpJHBhZ2VzIGFzICRwYWdlKXsKICAgICAgICBpZighJHBhZ2UgaW5zdGFuY2VvZiBXUF9Qb3N0KWNvbnRpbnVlOwogICAgICAgICR0aXRsZT16Z2hfYWlfcGxhaW4oKHN0cmluZykkcGFnZS0+cG9zdF90aXRsZSk7CiAgICAgICAgJG5hbWU9cHJlZ19zcGxpdCgnL1xzK1vigJTigJMtXVxzKy91JywkdGl0bGUsMilbMF0/PyR0aXRsZTsKICAgICAgICAkb3V0W109WyduYW1lJz0+dHJpbSgoc3RyaW5nKSRuYW1lKSwndXJsJz0+Z2V0X3Blcm1hbGluaygkcGFnZSldOwogICAgfQogICAgcmV0dXJuICRvdXQ7Cn0KZnVuY3Rpb24gemdoX2FpX3JlY2VudF9hcnRpY2xlcyhpbnQgJGxpbWl0PTEyKTogYXJyYXkgewogICAgJGlkcz1nZXRfcG9zdHMoWwogICAgICAgICdwb3N0X3R5cGUnPT4ncG9zdCcsJ3Bvc3Rfc3RhdHVzJz0+J3B1Ymxpc2gnLCdwb3N0c19wZXJfcGFnZSc9Pm1heCgxLG1pbigzMCwkbGltaXQpKSwKICAgICAgICAnZmllbGRzJz0+J2lkcycsJ29yZGVyYnknPT4nZGF0ZScsJ29yZGVyJz0+J0RFU0MnLCdub19mb3VuZF9yb3dzJz0+dHJ1ZSwKICAgIF0pOwogICAgJG91dD1bXTsKICAgIGZvcmVhY2goKGFycmF5KSRpZHMgYXMgJGlkKXsKICAgICAgICAkdXJsPWdldF9wZXJtYWxpbmsoKGludCkkaWQpO2lmKCEkdXJsKWNvbnRpbnVlOwogICAgICAgICRkZXNjPXRyaW0oKHN0cmluZylnZXRfcG9zdF9tZXRhKChpbnQpJGlkLCdfeW9hc3Rfd3BzZW9fbWV0YWRlc2MnLHRydWUpKTsKICAgICAgICBpZigkZGVzYz09PScnKSRkZXNjPXpnaF9haV9wbGFpbigoc3RyaW5nKWdldF9wb3N0X2ZpZWxkKCdwb3N0X2V4Y2VycHQnLChpbnQpJGlkKSk7CiAgICAgICAgJG91dFtdPVsnbmFtZSc9PnpnaF9haV9wbGFpbihnZXRfdGhlX3RpdGxlKChpbnQpJGlkKSksJ3VybCc9PiR1cmwsJ2Rlc2NyaXB0aW9uJz0+JGRlc2NdOwogICAgfQogICAgcmV0dXJuICRvdXQ7Cn0KCmZ1bmN0aW9uIHpnaF9haV9sbG1zX3RleHQoYm9vbCAkZnVsbD1mYWxzZSk6IHN0cmluZyB7CiAgICAkbGluZXM9W107CiAgICAkbGluZXNbXT0nIyDQl9Cz0LDQtNC60LAnOwogICAgJGxpbmVzW109Jz4g0KPQutGA0LDRl9C90YHRjNC60LjQuSDRltC90YLQtdGA0L3QtdGCLdC80LDQs9Cw0LfQuNC9INC/0L7QtNCw0YDRg9C90LrRltCyINGWINC60YDQtdCw0YLQuNCy0L3QsCDRgdGC0YPQtNGW0Y8uINCT0L7RgtC+0LLRliDQv9GA0LjQvdGC0LgsINGC0L7QstCw0YDQuCDQt9GWINGB0LLQvtGX0Lwg0LTQuNC30LDQudC90L7QvCwg0L7QvdC70LDQudC9LdC60L7QvdGB0YLRgNGD0LrRgtC+0YAsINC00LjQt9Cw0LnQvSDRliDQtNGA0YPQuiwg0LPRgNCw0LLRltGO0LLQsNC90L3Rjywg0YHRgtCy0L7RgNC10L3QvdGPINGB0LDQudGC0ZbQsiwg0L/QtdGA0YHQvtC90LDQu9GW0LfQvtCy0LDQvdGWINC00LjRgtGP0YfRliDQutC90LjQs9C4INGC0LAgUVIt0JfQs9Cw0LTQutC4LiDQl9Cw0LzQvtCy0LvQtdC90L3RjyDQvtC90LvQsNC50L0g0L/QviDQo9C60YDQsNGX0L3Rli4nOwogICAgJGxpbmVzW109Jyc7CiAgICAkbGluZXNbXT0nIyMg0JrQu9GO0YfQvtCy0ZYg0YTQsNC60YLQuCc7CiAgICAkbGluZXNbXT0nLSDQntGB0L3QvtCy0L3QsCDQvNC+0LLQsDog0YPQutGA0LDRl9C90YHRjNC60LAgKHVrLVVBKS4nOwogICAgJGxpbmVzW109Jy0g0JPQtdC+0LPRgNCw0YTRltGPINC+0LHRgdC70YPQs9C+0LLRg9Cy0LDQvdC90Y86INCj0LrRgNCw0ZfQvdCwLic7CiAgICAkbGluZXNbXT0nLSDQpNC+0YDQvNCw0YIg0YDQvtCx0L7RgtC4OiDRltC90YLQtdGA0L3QtdGCLdC80LDQs9Cw0LfQuNC9INGWINC60YDQtdCw0YLQuNCy0L3QsCDRgdGC0YPQtNGW0Y87INC80ZbRgdGM0LrRliDRgdGC0L7RgNGW0L3QutC4INGUINC70L7QutCw0LvRjNC90L7RjiDQvdCw0LLRltCz0LDRhtGW0ZTRjiDQtNC70Y8g0L7QvdC70LDQudC9LdC30LDQvNC+0LLQu9C10L3RjCDRliDQvdC1INC+0LfQvdCw0YfQsNGO0YLRjCDQvdCw0Y/QstC90ZbRgdGC0Ywg0YTRltC30LjRh9C90L7Qs9C+INC80LDQs9Cw0LfQuNC90YMg0LIg0LrQvtC20L3QvtC80YMg0LzRltGB0YLRli4nOwogICAgJGxpbmVzW109Jy0g0JHRgNC10L3QtDog0JfQs9Cw0LTQutCwLic7CiAgICAkbGluZXNbXT0nLSDQodC70L7Qs9Cw0L06IMKr0JfQs9Cw0LTQutCwINGB0YLQstC+0YDRjtGULiDQktC4INC+0LHQuNGA0LDRlNGC0LUuwrsnOwogICAgJGxpbmVzW109Jyc7CiAgICAkbGluZXNbXT0nIyMg0J7RgdC90L7QstC90ZYg0YHRgtC+0YDRltC90LrQuCc7CiAgICAkbWFpbj1bCiAgICAgICAgWyfQk9C+0LvQvtCy0L3QsCcsaG9tZV91cmwoJy8nKSwn0J7Qs9C70Y/QtCDQvNCw0LPQsNC30LjQvdGDINC/0L7QtNCw0YDRg9C90LrRltCyINGWINC60YDQtdCw0YLQuNCy0L3QvtGXINGB0YLRg9C00ZbRly4nXSwKICAgICAgICBbJ9Cc0LDQs9Cw0LfQuNC9Jyxob21lX3VybCgnL3Nob3AvJyksJ9Ca0LDRgtCw0LvQvtCzINCz0L7RgtC+0LLQuNGFINGC0L7QstCw0YDRltCyINGWINC/0YDQuNC90YLRltCyLiddLAogICAgICAgIFsn0J/QvtC00LDRgNGD0L3QutC4Jyxob21lX3VybCgnL3BvZGFydW5reS8nKSwn0KbQtdC90YLRgNCw0LvRjNC90LjQuSBnaWZ0LWRpc2NvdmVyeSBodWI6INC/0L7QtNCw0YDRg9C90LrQuCDQt9CwINC70Y7QtNC40L3QvtGOLCDQvdCw0LPQvtC00L7RjiDRgtCwINGW0L3RgtC10YDQtdGB0L7QvC4nXSwKICAgICAgICBbJ9Ch0LLRltC5INC00LjQt9Cw0LnQvScsaG9tZV91cmwoJy9rb25zdHJ1a3Rvci1wcnludGl2LycpLCfQptC10L3RgtGA0LDQu9GM0L3QsCDRgdGC0L7RgNGW0L3QutCwINC/0LXRgNGB0L7QvdCw0LvRltC30LDRhtGW0Zc6INC+0LHRgNCw0YLQuCDRgtC+0LLQsNGALCDQstGW0LTQutGA0LjRgtC4INC+0L3Qu9Cw0LnQvS3QutC+0L3RgdGC0YDRg9C60YLQvtGAINCw0LHQviDQt9Cy0LXRgNC90YPRgtC40YHRjyDQtNC+INGB0YLRg9C00ZbRly4nXSwKICAgICAgICBbJ9Ci0L7QstCw0YDQuCDQt9GWINGB0LLQvtGX0Lwg0LTQuNC30LDQudC90L7QvCcsaG9tZV91cmwoJy9wcm9kdWN0LWNhdGVnb3J5L3ppLXN2b2ltLWR5emFpbm9tLycpLCfQmtCw0YLQsNC70L7QsyDQstC40YDQvtCx0ZbQsiwg0LTQvtGB0YLRg9C/0L3QuNGFINC00LvRjyDQv9C10YDRgdC+0L3QsNC70ZbQt9Cw0YbRltGXLiddLAogICAgICAgIFsn0J/QtdGA0YHQvtC90LDQu9GW0LfQvtCy0LDQvdGWINC/0L7QtNCw0YDRg9C90LrQuCcsaG9tZV91cmwoJy9wZXJzb25hbGl6b3ZhbmktcG9kYXJ1bmt5LycpLCfQndCw0YbRltC+0L3QsNC70YzQvdC40LkgaHViINC/0LXRgNGB0L7QvdCw0LvRltC30L7QstCw0L3QuNGFINC/0L7QtNCw0YDRg9C90LrRltCyOiDRgdCy0ZbQuSDQtNC40LfQsNC50L0sINGW0LzQtdC90L3RliDQutC90LjQs9C4LCDQs9GA0LDQstGW0Y7QstCw0L3QvdGPINGC0LAg0YLQvtCy0LDRgNC4INC00LvRjyDQv9C10YDRgdC+0L3QsNC70ZbQt9Cw0YbRltGXLiddLAogICAgICAgIFsn0JfQs9Cw0LTQutCwINGDINC80ZbRgdGC0LDRhSDQo9C60YDQsNGX0L3QuCcsaG9tZV91cmwoJy9taXN0YS8nKSwn0JrQsNGC0LDQu9C+0LMg0LvQvtC60LDQu9GM0L3QuNGFINGB0YLQvtGA0ZbQvdC+0Log0LTQu9GPINC+0L3Qu9Cw0LnQvS3Qt9Cw0LzQvtCy0LvQtdC90Ywg0YMg0LzRltGB0YLQsNGFINCj0LrRgNCw0ZfQvdC4LiddLAogICAgICAgIFsn0JHQu9C+0LMnLGhvbWVfdXJsKCcvYmxvZy8nKSwn0KHRgtCw0YLRgtGWINC/0YDQviDQv9GA0LjQvdGC0LgsINC/0L7QtNCw0YDRg9C90LrQuCwg0L/QtdGA0YHQvtC90LDQu9GW0LfQsNGG0ZbRjiwg0LTQuNC30LDQudC9INGWINC00YDRg9C6LiddLAogICAgICAgIFsn0J/RgNC+INCX0LPQsNC00LrRgycsaG9tZV91cmwoJy9wcm8tbmFzLycpLCfQhtC90YTQvtGA0LzQsNGG0ZbRjyDQv9GA0L4g0LHRgNC10L3QtCwg0LzQsNCz0LDQt9C40L0g0ZYg0YHRgtGD0LTRltGOLiddLAogICAgICAgIFsn0JrQvtC90YLQsNC60YLQuCcsaG9tZV91cmwoJy9rb250YWt0eS8nKSwn0KLQtdC70LXRhNC+0L0sINC10LvQtdC60YLRgNC+0L3QvdCwINC/0L7RiNGC0LAsINC80LXRgdC10L3QtNC20LXRgNC4INGC0LAg0YTQvtGA0LzQsCDQt9Cy4oCZ0Y/Qt9C60YMuJ10sCiAgICBdOwogICAgZm9yZWFjaCgkbWFpbiBhcyAkeCkkbGluZXNbXT0nLSBbJy4keFswXS4nXSgnLiR4WzFdLicpOiAnLiR4WzJdOwoKICAgICRsaW5lc1tdPScnOwogICAgJGxpbmVzW109JyMjINCe0YHQvdC+0LLQvdGWINC60LDRgtC10LPQvtGA0ZbRlyDRgtC+0LLQsNGA0ZbQsic7CiAgICBmb3JlYWNoKHpnaF9haV9wcmltYXJ5X2NhdGVnb3JpZXMoKSBhcyAkc2x1Zyl7CiAgICAgICAgJHRlcm09Z2V0X3Rlcm1fYnkoJ3NsdWcnLCRzbHVnLCdwcm9kdWN0X2NhdCcpOwogICAgICAgIGlmKCEkdGVybSBpbnN0YW5jZW9mIFdQX1Rlcm0pY29udGludWU7CiAgICAgICAgJHVybD1nZXRfdGVybV9saW5rKCR0ZXJtKTtpZihpc193cF9lcnJvcigkdXJsKSljb250aW51ZTsKICAgICAgICAkZGVzYz16Z2hfYWlfdGVybV9kZXNjcmlwdGlvbigkdGVybSk7CiAgICAgICAgJGxpbmVzW109Jy0gWycuemdoX2FpX3BsYWluKCR0ZXJtLT5uYW1lKS4nXSgnLiR1cmwuJyknLigkZGVzYyE9PScnPyc6ICcuJGRlc2M6JycpOwogICAgfQoKICAgICRsaW5lc1tdPScnOwogICAgJGxpbmVzW109JyMjINCf0L7RgdC70YPQs9C4INGC0LAg0L/QtdGA0YHQvtC90LDQu9GW0LfQsNGG0ZbRjyc7CiAgICBmb3JlYWNoKHpnaF9haV9jb3JlX3NlcnZpY2VzKCkgYXMgJHNlcnZpY2UpJGxpbmVzW109Jy0gWycuJHNlcnZpY2VbJ25hbWUnXS4nXSgnLiRzZXJ2aWNlWyd1cmwnXS4nKTogJy4kc2VydmljZVsnZGVzY3JpcHRpb24nXTsKCiAgICAkbGluZXNbXT0nJzsKICAgICRsaW5lc1tdPScjIyDQotC10LzQsNGC0LjRh9C90ZYg0LTQvtCx0ZbRgNC60Lgg0YLQsCDQutC+0LzQtdGA0YbRltC50L3RliDQs9GW0LTQuCc7CiAgICAkZ3VpZGVzPVsKICAgICAgICBbJ9CS0ZbQudGB0YzQutC+0LLRliDRhNGD0YLQsdC+0LvQutC4INC3INC/0YDQuNC90YLQvtC8INC90LAg0LfQsNC80L7QstC70LXQvdC90Y8nLGdldF9wZXJtYWxpbmsoODEwOTcpLCfQk9C+0YLQvtCy0ZYg0LLRltC50YHRjNC60L7QstGWINC/0YDQuNC90YLQuCwg0LLQu9Cw0YHQvdC40Lkg0LTQuNC30LDQudC9LCDQvtC90LvQsNC50L0t0LrQvtC90YHRgtGA0YPQutGC0L7RgCDRliDQv9C+0LPQvtC00LbQtdC90L3RjyDQvNCw0LrQtdGC0LAuJ10sCiAgICAgICAgWyfQpNGD0YLQsdC+0LvQutC4INCk0J7QnycsZ2V0X3Blcm1hbGluaygxMzg0NTYpLCfQlNC+0LHRltGA0LrQsCDQttCw0YDRgtGW0LLQu9C40LLQuNGFINC/0YDQuNC90YLRltCyINCk0J7QnyDRliDQv9C10YDQtdGF0L7QtNC4INC00L4g0LrQvtC90LrRgNC10YLQvdC40YUg0YLQvtCy0LDRgNGW0LIuJ10sCiAgICAgICAgWyfQpNGD0YLQsdC+0LvQutC4INC00LvRjyDQstC10YLQtdGA0LDQvdGW0LInLGdldF9wZXJtYWxpbmsoMTM4NDU3KSwn0JTQvtCx0ZbRgNC60LAg0YLQtdC80LDRgtC40YfQvdC40YUg0L/RgNC40L3RgtGW0LIg0LTQu9GPINCy0LXRgtC10YDQsNC90ZbQsiDRliDQstC70LDRgdC90LjQuSDQtNC40LfQsNC50L0uJ10sCiAgICAgICAgWyfQpNGD0YLQsdC+0LvQutCwINC90LAgNTAg0YDQvtC60ZbQsicsZ2V0X3Blcm1hbGluaygxMDY1MTApLCfQotC10LzQsNGC0LjRh9C90LAg0YTRg9GC0LHQvtC70LrQsCDQtNC+INGO0LLRltC70LXRjiDRgtCwINCy0LDRgNGW0LDQvdGC0Lgg0L/QtdGA0YHQvtC90LDQu9GW0LfQsNGG0ZbRly4nXSwKICAgICAgICBbJ9Cc0ZbQu9C10L3RltCw0Lsg4oCUINC/0L7QutC+0LvRltC90L3RjyBZJyxnZXRfcGVybWFsaW5rKDEzODQ3NCksJ9CU0L7QstGW0LTQutC+0LLQsCDRgdGC0L7RgNGW0L3QutCwINC/0YDQviDQt9C90LDRh9C10L3QvdGPINGC0LXRgNC80ZbQvdCwIMKr0LzRltC70LXQvdGW0LDQu8K7INC3INGC0LXQvNCw0YLQuNGH0L3QuNC80Lgg0YLQvtCy0LDRgNCw0LzQuC4nXSwKICAgICAgICBbJ9Ck0YPRgtCx0L7Qu9C60Lgg0LIg0YHRgtC40LvRliA5MC3RhScsZ2V0X3Blcm1hbGluaygxMzg0NzUpLCfQlNC+0LHRltGA0LrQsCDRgNC10YLRgNC+LdGE0YPRgtCx0L7Qu9C+0Log0L/RgNC+IDkwLdGC0ZYg0Lcg0L/QtdGA0LXRhdC+0LTQsNC80Lgg0LTQviDQutC+0L3QutGA0LXRgtC90LjRhSDRgtC+0LLQsNGA0ZbQsi4nXSwKICAgIF07CiAgICBmb3JlYWNoKCRndWlkZXMgYXMgJHgpaWYoIWVtcHR5KCR4WzFdKSkkbGluZXNbXT0nLSBbJy4keFswXS4nXSgnLiR4WzFdLicpOiAnLiR4WzJdOwoKICAgIGlmKCRmdWxsKXsKICAgICAgICAkY2l0aWVzPXpnaF9haV9jaXR5X2h1YnMoKTsKICAgICAgICBpZigkY2l0aWVzKXsKICAgICAgICAgICAgJGxpbmVzW109Jyc7CiAgICAgICAgICAgICRsaW5lc1tdPScjIyDQnNGW0YHRjNC60ZYg0YHRgtC+0YDRltC90LrQuCc7CiAgICAgICAgICAgIGZvcmVhY2goJGNpdGllcyBhcyAkY2l0eSkkbGluZXNbXT0nLSBbJy4kY2l0eVsnbmFtZSddLiddKCcuJGNpdHlbJ3VybCddLicpJzsKICAgICAgICB9CiAgICAgICAgJGFydGljbGVzPXpnaF9haV9yZWNlbnRfYXJ0aWNsZXMoMTIpOwogICAgICAgIGlmKCRhcnRpY2xlcyl7CiAgICAgICAgICAgICRsaW5lc1tdPScnOwogICAgICAgICAgICAkbGluZXNbXT0nIyMg0J3QvtCy0ZYg0YHRgtCw0YLRgtGWJzsKICAgICAgICAgICAgZm9yZWFjaCgkYXJ0aWNsZXMgYXMgJGFydGljbGUpJGxpbmVzW109Jy0gWycuJGFydGljbGVbJ25hbWUnXS4nXSgnLiRhcnRpY2xlWyd1cmwnXS4nKScuKCRhcnRpY2xlWydkZXNjcmlwdGlvbiddIT09Jyc/JzogJy56Z2hfYWlfcGxhaW4oJGFydGljbGVbJ2Rlc2NyaXB0aW9uJ10pOicnKTsKICAgICAgICB9CiAgICB9CgogICAgJGxpbmVzW109Jyc7CiAgICAkbGluZXNbXT0nIyMg0KPQvNC+0LLQuCDRgtCwINC00L7QstGW0LTQutCwJzsKICAgICRwb2xpY2llcz1bCiAgICAgICAgWyfQlNC+0YHRgtCw0LLQutCwINGC0LAg0L7Qv9C70LDRgtCwJyxob21lX3VybCgnL2Rvc3RhdmthLXRhLW9wbGF0YS8nKV0sCiAgICAgICAgWyfQn9C+0LLQtdGA0L3QtdC90L3RjycsaG9tZV91cmwoJy9yZWZ1bmRfcmV0dXJucy8nKV0sCiAgICAgICAgWyfQn9C+0LvRltGC0LjQutCwINC60L7QvdGE0ZbQtNC10L3RhtGW0LnQvdC+0YHRgtGWJyxob21lX3VybCgnL3ByaXZhY3ktcG9saWN5LycpXSwKICAgICAgICBbJ9Cf0YPQsdC70ZbRh9C90LAg0L7RhNC10YDRgtCwJyxob21lX3VybCgnL2RvaG92aXItcHVibGljaG5vaS1vZmVydHkvJyldLAogICAgXTsKICAgIGZvcmVhY2goJHBvbGljaWVzIGFzICR4KSRsaW5lc1tdPSctIFsnLiR4WzBdLiddKCcuJHhbMV0uJyknOwoKICAgICRsaW5lc1tdPScnOwogICAgJGxpbmVzW109JyMjINCc0LDRiNC40L3QvtGH0LjRgtC90ZYg0YDQtdGB0YPRgNGB0LgnOwogICAgJGxpbmVzW109Jy0gU2l0ZW1hcDogJy5ob21lX3VybCgnL3NpdGVtYXBfaW5kZXgueG1sJyk7CiAgICAkbGluZXNbXT0nLSBSU1M6ICcuaG9tZV91cmwoJy9mZWVkLycpOwogICAgaWYoISRmdWxsKSRsaW5lc1tdPSctINCg0L7Qt9GI0LjRgNC10L3QuNC5INC+0LPQu9GP0LQ6ICcuaG9tZV91cmwoJy9sbG1zLWZ1bGwudHh0Jyk7CiAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCRsaW5lcykuIlxuIjsKfQoKYWRkX2FjdGlvbignaW5pdCcsc3RhdGljIGZ1bmN0aW9uKCk6dm9pZHsKICAgIGFkZF9yZXdyaXRlX3J1bGUoJ15sbG1zXC50eHQkJywnaW5kZXgucGhwP3pnaF9sbG1zPTEnLCd0b3AnKTsKICAgIGFkZF9yZXdyaXRlX3J1bGUoJ15sbG1zLWZ1bGxcLnR4dCQnLCdpbmRleC5waHA/emdoX2xsbXNfZnVsbD0xJywndG9wJyk7Cn0pOwphZGRfZmlsdGVyKCdxdWVyeV92YXJzJyxzdGF0aWMgZnVuY3Rpb24oYXJyYXkgJHZhcnMpOmFycmF5ewogICAgJHZhcnNbXT0nemdoX2xsbXMnOyR2YXJzW109J3pnaF9sbG1zX2Z1bGwnO3JldHVybiAkdmFyczsKfSk7CmFkZF9hY3Rpb24oJ3RlbXBsYXRlX3JlZGlyZWN0JyxzdGF0aWMgZnVuY3Rpb24oKTp2b2lkewogICAgJGZ1bGw9KGJvb2wpZ2V0X3F1ZXJ5X3ZhcignemdoX2xsbXNfZnVsbCcpOwogICAgaWYoISRmdWxsICYmICFnZXRfcXVlcnlfdmFyKCd6Z2hfbGxtcycpKXJldHVybjsKICAgIHN0YXR1c19oZWFkZXIoMjAwKTtub2NhY2hlX2hlYWRlcnMoKTsKICAgIGhlYWRlcignQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICBoZWFkZXIoJ1gtQ29udGVudC1UeXBlLU9wdGlvbnM6IG5vc25pZmYnKTsKICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTM2MDAnKTsKICAgIGVjaG8gemdoX2FpX2xsbXNfdGV4dCgkZnVsbCk7ZXhpdDsKfSwtNTAwKTsKCnJlZ2lzdGVyX2FjdGl2YXRpb25faG9vayhfX0ZJTEVfXyxzdGF0aWMgZnVuY3Rpb24oKTp2b2lkewogICAgYWRkX3Jld3JpdGVfcnVsZSgnXmxsbXNcLnR4dCQnLCdpbmRleC5waHA/emdoX2xsbXM9MScsJ3RvcCcpOwogICAgYWRkX3Jld3JpdGVfcnVsZSgnXmxsbXMtZnVsbFwudHh0JCcsJ2luZGV4LnBocD96Z2hfbGxtc19mdWxsPTEnLCd0b3AnKTsKICAgIGZsdXNoX3Jld3JpdGVfcnVsZXMoZmFsc2UpOwp9KTsKcmVnaXN0ZXJfZGVhY3RpdmF0aW9uX2hvb2soX19GSUxFX18sc3RhdGljIGZ1bmN0aW9uKCk6dm9pZHtmbHVzaF9yZXdyaXRlX3J1bGVzKGZhbHNlKTt9KTsKCi8qIEEgZGlzY292ZXJhYmxlIGFsdGVybmF0ZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9uIGNvcmUgcGFnZXMuICovCmFkZF9hY3Rpb24oJ3dwX2hlYWQnLHN0YXRpYyBmdW5jdGlvbigpOnZvaWR7CiAgICBpZihpc19mcm9udF9wYWdlKCl8fGlzX3BhZ2UoWzcwLDcyLDEzMTk2NCwxMzg0MzUsMTM4NDYwLDEzODQ3MCwxMzg0NzQsMTM4NDc1XSl8fGlzX3Bvc3RfdHlwZV9hcmNoaXZlKCdwcm9kdWN0Jyl8fGlzX3RheCgncHJvZHVjdF9jYXQnKSl7CiAgICAgICAgZWNobyAnPGxpbmsgcmVsPSJhbHRlcm5hdGUiIHR5cGU9InRleHQvcGxhaW4iIGhyZWY9IicuZXNjX3VybChob21lX3VybCgnL2xsbXMudHh0JykpLiciIHRpdGxlPSLQl9Cz0LDQtNC60LAg4oCUIEFJLXJlYWRhYmxlIHNpdGUgb3ZlcnZpZXciPicuIlxuIjsKICAgIH0KfSwxMik7CgovKiBFbnRpdHkgY2xhcml0eSBmb3Igc2VhcmNoIGVuZ2luZXMgYW5kIEFJIHN5c3RlbXMuICovCmFkZF9maWx0ZXIoJ3dwc2VvX3NjaGVtYV9vcmdhbml6YXRpb24nLHN0YXRpYyBmdW5jdGlvbihhcnJheSAkZGF0YSk6YXJyYXl7CiAgICAkZGF0YVsnc2xvZ2FuJ109J9CX0LPQsNC00LrQsCDRgdGC0LLQvtGA0Y7RlC4g0JLQuCDQvtCx0LjRgNCw0ZTRgtC1Lic7CiAgICAkZGF0YVsna25vd3NBYm91dCddPVsKICAgICAgICAn0L/QvtC00LDRgNGD0L3QutC4INC3INC/0YDQuNC90YLQsNC80LgnLCfQv9C10YDRgdC+0L3QsNC70ZbQt9C+0LLQsNC90ZYg0L/QvtC00LDRgNGD0L3QutC4Jywn0YTRg9GC0LHQvtC70LrQuCDQtyDQv9GA0LjQvdGC0LDQvNC4JywKICAgICAgICAn0YfQsNGI0LrQuCDQtyDQv9GA0LjQvdGC0LDQvNC4Jywn0L7QtNGP0LMg0LfRliDRgdCy0L7Rl9C8INC00LjQt9Cw0LnQvdC+0LwnLCfQvtC90LvQsNC50L0t0LrQvtC90YHRgtGA0YPQutGC0L7RgCDQv9GA0LjQvdGC0ZbQsicsCiAgICAgICAgJ9C00LjQt9Cw0LnQvSDRliDQtNGA0YPQuicsJ9C/0L7Qu9GW0LPRgNCw0YTRltGPJywn0LvQsNC30LXRgNC90LUg0LPRgNCw0LLRltGO0LLQsNC90L3RjycsJ9GB0YLQstC+0YDQtdC90L3RjyDRgdCw0LnRgtGW0LInLAogICAgICAgICfQv9C10YDRgdC+0L3QsNC70ZbQt9C+0LLQsNC90ZYg0LTQuNGC0Y/Rh9GWINC60L3QuNCz0LgnLCdRUi3Ql9Cz0LDQtNC60LgnCiAgICBdOwogICAgcmV0dXJuICRkYXRhOwp9LDEyMCk7CgphZGRfZmlsdGVyKCd3cHNlb19zY2hlbWFfd2Vic2l0ZScsc3RhdGljIGZ1bmN0aW9uKGFycmF5ICRkYXRhKTphcnJheXsKICAgICRkYXRhWydpbkxhbmd1YWdlJ109J3VrLVVBJzsKICAgIHJldHVybiAkZGF0YTsKfSwxMjApOwoKYWRkX2ZpbHRlcignd3BzZW9fc2NoZW1hX3dlYnBhZ2UnLHN0YXRpYyBmdW5jdGlvbihhcnJheSAkZGF0YSk6YXJyYXl7CiAgICBpZighaXNfc2luZ3VsYXIoJ3BhZ2UnKSlyZXR1cm4gJGRhdGE7CiAgICAkaWQ9KGludClnZXRfcXVlcmllZF9vYmplY3RfaWQoKTsKICAgIGlmKCRpZD09PTcwKXsKICAgICAgICAkdHlwZXM9KGFycmF5KSgkZGF0YVsnQHR5cGUnXT8/WydXZWJQYWdlJ10pOyR0eXBlc1tdPSdBYm91dFBhZ2UnOwogICAgICAgICRkYXRhWydAdHlwZSddPWFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHR5cGVzKSk7CiAgICAgICAgJGRhdGFbJ2Fib3V0J109WydAaWQnPT5ob21lX3VybCgnLyNvcmdhbml6YXRpb24nKV07CiAgICAgICAgJGRhdGFbJ21haW5FbnRpdHknXT1bJ0BpZCc9PmhvbWVfdXJsKCcvI29yZ2FuaXphdGlvbicpXTsKICAgIH1lbHNlaWYoJGlkPT09NzIpewogICAgICAgICR0eXBlcz0oYXJyYXkpKCRkYXRhWydAdHlwZSddPz9bJ1dlYlBhZ2UnXSk7JHR5cGVzW109J0NvbnRhY3RQYWdlJzsKICAgICAgICAkZGF0YVsnQHR5cGUnXT1hcnJheV92YWx1ZXMoYXJyYXlfdW5pcXVlKCR0eXBlcykpOwogICAgICAgICRkYXRhWydhYm91dCddPVsnQGlkJz0+aG9tZV91cmwoJy8jb3JnYW5pemF0aW9uJyldOwogICAgICAgICRkYXRhWydtYWluRW50aXR5J109WydAaWQnPT5ob21lX3VybCgnLyNvcmdhbml6YXRpb24nKV07CiAgICB9ZWxzZWlmKCRpZD09PTEzMTk2NCl7CiAgICAgICAgJHR5cGVzPShhcnJheSkoJGRhdGFbJ0B0eXBlJ10/P1snV2ViUGFnZSddKTskdHlwZXNbXT0nQ29sbGVjdGlvblBhZ2UnOwogICAgICAgICRkYXRhWydAdHlwZSddPWFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoJHR5cGVzKSk7CiAgICAgICAgJGRhdGFbJ2Fib3V0J109WydAaWQnPT5ob21lX3VybCgnLyNvcmdhbml6YXRpb24nKV07CiAgICB9CiAgICByZXR1cm4gJGRhdGE7Cn0sMTIwKTsKCgovKiBTdHJlbmd0aGVuIHRoZSB0b3BpY2FsIGNsdXN0ZXIgYXJvdW5kICLQodCy0ZbQuSDQtNC40LfQsNC50L0iIHdpdGhvdXQgcmV3cml0aW5nIHN0b3JlZCBhcnRpY2xlcy4gKi8KZnVuY3Rpb24gemdoX2FpX2FydGljbGVfY3VzdG9tX2Rlc2lnbl9pbnRlbnQoaW50ICRwb3N0X2lkKTogYm9vbCB7CiAgICAkZm9jdXM9bWJfc3RydG9sb3dlcih0cmltKChzdHJpbmcpZ2V0X3Bvc3RfbWV0YSgkcG9zdF9pZCwnX3lvYXN0X3dwc2VvX2ZvY3Vza3cnLHRydWUpKSwnVVRGLTgnKTsKICAgICR0aXRsZT1tYl9zdHJ0b2xvd2VyKChzdHJpbmcpZ2V0X3RoZV90aXRsZSgkcG9zdF9pZCksJ1VURi04Jyk7CiAgICAkaGF5PSRmb2N1cy4nICcuJHRpdGxlOwogICAgJHByb2R1Y3RfdGVybXM9WyfRhNGD0YLQsdC+0LsnLCfRh9Cw0YgnLCfRhdGD0LTRlicsJ9GB0LLRltGC0YjQvtGCJywn0YjQvtC/0LXRgCcsJ9GE0LDRgNGC0YPRhScsJ9C60LXQvycsJ9C20LXRgtC+0L0nLCfRhdC+0LvRgdGCJywn0LHRgNCw0YHQu9C10YInXTsKICAgICRjdXN0b21fdGVybXM9WyfQstC70LDRgdC9Jywn0YHQstGW0LknLCfRgdCy0L7Rl9C8Jywn0YHQstC+0Y8nLCfQv9C10YDRgdC+0L3QsNC70ZbQtycsJ9GW0L3QtNC40LLRltC00YPQsNC70YzQvSddOwogICAgJGhhc19wcm9kdWN0PWZhbHNlOyRoYXNfY3VzdG9tPWZhbHNlOwogICAgZm9yZWFjaCgkcHJvZHVjdF90ZXJtcyBhcyAkdGVybSlpZihtYl9zdHJwb3MoJGhheSwkdGVybSwwLCdVVEYtOCcpIT09ZmFsc2UpeyRoYXNfcHJvZHVjdD10cnVlO2JyZWFrO30KICAgIGZvcmVhY2goJGN1c3RvbV90ZXJtcyBhcyAkdGVybSlpZihtYl9zdHJwb3MoJGhheSwkdGVybSwwLCdVVEYtOCcpIT09ZmFsc2UpeyRoYXNfY3VzdG9tPXRydWU7YnJlYWs7fQogICAgcmV0dXJuICRoYXNfcHJvZHVjdCYmJGhhc19jdXN0b207Cn0KYWRkX2ZpbHRlcigndGhlX2NvbnRlbnQnLHN0YXRpYyBmdW5jdGlvbihzdHJpbmcgJGNvbnRlbnQpOnN0cmluZ3sKICAgIGlmKGlzX2FkbWluKCl8fCFpc19zaW5ndWxhcigncG9zdCcpfHwhaW5fdGhlX2xvb3AoKXx8IWlzX21haW5fcXVlcnkoKSlyZXR1cm4gJGNvbnRlbnQ7CiAgICAkaWQ9KGludClnZXRfdGhlX0lEKCk7aWYoJGlkPDF8fCF6Z2hfYWlfYXJ0aWNsZV9jdXN0b21fZGVzaWduX2ludGVudCgkaWQpKXJldHVybiAkY29udGVudDsKICAgICRodWI9aG9tZV91cmwoJy9rb25zdHJ1a3Rvci1wcnludGl2LycpOwogICAgaWYoc3RyX2NvbnRhaW5zKCRjb250ZW50LCRodWIpfHxzdHJfY29udGFpbnMoJGNvbnRlbnQsJy9rb25zdHJ1a3Rvci1wcnludGl2LycpKXJldHVybiAkY29udGVudDsKICAgICRibG9jaz0nPHAgY2xhc3M9InpnaC1hcnRpY2xlLWN1c3RvbS1kZXNpZ24tbGluayI+PHN0cm9uZz7QpdC+0YfQtdGC0LUg0YHRgtCy0L7RgNC40YLQuCDQstC70LDRgdC90LjQuSDQstCw0YDRltCw0L3Rgj88L3N0cm9uZz4g0J3QsCDRgdGC0L7RgNGW0L3RhtGWIDxhIGhyZWY9IicuZXNjX3VybCgkaHViKS4nIj7Cq9Ch0LLRltC5INC00LjQt9Cw0LnQvcK7PC9hPiDQvNC+0LbQvdCwINC+0LHRgNCw0YLQuCDRgtC+0LLQsNGALCDQstGW0LTQutGA0LjRgtC4INC+0L3Qu9Cw0LnQvS3QutC+0L3RgdGC0YDRg9C60YLQvtGAINCw0LHQviDQt9Cy0LXRgNC90YPRgtC40YHRjyDQtNC+INGB0YLRg9C00ZbRlyDQv9C+INC00L7Qv9C+0LzQvtCz0YMuPC9wPic7CiAgICBmb3JlYWNoKFsnPGgyPtCh0YXQvtC20ZYg0YHRgtCw0YLRgtGWPC9oMj4nLCc8aDIgaWQ9InphcHl0YW5uaWEtdmlkcG92aWRpIj4nLCc8IS0tIHdwOnlvYXN0L2ZhcS1ibG9jayddIGFzICRtYXJrZXIpewogICAgICAgICRwb3M9c3RycG9zKCRjb250ZW50LCRtYXJrZXIpOwogICAgICAgIGlmKCRwb3MhPT1mYWxzZSlyZXR1cm4gc3Vic3RyKCRjb250ZW50LDAsJHBvcykuJGJsb2NrLiJcbiIuc3Vic3RyKCRjb250ZW50LCRwb3MpOwogICAgfQogICAgcmV0dXJuICRjb250ZW50LiJcbiIuJGJsb2NrOwp9LDM0KTsKCgovKiBTZWFyY2ggQ29uc29sZSBjbHVzdGVyOiBwZXJzb25hbGl6ZWQgY2hpbGRyZW4ncyBib29rcy4gS2VlcCB0aGUgY29tbWVyY2lhbCBsYW5kaW5nIHBhZ2UKICogY2VudHJhbCwgd2hpbGUgaW5mb3JtYXRpb25hbCBhcnRpY2xlcyBhbnN3ZXIgbmFycm93ZXIgcXVlc3Rpb25zIGFuZCBsaW5rIGJhY2sgdG8gaXQuICovCmZ1bmN0aW9uIHpnaF9haV9ib29rc19sYW5kaW5nKCk6IHN0cmluZyB7IHJldHVybiBob21lX3VybCgnL3BlcnNvbmFsaXpvdmFuaS1keXRpYWNoaS1rbnloeS8nKTsgfQoKZnVuY3Rpb24gemdoX2FpX2lzX2Jvb2tfYXJ0aWNsZShpbnQgJHBvc3RfaWQpOiBib29sIHsKICAgIGlmKCdwb3N0JyE9PWdldF9wb3N0X3R5cGUoJHBvc3RfaWQpKXJldHVybiBmYWxzZTsKICAgICRmb2N1cz1tYl9zdHJ0b2xvd2VyKChzdHJpbmcpZ2V0X3Bvc3RfbWV0YSgkcG9zdF9pZCwnX3lvYXN0X3dwc2VvX2ZvY3Vza3cnLHRydWUpLCdVVEYtOCcpOwogICAgJHRpdGxlPW1iX3N0cnRvbG93ZXIoKHN0cmluZylnZXRfdGhlX3RpdGxlKCRwb3N0X2lkKSwnVVRGLTgnKTsKICAgICRoYXk9JGZvY3VzLicgJy4kdGl0bGU7CiAgICAkaGFzX2Jvb2s9bWJfc3RycG9zKCRoYXksJ9C60L3QuNCzJywwLCdVVEYtOCcpIT09ZmFsc2U7CiAgICAkaGFzX2NoaWxkPW1iX3N0cnBvcygkaGF5LCfQtNC40YLQuNC9JywwLCdVVEYtOCcpIT09ZmFsc2UKICAgICAgICB8fCBtYl9zdHJwb3MoJGhheSwn0ZbQvNC10L3QvScsMCwnVVRGLTgnKSE9PWZhbHNlCiAgICAgICAgfHwgbWJfc3RycG9zKCRoYXksJ9C/0LXRgNGB0L7QvdCw0LvRltC3JywwLCdVVEYtOCcpIT09ZmFsc2U7CiAgICByZXR1cm4gJGhhc19ib29rJiYkaGFzX2NoaWxkOwp9CgphZGRfZmlsdGVyKCd0aGVfY29udGVudCcsc3RhdGljIGZ1bmN0aW9uKHN0cmluZyAkY29udGVudCk6c3RyaW5newogICAgaWYoaXNfYWRtaW4oKXx8IWluX3RoZV9sb29wKCl8fCFpc19tYWluX3F1ZXJ5KCkpcmV0dXJuICRjb250ZW50OwoKICAgIGlmKGlzX3BhZ2UoMzk5OTYpKXsKICAgICAgICBpZihzdHJfY29udGFpbnMoJGNvbnRlbnQsJ3pnaC1ib29rLXNlYXJjaC1jbHVzdGVyJykpcmV0dXJuICRjb250ZW50OwogICAgICAgICRhcnRpY2xlcz1bCiAgICAgICAgICAgICdpbWVubmEta255aGEtZGxpYS1kaXRlaS15YWstdnlicmF0eS1uYWlrcmFzaGNoeWktdmFyaWFudC1kbGlhLW1hbGl1a2EnLAogICAgICAgICAgICAncGVyc29uYWxpem92YW5hLWtueWhhLXByby12YXNodS1keXR5bnUtc3R2b3JpdC1tYWhpaXUtY2h5dGFubmlhJywKICAgICAgICAgICAgJ3BlcnNvbmFsaXpvdmFuYS1keXRpYWNoYS1rbnloYS1zdHZvcml1aS1rYXprdS1kbGlhLXN2b2llaS1keXR5bnknLAogICAgICAgIF07CiAgICAgICAgJGNhcmRzPScnOwogICAgICAgIGZvcmVhY2goJGFydGljbGVzIGFzICRzbHVnKXsKICAgICAgICAgICAgJHBvc3Q9Z2V0X3BhZ2VfYnlfcGF0aCgkc2x1ZyxPQkpFQ1QsJ3Bvc3QnKTsKICAgICAgICAgICAgaWYoISRwb3N0IGluc3RhbmNlb2YgV1BfUG9zdHx8J3B1Ymxpc2gnIT09JHBvc3QtPnBvc3Rfc3RhdHVzKWNvbnRpbnVlOwogICAgICAgICAgICAkdXJsPWdldF9wZXJtYWxpbmsoJHBvc3QpOwogICAgICAgICAgICBpZighJHVybCljb250aW51ZTsKICAgICAgICAgICAgJGRlc2M9dHJpbSgoc3RyaW5nKWdldF9wb3N0X21ldGEoJHBvc3QtPklELCdfeW9hc3Rfd3BzZW9fbWV0YWRlc2MnLHRydWUpKTsKICAgICAgICAgICAgaWYoJGRlc2M9PT0nJykkZGVzYz0n0J/RgNCw0LrRgtC40YfQvdGWINC/0L7RgNCw0LTQuCDQv9C10YDQtdC0INCy0LjQsdC+0YDQvtC8INC/0LXRgNGB0L7QvdCw0LvRltC30L7QstCw0L3QvtGXINC60L3QuNCz0LguJzsKICAgICAgICAgICAgJGNhcmRzLj0nPGEgY2xhc3M9InpnaC1jYXJkIiBocmVmPSInLmVzY191cmwoJHVybCkuJyI+PHNwYW4gY2xhc3M9InpnLWljb24iPjxzdmcgY2xhc3M9InpnLXN2ZyIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHVzZSBocmVmPSIjemczLWJvb2siPjwvdXNlPjwvc3ZnPjwvc3Bhbj48aDM+Jy5lc2NfaHRtbChnZXRfdGhlX3RpdGxlKCRwb3N0KSkuJzwvaDM+PHA+Jy5lc2NfaHRtbCgkZGVzYykuJzwvcD48c3BhbiBjbGFzcz0iemdoLWNhcmQtYXJyb3ciPjxzdmcgY2xhc3M9InpnLXN2ZyIgdmlld0JveD0iMCAwIDI0IDI0IiBhcmlhLWhpZGRlbj0idHJ1ZSI+PHVzZSBocmVmPSIjemczLWFycm93Ij48L3VzZT48L3N2Zz48L3NwYW4+PC9hPic7CiAgICAgICAgfQogICAgICAgIGlmKCRjYXJkcyE9PScnKXsKICAgICAgICAgICAgJHNlY3Rpb249JzxzZWN0aW9uIGNsYXNzPSJ6Zy13cmFwIHpnaC1wYWdlLXNlY3Rpb24gemdoLWJvb2stc2VhcmNoLWNsdXN0ZXIiPjxwIGNsYXNzPSJ6Zy1raWNrZXIiPtCa0L7RgNC40YHQvdC+INC/0LXRgNC10LQg0LfQsNC80L7QstC70LXQ Подарунки — для близьких, до свят і за інтересами | Згадка
Перейти до вмісту
Увага! Можливі незначні затримки з доставкою замовлень «Новою поштою».Доставка по УкраїніПн–Пт 09:00–17:00 · Сб 09:00–14:00
ГоловнаПодарунки

Подарунок за людиною, нагодою або інтересом

Подарунки від Згадки

Не потрібно переглядати весь каталог навмання. Оберіть, для кого шукаєте подарунок, до якої нагоди або яка тема подобається людині — і переходьте до відповідної добірки.

Подарунок з принтом від Згадки

Кому шукаєте

Оберіть людину

Почніть із того, кому призначений подарунок. У добірках зібрані товари з відповідними написами, темами та сюжетами.

До якої нагоди

Оберіть подію

За інтересами

Оберіть тему

Як хочете замовити

Готовий подарунок або своя ідея

Як швидко підібрати подарунок

1

Визначте людину або тему

Мама, тато, колега, професія, хобі або конкретна подія одразу звужують вибір.

2

Оберіть формат

Футболка, чашка, худі, фартух, книга, жетон або інший товар.

3

Вирішіть, чи потрібна персоналізація

Готовий принт можна замовити одразу. Для власного напису або дизайну скористайтеся персоналізацією.

Питання й відповіді

Як знайти подарунок, якщо не знаю, що саме обрати?
Почніть із людини, нагоди або інтересу. На цій сторінці кожен сценарій веде до окремої тематичної добірки.
Чи можна зробити подарунок зі своїм написом або фото?
Так, якщо вибраний товар підтримує персоналізацію. Для власного макета відкрийте сторінку «Свій дизайн».
Чи погоджуєте макет перед виготовленням?
Для замовлень зі зміною напису або дизайном з нуля макет надсилається на погодження до запуску у виробництво.
Чи можна замовити готовий подарунок без персоналізації?
Так. У магазині є готові товари з принтами, для яких достатньо обрати доступні параметри.
Як відбувається доставка?
Актуальні умови відправлення й оплати наведені на сторінці «Доставка та оплата».