<snapdata remixID="9440115"><project name="MQTT library" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes>ytlf chat. NOT A LIBRARY</notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAEa0lEQVR4Xu3az0vTcRzH8ffU+WM1TVGRQbYorCCS8OzFvJXSoVMQZJcQL0Hgv+Ap6KBIlwyCLioGq2Mn/wGJwILCZkgqYXPVNtO1+Hzju/w6FXTC6+DzC0Mc8/vSJw+/zmmoUCgUjIMCogIhAIrKM+sVACAQpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan3EAYkBaAIDS/IwDEAPSAgCU5mccgBiQFgCgND/jAMSAtAAApfkZByAGpAUAKM3POAAxIC0AQGl+xgGIAWkBAErzMw5ADEgLAFCan/ESgA9mv9nY23XrO3vCWusqKUSBsgusZvOWWPhlQ1ca7HF3c+B8AYDLmbydnvhsm0Pnyh7lBBTYWSA89sm+DMStLfL/whYAeCPx1e5eitqt8yctk8l4t4qKCguFQt6tUCjwlg4lDurr6z0nc3NzNj8/H3DX0tJivb293n1TH3/as/m0veqLFR8TAOiE+lc/d6JsNuuBcyd3Nx+g/9G8/+8b8jj2cF93ZWWl1dTUWDwet3Q6bblczjY2Nrwcvo2trS2bnp624eFh7/7txtz7+wJ0J6yurrZwOOyNcVDAL+BfmKqqqiwWi3nIurq6PHg7j56eHksmkwcHmM/nra6uzlPuhjgosL2Aj7C5udmmpqYCAAcHB218fNx7+KEBug+ORCJWW1sLQOztWsAhbGpqssnJySLAkZERGx0dtaWlpfIAuh+77goIQPTtV6CxsTEA0F203C+w/nHoK6CD5378uueBPAcE4V4FHMCZmRnr7Ows7zlgw5MFWxw4Yw3VFba2tmbRaLT4Mgz5KbBXAfcKiTsSiYStrKwEHpZKpay/v986Ojps/fcfa59I2vr9s8XHBH4LfjSXstmlnL283kZtChx5gZuvl607VmsPr57aHaC7171O8/Raq925GD3yT4ATHt8Cz9//sHtvVkv+yrbrPyNcfrFoH75vHt9afOVHXuBCY9je3W4vOS//DXPkqTnhQQr8Be5J68ZhnQI0AAAAAElFTkSuQmCC</thumbnail><stage name="Escenario" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="1" x="-230" y="165" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list id="9"><item><costume name="alonzo (vector)" center-x="47.5" center-y="61.5" image="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iOTVweCIgaGVpZ2h0PSIxMjNweCIgdmlld0JveD0iMCAwIDk1IDEyMyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgOTUgMTIzIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnIGlkPSJJRDAuODMyMzgyOTczNzQ5MTkwNiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwgMCwgMCwgMSwgMCwgMykiPg0KCTxwYXRoIGlkPSJSX0xlZyIgZmlsbD0iI0ZGQzkzRSIgc3Ryb2tlPSIjNjAzODEzIiBzdHJva2Utd2lkdGg9IjMiIGQ9Ik00Ny4zMTYsMTA0LjI1MWMwLTEuMjc2LDAuMzU4LTMuMTA5LDIuMzM4LTMuNTIzDQoJCWMyLjg1Ny0wLjU5OSw2LjEyNiwyLjI5Myw3LjAxNCwzLjE0NmMtMC4wNjUsMC4zMzgsMS4wNDcsNy4xNzMsMS4wNDcsNy43NjVjMCwyLjAwNC0wLjUzNSwyLjA4My0wLjc0MywyLjExNg0KCQljLTEuOTU2LDAuMjg0LTcuMTY5LTUuMTk3LTkuNTYyLTguMzg3QzQ3LjM3NiwxMDUuMTkzLDQ3LjMxNiwxMDQuODA5LDQ3LjMxNiwxMDQuMjUxTDQ3LjMxNiwxMDQuMjUxTDQ3LjMxNiwxMDQuMjUxeiIvPg0KCTxwYXRoIGlkPSJDZW50ZXJfTGVnIiBmaWxsPSIjRkZDOTNFIiBzdHJva2U9IiM2MDM4MTMiIHN0cm9rZS13aWR0aD0iNCIgZD0iTTM5LjM5NCwxMTMuODI3Yy0xLjQxOC0xLjUzOC0xLjYyMS01LjcwNy0xLjYyMS03LjQ4Mg0KCQljMC0wLjc1MiwwLjAzOS0xLjI1MywwLjA0MS0xLjI2OGwwLjAwMi0wLjAzOWMwLDAtMC4wMDQtMC4xNi0wLjAwNC0wLjIxOWMwLTMuMzQxLDMuMDc1LTQuNTAxLDMuNTk3LTQuNjc1DQoJCWMxLjc4MSwwLjAyMSw0Ljg1OCwwLjg2NCw1LjU5MywyLjEzNmMwLjA3NSwwLjEyOCwwLjE0NCwwLjI4OSwwLjE0NCwwLjQ5NWMwLDAuMTgxLTAuMDU0LDAuNC0wLjIwOCwwLjY2Ng0KCQljLTAuMDcxLDAuMTIxLTEuMzM1LDMuMTA5LTIuNDA1LDUuNGwtMC43NjUsMi4xMTljLTAuNTcyLDEuODUxLTEuNDczLDMuNzAzLTIuNDUyLDMuNzAzDQoJCUM0MC41NDIsMTE0LjY2NiwzOS45MTQsMTE0LjM5MiwzOS4zOTQsMTEzLjgyN0wzOS4zOTQsMTEzLjgyN0wzOS4zOTQsMTEzLjgyN3oiLz4NCgk8cGF0aCBpZD0iUl9Bcm0iIGZpbGw9IiNGRkM5M0UiIHN0cm9rZT0iIzYwMzgxMyIgc3Ryb2tlLXdpZHRoPSIzIiBkPSJNNzkuNTA1LDg5LjYxMWwtMS4zODMtMi40NA0KCQljLTEuNTE2LTIuNjM3LTMuMjY1LTUuMDUyLTQuODA3LTcuMTc3Yy0xLjk4My0yLjczOC0zLjcxLTUuNTcxLTQuMjgxLTcuNTcyYy0wLjIwNy0wLjcyMS0wLjEwNy0xLjQxLDAuMTg5LTEuNzkNCgkJYzAuMDI4LTAuMTAyLDAuMzI3LTAuMjY1LDAuNTM5LTAuMzA5YzIuNTQxLTAuNTUsMTMuMDYsNS40OTEsMTUuNjg1LDguNzE5YzMuODQ1LDQuNzI3LDUuMzgyLDExLjM1OCw0LjUyNCwxNC42OTkNCgkJYy0wLjM1MiwxLjM2NC0xLjEzOSwyLjMzMi0yLjI3OCwyLjc5M0M4NC43ODIsOTcuNzEsODIuODY3LDk1LjU4Niw3OS41MDUsODkuNjExTDc5LjUwNSw4OS42MTFMNzkuNTA1LDg5LjYxMXoiLz4NCgk8cGF0aCBpZD0iQm9keSIgZmlsbD0iI0ZGQzkzRSIgc3Ryb2tlPSIjNjAzODEzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZD0iDQoJCU0zOC4wOTcsNDMuMDA3YzAsMC0zLjExLTkuNjI5LTYuMDExLTEzLjU5OGMtMS43Mi0yLjc5LTQuMi02LjI2Ny03LjQ3Ny02LjA0OWMtNC4wNjcsMC4xMDYtNi4yODMsNC45ODQtMTAuMjk5LDYuNTQ1DQoJCWMtMi42MDIsMS4wMDMtOS40NjEsMi4zMTQtOC40MDYsMGMyLjgxMy01LjgxNCwxNC4wNC05LjA3OSwxNi44NDQtMTYuMzc5YzEuMjYzLTMuMzA1LTQuMjcyLTcuMjUyLTcuOTQxLTcuOTQyDQoJCWMtMi43NDUtMC41MDEtNC4wMzksNC4yMTctNi41NDUsNS42MTVjLTEuMTUxLDAuNjQzLTQuMzM5LDEuMzA1LTMuNzUzLDBDNi42MjksNi44MzYsOS4wNTIsMS4xNzIsMTMuODQ1LTAuNDk1DQoJCWMzLjYxNy0xLjI1NCw3LjU2MiwyLjQ3MywxMC4yOTksNS4xMTljOC40NjQsOC4xODUsMTUuNjE3LDE3LjkzOCwyMy4yNCwyNi42NWw0LjUxMSw1LjEzOWMwLDAsMy4yMjUsMy45NTYsNS42OTIsNi41NjYNCgkJYzAuMDQ0LDAuMDQ1LDIuMzc4LTAuMzE3LDMuOTg5LTEuNjU3YzEuMzE0LTEuMDk2LDEuMTQxLTIuMzIzLDEuNTU5LTQuOTAyYzAuMzg0LTIuMzcxLDAuODAyLTYuNjU5LDIuMDcyLTYuNjgxDQoJCWMxLjkxNi0wLjAyOSwzLjE3Niw3Ljg2OCwzLjY2NiwxMC43OTNsMC4yNzIsMS41NjVjMC42NDMsMy40NzksMy45OTksMTMuOTQsNC4xNDQsMTQuMzg0YzAuMDQ2LDAuMTA4LDAuMTIxLDAuMjQ5LDAuMTIxLDAuMjQ5DQoJCWwwLjAyNywwLjA1NmwwLjAzOCwwLjA0N2M1LjE4NSw2LjQyOSw5LjAzOCwxNC4yMjMsOS4wMzgsMjEuNTI0YzAsMTUuNDY0LTEzLjU1NSwyNi4zNDktMzEuNjk3LDI2LjM0OQ0KCQljLTMuMzY1LDAtNi42NTctMC40NzMtOS43ODMtMS4zOThsLTAuMTY4LTAuMDQ5YzAsMC00LjkwOC0wLjQxMi0xMS4xODYsNy44NGMtMS4yNiwxLjY1Ny0xLjE0NywzLjIwMS0yLjkyMiwyLjcyNg0KCQljLTAuNTkyLTAuMTU4LTEuMDI2LTAuNTkzLTEuMzgyLTEuMzgzYy0wLjg0OC0xLjg4NC0wLjIyMi02LjM0NywwLjgxNi05LjE5N2wwLjE2My0wLjQ0OGwtMC4zNzUtMC4yOTcNCgkJYy0wLjA5Mi0wLjA3My0xMC4yNzQtNy40OTMtMTEuMzAzLTE4LjEyNWMtMC44OTYtOS4yNjgsMy43ODUtMTQuNTQ1LDUuNzI4LTE3LjQ0NGwxLjExNy0xLjg1OA0KCQljMS40MDktMy40MjgtMS4yNDMtOC4xOTUtMy41ODMtMTIuNDAxYy0xLjM5Ny0yLjUxMS0zLjY1Mi02LjE3Ni0zLjE0My03LjAzOGMwLjU2NS0wLjk1NCwyLjU4NSwwLjA2Miw0LjYyNSwxLjAzNA0KCQljMS42NTQsMC43OTEsMy4yNDUsMS45MDgsNC4zNSwxLjE3MWMxLjE0OS0wLjc2NSwwLjM5Ni0yLjY4Ni0wLjY0OS01LjM0NmMtMC45ODItMi40OTgtMi44NDEtNi40NDMtMi4xMjctOC4wNzINCgkJYzAuMTk3LTAuNDQ3LDAuNTQyLTAuNzYyLDEuMDU1LTAuOTYxYzEuODk3LTAuNzM0LDQuNjA5LDIuNDYxLDYuODA1LDQuOTYxQzMxLjUzMiw0MS40NjksMzQuNTcsNDQuOTI3LDM4LjA5Nyw0My4wMDcNCgkJTDM4LjA5Nyw0My4wMDdMMzguMDk3LDQzLjAwN3oiLz4NCgk8ZyBpZD0iTF9FeWUiPg0KCQk8cGF0aCBpZD0iV2hpdGVfMV8iIGZpbGw9IiNGRkZGRkYiIGQ9Ik00MS4yMjgsNzkuNDg5YzAsMi43ODksMi4yNjMsNS4wNSw1LjA1NCw1LjA1YzIuNzkxLDAsNS4wNTEtMi4yNjEsNS4wNTEtNS4wNQ0KCQkJYzAtMi43OTEtMi4yNjEtNS4wNTYtNS4wNTEtNS4wNTZDNDMuNDksNzQuNDM2LDQxLjIyOCw3Ni42OTgsNDEuMjI4LDc5LjQ4OUw0MS4yMjgsNzkuNDg5TDQxLjIyOCw3OS40ODl6Ii8+DQoJCTxwYXRoIGlkPSJQdXBpbF8xXyIgZmlsbD0iIzYwMzgxMyIgZD0iTTQ2Ljk2MSw3NS43OTZjMC45ODEsMCwxLjg3LDAuMzk4LDIuNTEzLDEuMDQzYzAuNjQ1LDAuNjQzLDEuMDQyLDEuNTMyLDEuMDQyLDIuNTEzDQoJCQljMCwwLjk4MS0wLjM5NywxLjg3LTEuMDQyLDIuNTE0Yy0wLjY0NCwwLjY0NC0xLjUzMiwxLjA0Mi0yLjUxMywxLjA0MnMtMS44Ny0wLjM5OC0yLjUxMy0xLjA0Mg0KCQkJYy0wLjY0NS0wLjY0NC0xLjA0Mi0xLjUzMi0xLjA0Mi0yLjUxNGMwLTAuOTgsMC4zOTgtMS44NywxLjA0Mi0yLjUxM0M0NS4wOTIsNzYuMTk0LDQ1Ljk4LDc1Ljc5Niw0Ni45NjEsNzUuNzk2TDQ2Ljk2MSw3NS43OTZ6Ig0KCQkJLz4NCgk8L2c+DQoJPGcgaWQ9IlJfRXllIj4NCgkJPHBhdGggaWQ9IldoaXRlIiBmaWxsPSIjRkZGRkZGIiBkPSJNNjUuNTY4LDc5LjQ4OWMwLDIuNzg5LDIuMjYyLDUuMDUsNS4wNTQsNS4wNWMyLjc4OCwwLDUuMDUyLTIuMjYxLDUuMDUyLTUuMDUNCgkJCWMwLTIuNzkxLTIuMjYyLTUuMDU2LTUuMDUyLTUuMDU2QzY3LjgzLDc0LjQzNiw2NS41NjgsNzYuNjk4LDY1LjU2OCw3OS40ODlMNjUuNTY4LDc5LjQ4OUw2NS41NjgsNzkuNDg5eiIvPg0KCQk8cGF0aCBpZD0iUHVwaWwiIGZpbGw9IiM2MDM4MTMiIGQ9Ik02Ny43NDUsNzkuMzUyYzAsMS45NjQsMS41OSwzLjU1NSwzLjU1NiwzLjU1NWMxLjk2MywwLDMuNTU2LTEuNTksMy41NTYtMy41NTUNCgkJCWMwLTEuOTYyLTEuNTkzLTMuNTU2LTMuNTU2LTMuNTU2QzY5LjMzNSw3NS43OTYsNjcuNzQ1LDc3LjM4OSw2Ny43NDUsNzkuMzUyTDY3Ljc0NSw3OS4zNTJMNjcuNzQ1LDc5LjM1MnoiLz4NCgk8L2c+DQoJPHBhdGggaWQ9IkxfQXJtIiBmaWxsPSIjRkZDOTNFIiBzdHJva2U9IiM2MDM4MTMiIHN0cm9rZS13aWR0aD0iMyIgZD0iTTYuMzQxLDk4Ljk5NGMtMS4wMzYtMC42NjEtMS42MzMtMS43NTMtMS43MjktMy4xNjENCgkJYy0wLjIzNC0zLjQ0NSwyLjQ5Mi05LjY4Miw3LjEzNC0xMy42MjZjMy4xNy0yLjY5NCwxNC42MTctNi43MDcsMTcuMDE0LTUuNzAzYzAuMTk4LDAuMDgzLDAuNDYzLDAuMjk3LDAuNDcyLDAuNDA0DQoJCWMwLjIyNCwwLjQyNywwLjE5NCwxLjExOS0wLjE0LDEuNzkxYy0wLjkyNywxLjg2NC0zLjE0Miw0LjMzNS01LjU5NCw2LjY2Yy0xLjkwNiwxLjgxNC00LjA2NSwzLjg2My02LjAzNSw2LjE4MWwtMS44MDcsMi4xNDENCgkJQzExLjI1OSw5OC45NDMsOC45ODYsMTAwLjY4NSw2LjM0MSw5OC45OTRMNi4zNDEsOTguOTk0TDYuMzQxLDk4Ljk5NHoiLz4NCgk8cGF0aCBpZD0iTW91dGgiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzYwMzgxMyIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik02My4xNDgsOTUuMzkxDQoJCWMwLDAtNC41OTksMC4wMDQtNy44MTktMi43NTYiLz4NCjwvZz4NCjwvc3ZnPg0K" id="10"/></item></list></costumes><sounds><list struct="atomic" id="11"></list></sounds><blocks></blocks><variables></variables><scripts><script x="30" y="60.50000000000003"><block s="receiveGo"></block><block s="doSetVar"><l>messages</l><block s="reportNewList"><list></list></block></block><block s="clear"></block><block s="hide"></block><block s="doAsk"><l>what&apos;s your name?</l></block><block s="doSetVar"><l>name</l><block s="getLastAnswer"></block></block><custom-block s="MQTT connect %s %s %s"><l>test.mosquitto.org:8081</l><l></l><l></l></custom-block><custom-block s="MQTT sub %s %s %cmdRing"><l>test.mosquitto.org:8081</l><l>ytlf-continue</l><block s="reifyScript"><script><block s="doDeclareVariables"><list><l>data</l></list></block><block s="doSetVar"><l>data</l><custom-block s="parse json %s"><block var="message"/></custom-block></block><block s="doIfElse"><block s="reportIsA"><block var="data"/><l><option>Boolean</option></l></block><script><custom-block s="MQTT pub %s %s %s"><l>test.mosquitto.org:8081</l><l>ytlf-continue</l><custom-block s="stringify %s to json"><block var="messages"/></custom-block></custom-block></script><script><block s="doIfElse"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block><script><block s="doSetVar"><l>messages</l><block var="data"/></block></script><script><block s="doAddToList"><block var="data"/><block var="messages"/></block></script></block><custom-block s="display"></custom-block></script></block></script><list><l>topic</l><l>message</l></list></block></custom-block><custom-block s="MQTT pub %s %s %s"><l>test.mosquitto.org:8081</l><l>ytlf-continue</l><block s="reportBoolean"><l><bool>false</bool></l></block></custom-block><block s="bubble"><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doForever"><script><block s="doAsk"><l></l></block><custom-block s="MQTT pub %s %s %s"><l>test.mosquitto.org:8081</l><l>ytlf-continue</l><custom-block s="stringify %s to json"><block s="reportJoinWords"><list><block var="name"/><l>: </l><block s="getLastAnswer"></block></list></block></custom-block></custom-block></script></block></script></scripts></sprite><watcher var="messages" style="normal" x="4.999999999999545" y="5" color="243,118,29" hidden="true"/><watcher var="name" style="normal" x="4.999999999999545" y="64.500001" color="243,118,29" hidden="true"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="load JS from url: %&apos;url&apos; waiting for object: %&apos;object&apos;" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>url</l><l>object</l></list><l>var nodes = document.getElementsByTagName(&apos;*&apos;),&#xD;    node = nodes[nodes.length - 1].parentNode,&#xD;    script = document.createElement(&apos;script&apos;);&#xD;&#xD;if (object == null) {&#xD;  throw new Error(&#xD;    &apos;You need to specify the name of an object that you expect the library to create.&apos;&#xD;  );&#xD;}&#xD;&#xD;script.id = object.replace(/[^a-z]/gi,&apos;&apos;); &#xD;&#xD;if (!document.getElementById(script.id)) {&#xD;  script.setAttribute(&apos;type&apos;, &apos;text/javascript&apos;);&#xD;  script.setAttribute(&apos;src&apos;, url);&#xD;  node.appendChild(script);&#xD;}</l></block><list><block var="url"/><block var="object"/></list></block><block s="doWaitUntil"><block s="evaluate"><block s="reportJSFunction"><list><l>objectName</l></list><l>return (typeof window[objectName]) !== &apos;undefined&apos;</l></block><list><block var="object"/></list></block></block></script></block-definition><block-definition s="MQTT connect %&apos;broker&apos; %&apos;username&apos; %&apos;password&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s"></input><input type="%s"></input></inputs><script><block s="doDeclareVariables"><list><l>connection status</l></list></block><custom-block s="load MQTT library"></custom-block><block s="doSetVar"><l>connection status</l><l>connecting</l></block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>username</l><l>password</l><l>process</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){&#xD;  stage.mqtt = [];&#xD;}&#xD;&#xD;let wabroker;&#xD;if (broker.startsWith(&apos;ws://&apos;)) {&#xD;  wsbroker = broker;&#xD;} else if (broker.startsWith(&apos;wss://&apos;)) {&#xD;  wsbroker = broker;&#xD;} else {&#xD;  let prefix;&#xD;  prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;  wsbroker = prefix + &apos;://&apos; + broker;&#xD;}&#xD;&#xD;try{&#xD;  stage.mqtt[broker].end();&#xD;}catch(e){}&#xD;&#xD;delete stage.mqtt[broker];&#xD;&#xD;if (username) {&#xD;console.log(&apos;ei&apos;);&#xD;  stage.mqtt[broker] = mqtt.connect(wsbroker, {&#xD;    username: username,&#xD;    password: password,&#xD;//  reconnectPeriod: -1 &#xD;  });&#xD;}else{&#xD;  stage.mqtt[broker] = mqtt.connect(wsbroker);&#xD;}&#xD;&#xD;stage.mqtt[broker].on(&apos;connect&apos;, function(connack) {&#xD;  process.doSetVar(&apos;connection status&apos;, &apos;connected&apos;);&#xD;  console.log(&apos;Connected to &apos;+wsbroker);&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;close&apos;, function() {&#xD;  process.doSetVar(&apos;connection status&apos;, new Error(&apos;Connection closed&apos;));&#xD;  console.log(&apos;Connection closed on &apos; + wsbroker);&#xD;  try{ stage.mqtt[broker].end(); }catch(e){}&#xD;  delete stage.mqtt[broker];&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;connect&apos;, function(connack) {&#xD;  process.doSetVar(&apos;connection status&apos;, &apos;connected&apos;);&#xD;  console.log(&apos;Connected to &apos;+wsbroker);&#xD;});&#xD;&#xD;stage.mqtt[broker].on(&apos;error&apos;, function(error) {&#xD;  console.log(&apos;error&apos;, error.message);&#xD;  process.doSetVar(&apos;connection status&apos;, error);&#xD;  try{&#xD;    stage.mqtt[broker].end();&#xD;  }catch(e){}&#xD;  delete stage.mqtt[broker];&#xD;  alert(error.message);&#xD;});&#xD;</l></block><list><block var="broker"/><block var="username"/><block var="password"/></list></block><block s="doWaitUntil"><block s="reportNot"><block s="reportEquals"><block var="connection status"/><l>connecting</l></block></block></block><block s="doIf"><block s="reportNot"><block s="reportEquals"><block var="connection status"/><l>connected</l></block></block><script><block s="doRun"><block s="reportJSFunction"><list><l>status</l></list><l>throw status;</l></block><list><block var="connection status"/></list></block></script></block></script></block-definition><block-definition s="MQTT pub %&apos;broker&apos; %&apos;topic&apos; %&apos;msg&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">Hello</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l><l>msg</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){&#xD;  throw new Error(&apos;No connection to broker &apos; + broker);&#xD;}&#xD;&#xD;if(!stage.mqtt[broker]){&#xD;  throw new Error(&apos;No connection to broker &apos; + broker);&#xD;}&#xD;&#xD;let prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;let wsbroker = prefix+&apos;://&apos;+broker;&#xD;&#xD;try{&#xD;  let client = stage.mqtt[broker];&#xD;  client.publish(topic, &apos;&apos; + msg);&#xD;}catch(e){&#xD;//  console.log(e);&#xD;  throw e;&#xD;}&#xD;</l></block><list><block var="broker"/><block var="topic"/><block var="msg"/></list></block></script></block-definition><block-definition s="MQTT sub %&apos;broker&apos; %&apos;topic&apos; %&apos;callback&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%cmdRing"></input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l><l>callback</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;if (!(&apos;mqtt&apos; in stage)){throw new Error(&apos;No connection to broker &apos;+broker);}&#xD;&#xD;let prefix = window.location.protocol == &apos;https:&apos;?&apos;wss&apos;:&apos;ws&apos;;&#xD;let wsbroker = prefix+&apos;://&apos;+broker;&#xD;&#xD;if(stage.mqtt[broker]){&#xD;  try {stage.mqtt[broker].unsubscribe(topic);}catch(e){}&#xD;}else{&#xD;  throw new Error(&apos;No connection to broker &apos;+broker);&#xD;}&#xD;&#xD;stage.mqtt[broker].subscribe(topic);&#xD;&#xD;let mqttListener = function (aTopic, payload) {	&#xD;//  if (aTopic !== topic) { return; }&#xD;  if (!mqttWildcard(aTopic, topic)) {return;}&#xD;  let p = new Process();&#xD;  try {&#xD;    p.initializeFor(callback, new List([aTopic, payload.toString()]));&#xD;  } catch(e) {&#xD;    p.initializeFor(callback, new List([]));&#xD;  }&#xD;  stage.threads.processes.push(p);&#xD;};&#xD;&#xD;stage.mqtt[broker].on(&apos;message&apos;, mqttListener);&#xD;&#xD;let mqttWildcard = function (topic, wildcard) {&#xD; 	if (topic === wildcard) {return true;} &#xD; 	else if (wildcard === &apos;#&apos;) {return true;}&#xD;&#xD; 	var res = [];&#xD; 	var t = String(topic).split(&apos;/&apos;);&#xD; 	var w = String(wildcard).split(&apos;/&apos;);&#xD; 	var i = 0;&#xD; 	for (var lt = t.length; i &lt; lt; i++) {&#xD;		  if (w[i] === &apos;+&apos;) {&#xD; 		  	res.push(t[i]);&#xD;	  	} else if (w[i] === &apos;#&apos;) {&#xD; 	  		res.push(t.slice(i).join(&apos;/&apos;));&#xD;   			return true;&#xD;  		} else if (w[i] !== t[i]) {&#xD;   			return false;&#xD; 	  }&#xD;  }&#xD; 	if (w[i] === &apos;#&apos;) {i += 1;}&#xD; 	return (i === w.length) ? true : false;&#xD;}&#xD;</l></block><list><block var="broker"/><block var="topic"/><block var="callback"/></list></block></script></block-definition><block-definition s="MQTT unsub %&apos;broker&apos; %&apos;topic&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l><l>topic</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;try{&#xD;  stage.mqtt[broker].unsubscribe(topic);&#xD;  let listeners = stage.mqtt[broker].listeners(&apos;message&apos;);&#xD;  listeners.forEach((listener) =&gt; { stage.mqtt[broker].removeListener(&apos;message&apos;, listener); })&#xD;}catch(e){&#xD;  console.log(e);&#xD;}</l></block><list><block var="broker"/><block var="topic"/></list></block></script></block-definition><block-definition s="MQTT disconnect %&apos;broker&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input></inputs><script><custom-block s="load MQTT library"></custom-block><block s="doRun"><block s="reportJSFunction"><list><l>broker</l></list><l>/* github.com/pixavier/mqtt4snap  */&#xD;&#xD;let stage =  this.parentThatIsA(StageMorph);&#xD;&#xD;try{&#xD;  if(broker==&apos;all&apos;){&#xD;    for(let brok of Object.keys(stage.mqtt)){&#xD;      try {&#xD;        stage.mqtt[brok].end();&#xD;      } catch (e0) {&#xD;        console.log(e0);&#xD;      }&#xD;    } &#xD;  }else{&#xD;    stage.mqtt[broker].end();&#xD;  }&#xD;}catch(e1){&#xD;  console.log(e1);&#xD;}&#xD;try{&#xD;  if(broker==&apos;all&apos;){&#xD;    try {&#xD;      delete stage.mqtt;&#xD;      stage.mqtt=[];&#xD;    } catch (e2) {&#xD;      console.log(e2);&#xD;    }&#xD;  }else{&#xD;    delete stage.mqtt[broker];&#xD;  }&#xD;}catch(e3){&#xD;//  console.log(e3);&#xD;}&#xD;</l></block><list><block var="broker"/></list></block></script></block-definition><block-definition s="MQTT request %&apos;broker&apos; %&apos;topic&apos; %&apos;idCall&apos; %&apos;msg&apos; %&apos;callback&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">idCall</input><input type="%s">Hello</input><input type="%cmdRing"></input></inputs><script><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list><block var="#2"/><block var="#1"/></list></block><custom-block s="MQTT unsub %s %s"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></custom-block></script><list><l>#1</l><l>#2</l></list></block></custom-block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></list></block><block var="msg"/></custom-block></script></block-definition><block-definition s="MQTT response %&apos;broker&apos; %&apos;topic&apos; %&apos;reply&apos;" type="command" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName/#</input><input type="%repRing"></input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>callbackTopic</l></list></block><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block var="topic"/><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list><block var="#1"/><block var="#2"/></list></block></block><block s="doSetVar"><l>callbackTopic</l><block s="reportListItem"><l><option>last</option></l><block s="reportTextSplit"><block var="#1"/><l>/</l></block></block></block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block var="callbackTopic"/><block var="resp"/></custom-block></script><list><l>#1</l><l>#2</l></list></block></custom-block></script></block-definition><block-definition s="example MQTT response reporter %&apos;topic&apos; %&apos;msg&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">topicName</input><input type="%s">msg</input></inputs><script><block s="doThinkFor"><block s="reportJoinWords"><list><l>hello </l><block var="msg"/></list></block><l>1</l></block><block s="doReport"><block var="msg"/></block></script></block-definition><block-definition s="MQTT request %&apos;broker&apos; %&apos;topic&apos; %&apos;idCall&apos; %&apos;msg&apos;" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs><input type="%s">test.mosquitto.org:8081</input><input type="%s">topicName</input><input type="%s">idCall</input><input type="%s">Hello</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>semaphor</l></list></block><custom-block s="MQTT sub %s %s %cmdRing"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block var="#2"/></block><custom-block s="MQTT unsub %s %s"><block var="broker"/><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></custom-block><block s="doSetVar"><l>semaphor</l><block s="reportBoolean"><l><bool>true</bool></l></block></block></script><list><l>#1</l><l>#2</l></list></block></custom-block><custom-block s="MQTT pub %s %s %s"><block var="broker"/><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>idCall</l><block var="idCall"/></list></block></list></block><block var="msg"/></custom-block><block s="doWaitUntil"><block var="semaphor"/></block><block s="doReport"><block var="resp"/></block></script></block-definition><block-definition s="load MQTT library" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="load JS from url: %s waiting for object: %s"><l>https://unpkg.com/mqtt/dist/mqtt.min.js</l><l>mqtt</l></custom-block><block s="doWaitUntil"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return (typeof mqtt.connect) !== &apos;undefined&apos;</l></block><list></list></block></block></script></block-definition><block-definition s="display" type="command" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportGreaterThan"><block s="reportListLength"><block var="messages"/></block><l>18</l></block><script><block s="doSetVar"><l>messages</l><block s="reportListItem"><block s="reportNumbers"><block s="reportDifference"><block s="reportListLength"><block var="messages"/></block><l>17</l></block><block s="reportListLength"><block var="messages"/></block></block><block var="messages"/></block></block></script></block><block s="clear"></block><block s="gotoXY"><l>-230</l><l>165</l></block><block s="doForEach"><l>message</l><block var="messages"/><script><block s="write"><block var="message"/><l>12</l></block><block s="gotoXY"><l>-230</l><block s="reportDifference"><block s="yPosition"></block><l>15</l></block></block></script></block></script></block></script></block-definition><block-definition s="parse json %&apos;json&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s">""</input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>data</l><l>hashtable</l></list><l>var stage = this.parentThatIsA(StageMorph);&#xD;function snapify(js) {&#xD;  if (typeof js === &apos;object&apos;) {&#xD;    if (js === null) {&#xD;      return js;&#xD;    } else if (js instanceof Array) {&#xD;      var data = new List();&#xD;      for (var i = 0; i &lt; js.length; i++) {&#xD;        data.add(snapify(js[i]));&#xD;      }&#xD;      return data;&#xD;    } else {&#xD;      if (!stage.supportsHashtables) {&#xD;        invoke(hashtable);&#xD;      }&#xD;      var data = new Hashtable();&#xD;      for (let [hashkey, value] of Object.entries(js)) {&#xD;        data.set(hashkey, snapify(value));&#xD;      }&#xD;      return data;&#xD;    }&#xD;  } else {&#xD;    return js;&#xD;  }&#xD;}&#xD;var js = JSON.parse(data);&#xD;return snapify(js);</l></block><list><block var="json"/><block s="reifyReporter"><autolambda><block s="errorObsolete"></block></autolambda><list></list></block></list></block></block></script></block-definition><block-definition s="stringify %&apos;data&apos; to json" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>data</l></list><l>function native(data) {&#xD;  if (typeof data === &apos;object&apos;) {&#xD;    if (data instanceof List) {&#xD;      var result = [];&#xD;      while (data.isLinked) {&#xD;        result.push(native(data.first));&#xD;        data = data.rest;&#xD;      }&#xD;      for (var i = 0; i &lt; data.contents.length; i++) {&#xD;        result.push(native(data.contents[i]));&#xD;      }&#xD;      return result;&#xD;    } else if (data instanceof Hashtable) {&#xD;      var result = {};&#xD;      data.foreach(function(key, value) {&#xD;        if (typeof key !== &apos;string&apos;) {&#xD;          throw new Error(&apos;json key must be string &apos; + key);&#xD;        }&#xD;        result[key] = value;&#xD;      });&#xD;      return result;&#xD;    } else {&#xD;      throw new Error(&apos;not json serializable: &apos; + Process.prototype.reportTypeOf(data) + &apos; &apos; + data)&#xD;    }&#xD;  } else {&#xD;    return data;&#xD;  }&#xD;}&#xD;return JSON.stringify(native(data));</l></block><list><block var="data"/></list></block></block></script></block-definition></blocks><variables><variable name="messages"><list struct="atomic" id="513"></list></variable><variable name="name"><l>3</l></variable></variables></project><media name="MQTT library" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>