<snapdata remixID="8988355"><project name="finch intermiediate 1 project " app="Snap! 5.1, http://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" volume="100" pan="0" lines="round" ternary="true" codify="false" inheritance="false" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAajklEQVR4Xu3dfYxlZ10H8Oc5M6XUP8giIkKCBEJEQWABo7wJVaOkLzv33F2XQlPDS9Roqsg/qLwUVkEFAxgELSa2FEUs1vacs2hRMFpCDKg0iBIqrfxBQtQEKRWSUnY69zFnM7vZLtt2d3Znzvye+5mE0Lpz7/P7fb4P+Tov925OPggQIECAAIEdF8g7fqIDCRAgQIAAgaSAXQICBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QECBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QECBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QECBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QECBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QECBAgQIDCBgAKeAN2RBAgQIEBAAbsDBAgQIEBgAgEFPAG6IwkQIECAgAJ2BwgQIECAwAQCCngCdEcSIECAAAEF7A4QIECAAIEJBBTwBOiOJECAAAECCtgdIECAAAECEwgo4AnQHUmAAAECBBSwO0CAAAECBCYQUMAToDuSAAECBAgoYHeAAAECBAhMIKCAJ0B3JAECBAgQUMDuAAECBAgQmEBAAU+A7kgCBAgQIKCA3QEClQisra1d1TTNL+3du/fRhw4dWlSyljUIVCuggKuN1mLLJtC27d0ppQtSSq/r+/53lm1/+xKIJqCAoyVmXgL3IzCfz29PKd2VUvp413WvAUWAwO4WUMC7Ox/TEThtgdlsdsfKysrnSinf2XXdj6WUfBv6tPV8IoGdF1DAO2/uRALbItC27e0551tLKbOU0nP7vv/XbTnIkxIgcE4EFPA5YfQkBKYXaNv2jsVi8S9N07w457y367rPTT+VCQgQuD8BBexuEKhEoG3bL+ScP1VKuSLn/Myu6z5byWrWIFClgAKuMlZLLaPAbDa7Lef86ZTSS3POT+267rZldLAzgSgCCjhKUuYk8CACbdv+XUrp9lLKL5RSnnX48OHPQCNAYPcKKODdm43JCJyRQNu2b0opPaqU8oqmaZ7edd34siQfBAjsUgEFvEuDMRaBMxXYv3//ZYvFYvwN6J/KOR/ouu7jZ/ocPp8AgZ0TUMA7Z+0kAtsqMJvNHptzvialdF5K6fN931+5rQd6cgIEzkpAAZ8VnwcT2F0CbdvemlL6p5zzU7que+Hums40BAicKKCA3QcCFQm0bfv1pmneuFgs9u/du/fHDx06dG9F61mFQFUCCriqOC2z7AJt266nlMbfgn5V0zQf7LrubctuYn8Cu1VAAe/WZMxFYAsCs9lsPec8FvATm6Z5Utd1+7fwNB5CgMAOCCjgHUB2BIGdEmjb9lsrKyuvXiwW/15Kubrv+6fu1NnOIUDgzAQU8Jl5+WwCu1rg2Leg+76/pm3br5VSnjcMw+d39dCGI7CkAgp4SYO3dp0CbdveM/4MuO/769q2/cec8+u8HrjOrG0VX0ABx8/QBgSOC4zfgh7fCWsYhg+2bfvXKaXr+77/U0QECOw+AQW8+zIxEYEtC8xms2+urq5eeeONN17btu1fppRu6/v+qi0/oQcSILBtAgp422g9MYGdF5jP50dKKa/s+/4Dbdt+qJSyPgzDFTs/iRMJEHgwAQX8YEL+nEAggfEr4FLKlYcPH752Npu9P+f8uL7vLwy0glEJLI2AAl6aqC26DALjbz6nlC7r+/6jbdu+OaX0owp4GZK3Y0QBBRwxNTMTOIXA2traS1ZWVn6l67rnjH88m81ekVJ6+TAM3hPajSGwCwUU8C4MxUgEtiKw+VvPn+z7/i2bBfzcnPM7+75/9laez2MIENheAQW8vb6encCOCLRtu7eU8q719fXLbr755v8ZD73wwgsfumfPnlv37NnzrOuuu258fbAPAgR2kYAC3kVhGIXAVgXatn1fSukbfd+/6thz7Nu37/Grq6uf6rruUVt9Xo8jQGD7BBTw9tl6ZgI7InDhhReu7tmz52MppXf1fd8fO3T//v3PXiwW1/V9//07MohDCBA4IwEFfEZcPpnA7hNo2/ZnUkpX9H3/ohOnm8/nLyylvLnv+xfsvqlNRICAAnYHCAQXaNv2mlLKl4dheNOJq2wW80v6vr8k+IrGJ1ClgAKuMlZLLZNA27a3lFKuHYbhT04q4PF1wD/Q9/1PL5OHXQlEEVDAUZIyJ4FTCKytrT2maZrxL1wY3+1qceKnzGazD+Scz+v7/jJ4BAjsPgEFvPsyMRGB0xaYz+cvWywWB4dhuPTkB21+ZfylYRhedtpP6BMJENgxAQW8Y9QOInDuBe7v57/jSWMBp5Q+4W9DOvfunpHAuRBQwOdC0XMQmEigbdsbU0qPSyn9V0rpjlLK/zVNc9f41xCWUl6fUvqHnPOfp5QeklJa2djYaJqmKTnne1NKR9bX1+9ZWVkpTdNccCafU8r4FPnuzbUveLB/P//8879y/fXXjzP6IEBgU0ABuwoEAgtccsklD19dXX3++LcepZT2lFKeknP+npTSYzaL+byU0kZKafzf+rH/lJTSsf+M24//fOKfj//8QJ/THPvzUkrKOd/vv4/PW8rY781XvCFI4Itm9G0RUMDbwupJCewOgfl8/v7FYjG+RGn8anhHP+bz+RtLKa8upVw9xfk7uqzDCGxBQAFvAc1DCEQRmM1mP5Jz/u2c8y92XXf7Ts09/s1MTdP8cs75b7uu+82dOtc5BCIJKOBIaZmVwBYE2rZ9d0rpsX3ft1t4+Bk/pG3bN+WcD25sbLzl8OHD15/xE3gAgSURUMBLErQ1l1fg4MGDD1lfX+9SSo/c/Hbw+Bc3bMvH+JVvzvkNOecb+r7/jQc6ZG1t7QU552tyzk8cP6+MP1Aef2ic83opZfzZdRqGYfz5sg8CVQoo4CpjtRSBbxeYzWbvbJrmolLK39x1112vveWWW87pX1E4/sx3sVi8qJTy7gf6yrdt2z0ppQ+VUu7OOd+ysbHx3JWVlRefMPGxXwo7VsrHfins6H8rZbe7FgEFXEuS9iBwGgJra2tPbJrm6pTSainlU8MwvPY0Hnb8Uy6//PKH33PPPU9eLBbjb1o/OqX03aWU8Z+flHN+Ws759x7sZ76z2eyynPO1e/fufcShQ4dO+f8EzOfzLy4Wiyec8BvaR0s553y0lJXwmaTmc3ergALercmYi8AWBNq2/eGU0jUppSdvfle3yTmPb1F54kuLjr40aCyzzY+TX5I0/vvRt7Ucy65pmvG/x5cyraeU/nvz+TZKKXemlO4spXw15/y1pmm+fNNNN40/b37Aj9lsdnnO+X1935//YJ974p8fPHjwgiNHjnwj57xywv/9tr7vx119EAgnoIDDRWZgAt8uMJbT+vr6745/+UJK6Z9zzh8a32hjY2PjoTnnb+WcH3LszTdKKd+Rcx5L9pullLenlJ46Pial9BcppS+e+CYdTdOMb9gxfum5srKy0tx0001fOlv/AwcOvPLee+/9g2EYxjf/OOOPiy666PD555//sI2Njed9+MMfPvqzYh8EIgoo4IipmZnACQL79u37rpWVlX/LOR9OKb3zTF9udODAgSdsbGxcm3Mevy392b7vr9xO4LZtrxi/Bd113fjuXD4ILK2AAl7a6C1ei8B8Pn96KeXWvu9Xz2an2Wx2cdM0v7b528j/2ff9z57N893fY9fW1l6Zc97yV8DbMZPnJDCFgAKeQt2ZBM6hwNra2jOapvl03/cn/mx0yye0bfsTpZS3bH5F3A/D8FtbfrJTPHCrPwM+lzN4LgK7QUAB74YUzEDgLATatt2bUhoL+Ky+Aj55hPl8/uullFeUUu5omub9XdfdcBZjHn9o27YvL6W8dxiGh56L5/McBKIKKOCoyZmbwKbAfD7/wVLKZ/q+35ZfSGrb9s9SSs9KKf19KeU9wzB8/mzwxwJOKb2373sFfDaQHhteQAGHj9ACyy4wn8+/r5Tyub7vt+2Xms7lL2r5FvSy31j7HxNQwO4CgeACl1566feurq6OvzS1bQV8jOhc/KLW2b4MKXhcxidwXEABuwwEggvMZrPH5pzHAj6jN7Y4m7U3f1Hr6Hs9N01zW9d1P3e6z9e27atTSm/1LejTFfN5tQoo4FqTtdfSCGz3z4AfCLJt24tyzq9fLBYPWMTz+fz5pZR5SuknN99d6+6u656zNCFZlMApBBSwa0EguMC5fhnSVjhOUcQ/P5/PLyul7Nt8W8xv5pzH933+aNd1b93KGR5DoDYBBVxbovZZOoEpvwI+GftYEZdSHlZK+XpK6a6macZ3vbpp6YKxMIEHEVDArgiB4AL79u17/Orq6hd201s7Hjx48JE33HDDV4LTGp/Atgoo4G3l9eQEtl9gN30FvP3bOoFAPQIKuJ4sbbKkArvhZ8BLSm9tAmcloIDPis+DCUwvsG/fvmeurKx8rO/7R0w/jQkIEDhdAQV8ulI+j8AuFVhbW3tJznk2DMNLd+mIxiJA4BQCCti1IBBcoG3bq3LOT+u67mDwVYxPYKkEFPBSxW3ZGgXatn3H+BrbruteX+N+diJQq4ACrjVZey2NQNu2N5dShmEY/mhplrYogQoEFHAFIVphuQXm8/lfLRaLtw3D8InllrA9gVgCCjhWXqYl8G0Cs9nsk0eOHFn7yEc+4o0v3A8CgQQUcKCwjErgZIFLL7306eedd97vd133QjoECMQSUMCx8jItgfsIzGazy1JKrZcguRgE4gko4HiZmZjAcQEvQXIZCMQVUMBxszM5geQlSC4BgbgCCjhudiYnMBbwf5RS/ngYhrfjIEAgloACjpWXaQncR6Bt26+mlP6w7/ur0BAgEEtAAcfKy7QETi7g/y2lvG8YhtegIUAgloACjpWXaQmcqoCvHYbhV9EQIBBLQAHHysu0BE4u4DsXi8V7Dh8+/EY0BAjEElDAsfIyLYH7CMxmsztzzn/gZ8AuBoF4Ago4XmYmJnBcoG3bL5VSrh6G4a1YCBCIJaCAY+VlWgL3EZjP57eWUl7b9/1H0RAgEEtAAcfKy7QEjgtcfPHFjxvfB3oYhhkWAgTiCSjgeJmZmMBRgbZt35BSekbf9weQECAQT0ABx8vMxASOCsxms0VKKeecf6jv+1uxECAQS0ABx8rLtASOC2wWcBqGocFCgEA8AQUcLzMTEzgqsLa29o6VlZVHd113ORICBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQEABVxCiFQgQIEAgnoACjpeZiQkQIECgAgEFXEGIViBAgACBeAIKOF5mJiZAgACBCgQUcAUhWoEAAQIE4gko4HiZmZgAAQIEKhBQwBWEaAUCBAgQiCeggONlZmICBAgQqEBAAVcQohUIECBAIJ6AAo6XmYkJECBAoAIBBVxBiFYgQIAAgXgCCjheZiYmQIAAgQoEFHAFIVqBAAECBOIJKOB4mZmYAAECBCoQUMAVhGgFAgQIEIgnoIDjZWZiAgQIEKhAQAFXEKIVCBAgQCCegAKOl5mJCRAgQKACAQVcQYhWIECAAIF4Ago4XmYmJkCAAIEKBBRwBSFagQABAgTiCSjgeJmZmAABAgQqEFDAFYRoBQIECBCIJ6CA42VmYgIECBCoQOD/AcCNK6V74/dRAAAAAElFTkSuQmCC</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="63.99999999998522" y="38.39999999988714" heading="0" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="8"><costumes><list id="9"><item><costume name="Untitled" center-x="240" center-y="180" image="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" id="10"/></item></list></costumes><sounds><list struct="atomic" id="11"></list></sounds><blocks></blocks><variables></variables><scripts><script x="30" y="35"><block s="receiveKey"><l><option>7</option></l><comment w="90" collapsed="false">when 7 is pressed it puts the pen down and alows you to draw until you press x.</comment></block><block s="clear"></block><block s="gotoXY"><l>0</l><l>0</l></block><block s="doSetVar"><l>PenUP</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="down"></block><block s="doUntil"><block s="reportEquals"><block var="PenUP"/><block s="reportBoolean"><l><bool>false</bool></l></block></block><script><block s="doSetVar"><l>PenX</l><block s="reportSum"><block s="xPosition"></block><custom-block s="Finch Y Acceleration"></custom-block></block></block><block s="doSetVar"><l>PenY</l><block s="reportSum"><block s="yPosition"></block><block s="reportProduct"><custom-block s="Finch X Acceleration"></custom-block><l>-1</l></block></block></block><block s="gotoXY"><block var="PenX"/><block var="PenY"/></block><block s="doIf"><block s="reportKeyPressed"><l><option>x</option></l></block><script><block s="doSetVar"><l>PenUP</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="up"></block></script></block></script></block></script><script x="426" y="27"><block s="receiveKey"><l><option>1</option></l></block></script></scripts></sprite><watcher scope="Stage" s="getLastAnswer" style="normal" x="0.15625" y="1.7968751562500103" color="4,148,220" hidden="true"/><watcher scope="Sprite" s="getScale" style="normal" x="0.15625" y="2.1250001874999924" color="143,86,227" hidden="true"/><watcher var="PenUP" style="normal" x="10" y="10" color="243,118,29"/><watcher var="PenX" style="normal" x="10" y="34.000001999999995" color="243,118,29"/><watcher var="PenY" style="normal" x="10" y="55.00000399999999" color="243,118,29"/></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Say This %&apos;speech&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%txt">I am known by many names, but you may call me...Tim.</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>phrase</l></list><l>finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;var report = { message: "SPEAK", val: phrase};&#xD;chrome.runtime.sendMessage(finchAppID, report, function() {});</l></block><list><block var="speech"/></list></block></script></block-definition><block-definition s="Move Finch Left: %&apos;Left&apos; Right: %&apos;Right&apos;" type="command" category="motion"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">0</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>left</l><l>right</l></list><l>finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;////////////////////////////////////////////////////////////////////////////////&#xD;// In order to avoid sending more messages than the app can handle, whenever we&#xD;// send a message we also save it in a persistent global variable. When the&#xD;// message is processed in the app, the callback checks if the global variable&#xD;// still matches what it was changed to. If it was, it deletes the global&#xD;// variable. Otherwise the message is resent with new data.&#xD;//&#xD;// When this block is called it checks if the global value has been set. If it&#xD;// has, it sends a message. Otherwise it just updates the value and lets the&#xD;// callback handle it.&#xD;&#xD;&#xD;// We can&apos;t run code beforehand to define values so we must check each block&#xD;// call if they are set.&#xD;if (window.birdbrain === undefined || window.birdbrain.moveSpeed === undefined) {&#xD;    window.birdbrain = window.birdbrain || {};&#xD;    window.birdbrain.moveSpeed = {&#xD;        // By attaching this function to a global variable, it is only&#xD;        // defined once instead of every time this block is called, improving&#xD;        // performance significantly.&#xD;        setMoveSpeed: function (speeds) {&#xD;            function callback() {&#xD;                // This array comparison is by reference instead of value.&#xD;                // This could mean false negatives if it&apos;s set to the same value, but these are uncommon and&#xD;                // the consequences are just a couple more messages sent. I do not think it is worth the&#xD;                // execution time and code complexity to do a proper value comparison.&#xD;                if (window.birdbrain.moveSpeed.speeds === speeds) {&#xD;                    delete window.birdbrain.moveSpeed.speeds;&#xD;                }&#xD;                else {&#xD;                    window.birdbrain.moveSpeed.setMoveSpeed(window.birdbrain.moveSpeed.speeds);&#xD;                }&#xD;            }&#xD;            var report = {&#xD;                message: "M".charCodeAt(0),&#xD;                leftDirection: speeds[0] &lt; 0 ? 1 : 0,&#xD;                leftSpeed: Math.abs(speeds[0]),&#xD;                rightDirection: speeds[1] &lt; 0 ? 1 : 0,&#xD;                rightSpeed: Math.abs(speeds[1]),&#xD;            };&#xD;            console.log(report);&#xD;            chrome.runtime.sendMessage(finchAppID, report, callback);&#xD;        }&#xD;    };&#xD;}&#xD;&#xD;// constrain n to the range [-255..255]&#xD;function constrain(n) {&#xD;    return Math.max(Math.min(n, 255), -255);&#xD;}&#xD;&#xD;var speeds = [constrain(Math.round(left * 2.55)), constrain(Math.round(right * 2.55))];&#xD;&#xD;if (window.birdbrain.moveSpeed.speeds === undefined) {&#xD;  window.birdbrain.moveSpeed.setMoveSpeed(speeds);&#xD;}&#xD;&#xD;window.birdbrain.moveSpeed.speeds = speeds;</l></block><list><block var="Left"/><block var="Right"/></list></block></script></block-definition><block-definition s="Stop Finch" type="command" category="motion"><header></header><code></code><translations></translations><inputs></inputs><script><custom-block s="Move Finch Left: %n Right: %n"><l>0</l><l>0</l></custom-block></script></block-definition><block-definition s="Finch LED R: %&apos;red&apos; G: %&apos;green&apos; B: %&apos;blue&apos;" type="command" category="looks"><header></header><code></code><translations></translations><inputs><input type="%n">0</input><input type="%n">50</input><input type="%n">0</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>red</l><l>green</l><l>blue</l></list><l>finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;////////////////////////////////////////////////////////////////////////////////&#xD;// In order to avoid sending more messages than the app can handle, whenever we&#xD;// send a message we also save it in a persistent global variable. When the&#xD;// message is processed in the app, the callback checks if the global variable&#xD;// still matches what it was changed to. If it was, it deletes the global&#xD;// variable. Otherwise the message is resent with new data.&#xD;//&#xD;// When this block is called it checks if the global value has been set. If it&#xD;// has, it sends a message. Otherwise it just updates the value and lets the&#xD;// callback handle it.&#xD;&#xD;&#xD;// We can&apos;t run code beforehand to define values so we must check each block&#xD;// call if they are set.&#xD;if (window.birdbrain === undefined || window.birdbrain.LED === undefined) {&#xD;    window.birdbrain = window.birdbrain || {};&#xD;    window.birdbrain.LED = {&#xD;        // By attaching this function to a global variable, it is only&#xD;        // defined once instead of every time this block is called, improving&#xD;        // performance significantly.&#xD;        setLED: function (values) {&#xD;            function callback() {&#xD;                // This array comparison is by reference instead of value.&#xD;                // This could mean false negatives if it&apos;s set to the same value, but these are uncommon and&#xD;                // the consequences are just a couple more messages sent. I do not think it is worth the&#xD;                // execution time and code complexity to do a proper value comparison.&#xD;                if (window.birdbrain.LED.values === values) {&#xD;                    delete window.birdbrain.LED.values;&#xD;                }&#xD;                else {&#xD;                    window.birdbrain.LED.setLED(window.birdbrain.LED.values);&#xD;                }&#xD;            }&#xD;            var report = {  message: "O".charCodeAt(0),&#xD;                            red: values[0],&#xD;                            green: values[1],&#xD;                            blue: values[2]&#xD;                         };&#xD;            console.log(report);&#xD;            chrome.runtime.sendMessage(finchAppID, report, callback);&#xD;        }&#xD;    };&#xD;}&#xD;&#xD;// constrain n to the range [0..255]&#xD;function constrain(n) {&#xD;    return Math.max(Math.min(n, 255), 0);&#xD;}&#xD;&#xD;var values = [constrain(Math.round(red * 2.55)), constrain(Math.round(green * 2.55)), constrain(Math.round(blue * 2.55))];&#xD;&#xD;if (window.birdbrain.LED.values === undefined) {&#xD;  window.birdbrain.LED.setLED(values);&#xD;}&#xD;&#xD;window.birdbrain.LED.values = values;</l></block><list><block var="red"/><block var="green"/><block var="blue"/></list></block></script></block-definition><block-definition s="Finch Buzzer %&apos;frequency&apos; Hz %&apos;duration&apos; ms" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%n">440</input><input type="%n">500</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>freq</l><l>time</l></list><l>finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;////////////////////////////////////////////////////////////////////////////////&#xD;// In order to avoid sending more messages than the app can handle, whenever we&#xD;// send a message we also save it in a persistent global variable. When the&#xD;// message is processed in the app, the callback checks if the global variable&#xD;// still matches what it was changed to. If it was, it deletes the global&#xD;// variable. Otherwise the message is resent with new data.&#xD;//&#xD;// When this block is called it checks if the global value has been set. If it&#xD;// has, it sends a message. Otherwise it just updates the value and lets the&#xD;// callback handle it.&#xD;&#xD;&#xD;// We can&apos;t run code beforehand to define values so we must check each block&#xD;// call if they are set.&#xD;if (window.birdbrain === undefined || window.birdbrain.buzzer === undefined) {&#xD;    window.birdbrain = window.birdbrain || {};&#xD;    window.birdbrain.buzzer = {&#xD;        // By attaching this function to a global variable, it is only&#xD;        // defined once instead of every time this block is called, improving&#xD;        // performance significantly.&#xD;        setBuzzer: function (value) {&#xD;            function callback() {&#xD;                // This object comparison is by reference instead of value.&#xD;                // This could mean false negatives if it&apos;s set to the same value, but these are uncommon and&#xD;                // the consequences are just a couple more messages sent. I do not think it is worth the&#xD;                // execution time and code complexity to do a proper value comparison.&#xD;                if (window.birdbrain.buzzer.value === value) {&#xD;                    delete window.birdbrain.buzzer.value;&#xD;                }&#xD;                else {&#xD;                    window.birdbrain.buzzer.setBuzzer(window.birdbrain.buzzer.value);&#xD;                }&#xD;            }&#xD;            var report = {&#xD;                message: "B".charCodeAt(0),&#xD;                timeHigh: value.time &gt;&gt; 8,  // Since the report must be in bytes&#xD;                timeLow: value.time &amp; 0xFF, // and these values are bigger than a byte&#xD;                freqHigh: value.freq &gt;&gt; 8,  // they are split into two bytes&#xD;                freqLow: value.freq &amp; 0xFF&#xD;            };&#xD;            chrome.runtime.sendMessage(finchAppID, report, callback);&#xD;        }&#xD;    };&#xD;}&#xD;&#xD;// constrain n to the range [0..65535]&#xD;function constrain(n) {&#xD;    return Math.max(Math.min(n, 0xFFFF), 0);&#xD;}&#xD;&#xD;var value = {&#xD;    freq: constrain(Math.round(freq)),&#xD;    time: constrain(Math.round(time))&#xD;};&#xD;&#xD;if (window.birdbrain.buzzer.value === undefined) {&#xD;    window.birdbrain.buzzer.setBuzzer(value);&#xD;}&#xD;&#xD;window.birdbrain.buzzer.value = value;</l></block><list><block var="frequency"/><block var="duration"/></list></block></script></block-definition><block-definition s="Finch Buzz+Wait %&apos;frequency&apos; Hz %&apos;duration&apos; ms" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%n">440</input><input type="%n">500</input></inputs><script><custom-block s="Finch Buzzer %n Hz %n ms"><block var="frequency"/><block var="duration"/></custom-block><block s="doWait"><block s="reportQuotient"><block var="duration"/><l>1000</l></block></block></script></block-definition><block-definition s="Finch Left Light Sensor" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.lights[0];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy1 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy1;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Right Light Sensor" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.lights[1];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy2 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy2;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Light Sensors" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><custom-block s="Finch Left Light Sensor"></custom-block><custom-block s="Finch Right Light Sensor"></custom-block></list></block></block></script></block-definition><block-definition s="Finch X Acceleration" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.acceleration[0];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy3 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy3;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Y Acceleration" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.acceleration[1];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy4 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy4;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Z Acceleration" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.acceleration[2];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy5 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy5;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Orientation" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var acceleration = Array(3);&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;        acceleration = response.acceleration;&#xD;        callback(acceleration);&#xD;    };&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;    var orientation;&#xD;&#xD;        if(acceleration[0] &gt; -0.5 &amp;&amp; acceleration[0] &lt; 0.5 &amp;&amp; acceleration[1] &lt; 0.5 &amp;&amp; acceleration[1] &gt; -0.5 &amp;&amp; acceleration[2] &gt; 0.65 &amp;&amp; acceleration[2] &lt; 1.5)&#xD;&#xD;            orientation =  "level";&#xD;&#xD;        else if(acceleration[0] &gt; -0.5 &amp;&amp; acceleration[0] &lt; 0.5 &amp;&amp; acceleration[1] &lt; 0.5 &amp;&amp; acceleration[1] &gt; -0.5 &amp;&amp; acceleration[2] &gt; -1.5 &amp;&amp; acceleration[2] &lt; -0.65)&#xD;&#xD;            orientation = "upside down";&#xD;&#xD;        else if(acceleration[0] &lt; 1.5 &amp;&amp; acceleration[0] &gt; 0.8 &amp;&amp; acceleration[1] &gt;-0.3 &amp;&amp; acceleration[1] &lt; 0.3 &amp;&amp; acceleration[2] &gt; -0.3 &amp;&amp; acceleration[2] &lt; 0.3)&#xD;&#xD;            orientation = "beak down";&#xD;&#xD;        else if(acceleration[0] &lt; -0.8 &amp;&amp; acceleration[0] &gt; -1.5 &amp;&amp; acceleration[1] &gt;-0.3 &amp;&amp; acceleration[1] &lt; 0.3 &amp;&amp; acceleration[2] &gt; -0.3 &amp;&amp; acceleration[2] &lt; 0.3)&#xD;&#xD;            orientation = "beak up";&#xD;&#xD;        else if(acceleration[0] &gt; -0.5 &amp;&amp; acceleration[0] &lt; 0.5 &amp;&amp; acceleration[1] &gt; 0.7 &amp;&amp; acceleration[1] &lt; 1.5 &amp;&amp; acceleration[2] &gt; -0.5 &amp;&amp; acceleration[2] &lt; 0.5)&#xD;&#xD;            orientation = "left wing down";&#xD;&#xD;        else if(acceleration[0] &gt; -0.5 &amp;&amp; acceleration[0] &lt; 0.5 &amp;&amp; acceleration[1] &gt; -1.5 &amp;&amp; acceleration[1] &lt; -0.7 &amp;&amp; acceleration[2] &gt; -0.5 &amp;&amp; acceleration[2] &lt; 0.5)&#xD;&#xD;            orientation = "right wing down";&#xD;&#xD;        else&#xD;&#xD;            orientation = "in between";&#xD;    console.log("sensor value has been set: ", orientation);&#xD;&#xD;    myself.finchDummy6 = orientation;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy6;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Accelerations" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><custom-block s="Finch X Acceleration"></custom-block><custom-block s="Finch Y Acceleration"></custom-block><custom-block s="Finch Z Acceleration"></custom-block></list></block></block></script></block-definition><block-definition s="Finch Left Obstacle" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.obstacles[0];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    var pred = (sensorvalue !== 0);&#xD;    console.log("sensor value has been set: ", pred);&#xD;&#xD;    myself.finchDummy7 = pred;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy7;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Right Obstacle" type="predicate" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.obstacles[1];&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    var pred = (sensorvalue !== 0);&#xD;    console.log("sensor value has been set: ", pred);&#xD;&#xD;    myself.finchDummy8 = pred;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.05</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy8;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Obstacles" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><custom-block s="Finch Left Obstacle"></custom-block><custom-block s="Finch Right Obstacle"></custom-block></list></block></block></script></block-definition><block-definition s="Finch Temperature Celcius" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doRun"><block s="reportJSFunction"><list></list><l>var sensorvalue = Number.MAX_VALUE;&#xD;&#xD;finchAppID = "ojocioejjpmeccjfjlhkepchminjemod";&#xD;&#xD;var myself = this;&#xD;&#xD;&#xD;&#xD;function getSensorData(callback) {&#xD;&#xD;    var getValue = function(response) {&#xD;&#xD;        sensorvalue = response.temperature;&#xD;        callback(sensorvalue);&#xD;&#xD;    };&#xD;&#xD;    console.log("sending message to chrome");&#xD;&#xD;    chrome.runtime.sendMessage(finchAppID, {&#xD;&#xD;        message: "POLL"&#xD;&#xD;    }, getValue);&#xD;&#xD;    console.log("sent message to chrome");&#xD;&#xD;};&#xD;&#xD;&#xD;&#xD;function processValue(sensorvalue) {&#xD;&#xD;    &#xD;    console.log("sensor value has been set: ", sensorvalue);&#xD;&#xD;    myself.finchDummy9 = sensorvalue;&#xD;};&#xD;&#xD;&#xD;getSensorData(processValue);&#xD;</l></block><list></list></block><block s="doWait"><l>0.01</l></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list></list><l>return this.finchDummy9;</l></block><list></list></block></block></script></block-definition><block-definition s="Finch Temperature Fahrenheit" type="reporter" category="sensing"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportSum"><block s="reportProduct"><l>1.8</l><custom-block s="Finch Temperature Celcius"></custom-block></block><l>32</l></block></block></script></block-definition></blocks><variables><variable name="PenUP"><bool>true</bool></variable><variable name="PenX"><l>64.09999999998522</l></variable><variable name="PenY"><l>38.39999999988726</l></variable></variables></project><media name="finch intermiediate 1 project " app="Snap! 5.1, http://snap.berkeley.edu" version="1"></media></snapdata>