PD9waHAKLyoqCiAqIENyZWF0aXZlIEVsZW1lbnRzIC0gbGl2ZSBUaGVtZSAmIFBhZ2UgQnVpbGRlcgogKgogKiBAYXV0aG9yICAgIFdlYnNob3BXb3JrcwogKiBAY29weXJpZ2h0IDIwMTktMjAyNSBXZWJzaG9wV29ya3MuY29tCiAqIEBsaWNlbnNlICAgT25lIGRvbWFpbiBzdXBwb3J0IGxpY2Vuc2UKICovCmlmICghZGVmaW5lZCgnX1BTX1ZFUlNJT05fJykpIHsKICAgIGV4aXQ7Cn0KCmRlZmluZSgnX0NFX1ZFUlNJT05fJywgJzIuMTMuMC4yJyk7CmRlZmluZSgnX0NFX0FETUlOXycsIGRlZmluZWQoJ19QU19CT19BTExfVEhFTUVTX0RJUl8nKSk7CmRlZmluZSgnX0NFX1BBVEhfJywgX1BTX01PRFVMRV9ESVJfIC4gJ2NyZWF0aXZlZWxlbWVudHMvJyk7CmRlZmluZSgnX0NFX1VSTF8nLCAoX0NFX0FETUlOXyA/IF9NT0RVTEVfRElSXyA6ICdtb2R1bGVzLycpIC4gJ2NyZWF0aXZlZWxlbWVudHMvJyk7CmRlZmluZSgnX0NFX0FTU0VUU19QQVRIXycsIF9DRV9QQVRIXyAuICd2aWV3cy8nKTsKZGVmaW5lKCdfQ0VfQVNTRVRTX1VSTF8nLCBfQ0VfVVJMXyAuICd2aWV3cy8nKTsKZGVmaW5lKCdfQ0VfVEVNUExBVEVTXycsIF9DRV9QQVRIXyAuICd2aWV3cy90ZW1wbGF0ZXMvJyk7Cgpjb25zdCBfQ0VfQ0xBU1NFU18gPSBbCiAgICAnQ0VBc3NldE1hbmFnZXInID0+ICdjbGFzc2VzL2Fzc2V0cy9DRUFzc2V0TWFuYWdlci5waHAnLAogICAgJ0NFUmV2aXNpb24nID0+ICdjbGFzc2VzL0NFUmV2aXNpb24ucGhwJywKICAgICdDRVRlbXBsYXRlJyA9PiAnY2xhc3Nlcy9DRVRlbXBsYXRlLnBocCcsCiAgICAnQ0VUaGVtZScgPT4gJ2NsYXNzZXMvQ0VUaGVtZS5waHAnLAogICAgJ0NFQ29udGVudCcgPT4gJ2NsYXNzZXMvQ0VDb250ZW50LnBocCcsCiAgICAnQ0VGb250JyA9PiAnY2xhc3Nlcy9DRUZvbnQucGhwJywKICAgICdDRUljb25TZXQnID0+ICdjbGFzc2VzL0NFSWNvblNldC5waHAnLApdOwpzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoZnVuY3Rpb24gKCRjbGFzcykgewogICAgaXNzZXQoX0NFX0NMQVNTRVNfWyRjbGFzc10pICYmIHJlcXVpcmUgX0NFX1BBVEhfIC4gX0NFX0NMQVNTRVNfWyRjbGFzc107Cn0pOwpyZXF1aXJlX29uY2UgX0NFX1BBVEhfIC4gJ2NsYXNzZXMvQ0VTbWFydHkucGhwJzsKcmVxdWlyZV9vbmNlIF9DRV9QQVRIXyAuICdpbmNsdWRlcy9wbHVnaW4ucGhwJzsKCmNsYXNzIENyZWF0aXZlRWxlbWVudHMgZXh0ZW5kcyBNb2R1bGUKewogICAgY29uc3QgVklFV0VEX1BST0RVQ1RTX0xJTUlUID0gNTA7CgogICAgcHJvdGVjdGVkIHN0YXRpYyAkY29udHJvbGxlcjsKCiAgICBwcm90ZWN0ZWQgc3RhdGljICR0ZW1wbGF0ZTsKCiAgICBwcm90ZWN0ZWQgc3RhdGljICRsYXlvdXQ7CgogICAgcHVibGljICRjb250cm9sbGVycyA9IFsKICAgICAgICAnYWpheCcsCiAgICAgICAgJ3ByZXZpZXcnLAogICAgXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG5hbWUgPSBudWxsLCAkY29udGV4dCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAnY3JlYXRpdmVlbGVtZW50cyc7CiAgICAgICAgJHRoaXMtPnRhYiA9ICdjb250ZW50X21hbmFnZW1lbnQnOwogICAgICAgICR0aGlzLT52ZXJzaW9uID0gJzIuMTMuMC4yJzsKICAgICAgICAkdGhpcy0+YXV0aG9yID0gJ1dlYnNob3BXb3Jrcyc7CiAgICAgICAgJHRoaXMtPm1vZHVsZV9rZXkgPSAnN2E1ZWJjYzIxYzE3NjQ2NzVmMWRiNWQwZjBlYWNmZTUnOwogICAgICAgICR0aGlzLT5wc192ZXJzaW9uc19jb21wbGlhbmN5ID0gWydtaW4nID0+ICcxLjcuNCcsICdtYXgnID0+IF9QU19WRVJTSU9OX107CiAgICAgICAgJHRoaXMtPmJvb3RzdHJhcCA9IHRydWU7CiAgICAgICAgJHRoaXMtPmRpc3BsYXlOYW1lID0gJHRoaXMtPmwoJ0NyZWF0aXZlIEVsZW1lbnRzIC0gbGl2ZSBUaGVtZSAmIFBhZ2UgQnVpbGRlcicpOwogICAgICAgICR0aGlzLT5kZXNjcmlwdGlvbiA9ICR0aGlzLT5sKCdUaGUgbW9zdCBhZHZhbmNlZCBmcm9udGVuZCBkcmFnICYgZHJvcCBwYWdlIGJ1aWxkZXIuIENyZWF0ZSBoaWdoLWVuZCwgcGl4ZWwgcGVyZmVjdCB3ZWJzaXRlcyBhdCByZWNvcmQgc3BlZWRzLiBBbnkgdGhlbWUsIGFueSBwYWdlLCBhbnkgZGVzaWduLicpOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbCgpCiAgICB7CiAgICAgICAgcmVxdWlyZV9vbmNlIF9DRV9QQVRIXyAuICdjbGFzc2VzL0NFRGF0YWJhc2UucGhwJzsKCiAgICAgICAgaWYgKFNob3A6OmlzRmVhdHVyZUFjdGl2ZSgpKSB7CiAgICAgICAgICAgIFNob3A6OnNldENvbnRleHQoU2hvcDo6Q09OVEVYVF9BTEwpOwogICAgICAgIH0KICAgICAgICBDRURhdGFiYXNlOjppbml0Q29uZmlncygpOwoKICAgICAgICBpZiAoIUNFRGF0YWJhc2U6OmNyZWF0ZVRhYmxlcygpKSB7CiAgICAgICAgICAgICR0aGlzLT5fZXJyb3JzW10gPSBEYjo6Z2V0SW5zdGFuY2UoKS0+Z2V0TXNnRXJyb3IoKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVzID0gcGFyZW50OjppbnN0YWxsKCkgJiYgQ0VEYXRhYmFzZTo6dXBkYXRlVGFicygpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKENFRGF0YWJhc2U6OmdldEhvb2tzKCkgYXMgJGhvb2spIHsKICAgICAgICAgICAgICAgICRyZXMgPSAkcmVzICYmICR0aGlzLT5yZWdpc3Rlckhvb2soJGhvb2ssIG51bGwsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKCkKICAgIHsKICAgICAgICBmb3JlYWNoIChUYWI6OmdldENvbGxlY3Rpb25Gcm9tTW9kdWxlKCR0aGlzLT5uYW1lKSBhcyAkdGFiKSB7CiAgICAgICAgICAgICR0YWItPmRlbGV0ZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBhcmVudDo6dW5pbnN0YWxsKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVuYWJsZSgkZm9yY2VfYWxsID0gZmFsc2UpCiAgICB7CiAgICAgICAgcmV0dXJuIHBhcmVudDo6ZW5hYmxlKCRmb3JjZV9hbGwpCiAgICAgICAgICAgICYmIERiOjpnZXRJbnN0YW5jZSgpLT51cGRhdGUoJ3RhYicsIFsnYWN0aXZlJyA9PiAxXSwgJ2Btb2R1bGVgID0gImNyZWF0aXZlZWxlbWVudHMiIEFORCBgaWNvbmAgPSAiY2UiJywgMSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRpc2FibGUoJGZvcmNlX2FsbCA9IGZhbHNlKQogICAgewogICAgICAgIHJldHVybiBEYjo6Z2V0SW5zdGFuY2UoKS0+dXBkYXRlKCd0YWInLCBbJ2FjdGl2ZScgPT4gMF0sICdgbW9kdWxlYCA9ICJjcmVhdGl2ZWVsZW1lbnRzIiBBTkQgYGljb25gID0gImNlIicsIDEpCiAgICAgICAgICAgICYmIHBhcmVudDo6ZGlzYWJsZSgkZm9yY2VfYWxsKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkT3ZlcnJpZGUoJGNsYXNzbmFtZSkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gcGFyZW50OjphZGRPdmVycmlkZSgkY2xhc3NuYW1lKTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGV4KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKQogICAgewogICAgICAgIFRvb2xzOjpyZWRpcmVjdEFkbWluKCR0aGlzLT5jb250ZXh0LT5saW5rLT5nZXRBZG1pbkxpbmsoJ0FkbWluQ0VUaGVtZXMnKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tEaXNwbGF5QmFja09mZmljZUhlYWRlcigkcGFyYW1zID0gW10pCiAgICB7CiAgICAgICAgJHRoaXMtPmNoZWNrVGhlbWVDaGFuZ2UoKTsKCiAgICAgICAgQ29uZmlndXJhdGlvbjo6Z2V0KCJQU19BTExPV19IVE1MX1x4NDlGUkFNRSIpIHx8IENvbmZpZ3VyYXRpb246OnVwZGF0ZVZhbHVlKCJQU19BTExPV19IVE1MX1x4NDlGUkFNRSIsIDEpOwogICAgICAgIENvbmZpZ3VyYXRpb246OmdldCgnUFNfU1NMX0VOQUJMRUQnKSAmJiAhQ29uZmlndXJhdGlvbjo6Z2V0KCdQU19TU0xfRU5BQkxFRF9FVkVSWVdIRVJFJykgJiYgQ29uZmlndXJhdGlvbjo6c2V0KCdQU19TU0xfRU5BQkxFRF9FVkVSWVdIRVJFJywgMSk7CgogICAgICAgIC8vIEhhbmRsZSBtaWdyYXRlCiAgICAgICAgaWYgKChDb25maWd1cmF0aW9uOjpnZXRHbG9iYWxWYWx1ZSgnQ0VfTUlHUkFURScpIHx8IFRvb2xzOjpnZXRJc3NldCgnQ0VNaWdyYXRlJykpICYmIERiOjpnZXRJbnN0YW5jZSgpLT5leGVjdXRlUygiU0hPVyBUQUJMRVMgTElLRSAnJV9jZV9tZXRhJyIpKSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSBfQ0VfUEFUSF8gLiAnY2xhc3Nlcy9DRU1pZ3JhdGUucGhwJzsKICAgICAgICAgICAgQ0VNaWdyYXRlOjpyZWdpc3RlckphdmFzY3JpcHRzKCk7CiAgICAgICAgfSBlbHNlaWYgKFRvb2xzOjpnZXRJc3NldCgnQ0VVcGdyYWRlJykgJiYgKCR0aGlzLT5pbnN0YWxsZWQgPSAoaW50KSAkdGhpcy0+ZGF0YWJhc2VfdmVyc2lvbiA9IFRvb2xzOjpnZXRWYWx1ZSgnQ0VVcGdyYWRlJykpICYmIE1vZHVsZTo6aW5pdFVwZ3JhZGVNb2R1bGUoJHRoaXMpKSB7CiAgICAgICAgICAgICR0aGlzLT5ydW5VcGdyYWRlTW9kdWxlKCk7CiAgICAgICAgICAgICR0aGlzLT5jb250ZXh0LT5jb250cm9sbGVyLT5lcnJvcnMgPSAkdGhpcy0+X2Vycm9yczsKICAgICAgICAgICAgJHRoaXMtPmNvbnRleHQtPmNvbnRyb2xsZXItPmNvbmZpcm1hdGlvbnMgPSAkdGhpcy0+X2NvbmZpcm1hdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAkdWlkX2FkZGl0aW9uYWwgPSAnJzsKICAgICAgICAkZm9vdGVyX3Byb2R1Y3QgPSAnJzsKICAgICAgICBwcmVnX21hdGNoKCdgLyhbXi9dKykvKFxkKykvZWRpdFxiYCcsICRfU0VSVkVSWydSRVFVRVNUX1VSSSddLCAkcmVxKTsKICAgICAgICAkY29udHJvbGxlciA9IHN0cnRvbG93ZXIoVG9vbHM6OmdldFZhbHVlKCdjb250cm9sbGVyJykpOwoKICAgICAgICBzd2l0Y2ggKCRjb250cm9sbGVyKSB7CiAgICAgICAgICAgIGNhc2UgJ2FkbWluY2V0ZW1wbGF0ZXMnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OlRFTVBMQVRFOwogICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9jZV90ZW1wbGF0ZScpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWluY2V0aGVtZXMnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBUb29sczo6Z2V0SXNzZXQoJ2lkX2NlX3RlbXBsYXRlJykgPyBDRVxVSWQ6OlRFTVBMQVRFIDogQ0VcVUlkOjpUSEVNRTsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfY2VfdGVtcGxhdGUnLCBUb29sczo6Z2V0VmFsdWUoJ2lkX2NlX3RoZW1lJykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWluY2Vjb250ZW50JzoKICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpDT05URU5UOwogICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9jZV9jb250ZW50Jyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWRtaW5jbXNjb250ZW50JzoKICAgICAgICAgICAgICAgIGlmICgkcmVxICYmICdjYXRlZ29yeScgPT09ICRyZXFbMV0gfHwgVG9vbHM6OmdldElzc2V0KCdhZGRjbXNfY2F0ZWdvcnknKSB8fCBUb29sczo6Z2V0SXNzZXQoJ3VwZGF0ZWNtc19jYXRlZ29yeScpKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OkNNU19DQVRFR09SWTsKICAgICAgICAgICAgICAgICAgICAkaWQgPSAoaW50KSBUb29sczo6Z2V0VmFsdWUoJ2lkX2Ntc19jYXRlZ29yeScsICRyZXEgPyAkcmVxWzJdIDogMCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkaWRfdHlwZSA9IENFXFVJZDo6Q01TOwogICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9jbXMnLCAkcmVxID8gJHJlcVsyXSA6IDApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWlucHJvZHVjdHMnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OlBST0RVQ1Q7CiAgICAgICAgICAgICAgICAkaWQgPSAoaW50KSBUb29sczo6Z2V0VmFsdWUoJ2lkX3Byb2R1Y3QnLCBiYXNlbmFtZShleHBsb2RlKCc/JywgJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pWzBdKSk7CgogICAgICAgICAgICAgICAgJGZvb3Rlcl9wcm9kdWN0ID0gbmV3IENFXFVJZChDRUNvbnRlbnQ6OmdldEZvb3RlclByb2R1Y3RJZCgkaWQpLCBDRVxVSWQ6OkNPTlRFTlQsIDAsIFNob3A6OmdldENvbnRleHQoKSA9PT0gU2hvcDo6Q09OVEVYVF9TSE9QID8gJHRoaXMtPmNvbnRleHQtPnNob3AtPmlkIDogMCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWRtaW5jYXRlZ29yaWVzJzoKICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpDQVRFR09SWTsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfY2F0ZWdvcnknLCAkcmVxID8gJHJlcVsyXSA6IDApOwoKICAgICAgICAgICAgICAgIChpbnQpIF9QU19WRVJTSU9OXyA8IDggfHwgJHVpZF9hZGRpdGlvbmFsID0gbmV3IENFXFVJZCgkaWQsIENFXFVJZDo6Q0FURUdPUllfQURESVRJT05BTCwgMCwgU2hvcDo6Z2V0Q29udGV4dCgpID09PSBTaG9wOjpDT05URVhUX1NIT1AgPyAkdGhpcy0+Y29udGV4dC0+c2hvcC0+aWQgOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbm1hbnVmYWN0dXJlcnMnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6Ok1BTlVGQUNUVVJFUjsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfbWFudWZhY3R1cmVyJywgJHJlcSA/ICRyZXFbMl0gOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbnN1cHBsaWVycyc6CiAgICAgICAgICAgICAgICAkaWRfdHlwZSA9IENFXFVJZDo6U1VQUExJRVI7CiAgICAgICAgICAgICAgICAkaWQgPSAoaW50KSBUb29sczo6Z2V0VmFsdWUoJ2lkX3N1cHBsaWVyJywgJHJlcSA/ICRyZXFbMl0gOiAwKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbnhpcHBvc3QnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OlhJUEJMT0dfUE9TVDsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfeGlwcG9zdHMnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbnN0YmxvZyc6CiAgICAgICAgICAgICAgICAkaWRfdHlwZSA9IENFXFVJZDo6U1RCTE9HX1BPU1Q7CiAgICAgICAgICAgICAgICAkaWQgPSAoaW50KSBUb29sczo6Z2V0VmFsdWUoJ2lkX3N0X2Jsb2cnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZG1pbmJsb2dwb3N0cyc6CiAgICAgICAgICAgICAgICBpZiAoJ2FkdmFuY2VibG9nJyA9PT0gJHRoaXMtPmNvbnRleHQtPmNvbnRyb2xsZXItPm1vZHVsZS0+bmFtZSkgewogICAgICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpBRFZBTkNFQkxPR19QT1NUOwogICAgICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfcG9zdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWlucHNibG9nYmxvZ3MnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OlBTQkxPR19QT1NUOwogICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9wc2Jsb2dfYmxvZycpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWludHZjbXNwb3N0JzoKICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpUVkNNU0JMT0dfUE9TVDsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfdHZjbXNwb3N0cycpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWluZXRzYmxvZ3Bvc3QnOgogICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OkVUU19CTE9HX1BPU1Q7CiAgICAgICAgICAgICAgICAvLyBubyBicmVhawogICAgICAgICAgICBjYXNlICdhZG1pbnliY2Jsb2dwb3N0JzoKICAgICAgICAgICAgICAgIGlzc2V0KCRpZF90eXBlKSB8fCAkaWRfdHlwZSA9IENFXFVJZDo6WUJDX0JMT0dfUE9TVDsKICAgICAgICAgICAgICAgICRpZCA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgnaWRfcG9zdCcpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FkbWlubW9kdWxlcyc6CiAgICAgICAgICAgICAgICAkY29uZmlndXJlID0gc3RydG9sb3dlcihUb29sczo6Z2V0VmFsdWUoJ2NvbmZpZ3VyZScpKTsKCiAgICAgICAgICAgICAgICBpZiAoJ3liY19ibG9nJyA9PT0gJGNvbmZpZ3VyZSAmJiBUb29sczo6Z2V0VmFsdWUoJ2NvbnRyb2wnKSA9PT0gJ3Bvc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQkMgZml4IGZvciB5YmNfYmxvZyA8IDQuNC45CiAgICAgICAgICAgICAgICAgICAgJGlkX3R5cGUgPSBDRVxVSWQ6OllCQ19CTE9HX1BPU1Q7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9wb3N0Jyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJ3ByZXN0YWJsb2cnID09PSAkY29uZmlndXJlICYmIFRvb2xzOjpnZXRJc3NldCgnZWRpdE5ld3MnKSkgewogICAgICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpQUkVTVEFCTE9HX1BPU1Q7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZE4nKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgnaGlibG9nJyA9PT0gJGNvbmZpZ3VyZSkgewogICAgICAgICAgICAgICAgICAgICRpZF90eXBlID0gQ0VcVUlkOjpISUJMT0dfUE9TVDsKICAgICAgICAgICAgICAgICAgICAkaWQgPSAwOwogICAgICAgICAgICAgICAgICAgICRoaWRlRWRpdG9yID0gW107CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYWRtaW5tYWludGVuYW5jZSc6CiAgICAgICAgICAgICAgICAkaWRfdHlwZSA9IENFXFVJZDo6Q09OVEVOVDsKICAgICAgICAgICAgICAgICRpZCA9IENFQ29udGVudDo6Z2V0TWFpbnRlbmFuY2VJZCgpOwoKICAgICAgICAgICAgICAgICR1aWRzID0gQ0VcVUlkOjpnZXRCdWlsdExpc3QoJGlkLCAkaWRfdHlwZSwgJHRoaXMtPmNvbnRleHQtPnNob3AtPmlkKTsKICAgICAgICAgICAgICAgICRoaWRlRWRpdG9yID0gZW1wdHkoJHVpZHMpID8gJHVpZHMgOiBhcnJheV9rZXlzKCR1aWRzWyR0aGlzLT5jb250ZXh0LT5zaG9wLT5pZF0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJGlkKSkgewogICAgICAgICAgICBzZWxmOjokY29udHJvbGxlciA9ICR0aGlzLT5jb250ZXh0LT5jb250cm9sbGVyOwogICAgICAgICAgICB2ZXJzaW9uX2NvbXBhcmUoX1BTX1ZFUlNJT05fLCAnMS43LjcnLCAnPCcpICYmIHNlbGY6OiRjb250cm9sbGVyLT5hZGRKcXVlcnkoKTsKICAgICAgICAgICAgc2VsZjo6JGNvbnRyb2xsZXItPmpzX2ZpbGVzW10gPSAkdGhpcy0+X3BhdGggLiAndmlld3MvanMvYWRtaW4tY2UuanM/dj0nIC4gX0NFX1ZFUlNJT05fOwogICAgICAgICAgICBzZWxmOjokY29udHJvbGxlci0+Y3NzX2ZpbGVzWyR0aGlzLT5fcGF0aCAuICd2aWV3cy9jc3MvYWRtaW4tY2UuY3NzP3Y9JyAuIF9DRV9WRVJTSU9OX10gPSAnYWxsJzsKCiAgICAgICAgICAgICR1aWQgPSBuZXcgQ0VcVUlkKCRpZCwgJGlkX3R5cGUsIDAsIFNob3A6OmdldENvbnRleHQoKSA9PT0gU2hvcDo6Q09OVEVYVF9TSE9QID8gJHRoaXMtPmNvbnRleHQtPnNob3AtPmlkIDogMCk7CgogICAgICAgICAgICBpc3NldCgkaGlkZUVkaXRvcikgfHwgJGhpZGVFZGl0b3IgPSAkdWlkLT5nZXRCdWlsdExhbmdJZExpc3QoKTsKCiAgICAgICAgICAgICRkaXNwbGF5X3N1cHBsaWVycyA9IENvbmZpZ3VyYXRpb246OmdldCgnUFNfRElTUExBWV9TVVBQTElFUlMnKTsKICAgICAgICAgICAgJGRpc3BsYXlfbWFudWZhY3R1cmVycyA9IHZlcnNpb25fY29tcGFyZShfUFNfVkVSU0lPTl8sICcxLjcuNycsICc8JykgPyAkZGlzcGxheV9zdXBwbGllcnMgOiBDb25maWd1cmF0aW9uOjpnZXQoJ1BTX0RJU1BMQVlfTUFOVUZBQ1RVUkVSUycpOwoKICAgICAgICAgICAgTWVkaWE6OmFkZEpzRGVmKFsKICAgICAgICAgICAgICAgICdjZUFkbWluJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgJ3VpZCcgPT4gIiR1aWQiLAogICAgICAgICAgICAgICAgICAgICdoaWRlRWRpdG9yJyA9PiAkaGlkZUVkaXRvciwKICAgICAgICAgICAgICAgICAgICAndWlkQWRkaXRpb25hbCcgPT4gIiR1aWRfYWRkaXRpb25hbCIsCiAgICAgICAgICAgICAgICAgICAgJ2hpZGVBZGRpdGlvbmFsRWRpdG9yJyA9PiAkdWlkX2FkZGl0aW9uYWwgPyAkdWlkX2FkZGl0aW9uYWwtPmdldEJ1aWx0TGFuZ0lkTGlzdCgpIDogW10sCiAgICAgICAgICAgICAgICAgICAgJ2Zvb3RlclByb2R1Y3QnID0+ICIkZm9vdGVyX3Byb2R1Y3QiLAogICAgICAgICAgICAgICAgICAgICdpMThuJyA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdlZGl0JyA9PiAkdGhpcy0+dHJhbnMoJ0VkaXQnLCBbXSwgJ0FkbWluLkFjdGlvbnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRDRScgPT4gQ0VcX18oJ0VkaXQgd2l0aCBDcmVhdGl2ZSBFbGVtZW50cycpLAogICAgICAgICAgICAgICAgICAgICAgICAnc2F2ZScgPT4gQ0VcX18oJ1BsZWFzZSBzYXZlIHRoZSBmb3JtIGJlZm9yZSBlZGl0aW5nIHdpdGggQ3JlYXRpdmUgRWxlbWVudHMnKSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICdlZGl0b3JVcmwnID0+IFRvb2xzOjpzYWZlT3V0cHV0KCR0aGlzLT5jb250ZXh0LT5saW5rLT5nZXRBZG1pbkxpbmsoJ0FkbWluQ0VFZGl0b3InKSAuICcmdWlkPScpLAogICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZXMnID0+IExhbmd1YWdlOjpnZXRMYW5ndWFnZXModHJ1ZSwgJHVpZC0+aWRfc2hvcCksCiAgICAgICAgICAgICAgICAgICAgJ2VkaXRTdXBwbGllcnMnID0+IChpbnQpICRkaXNwbGF5X3N1cHBsaWVycywKICAgICAgICAgICAgICAgICAgICAnZWRpdE1hbnVmYWN0dXJlcnMnID0+IChpbnQpICRkaXNwbGF5X21hbnVmYWN0dXJlcnMsCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgJHRoaXMtPmNvbnRleHQtPnNtYXJ0eS0+YXNzaWduKCdlZGl0X3dpZHRoX2NlJywgJHRoaXMtPmNvbnRleHQtPmxpbmstPmdldEFkbWluTGluaygnQWRtaW5DRUVkaXRvcicpKTsKICAgICAgICB9CgogICAgICAgIGlmICgxID09PSAkcGVybSA9IChpbnQpIFRvb2xzOjpnZXRWYWx1ZSgncGVybScpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb250ZXh0LT5jb250cm9sbGVyLT5lcnJvcnNbXSA9ICR0aGlzLT50cmFucygnWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldyB0aGlzLicsIFtdLCAnQWRtaW4uTm90aWZpY2F0aW9ucy5FcnJvcicpOwogICAgICAgIH0gZWxzZWlmICgyID09PSAkcGVybSkgewogICAgICAgICAgICAkdGhpcy0+Y29udGV4dC0+Y29udHJvbGxlci0+ZXJyb3JzW10gPSAkdGhpcy0+dHJhbnMoJ1lvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGVkaXQgdGhpcy4nLCBbXSwgJ0FkbWluLk5vdGlmaWNhdGlvbnMuRXJyb3InKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5mZXRjaChfQ0VfVEVNUExBVEVTXyAuICdob29rL2JhY2tvZmZpY2VfaGVhZGVyLnRwbCcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBob29rRGFzaGJvYXJkWm9uZU9uZSgkcGFyYW1zKQogICAgewogICAgICAgIGlmICghQ29uZmlndXJhdGlvbjo6Z2V0KCdlbGVtZW50b3JfZGFzaGJvYXJkX3dpZGdldCcsIG51bGwsIG51bGwsIG51bGwsIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcmVxdWlyZV9vbmNlIF9DRV9QQVRIXyAuICdpbmNsdWRlcy9hcGkucGhwJzsKCiAgICAgICAgJHJlY2VudF9pdGVtcyA9IFtdOwogICAgICAgICR0aW1lX2Zvcm1hdHRlciA9IG5ldyBJbnRsRGF0ZUZvcm1hdHRlcigkdGhpcy0+Y29udGV4dC0+bGFuZ3VhZ2UtPmxvY2FsZSwgSW50bERhdGVGb3JtYXR0ZXI6Ok5PTkUsIEludGxEYXRlRm9ybWF0dGVyOjpTSE9SVCk7CiAgICAgICAgJGRhdGVfZm9ybWF0dGVyID0gbmV3IEludGxEYXRlRm9ybWF0dGVyKCR0aGlzLT5jb250ZXh0LT5sYW5ndWFnZS0+bG9jYWxlLCBJbnRsRGF0ZUZvcm1hdHRlcjo6TUVESVVNLCBJbnRsRGF0ZUZvcm1hdHRlcjo6Tk9ORSk7CiAgICAgICAgJGRhdGVfZm9ybWF0dGVyLT5zZXRQYXR0ZXJuKHN0cl9yZXBsYWNlKFsneScsICdZJ10sICcnLCAkZGF0ZV9mb3JtYXR0ZXItPmdldFBhdHRlcm4oKSkpOwogICAgICAgICRlbXBsb3llZSA9ICR0aGlzLT5jb250ZXh0LT5lbXBsb3llZTsKICAgICAgICAkc2hvcHMgPSBTaG9wOjpnZXRDb250ZXh0TGlzdFNob3BJRCgpOwogICAgICAgICRyb3dzID0gRGI6OmdldEluc3RhbmNlKCktPmV4ZWN1dGVTKCcKICAgICAgICAgICAgU0VMRUNUIGBpZGAsIFJJR0hUKGBpZGAsIDIpICsgMCBBUyBgaWRfc2hvcGAsIGB2YWx1ZWAgRlJPTSAnIC4gX0RCX1BSRUZJWF8gLiAnY2VfbWV0YQogICAgICAgICAgICBXSEVSRSBgbmFtZWAgPSAiX2VkaXRfbG9jayIgQU5EIGB2YWx1ZWAgTElLRSAiJTonIC4gKGludCkgJGVtcGxveWVlLT5pZCAuICciCiAgICAgICAgICAgIEhBVklORyBgaWRfc2hvcGAgSU4gKDAsJyAuIGltcGxvZGUoJywnLCBhcnJheV9tYXAoJ2ludHZhbCcsICRzaG9wcykpIC4gJykKICAgICAgICAgICAgT1JERVIgQlkgYHZhbHVlYCBERVNDIExJTUlUIDMKICAgICAgICAnKSA/OiBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHJvd3MgYXMgJiRyb3cpIHsKICAgICAgICAgICAgJHVpZCA9IENFXFVJZDo6cGFyc2UoJHJvd1snaWQnXSk7CiAgICAgICAgICAgICRwb3N0ID0gQ0VcV1BQb3N0OjpnZXRJbnN0YW5jZSgkdWlkKTsKICAgICAgICAgICAgJGRhdGV0aW1lID0gZXhwbG9kZSgnOicsICRyb3dbJ3ZhbHVlJ10pWzBdOwogICAgICAgICAgICAkcmVjZW50X2l0ZW1zW10gPSBbCiAgICAgICAgICAgICAgICAnaWQnID0+ICRyb3dbJ2lkJ10sCiAgICAgICAgICAgICAgICAndGl0bGUnID0+ICIjeyR1aWQtPmlkfSB7JHBvc3QtPnBvc3RfdGl0bGV9IiwKICAgICAgICAgICAgICAgICdsYW5nJyA9PiBzdHJ0b3VwcGVyKExhbmd1YWdlOjpnZXRJc29CeUlkKCR1aWQtPmlkX2xhbmcpKSwKICAgICAgICAgICAgICAgICd0eXBlJyA9PiBDRVxfXygkdWlkLT5pZF90eXBlIDwgOSB8fCAkdWlkLT5pZF90eXBlID09IDE3ID8gc3RyX3JlcGxhY2UoJ0NFJywgJycsIGdldF9jbGFzcygkcG9zdC0+X29iaikpIDogJ1Bvc3QnKSwKICAgICAgICAgICAgICAgICdkYXRlJyA9PiAkZGF0ZV9mb3JtYXR0ZXItPmZvcm1hdCgkZGF0ZXRpbWUpIC4gJyAnIC4gJHRpbWVfZm9ybWF0dGVyLT5mb3JtYXQoJGRhdGV0aW1lKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5mZXRjaChfQ0VfVEVNUExBVEVTXyAuICdob29rL2Rhc2hib2FyZF96b25lX29uZS50cGwnLCBudWxsLCBudWxsLCBbCiAgICAgICAgICAgICdyZWNlbnRfaXRlbXMnID0+ICYkcmVjZW50X2l0ZW1zLAogICAgICAgICAgICAnbXVsdGlsYW5nJyA9PiBjb3VudChMYW5ndWFnZTo6Z2V0TGFuZ3VhZ2VzKHRydWUsIGZhbHNlLCB0cnVlKSkgPiAxLAogICAgICAgICAgICAnZmVlZF9kYXRhJyA9PiBDRVxBcGk6OmdldEZlZWREYXRhKCksCiAgICAgICAgICAgICdjdXJyZW50X3ZlcnNpb24nID0+ICR0aGlzLT52ZXJzaW9uLAogICAgICAgICAgICAnbGF0ZXN0X3ZlcnNpb24nID0+ICRsYXRlc3QgPSBDb25maWd1cmF0aW9uS1BJOjpnZXRHbG9iYWxWYWx1ZSgnQ0VfTEFURVNUX1ZFUlNJT04nKSwKICAgICAgICAgICAgJ3ZlcnNpb25fc3RhdHVzJyA9PiAkc3RhdHVzID0gdmVyc2lvbl9jb21wYXJlKCR0aGlzLT5wc192ZXJzaW9uc19jb21wbGlhbmN5WydtYXgnXSwgX1BTX1ZFUlNJT05fLCAnPCcpID8gJ2RhbmdlcicgOiAoCiAgICAgICAgICAgICAgICB2ZXJzaW9uX2NvbXBhcmUoJHRoaXMtPnZlcnNpb24sICRsYXRlc3QsICc8JykgPyAnd2FybmluZycgOiAnc3VjY2VzcycKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3ZlcnNpb25fc3RhdHVzX2xhYmVsJyA9PiBDRVxfXyhbCiAgICAgICAgICAgICAgICAnc3VjY2VzcycgPT4gJ1VwLXRvLWRhdGUnLAogICAgICAgICAgICAgICAgJ3dhcm5pbmcnID0+ICdVcGRhdGUgQXZhaWxhYmxlJywKICAgICAgICAgICAgICAgICdkYW5nZXInID0+ICdVcGRhdGUgUmVxdWlyZWQnLAogICAgICAgICAgICBdWyRzdGF0dXNdKSwKICAgICAgICAgICAgJ2FkZGNtc191cmwnID0+IFByb2ZpbGU6OmdldFByb2ZpbGVBY2Nlc3MoJGVtcGxveWVlLT5pZF9wcm9maWxlLCBUYWI6OmdldElkRnJvbUNsYXNzTmFtZSgnQWRtaW5DbXNDb250ZW50JykpWydhZGQnXQogICAgICAgICAgICAgICAgPyAkdGhpcy0+Y29udGV4dC0+bGluay0+Z2V0QWRtaW5MaW5rKCdBZG1pbkNtc0NvbnRlbnQnLCB0cnVlLCBbJ2FkZGNtcycgPT4gMV0pIDogJycsCiAgICAgICAgICAgICdlZGl0b3JfdXJsJyA9PiAkdGhpcy0+Y29udGV4dC0+bGluay0+Z2V0QWRtaW5MaW5rKCdBZG1pbkNFRWRpdG9yJyksCiAgICAgICAgICAgICd1cGRhdGVfdXJsJyA9PiBQcm9maWxlOjpnZXRQcm9maWxlQWNjZXNzKCRlbXBsb3llZS0+aWRfcHJvZmlsZSwgVGFiOjpnZXRJZEZyb21DbGFzc05hbWUoJ0FkbWluTW9kdWxlc1VwZGF0ZXMnKSlbJ3ZpZXcnXQogICAgICAgICAgICAgICAgJiYgJ3N1Y2Nlc3MnICE9PSAkc3RhdHVzID8gJHRoaXMtPmNvbnRleHQtPmxpbmstPmdldEFkbWluTGluaygnQWRtaW5Nb2R1bGVzVXBkYXRlcycpIDogJycsCiAgICAgICAgXSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tBY3Rpb25Gcm9udENvbnRyb2xsZXJJbml0QWZ0ZXIoJHBhcmFtcyA9IFtdKQogICAgewogICAgICAgIGlmIChudWxsICE9PSBzZWxmOjokY29udHJvbGxlcikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OiRjb250cm9sbGVyID0gJHRoaXMtPmNvbnRleHQtPmNvbnRyb2xsZXI7CgogICAgICAgIGlmICgoJ2F1dGhlbnRpY2F0aW9uJyA9PT0gc2VsZjo6JGNvbnRyb2xsZXItPnBocF9zZWxmIHx8ICdyZWdpc3RyYXRpb24nID09PSBzZWxmOjokY29udHJvbGxlci0+cGhwX3NlbGYpCiAgICAgICAgICAgICYmICFzZWxmOjokY29udHJvbGxlci0+YWpheCAmJiAkdGhpcy0+Y29udGV4dC0+Y3VzdG9tZXItPmxvZ2dlZCAmJiBzZWxmOjpnZXRQcmV2aWV3VUlkKGZhbHNlKQogICAgICAgICkgeyAvLyBMb2dpbiAmIFJlZ2lzdHJhdGlvbiBwYWdlIFByZXZpZXcgZml4CiAgICAgICAgICAgIHNlbGY6OiRjb250cm9sbGVyLT5hamF4ID0gdHJ1ZTsKCiAgICAgICAgICAgIENFXGFkZF9hY3Rpb24oJ3RlbXBsYXRlX3JlZGlyZWN0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgc2VsZjo6JGNvbnRyb2xsZXItPmFqYXggPSBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlaWYgKCdjbXMnID09PSBzZWxmOjokY29udHJvbGxlci0+cGhwX3NlbGYpIHsKICAgICAgICAgICAgLy8gQ01TICYgQ01TIENhdGVnb3J5IGRlc2NyaXB0aW9uIFByZXZpZXcgZml4CiAgICAgICAgICAgIGlmICghJGNtc19jYXRlZ29yeSA9IChpbnQpIF9QU19WRVJTSU9OXyA8IDkgPyBzZWxmOjokY29udHJvbGxlci0+Y21zX2NhdGVnb3J5IDogc2VsZjo6JGNvbnRyb2xsZXItPmdldENtc0NhdGVnb3J5KCkpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRjb250cm9sbGVyLT5hc3NpZ25DYXNlID0gMTsKICAgICAgICAgICAgfSBlbHNlaWYgKCEkY21zX2NhdGVnb3J5LT5hY3RpdmUgJiYgc2VsZjo6Z2V0UHJldmlld1VJZChmYWxzZSkpIHsKICAgICAgICAgICAgICAgICRjbXNfY2F0ZWdvcnktPmFjdGl2ZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0cGxfZGlyID0gJHRoaXMtPmNvbnRleHQtPnNtYXJ0eS0+Z2V0VGVtcGxhdGVEaXIoKTsKICAgICAgICBhcnJheV91bnNoaWZ0KCR0cGxfZGlyLCBfQ0VfVEVNUExBVEVTXyAuICdmcm9udC90aGVtZS8nKTsKICAgICAgICAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5zZXRUZW1wbGF0ZURpcigkdHBsX2Rpcik7CiAgICAgICAgLy8gVXBkYXRlIHRlbXBsYXRlIGZpbmRlciBkaXJlY3RvcmllcwogICAgICAgIENsb3N1cmU6OmJpbmQoZnVuY3Rpb24gKCkgdXNlICgmJHRwbF9kaXIpIHsKICAgICAgICAgICAgQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKCYkdHBsX2RpcikgewogICAgICAgICAgICAgICAgJHRoaXMtPmRpcmVjdG9yaWVzID0gJiR0cGxfZGlyOwogICAgICAgICAgICB9LCAkdGhpcy0+dGVtcGxhdGVGaW5kZXIsICdUZW1wbGF0ZUZpbmRlckNvcmUnKS0+X19pbnZva2UoKTsKICAgICAgICB9LCBzZWxmOjokY29udHJvbGxlciwgJ0Zyb250Q29udHJvbGxlckNvcmUnKS0+X19pbnZva2UoKTsKCiAgICAgICAgaWYgKFRvb2xzOjpnZXRJc3NldCgnaWRfbWluaWF0dXJlJykgJiYgc2VsZjo6aGFzQWRtaW5Ub2tlbignQWRtaW5DRVRoZW1lcycpKSB7CiAgICAgICAgICAgIC8vIFByZXZpZXcgTWluaWF0dXJlCiAgICAgICAgICAgIENvbmZpZ3VyYXRpb246OnNldCgnZWxlbWVudG9yX2VsZW1lbnRfY2FjaGVfdHRsJywgMCk7CgogICAgICAgICAgICAkaWRfbWluaWF0dXJlID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9taW5pYXR1cmUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkaWRfbWluaWF0dXJlID0gQ29uZmlndXJhdGlvbjo6Z2V0KCdDRV9QUk9EVUNUX01JTklBVFVSRScpOwogICAgICAgIH0KCiAgICAgICAgJGlkX21pbmlhdHVyZSAmJiAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5hc3NpZ24oCiAgICAgICAgICAgICdDRV9QUk9EVUNUX01JTklBVFVSRV9VSUQnLAogICAgICAgICAgICBuZXcgQ0VcVUlkKCRpZF9taW5pYXR1cmUsIENFXFVJZDo6VEhFTUUsICR0aGlzLT5jb250ZXh0LT5sYW5ndWFnZS0+aWQsICR0aGlzLT5jb250ZXh0LT5zaG9wLT5pZCkKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBob29rRGlzcGxheUhlYWRlcigpCiAgICB7CiAgICAgICAgJHRoaXMtPmhvb2tBY3Rpb25Gcm9udENvbnRyb2xsZXJJbml0QWZ0ZXIoKTsKICAgICAgICAvLyBCQyBGaXggZm9yIFBTIDwgMS43LjgKICAgICAgICBpc3NldCgkdGhpcy0+Y29udGV4dC0+c21hcnR5LT50cGxfdmFyc1snc2hvcCddLT52YWx1ZVsnaWQnXSkKICAgICAgICAgICAgfHwgJHRoaXMtPmNvbnRleHQtPnNtYXJ0eS0+dHBsX3ZhcnNbJ3Nob3AnXS0+dmFsdWVbJ2lkJ10gPSAkdGhpcy0+Y29udGV4dC0+c2hvcC0+aWQ7CgogICAgICAgIENFXFBsdWdpbjo6aW5zdGFuY2UoKTsKICAgICAgICBDRVxkaWRfYWN0aW9uKCd0ZW1wbGF0ZV9yZWRpcmVjdCcpIHx8IENFXGRvX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnKTsKCiAgICAgICAgaWYgKHNlbGY6OiRjb250cm9sbGVyIGluc3RhbmNlb2YgUHJvZHVjdENvbnRyb2xsZXIpIHsKICAgICAgICAgICAgJHRoaXMtPmFkZFZpZXdlZFByb2R1Y3Qoc2VsZjo6JGNvbnRyb2xsZXItPmdldFByb2R1Y3QoKS0+aWQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR1aWRfcHJldmlldyA9IHNlbGY6OmdldFByZXZpZXdVSWQoZmFsc2UpKSB7CiAgICAgICAgICAgIGlmIChDRVxVSWQ6OlRFTVBMQVRFICE9PSAkdWlkX3ByZXZpZXctPmlkX3R5cGUpIHsKICAgICAgICAgICAgICAgIC8vIENvbXBhdGliaWxpdHkgZml4IHdpdGggQWx5c3VtIHRoZW1lCiAgICAgICAgICAgICAgICB1bnNldCgkeydfR0VUJ31bJ3ByZXZpZXdfaWQnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKENFXFVJZDo6Q09OVEVOVCA9PT0gJHVpZF9wcmV2aWV3LT5pZF90eXBlICYmIFRvb2xzOjpnZXRJc3NldCgnbWFpbnRlbmFuY2UnKSAmJiAhVG9vbHM6OmdldElzc2V0KCdyZW5kZXInKSkgewogICAgICAgICAgICAgICAgLy8gUHJldmlldyBNYWludGVuYW5jZQogICAgICAgICAgICAgICAgJHRoaXMtPmRpc3BsYXlNYWludGVuYW5jZVBhZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFMgZml4OiBPdmVycmlkZUxheW91dFRlbXBsYXRlIGhvb2sgZG9lc24ndCBleGVjIG9uIDQwMy80MDQgcGFnZQogICAgICAgIGlmICgyMDAgIT09ICRyZXNwX2NvZGUgPSBodHRwX3Jlc3BvbnNlX2NvZGUoKSkgewogICAgICAgICAgICA0MDQgPT09ICRyZXNwX2NvZGUgJiYgc2VsZjo6JHRlbXBsYXRlID0gJ2Vycm9ycy80MDQnOwoKICAgICAgICAgICAgJHRoaXMtPmhvb2tPdmVycmlkZUxheW91dFRlbXBsYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhZGRWaWV3ZWRQcm9kdWN0KCRpZF9wcm9kdWN0KQogICAgewogICAgICAgICRwcm9kdWN0cyA9IGlzc2V0KCR0aGlzLT5jb250ZXh0LT5jb29raWUtPmNlVmlld2VkUHJvZHVjdHMpCiAgICAgICAgICAgID8gZXhwbG9kZSgnLCcsICR0aGlzLT5jb250ZXh0LT5jb29raWUtPmNlVmlld2VkUHJvZHVjdHMpCiAgICAgICAgICAgIDogW10KICAgICAgICA7CiAgICAgICAgaWYgKGluX2FycmF5KCRpZF9wcm9kdWN0LCAkcHJvZHVjdHMpKSB7CiAgICAgICAgICAgICRwcm9kdWN0cyA9IGFycmF5X2RpZmYoJHByb2R1Y3RzLCBbJGlkX3Byb2R1Y3RdKTsKICAgICAgICB9CiAgICAgICAgYXJyYXlfdW5zaGlmdCgkcHJvZHVjdHMsIChpbnQpICRpZF9wcm9kdWN0KTsKCiAgICAgICAgd2hpbGUgKGNvdW50KCRwcm9kdWN0cykgPiBzdGF0aWM6OlZJRVdFRF9QUk9EVUNUU19MSU1JVCkgewogICAgICAgICAgICBhcnJheV9wb3AoJHByb2R1Y3RzKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmNvbnRleHQtPmNvb2tpZS0+Y2VWaWV3ZWRQcm9kdWN0cyA9IGltcGxvZGUoJywnLCAkcHJvZHVjdHMpOwoKICAgICAgICBpZiAoVG9vbHM6OmdldFZhbHVlKCdhY3Rpb24nKSA9PT0gJ3F1aWNrdmlldycpIHsKICAgICAgICAgICAgJHRoaXMtPmNvbnRleHQtPmNvb2tpZS0+d3JpdGUoKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tEaXNwbGF5T3ZlcnJpZGVUZW1wbGF0ZSgkcGFyYW1zID0gW10pCiAgICB7CiAgICAgICAgaWYgKCdjYXRhbG9nL19wYXJ0aWFscy9mYWNldHMnID09PSAkcGFyYW1zWyd0ZW1wbGF0ZV9maWxlJ10gfHwgJ2NhdGFsb2cvX3BhcnRpYWxzL2FjdGl2ZV9maWx0ZXJzJyA9PT0gJHBhcmFtc1sndGVtcGxhdGVfZmlsZSddKSB7CiAgICAgICAgICAgIHJldHVybjsgLy8gQkMgRml4IGZvciBQUyAxLjcuNAogICAgICAgIH0KICAgICAgICBudWxsID09PSBzZWxmOjokdGVtcGxhdGUgJiYgc2VsZjo6JHRlbXBsYXRlID0gJHBhcmFtc1sndGVtcGxhdGVfZmlsZSddOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcE92ZXJyaWRlTGF5b3V0VGVtcGxhdGUoKQogICAgewogICAgICAgIHNlbGY6OiRsYXlvdXQgPSAnJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaG9va092ZXJyaWRlTGF5b3V0VGVtcGxhdGUoJHBhcmFtcyA9IFtdKQogICAgewogICAgICAgIGlmIChudWxsICE9PSBzZWxmOjokbGF5b3V0IHx8ICFDRVxkaWRfYWN0aW9uKCd0ZW1wbGF0ZV9yZWRpcmVjdCcpIHx8ICFzZWxmOjokdGVtcGxhdGUgJiYgJ2Zyb250JyA9PT0gc2VsZjo6JGNvbnRyb2xsZXItPmNvbnRyb2xsZXJfdHlwZSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JGxheW91dDsKICAgICAgICB9CiAgICAgICAgc2VsZjo6JGxheW91dCA9ICcnOwogICAgICAgICRjZSA9IENFXFBsdWdpbjo6JGluc3RhbmNlOwogICAgICAgICRjZS0+a2l0c19tYW5hZ2VyLT5mcm9udGVuZEJlZm9yZUVucXVldWVTdHlsZXMoKTsKCiAgICAgICAgaWYgKHNlbGY6OmlzTWFpbnRlbmFuY2UoKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JGxheW91dDsKICAgICAgICB9CgogICAgICAgIC8vIFBhZ2UgQ29udGVudAogICAgICAgICR2YXJzID0gJiR0aGlzLT5jb250ZXh0LT5zbWFydHktPnRwbF92YXJzOwogICAgICAgICR1aWRfcHJldmlldyA9IHNlbGY6OmdldFByZXZpZXdVSWQoZmFsc2UpOwogICAgICAgICRjb250cm9sbGVyID0gc2VsZjo6JGNvbnRyb2xsZXI7CiAgICAgICAgJGlkX2xhbmcgPSAkdGhpcy0+Y29udGV4dC0+bGFuZ3VhZ2UtPmlkOwogICAgICAgICRpZF9zaG9wID0gJHRoaXMtPmNvbnRleHQtPnNob3AtPmlkOwogICAgICAgICRmcm9udCA9IGh0dHBfcmVzcG9uc2VfY29kZSgpICE9PSAyMDAgPyAnJyA6IHN0cnRvbG93ZXIoCiAgICAgICAgICAgIHByZWdfcmVwbGFjZSgnLyhNb2R1bGVGcm9udCk/Q29udHJvbGxlcihPdmVycmlkZSk/JC9pJywgJycsIGdldF9jbGFzcygkY29udHJvbGxlcikpCiAgICAgICAgKTsKICAgICAgICBzd2l0Y2ggKCRmcm9udCkgewogICAgICAgICAgICBjYXNlICdjcmVhdGl2ZWVsZW1lbnRzcHJldmlldyc6CiAgICAgICAgICAgICAgICAkbW9kZWwgPSAkdWlkX3ByZXZpZXctPmdldE1vZGVsKCk7CiAgICAgICAgICAgICAgICAka2V5ID0gJG1vZGVsOjokeydkZWZpbml0aW9uJ31bJ3RhYmxlJ107CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyRrZXldLT52YWx1ZVsnaWQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkaWQgPSAkdmFyc1ska2V5XS0+dmFsdWVbJ2lkJ107CiAgICAgICAgICAgICAgICAgICAgJGRlc2MgPSBbJ2Rlc2NyaXB0aW9uJyA9PiAmJHZhcnNbJGtleV0tPnZhbHVlWydjb250ZW50J11dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2NtcycgPT09ICRmcm9udCAmJiAyID09PSAkY29udHJvbGxlci0+YXNzaWduQ2FzZToKICAgICAgICAgICAgICAgICRtb2RlbCA9ICdDTVNDYXRlZ29yeSc7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWydjbXNfY2F0ZWdvcnknXS0+dmFsdWVbJ2lkJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJ2Ntc19jYXRlZ29yeSddLT52YWx1ZVsnaWQnXTsKICAgICAgICAgICAgICAgICAgICAkZGVzYyA9ICYkdmFyc1snY21zX2NhdGVnb3J5J10tPnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2Ntcyc6CiAgICAgICAgICAgICAgICAkbW9kZWwgPSAkZnJvbnQ7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyRtb2RlbF0tPnZhbHVlWydpZCddKSkgewogICAgICAgICAgICAgICAgICAgICRpZCA9ICR2YXJzWyRtb2RlbF0tPnZhbHVlWydpZCddOwogICAgICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiR2YXJzWyRtb2RlbF0tPnZhbHVlWydjb250ZW50J11dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3Byb2R1Y3QnOgogICAgICAgICAgICBjYXNlICRjb250cm9sbGVyIGluc3RhbmNlb2YgUHJvZHVjdENvbnRyb2xsZXI6CiAgICAgICAgICAgICAgICAkZnJvbnQgPSAncHJvZHVjdCc7CiAgICAgICAgICAgICAgICAvLyBubyBicmVhawogICAgICAgICAgICBjYXNlICdjYXRlZ29yeSc6CiAgICAgICAgICAgIGNhc2UgJ21hbnVmYWN0dXJlcic6CiAgICAgICAgICAgIGNhc2UgJ3N1cHBsaWVyJzoKICAgICAgICAgICAgICAgICRtb2RlbCA9ICRmcm9udDsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJG1vZGVsXS0+dmFsdWVbJ2lkJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJG1vZGVsXS0+dmFsdWVbJ2lkJ107CiAgICAgICAgICAgICAgICAgICAgJGRlc2MgPSAmJHZhcnNbJG1vZGVsXS0+dmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAneWJjX2Jsb2dibG9nJzoKICAgICAgICAgICAgICAgICRtb2RlbCA9ICdZYmNfYmxvZ19wb3N0X2NsYXNzJzsKICAgICAgICAgICAgICAgICRrZXkgPSAnYmxvZ19wb3N0JzsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJ3Bvc3RfZGV0YWlsX2NvbnRlbnQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAka2V5ID0gJ2Jsb2dfcG9zdF9oZWFkZXInOwogICAgICAgICAgICAgICAgICAgICRibG9nX2NvbnRlbnQgPSAmJHZhcnNbJ3Bvc3RfZGV0YWlsX2NvbnRlbnQnXS0+dmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJGtleV0tPnZhbHVlWydpZF9wb3N0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJGtleV0tPnZhbHVlWydpZF9wb3N0J107CiAgICAgICAgICAgICAgICAgICAgJGRlc2MgPSAmJHZhcnNbJGtleV0tPnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoVG9vbHM6OmdldElzc2V0KCdhZHRva2VuJykgJiYgc2VsZjo6aGFzQWRtaW5Ub2tlbignQWRtaW5Nb2R1bGVzJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgcG9zdCBzdGF0dXMgZm9yIHByZXZpZXcKICAgICAgICAgICAgICAgICAgICAgICAgJHZhcnNbJGtleV0tPnZhbHVlWydlbmFibGVkJ10gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdldHNfYmxvZ2Jsb2cnOgogICAgICAgICAgICAgICAgJG1vZGVsID0gJ0V0c19ibG9nX3Bvc3QnOwogICAgICAgICAgICAgICAgJGtleSA9ICdibG9nX3Bvc3QnOwoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFyc1ska2V5XS0+dmFsdWVbJ2lkX3Bvc3QnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkaWQgPSAkdmFyc1ska2V5XS0+dmFsdWVbJ2lkX3Bvc3QnXTsKICAgICAgICAgICAgICAgICAgICAkZGVzYyA9ICYkdmFyc1ska2V5XS0+dmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpc3NldCgkdmFyc1snYmxvZ19jb250ZW50J10pICYmICRibG9nX2NvbnRlbnQgPSAmJHZhcnNbJ2Jsb2dfY29udGVudCddLT52YWx1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd4aXBibG9nc2luZ2xlJzoKICAgICAgICAgICAgICAgICRtb2RlbCA9ICdYaXBQb3N0c0NsYXNzJzsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJ3hpcGJsb2dwb3N0J10tPnZhbHVlWydpZF94aXBwb3N0cyddKSkgewogICAgICAgICAgICAgICAgICAgICRpZCA9ICR2YXJzWyd4aXBibG9ncG9zdCddLT52YWx1ZVsnaWRfeGlwcG9zdHMnXTsKICAgICAgICAgICAgICAgICAgICAkZGVzYyA9IFsnZGVzY3JpcHRpb24nID0+ICYkdmFyc1sneGlwYmxvZ3Bvc3QnXS0+dmFsdWVbJ3Bvc3RfY29udGVudCddXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzdGJsb2dhcnRpY2xlJzoKICAgICAgICAgICAgICAgICRtb2RlbCA9ICdTdEJsb2dDbGFzcyc7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWydibG9nJ10tPnZhbHVlWydpZCddKSkgewogICAgICAgICAgICAgICAgICAgICRpZCA9ICR2YXJzWydibG9nJ10tPnZhbHVlWydpZCddOwogICAgICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiR2YXJzWydibG9nJ10tPnZhbHVlWydjb250ZW50J11dOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGJsb2cgPSBDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmJsb2c7CiAgICAgICAgICAgICAgICB9LCAkY29udHJvbGxlciwgJGZyb250IC4gJ01vZHVsZUZyb250Q29udHJvbGxlcicpLT5fX2ludm9rZSgpOwoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYmxvZy0+aWQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJGJsb2ctPmlkOwogICAgICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiRibG9nLT5jb250ZW50XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhZHZhbmNlYmxvZ2RldGFpbCc6CiAgICAgICAgICAgICAgICAkbW9kZWwgPSAnQmxvZ1Bvc3RzJzsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJ3Bvc3REYXRhJ10tPnZhbHVlWydpZF9wb3N0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJ3Bvc3REYXRhJ10tPnZhbHVlWydpZF9wb3N0J107CiAgICAgICAgICAgICAgICAgICAgJGRlc2MgPSBbJ2Rlc2NyaXB0aW9uJyA9PiAmJHZhcnNbJ3Bvc3REYXRhJ10tPnZhbHVlWydwb3N0X2NvbnRlbnQnXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncHJlc3RhYmxvZ2Jsb2cnOgogICAgICAgICAgICBjYXNlICdwcmVzdGFibG9nJyAuIHN0cnRvbG93ZXIoQ29uZmlndXJhdGlvbjo6Z2V0KCdwcmVzdGFibG9nX3VybGJsb2cnKSkgPT09ICRmcm9udDoKICAgICAgICAgICAgICAgICRtb2RlbCA9ICdOZXdzQ2xhc3MnOwogICAgICAgICAgICAgICAgJG5ld3MgPSBDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm5ld3M7CiAgICAgICAgICAgICAgICB9LCAkY29udHJvbGxlciwgc3RyX3JlcGxhY2UoJ092ZXJyaWRlJywgJycsIGdldF9jbGFzcygkY29udHJvbGxlcikpKS0+X19pbnZva2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG5ld3MtPmlkKSkgewogICAgICAgICAgICAgICAgICAgICRpZCA9ICRuZXdzLT5pZDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyd0cGxfdW5pcXVlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiR2YXJzWyd0cGxfdW5pcXVlJ10tPnZhbHVlXTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkZGVzYyA9IFsnZGVzY3JpcHRpb24nID0+ICYkbmV3cy0+Y29udGVudF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3BzYmxvZ2Jsb2cnOgogICAgICAgICAgICAgICAgJG1vZGVsID0gJ1BzQmxvZ0Jsb2cnOwoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFyc1snYmxvZyddLT52YWx1ZS0+aWQpKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJ2Jsb2cnXS0+dmFsdWUtPmlkOwogICAgICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiR2YXJzWydibG9nJ10tPnZhbHVlLT5jb250ZW50XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdoaWJsb2dwb3N0ZGV0YWlscyc6CiAgICAgICAgICAgICAgICAkbW9kZWwgPSAnSGlCbG9nUG9zdCc7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWydwb3N0J10tPnZhbHVlWydpZF9wb3N0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJ3Bvc3QnXS0+dmFsdWVbJ2lkX3Bvc3QnXTsKICAgICAgICAgICAgICAgICAgICAkZGVzYyA9ICYkdmFyc1sncG9zdCddLT52YWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKFRvb2xzOjpnZXRJc3NldCgnYWR0b2tlbicpICYmIHNlbGY6Omhhc0FkbWluVG9rZW4oJ0FkbWluTW9kdWxlcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHBvc3Qgc3RhdHVzIGZvciBwcmV2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgICR2YXJzWydwb3N0J10tPnZhbHVlWydlbmFibGVkJ10gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0dmNtc2Jsb2dzaW5nbGUnOgogICAgICAgICAgICAgICAgJG1vZGVsID0gJ1R2Y21zUG9zdHNDbGFzcyc7CgogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyd0dmNtc2Jsb2dwb3N0J10tPnZhbHVlWydpZF90dmNtc3Bvc3RzJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJ3R2Y21zYmxvZ3Bvc3QnXS0+dmFsdWVbJ2lkX3R2Y21zcG9zdHMnXTsKICAgICAgICAgICAgICAgICAgICAkZGVzYyA9IFsnZGVzY3JpcHRpb24nID0+ICYkdmFyc1sndHZjbXNibG9ncG9zdCddLT52YWx1ZVsncG9zdF9jb250ZW50J11dOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3BtX2FkdmFuY2Vkc2VhcmNoNHNlYXJjaHJlc3VsdHMnOgogICAgICAgICAgICAgICAgJG1vZGVsID0gJ2NhdGVnb3J5JzsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhcnNbJG1vZGVsXS0+dmFsdWVbJ2lkJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGlkID0gJHZhcnNbJG1vZGVsXS0+dmFsdWVbJ2lkJ107CiAgICAgICAgICAgICAgICAgICAgJGRlc2MgPSAmJHZhcnNbJG1vZGVsXS0+dmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkaWQpKSB7CiAgICAgICAgICAgIC8vIEluaXQgdGhlIElECiAgICAgICAgICAgIGlmICgkdWlkX3ByZXZpZXcgJiYgJHVpZF9wcmV2aWV3LT5pZCA9PSAkaWQgJiYgJHVpZF9wcmV2aWV3LT5pZF90eXBlID09PSBDRVxVSWQ6OmdldFR5cGVJZCgkbW9kZWwpKSB7CiAgICAgICAgICAgICAgICBDRVxVSWQ6OiRfSUQgPSAkdWlkX3ByZXZpZXc7CiAgICAgICAgICAgICAgICAkZGVzY1snZGVzY3JpcHRpb24nXSA9IENFXGFwcGx5X2ZpbHRlcnMoJ3RoZV9jb250ZW50JywgJGRlc2NbJ2Rlc2NyaXB0aW9uJ10pOwogICAgICAgICAgICB9IGVsc2VpZiAoIUNFXFVJZDo6JF9JRCB8fCBpbl9hcnJheShDRVxVSWQ6OiRfSUQtPmlkX3R5cGUsIFtDRVxVSWQ6OkNPTlRFTlQsIENFXFVJZDo6VEhFTUUsIENFXFVJZDo6VEVNUExBVEVdKSkgewogICAgICAgICAgICAgICAgQ0VcVUlkOjokX0lEID0gbmV3IENFXFVJZCgkaWQsIENFXFVJZDo6Z2V0VHlwZUlkKCRtb2RlbCksICRpZF9sYW5nLCAkaWRfc2hvcCk7CiAgICAgICAgICAgICAgICAkZGVzY1snZGVzY3JpcHRpb24nXSA9ICRjZS0+ZnJvbnRlbmQtPmdldEJ1aWxkZXJDb250ZW50KENFXFVJZDo6JF9JRCkgPzogJGRlc2NbJ2Rlc2NyaXB0aW9uJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ0VcVUlkOjokX0lEICYmICR0aGlzLT5hZGRCb2R5Q2xhc3NlcygnZWxlbWVudG9yLXBhZ2UnLCBDRVxVSWQ6OiRfSUQtPnRvRGVmYXVsdCgpKTsKICAgICAgICAgICAgLy8gQ2F0ZWdvcnkgQWRkaXRpb25hbCBEZXNjcmlwdGlvbgogICAgICAgICAgICBpZiAoJHVpZF9wcmV2aWV3ICYmICR1aWRfcHJldmlldy0+aWQgPT0gJGlkICYmIENFXFVJZDo6Q0FURUdPUllfQURESVRJT05BTCA9PT0gJHVpZF9wcmV2aWV3LT5pZF90eXBlKSB7CiAgICAgICAgICAgICAgICAkdWlkID0gQ0VcVUlkOjokX0lEOwogICAgICAgICAgICAgICAgQ0VcVUlkOjokX0lEID0gJHVpZF9wcmV2aWV3OwogICAgICAgICAgICAgICAgJGRlc2NbJ2FkZGl0aW9uYWxfZGVzY3JpcHRpb24nXSA9IENFXGFwcGx5X2ZpbHRlcnMoJ3RoZV9jb250ZW50JywgJGRlc2NbJ2FkZGl0aW9uYWxfZGVzY3JpcHRpb24nXSk7CiAgICAgICAgICAgICAgICBDRVxVSWQ6OiRfSUQgPSAkdWlkOwogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJGRlc2NbJ2FkZGl0aW9uYWxfZGVzY3JpcHRpb24nXSkpIHsKICAgICAgICAgICAgICAgICR1aWQgPSBuZXcgQ0VcVUlkKCRkZXNjWydpZCddLCBDRVxVSWQ6OkNBVEVHT1JZX0FERElUSU9OQUwsICRpZF9sYW5nLCAkaWRfc2hvcCk7CiAgICAgICAgICAgICAgICAkZGVzY1snYWRkaXRpb25hbF9kZXNjcmlwdGlvbiddID0gJGNlLT5mcm9udGVuZC0+Z2V0QnVpbGRlckNvbnRlbnQoJHVpZCkgPzogJGRlc2NbJ2FkZGl0aW9uYWxfZGVzY3JpcHRpb24nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBldHNfYmxvZyAmIHliY19ibG9nIDQuNC45KyBmaXgKICAgICAgICAgICAgaXNzZXQoJGJsb2dfY29udGVudCkgJiYgJGJsb2dfY29udGVudCA9IHN0cl9yZXBsYWNlKCc8IS0tQ0UtUE9TVC0tPicsICRkZXNjWydkZXNjcmlwdGlvbiddLCAkYmxvZ19jb250ZW50KTsKICAgICAgICB9CgogICAgICAgIC8vIEFqYXggcmVuZGVyIHdpZGdldHMgJiB0YWdzCiAgICAgICAgaWYgKCR1aWRfcHJldmlldyAmJiAkcmVuZGVyID0gVG9vbHM6OmdldFZhbHVlKCdyZW5kZXInKSkgewogICAgICAgICAgICAoJHJlc3BvbnNlID0gJ3dpZGdldCcgPT09ICRyZW5kZXIKICAgICAgICAgICAgICAgID8gJGNlLT53aWRnZXRzX21hbmFnZXItPmFqYXhSZW5kZXJXaWRnZXQoKQogICAgICAgICAgICAgICAgOiAkY2UtPmR5bmFtaWNfdGFncy0+YWpheFJlbmRlclRhZ3MoKQogICAgICAgICAgICApICYmIGh0dHBfcmVzcG9uc2VfY29kZSgyMDApOwoKICAgICAgICAgICAgZXhpdChqc29uX2VuY29kZSgkcmVzcG9uc2UpKTsKICAgICAgICB9CgogICAgICAgIC8vIFRoZW1lIEJ1aWxkZXIKICAgICAgICAkdGhlbWUgPSBbCiAgICAgICAgICAgICdoZWFkZXInID0+IENvbmZpZ3VyYXRpb246OmdldCgnQ0VfSEVBREVSJyksCiAgICAgICAgICAgICdmb290ZXInID0+IENvbmZpZ3VyYXRpb246OmdldCgnQ0VfRk9PVEVSJyksCiAgICAgICAgXTsKICAgICAgICAkcGFnZXMgPSBbCiAgICAgICAgICAgICdpbmRleCcgPT4gJ3BhZ2UtaW5kZXgnLAogICAgICAgICAgICAnY29udGFjdCcgPT4gJ3BhZ2UtY29udGFjdCcsCiAgICAgICAgICAgICdjYXRhbG9nL21hbnVmYWN0dXJlcnMnID0+ICdwYWdlLW1hbnVmYWN0dXJlcnMnLAogICAgICAgICAgICAnY2F0YWxvZy9zdXBwbGllcnMnID0+ICdwYWdlLXN1cHBsaWVycycsCiAgICAgICAgICAgICdjYXRhbG9nL3Byb2R1Y3QnID0+ICdwcm9kdWN0JywKICAgICAgICAgICAgJ2NhdGFsb2cvbGlzdGluZy9jYXRlZ29yeScgPT4gJ2xpc3RpbmctY2F0ZWdvcnknLAogICAgICAgICAgICAnY2F0YWxvZy9saXN0aW5nL3NlYXJjaCcgPT4gJ2xpc3Rpbmctc2VhcmNoJywKICAgICAgICAgICAgJ2NhdGFsb2cvbGlzdGluZy9wcmljZXMtZHJvcCcgPT4gJ2xpc3RpbmctcHJpY2VzLWRyb3AnLAogICAgICAgICAgICAnY2F0YWxvZy9saXN0aW5nL25ldy1wcm9kdWN0cycgPT4gJ2xpc3RpbmctbmV3LXByb2R1Y3RzJywKICAgICAgICAgICAgJ2NhdGFsb2cvbGlzdGluZy9iZXN0LXNhbGVzJyA9PiAnbGlzdGluZy1iZXN0LXNhbGVzJywKICAgICAgICAgICAgJ2NhdGFsb2cvbGlzdGluZy9tYW51ZmFjdHVyZXInID0+ICdsaXN0aW5nLW1hbnVmYWN0dXJlcicsCiAgICAgICAgICAgICdjYXRhbG9nL2xpc3Rpbmcvc3VwcGxpZXInID0+ICdsaXN0aW5nLXN1cHBsaWVyJywKICAgICAgICAgICAgJ2Ntcy9jYXRlZ29yeScgPT4gJ2Ntcy1jYXRlZ29yeScsCiAgICAgICAgICAgICdjdXN0b21lci9hdXRoZW50aWNhdGlvbicgPT4gJ3BhZ2UtYXV0aGVudGljYXRpb24nLAogICAgICAgICAgICAnY3VzdG9tZXIvcmVnaXN0cmF0aW9uJyA9PiAncGFnZS1yZWdpc3RyYXRpb24nLAogICAgICAgICAgICAnY3VzdG9tZXIvcGFzc3dvcmQtZW1haWwnID0+ICdwYWdlLXBhc3N3b3JkJywKICAgICAgICAgICAgJ2N1c3RvbWVyL3Bhc3N3b3JkLWluZm9zJyA9PiAncGFnZS1wYXNzd29yZCcsCiAgICAgICAgICAgICdjdXN0b21lci9wYXNzd29yZC1uZXcnID0+ICdwYWdlLXBhc3N3b3JkJywKICAgICAgICAgICAgJ2Vycm9ycy80MDQnID0+ICdwYWdlLW5vdC1mb3VuZCcsCiAgICAgICAgXTsKICAgICAgICBmb3JlYWNoICgkcGFnZXMgYXMgJHRwbCA9PiAkZG9jX3R5cGUpIHsKICAgICAgICAgICAgaWYgKHNlbGY6OiR0ZW1wbGF0ZSA9PT0gJHRwbCkgewogICAgICAgICAgICAgICAgJHRoZW1lWyRkb2NfdHlwZV0gPSBDb25maWd1cmF0aW9uOjpnZXQoc2VsZjo6Z2V0VGhlbWVWYXJOYW1lKCRkb2NfdHlwZSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHVpZCA9IENFXFVJZDo6JF9JRDsKCiAgICAgICAgaWYgKCR1aWRfcHJldmlldyAmJiAoQ0VcVUlkOjpUSEVNRSA9PT0gJHVpZF9wcmV2aWV3LT5pZF90eXBlIHx8IENFXFVJZDo6VEVNUExBVEUgPT09ICR1aWRfcHJldmlldy0+aWRfdHlwZSkpIHsKICAgICAgICAgICAgQ0VcVUlkOjokX0lEID0gJHVpZF9wcmV2aWV3OwogICAgICAgICAgICAkcHJldmlldyA9IENFXGFwcGx5X2ZpbHRlcnMoJ3RoZV9jb250ZW50JywgJycpOwogICAgICAgICAgICAkdHlwZV9wcmV2aWV3ID0gJGNlLT5kb2N1bWVudHMtPmdldERvY0ZvckZyb250ZW5kKCR1aWRfcHJldmlldyktPmdldFRlbXBsYXRlVHlwZSgpOwogICAgICAgICAgICAnbGlzdGluZy1uby1yZXN1bHRzJyA9PT0gJHR5cGVfcHJldmlldyAmJiBDb25maWd1cmF0aW9uOjpzZXQoJ0NFX0xJU1RJTkdfTk9fUkVTVUxUUycsICR1aWRfcHJldmlldy0+aWQpOwogICAgICAgICAgICAnbGlzdGluZy1wYWdlJyA9PT0gJHR5cGVfcHJldmlldyAmJiAkdHlwZV9wcmV2aWV3ID0gImxpc3RpbmcteyRjb250cm9sbGVyLT5waHBfc2VsZn0iOwogICAgICAgICAgICAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5hc3NpZ24oc2VsZjo6Z2V0VGhlbWVWYXJOYW1lKCR0eXBlX3ByZXZpZXcpLCAkcHJldmlldyk7CiAgICAgICAgICAgIHVuc2V0KCRkZXNjKTsKCiAgICAgICAgICAgIGlmIChzdHJwb3MoJHR5cGVfcHJldmlldywgJ3BhZ2UtJykgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIFN0YXRpYyBwYWdlcwogICAgICAgICAgICAgICAgJHVpZCA9IENFXFVJZDo6JF9JRDsKICAgICAgICAgICAgICAgICRkZXNjID0gWydkZXNjcmlwdGlvbicgPT4gJiRwcmV2aWV3XTsKICAgICAgICAgICAgfSBlbHNlaWYgKCdoZWFkZXInICE9PSAkdHlwZV9wcmV2aWV3ICYmICdmb290ZXInICE9PSAkdHlwZV9wcmV2aWV3KSB7CiAgICAgICAgICAgICAgICAvLyBQcm9kdWN0IG9yIExpc3RpbmcgdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAkZGVzYyA9IFsnZGVzY3JpcHRpb24nID0+ICYkcHJldmlld107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5fYXJyYXkoJHR5cGVfcHJldmlldywgJHBhZ2VzKSAmJiAkdGhpcy0+YWRkQm9keUNsYXNzZXMoJ2NlLXRoZW1lJywgJHVpZF9wcmV2aWV3LT5pZCk7CiAgICAgICAgICAgIHVuc2V0KCR0aGVtZVskdHlwZV9wcmV2aWV3XSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJHBhZ2VzW3NlbGY6OiR0ZW1wbGF0ZV0pICYmICFlbXB0eSgkdGhlbWVbJHBhZ2VzW3NlbGY6OiR0ZW1wbGF0ZV1dKSAmJiAobmV3IENFVGhlbWUoJHRoZW1lWyRkb2NfdHlwZV0sICRpZF9sYW5nLCAkaWRfc2hvcCkpLT5hY3RpdmUpIHsKICAgICAgICAgICAgJGRvY190eXBlID0gJHBhZ2VzW3NlbGY6OiR0ZW1wbGF0ZV07CiAgICAgICAgICAgIENFXFVJZDo6JF9JRCA9IG5ldyBDRVxVSWQoJHRoZW1lWyRkb2NfdHlwZV0sIENFXFVJZDo6VEhFTUUsICRpZF9sYW5nLCAkaWRfc2hvcCk7CiAgICAgICAgICAgICR0aGlzLT5jb250ZXh0LT5zbWFydHktPmFzc2lnbigkdGhlbWVfdmFyID0gc2VsZjo6Z2V0VGhlbWVWYXJOYW1lKCRkb2NfdHlwZSksICRjZS0+ZnJvbnRlbmQtPmdldEJ1aWxkZXJDb250ZW50KENFXFVJZDo6JF9JRCkpOwogICAgICAgICAgICAvLyBTZXQgJGRlc2Mgb25seSBpZiBub3QgcHJvZHVjdCBtaW5pYXR1cmUgLyBxdWlja3ZpZXcKICAgICAgICAgICAgaWYgKGVtcHR5KCR0eXBlX3ByZXZpZXcpIHx8IHN0cnBvcygkdHlwZV9wcmV2aWV3LCAncHJvZHVjdC0nKSAhPT0gMCkgewogICAgICAgICAgICAgICAgdW5zZXQoJGRlc2MpOwogICAgICAgICAgICAgICAgJGRlc2MgPSBbJ2Rlc2NyaXB0aW9uJyA9PiAmJHZhcnNbJHRoZW1lX3Zhcl0tPnZhbHVlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RycG9zKCRkb2NfdHlwZSwgJ3BhZ2UtJykgPT09IDApIHsKICAgICAgICAgICAgICAgICR1aWQgPSBDRVxVSWQ6OiRfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmFkZEJvZHlDbGFzc2VzKCdjZS10aGVtZScsIENFXFVJZDo6JF9JRC0+aWQpOwogICAgICAgICAgICB1bnNldCgkdGhlbWVbJGRvY190eXBlXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZW1wdHkoJHBhcmFtc1snY29udGVudF9vbmx5J10pICYmIHNlbGY6OiRsYXlvdXQgPSBDRVxhcHBseV9maWx0ZXJzKCd0ZW1wbGF0ZV9pbmNsdWRlJywgc2VsZjo6JGxheW91dCkpIHsKICAgICAgICAgICAgJGJvZHlfY2xhc3NlcyA9ICYkdmFyc1sncGFnZSddLT52YWx1ZVsnYm9keV9jbGFzc2VzJ107CiAgICAgICAgICAgICRib2R5X2NsYXNzZXNbYmFzZW5hbWUoc2VsZjo6JGxheW91dCwgJy50cGwnKV0gPSAxOwoKICAgICAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJ2RlZmF1bHRfbGF5b3V0J10pKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkYm9keV9jbGFzc2VzW2Jhc2VuYW1lKCRwYXJhbXNbJ2RlZmF1bHRfbGF5b3V0J10sICcudHBsJyldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cnJwb3Moc2VsZjo6JGxheW91dCwgJ2xheW91dC1jYW52YXMnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgaXNzZXQoJGRlc2MpICYmICR0aGlzLT5jb250ZXh0LT5zbWFydHktPmFzc2lnbignY2VfZGVzYycsICRkZXNjKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3JlYWNoICgkdGhlbWUgYXMgJGRvY190eXBlID0+ICRpZF9jZV90aGVtZSkgewogICAgICAgICAgICAgICAgaWYgKCEobmV3IENFVGhlbWUoJGlkX2NlX3RoZW1lLCAkaWRfbGFuZywgJGlkX3Nob3ApKS0+YWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDRVxVSWQ6OiRfSUQgPSBuZXcgQ0VcVUlkKCRpZF9jZV90aGVtZSwgQ0VcVUlkOjpUSEVNRSwgJGlkX2xhbmcsICRpZF9zaG9wKTsKICAgICAgICAgICAgICAgICRpZF9jZV90aGVtZSAmJiAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5hc3NpZ24oc2VsZjo6Z2V0VGhlbWVWYXJOYW1lKCRkb2NfdHlwZSksICRjZS0+ZnJvbnRlbmQtPmdldEJ1aWxkZXJDb250ZW50KENFXFVJZDo6JF9JRCkpOwoKICAgICAgICAgICAgICAgIGlmICgnZm9vdGVyJyA9PT0gJGRvY190eXBlICYmICRpZF9jZV90aGVtZSAmJiBtZXRob2RfZXhpc3RzKCR3aXNobGlzdCA9IE1vZHVsZTo6Z2V0SW5zdGFuY2VCeU5hbWUoJ2Jsb2Nrd2lzaGxpc3QnKSA/OiAnJywgJ2hvb2tEaXNwbGF5Rm9vdGVyJykgJiYgJHdpc2hsaXN0LT5hY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXaXNobGlzdCBmaXggZm9yIG1pc3NpbmcgZGlzcGxheUZvb3RlciBob29rCiAgICAgICAgICAgICAgICAgICAgZW1wdHkoJHdpc2hsaXN0LT5zbWFydHktPnRwbF92YXJzWydhZGRVcmwnXSkgJiYgJHZhcnNbJ0NFX0ZPT1RFUiddLT52YWx1ZSAuPSAkd2lzaGxpc3QtPmhvb2tEaXNwbGF5Rm9vdGVyKFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBDRVxVSWQ6OiRfSUQgPSAkdWlkOwoKICAgICAgICByZXR1cm4gc2VsZjo6JGxheW91dDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkQm9keUNsYXNzZXMoJGNsYXNzLCAkaWQpCiAgICB7CiAgICAgICAgJGJvZHlfY2xhc3NlcyA9ICYkdGhpcy0+Y29udGV4dC0+c21hcnR5LT50cGxfdmFyc1sncGFnZSddLT52YWx1ZVsnYm9keV9jbGFzc2VzJ107CiAgICAgICAgJGJvZHlfY2xhc3Nlc1skY2xhc3NdID0gMTsKICAgICAgICAkYm9keV9jbGFzc2VzWyIkY2xhc3MtJGlkIl0gPSAxOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkaXNwbGF5TWFpbnRlbmFuY2VQYWdlKCkKICAgIHsKICAgICAgICBDb25maWd1cmF0aW9uOjpzZXQoJ1BTX1NIT1BfRU5BQkxFJywgZmFsc2UpOwogICAgICAgIENvbmZpZ3VyYXRpb246OnNldCgnUFNfTUFJTlRFTkFOQ0VfSVAnLCAnJyk7CiAgICAgICAgQ29uZmlndXJhdGlvbjo6c2V0KCdQU19NQUlOVEVOQU5DRV9BTExPV19BRE1JTlMnLCBmYWxzZSk7CgogICAgICAgICRkaXNwbGF5TWFpbnRlbmFuY2VQYWdlID0gbmV3IFJlZmxlY3Rpb25NZXRob2QoJHRoaXMtPmNvbnRleHQtPmNvbnRyb2xsZXIsICdkaXNwbGF5TWFpbnRlbmFuY2VQYWdlJyk7CiAgICAgICAgJGRpc3BsYXlNYWludGVuYW5jZVBhZ2UtPnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgJGRpc3BsYXlNYWludGVuYW5jZVBhZ2UtPmludm9rZSgkdGhpcy0+Y29udGV4dC0+Y29udHJvbGxlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tEaXNwbGF5TWFpbnRlbmFuY2UoJHBhcmFtcyA9IFtdKQogICAgewogICAgICAgIGlmIChzZWxmOjpnZXRQcmV2aWV3VUlkKGZhbHNlKSkgewogICAgICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICAgICAgaGVhZGVyX3JlbW92ZSgnUmV0cnktQWZ0ZXInKTsKICAgICAgICB9CgogICAgICAgIENFXGFkZF9maWx0ZXIoJ3RoZV9jb250ZW50JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkdWlkID0gQ0VcZ2V0X3RoZV9JRCgpOwogICAgICAgICAgICAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5hc3NpZ24oJ2NlX2NvbnRlbnQnLCBuZXcgQ0VDb250ZW50KCR1aWQtPmlkLCAkdWlkLT5pZF9sYW5nLCAkdWlkLT5pZF9zaG9wKSk7CgogICAgICAgICAgICBDRVxyZW1vdmVfYWxsX2ZpbHRlcnMoJ3RoZV9jb250ZW50Jyk7CiAgICAgICAgfSwgMCk7CgogICAgICAgIENFXFBsdWdpbjo6aW5zdGFuY2UoKS0+a2l0c19tYW5hZ2VyLT5mcm9udGVuZEJlZm9yZUVucXVldWVTdHlsZXMoKTsKCiAgICAgICAgaWYgKCEkbWFpbnRlbmFuY2UgPSAkdGhpcy0+cmVuZGVyQ29udGVudCgnZGlzcGxheU1haW50ZW5hbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJGpxX3ZlcnNpb24gPSAoaW50KSBfUFNfVkVSU0lPTl8gPCA5ID8gJzEuMTEuMCcgOiAnMy43LjEnOwogICAgICAgIHNlbGY6OiRjb250cm9sbGVyICYmIHNlbGY6OiRjb250cm9sbGVyLT5yZWdpc3RlckphdmFzY3JpcHQoJ2pxdWVyeScsICJqcy9qcXVlcnkvanF1ZXJ5LSRqcV92ZXJzaW9uLm1pbi5qcyIpOwoKICAgICAgICAkdGhpcy0+Y29udGV4dC0+c21hcnR5LT5hc3NpZ24oWwogICAgICAgICAgICAnbGFuZ3VhZ2UnID0+IChhcnJheSkgJHRoaXMtPmNvbnRleHQtPmxhbmd1YWdlLAogICAgICAgICAgICAnZmF2aWNvbicgPT4gQ29uZmlndXJhdGlvbjo6Z2V0KCdQU19GQVZJQ09OJyksCiAgICAgICAgICAgICdmYXZpY29uX3VwZGF0ZV90aW1lJyA9PiBDb25maWd1cmF0aW9uOjpnZXQoJ1BTX0lNR19VUERBVEVfVElNRScpLAogICAgICAgIF0pOwoKICAgICAgICByZXR1cm4gJG1haW50ZW5hbmNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBob29rRGlzcGxheUhvbWUoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVuZGVyQ29udGVudCgnZGlzcGxheUhvbWUnKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaG9va0Rpc3BsYXlGb290ZXJQcm9kdWN0KCRwYXJhbXMgPSBbXSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbmRlckNvbnRlbnQoJ2Rpc3BsYXlGb290ZXJQcm9kdWN0Jyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY2FsbCgkbWV0aG9kLCAkYXJncykKICAgIHsKICAgICAgICBpZiAoc3RyaXBvcygkbWV0aG9kLCAnaG9va0FjdGlvbk9iamVjdCcpID09PSAwICYmIHN0cmlwb3MoJG1ldGhvZCwgJ0RlbGV0ZUFmdGVyJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICR0aGlzLT5ob29rQWN0aW9uT2JqZWN0RGVsZXRlQWZ0ZXIoLi4uJGFyZ3MpOwogICAgICAgIH0gZWxzZWlmIChzdHJpcG9zKCRtZXRob2QsICdob29rJykgPT09IDApIHsKICAgICAgICAgICAgLy8gQkMgRml4IGZvciBQUyA8IDEuNy43CiAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgkbWV0aG9kLCAnaG9va0FjdGlvbkZyb250Q29udHJvbGxlckFmdGVySW5pdCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmhvb2tBY3Rpb25Gcm9udENvbnRyb2xsZXJJbml0QWZ0ZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDb21wYXRpYmlsaXR5IGZpeCBmb3IgUFMgMS43LjcueCB1cGdyYWRlCiAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgkbWV0aG9kLCAnaG9va0hlYWRlcicpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmhvb2tEaXNwbGF5SGVhZGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVuZGVyIGhvb2sgb25seSBhZnRlciBIZWFkZXIgaW5pdAogICAgICAgICAgICBpZiAoQ0VcZGlkX2FjdGlvbigndGVtcGxhdGVfcmVkaXJlY3QnKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZW5kZXJDb250ZW50KHN1YnN0cigkbWV0aG9kLCA0KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2FsbCB0byB1bmRlZmluZWQgbWV0aG9kICcgLiBfX0NMQVNTX18gLiAiOjokbWV0aG9kKCkiKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoJGhvb2tfbmFtZSkKICAgIHsKICAgICAgICBpZiAoISRob29rX25hbWUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gJyc7CiAgICAgICAgJGlkX3Byb2R1Y3QgPSBUb29sczo6Z2V0VmFsdWUoJ2lkX3Byb2R1Y3QnLCAwKTsKICAgICAgICAkcHJldmlldyA9IHNlbGY6OmdldFByZXZpZXdVSWQoZmFsc2UpOwogICAgICAgICRyb3dzID0gQ0VDb250ZW50OjpnZXRJZHNCeUhvb2soJGhvb2tfbmFtZSwgJHRoaXMtPmNvbnRleHQtPmxhbmd1YWdlLT5pZCwgJHRoaXMtPmNvbnRleHQtPnNob3AtPmlkLCAkaWRfcHJvZHVjdCwgJHByZXZpZXcpOwoKICAgICAgICBpZiAoJHJvd3MpIHsKICAgICAgICAgICAgJHVpZCA9IENFXFVJZDo6JF9JRDsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRyb3dzIGFzICYkcm93KSB7CiAgICAgICAgICAgICAgICAkaWRfc2hvcCA9ICRwcmV2aWV3ICYmICRyb3dbJ2lkJ10gPT0gJHByZXZpZXctPmlkICYmIENFXFVJZDo6Q09OVEVOVCA9PT0gJHByZXZpZXctPmlkX3R5cGUKICAgICAgICAgICAgICAgICAgICA/ICRwcmV2aWV3LT5pZF9zaG9wCiAgICAgICAgICAgICAgICAgICAgOiAkdGhpcy0+Y29udGV4dC0+c2hvcC0+aWQ7CiAgICAgICAgICAgICAgICBDRVxVSWQ6OiRfSUQgPSBuZXcgQ0VcVUlkKCRyb3dbJ2lkJ10sIENFXFVJZDo6Q09OVEVOVCwgJHRoaXMtPmNvbnRleHQtPmxhbmd1YWdlLT5pZCwgJGlkX3Nob3ApOwoKICAgICAgICAgICAgICAgIGlmICgnZGlzcGxheU1haW50ZW5hbmNlJyA9PT0gJGhvb2tfbmFtZSAmJiAhJHByZXZpZXcgJiYgQ0VcZ2V0X3Bvc3RfbWV0YShDRVxVSWQ6OiRfSUQsICdfZWxlbWVudG9yX2VkaXRfbW9kZScsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvb2tBY3Rpb25Gcm9udENvbnRyb2xsZXJJbml0QWZ0ZXIoKTsKCiAgICAgICAgICAgICAgICAgICAgQ0VcUGx1Z2luOjppbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgIENFXGRpZF9hY3Rpb24oJ3RlbXBsYXRlX3JlZGlyZWN0JykgfHwgQ0VcZG9fYWN0aW9uKCd0ZW1wbGF0ZV9yZWRpcmVjdCcpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRvdXQgLj0gQ0VcYXBwbHlfZmlsdGVycygndGhlX2NvbnRlbnQnLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQ0VcVUlkOjokX0lEID0gJHVpZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3V0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlckhvb2soJGhvb2tfbmFtZSwgJHNob3BfbGlzdCA9IG51bGwsICRwb3NpdGlvbiA9IG51bGwpCiAgICB7CiAgICAgICAgJHJlcyA9IHBhcmVudDo6cmVnaXN0ZXJIb29rKCRob29rX25hbWUsICRzaG9wX2xpc3QpOwoKICAgICAgICBpZiAoJHJlcyAmJiBpc19udW1lcmljKCRwb3NpdGlvbikpIHsKICAgICAgICAgICAgJHRoaXMtPnVwZGF0ZVBvc2l0aW9uKEhvb2s6OmdldElkQnlOYW1lKCRob29rX25hbWUpLCAwLCAkcG9zaXRpb24pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVucmVnaXN0ZXJIb29rKCRob29rX2lkLCAkc2hvcF9saXN0ID0gbnVsbCkKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAkcmVzdWx0ID0gSG9vazo6dW5yZWdpc3Rlckhvb2soJHRoaXMsICRob29rX2lkLCAkc2hvcF9saXN0KTsKICAgICAgICB9IGNhdGNoIChQcmVzdGFTaG9wT2JqZWN0Tm90Rm91bmRFeGNlcHRpb24gJGV4KSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBEYjo6Z2V0SW5zdGFuY2UoKS0+ZGVsZXRlKAogICAgICAgICAgICAgICAgJ2hvb2tfbW9kdWxlJywKICAgICAgICAgICAgICAgICdgaWRfbW9kdWxlYCA9ICcgLiAoaW50KSAkdGhpcy0+aWQgLiAnIEFORCBgaWRfaG9va2AgPSAnIC4gKGludCkgJGhvb2tfaWQgLgogICAgICAgICAgICAgICAgKCRzaG9wX2xpc3QgPyAnIEFORCBgaWRfc2hvcGAgSU4gKCcgLiBpbXBsb2RlKCcsJywgYXJyYXlfbWFwKCdpbnR2YWwnLCAkc2hvcF9saXN0KSkgLiAnKScgOiAnJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHRoaXMtPmNsZWFuUG9zaXRpb25zKCRob29rX2lkLCAkc2hvcF9saXN0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBob29rQ0VUZW1wbGF0ZSgkcGFyYW1zID0gW10pCiAgICB7CiAgICAgICAgaWYgKCFlbXB0eSgkcGFyYW1zWydpZCddKSkgewogICAgICAgICAgICAkdWlkID0gbmV3IENFXFVJZCgkcGFyYW1zWydpZCddLCBDRVxVSWQ6OlRFTVBMQVRFKTsKCiAgICAgICAgICAgIHJldHVybiBDRVxQbHVnaW46OiRpbnN0YW5jZS0+ZnJvbnRlbmQtPmdldEJ1aWxkZXJDb250ZW50Rm9yRGlzcGxheSgkdWlkKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tBY3Rpb25DbGVhckNvbXBpbGVDYWNoZSgpCiAgICB7CiAgICAgICAgRGI6OmdldEluc3RhbmNlKCktPmRlbGV0ZSgnY2VfbWV0YScsICJgbmFtZWAgPSAnX2NlX2VsZW1lbnRfY2FjaGUnIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tBY3Rpb25PYmplY3REZWxldGVBZnRlcigkcGFyYW1zID0gW10pCiAgICB7CiAgICAgICAgJG1vZGVsID0gZ2V0X2NsYXNzKCRwYXJhbXNbJ29iamVjdCddKTsKICAgICAgICAkaWRfdHlwZSA9IENFXFVJZDo6Z2V0VHlwZUlkKCRtb2RlbCk7CiAgICAgICAgJGlkX3N0YXJ0ID0gc3ByaW50ZignJWQlMDJkJywgJHBhcmFtc1snb2JqZWN0J10tPmlkLCAkaWRfdHlwZSk7CiAgICAgICAgLy8gRGVsZXRlIG1ldGEgZGF0YQogICAgICAgIERiOjpnZXRJbnN0YW5jZSgpLT5kZWxldGUoJ2NlX21ldGEnLCAnYGlkYCBMSUtFICInIC4gKGludCkgJGlkX3N0YXJ0IC4gJ19fX18iJyk7CgogICAgICAgIGlmICgkaWRfdHlwZSkgewogICAgICAgICAgICAvLyBEZWxldGUgQ1NTIGZpbGVzCiAgICAgICAgICAgIGFycmF5X21hcCgndW5saW5rJywgZ2xvYihfQ0VfUEFUSF8gLiAidmlld3MvY3NzL2NlLyRpZF9zdGFydD8/Pz8uY3NzIiwgR0xPQl9OT1NPUlQpKTsKICAgICAgICAgICAgLy8gRGVsZXRlIHJldmlzaW9ucwogICAgICAgICAgICBDRVJldmlzaW9uOjpkZWxldGVBbGxCeVBhcmVudCgkaWRfc3RhcnQgLiAnX19fXycpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaG9va0FjdGlvbk9iamVjdFByb2R1Y3REZWxldGVBZnRlcigkcGFyYW1zID0gW10pCiAgICB7CiAgICAgICAgJGlkX3Byb2R1Y3QgPSAkcGFyYW1zWydvYmplY3QnXS0+aWQ7CiAgICAgICAgJHRoaXMtPmhvb2tBY3Rpb25PYmplY3REZWxldGVBZnRlcigkcGFyYW1zKTsKICAgICAgICAvLyBEZWxldGUgZGlzcGxheUZvb3RlclByb2R1Y3QgY29udGVudAogICAgICAgIGlmICgkaWRfY2VfY29udGVudCA9IENFQ29udGVudDo6Z2V0Rm9vdGVyUHJvZHVjdElkKCRpZF9wcm9kdWN0KSkgewogICAgICAgICAgICAkY29udGVudCA9IG5ldyBDRUNvbnRlbnQoJGlkX2NlX2NvbnRlbnQpOwogICAgICAgICAgICBWYWxpZGF0ZTo6aXNMb2FkZWRPYmplY3QoJGNvbnRlbnQpICYmICRjb250ZW50LT5kZWxldGUoKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVtb3ZlIGRlbGV0ZWQgcHJvZHVjdCBJRCBmcm9tIHBhZ2Ugc2V0dGluZ3MKICAgICAgICBEYjo6Z2V0SW5zdGFuY2UoKS0+ZXhlY3V0ZSgKICAgICAgICAgICAgJ1VQREFURSAnIC4gX0RCX1BSRUZJWF8gLiAnY2VfbWV0YSAnIC4KICAgICAgICAgICAgJ1NFVCBgdmFsdWVgID0gUkVQTEFDRShgdmFsdWVgLCBcJyJwcmV2aWV3X2lkIjoiJyAuIChpbnQpICRpZF9wcm9kdWN0IC4gJyJcJywgXCcicHJldmlld19pZCI6IiJcJykgJyAuCiAgICAgICAgICAgICdXSEVSRSBgbmFtZWAgPSAiX2VsZW1lbnRvcl9wYWdlX3NldHRpbmdzIiBBTkQgYHZhbHVlYCBMSUtFIFwnJSJwcmV2aWV3X2lkIjoiJyAuIChpbnQpICRpZF9wcm9kdWN0IC4gJyIlXCcnCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaG9va0FjdGlvblByb2R1Y3RBZGQoJHBhcmFtcyA9IFtdKQogICAgewogICAgICAgIGlmICghZW1wdHkoJHBhcmFtc1snaWRfcHJvZHVjdF9vbGQnXSkpIHsKICAgICAgICAgICAgJGlkX3Byb2R1Y3Rfb2xkID0gKGludCkgJHBhcmFtc1snaWRfcHJvZHVjdF9vbGQnXTsKICAgICAgICB9IGVsc2VpZiAoVG9vbHM6OmdldElzc2V0KCdkdXBsaWNhdGVwcm9kdWN0JykpIHsKICAgICAgICAgICAgJGlkX3Byb2R1Y3Rfb2xkID0gKGludCkgVG9vbHM6OmdldFZhbHVlKCdpZF9wcm9kdWN0Jyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNzZXQoJGlkX3Byb2R1Y3Rfb2xkLCAkcGFyYW1zWydpZF9wcm9kdWN0J10pICYmICRidWlsdF9saXN0ID0gQ0VcVUlkOjpnZXRCdWlsdExpc3QoJGlkX3Byb2R1Y3Rfb2xkLCBDRVxVSWQ6OlBST0RVQ1QpKSB7CiAgICAgICAgICAgICRkYiA9IENFXFBsdWdpbjo6aW5zdGFuY2UoKS0+ZGI7CiAgICAgICAgICAgICR1aWQgPSBuZXcgQ0VcVUlkKCRwYXJhbXNbJ2lkX3Byb2R1Y3QnXSwgQ0VcVUlkOjpQUk9EVUNULCAwKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRidWlsdF9saXN0IGFzICRpZF9zaG9wID0+ICYkbGFuZ3MpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsYW5ncyBhcyAkaWRfbGFuZyA9PiAkdWlkX2Zyb20pIHsKICAgICAgICAgICAgICAgICAgICAkdWlkLT5pZF9sYW5nID0gJGlkX2xhbmc7CiAgICAgICAgICAgICAgICAgICAgJHVpZC0+aWRfc2hvcCA9ICRpZF9zaG9wOwoKICAgICAgICAgICAgICAgICAgICAkZGItPmNvcHlFbGVtZW50b3JNZXRhKCR1aWRfZnJvbSwgJHVpZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhvb2tGaWx0ZXJQcm9kdWN0U2VhcmNoKCRwYXJhbXMpCiAgICB7CiAgICAgICAgaWYgKGlzc2V0KCRfUkVRVUVTVFsncSddKSAmJiBwcmVnX21hdGNoX2FsbCgnYCg/Ol58LykoW14tXSspYCcsICRfUkVRVUVTVFsncSddLCAkZmlsdGVycykpIHsKICAgICAgICAgICAgJGNvbG9ycyA9IENFXEhlbHBlcjo6Z2V0Q29sb3JBdHRyaWJ1dGVHcm91cE5hbWVzKCR0aGlzLT5jb250ZXh0LT5sYW5ndWFnZS0+aWQsICR0aGlzLT5jb250ZXh0LT5zaG9wLT5pZCk7CgogICAgICAgICAgICBpZiAoIWFycmF5X2ludGVyc2VjdChhcnJheV9jb2x1bW4oJGNvbG9ycywgJ25hbWUnKSwgYXJyYXlfbWFwKCd1cmxkZWNvZGUnLCAkZmlsdGVyc1sxXSkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmFtc1snc2VhcmNoVmFyaWFibGVzJ11bJ3Byb2R1Y3RzJ10gYXMgJHByb2R1Y3QpIHsKICAgICAgICAgICAgICAgIGlmICghJHByb2R1Y3RbJ2ltYWdlcyddKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcHJvZHVjdFsnaW1hZ2VzJ10gYXMgJGltYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwcm9kdWN0Wydjb3Zlcl9pbWFnZV9pZCddID09PSAkaW1hZ2VbJ2lkX2ltYWdlJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkcHJvZHVjdFsnY292ZXInXSA9ICRwcm9kdWN0WydpbWFnZXMnXVswXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkcGFnaW5hdGlvbiA9ICYkcGFyYW1zWydzZWFyY2hWYXJpYWJsZXMnXVsncGFnaW5hdGlvbiddOwogICAgICAgIC8vIEJDIEZpeCBmb3IgUFMgMS43LjQKICAgICAgICBpZiAoIWlzc2V0KCRwYWdpbmF0aW9uWydwYWdlc19jb3VudCddLCAkcGFnaW5hdGlvblsnY3VycmVudF9wYWdlJ10pKSB7CiAgICAgICAgICAgICRwYWdpbmF0aW9uWydwYWdlc19jb3VudCddID0gY291bnQoJHBhZ2luYXRpb25bJ3BhZ2VzJ10pIC0gMjsKICAgICAgICAgICAgJHBhZ2luYXRpb25bJ2N1cnJlbnRfcGFnZSddID0gYXJyYXlfcmVkdWNlKCRwYWdpbmF0aW9uWydwYWdlcyddLCBmdW5jdGlvbiAoJGNhcnJ5LCAkcGFnZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRwYWdlWydjdXJyZW50J10gPyAkcGFnZVsncGFnZSddIDogJGNhcnJ5OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJHBhZ2luYXRpb25bJ2N1cnJlbnRfcGFnZSddID09IDEgJiYgYXJyYXlfc2hpZnQoJHBhZ2luYXRpb25bJ3BhZ2VzJ10pOwogICAgICAgICAgICAkcGFnaW5hdGlvblsnY3VycmVudF9wYWdlJ10gPT0gJHBhZ2luYXRpb25bJ3BhZ2VzX2NvdW50J10gJiYgYXJyYXlfcG9wKCRwYWdpbmF0aW9uWydwYWdlcyddKTsKICAgICAgICB9CiAgICAgICAgLy8gRml4OiB0b3RhbF9pdGVtcyBjb3JyZWN0aW9uIGZvciBwcmljZVBvc3RGaWx0ZXJpbmcKICAgICAgICAxID09ICRwYWdpbmF0aW9uWydwYWdlc19jb3VudCddICYmICRwYWdpbmF0aW9uWyd0b3RhbF9pdGVtcyddID0gY291bnQoJHBhcmFtc1snc2VhcmNoVmFyaWFibGVzJ11bJ3Byb2R1Y3RzJ10pOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1RoZW1lQ2hhbmdlKCkKICAgIHsKICAgICAgICBpZiAoISR0aGVtZSA9IENvbmZpZ3VyYXRpb246OmdldCgnQ0VfVEhFTUUnKSkgewogICAgICAgICAgICBDb25maWd1cmF0aW9uOjp1cGRhdGVWYWx1ZSgnQ0VfVEhFTUUnLCBfVEhFTUVfTkFNRV8pOwogICAgICAgIH0gZWxzZWlmIChfVEhFTUVfTkFNRV8gIT09ICR0aGVtZSkgewogICAgICAgICAgICByZXF1aXJlX29uY2UgX0NFX1BBVEhfIC4gJ2NsYXNzZXMvQ0VEYXRhYmFzZS5waHAnOwoKICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbWlzc2luZyBob29rcyBhZnRlciBjaGFuZ2luZyB0aGVtZQogICAgICAgICAgICBmb3JlYWNoIChDRURhdGFiYXNlOjpnZXRIb29rcygpIGFzICRob29rKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJIb29rKCRob29rLCBudWxsLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDb25maWd1cmF0aW9uOjp1cGRhdGVWYWx1ZSgnQ0VfVEhFTUUnLCBfVEhFTUVfTkFNRV8pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByZXZpZXdVSWQoJGVtYmVkID0gdHJ1ZSkKICAgIHsKICAgICAgICBzdGF0aWMgJHJlczsKCiAgICAgICAgaWYgKG51bGwgPT09ICRyZXMgJiYgJHJlcyA9IGlzc2V0KCRfUkVRVUVTVFsncHJldmlld19pZCddKSAmJiAkdWlkID0gQ0VcVUlkOjpwYXJzZSgkX1JFUVVFU1RbJ3ByZXZpZXdfaWQnXSkpIHsKICAgICAgICAgICAgJHJlcyA9IHNlbGY6Omhhc0FkbWluVG9rZW4oJHVpZC0+Z2V0QWRtaW5Db250cm9sbGVyKCkpID8gJHVpZCA6IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICEkZW1iZWQgfHwgVG9vbHM6OmdldElzc2V0KCd2ZXInKSA/ICRyZXMgOiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0FkbWluVG9rZW4oJHRhYikKICAgIHsKICAgICAgICAkaWRfZW1wbG95ZWUgPSAoaW50KSBUb29sczo6Z2V0VmFsdWUoJ2lkX2VtcGxveWVlJyk7CiAgICAgICAgJHRva2VuID0gVG9vbHM6OmdldFZhbHVlKCdBZG1pbkJsb2dQb3N0cycgPT09ICR0YWIgPyAnYmxvZ3Rva2VuJyA6IChzdHJwb3MoJHRhYiwgJ0FkbWluQ0UnKSA9PT0gMCA/ICdjZXRva2VuJyA6ICdhZHRva2VuJykpOwoKICAgICAgICBpZiAoKGludCkgX1BTX1ZFUlNJT05fIDwgOSkgewogICAgICAgICAgICByZXR1cm4gJHRva2VuID09PSBUb29sczo6Z2V0QWRtaW5Ub2tlbigkdGFiIC4gKGludCkgVGFiOjpnZXRJZEZyb21DbGFzc05hbWUoJHRhYikgLiAkaWRfZW1wbG95ZWUpOwogICAgICAgIH0KICAgICAgICAkY29udGFpbmVyID0gUHJlc3RhU2hvcFxQcmVzdGFTaG9wXEFkYXB0ZXJcQ29udGFpbmVyQnVpbGRlcjo6Z2V0Q29udGFpbmVyKCdmcm9udCcsIF9QU19NT0RFX0RFVl8pOwogICAgICAgICRyZXF1ZXN0X3N0YWNrID0gJGNvbnRhaW5lci0+Z2V0KCdyZXF1ZXN0X3N0YWNrJyk7CgogICAgICAgIGlmICghJHJlcXVlc3Rfc3RhY2stPmdldEN1cnJlbnRSZXF1ZXN0KCktPmhhc1Nlc3Npb24oKSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb250YWluZXItPmdldCgnUHJlc3RhU2hvcEJ1bmRsZVxTZWN1cml0eVxBZG1pblxMZWdhY3lBZG1pblRva2VuVmFsaWRhdG9yJyktPmlzVG9rZW5WYWxpZCgkaWRfZW1wbG95ZWUsICR0b2tlbik7CiAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gJGV4KSB7CiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgc2Vzc2lvbiBhbHJlYWR5IHN0YXJ0ZWQgYnkgUEhQCiAgICAgICAgICAgICAgICBDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBDbG9zdXJlOjpiaW5kKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmxvYWRTZXNzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgJHRoaXMtPnN0b3JhZ2UsICR0aGlzLT5zdG9yYWdlKS0+X19pbnZva2UoKTsKICAgICAgICAgICAgICAgIH0sICRzZXNzaW9uID0gJHJlcXVlc3Rfc3RhY2stPmdldEN1cnJlbnRSZXF1ZXN0KCktPmdldFNlc3Npb24oKSwgJHNlc3Npb24pLT5fX2ludm9rZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghVmFsaWRhdGU6OmlzTG9hZGVkT2JqZWN0KCRlbXBsb3llZSA9IG5ldyBFbXBsb3llZSgkaWRfZW1wbG95ZWUpKSB8fCAhJGVtcGxveWVlLT5hY3RpdmUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkY3NyZlRva2VuID0gbmV3IFN5bWZvbnlcQ29tcG9uZW50XFNlY3VyaXR5XENzcmZcQ3NyZlRva2VuKCRlbXBsb3llZS0+ZW1haWwsICR0b2tlbik7CiAgICAgICAgJHNlc3Npb25Ub2tlblN0b3JhZ2UgPSBuZXcgU3ltZm9ueVxDb21wb25lbnRcU2VjdXJpdHlcQ3NyZlxUb2tlblN0b3JhZ2VcU2Vzc2lvblRva2VuU3RvcmFnZSgkcmVxdWVzdF9zdGFjayk7CiAgICAgICAgJGNzcmZUb2tlbk1hbmFnZXIgPSBuZXcgU3ltZm9ueVxDb21wb25lbnRcU2VjdXJpdHlcQ3NyZlxDc3JmVG9rZW5NYW5hZ2VyKG51bGwsICRzZXNzaW9uVG9rZW5TdG9yYWdlKTsKCiAgICAgICAgcmV0dXJuICRjc3JmVG9rZW5NYW5hZ2VyLT5pc1Rva2VuVmFsaWQoJGNzcmZUb2tlbik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUaGVtZVZhck5hbWUoJGRvY190eXBlKQogICAgewogICAgICAgIGlmICgncHJvZHVjdCcgPT09ICRkb2NfdHlwZSAmJiBUb29sczo6Z2V0VmFsdWUoJ3F1aWNrdmlldycpKSB7CiAgICAgICAgICAgIHJldHVybiAnQ0VfUFJPRFVDVF9RVUlDS19WSUVXJzsKICAgICAgICB9IGVsc2VpZiAoJ3Byb2R1Y3QnID09PSAkZG9jX3R5cGUgJiYgVG9vbHM6OmdldFZhbHVlKCdtaW5pYXR1cmUnKSkgewogICAgICAgICAgICByZXR1cm4gJ0NFX1BST0RVQ1RfTUlOSUFUVVJFJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnQ0VfJyAuIHN0cnRvdXBwZXIoc3RyX3JlcGxhY2UoJy0nLCAnXycsICRkb2NfdHlwZSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYWludGVuYW5jZSgpCiAgICB7CiAgICAgICAgcmV0dXJuICFDb25maWd1cmF0aW9uOjpnZXQoJ1BTX1NIT1BfRU5BQkxFJykKICAgICAgICAgICAgJiYgIShDb25maWd1cmF0aW9uOjpnZXQoJ1BTX01BSU5URU5BTkNFX0FMTE9XX0FETUlOUycpICYmIChpbnQpIChuZXcgQ29va2llKCdwc0FkbWluJykpLT5pZF9lbXBsb3llZSkKICAgICAgICAgICAgJiYgIWluX2FycmF5KFRvb2xzOjpnZXRSZW1vdGVBZGRyKCksIGFycmF5X21hcCh2ZXJzaW9uX2NvbXBhcmUoX1BTX1ZFUlNJT05fLCAnMS43LjgnLCAnPCcpID8gJ3N0cnZhbCcgOiAndHJpbScsIGV4cGxvZGUoJywnLCBDb25maWd1cmF0aW9uOjpnZXQoJ1BTX01BSU5URU5BTkNFX0lQJykpKSk7CiAgICB9Cn0K Utrustning för Elektriska Skateboards - Evolve

Utrustning

Aktiva filter