(async function(){
var RAW_SCHEMA = "eyJlbGVtZW50cyI6W3sidHlwZSI6IkhlYWRlciIsInRleHQiOiLQmtCw0LvRjNC60YPQu9GP0YLQvtGAINGE0YPQvdC00LDQvNC10L3RgtC90L7QuSDQv9C70LjRgtGLIiwiYmdDb2xvciI6IiNlNjIiLCJ0ZXh0Q29sb3IiOiIjRkZGIn0seyJ0eXBlIjoiSW5wdXQiLCJrZXkiOiJMRU5fTSIsIm5hbWUiOiLQlNC70LjQvdCwINC/0LvQuNGC0YssINC8IiwiZGVmYXVsdCI6MTAsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IklucHV0Iiwia2V5IjoiV0lEX00iLCJuYW1lIjoi0KjQuNGA0LjQvdCwINC/0LvQuNGC0YssINC8IiwiZGVmYXVsdCI6MTAsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IklucHV0Iiwia2V5IjoiVEhLX01NIiwibmFtZSI6ItCi0L7Qu9GJ0LjQvdCwINC/0LvQuNGC0YssINC80LwiLCJkZWZhdWx0IjozNTAsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IlJhZGlvIiwia2V5IjoiUFVfTkVFREVEIiwibmFtZSI6ItCfLdC+0LHRgNCw0LfQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyIsImRlZmF1bHQiOjEsImNvbHMiOjIsInZhcmlhbnRzIjpbeyJuYW1lIjoi0J3Rg9C20L3RiyIsInZhbHVlIjoxfSx7Im5hbWUiOiLQndC1INC90YPQttC90YsiLCJ2YWx1ZSI6MH1dLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJSYWRpbyIsImtleSI6Ik1FU0hfUk9XUyIsIm5hbWUiOiLQp9C40YHQu9C+INGA0Y/QtNC+0LIg0LDRgNC80LDRgtGD0YDQvdC+0Lkg0YHQtdGC0LrQuCIsImRlZmF1bHQiOjIsImNvbHMiOjIsInZhcmlhbnRzIjpbeyJuYW1lIjoiMSDRgNGP0LQiLCJ2YWx1ZSI6MX0seyJuYW1lIjoiMiDRgNGP0LTQsCIsInZhbHVlIjoyfV0sInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IlNlbGVjdCIsImtleSI6IkNFTExfU1RFUF9NTSIsIm5hbWUiOiLQqNCw0LMg0Y/Rh9C10LnQutC4LCDQvNC8IiwiZGVmYXVsdCI6MjUwLCJ2YXJpYW50cyI6W3sibmFtZSI6IjEwMCDQvNC8IiwidmFsdWUiOjEwMH0seyJuYW1lIjoiMTUwINC80LwiLCJ2YWx1ZSI6MTUwfSx7Im5hbWUiOiIyMDAg0LzQvCIsInZhbHVlIjoyMDB9LHsibmFtZSI6IjI1MCDQvNC8IiwidmFsdWUiOjI1MH0seyJuYW1lIjoiMzAwINC80LwiLCJ2YWx1ZSI6MzAwfSx7Im5hbWUiOiIzNTAg0LzQvCIsInZhbHVlIjozNTB9LHsibmFtZSI6IjQwMCDQvNC8IiwidmFsdWUiOjQwMH0seyJuYW1lIjoiNDUwINC80LwiLCJ2YWx1ZSI6NDUwfSx7Im5hbWUiOiI1MDAg0LzQvCIsInZhbHVlIjo1MDB9LHsibmFtZSI6IjU1MCDQvNC8IiwidmFsdWUiOjU1MH0seyJuYW1lIjoiNjAwINC80LwiLCJ2YWx1ZSI6NjAwfV0sInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkRhdGFTZWxlY3QiLCJrZXkiOiJSRUJBUl9ESUFfTU0iLCJuYW1lIjoi0JTQuNCw0LzQtdGC0YAg0LDRgNC80LDRgtGD0YDRiywg0LzQvCIsImRlZmF1bHQiOiJBNTAwQyBkMTQiLCJ2YXJpYW50cyI6W3sibmFtZSI6ItCQ0YDQvNCw0YLRg9GA0LAg0JAyNDAgZDMiLCJ2YWx1ZSI6M30seyJuYW1lIjoi0JDRgNC80LDRgtGD0YDQsCDQkDI0MCBkNCIsInZhbHVlIjo0fSx7Im5hbWUiOiLQkNGA0LzQsNGC0YPRgNCwINCQMjQwIGQ1IiwidmFsdWUiOjV9LHsibmFtZSI6ItCQ0YDQvNCw0YLRg9GA0LAg0JAyNDAgZDYiLCJ2YWx1ZSI6Nn0seyJuYW1lIjoi0JDRgNC80LDRgtGD0YDQsCDQkDI0MCBkOCIsInZhbHVlIjo4fSx7Im5hbWUiOiJkMTAiLCJ2YWx1ZSI6MTB9LHsibmFtZSI6ImQxMiIsInZhbHVlIjoxMn0seyJuYW1lIjoiZDE0IiwidmFsdWUiOjE0fSx7Im5hbWUiOiJkMTYiLCJ2YWx1ZSI6MTZ9LHsibmFtZSI6ImQxOCIsInZhbHVlIjoxOH0seyJuYW1lIjoiZDIwIiwidmFsdWUiOjIwfSx7Im5hbWUiOiJkMjIiLCJ2YWx1ZSI6MjJ9LHsibmFtZSI6ImQyNSIsInZhbHVlIjoyNX0seyJuYW1lIjoiZDI4IiwidmFsdWUiOjI4fSx7Im5hbWUiOiJkMzIiLCJ2YWx1ZSI6MzJ9LHsibmFtZSI6ImQzNiIsInZhbHVlIjozNn0seyJuYW1lIjoiZDQwIiwidmFsdWUiOjQwfSx7Im5hbWUiOiJkNDUiLCJ2YWx1ZSI6NDV9LHsibmFtZSI6ImQ1MCIsInZhbHVlIjo1MH0seyJuYW1lIjoiZDU1IiwidmFsdWUiOjU1fSx7Im5hbWUiOiJkNjAiLCJ2YWx1ZSI6NjB9LHsibmFtZSI6ImQ3MCIsInZhbHVlIjo3MH0seyJuYW1lIjoiZDgwIiwidmFsdWUiOjgwfV0sImRhdGEiOiJ7XG4gIFwiQTI0MCBkM1wiOiB7XCJNQUlOX1dcIjogMC4wNTUsIFwiTUFJTl9EXCI6IDN9LFxuICBcIkEyNDAgZDRcIjoge1wiTUFJTl9XXCI6IDAuMDk5LCBcIk1BSU5fRFwiOiA0fSxcbiAgXCJBMjQwIGQ1XCI6IHtcIk1BSU5fV1wiOiAwLjE1NCwgXCJNQUlOX0RcIjogNX0sXG4gIFwiQTI0MCBkNlwiOiB7XCJNQUlOX1dcIjogMC4yMjIsIFwiTUFJTl9EXCI6IDZ9LFxuICBcIkEyNDAgZDhcIjoge1wiTUFJTl9XXCI6IDAuMzk1LCBcIk1BSU5fRFwiOiA4fSxcblxuICBcIkE1MDBDIGQxMFwiOiB7XCJNQUlOX1dcIjogMC42MTcsIFwiTUFJTl9EXCI6IDEwfSxcbiAgXCJBNTAwQyBkMTJcIjoge1wiTUFJTl9XXCI6IDAuODg4LCBcIk1BSU5fRFwiOiAxMn0sXG4gIFwiQTUwMEMgZDE0XCI6IHtcIk1BSU5fV1wiOiAxLjIwOCwgXCJNQUlOX0RcIjogMTR9LFxuICBcIkE1MDBDIGQxNlwiOiB7XCJNQUlOX1dcIjogMS41NzgsIFwiTUFJTl9EXCI6IDE2fSxcbiAgXCJBNTAwQyBkMThcIjoge1wiTUFJTl9XXCI6IDEuOTk4LCBcIk1BSU5fRFwiOiAxOH0sXG4gIFwiQTUwMEMgZDIwXCI6IHtcIk1BSU5fV1wiOiAyLjQ2NiwgXCJNQUlOX0RcIjogMjB9LFxuICBcIkE1MDBDIGQyMlwiOiB7XCJNQUlOX1dcIjogMi45ODQsIFwiTUFJTl9EXCI6IDIyfSxcbiAgXCJBNTAwQyBkMjVcIjoge1wiTUFJTl9XXCI6IDMuODUzLCBcIk1BSU5fRFwiOiAyNX0sXG4gIFwiQTUwMEMgZDI4XCI6IHtcIk1BSU5fV1wiOiA0LjgzNCwgXCJNQUlOX0RcIjogMjh9LFxuICBcIkE1MDBDIGQzMlwiOiB7XCJNQUlOX1dcIjogNi4zMTMsIFwiTUFJTl9EXCI6IDMyfSxcbiAgXCJBNTAwQyBkMzZcIjoge1wiTUFJTl9XXCI6IDcuOTksIFwiTUFJTl9EXCI6IDM2fSxcbiAgXCJBNTAwQyBkNDBcIjoge1wiTUFJTl9XXCI6IDkuODY1LCBcIk1BSU5fRFwiOiA0MH0sXG4gIFwiQTUwMEMgZDQ1XCI6IHtcIk1BSU5fV1wiOiAxMi40ODUsIFwiTUFJTl9EXCI6IDQ1fSxcbiAgXCJBNTAwQyBkNTBcIjoge1wiTUFJTl9XXCI6IDE1LjQxMywgXCJNQUlOX0RcIjogNTB9LFxuICBcIkE1MDBDIGQ1NVwiOiB7XCJNQUlOX1dcIjogMTguNjUsIFwiTUFJTl9EXCI6IDU1fSxcbiAgXCJBNTAwQyBkNjBcIjoge1wiTUFJTl9XXCI6IDIyLjE5NSwgXCJNQUlOX0RcIjogNjB9LFxuICBcIkE1MDBDIGQ3MFwiOiB7XCJNQUlOX1dcIjogMzAuMjEsIFwiTUFJTl9EXCI6IDcwfSxcbiAgXCJBNTAwQyBkODBcIjoge1wiTUFJTl9XXCI6IDM5LjQ1OCwgXCJNQUlOX0RcIjogODB9XG59In0seyJ0eXBlIjoiUmFkaW8iLCJrZXkiOiJGT1JNV09SS19UWVBFIiwibmFtZSI6ItCe0L/QsNC70YPQsdC60LAiLCJkZWZhdWx0IjoxLCJjb2xzIjoyLCJ2YXJpYW50cyI6W3sibmFtZSI6ItCe0LHRgNC10LfQvdCw0Y8g0LTQvtGB0LrQsCIsInZhbHVlIjoxLCJpbWFnZSI6Imh0dHBzOi8vaW5zLmJlc3Rub3ZlbHMucnUvYXBpL2dldEZpbGU/bmFtZT1lZmJmNzdjZi05OTBiLTQ1OTItYTE5Yi1hMjBmODE0MmNkNDQifSx7Im5hbWUiOiLQm9Cw0LzQuNC90LjRgNC+0LLQsNC90L3QsNGPINGE0LDQvdC10YDQsCIsInZhbHVlIjoyLCJpbWFnZSI6Imh0dHBzOi8vaW5zLmJlc3Rub3ZlbHMucnUvYXBpL2dldEZpbGU/bmFtZT01OGJjOGZkOS1hMTU5LTRhNjYtYmNlNC01NGI4ZjBhZGNjYmYifV0sInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IlNlbGVjdCIsImtleSI6IkJPQVJEX1RIS19NIiwibmFtZSI6ItCi0L7Qu9GJ0LjQvdCwINC00L7RgdC60LggKNC00LvRjyDQvtC/0LDQu9GD0LHQutC4KSwg0LwiLCJkZWZhdWx0IjowLjA0LCJ2YXJpYW50cyI6W3sibmFtZSI6IjMwINC80LwiLCJ2YWx1ZSI6MC4wM30seyJuYW1lIjoiNDAg0LzQvCIsInZhbHVlIjowLjA0fSx7Im5hbWUiOiI1MCDQvNC8IiwidmFsdWUiOjAuMDV9XSwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiU2VsZWN0Iiwia2V5IjoiSU5TVUxfVEhLX00iLCJuYW1lIjoi0KLQvtC70YnQuNC90LAg0YPRgtC10L/Qu9C40YLQtdC70Y8sINC8IiwiZGVmYXVsdCI6MC4wNSwidmFyaWFudHMiOlt7Im5hbWUiOiIzMCDQvNC8IiwidmFsdWUiOjAuMDN9LHsibmFtZSI6IjQwINC80LwiLCJ2YWx1ZSI6MC4wNH0seyJuYW1lIjoiNTAg0LzQvCIsInZhbHVlIjowLjA1fSx7Im5hbWUiOiI2MCDQvNC8IiwidmFsdWUiOjAuMDZ9LHsibmFtZSI6IjcwINC80LwiLCJ2YWx1ZSI6MC4wN30seyJuYW1lIjoiODAg0LzQvCIsInZhbHVlIjowLjA4fSx7Im5hbWUiOiI5MCDQvNC8IiwidmFsdWUiOjAuMDl9LHsibmFtZSI6IjEwMCDQvNC8IiwidmFsdWUiOjAuMX1dLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJIZWFkZXIiLCJ0ZXh0Ijoi0KbQtdC90YsiLCJiZ0NvbG9yIjoiIzAwODAwMCIsInRleHRDb2xvciI6IiJ9LHsidHlwZSI6IklucHV0Iiwia2V5IjoiUFJJQ0VfQ09OQ1JFVEVfTTMiLCJuYW1lIjoi0KHRgtC+0LjQvNC+0YHRgtGMINCx0LXRgtC+0L3QsCwg4oK9L9C8wrMiLCJkZWZhdWx0Ijo2MDAwLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJJbnB1dCIsImtleSI6IlBSSUNFX1JFQkFSIiwibmFtZSI6ItCh0YLQvtC40LzQvtGB0YLRjCDQsNGA0LzQsNGC0YPRgNGLICjQv9C+INCy0YvQsdGA0LDQvdC90L7QuSDQtdC00LjQvdC40YbQtSksIOKCvSIsImRlZmF1bHQiOjcwMDAwLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJSYWRpbyIsImtleSI6IlJFQkFSX1BSSUNFX01PREUiLCJuYW1lIjoi0JXQtNC40L3QuNGG0LAg0YbQtdC90Ysg0LDRgNC80LDRgtGD0YDRiyIsImRlZmF1bHQiOjEsImNvbHMiOjIsInZhcmlhbnRzIjpbeyJuYW1lIjoi4oK9L9GC0L7QvdC90LAiLCJ2YWx1ZSI6MX0seyJuYW1lIjoi4oK9L9C8LtC/LiIsInZhbHVlIjoyfV0sInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IklucHV0Iiwia2V5IjoiUFJJQ0VfSU5TVUxfTTIiLCJuYW1lIjoi0KHRgtC+0LjQvNC+0YHRgtGMINGD0YLQtdC/0LvQuNGC0LXQu9GPLCDigr0v0LzCsiIsImRlZmF1bHQiOjc1MCwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiSW5wdXQiLCJrZXkiOiJQUklDRV9GT1JNV09SSyIsIm5hbWUiOiLQodGC0L7QuNC80L7RgdGC0Ywg0L7Qv9Cw0LvRg9Cx0LrQuCwg4oK9IiwiZGVmYXVsdCI6MjEwMDAsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IlJhZGlvIiwia2V5IjoiV09SS19QUklDRV9NT0RFIiwibmFtZSI6ItCV0LTQuNC90LjRhtCwINGG0LXQvdGLINCx0LXRgtC+0L3QvdGL0YUg0YDQsNCx0L7RgiIsImRlZmF1bHQiOjIsImNvbHMiOjIsInZhcmlhbnRzIjpbeyJuYW1lIjoi4oK9L9C8wrIg0L/Qu9C40YLRiyIsInZhbHVlIjoxfSx7Im5hbWUiOiLigr0v0LzCsyDQsdC10YLQvtC90LAiLCJ2YWx1ZSI6Mn1dLCJ2YWx1ZU1vZGUiOiJyYXcifSx7InR5cGUiOiJJbnB1dCIsImtleSI6IlBSSUNFX1dPUktfQ09OQyIsIm5hbWUiOiLQodGC0L7QuNC80L7RgdGC0Ywg0LHQtdGC0L7QvdC90YvRhSDRgNCw0LHQvtGCLCDigr0iLCJkZWZhdWx0IjoxMjAwMCwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiSW5wdXQiLCJrZXkiOiJQUklDRV9XT1JLX0lOU1VMIiwibmFtZSI6ItCh0YLQvtC40LzQvtGB0YLRjCDQvNC+0L3RgtCw0LbQsCDRg9GC0LXQv9C70LjRgtC10LvRjywg4oK9L9C8wrIiLCJkZWZhdWx0IjoxMDAwLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiVEhLX00iLCJuYW1lIjoi0KLQvtC70YnQuNC90LAsINC8IiwiZm9ybXVsYSI6IlRIS19NTS8xMDAwIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkxFTl9DTSIsIm5hbWUiOiLQlNC70LjQvdCwLCDRgdC8IiwiZm9ybXVsYSI6IkxFTl9NKjEwMCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJXSURfQ00iLCJuYW1lIjoi0KjQuNGA0LjQvdCwLCDRgdC8IiwiZm9ybXVsYSI6IldJRF9NKjEwMCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJMRU5fTU0iLCJuYW1lIjoi0JTQu9C40L3QsCwg0LzQvCIsImZvcm11bGEiOiJMRU5fTSoxMDAwIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IldJRF9NTSIsIm5hbWUiOiLQqNC40YDQuNC90LAsINC80LwiLCJmb3JtdWxhIjoiV0lEX00qMTAwMCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJQRVJJTV9NIiwibmFtZSI6ItCf0LXRgNC40LzQtdGC0YAsINC8LtC/LiIsImZvcm11bGEiOiIoTEVOX00qMikrKFdJRF9NKjIpIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkFSRUFfTTIiLCJuYW1lIjoi0J/Qu9C+0YnQsNC00Ywg0L/Qu9C40YLRiywg0LzCsiIsImZvcm11bGEiOiJMRU5fTSpXSURfTSIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJWT0xfTTMiLCJuYW1lIjoi0J7QsdGK0ZHQvCDQsdC10YLQvtC90LAsINC8wrMiLCJmb3JtdWxhIjoiKExFTl9NKldJRF9NKSooVEhLX01NLzEwMDApIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IldFSUdIVF9UIiwibmFtZSI6ItCS0LXRgSDQv9C70LjRgtGLLCDRgiIsImZvcm11bGEiOiJWT0xfTTMqMi41IiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkxPQURfS0dfQ00yIiwibmFtZSI6ItCd0LDQs9GA0YPQt9C60LAsINC60LMv0YHQvMKyIiwiZm9ybXVsYSI6IihXRUlHSFRfVCoxMDAwKS8oTEVOX0NNKldJRF9DTSkiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiU0lERV9BUkVBX00yIiwibmFtZSI6ItCf0LvQvtGJ0LDQtNGMINCx0L7QutC+0LLQvtC5INC/0L7QstC10YDRhdC90L7RgdGC0LgsINC8wrIiLCJmb3JtdWxhIjoiUEVSSU1fTSpUSEtfTSIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJSRUJBUl9XX0tHX00iLCJuYW1lIjoi0JLQtdGBIDEg0Lwg0LDRgNC80LDRgtGD0YDRiywg0LrQsy/QvCIsImZvcm11bGEiOiJSRUJBUl9ESUFfTU09PT0zPzAuMDU1OlJFQkFSX0RJQV9NTT09PTQ/MC4wOTk6UkVCQVJfRElBX01NPT09NT8wLjE1NDpSRUJBUl9ESUFfTU09PT02PzAuMjIyOlJFQkFSX0RJQV9NTT09PTg/MC4zOTU6UkVCQVJfRElBX01NPT09MTA/MC42MTc6UkVCQVJfRElBX01NPT09MTI/MC44ODg6UkVCQVJfRElBX01NPT09MTQ/MS4yMDg6UkVCQVJfRElBX01NPT09MTY/MS41Nzg6UkVCQVJfRElBX01NPT09MTg/MS45OTg6UkVCQVJfRElBX01NPT09MjA/Mi40NjY6UkVCQVJfRElBX01NPT09MjI/Mi45ODQ6UkVCQVJfRElBX01NPT09MjU/My44NTM6UkVCQVJfRElBX01NPT09Mjg/NC44MzQ6UkVCQVJfRElBX01NPT09MzI/Ni4zMTM6UkVCQVJfRElBX01NPT09MzY/Ny45OTpSRUJBUl9ESUFfTU09PT00MD85Ljg2NTpSRUJBUl9ESUFfTU09PT00NT8xMi40ODU6UkVCQVJfRElBX01NPT09NTA/MTUuNDEzOlJFQkFSX0RJQV9NTT09PTU1PzE4LjY1OlJFQkFSX0RJQV9NTT09PTYwPzIyLjE5NTpSRUJBUl9ESUFfTU09PT03MD8zMC4yMTpSRUJBUl9ESUFfTU09PT04MD8zOS40NTg6MCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJSRUJBUl9NQUlOX00iLCJuYW1lIjoi0J7RgdC90L7QstC90LDRjyDQsNGA0LzQsNGC0YPRgNCwLCDQvC7Qvy4iLCJmb3JtdWxhIjoiKCgoTWF0aC5jZWlsKFdJRF9NTS9DRUxMX1NURVBfTU0pKzEpKigoTEVOX018fDApKygoUkVCQVJfU0VHX0x8fDEpLTEpKihSRUJBUl9MQVBfTXx8MCkpKSsoKE1hdGguY2VpbChMRU5fTU0vQ0VMTF9TVEVQX01NKSsxKSooKFdJRF9NfHwwKSsoKFJFQkFSX1NFR19XfHwxKS0xKSooUkVCQVJfTEFQX018fDApKSkpKihNRVNIX1JPV1N8fDEpIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlJFQkFSX01BSU5fS0ciLCJuYW1lIjoi0JLQtdGBINC+0YHQvdC+0LLQvdC+0Lkg0LDRgNC80LDRgtGD0YDRiywg0LrQsyIsImZvcm11bGEiOiJSRUJBUl9NQUlOX00qTUFJTl9XIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlBVX0NPVU5UIiwibmFtZSI6ItCa0L7Quy3QstC+INCfLdGN0LvQtdC80LXQvdGC0L7Qsiwg0YjRgiIsImZvcm11bGEiOiIoTWF0aC5jZWlsKChMRU5fTU0qMitXSURfTU0qMikpL0NFTExfU1RFUF9NTSkiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiUFVfTEVOXzEiLCJuYW1lIjoi0JTQu9C40L3QsCAxINCfLdGN0LvQtdC80LXQvdGC0LAsINC8IiwiZm9ybXVsYSI6IlRIS19NKyhNQUlOX0QqKDMyLzEwMDApKjIpIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlBVX1RPVEFMX00iLCJuYW1lIjoi0J8t0Y3Qu9C10LzQtdC90YLRiywg0LLRgdC10LPQviDQvC7Qvy4iLCJmb3JtdWxhIjoiUFVfTkVFREVEPT09MT9QVV9MRU5fMSpQVV9DT1VOVDowIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlBVX1RPVEFMX0tHIiwibmFtZSI6ItCS0LXRgSDQny3RjdC70LXQvNC10L3RgtC+0LIsINC60LMiLCJmb3JtdWxhIjoiUFVfVE9UQUxfTSpNQUlOX1ciLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiRk9STVdPUktfTTIiLCJuYW1lIjoi0J7Qv9Cw0LvRg9Cx0LrQsCwg0L/Qu9C+0YnQsNC00Ywg0LzCsiIsImZvcm11bGEiOiJTSURFX0FSRUFfTTIiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiRk9STVdPUktfTTMiLCJuYW1lIjoi0J7Qv9Cw0LvRg9Cx0LrQsCwg0L7QsdGK0ZHQvCDQu9C10YHQsCDQvMKzIiwiZm9ybXVsYSI6IkZPUk1XT1JLX00yKkJPQVJEX1RIS19NIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IklOU1VMX00yIiwibmFtZSI6ItCj0YLQtdC/0LvQuNGC0LXQu9GMLCDQvMKyIiwiZm9ybXVsYSI6IlNJREVfQVJFQV9NMiIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJJTlNVTF9NMyIsIm5hbWUiOiLQo9GC0LXQv9C70LjRgtC10LvRjCwg0LzCsyIsImZvcm11bGEiOiJJTlNVTF9NMipJTlNVTF9USEtfTSIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJDT1NUX0NPTkNSRVRFIiwibmFtZSI6ItCh0YLQvtC40LzQvtGB0YLRjCDQsdC10YLQvtC90LAsIOKCvSIsImZvcm11bGEiOiJWT0xfTTMqUFJJQ0VfQ09OQ1JFVEVfTTMiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiUkVCQVJfUVRZX0ZPUl9QUklDRSIsIm5hbWUiOiLQkNGA0LzQsNGC0YPRgNCwLCDQutC+0Lst0LLQviAo0LTQu9GPINGG0LXQvdGLKSIsImZvcm11bGEiOiJSRUJBUl9QUklDRV9NT0RFPT09MT8oKFJFQkFSX01BSU5fS0crUFVfVE9UQUxfS0cpLzEwMDApOihSRUJBUl9NQUlOX00rUFVfVE9UQUxfTSkiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiQ09TVF9SRUJBUiIsIm5hbWUiOiLQodGC0L7QuNC80L7RgdGC0Ywg0LDRgNC80LDRgtGD0YDRiywg4oK9IiwiZm9ybXVsYSI6IlJFQkFSX1FUWV9GT1JfUFJJQ0UqUFJJQ0VfUkVCQVIiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiRk9STVdPUktfUVRZX0ZPUl9QUklDRSIsIm5hbWUiOiLQntC/0LDQu9GD0LHQutCwLCDQutC+0Lst0LLQviAo0LTQu9GPINGG0LXQvdGLKSIsImZvcm11bGEiOiJGT1JNV09SS19UWVBFPT09MT9GT1JNV09SS19NMzpGT1JNV09SS19NMiIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJDT1NUX0ZPUk1XT1JLIiwibmFtZSI6ItCh0YLQvtC40LzQvtGB0YLRjCDQvtC/0LDQu9GD0LHQutC4LCDigr0iLCJmb3JtdWxhIjoiRk9STVdPUktfUVRZX0ZPUl9QUklDRSpQUklDRV9GT1JNV09SSyIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJDT1NUX0lOU1VMIiwibmFtZSI6ItCh0YLQvtC40LzQvtGB0YLRjCDRg9GC0LXQv9C70LjRgtC10LvRjywg4oK9IiwiZm9ybXVsYSI6IklOU1VMX00yKlBSSUNFX0lOU1VMX00yIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkNPU1RfTUFUX1RPVEFMIiwibmFtZSI6ItCY0YLQvtCz0L4g0LzQsNGC0LXRgNC40LDQu9GLLCDigr0iLCJmb3JtdWxhIjoiQ09TVF9DT05DUkVURStDT1NUX1JFQkFSK0NPU1RfRk9STVdPUksrQ09TVF9JTlNVTCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJXT1JLX1FUWV9DT05DIiwibmFtZSI6ItCR0LXRgtC+0L3QvdGL0LUg0YDQsNCx0L7RgtGLLCDQutC+0Lst0LLQviAo0LTQu9GPINGG0LXQvdGLKSIsImZvcm11bGEiOiJXT1JLX1BSSUNFX01PREU9PT0xP0FSRUFfTTI6Vk9MX00zIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkNPU1RfV09SS19DT05DIiwibmFtZSI6ItCR0LXRgtC+0L3QvdGL0LUg0YDQsNCx0L7RgtGLLCDigr0iLCJmb3JtdWxhIjoiV09SS19RVFlfQ09OQypQUklDRV9XT1JLX0NPTkMiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiQ09TVF9XT1JLX0lOU1VMIiwibmFtZSI6ItCc0L7QvdGC0LDQtiDRg9GC0LXQv9C70LjRgtC10LvRjywg4oK9IiwiZm9ybXVsYSI6Ik9CVVRFUEwqUFJJQ0VfV09SS19JTlNVTCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJDT1NUX1dPUktfVE9UQUwiLCJuYW1lIjoi0JjRgtC+0LPQviDRgNCw0LHQvtGC0LAsIOKCvSIsImZvcm11bGEiOiJDT1NUX1dPUktfQ09OQytDT1NUX1dPUktfSU5TVUwiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiQ09TVF9UT1RBTCIsIm5hbWUiOiLQktCh0JXQk9CeLCDigr0iLCJmb3JtdWxhIjoiQ09TVF9NQVRfVE9UQUwrQ09TVF9XT1JLX1RPVEFMIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiUmVzdWx0IiwidGl0bGUiOiLQoNC10LfRg9C70YzRgtCw0YLRiyIsImRhdGEiOltbItCf0L7QutCw0LfQsNGC0LXQu9GMIiwi0JfQvdCw0YfQtdC90LjQtSJdLFsi0J/QtdGA0LjQvNC10YLRgCwg0Lwu0L8uIiwiUEVSSU1fTSJdLFsi0J/Qu9C+0YnQsNC00Ywg0L/Qu9C40YLRiywg0LzCsiIsIkFSRUFfTTIiXSxbItCe0LHRitGR0Lwg0LHQtdGC0L7QvdCwLCDQvMKzIiwiVk9MX00zIl0sWyLQktC10YEg0L/Qu9C40YLRiywg0YIiLCJXRUlHSFRfVCJdLFsi0J3QsNCz0YDRg9C30LrQsCwg0LrQsy/RgdC8wrIiLCJMT0FEX0tHX0NNMiJdLFsi0JHQvtC60L7QstCw0Y8g0L/QvtCy0LXRgNGF0L3QvtGB0YLRjCwg0LzCsiIsIlNJREVfQVJFQV9NMiJdLFsi0JDRgNC80LDRgtGD0YDQsCDQvtGB0L3QvtCy0L3QsNGPLCDQvC7Qvy4iLCJSRUJBUl9NQUlOX00iXSxbItCQ0YDQvNCw0YLRg9GA0LAg0J8t0Y3Qu9C10LzQtdC90YLRiywg0Lwu0L8uIiwiUFVfVE9UQUxfTSJdLFsi0J7Qv9Cw0LvRg9Cx0LrQsCAo0L/Qu9C+0YnQsNC00YwpLCDQvMKyIiwiRk9STVdPUktfTTIiXSxbItCe0L/QsNC70YPQsdC60LAgKNC70LXRgSksINC8wrMiLCJGT1JNV09SS19NMyJdLFsi0KPRgtC10L/Qu9C40YLQtdC70YwsINC8wrIiLCJJTlNVTF9NMiJdLFsi0JjRgtC+0LPQviDQvNCw0YLQtdGA0LjQsNC70YssIOKCvSIsIkNPU1RfTUFUX1RPVEFMIl0sWyLQmNGC0L7Qs9C+INGA0LDQsdC+0YLQsCwg4oK9IiwiQ09TVF9XT1JLX1RPVEFMIl0sWyLQktCh0JXQk9CeLCDigr0iLCJDT1NUX1RPVEFMIl1dfSx7InR5cGUiOiJSZXN1bHQiLCJrZXkiOiIiLCJuYW1lIjoiIiwiZGVmYXVsdCI6MCwidGl0bGUiOiLQn9GA0L7QvNC10LbRg9GC0L7Rh9C90YvQtSDRgNC10LfRg9C70YzRgtCw0YLRiyIsImRhdGEiOltbItCU0LvQuNC90LAiLCJMRU5fTSIsItC8Iiwi0J/QtdGA0LjQvNC10YLRgCIsIlBFUklNX00iLCLQvCJdLFsi0KjQuNGA0LjQvdCwIiwiV0lEX00iLCLQvCIsItCf0LvQvtGJ0LDQtNGMIiwiQVJFQV9NMiIsItC8MiJdLFsi0KLQvtC70YnQuNC90LAiLCJUSEtfTU0iLCLQvNC8Iiwi0JLQtdGBIiwiV0VJR0hUX1QiLCLRgtC+0L3QvSJdXX0seyJ0eXBlIjoiSGVhZGVyIiwia2V5IjoiIiwibmFtZSI6IiIsImRlZmF1bHQiOjAsInRleHQiOiLQoNCw0YHRh9C10YIg0LDRgNC80LjRgNC+0LLQsNC90LjRjyDQv9C70LjRgtGLIiwiYmdDb2xvciI6IiMwMDgwMDAiLCJ0ZXh0Q29sb3IiOiIjZmZmIn0seyJ0eXBlIjoiSW1hZ2UiLCJrZXkiOiIiLCJuYW1lIjoi0KTRg9C90LTQsNC80LXQvdGC0L3QsNGPINC/0LvQuNGC0LAiLCJkZWZhdWx0IjowLCJzcmMiOiJodHRwczovL2lucy5iZXN0bm92ZWxzLnJ1L2FwaS9nZXRGaWxlP25hbWU9NzllZmU2MjktZjhlYS00ZmE0LTlkOTEtYTBiNzJjNzEwMjA4In0seyJ0eXBlIjoiSW1hZ2UiLCJrZXkiOiIiLCJuYW1lIjoi0J8t0L7QsdGA0LDQt9C90YvQtSIsImRlZmF1bHQiOjAsInNyYyI6Imh0dHBzOi8vaW5zLmJlc3Rub3ZlbHMucnUvYXBpL2dldEZpbGU/bmFtZT02ZGM3ODNlNy0zOTNjLTQzZDgtODIxMC1kOTU4ZWQxYzNhNDAifSx7InR5cGUiOiJSZXN1bHQiLCJrZXkiOiIiLCJuYW1lIjoiIiwiZGVmYXVsdCI6MCwiZGF0YSI6W1si0J3QsNC40LzQtdC90L7QstCw0L3QuNC1Iiwi0JzQsNGC0LXRgNC40LDQuyIsItCU0LvQuNC90LAsINC8LtC/LiIsItCS0LXRgSwg0LrQsyIsItCf0YDQvtGH0LXQtSJdLFsi0J7RgdC90L7QstC90LDRjyDQsNGA0LzQsNGC0YPRgNCwIiwiUkVCQVJfRElBX01NIiwiUkVCQVJfTUFJTl9NIiwiUkVCQVJfTUFJTl9LRyIsIiJdXSwidGl0bGUiOiLQntGB0L3QvtCy0L3QsNGPINCw0YDQvNCw0YLRg9GA0LAifSx7InR5cGUiOiJSZXN1bHQiLCJrZXkiOiIiLCJuYW1lIjoiIiwiZGVmYXVsdCI6MCwidGl0bGUiOiLQkNGA0LzQsNGC0YPRgNCwINC90LAg0J8tINC+0LHRgNCw0LfQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyIsImRhdGEiOltbItCd0LDQuNC80LXQvdC+0LLQsNC90LjQtSIsItCc0LDRgtC10YDQuNCw0LsiLCLQlNC70LjQvdCwLCDQvC7Qvy4iLCLQktC10YEsINC60LMiLCLQn9GA0L7Rh9C10LUiXSxbItCfLdC+0LHRgNCw0LfQvdGL0LUg0Y3Qu9C10LzQtdC90YLRiyIsIlJFQkFSX0RJQV9NTSIsIlBVX1RPVEFMX00iLCJQVV9UT1RBTF9LRyIsIiJdXX0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlRPVE9BTF9BUk1fTEVOIiwibmFtZSI6ItCS0YHQtdCz0L4g0LDRgNC80LDRgtGD0YDRiyIsImRlZmF1bHQiOjAsImZvcm11bGEiOiJSRUJBUl9NQUlOX00rUFVfVE9UQUxfTSJ9LHsidHlwZSI6IlJlc3VsdCIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0aXRsZSI6ItCS0YHQtdCz0L4g0LDRgNC80LDRgtGD0YDRiyIsImRhdGEiOltbItCd0LDQuNC80LXQvdC+0LLQsNC90LjQtSIsItCc0LDRgtC10YDQuNCw0LsiLCLQlNC70LjQvdCwLCDQvC7Qvy4iLCLQktC10YEsINC60LMiXSxbItCS0KHQldCT0J4iLCJSRUJBUl9ESUFfTU0iLCJUT1RPQUxfQVJNX0xFTiIsIlRPVEFMX0FSTV9XRUlUSCJdXX0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlRPVEFMX0FSTV9XRUlUSCIsIm5hbWUiOiLQktGB0LXQs9C+INCw0YDQvNCw0YLRg9GA0YssINC60LMiLCJkZWZhdWx0IjowLCJmb3JtdWxhIjoiUkVCQVJfTUFJTl9LRytQVV9UT1RBTF9LRyJ9LHsidHlwZSI6IkhlYWRlciIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0ZXh0Ijoi0KDQsNGB0YfQtdGCINC+0L/QsNC70YPQsdC60LgiLCJiZ0NvbG9yIjoiIzAwODAwMCIsInRleHRDb2xvciI6IiNmZmYifSx7InR5cGUiOiJSZXN1bHQiLCJrZXkiOiIiLCJuYW1lIjoiIiwiZGVmYXVsdCI6MCwiZGF0YSI6W1si0J3QsNC40LzQtdC90L7QstCw0L3QuNC1Iiwi0KLQvtC70YnQuNC90LAsINC80LwiLCLQmtC+0Lst0LLQviIsItCV0LQuINC40LfQvC4iXSxbItCe0LHRgNC10LfQvdCw0Y8g0LTQvtGB0LrQsCIsIndvb2RfdGlua25lc3MiLCJGT1JNV09SS19NMyIsItC8MyJdXSwidGl0bGUiOiLQndC10L7QsdGF0L7QtNC40LzQvtC1INC60L7Quy3QstC+INC+0LHRgNC10LfQvdC+0Lkg0LTQvtGB0LrQuCDQtNC70Y8g0L7Qv9Cw0LvRg9Cx0LrQuCJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJ3b29kX3RpbmtuZXNzIiwibmFtZSI6ItCi0L7Qu9GJ0LjQvdCwINC+0L/QsNC70YPQsdC60LgiLCJkZWZhdWx0IjowLCJmb3JtdWxhIjoiQk9BUkRfVEhLX00qMTAwMCJ9LHsidHlwZSI6IlJlc3VsdCIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0aXRsZSI6ItCd0LXQvtCx0YXQvtC00LjQvNC+0LUg0LrQvtC7LdCy0L4g0LvQsNC80LjQvdC40YDQvtCy0LDQvdC90L7QuSDRhNCw0L3QtdGA0YsiLCJkYXRhIjpbWyLQndCw0LjQvNC10L3QvtCy0LDQvdC40LUiLCLQmtC+0Lst0LLQviIsItCV0LQuINC40LfQvC4iXSxbItCb0LDQvNC40L3QuNGA0L7QstCw0L3QvdCw0Y8g0YTQsNC90LXRgNCwIiwiRk9STVdPUktfTTIiLCLQvDIiXV19LHsidHlwZSI6IkhlYWRlciIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0ZXh0Ijoi0KDQsNGB0YfQtdGCINGB0YLQvtC40LzQvtGB0YLQuCIsImJnQ29sb3IiOiIjMDA4MDAwIiwidGV4dENvbG9yIjoiI2ZmZiJ9LHsidHlwZSI6IkhlYWRlciIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0ZXh0Ijoi0JzQsNGC0LXRgNC40LDQu9GLIiwiYmdDb2xvciI6IiM4MDgwODAiLCJ0ZXh0Q29sb3IiOiIjZmZmIn0seyJ0eXBlIjoiSGVhZGVyIiwia2V5IjoiIiwibmFtZSI6IiIsImRlZmF1bHQiOjAsInRleHQiOiLQoNCw0LHQvtGC0LAiLCJiZ0NvbG9yIjoiIzgwODA4MCIsInRleHRDb2xvciI6IiNmZmYifSx7InR5cGUiOiJIZWFkZXIiLCJrZXkiOiIiLCJuYW1lIjoiIiwiZGVmYXVsdCI6MCwidGV4dCI6ItCY0KLQntCT0J7QktCQ0K8g0KHQnNCV0KLQkCIsImJnQ29sb3IiOiIjMDA4MDAwIiwidGV4dENvbG9yIjoiI2ZmZiJ9LHsidHlwZSI6IkhlYWRlciIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0ZXh0Ijoi0KDQsNGB0YfQtdGCINGD0YLQtdC/0LvQuNGC0LXQu9GPINC90LAg0LHQvtC60L7QstGD0Y4g0L/QvtCy0LXRgNGF0L3QvtGB0YLRjCDQv9C70LjRgtGLIiwiYmdDb2xvciI6IiMwMDgwMDAiLCJ0ZXh0Q29sb3IiOiIjZmZmIn0seyJ0eXBlIjoiUmVzdWx0Iiwia2V5IjoiIiwibmFtZSI6IiIsImRlZmF1bHQiOjAsImRhdGEiOltbItCd0LDQuNC80LXQvdC+0LLQsNC90LjQtSIsItCi0L7Qu9GJ0LjQvdCwLCDQvNC8Iiwi0J/Qu9C+0YnQsNC00YwsINC8MiIsItCe0LHRitC10LwsINC8MyJdLFsi0KPRgtC10L/Qu9C40YLQtdC70YwiLCJUSElOS0VfVVQiLCJJTlNVTF9NMiIsIklOU1VMX00zIl1dLCJ0aXRsZSI6ItCg0LDRgdGH0LXRgiDRg9GC0LXQv9C70LjRgtC10LvRjyJ9LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJUSElOS0VfVVQiLCJuYW1lIjoi0KLQvtC70YnQuNC90LAg0YPRgtC10L/Qu9C40YLQtdC70Y8iLCJkZWZhdWx0IjowLCJmb3JtdWxhIjoiSU5TVUxfVEhLX00qMTAwMCIsInZhbHVlTW9kZSI6Im51bWJlciJ9LHsidHlwZSI6IlJlc3VsdCIsImtleSI6IiIsIm5hbWUiOiIiLCJkZWZhdWx0IjowLCJ0aXRsZSI6ItCh0KLQntCY0JzQntCh0KLQrCDQnNCQ0KLQldCg0JjQkNCb0J7QkiIsImRhdGEiOltbIiIsIiIsItCc0JDQotCV0KDQmNCQ0JvQqyIsIiIsIiJdLFsi0J3QsNC40LzQtdC90L7QstCw0L3QuNC1Iiwi0LrQvtC7LdCy0L4iLCLQtdC0LiDQuNC30LwuIiwi0YbQtdC90LAiLCLRgdGC0L7QuNC80L7RgdGC0YwiXSxbIiIsIiIsIiIsIiIsIiJdLFsiUkVCQVJfRElBX01NIiwiVE9UQUxfQVJNX1dFSVRIX1QiLCLRgtC+0L3QvSIsIlBSSUNFX1JFQkFSIiwiQ09TVF9SRUJBUiJdLFsi0JHQtdGC0L7QvSIsIlZPTF9NMyIsItC8MyIsIlBSSUNFX0NPTkNSRVRFX00zIiwiQ09TVF9DT05DUkVURSJdLFsi0J7Qv9Cw0LvRg9Cx0LrQsCIsIkZPUk1XT1JLX1FUWV9GT1JfUFJJQ0UiLCLQvDIiLCJQUklDRV9GT1JNV09SSyIsIkNPU1RfRk9STVdPUksiXSxbItCj0YLQtdC/0LvQuNGC0LXQu9GMIiwiSU5TVUxfTTIiLCLQvDIiLCJQUklDRV9JTlNVTF9NMiIsIkNPU1RfSU5TVUwiXSxbIiIsIiIsIiIsIiIsIiJdLFsi0JjQotCe0JPQniDQndCQINCc0JDQotCV0KDQmNCQ0JvQqyIsIiIsIiIsIiIsIlRPVEFMX01BVEVSXzEiXV19LHsidHlwZSI6IkNhbGMiLCJrZXkiOiJUT1RBTF9BUk1fV0VJVEhfVCIsIm5hbWUiOiLQktGB0LXQs9C+INCw0YDQvNCw0YLRg9GA0YsiLCJkZWZhdWx0IjowLCJmb3JtdWxhIjoiVE9UQUxfQVJNX1dFSVRILzEwMDAiLCJ2YWx1ZU1vZGUiOiJudW1iZXIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiVE9UQUxfTUFURVJfMSIsIm5hbWUiOiLQmNCi0J7Qk9CeINCc0JDQotCV0KDQmNCQ0JvQqyIsImRlZmF1bHQiOjAsImZvcm11bGEiOiJDT1NUX1JFQkFSK0NPU1RfQ09OQ1JFVEUrQ09TVF9GT1JNV09SSytDT1NUX0lOU1VMIiwidmFsdWVNb2RlIjoibnVtYmVyIn0seyJ0eXBlIjoiUmVzdWx0Iiwia2V5IjoiIiwibmFtZSI6IiIsImRlZmF1bHQiOjAsImRhdGEiOltbIiIsIiIsItCg0JDQkdCe0KLQkCIsIiIsIiJdLFsi0J3QsNC40LzQtdC90L7QstCw0L3QuNC1Iiwi0LrQvtC7LdCy0L4iLCLQtdC0LtC40LfQvC4iLCLRhtC10L3QsCIsItGB0YLQvtC40LzQvtGB0YLRjCJdLFsi0JzQvtC90YLQsNC2INCw0YDQvNCw0YLRg9GA0Ysg0Lgg0LHQtdGC0L7QvdC40YDQvtCy0LDQvdC40LUiLCJXT1JLX1FUWV9DT05DIiwiRURfSVpNIiwiUFJJQ0VfV09SS19DT05DIiwiQ09TVF9XT1JLX0NPTkMiXSxbItCc0L7QvdGC0LDQtiDRg9GC0LXQv9C70LjRgtC10LvRjyIsIk9CVVRFUEwiLCJFRElaTVVURVAiLCJQUklDRV9XT1JLX0lOU1VMIiwiQ09TVF9XT1JLX0lOU1VMIl0sWyIiLCIiLCIiLCIiLCIiXSxbItCY0KLQntCT0J4g0J3QkCDQoNCQ0JHQntCi0KsiLCIiLCIiLCIiLCJDT1NUX1dPUktfVE9UQUwiXSxbIiIsIiIsIiIsIiIsIiJdLFsi0JLQodCV0JPQniIsIiIsIiIsIiIsIkNPU1RfVE9UQUwiXV0sInRpdGxlIjoi0KHQotCe0JjQnNCe0KHQotCsINCg0JDQkdCe0KIifSx7InR5cGUiOiJDYWxjIiwia2V5IjoiRURfSVpNIiwibmFtZSI6ItCV0LTQuNC90LjRhtCwINC+0LHRitC10LzQsCDRgNCw0LHQvtGCICIsImRlZmF1bHQiOjAsImZvcm11bGEiOiJXT1JLX1BSSUNFX01PREU9PT0xID8gXCLQvDJcIiA6IFdPUktfUFJJQ0VfTU9ERT09PTIgPyBcItC8M1wiIDogXCJcIiJ9LHsidHlwZSI6IkltYWdlIiwia2V5IjoiIiwibmFtZSI6ItC70L7Qs9C+0YLQuNC/IiwiZGVmYXVsdCI6MCwic3JjIjoiaHR0cHM6Ly9pbnMuYmVzdG5vdmVscy5ydS9hcGkvZ2V0RmlsZT9uYW1lPTY3NDBjYjc4LWVkNTEtNGU2ZS05YTFiLTNjNjk1NTAzOGE1NyJ9LHsidHlwZSI6IlJhZGlvIiwia2V5IjoiUEFSQU1VVEVQIiwibmFtZSI6ItCV0LTQuNC90LjRhtCwINGG0LXQvdGLINC80L7QvdGC0LDQttCwINGD0YLQtdC/0LvQuNGC0LXQu9GPIiwiZGVmYXVsdCI6IjEiLCJ2YWx1ZU1vZGUiOiJyYXciLCJmb3JtdWxhIjoiIiwidmFyaWFudHMiOlt7Im5hbWUiOiLQl9CwINC8LtC/LiIsInZhbHVlIjoxLCJpbWFnZSI6IiJ9LHsibmFtZSI6ItCX0LAg0LwyIiwidmFsdWUiOjIsImltYWdlIjoiIn1dLCJjb2xzIjoyfSx7InR5cGUiOiJDYWxjIiwia2V5IjoiT0JVVEVQTCIsIm5hbWUiOiLQntCx0YrQtdC8INGD0YLQtdC/0LvQtdC90LjRjyIsImRlZmF1bHQiOjAsInZhbHVlTW9kZSI6Im51bWJlciIsImZvcm11bGEiOiJQQVJBTVVURVA9PT0xID8gKFBFUklNX018fDApIDogUEFSQU1VVEVQPT09MiA/IChJTlNVTF9NMnx8MCkgOiAwIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IkVESVpNVVRFUCIsIm5hbWUiOiLQldC00LjQvdC40YbQsCDQuNC30LzQtdGA0LXQvdC40Y8g0YPRgtC10L/Qu9C10L3QuNGPIiwiZGVmYXVsdCI6MCwidmFsdWVNb2RlIjoicmF3IiwiZm9ybXVsYSI6IlBBUkFNVVRFUD09PTE/XCLQvC7Qvy5cIjpQQVJBTVVURVA9PT0yP1wi0LzCslwiOlwiXCIifSx7InR5cGUiOiJTZWxlY3QiLCJrZXkiOiJSRUJBUl9QSUVDRV9MRU5fTSIsIm5hbWUiOiLQlNC70LjQvdCwIDEt0LPQviDQv9GA0YPRgtC60LAsINC8IiwiZGVmYXVsdCI6IjExLjc1IiwidmFsdWVNb2RlIjoibnVtYmVyIiwidmFyaWFudHMiOlt7Im5hbWUiOiI1Ljg3NSIsInZhbHVlIjo1Ljg3NX0seyJuYW1lIjoiMTEuNzUiLCJ2YWx1ZSI6MTEuNzV9XX0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlJFQkFSX0xBUF9NIiwibmFtZSI6ItCa0YPRgdC60LgiLCJkZWZhdWx0IjowLCJ2YWx1ZU1vZGUiOiJudW1iZXIiLCJmb3JtdWxhIjoiKDMyKihNQUlOX0R8fDApKS8xMDAwIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlJFQkFSX1NFR19MIiwibmFtZSI6ItCf0L7Qu9C1OiDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdC10LPQvNC10L3RgtC+0LIg0YHRgtC10YDQttC90Y8g0L/QviDQtNC70LjQvdC1IiwiZGVmYXVsdCI6MCwidmFsdWVNb2RlIjoibnVtYmVyIiwiZm9ybXVsYSI6IihMRU5fTXx8MCk8PSgoUkVCQVJfUElFQ0VfTEVOX018fDApKT8xOigoKFJFQkFSX1BJRUNFX0xFTl9NfHwwKS0oUkVCQVJfTEFQX018fDApKT4wPyhNYXRoLmNlaWwoKChMRU5fTXx8MCktKFJFQkFSX1BJRUNFX0xFTl9NfHwwKSkvKChSRUJBUl9QSUVDRV9MRU5fTXx8MCktKFJFQkFSX0xBUF9NfHwwKSkpKzEpOjEpIn0seyJ0eXBlIjoiQ2FsYyIsImtleSI6IlJFQkFSX1NFR19XIiwibmFtZSI6ItC60L7Qu9C40YfQtdGB0YLQstC+INGB0LXQs9C80LXQvdGC0L7QsiDRgdGC0LXRgNC20L3RjyDQv9C+INGI0LjRgNC40L3QtSIsImRlZmF1bHQiOjAsInZhbHVlTW9kZSI6Im51bWJlciIsImZvcm11bGEiOiJXSURfTTw9UkVCQVJfUElFQ0VfTEVOX00/MTpNYXRoLmNlaWwoKFdJRF9NLVJFQkFSX1BJRUNFX0xFTl9NKS8oUkVCQVJfUElFQ0VfTEVOX00tUkVCQVJfTEFQX00pKSsxIn1dLCJsYXlvdXQiOlt7ImNvbHMiOlt7InNwYW4iOjIsIml0ZW1zIjpbMF19LHsic3BhbiI6MSwiaXRlbXMiOls4MF19LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls1N119LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjEsIml0ZW1zIjpbMV19LHsic3BhbiI6MSwiaXRlbXMiOlsyXX0seyJzcGFuIjoxLCJpdGVtcyI6WzNdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls1NV19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjMsIml0ZW1zIjpbNTZdfSx7InNwYW4iOjAsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XX0seyJjb2xzIjpbeyJzcGFuIjoxLCJpdGVtcyI6WzcsNiw1LDg0XX0seyJzcGFuIjoyLCJpdGVtcyI6WzU4LDRdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjMsIml0ZW1zIjpbNTldfSx7InNwYW4iOjEsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XSwic2hvd01vZGUiOiJleHByIiwic2hvd0V4cHIiOiJQVV9ORUVERUQ9PT0xIn0seyJjb2xzIjpbeyJzcGFuIjozLCJpdGVtcyI6WzYwXX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV0sInNob3dNb2RlIjoiZXhwciIsInNob3dFeHByIjoiUFVfTkVFREVEPT09MSJ9LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls2Ml19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dLCJzaG93TW9kZSI6ImFsd2F5cyIsInNob3dFeHByIjoiIn0seyJjb2xzIjpbeyJzcGFuIjozLCJpdGVtcyI6WzY0XX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls4XX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls5XX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV0sInNob3dNb2RlIjoiZXhwciIsInNob3dFeHByIjoiRk9STVdPUktfVFlQRT09PTEifSx7ImNvbHMiOlt7InNwYW4iOjMsIml0ZW1zIjpbNjVdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XSwic2hvd01vZGUiOiJleHByIiwic2hvd0V4cHIiOiJGT1JNV09SS19UWVBFPT09MSJ9LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls2N119LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dLCJzaG93TW9kZSI6ImV4cHIiLCJzaG93RXhwciI6IkZPUk1XT1JLX1RZUEU9PT0yIn0seyJjb2xzIjpbeyJzcGFuIjozLCJpdGVtcyI6WzcyXX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOlsxMF19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjMsIml0ZW1zIjpbNzNdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XX0seyJjb2xzIjpbeyJzcGFuIjozLCJpdGVtcyI6WzY4XX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls2OV19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjIsIml0ZW1zIjpbMTNdfSx7InNwYW4iOjEsIml0ZW1zIjpbMTRdfSx7InNwYW4iOjAsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjEsIml0ZW1zIjpbMTJdfSx7InNwYW4iOjEsIml0ZW1zIjpbMTVdfSx7InNwYW4iOjEsIml0ZW1zIjpbMTZdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls3MF19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjIsIml0ZW1zIjpbMTgsMTldfSx7InNwYW4iOjIsIml0ZW1zIjpbMTcsODFdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XX0seyJjb2xzIjpbeyJzcGFuIjozLCJpdGVtcyI6WzcxXX0seyJzcGFuIjoxLCJpdGVtcyI6W119LHsic3BhbiI6MSwiaXRlbXMiOltdfV19LHsiY29scyI6W3sic3BhbiI6MywiaXRlbXMiOls3NV19LHsic3BhbiI6MSwiaXRlbXMiOltdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX1dfSx7ImNvbHMiOlt7InNwYW4iOjMsIml0ZW1zIjpbNzhdfSx7InNwYW4iOjEsIml0ZW1zIjpbXX0seyJzcGFuIjoxLCJpdGVtcyI6W119XX1dfQ==";
var DEV = false;
var providers={"QueryParams":{render:(param)=>{
let { item , state } = param;
if (item.type !== "QueryParams") return null;
try {
var _window_location, _window_history;
if (!(window === null || window === void 0 ? void 0 : (_window_location = window.location) === null || _window_location === void 0 ? void 0 : _window_location.href)) return null;
if (!(window === null || window === void 0 ? void 0 : (_window_history = window.history) === null || _window_history === void 0 ? void 0 : _window_history.replaceState)) return null;
const url = new URL(window.location.href);
let changed = false;
(item.data || []).forEach((row)=>{
var _row_;
const paramKey = String((_row_ = row === null || row === void 0 ? void 0 : row[0]) !== null && _row_ !== void 0 ? _row_ : "").trim();
if (!paramKey) return;
const rawValue = row === null || row === void 0 ? void 0 : row[1];
let nextValue = "";
if (typeof rawValue === "string" && Object.prototype.hasOwnProperty.call(state || {}, rawValue)) {
nextValue = state[rawValue];
} else {
nextValue = rawValue;
}
nextValue = nextValue == null ? "" : String(nextValue);
if (url.searchParams.get(paramKey) !== nextValue) {
url.searchParams.set(paramKey, nextValue);
changed = true;
}
});
if (changed) {
window.history.replaceState(null, "", url.toString());
}
} catch (e) {
console.log("[CALC] QueryParams error", e);
}
return null;
}},"Header":{render:(param)=>{
let { item , h } = param;
if (item.type !== "Header") return null;
const style = {};
if (item.bgColor) {
style.background = item.bgColor;
style.padding = ".5rem .6rem";
style.borderRadius = ".6rem";
}
if (item.textColor) {
style.color = item.textColor;
}
return h("div", {
class: "header",
style
}, item.text || "");
}},"SaveResult":{render:(param)=>{
let { item , h } = param;
if (item.type !== "SaveResult") return null;
const style = {};
if (item.bgColor) style.background = item.bgColor;
if (item.textColor) style.color = item.textColor;
return h("button", {
class: "save-btn",
style,
onMouseEnter: (e)=>{
if (item.hoverBg) e.currentTarget.style.background = item.hoverBg;
},
onMouseLeave: (e)=>{
if (item.bgColor) e.currentTarget.style.background = item.bgColor;
else e.currentTarget.style.background = "";
},
onClick: handleClick
}, item.text || "Скачать");
async function handleClick() {
const root = document.querySelector(".cbs-calc-runtime");
if (!root) return;
try {
const html2canvas = await loadHtml2Canvas();
const calcCanvas = await html2canvas(root, {
backgroundColor: "#ffffff",
useCORS: true
});
const topImg = await loadImage(item.topImage);
const bottomImg = await loadImage(item.bottomImage);
const width = calcCanvas.width;
const topH = topImg ? Math.round(topImg.height * (width / topImg.width)) : 0;
const bottomH = bottomImg ? Math.round(bottomImg.height * (width / bottomImg.width)) : 0;
const height = topH + calcCanvas.height + bottomH;
const finalCanvas = document.createElement("canvas");
finalCanvas.width = width;
finalCanvas.height = height;
const ctx = finalCanvas.getContext("2d");
let y = 0;
if (topImg) {
ctx.drawImage(topImg, 0, y, width, topH);
y += topH;
}
ctx.drawImage(calcCanvas, 0, y);
y += calcCanvas.height;
if (bottomImg) {
ctx.drawImage(bottomImg, 0, y, width, bottomH);
}
const link = document.createElement("a");
link.download = "result.png";
link.href = finalCanvas.toDataURL("image/png");
link.click();
} catch (e) {
console.error(e);
alert("Ошибка сохранения");
}
}
function loadImage(src) {
return new Promise((res)=>{
if (!src) return res(null);
const img = new Image();
img.crossOrigin = "anonymous";
img.onload = ()=>res(img);
img.onerror = ()=>res(null);
img.src = src;
});
}
function loadHtml2Canvas() {
if (window.html2canvas) return Promise.resolve(window.html2canvas);
return new Promise((resolve, reject)=>{
const s = document.createElement("script");
s.src = "https://unpkg.com/html2canvas@1.4.1/dist/html2canvas.min.js";
s.onload = ()=>resolve(window.html2canvas);
s.onerror = reject;
document.head.appendChild(s);
});
}
}},"Image":{render:(param)=>{
let { item , h } = param;
if (item.type !== "Image") return null;
if (!item.src) return null;
let aspectClass = "";
if (item.aspect === "wide") aspectClass = "image-wide";
else if (item.aspect === "square") aspectClass = "image-square";
else aspectClass = "image-free";
const imgClass = item.aspect ? "image" : "image";
return h("div", {
class: "image-wrap " + aspectClass
}, h("img", {
class: imgClass,
src: item.src
}));
}},"Text":{render:(param)=>{
let { item , h } = param;
if (item.type !== "Text") return null;
if (!item.text) return null;
const parts = String(item.text).split(/\n+/);
return h("div", {
class: "text-block"
}, parts.map((line)=>h("p", {}, line)));
}},"DataSelect":{render:(param)=>{
let { item , state , set , get , h } = param;
if (item.type !== "DataSelect") return null;
let data = {};
try {
data = JSON.parse(item.data || "{}");
} catch (e) {}
const keys = Object.keys(data || {});
const def = item.default || keys[0] || "";
const value = get(item.key, def);
const row = data[value];
if (row && typeof row === "object") {
Object.entries(row).forEach((param)=>{
let [k, v] = param;
set(k, v);
});
}
return h("div", {
class: "field"
}, item.name ? h("div", {
class: "field-label"
}, item.name) : null, h("select", {
value: value || "",
onChange: (e)=>set(item.key, e.target.value)
}, keys.map((k)=>h("option", {
value: k
}, k))));
}},"Input":{render:(param)=>{
let { item , state , set , get , h } = param;
if (item.type !== "Input") return null;
var _item_default;
const value = get(item.key, (_item_default = item.default) !== null && _item_default !== void 0 ? _item_default : 0);
return h("div", {
class: "field"
}, item.name ? h("div", {
class: "field-label"
}, item.name) : null, h("input", {
value: value !== null && value !== void 0 ? value : "",
onInput: (e)=>set(item.key, e.target.value, item.valueMode)
}));
}},"Select":{render:(param)=>{
let { item , state , set , get , h } = param;
var _item_variants, _item_variants_;
if (item.type !== "Select") return null;
var _item_variants__value, _item_default;
const def = (_item_default = item.default) !== null && _item_default !== void 0 ? _item_default : (_item_variants__value = (_item_variants = item.variants) === null || _item_variants === void 0 ? void 0 : (_item_variants_ = _item_variants[0]) === null || _item_variants_ === void 0 ? void 0 : _item_variants_.value) !== null && _item_variants__value !== void 0 ? _item_variants__value : 0;
const value = get(item.key, def);
return h("div", {
class: "field"
}, item.name ? h("div", {
class: "field-label"
}, item.name) : null, h("select", {
value,
onChange: (e)=>set(item.key, e.target.value, item.valueMode)
}, (item.variants || []).map((v)=>h("option", {
value: v.value
}, v.name))));
}},"Radio":{render:(param)=>{
let { item , state , set , get , h } = param;
var _item_variants, _item_variants_;
if (item.type !== "Radio") return null;
var _item_variants__value, _item_default;
const def = (_item_default = item.default) !== null && _item_default !== void 0 ? _item_default : (_item_variants__value = (_item_variants = item.variants) === null || _item_variants === void 0 ? void 0 : (_item_variants_ = _item_variants[0]) === null || _item_variants_ === void 0 ? void 0 : _item_variants_.value) !== null && _item_variants__value !== void 0 ? _item_variants__value : 0;
const value = get(item.key, def);
return h("div", {}, item.name ? h("div", {
class: "field-label"
}, item.name) : null, h("div", {
class: "radio-group",
style: {
gridTemplateColumns: "repeat(" + (item.cols || 4) + ",1fr)"
}
}, (item.variants || []).map((v)=>{
const ratioClass = v.imageRatio === "wide" ? "radio-ratio-wide" : v.imageRatio === "square" ? "radio-ratio-square" : "";
return h("div", {
class: "radio-card" + (value === v.value ? " active" : ""),
onClick: ()=>set(item.key, v.value, item.valueMode)
}, v.image ? h("img", {
class: "radio-img " + ratioClass,
src: v.image
}) : null, h("div", {
class: "radio-card-label"
}, v.name));
})));
}},"Calc":{render:(param)=>{
let { item , calc , set } = param;
if (item.type !== "Calc") return null;
const v = calc(item.formula || "");
set(item.key, v, item.valueMode);
return null;
}},"Range":{render:(param)=>{
let { item , state , set , get , h } = param;
if (item.type !== "Range") return null;
var _item_min;
const min = Number((_item_min = item.min) !== null && _item_min !== void 0 ? _item_min : 0);
var _item_max;
const max = Number((_item_max = item.max) !== null && _item_max !== void 0 ? _item_max : 100);
var _item_step;
const step = Number((_item_step = item.step) !== null && _item_step !== void 0 ? _item_step : 1);
var _item_default;
const def = (_item_default = item.default) !== null && _item_default !== void 0 ? _item_default : min;
const stateValue = get(item.key, def);
const snapped = normalize(stateValue, min, max, step);
const inputValue = clampEdge(snapped, min, max, step);
return h("div", {
class: "field"
}, h("div", {
class: "range-head"
}, item.name ? h("div", {
class: "field-label"
}, item.name) : h("div", {}), h("div", {
class: "range-value"
}, inputValue)), h("input", {
type: "range",
class: "range-input",
min: min,
max: max,
step: "any",
value: inputValue,
onInput: (e)=>{
const raw = parseFloat(e.target.value) || 0;
const v = normalize(raw, min, max, step);
set(item.key, v);
}
}));
function normalize(v, min, max, step) {
if (v <= min) return min;
if (v >= max) return max;
const steps = Math.round((v - min) / step);
let snapped = min + steps * step;
return Number(snapped.toFixed(6));
}
function clampEdge(v, min, max, step) {
if (Math.abs(v - min) <= step) return min;
if (Math.abs(v - max) <= step) return max;
return v;
}
}},"Result":{render:(param)=>{
let { item , state , h } = param;
if (item.type !== "Result") return null;
const rows = [];
(item.data || []).forEach((row)=>{
const cols = (row || []).map((cell)=>{
const val = state[cell];
if (typeof val === "number" && isFinite(val)) {
const out = Number.isInteger(val) ? val : Number(val.toFixed(2));
return h("td", {}, out);
}
if (val !== undefined && val !== null) {
return h("td", {}, String(val));
}
return h("td", {}, cell);
});
rows.push(h("tr", {}, cols));
});
return h("div", {
class: "results-card"
}, item.title ? h("div", {
class: "header"
}, item.title) : null, h("table", {}, rows));
}}};
var EXEC_ORDER = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,56,57,58,64,68,69,70,71,72,80,81,84,20,21,22,23,24,25,26,27,31,66,74,79,83,85,35,34,30,28,42,49,86,87,36,38,40,29,50,32,37,39,41,47,82,33,61,45,51,43,63,46,52,44,76,48,77,53,54,55,59,60,62,65,67,73,75,78];
const ctx = await bootstrap();
if(!ctx) return;
startApp(ctx);
async function bootstrap(){
const ctx={
host:null,
assets:null,
mount:null,
schema:null,
dev:createDevAdapter()
};
if(!prepareHost()) return null;
await loadDeps();
ctx.schema=parseSchema();
if(!ctx.schema){
ctx.mount.textContent="Schema parse error";
return null;
}
if(DEV) initDevTools();
return ctx;
function prepareHost(){
const cs=document.currentScript;
const host=cs && cs.parentElement;
if(!host || host.__calc_initialized) return false;
host.__calc_initialized=true;
ctx.host=host;
function ensureZone(cls){
let el=host.querySelector("."+cls);
if(!el){
el=document.createElement("div");
el.className=cls;
host.appendChild(el);
}else if(cls==="calc-app"){
el.innerHTML="";
}
return el;
}
ctx.assets=ensureZone("calc-assets");
ctx.mount=ensureZone("calc-app");
return true;
}
async function loadDeps(){
const deps=[
{key:"preact",url:"https://unpkg.com/preact@10.19.3/dist/preact.umd.js"},
{key:"preactHooks",url:"https://unpkg.com/preact@10.19.3/hooks/dist/hooks.umd.js"}
];
async function load(src){
return new Promise(function(res,rej){
const s=document.createElement("script");
s.src=src;
s.onload=res;
s.onerror=rej;
ctx.assets.appendChild(s);
});
}
for(const d of deps){
if(!window[d.key]) await load(d.url);
}
}
function parseSchema(){
if(!RAW_SCHEMA) return null;
try{
return JSON.parse(decodeURIComponent(escape(atob(RAW_SCHEMA))));
}catch(e){
console.error("[CALC] schema parse error",e);
return null;
}
}
function createDevAdapter(){
return {
elementClick(){},
blockClick(){},
showFormulaErrors(){}
};
}
function initDevTools(){
function highlight(el){
if(!el) return;
const prev=ctx.host.querySelector(".calc-highlight");
if(prev) prev.classList.remove("calc-highlight");
el.classList.add("calc-highlight");
setTimeout(()=>el.classList.remove("calc-highlight"),1200);
}
function scrollTo(el){
const rect=el.getBoundingClientRect();
const y=window.scrollY || document.documentElement.scrollTop;
const top=rect.top+y-(window.innerHeight/2)+(rect.height/2);
window.scrollTo({top,behavior:"smooth"});
highlight(el);
}
function findScrollParent(el){
let node=el;
while(node){
if(node.scrollHeight>node.clientHeight) return node;
node=node.parentElement||node.parentNode;
}
return document.scrollingElement||document.documentElement;
}
ctx.dev.elementClick=i=>window.parent.postMessage({type:"calc-click",index:i},"*");
ctx.dev.blockClick=i=>window.parent.postMessage({type:"calc-block-click",index:i},"*");
ctx.dev.showFormulaErrors=function(errors){
const id="calc-dev-banner";
const old=ctx.assets.querySelector("#"+id);
if(old) old.remove();
if(!errors?.length) return;
const first=errors[0];
const bar=document.createElement("div");
bar.id=id;
bar.className="calc-dev-banner";
bar.textContent="⚠ Ошибка формулы ("+errors.length+") — нажмите чтобы перейти";
bar.onclick=()=>window.parent.postMessage({
type:"calc-dev-error",
index:first.index
},"*");
ctx.assets.appendChild(bar);
};
window.addEventListener("message",function(ev){
const msg=ev?.data||{};
if(msg.type==="calc-scroll"){
const el=ctx.host.querySelector('[data-el-index="'+msg.index+'"]');
if(el) scrollTo(el);
}
if(msg.type==="calc-block-scroll"){
const el=ctx.host.querySelector('[data-block-index="'+msg.index+'"]');
if(!el) return;
const box=findScrollParent(el);
if(box){
box.scrollTo({
top:el.offsetTop-box.clientHeight/2+el.clientHeight/2,
behavior:"smooth"
});
}
highlight(el);
}
});
}
}
function startApp(ctx){
const {h,render} = window.preact;
const {useState} = window.preactHooks;
const schema = ctx.schema;
function App(){
const [state,setState] = useState({});
function set(key,val,mode){
const v = mode==="number" ? normalizeNumber(val) : val;
setState(prev=>{
if(prev[key]===v) return prev;
const next={...prev};
next[key]=v;
return next;
});
}
function get(key,def){
if(state[key]===undefined && def!==undefined){
set(key,def,typeof def==="number"?"number":"raw");
return def;
}
return state[key];
}
const elements = runRenders();
return renderLayout(elements);
function runRenders(){
const out={};
const list=schema.elements||[];
for(const i of EXEC_ORDER){
const item=list[i];
const p=item && providers[item.type];
if(!p||!p.render) continue;
const vnode=p.render({
item,state,set,get,
num:k=>normalizeNumber(state[k]),
calc:e=>calcExpr(e,state),
h
});
if(vnode){
out[i]=h('div',{
class:'el-wrap',
'data-el-index':i,
onClickCapture: DEV ? ()=>ctx.dev.elementClick(i) : null
},vnode);
}
}
return out;
}
function renderLayout(elements){
return h('div',{class:'cbs-calc-runtime'},
(schema.layout||[]).map((b,i)=>renderBlock(b,i,elements))
);
}
function renderBlock(block,i,elements){
if(block.showMode==="expr" && block.showExpr){
try{ if(!calcExpr(block.showExpr,state)) return null; }
catch{ return null; }
}
const cols=(block.cols&&block.cols.length)?block.cols:[{span:1,items:[]}];
const grid='position:relative;grid-template-columns:repeat('+cols.length+',1fr);';
const hit = DEV ? h('div',{
class:'calc-dev-block-hit',
onClickCapture:e=>{
e.stopPropagation();
ctx.dev.blockClick(i);
}
}) : null;
const gridVNode = h('div',{class:'grid',style:grid},
cols.map((c,k)=>renderCol(c,k,elements))
);
if((block.viewMode||"full")==="dropdown"){
return h('details',{
key:i,class:'calc-block','data-block-index':i,style:'position:relative;'
},
hit,
h('summary',{class:'calc-dd-summary calc-dd-'+i},
block.dropdownTitle||"Подробнее"
),
gridVNode
);
}
return h('div',{
class:'grid calc-block',
key:i,
'data-block-index':i,
style:grid
},hit,cols.map((c,k)=>renderCol(c,k,elements)));
}
function renderCol(col,c,elements){
let span = Number(col?.span ?? 1);
if(span<1) span=1;
return h('div',{class:'col-span-'+span,key:c},
(col.items||[]).map(i=>elements[i]||null)
);
}
}
render(h(App),ctx.mount);
function calcExpr(expr,state){
try{
if(!expr) return 0;
if(expr[0]==='=') expr=expr.slice(1);
const k=Object.keys(state);
const v=k.map(x=>state[x]);
return Function(...k,"return "+expr)(...v);
}catch(e){
console.error("[CALC] formula error",expr,e);
return 0;
}
}
function normalizeNumber(v){
if(v==null) return 0;
if(typeof v==="number") return isFinite(v)?v:0;
const n=parseFloat(String(v).replace(",","."));
return isFinite(n)?n:0;
}
}
})();
Lorem
test
Показать калькулятор