Jmx0Oz9waHAKaW5jbHVkZSgndG9vbHMvcHJvZHVjdHR5cGVzLnBocCcpOwogCiRhY3RpdmF0aW9uPSAoYXJyYXlfa2V5X2V4aXN0cygnYWN0aXZhdGlvbi1pbmZvLWJhc2U2NCcsICRfUE9TVCkgCgkJCSAgPyBiYXNlNjRfZGVjb2RlKCRfUE9TVFsnYWN0aXZhdGlvbi1pbmZvLWJhc2U2NCddKSAKCQkJICA6IGFycmF5X2tleV9leGlzdHMoJ2FjdGl2YXRpb24taW5mbycsICRfUE9TVCkgPyAkX1BPU1RbJ2FjdGl2YXRpb24taW5mbyddIDogJycpOwokZ3VpZCA9IGFycmF5X2tleV9leGlzdHMoJ2d1aWQnLCAkX1BPU1QpID8gJF9QT1NUWyZxdW90O2d1aWQmcXVvdDtdIDogJy0nOwogCmlmKCFpc3NldCgkYWN0aXZhdGlvbikgfHwgZW1wdHkoJGFjdGl2YXRpb24pKSB7IGV4aXQoJ0FjdGl2YXRpb24gaW5mbyBub3QgZm91bmQhJyk7IH0KIAovLyBsb2FkIGFuZCBkZWNvZGUgYWN0aXZhdGlvbiBpbmZvCiRlbmNvZGVkcmVxdWVzdCA9IG5ldyBET01Eb2N1bWVudDsKJGVuY29kZWRyZXF1ZXN0LSZndDtsb2FkWE1MKCRhY3RpdmF0aW9uKTsKJGFjdGl2YXRpb25EZWNvZGVkPSBiYXNlNjRfZGVjb2RlKCRlbmNvZGVkcmVxdWVzdC0mZ3Q7Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RhdGEnKS0mZ3Q7aXRlbSgwKS0mZ3Q7bm9kZVZhbHVlKTsKJGZhaXJQbGF5Q2VydENoYWluPSAkZW5jb2RlZHJlcXVlc3QtJmd0O2dldEVsZW1lbnRzQnlUYWdOYW1lKCdkYXRhJyktJmd0O2l0ZW0oMSktJmd0O25vZGVWYWx1ZTsKJGZhaXJQbGF5U2lnbmF0dXJlPSAkZW5jb2RlZHJlcXVlc3QtJmd0O2dldEVsZW1lbnRzQnlUYWdOYW1lKCdkYXRhJyktJmd0O2l0ZW0oMiktJmd0O25vZGVWYWx1ZTsKIAokZGVjb2RlZHJlcXVlc3QgPSBuZXcgRE9NRG9jdW1lbnQ7CiRkZWNvZGVkcmVxdWVzdC0mZ3Q7bG9hZFhNTCgkYWN0aXZhdGlvbkRlY29kZWQpOwokbm9kZXMgPSAkZGVjb2RlZHJlcXVlc3QtJmd0O2dldEVsZW1lbnRzQnlUYWdOYW1lKCdkaWN0JyktJmd0O2l0ZW0oMCktJmd0O2dldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7CiAKZm9yICgkaSA9IDA7ICRpICZsdDsgJG5vZGVzLSZndDtsZW5ndGggLSAxOyAkaT0kaSsyKTsKewoJIyR7JG5vZGVzLSZndDtpdGVtKCRpKS0mZ3Q7bm9kZVZhbHVlfSA9IHByZWdfbWF0Y2goJy8odHJ1ZXxmYWxzZSkvJywgJG5vZGVzLSZndDtpdGVtKCRpICsgMSktJmd0O25vZGVOYW1lKSA/ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlTmFtZSA6ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7CiAKCXN3aXRjaCAoJG5vZGVzLSZndDtpdGVtKCRpKS0mZ3Q7bm9kZVZhbHVlKTsKCXsKCQljYXNlICZxdW90O0FjdGl2YXRpb25SYW5kb21uZXNzJnF1b3Q7OiAkYWN0aXZhdGlvblJhbmRvbW5lc3MgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O0RldmljZUNlcnRSZXF1ZXN0JnF1b3Q7OiAkZGV2aWNlQ2VydFJlcXVlc3QgPSBiYXNlNjRfZGVjb2RlKCRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWUpOyBicmVhazsKCQljYXNlICZxdW90O0RldmljZUNsYXNzJnF1b3Q7OiAkZGV2aWNlQ2xhc3MgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O1NlcmlhbE51bWJlciZxdW90OzogJHNlcmlhbE51bWJlciA9ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7IGJyZWFrOwoJCWNhc2UgJnF1b3Q7VW5pcXVlRGV2aWNlSUQmcXVvdDs6ICR1bmlxdWVEaXZpY2VJRCA9ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7IGJyZWFrOwoJCWNhc2UgJnF1b3Q7SW50ZXJuYXRpb25hbE1vYmlsZUVxdWlwbWVudElkZW50aXR5JnF1b3Q7OiAkaW1laSA9ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7IGJyZWFrOwoJCWNhc2UgJnF1b3Q7SW50ZXJuYXRpb25hbE1vYmlsZVN1YnNjcmliZXJJZGVudGl0eSZxdW90OzogJGltc2kgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O0ludGVncmF0ZWRDaXJjdWl0Q2FyZElkZW50aXR5JnF1b3Q7OiAkaWNjaWQgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O1VuaXF1ZUNoaXBJRCZxdW90OzogJHVjaWQgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O1Byb2R1Y3RUeXBlJnF1b3Q7OiAkcHJvZHVjdFR5cGUgPSAkbm9kZXMtJmd0O2l0ZW0oJGkgKyAxKS0mZ3Q7bm9kZVZhbHVlOyBicmVhazsKCQljYXNlICZxdW90O0FjdGl2YXRpb25TdGF0ZSZxdW90OzogJGFjdGl2YXRpb25TdGF0ZSA9ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7IGJyZWFrOwoJCWNhc2UgJnF1b3Q7UHJvZHVjdFZlcnNpb24mcXVvdDs6ICRwcm9kdWN0VmVyc2lvbiA9ICRub2Rlcy0mZ3Q7aXRlbSgkaSArIDEpLSZndDtub2RlVmFsdWU7IGJyZWFrOwoJfQp9CiAKaWYgKCRhY3RpdmF0aW9uU3RhdGUgIT0gJ1VuYWN0aXZhdGVkJykgI1dpbGRjYXJkQWN0aXZhdGVkLCBBY3RpdmF0ZWQsID8/Pz8/Pwp7CgllY2hvICcmbHQ7IURPQ1RZUEUgaHRtbCBQVUJMSUMgJnF1b3Q7LS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiZxdW90OyAmcXVvdDtodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMy5vcmcvVFIveGh0bWwxMS9EVEQveGh0bWwxMS5kdGQmcXVvdDsmZ3Q7Jmx0O2h0bWwgeG1sbnM9JnF1b3Q7aHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2l0bXMvJnF1b3Q7IGxhbmc9JnF1b3Q7ZW4mcXVvdDsmZ3Q7Jmx0O2hlYWQmZ3Q7Jmx0O21ldGEgaHR0cC1lcXVpdj0mcXVvdDtDb250ZW50LVR5cGUmcXVvdDsgY29udGVudD0mcXVvdDt0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgmcXVvdDsgLyZndDsmbHQ7bWV0YSBuYW1lPSZxdW90O2tleXdvcmRzJnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7aVR1bmVzIFN0b3JlJnF1b3Q7IC8mZ3Q7Jmx0O21ldGEgbmFtZT0mcXVvdDtkZXNjcmlwdGlvbiZxdW90OyBjb250ZW50PSZxdW90O2lUdW5lcyBTdG9yZSZxdW90OyAvJmd0OyZsdDt0aXRsZSZndDtpUGhvbmUgQWN0aXZhdGlvbiZsdDsvdGl0bGUmZ3Q7Jmx0O2xpbmsgaHJlZj0mcXVvdDtodHRwOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vaXBhX2l0dW5lcy9zdHlsZXNoZWV0cy9zaGFyZWQvY29tbW9uLW1pbi5jc3MmcXVvdDsgY2hhcnNldD0mcXVvdDt1dGYtOCZxdW90OyByZWw9JnF1b3Q7c3R5bGVzaGVldCZxdW90OyAvJmd0OyZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL3MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2RldmljZXNlcnZpY2VzL3N0eWxlc2hlZXRzL3N0eWxlcy5jc3MmcXVvdDsgY2hhcnNldD0mcXVvdDt1dGYtOCZxdW90OyByZWw9JnF1b3Q7c3R5bGVzaGVldCZxdW90OyAvJmd0OyZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL3MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2lwYV9pdHVuZXMvc3R5bGVzaGVldHMvcGFnZXMvSVBBSmluZ2xlRW5kUG9pbnRFcnJvclBhZ2UtbWluLmNzcyZxdW90OyBjaGFyc2V0PSZxdW90O3V0Zi04JnF1b3Q7IHJlbD0mcXVvdDtzdHlsZXNoZWV0JnF1b3Q7IC8mZ3Q7Jmx0O3NjcmlwdCBpZD0mcXVvdDtwcm90b2NvbCZxdW90OyB0eXBlPSZxdW90O3RleHQveC1hcHBsZS1wbGlzdCZxdW90OyZndDsKCQkmbHQ7cGxpc3QgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsmZ3Q7CgkJCSZsdDtkaWN0Jmd0OwoJCQkJJmx0O2tleSZndDsnLigkZGV2aWNlQ2xhc3MgPT0gJnF1b3Q7aVBob25lJnF1b3Q7ID8gJ2lwaG9uZScgOiAnZGV2aWNlJykuJy1hY3RpdmF0aW9uJmx0Oy9rZXkmZ3Q7CgkJCQkmbHQ7ZGljdCZndDsKCQkJCQkmbHQ7a2V5Jmd0O2Fjay1yZWNlaXZlZCZsdDsva2V5Jmd0OwoJCQkJCSZsdDt0cnVlLyZndDsKCQkJCQkmbHQ7a2V5Jmd0O3Nob3ctc2V0dGluZ3MmbHQ7L2tleSZndDsKCQkJCQkmbHQ7dHJ1ZS8mZ3Q7CgkJCQkmbHQ7L2RpY3QmZ3Q7CgkJCSZsdDsvZGljdCZndDsKCQkmbHQ7L3BsaXN0Jmd0OwoJCSZsdDsvc2NyaXB0Jmd0OyZsdDtzY3JpcHQmZ3Q7dmFyIHByb3RvY29sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCZxdW90O3Byb3RvY29sJnF1b3Q7KTt2YXIgcHJvdG9jb2xDb250ZW50ID0gcHJvdG9jb2xFbGVtZW50LmlubmVyVGV4dDtpVHVuZXMuYWRkUHJvdG9jb2wocHJvdG9jb2xDb250ZW50KTsmbHQ7L3NjcmlwdCZndDsmbHQ7L2hlYWQmZ3Q7Jmx0O2JvZHkvJmd0OyZsdDsvaHRtbCZndDsnOwoJZXhpdDsKfQogCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2F2ZSByZXF1ZXN0IGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiRkZXZpY2Vmb2xkZXIgPSAnZGV2aWNlcy8nLiRkZXZpY2VDbGFzcy4nLycuJHNlcmlhbE51bWJlci4nLyc7CiAKaWYgKCFmaWxlX2V4aXN0cygnZGV2aWNlcy8nLiRkZXZpY2VDbGFzcy4nLycpKSBta2RpcignZGV2aWNlcy8nLiRkZXZpY2VDbGFzcy4nLycsIDA3NzcsIHRydWUpOwppZiAoIWZpbGVfZXhpc3RzKCRkZXZpY2Vmb2xkZXIpKSAgbWtkaXIoJGRldmljZWZvbGRlciwgMDc3NywgdHJ1ZSk7CiAKJGVuY29kZWRyZXF1ZXN0LSZndDtzYXZlKCRkZXZpY2Vmb2xkZXIuJ2RldmljZS1yZXF1ZXN0LnhtbCcpOwokZGVjb2RlZHJlcXVlc3QtJmd0O3NhdmUoJGRldmljZWZvbGRlci4nZGV2aWNlLXJlcXVlc3QtZGVjb2RlZC54bWwnKTsKZmlsZV9wdXRfY29udGVudHMoJGRldmljZWZvbGRlci4nY2VydC1yZXF1ZXN0LmNzcicsICRkZXZpY2VDZXJ0UmVxdWVzdCk7CmZpbGVfcHV0X2NvbnRlbnRzKCRkZXZpY2Vmb2xkZXIuJ2ZhaXJQbGF5Q2VydENoYWluLmNydCcsICctLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0nLiRmYWlyUGxheUNlcnRDaGFpbi4nLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLScpOwpmaWxlX3B1dF9jb250ZW50cygkZGV2aWNlZm9sZGVyLidmYWlyUGxheVNpZ25hdHVyZS5rZXknLCAnLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tJy4kZmFpclBsYXlTaWduYXR1cmUuJy0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0nKTsKI2ZpbGVfcHV0X2NvbnRlbnRzKCRkZXZpY2VmaWxlX3B1dF9jb250ZW50cygkZGV2aWNlZm9sZGVyLidjZXJ0LXJlcXVlc3QtcHVibGljLmtleScsIG9wZW5zc2xfcGtleV9nZXRfZGV0YWlscyhvcGVuc3NsX2Nzcl9nZXRfcHVibGljX2tleSgkZGV2aWNlQ2VydFJlcXVlc3QpKVsmcXVvdDtrZXkmcXVvdDtdKTsKZmlsZV9wdXRfY29udGVudHMoJGRldmljZWZvbGRlci4nR1VJRC50eHQnLCAkZ3VpZCk7CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTaWduIGRldmljZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovKiRwcml2a2V5ID0gYXJyYXkoZmlsZV9nZXRfY29udGVudHMoJ2NlcnRzL29yaWdpbmFsL2lQaG9uZURldmljZUNBX3ByaXZhdGUua2V5JyksJnF1b3Q7bWluYWNyaXNzJnF1b3Q7KTsKJGRldmljZWNhY2VydCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdjZXJ0cy9vcmlnaW5hbC9pUGhvbmVEZXZpY2VDQS5jcnQnKTsKIAojJGNvbmZpZyA9IGFycmF5KCdkaWdlc3RfYWxnJyA9Jmd0OyAnc2hhMScpOwokY29uZmlnID0gYXJyYXkoJ2NvbmZpZyc9Jmd0OydDOlx4YW1wcFxhcGFjaGVcYmluXG9wZW5zc2wuY25mJywgJ2RpZ2VzdF9hbGcnID0mZ3Q7ICdzaGExJyk7CiR1c2VyY2VydCA9IG9wZW5zc2xfY3NyX3NpZ24oJGRldmljZUNlcnRSZXF1ZXN0LCRkZXZpY2VjYWNlcnQsJHByaXZrZXksMzY1LCAkY29uZmlnLCAnMDYnKTsKb3BlbnNzbF94NTA5X2V4cG9ydCgkdXNlcmNlcnQsJGNlcnRvdXQpOwokZGV2aWNlQ2VydGlmaWNhdGU9YmFzZTY0X2VuY29kZSgkY2VydG91dCk7CmZpbGVfcHV0X2NvbnRlbnRzKCZxdW90O2NlcnRzL29yaWdpbmFsL3NlcnZlckNBU2lnbmVkLmNydCZxdW90OywgJGNlcnRvdXQpOyovCiAKJGNlcnRzX3BhdGggPSAnY2VydHMvJzsgIyBjZXJ0cy9vcmlnaW5hbC8gLSBtaW5hY3Jpc3Mgb3JpZ2luYWwKJGRheXMgPSAxMDk2OyAjIDMgeWVhcnMKJGNlcnRzX3Bhc3MgPSAnaWNsb3VkJzsgIyBtaW5hY3Jpc3MKJGNlcnRfc24gPSAnMHgwMkE1OTBFNjc2RTJDRUVEM0E5OSc7CiMgc2VyaWFsczoKIyBhcHBsZSAtIDB4MDJBNTkwRTY3NkUyQ0VFRDNBOTkKIyBkb3VsY2kgLSAweDAyODVDMzIyNkZDMDBEN0FFMTU2CiMgM2dzIGFwcGxlIC0gMHgwM2Q2ZTYyNGY2YmQ1ZGYzZGYxZgojIG1pbmFjcmlzcyAtIDB4MDYgCiAKIyBEZXZpY2UgY2VydGlmaWNhdGUgcmVxdWVzdCBzaWduaW5nCmV4ZWMoJ3NldCBQQVRIPSVQQVRIJTtDOlx4YW1wcFxhcGFjaGVcYmluJyk7IC8vIHBhdGggdG8gb3BlbnNzbC5leGUKZXhlYygnc2V0IE9QRU5TU0xfQ09ORj1DOlx4YW1wcFxhcGFjaGVcYmluXG9wZW5zc2wuY25mJyk7CmV4ZWMoJ29wZW5zc2wgeDUwOSAtcmVxIC1zaGExIC1pbiAnLiRkZXZpY2Vmb2xkZXIuJ2NlcnQtcmVxdWVzdC5jc3IgLUNBICcuJGNlcnRzX3BhdGguJ2lQaG9uZURldmljZUNBLmNydCAtQ0FrZXkgJy4kY2VydHNfcGF0aC4naVBob25lRGV2aWNlQ0FfcHJpdmF0ZS5rZXkgLW91dCAnLiRkZXZpY2Vmb2xkZXIuJ3NlcnZlckNBU2lnbmVkLmNydCAtZGF5cyAnLgoJCSRkYXlzLicgLWV4dGZpbGUgJy4kY2VydHNfcGF0aC4nZXh0ZW5zaW9uc19kZXZpY2UuY25mIC1leHRlbnNpb25zIHVzcl9jZXJ0IC1zZXRfc2VyaWFsICcuJGNlcnRfc24uJyAtcGFzc2luIHBhc3M6Jy4kY2VydHNfcGFzcyk7CiAKJGRldmljZUNlcnRpZmljYXRlPWJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJGRldmljZWZvbGRlci4mcXVvdDtzZXJ2ZXJDQVNpZ25lZC5jcnQmcXVvdDspKTsKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTaWduIGFjY291bnQgdG9rZW4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyRhY2NvdW50VG9rZW4gPSAneycuJnF1b3Q7XG5cdCZxdW90Oy4nJnF1b3Q7QWN0aXZhdGlvblJhbmRvbW5lc3MmcXVvdDsgPSAmcXVvdDsnLiRhY3RpdmF0aW9uUmFuZG9tbmVzcy4nJnF1b3Q7OycuJnF1b3Q7XG5cdCZxdW90Oy4nJnF1b3Q7VW5pcXVlRGV2aWNlSUQmcXVvdDsgPSAmcXVvdDsnLiR1bmlxdWVEaXZpY2VJRC4nJnF1b3Q7OycuJnF1b3Q7XG4mcXVvdDsuJ30nOwogCiR3aWxkY2FyZFRpY2tldD1maWxlX2dldF9jb250ZW50cygnY2VydHMvZXh0L3dpbGRjYXJkdGlja2V0LnR4dCcpOwokYWNjb3VudFRva2VuPQogJ3snLihpc3NldCgkaW1laSkgPyAmcXVvdDtcblx0JnF1b3Q7LicmcXVvdDtJbnRlcm5hdGlvbmFsTW9iaWxlRXF1aXBtZW50SWRlbnRpdHkmcXVvdDsgPSAmcXVvdDsnLiRpbWVpLicmcXVvdDs7JyA6ICcnKS4KCSZxdW90O1xuXHQmcXVvdDsuJyZxdW90O0FjdGl2aXR5VVJMJnF1b3Q7ID0gJnF1b3Q7aHR0cHM6Ly9hLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9kZXZpY2VzZXJ2aWNlcy9hY3Rpdml0eSZxdW90OzsnLgoJJnF1b3Q7XG5cdCZxdW90Oy4nJnF1b3Q7QWN0aXZhdGlvblJhbmRvbW5lc3MmcXVvdDsgPSAmcXVvdDsnLiRhY3RpdmF0aW9uUmFuZG9tbmVzcy4nJnF1b3Q7OycuCgkmcXVvdDtcblx0JnF1b3Q7LicmcXVvdDtVbmlxdWVEZXZpY2VJRCZxdW90OyA9ICZxdW90OycuJHVuaXF1ZURpdmljZUlELicmcXVvdDs7Jy4KCSZxdW90O1xuXHQmcXVvdDsuJyZxdW90O0NlcnRpZmljYXRlVVJMJnF1b3Q7ID0gJnF1b3Q7aHR0cHM6Ly9hLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9kZXZpY2VzZXJ2aWNlcy9jZXJ0aWZ5TWUmcXVvdDs7Jy4KCSZxdW90O1xuXHQmcXVvdDsuJyZxdW90O1Bob25lTnVtYmVyTm90aWZpY2F0aW9uVVJMJnF1b3Q7ID0gJnF1b3Q7aHR0cHM6Ly9hLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9kZXZpY2VzZXJ2aWNlcy9waG9uZUhvbWUmcXVvdDs7Jy4KCSZxdW90O1xuXHQmcXVvdDsuJyZxdW90O1dpbGRjYXJkVGlja2V0JnF1b3Q7ID0gJnF1b3Q7Jy4kd2lsZGNhcmRUaWNrZXQuJyZxdW90OzsnLgoJJnF1b3Q7XG4mcXVvdDsuCiAnfSc7CiRhY2NvdW50VG9rZW5CYXNlNjQ9YmFzZTY0X2VuY29kZSgkYWNjb3VudFRva2VuKTsKJHBrZXlpZCA9IG9wZW5zc2xfcGtleV9nZXRfcHJpdmF0ZShmaWxlX2dldF9jb250ZW50cygmcXVvdDtjZXJ0cy9zaWduYXR1cmVfcHJpdmF0ZS5rZXkmcXVvdDspKTsKIApvcGVuc3NsX3NpZ24oJGFjY291bnRUb2tlbkJhc2U2NCwgJHNpZ25hdHVyZSwgJHBrZXlpZCk7Cm9wZW5zc2xfZnJlZV9rZXkoJHBrZXlpZCk7CiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiRhY2NvdW50VG9rZW5TaWduYXR1cmU9IGJhc2U2NF9lbmNvZGUoJHNpZ25hdHVyZSk7CiRhY2NvdW50VG9rZW5DZXJ0aWZpY2F0ZUJhc2U2NCA9ICdMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VSYWVrTkRRV3NyWjBGM1NVSkJaMGxDUVdwQlRrSm5hM0ZvYTJsSE9YY3dRa0ZSVlVaQlJFSTFUVkZ6ZDBOUldVUldVVkZIUlhkS1ZsVjZSVlFLVFVKRlIwRXhWVVZEYUUxTFVWaENkMkpIVldkVFZ6VnFUR3BGYlUxRFVVZEJNVlZGUTNoTlpGRllRbmRpUjFWblVUSldlV1JIYkcxaFYwNW9aRWRzZGdwaWFVSkNaRmhTYjJJelNuQmtTR3Q0VEZSQmNrSm5UbFpDUVUxVVNrVkdkMk5IZUd4SlIyeFJZVWM1ZFZwVFFrUmFXRW93WVZkYWNGa3lSakJoVnpsMUNrbEZSakZrUjJoMlkyMXNNR1ZVUVdWR2R6QjNUbnBCTUUxVVdYbE5hbFV4VFVSS1lVWjNNSGhPUkVFd1RWUlplVTFxVlRGTlJFcGhUVVp6ZUVONlFVb0tRbWRPVmtKQldWUkJiRlpVVFZKTmQwVlJXVVJXVVZGTFJYZHdRbU5JUW5OYVUwSktZbTFOZFUxU1ZYZEZkMWxFVmxGUlRFVjNlRUpqU0VKeldsTkNjQXBWUjJoMlltMVZlRWxFUVdWQ1owNVdRa0ZOVkVZd1JuZGpSM2hzU1Vkc1VXRkhPWFZhVTBKQ1dUTlNjR1J0UmpCaFZ6bDFUVWxIWmsxQk1FZERVM0ZIQ2xOSllqTkVVVVZDUVZGVlFVRTBSMDVCUkVOQ2FWRkxRbWRSUkVaQldIcFNTVzFCY20xdmFVaG1ZbE15YjFCamNVRm1Za1YyTUdReGFtczNSMkp1V0RjS0t6UlpWV3g1U1dad2NucENWbVJzYlhveVNraFpkakVyTURSSmVrcDBURGRqVERrM1ZVazNabXN3YVRCUFRWa3dZV3c0WVN0S1VGRmhORlZuTmpFeFZBcGljVVYwSzI1cVFXMUJhMmRsTTBoWVYwUkNaRUZZUkRsTmFHdEROMVF2T1c4M04zcFBVVEZ2YkdrMFkxVmtlbXh1V1ZkbWVtMVhNRkJrZFU5NGRYWmxDa0ZsV1ZrMGQwbEVRVkZCUW04MFIySk5TVWRaVFVFMFIwRXhWV1JFZDBWQ0wzZFJSVUYzU1VoblJFRk5RbWRPVmtoU1RVSkJaamhGUVdwQlFVMUNNRWNLUVRGVlpFUm5VVmRDUWxOb2IwNU1LM1EzVW5vdmNITlZZWEV2VGxCWVRsQklLeTlYYkVSQlprSm5UbFpJVTAxRlIwUkJWMmRDVkc1T1EyOTFTWFEwTlFwWlIzVXdiRTAxTTJjeVJYWk5ZVUk0VGxSQk5FSm5UbFpJVWpoRlRWUkJkazFETW1kTE5rRndhR2xrYjJSSVVuZFBhVGgyWkROa00weHRSbmRqUjNoc0NreHRUblppVXpsb1kwaENjMXBYVG1oTU1teDNZVWM1ZFZwVE5XcGpiWGQzUkZGWlNrdHZXa2xvZG1OT1FWRkZSa0pSUVVSblowVkNRVVk1Y1cxeVZVNEtaRUVyUmxKUFdVZFFOM0JYWTFsVVFVc3JjRXg1VDJZNWVrOWhSVGRoWlZaSk9EZzFWamhaTDBKTFNHaHNkMEZ2SzNwRmEybFBWVE5HWWtWUVExTTVWZ3AwVXpFNFdrSmpkMFF2SzJRMVdsRlVUVVpyYm1oalZVcDNaRkJ4Y1dwdWJUbE1jVlJtU0M5NE5IQjNPRTlPU0ZKRWVuaElaSEE1Tm1kUFZqTkJOQ3M0Q21GaWEyOUJVMlpqV1hGMlNWSjVjRmh1WW5WeU0ySlNVbWhVZWtGek5GWkpURk0yYWxSNVJsbDViVnBsVTJWM2RFSjFZbTF0YVdkdk1XdERVV2xhUjJNS056WmpOV1psUkVGNVNHSXlZbnBGY1hSMmVETlhjSEpzYW5SVE5EWlJWRFZEVWpaWlpXeHBibHB1YVc4ek1tcEJlbEpaVkhoMFV6WnlNMHB6ZGxwRWFRcEtNRGNyUlVoamJXWkhaSEI0ZDJkUEt6ZGlkRmN4Y0VaaGNqQmFha1k1TDJwWlMwdHVUMWxPZVhaRGNuZHplbWhoWm1KVFdYZDZRVWMxUlVwdldFWkNDalJrSzNCcFYwaFZSR05RZUhSall6MEtMUzB0TFMxRlRrUWdRMFZTVkVsR1NVTkJWRVV0TFMwdExRbz0nOwokZmFpclBsYXlLZXlEYXRhID0gJ0xTMHRMUzFDUlVkSlRpQkRUMDVVUVVsT1JWSXRMUzB0TFFwQlFVVkJRVkl2Y1dScFkzbFVkV0p0TW14S1RuZE1WMVphVDB4UVNucFRTV0YxTUdKdVQxbFBTRTEwYWxaeGMyNDJkVEZ1WTBVcmIwWlFOa1EzVmpOV0NtcGxla0p4UVdOaFJWcHhVR05PVDA5eUszaEZNMk5rTDFJMEsxUTRPSE13U2l0RmEwcFFOblJQWnpRNVUyMTVaa1pVTWxnMFVEZFlaRXhUTm5kRWFsQUtZM3BpUm1SRFUwaHBUVlptUkVKaFkxcFVhV3hQTkdOc2RIbGxTM0p6WkhwTFRsSTVMM0o1VlhRNFRuSmtZMFZKZDJsSFdUQmpZak5wY0V4TFVuaEhVd3BZU1dGTU1ucFlNeTlIZUUxNFVXMHlSemR6TDBJdldEQmtkV0V3ZDA4NGVuQjZaWEUxYkhrd2MxbFBRakU1Y1Vkd2F5dEtRMGhTYVV0eVVDOW5lRlJhQ2xKalpDOXRUalZhTTI1V1VFWTRRbGQyVkVRNVVFbHZZbGREWkVOeGMzZENaekJ2SzFWeU5uRXhaSEZzWkVwUE0wRlNPRUZXVHpGTFVFRnJWQzh3VjFRS2RrUjBNRnBCYkRKb2QzSkVjbHBYZEhKU2QzUkROVWxYWmk5RFkyVXdhRFowVVhCNGJETTNha0ZCV2tkcWNXTkZNM0Y1ZEc0cmRtaDFTVlEyV2tsVFVRcHlLMngwVDFCME1rNXZLM3BsVkZoMlRWRXhhbEpXVVhseVJ6RkNOelJNV0VwR2NVMW5ReXRHWkdnek1EWXZhbVJvTUV0a2VFVm9lSGRIYW5SNFZHcElDazVZUmtoaFYyWTBObTlVYUdWbVdUQkRNM05TY2xoMWNFTlJTamcxT0ROaVJXRnVVRzh5VWsxRkwxZGtZMHBET0RKRmVFWm1hM0ZHUmpOUFNrVTVkeThLVjJ3M05rRlVabFZHYVVWWVJVRnBVSFZPUVhrNFpsaGhhemswWTNGeVJFaFhlUzlZYlRGUlYwbzNSbmQ0ZURZek0yUm5VWEJGVldFeFNqQk1hVE5ZWndwcWFXSm1jelpRZERkcFVrVXpLM1poVFdWaVZXMUJhalpXWm5jelVqQlFMMjUzU3poek5uaHViREoxTVVac2RFZFhUa1F4Uldkb1JWTkVNMUV4Ums1bUNreGxWV3BPTDFnd1ZtRTBURUZ6VTB0R1oyTlBTbGxvUmk5cmVuUkxVRkZxZDBaVk5WRnRkMUZTZVVJM2FWaEhNM2xEYm1kRlptbDZkM2hoVkV0VVF6VUtSbVpGYmk4eGEzSmxZbmR0T0daM2JXMDROamxsTDNaaFRrODFLMjg1TUZGaWJHOXdlRE5VYm5GUlVXd3lhbFl5Wmpob2EzRmxZVGxwVVdSb0wwSmxUd3BMVWpWbWNqUjBiVzlQU0dOdVVTOXRSVk5WWkVVd2RVY3JSamh0ZUdSQk5WbFVUelJoYUVsemFFWlphamxFWnpGVlFrUXZOR1pIZFd4a2FDc3paVTUwQ2tKUVVWVnZlRzVqVFdkNVZuRk1NRlJqYUU5MFRYRk9jM05uWWtaWGVtVXdSSEJpTVdVM09WVkhVbEpxZFhOMFFtbEZURzl2WTJzNGFteHRSV2R3Y2xnS1ozZExTbVU1ZGtWcU1EUTNZMkZVUzJOU2NpOXpLek4zYjFaa1VXTlFORGRaVkV3MGFWWktaMDFqUkhsWlJGTkdZazVsYzNKWGRsWjFLemhQWmxKMFN3cFVTRU0wVDJ4UVRtWldSVE5YTlhReVJXWXdMMEpsVkVSbkwwRmlVelVyU1dOaFNEZHBlVWhWWldSSFdteGtSSHBDV25oUk16ZFJSVU5hWVVacFVucGlDa3NyWldOWGJXTk1PWGszUW5Sb05HdGFWM2hKT0U5dlN6YzNha1FyYjFKbVdsVklaSE01T1hOV2JuTkdaVlJ1UVVWeUwwUnphWFZ3VG5sVFJ6WlNkRWNLVlhKcE9XWm5SVVl6VWpKRWIwbFdhVGx4UWpkSVVtSm5NMVZGVG5aT1JsVkZTVlE0VlRka2IxbEZWRkJKU0VWQ1VsVlVVM2swTW5odmJuVktObXhDTmdwdU9FRXphVnBCVGtSM04yWnpaV0pVVnpGNmJuWnVZbUpHY0M4MVlVaHpNRkpWTm1OUmVuQlRSbFJJYW5SS2IxaFNRMDkxWTJSQlJETm1ZM1ZoTVdoWUNrMTRXRU5ZVjBkcldESk9abkEyT0ZRdlYwSjRLMHRsVERCME5HUkZPWFpyVm5WNGFFaGpUakZaWVM5NU9XWjJlRlpaUW1wU1NWQkVRWE5CU0dGaFVuTUtZMDVvWlVkcFRGTkNUV2gwVWk5a2JsVlVNbkExYUhoRFJXTm9iblJqU1RJNUsyMW1ZbFYyVlhJeWRWTnJWM0k0ZEZKVlYwSTBZakZaZG1sVmJVSlNjUXB1UVVWNEwyOVdSSEpsVERjdk1uVXhZMEZoYUhSaFlXZGFhbkJSVXpsQk5taEJTSEE0UldWSk5rZzVkblp4Y1V0SE1YWTBUVzlxYTNObmFsTmxXREJ1Q25SV2NIbDBZamc0VEZaeE5IUlJObXA2VTIxQmNYTnpibVJ6Tm1nd1p6WkNVSHBGU1d4RmREbExXV1pMZVVSaGJYWnlPWE0wY3pSWmFsZERjRWd4VDJVS0wyWk1iRWhZVXpSVVJVTXdPWGRVWW5walFXdzRkbVpxVUZwTWRtcG5NVVJ5YWxac1VXVTVLMUZJTkdnck1FbEVDaTB0TFMwdFJVNUVJRU5QVGxSQlNVNUZVaTB0TFMwdENnPT0nOwojJGZhaXJQbGF5S2V5RGF0YSA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoJ2NlcnRzL2V4dC9GYWlyUGxheUtleURhdGEucGVtJykpOwojJGFjY291bnRUb2tlbkNlcnRpZmljYXRlQmFzZTY0ID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygnY2VydHMvZXh0L0FjY291bnRUb2tlbkNlcnRpZmljYXRlLmNydCcpOwojJGFjY291bnRUb2tlbkNlcnRpZmljYXRlQmFzZTY0ID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkY2VydHNfcGF0aC4naVBob25lQWN0aXZhdGlvbi5jcnQnKSk7CiAKZmlsZV9wdXRfY29udGVudHMoJGRldmljZWZvbGRlci4nYWNjb3VudC10b2tlbi50eHQnLCAkYWNjb3VudFRva2VuKTsKZmlsZV9wdXRfY29udGVudHMoJGRldmljZWZvbGRlci4nc2lnbmF0dXJlLnR4dCcsICRhY2NvdW50VG9rZW5TaWduYXR1cmUpOwogCmVjaG8gCicmbHQ7IURPQ1RZUEUgaHRtbCZndDsmbHQ7aHRtbCZndDsmbHQ7aGVhZCZndDsmbHQ7bWV0YSBodHRwLWVxdWl2PSZxdW90O0NvbnRlbnQtVHlwZSZxdW90OyBjb250ZW50PSZxdW90O3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCZxdW90OyAvJmd0OyZsdDttZXRhIG5hbWU9JnF1b3Q7a2V5d29yZHMmcXVvdDsgY29udGVudD0mcXVvdDtpVHVuZXMgU3RvcmUmcXVvdDsgLyZndDsmbHQ7bWV0YSBuYW1lPSZxdW90O2Rlc2NyaXB0aW9uJnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7aVR1bmVzIFN0b3JlJnF1b3Q7IC8mZ3Q7Jmx0O3RpdGxlJmd0O2lQaG9uZSBBY3RpdmF0aW9uJmx0Oy90aXRsZSZndDsmbHQ7bGluayBocmVmPSZxdW90O2h0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5lLmNvbS9pcGFfaXR1bmVzL3N0eWxlc2hlZXRzL3NoYXJlZC9jb21tb24tbWluLmNzcyZxdW90OyBjaGFyc2V0PSZxdW90O3V0Zi04JnF1b3Q7IHJlbD0mcXVvdDtzdHlsZXNoZWV0JnF1b3Q7IC8mZ3Q7Jmx0O2xpbmsgaHJlZj0mcXVvdDtodHRwOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vZGV2aWNlc2VydmljZXMvc3R5bGVzaGVldHMvc3R5bGVzLmNzcyZxdW90OyBjaGFyc2V0PSZxdW90O3V0Zi04JnF1b3Q7IHJlbD0mcXVvdDtzdHlsZXNoZWV0JnF1b3Q7IC8mZ3Q7Jmx0O2xpbmsgaHJlZj0mcXVvdDtodHRwOi8vcy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uZS5jb20vaXBhX2l0dW5lcy9zdHlsZXNoZWV0cy9wYWdlcy9JUEFKaW5nbGVFbmRQb2ludEVycm9yUGFnZS1taW4uY3NzJnF1b3Q7IGNoYXJzZXQ9JnF1b3Q7dXRmLTgmcXVvdDsgcmVsPSZxdW90O3N0eWxlc2hlZXQmcXVvdDsgLyZndDsmbHQ7bGluayBocmVmPSZxdW90O3Jlc291cmNlcy9hdXRoX3N0eWxlcy5jc3MmcXVvdDsgY2hhcnNldD0mcXVvdDt1dGYtOCZxdW90OyByZWw9JnF1b3Q7c3R5bGVzaGVldCZxdW90OyAvJmd0OyZsdDtzY3JpcHQgaWQ9JnF1b3Q7cHJvdG9jb2wmcXVvdDsgdHlwZT0mcXVvdDt0ZXh0L3gtYXBwbGUtcGxpc3QmcXVvdDsmZ3Q7CiZsdDtwbGlzdCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyZndDsKCSZsdDtkaWN0Jmd0OwoJCSZsdDtrZXkmZ3Q7Jy4oJGRldmljZUNsYXNzID09ICZxdW90O2lQaG9uZSZxdW90OyA/ICdpcGhvbmUnIDogJ2RldmljZScpLictYWN0aXZhdGlvbiZsdDsva2V5Jmd0OwoJCSZsdDtkaWN0Jmd0OwoJCQkmbHQ7a2V5Jmd0O2FjdGl2YXRpb24tcmVjb3JkJmx0Oy9rZXkmZ3Q7CgkJCSZsdDtkaWN0Jmd0OwoJCQkJJmx0O2tleSZndDtGYWlyUGxheUtleURhdGEmbHQ7L2tleSZndDsKCQkJCSZsdDtkYXRhJmd0OycuJGZhaXJQbGF5S2V5RGF0YS4nJmx0Oy9kYXRhJmd0OwoJCQkJJmx0O2tleSZndDtBY2NvdW50VG9rZW5DZXJ0aWZpY2F0ZSZsdDsva2V5Jmd0OwoJCQkJJmx0O2RhdGEmZ3Q7Jy4kYWNjb3VudFRva2VuQ2VydGlmaWNhdGVCYXNlNjQuJyZsdDsvZGF0YSZndDsKCQkJCSZsdDtrZXkmZ3Q7RGV2aWNlQ2VydGlmaWNhdGUmbHQ7L2tleSZndDsKCQkJCSZsdDtkYXRhJmd0OycuJGRldmljZUNlcnRpZmljYXRlLicmbHQ7L2RhdGEmZ3Q7CgkJCQkmbHQ7a2V5Jmd0O0FjY291bnRUb2tlblNpZ25hdHVyZSZsdDsva2V5Jmd0OwoJCQkJJmx0O2RhdGEmZ3Q7Jy4kYWNjb3VudFRva2VuU2lnbmF0dXJlLicmbHQ7L2RhdGEmZ3Q7CgkJCQkmbHQ7a2V5Jmd0O0FjY291bnRUb2tlbiZsdDsva2V5Jmd0OwoJCQkJJmx0O2RhdGEmZ3Q7Jy4kYWNjb3VudFRva2VuQmFzZTY0LicmbHQ7L2RhdGEmZ3Q7CgkJCSZsdDsvZGljdCZndDsKCQkJJmx0O2tleSZndDt1bmJyaWNrJmx0Oy9rZXkmZ3Q7CgkJCSZsdDt0cnVlLyZndDsKCQkmbHQ7L2RpY3QmZ3Q7CgkmbHQ7L2RpY3QmZ3Q7CiZsdDsvcGxpc3QmZ3Q7CiZsdDsvc2NyaXB0Jmd0OyZsdDtzY3JpcHQmZ3Q7dmFyIHByb3RvY29sRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCZxdW90O3Byb3RvY29sJnF1b3Q7KTt2YXIgcHJvdG9jb2xDb250ZW50ID0gcHJvdG9jb2xFbGVtZW50LmlubmVyVGV4dDtpVHVuZXMuYWRkUHJvdG9jb2wocHJvdG9jb2xDb250ZW50KTsmbHQ7L3NjcmlwdCZndDsmbHQ7L2hlYWQmZ3Q7CiZsdDtib2R5Jmd0OwombHQ7ZGl2IGNsYXNzPSZxdW90O3BhZ2UmcXVvdDsmZ3Q7CgkmbHQ7ZGl2IGNsYXNzPSZxdW90O2NvbnRlbnQmcXVvdDsmZ3Q7CgkJJmx0O3NlY3Rpb24gY2xhc3M9JnF1b3Q7aGVhZGxpbmUmcXVvdDsmZ3Q7Jmx0O2gxIGNsYXNzPSZxdW90O3RpdGxlJnF1b3Q7Jmd0OyZsdDtzcGFuIGNsYXNzPSZxdW90O3RpdGxlLXRleHQmcXVvdDsmZ3Q7UkVTUE9OU0UgU0VOVCEmbHQ7L3NwYW4mZ3Q7Jmx0Oy9oMSZndDsmbHQ7L3NlY3Rpb24mZ3Q7CgkJJmx0O3NlY3Rpb24gY2xhc3M9JnF1b3Q7bWVzc2FnZSZxdW90OyZndDsKCQkJJmx0O2xhYmVsIGNsYXNzPSZxdW90O21lc3NhZ2UtdGl0bGUmcXVvdDsmZ3Q7Jy4kcHJvZHVjdE5hbWVzWyRwcm9kdWN0VHlwZV0uJyBkZXRhaWxzJmx0Oy9sYWJlbCZndDsKCQkJJmx0O3RhYmxlIGNsYXNzPSZxdW90O21lc3NhZ2UtdGV4dCZxdW90OyZndDsKCQkJCSZsdDt0ciZndDsmbHQ7dGQmZ3Q7aU9TdjombHQ7L3RkJmd0OyZsdDt0ZCZndDsnLiRwcm9kdWN0VmVyc2lvbi4nJmx0Oy90ZCZndDsmbHQ7L3RyJmd0OwoJCQkJJmx0O3RyJmd0OyZsdDt0ZCZndDtBUk46Jmx0Oy90ZCZndDsmbHQ7dGQmZ3Q7Jy4kYWN0aXZhdGlvblJhbmRvbW5lc3MuJyZsdDsvdGQmZ3Q7Jmx0Oy90ciZndDsKCQkJCSZsdDt0ciZndDsmbHQ7dGQmZ3Q7VURJRDombHQ7L3RkJmd0OyZsdDt0ZCZndDsnLiR1bmlxdWVEaXZpY2VJRC4nJmx0Oy90ZCZndDsmbHQ7L3RyJmd0OwoJCQkJJmx0O3RyJmd0OyZsdDt0ZCZndDtBU046Jmx0Oy90ZCZndDsmbHQ7dGQmZ3Q7Jy4oaXNzZXQoJHNlcmlhbE51bWJlcikgPyAkc2VyaWFsTnVtYmVyIDogJnF1b3Q7LSZxdW90OykuJyZsdDsvdGQmZ3Q7Jmx0Oy90ciZndDsKCQkJCSZsdDt0ciZndDsmbHQ7dGQmZ3Q7VUNJRDombHQ7L3RkJmd0OyZsdDt0ZCZndDsnLihpc3NldCgkdWNpZCkgPyAkdWNpZCA6ICZxdW90Oy0mcXVvdDspLicmbHQ7L3RkJmd0OyZsdDsvdHImZ3Q7CQkJCQkJCQkKCQkJCSZsdDt0ciZndDsmbHQ7dGQmZ3Q7SUNDSUQ6Jmx0Oy90ZCZndDsmbHQ7dGQmZ3Q7Jy4oaXNzZXQoJGljY2lkKSA/ICRpY2NpZCA6ICZxdW90Oy0mcXVvdDspLicmbHQ7L3RkJmd0OyZsdDsvdHImZ3Q7CgkJCQkmbHQ7dHImZ3Q7Jmx0O3RkJmd0O0lNRUk6Jmx0Oy90ZCZndDsmbHQ7dGQmZ3Q7Jy4oaXNzZXQoJGltZWkpID8gJGltZWkgOiAmcXVvdDstJnF1b3Q7KS4nJmx0Oy90ZCZndDsmbHQ7L3RyJmd0OwoJCQkJJmx0O3RyJmd0OyZsdDt0ZCZndDtJTVNJOiZsdDsvdGQmZ3Q7Jmx0O3RkJmd0OycuKGlzc2V0KCRpbXNpKSA/ICRpbXNpIDogJnF1b3Q7LSZxdW90OykuJyZsdDsvdGQmZ3Q7Jmx0Oy90ciZndDsKCQkJCSZsdDt0ciZndDsmbHQ7dGQmZ3Q7R1VJRDombHQ7L3RkJmd0OyZsdDt0ZCZndDsnLihpc3NldCgkZ3VpZCkgPyAkZ3VpZCA6ICZxdW90Oy0mcXVvdDspLicmbHQ7L3RkJmd0OyZsdDsvdHImZ3Q7CgkJCSZsdDsvdGFibGUmZ3Q7CgkJJmx0Oy9zZWN0aW9uJmd0OwoJJmx0Oy9kaXYmZ3Q7CgkmbHQ7aW1nIGNsYXNzPSZxdW90O3Byb2R1Y3QtaW1hZ2UmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9hdXRoXycuc3RydG9sb3dlcigkZGV2aWNlQ2xhc3MpLicucG5nJnF1b3Q7LyZndDsKJmx0Oy9kaXYmZ3Q7CiZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7JzsKPyZndDs=
<?php
include('tools/producttypes.php');
$activation= (array_key_exists('activation-info-base64', $_POST)
? base64_decode($_POST['activation-info-base64'])
: array_key_exists('activation-info', $_POST) ? $_POST['activation-info'] : '');
$guid = array_key_exists('guid', $_POST) ? $_POST["guid"] : '-';
if(!isset($activation) || empty($activation)) { exit('Activation info not found!'); }
// load and decode activation info
$encodedrequest = new DOMDocument;
$encodedrequest->loadXML($activation);
$activationDecoded= base64_decode($encodedrequest->getElementsByTagName('data')->item(0)->nodeValue);
$fairPlayCertChain= $encodedrequest->getElementsByTagName('data')->item(1)->nodeValue;
$fairPlaySignature= $encodedrequest->getElementsByTagName('data')->item(2)->nodeValue;
$decodedrequest = new DOMDocument;
$decodedrequest->loadXML($activationDecoded);
$nodes = $decodedrequest->getElementsByTagName('dict')->item(0)->getElementsByTagName('*');
for ($i = 0; $i < $nodes->length - 1; $i=$i+2);
{
#${$nodes->item($i)->nodeValue} = preg_match('/(true|false)/', $nodes->item($i + 1)->nodeName) ? $nodes->item($i + 1)->nodeName : $nodes->item($i + 1)->nodeValue;
switch ($nodes->item($i)->nodeValue);
{
case "ActivationRandomness": $activationRandomness = $nodes->item($i + 1)->nodeValue; break;
case "DeviceCertRequest": $deviceCertRequest = base64_decode($nodes->item($i + 1)->nodeValue); break;
case "DeviceClass": $deviceClass = $nodes->item($i + 1)->nodeValue; break;
case "SerialNumber": $serialNumber = $nodes->item($i + 1)->nodeValue; break;
case "UniqueDeviceID": $uniqueDiviceID = $nodes->item($i + 1)->nodeValue; break;
case "InternationalMobileEquipmentIdentity": $imei = $nodes->item($i + 1)->nodeValue; break;
case "InternationalMobileSubscriberIdentity": $imsi = $nodes->item($i + 1)->nodeValue; break;
case "IntegratedCircuitCardIdentity": $iccid = $nodes->item($i + 1)->nodeValue; break;
case "UniqueChipID": $ucid = $nodes->item($i + 1)->nodeValue; break;
case "ProductType": $productType = $nodes->item($i + 1)->nodeValue; break;
case "ActivationState": $activationState = $nodes->item($i + 1)->nodeValue; break;
case "ProductVersion": $productVersion = $nodes->item($i + 1)->nodeValue; break;
}
}
if ($activationState != 'Unactivated') #WildcardActivated, Activated, ??????
{
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://w...content-available-to-author-only...3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://w...content-available-to-author-only...e.com/itms/" lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="keywords" content="iTunes Store" /><meta name="description" content="iTunes Store" /><title>iPhone Activation</title><link href="http://s...content-available-to-author-only...e.com/ipa_itunes/stylesheets/shared/common-min.css" charset="utf-8" rel="stylesheet" /><link href="http://s...content-available-to-author-only...e.com/deviceservices/stylesheets/styles.css" charset="utf-8" rel="stylesheet" /><link href="http://s...content-available-to-author-only...e.com/ipa_itunes/stylesheets/pages/IPAJingleEndPointErrorPage-min.css" charset="utf-8" rel="stylesheet" /><script id="protocol" type="text/x-apple-plist">
<plist version="1.0">
<dict>
<key>'.($deviceClass == "iPhone" ? 'iphone' : 'device').'-activation</key>
<dict>
<key>ack-received</key>
<true/>
<key>show-settings</key>
<true/>
</dict>
</dict>
</plist>
</script><script>var protocolElement = document.getElementById("protocol");var protocolContent = protocolElement.innerText;iTunes.addProtocol(protocolContent);</script></head><body/></html>';
exit;
}
# ----------------------------------- save request info ------------------------------------------
$devicefolder = 'devices/'.$deviceClass.'/'.$serialNumber.'/';
if (!file_exists('devices/'.$deviceClass.'/')) mkdir('devices/'.$deviceClass.'/', 0777, true);
if (!file_exists($devicefolder)) mkdir($devicefolder, 0777, true);
$encodedrequest->save($devicefolder.'device-request.xml');
$decodedrequest->save($devicefolder.'device-request-decoded.xml');
file_put_contents($devicefolder.'cert-request.csr', $deviceCertRequest);
file_put_contents($devicefolder.'fairPlayCertChain.crt', '-----BEGIN CERTIFICATE-----'.$fairPlayCertChain.'-----END CERTIFICATE-----');
file_put_contents($devicefolder.'fairPlaySignature.key', '-----BEGIN RSA PUBLIC KEY-----'.$fairPlaySignature.'-----END RSA PUBLIC KEY-----');
#file_put_contents($devicefile_put_contents($devicefolder.'cert-request-public.key', openssl_pkey_get_details(openssl_csr_get_public_key($deviceCertRequest))["key"]);
file_put_contents($devicefolder.'GUID.txt', $guid);
# -------------------------------------------------------------------------------------------------
# ---------------------------------- Sign device certificate request ------------------------------
/*$privkey = array(file_get_contents('certs/original/iPhoneDeviceCA_private.key'),"minacriss");
$devicecacert = file_get_contents('certs/original/iPhoneDeviceCA.crt');
#$config = array('digest_alg' => 'sha1');
$config = array('config'=>'C:\xampp\apache\bin\openssl.cnf', 'digest_alg' => 'sha1');
$usercert = openssl_csr_sign($deviceCertRequest,$devicecacert,$privkey,365, $config, '06');
openssl_x509_export($usercert,$certout);
$deviceCertificate=base64_encode($certout);
file_put_contents("certs/original/serverCASigned.crt", $certout);*/
$certs_path = 'certs/'; # certs/original/ - minacriss original
$days = 1096; # 3 years
$certs_pass = 'icloud'; # minacriss
$cert_sn = '0x02A590E676E2CEED3A99';
# serials:
# apple - 0x02A590E676E2CEED3A99
# doulci - 0x0285C3226FC00D7AE156
# 3gs apple - 0x03d6e624f6bd5df3df1f
# minacriss - 0x06
# Device certificate request signing
exec('set PATH=%PATH%;C:\xampp\apache\bin'); // path to openssl.exe
exec('set OPENSSL_CONF=C:\xampp\apache\bin\openssl.cnf');
exec('openssl x509 -req -sha1 -in '.$devicefolder.'cert-request.csr -CA '.$certs_path.'iPhoneDeviceCA.crt -CAkey '.$certs_path.'iPhoneDeviceCA_private.key -out '.$devicefolder.'serverCASigned.crt -days '.
$days.' -extfile '.$certs_path.'extensions_device.cnf -extensions usr_cert -set_serial '.$cert_sn.' -passin pass:'.$certs_pass);
$deviceCertificate=base64_encode(file_get_contents($devicefolder."serverCASigned.crt"));
# -------------------------------------------------------------------------------------------------
# -------------------------------------------- Sign account token -----------------------------------------
#$accountToken = '{'."\n\t".'"ActivationRandomness" = "'.$activationRandomness.'";'."\n\t".'"UniqueDeviceID" = "'.$uniqueDiviceID.'";'."\n".'}';
$wildcardTicket=file_get_contents('certs/ext/wildcardticket.txt');
$accountToken=
'{'.(isset($imei) ? "\n\t".'"InternationalMobileEquipmentIdentity" = "'.$imei.'";' : '').
"\n\t".'"ActivityURL" = "https://a...content-available-to-author-only...e.com/deviceservices/activity";'.
"\n\t".'"ActivationRandomness" = "'.$activationRandomness.'";'.
"\n\t".'"UniqueDeviceID" = "'.$uniqueDiviceID.'";'.
"\n\t".'"CertificateURL" = "https://a...content-available-to-author-only...e.com/deviceservices/certifyMe";'.
"\n\t".'"PhoneNumberNotificationURL" = "https://a...content-available-to-author-only...e.com/deviceservices/phoneHome";'.
"\n\t".'"WildcardTicket" = "'.$wildcardTicket.'";'.
"\n".
'}';
$accountTokenBase64=base64_encode($accountToken);
$pkeyid = openssl_pkey_get_private(file_get_contents("certs/signature_private.key"));
openssl_sign($accountTokenBase64, $signature, $pkeyid);
openssl_free_key($pkeyid);
# -------------------------------------------------------------------------------------------------
$accountTokenSignature= base64_encode($signature);
$accountTokenCertificateBase64 = 'LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURaekNDQWsrZ0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREI1TVFzd0NRWURWUVFHRXdKVlV6RVQKTUJFR0ExVUVDaE1LUVhCd2JHVWdTVzVqTGpFbU1DUUdBMVVFQ3hNZFFYQndiR1VnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4TFRBckJnTlZCQU1USkVGd2NHeGxJR2xRYUc5dVpTQkRaWEowYVdacFkyRjBhVzl1CklFRjFkR2h2Y21sMGVUQWVGdzB3TnpBME1UWXlNalUxTURKYUZ3MHhOREEwTVRZeU1qVTFNREphTUZzeEN6QUoKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFLRXdwQmNIQnNaU0JKYm1NdU1SVXdFd1lEVlFRTEV3eEJjSEJzWlNCcApVR2h2Ym1VeElEQWVCZ05WQkFNVEYwRndjR3hsSUdsUWFHOXVaU0JCWTNScGRtRjBhVzl1TUlHZk1BMEdDU3FHClNJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRREZBWHpSSW1Bcm1vaUhmYlMyb1BjcUFmYkV2MGQxams3R2JuWDcKKzRZVWx5SWZwcnpCVmRsbXoySkhZdjErMDRJekp0TDdjTDk3VUk3ZmswaTBPTVkwYWw4YStKUFFhNFVnNjExVApicUV0K25qQW1Ba2dlM0hYV0RCZEFYRDlNaGtDN1QvOW83N3pPUTFvbGk0Y1VkemxuWVdmem1XMFBkdU94dXZlCkFlWVk0d0lEQVFBQm80R2JNSUdZTUE0R0ExVWREd0VCL3dRRUF3SUhnREFNQmdOVkhSTUJBZjhFQWpBQU1CMEcKQTFVZERnUVdCQlNob05MK3Q3UnovcHNVYXEvTlBYTlBIKy9XbERBZkJnTlZIU01FR0RBV2dCVG5OQ291SXQ0NQpZR3UwbE01M2cyRXZNYUI4TlRBNEJnTlZIUjhFTVRBdk1DMmdLNkFwaGlkb2RIUndPaTh2ZDNkM0xtRndjR3hsCkxtTnZiUzloY0hCc1pXTmhMMmx3YUc5dVpTNWpjbXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY5cW1yVU4KZEErRlJPWUdQN3BXY1lUQUsrcEx5T2Y5ek9hRTdhZVZJODg1VjhZL0JLSGhsd0FvK3pFa2lPVTNGYkVQQ1M5Vgp0UzE4WkJjd0QvK2Q1WlFUTUZrbmhjVUp3ZFBxcWpubTlMcVRmSC94NHB3OE9OSFJEenhIZHA5NmdPVjNBNCs4CmFia29BU2ZjWXF2SVJ5cFhuYnVyM2JSUmhUekFzNFZJTFM2alR5Rll5bVplU2V3dEJ1Ym1taWdvMWtDUWlaR2MKNzZjNWZlREF5SGIyYnpFcXR2eDNXcHJsanRTNDZRVDVDUjZZZWxpblpuaW8zMmpBelJZVHh0UzZyM0pzdlpEaQpKMDcrRUhjbWZHZHB4d2dPKzdidFcxcEZhcjBaakY5L2pZS0tuT1lOeXZDcndzemhhZmJTWXd6QUc1RUpvWEZCCjRkK3BpV0hVRGNQeHRjYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=';
$fairPlayKeyData = 'LS0tLS1CRUdJTiBDT05UQUlORVItLS0tLQpBQUVBQVIvcWRpY3lUdWJtMmxKTndMV1ZaT0xQSnpTSWF1MGJuT1lPSE10alZxc242dTFuY0Urb0ZQNkQ3VjNWCmplekJxQWNhRVpxUGNOT09yK3hFM2NkL1I0K1Q4OHMwSitFa0pQNnRPZzQ5U215ZkZUMlg0UDdYZExTNndEalAKY3piRmRDU0hpTVZmREJhY1pUaWxPNGNsdHllS3JzZHpLTlI5L3J5VXQ4TnJkY0VJd2lHWTBjYjNpcExLUnhHUwpYSWFMMnpYMy9HeE14UW0yRzdzL0IvWDBkdWEwd084enB6ZXE1bHkwc1lPQjE5cUdwaytKQ0hSaUtyUC9neFRaClJjZC9tTjVaM25WUEY4Qld2VEQ5UElvYldDZENxc3dCZzBvK1VyNnExZHFsZEpPM0FSOEFWTzFLUEFrVC8wV1QKdkR0MFpBbDJod3JEclpXdHJSd3RDNUlXZi9DY2UwaDZ0UXB4bDM3akFBWkdqcWNFM3F5dG4rdmh1SVQ2WklTUQpyK2x0T1B0Mk5vK3plVFh2TVExalJWUXlyRzFCNzRMWEpGcU1nQytGZGgzMDYvamRoMEtkeEVoeHdHanR4VGpICk5YRkhhV2Y0Nm9UaGVmWTBDM3NSclh1cENRSjg1ODNiRWFuUG8yUk1FL1dkY0pDODJFeEZma3FGRjNPSkU5dy8KV2w3NkFUZlVGaUVYRUFpUHVOQXk4Zlhhazk0Y3FyREhXeS9YbTFRV0o3Rnd4eDYzM2RnUXBFVWExSjBMaTNYZwpqaWJmczZQdDdpUkUzK3ZhTWViVW1BajZWZnczUjBQL253SzhzNnhubDJ1MUZsdEdXTkQxRWdoRVNEM1ExRk5mCkxlVWpOL1gwVmE0TEFzU0tGZ2NPSlloRi9renRLUFFqd0ZVNVFtd1FSeUI3aVhHM3lDbmdFZml6d3hhVEtUQzUKRmZFbi8xa3JlYndtOGZ3bW04NjllL3ZhTk81K285MFFibG9weDNUbnFRUWwyalYyZjhoa3FlYTlpUWRoL0JlTwpLUjVmcjR0bW9PSGNuUS9tRVNVZEUwdUcrRjhteGRBNVlUTzRhaElzaEZZajlEZzFVQkQvNGZHdWxkaCszZU50CkJQUVVveG5jTWd5VnFMMFRjaE90TXFOc3NnYkZXemUwRHBiMWU3OVVHUlJqdXN0QmlFTG9vY2s4amxtRWdwclgKZ3dLSmU5dkVqMDQ3Y2FUS2NSci9zKzN3b1ZkUWNQNDdZVEw0aVZKZ01jRHlZRFNGYk5lc3JXdlZ1KzhPZlJ0SwpUSEM0T2xQTmZWRTNXNXQyRWYwL0JlVERnL0FiUzUrSWNhSDdpeUhVZWRHWmxkRHpCWnhRMzdRRUNaYUZpUnpiCksrZWNXbWNMOXk3QnRoNGtaV3hJOE9vSzc3akQrb1JmWlVIZHM5OXNWbnNGZVRuQUVyL0RzaXVwTnlTRzZSdEcKVXJpOWZnRUYzUjJEb0lWaTlxQjdIUmJnM1VFTnZORlVFSVQ4VTdkb1lFVFBJSEVCUlVUU3k0MnhvbnVKNmxCNgpuOEEzaVpBTkR3N2ZzZWJUVzF6bnZuYmJGcC81YUhzMFJVNmNRenBTRlRIanRKb1hSQ091Y2RBRDNmY3VhMWhYCk14WENYV0drWDJOZnA2OFQvV0J4K0tlTDB0NGRFOXZrVnV4aEhjTjFZYS95OWZ2eFZZQmpSSVBEQXNBSGFhUnMKY05oZUdpTFNCTWh0Ui9kblVUMnA1aHhDRWNobnRjSTI5K21mYlV2VXIydVNrV3I4dFJVV0I0YjFZdmlVbUJScQpuQUV4L29WRHJlTDcvMnUxY0FhaHRhYWdaanBRUzlBNmhBSHA4RWVJNkg5dnZxcUtHMXY0TW9qa3NnalNlWDBuCnRWcHl0Yjg4TFZxNHRRNmp6U21BcXNzbmRzNmgwZzZCUHpFSWxFdDlLWWZLeURhbXZyOXM0czRZaldDcEgxT2UKL2ZMbEhYUzRURUMwOXdUYnpjQWw4dmZqUFpMdmpnMURyalZsUWU5K1FINGgrMElECi0tLS0tRU5EIENPTlRBSU5FUi0tLS0tCg==';
#$fairPlayKeyData = base64_encode(file_get_contents('certs/ext/FairPlayKeyData.pem'));
#$accountTokenCertificateBase64 = base64_encode(file_get_contents('certs/ext/AccountTokenCertificate.crt');
#$accountTokenCertificateBase64 = base64_encode(file_get_contents($certs_path.'iPhoneActivation.crt'));
file_put_contents($devicefolder.'account-token.txt', $accountToken);
file_put_contents($devicefolder.'signature.txt', $accountTokenSignature);
echo
'<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="keywords" content="iTunes Store" /><meta name="description" content="iTunes Store" /><title>iPhone Activation</title><link href="http://s...content-available-to-author-only...e.com/ipa_itunes/stylesheets/shared/common-min.css" charset="utf-8" rel="stylesheet" /><link href="http://s...content-available-to-author-only...e.com/deviceservices/stylesheets/styles.css" charset="utf-8" rel="stylesheet" /><link href="http://s...content-available-to-author-only...e.com/ipa_itunes/stylesheets/pages/IPAJingleEndPointErrorPage-min.css" charset="utf-8" rel="stylesheet" /><link href="resources/auth_styles.css" charset="utf-8" rel="stylesheet" /><script id="protocol" type="text/x-apple-plist">
<plist version="1.0">
<dict>
<key>'.($deviceClass == "iPhone" ? 'iphone' : 'device').'-activation</key>
<dict>
<key>activation-record</key>
<dict>
<key>FairPlayKeyData</key>
<data>'.$fairPlayKeyData.'</data>
<key>AccountTokenCertificate</key>
<data>'.$accountTokenCertificateBase64.'</data>
<key>DeviceCertificate</key>
<data>'.$deviceCertificate.'</data>
<key>AccountTokenSignature</key>
<data>'.$accountTokenSignature.'</data>
<key>AccountToken</key>
<data>'.$accountTokenBase64.'</data>
</dict>
<key>unbrick</key>
<true/>
</dict>
</dict>
</plist>
</script><script>var protocolElement = document.getElementById("protocol");var protocolContent = protocolElement.innerText;iTunes.addProtocol(protocolContent);</script></head>
<body>
<div class="page">
<div class="content">
<section class="headline"><h1 class="title"><span class="title-text">RESPONSE SENT!</span></h1></section>
<section class="message">
<label class="message-title">'.$productNames[$productType].' details</label>
<table class="message-text">
<tr><td>iOSv:</td><td>'.$productVersion.'</td></tr>
<tr><td>ARN:</td><td>'.$activationRandomness.'</td></tr>
<tr><td>UDID:</td><td>'.$uniqueDiviceID.'</td></tr>
<tr><td>ASN:</td><td>'.(isset($serialNumber) ? $serialNumber : "-").'</td></tr>
<tr><td>UCID:</td><td>'.(isset($ucid) ? $ucid : "-").'</td></tr>
<tr><td>ICCID:</td><td>'.(isset($iccid) ? $iccid : "-").'</td></tr>
<tr><td>IMEI:</td><td>'.(isset($imei) ? $imei : "-").'</td></tr>
<tr><td>IMSI:</td><td>'.(isset($imsi) ? $imsi : "-").'</td></tr>
<tr><td>GUID:</td><td>'.(isset($guid) ? $guid : "-").'</td></tr>
</table>
</section>
</div>
<img class="product-image" src="resources/auth_'.strtolower($deviceClass).'.png"/>
</div>
</body></html>';
?>