{
  "id": "microbit",
  "nickname": "microbit",
  "name": "makecode.microbit.org",
  "title": "Microsoft MakeCode for micro:bit",
  "description": "A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.",
  "corepkg": "core",
  "bundleddirs": [
    "libs/core",
    "libs/radio",
    "libs/devices",
    "libs/bluetooth"
  ],
  "cloud": {
    "workspace": false,
    "packages": true,
    "sharing": true,
    "publishing": true,
    "preferredPackages": [
      "Microsoft/pxt-neopixel"
    ],
    "githubPackages": true
  },
  "compile": {
    "isNative": false,
    "hasHex": true,
    "deployDrives": "(MICROBIT|MBED)",
    "driveName": "MICROBIT",
    "hexMimeType": "application/x-microbit-hex",
    "openocdScript": "source [find interface/cmsis-dap.cfg]; source [find target/nrf51.cfg]",
    "flashUsableEnd": 245760,
    "flashEnd": 245760,
    "flashCodeAlign": 1024,
    "upgrades": [
      {
        "type": "package",
        "map": {
          "microbit": "core",
          "microbit-bluetooth": "bluetooth",
          "microbit-radio": "radio",
          "microbit-devices": "devices",
          "microbit-led": "",
          "microbit-music": "",
          "microbit-game": "",
          "microbit-pins": "",
          "microbit-serial": ""
        }
      },
      {
        "type": "missingPackage",
        "map": {
          "radio\\s*\\.": "radio",
          "bluetooth\\s*\\.": "bluetooth",
          "devices\\s*\\.": "devices"
        }
      },
      {
        "type": "api",
        "map": {
          "bluetooth\\s*\\.uartRead\\s*\\((.*?)\\)": "bluetooth.uartReadUntil($1)",
          "bluetooth\\s*\\.uartWrite\\s*\\((.*?)\\)": "bluetooth.uartWriteUntil($1)",
          "input\\s*\\.calibrate\\s*\\(": "input.calibrateCompass("
        }
      },
      {
        "type": "blockId",
        "map": {
          "device_get_acceleration": "device_acceleration"
        }
      },
      {
        "type": "blockValue",
        "map": {
          "device_print_message.message": "text"
        }
      }
    ],
    "hidSelectors": [
      {
        "usagePage": "0xFF00",
        "usageId": "0x0001",
        "vid": "0x0d28",
        "pid": "0x0204"
      }
    ],
    "jsRefCounting": true
  },
  "runtime": {
    "mathBlocks": true,
    "loopsBlocks": true,
    "logicBlocks": true,
    "variablesBlocks": true,
    "textBlocks": true,
    "listsBlocks": true,
    "functionBlocks": true,
    "onStartColor": "#0078D7",
    "onStartNamespace": "basic",
    "onStartWeight": 54
  },
  "simulator": {
    "autoRun": true,
    "enableTrace": true,
    "streams": false,
    "aspectRatio": 1.22,
    "parts": true,
    "partsAspectRatio": 0.69,
    "boardDefinition": {
      "visual": "microbit",
      "gpioPinBlocks": [
        [
          "P0"
        ],
        [
          "P1"
        ],
        [
          "P2"
        ],
        [
          "P3"
        ],
        [
          "P4",
          "P5",
          "P6",
          "P7"
        ],
        [
          "P8",
          "P9",
          "P10",
          "P11",
          "P12"
        ],
        [
          "P16"
        ]
      ],
      "gpioPinMap": {
        "P0": "P0",
        "P1": "P1",
        "P2": "P2",
        "P3": "P3",
        "P4": "P4",
        "P5": "P5",
        "P6": "P6",
        "P7": "P7",
        "P8": "P8",
        "P9": "P9",
        "P10": "P10",
        "P11": "P11",
        "P12": "P12",
        "P13": "P13",
        "P14": "P14",
        "P15": "P15",
        "P16": "P16",
        "P19": "P19",
        "P20": "P20"
      },
      "spiPins": {
        "MOSI": "P15",
        "MISO": "P14",
        "SCK": "P13"
      },
      "i2cPins": {
        "SDA": "P20",
        "SCL": "P19"
      },
      "analogInPins": [
        "P0",
        "P1",
        "P2",
        "P3",
        "P10"
      ],
      "groundPins": [
        "GND"
      ],
      "threeVoltPins": [
        "+3v3"
      ],
      "attachPowerOnRight": true,
      "onboardComponents": [
        "accelerometer",
        "buttonpair",
        "ledmatrix",
        "speaker",
        "bluetooth",
        "thermometer",
        "compass"
      ],
      "useCrocClips": true,
      "marginWhenBreadboarding": [
        0,
        0,
        80,
        0
      ]
    }
  },
  "compileService": {
    "yottaTarget": "bbc-microbit-classic-gcc",
    "yottaCorePackage": "microbit",
    "githubCorePackage": "lancaster-university/microbit",
    "gittag": "v2.0.0-rc11",
    "serviceId": "microbit",
    "yottaBinary": "pxt-microbit-app-combined.hex"
  },
  "serial": {
    "nameFilter": "^(mbed Serial Port|DAPLink CMSIS-DAP)",
    "log": true,
    "useEditor": true,
    "editorTheme": {
      "graphBackground": "#d9d9d9",
      "lineColors": [
        "#6633cc",
        "#3891A6",
        "#3454D1",
        "#EF767A",
        "#F46197",
        "#107C10"
      ]
    },
    "chromeExtension": "hjcflblhjoglmjjkecamiegdigfkgeni",
    "vendorId": "0x0d28",
    "productId": "0x0204",
    "rawHID": true
  },
  "appTheme": {
    "accentColor": "#5C005C",
    "logoUrl": "http://www.makeredu.net/download/",
    "logo": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE1LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIKCSBpZD0ic3ZnMiIgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28ucG9ydHJhaXQud2hpdGUuc3ZnIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIiB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKCSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9Ijg1MC4zOTVweCIKCSBoZWlnaHQ9IjExMy4zODdweCIgdmlld0JveD0iMCAwIDg1MC4zOTUgMTEzLjM4NyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgODUwLjM5NSAxMTMuMzg3IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHNvZGlwb2RpOm5hbWVkdmlldyAgaWQ9Im5hbWVkdmlldzE0IiBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNTM2IiBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4MDEiIGlua3NjYXBlOndpbmRvdy14PSItOCIgaW5rc2NhcGU6d2luZG93LXk9Ii04IiBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmcyIiBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIiBpbmtzY2FwZTpjeT0iNS43NjkxODg0IiBwYWdlY29sb3I9IiNmZjAwZmYiIGd1aWRldG9sZXJhbmNlPSIxMCIgYm9yZGVyY29sb3I9IiM2NjY2NjYiIGJvcmRlcm9wYWNpdHk9IjEiIHNob3dncmlkPSJmYWxzZSIgb2JqZWN0dG9sZXJhbmNlPSIxMCIgaW5rc2NhcGU6em9vbT0iMy42MzY3MzU1IiBpbmtzY2FwZTpjeD0iMTA2LjIyMDk0IiBncmlkdG9sZXJhbmNlPSIxMCI+Cgk8L3NvZGlwb2RpOm5hbWVkdmlldz4KPHJlY3QgaWQ9ImJhY2tncm91bmRyZWN0IiB4PSIxLjU2OSIgeT0iNC40ODUiIGZpbGw9Im5vbmUiIHdpZHRoPSI2MjIuMjQ2IiBoZWlnaHQ9IjEwOC45MDEiLz4KPHRpdGxlICBsYW5nPSJlbi1HQiIgaWQ9InRpdGxlIj5CQkMgbWljcm86Yml0PC90aXRsZT4KPGRlc2MgIGxhbmc9ImVuLUdCIiBpZD0iZGVzYyI+QkJDIG1pY3JvOmJpdCBsb2dvPC9kZXNjPgo8ZyBpZD0iZzkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjM1MDEzNTE5LDEuMjU0MDc4NikiPgoJPHRpdGxlICBpZD0idGl0bGUxMSI+TGF5ZXIgMTwvdGl0bGU+Cgk8cGF0aCBpZD0icGF0aDIxIiBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiBmaWxsPSIjRkZGRkZGIiBkPSJNMTIzLjk5NCw3MS41ODZjLTUuMzM4LDAtOS42Ni00LjM0MS05LjY2LTkuNjg1CgkJYzAtNS4zNCw0LjMxOS05LjY2Nyw5LjY2LTkuNjY3YzUuMzU5LDAsOS42NzQsNC4zMjcsOS42NzQsOS42NjdDMTMzLjY2Nyw2Ny4yNDcsMTI5LjM1Myw3MS41ODYsMTIzLjk5NCw3MS41ODYgTTUyLjk3Myw1Mi4yNDUKCQljLTUuMzM5LDAtOS42ODQsNC4zMTgtOS42ODQsOS42NThjMCw1LjM0NCw0LjMzOCw5LjY4NSw5LjY4NCw5LjY4NWM1LjMyOCwwLDkuNjYzLTQuMzQxLDkuNjYzLTkuNjg1CgkJQzYyLjYzNyw1Ni41NjMsNTguMjk4LDUyLjI0NSw1Mi45NzMsNTIuMjQ1IE01Mi45NjIsMzMuMTc2aDcxLjg2NWMxNS44NSwwLDI4LjczMywxMi44ODIsMjguNzMzLDI4LjczMgoJCWMwLDE1Ljg1Mi0xMi44ODgsMjguNzQ4LTI4LjczMywyOC43NDhINTIuOTYyYy0xNS44NDMsMC0yOC43NDQtMTIuODk5LTI4Ljc0NC0yOC43NDhDMjQuMjE1LDQ2LjA1OCwzNy4xMiwzMy4xNzYsNTIuOTYyLDMzLjE3NgoJCSBNMTI0LjgyOCwxMDkuODE3YzI2LjQxNywwLDQ3Ljg5Ni0yMS40ODcsNDcuODk2LTQ3LjkwN2MwLTI2LjQxNy0yMS40NzktNDcuOTA5LTQ3Ljg5Ni00Ny45MDlINTIuOTYzCgkJYy0yNi40MTcsMC00Ny45MDQsMjEuNDkyLTQ3LjkwNCw0Ny45MDljMCwyNi40MiwyMS40ODcsNDcuOTA3LDQ3LjkwNCw0Ny45MDdIMTI0LjgyOCBNNDgxLjY3NCwzOS45MzQKCQljMC00LjYyNS0zLjgwNS04LjM4MS04LjQ3NS04LjM4MWMtNC42MzMsMC04LjQwMiwzLjc1Ni04LjQwMiw4LjM4MWMwLDQuNjgyLDMuNzcsOC41MDYsOC40MDIsOC41MDYKCQlDNDc3Ljg2Niw0OC40NCw0ODEuNjc0LDQ0LjYxMyw0ODEuNjc0LDM5LjkzNHogTTI2OS4wNyw1Ny4yNjVjMC0xNS4xNjQtOS4yMS0yNS43NjEtMjIuMzgyLTI1Ljc2MQoJCWMtNi40NTMsMC0xMi4xNDMsMi43MS0xNi42MjYsNy44NmMtNC42NzEtNS4yODUtMTAuMDMyLTcuODYtMTYuMzE5LTcuODZjLTEzLjI0OSwwLTIyLjQ5MywxMC41OTctMjIuNDkzLDI1Ljc2MXYzMy4zMThoMTIuMTM1CgkJVjU2LjdjMC03LjY5LDQuMjUzLTEzLjA2MywxMC4zNTgtMTMuMDYzYzUuMTQ2LDAsMTAuMzQ1LDQuNDgxLDEwLjM0NSwxMy4wNjN2MzMuODg4aDEyLjI0OFY1Ni43CgkJYzAtNy42OSw0LjI2MS0xMy4wNjMsMTAuMzU0LTEzLjA2M2M1LjkzMSwwLDEwLjI0LDUuNDk2LDEwLjI0LDEzLjA2M3YzMy44ODhoMTIuMTQxVjU3LjI2NXogTTI5MS4yMDMsMzIuOTcxSDI3OC45NnY1Ny42MTVoMTIuMjQzCgkJVjMyLjk3MXogTTI5My4wMTMsMTYuNjQ4YzAtNC4zODQtMy40ODktNy44MTItNy45MzItNy44MTJjLTQuNDU4LDAtNy44MTEsMy4zNTYtNy44MTEsNy44MTJjMCw0LjQ1MSwzLjQzNCw3LjkzOSw3LjgxMSw3LjkzOQoJCVMyOTMuMDEzLDIxLjAzMSwyOTMuMDEzLDE2LjY0OHogTTM1MS4zNTQsODMuMjIybDEuODM0LTEuNjU3bC05LjAwMi04LjQ2MWwtMS41NTUsMS40NDhjLTMuOTg1LDMuNjU1LTcuOTcxLDUuMzY1LTEyLjU1Niw1LjM2NQoJCWMtOS43NTIsMC0xNy42ODktOC4xMzktMTcuNjg5LTE4LjE0M2MwLTkuOTMzLDcuOTMyLTE4LjAxNSwxNy42ODktMTguMDE1YzQuNTYxLDAsOC40MjEsMS42NTcsMTIuNTcsNS4zODhsMS42MjksMS40NjQKCQlsOC43NDgtOC45MTlsLTEuNTYxLTEuNTk4Yy01LjU4NC01LjcwNy0xMi43ODMtOC41ODMtMjEuMzg4LTguNTgzYy03LjgyOCwwLTE1LjUsMy4yNTUtMjEuMDI1LDguOTA2CgkJYy01LjUzMiw1LjUyMS04LjU2NSwxMy4xMTEtOC41NjUsMjEuMzU1YzAsOC4yNjcsMy4wMzMsMTUuODUyLDguNTQ1LDIxLjM0NGM1LjYzOCw1Ljc2OCwxMy4xMDQsOC45NDksMjEuMDU2LDguOTQ5CgkJQzMzNy43MjYsOTIuMDYsMzQ0Ljg3Niw4OS4wODYsMzUxLjM1NCw4My4yMjJ6IE0zNzQuNDMyLDYxLjEwOGMwLTEwLjU3MywzLjY0Ni0xNC45MTYsMTMuNDI0LTE2LjAwN2wyLjA0Mi0wLjIyNFYzMi43OTIKCQlsLTIuNDcyLDAuMTg0Yy0xNy45MTgsMS40NTctMjUuOTIzLDEwLjMzNS0yNS45MjMsMjguODAxdjI4LjgxM2gxMi45MjlWNjEuMTA4TDM3NC40MzIsNjEuMTA4eiBNNDQ0LjQ2Nyw4My4xNDgKCQljNS42MDctNS41OTMsOC42ODgtMTMuMTk5LDguNjg4LTIxLjM3OGMwLTguMTY0LTMuMDgtMTUuNzU4LTguNjctMjEuMzMyYy01LjYzMy01Ljc2LTEzLjA2NC04LjkzNC0yMC45NC04LjkzNAoJCWMtNy45MzIsMC0xNS40MDgsMy4xNzQtMjEuMDUxLDguOTM0Yy01LjU3Niw1LjcwNC04LjY2MywxMy4yODYtOC42NjMsMjEuMzMyYzAsOC4wNTQsMy4wODcsMTUuNjQ4LDguNjYzLDIxLjM1CgkJYzUuNjM3LDUuNzY1LDEzLjExOSw4Ljk0LDIxLjA1MSw4Ljk0QzQzMS40MjIsOTIuMDYsNDM4Ljg1OCw4OC44ODMsNDQ0LjQ2Nyw4My4xNDh6IE00NDAuNTU1LDYxLjc3MwoJCWMwLDEwLjEyNC03LjUxNiwxOC4wMzMtMTcuMTIyLDE4LjAzM2MtOS4zNzgsMC0xNy4wMTktOC4wODktMTcuMDE5LTE4LjAzM2MwLTkuOTg1LDcuNjMxLTE4LjEyNywxNy4wMTktMTguMTI3CgkJQzQzMi44NzEsNDMuNjQsNDQwLjU1NSw1MS43ODgsNDQwLjU1NSw2MS43NzN6IE00ODEuNjc0LDgyLjIwM2MwLTQuNjczLTMuODA1LTguNDg4LTguNDc1LTguNDg4Yy00LjYzMywwLTguNDAyLDMuODE1LTguNDAyLDguNDg4CgkJYzAsNC42MjYsMy43Nyw4LjM4Miw4LjQwMiw4LjM4MkM0NzcuODY2LDkwLjU4NCw0ODEuNjc0LDg2LjgyOSw0ODEuNjc0LDgyLjIwM0w0ODEuNjc0LDgyLjIwM3ogTTU0My43NjgsODMuMTQ4CgkJYzUuNjAyLTUuNTkzLDguNjkxLTEzLjE5OSw4LjY5MS0yMS4zNzhjMC04LjA0Ni0zLjEtMTUuNjMxLTguNjg5LTIxLjMzMmMtNS41NTctNS42ODgtMTIuOTg2LTguODE5LTIwLjkyNC04LjgxOQoJCWMtNi40NzksMC0xMi4yMjcsMS44MjItMTcuNDU3LDUuNTU0VjUuNTVoLTEyLjE0OGwwLjAyMyw0OS41OTljLTAuMTE3LDEuMzEtMC4xMTcsMi42MTQtMC4xMTcsMy44MTQKCQljMCwxOS40NzksMTIuMjExLDMzLjA5NSwyOS42OTksMzMuMDk1QzUzMC43MjUsOTIuMDYsNTM4LjE0Nyw4OC44ODMsNTQzLjc2OCw4My4xNDh6IE01NDAuNTQxLDYxLjg5MQoJCWMwLDkuOTQxLTcuOTM4LDE4LjAxOC0xNy42OTMsMTguMDE4Yy05LjkxNiwwLTE3LjY4Ny03LjkwNC0xNy42ODctMTguMDE4YzAtMTAuMDA0LDcuOTM3LTE4LjEzNiwxNy42ODctMTguMTM2CgkJQzUzMi42MDQsNDMuNzU1LDU0MC41NDEsNTEuODksNTQwLjU0MSw2MS44OTF6IE01NzUuMTgyLDMyLjk3MWgtMTIuMjQ2djU3LjYxNWgxMi4yNDZWMzIuOTcxeiBNNTc3LDE2LjY0OAoJCWMwLTQuMzg0LTMuNDk0LTcuODEyLTcuOTMtNy44MTJjLTQuNDU5LDAtNy44MjIsMy4zNTYtNy44MjIsNy44MTJjMCw0LjQ1MSwzLjQyMiw3LjkzOSw3LjgyMiw3LjkzOQoJCUM1NzMuNDQsMjQuNTg3LDU3NywyMS4wMzEsNTc3LDE2LjY0OHogTTYyMS4wMjQsNzkuNTQ0bC0xLjk3MS0wLjI4MmMtOS4wODgtMS4zMDMtMTMuMTU2LTYuNjk2LTEzLjE1Ni0xNy40OTJWNDUuNDUzaDE1LjEyNwoJCVYzMy43NTdoLTE1LjEyN1YyMS4wMDZoLTEyLjM3M3YxMi43NTFoLTUuMjkxdjExLjY5NWg1LjI5MXYxNC40MDVjMCwxOS43ODMsNi43MjksMjguNDMzLDI0Ljc3NSwzMS45MjZsMi43MjUsMC41MjFWNzkuNTQ0CgkJTDYyMS4wMjQsNzkuNTQ0TDYyMS4wMjQsNzkuNTQ0eiIvPgo8L2c+CjxnPgoJPGc+CgkJPGc+CgkJCTxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik02NjIuOTEyLDI3LjI2N2w2LjA0OS0xLjQ0YzAuNDc5LDEuMDU3LDAuODYzLDEuODk2LDEuMTUsMi41MjFjMC45NjEsMi4wNjMsMS41ODQsMy42LDEuODczLDQuNjA3aDI4LjA4CgkJCQl2NC42MDhINjM2LjU2di00LjYwOGgyOS4zNzVjLTAuMzM2LTAuNzY3LTAuNjIzLTEuMzkyLTAuODYzLTEuODcyQzY2NC4zMDQsMjkuNTQ5LDY2My41ODQsMjguMjc1LDY2Mi45MTIsMjcuMjY3egoJCQkJIE02ODcuMTA1LDQyLjI0M2w2LjQ4LDAuODY0bC0wLjg2NSwyLjU5MnYxMy44MjRoLTI0LjE5MWw0LjMyLDIuMTZjLTAuNTI5LDAuMzM2LTAuOTM4LDAuNjI1LTEuMjI1LDAuODYyCgkJCQljLTAuOTEyLDAuNzcxLTEuNjU2LDEuNjM0LTIuMjMyLDIuNTk0aDI3LjIxN3YyNC42MjRjLTAuNzIxLDEuMjQ3LTIuMjMsMi4wODgtNC41MzcsMi41MmMtMi4xMTEsMC4yODgtNC4xOTksMC42MDEtNi4yNjQsMC45MzgKCQkJCWMtMC4xNDMtMS4wMDktMC4yODctMS44MDEtMC40MzItMi4zNzZjLTAuNDgtMS42ODItMS4yMDEtMi45MDUtMi4xNi0zLjY3M2MwLjI4OS0wLjA0OSwwLjc0NC0wLjA3MSwxLjM2OS0wLjA3MQoJCQkJYzAuMzM0LDAsMC44NjEsMC4wMjIsMS41ODQsMC4wNzFjMC43MTksMC4wNDgsMS4yNDYsMC4wNzEsMS41ODQsMC4wNzFjMC41MjUsMCwxLjA2Ni0wLjAzNSwxLjYxOS0wLjEwNgoJCQkJYzAuNTUxLTAuMDcyLDEuMDkyLTAuMzUsMS42MTktMC44Mjh2LTE2Ljg1aC0yNC4xOTFsLTguMjA3LDkuNTA0TDY3Ny4xNyw3OC4xbC0zLjg5MS00LjMybDQuNzUyLTIuMTYKCQkJCWMxLjAxLDEuMzk0LDEuODUsMi41NDUsMi41MjEsMy40NTdjMS45NjksMi41OTIsNC4wMDgsNS4wMzksNi4xMjEsNy4zNDRsLTUuMTg2LDIuNTkzbC0yLjU5Mi0zLjQ1NgoJCQkJYy0wLjMzNiwwLTEuODM2LDAuMTQ0LTQuNSwwLjQzMnMtNS43ODUsMC42NDgtOS4zNjEsMS4wOGMtMy41NzQsMC40MzMtNy4zMDcsMC45MzgtMTEuMTkzLDEuNTEybC0xLjczLTYuMDQ4CgkJCQljMS43NzUtMC43NjgsMy4zODctMS45OSw0LjgyNC0zLjY3MmMwLjYyMy0wLjcyLDEuODk2LTIuNTIsMy44MTYtNS40aC0xNC4yNTZ2MjIuODk2aC02LjA0OVY2NS4xMzloMjIuODk2bDMuNDU1LTUuNjE2aC0yMi44OTYKCQkJCVY0Mi42NzZsNi40OCwwLjg2M2wtMC44NjMsMi4xNnY5LjkzN2gzNy41ODRWNDIuMjQzSDY4Ny4xMDV6IE02NzAuMjU4LDQ0LjQwM2MwLjYyMy0wLjM4MywxLjEyNy0wLjY5NSwxLjUxMi0wLjkzNgoJCQkJYzIuMzk4LTEuNTg0LDQuNjMxLTMuMjg4LDYuNjk1LTUuMTEybDQuMzE4LDMuNDU2Yy0wLjcxOSwwLjE5MS0xLjMxOCwwLjM1OS0xLjc5OSwwLjUwNGMtMi43ODUsMC45NjEtNS4yMDksMi4yMzEtNy4yNzEsMy44MTYKCQkJCWMxLjI0OCwwLjQzMiwyLjI3OSwwLjc5MiwzLjA5NiwxLjA3OWMyLjE2LDAuODE3LDQuMjk1LDEuNzUzLDYuNDA4LDIuODA5bC0zLjAyMywzLjg4OGMtMS4xMDQtMC44MTUtMi4wNjQtMS40NjQtMi44ODEtMS45NDQKCQkJCWMtMi41OTItMS41ODQtNS4wODgtMi44MDgtNy40ODgtMy42NzJjLTEuNTM1LDAuODE3LTIuODMyLDEuNDY2LTMuODg3LDEuOTQ0Yy0zLjQ1NywxLjYzMy02LjQ3OSwyLjg1Ni05LjA3MiwzLjY3MgoJCQkJYy0wLjMzNi0wLjYyNC0wLjY0Ni0xLjEwNC0wLjkzNi0xLjQzOWMtMC44NjUtMS4xMDQtMS44NS0xLjkxOS0yLjk1My0yLjQ0OGMwLjk2MS0wLjE0NSwxLjc3NS0wLjI2MywyLjQ0OS0wLjM2CgkJCQljMy43OTEtMC42NzIsNy4yOTUtMS43MDQsMTAuNTEyLTMuMDk2Yy0xLjM5My0wLjUyNy0yLjU2OC0wLjk1OS0zLjUyOS0xLjI5NmMtMi43ODMtMC45NTktNS40OTQtMS44MjQtOC4xMzUtMi41OTJsMi41OTItMy4wMjQKCQkJCWMxLjcyOSwwLjUyOSwzLjE0NSwwLjk4NCw0LjI0OCwxLjM2OEM2NjQuMjMyLDQyLjA3NSw2NjcuMjgxLDQzLjIwNCw2NzAuMjU4LDQ0LjQwM3oiLz4KCQkJPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTY4NS4zODYsOTMuNzk2bC0wLjA3Mi0wLjUwNmMtMC4xNDEtMC45NzktMC4yODEtMS43NjMtMC40MjItMi4zMjQKCQkJCWMtMC40NDUtMS41NTYtMS4xMTUtMi43MDUtMS45ODgtMy40MDJsLTAuODcxLTAuNjk3bDEuMTAyLTAuMTg3YzAuMzE0LTAuMDU0LDAuNzg5LTAuMDc5LDEuNDUxLTAuMDc5CgkJCQljMC4zNDIsMCwwLjg4MywwLjAyMiwxLjYxOSwwLjA3M2MwLjcwMSwwLjA0NiwxLjIxOSwwLjA2OSwxLjU0OSwwLjA2OWMwLjUwOCwwLDEuMDMxLTAuMDM1LDEuNTU3LTAuMTA0CgkJCQljMC4zOTEtMC4wNTIsMC43ODctMC4yMzksMS4xODQtMC41NjNWNjkuOTU5aC0yMy40NjVsLTcuMjk3LDguNDVsMTYuMzU5LTAuNzZsLTMuNjQxLTQuMDQzbDUuNzQ2LTIuNjExbDAuMjQsMC4zMzEKCQkJCWMxLjAwOCwxLjM5MiwxLjg0NiwyLjU0MiwyLjUxOCwzLjQ1M2MxLjk0NywyLjU2NCwzLjk5Niw1LjAyMyw2LjA4Niw3LjMwM2wwLjQ0NywwLjQ4OGwtNi4xNDgsMy4wNzVsLTIuNjg2LTMuNTc5CgkJCQljLTAuNDY3LDAuMDMxLTEuNjAyLDAuMTM3LTQuMjA1LDAuNDE4Yy0yLjY2LDAuMjg4LTUuNzc5LDAuNjQ4LTkuMzU0LDEuMDc5Yy0zLjU1MywwLjQzLTcuMzE0LDAuOTM4LTExLjE4MiwxLjUxbC0wLjQzNCwwLjA2NAoJCQkJbC0xLjk3MS02Ljg5M2wwLjQwNC0wLjE3NGMxLjY5OS0wLjczNSwzLjI2Mi0xLjkyNiw0LjY0My0zLjUzOGMwLjU1My0wLjYzOSwxLjY0OC0yLjE3NiwzLjI2LTQuNTc1aC0xMi44MTh2MjIuODk2aC03LjA1MQoJCQkJVjY0LjYzOWgyMy4xMTdsMi44NDItNC42MTZoLTIyLjUwMlY0Mi4xMDRsNy42ODQsMS4wMjNsLTEuMDY2LDIuNjY3djkuMzQxaDM2LjU4NFY0MS42NzJsNy42NDYsMS4wMjFsLTEuMDMxLDMuMDg5djE0LjI0MwoJCQkJaC0yMi41NzRsMy4yMTcsMS42MDhsLTAuNzQ0LDAuNDc0Yy0wLjUwNCwwLjMxOS0wLjg5OCwwLjU5OC0xLjE3NCwwLjgyNmMtMC42MTcsMC41Mi0xLjE1OCwxLjA5Mi0xLjYxNSwxLjcwOGgyNi43Nzl2MjUuMjU4CgkJCQlsLTAuMDY2LDAuMTE2Yy0wLjc5MywxLjM3NC0yLjQzNiwyLjMwNC00Ljg3NywyLjc2MWMtMi4xNDYsMC4yOTQtNC4yNSwwLjYwOC02LjI3NSwwLjkzOEw2ODUuMzg2LDkzLjc5NnogTTY4NC4zNDcsODcuNgoJCQkJYzAuNjQxLDAuNzkzLDEuMTQ1LDEuODMyLDEuNTEsMy4xMDRjMC4xMjcsMC41MDgsMC4yNTIsMS4xNTUsMC4zNzEsMS45MzljMS44ODEtMC4zMDMsMy44Mi0wLjU5MSw1Ljc3Ny0wLjg1NwoJCQkJYzIuMDQ3LTAuMzg1LDMuNDM0LTEuMTEyLDQuMTA0LTIuMTY0VjY1LjYzOWgtMjcuNmwwLjQ1NS0wLjc1N2MwLjYwMi0xLjAwNCwxLjM4OS0xLjkxNywyLjMzOC0yLjcyCgkJCQljMC4xNTYtMC4xMjgsMC4zNC0wLjI2OCwwLjU1My0wLjQxOGwtMy41NTEtMS43NzRsMC4yMjUtMC45NDdoMjMuNjkxbDAuMDI1LTEzLjQ4MmwwLjY3NC0yLjAxOWwtNS4zMTQtMC43MDh2MTMuMzIxaC0zOC41ODQKCQkJCWwwLjAzNS0xMC42MjJsMC42MjUtMS41NjRsLTUuMjc3LTAuNzAzdjE1Ljc3NmgyMy4yOTFsLTQuMDcsNi42MTZoLTIyLjY3NnYyNi4yMTZoNS4wNDlWNjguOTU5aDE1LjY4OWwtMC41MTgsMC43NzcKCQkJCWMtMS45NDksMi45MjItMy4yMDksNC43MDUtMy44NTUsNS40NWMtMS4zNjksMS42MDEtMi45MTgsMi44MTctNC42MDIsMy42MjJsMS40ODgsNS4yMTJjMy43MjUtMC41NDcsNy4zNDYtMS4wMzUsMTAuNzc1LTEuNDQ5CgkJCQljMy41NzgtMC40MzMsNi42OTktMC43OTMsOS4zNjUtMS4wODFjNC4wMi0wLjQzNSw0LjQyMi0wLjQzNSw0LjU1NS0wLjQzNWgwLjI1bDIuNDksMy4zMjFsNC4yMjEtMi4xMDgKCQkJCWMtMS45NTUtMi4xNjQtMy44NzMtNC40NzktNS43MDMtNi44OTFjLTAuNjIzLTAuODQ1LTEuMzg1LTEuODg5LTIuMjg3LTMuMTM2bC0zLjc2LDEuNzA5bDQuMTQxLDQuNTk5bC0yMC43OTMsMC45NjcKCQkJCWw5LjExNy0xMC41NTloMjQuOTJ2MTcuNTdsLTAuMTY0LDAuMTQ4Yy0wLjYwNCwwLjU0OC0xLjIzOCwwLjg2Ny0xLjg5MSwwLjk1M2MtMC41NjYsMC4wNzQtMS4xMzMsMC4xMTEtMS42ODYsMC4xMTEKCQkJCWMtMC4zNDQsMC0wLjg4MS0wLjAyMy0xLjYxNS0wLjA3MkM2ODUuMjU0LDg3LjYxMSw2ODQuNzI2LDg3LjU5NCw2ODQuMzQ3LDg3LjZ6IE02ODAuMjg3LDU0LjU5OWwtMC4zOTMtMC4yOQoJCQkJYy0xLjA4NC0wLjgwMS0yLjAzOS0xLjQ0Ni0yLjgzNi0xLjkxNmMtMi40ODItMS41MTgtNC45LTIuNzExLTcuMTk3LTMuNTU4Yy0xLjQ1MywwLjc3MS0yLjcwMywxLjM5NC0zLjcxOSwxLjg1NAoJCQkJYy0zLjQ1MSwxLjYzMS02LjUyNSwyLjg3NS05LjEyOSwzLjY5NGwtMC4zOTUsMC4xMjRsLTAuMTk1LTAuMzY0Yy0wLjMxOC0wLjU5Mi0wLjYxMy0xLjA0Ni0wLjg3NS0xLjM1MwoJCQkJYy0wLjgyNi0xLjA1NC0xLjc2LTEuODMtMi43ODktMi4zMjJsLTEuNDY5LTAuNzA0bDEuNjA5LTAuMjQyYzAuOTYxLTAuMTQ1LDEuNzc3LTAuMjYzLDIuNDUxLTAuMzYKCQkJCWMzLjI3MS0wLjU4LDYuMzczLTEuNDQ1LDkuMjIzLTIuNTc4Yy0wLjg4My0wLjMyOS0xLjY2LTAuNjExLTIuMzMyLTAuODQ3Yy0yLjc2OC0wLjk1NC01LjQ5OC0xLjgyMy04LjEwOS0yLjU4M2wtMC43NDQtMC4yMTYKCQkJCWwzLjMwOS0zLjg2MmwwLjMxMywwLjA5NmMxLjcyOSwwLjUyOSwzLjE2NiwwLjk5Miw0LjI2NiwxLjM3NGMzLjAyMSwxLjAyMiw2LjAyNSwyLjEzMyw4LjkzNCwzLjI5OQoJCQkJYzAuNTIzLTAuMzIyLDAuOTU3LTAuNTksMS4yOTUtMC44MDJjMi4zMjQtMS41MzUsNC41MjctMy4yMTMsNi41MzctNC45NzloLTQxLjk4di01LjYwOGgyOS4xMDcKCQkJCWMtMC4yMDMtMC40NDYtMC4zODUtMC44My0wLjU0My0xLjE0N2MtMC43NTQtMS41MDgtMS40NzEtMi43NzQtMi4xMjktMy43NjNsLTAuMzk4LTAuNTk4bDcuMTQ4LTEuNzAybDAuMTcsMC4zNzUKCQkJCWMwLjQ3OSwxLjA1NiwwLjg2MSwxLjg5NSwxLjE1LDIuNTE4YzAuODcxLDEuODc1LDEuNDU5LDMuMjkzLDEuNzg3LDQuMzE2aDI4LjIxMXY1LjYwOEg2NzguOWw0Ljk2OSwzLjk3NmwtMC45NTcsMC4yNTUKCQkJCWMtMC43MTMsMC4xOTEtMS4zMDksMC4zNTctMS43ODMsMC41Yy0yLjM3MSwwLjgxOS00LjUxLDEuODg4LTYuMzU0LDMuMTc4YzAuODU1LDAuMjk3LDEuNTg4LDAuNTUzLDIuMTk5LDAuNzY5CgkJCQljMi4xNywwLjgyMSw0LjM0MiwxLjc3Miw2LjQ2NSwyLjgzM2wwLjU0NywwLjI3Mkw2ODAuMjg3LDU0LjU5OXogTTY1NC40MzEsNTAuMzA5YzAuNjg0LDAuNDk4LDEuMzE2LDEuMTE3LDEuODkxLDEuODUxCgkJCQljMC4yNDIsMC4yODEsMC41MDIsMC42NjEsMC43ODEsMS4xNDdjMi40NzctMC44MDYsNS4zNzMtMS45OSw4LjYxOS0zLjUyM2MxLjA0OS0wLjQ3NiwyLjM0OC0xLjEyNSwzLjg2Ny0xLjkzM2wwLjE5NS0wLjEwNAoJCQkJbDAuMjA3LDAuMDc1YzIuNDI0LDAuODcyLDQuOTc1LDIuMTIyLDcuNTgsMy43MTVjMC43MjUsMC40MjYsMS41NzIsMC45OTEsMi41MjMsMS42ODJsMi4zNS0zLjAyMQoJCQkJYy0xLjkxOC0wLjkzNy0zLjg3MS0xLjc4Mi01LjgxMy0yLjUxN2MtMC44MDctMC4yODQtMS44MzgtMC42NDUtMy4wODQtMS4wNzVsLTAuODc1LTAuMzA0bDAuNzM0LTAuNTY1CgkJCQljMi4wOTQtMS42MDcsNC41ODgtMi45MTcsNy40MTItMy44OTJjMC4yNjYtMC4wOCwwLjU2MS0wLjE2NSwwLjg4NS0wLjI1NmwtMy4yMjctMi41NzljLTEuOTgyLDEuNzI3LTQuMTQ1LDMuMzY1LTYuNDM2LDQuODc3CgkJCQljLTAuMzk2LDAuMjQ4LTAuOSwwLjU2LTEuNTI1LDAuOTQzbC0wLjIxNSwwLjEzMmwtMC4yMzItMC4wOTRjLTIuOTY1LTEuMTkzLTYuMDMxLTIuMzI5LTkuMTE5LTMuMzc0CgkJCQljLTEuMDIzLTAuMzU1LTIuMzQyLTAuNzgyLTMuOTItMS4yNjhsLTEuODc3LDIuMTg4YzIuNDAyLDAuNzExLDQuODk1LDEuNTEyLDcuNDE2LDIuMzgxYzAuOTY3LDAuMzM5LDIuMTQ2LDAuNzcyLDMuNTQzLDEuMzAyCgkJCQlsMS4xNTIsMC40MzdsLTEuMTMxLDAuNDljLTMuMjM0LDEuNC02LjgxMSwyLjQ1NC0xMC42MjMsMy4xMjlDNjU1LjE4MSw1MC4xOTksNjU0LjgyMiw1MC4yNTIsNjU0LjQzMSw1MC4zMDl6IE02MzcuMDYsMzcuMDYzCgkJCQloNjIuNTA0di0zLjYwOGgtMjcuOTU3bC0wLjEwNC0wLjM2MmMtMC4yNzktMC45NzgtMC45LTIuNTAyLTEuODQ2LTQuNTM0Yy0wLjI1NC0wLjU1LTAuNTgyLTEuMjY3LTAuOTgyLTIuMTQ5bC00Ljk2MSwxLjE4MgoJCQkJYzAuNTcyLDAuOTE2LDEuMTc2LDIuMDEyLDEuODA1LDMuMjdjMC4yNDQsMC40ODYsMC41MzUsMS4xMTksMC44NzUsMS44OTVsMC4zMDcsMC43MDFINjM3LjA2VjM3LjA2M3oiLz4KCQk8L2c+CgkJPGc+CgkJCTxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik03MDkuNTY4LDg3Ljc0N2wtMi4zMDMtNi42OTRjMi45MjYtMC4zODUsNS4zMjgtMC43NDMsNy4xOTktMS4wOGM1LjY2NC0xLjAxLDEwLjg3My0yLjI3OSwxNS42MjUtMy44MTUKCQkJCWwxLjg3MSw1LjMyN2MtMi45NzksMC42MjQtNS40MjQsMS4xNTItNy4zNDYsMS41ODRDNzE5LjA0OSw4NC40MTIsNzE0LjAzMyw4NS45Nyw3MDkuNTY4LDg3Ljc0N3ogTTcxMS40NDEsNzMuNDIKCQkJCWMtMC4yODktMC43NjgtMC41MDQtMS4zOTMtMC42NDYtMS44NzNjLTAuNTI5LTEuNDg1LTEuMTA1LTIuODA3LTEuNzMtMy45NTljMy4yMTctMS4xMDQsNi4yNC0zLjYwMSw5LjA3Mi03LjQ4NwoJCQkJYzEuOTY5LTIuODMyLDMuNDU3LTQuOTY4LDQuNDY1LTYuNDA4Yy0xLjU4NCwwLjA0OC0yLjg4MSwwLjA5Ny0zLjg4OSwwLjE0NGMtMy4wMjMsMC4yNDEtNS43NjIsMC42NDgtOC4yMDcsMS4yMjUKCQkJCWMtMC4xNDYtMC43NjgtMC4yNjYtMS40MTUtMC4zNjEtMS45NDRjLTAuMzM2LTEuMzQzLTAuODQtMi44MDgtMS41MTItNC4zOTJjMi4xNi0xLjM5Myw0LjAzMy0zLjMxMyw1LjYxNy01Ljc2MQoJCQkJYzEuMjk1LTIuMDE2LDIuNTItNC41ODIsMy42NzItNy43MDNjMC4zODMtMS4wMDksMS4zMTgtMy44NjMsMi44MDctOC41NjhsOC40MjQsMi43MzZjLTIuMDYzLDEuNjgxLTQuMDMxLDQuMDMxLTUuOTAyLDcuMDU2CgkJCQljLTIuNjg5LDQuNDE3LTUuMzc3LDguODA5LTguMDY0LDEzLjE3Nmw5Ljc5My0wLjUwNGMwLjUyNy0wLjkxMiwwLjk1OS0xLjY4LDEuMjk1LTIuMzA0YzEuMDU3LTIuMDE3LDEuODczLTMuOTM2LDIuNDQ5LTUuNzYKCQkJCWw2LjQ3OSw0LjAzMWMtMi4yMDksMi4wMTctNC40NjUsNC43MDUtNi43NjgsOC4wNjRjLTUuNzEzLDguMzUyLTguODgxLDEyLjg2NC05LjUwNCwxMy41MzZjMS40ODYtMC4xNDUsMi43MzYtMC4yNjQsMy43NDQtMC4zNgoJCQkJYzIuODc5LTAuMzM1LDUuNjYyLTAuODE0LDguMzUyLTEuNDM4bDAuNDM0LDQuNDY0Yy0yLjY0MywwLjM4NS00LjgwMywwLjcyLTYuNDgsMS4wMDgKCQkJCUM3MTkuODQsNzEuMzA4LDcxNS4zMjgsNzIuMzE2LDcxMS40NDEsNzMuNDJ6IE03MzAuMTYsODcuMDI3YzAuMTkxLDAsMS4yNDgtMC4zODUsMy4xNy0xLjE1MQoJCQkJYzIuNTQzLTEuMDA5LDUuMDg4LTIuMjA4LDcuNjMzLTMuNjAxYzMuNDU1LTEuODcyLDYuNTUxLTMuOTM3LDkuMjg3LTYuMTkxYy0wLjY3NC0xLjU4NC0xLjIwMS0yLjkyOC0xLjU4NC00LjAzMQoJCQkJYy0xLjIwMS0zLjQwNy0xLjk2OS02LjYyNC0yLjMwNS05LjY0OGMtMS4zNDQsMC4zMzctMi40NDcsMC42MjQtMy4zMTMsMC44NjRjLTIuNCwwLjY3My00LjcwNSwxLjQxNi02LjkxMiwyLjIzMWwtMS4yOTUtNS42ODgKCQkJCWMxLjM0Mi0wLjE0NSwyLjQ0Ny0wLjI2MywzLjMxMS0wLjM2YzIuMjA3LTAuMjg4LDQuODAxLTAuNzY3LDcuNzc3LTEuNDM4Yy0wLjA5OC0xLjE1Mi0wLjE5My0yLjQ3My0wLjI4OS0zLjk2CgkJCQlzLTAuMTQzLTMuMjQtMC4xNDMtNS4yNTdsLTguNDk2LDEuNzI5bC0xLjI5Ny01LjI1Nmw5Ljc5My0wLjkzN1YyNi4yNjFsNi4wNDcsMC45MzZsLTAuODYzLDIuMTZ2MTQuMTEKCQkJCWMxLjQzOC0wLjE5MSwyLjYzOS0wLjM2LDMuNi0wLjUwNWM1LjY2Mi0wLjg2MywxMC41ODQtMS44NzEsMTQuNzYyLTMuMDIzbDEuMjk1LDUuMzI4Yy0yLjQ0NywwLjI0MS00LjQ4OCwwLjQ1Ny02LjExOSwwLjY0NwoJCQkJYy00Ljk5NCwwLjU3Ni05LjUwNCwxLjIyNS0xMy41MzcsMS45NDRjMCwxLjEwNCwwLjAxMiwyLjI0NSwwLjAzNywzLjQyYzAuMDIxLDEuMTc2LDAuMTU0LDIuOTg4LDAuMzk1LDUuNDM3CgkJCQljMi40OTYtMC41NzYsNC41NjEtMS4wNTYsNi4xOTMtMS40NGM0Ljg0OC0xLjE1Miw5LjE5MS0yLjMwNCwxMy4wMzEtMy40NTZsMS43MjksNS43NmMtMS40ODgsMC4xOTItMi43MzYsMC4zNi0zLjc0NCwwLjUwNAoJCQkJYy01Ljg1NSwwLjg2NC0xMS40NDcsMS44NzItMTYuNzc1LDMuMDI0YzAuMTkxLDEuNDg4LDAuMzU5LDIuNjg4LDAuNTA0LDMuNmMwLjUyNywyLjgzNCwxLjM0NCw1LjQ0OSwyLjQ0OSw3Ljg1CgkJCQljMS4yNDYtMS4yOTYsMi4yNTQtMi4zNzYsMy4wMjEtMy4yNGMyLjM1NC0yLjczNSw0LjM0NC01LjQ3Miw1Ljk3OS04LjIwOGw1Ljk3NSwzLjk2Yy0xLjQ4OCwxLjUzNy0yLjczNiwyLjgwOC0zLjc0NCwzLjgxNgoJCQkJYy0yLjkyOCwyLjk3Ny01LjgwOSw1LjgwOC04LjYzOSw4LjQ5NGMwLjkxLDEuNDg5LDEuNzI3LDIuNjQyLDIuNDQ3LDMuNDU3YzIuMTU4LDIuNDk2LDQuNjA3LDQuNDE1LDcuMzQ0LDUuNzYxCgkJCQljMC42MjMtMC45NjEsMS4wMDgtMi40ODQsMS4xNS00LjU3MmMwLjE0Ni0yLjA4OCwwLjMzNi0zLjQ2NywwLjU3Ni00LjE0YzAuNjIzLDAuNzIsMS4xMjksMS4yNzEsMS41MTQsMS42NTQKCQkJCWMxLjI0NiwxLjIwMSwyLjU5MiwyLjA4OCw0LjAzMSwyLjY2NGMtMC41NzYsMi4xNi0xLjEyOSw0LjMyLTEuNjU0LDYuNDhjLTAuOTE0LDIuNTQ0LTIuMzU0LDQuMTk5LTQuMzIsNC45NjgKCQkJCWMtMi4zNTQtMS4yLTQuMjAxLTIuMjgtNS41NDUtMy4yNGMtNC4wOC0yLjg4LTcuMjI1LTYuMTktOS40MzQtOS45MzZjLTAuNzY4LDAuNTc2LTEuNTEyLDEuMTUtMi4yMywxLjcyOAoJCQkJYy0yLjI1NiwxLjcyOS00LjIyNSwzLjE2OC01LjkwNCw0LjMyYy0zLjA3MiwyLjExMS01LjkwMiwzLjg4OC04LjQ5Niw1LjMyOGMtMC42MjMtMC45MTItMS4xNS0xLjYwOC0xLjU4NC0yLjA4OAoJCQkJQzczMy41NDUsODguMzIzLDczMS45MzUsODcuNDExLDczMC4xNiw4Ny4wMjd6IE03NTUuMzYxLDMxLjE1NWw0LjY4Mi0yLjY2NGMwLjUyNSwxLjAwOCwwLjk4LDEuODI1LDEuMzY1LDIuNDQ4CgkJCQljMS4wNTcsMS43NzYsMi4xODYsMy42LDMuMzg3LDUuNDcybC01LjE4NiwzLjA5N2MtMC40OC0xLjI5Ny0wLjg2My0yLjMwNS0xLjE1LTMuMDI0CgkJCQlDNzU3LjQ5NiwzNC4yNzYsNzU2LjQ2NSwzMi41LDc1NS4zNjEsMzEuMTU1eiIvPgoJCQk8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNzY4LjE1LDk0LjE5OWwtMC4yMDEtMC4xMDNjLTIuMzYzLTEuMjA3LTQuMjUyLTIuMzEyLTUuNjA1LTMuMjc4Yy0zLjk0My0yLjc4Mi03LjA2NC02LjAxNC05LjI4My05LjYwOQoJCQkJYy0wLjYwNywwLjQ2Mi0xLjIwMSwwLjkyNC0xLjc3NywxLjM4NmMtMi4yNTYsMS43MjgtNC4yNSwzLjE4Ny01LjkzNCw0LjM0MmMtMy4wNzQsMi4xMTItNS45NDUsMy45MTMtOC41MzcsNS4zNTRsLTAuMzk2LDAuMjIyCgkJCQlsLTAuMjYtMC4zNzZjLTAuNjA5LTAuODk1LTEuMTI5LTEuNTc4LTEuNTQxLTIuMDM1Yy0xLjM0Ni0xLjM0Ny0yLjg4Ny0yLjIyMi00LjU1OS0yLjU4M2wwLjEwNS0wLjk4OAoJCQkJYzAuMDY4LTAuMDE0LDAuNTctMC4xNTMsMi45OC0xLjExNWMyLjUyMS0xLDUuMDctMi4yMDIsNy41NzgtMy41NzVjMy4yOTMtMS43ODMsNi4yOTMtMy43NjksOC45MjItNS45MDIKCQkJCWMtMC42MDctMS40NDUtMS4wOTYtMi42OTQtMS40NDktMy43MThjLTEuMTMzLTMuMjExLTEuODkzLTYuMy0yLjI2Mi05LjE4OGMtMS4wOTIsMC4yNzYtMi4wMSwwLjUxNy0yLjc0OCwwLjcyMgoJCQkJYy0yLjM4NywwLjY2OS00LjY5OSwxLjQxNi02Ljg3MywyLjIyMWwtMC41MzUsMC4xOTdsLTEuNTQ3LTYuNzkzbDAuNTYxLTAuMDZjMS4zNDItMC4xNDQsMi40NDUtMC4yNjMsMy4zMDktMC4zNgoJCQkJYzIuMDcyLTAuMjcsNC41MjktMC43MTksNy4yOTktMS4zMzVjLTAuMDg2LTEuMDQ5LTAuMTctMi4yMjctMC4yNTQtMy41MzVjLTAuMDg2LTEuMzI1LTAuMTMzLTIuODk2LTAuMTQzLTQuNjc3bC04LjM2NywxLjcwMgoJCQkJbC0xLjMzMi01LjM5NmMtMi4wOTQsMS45NTctNC4yNjYsNC41NjQtNi40NTUsNy43NThjLTQuNTU3LDYuNjYxLTcuNDYxLDEwLjgzNC04LjgwNSwxMi42NDRsMi41ODYtMC4yNDkKCQkJCWMyLjgzLTAuMzI5LDUuNjIxLTAuODExLDguMjg1LTEuNDI5bDAuNTU3LTAuMTI5bDAuNTMzLDUuNTA2bC0wLjQ3MywwLjA2OWMtMi42OTcsMC4zOTMtNC44MTQsMC43MjItNi40NjcsMS4wMDYKCQkJCWMtNS4wOTYsMC45MDQtOS42MzUsMS45MTktMTMuNDg0LDMuMDEzbC0wLjQ0MywwLjEyNWwtMC4xNi0wLjQzMWMtMC4yOTEtMC43NzItMC41MTItMS40MTMtMC42Ni0xLjkwNQoJCQkJYy0wLjUxLTEuNDMzLTEuMDgtMi43NDEtMS42ODgtMy44NjRsLTAuMjgxLTAuNTJsMC41NTktMC4xOTFjMy4xMDItMS4wNjMsNi4wNzItMy41MjIsOC44My03LjMxMQoJCQkJYzEuNjE5LTIuMzMsMi45MTYtNC4xOTIsMy44ODktNS41ODJjLTEuMTM5LDAuMDM4LTIuMSwwLjA3NS0yLjg4NSwwLjExMWMtMi45NzUsMC4yMzctNS43MTEsMC42NDYtOC4xMTUsMS4yMTJsLTAuNTEsMC4xMTkKCQkJCWwtMC4wOTgtMC41MTRjLTAuMTQ1LTAuNzY5LTAuMjY2LTEuNDE4LTAuMzYxLTEuOTQ4Yy0wLjMyLTEuMjgtMC44Mi0yLjczMy0xLjQ3OS00LjI4NmwtMC4xNjQtMC4zODhsMC4zNTQtMC4yMjgKCQkJCWMyLjA5LTEuMzQ3LDMuOTMtMy4yMzQsNS40NjctNS42MTFjMS4yNy0xLjk3NCwyLjQ4OC00LjUzMywzLjYyMy03LjYwNWMwLjM4MS0xLDEuMzItMy44NzMsMi44MDEtOC41NDZsMC4xNS0wLjQ3OWw5Ljc3NSwzLjE3NgoJCQkJbC0wLjcxMSwwLjU4Yy0yLjAxNCwxLjYzOS0zLjk2MywzLjk3LTUuNzk1LDYuOTMxYy0yLjUyMSw0LjE0My01LjA0Myw4LjI2NS03LjU2NCwxMi4zNjVsOC41Ny0wLjQ0CgkJCQljMC40NjMtMC44MDUsMC44NDgtMS40ODksMS4xNTItMi4wNTdjMS4wMzctMS45NzksMS44NS0zLjg5LDIuNDEyLTUuNjc0bDAuMTkzLTAuNjE1bDcuMTUsNC40NWw5LjQwOC0wLjg5OXYtMTguMmw3LjI0NiwxLjEyMQoJCQkJbC0xLjA2MywyLjY1M3YxMy40NDJjMS4xODgtMC4xNiwyLjE5NS0wLjMwMywzLjAyNS0wLjQyOGM1LjYxMy0wLjg1NiwxMC41NjEtMS44NywxNC43MDEtMy4wMTJsMC40OTYtMC4xMzdsMS41NTUsNi4zODkKCQkJCWwtMC41NzIsMC4wNTdjLTIuNDQ1LDAuMjM5LTQuNDgyLDAuNDU2LTYuMTExLDAuNjQ2Yy00Ljc4NywwLjU1Mi05LjE4OSwxLjE4MS0xMy4wOTQsMS44NjZjMC4wMDIsMC45NywwLjAxNCwxLjk2NywwLjAzNSwyLjk5MQoJCQkJYzAuMDIxLDEuMDY1LDAuMTM1LDIuNjg4LDAuMzQsNC44MzFjMi4yNDYtMC41Miw0LjEyNS0wLjk1Niw1LjYzNS0xLjMxM2M0LjgxNC0xLjE0NCw5LjE4OS0yLjMwNCwxMy4wMDItMy40NDdsMC40OC0wLjE0NQoJCQkJbDIuMDQxLDYuODAzbC0wLjU4NCwwLjA3NmMtMS40ODYsMC4xOTItMi43MzIsMC4zNTktMy43MzgsMC41MDNjLTUuNjU4LDAuODM1LTExLjEzNywxLjgxNy0xNi4yOTEsMi45MgoJCQkJYzAuMTY2LDEuMjc0LDAuMzE0LDIuMzE4LDAuNDQzLDMuMTNjMC40NjUsMi41MDcsMS4xNzQsNC44NzQsMi4xMDcsNy4wNDRjMS4wMDYtMS4wNTQsMS44NDQtMS45NTUsMi40OTQtMi42ODgKCQkJCWMyLjMxNi0yLjY5NCw0LjMxMy01LjQzMyw1LjkyMi04LjEzMmwwLjI3LTAuNDVsNi45MTQsNC41ODJsLTAuNDE4LDAuNDMyYy0xLjQ5LDEuNTM5LTIuNzQsMi44MTMtMy43NSwzLjgyMgoJCQkJYy0yLjgwNywyLjg1Mi01LjYxNSw1LjYxOC04LjM1NSw4LjIyNWMwLjgwNSwxLjI4OSwxLjUzOSwyLjMxMywyLjE4NiwzLjA0M2MxLjk5NCwyLjMwOSw0LjI3LDQuMTMyLDYuNzcsNS40MzEKCQkJCWMwLjQ0Ny0wLjg5OSwwLjczNC0yLjIyNSwwLjg1Mi0zLjk0NWMwLjE1LTIuMTU1LDAuMzQ4LTMuNTUzLDAuNjA1LTQuMjcybDAuMjg3LTAuODA4bDAuNTYxLDAuNjQ3CgkJCQljMC42MTMsMC43MDcsMS4xMTMsMS4yNTUsMS40ODgsMS42MjhjMS4xODYsMS4xNDMsMi40ODgsMi4wMDQsMy44NjMsMi41NTVsMC40MTIsMC4xNjRsLTAuMTEzLDAuNDI5CgkJCQljLTAuNTcyLDIuMTQ2LTEuMTI5LDQuMzIzLTEuNjU0LDYuNDcxYy0wLjk3NSwyLjcyNS0yLjUyMyw0LjQ5Ni00LjYyMyw1LjMxNEw3NjguMTUsOTQuMTk5eiBNNzUzLjM0Nyw3OS43NGwwLjI4MywwLjQ4MQoJCQkJYzIuMTYyLDMuNjY1LDUuMjg3LDYuOTU2LDkuMjkxLDkuNzhjMS4yNzcsMC45MTMsMy4wNTMsMS45NTUsNS4yNzcsMy4xYzEuNzE1LTAuNzQ2LDMuMDAyLTIuMjg4LDMuODI2LTQuNTg3CgkJCQljMC40NzktMS45NjgsMC45OTYtNC4wMDQsMS41MzEtNi4wMjFjLTEuMzQ0LTAuNTk5LTIuNjE1LTEuNDcxLTMuNzgzLTIuNTk1Yy0wLjI1Ni0wLjI1NC0wLjU1OS0wLjU3Ni0wLjkwOC0wLjk2NgoJCQkJYy0wLjEyOSwwLjczMy0wLjI0LDEuNzc4LTAuMzM0LDMuMTI0Yy0wLjE1LDIuMTkxLTAuNTU1LDMuNzY2LTEuMjMsNC44MTFsLTAuMjQyLDAuMzcybC0wLjM5OC0wLjE5NQoJCQkJYy0yLjc4My0xLjM2OC01LjMwOS0zLjM0OC03LjUwMi01Ljg4MmMtMC43MzQtMC44MzUtMS41NzYtMi4wMjEtMi40OTYtMy41MjJsLTAuMjExLTAuMzQ2bDAuMjkzLTAuMjc3CgkJCQljMi44MjQtMi42ODIsNS43MjktNS41MzUsOC42MjktOC40ODNjMC45MTItMC45MTQsMi4wMi0yLjAzOSwzLjMyMi0zLjM4MmwtNS4wMzktMy4zMzljLTEuNTkyLDIuNjAzLTMuNTI1LDUuMjMzLTUuNzU2LDcuODI5CgkJCQljLTAuNzczLDAuODcxLTEuNzk3LDEuOTY2LTMuMDQzLDMuMjYxbC0wLjUwOCwwLjUyN2wtMC4zMDctMC42NjVjLTEuMTE3LTIuNDI0LTEuOTUzLTUuMTA0LTIuNDg0LTcuOTY2CgkJCQljLTAuMTQ4LTAuOTI4LTAuMzE2LTIuMTM0LTAuNTEtMy42MjlsLTAuMDU5LTAuNDU0bDAuNDQ5LTAuMDk4YzUuMzA3LTEuMTQ3LDEwLjk2MS0yLjE2NywxNi44MDktMy4wMwoJCQkJYzAuODc3LTAuMTI1LDEuOTMyLTAuMjY4LDMuMTY4LTAuNDI5bC0xLjQxNC00LjcxOGMtMy43MTcsMS4xMDMtNy45NDUsMi4yMTktMTIuNTgyLDMuMzJjLTEuNjM1LDAuMzg1LTMuNjk5LDAuODY0LTYuMTk1LDEuNDQKCQkJCWwtMC41NTUsMC4xMjhsLTAuMDU3LTAuNTY1Yy0wLjIzOC0yLjQ0OS0wLjM3My00LjI5MS0wLjM5Ni01LjQ3NmMtMC4wMjUtMS4xNzgtMC4wMzUtMi4zMjEtMC4wMzUtMy40M3YtMC40MThsMC40MTItMC4wNzQKCQkJCWM0LjAyMy0wLjcxOSw4LjU5LTEuMzc0LDEzLjU2NC0xLjk0OGMxLjUwNi0wLjE3NywzLjM1Ny0wLjM3NCw1LjU1Ny0wLjU5MmwtMS4wMzctNC4yN2MtNC4wNzQsMS4wOTctOC44ODksMi4wNzEtMTQuMzIyLDIuODk5CgkJCQljLTAuOTYzLDAuMTQ2LTIuMTY2LDAuMzE0LTMuNjA3LDAuNTA2bC0wLjU2NiwwLjA3NWwwLjAzNy0xNC44NjlsMC42MjktMS41NzZsLTQuODUtMC43NXYxNy45NDNsLTkuNjY4LDAuOTI0bDEuMDQzLDQuMjI5CgkJCQlsOC42MjUtMS43NTR2MC42MTFjMCwyLjAxMywwLjA0OSwzLjc3LDAuMTQzLDUuMjI1YzAuMDk2LDEuNDg0LDAuMTkxLDIuODAxLDAuMjg3LDMuOTVsMC4wMzcsMC40MzRsLTAuNDI0LDAuMDk2CgkJCQljLTIuOTc1LDAuNjcxLTUuNjA1LDEuMTU5LTcuODIyLDEuNDQ4Yy0wLjc0OCwwLjA4NC0xLjY3LDAuMTg2LTIuNzY2LDAuMzAybDEuMDQ3LDQuNTg2YzIuMDQzLTAuNzM4LDQuMTk3LTEuNDI4LDYuNDE2LTIuMDQ5CgkJCQljMC44NjUtMC4yNDEsMS45NzUtMC41MjgsMy4zMjItMC44NjhsMC41NTctMC4xMzlsMC4wNjMsMC41NjhjMC4zMywyLjk3NywxLjEsNi4xODYsMi4yNzksOS41MzgKCQkJCWMwLjM3NywxLjA4NSwwLjkwNiwyLjQzMSwxLjU3Miw0LjAwM2wwLjE0NiwwLjM0NGwtMC4yODksMC4yMzdjLTIuNzQ4LDIuMjY2LTUuODk4LDQuMzY1LTkuMzY3LDYuMjQ1CgkJCQljLTIuNTQ1LDEuMzkyLTUuMTMxLDIuNjExLTcuNjg4LDMuNjI2Yy0wLjcxOSwwLjI4Ni0xLjI3NywwLjUwNS0xLjcxMywwLjY3YzEuMjczLDAuNTE3LDIuNDU5LDEuMzE4LDMuNTM5LDIuMzk4CgkJCQljMC40LDAuNDQ0LDAuODUyLDEuMDI2LDEuMzgzLDEuNzgzYzIuNDU5LTEuMzg3LDUuMTY4LTMuMDk1LDguMDYxLTUuMDgyYzEuNjctMS4xNDYsMy42NDgtMi41OTQsNS44ODUtNC4zMDUKCQkJCWMwLjcxNS0wLjU3MywxLjQ2My0xLjE1MSwyLjIzNC0xLjczTDc1My4zNDcsNzkuNzR6IE03MDkuNzcxLDY3Ljg2YzAuNTMzLDEuMDQ3LDEuMDMzLDIuMjI4LDEuNDkyLDMuNTE5CgkJCQljMC4xMTksMC4zOTcsMC4yODEsMC44NzQsMC40ODYsMS40MzZjMy43ODUtMS4wNTQsOC4yMDEtMi4wMzMsMTMuMTM5LTIuOTFjMS41NjYtMC4yNjksMy41NDEtMC41NzcsNi4wMjUtMC45NDFsLTAuMzMyLTMuNDI1CgkJCQljLTIuNTMxLDAuNTY2LTUuMTcsMS4wMTItNy44NTIsMS4zMjNsLTUuMDYzLDAuNDg3bDAuODk1LTAuOTY0YzAuNjAyLTAuNjQ5LDMuNzgzLTUuMTg1LDkuNDU3LTEzLjQ3OQoJCQkJYzIuMTQ4LTMuMTM0LDQuMjg3LTUuNzIyLDYuMzYxLTcuNzAybC01LjM4NS0zLjM1MWMtMC41NjYsMS42NjMtMS4zMzIsMy40MTktMi4yODEsNS4yM2MtMC4zNCwwLjYzNC0wLjc3NSwxLjQwNi0xLjMwNywyLjMyMwoJCQkJbC0wLjEzNywwLjIzNWwtMTEuMDEyLDAuNTY2bDAuNS0wLjgxMWMyLjY4OC00LjM2Niw1LjM3My04Ljc1OCw4LjA2My0xMy4xNzRjMS42ODYtMi43MjQsMy40NzUtNC45MzgsNS4zMjYtNi41OTdsLTcuMDk2LTIuMzA1CgkJCQljLTEuMzk2LDQuNDA4LTIuMjkzLDcuMTM3LTIuNjY0LDguMTE1Yy0xLjE1OCwzLjEzNi0yLjQxLDUuNzYtMy43MTksNy43OTZjLTEuNTMxLDIuMzY2LTMuMzU0LDQuMjc0LTUuNDE2LDUuNjc4CgkJCQljMC42LDEuNDU3LDEuMDYxLDIuODI4LDEuMzc1LDQuMDgzYzAuMDc4LDAuNDMyLDAuMTY4LDAuOTEzLDAuMjcxLDEuNDYxYzIuMzI4LTAuNTE4LDQuOTM5LTAuODk0LDcuNzcxLTEuMTE5CgkJCQljMS4wMjUtMC4wNDgsMi4zMjYtMC4wOTcsMy45MTItMC4xNDZsMC45OTgtMC4wM2wtMC41NzIsMC44MTdjLTEuMDA4LDEuNDM5LTIuNDk2LDMuNTc2LTQuNDYzLDYuNDA3CgkJCQlDNzE1LjgxOCw2NC4xMzIsNzEyLjg3MSw2Ni42MzksNzA5Ljc3MSw2Ny44NnogTTcwOS4yNjcsODguNDA1bC0yLjY3NC03Ljc3bDAuNjA1LTAuMDhjMi45MjQtMC4zODQsNS4zNC0wLjc0NSw3LjE3OC0xLjA3NgoJCQkJYzUuNjI3LTEuMDAyLDEwLjg1OS0yLjI4LDE1LjU1OS0zLjc5OWwwLjQ2NS0wLjE1bDIuMjIzLDYuMzI1bC0wLjU1OSwwLjExN2MtMi45NzUsMC42MjMtNS40MiwxLjE1LTcuMzM4LDEuNTgzCgkJCQljLTUuNTIsMS4zMzItMTAuNTU5LDIuODk4LTE0Ljk3Myw0LjY1NUw3MDkuMjY3LDg4LjQwNXogTTcwNy45MzcsODEuNDY4bDEuOTM2LDUuNjIyYzQuMzM4LTEuNjk1LDkuMjU2LTMuMjEzLDE0LjYyNy00LjUxCgkJCQljMS44MDktMC40MDUsNC4wNy0wLjg5Niw2LjgwMS0xLjQ3bC0xLjUyMS00LjMzYy00LjYxOSwxLjQ2Ny05LjczOCwyLjcwNS0xNS4yMjUsMy42ODMKCQkJCUM3MTIuODI4LDgwLjc3NCw3MTAuNjA1LDgxLjExMSw3MDcuOTM3LDgxLjQ2OHogTTc1OS4zNDksNDAuMjQ0bC0wLjIwOS0wLjU2M2MtMC40OC0xLjI5MS0wLjg2MS0yLjI5NS0xLjE0OC0zLjAxNAoJCQkJYy0wLjkzMi0yLjE0MS0xLjk0Ny0zLjg5NC0zLjAxOC01LjE5NGwtMC4zNzctMC40NThsNS42NDYtMy4yMTRsMC4yNCwwLjQ1OWMwLjUzMywxLjAyLDAuOTc1LDEuODExLDEuMzUsMi40MTcKCQkJCWMxLjA1NSwxLjc3MiwyLjE4OSwzLjYwOCwzLjM4MSw1LjQ2NWwwLjI3NywwLjQzNUw3NTkuMzQ5LDQwLjI0NHogTTc1Ni4xMTMsMzEuMzAyYzAuOTkyLDEuMzEzLDEuOTM0LDIuOTg0LDIuODAzLDQuOTgKCQkJCWMwLjI1MiwwLjYyNywwLjU2NiwxLjQ1MywwLjk1MSwyLjQ4Nmw0LjIyOS0yLjUyM2MtMS4wOTYtMS43MTctMi4xNDUtMy40MTUtMy4xMTUtNS4wNTJjLTAuMzI0LTAuNTI1LTAuNzAxLTEuMTg4LTEuMTM5LTIuMDEzCgkJCQlMNzU2LjExMywzMS4zMDJ6Ii8+CgkJPC9nPgoJCTxnPgoJCQk8cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNODAwLjg2NSw0Ni45OTVoNi4wNDl2NC43NTJoLTE4LjE0NXY4LjIwOGgxMy4zOTF2MjguNTE0aC01LjE4NFY2NC43MDdoLTguMjA3YzAsMC41MjksMCwwLjk4NCwwLDEuMzY5CgkJCQljMCwzLjY5Ni0wLjI4OSw3LjI5Ni0wLjg2NSwxMC43OTljLTAuOTYxLDUuOTUzLTIuNjg4LDExLjI1Ny01LjE4NCwxNS45MTJsLTQuNzUyLTIuNTkyYzAuMDk2LDAsMC41NzYtMS4xMjgsMS40MzktMy4zODQKCQkJCWMxLjA1Ny0yLjczNiwxLjk0My01LjY4OCwyLjY2NC04Ljg1NmMxLjAxLTQuNDE1LDEuNTE0LTguNTQzLDEuNTE0LTEyLjM4M1YyOC40MTlsNi4wNDcsMC44NjRsLTAuODYzLDIuNTkydjE1LjEyaDYuOTEyVjI1LjgyNwoJCQkJbDYuMDQ3LDAuODY0bC0wLjg2MywyLjE2VjQ2Ljk5NUw4MDAuODY1LDQ2Ljk5NXogTTgzMy4wNDksNzguMTcyYzEuNTg0LDEuNTg1LDIuOTI4LDIuODMyLDQuMDMzLDMuNzQ0CgkJCQljMy40NTUsMi43ODMsNi45NTksNC43MjgsMTAuNTEyLDUuODMxYy0wLjgxOCwwLjQ3OS0xLjQ2NSwwLjkxMi0xLjk0NSwxLjI5N2MtMS40MzgsMS4xOTktMi40OTYsMi42NjQtMy4xNjgsNC4zOTMKCQkJCWMtMS4wNTctMC42NzMtMS45Mi0xLjI3Mi0yLjU5Mi0xLjhjLTQuMDgtMy4wNzItNy40MTYtNi4yNjYtMTAuMDA4LTkuNTc2Yy0xLjUzNywxLjc3NS0yLjg1NSwzLjE2OC0zLjk1OSw0LjE3NgoJCQkJYy0zLjM2MSwzLjEyLTYuNzcsNS41MjEtMTAuMjI3LDcuMmMtMC4zMzYtMC43Mi0wLjY3Mi0xLjI3Mi0xLjAwOC0xLjY1NmMtMS4wNTctMS4xNTEtMi40MjQtMS45Mi00LjEwNC0yLjMwNAoJCQkJYzIuMzA1LTAuOTEyLDQuMTc2LTEuNzUzLDUuNjE1LTIuNTIxYzQuMzItMi4zOTksNy45NjktNS4zMjgsMTAuOTQzLTguNzgzYy0wLjA5NiwwLTAuNi0xLjAwOC0xLjUxMi0zLjAyMwoJCQkJYy0xLjI0OC0yLjY4OC0yLjMwNS01LjMwNC0zLjE2OC03Ljg0OWMtMS4yOTUtMy43OTEtMi4yMzItNy40MzktMi44MDktMTAuOTQzbDQuMzItMC44NjRjMC40NzksMi41OTIsMC45MSw0LjY4LDEuMjk1LDYuMjY1CgkJCQljMS4yNDgsNC44NDksMi43ODMsOS4wMjMsNC42MDksMTIuNTI2YzAuMDk2LDAsMC41MjUtMS4wMDgsMS4yOTUtMy4wMjJjMS4wMDgtMi41OTMsMS44MjQtNS4zMDUsMi40NDktOC4xMzgKCQkJCWMwLjkxLTQuMDc5LDEuMzY1LTcuOTE5LDEuMzY1LTExLjUyaC0xNy43MTF2MTIuNmMtMC4yODksMS43MjktMC41NTMsMy40NTctMC43OTMsNS4xODZjLTAuODE0LDQuMDgtMS45NDEsNy45NDMtMy4zODMsMTEuNTkyCgkJCQljLTEuOTY5LDQuOTQzLTQuMzY5LDguOTI4LTcuMjAxLDExLjk1MmMtMC42MjMtMC4zODYtMS4xNS0wLjY5Ni0xLjU4NC0wLjkzOGMtMS4zOTMtMC43NjgtMi42ODgtMS4zMTktMy44ODctMS42NTQKCQkJCWMwLjMzNCwwLDEuMzE4LTEuMDA5LDIuOTUxLTMuMDI0YzIuMjU2LTIuNzg0LDQuMDgtNS44NTUsNS40NzMtOS4yMTZjMS45NjctNC44NDksMi45NTEtMTAuMDU2LDIuOTUxLTE1LjYyNFYzMS45NDcKCQkJCWMwLjM4NSwwLDAuNzIxLDAsMS4wMDgsMGMzLjU1MywwLDcuMjI1LTAuMTksMTEuMDE4LTAuNTc2YzYuMzM2LTAuNjIzLDExLjg4MS0xLjc1MSwxNi42MzMtMy4zODRsMy45NTksNi45ODQKCQkJCWMtMy4xNjgsMC03LjgwMSwwLjMtMTMuODk2LDAuODk5Yy02LjA5NiwwLjYwMi0xMC41MTIsMC45LTEzLjI0OCwwLjl2MTAuMDA4aDIzLjYxN2MtMC4xOTEsMS43NzYtMC4zNTksMy41NTMtMC41MDQsNS4zMjgKCQkJCWMtMC41NzYsNC42MDgtMS4zMiw4LjcxMi0yLjIzMiwxMi4zMTNDODM2Ljg2NSw2OS42MDMsODM1LjE2LDc0LjE4Nyw4MzMuMDQ5LDc4LjE3MnoiLz4KCQkJPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTg0Mi43MjYsOTQuMTg0bC0wLjUxNC0wLjMyN2MtMS4wNjQtMC42NzgtMS45NTEtMS4yOTMtMi42MzMtMS44MjgKCQkJCWMtMy44OTUtMi45MzItNy4xNjItNi4wMjEtOS43MTctOS4xODhjLTEuMzc5LDEuNTcxLTIuNTksMi44MzctMy42MDUsMy43NjRjLTMuMzc1LDMuMTM1LTYuODU3LDUuNTg2LTEwLjM0Miw3LjI4bC0wLjQ1NywwLjIyMwoJCQkJbC0wLjIxNS0wLjQ2Yy0wLjMxNC0wLjY3My0wLjYyOS0xLjE5MS0wLjkzNC0xLjUzOWMtMC45NzUtMS4wNjMtMi4yNjgtMS43ODctMy44MzgtMi4xNDZsLTEuMzI2LTAuMzAzCgkJCQljLTAuOTA4LDEuMzI4LTEuODY3LDIuNTM0LTIuODc3LDMuNjEzbC0wLjI3OSwwLjI5OWwtMC4zNS0wLjIxNWMtMC42MTUtMC4zOC0xLjEzNy0wLjY4OC0xLjU2My0wLjkyNQoJCQkJYy0xLjM1NS0wLjc0Ny0yLjYyNy0xLjI4OS0zLjc3OS0xLjYxMWwwLjEzNS0wLjk4YzAuMDIxLTAuMDIxLDAuMjM4LTAuMTYzLDAuODg5LTAuODcyaC00Ljg0NlY2NS4yMDdoLTcuMjA3djAuODY5CgkJCQljMCwzLjcwNi0wLjI5Myw3LjM2Ny0wLjg3MSwxMC44OGMtMC45NjUsNS45NzktMi43MjcsMTEuMzg1LTUuMjM2LDE2LjA2N2wtMC4yMzYsMC40NDNsLTUuMTk1LTIuODMzbDAuMTM3LTAuNTM0bC0wLjI1Ni0wLjIzOAoJCQkJYzAuMDY0LTAuMDk0LDAuMzI0LTAuNTk1LDEuMzMyLTMuMjI5YzEuMDQzLTIuNzA2LDEuOTM0LTUuNjYzLDIuNjQ1LTguNzg4YzAuOTk0LTQuMzU3LDEuNS04LjQ4NiwxLjUtMTIuMjcyVjI3Ljg0NGw3LjIxMSwxLjAzCgkJCQlsLTEuMDI3LDMuMDgzdjE0LjUzOGg1LjkxMlYyNS4yNWw3LjI0OCwxLjAzNmwtMS4wNjQsMi42NjF2MTcuNTQ4aDYuMDQ5djUuNzUyaC0xOC4xNDV2Ny4yMDhoMTMuMzkzdjI3Ljk1OAoJCQkJYzAuMTA1LTAuMTMxLDAuMjE5LTAuMjY4LDAuMzM2LTAuNDEyYzIuMjE1LTIuNzMyLDQuMDI5LTUuNzkyLDUuMzk2LTkuMDkzYzEuOTM2LTQuNzYzLDIuOTE0LTkuOTU2LDIuOTE0LTE1LjQzM1YzMS40NDdoMS41MDgKCQkJCWMzLjUyNSwwLDcuMjE1LTAuMTkzLDEwLjk2Ny0wLjU3NGM2LjI3LTAuNjE1LDExLjgyNi0xLjc0NywxNi41MjEtMy4zNThsMC4zOTMtMC4xMzZsNC41ODgsOC4wOTNoLTAuODU3CgkJCQljLTMuMTM1LDAtNy43OTMsMC4zMDItMTMuODQ4LDAuODk2Yy01LjcyMywwLjU2My0xMC4wMjEsMC44NjYtMTIuNzk5LDAuODk5djkuMDExaDIzLjY3NGwtMC4wNjEsMC41NTQKCQkJCWMtMC4xODksMS43NjMtMC4zNTksMy41NTEtMC41MDIsNS4zMTRjLTAuNTc4LDQuNjI4LTEuMzM0LDguNzkxLTIuMjQ2LDEyLjM5NWMtMS4yNjQsNS4wNTUtMi45MzgsOS42MDYtNC45OCwxMy41MzUKCQkJCWMxLjQ1OSwxLjQ0OSwyLjcxNSwyLjYxLDMuNzM0LDMuNDUyYzMuMzg3LDIuNzI3LDYuODY1LDQuNjU4LDEwLjM0NCw1LjczOWwxLjA4LDAuMzM2bC0wLjk3NywwLjU3MwoJCQkJYy0wLjc4OSwwLjQ2Mi0xLjQyNCwwLjg4NS0xLjg4NSwxLjI1NWMtMS4zNTksMS4xMzQtMi4zNzcsMi41NDMtMy4wMTYsNC4xODRMODQyLjcyNiw5NC4xODR6IE04MTIuMDc2LDg5LjQxMgoJCQkJYzEuMTY2LDAuNDYsMi4xNjQsMS4xNCwyLjk4LDIuMDI5YzAuMjk1LDAuMzM4LDAuNTg0LDAuNzgsMC44NjcsMS4zMjNjMy4yNDgtMS42NDMsNi40OTQtMy45Niw5LjY1OC02Ljg5NgoJCQkJYzEuMDg0LTAuOTkxLDIuNDAyLTIuMzgyLDMuOTIyLTQuMTM3bDAuMzk2LTAuNDU5bDAuMzczLDAuNDc4YzIuNTU1LDMuMjY0LDUuODkxLDYuNDU0LDkuOTE2LDkuNDg1CgkJCQljMC41NTUsMC40MzYsMS4yNDQsMC45MjMsMi4wNjEsMS40NTZjMC43MDUtMS41NjMsMS43MzgtMi45MTYsMy4wNzgtNC4wMzJjMC4zMDUtMC4yNDQsMC42Ny0wLjUwNCwxLjA5Mi0wLjc3NwoJCQkJYy0zLjI1NC0xLjE2MS02LjQ5Ni0zLjAzNC05LjY1Mi01LjU3NmMtMS4xMDktMC45MTYtMi40NzktMi4xODgtNC4wNzItMy43OGwtMC4yNjItMC4yNjFsMC4xNzQtMC4zMjcKCQkJCWMyLjA4NC0zLjkzMSwzLjc4OS04LjUyMSw1LjA2OC0xMy42MzljMC45MDItMy41NjUsMS42NDgtNy42ODgsMi4yMjEtMTIuMjU0YzAuMTI3LTEuNTY4LDAuMjc3LTMuMTc1LDAuNDQzLTQuNzY2aC0yMy41NjEKCQkJCVYzNi4yNzFoMC41YzIuNzE1LDAsNy4xNTQtMC4zMDIsMTMuMTk5LTAuODk3YzUuNTYzLTAuNTQ3LDkuOTU5LTAuODQ4LDEzLjA5Mi0wLjg5NmwtMy4zMzgtNS44ODUKCQkJCWMtNC42ODIsMS41NjYtMTAuMTgyLDIuNjY5LTE2LjM1MiwzLjI3NGMtMy43ODMsMC4zODQtNy41MDgsMC41NzktMTEuMDY0LDAuNTc5aC0wLjUwOHYzMC4wMjhjMCw1LjYwNS0xLjAwNiwxMC45MjctMi45OSwxNS44MTMKCQkJCWMtMS40MDQsMy4zOTQtMy4yNyw2LjUzNC01LjU0NSw5LjM0MmMtMC40MjgsMC41MjYtMC43OTUsMC45NjktMS4xMTMsMS4zMzdsLTAuMDAyLDAuMDAyYy0wLjQ2OSwwLjU0MS0wLjgzLDAuOTI3LTEuMTE3LDEuMjAxCgkJCQljMC45NTMsMC4zNDIsMS45NjUsMC44MDcsMy4wMjEsMS4zODljMC4zNTUsMC4xOTYsMC43NzEsMC40NCwxLjI1NCwwLjczMmMyLjY1Ni0yLjkzLDQuOTUxLTYuNzk1LDYuODI0LTExLjQ5NgoJCQkJYzEuNDItMy41OTcsMi41NTEtNy40NjgsMy4zNTctMTEuNTA1YzAuMjM2LTEuNzA5LDAuNTA0LTMuNDU4LDAuNzg5LTUuMTY5bC0wLjAwOC0xMy4wMThoMTguNzEzdjAuNQoJCQkJYzAsMy42Mi0wLjQ2NSw3LjUzMi0xLjM3OSwxMS42MjljLTAuNjI5LDIuODQ2LTEuNDYxLDUuNjA4LTIuNDcxLDguMjA5Yy0xLjI3NSwzLjM0Mi0xLjM1LDMuMzQyLTEuNzYyLDMuMzQyaC0wLjMwNQoJCQkJbC0wLjE0MS0wLjI2OWMtMS44MzItMy41MTgtMy4zOTUtNy43NjktNC42NDgtMTIuNjM1Yy0wLjM1OS0xLjQ4Mi0wLjc2OC0zLjQzLTEuMjA5LTUuNzk5bC0zLjM1LDAuNjY5CgkJCQljMC41NzQsMy4zMTgsMS40ODQsNi44MTEsMi43MDcsMTAuMzg3YzAuODU1LDIuNTIxLDEuOTE0LDUuMTQ0LDMuMTQ4LDcuOGMwLjgwOSwxLjc4NiwxLjE1NiwyLjQ3MywxLjMwNywyLjczNGgwLjg0NAoJCQkJbC0wLjcxMywwLjgyNmMtMy4wMDIsMy40ODQtNi43MjksNi40NzgtMTEuMDgsOC44OTZDODE1LjI2Nyw4OC4wMTgsODEzLjgwNCw4OC42OTUsODEyLjA3Niw4OS40MTJ6IE03NzguNjYsOTAuMDAzbDMuODU1LDIuMTA0CgkJCQljMi4zMzItNC40ODEsMy45OC05LjYzLDQuODk2LTE1LjMxMmMwLjU2OC0zLjQ2MSwwLjg1Ny03LjA2NSwwLjg1Ny0xMC43MTl2LTEuODY5aDkuMjA3djIzLjc2Mmg0LjE4NFY2MC40NTVoLTEzLjM5MXYtOS4yMDgKCQkJCWgxOC4xNDV2LTMuNzUyaC02LjA0OWwwLjAzNS0xOC44M2wwLjYyOS0xLjU2OWwtNC44NDgtMC42OTJ2MjEuMDkyaC03LjkxMmwwLjAyNS0xNS43NzdsMC42NzQtMi4wMjNsLTQuODgzLTAuNjk4djM2LjU3NgoJCQkJYzAsMy44NjEtMC41MTQsOC4wNjQtMS41MjUsMTIuNDk0Yy0wLjcyMSwzLjE3Mi0xLjYyNSw2LjE3NS0yLjY4Niw4LjkyNUM3NzkuMjY3LDg4LjU3Nyw3NzguOTA4LDg5LjQ4NCw3NzguNjYsOTAuMDAzegoJCQkJIE04MTcuNzgxLDUyLjEwM3YxMi4xYy0wLjI5MSwxLjc4NS0wLjU1NywzLjUyNC0wLjc5Nyw1LjI1NGMtMC44MjQsNC4xMjUtMS45NzMsOC4wNTUtMy40MTQsMTEuNzA2CgkJCQljLTEuMjQ2LDMuMTMxLTIuNjgsNS45MDItNC4yODEsOC4yODlsMS4xMTMtMC40NGMyLjI3MS0wLjg5OSw0LjE0NS0xLjczOSw1LjU2My0yLjQ5N2M0LjExNy0yLjI4Nyw3LjY2NC01LjEwNCwxMC41NDUtOC4zNzMKCQkJCWMtMC4yNTgtMC40NDctMC42NDYtMS4yNzEtMS4zMzItMi43ODdjLTEuMjQ4LTIuNjg1LTIuMzItNS4zNDItMy4xODgtNy44OTZjLTEuMjk5LTMuNzk5LTIuMjUtNy41MDgtMi44MjYtMTEuMDIxbC0wLjA3OC0wLjQ3OAoJCQkJbDUuMjkxLTEuMDU4bDAuMDkyLDAuNDk5YzAuNDc3LDIuNTc4LDAuOTEsNC42NzYsMS4yOTEsNi4yMzdjMS4xMjksNC4zODksMi41MTYsOC4yNjgsNC4xMjMsMTEuNTQKCQkJCWMwLjE3OC0wLjQyOCwwLjQzOS0xLjA4NCwwLjgyOC0yLjA5N2MwLjk5Mi0yLjU1NiwxLjgwOS01LjI2OSwyLjQyNi04LjA2NWMwLjg1Ny0zLjgzOCwxLjMxMy03LjUwNiwxLjM1NC0xMC45MTJMODE3Ljc4MSw1Mi4xMDMKCQkJCUw4MTcuNzgxLDUyLjEwM3oiLz4KCQk8L2c+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==",
    "docsLogo": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgcm9sZT0iaW1nIgogICBhcmlhLWxhYmVsbGVkYnk9InRpdGxlICBkZXNjIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyODAgMzIuNzU1IgogICB2aWV3Qm94PSIwIDAgNTIuNjcyMDAxIDUyLjY3MjAwMSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28uc3F1YXJlLndoaXRlLnN2ZyI+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmMDBmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNTM2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjgwMSIKICAgICBpZD0ibmFtZWR2aWV3MTQiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjIuMDgzNjIzMyIKICAgICBpbmtzY2FwZTpjeD0iODMuMzkwNDkzIgogICAgIGlua3NjYXBlOmN5PSIxNi4wNzExNDQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiIC8+PHJlY3QKICAgICBpZD0iYmFja2dyb3VuZHJlY3QiCiAgICAgd2lkdGg9IjE5NS40NzM2OCIKICAgICBoZWlnaHQ9IjM0LjIxMDUyNiIKICAgICB4PSIwIgogICAgIHk9IjE4LjQ2MTQ3MyIKICAgICBjbGFzcz0iIgogICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOm5vbmUiIC8+PHRpdGxlCiAgICAgaWQ9InRpdGxlIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0PC90aXRsZT48ZGVzYwogICAgIGlkPSJkZXNjIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0IGxvZ288L2Rlc2M+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMzciPjxyZGY6cmRmPjxjYzp3b3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlIC8+PC9jYzp3b3JrPjwvcmRmOnJkZj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT5CQkMgbWljcm86Yml0PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM1IiAvPjxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBjbGFzcz0iIgogICAgIGQ9Im0gMzcuMzYzLDI5LjM3NyBjIC0xLjY3NywwIC0zLjAzNSwtMS4zNjQgLTMuMDM1LC0zLjA0MiAwLC0xLjY3OCAxLjM1NywtMy4wMzggMy4wMzUsLTMuMDM4IDEuNjg0LDAgMy4wMzksMS4zNiAzLjAzOSwzLjAzOCAwLDEuNjc4IC0xLjM1NSwzLjA0MiAtMy4wMzksMy4wNDIgTSAxNS4wNTIsMjMuMyBjIC0xLjY3NywwIC0zLjA0MiwxLjM1NyAtMy4wNDIsMy4wMzUgMCwxLjY3OCAxLjM2MywzLjA0MiAzLjA0MiwzLjA0MiAxLjY3NCwwIDMuMDM2LC0xLjM2NCAzLjAzNiwtMy4wNDIgMCwtMS42NzggLTEuMzYzLC0zLjAzNSAtMy4wMzYsLTMuMDM1IG0gLTAuMDAzLC01Ljk5IDIyLjU3NiwwIGMgNC45NzksMCA5LjAyNyw0LjA0NyA5LjAyNyw5LjAyNyAwLDQuOTc5IC00LjA0OSw5LjAzMSAtOS4wMjcsOS4wMzEgbCAtMjIuNTc2LDAgYyAtNC45NzcsMCAtOS4wMjk5OTkzLC00LjA1MyAtOS4wMjk5OTkzLC05LjAzMSBDIDYuMDE4MDAwNywyMS4zNTcgMTAuMDcyLDE3LjMxIDE1LjA0OSwxNy4zMSBtIDIyLjU3NiwyNC4wNzYgYyA4LjI5OSwwIDE1LjA0NywtNi43NSAxNS4wNDcsLTE1LjA0OSAwLC04LjI5OSAtNi43NDgsLTE1LjA1MSAtMTUuMDQ3LC0xNS4wNTEgbCAtMjIuNTc2LDAgQyA2Ljc1MDAwMDcsMTEuMjg2IDYuOTI1MDQ4OGUtNywxOC4wMzggNi45MjUwNDg4ZS03LDI2LjMzNyA2LjkyNTA0ODhlLTcsMzQuNjM2IDYuNzUwMDAwNyw0MS4zODYgMTUuMDQ5LDQxLjM4NiBsIDIyLjU3NiwwIgogICAgIGlkPSJwYXRoMjEiCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3NjY3Nzc2Njc3Nzc2NjY3Nzc3NzYyIgLz48L3N2Zz4=",
    "portraitLogo": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgcm9sZT0iaW1nIgogICBhcmlhLWxhYmVsbGVkYnk9InRpdGxlICBkZXNjIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyODAgMzIuNzU1IgogICB2aWV3Qm94PSIwIDAgNTIuNjcyMDAxIDUyLjY3MjAwMSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28uc3F1YXJlLndoaXRlLnN2ZyI+PHNvZGlwb2RpOm5hbWVkdmlldwogICAgIHBhZ2Vjb2xvcj0iI2ZmMDBmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxIgogICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxNTM2IgogICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjgwMSIKICAgICBpZD0ibmFtZWR2aWV3MTQiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOnpvb209IjIuMDgzNjIzMyIKICAgICBpbmtzY2FwZTpjeD0iODMuMzkwNDkzIgogICAgIGlua3NjYXBlOmN5PSIxNi4wNzExNDQiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy15PSItOCIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgogICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzIiIC8+PHJlY3QKICAgICBpZD0iYmFja2dyb3VuZHJlY3QiCiAgICAgd2lkdGg9IjE5NS40NzM2OCIKICAgICBoZWlnaHQ9IjM0LjIxMDUyNiIKICAgICB4PSIwIgogICAgIHk9IjE4LjQ2MTQ3MyIKICAgICBjbGFzcz0iIgogICAgIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOm5vbmUiIC8+PHRpdGxlCiAgICAgaWQ9InRpdGxlIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0PC90aXRsZT48ZGVzYwogICAgIGlkPSJkZXNjIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0IGxvZ288L2Rlc2M+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMzciPjxyZGY6cmRmPjxjYzp3b3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlIC8+PC9jYzp3b3JrPjwvcmRmOnJkZj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT5CQkMgbWljcm86Yml0PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM1IiAvPjxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBjbGFzcz0iIgogICAgIGQ9Im0gMzcuMzYzLDI5LjM3NyBjIC0xLjY3NywwIC0zLjAzNSwtMS4zNjQgLTMuMDM1LC0zLjA0MiAwLC0xLjY3OCAxLjM1NywtMy4wMzggMy4wMzUsLTMuMDM4IDEuNjg0LDAgMy4wMzksMS4zNiAzLjAzOSwzLjAzOCAwLDEuNjc4IC0xLjM1NSwzLjA0MiAtMy4wMzksMy4wNDIgTSAxNS4wNTIsMjMuMyBjIC0xLjY3NywwIC0zLjA0MiwxLjM1NyAtMy4wNDIsMy4wMzUgMCwxLjY3OCAxLjM2MywzLjA0MiAzLjA0MiwzLjA0MiAxLjY3NCwwIDMuMDM2LC0xLjM2NCAzLjAzNiwtMy4wNDIgMCwtMS42NzggLTEuMzYzLC0zLjAzNSAtMy4wMzYsLTMuMDM1IG0gLTAuMDAzLC01Ljk5IDIyLjU3NiwwIGMgNC45NzksMCA5LjAyNyw0LjA0NyA5LjAyNyw5LjAyNyAwLDQuOTc5IC00LjA0OSw5LjAzMSAtOS4wMjcsOS4wMzEgbCAtMjIuNTc2LDAgYyAtNC45NzcsMCAtOS4wMjk5OTkzLC00LjA1MyAtOS4wMjk5OTkzLC05LjAzMSBDIDYuMDE4MDAwNywyMS4zNTcgMTAuMDcyLDE3LjMxIDE1LjA0OSwxNy4zMSBtIDIyLjU3NiwyNC4wNzYgYyA4LjI5OSwwIDE1LjA0NywtNi43NSAxNS4wNDcsLTE1LjA0OSAwLC04LjI5OSAtNi43NDgsLTE1LjA1MSAtMTUuMDQ3LC0xNS4wNTEgbCAtMjIuNTc2LDAgQyA2Ljc1MDAwMDcsMTEuMjg2IDYuOTI1MDQ4OGUtNywxOC4wMzggNi45MjUwNDg4ZS03LDI2LjMzNyA2LjkyNTA0ODhlLTcsMzQuNjM2IDYuNzUwMDAwNyw0MS4zODYgMTUuMDQ5LDQxLjM4NiBsIDIyLjU3NiwwIgogICAgIGlkPSJwYXRoMjEiCiAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZiIKICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3NjY3Nzc2Njc3Nzc2NjY3Nzc3NzYyIgLz48L3N2Zz4=",
    "footerLogo": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgcm9sZT0iaW1nIgogICBhcmlhLWxhYmVsbGVkYnk9InRpdGxlICBkZXNjIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyODAgMzIuNzU1IgogICBoZWlnaHQ9IjM0LjIxMDUyNjEwNDQ0ODk0NSIKICAgd2lkdGg9IjE5NS40NzM2ODQ3Mzg4Nzc2NCIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0ic3ZnMiIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC45MSByMTM3MjUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28ucG9ydHJhaXQuYmxhY2suc3ZnIj48c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmYwMGZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncmlkdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE1MzYiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODAxIgogICAgIGlkPSJuYW1lZHZpZXcxNCIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iMy42MzY3MzU1IgogICAgIGlua3NjYXBlOmN4PSIxMDYuMjIwOTQiCiAgICAgaW5rc2NhcGU6Y3k9IjUuNzY5MTg4NCIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iLTgiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9Ii04IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIgLz48cmVjdAogICAgIGlkPSJiYWNrZ3JvdW5kcmVjdCIKICAgICB3aWR0aD0iMTAwJSIKICAgICBoZWlnaHQ9IjEwMCUiCiAgICAgeD0iMCIKICAgICB5PSIwIgogICAgIGZpbGw9Im5vbmUiCiAgICAgc3Ryb2tlPSJub25lIgogICAgIGNsYXNzPSIiIC8+PHRpdGxlCiAgICAgaWQ9InRpdGxlIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0PC90aXRsZT48ZGVzYwogICAgIGlkPSJkZXNjIgogICAgIGxhbmc9ImVuLUdCIj5CQkMgbWljcm86Yml0IGxvZ288L2Rlc2M+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhMzciPjxyZGY6cmRmPjxjYzp3b3JrCiAgICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlIC8+PC9jYzp3b3JrPjwvcmRmOnJkZj48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT5CQkMgbWljcm86Yml0PC9kYzp0aXRsZT48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczM1IiAvPjxwYXRoCiAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICBjbGFzcz0iIgogICAgIGQ9Im0gMzguMzQ5MzM5LDIxLjQ3Mzc2MyBjIC0xLjY3NywwIC0zLjAzNSwtMS4zNjQgLTMuMDM1LC0zLjA0MiAwLC0xLjY3OCAxLjM1NywtMy4wMzggMy4wMzUsLTMuMDM4IDEuNjg0LDAgMy4wMzksMS4zNiAzLjAzOSwzLjAzOCAwLDEuNjc4IC0xLjM1NSwzLjA0MiAtMy4wMzksMy4wNDIgbSAtMjIuMzExLC02LjA3NyBjIC0xLjY3NywwIC0zLjA0MiwxLjM1NyAtMy4wNDIsMy4wMzUgMCwxLjY3OCAxLjM2MywzLjA0MiAzLjA0MiwzLjA0MiAxLjY3NCwwIDMuMDM2LC0xLjM2NCAzLjAzNiwtMy4wNDIgMCwtMS42NzggLTEuMzYzLC0zLjAzNSAtMy4wMzYsLTMuMDM1IG0gLTAuMDAzLC01Ljk5MDAwMDEgMjIuNTc2LDAgYyA0Ljk3OSwwIDkuMDI3LDQuMDQ3MDAwMSA5LjAyNyw5LjAyNzAwMDEgMCw0Ljk3OSAtNC4wNDksOS4wMzEgLTkuMDI3LDkuMDMxIGwgLTIyLjU3NiwwIGMgLTQuOTc3LDAgLTkuMDI5OTk5NywtNC4wNTMgLTkuMDI5OTk5NywtOS4wMzEgLTAuMDAxLC00Ljk4IDQuMDUyOTk5NywtOS4wMjcwMDAxIDkuMDI5OTk5NywtOS4wMjcwMDAxIG0gMjIuNTc2LDI0LjA3NjAwMDEgYyA4LjI5OSwwIDE1LjA0NywtNi43NSAxNS4wNDcsLTE1LjA0OSAwLC04LjI5OSAtNi43NDgsLTE1LjA1MTAwMDEgLTE1LjA0NywtMTUuMDUxMDAwMSBsIC0yMi41NzYsMCBjIC04LjI5ODk5OTcsMCAtMTUuMDQ4OTk5NjksNi43NTIwMDAxIC0xNS4wNDg5OTk2OSwxNS4wNTEwMDAxIDAsOC4yOTkgNi43NDk5OTk5OSwxNS4wNDkgMTUuMDQ4OTk5NjksMTUuMDQ5IGwgMjIuNTc2LDAgbSAxMTIuMDk4OTkxLC0yMS45NTMgYyAwLC0xLjQ1MyAtMS4xOTUsLTIuNjMzMDAwMSAtMi42NjIsLTIuNjMzMDAwMSAtMS40NTUsMCAtMi42MzksMS4xODAwMDAxIC0yLjYzOSwyLjYzMzAwMDEgMCwxLjQ3MSAxLjE4NCwyLjY3MiAyLjYzOSwyLjY3MiAxLjQ2NiwwIDIuNjYyLC0xLjIwMiAyLjY2MiwtMi42NzIgeiBtIC02Ni43ODU5OTEsNS40NDUgYyAwLC00Ljc2NCAtMi44OTMsLTguMDkzMDAwMSAtNy4wMzEsLTguMDkzMDAwMSAtMi4wMjcsMCAtMy44MTQsMC44NTEgLTUuMjIzLDIuNDcwMDAwMSAtMS40NjcsLTEuNjYxMDAwMSAtMy4xNTIsLTIuNDcwMDAwMSAtNS4xMjcsLTIuNDcwMDAwMSAtNC4xNjIsMCAtNy4wNjYsMy4zMjkwMDAxIC03LjA2Niw4LjA5MzAwMDEgbCAwLDEwLjQ2NiAzLjgxMiwwIDAsLTEwLjY0NCBjIDAsLTIuNDE2IDEuMzM2LC00LjEwNCAzLjI1NCwtNC4xMDQgMS42MTcsMCAzLjI1LDEuNDA5IDMuMjUsNC4xMDQgbCAwLDEwLjY0NSAzLjg0OCwwIDAsLTEwLjY0NSBjIDAsLTIuNDE2IDEuMzM4LC00LjEwNCAzLjI1MiwtNC4xMDQgMS44NjMsMCAzLjIxNywxLjcyNyAzLjIxNyw0LjEwNCBsIDAsMTAuNjQ1IDMuODE0LDAgMCwtMTAuNDY3IHogbSA2Ljk1MywtNy42MzIwMDAxIC0zLjg0NiwwIDAsMTguMDk5MDAwMSAzLjg0NiwwIDAsLTE4LjA5OTAwMDEgeiBtIDAuNTY5LC01LjEyOCBjIDAsLTEuMzc3IC0xLjA5NiwtMi40NTQgLTIuNDkyLC0yLjQ1NCAtMS40LDAgLTIuNDUzLDEuMDU0IC0yLjQ1MywyLjQ1NCAwLDEuMzk4IDEuMDc4LDIuNDk0IDIuNDUzLDIuNDk0IDEuMzc1LDAgMi40OTIsLTEuMTE3IDIuNDkyLC0yLjQ5NCB6IG0gMTguMzI3OTkxLDIwLjkxNDAwMDEgMC41NzYsLTAuNTIxIC0yLjgyOCwtMi42NTggLTAuNDg4LDAuNDU1IGMgLTEuMjUyLDEuMTQ5IC0yLjUwNCwxLjY4NiAtMy45NDUsMS42ODYgLTMuMDY0LDAgLTUuNTU2OTkxLC0yLjU1NyAtNS41NTY5OTEsLTUuNjk5IDAsLTMuMTIxIDIuNDkxOTkxLC01LjY2IDUuNTU2OTkxLC01LjY2IDEuNDMyLDAgMi42NDYsMC41MjEgMy45NDksMS42OTMgbCAwLjUxMiwwLjQ2IDIuNzQ4LC0yLjgwMiAtMC40OSwtMC41MDIgYyAtMS43NTQsLTEuNzkzMDAwMSAtNC4wMTYsLTIuNjk2MDAwMSAtNi43MTksLTIuNjk2MDAwMSAtMi40NTksMCAtNC44Njg5OTEsMS4wMjIgLTYuNjA0OTkxLDIuNzk4MDAwMSAtMS43MzgsMS43MzQgLTIuNjkxLDQuMTE5IC0yLjY5MSw2LjcwOSAwLDIuNTk2IDAuOTUzLDQuOTc5IDIuNjg0LDYuNzA1IDEuNzcxLDEuODExIDQuMTE2OTkxLDIuODExIDYuNjE0OTkxLDIuODExIDIuNDAxLC0wLjAwMyA0LjY0NywtMC45MzcgNi42ODIsLTIuNzc5IHogbSA3LjI1LC02Ljk0NyBjIDAsLTMuMzIyIDEuMTQ1LC00LjY4NiA0LjIxNywtNS4wMjkgbCAwLjY0MSwtMC4wNyAwLC0zLjc5NzAwMDEgLTAuNzc3LDAuMDU4IGMgLTUuNjI5LDAuNDU4IC04LjE0MywzLjI0NzAwMDEgLTguMTQzLDkuMDQ4MDAwMSBsIDAsOS4wNTEgNC4wNjIsMCAwLC05LjI2MSAwLDAgeiBtIDIxLjk5OCw2LjkyMyBjIDEuNzYyLC0xLjc1NiAyLjcyOSwtNC4xNDYgMi43MjksLTYuNzE1IDAsLTIuNTY1IC0wLjk2NywtNC45NTEgLTIuNzIzLC02LjcwMiAtMS43NywtMS44MDkwMDAxIC00LjEwNSwtMi44MDYwMDAxIC02LjU3NiwtMi44MDYwMDAxIC0yLjQ5MiwwIC00Ljg0LDAuOTk3IC02LjYxMywyLjgwNjAwMDEgLTEuNzUyLDEuNzkyIC0yLjcyMSw0LjE3NCAtMi43MjEsNi43MDIgMCwyLjUzIDAuOTY5LDQuOTE2IDIuNzIxLDYuNzA3IDEuNzcxLDEuODEgNC4xMjEsMi44MDggNi42MTMsMi44MDggMi40NzIsMCA0LjgwOCwtMC45OTggNi41NywtMi44IHogbSAtMS4yMjksLTYuNzE0IGMgMCwzLjE4IC0yLjM2MSw1LjY2NSAtNS4zNzcsNS42NjUgLTIuOTQ1LDAgLTUuMzQ2LC0yLjU0MSAtNS4zNDYsLTUuNjY1IDAsLTMuMTM3IDIuMzk4LC01LjY5NSA1LjM0NiwtNS42OTUgMi45NjMsLTAuMDAyIDUuMzc3LDIuNTU4IDUuMzc3LDUuNjk1IHogbSAxMi45MTcsNi40MTggYyAwLC0xLjQ2OCAtMS4xOTUsLTIuNjY3IC0yLjY2MiwtMi42NjcgLTEuNDU1LDAgLTIuNjM5LDEuMTk5IC0yLjYzOSwyLjY2NyAwLDEuNDUzIDEuMTg0LDIuNjMyIDIuNjM5LDIuNjMyIDEuNDY2LDAgMi42NjIsLTEuMTc5IDIuNjYyLC0yLjYzMiB6IG0gMTkuNTA3LDAuMjk2IGMgMS43NiwtMS43NTYgMi43MywtNC4xNDYgMi43MywtNi43MTUgMCwtMi41MjggLTAuOTczLC00LjkxMSAtMi43MjksLTYuNzAyIC0xLjc0NiwtMS43ODcwMDAxIC00LjA4LC0yLjc3MDAwMDEgLTYuNTc0LC0yLjc3MDAwMDEgLTIuMDM1LDAgLTMuODQsMC41NzIgLTUuNDg0LDEuNzQ0MDAwMSBsIDAsLTkuOTM0MDAwMTUgLTMuODE2LDAgMC4wMDgsMTUuNTgyMDAwMTUgYyAtMC4wMzcsMC40MTEgLTAuMDM3LDAuODIxIC0wLjAzNywxLjE5OCAwLDYuMTE5IDMuODM2LDEwLjM5NiA5LjMzLDEwLjM5NiAyLjQ3NSwxMGUtNCA0LjgwNywtMC45OTcgNi41NzIsLTIuNzk5IHogbSAtMS4wMTMsLTYuNjc3IGMgMCwzLjEyMyAtMi40OTQsNS42NiAtNS41NTksNS42NiAtMy4xMTUsMCAtNS41NTcsLTIuNDg0IC01LjU1NywtNS42NiAwLC0zLjE0MyAyLjQ5NCwtNS42OTggNS41NTcsLTUuNjk4IDMuMDY1LDAgNS41NTksMi41NTYgNS41NTksNS42OTggeiBtIDEwLjg4MSwtOS4wODUwMDAxIC0zLjg0NiwwIDAsMTguMDk5MDAwMSAzLjg0NiwwIDAsLTE4LjA5OTAwMDEgeiBtIDAuNTcyLC01LjEyOCBjIDAsLTEuMzc3IC0xLjA5OCwtMi40NTQgLTIuNDkyLC0yLjQ1NCAtMS40LDAgLTIuNDU3LDEuMDU0IC0yLjQ1NywyLjQ1NCAwLDEuMzk4IDEuMDc2LDIuNDk0IDIuNDU3LDIuNDk0IDEuMzczLDAgMi40OTIsLTEuMTE3IDIuNDkyLC0yLjQ5NCB6IG0gMTMuODMsMTkuNzU5MDAwMSAtMC42MTksLTAuMDg5IGMgLTIuODU1LC0wLjQwOSAtNC4xMzMsLTIuMTA0IC00LjEzMywtNS40OTUgbCAwLC01LjEyNiA0Ljc1MiwwIDAsLTMuNjc0MDAwMSAtNC43NTIsMCAwLC00LjAwNiAtMy44ODcsMCAwLDQuMDA2IC0xLjY2MiwwIDAsMy42NzQwMDAxIDEuNjYyLDAgMCw0LjUyNSBjIDAsNi4yMTUgMi4xMTMsOC45MzIgNy43ODMsMTAuMDI5IGwgMC44NTUsMC4xNjQgMCwtNC4wMDggMTBlLTQsMCB6IgogICAgIGlkPSJwYXRoMjEiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMCIgLz48L3N2Zz4=",
    "cardLogo": "data:image/png;base64,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",
    "appLogo": "data:image/png;base64,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",
    "organization": "Microsoft MakeCode",
    "organizationUrl": "https://shop150277333.taobao.com",
    "organizationLogo": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABmcAAAFeCAYAAABw9strAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAEZ0FNQQAAsY58+1GTAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAKDFSURBVHja7P15mCVXftf5v0/E3XO7mbXvt7S31S1dSS3vbqXaGDBelLLBxqtKNuMBYyPpAQbGwyAJeHhm8MxPJfgNDOBBpfmB2QZUDV4GDFbKK+3WktVSb9rq1r5n3lzuHhHn90dkdUnqqlJG1Y242+f1PNWllipOxP3GiUjpfO/3e8w3//Kr7wNFRERk1L3x+b/ywHcrDCIiIiIiIiIiIvFKAVuAcYVCRGTkzSgEIiIiIiIiIiIi8XOAjsIgIiKApxCIiIiIiIiIiIjEz1EIREREREREREREREREkqPkjIiIiIiIiIiIiIiISIKUnBEREREREREREREREUmQkjMiIiIiIiIiIiIiIiIJUnJGREREREREREREREQkQUrOiIiIiIiIiIiIiIiIJEjJGRERERERERERERERkQQpOSMiIiIiIiIiIiIiIpIgJWdEREREREREREREREQSpOSMiIiIiIiIiIiIiIhIgpScERERERERERERERERSZCSMyIiIiIiIiIiIiIiIglSckZERERERERERERERCRBSs6IiIiIiIiIiIiIiIgkSMkZERERERERERERERGRBCk5IyIiIiIiIiIiIiIikiAlZ0RERERERERERERERBKk5IyIiIiIiIiIiIiIiEiCUgqBiMhHGIPBAGCxYK1iIiIiIiIiIiIiIl2j5IyIyDrjuBgnhd9p4ntNANxUHiedxfoe1gas52wGj/36/4iIiIiIiIiIiEiPKTkjIgI4boZOo8riiVdZu/AOndYKAJncFJNb76S4+wHcTCFM0Awkg+OmAQj8jm64iIiIiIiIiIhIDyk5IyIjz3Ez1BcrnPriv6O5dgHHccFxAag3V6gvHWPxxKu46Tx2IFucWXDS5Ce3U9xxD2ObbyEIfBjYRJOIiIiIiIiIiMhgU3JGREaacVK0axc4sfCv6TSXcdO5D/9z1wGg01qh01we6M/aqB6nevJ1Nu/7Frbe9SfAOANcCSQiIiIiIiIiIjK4lJwRkZFmjOHCe79Du76Im85f58+5g7vfzDrXSYG1nH//d8Fatt39/VhfyRkREREREREREZGkOQqBiIwq47i0G1VWL7yNk8qOyIc2uOkc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",
    "organizationWideLogo": "data:image/png;base64,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",
    "homeUrl": "https://makecode.microbit.org/",
    "embedUrl": "https://makecode.microbit.org/",
    "shareUrl": "https://makecode.microbit.org/",
    "privacyUrl": "https://makecode.com/privacy",
    "termsOfUseUrl": "https://makecode.com/termsofuse",
    "githubUrl": "https://github.com/Microsoft/pxt-microbit",
    "galleries": {
      "Projects": "projects",
      "Examples": "examples"
    },
    "projectGallery": "projects",
    "exampleGallery": "examples",
    "crowdinProject": "kindscript",
    "boardName": "micro:bit",
    "driveDisplayName": "MICROBIT",
    "sideDoc": "tutorials/getting-started",
    "feedbackUrl": "https://www.research.net/r/MCmicro",
    "appStoreID": "1092687276",
    "mobileSafariDownloadProtocol": "microbithex://?data",
    "extendEditor": true,
    "docMenu": [
      {
        "name": "Support",
        "path": "https://support.microbit.org/"
      },
      {
        "name": "Getting started",
        "tutorial": true,
        "path": "/tutorials/getting-started"
      },
      {
        "name": "Projects",
        "path": "/projects"
      },
      {
        "name": "Reference",
        "path": "/reference"
      },
      {
        "name": "Blocks",
        "path": "/blocks"
      },
      {
        "name": "JavaScript",
        "path": "/javascript"
      },
      {
        "name": "Hardware",
        "path": "/device"
      },
      {
        "name": "Buy",
        "path": "https://shop150277333.taobao.com"
      },
      {
        "name": "MakeCode离线版下载",
        "path": "http://www.makeredu.net/download/"
      }
    ],
    "hasReferenceDocs": true,
    "usbDocs": "/device/usb",
    "usbHelp": [
      {
        "name": "connection",
        "os": "*",
        "browser": "*",
        "path": "/static/mb/device/usb-generic.jpg"
      },
      {
        "name": "connection",
        "os": "mac",
        "browser": "*",
        "path": "/static/mb/device/usb-mac.jpg"
      },
      {
        "name": "save",
        "os": "windows",
        "browser": "firefox",
        "path": "/static/mb/device/usb-windows-firefox-1.png"
      },
      {
        "name": "save",
        "os": "mac",
        "browser": "firefox",
        "path": "/static/mb/device/usb-osx-firefox-1.jpg"
      },
      {
        "name": "save",
        "os": "mac",
        "browser": "chrome",
        "path": "/static/mb/device/usb-osx-chrome.png"
      },
      {
        "name": "save",
        "os": "windows",
        "browser": "edge",
        "path": "/static/mb/device/usb-windows-edge-1.png"
      },
      {
        "name": "save",
        "os": "windows",
        "browser": "ie",
        "path": "/static/mb/device/usb-windows-ie11-1.png"
      },
      {
        "name": "save",
        "os": "windows",
        "browser": "chrome",
        "path": "/static/mb/device/usb-windows-chrome.png"
      },
      {
        "name": "copy",
        "os": "mac",
        "browser": "*",
        "path": "/static/mb/device/usb-osx-dnd.png"
      },
      {
        "name": "copy",
        "os": "windows",
        "browser": "*",
        "path": "/static/mb/device/usb-windows-sendto.jpg"
      }
    ],
    "invertedMenu": true,
    "coloredToolbox": true,
    "monacoToolbox": true,
    "hasAudio": true,
    "blocklyOptions": {
      "grid": {
        "spacing": 45,
        "length": 7,
        "colour": "rgba(189, 195, 199, 0.30)",
        "snap": false
      }
    },
    "highContrast": true,
    "selectLanguage": true,
    "monacoColors": {
      "editor.background": "#ecf0f1"
    },
    "TOC": [
      {
        "name": "Support",
        "subitems": [],
        "path": "https://support.microbit.org/",
        "nextName": "Projects",
        "nextPath": "/projects"
      },
      {
        "name": "Projects",
        "subitems": [
          {
            "name": "Flashing heart",
            "subitems": [],
            "path": "/projects/flashing-heart",
            "prevName": "Projects",
            "prevPath": "/projects",
            "nextName": "Smiley buttons",
            "nextPath": "/projects/smiley-buttons"
          },
          {
            "name": "Smiley buttons",
            "subitems": [],
            "path": "/projects/smiley-buttons",
            "prevName": "Flashing heart",
            "prevPath": "/projects/flashing-heart",
            "nextName": "Love meter",
            "nextPath": "/projects/love-meter"
          },
          {
            "name": "Love meter",
            "subitems": [],
            "path": "/projects/love-meter",
            "prevName": "Smiley buttons",
            "prevPath": "/projects/smiley-buttons",
            "nextName": "Rock paper scissors",
            "nextPath": "/projects/rock-paper-scissors"
          },
          {
            "name": "Rock paper scissors",
            "subitems": [],
            "path": "/projects/rock-paper-scissors",
            "prevName": "Love meter",
            "prevPath": "/projects/love-meter",
            "nextName": "Magic button trick",
            "nextPath": "/projects/magic-button-trick"
          },
          {
            "name": "Magic button trick",
            "subitems": [],
            "path": "/projects/magic-button-trick",
            "prevName": "Rock paper scissors",
            "prevPath": "/projects/rock-paper-scissors",
            "nextName": "Coin Flipper",
            "nextPath": "/projects/coin-flipper"
          },
          {
            "name": "Coin Flipper",
            "subitems": [],
            "path": "/projects/coin-flipper",
            "prevName": "Magic button trick",
            "prevPath": "/projects/magic-button-trick",
            "nextName": "Hack your headphones",
            "nextPath": "/projects/hack-your-headphones"
          },
          {
            "name": "Hack your headphones",
            "subitems": [],
            "path": "/projects/hack-your-headphones",
            "prevName": "Coin Flipper",
            "prevPath": "/projects/coin-flipper",
            "nextName": "Banana keyboard",
            "nextPath": "/projects/banana-keyboard"
          },
          {
            "name": "Banana keyboard",
            "subitems": [],
            "path": "/projects/banana-keyboard",
            "prevName": "Hack your headphones",
            "prevPath": "/projects/hack-your-headphones",
            "nextName": "Guitar",
            "nextPath": "/projects/guitar"
          },
          {
            "name": "Guitar",
            "subitems": [],
            "path": "/projects/guitar",
            "prevName": "Banana keyboard",
            "prevPath": "/projects/banana-keyboard",
            "nextName": "Duct tape wallet",
            "nextPath": "/projects/wallet"
          },
          {
            "name": "Duct tape wallet",
            "subitems": [],
            "path": "/projects/wallet",
            "prevName": "Guitar",
            "prevPath": "/projects/guitar",
            "nextName": "Watch",
            "nextPath": "/projects/watch"
          },
          {
            "name": "Watch",
            "subitems": [],
            "path": "/projects/watch",
            "prevName": "Duct tape wallet",
            "prevPath": "/projects/wallet",
            "nextName": "Soil Moisture",
            "nextPath": "/projects/soil-moisture"
          },
          {
            "name": "Soil Moisture",
            "subitems": [],
            "path": "/projects/soil-moisture",
            "prevName": "Watch",
            "prevPath": "/projects/watch",
            "nextName": "Plant Watering",
            "nextPath": "/projects/plant-watering"
          },
          {
            "name": "Plant Watering",
            "subitems": [],
            "path": "/projects/plant-watering",
            "prevName": "Soil Moisture",
            "prevPath": "/projects/soil-moisture",
            "nextName": "Reaction Time",
            "nextPath": "/projects/reaction-time"
          },
          {
            "name": "Reaction Time",
            "subitems": [],
            "path": "/projects/reaction-time",
            "prevName": "Plant Watering",
            "prevPath": "/projects/plant-watering",
            "nextName": "States of Matter",
            "nextPath": "/projects/states-of-matter"
          },
          {
            "name": "States of Matter",
            "subitems": [],
            "path": "/projects/states-of-matter",
            "prevName": "Reaction Time",
            "prevPath": "/projects/reaction-time",
            "nextName": "Hot Or Cold",
            "nextPath": "/projects/hot-or-cold"
          },
          {
            "name": "Hot Or Cold",
            "subitems": [],
            "path": "/projects/hot-or-cold",
            "prevName": "States of Matter",
            "prevPath": "/projects/states-of-matter",
            "nextName": "Voting Machine",
            "nextPath": "/projects/voting-machine"
          },
          {
            "name": "Voting Machine",
            "subitems": [],
            "path": "/projects/voting-machine",
            "prevName": "Hot Or Cold",
            "prevPath": "/projects/hot-or-cold",
            "nextName": "Infection",
            "nextPath": "/projects/infection"
          },
          {
            "name": "Infection",
            "subitems": [],
            "path": "/projects/infection",
            "prevName": "Voting Machine",
            "prevPath": "/projects/voting-machine",
            "nextName": "Fireflies",
            "nextPath": "/projects/fireflies"
          },
          {
            "name": "Fireflies",
            "subitems": [],
            "path": "/projects/fireflies",
            "prevName": "Infection",
            "prevPath": "/projects/infection",
            "nextName": "Rock Paper Scissors Teams",
            "nextPath": "/projects/rps-teams"
          },
          {
            "name": "Rock Paper Scissors Teams",
            "subitems": [],
            "path": "/projects/rps-teams",
            "prevName": "Fireflies",
            "prevPath": "/projects/fireflies",
            "nextName": "micro:coin",
            "nextPath": "/projects/micro-coin"
          },
          {
            "name": "micro:coin",
            "subitems": [],
            "path": "/projects/micro-coin",
            "prevName": "Rock Paper Scissors Teams",
            "prevPath": "/projects/rps-teams",
            "nextName": "Inchworm",
            "nextPath": "/projects/inchworm"
          },
          {
            "name": "Inchworm",
            "subitems": [],
            "path": "/projects/inchworm",
            "prevName": "micro:coin",
            "prevPath": "/projects/micro-coin",
            "nextName": "Milk Carton Robot",
            "nextPath": "/projects/milk-carton-robot"
          },
          {
            "name": "Milk Carton Robot",
            "subitems": [],
            "path": "/projects/milk-carton-robot",
            "prevName": "Inchworm",
            "prevPath": "/projects/inchworm",
            "nextName": "Milk monster",
            "nextPath": "/projects/milky-monster"
          },
          {
            "name": "Milk monster",
            "subitems": [],
            "path": "/projects/milky-monster",
            "prevName": "Milk Carton Robot",
            "prevPath": "/projects/milk-carton-robot",
            "nextName": "RC Car",
            "nextPath": "/projects/rc-car"
          },
          {
            "name": "RC Car",
            "subitems": [],
            "path": "/projects/rc-car",
            "prevName": "Milk monster",
            "prevPath": "/projects/milky-monster",
            "nextName": "Timing gates",
            "nextPath": "/projects/timing-gates"
          },
          {
            "name": "Timing gates",
            "subitems": [],
            "path": "/projects/timing-gates",
            "prevName": "RC Car",
            "prevPath": "/projects/rc-car",
            "nextName": "Compass",
            "nextPath": "/projects/compass"
          },
          {
            "name": "Compass",
            "subitems": [],
            "path": "/projects/compass",
            "prevName": "Timing gates",
            "prevPath": "/projects/timing-gates",
            "nextName": "Telegraph",
            "nextPath": "/projects/telegraph"
          },
          {
            "name": "Telegraph",
            "subitems": [],
            "path": "/projects/telegraph",
            "prevName": "Compass",
            "prevPath": "/projects/compass",
            "nextName": "Railway Crossing",
            "nextPath": "/projects/railway-crossing"
          },
          {
            "name": "Railway Crossing",
            "subitems": [],
            "path": "/projects/railway-crossing",
            "prevName": "Telegraph",
            "prevPath": "/projects/telegraph",
            "nextName": "Karel",
            "nextPath": "/projects/karel"
          },
          {
            "name": "Karel",
            "subitems": [],
            "path": "/projects/karel",
            "prevName": "Railway Crossing",
            "prevPath": "/projects/railway-crossing",
            "nextName": "Examples",
            "nextPath": "/examples"
          }
        ],
        "path": "/projects",
        "prevName": "Support",
        "prevPath": "https://support.microbit.org/",
        "nextName": "Flashing heart",
        "nextPath": "/projects/flashing-heart"
      },
      {
        "name": "Examples",
        "subitems": [
          {
            "name": "Blinky",
            "subitems": [],
            "path": "/examples/blinky",
            "prevName": "Examples",
            "prevPath": "/examples",
            "nextName": "Name tag",
            "nextPath": "/examples/name-tag"
          },
          {
            "name": "Name tag",
            "subitems": [],
            "path": "/examples/name-tag",
            "prevName": "Blinky",
            "prevPath": "/examples/blinky",
            "nextName": "Rando",
            "nextPath": "/examples/rando"
          },
          {
            "name": "Rando",
            "subitems": [],
            "path": "/examples/rando",
            "prevName": "Name tag",
            "prevPath": "/examples/name-tag",
            "nextName": "Plot acceleration",
            "nextPath": "/examples/plot-acceleration"
          },
          {
            "name": "Plot acceleration",
            "subitems": [],
            "path": "/examples/plot-acceleration",
            "prevName": "Rando",
            "prevPath": "/examples/rando",
            "nextName": "Plot light level",
            "nextPath": "/examples/plot-light-level"
          },
          {
            "name": "Plot light level",
            "subitems": [],
            "path": "/examples/plot-light-level",
            "prevName": "Plot acceleration",
            "prevPath": "/examples/plot-acceleration",
            "nextName": "Plot analog pin",
            "nextPath": "/examples/plot-analog-pin"
          },
          {
            "name": "Plot analog pin",
            "subitems": [],
            "path": "/examples/plot-analog-pin",
            "prevName": "Plot light level",
            "prevPath": "/examples/plot-light-level",
            "nextName": "Servo calibrator",
            "nextPath": "/examples/servo-calibrator"
          },
          {
            "name": "Servo calibrator",
            "subitems": [],
            "path": "/examples/servo-calibrator",
            "prevName": "Plot analog pin",
            "prevPath": "/examples/plot-analog-pin",
            "nextName": "Game of Life",
            "nextPath": "/examples/gameofLife"
          },
          {
            "name": "Game of Life",
            "subitems": [],
            "path": "/examples/gameofLife",
            "prevName": "Servo calibrator",
            "prevPath": "/examples/servo-calibrator",
            "nextName": "Egg and Spoon Race",
            "nextPath": "/examples/egg-and-spoon"
          },
          {
            "name": "Egg and Spoon Race",
            "subitems": [],
            "path": "/examples/egg-and-spoon",
            "prevName": "Game of Life",
            "prevPath": "/examples/gameofLife",
            "nextName": "Stop watch",
            "nextPath": "/examples/stop-watch"
          },
          {
            "name": "Stop watch",
            "subitems": [],
            "path": "/examples/stop-watch",
            "prevName": "Egg and Spoon Race",
            "prevPath": "/examples/egg-and-spoon",
            "nextName": "Radio dashboard",
            "nextPath": "/examples/radio-dashboard"
          },
          {
            "name": "Radio dashboard",
            "subitems": [],
            "path": "/examples/radio-dashboard",
            "prevName": "Stop watch",
            "prevPath": "/examples/stop-watch",
            "nextName": "Courses",
            "nextPath": "/courses"
          }
        ],
        "path": "/examples",
        "prevName": "Karel",
        "prevPath": "/projects/karel",
        "nextName": "Blinky",
        "nextPath": "/examples/blinky"
      },
      {
        "name": "Courses",
        "subitems": [
          {
            "name": "CS Intro",
            "subitems": [
              {
                "name": "About",
                "subitems": [],
                "path": "/courses/csintro/about",
                "prevName": "CS Intro",
                "prevPath": "/courses/csintro",
                "nextName": "Introduction",
                "nextPath": "/courses/csintro/introduction"
              },
              {
                "name": "Introduction",
                "subitems": [],
                "path": "/courses/csintro/introduction",
                "prevName": "About",
                "prevPath": "/courses/csintro/about",
                "nextName": "References",
                "nextPath": "/courses/csintro/references"
              },
              {
                "name": "References",
                "subitems": [],
                "path": "/courses/csintro/references",
                "prevName": "Introduction",
                "prevPath": "/courses/csintro/introduction",
                "nextName": "Acknowledgements",
                "nextPath": "/courses/csintro/acknowledgements"
              },
              {
                "name": "Acknowledgements",
                "subitems": [],
                "path": "/courses/csintro/acknowledgements",
                "prevName": "References",
                "prevPath": "/courses/csintro/references",
                "nextName": "Making",
                "nextPath": "/courses/csintro/making"
              },
              {
                "name": "Making",
                "subitems": [
                  {
                    "name": "Introduction",
                    "subitems": [],
                    "path": "/courses/csintro/making/introduction",
                    "prevName": "Making",
                    "prevPath": "/courses/csintro/making",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/making/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/making/unplugged",
                    "prevName": "Introduction",
                    "prevPath": "/courses/csintro/making/introduction",
                    "nextName": "Walkthrough",
                    "nextPath": "/courses/csintro/making/activity"
                  },
                  {
                    "name": "Walkthrough",
                    "subitems": [],
                    "path": "/courses/csintro/making/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/making/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/making/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/making/project",
                    "prevName": "Walkthrough",
                    "prevPath": "/courses/csintro/making/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/making/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/making/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/making/project",
                    "nextName": "Algorithms",
                    "nextPath": "/courses/csintro/algorithms"
                  }
                ],
                "path": "/courses/csintro/making",
                "prevName": "Acknowledgements",
                "prevPath": "/courses/csintro/acknowledgements",
                "nextName": "Introduction",
                "nextPath": "/courses/csintro/making/introduction"
              },
              {
                "name": "Algorithms",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/algorithms/overview",
                    "prevName": "Algorithms",
                    "prevPath": "/courses/csintro/algorithms",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/algorithms/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/algorithms/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/algorithms/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/algorithms/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/algorithms/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/algorithms/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/algorithms/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/algorithms/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/algorithms/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/algorithms/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/algorithms/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/algorithms/project",
                    "nextName": "Variables",
                    "nextPath": "/courses/csintro/variables"
                  }
                ],
                "path": "/courses/csintro/algorithms",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/making/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/algorithms/overview"
              },
              {
                "name": "Variables",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/variables/overview",
                    "prevName": "Variables",
                    "prevPath": "/courses/csintro/variables",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/variables/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/variables/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/variables/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/variables/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/variables/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/variables/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/variables/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/variables/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/variables/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/variables/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/variables/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/variables/project",
                    "nextName": "Conditionals",
                    "nextPath": "/courses/csintro/conditionals"
                  }
                ],
                "path": "/courses/csintro/variables",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/algorithms/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/variables/overview"
              },
              {
                "name": "Conditionals",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/conditionals/overview",
                    "prevName": "Conditionals",
                    "prevPath": "/courses/csintro/conditionals",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/conditionals/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/conditionals/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/conditionals/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/conditionals/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/conditionals/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/conditionals/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/conditionals/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/conditionals/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/conditionals/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/conditionals/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/conditionals/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/conditionals/project",
                    "nextName": "Iteration",
                    "nextPath": "/courses/csintro/iteration"
                  }
                ],
                "path": "/courses/csintro/conditionals",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/variables/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/conditionals/overview"
              },
              {
                "name": "Iteration",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/iteration/overview",
                    "prevName": "Iteration",
                    "prevPath": "/courses/csintro/iteration",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/iteration/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/iteration/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/iteration/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/iteration/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/iteration/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/iteration/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/iteration/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/iteration/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/iteration/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/iteration/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/iteration/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/iteration/project",
                    "nextName": "Mini-project",
                    "nextPath": "/courses/csintro/miniproject"
                  }
                ],
                "path": "/courses/csintro/iteration",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/conditionals/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/iteration/overview"
              },
              {
                "name": "Mini-project",
                "subitems": [
                  {
                    "name": "Review",
                    "subitems": [],
                    "path": "/courses/csintro/miniproject/review",
                    "prevName": "Mini-project",
                    "prevPath": "/courses/csintro/miniproject",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/miniproject/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/miniproject/activity",
                    "prevName": "Review",
                    "prevPath": "/courses/csintro/miniproject/review",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/miniproject/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/miniproject/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/miniproject/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/miniproject/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/miniproject/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/miniproject/project",
                    "nextName": "Coordinates",
                    "nextPath": "/courses/csintro/coordinates"
                  }
                ],
                "path": "/courses/csintro/miniproject",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/iteration/standards",
                "nextName": "Review",
                "nextPath": "/courses/csintro/miniproject/review"
              },
              {
                "name": "Coordinates",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/coordinates/overview",
                    "prevName": "Coordinates",
                    "prevPath": "/courses/csintro/coordinates",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/coordinates/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/coordinates/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/coordinates/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/coordinates/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/coordinates/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/coordinates/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/coordinates/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/coordinates/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/coordinates/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/coordinates/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/coordinates/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/coordinates/project",
                    "nextName": "Booleans",
                    "nextPath": "/courses/csintro/booleans"
                  }
                ],
                "path": "/courses/csintro/coordinates",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/miniproject/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/coordinates/overview"
              },
              {
                "name": "Booleans",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/booleans/overview",
                    "prevName": "Booleans",
                    "prevPath": "/courses/csintro/booleans",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/booleans/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/booleans/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/booleans/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/booleans/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/booleans/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/booleans/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/booleans/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/booleans/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/booleans/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/booleans/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/booleans/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/booleans/project",
                    "nextName": "Binary",
                    "nextPath": "/courses/csintro/binary"
                  }
                ],
                "path": "/courses/csintro/booleans",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/coordinates/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/booleans/overview"
              },
              {
                "name": "Binary",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/binary/overview",
                    "prevName": "Binary",
                    "prevPath": "/courses/csintro/binary",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/binary/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/binary/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/binary/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/binary/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/binary/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/binary/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/binary/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/binary/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/binary/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/binary/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/binary/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/binary/project",
                    "nextName": "Radio",
                    "nextPath": "/courses/csintro/radio"
                  }
                ],
                "path": "/courses/csintro/binary",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/booleans/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/binary/overview"
              },
              {
                "name": "Radio",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/radio/overview",
                    "prevName": "Radio",
                    "prevPath": "/courses/csintro/radio",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/radio/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/radio/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/radio/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/radio/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/radio/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/radio/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/radio/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/radio/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/radio/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/radio/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/radio/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/radio/project",
                    "nextName": "Arrays",
                    "nextPath": "/courses/csintro/arrays"
                  }
                ],
                "path": "/courses/csintro/radio",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/binary/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/radio/overview"
              },
              {
                "name": "Arrays",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/csintro/arrays/overview",
                    "prevName": "Arrays",
                    "prevPath": "/courses/csintro/arrays",
                    "nextName": "Unplugged",
                    "nextPath": "/courses/csintro/arrays/unplugged"
                  },
                  {
                    "name": "Unplugged",
                    "subitems": [],
                    "path": "/courses/csintro/arrays/unplugged",
                    "prevName": "Overview",
                    "prevPath": "/courses/csintro/arrays/overview",
                    "nextName": "Activity",
                    "nextPath": "/courses/csintro/arrays/activity"
                  },
                  {
                    "name": "Activity",
                    "subitems": [],
                    "path": "/courses/csintro/arrays/activity",
                    "prevName": "Unplugged",
                    "prevPath": "/courses/csintro/arrays/unplugged",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/arrays/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/arrays/project",
                    "prevName": "Activity",
                    "prevPath": "/courses/csintro/arrays/activity",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/arrays/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/arrays/standards",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/arrays/project",
                    "nextName": "Final Project",
                    "nextPath": "/courses/csintro/finalproject"
                  }
                ],
                "path": "/courses/csintro/arrays",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/radio/standards",
                "nextName": "Overview",
                "nextPath": "/courses/csintro/arrays/overview"
              },
              {
                "name": "Final Project",
                "subitems": [
                  {
                    "name": "Review",
                    "subitems": [],
                    "path": "/courses/csintro/finalproject/review",
                    "prevName": "Final Project",
                    "prevPath": "/courses/csintro/finalproject",
                    "nextName": "Project",
                    "nextPath": "/courses/csintro/finalproject/project"
                  },
                  {
                    "name": "Project",
                    "subitems": [],
                    "path": "/courses/csintro/finalproject/project",
                    "prevName": "Review",
                    "prevPath": "/courses/csintro/finalproject/review",
                    "nextName": "Examples",
                    "nextPath": "/courses/csintro/finalproject/examples"
                  },
                  {
                    "name": "Examples",
                    "subitems": [],
                    "path": "/courses/csintro/finalproject/examples",
                    "prevName": "Project",
                    "prevPath": "/courses/csintro/finalproject/project",
                    "nextName": "Standards",
                    "nextPath": "/courses/csintro/finalproject/standards"
                  },
                  {
                    "name": "Standards",
                    "subitems": [],
                    "path": "/courses/csintro/finalproject/standards",
                    "prevName": "Examples",
                    "prevPath": "/courses/csintro/finalproject/examples",
                    "nextName": "Science experiments",
                    "nextPath": "/courses/ucp-science"
                  }
                ],
                "path": "/courses/csintro/finalproject",
                "prevName": "Standards",
                "prevPath": "/courses/csintro/arrays/standards",
                "nextName": "Review",
                "nextPath": "/courses/csintro/finalproject/review"
              }
            ],
            "path": "/courses/csintro",
            "prevName": "Courses",
            "prevPath": "/courses",
            "nextName": "About",
            "nextPath": "/courses/csintro/about"
          },
          {
            "name": "Science experiments",
            "subitems": [
              {
                "name": "Data collection",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/data-collection/overview",
                    "prevName": "Data collection",
                    "prevPath": "/courses/ucp-science/data-collection",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/data-collection/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/data-collection/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/data-collection/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/data-collection/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/data-collection/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/data-collection/setup-procedure",
                    "nextName": "Population Traits",
                    "nextPath": "/courses/ucp-science/population"
                  }
                ],
                "path": "/courses/ucp-science/data-collection",
                "prevName": "Science experiments",
                "prevPath": "/courses/ucp-science",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/data-collection/overview"
              },
              {
                "name": "Population Traits",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/population/overview",
                    "prevName": "Population Traits",
                    "prevPath": "/courses/ucp-science/population",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/population/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/population/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/population/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/population/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/population/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/population/setup-procedure",
                    "nextName": "Temperature",
                    "nextPath": "/courses/ucp-science/temperature"
                  }
                ],
                "path": "/courses/ucp-science/population",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/data-collection/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/population/overview"
              },
              {
                "name": "Temperature",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/temperature/overview",
                    "prevName": "Temperature",
                    "prevPath": "/courses/ucp-science/temperature",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/temperature/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/temperature/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/temperature/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/temperature/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/temperature/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/temperature/setup-procedure",
                    "nextName": "Soil Moisture",
                    "nextPath": "/courses/ucp-science/soil-moisture"
                  }
                ],
                "path": "/courses/ucp-science/temperature",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/population/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/temperature/overview"
              },
              {
                "name": "Soil Moisture",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/soil-moisture/overview",
                    "prevName": "Soil Moisture",
                    "prevPath": "/courses/ucp-science/soil-moisture",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/soil-moisture/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/soil-moisture/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/soil-moisture/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/soil-moisture/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/soil-moisture/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/soil-moisture/setup-procedure",
                    "nextName": "Gravity, Motion and Waves",
                    "nextPath": "/courses/ucp-science/gravity"
                  }
                ],
                "path": "/courses/ucp-science/soil-moisture",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/temperature/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/soil-moisture/overview"
              },
              {
                "name": "Gravity, Motion and Waves",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/gravity/overview",
                    "prevName": "Gravity, Motion and Waves",
                    "prevPath": "/courses/ucp-science/gravity",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/gravity/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/gravity/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/gravity/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/gravity/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/gravity/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/gravity/setup-procedure",
                    "nextName": "Body Electrical and Waves",
                    "nextPath": "/courses/ucp-science/body-electrical"
                  }
                ],
                "path": "/courses/ucp-science/gravity",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/soil-moisture/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/gravity/overview"
              },
              {
                "name": "Body Electrical and Waves",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/body-electrical/overview",
                    "prevName": "Body Electrical and Waves",
                    "prevPath": "/courses/ucp-science/body-electrical",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/body-electrical/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/body-electrical/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/body-electrical/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/body-electrical/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/body-electrical/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/body-electrical/setup-procedure",
                    "nextName": "Electricity",
                    "nextPath": "/courses/ucp-science/electricity"
                  }
                ],
                "path": "/courses/ucp-science/body-electrical",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/gravity/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/body-electrical/overview"
              },
              {
                "name": "Electricity",
                "subitems": [
                  {
                    "name": "Overview",
                    "subitems": [],
                    "path": "/courses/ucp-science/electricity/overview",
                    "prevName": "Electricity",
                    "prevPath": "/courses/ucp-science/electricity",
                    "nextName": "Setup and procedure",
                    "nextPath": "/courses/ucp-science/electricity/setup-procedure"
                  },
                  {
                    "name": "Setup and procedure",
                    "subitems": [],
                    "path": "/courses/ucp-science/electricity/setup-procedure",
                    "prevName": "Overview",
                    "prevPath": "/courses/ucp-science/electricity/overview",
                    "nextName": "Resources",
                    "nextPath": "/courses/ucp-science/electricity/resources"
                  },
                  {
                    "name": "Resources",
                    "subitems": [],
                    "path": "/courses/ucp-science/electricity/resources",
                    "prevName": "Setup and procedure",
                    "prevPath": "/courses/ucp-science/electricity/setup-procedure",
                    "nextName": "Reference",
                    "nextPath": "/reference"
                  }
                ],
                "path": "/courses/ucp-science/electricity",
                "prevName": "Resources",
                "prevPath": "/courses/ucp-science/body-electrical/resources",
                "nextName": "Overview",
                "nextPath": "/courses/ucp-science/electricity/overview"
              }
            ],
            "path": "/courses/ucp-science",
            "prevName": "Standards",
            "prevPath": "/courses/csintro/finalproject/standards",
            "nextName": "Data collection",
            "nextPath": "/courses/ucp-science/data-collection"
          }
        ],
        "path": "/courses",
        "prevName": "Radio dashboard",
        "prevPath": "/examples/radio-dashboard",
        "nextName": "CS Intro",
        "nextPath": "/courses/csintro"
      },
      {
        "name": "Reference",
        "subitems": [
          {
            "name": "Basic",
            "subitems": [
              {
                "name": "show number",
                "subitems": [],
                "path": "/reference/basic/show-number",
                "prevName": "Basic",
                "prevPath": "/reference/basic",
                "nextName": "show icon",
                "nextPath": "/reference/basic/show-icon"
              },
              {
                "name": "show icon",
                "subitems": [],
                "path": "/reference/basic/show-icon",
                "prevName": "show number",
                "prevPath": "/reference/basic/show-number",
                "nextName": "show leds",
                "nextPath": "/reference/basic/show-leds"
              },
              {
                "name": "show leds",
                "subitems": [],
                "path": "/reference/basic/show-leds",
                "prevName": "show icon",
                "prevPath": "/reference/basic/show-icon",
                "nextName": "show string",
                "nextPath": "/reference/basic/show-string"
              },
              {
                "name": "show string",
                "subitems": [],
                "path": "/reference/basic/show-string",
                "prevName": "show leds",
                "prevPath": "/reference/basic/show-leds",
                "nextName": "clear screen",
                "nextPath": "/reference/basic/clear-screen"
              },
              {
                "name": "clear screen",
                "subitems": [],
                "path": "/reference/basic/clear-screen",
                "prevName": "show string",
                "prevPath": "/reference/basic/show-string",
                "nextName": "forever",
                "nextPath": "/reference/basic/forever"
              },
              {
                "name": "forever",
                "subitems": [],
                "path": "/reference/basic/forever",
                "prevName": "clear screen",
                "prevPath": "/reference/basic/clear-screen",
                "nextName": "pause",
                "nextPath": "/reference/basic/pause"
              },
              {
                "name": "pause",
                "subitems": [],
                "path": "/reference/basic/pause",
                "prevName": "forever",
                "prevPath": "/reference/basic/forever",
                "nextName": "show arrow",
                "nextPath": "/reference/basic/show-arrow"
              },
              {
                "name": "show arrow",
                "subitems": [],
                "path": "/reference/basic/show-arrow",
                "prevName": "pause",
                "prevPath": "/reference/basic/pause",
                "nextName": "show animation",
                "nextPath": "/reference/basic/show-animation"
              },
              {
                "name": "show animation",
                "subitems": [],
                "path": "/reference/basic/show-animation",
                "prevName": "show arrow",
                "prevPath": "/reference/basic/show-arrow",
                "nextName": "Input",
                "nextPath": "/reference/input"
              }
            ],
            "path": "/reference/basic",
            "prevName": "Reference",
            "prevPath": "/reference",
            "nextName": "show number",
            "nextPath": "/reference/basic/show-number"
          },
          {
            "name": "Input",
            "subitems": [
              {
                "name": "on button pressed",
                "subitems": [],
                "path": "/reference/input/on-button-pressed",
                "prevName": "Input",
                "prevPath": "/reference/input",
                "nextName": "on gesture",
                "nextPath": "/reference/input/on-gesture"
              },
              {
                "name": "on gesture",
                "subitems": [],
                "path": "/reference/input/on-gesture",
                "prevName": "on button pressed",
                "prevPath": "/reference/input/on-button-pressed",
                "nextName": "on pin pressed",
                "nextPath": "/reference/input/on-pin-pressed"
              },
              {
                "name": "on pin pressed",
                "subitems": [],
                "path": "/reference/input/on-pin-pressed",
                "prevName": "on gesture",
                "prevPath": "/reference/input/on-gesture",
                "nextName": "button is pressed",
                "nextPath": "/reference/input/button-is-pressed"
              },
              {
                "name": "button is pressed",
                "subitems": [],
                "path": "/reference/input/button-is-pressed",
                "prevName": "on pin pressed",
                "prevPath": "/reference/input/on-pin-pressed",
                "nextName": "compass heading",
                "nextPath": "/reference/input/compass-heading"
              },
              {
                "name": "compass heading",
                "subitems": [],
                "path": "/reference/input/compass-heading",
                "prevName": "button is pressed",
                "prevPath": "/reference/input/button-is-pressed",
                "nextName": "pin is pressed",
                "nextPath": "/reference/input/pin-is-pressed"
              },
              {
                "name": "pin is pressed",
                "subitems": [],
                "path": "/reference/input/pin-is-pressed",
                "prevName": "compass heading",
                "prevPath": "/reference/input/compass-heading",
                "nextName": "temperature",
                "nextPath": "/reference/input/temperature"
              },
              {
                "name": "temperature",
                "subitems": [],
                "path": "/reference/input/temperature",
                "prevName": "pin is pressed",
                "prevPath": "/reference/input/pin-is-pressed",
                "nextName": "acceleration",
                "nextPath": "/reference/input/acceleration"
              },
              {
                "name": "acceleration",
                "subitems": [],
                "path": "/reference/input/acceleration",
                "prevName": "temperature",
                "prevPath": "/reference/input/temperature",
                "nextName": "light level",
                "nextPath": "/reference/input/light-level"
              },
              {
                "name": "light level",
                "subitems": [],
                "path": "/reference/input/light-level",
                "prevName": "acceleration",
                "prevPath": "/reference/input/acceleration",
                "nextName": "rotation",
                "nextPath": "/reference/input/rotation"
              },
              {
                "name": "rotation",
                "subitems": [],
                "path": "/reference/input/rotation",
                "prevName": "light level",
                "prevPath": "/reference/input/light-level",
                "nextName": "magnetic force",
                "nextPath": "/reference/input/magnetic-force"
              },
              {
                "name": "magnetic force",
                "subitems": [],
                "path": "/reference/input/magnetic-force",
                "prevName": "rotation",
                "prevPath": "/reference/input/rotation",
                "nextName": "running time",
                "nextPath": "/reference/input/running-time"
              },
              {
                "name": "running time",
                "subitems": [],
                "path": "/reference/input/running-time",
                "prevName": "magnetic force",
                "prevPath": "/reference/input/magnetic-force",
                "nextName": "set accelerometer range",
                "nextPath": "/reference/input/set-accelerometer-range"
              },
              {
                "name": "set accelerometer range",
                "subitems": [],
                "path": "/reference/input/set-accelerometer-range",
                "prevName": "running time",
                "prevPath": "/reference/input/running-time",
                "nextName": "Music",
                "nextPath": "/reference/music"
              }
            ],
            "path": "/reference/input",
            "prevName": "show animation",
            "prevPath": "/reference/basic/show-animation",
            "nextName": "on button pressed",
            "nextPath": "/reference/input/on-button-pressed"
          },
          {
            "name": "Music",
            "subitems": [
              {
                "name": "play tone",
                "subitems": [],
                "path": "/reference/music/play-tone",
                "prevName": "Music",
                "prevPath": "/reference/music",
                "nextName": "ring tone",
                "nextPath": "/reference/music/ring-tone"
              },
              {
                "name": "ring tone",
                "subitems": [],
                "path": "/reference/music/ring-tone",
                "prevName": "play tone",
                "prevPath": "/reference/music/play-tone",
                "nextName": "rest",
                "nextPath": "/reference/music/rest"
              },
              {
                "name": "rest",
                "subitems": [],
                "path": "/reference/music/rest",
                "prevName": "ring tone",
                "prevPath": "/reference/music/ring-tone",
                "nextName": "beat",
                "nextPath": "/reference/music/beat"
              },
              {
                "name": "beat",
                "subitems": [],
                "path": "/reference/music/beat",
                "prevName": "rest",
                "prevPath": "/reference/music/rest",
                "nextName": "tempo",
                "nextPath": "/reference/music/tempo"
              },
              {
                "name": "tempo",
                "subitems": [],
                "path": "/reference/music/tempo",
                "prevName": "beat",
                "prevPath": "/reference/music/beat",
                "nextName": "change tempo by",
                "nextPath": "/reference/music/change-tempo-by"
              },
              {
                "name": "change tempo by",
                "subitems": [],
                "path": "/reference/music/change-tempo-by",
                "prevName": "tempo",
                "prevPath": "/reference/music/tempo",
                "nextName": "set tempo",
                "nextPath": "/reference/music/set-tempo"
              },
              {
                "name": "set tempo",
                "subitems": [],
                "path": "/reference/music/set-tempo",
                "prevName": "change tempo by",
                "prevPath": "/reference/music/change-tempo-by",
                "nextName": "Led",
                "nextPath": "/reference/led"
              }
            ],
            "path": "/reference/music",
            "prevName": "set accelerometer range",
            "prevPath": "/reference/input/set-accelerometer-range",
            "nextName": "play tone",
            "nextPath": "/reference/music/play-tone"
          },
          {
            "name": "Led",
            "subitems": [
              {
                "name": "plot",
                "subitems": [],
                "path": "/reference/led/plot",
                "prevName": "Led",
                "prevPath": "/reference/led",
                "nextName": "unplot",
                "nextPath": "/reference/led/unplot"
              },
              {
                "name": "unplot",
                "subitems": [],
                "path": "/reference/led/unplot",
                "prevName": "plot",
                "prevPath": "/reference/led/plot",
                "nextName": "point",
                "nextPath": "/reference/led/point"
              },
              {
                "name": "point",
                "subitems": [],
                "path": "/reference/led/point",
                "prevName": "unplot",
                "prevPath": "/reference/led/unplot",
                "nextName": "toggle",
                "nextPath": "/reference/led/toggle"
              },
              {
                "name": "toggle",
                "subitems": [],
                "path": "/reference/led/toggle",
                "prevName": "point",
                "prevPath": "/reference/led/point",
                "nextName": "brightness",
                "nextPath": "/reference/led/brightness"
              },
              {
                "name": "brightness",
                "subitems": [],
                "path": "/reference/led/brightness",
                "prevName": "toggle",
                "prevPath": "/reference/led/toggle",
                "nextName": "set brightness",
                "nextPath": "/reference/led/set-brightness"
              },
              {
                "name": "set brightness",
                "subitems": [],
                "path": "/reference/led/set-brightness",
                "prevName": "brightness",
                "prevPath": "/reference/led/brightness",
                "nextName": "stop animation",
                "nextPath": "/reference/led/stop-animation"
              },
              {
                "name": "stop animation",
                "subitems": [],
                "path": "/reference/led/stop-animation",
                "prevName": "set brightness",
                "prevPath": "/reference/led/set-brightness",
                "nextName": "plot bar graph",
                "nextPath": "/reference/led/plot-bar-graph"
              },
              {
                "name": "plot bar graph",
                "subitems": [],
                "path": "/reference/led/plot-bar-graph",
                "prevName": "stop animation",
                "prevPath": "/reference/led/stop-animation",
                "nextName": "enable",
                "nextPath": "/reference/led/enable"
              },
              {
                "name": "enable",
                "subitems": [],
                "path": "/reference/led/enable",
                "prevName": "plot bar graph",
                "prevPath": "/reference/led/plot-bar-graph",
                "nextName": "Radio",
                "nextPath": "/reference/radio"
              }
            ],
            "path": "/reference/led",
            "prevName": "set tempo",
            "prevPath": "/reference/music/set-tempo",
            "nextName": "plot",
            "nextPath": "/reference/led/plot"
          },
          {
            "name": "Radio",
            "subitems": [
              {
                "name": "send number",
                "subitems": [],
                "path": "/reference/radio/send-number",
                "prevName": "Radio",
                "prevPath": "/reference/radio",
                "nextName": "send value",
                "nextPath": "/reference/radio/send-value"
              },
              {
                "name": "send value",
                "subitems": [],
                "path": "/reference/radio/send-value",
                "prevName": "send number",
                "prevPath": "/reference/radio/send-number",
                "nextName": "send string",
                "nextPath": "/reference/radio/send-string"
              },
              {
                "name": "send string",
                "subitems": [],
                "path": "/reference/radio/send-string",
                "prevName": "send value",
                "prevPath": "/reference/radio/send-value",
                "nextName": "on data packet received",
                "nextPath": "/reference/radio/on-data-packet-received"
              },
              {
                "name": "on data packet received",
                "subitems": [],
                "path": "/reference/radio/on-data-packet-received",
                "prevName": "send string",
                "prevPath": "/reference/radio/send-string",
                "nextName": "set group",
                "nextPath": "/reference/radio/set-group"
              },
              {
                "name": "set group",
                "subitems": [],
                "path": "/reference/radio/set-group",
                "prevName": "on data packet received",
                "prevPath": "/reference/radio/on-data-packet-received",
                "nextName": "set transmit power",
                "nextPath": "/reference/radio/set-transmit-power"
              },
              {
                "name": "set transmit power",
                "subitems": [],
                "path": "/reference/radio/set-transmit-power",
                "prevName": "set group",
                "prevPath": "/reference/radio/set-group",
                "nextName": "set transmit serial number",
                "nextPath": "/reference/radio/set-transmit-serial-number"
              },
              {
                "name": "set transmit serial number",
                "subitems": [],
                "path": "/reference/radio/set-transmit-serial-number",
                "prevName": "set transmit power",
                "prevPath": "/reference/radio/set-transmit-power",
                "nextName": "write received packet to serial",
                "nextPath": "/reference/radio/write-received-packet-to-serial"
              },
              {
                "name": "write received packet to serial",
                "subitems": [],
                "path": "/reference/radio/write-received-packet-to-serial",
                "prevName": "set transmit serial number",
                "prevPath": "/reference/radio/set-transmit-serial-number",
                "nextName": "Game",
                "nextPath": "/reference/game"
              }
            ],
            "path": "/reference/radio",
            "prevName": "enable",
            "prevPath": "/reference/led/enable",
            "nextName": "send number",
            "nextPath": "/reference/radio/send-number"
          },
          {
            "name": "Game",
            "subitems": [
              {
                "name": "create sprite",
                "subitems": [],
                "path": "/reference/game/create-sprite",
                "prevName": "Game",
                "prevPath": "/reference/game",
                "nextName": "delete",
                "nextPath": "/reference/game/delete"
              },
              {
                "name": "delete",
                "subitems": [],
                "path": "/reference/game/delete",
                "prevName": "create sprite",
                "prevPath": "/reference/game/create-sprite",
                "nextName": "move",
                "nextPath": "/reference/game/move"
              },
              {
                "name": "move",
                "subitems": [],
                "path": "/reference/game/move",
                "prevName": "delete",
                "prevPath": "/reference/game/delete",
                "nextName": "turn",
                "nextPath": "/reference/game/turn"
              },
              {
                "name": "turn",
                "subitems": [],
                "path": "/reference/game/turn",
                "prevName": "move",
                "prevPath": "/reference/game/move",
                "nextName": "in on edge bounce",
                "nextPath": "/reference/game/if-on-edge-bounce"
              },
              {
                "name": "in on edge bounce",
                "subitems": [],
                "path": "/reference/game/if-on-edge-bounce",
                "prevName": "turn",
                "prevPath": "/reference/game/turn",
                "nextName": "get",
                "nextPath": "/reference/game/get"
              },
              {
                "name": "get",
                "subitems": [],
                "path": "/reference/game/get",
                "prevName": "in on edge bounce",
                "prevPath": "/reference/game/if-on-edge-bounce",
                "nextName": "set",
                "nextPath": "/reference/game/set"
              },
              {
                "name": "set",
                "subitems": [],
                "path": "/reference/game/set",
                "prevName": "get",
                "prevPath": "/reference/game/get",
                "nextName": "change",
                "nextPath": "/reference/game/change"
              },
              {
                "name": "change",
                "subitems": [],
                "path": "/reference/game/change",
                "prevName": "set",
                "prevPath": "/reference/game/set",
                "nextName": "is touching",
                "nextPath": "/reference/game/is-touching"
              },
              {
                "name": "is touching",
                "subitems": [],
                "path": "/reference/game/is-touching",
                "prevName": "change",
                "prevPath": "/reference/game/change",
                "nextName": "is touching edge",
                "nextPath": "/reference/game/is-touching-edge"
              },
              {
                "name": "is touching edge",
                "subitems": [],
                "path": "/reference/game/is-touching-edge",
                "prevName": "is touching",
                "prevPath": "/reference/game/is-touching",
                "nextName": "add score",
                "nextPath": "/reference/game/add-score"
              },
              {
                "name": "add score",
                "subitems": [],
                "path": "/reference/game/add-score",
                "prevName": "is touching edge",
                "prevPath": "/reference/game/is-touching-edge",
                "nextName": "score",
                "nextPath": "/reference/game/score"
              },
              {
                "name": "score",
                "subitems": [],
                "path": "/reference/game/score",
                "prevName": "add score",
                "prevPath": "/reference/game/add-score",
                "nextName": "set score",
                "nextPath": "/reference/game/set-score"
              },
              {
                "name": "set score",
                "subitems": [],
                "path": "/reference/game/set-score",
                "prevName": "score",
                "prevPath": "/reference/game/score",
                "nextName": "start countdown",
                "nextPath": "/reference/game/start-countdown"
              },
              {
                "name": "start countdown",
                "subitems": [],
                "path": "/reference/game/start-countdown",
                "prevName": "set score",
                "prevPath": "/reference/game/set-score",
                "nextName": "game over",
                "nextPath": "/reference/game/game-over"
              },
              {
                "name": "game over",
                "subitems": [],
                "path": "/reference/game/game-over",
                "prevName": "start countdown",
                "prevPath": "/reference/game/start-countdown",
                "nextName": "pause",
                "nextPath": "/reference/game/pause"
              },
              {
                "name": "pause",
                "subitems": [],
                "path": "/reference/game/pause",
                "prevName": "game over",
                "prevPath": "/reference/game/game-over",
                "nextName": "resume",
                "nextPath": "/reference/game/resume"
              },
              {
                "name": "resume",
                "subitems": [],
                "path": "/reference/game/resume",
                "prevName": "pause",
                "prevPath": "/reference/game/pause",
                "nextName": "Images",
                "nextPath": "/reference/images"
              }
            ],
            "path": "/reference/game",
            "prevName": "write received packet to serial",
            "prevPath": "/reference/radio/write-received-packet-to-serial",
            "nextName": "create sprite",
            "nextPath": "/reference/game/create-sprite"
          },
          {
            "name": "Images",
            "subitems": [
              {
                "name": "create image",
                "subitems": [],
                "path": "/reference/images/create-image",
                "prevName": "Images",
                "prevPath": "/reference/images",
                "nextName": "create big image",
                "nextPath": "/reference/images/create-big-image"
              },
              {
                "name": "create big image",
                "subitems": [],
                "path": "/reference/images/create-big-image",
                "prevName": "create image",
                "prevPath": "/reference/images/create-image",
                "nextName": "show image",
                "nextPath": "/reference/images/show-image"
              },
              {
                "name": "show image",
                "subitems": [],
                "path": "/reference/images/show-image",
                "prevName": "create big image",
                "prevPath": "/reference/images/create-big-image",
                "nextName": "scroll image",
                "nextPath": "/reference/images/scroll-image"
              },
              {
                "name": "scroll image",
                "subitems": [],
                "path": "/reference/images/scroll-image",
                "prevName": "show image",
                "prevPath": "/reference/images/show-image",
                "nextName": "arrow image",
                "nextPath": "/reference/images/arrow-image"
              },
              {
                "name": "arrow image",
                "subitems": [],
                "path": "/reference/images/arrow-image",
                "prevName": "scroll image",
                "prevPath": "/reference/images/scroll-image",
                "nextName": "icon image",
                "nextPath": "/reference/images/icon-image"
              },
              {
                "name": "icon image",
                "subitems": [],
                "path": "/reference/images/icon-image",
                "prevName": "arrow image",
                "prevPath": "/reference/images/arrow-image",
                "nextName": "arrow number",
                "nextPath": "/reference/images/arrow-number"
              },
              {
                "name": "arrow number",
                "subitems": [],
                "path": "/reference/images/arrow-number",
                "prevName": "icon image",
                "prevPath": "/reference/images/icon-image",
                "nextName": "Pins",
                "nextPath": "/reference/pins"
              }
            ],
            "path": "/reference/images",
            "prevName": "resume",
            "prevPath": "/reference/game/resume",
            "nextName": "create image",
            "nextPath": "/reference/images/create-image"
          },
          {
            "name": "Pins",
            "subitems": [
              {
                "name": "digital read pin",
                "subitems": [],
                "path": "/reference/pins/digital-read-pin",
                "prevName": "Pins",
                "prevPath": "/reference/pins",
                "nextName": "digital write pin",
                "nextPath": "/reference/pins/digital-write-pin"
              },
              {
                "name": "digital write pin",
                "subitems": [],
                "path": "/reference/pins/digital-write-pin",
                "prevName": "digital read pin",
                "prevPath": "/reference/pins/digital-read-pin",
                "nextName": "analog read pin",
                "nextPath": "/reference/pins/analog-read-pin"
              },
              {
                "name": "analog read pin",
                "subitems": [],
                "path": "/reference/pins/analog-read-pin",
                "prevName": "digital write pin",
                "prevPath": "/reference/pins/digital-write-pin",
                "nextName": "analog write pin",
                "nextPath": "/reference/pins/analog-write-pin"
              },
              {
                "name": "analog write pin",
                "subitems": [],
                "path": "/reference/pins/analog-write-pin",
                "prevName": "analog read pin",
                "prevPath": "/reference/pins/analog-read-pin",
                "nextName": "analog set period",
                "nextPath": "/reference/pins/analog-set-period"
              },
              {
                "name": "analog set period",
                "subitems": [],
                "path": "/reference/pins/analog-set-period",
                "prevName": "analog write pin",
                "prevPath": "/reference/pins/analog-write-pin",
                "nextName": "map",
                "nextPath": "/reference/pins/map"
              },
              {
                "name": "map",
                "subitems": [],
                "path": "/reference/pins/map",
                "prevName": "analog set period",
                "prevPath": "/reference/pins/analog-set-period",
                "nextName": "on pulsed",
                "nextPath": "/reference/pins/on-pulsed"
              },
              {
                "name": "on pulsed",
                "subitems": [],
                "path": "/reference/pins/on-pulsed",
                "prevName": "map",
                "prevPath": "/reference/pins/map",
                "nextName": "pulse duration",
                "nextPath": "/reference/pins/pulse-duration"
              },
              {
                "name": "pulse duration",
                "subitems": [],
                "path": "/reference/pins/pulse-duration",
                "prevName": "on pulsed",
                "prevPath": "/reference/pins/on-pulsed",
                "nextName": "pulse in",
                "nextPath": "/reference/pins/pulse-in"
              },
              {
                "name": "pulse in",
                "subitems": [],
                "path": "/reference/pins/pulse-in",
                "prevName": "pulse duration",
                "prevPath": "/reference/pins/pulse-duration",
                "nextName": "servo write pin",
                "nextPath": "/reference/pins/servo-write-pin"
              },
              {
                "name": "servo write pin",
                "subitems": [],
                "path": "/reference/pins/servo-write-pin",
                "prevName": "pulse in",
                "prevPath": "/reference/pins/pulse-in",
                "nextName": "servo set pulse",
                "nextPath": "/reference/pins/servo-set-pulse"
              },
              {
                "name": "servo set pulse",
                "subitems": [],
                "path": "/reference/pins/servo-set-pulse",
                "prevName": "servo write pin",
                "prevPath": "/reference/pins/servo-write-pin",
                "nextName": "i2c read number",
                "nextPath": "/reference/pins/i2c-read-number"
              },
              {
                "name": "i2c read number",
                "subitems": [],
                "path": "/reference/pins/i2c-read-number",
                "prevName": "servo set pulse",
                "prevPath": "/reference/pins/servo-set-pulse",
                "nextName": "i2c write number",
                "nextPath": "/reference/pins/i2c-write-number"
              },
              {
                "name": "i2c write number",
                "subitems": [],
                "path": "/reference/pins/i2c-write-number",
                "prevName": "i2c read number",
                "prevPath": "/reference/pins/i2c-read-number",
                "nextName": "set pull",
                "nextPath": "/reference/pins/set-pull"
              },
              {
                "name": "set pull",
                "subitems": [],
                "path": "/reference/pins/set-pull",
                "prevName": "i2c write number",
                "prevPath": "/reference/pins/i2c-write-number",
                "nextName": "analog pitch",
                "nextPath": "/reference/pins/analog-pitch"
              },
              {
                "name": "analog pitch",
                "subitems": [],
                "path": "/reference/pins/analog-pitch",
                "prevName": "set pull",
                "prevPath": "/reference/pins/set-pull",
                "nextName": "analog set pitch pin",
                "nextPath": "/reference/pins/analog-set-pitch-pin"
              },
              {
                "name": "analog set pitch pin",
                "subitems": [],
                "path": "/reference/pins/analog-set-pitch-pin",
                "prevName": "analog pitch",
                "prevPath": "/reference/pins/analog-pitch",
                "nextName": "spi write",
                "nextPath": "/reference/pins/spi-write"
              },
              {
                "name": "spi write",
                "subitems": [],
                "path": "/reference/pins/spi-write",
                "prevName": "analog set pitch pin",
                "prevPath": "/reference/pins/analog-set-pitch-pin",
                "nextName": "spi Pins",
                "nextPath": "/reference/pins/spi-pins"
              },
              {
                "name": "spi Pins",
                "subitems": [],
                "path": "/reference/pins/spi-pins",
                "prevName": "spi write",
                "prevPath": "/reference/pins/spi-write",
                "nextName": "spi format",
                "nextPath": "/reference/pins/spi-format"
              },
              {
                "name": "spi format",
                "subitems": [],
                "path": "/reference/pins/spi-format",
                "prevName": "spi Pins",
                "prevPath": "/reference/pins/spi-pins",
                "nextName": "spi frequency",
                "nextPath": "/reference/pins/spi-frequency"
              },
              {
                "name": "spi frequency",
                "subitems": [],
                "path": "/reference/pins/spi-frequency",
                "prevName": "spi format",
                "prevPath": "/reference/pins/spi-format",
                "nextName": "Serial",
                "nextPath": "/reference/serial"
              }
            ],
            "path": "/reference/pins",
            "prevName": "arrow number",
            "prevPath": "/reference/images/arrow-number",
            "nextName": "digital read pin",
            "nextPath": "/reference/pins/digital-read-pin"
          },
          {
            "name": "Serial",
            "subitems": [
              {
                "name": "write line",
                "subitems": [],
                "path": "/reference/serial/write-line",
                "prevName": "Serial",
                "prevPath": "/reference/serial",
                "nextName": "write number",
                "nextPath": "/reference/serial/write-number"
              },
              {
                "name": "write number",
                "subitems": [],
                "path": "/reference/serial/write-number",
                "prevName": "write line",
                "prevPath": "/reference/serial/write-line",
                "nextName": "write value",
                "nextPath": "/reference/serial/write-value"
              },
              {
                "name": "write value",
                "subitems": [],
                "path": "/reference/serial/write-value",
                "prevName": "write number",
                "prevPath": "/reference/serial/write-number",
                "nextName": "write string",
                "nextPath": "/reference/serial/write-string"
              },
              {
                "name": "write string",
                "subitems": [],
                "path": "/reference/serial/write-string",
                "prevName": "write value",
                "prevPath": "/reference/serial/write-value",
                "nextName": "read until",
                "nextPath": "/reference/serial/read-until"
              },
              {
                "name": "read until",
                "subitems": [],
                "path": "/reference/serial/read-until",
                "prevName": "write string",
                "prevPath": "/reference/serial/write-string",
                "nextName": "read line",
                "nextPath": "/reference/serial/read-line"
              },
              {
                "name": "read line",
                "subitems": [],
                "path": "/reference/serial/read-line",
                "prevName": "read until",
                "prevPath": "/reference/serial/read-until",
                "nextName": "read string",
                "nextPath": "/reference/serial/read-string"
              },
              {
                "name": "read string",
                "subitems": [],
                "path": "/reference/serial/read-string",
                "prevName": "read line",
                "prevPath": "/reference/serial/read-line",
                "nextName": "on data received",
                "nextPath": "/reference/serial/on-data-received"
              },
              {
                "name": "on data received",
                "subitems": [],
                "path": "/reference/serial/on-data-received",
                "prevName": "read string",
                "prevPath": "/reference/serial/read-string",
                "nextName": "redirect",
                "nextPath": "/reference/serial/redirect"
              },
              {
                "name": "redirect",
                "subitems": [],
                "path": "/reference/serial/redirect",
                "prevName": "on data received",
                "prevPath": "/reference/serial/on-data-received",
                "nextName": "redirect to usb",
                "nextPath": "/reference/serial/redirect-to-usb"
              },
              {
                "name": "redirect to usb",
                "subitems": [],
                "path": "/reference/serial/redirect-to-usb",
                "prevName": "redirect",
                "prevPath": "/reference/serial/redirect",
                "nextName": "write buffer",
                "nextPath": "/reference/serial/write-buffer"
              },
              {
                "name": "write buffer",
                "subitems": [],
                "path": "/reference/serial/write-buffer",
                "prevName": "redirect to usb",
                "prevPath": "/reference/serial/redirect-to-usb",
                "nextName": "read buffer",
                "nextPath": "/reference/serial/read-buffer"
              },
              {
                "name": "read buffer",
                "subitems": [],
                "path": "/reference/serial/read-buffer",
                "prevName": "write buffer",
                "prevPath": "/reference/serial/write-buffer",
                "nextName": "Control",
                "nextPath": "/reference/control"
              }
            ],
            "path": "/reference/serial",
            "prevName": "spi frequency",
            "prevPath": "/reference/pins/spi-frequency",
            "nextName": "write line",
            "nextPath": "/reference/serial/write-line"
          },
          {
            "name": "Control",
            "subitems": [
              {
                "name": "in background",
                "subitems": [],
                "path": "/reference/control/in-background",
                "prevName": "Control",
                "prevPath": "/reference/control",
                "nextName": "reset",
                "nextPath": "/reference/control/reset"
              },
              {
                "name": "reset",
                "subitems": [],
                "path": "/reference/control/reset",
                "prevName": "in background",
                "prevPath": "/reference/control/in-background",
                "nextName": "wait micros",
                "nextPath": "/reference/control/wait-micros"
              },
              {
                "name": "wait micros",
                "subitems": [],
                "path": "/reference/control/wait-micros",
                "prevName": "reset",
                "prevPath": "/reference/control/reset",
                "nextName": "on event",
                "nextPath": "/reference/control/on-event"
              },
              {
                "name": "on event",
                "subitems": [],
                "path": "/reference/control/on-event",
                "prevName": "wait micros",
                "prevPath": "/reference/control/wait-micros",
                "nextName": "raise event",
                "nextPath": "/reference/control/raise-event"
              },
              {
                "name": "raise event",
                "subitems": [],
                "path": "/reference/control/raise-event",
                "prevName": "on event",
                "prevPath": "/reference/control/on-event",
                "nextName": "event timestamp",
                "nextPath": "/reference/control/event-timestamp"
              },
              {
                "name": "event timestamp",
                "subitems": [],
                "path": "/reference/control/event-timestamp",
                "prevName": "raise event",
                "prevPath": "/reference/control/raise-event",
                "nextName": "event value",
                "nextPath": "/reference/control/event-value"
              },
              {
                "name": "event value",
                "subitems": [],
                "path": "/reference/control/event-value",
                "prevName": "event timestamp",
                "prevPath": "/reference/control/event-timestamp",
                "nextName": "Bluetooth",
                "nextPath": "/reference/bluetooth"
              }
            ],
            "path": "/reference/control",
            "prevName": "read buffer",
            "prevPath": "/reference/serial/read-buffer",
            "nextName": "in background",
            "nextPath": "/reference/control/in-background"
          },
          {
            "name": "Bluetooth",
            "subitems": [
              {
                "name": "",
                "subitems": [],
                "prevName": "Bluetooth",
                "prevPath": "/reference/bluetooth"
              },
              {
                "name": "Pairing",
                "subitems": [],
                "path": "/reference/bluetooth/bluetooth-pairing",
                "prevName": "Bluetooth",
                "prevPath": "/reference/bluetooth",
                "nextName": "on bluetooth connected",
                "nextPath": "/reference/bluetooth/on-bluetooth-connected"
              },
              {
                "name": "on bluetooth connected",
                "subitems": [],
                "path": "/reference/bluetooth/on-bluetooth-connected",
                "prevName": "Pairing",
                "prevPath": "/reference/bluetooth/bluetooth-pairing",
                "nextName": "on bluetooth disconnected",
                "nextPath": "/reference/bluetooth/on-bluetooth-disconnected"
              },
              {
                "name": "on bluetooth disconnected",
                "subitems": [],
                "path": "/reference/bluetooth/on-bluetooth-disconnected",
                "prevName": "on bluetooth connected",
                "prevPath": "/reference/bluetooth/on-bluetooth-connected",
                "nextName": "start accelerometer service",
                "nextPath": "/reference/bluetooth/start-accelerometer-service"
              },
              {
                "name": "start accelerometer service",
                "subitems": [],
                "path": "/reference/bluetooth/start-accelerometer-service",
                "prevName": "on bluetooth disconnected",
                "prevPath": "/reference/bluetooth/on-bluetooth-disconnected",
                "nextName": "start button service",
                "nextPath": "/reference/bluetooth/start-button-service"
              },
              {
                "name": "start button service",
                "subitems": [],
                "path": "/reference/bluetooth/start-button-service",
                "prevName": "start accelerometer service",
                "prevPath": "/reference/bluetooth/start-accelerometer-service",
                "nextName": "start io pin service",
                "nextPath": "/reference/bluetooth/start-io-pin-service"
              },
              {
                "name": "start io pin service",
                "subitems": [],
                "path": "/reference/bluetooth/start-io-pin-service",
                "prevName": "start button service",
                "prevPath": "/reference/bluetooth/start-button-service",
                "nextName": "start led service",
                "nextPath": "/reference/bluetooth/start-led-service"
              },
              {
                "name": "start led service",
                "subitems": [],
                "path": "/reference/bluetooth/start-led-service",
                "prevName": "start io pin service",
                "prevPath": "/reference/bluetooth/start-io-pin-service",
                "nextName": "start magnetometer service",
                "nextPath": "/reference/bluetooth/start-magnetometer-service"
              },
              {
                "name": "start magnetometer service",
                "subitems": [],
                "path": "/reference/bluetooth/start-magnetometer-service",
                "prevName": "start led service",
                "prevPath": "/reference/bluetooth/start-led-service",
                "nextName": "start temperature service",
                "nextPath": "/reference/bluetooth/start-temperature-service"
              },
              {
                "name": "start temperature service",
                "subitems": [],
                "path": "/reference/bluetooth/start-temperature-service",
                "prevName": "start magnetometer service",
                "prevPath": "/reference/bluetooth/start-magnetometer-service",
                "nextName": "start uart service",
                "nextPath": "/reference/bluetooth/start-uart-service"
              },
              {
                "name": "start uart service",
                "subitems": [],
                "path": "/reference/bluetooth/start-uart-service",
                "prevName": "start temperature service",
                "prevPath": "/reference/bluetooth/start-temperature-service",
                "nextName": "uart read until",
                "nextPath": "/reference/bluetooth/uart-read-until"
              },
              {
                "name": "uart read until",
                "subitems": [],
                "path": "/reference/bluetooth/uart-read-until",
                "prevName": "start uart service",
                "prevPath": "/reference/bluetooth/start-uart-service",
                "nextName": "uart write string",
                "nextPath": "/reference/bluetooth/uart-write-string"
              },
              {
                "name": "uart write string",
                "subitems": [],
                "path": "/reference/bluetooth/uart-write-string",
                "prevName": "uart read until",
                "prevPath": "/reference/bluetooth/uart-read-until",
                "nextName": "uart write number",
                "nextPath": "/reference/bluetooth/uart-write-number"
              },
              {
                "name": "uart write number",
                "subitems": [],
                "path": "/reference/bluetooth/uart-write-number",
                "prevName": "uart write string",
                "prevPath": "/reference/bluetooth/uart-write-string",
                "nextName": "uart write value",
                "nextPath": "/reference/bluetooth/uart-write-value"
              },
              {
                "name": "uart write value",
                "subitems": [],
                "path": "/reference/bluetooth/uart-write-value",
                "prevName": "uart write number",
                "prevPath": "/reference/bluetooth/uart-write-number",
                "nextName": "advertise url",
                "nextPath": "/reference/bluetooth/advertise-url"
              },
              {
                "name": "advertise url",
                "subitems": [],
                "path": "/reference/bluetooth/advertise-url",
                "prevName": "uart write value",
                "prevPath": "/reference/bluetooth/uart-write-value",
                "nextName": "stop advertising",
                "nextPath": "/reference/bluetooth/stop-advertising"
              },
              {
                "name": "stop advertising",
                "subitems": [],
                "path": "/reference/bluetooth/stop-advertising",
                "prevName": "advertise url",
                "prevPath": "/reference/bluetooth/advertise-url",
                "nextName": "advertise uid",
                "nextPath": "/reference/bluetooth/advertise-uid"
              },
              {
                "name": "advertise uid",
                "subitems": [],
                "path": "/reference/bluetooth/advertise-uid",
                "prevName": "stop advertising",
                "prevPath": "/reference/bluetooth/stop-advertising",
                "nextName": "advertise-uid-buffer",
                "nextPath": "/reference/bluetooth/advertise-uid-buffer"
              },
              {
                "name": "advertise-uid-buffer",
                "subitems": [],
                "path": "/reference/bluetooth/advertise-uid-buffer",
                "prevName": "advertise uid",
                "prevPath": "/reference/bluetooth/advertise-uid",
                "nextName": "Devices",
                "nextPath": "/reference/devices"
              }
            ],
            "path": "/reference/bluetooth",
            "prevName": "event value",
            "prevPath": "/reference/control/event-value",
            "nextName": "Pairing",
            "nextPath": "/reference/bluetooth/bluetooth-pairing"
          },
          {
            "name": "Devices",
            "subitems": [
              {
                "name": "tell camera to",
                "subitems": [],
                "path": "/reference/devices/tell-camera-to",
                "prevName": "Devices",
                "prevPath": "/reference/devices",
                "nextName": "tell remote control to",
                "nextPath": "/reference/devices/tell-remote-control-to"
              },
              {
                "name": "tell remote control to",
                "subitems": [],
                "path": "/reference/devices/tell-remote-control-to",
                "prevName": "tell camera to",
                "prevPath": "/reference/devices/tell-camera-to",
                "nextName": "raise alert to",
                "nextPath": "/reference/devices/raise-alert-to"
              },
              {
                "name": "raise alert to",
                "subitems": [],
                "path": "/reference/devices/raise-alert-to",
                "prevName": "tell remote control to",
                "prevPath": "/reference/devices/tell-remote-control-to",
                "nextName": "on notified",
                "nextPath": "/reference/devices/on-notified"
              },
              {
                "name": "on notified",
                "subitems": [],
                "path": "/reference/devices/on-notified",
                "prevName": "raise alert to",
                "prevPath": "/reference/devices/raise-alert-to",
                "nextName": "on gamepad button",
                "nextPath": "/reference/devices/on-gamepad-button"
              },
              {
                "name": "on gamepad button",
                "subitems": [],
                "path": "/reference/devices/on-gamepad-button",
                "prevName": "on notified",
                "prevPath": "/reference/devices/on-notified",
                "nextName": "signal strength",
                "nextPath": "/reference/devices/signal-strength"
              },
              {
                "name": "signal strength",
                "subitems": [],
                "path": "/reference/devices/signal-strength",
                "prevName": "on gamepad button",
                "prevPath": "/reference/devices/on-gamepad-button",
                "nextName": "on signal strength changed",
                "nextPath": "/reference/devices/on-signal-strength-changed"
              },
              {
                "name": "on signal strength changed",
                "subitems": [],
                "path": "/reference/devices/on-signal-strength-changed",
                "prevName": "signal strength",
                "prevPath": "/reference/devices/signal-strength",
                "nextName": "Packages",
                "nextPath": "/packages"
              }
            ],
            "path": "/reference/devices",
            "prevName": "advertise-uid-buffer",
            "prevPath": "/reference/bluetooth/advertise-uid-buffer",
            "nextName": "tell camera to",
            "nextPath": "/reference/devices/tell-camera-to"
          }
        ],
        "path": "/reference",
        "prevName": "Resources",
        "prevPath": "/courses/ucp-science/electricity/resources",
        "nextName": "Basic",
        "nextPath": "/reference/basic"
      },
      {
        "name": "Packages",
        "subitems": [],
        "path": "/packages",
        "prevName": "on signal strength changed",
        "prevPath": "/reference/devices/on-signal-strength-changed",
        "nextName": "Blocks",
        "nextPath": "/blocks"
      },
      {
        "name": "Blocks",
        "subitems": [
          {
            "name": "On Start",
            "subitems": [],
            "path": "/blocks/on-start",
            "prevName": "Blocks",
            "prevPath": "/blocks",
            "nextName": "Loops",
            "nextPath": "/blocks/loops"
          },
          {
            "name": "Loops",
            "subitems": [
              {
                "name": "repeat",
                "subitems": [],
                "path": "/blocks/loops/repeat",
                "prevName": "Loops",
                "prevPath": "/blocks/loops",
                "nextName": "for",
                "nextPath": "/blocks/loops/for"
              },
              {
                "name": "for",
                "subitems": [],
                "path": "/blocks/loops/for",
                "prevName": "repeat",
                "prevPath": "/blocks/loops/repeat",
                "nextName": "while",
                "nextPath": "/blocks/loops/while"
              },
              {
                "name": "while",
                "subitems": [],
                "path": "/blocks/loops/while",
                "prevName": "for",
                "prevPath": "/blocks/loops/for",
                "nextName": "Logic",
                "nextPath": "/blocks/logic"
              }
            ],
            "path": "/blocks/loops",
            "prevName": "On Start",
            "prevPath": "/blocks/on-start",
            "nextName": "repeat",
            "nextPath": "/blocks/loops/repeat"
          },
          {
            "name": "Logic",
            "subitems": [
              {
                "name": "if",
                "subitems": [],
                "path": "/blocks/logic/if",
                "prevName": "Logic",
                "prevPath": "/blocks/logic",
                "nextName": "Boolean",
                "nextPath": "/blocks/logic/boolean"
              },
              {
                "name": "Boolean",
                "subitems": [],
                "path": "/blocks/logic/boolean",
                "prevName": "if",
                "prevPath": "/blocks/logic/if",
                "nextName": "Variables",
                "nextPath": "/blocks/variables"
              }
            ],
            "path": "/blocks/logic",
            "prevName": "while",
            "prevPath": "/blocks/loops/while",
            "nextName": "if",
            "nextPath": "/blocks/logic/if"
          },
          {
            "name": "Variables",
            "subitems": [
              {
                "name": "assign",
                "subitems": [],
                "path": "/blocks/variables/assign",
                "prevName": "Variables",
                "prevPath": "/blocks/variables",
                "nextName": "change var",
                "nextPath": "/blocks/variables/change"
              },
              {
                "name": "change var",
                "subitems": [],
                "path": "/blocks/variables/change",
                "prevName": "assign",
                "prevPath": "/blocks/variables/assign",
                "nextName": "var",
                "nextPath": "/blocks/variables/var"
              },
              {
                "name": "var",
                "subitems": [],
                "path": "/blocks/variables/var",
                "prevName": "change var",
                "prevPath": "/blocks/variables/change",
                "nextName": "Math",
                "nextPath": "/blocks/math"
              }
            ],
            "path": "/blocks/variables",
            "prevName": "Boolean",
            "prevPath": "/blocks/logic/boolean",
            "nextName": "assign",
            "nextPath": "/blocks/variables/assign"
          },
          {
            "name": "Math",
            "subitems": [],
            "path": "/blocks/math",
            "prevName": "var",
            "prevPath": "/blocks/variables/var",
            "nextName": "JavaScript blocks",
            "nextPath": "/blocks/javascript-blocks"
          },
          {
            "name": "JavaScript blocks",
            "subitems": [],
            "path": "/blocks/javascript-blocks",
            "prevName": "Math",
            "prevPath": "/blocks/math",
            "nextName": "Custom blocks",
            "nextPath": "/blocks/custom"
          },
          {
            "name": "Custom blocks",
            "subitems": [],
            "path": "/blocks/custom",
            "prevName": "JavaScript blocks",
            "prevPath": "/blocks/javascript-blocks",
            "nextName": "JavaScript",
            "nextPath": "/javascript"
          }
        ],
        "path": "/blocks",
        "prevName": "Packages",
        "prevPath": "/packages",
        "nextName": "On Start",
        "nextPath": "/blocks/on-start"
      },
      {
        "name": "JavaScript",
        "subitems": [
          {
            "name": "Calling",
            "subitems": [],
            "path": "/javascript/call",
            "prevName": "JavaScript",
            "prevPath": "/javascript",
            "nextName": "Sequencing",
            "nextPath": "/javascript/sequence"
          },
          {
            "name": "Sequencing",
            "subitems": [],
            "path": "/javascript/sequence",
            "prevName": "Calling",
            "prevPath": "/javascript/call",
            "nextName": "Variables",
            "nextPath": "/javascript/variables"
          },
          {
            "name": "Variables",
            "subitems": [],
            "path": "/javascript/variables",
            "prevName": "Sequencing",
            "prevPath": "/javascript/sequence",
            "nextName": "Operators",
            "nextPath": "/javascript/operators"
          },
          {
            "name": "Operators",
            "subitems": [],
            "path": "/javascript/operators",
            "prevName": "Variables",
            "prevPath": "/javascript/variables",
            "nextName": "Statements",
            "nextPath": "/javascript/statements"
          },
          {
            "name": "Statements",
            "subitems": [],
            "path": "/javascript/statements",
            "prevName": "Operators",
            "prevPath": "/javascript/operators",
            "nextName": "Functions",
            "nextPath": "/javascript/functions"
          },
          {
            "name": "Functions",
            "subitems": [],
            "path": "/javascript/functions",
            "prevName": "Statements",
            "prevPath": "/javascript/statements",
            "nextName": "Types",
            "nextPath": "/javascript/types"
          },
          {
            "name": "Types",
            "subitems": [],
            "path": "/javascript/types",
            "prevName": "Functions",
            "prevPath": "/javascript/functions",
            "nextName": "Classes",
            "nextPath": "/javascript/classes"
          },
          {
            "name": "Classes",
            "subitems": [],
            "path": "/javascript/classes",
            "prevName": "Types",
            "prevPath": "/javascript/types",
            "nextName": "Interfaces",
            "nextPath": "/javascript/interfaces"
          },
          {
            "name": "Interfaces",
            "subitems": [],
            "path": "/javascript/interfaces",
            "prevName": "Classes",
            "prevPath": "/javascript/classes",
            "nextName": "Generics",
            "nextPath": "/javascript/generics"
          },
          {
            "name": "Generics",
            "subitems": [],
            "path": "/javascript/generics",
            "prevName": "Interfaces",
            "prevPath": "/javascript/interfaces",
            "nextName": "Types",
            "nextPath": "/types"
          }
        ],
        "path": "/javascript",
        "prevName": "Custom blocks",
        "prevPath": "/blocks/custom",
        "nextName": "Calling",
        "nextPath": "/javascript/call"
      },
      {
        "name": "Types",
        "subitems": [
          {
            "name": "Number",
            "subitems": [],
            "path": "/types/number",
            "prevName": "Types",
            "prevPath": "/types",
            "nextName": "String",
            "nextPath": "/types/string"
          },
          {
            "name": "String",
            "subitems": [],
            "path": "/types/string",
            "prevName": "Number",
            "prevPath": "/types/number",
            "nextName": "Boolean",
            "nextPath": "/types/boolean"
          },
          {
            "name": "Boolean",
            "subitems": [],
            "path": "/types/boolean",
            "prevName": "String",
            "prevPath": "/types/string",
            "nextName": "Array",
            "nextPath": "/types/array"
          },
          {
            "name": "Array",
            "subitems": [],
            "path": "/types/array",
            "prevName": "Boolean",
            "prevPath": "/types/boolean",
            "nextName": "Function",
            "nextPath": "/types/function"
          },
          {
            "name": "Function",
            "subitems": [],
            "path": "/types/function",
            "prevName": "Array",
            "prevPath": "/types/array",
            "nextName": "Buffer",
            "nextPath": "/types/buffer"
          },
          {
            "name": "Buffer",
            "subitems": [
              {
                "name": "Using buffers",
                "subitems": [],
                "path": "/types/buffer/using-buffers",
                "prevName": "Buffer",
                "prevPath": "/types/buffer",
                "nextName": "Number format",
                "nextPath": "/types/buffer/number-format"
              },
              {
                "name": "Number format",
                "subitems": [],
                "path": "/types/buffer/number-format",
                "prevName": "Using buffers",
                "prevPath": "/types/buffer/using-buffers",
                "nextName": "Hardware",
                "nextPath": "/device"
              }
            ],
            "path": "/types/buffer",
            "prevName": "Function",
            "prevPath": "/types/function",
            "nextName": "Using buffers",
            "nextPath": "/types/buffer/using-buffers"
          }
        ],
        "path": "/types",
        "prevName": "Generics",
        "prevPath": "/javascript/generics",
        "nextName": "Number",
        "nextPath": "/types/number"
      },
      {
        "name": "Hardware",
        "subitems": [
          {
            "name": "Data logging",
            "subitems": [],
            "path": "/device/data-logging",
            "prevName": "Hardware",
            "prevPath": "/device",
            "nextName": "Error codes",
            "nextPath": "/device/error-codes"
          },
          {
            "name": "Error codes",
            "subitems": [],
            "path": "/device/error-codes",
            "prevName": "Data logging",
            "prevPath": "/device/data-logging",
            "nextName": "Foil circuits",
            "nextPath": "/device/foil-circuits"
          },
          {
            "name": "Foil circuits",
            "subitems": [],
            "path": "/device/foil-circuits",
            "prevName": "Error codes",
            "prevPath": "/device/error-codes",
            "nextName": "MES events",
            "nextPath": "/device/mes-events"
          },
          {
            "name": "MES events",
            "subitems": [],
            "path": "/device/mes-events",
            "prevName": "Foil circuits",
            "prevPath": "/device/foil-circuits",
            "nextName": "Pins",
            "nextPath": "/device/pins"
          },
          {
            "name": "Pins",
            "subitems": [],
            "path": "/device/pins",
            "prevName": "MES events",
            "prevPath": "/device/mes-events",
            "nextName": "Reactive",
            "nextPath": "/device/reactive"
          },
          {
            "name": "Reactive",
            "subitems": [],
            "path": "/device/reactive",
            "prevName": "Pins",
            "prevPath": "/device/pins",
            "nextName": "Screen",
            "nextPath": "/device/screen"
          },
          {
            "name": "Screen",
            "subitems": [],
            "path": "/device/screen",
            "prevName": "Reactive",
            "prevPath": "/device/reactive",
            "nextName": "Serial",
            "nextPath": "/device/serial"
          },
          {
            "name": "Serial",
            "subitems": [],
            "path": "/device/serial",
            "prevName": "Screen",
            "prevPath": "/device/screen",
            "nextName": "Servo",
            "nextPath": "/device/servo"
          },
          {
            "name": "Servo",
            "subitems": [],
            "path": "/device/servo",
            "prevName": "Serial",
            "prevPath": "/device/serial",
            "nextName": "Simulator",
            "nextPath": "/device/simulator"
          },
          {
            "name": "Simulator",
            "subitems": [],
            "path": "/device/simulator",
            "prevName": "Servo",
            "prevPath": "/device/servo",
            "nextName": "Usb",
            "nextPath": "/device/usb"
          },
          {
            "name": "Usb",
            "subitems": [],
            "path": "/device/usb",
            "prevName": "Simulator",
            "prevPath": "/device/simulator",
            "nextName": "Flashing via HID (CMSIS-DAP)",
            "nextPath": "/hidflash"
          },
          {
            "name": "Flashing via HID (CMSIS-DAP)",
            "subitems": [],
            "path": "/hidflash",
            "prevName": "Usb",
            "prevPath": "/device/usb",
            "nextName": "Support",
            "nextPath": "/support"
          }
        ],
        "path": "/device",
        "prevName": "Number format",
        "prevPath": "/types/buffer/number-format",
        "nextName": "Data logging",
        "nextPath": "/device/data-logging"
      },
      {
        "name": "",
        "subitems": [
          {
            "name": "Support",
            "subitems": [],
            "path": "/support",
            "prevName": "Flashing via HID (CMSIS-DAP)",
            "prevPath": "/hidflash",
            "nextName": "FAQ",
            "nextPath": "/faq"
          },
          {
            "name": "FAQ",
            "subitems": [],
            "path": "/faq",
            "prevName": "Support",
            "prevPath": "/support",
            "nextName": "Translate",
            "nextPath": "/translate"
          },
          {
            "name": "Translate",
            "subitems": [],
            "path": "/translate",
            "prevName": "FAQ",
            "prevPath": "/faq",
            "nextName": "Sharing projects",
            "nextPath": "/share"
          },
          {
            "name": "Sharing projects",
            "subitems": [],
            "path": "/share",
            "prevName": "Translate",
            "prevPath": "/translate",
            "nextName": "Offline support",
            "nextPath": "/offline"
          },
          {
            "name": "Offline support",
            "subitems": [],
            "path": "/offline",
            "prevName": "Sharing projects",
            "prevPath": "/share",
            "nextName": "Streaming",
            "nextPath": "/streaming"
          },
          {
            "name": "Streaming",
            "subitems": [],
            "path": "/streaming",
            "prevName": "Offline support",
            "prevPath": "/offline",
            "nextName": "Command Line Interface",
            "nextPath": "/cli"
          }
        ],
        "prevName": "Flashing via HID (CMSIS-DAP)",
        "prevPath": "/hidflash"
      },
      {
        "name": "",
        "subitems": [
          {
            "name": "Command Line Interface",
            "subitems": [],
            "path": "/cli",
            "prevName": "Streaming",
            "prevPath": "/streaming",
            "nextName": "Visual Studio Code support",
            "nextPath": "/code"
          },
          {
            "name": "Visual Studio Code support",
            "subitems": [],
            "path": "/code",
            "prevName": "Command Line Interface",
            "prevPath": "/cli",
            "nextName": "Coding on Raspberry Pi",
            "nextPath": "/raspberry-pi"
          },
          {
            "name": "Coding on Raspberry Pi",
            "subitems": [],
            "path": "/raspberry-pi",
            "prevName": "Visual Studio Code support",
            "prevPath": "/code",
            "nextName": "Blocks Embed",
            "nextPath": "/blocks-embed"
          },
          {
            "name": "Blocks Embed",
            "subitems": [],
            "path": "/blocks-embed",
            "prevName": "Coding on Raspberry Pi",
            "prevPath": "/raspberry-pi"
          }
        ],
        "prevName": "Streaming",
        "prevPath": "/streaming"
      }
    ],
    "id": "microbit",
    "title": "Microsoft MakeCode for micro:bit",
    "name": "makecode.microbit.org",
    "description": "A Blocks / JavaScript code editor for the micro:bit powered by Microsoft MakeCode.",
    "logoCDN": "@cdnUrl@/blob/497d755712827138542475527a19b15fabe15c82/static/logo.portrait.white-offline.svg",
    "docsLogoCDN": "@cdnUrl@/blob/3403510141da69da71b1fbb1024619a3ba88ac29/static/logo.square.white.svg",
    "portraitLogoCDN": "@cdnUrl@/blob/3403510141da69da71b1fbb1024619a3ba88ac29/static/logo.square.white.svg",
    "footerLogoCDN": "@cdnUrl@/blob/642175ae61e6822c948990e15570e590d2e0ecf1/static/logo.portrait.black.svg",
    "cardLogoCDN": "@cdnUrl@/blob/4de54063603c8d16531078818a83f7c29a3588fa/static/icons/apple-touch-icon.png",
    "appLogoCDN": "@cdnUrl@/blob/4de54063603c8d16531078818a83f7c29a3588fa/static/icons/apple-touch-icon.png",
    "organizationLogoCDN": "@cdnUrl@/blob/26bb052870acd2bf775ca3a67ec405bc3dc58a24/static/buy1.png",
    "organizationWideLogoCDN": "@cdnUrl@/blob/ce9e085f78a107f0004b89943c55be98d83b0352/static/buy2.png",
    "htmlDocIncludes": {}
  },
  "blocksprj": {
    "id": "blocksprj",
    "config": {
      "name": "{0} block",
      "dependencies": {
        "core": "*",
        "radio": "*"
      },
      "description": "",
      "files": [
        "main.blocks",
        "main.ts",
        "README.md"
      ]
    },
    "files": {
      "main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\n  <block type=\"pxt-on-start\"></block>\n  <block type=\"device_forever\"></block>\n</xml>",
      "main.ts": "\n",
      "README.md": ""
    }
  },
  "tsprj": {
    "id": "tsprj",
    "config": {
      "name": "{0} bit",
      "dependencies": {
        "core": "*",
        "radio": "*"
      },
      "description": "",
      "files": [
        "main.ts",
        "README.md"
      ]
    },
    "files": {
      "main.ts": "basic.showLeds(`\n    . . . . .\n    . # . # .\n    . . . . .\n    # . . . #\n    . # # # .\n    `);",
      "README.md": ""
    }
  },
  "bundledpkgs": {
    "core": {
      "BitRobot.ts": "/**\n  * Enumeration of motors.\n  */\n  enum BBMotor {\n    //% block=\"左\"\n    Left,\n    //% block=\"右\"\n    Right,\n    //% block=\"全部\"\n    All\n}\n\n/**\n  * Enumeration of line sensors.\n  */\nenum BBLineSensor {\n    //% block=\"左\"\n    Left,\n    //% block=\"右\"\n    Right\n}\n\n/**\n  * Enumeration of light sensors.\n  */\nenum BBLightSensor {\n    //% block=\"左\"\n    Left,\n    //% block=\"右\"\n    Right\n}\n\n/**\n * Ping unit for sesnor.\n */\nenum BBPingUnit {\n    //% block=\"微秒\"\n    MicroSeconds,\n    //% block=\"厘米\"\n    Centimeters,\n    //% block=\"英寸\"\n    Inches\n}\n\nenum BBBuzzONOFF {\n    //% block=\"关闭\"\n    buzzOFF,\n     //% block=\"响\"\n    buzzOn\n}\n\nenum BBPixelColors {\n    //% block=红色\n    Red = 0xFF0000,\n    //% block=橙色\n    Orange = 0xFFA500,\n    //% block=黄色\n    Yellow = 0xFFFF00,\n    //% block=绿色\n    Green = 0x00FF00,\n    //% block=蓝色\n    Blue = 0x0000FF,\n    //% block=靛蓝\n    Indigo = 0x4b0082,\n    //% block=紫罗兰\n    Violet = 0x8a2be2,\n    //% block=紫色\n    Purple = 0xFF00FF,\n    //% block=白色\n    White = 0xFFFFFF\n}\n\n/**\n * Different modes for RGB or RGB+W BBPixel strips\n */\nenum BBPixelMode {\n    //% block=\"RGB (GRB format)\"\n    RGB = 0,\n    //% block=\"RGB+W\"\n    RGBW = 1,\n    //% block=\"RGB (RGB format)\"\n    RGB_RGB = 2\n}\n\n/**\n * Custom blocks\n */\n//% weight=2 color=#0050BB icon=\"\\uf1b9\"\nnamespace BitRobot {\n    //let lhRGBLight: APDS9960;\n    let neoStrip: Strip; \n    //% shim=sendBufferBitRobotAsm\n    //% parts=\"neopixelbitrobit\"\n    function sendBuffer(buf: Buffer, pin: DigitalPin) {\n    }\n\n    /**\n     * A NeoPixel strip\n     */\n    export class Strip {\n        buf: Buffer;\n        pin: DigitalPin;\n        // TODO: encode as bytes instead of 32bit\n        brightness: number;\n        start: number; // start offset in LED strip\n        _length: number; // number of LEDs\n        _mode: BBPixelMode;\n\n\n        /**\n         * Shows all LEDs to a given color (range 0-255 for r, g, b). \n         * @param rgb RGB color of the LED\n         */\n        \n        showColor(rgb: number) {\n            this.setAllRGB(rgb);\n            this.show();\n        }\n        /**\n         * Shows a rainbow pattern on all LEDs. \n         * @param startHue the start hue value for the rainbow, eg: 1\n         * @param endHue the end hue value for the rainbow, eg: 360\n         */\n        \n        showRainbow(startHue: number = 1, endHue: number = 360) {\n            if (this._length <= 0) return;\n\n            const saturation = 100;\n            const luminance = 50;\n            const steps = this._length;\n            const direction = HueInterpolationDirection.Clockwise;\n\n            //hue\n            const h1 = startHue;\n            const h2 = endHue;\n            const hDistCW = ((h2 + 360) - h1) % 360;\n            const hStepCW = (hDistCW * 100) / steps;\n            const hDistCCW = ((h1 + 360) - h2) % 360;\n            const hStepCCW = -(hDistCCW * 100) / steps\n            let hStep: number;\n            if (direction === HueInterpolationDirection.Clockwise) {\n                hStep = hStepCW;\n            } else if (direction === HueInterpolationDirection.CounterClockwise) {\n                hStep = hStepCCW;\n            } else {\n                hStep = hDistCW < hDistCCW ? hStepCW : hStepCCW;\n            }\n            const h1_100 = h1 * 100; //we multiply by 100 so we keep more accurate results while doing interpolation\n\n            //sat\n            const s1 = saturation;\n            const s2 = saturation;\n            const sDist = s2 - s1;\n            const sStep = sDist / steps;\n            const s1_100 = s1 * 100;\n\n            //lum\n            const l1 = luminance;\n            const l2 = luminance;\n            const lDist = l2 - l1;\n            const lStep = lDist / steps;\n            const l1_100 = l1 * 100\n\n            //interpolate\n            if (steps === 1) {\n                this.setPixelColor(0, hslToRgb(h1 + hStep, s1 + sStep, l1 + lStep))\n            } else {\n                this.setPixelColor(0, hslToRgb(startHue, saturation, luminance));\n                for (let i = 1; i < steps - 1; i++) {\n                    const h = (h1_100 + i * hStep) / 100 + 360;\n                    const s = (s1_100 + i * sStep) / 100;\n                    const l = (l1_100 + i * lStep) / 100;\n                    this.setPixelColor(i, hslToRgb(h, s, l));\n                }\n                this.setPixelColor(steps - 1, hslToRgb(endHue, saturation, luminance));\n            }\n            this.show();\n        }\n\n        /**\n         * Displays a vertical bar graph based on the `value` and `high` value.\n         * If `high` is 0, the chart gets adjusted automatically.\n         * @param value current value to plot\n         * @param high maximum value, eg: 255\n         */\n        \n        showBarGraph(value: number, high: number): void {\n            if (high <= 0) {\n                this.clear();\n                this.setPixelColor(0, BBPixelColors.Yellow);\n                this.show();\n                return;\n            }\n\n            value = Math.abs(value);\n            const n = this._length;\n            const n1 = n - 1;\n            let v = (value * n) / high;\n            if (v == 0) {\n                this.setPixelColor(0, 0x666600);\n                for (let i = 1; i < n; ++i)\n                    this.setPixelColor(i, 0);\n            } else {\n                for (let i = 0; i < n; ++i) {\n                    if (i <= v) {\n                        let b = i * 255 / n1;\n                        this.setPixelColor(i, BitRobot.rgb(b, 0, 255 - b));\n                    }\n                    else this.setPixelColor(i, 0);\n                }\n            }\n            this.show();\n        }\n\n        /**\n         * Set LED to a given color (range 0-255 for r, g, b). \n         * You need to call ``show`` to make the changes visible.\n         * @param pixeloffset position of the NeoPixel in the strip\n         * @param rgb RGB color of the LED\n         */\n       \n        setPixelColor(pixeloffset: number, rgb: number): void {\n            this.setPixelRGB(pixeloffset, rgb);\n        }\n\n        /**\n         * For NeoPixels with RGB+W LEDs, set the white LED brightness. This only works for RGB+W NeoPixels.\n         * @param pixeloffset position of the LED in the strip\n         * @param white brightness of the white LED\n         */\n       \n        setPixelWhiteLED(pixeloffset: number, white: number): void {\n            if (this._mode === BBPixelMode.RGBW) {\n                this.setPixelW(pixeloffset, white);\n            }\n        }\n\n        \n        /**\n         * Send all the changes to the strip.\n         */\n        \n        show() {\n            sendBuffer(this.buf, this.pin);\n        }\n        /**\n         * Turn off all LEDs.\n         * You need to call ``show`` to make the changes visible.\n         */\n        \n        clear(): void {\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            this.buf.fill(0, this.start * stride, this._length * stride);\n        }\n\n        /**\n         * Gets the number of pixels declared on the strip\n         */\n      \n        length() {\n            return this._length;\n        }\n\n        /**\n         * Set the brightness of the strip. This flag only applies to future operation.\n         * @param brightness a measure of LED brightness in 0-255. eg: 255\n         */\n       \n        setBrightness(brightness: number): void {\n            this.brightness = brightness & 0xff;\n        }\n\n        /**\n         * Set the LED number of the strip. This flag only applies to future operation.\n         * @param numleds a measure of LED brightness in 0-255. eg: 255\n         */\n       \n        setLedNumber(numleds: number): void {\n            \n            this._length = numleds;\n        }\n\n        /**\n         * Apply brightness to current colors using a quadratic easing function.\n         **/\n        \n        easeBrightness(): void {\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            const br = this.brightness;\n            const buf = this.buf;\n            const end = this.start + this._length;\n            const mid = this._length / 2;\n            for (let i = this.start; i < end; ++i) {\n                const k = i - this.start;\n                const ledoffset = i * stride;\n                const br = k > mid ? 255 * (this._length - 1 - k) * (this._length - 1 - k) / (mid * mid) : 255 * k * k / (mid * mid);\n                serial.writeLine(k + \":\" + br);\n                const r = (buf[ledoffset + 0] * br) >> 8; buf[ledoffset + 0] = r;\n                const g = (buf[ledoffset + 1] * br) >> 8; buf[ledoffset + 1] = g;\n                const b = (buf[ledoffset + 2] * br) >> 8; buf[ledoffset + 2] = b;\n                if (stride == 4) {\n                    const w = (buf[ledoffset + 3] * br) >> 8; buf[ledoffset + 3] = w;\n                }\n            }\n        }\n\n        /** \n         * Create a range of LEDs.\n         * @param start offset in the LED strip to start the range\n         * @param length number of LEDs in the range. eg: 4\n         */\n        \n        range(start: number, length: number): Strip {\n            let strip = new Strip();\n            strip.buf = this.buf;\n            strip.pin = this.pin;\n            strip.brightness = this.brightness;\n            strip.start = this.start + Math.clamp(0, this._length - 1, start);\n            strip._length = Math.clamp(0, this._length - (strip.start - this.start), length);\n            return strip;\n        }\n\n        /**\n         * Shift LEDs forward and clear with zeros.\n         * You need to call ``show`` to make the changes visible.\n         * @param offset number of pixels to shift forward, eg: 1\n         */\n        \n        shift(offset: number = 1): void {\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            this.buf.shift(-offset * stride, this.start * stride, this._length * stride)\n        }\n\n        /**\n         * Rotate LEDs forward.\n         * You need to call ``show`` to make the changes visible.\n         * @param offset number of pixels to rotate forward, eg: 1\n         */\n        \n        rotate(offset: number = 1): void {\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            this.buf.rotate(-offset * stride, this.start * stride, this._length * stride)\n        }\n\n        /**\n         * Set the pin where the neopixelbitrobit is connected, defaults to P0.\n         */\n        \n        setPin(pin: DigitalPin): void {\n            this.pin = pin;\n            pins.digitalWritePin(this.pin, 0);\n            // don't yield to avoid races on initialization\n        }\n\n        /**\n         * Estimates the electrical current (mA) consumed by the current light configuration.\n         */\n        \n        power(): number {\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            const end = this.start + this._length;\n            let p = 0;\n            for (let i = this.start; i < end; ++i) {\n                const ledoffset = i * stride;\n                for (let j = 0; j < stride; ++j) {\n                    p += this.buf[i + j];\n                }\n            }\n            return this.length() / 2 /* 0.5mA per neopixelbitrobit */\n                + (p * 433) / 10000; /* rought approximation */\n        }\n\n        private setBufferRGB(offset: number, red: number, green: number, blue: number): void {\n            if (this._mode === BBPixelMode.RGB_RGB) {\n                this.buf[offset + 0] = red;\n                this.buf[offset + 1] = green;\n            } else {\n                this.buf[offset + 0] = green;\n                this.buf[offset + 1] = red;\n            }\n            this.buf[offset + 2] = blue;\n        }\n\n        private setAllRGB(rgb: number) {\n            let red = unpackR(rgb);\n            let green = unpackG(rgb);\n            let blue = unpackB(rgb);\n\n            const br = this.brightness;\n            if (br < 255) {\n                red = (red * br) >> 8;\n                green = (green * br) >> 8;\n                blue = (blue * br) >> 8;\n            }\n            const end = this.start + this._length;\n            const stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            for (let i = this.start; i < end; ++i) {\n                this.setBufferRGB(i * stride, red, green, blue)\n            }\n        }\n        private setAllW(white: number) {\n            if (this._mode !== BBPixelMode.RGBW)\n                return;\n\n            let br = this.brightness;\n            if (br < 255) {\n                white = (white * br) >> 8;\n            }\n            let buf = this.buf;\n            let end = this.start + this._length;\n            for (let i = this.start; i < end; ++i) {\n                let ledoffset = i * 4;\n                buf[ledoffset + 3] = white;\n            }\n        }\n        private setPixelRGB(pixeloffset: number, rgb: number): void {\n            if (pixeloffset < 0\n                || pixeloffset >= this._length)\n                return;\n\n            let stride = this._mode === BBPixelMode.RGBW ? 4 : 3;\n            pixeloffset = (pixeloffset + this.start) * stride;\n\n            let red = unpackR(rgb);\n            let green = unpackG(rgb);\n            let blue = unpackB(rgb);\n\n            let br = this.brightness;\n            if (br < 255) {\n                red = (red * br) >> 8;\n                green = (green * br) >> 8;\n                blue = (blue * br) >> 8;\n            }\n            this.setBufferRGB(pixeloffset, red, green, blue)\n        }\n        private setPixelW(pixeloffset: number, white: number): void {\n            if (this._mode !== BBPixelMode.RGBW)\n                return;\n\n            if (pixeloffset < 0\n                || pixeloffset >= this._length)\n                return;\n\n            pixeloffset = (pixeloffset + this.start) * 4;\n\n            let br = this.brightness;\n            if (br < 255) {\n                white = (white * br) >> 8;\n            }\n            let buf = this.buf;\n            buf[pixeloffset + 3] = white;\n        }\n    }\n\n    \n\n    \n    /**\n     * Create a new NeoPixel driver for `numleds` LEDs.\n     * @param pin the pin where the neopixelbitrobit is connected.\n     * @param numleds number of leds in the strip, eg: 24,30,60,64\n     */\n    \n    export function create(pin: DigitalPin, numleds: number, mode: BBPixelMode): Strip {\n        let strip = new Strip();\n        let stride = mode === BBPixelMode.RGBW ? 4 : 3;\n        strip.buf = pins.createBuffer(numleds * stride);\n        strip.start = 0;\n        strip._length = numleds;\n        strip._mode = mode;\n        strip.setBrightness(30)\n        strip.setPin(pin)\n        return strip;\n    }\n\n    /**\n     * Converts red, green, blue channels into a RGB color\n     * @param red value of the red channel between 0 and 255. eg: 255\n     * @param green value of the green channel between 0 and 255. eg: 255\n     * @param blue value of the blue channel between 0 and 255. eg: 255\n     */\n    \n    export function rgb(red: number, green: number, blue: number): number {\n        return packRGB(red, green, blue);\n    }\n\n    /**\n     * Gets the RGB value of a known color\n    */\n    //% weight=2 blockGap=8\n    //% blockId=\"neopixelbitrobit_colors\" block=\"获取颜色值 %color\"\n    //% advanced=true\n    export function colors(color: BBPixelColors): number {\n        return color;\n    }\n\n    function packRGB(a: number, b: number, c: number): number {\n        return ((a & 0xFF) << 16) | ((b & 0xFF) << 8) | (c & 0xFF);\n    }\n    function unpackR(rgb: number): number {\n        let r = (rgb >> 16) & 0xFF;\n        return r;\n    }\n    function unpackG(rgb: number): number {\n        let g = (rgb >> 8) & 0xFF;\n        return g;\n    }\n    function unpackB(rgb: number): number {\n        let b = (rgb) & 0xFF;\n        return b;\n    }\n\n    function hslToRgb(h: number, s: number, l: number): number {\n        h = h % 360;\n        s = Math.clamp(0, 99, s);\n        l = Math.clamp(0, 99, l);\n        let c = (((100 - Math.abs(2 * l - 100)) * s) << 8) / 10000; //chroma, [0,255]\n        let h1 = h / 60;//[0,6]\n        let h2 = (h - h1 * 60) * 256 / 60;//[0,255]\n        let temp = Math.abs((((h1 % 2) << 8) + h2) - 256);\n        let x = (c * (256 - (temp))) >> 8;//[0,255], second largest component of this color\n        let r$: number;\n        let g$: number;\n        let b$: number;\n        if (h1 == 0) {\n            r$ = c; g$ = x; b$ = 0;\n        } else if (h1 == 1) {\n            r$ = x; g$ = c; b$ = 0;\n        } else if (h1 == 2) {\n            r$ = 0; g$ = c; b$ = x;\n        } else if (h1 == 3) {\n            r$ = 0; g$ = x; b$ = c;\n        } else if (h1 == 4) {\n            r$ = x; g$ = 0; b$ = c;\n        } else if (h1 == 5) {\n            r$ = c; g$ = 0; b$ = x;\n        }\n        let m = ((l * 2 << 8) / 100 - c) / 2;\n        let r = r$ + m;\n        let g = g$ + m;\n        let b = b$ + m;\n        return packRGB(r, g, b);\n    }\n    export enum HueInterpolationDirection {\n        Clockwise,\n        CounterClockwise,\n        Shortest\n    }\n\n    /**\n     * Return a neo pixel strip.\n     */\n    \n    export function neo(): Strip {\n        if (!neoStrip) {\n            neoStrip = create(DigitalPin.P13, 10, BBPixelMode.RGB)\n        }\n\n        return neoStrip;\n    }\n\n\n    /**\n      * Shows all LEDs to a given color (range 0-255 for r, g, b).\n      * 设置LED的颜色(范围0-255，r，g，b)。\n      * @param rgb RGB color of the LED\n      */\n    //% blockId=\"bitbot_neo_set_color\" block=\"设置LED颜色为 %color\"\n    //% weight=4\n    export function neoSetColor(color: BBPixelColors) {\n        neo().showColor(color);\n    }\n\n    /*\n     * Set LED to a given color (range 0-255 for r, g, b).\n     *\n     * @param offset position of the NeoPixel in the strip\n     * @param rgb RGB color of the LED\n     */\n    //% blockId=\"bitbot_neo_set_pixel_color\" block=\"设置LED编号 %offset|的颜色为 %color\"\n    //% weight=3\n    export function neoSetPixelColor(offset: number, color: BBPixelColors): void {\n        neo().setPixelColor(offset, color);\n    }\n\n    /**\n      * Show leds.\n      */\n    //% blockId=\"bitbot_neo_show\" block=\"LED显示\"\n    //% weight=2\n    export function neoShow(): void {\n        neo().show();\n    }\n\n    /**\n      * Clear leds.\n      */\n    //% blockId=\"bitbot_neo_clear\" block=\"LED清除\"\n    //% weight=1\n    export function neoClear(): void {\n        neo().clear();\n        neo().show();\n    }\n\n    /**\n      * Shows a rainbow pattern on all LEDs.\n      */\n    //% blockId=\"bitbot_neo_rainbow\" block=\"设置LED为彩虹模式\"\n    //% weight=6\n    export function neoRainbow(): void {\n        neo().showRainbow(1, 360);\n    }\n\n    /**\n     * Shift LEDs forward and clear with zeros.\n     */\n    //% blockId=\"bitbot_neo_shift\" block=\"LED走马灯\"\n    //% weight=7\n    export function neoShift(): void {\n        neo().shift(1);\n    }\n\n    /**\n     * Rotate LEDs forward.\n     */\n    //% blockId=\"bitbot_neo_rotate\" block=\"LED循环显示\"\n    //% weight=8\n    export function neoRotate(): void {\n        neo().rotate(1);\n    }\n\n    /**\n     * Set the brightness of the strip.\n     * @param brightness a measure of LED brightness in 0-255,eg:30\n     */\n    //% blockId=\"bitbot_neo_brightness\" block=\"设置LED亮度 |%value\" blockGap=8\n    //% weight=10\n    export function neoBrightness(brightness : number): void {\n        neo().setBrightness(brightness);\n    }\n\n   \n\n\n    /**\n      * Drive motor(s) forward or reverse.\n      *\n      * @param motor motor to drive.\n      * @param speed speed of motor\n      */\n    //% blockId=\"bitbot_motor\" block=\"马达 %motor|速度 %speed\"\n    //% weight=100\n    export function motor(motor: BBMotor, speed: number): void {\n        let forward = (speed >= 0);\n\n        if (speed > 1023) {\n            speed = 1023;\n        } else if (speed < -1023) {\n            speed = -1023;\n        }\n\n        let realSpeed = speed;\n        if (!forward) {\n            realSpeed = 0 - realSpeed;\n        }\n\n        if ((motor == BBMotor.Left) || (motor == BBMotor.All)) {\n            pins.analogWritePin(AnalogPin.P0, realSpeed);\n            pins.digitalWritePin(DigitalPin.P8, forward ? 0 : 1);\n        }\n\n        if ((motor == BBMotor.Right) || (motor == BBMotor.All)) {\n            pins.analogWritePin(AnalogPin.P1, realSpeed);\n            pins.digitalWritePin(DigitalPin.P12, forward ? 0 : 1);\n        }\n    }\n\n\n    /**\n      * Sound a buzz.\n      *\n      * @param flag Flag to set (0) for off and (1) for on.\n      */\n    //% blockId=\"bitbot_buzz\" block=\"蜂鸣器 %flag\"\n    //% weight=99\n    export function buzz(flag: BBBuzzONOFF): void {\n        pins.digitalWritePin(DigitalPin.P14, flag === 0 ? BBBuzzONOFF.buzzOFF : BBBuzzONOFF.buzzOn);\n    }\n\n    /**\n      * Read line sensor.\n      *\n      * @param sensor Line sensor to read. \n      */\n    //% blockId=\"bitbot_read_line\" block=\"巡线传感器 %sensor\"\n    //% weight=98\n    export function readLine(sensor: BBLineSensor): number {\n        if (sensor == BBLineSensor.Left) {\n            return pins.digitalReadPin(DigitalPin.P5);\n        } else {\n            return pins.digitalReadPin(DigitalPin.P11);\n        }\n    }\n\n    /**\n      * Read light sensor.\n      *\n      * @param sensor Light sensor to read.\n      */\n    //% blockId=\"bitbot_read_light\" block=\"地面灰度 %sensor\"\n    //% weight=97\n    export function readLight(sensor: BBLightSensor): number {\n        if (sensor == BBLightSensor.Left) {\n            pins.digitalWritePin(DigitalPin.P16, 0);\n            return 1023-pins.analogReadPin(AnalogPin.P2);\n        } else {\n            pins.digitalWritePin(DigitalPin.P16, 1);\n            return 1023-pins.analogReadPin(AnalogPin.P2);\n        }\n    }\n\n    /**\n    * Read distance from sonar module connected to accessory connector.\n    *\n    * @param unit desired conversion unit\n    */\n    //% blockId=\"bitbot_sonar\" block=\"超声波的值 %unit\"\n    //% weight=96    \n    export function sonar(unit: BBPingUnit): number {\n        // send pulse\n        let trig = DigitalPin.P15;\n        let echo = DigitalPin.P15;\n\n        let maxCmDistance = 500;\n\n        pins.setPull(trig, PinPullMode.PullNone);\n        pins.digitalWritePin(trig, 0);\n        control.waitMicros(2);\n        pins.digitalWritePin(trig, 1);\n        control.waitMicros(10);\n        pins.digitalWritePin(trig, 0);\n\n        // read pulse\n        let d = pins.pulseIn(echo, PulseValue.High, maxCmDistance * 58);\n        if(d < 1) d = maxCmDistance *29 * 2 *100 / 153;\n        switch (unit) {\n            case BBPingUnit.Centimeters: return d * 153 / 29 / 2 / 100;\n            case BBPingUnit.Inches: return d  * 153 / 74 / 2 / 100;\n            default: return d;\n        }\n    }\n}\n",
      "ManagedBuffer.cpp": "#include \"MicroBit.h\"\r\n#include \"ManagedBuffer.h\"\r\n#include <limits.h>\r\n\r\nstatic const char empty[] __attribute__ ((aligned (4))) = \"\\xff\\xff\\0\\0\\0\";\r\n\r\n/**\r\n  * Internal constructor helper.\r\n  * Configures this ManagedBuffer to refer to the static empty buffer.\r\n  */\r\nvoid ManagedBuffer::initEmpty()\r\n{\r\n    ptr = (BufferData*)(void*)empty;\r\n}\r\n\r\n/**\r\n * Default Constructor. \r\n * Creates an empty ManagedBuffer. \r\n *\r\n * Example:\r\n * @code\r\n * ManagedBuffer p(); \r\n * @endcode\r\n */\r\nManagedBuffer::ManagedBuffer()\r\n{\r\n    initEmpty();\r\n}\r\n\r\n/**\r\n * Constructor. \r\n * Creates an empty ManagedBuffer of the given size. \r\n *\r\n * @param length The length of the buffer to create.\r\n *\r\n * Example:\r\n * @code\r\n * ManagedBuffer p(16);         // Creates a ManagedBuffer 16 bytes long.\r\n * @endcode\r\n */\r\nManagedBuffer::ManagedBuffer(int length)\r\n{\r\n    this->init(NULL, length);\r\n}\r\n\r\n/**\r\n * Constructor. \r\n * Creates a new ManagedBuffer of the given size,\r\n * and fills it with the data provided.\r\n *\r\n * @param data The data with which to fill the buffer.\r\n * @param length The length of the buffer to create.\r\n * \r\n * Example:\r\n * @code\r\n * uint8_t buf = {13,5,2};\r\n * ManagedBuffer p(buf, 3);         // Creates a ManagedBuffer 3 bytes long.\r\n * @endcode\r\n */\r\nManagedBuffer::ManagedBuffer(uint8_t *data, int length)\r\n{\r\n    this->init(data, length);\r\n}\r\n\r\n/**\r\n * Copy Constructor. \r\n * Add ourselves as a reference to an existing ManagedBuffer.\r\n * \r\n * @param buffer The ManagedBuffer to reference.\r\n *\r\n * Example:\r\n * @code\r\n * ManagedBuffer p();\r\n * ManagedBuffer p2(i);        // Refers to the same buffer as p. \r\n * @endcode\r\n */\r\nManagedBuffer::ManagedBuffer(const ManagedBuffer &buffer)\r\n{\r\n    ptr = buffer.ptr;\r\n    ptr->incr();\r\n}\r\n\r\n/**\r\n  * Constructor. \r\n  * Create a buffer from a raw BufferData pointer. It will ptr->incr(). This is to be used by specialized runtimes.\r\n  *\r\n  * @param p The pointer to use.\r\n  */    \r\nManagedBuffer::ManagedBuffer(BufferData *p)\r\n{\r\n    ptr = p;\r\n    ptr->incr();\r\n}\r\n\r\n/**\r\n * Internal constructor-initialiser.\r\n *\r\n * @param data The data with which to fill the buffer.\r\n * @param length The length of the buffer to create.\r\n * \r\n */\r\nvoid ManagedBuffer::init(uint8_t *data, int length)\r\n{\r\n    if (length <= 0) {\r\n        initEmpty();\r\n        return;\r\n    }\r\n\r\n    ptr = (BufferData *) malloc(sizeof(BufferData) + length);\r\n    ptr->init();\r\n\r\n    ptr->length = length;\r\n\r\n    // Copy in the data buffer, if provided.\r\n    if (data)\r\n        memcpy(ptr->payload, data, length);\r\n    else\r\n        memset(ptr->payload, 0, length);\r\n}\r\n\r\n/**\r\n * Destructor. \r\n * Removes buffer resources held by the instance.\r\n */\r\nManagedBuffer::~ManagedBuffer()\r\n{\r\n    ptr->decr();\r\n}\r\n\r\n/**\r\n * Copy assign operation. \r\n *\r\n * Called when one ManagedBuffer is assigned the value of another using the '=' operator.\r\n * Decrements our reference count and free up the buffer as necessary.\r\n * Then, update our buffer to refer to that of the supplied ManagedBuffer,\r\n * and increase its reference count.\r\n *\r\n * @param p The ManagedBuffer to reference.\r\n * \r\n * Example:\r\n * @code\r\n * uint8_t buf = {13,5,2};\r\n * ManagedBuffer p1(16); \r\n * ManagedBuffer p2(buf, 3);        \r\n *\r\n * p1 = p2;  \r\n * @endcode\r\n */\r\nManagedBuffer& ManagedBuffer::operator = (const ManagedBuffer &p)\r\n{\r\n    if(ptr == p.ptr)\r\n        return *this;\r\n\r\n    ptr->decr();\r\n    ptr = p.ptr;\r\n    ptr->incr();\r\n\r\n    return *this;\r\n}\r\n\r\n/**\r\n * Equality operation.\r\n *\r\n * Called when one ManagedBuffer is tested to be equal to another using the '==' operator.\r\n *\r\n * @param p The ManagedBuffer to test ourselves against.\r\n * @return true if this ManagedBuffer is identical to the one supplied, false otherwise.\r\n * \r\n * Example:\r\n * @code\r\n *\r\n * uint8_t buf = {13,5,2};\r\n * ManagedBuffer p1(16); \r\n * ManagedBuffer p2(buf, 3);        \r\n *\r\n * if(p1 == p2)                    // will be true\r\n *     uBit.display.scroll(\"same!\");\r\n * @endcode\r\n */\r\nbool ManagedBuffer::operator== (const ManagedBuffer& p)\r\n{\r\n    if (ptr == p.ptr)\r\n        return true;\r\n    else\r\n        return (ptr->length == p.ptr->length && (memcmp(ptr->payload, p.ptr->payload, ptr->length)==0));    \r\n}\r\n\r\n/**\r\n * Sets the byte at the given index to value provided.\r\n * @param position The index of the byte to change.\r\n * @param value The new value of the byte (0-255).\r\n * @return MICROBIT_OK, or MICROBIT_INVALID_PARAMETER.\r\n *\r\n * Example:\r\n * @code\r\n * ManagedBuffer p1(16); \r\n * p1.setByte(0,255);              // Sets the firts byte in the buffer to the value 255.\r\n * @endcode\r\n */\r\nint ManagedBuffer::setByte(int position, uint8_t value)\r\n{\r\n    if (0 <= position && position < ptr->length)\r\n    {\r\n        ptr->payload[position] = value;\r\n        return MICROBIT_OK;\r\n    }\r\n    else\r\n    {\r\n        return MICROBIT_INVALID_PARAMETER;\r\n    }\r\n}\r\n\r\n/**\r\n * Determines the value of the given byte in the buffer.\r\n *\r\n * @param position The index of the byte to read.\r\n * @return The value of the byte at the given position, or MICROBIT_INVALID_PARAMETER.\r\n *\r\n * Example:\r\n * @code\r\n * ManagedBuffer p1(16); \r\n * p1.setByte(0,255);              // Sets the firts byte in the buffer to the value 255.\r\n * p1.getByte(0);                  // Returns 255.\r\n * @endcode\r\n */\r\nint ManagedBuffer::getByte(int position)\r\n{\r\n    if (0 <= position && position < ptr->length)\r\n        return ptr->payload[position];\r\n    else\r\n        return MICROBIT_INVALID_PARAMETER;\r\n} \r\n\r\n/**\r\n  * Get current ptr, do not decr() it, and set the current instance to an empty buffer.\r\n  * This is to be used by specialized runtimes which pass BufferData around.\r\n  */\r\nBufferData *ManagedBuffer::leakData()\r\n{\r\n    BufferData* res = ptr;\r\n    initEmpty();\r\n    return res;\r\n}\r\n\r\n\r\nint ManagedBuffer::fill(uint8_t value, int offset, int length)\r\n{\r\n    if (offset < 0 || offset > ptr->length)\r\n        return MICROBIT_INVALID_PARAMETER;\r\n    if (length < 0)\r\n        length = ptr->length;\r\n    length = min(length, ptr->length - offset);\r\n\r\n    memset(ptr->payload + offset, value, length);\r\n\r\n    return MICROBIT_OK;\r\n}\r\n\r\nManagedBuffer ManagedBuffer::slice(int offset, int length) const\r\n{\r\n    offset = min(ptr->length, offset);\r\n    if (length < 0)\r\n        length = ptr->length;\r\n    length = min(length, ptr->length - offset);\r\n    return ManagedBuffer(ptr->payload + offset, length);\r\n}\r\n\r\nvoid ManagedBuffer::shift(int offset, int start, int len)\r\n{\r\n    if (len < 0) len = ptr->length - start;    \r\n    if (start < 0 || start + len > ptr->length || start + len < start\r\n        || len == 0 || offset == 0 || offset == INT_MIN) return;\r\n    if (offset <= -len || offset >= len) {\r\n        fill(0);\r\n        return;\r\n    }\r\n        \r\n    uint8_t *data = ptr->payload + start;\r\n    if (offset < 0) {\r\n        offset = -offset;\r\n        memmove(data + offset, data, len - offset);\r\n        memset(data, 0, offset);\r\n    } else {\r\n        len = len - offset;\r\n        memmove(data, data + offset, len);\r\n        memset(data + len, 0, offset);\r\n    }\r\n}\r\n\r\nvoid ManagedBuffer::rotate(int offset, int start, int len)\r\n{\r\n    if (len < 0) len = ptr->length - start;\r\n    if (start < 0 || start + len > ptr-> length || start + len < start\r\n        || len == 0 || offset == 0 || offset == INT_MIN) return;\r\n\r\n    if (offset < 0)\r\n        offset += len << 8; // try to make it positive\r\n    offset %= len;\r\n    if (offset < 0)\r\n        offset += len;\r\n\r\n    uint8_t *data = ptr->payload + start;\r\n\r\n    uint8_t *n_first = data + offset;\r\n    uint8_t *first = data;\r\n    uint8_t *next = n_first;\r\n    uint8_t *last = data + len;\r\n\r\n    while (first != next) {\r\n        uint8_t tmp = *first;\r\n        *first++ = *next;\r\n        *next++ = tmp;\r\n        if (next == last) {\r\n            next = n_first;\r\n        } else if (first == n_first) {\r\n            n_first = next;\r\n        }\r\n    }\r\n}\r\n\r\nint ManagedBuffer::writeBuffer(int dstOffset, const ManagedBuffer &src, int srcOffset, int length)\r\n{\r\n    if (length < 0)\r\n        length = src.length();\r\n\r\n    if (srcOffset < 0 || dstOffset < 0 || dstOffset > ptr->length)\r\n        return MICROBIT_INVALID_PARAMETER;\r\n\r\n    length = min(src.length() - srcOffset, ptr->length - dstOffset);\r\n\r\n    if (length < 0)\r\n        return MICROBIT_INVALID_PARAMETER;\r\n\r\n    if (ptr == src.ptr) {\r\n        memmove(getBytes() + dstOffset, src.ptr->payload + srcOffset, length);\r\n    } else {\r\n        memcpy(getBytes() + dstOffset, src.ptr->payload + srcOffset, length);\r\n    }\r\n\r\n    return MICROBIT_OK;\r\n}\r\n\r\nint ManagedBuffer::writeBytes(int offset, uint8_t *src, int length, bool swapBytes)\r\n{\r\n    if (offset < 0 || length < 0 || offset + length > ptr->length)\r\n        return MICROBIT_INVALID_PARAMETER;\r\n\r\n    if (swapBytes) {\r\n        uint8_t *p = ptr->payload + offset + length;\r\n        for (int i = 0; i < length; ++i)\r\n            *--p = src[i];\r\n    } else {\r\n        memcpy(ptr->payload + offset, src, length);\r\n    }\r\n\r\n    return MICROBIT_OK;\r\n}\r\n\r\nint ManagedBuffer::readBytes(uint8_t *dst, int offset, int length, bool swapBytes) const\r\n{\r\n    if (offset < 0 || length < 0 || offset + length > ptr->length)\r\n        return MICROBIT_INVALID_PARAMETER;\r\n\r\n    if (swapBytes) {\r\n        uint8_t *p = ptr->payload + offset + length;\r\n        for (int i = 0; i < length; ++i)\r\n            dst[i] = *--p;\r\n    } else {\r\n        memcpy(dst, ptr->payload + offset, length);\r\n    }\r\n\r\n    return MICROBIT_OK;\r\n}\r\n",
      "ManagedBuffer.h": "#ifndef MICROBIT_MANAGED_BUFFER_H\r\n#define MICROBIT_MANAGED_BUFFER_H\r\n\r\n#include \"mbed.h\"\r\n#include \"RefCounted.h\"\r\n\r\nstruct BufferData : RefCounted\r\n{\r\n    uint16_t        length;             // The length of the payload in bytes\r\n    uint8_t         payload[0];         // ManagedBuffer data\r\n};\r\n\r\n/**\r\n  * Class definition for a ManagedBuffer.\r\n  * A ManagedBuffer holds a series of bytes, used with MicroBitRadio channels and in other places.\r\n  * n.b. This is a mutable, managed type.\r\n  */\r\nclass ManagedBuffer\r\n{\r\n    BufferData      *ptr;     // Pointer to payload data\r\n    \r\n    public:\r\n\r\n    /**\r\n      * Default Constructor. \r\n      * Creates an empty ManagedBuffer.  The 'ptr' field in all empty buffers is shared.\r\n      *\r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p(); \r\n      * @endcode\r\n      */\r\n    ManagedBuffer();\r\n\r\n    /**\r\n      * Constructor. \r\n      * Creates a new ManagedBuffer of the given size. \r\n      *\r\n      * @param length The length of the buffer to create.\r\n      *\r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p(16);         // Creates a ManagedBuffer 16 bytes long.\r\n      * @endcode\r\n      */\r\n    ManagedBuffer(int length);\r\n\r\n    /**\r\n      * Constructor. \r\n      * Creates an empty ManagedBuffer of the given size,\r\n      * and fills it with the data provided.\r\n      *\r\n      * @param data The data with which to fill the buffer.\r\n      * @param length The length of the buffer to create.\r\n      * \r\n      * Example:\r\n      * @code\r\n      * uint8_t buf[] = {13,5,2};\r\n      * ManagedBuffer p(buf, 3);         // Creates a ManagedBuffer 3 bytes long.\r\n      * @endcode\r\n      */\r\n    ManagedBuffer(uint8_t *data, int length);\r\n\r\n    /**\r\n      * Copy Constructor. \r\n      * Add ourselves as a reference to an existing ManagedBuffer.\r\n      * \r\n      * @param buffer The ManagedBuffer to reference.\r\n      *\r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p();\r\n      * ManagedBuffer p2(i);        // Refers to the same buffer as p. \r\n      * @endcode\r\n      */\r\n    ManagedBuffer(const ManagedBuffer &buffer);\r\n\r\n    /**\r\n      * Constructor. \r\n      * Create a buffer from a raw BufferData pointer. It will ptr->incr(). This is to be used by specialized runtimes.\r\n      *\r\n      * @param p The pointer to use.\r\n      */    \r\n    ManagedBuffer(BufferData *p);\r\n\r\n    /**\r\n      * Internal constructor helper.\r\n      * Configures this ManagedBuffer to refer to the static empty buffer.\r\n      */\r\n    void initEmpty();\r\n\r\n    /**\r\n     * Internal constructor-initialiser.\r\n     *\r\n     * @param data The data with which to fill the buffer.\r\n     * @param length The length of the buffer to create.\r\n     * \r\n     */\r\n    void init(uint8_t *data, int length);\r\n\r\n    /**\r\n      * Destructor. \r\n      * Removes buffer resources held by the instance.\r\n      */\r\n    ~ManagedBuffer();\r\n\r\n    /**\r\n      * Provide an array containing the buffer data.\r\n      * @return The contents of this buffer, as an array of bytes.\r\n      */\r\n    uint8_t *getBytes()\r\n    {\r\n        return ptr->payload;\r\n    }\r\n\r\n    /**\r\n      * Get current ptr, do not decr() it, and set the current instance to an empty buffer.\r\n      * This is to be used by specialized runtimes which pass BufferData around.\r\n      */\r\n    BufferData *leakData();\r\n\r\n    /**\r\n      * Copy assign operation. \r\n      *\r\n      * Called when one ManagedBuffer is assigned the value of another using the '=' operator.\r\n      * Decrements our reference count and free up the buffer as necessary.\r\n      * Then, update our buffer to refer to that of the supplied ManagedBuffer,\r\n      * and increase its reference count.\r\n      *\r\n      * @param p The ManagedBuffer to reference.\r\n      * \r\n      * Example:\r\n      * @code\r\n      * uint8_t buf = {13,5,2};\r\n      * ManagedBuffer p1(16); \r\n      * ManagedBuffer p2(buf, 3);        \r\n      *\r\n      * p1 = p2;  \r\n      * @endcode\r\n      */\r\n    ManagedBuffer& operator = (const ManagedBuffer& p);\r\n\r\n    /**\r\n     * Array access operation (read). \r\n     *\r\n     * Called when a ManagedBuffer is dereferenced with a [] operation.\r\n     * Transparently map this through to the underlying payload for elegance of programming.\r\n     *\r\n     * Example:\r\n     * @code\r\n     * ManagedBuffer p1(16); \r\n     * uint8_t data = p1[0];\r\n     * @endcode\r\n     */\r\n    uint8_t operator [] (int i) const\r\n    {\r\n        return ptr->payload[i];\r\n    }\r\n\r\n    /**\r\n     * Array access operation (modify). \r\n     *\r\n     * Called when a ManagedBuffer is dereferenced with a [] operation.\r\n     * Transparently map this through to the underlying payload for elegance of programming.\r\n     *\r\n     * Example:\r\n     * @code\r\n     * ManagedBuffer p1(16); \r\n     * p1[0] = 42;\r\n     * @endcode\r\n     */\r\n    uint8_t& operator [] (int i)\r\n    {\r\n        return ptr->payload[i];\r\n    }\r\n\r\n    /**\r\n      * Equality operation.\r\n      *\r\n      * Called when one ManagedBuffer is tested to be equal to another using the '==' operator.\r\n      *\r\n      * @param p The ManagedBuffer to test ourselves against.\r\n      * @return true if this ManagedBuffer is identical to the one supplied, false otherwise.\r\n      * \r\n      * Example:\r\n      * @code\r\n      *\r\n      * uint8_t buf = {13,5,2};\r\n      * ManagedBuffer p1(16); \r\n      * ManagedBuffer p2(buf, 3);        \r\n      *\r\n      * if(p1 == p2)                    // will be true\r\n      *     uBit.display.scroll(\"same!\");\r\n      * @endcode\r\n      */\r\n    bool operator== (const ManagedBuffer& p);\r\n    \r\n    /**\r\n      * Sets the byte at the given index to value provided.\r\n      * @param position The index of the byte to change.\r\n      * @param value The new value of the byte (0-255).\r\n      * @return MICROBIT_OK, or MICROBIT_INVALID_PARAMETER.\r\n      *\r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p1(16); \r\n      * p1.setByte(0,255);              // Sets the first byte in the buffer to the value 255.\r\n      * @endcode\r\n      */\r\n    int setByte(int position, uint8_t value);\r\n\r\n    /**\r\n      * Determines the value of the given byte in the buffer.\r\n      *\r\n      * @param position The index of the byte to read.\r\n      * @return The value of the byte at the given position, or MICROBIT_INVALID_PARAMETER.\r\n      *\r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p1(16); \r\n      * p1.setByte(0,255);              // Sets the first byte in the buffer to the value 255.\r\n      * p1.getByte(0);                  // Returns 255.\r\n      * @endcode\r\n      */\r\n    int getByte(int position);\r\n\r\n    /**\r\n      * Gets number of bytes in this buffer \r\n      * @return The size of the buffer in bytes.\r\n      * \r\n      * Example:\r\n      * @code\r\n      * ManagedBuffer p1(16); \r\n      * p1.length();                 // Returns 16.\r\n      * @endcode\r\n      */\r\n    int length() const { return ptr->length; }\r\n\r\n    int fill(uint8_t value, int offset = 0, int length = -1);\r\n\r\n    ManagedBuffer slice(int offset = 0, int length = -1) const;\r\n\r\n    void shift(int offset, int start = 0, int length = -1);\r\n\r\n    void rotate(int offset, int start = 0, int length = -1);\r\n\r\n    int readBytes(uint8_t *dst, int offset, int length, bool swapBytes = false) const;\r\n\r\n    int writeBytes(int dstOffset, uint8_t *src, int length, bool swapBytes = false);\r\n\r\n    int writeBuffer(int dstOffset, const ManagedBuffer &src, int srcOffset = 0, int length = -1);\r\n\r\n    bool isReadOnly() const { return ptr->isReadOnly(); }\r\n};\r\n\r\n#endif\r\n\r\n",
      "README.md": "# core\n\nThe core library.\n\n",
      "basic.cpp": "#include \"pxt.h\"\r\n\r\n\r\n/**\r\n * Provides access to basic micro:bit functionality.\r\n */\r\n//% color=#0078D7 weight=100 icon=\"\\uf00a\"\r\nnamespace basic {\r\n\r\n    /**\r\n     * Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.\r\n     * @param interval speed of scroll; eg: 150, 100, 200, -100\r\n     */\r\n    //% help=basic/show-number\r\n    //% weight=96\r\n    //% blockId=device_show_number block=\"show|number %number\" blockGap=8\r\n    //% async\r\n    //% parts=\"ledmatrix\"\r\n    void showNumber(int value, int interval = 150) {\r\n      if (interval <= 0)\r\n        interval = 1;\r\n      ManagedString t(value);\r\n      if (value < 0 || value >= 10) {\r\n        uBit.display.scroll(t, interval);\r\n      } else {\r\n        uBit.display.printChar(t.charAt(0), interval * 5);\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Draws an image on the LED screen.\r\n     * @param leds the pattern of LED to turn on/off\r\n     * @param interval time in milliseconds to pause after drawing\r\n     */\r\n    //% help=basic/show-leds\r\n    //% weight=95 blockGap=8\r\n    //% imageLiteral=1 async\r\n    //% blockId=device_show_leds\r\n    //% block=\"show leds\" icon=\"\\uf00a\"\r\n    //% parts=\"ledmatrix\"\r\n    void showLeds(ImageLiteral leds, int interval = 400) {\r\n      uBit.display.print(MicroBitImage(imageBytes(leds)), 0, 0, 0, interval);\r\n    }\r\n\r\n    /**\r\n     * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.\r\n     * @param text the text to scroll on the screen, eg: \"Hello!\"\r\n     * @param interval how fast to shift characters; eg: 150, 100, 200, -100\r\n     */\r\n    //% help=basic/show-string\r\n    //% weight=87 blockGap=8\r\n    //% block=\"show|string %text\"\r\n    //% async\r\n    //% blockId=device_print_message\r\n    //% parts=\"ledmatrix\"\r\n    void showString(StringData *text, int interval = 150) {\r\n      if (interval <= 0)\r\n        interval = 1;\r\n      ManagedString s(text);\r\n      int l = s.length();\r\n      if (l == 0) {\r\n        uBit.display.clear();\r\n        fiber_sleep(interval * 5);\r\n      } else if (l > 1) {\r\n        uBit.display.scroll(s, interval);\r\n      } else {\r\n        uBit.display.print(s.charAt(0), interval * 5);\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Turn off all LEDs\r\n     */\r\n    //% help=basic/clear-screen weight=79\r\n    //% blockId=device_clear_display block=\"clear screen\"\r\n    //% parts=\"ledmatrix\"\r\n    //% advanced=true\r\n    void clearScreen() {\r\n      uBit.display.image.clear();\r\n    }\r\n\r\n    /**\r\n     * Shows a sequence of LED screens as an animation.\r\n     * @param leds pattern of LEDs to turn on/off\r\n     * @param interval time in milliseconds between each redraw\r\n     */\r\n    //% help=basic/show-animation imageLiteral=1 async\r\n    //% parts=\"ledmatrix\"\r\n    void showAnimation(ImageLiteral leds, int interval = 400) {\r\n      uBit.display.animate(MicroBitImage(imageBytes(leds)), interval, 5, 0, 0);\r\n    }\r\n\r\n    /**\r\n     * Draws an image on the LED screen.\r\n     * @param leds pattern of LEDs to turn on/off\r\n     */\r\n    //% help=basic/plot-leds weight=80\r\n    //% parts=\"ledmatrix\"\r\n    void plotLeds(ImageLiteral leds) {\r\n      MicroBitImage i(imageBytes(leds));\r\n      uBit.display.print(i, 0, 0, 0, 0);\r\n    }\r\n\r\n    void forever_stub(void *a) {\r\n      while (true) {\r\n        runAction0((Action)a);\r\n        fiber_sleep(20);\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Repeats the code forever in the background. On each iteration, allows other codes to run.\r\n     * @param body code to execute\r\n     */\r\n    //% help=basic/forever weight=55 blockGap=8 blockAllowMultiple=1 afterOnStart=true\r\n    //% blockId=device_forever block=\"forever\" icon=\"\\uf01e\"\r\n    void forever(Action a) {\r\n      if (a != 0) {\r\n        incr(a);\r\n        create_fiber(forever_stub, (void*)a);\r\n      }\r\n    }\r\n\r\n    /**\r\n     * Pause for the specified time in milliseconds\r\n     * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000\r\n     */\r\n    //% help=basic/pause weight=54\r\n    //% async block=\"pause (ms) %pause\"\r\n    //% blockId=device_pause icon=\"\\uf110\"\r\n    void pause(int ms) {\r\n      fiber_sleep(ms);\r\n    }\r\n}\r\n",
      "buffer.cpp": "#include \"pxt.h\"\r\n\r\n// keep in sync with github/pxt/pxtsim/libgeneric.ts\r\nenum class NumberFormat {\r\n    Int8LE = 1,\r\n    UInt8LE,\r\n    Int16LE,\r\n    UInt16LE,\r\n    Int32LE,\r\n    Int8BE,\r\n    UInt8BE,\r\n    Int16BE,\r\n    UInt16BE,\r\n    Int32BE,\r\n    // UInt32,\r\n};\r\n\r\n//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte\r\nnamespace BufferMethods {\r\n    //%\r\n    int getByte(Buffer buf, int off) {\r\n        return max(ManagedBuffer(buf).getByte(off), 0);\r\n    }\r\n\r\n    //%\r\n    void setByte(Buffer buf, int off, int v) {\r\n        ManagedBuffer(buf).setByte(off, v);\r\n    }\r\n\r\n    //%\r\n    uint8_t *getBytes(Buffer buf) {\r\n        return buf->payload;\r\n    }\r\n\r\n    /**\r\n     * Write a number in specified format in the buffer.\r\n     */\r\n    //%\r\n    void setNumber(Buffer buf, NumberFormat format, int offset, int value)\r\n    {\r\n        int8_t i8;\r\n        uint8_t u8;\r\n        int16_t i16;\r\n        uint16_t u16;\r\n        int32_t i32;\r\n\r\n        ManagedBuffer b(buf);\r\n\r\n        // Assume little endian\r\n        #define WRITEBYTES(isz, swap) isz = value; b.writeBytes(offset, (uint8_t*)&isz, sizeof(isz), swap); break\r\n\r\n        switch (format) {\r\n        case NumberFormat::Int8LE: WRITEBYTES(i8, false);\r\n        case NumberFormat::UInt8LE: WRITEBYTES(u8, false);\r\n        case NumberFormat::Int16LE: WRITEBYTES(i16, false);\r\n        case NumberFormat::UInt16LE: WRITEBYTES(u16, false);\r\n        case NumberFormat::Int32LE: WRITEBYTES(i32, false);\r\n        case NumberFormat::Int8BE: WRITEBYTES(i8, true);\r\n        case NumberFormat::UInt8BE: WRITEBYTES(u8, true);\r\n        case NumberFormat::Int16BE: WRITEBYTES(i16, true);\r\n        case NumberFormat::UInt16BE: WRITEBYTES(u16, true);\r\n        case NumberFormat::Int32BE: WRITEBYTES(i32, true);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Read a number in specified format from the buffer.\r\n     */\r\n    //%\r\n    int getNumber(Buffer buf, NumberFormat format, int offset)\r\n    {\r\n        int8_t i8;\r\n        uint8_t u8;\r\n        int16_t i16;\r\n        uint16_t u16;\r\n        int32_t i32;\r\n\r\n        ManagedBuffer b(buf);\r\n\r\n        // Assume little endian\r\n        #define READBYTES(isz, swap) b.readBytes((uint8_t*)&isz, offset, sizeof(isz), swap); return isz\r\n\r\n        switch (format) {\r\n        case NumberFormat::Int8LE: READBYTES(i8, false);\r\n        case NumberFormat::UInt8LE: READBYTES(u8, false);\r\n        case NumberFormat::Int16LE: READBYTES(i16, false);\r\n        case NumberFormat::UInt16LE: READBYTES(u16, false);\r\n        case NumberFormat::Int32LE: READBYTES(i32, false);\r\n        case NumberFormat::Int8BE: READBYTES(i8, true);\r\n        case NumberFormat::UInt8BE: READBYTES(u8, true);\r\n        case NumberFormat::Int16BE: READBYTES(i16, true);\r\n        case NumberFormat::UInt16BE: READBYTES(u16, true);\r\n        case NumberFormat::Int32BE: READBYTES(i32, true);\r\n        }\r\n\r\n        return 0;\r\n    }\r\n\r\n    /** Returns the length of a Buffer object. */\r\n    //% property\r\n    int length(Buffer s) {\r\n        return s->length;\r\n    }\r\n\r\n    /**\r\n     * Fill (a fragment) of the buffer with given value.\r\n     */\r\n    //%\r\n    void fill(Buffer buf, int value, int offset = 0, int length = -1)\r\n    {\r\n        ManagedBuffer(buf).fill(value, offset, length);\r\n    }\r\n\r\n    /**\r\n     * Return a copy of a fragment of a buffer.\r\n     */\r\n    //%\r\n    Buffer slice(Buffer buf, int offset = 0, int length = -1)\r\n    {\r\n        return ManagedBuffer(buf).slice(offset, length).leakData();\r\n    }\r\n\r\n    /**\r\n     * Shift buffer left in place, with zero padding.\r\n     * @param offset number of bytes to shift; use negative value to shift right\r\n     * @param start start offset in buffer. Default is 0.\r\n     * @param length number of elements in buffer. If negative, length is set as the buffer length minus start. eg: -1\r\n     */\r\n    //%\r\n    void shift(Buffer buf, int offset, int start = 0, int length = -1)\r\n    {\r\n        ManagedBuffer(buf).shift(offset, start, length);\r\n    }\r\n\r\n    /**\r\n     * Rotate buffer left in place.\r\n     * @param offset number of bytes to shift; use negative value to shift right\r\n     * @param start start offset in buffer. Default is 0.\r\n     * @param length number of elements in buffer. If negative, length is set as the buffer length minus start. eg: -1\r\n     */\r\n    //%\r\n    void rotate(Buffer buf, int offset, int start = 0, int length = -1)\r\n    {\r\n        ManagedBuffer(buf).rotate(offset, start, length);\r\n    }\r\n\r\n    // int readBytes(uint8_t *dst, int offset, int length, bool swapBytes = false) const;\r\n    // int writeBytes(int dstOffset, uint8_t *src, int length, bool swapBytes = false);\r\n\r\n    /**\r\n     * Write contents of `src` at `dstOffset` in current buffer.\r\n     */\r\n    //%\r\n    void write(Buffer buf, int dstOffset, Buffer src)\r\n    {\r\n        //Not supported, we only do up to 4 args :/\r\n        //void write(Buffer buf, int dstOffset, Buffer src, int srcOffset = 0, int length = -1)\r\n        ManagedBuffer(buf).writeBuffer(dstOffset, ManagedBuffer(src), 0, -1);\r\n    }\r\n}\r\n",
      "control.cpp": "#include \"pxt.h\"\r\n\r\n/**\r\n * How to create the event.\r\n */\r\nenum class EventCreationMode {\r\n    /**\r\n     * MicroBitEvent is initialised, and no further processing takes place.\r\n     */\r\n    CreateOnly = CREATE_ONLY,\r\n    /**\r\n     * MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).\r\n     */\r\n    CreateAndFire = CREATE_AND_FIRE,\r\n};\r\n\r\n// note the trailing '_' in names - otherwise we get conflict with the pre-processor\r\n// this trailing underscore is removed by enums.d.ts generation process\r\n\r\n// TODO shouldn't these be renamed to something more sensible anyways?\r\n\r\nenum EventBusSource {\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_BUTTON_A_ = MICROBIT_ID_BUTTON_A,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_BUTTON_B_ = MICROBIT_ID_BUTTON_B,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_BUTTON_AB_ = MICROBIT_ID_BUTTON_AB,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_RADIO_ = MICROBIT_ID_RADIO,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_GESTURE_ = MICROBIT_ID_GESTURE,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_ACCELEROMETER_ = MICROBIT_ID_ACCELEROMETER,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P0_ = MICROBIT_ID_IO_P0,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P1_ = MICROBIT_ID_IO_P1,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P2_ = MICROBIT_ID_IO_P2,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P3_ = MICROBIT_ID_IO_P3,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P4_ = MICROBIT_ID_IO_P4,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P5_ = MICROBIT_ID_IO_P5,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P6_ = MICROBIT_ID_IO_P6,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P7_ = MICROBIT_ID_IO_P7,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P9_ = MICROBIT_ID_IO_P9,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P10_ = MICROBIT_ID_IO_P10,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P11_ = MICROBIT_ID_IO_P11,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P19_ = MICROBIT_ID_IO_P19,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MICROBIT_ID_IO_P20_ = MICROBIT_ID_IO_P20,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MES_DEVICE_INFO_ID_ = MES_DEVICE_INFO_ID,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MES_SIGNAL_STRENGTH_ID_ = MES_SIGNAL_STRENGTH_ID,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MES_DPAD_CONTROLLER_ID_ = MES_DPAD_CONTROLLER_ID,\r\n    //% blockIdentity=\"control.eventSourceId\"\r\n    MES_BROADCAST_GENERAL_ID_ = MES_BROADCAST_GENERAL_ID,\r\n};\r\n\r\nenum EventBusValue {\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_EVT_ANY_ = MICROBIT_EVT_ANY,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_BUTTON_EVT_DOWN_ = MICROBIT_BUTTON_EVT_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_BUTTON_EVT_UP_ = MICROBIT_BUTTON_EVT_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_BUTTON_EVT_CLICK_ = MICROBIT_BUTTON_EVT_CLICK,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_RADIO_EVT_DATAGRAM_ = MICROBIT_RADIO_EVT_DATAGRAM,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE_ = MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_PIN_EVT_RISE_ = MICROBIT_PIN_EVT_RISE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_PIN_EVT_FALL_ = MICROBIT_PIN_EVT_FALL,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_PIN_EVT_PULSE_HI_ = MICROBIT_PIN_EVT_PULSE_HI,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MICROBIT_PIN_EVT_PULSE_LO_ = MICROBIT_PIN_EVT_PULSE_LO,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM1_ = MES_ALERT_EVT_ALARM1,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM2_ = MES_ALERT_EVT_ALARM2,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM3_ = MES_ALERT_EVT_ALARM3,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM4_ = MES_ALERT_EVT_ALARM4,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM5_ = MES_ALERT_EVT_ALARM5,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_ALARM6_ = MES_ALERT_EVT_ALARM6,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_DISPLAY_TOAST_ = MES_ALERT_EVT_DISPLAY_TOAST,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_FIND_MY_PHONE_ = MES_ALERT_EVT_FIND_MY_PHONE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_PLAY_RINGTONE_ = MES_ALERT_EVT_PLAY_RINGTONE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_PLAY_SOUND_ = MES_ALERT_EVT_PLAY_SOUND,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_ALERT_EVT_VIBRATE_ = MES_ALERT_EVT_VIBRATE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_LAUNCH_PHOTO_MODE_ = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_LAUNCH_VIDEO_MODE_ = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_START_VIDEO_CAPTURE_ = MES_CAMERA_EVT_START_VIDEO_CAPTURE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_STOP_PHOTO_MODE_ = MES_CAMERA_EVT_STOP_PHOTO_MODE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_STOP_VIDEO_CAPTURE_ = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_STOP_VIDEO_MODE_ = MES_CAMERA_EVT_STOP_VIDEO_MODE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_TAKE_PHOTO_ = MES_CAMERA_EVT_TAKE_PHOTO,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_CAMERA_EVT_TOGGLE_FRONT_REAR_ = MES_CAMERA_EVT_TOGGLE_FRONT_REAR,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_DISPLAY_OFF_ = MES_DEVICE_DISPLAY_OFF,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_DISPLAY_ON_ = MES_DEVICE_DISPLAY_ON,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_GESTURE_DEVICE_SHAKEN_ = MES_DEVICE_GESTURE_DEVICE_SHAKEN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_INCOMING_CALL_ = MES_DEVICE_INCOMING_CALL,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_INCOMING_MESSAGE_ = MES_DEVICE_INCOMING_MESSAGE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_ORIENTATION_LANDSCAPE_ = MES_DEVICE_ORIENTATION_LANDSCAPE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DEVICE_ORIENTATION_PORTRAIT_ = MES_DEVICE_ORIENTATION_PORTRAIT,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_1_DOWN_ = MES_DPAD_BUTTON_1_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_1_UP_ = MES_DPAD_BUTTON_1_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_2_DOWN_ = MES_DPAD_BUTTON_2_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_2_UP_ = MES_DPAD_BUTTON_2_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_3_DOWN_ = MES_DPAD_BUTTON_3_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_3_UP_ = MES_DPAD_BUTTON_3_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_4_DOWN_ = MES_DPAD_BUTTON_4_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_4_UP_ = MES_DPAD_BUTTON_4_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_A_DOWN_ = MES_DPAD_BUTTON_A_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_A_UP_ = MES_DPAD_BUTTON_A_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_B_DOWN_ = MES_DPAD_BUTTON_B_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_B_UP_ = MES_DPAD_BUTTON_B_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_C_DOWN_ = MES_DPAD_BUTTON_C_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_C_UP_ = MES_DPAD_BUTTON_C_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_D_DOWN_ = MES_DPAD_BUTTON_D_DOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_DPAD_BUTTON_D_UP_ = MES_DPAD_BUTTON_D_UP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_FORWARD_ = MES_REMOTE_CONTROL_EVT_FORWARD,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_NEXTTRACK_ = MES_REMOTE_CONTROL_EVT_NEXTTRACK,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_PAUSE_ = MES_REMOTE_CONTROL_EVT_PAUSE,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_PLAY_ = MES_REMOTE_CONTROL_EVT_PLAY,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_PREVTRACK_ = MES_REMOTE_CONTROL_EVT_PREVTRACK,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_REWIND_ = MES_REMOTE_CONTROL_EVT_REWIND,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_STOP_ = MES_REMOTE_CONTROL_EVT_STOP,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_VOLUMEDOWN_ = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,\r\n    //% blockIdentity=\"control.eventValueId\"\r\n    MES_REMOTE_CONTROL_EVT_VOLUMEUP_ = MES_REMOTE_CONTROL_EVT_VOLUMEUP,\r\n};\r\n\r\n//% weight=1 color=\"#333333\"\r\n//% advanced=true\r\nnamespace control {\r\n    void fiberDone(void *a)\r\n    {\r\n      decr((Action)a);\r\n      release_fiber();\r\n    }\r\n\r\n    /**\r\n     * Schedules code that run in the background.\r\n     */\r\n    //% help=control/in-background blockAllowMultiple=1 afterOnStart=true\r\n    //% blockId=\"control_in_background\" block=\"run in background\" blockGap=8\r\n    void inBackground(Action a) {\r\n      runInBackground(a);\r\n    }\r\n\r\n    /**\r\n     * Resets the BBC micro:bit.\r\n     */\r\n    //% weight=30 async help=control/reset blockGap=8\r\n    //% blockId=\"control_reset\" block=\"reset\"\r\n    void reset() {\r\n      microbit_reset();\r\n    }\r\n\r\n    /**\r\n    * Blocks the current fiber for the given microseconds\r\n    * @param micros number of micro-seconds to wait. eg: 4\r\n    */\r\n    //% help=control/wait-micros weight=29\r\n    //% blockId=\"control_wait_us\" block=\"wait (µs)%micros\"\r\n    void waitMicros(int micros) {\r\n        wait_us(micros);\r\n    }\r\n\r\n    /**\r\n     * Raises an event in the event bus.\r\n     * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.\r\n     * @param value Component specific code indicating the cause of the event.\r\n     * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE).\r\n     */\r\n    //% weight=21 blockGap=12 blockId=\"control_raise_event\" block=\"raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\" blockExternalInputs=1\r\n    //% help=control/raise-event\r\n    //% mode.defl=CREATE_AND_FIRE\r\n    void raiseEvent(int src, int value, EventCreationMode mode) {\r\n        MicroBitEvent evt(src, value, (MicroBitEventLaunchMode)mode);\r\n    }\r\n\r\n    /**\r\n     * Registers an event handler.\r\n     */\r\n    //% weight=20 blockGap=8 blockId=\"control_on_event\" block=\"on event|from %src=control_event_source_id|with value %value=control_event_value_id\"\r\n    //% help=control/on-event\r\n    //% blockExternalInputs=1\r\n    void onEvent(int src, int value, Action handler) {\r\n        registerWithDal(src, value, handler);\r\n    }\r\n\r\n    /**\r\n    * Gets the value of the last event executed on the bus\r\n    */\r\n    //% blockId=control_event_value\" block=\"event value\"\r\n    //% help=control/event-value\r\n    //% weight=18\r\n    int eventValue() {\r\n        return pxt::lastEvent.value;\r\n    }\r\n\r\n    /**\r\n    * Gets the timestamp of the last event executed on the bus\r\n    */\r\n    //% blockId=control_event_timestamp\" block=\"event timestamp\"\r\n    //% help=control/event-timestamp\r\n    //% weight=19 blockGap=8\r\n    int eventTimestamp() {\r\n        return pxt::lastEvent.timestamp;\r\n    }\r\n\r\n    /**\r\n     * Gets a friendly name for the device derived from the its serial number\r\n     */\r\n    //% blockId=\"control_device_name\" block=\"device name\" weight=10 blockGap=8\r\n    //% advanced=true\r\n    StringData* deviceName() {\r\n        return ManagedString(microbit_friendly_name()).leakData();\r\n    }\r\n\r\n    /**\r\n    * Derive a unique, consistent serial number of this device from internal data.\r\n    */\r\n    //% blockId=\"control_device_serial_number\" block=\"device serial number\" weight=9\r\n    //% advanced=true\r\n    int deviceSerialNumber() {\r\n        return microbit_serial_number();\r\n    }\r\n}\r\n",
      "control.ts": "/**\n* Runtime and event utilities.\n*/\n//% weight=1 color=\"#333333\" icon=\"\\uf233\"\n//% advanced=true\nnamespace control {\n\n    /**\n     * Returns the value of a C++ runtime constant\n     */\n    //% weight=2 weight=19 blockId=\"control_event_source_id\" block=\"%id\" blockGap=8\n    //% shim=TD_ID advanced=true\n    export function eventSourceId(id: EventBusSource): number {\n        return id;\n    }\n    /**\n     * Returns the value of a C++ runtime constant\n     */\n    //% weight=1 weight=19 blockId=\"control_event_value_id\" block=\"%id\"\n    //% shim=TD_ID advanced=true\n    export function eventValueId(id: EventBusValue): number {\n        return id;\n    }\n\n    /**\n     * Display specified error code and stop the program.\n     */\n    //% shim=pxtrt::panic\n    export function panic(code: number) { }\n\n    /**\n     * If the condition is false, display msg on serial console, and panic with code 098.\n     */\n    export function assert(condition: boolean, msg?: string) {\n        if (!condition) {\n            console.log(\"ASSERTION FAILED\")\n            if (msg != null) {\n                console.log(msg)\n            }\n            panic(98)\n        }\n    }\n\n    /**\n     * Display warning in the simulator.\n     */\n    //% shim=pxtrt::runtimeWarning\n    export function runtimeWarning(message: string) { }\n}\n",
      "core.cpp": "#include \"pxt.h\"\r\n#include <limits.h>\r\n\r\n\r\nnamespace String_ {\r\n    //%\r\n    StringData *charAt(StringData *s, int pos) {\r\n      return ManagedString((char)ManagedString(s).charAt(pos)).leakData();\r\n    }\r\n\r\n    //%\r\n    int charCodeAt(StringData *s, int index) {\r\n        return ManagedString(s).charAt(index);\r\n    }\r\n\r\n    //%\r\n    StringData *concat(StringData *s, StringData *other) {\r\n      ManagedString a(s), b(other);\r\n      return (a + b).leakData();\r\n    }\r\n\r\n    //%\r\n    int compare(StringData *s, StringData *that) {\r\n      int compareResult = strcmp(s->data, that->data);\r\n      if (compareResult < 0)\r\n        return -1;\r\n      else if (compareResult > 0)\r\n        return 1;\r\n      return 0;\r\n    }\r\n\r\n    //%\r\n    int compareDecr(StringData *s, StringData *that) {\r\n      int r = compare(s, that);\r\n      if (r == 0)\r\n        decr((uint32_t)that);\r\n      return r;\r\n    }\r\n    \r\n\r\n    //%\r\n    int length(StringData *s) { return s->len; }\r\n\r\n    //%\r\n    StringData *fromCharCode(int code)\r\n    {\r\n      return ManagedString((char)code).leakData();\r\n    }\r\n\r\n    //%\r\n    int toNumber(StringData *s) {\r\n      return atoi(s->data);\r\n    }\r\n\r\n    //%\r\n    StringData *mkEmpty()\r\n    {\r\n        return ManagedString::EmptyString.leakData();\r\n    }\r\n\r\n    //%\r\n    StringData *substr(StringData *s, int start, int length)\r\n    {\r\n        if (length <= 0)\r\n            return mkEmpty();\r\n        if (start < 0)\r\n            start = max(s->len + start, 0);\r\n        length = min(length, s->len - start);\r\n        ManagedString x(s);\r\n        return x.substring(start, length).leakData();\r\n    }\r\n}\r\n\r\n\r\nnamespace Boolean_ {\r\n    // Cache the string literals \"true\" and \"false\" when used.\r\n    // Note that the representation of booleans stays the usual C-one.\r\n    \r\n    static const char sTrue[]  __attribute__ ((aligned (4))) = \"\\xff\\xff\\x04\\x00\" \"true\\0\";\r\n    static const char sFalse[] __attribute__ ((aligned (4))) = \"\\xff\\xff\\x05\\x00\" \"false\\0\";\r\n\r\n    //%\r\n    StringData* toString(bool v)\r\n    {\r\n      if (v) {\r\n        return (StringData*)(void*)sTrue;\r\n      } else {\r\n        return (StringData*)(void*)sFalse;\r\n      }            \r\n    }\r\n\r\n    //%\r\n    bool bang(int v) { return v == 0; }\r\n}\r\n\r\nnamespace Number_ {\r\n    //%\r\n    StringData* toString(int n)\r\n    {\r\n      return ManagedString(n).leakData();\r\n    }\r\n\r\n    // +, - and friends are handled directly by assembly instructions\r\n    // The comparisons are here as they are more code-size efficient\r\n    \r\n    //%\r\n    bool lt(int x, int y) { return x < y; }\r\n    //%\r\n    bool le(int x, int y) { return x <= y; }\r\n    //%\r\n    bool neq(int x, int y) { return x != y; }\r\n    //%\r\n    bool eq(int x, int y) { return x == y; }\r\n    //%\r\n    bool gt(int x, int y) { return x > y; }\r\n    //%\r\n    bool ge(int x, int y) { return x >= y; }\r\n\r\n    // These in fact call into C runtime on Cortex-M0 \r\n    //%\r\n    int div(int x, int y) { return x / y; }\r\n    //%\r\n    int mod(int x, int y) { return x % y; }\r\n\r\n    //%\r\n    bool eqDecr(int x, int y) { \r\n      if(x == y) {\r\n        decr(y);\r\n        return true;\r\n      }\r\n      return false;\r\n    }\r\n}\r\n\r\nnamespace Math_ {\r\n    //%\r\n    int pow(int x, int y)\r\n    {\r\n      if (y < 0)\r\n        return 0;\r\n      int r = 1;\r\n      while (y) {\r\n        if (y & 1)\r\n          r *= x;\r\n        y >>= 1;\r\n        x *= x;\r\n      }\r\n      return r;\r\n    }\r\n    \r\n    //%\r\n    int random(int max) {\r\n      if (max == INT_MIN)\r\n        return -microbit_random(INT_MAX);\r\n      else if (max < 0)\r\n        return -microbit_random(-max);\r\n      else if (max == 0)\r\n        return 0;\r\n      else\r\n        return microbit_random(max);\r\n    }\r\n    \r\n    //%\r\n    int sqrt(int x)\r\n    {\r\n      return ::sqrt(x);\r\n    }\r\n}\r\n\r\nnamespace Array_ {\r\n    //%\r\n    RefCollection *mk(uint32_t flags)\r\n    {\r\n      return new RefCollection(flags);\r\n    }\r\n    //%\r\n    int length(RefCollection *c) { return c->length(); }\r\n    //%\r\n    void setLength(RefCollection *c, int newLength) { c->setLength(newLength); }    \r\n    //%\r\n    void push(RefCollection *c, uint32_t x) { c->push(x); }\r\n    //%\r\n    uint32_t pop(RefCollection *c) { return c->pop(); }    \r\n    //%\r\n    uint32_t getAt(RefCollection *c, int x) { return c->getAt(x); }\r\n    //%\r\n    void setAt(RefCollection *c, int x, uint32_t y) { c->setAt(x, y); }    \r\n    //%\r\n    uint32_t removeAt(RefCollection *c, int x) { return c->removeAt(x); }\r\n    //%\r\n    void insertAt(RefCollection *c, int x, uint32_t value) { c->insertAt(x, value); }    \r\n    //%\r\n    int indexOf(RefCollection *c, uint32_t x, int start) { return c->indexOf(x, start); }\r\n    //%\r\n    int removeElement(RefCollection *c, uint32_t x) { return c->removeElement(x); }\r\n}\r\n\r\n\r\n// Import some stuff directly\r\nnamespace pxt {\r\n  //%\r\n  void registerWithDal(int id, int event, Action a);\r\n  //%\r\n  uint32_t runAction3(Action a, int arg0, int arg1, int arg2);\r\n  //%\r\n  uint32_t runAction2(Action a, int arg0, int arg1);\r\n  //%\r\n  uint32_t runAction1(Action a, int arg0);\r\n  //%\r\n  uint32_t runAction0(Action a);\r\n  //%\r\n  Action mkAction(int reflen, int totallen, int startptr);\r\n  //%\r\n  RefRecord* mkClassInstance(int offset);\r\n  //%\r\n  void RefRecord_destroy(RefRecord *r);\r\n  //%\r\n  void RefRecord_print(RefRecord *r);\r\n  //%\r\n  void debugMemLeaks();\r\n  //%\r\n  int incr(uint32_t e);\r\n  //%\r\n  void decr(uint32_t e);\r\n  //%\r\n  uint32_t *allocate(uint16_t sz);\r\n  //%\r\n  int templateHash();\r\n  //%\r\n  int programHash();\r\n  //%\r\n  void *ptrOfLiteral(int offset);\r\n  //%\r\n  int getNumGlobals();\r\n\r\n  //%\r\n  uint32_t programSize() {\r\n    return bytecode[17] * 2;\r\n  }\r\n\r\n  //%\r\n  uint32_t afterProgramPage() {\r\n    uint32_t ptr = (uint32_t)&bytecode[0];\r\n    ptr += programSize();\r\n    if (ptr % PAGE_SIZE != 0)\r\n      ptr = (ptr & ~(PAGE_SIZE-1)) + PAGE_SIZE;\r\n    return ptr;\r\n  }\r\n}\r\n\r\nnamespace pxtrt {\r\n  //%\r\n  uint32_t ldloc(RefLocal *r) {\r\n    return r->v;\r\n  }\r\n\r\n  //%\r\n  uint32_t ldlocRef(RefRefLocal *r) {\r\n    uint32_t tmp = r->v;\r\n    incr(tmp);\r\n    return tmp;\r\n  }\r\n\r\n  //%\r\n  void stloc(RefLocal *r, uint32_t v) {\r\n    r->v = v;\r\n  }\r\n\r\n  //%\r\n  void stlocRef(RefRefLocal *r, uint32_t v) {\r\n    decr(r->v);\r\n    r->v = v;\r\n  }\r\n\r\n  //%\r\n  RefLocal *mkloc() {\r\n    return new RefLocal();\r\n  }\r\n\r\n  //%\r\n  RefRefLocal *mklocRef() {\r\n    return new RefRefLocal();\r\n  }\r\n\r\n  // All of the functions below unref() self. This is for performance reasons -\r\n  // the code emitter will not emit the unrefs for them.\r\n \r\n  //%\r\n  uint32_t ldfld(RefRecord *r, int idx) {\r\n    auto tmp = r->ld(idx);\r\n    r->unref();\r\n    return tmp;\r\n  }\r\n\r\n  //%\r\n  uint32_t ldfldRef(RefRecord *r, int idx) {\r\n    auto tmp = r->ldref(idx);\r\n    r->unref();\r\n    return tmp;\r\n  }\r\n\r\n  //%\r\n  void stfld(RefRecord *r, int idx, uint32_t val) {\r\n    r->st(idx, val);\r\n    r->unref();\r\n  }\r\n\r\n  //%\r\n  void stfldRef(RefRecord *r, int idx, uint32_t val) {\r\n    r->stref(idx, val);\r\n    r->unref();\r\n  }\r\n\r\n  // Store a captured local in a closure. It returns the action, so it can be chained.\r\n  //%\r\n  RefAction *stclo(RefAction *a, int idx, uint32_t v)\r\n  {\r\n    //DBG(\"STCLO \"); a->print(); DBG(\"@%d = %p\\n\", idx, (void*)v);\r\n    a->stCore(idx, v);\r\n    return a;\r\n  }\r\n\r\n  //%\r\n  void panic(int code)\r\n  {\r\n    microbit_panic(code);\r\n  }\r\n\r\n  //%\r\n  int stringToBool(StringData *s) {\r\n    if (s == NULL) return 0;\r\n    if (s->len == 0) {\r\n      s->decr();\r\n      return 0;\r\n    }\r\n    s->decr();\r\n    return 1;\r\n  }\r\n\r\n  //%\r\n  StringData* emptyToNull(StringData *s) {\r\n    if (!s || s->len == 0)\r\n      return NULL;\r\n    return s;\r\n  }\r\n\r\n  //%\r\n  int ptrToBool(uint32_t p) {\r\n    if (p) {\r\n      decr(p);\r\n      return 1;\r\n    } else {\r\n      return 0;\r\n    }\r\n  }\r\n\r\n  //%\r\n  RefMap *mkMap() {\r\n    return new RefMap();\r\n  }\r\n\r\n  //%\r\n  uint32_t mapGet(RefMap *map, uint32_t key) {\r\n    int i = map->findIdx(key);\r\n    if (i < 0) {\r\n      map->unref();\r\n      return 0;\r\n    }\r\n    uint32_t r = map->data[i].val;\r\n    map->unref();\r\n    return r;\r\n  }\r\n\r\n  //%\r\n  uint32_t mapGetRef(RefMap *map, uint32_t key) {\r\n    int i = map->findIdx(key);\r\n    if (i < 0) {\r\n      map->unref();\r\n      return 0;\r\n    }\r\n    uint32_t r = incr(map->data[i].val);\r\n    map->unref();\r\n    return r;\r\n  }\r\n\r\n  //%\r\n  void mapSet(RefMap *map, uint32_t key, uint32_t val) {\r\n    int i = map->findIdx(key);\r\n    if (i < 0) {\r\n      map->data.push_back({\r\n        key << 1,\r\n        val\r\n      });\r\n    } else {\r\n      if (map->data[i].key & 1) {\r\n        decr(map->data[i].val);\r\n        map->data[i].key = key << 1;\r\n      }\r\n      map->data[i].val = val;\r\n    }\r\n    map->unref();\r\n  }\r\n\r\n  //%\r\n  void mapSetRef(RefMap *map, uint32_t key, uint32_t val) {\r\n    int i = map->findIdx(key);\r\n    if (i < 0) {\r\n      map->data.push_back({\r\n        (key << 1) | 1,\r\n        val\r\n      });\r\n    } else {\r\n      if (map->data[i].key & 1) {\r\n        decr(map->data[i].val);\r\n      } else {\r\n        map->data[i].key = (key << 1) | 1;\r\n      }\r\n      map->data[i].val = val;\r\n    }\r\n    map->unref();      \r\n  }\r\n\r\n  //\r\n  // Debugger\r\n  //\r\n\r\n  //%\r\n  void* getGlobalsPtr() {\r\n    return globals;\r\n  }\r\n\r\n  //%\r\n  void runtimeWarning(StringData *s) {\r\n    // noop for now\r\n  }\r\n}\r\n",
      "dal.d.ts": "// Auto-generated. Do not edit.\ndeclare const enum DAL {\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/ExternalEvents.h\n    MICROBIT_ID_BLE = 1000,\n    MICROBIT_ID_BLE_UART = 1200,\n    MICROBIT_BLE_EVT_CONNECTED = 1,\n    MICROBIT_BLE_EVT_DISCONNECTED = 2,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MESEvents.h\n    MES_REMOTE_CONTROL_ID = 1001,\n    MES_REMOTE_CONTROL_EVT_PLAY = 1,\n    MES_REMOTE_CONTROL_EVT_PAUSE = 2,\n    MES_REMOTE_CONTROL_EVT_STOP = 3,\n    MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4,\n    MES_REMOTE_CONTROL_EVT_PREVTRACK = 5,\n    MES_REMOTE_CONTROL_EVT_FORWARD = 6,\n    MES_REMOTE_CONTROL_EVT_REWIND = 7,\n    MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8,\n    MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9,\n    MES_CAMERA_ID = 1002,\n    MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1,\n    MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2,\n    MES_CAMERA_EVT_TAKE_PHOTO = 3,\n    MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4,\n    MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5,\n    MES_CAMERA_EVT_STOP_PHOTO_MODE = 6,\n    MES_CAMERA_EVT_STOP_VIDEO_MODE = 7,\n    MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8,\n    MES_ALERTS_ID = 1004,\n    MES_ALERT_EVT_DISPLAY_TOAST = 1,\n    MES_ALERT_EVT_VIBRATE = 2,\n    MES_ALERT_EVT_PLAY_SOUND = 3,\n    MES_ALERT_EVT_PLAY_RINGTONE = 4,\n    MES_ALERT_EVT_FIND_MY_PHONE = 5,\n    MES_ALERT_EVT_ALARM1 = 6,\n    MES_ALERT_EVT_ALARM2 = 7,\n    MES_ALERT_EVT_ALARM3 = 8,\n    MES_ALERT_EVT_ALARM4 = 9,\n    MES_ALERT_EVT_ALARM5 = 10,\n    MES_ALERT_EVT_ALARM6 = 11,\n    MES_SIGNAL_STRENGTH_ID = 1101,\n    MES_SIGNAL_STRENGTH_EVT_NO_BAR = 1,\n    MES_SIGNAL_STRENGTH_EVT_ONE_BAR = 2,\n    MES_SIGNAL_STRENGTH_EVT_TWO_BAR = 3,\n    MES_SIGNAL_STRENGTH_EVT_THREE_BAR = 4,\n    MES_SIGNAL_STRENGTH_EVT_FOUR_BAR = 5,\n    MES_DEVICE_INFO_ID = 1103,\n    MES_DEVICE_ORIENTATION_LANDSCAPE = 1,\n    MES_DEVICE_ORIENTATION_PORTRAIT = 2,\n    MES_DEVICE_GESTURE_NONE = 3,\n    MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4,\n    MES_DEVICE_DISPLAY_OFF = 5,\n    MES_DEVICE_DISPLAY_ON = 6,\n    MES_DEVICE_INCOMING_CALL = 7,\n    MES_DEVICE_INCOMING_MESSAGE = 8,\n    MES_DPAD_CONTROLLER_ID = 1104,\n    MES_DPAD_BUTTON_A_DOWN = 1,\n    MES_DPAD_BUTTON_A_UP = 2,\n    MES_DPAD_BUTTON_B_DOWN = 3,\n    MES_DPAD_BUTTON_B_UP = 4,\n    MES_DPAD_BUTTON_C_DOWN = 5,\n    MES_DPAD_BUTTON_C_UP = 6,\n    MES_DPAD_BUTTON_D_DOWN = 7,\n    MES_DPAD_BUTTON_D_UP = 8,\n    MES_DPAD_BUTTON_1_DOWN = 9,\n    MES_DPAD_BUTTON_1_UP = 10,\n    MES_DPAD_BUTTON_2_DOWN = 11,\n    MES_DPAD_BUTTON_2_UP = 12,\n    MES_DPAD_BUTTON_3_DOWN = 13,\n    MES_DPAD_BUTTON_3_UP = 14,\n    MES_DPAD_BUTTON_4_DOWN = 15,\n    MES_DPAD_BUTTON_4_UP = 16,\n    MES_BROADCAST_GENERAL_ID = 2000,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitAccelerometerService.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitBLEManager.h\n    MICROBIT_BLE_PAIR_REQUEST = 0x01,\n    MICROBIT_BLE_PAIR_COMPLETE = 0x02,\n    MICROBIT_BLE_PAIR_PASSCODE = 0x04,\n    MICROBIT_BLE_PAIR_SUCCESSFUL = 0x08,\n    MICROBIT_BLE_PAIRING_TIMEOUT = 90,\n    MICROBIT_BLE_POWER_LEVELS = 8,\n    MICROBIT_BLE_MAXIMUM_BONDS = 4,\n    MICROBIT_BLE_EDDYSTONE_ADV_INTERVAL = 400,\n    MICROBIT_BLE_EDDYSTONE_DEFAULT_POWER = 0xF0,\n    MICROBIT_BLE_STATUS_STORE_SYSATTR = 0x02,\n    MICROBIT_BLE_STATUS_DISCONNECT = 0x04,\n    MICROBIT_BLE_DISCONNECT_AFTER_PAIRING_DELAY = 500,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitButtonService.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitDFUService.h\n    MICROBIT_DFU_OPCODE_START_DFU = 1,\n    MICROBIT_DFU_HISTOGRAM_WIDTH = 5,\n    MICROBIT_DFU_HISTOGRAM_HEIGHT = 5,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitEddystone.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitEventService.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitIOPinService.h\n    MICROBIT_IO_PIN_SERVICE_PINCOUNT = 19,\n    MICROBIT_IO_PIN_SERVICE_DATA_SIZE = 10,\n    MICROBIT_PWM_PIN_SERVICE_DATA_SIZE = 2,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitLEDService.h\n    MICROBIT_BLE_MAXIMUM_SCROLLTEXT = 20,\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitMagnetometerService.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitTemperatureService.h\n    // built/yt/yotta_modules/microbit-dal/inc/bluetooth/MicroBitUARTService.h\n    MICROBIT_UART_S_DEFAULT_BUF_SIZE = 20,\n    MICROBIT_UART_S_EVT_DELIM_MATCH = 1,\n    MICROBIT_UART_S_EVT_HEAD_MATCH = 2,\n    MICROBIT_UART_S_EVT_RX_FULL = 3,\n    // built/yt/yotta_modules/microbit-dal/inc/core/ErrorNo.h\n    MICROBIT_OK = 0,\n    MICROBIT_INVALID_PARAMETER = -1001,\n    MICROBIT_NOT_SUPPORTED = -1002,\n    MICROBIT_CALIBRATION_IN_PROGRESS = -1003,\n    MICROBIT_CALIBRATION_REQUIRED = -1004,\n    MICROBIT_NO_RESOURCES = -1005,\n    MICROBIT_BUSY = -1006,\n    MICROBIT_CANCELLED = -1007,\n    MICROBIT_I2C_ERROR = -1010,\n    MICROBIT_SERIAL_IN_USE = -1011,\n    MICROBIT_NO_DATA = -1012,\n    MICROBIT_OOM = 20,\n    MICROBIT_HEAP_ERROR = 30,\n    MICROBIT_NULL_DEREFERENCE = 40,\n    // built/yt/yotta_modules/microbit-dal/inc/core/EventModel.h\n    // built/yt/yotta_modules/microbit-dal/inc/core/MemberFunctionCallback.h\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitCompat.h\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitComponent.h\n    MICROBIT_ID_BUTTON_A = 1,\n    MICROBIT_ID_BUTTON_B = 2,\n    MICROBIT_ID_BUTTON_RESET = 3,\n    MICROBIT_ID_ACCELEROMETER = 4,\n    MICROBIT_ID_COMPASS = 5,\n    MICROBIT_ID_DISPLAY = 6,\n    MICROBIT_IO_PINS = 20,\n    MICROBIT_ID_IO_P0 = 7,\n    MICROBIT_ID_IO_P1 = 8,\n    MICROBIT_ID_IO_P2 = 9,\n    MICROBIT_ID_IO_P3 = 10,\n    MICROBIT_ID_IO_P4 = 11,\n    MICROBIT_ID_IO_P5 = 12,\n    MICROBIT_ID_IO_P6 = 13,\n    MICROBIT_ID_IO_P7 = 14,\n    MICROBIT_ID_IO_P8 = 15,\n    MICROBIT_ID_IO_P9 = 16,\n    MICROBIT_ID_IO_P10 = 17,\n    MICROBIT_ID_IO_P11 = 18,\n    MICROBIT_ID_IO_P12 = 19,\n    MICROBIT_ID_IO_P13 = 20,\n    MICROBIT_ID_IO_P14 = 21,\n    MICROBIT_ID_IO_P15 = 22,\n    MICROBIT_ID_IO_P16 = 23,\n    MICROBIT_ID_IO_P19 = 24,\n    MICROBIT_ID_IO_P20 = 25,\n    MICROBIT_ID_BUTTON_AB = 26,\n    MICROBIT_ID_GESTURE = 27,\n    MICROBIT_ID_THERMOMETER = 28,\n    MICROBIT_ID_RADIO = 29,\n    MICROBIT_ID_RADIO_DATA_READY = 30,\n    MICROBIT_ID_MULTIBUTTON_ATTACH = 31,\n    MICROBIT_ID_SERIAL = 32,\n    MICROBIT_ID_MESSAGE_BUS_LISTENER = 1021,\n    MICROBIT_ID_NOTIFY_ONE = 1022,\n    MICROBIT_ID_NOTIFY = 1023,\n    MICROBIT_COMPONENT_RUNNING = 0x01,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitDevice.h\n    MICROBIT_NAME_LENGTH = 5,\n    MICROBIT_NAME_CODE_LETTERS = 5,\n    MICROBIT_PANIC_ERROR_CHARS = 4,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitFiber.h\n    MICROBIT_SCHEDULER_RUNNING = 0x01,\n    MICROBIT_FIBER_FLAG_FOB = 0x01,\n    MICROBIT_FIBER_FLAG_PARENT = 0x02,\n    MICROBIT_FIBER_FLAG_CHILD = 0x04,\n    MICROBIT_FIBER_FLAG_DO_NOT_PAGE = 0x08,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitFont.h\n    MICROBIT_FONT_WIDTH = 5,\n    MICROBIT_FONT_HEIGHT = 5,\n    MICROBIT_FONT_ASCII_START = 32,\n    MICROBIT_FONT_ASCII_END = 126,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitHeapAllocator.h\n    MICROBIT_MAXIMUM_HEAPS = 2,\n    MICROBIT_HEAP_BLOCK_FREE = 0x80000000,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitListener.h\n    MESSAGE_BUS_LISTENER_PARAMETERISED = 0x0001,\n    MESSAGE_BUS_LISTENER_METHOD = 0x0002,\n    MESSAGE_BUS_LISTENER_BUSY = 0x0004,\n    MESSAGE_BUS_LISTENER_REENTRANT = 0x0008,\n    MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY = 0x0010,\n    MESSAGE_BUS_LISTENER_DROP_IF_BUSY = 0x0020,\n    MESSAGE_BUS_LISTENER_NONBLOCKING = 0x0040,\n    MESSAGE_BUS_LISTENER_URGENT = 0x0080,\n    MESSAGE_BUS_LISTENER_DELETING = 0x8000,\n    // built/yt/yotta_modules/microbit-dal/inc/core/MicroBitSystemTimer.h\n    // built/yt/yotta_modules/microbit-dal/inc/core/NotifyEvents.h\n    MICROBIT_DISPLAY_EVT_FREE = 1,\n    MICROBIT_SERIAL_EVT_TX_EMPTY = 2,\n    MICROBIT_UART_S_EVT_TX_EMPTY = 3,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/DynamicPwm.h\n    MICROBIT_DEFAULT_PWM_PERIOD = 20000,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitAccelerometer.h\n    MICROBIT_ACCEL_PITCH_ROLL_VALID = 0x02,\n    MICROBIT_ACCEL_ADDED_TO_IDLE = 0x04,\n    MMA8653_DEFAULT_ADDR = 0x3A,\n    MMA8653_STATUS = 0x00,\n    MMA8653_OUT_X_MSB = 0x01,\n    MMA8653_WHOAMI = 0x0D,\n    MMA8653_XYZ_DATA_CFG = 0x0E,\n    MMA8653_CTRL_REG1 = 0x2A,\n    MMA8653_CTRL_REG2 = 0x2B,\n    MMA8653_CTRL_REG3 = 0x2C,\n    MMA8653_CTRL_REG4 = 0x2D,\n    MMA8653_CTRL_REG5 = 0x2E,\n    MMA8653_WHOAMI_VAL = 0x5A,\n    MMA8653_SAMPLE_RANGES = 3,\n    MMA8653_SAMPLE_RATES = 8,\n    MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1,\n    MICROBIT_ACCELEROMETER_EVT_NONE = 0,\n    MICROBIT_ACCELEROMETER_EVT_TILT_UP = 1,\n    MICROBIT_ACCELEROMETER_EVT_TILT_DOWN = 2,\n    MICROBIT_ACCELEROMETER_EVT_TILT_LEFT = 3,\n    MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT = 4,\n    MICROBIT_ACCELEROMETER_EVT_FACE_UP = 5,\n    MICROBIT_ACCELEROMETER_EVT_FACE_DOWN = 6,\n    MICROBIT_ACCELEROMETER_EVT_FREEFALL = 7,\n    MICROBIT_ACCELEROMETER_EVT_3G = 8,\n    MICROBIT_ACCELEROMETER_EVT_6G = 9,\n    MICROBIT_ACCELEROMETER_EVT_8G = 10,\n    MICROBIT_ACCELEROMETER_EVT_SHAKE = 11,\n    MICROBIT_ACCELEROMETER_REST_TOLERANCE = 200,\n    MICROBIT_ACCELEROMETER_TILT_TOLERANCE = 200,\n    MICROBIT_ACCELEROMETER_FREEFALL_TOLERANCE = 400,\n    MICROBIT_ACCELEROMETER_SHAKE_TOLERANCE = 400,\n    MICROBIT_ACCELEROMETER_3G_TOLERANCE = 3072,\n    MICROBIT_ACCELEROMETER_6G_TOLERANCE = 6144,\n    MICROBIT_ACCELEROMETER_8G_TOLERANCE = 8192,\n    MICROBIT_ACCELEROMETER_GESTURE_DAMPING = 5,\n    MICROBIT_ACCELEROMETER_SHAKE_DAMPING = 10,\n    MICROBIT_ACCELEROMETER_SHAKE_RTX = 30,\n    MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD = 4,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitButton.h\n    MICROBIT_BUTTON_EVT_DOWN = 1,\n    MICROBIT_BUTTON_EVT_UP = 2,\n    MICROBIT_BUTTON_EVT_CLICK = 3,\n    MICROBIT_BUTTON_EVT_LONG_CLICK = 4,\n    MICROBIT_BUTTON_EVT_HOLD = 5,\n    MICROBIT_BUTTON_EVT_DOUBLE_CLICK = 6,\n    MICROBIT_BUTTON_LONG_CLICK_TIME = 1000,\n    MICROBIT_BUTTON_HOLD_TIME = 1500,\n    MICROBIT_BUTTON_STATE = 1,\n    MICROBIT_BUTTON_STATE_HOLD_TRIGGERED = 2,\n    MICROBIT_BUTTON_STATE_CLICK = 4,\n    MICROBIT_BUTTON_STATE_LONG_CLICK = 8,\n    MICROBIT_BUTTON_SIGMA_MIN = 0,\n    MICROBIT_BUTTON_SIGMA_MAX = 12,\n    MICROBIT_BUTTON_SIGMA_THRESH_HI = 8,\n    MICROBIT_BUTTON_SIGMA_THRESH_LO = 2,\n    MICROBIT_BUTTON_DOUBLE_CLICK_THRESH = 50,\n    MICROBIT_BUTTON_SIMPLE_EVENTS = 0,\n    MICROBIT_BUTTON_ALL_EVENTS = 1,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitCompass.h\n    MAG3110_DEFAULT_ADDR = 0x1D,\n    MAG_DR_STATUS = 0x00,\n    MAG_OUT_X_MSB = 0x01,\n    MAG_OUT_X_LSB = 0x02,\n    MAG_OUT_Y_MSB = 0x03,\n    MAG_OUT_Y_LSB = 0x04,\n    MAG_OUT_Z_MSB = 0x05,\n    MAG_OUT_Z_LSB = 0x06,\n    MAG_WHOAMI = 0x07,\n    MAG_SYSMOD = 0x08,\n    MAG_OFF_X_MSB = 0x09,\n    MAG_OFF_X_LSB = 0x0A,\n    MAG_OFF_Y_MSB = 0x0B,\n    MAG_OFF_Y_LSB = 0x0C,\n    MAG_OFF_Z_MSB = 0x0D,\n    MAG_OFF_Z_LSB = 0x0E,\n    MAG_DIE_TEMP = 0x0F,\n    MAG_CTRL_REG1 = 0x10,\n    MAG_CTRL_REG2 = 0x11,\n    MAG3110_SAMPLE_RATES = 11,\n    MICROBIT_COMPASS_EVT_CAL_REQUIRED = 1,\n    MICROBIT_COMPASS_EVT_CAL_START = 2,\n    MICROBIT_COMPASS_EVT_CAL_END = 3,\n    MICROBIT_COMPASS_EVT_DATA_UPDATE = 4,\n    MICROBIT_COMPASS_EVT_CONFIG_NEEDED = 5,\n    MICROBIT_COMPASS_EVT_CALIBRATE = 6,\n    MICROBIT_COMPASS_STATUS_CALIBRATED = 2,\n    MICROBIT_COMPASS_STATUS_CALIBRATING = 4,\n    MICROBIT_COMPASS_STATUS_ADDED_TO_IDLE = 8,\n    MAG3110_WHOAMI_VAL = 0xC4,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitCompassCalibrator.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitDisplay.h\n    MICROBIT_DISPLAY_EVT_ANIMATION_COMPLETE = 1,\n    MICROBIT_DISPLAY_EVT_LIGHT_SENSE = 2,\n    MICROBIT_DISPLAY_DEFAULT_AUTOCLEAR = 1,\n    MICROBIT_DISPLAY_SPACING = 1,\n    MICROBIT_DISPLAY_GREYSCALE_BIT_DEPTH = 8,\n    MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS = -255,\n    ANIMATION_MODE_NONE = 0,\n    ANIMATION_MODE_STOPPED = 1,\n    ANIMATION_MODE_SCROLL_TEXT = 2,\n    ANIMATION_MODE_PRINT_TEXT = 3,\n    ANIMATION_MODE_SCROLL_IMAGE = 4,\n    ANIMATION_MODE_ANIMATE_IMAGE = 5,\n    ANIMATION_MODE_ANIMATE_IMAGE_WITH_CLEAR = 6,\n    ANIMATION_MODE_PRINT_CHARACTER = 7,\n    DISPLAY_MODE_BLACK_AND_WHITE = 0,\n    DISPLAY_MODE_GREYSCALE = 1,\n    DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE = 2,\n    MICROBIT_DISPLAY_ROTATION_0 = 0,\n    MICROBIT_DISPLAY_ROTATION_90 = 1,\n    MICROBIT_DISPLAY_ROTATION_180 = 2,\n    MICROBIT_DISPLAY_ROTATION_270 = 3,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitFile.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitFileSystem.h\n    MBFS_FILENAME_LENGTH = 16,\n    MB_READ = 0x01,\n    MB_WRITE = 0x02,\n    MB_CREAT = 0x04,\n    MB_APPEND = 0x08,\n    MB_SEEK_SET = 0x01,\n    MB_SEEK_END = 0x02,\n    MB_SEEK_CUR = 0x04,\n    MBFS_STATUS_INITIALISED = 0x01,\n    MBFS_UNUSED = 0xFFFF,\n    MBFS_EOF = 0xEFFF,\n    MBFS_DELETED = 0x0000,\n    MBFS_DIRECTORY_ENTRY_FREE = 0x8000,\n    MBFS_DIRECTORY_ENTRY_VALID = 0x4000,\n    MBFS_DIRECTORY_ENTRY_DIRECTORY = 0x2000,\n    MBFS_DIRECTORY_ENTRY_NEW = 0xffff,\n    MBFS_DIRECTORY_ENTRY_DELETED = 0x0000,\n    MBFS_BLOCK_TYPE_FILE = 1,\n    MBFS_BLOCK_TYPE_DIRECTORY = 2,\n    MBFS_BLOCK_TYPE_FILETABLE = 3,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitFlash.h\n    PAGE_SIZE = 1024,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitI2C.h\n    MICROBIT_I2C_MAX_RETRIES = 9,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitIO.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitLightSensor.h\n    MICROBIT_LIGHT_SENSOR_CHAN_NUM = 3,\n    MICROBIT_LIGHT_SENSOR_AN_SET_TIME = 4000,\n    MICROBIT_LIGHT_SENSOR_TICK_PERIOD = 5,\n    MICROBIT_LIGHT_SENSOR_MAX_VALUE = 338,\n    MICROBIT_LIGHT_SENSOR_MIN_VALUE = 75,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitMatrixMaps.h\n    NO_CONN = 0,\n    MICROBIT_DISPLAY_WIDTH = 5,\n    MICROBIT_DISPLAY_HEIGHT = 5,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitMessageBus.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitMultiButton.h\n    MICROBIT_MULTI_BUTTON_STATE_1 = 0x01,\n    MICROBIT_MULTI_BUTTON_STATE_2 = 0x02,\n    MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_1 = 0x04,\n    MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_2 = 0x08,\n    MICROBIT_MULTI_BUTTON_SUPRESSED_1 = 0X10,\n    MICROBIT_MULTI_BUTTON_SUPRESSED_2 = 0x20,\n    MICROBIT_MULTI_BUTTON_ATTACHED = 0x40,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitPin.h\n    IO_STATUS_DIGITAL_IN = 0x01,\n    IO_STATUS_DIGITAL_OUT = 0x02,\n    IO_STATUS_ANALOG_IN = 0x04,\n    IO_STATUS_ANALOG_OUT = 0x08,\n    IO_STATUS_TOUCH_IN = 0x10,\n    IO_STATUS_EVENT_ON_EDGE = 0x20,\n    IO_STATUS_EVENT_PULSE_ON_EDGE = 0x40,\n    MICROBIT_PIN_MAX_OUTPUT = 1023,\n    MICROBIT_PIN_MAX_SERVO_RANGE = 180,\n    MICROBIT_PIN_DEFAULT_SERVO_RANGE = 2000,\n    MICROBIT_PIN_DEFAULT_SERVO_CENTER = 1500,\n    MICROBIT_PIN_EVENT_NONE = 0,\n    MICROBIT_PIN_EVENT_ON_EDGE = 1,\n    MICROBIT_PIN_EVENT_ON_PULSE = 2,\n    MICROBIT_PIN_EVENT_ON_TOUCH = 3,\n    MICROBIT_PIN_EVT_RISE = 2,\n    MICROBIT_PIN_EVT_FALL = 3,\n    MICROBIT_PIN_EVT_PULSE_HI = 4,\n    MICROBIT_PIN_EVT_PULSE_LO = 5,\n    PIN_CAPABILITY_DIGITAL_IN = 0x01,\n    PIN_CAPABILITY_DIGITAL_OUT = 0x02,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitQuadratureDecoder.h\n    QDEC_USE_SYSTEM_TICK = 0x01,\n    QDEC_USE_DEBOUNCE = 0x02,\n    QDEC_LED_ACTIVE_LOW = 0x04,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitRadio.h\n    MICROBIT_RADIO_STATUS_INITIALISED = 0x0001,\n    MICROBIT_RADIO_BASE_ADDRESS = 0x75626974,\n    MICROBIT_RADIO_DEFAULT_GROUP = 0,\n    MICROBIT_RADIO_DEFAULT_TX_POWER = 6,\n    MICROBIT_RADIO_DEFAULT_FREQUENCY = 7,\n    MICROBIT_RADIO_MAX_PACKET_SIZE = 32,\n    MICROBIT_RADIO_HEADER_SIZE = 4,\n    MICROBIT_RADIO_MAXIMUM_RX_BUFFERS = 4,\n    MICROBIT_RADIO_PROTOCOL_DATAGRAM = 1,\n    MICROBIT_RADIO_PROTOCOL_EVENTBUS = 2,\n    MICROBIT_RADIO_EVT_DATAGRAM = 1,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitRadioDatagram.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitRadioEvent.h\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitSerial.h\n    MICROBIT_SERIAL_DEFAULT_BAUD_RATE = 115200,\n    MICROBIT_SERIAL_DEFAULT_BUFFER_SIZE = 20,\n    MICROBIT_SERIAL_EVT_DELIM_MATCH = 1,\n    MICROBIT_SERIAL_EVT_HEAD_MATCH = 2,\n    MICROBIT_SERIAL_EVT_RX_FULL = 3,\n    MICROBIT_SERIAL_RX_IN_USE = 1,\n    MICROBIT_SERIAL_TX_IN_USE = 2,\n    MICROBIT_SERIAL_RX_BUFF_INIT = 4,\n    MICROBIT_SERIAL_TX_BUFF_INIT = 8,\n    ASYNC = 0,\n    SYNC_SPINWAIT = 1,\n    SYNC_SLEEP = 2,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitStorage.h\n    MICROBIT_STORAGE_MAGIC = 0xCAFE,\n    MICROBIT_STORAGE_BLOCK_SIZE = 48,\n    MICROBIT_STORAGE_KEY_SIZE = 16,\n    MICROBIT_STORAGE_STORE_PAGE_OFFSET = 17,\n    MICROBIT_STORAGE_SCRATCH_PAGE_OFFSET = 19,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/MicroBitThermometer.h\n    MICROBIT_THERMOMETER_PERIOD = 1000,\n    MICROBIT_THERMOMETER_EVT_UPDATE = 1,\n    MICROBIT_THERMOMETER_ADDED_TO_IDLE = 2,\n    // built/yt/yotta_modules/microbit-dal/inc/drivers/TimedInterruptIn.h\n    // built/yt/yotta_modules/microbit-dal/inc/platform/yotta_cfg_mappings.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/ManagedString.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/ManagedType.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/Matrix4.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/MicroBitCoordinateSystem.h\n    RAW = 0,\n    SIMPLE_CARTESIAN = 1,\n    NORTH_EAST_DOWN = 2,\n    // built/yt/yotta_modules/microbit-dal/inc/types/MicroBitEvent.h\n    MICROBIT_ID_ANY = 0,\n    MICROBIT_EVT_ANY = 0,\n    CREATE_ONLY = 0,\n    CREATE_AND_FIRE = 1,\n    // built/yt/yotta_modules/microbit-dal/inc/types/MicroBitImage.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/PacketBuffer.h\n    // built/yt/yotta_modules/microbit-dal/inc/types/RefCounted.h\n}\n",
      "enums.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace images {\n}\ndeclare namespace basic {\n}\n\n\n    declare const enum Button {\n    A = 1,  // MICROBIT_ID_BUTTON_A\n    B = 2,  // MICROBIT_ID_BUTTON_B\n    //% block=\"A+B\"\n    AB = 26,  // MICROBIT_ID_BUTTON_AB\n    }\n\n\n    declare const enum Dimension {\n    //% block=x\n    X = 0,\n    //% block=y\n    Y = 1,\n    //% block=z\n    Z = 2,\n    //% block=strength\n    Strength = 3,\n    }\n\n\n    declare const enum Rotation {\n    //% block=pitch\n    Pitch = 0,\n    //% block=roll\n    Roll = 1,\n    }\n\n\n    declare const enum TouchPin {\n    P0 = 7,  // MICROBIT_ID_IO_P0\n    P1 = 8,  // MICROBIT_ID_IO_P1\n    P2 = 9,  // MICROBIT_ID_IO_P2\n    }\n\n\n    declare const enum AcceleratorRange {\n    /**\n     * The accelerator measures forces up to 1 gravity\n     */\n    //%  block=\"1g\"\n    OneG = 1,\n    /**\n     * The accelerator measures forces up to 2 gravity\n     */\n    //%  block=\"2g\"\n    TwoG = 2,\n    /**\n     * The accelerator measures forces up to 4 gravity\n     */\n    //% block=\"4g\"\n    FourG = 4,\n    /**\n     * The accelerator measures forces up to 8 gravity\n     */\n    //% block=\"8g\"\n    EightG = 8,\n    }\n\n\n    declare const enum Gesture {\n    /**\n     * Raised when shaken\n     */\n    //% block=shake\n    Shake = 11,  // MICROBIT_ACCELEROMETER_EVT_SHAKE\n    /**\n     * Raised when the logo is upward and the screen is vertical\n     */\n    //% block=\"logo up\"\n    LogoUp = 1,  // MICROBIT_ACCELEROMETER_EVT_TILT_UP\n    /**\n     * Raised when the logo is downward and the screen is vertical\n     */\n    //% block=\"logo down\"\n    LogoDown = 2,  // MICROBIT_ACCELEROMETER_EVT_TILT_DOWN\n    /**\n     * Raised when the screen is pointing down and the board is horizontal\n     */\n    //% block=\"screen up\"\n    ScreenUp = 5,  // MICROBIT_ACCELEROMETER_EVT_FACE_UP\n    /**\n     * Raised when the screen is pointing up and the board is horizontal\n     */\n    //% block=\"screen down\"\n    ScreenDown = 6,  // MICROBIT_ACCELEROMETER_EVT_FACE_DOWN\n    /**\n     * Raised when the screen is pointing left\n     */\n    //% block=\"tilt left\"\n    TiltLeft = 3,  // MICROBIT_ACCELEROMETER_EVT_TILT_LEFT\n    /**\n     * Raised when the screen is pointing right\n     */\n    //% block=\"tilt right\"\n    TiltRight = 4,  // MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT\n    /**\n     * Raised when the board is falling!\n     */\n    //% block=\"free fall\"\n    FreeFall = 7,  // MICROBIT_ACCELEROMETER_EVT_FREEFALL\n    /**\n     * Raised when a 3G shock is detected\n     */\n    //% block=\"3g\"\n    ThreeG = 8,  // MICROBIT_ACCELEROMETER_EVT_3G\n    /**\n     * Raised when a 6G shock is detected\n     */\n    //% block=\"6g\"\n    SixG = 9,  // MICROBIT_ACCELEROMETER_EVT_6G\n    /**\n     * Raised when a 8G shock is detected\n     */\n    //% block=\"8g\"\n    EightG = 10,  // MICROBIT_ACCELEROMETER_EVT_8G\n    }\n\n\n    declare const enum MesDpadButtonInfo {\n    //% block=\"A down\"\n    ADown = 1,  // MES_DPAD_BUTTON_A_DOWN\n    //% block=\"A up\"\n    AUp = 2,  // MES_DPAD_BUTTON_A_UP\n    //% block=\"B down\"\n    BDown = 3,  // MES_DPAD_BUTTON_B_DOWN\n    //% block=\"B up\"\n    BUp = 4,  // MES_DPAD_BUTTON_B_UP\n    //% block=\"C down\"\n    CDown = 5,  // MES_DPAD_BUTTON_C_DOWN\n    //% block=\"C up\"\n    CUp = 6,  // MES_DPAD_BUTTON_C_UP\n    //% block=\"D down\"\n    DDown = 7,  // MES_DPAD_BUTTON_D_DOWN\n    //% block=\"D up\"\n    DUp = 8,  // MES_DPAD_BUTTON_D_UP\n    //% block=\"1 down\"\n    _1Down = 9,  // MES_DPAD_BUTTON_1_DOWN\n    //% block=\"1 up\"\n    _1Up = 10,  // MES_DPAD_BUTTON_1_UP\n    //% block=\"2 down\"\n    _2Down = 11,  // MES_DPAD_BUTTON_2_DOWN\n    //% block=\"2 up\"\n    _2Up = 12,  // MES_DPAD_BUTTON_2_UP\n    //% block=\"3 down\"\n    _3Down = 13,  // MES_DPAD_BUTTON_3_DOWN\n    //% block=\"3 up\"\n    _3Up = 14,  // MES_DPAD_BUTTON_3_UP\n    //% block=\"4 down\"\n    _4Down = 15,  // MES_DPAD_BUTTON_4_DOWN\n    //% block=\"4 up\"\n    _4Up = 16,  // MES_DPAD_BUTTON_4_UP\n    }\ndeclare namespace input {\n}\n\n\n    /**\n     * How to create the event.\n     */\n\n    declare const enum EventCreationMode {\n    /**\n     * MicroBitEvent is initialised, and no further processing takes place.\n     */\n    CreateOnly = 0,  // CREATE_ONLY\n    /**\n     * MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).\n     */\n    CreateAndFire = 1,  // CREATE_AND_FIRE\n    }\n\n\n    declare const enum EventBusSource {\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_BUTTON_A = 1,  // MICROBIT_ID_BUTTON_A\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_BUTTON_B = 2,  // MICROBIT_ID_BUTTON_B\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_BUTTON_AB = 26,  // MICROBIT_ID_BUTTON_AB\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_RADIO = 29,  // MICROBIT_ID_RADIO\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_GESTURE = 27,  // MICROBIT_ID_GESTURE\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_ACCELEROMETER = 4,  // MICROBIT_ID_ACCELEROMETER\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P0 = 7,  // MICROBIT_ID_IO_P0\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P1 = 8,  // MICROBIT_ID_IO_P1\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P2 = 9,  // MICROBIT_ID_IO_P2\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P3 = 10,  // MICROBIT_ID_IO_P3\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P4 = 11,  // MICROBIT_ID_IO_P4\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P5 = 12,  // MICROBIT_ID_IO_P5\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P6 = 13,  // MICROBIT_ID_IO_P6\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P7 = 14,  // MICROBIT_ID_IO_P7\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P8 = 15,  // MICROBIT_ID_IO_P8\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P9 = 16,  // MICROBIT_ID_IO_P9\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P10 = 17,  // MICROBIT_ID_IO_P10\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P11 = 18,  // MICROBIT_ID_IO_P11\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P12 = 19,  // MICROBIT_ID_IO_P12\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P13 = 20,  // MICROBIT_ID_IO_P13\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P14 = 21,  // MICROBIT_ID_IO_P14\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P15 = 22,  // MICROBIT_ID_IO_P15\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P16 = 23,  // MICROBIT_ID_IO_P16\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P19 = 24,  // MICROBIT_ID_IO_P19\n    //% blockIdentity=\"control.eventSourceId\"\n    MICROBIT_ID_IO_P20 = 25,  // MICROBIT_ID_IO_P20\n    //% blockIdentity=\"control.eventSourceId\"\n    MES_DEVICE_INFO_ID = 1103,  // MES_DEVICE_INFO_ID\n    //% blockIdentity=\"control.eventSourceId\"\n    MES_SIGNAL_STRENGTH_ID = 1101,  // MES_SIGNAL_STRENGTH_ID\n    //% blockIdentity=\"control.eventSourceId\"\n    MES_DPAD_CONTROLLER_ID = 1104,  // MES_DPAD_CONTROLLER_ID\n    //% blockIdentity=\"control.eventSourceId\"\n    MES_BROADCAST_GENERAL_ID = 2000,  // MES_BROADCAST_GENERAL_ID\n    }\n\n\n    declare const enum EventBusValue {\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_EVT_ANY = 0,  // MICROBIT_EVT_ANY\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_BUTTON_EVT_DOWN = 1,  // MICROBIT_BUTTON_EVT_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_BUTTON_EVT_UP = 2,  // MICROBIT_BUTTON_EVT_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_BUTTON_EVT_CLICK = 3,  // MICROBIT_BUTTON_EVT_CLICK\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_RADIO_EVT_DATAGRAM = 1,  // MICROBIT_RADIO_EVT_DATAGRAM\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1,  // MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_PIN_EVT_RISE = 2,  // MICROBIT_PIN_EVT_RISE\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_PIN_EVT_FALL = 3,  // MICROBIT_PIN_EVT_FALL\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_PIN_EVT_PULSE_HI = 4,  // MICROBIT_PIN_EVT_PULSE_HI\n    //% blockIdentity=\"control.eventValueId\"\n    MICROBIT_PIN_EVT_PULSE_LO = 5,  // MICROBIT_PIN_EVT_PULSE_LO\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM1 = 6,  // MES_ALERT_EVT_ALARM1\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM2 = 7,  // MES_ALERT_EVT_ALARM2\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM3 = 8,  // MES_ALERT_EVT_ALARM3\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM4 = 9,  // MES_ALERT_EVT_ALARM4\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM5 = 10,  // MES_ALERT_EVT_ALARM5\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_ALARM6 = 11,  // MES_ALERT_EVT_ALARM6\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_DISPLAY_TOAST = 1,  // MES_ALERT_EVT_DISPLAY_TOAST\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_FIND_MY_PHONE = 5,  // MES_ALERT_EVT_FIND_MY_PHONE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_PLAY_RINGTONE = 4,  // MES_ALERT_EVT_PLAY_RINGTONE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_PLAY_SOUND = 3,  // MES_ALERT_EVT_PLAY_SOUND\n    //% blockIdentity=\"control.eventValueId\"\n    MES_ALERT_EVT_VIBRATE = 2,  // MES_ALERT_EVT_VIBRATE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1,  // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2,  // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4,  // MES_CAMERA_EVT_START_VIDEO_CAPTURE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_STOP_PHOTO_MODE = 6,  // MES_CAMERA_EVT_STOP_PHOTO_MODE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5,  // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_STOP_VIDEO_MODE = 7,  // MES_CAMERA_EVT_STOP_VIDEO_MODE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_TAKE_PHOTO = 3,  // MES_CAMERA_EVT_TAKE_PHOTO\n    //% blockIdentity=\"control.eventValueId\"\n    MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8,  // MES_CAMERA_EVT_TOGGLE_FRONT_REAR\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_DISPLAY_OFF = 5,  // MES_DEVICE_DISPLAY_OFF\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_DISPLAY_ON = 6,  // MES_DEVICE_DISPLAY_ON\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4,  // MES_DEVICE_GESTURE_DEVICE_SHAKEN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_INCOMING_CALL = 7,  // MES_DEVICE_INCOMING_CALL\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_INCOMING_MESSAGE = 8,  // MES_DEVICE_INCOMING_MESSAGE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_ORIENTATION_LANDSCAPE = 1,  // MES_DEVICE_ORIENTATION_LANDSCAPE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DEVICE_ORIENTATION_PORTRAIT = 2,  // MES_DEVICE_ORIENTATION_PORTRAIT\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_1_DOWN = 9,  // MES_DPAD_BUTTON_1_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_1_UP = 10,  // MES_DPAD_BUTTON_1_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_2_DOWN = 11,  // MES_DPAD_BUTTON_2_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_2_UP = 12,  // MES_DPAD_BUTTON_2_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_3_DOWN = 13,  // MES_DPAD_BUTTON_3_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_3_UP = 14,  // MES_DPAD_BUTTON_3_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_4_DOWN = 15,  // MES_DPAD_BUTTON_4_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_4_UP = 16,  // MES_DPAD_BUTTON_4_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_A_DOWN = 1,  // MES_DPAD_BUTTON_A_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_A_UP = 2,  // MES_DPAD_BUTTON_A_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_B_DOWN = 3,  // MES_DPAD_BUTTON_B_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_B_UP = 4,  // MES_DPAD_BUTTON_B_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_C_DOWN = 5,  // MES_DPAD_BUTTON_C_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_C_UP = 6,  // MES_DPAD_BUTTON_C_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_D_DOWN = 7,  // MES_DPAD_BUTTON_D_DOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_DPAD_BUTTON_D_UP = 8,  // MES_DPAD_BUTTON_D_UP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_FORWARD = 6,  // MES_REMOTE_CONTROL_EVT_FORWARD\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4,  // MES_REMOTE_CONTROL_EVT_NEXTTRACK\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_PAUSE = 2,  // MES_REMOTE_CONTROL_EVT_PAUSE\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_PLAY = 1,  // MES_REMOTE_CONTROL_EVT_PLAY\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_PREVTRACK = 5,  // MES_REMOTE_CONTROL_EVT_PREVTRACK\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_REWIND = 7,  // MES_REMOTE_CONTROL_EVT_REWIND\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_STOP = 3,  // MES_REMOTE_CONTROL_EVT_STOP\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9,  // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN\n    //% blockIdentity=\"control.eventValueId\"\n    MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8,  // MES_REMOTE_CONTROL_EVT_VOLUMEUP\n    }\ndeclare namespace control {\n}\n\n\n    declare const enum DisplayMode {\n    //% block=\"black and white\"\n    BackAndWhite = 0,  // DISPLAY_MODE_BLACK_AND_WHITE\n    //% block=\"greyscale\"\n    Greyscale = 1,  // DISPLAY_MODE_GREYSCALE\n    // TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE\n    }\ndeclare namespace led {\n}\n\n\n    declare const enum DigitalPin {\n    P0 = 7,  // MICROBIT_ID_IO_P0\n    P1 = 8,  // MICROBIT_ID_IO_P1\n    P2 = 9,  // MICROBIT_ID_IO_P2\n    P3 = 10,  // MICROBIT_ID_IO_P3\n    P4 = 11,  // MICROBIT_ID_IO_P4\n    P5 = 12,  // MICROBIT_ID_IO_P5\n    P6 = 13,  // MICROBIT_ID_IO_P6\n    P7 = 14,  // MICROBIT_ID_IO_P7\n    P8 = 15,  // MICROBIT_ID_IO_P8\n    P9 = 16,  // MICROBIT_ID_IO_P9\n    P10 = 17,  // MICROBIT_ID_IO_P10\n    P11 = 18,  // MICROBIT_ID_IO_P11\n    P12 = 19,  // MICROBIT_ID_IO_P12\n    P13 = 20,  // MICROBIT_ID_IO_P13\n    P14 = 21,  // MICROBIT_ID_IO_P14\n    P15 = 22,  // MICROBIT_ID_IO_P15\n    P16 = 23,  // MICROBIT_ID_IO_P16\n    P19 = 24,  // MICROBIT_ID_IO_P19\n    P20 = 25,  // MICROBIT_ID_IO_P20\n    }\n\n\n    declare const enum AnalogPin {\n    P0 = 7,  // MICROBIT_ID_IO_P0\n    P1 = 8,  // MICROBIT_ID_IO_P1\n    P2 = 9,  // MICROBIT_ID_IO_P2\n    P3 = 10,  // MICROBIT_ID_IO_P3\n    P4 = 11,  // MICROBIT_ID_IO_P4\n    P10 = 17,  // MICROBIT_ID_IO_P10\n    //% block=\"P5 (write only)\"\n    P5 = 12,  // MICROBIT_ID_IO_P5\n    //% block=\"P6 (write only)\"\n    P6 = 13,  // MICROBIT_ID_IO_P6\n    //% block=\"P7 (write only)\"\n    P7 = 14,  // MICROBIT_ID_IO_P7\n    //% block=\"P8 (write only)\"\n    P8 = 15,  // MICROBIT_ID_IO_P8\n    //% block=\"P9 (write only)\"\n    P9 = 16,  // MICROBIT_ID_IO_P9\n    //% block=\"P11 (write only)\"\n    P11 = 18,  // MICROBIT_ID_IO_P11\n    //% block=\"P12 (write only)\"\n    P12 = 19,  // MICROBIT_ID_IO_P12\n    //% block=\"P13 (write only)\"\n    P13 = 20,  // MICROBIT_ID_IO_P13\n    //% block=\"P14 (write only)\"\n    P14 = 21,  // MICROBIT_ID_IO_P14\n    //% block=\"P15 (write only)\"\n    P15 = 22,  // MICROBIT_ID_IO_P15\n    //% block=\"P16 (write only)\"\n    P16 = 23,  // MICROBIT_ID_IO_P16\n    //% block=\"P19 (write only)\"\n    P19 = 24,  // MICROBIT_ID_IO_P19\n    //% block=\"P20 (write only)\"\n    P20 = 25,  // MICROBIT_ID_IO_P20\n    }\n\n\n    declare const enum PulseValue {\n    //% block=high\n    High = 4,  // MICROBIT_PIN_EVT_PULSE_HI\n    //% block=low\n    Low = 5,  // MICROBIT_PIN_EVT_PULSE_LO\n    }\n\n\n    declare const enum PinPullMode {\n    //% block=\"down\"\n    PullDown = 0,\n    //% block=\"up\"\n    PullUp = 1,\n    //% block=\"none\"\n    PullNone = 2,\n    }\n\n\n    declare const enum PinEventType {\n    //% block=\"edge\"\n    Edge = 1,  // MICROBIT_PIN_EVENT_ON_EDGE\n    //% block=\"pulse\"\n    Pulse = 2,  // MICROBIT_PIN_EVENT_ON_PULSE\n    //% block=\"touch\"\n    Touch = 3,  // MICROBIT_PIN_EVENT_ON_TOUCH\n    //% block=\"none\"\n    None = 0,  // MICROBIT_PIN_EVENT_NONE\n    }\n\n\n    declare const enum SerialPin {\n    P0 = 7,  // MICROBIT_ID_IO_P0\n    P1 = 8,  // MICROBIT_ID_IO_P1\n    P2 = 9,  // MICROBIT_ID_IO_P2\n    P8 = 15,  // MICROBIT_ID_IO_P8\n    P12 = 19,  // MICROBIT_ID_IO_P12\n    P13 = 20,  // MICROBIT_ID_IO_P13\n    P14 = 21,  // MICROBIT_ID_IO_P14\n    P15 = 22,  // MICROBIT_ID_IO_P15\n    P16 = 23,  // MICROBIT_ID_IO_P16\n    }\n\n\n    declare const enum BaudRate {\n    //% block=115200\n    BaudRate115200 = 115200,\n    //% block=57600\n    BaudRate57600 = 57600,\n    //% block=38400\n    BaudRate38400 = 38400,\n    //% block=31250\n    BaudRate31250 = 31250,\n    //% block=28800\n    BaudRate28800 = 28800,\n    //% block=19200\n    BaudRate19200 = 19200,\n    //% block=14400\n    BaudRate14400 = 14400,\n    //% block=9600\n    BaudRate9600 = 9600,\n    //% block=4800\n    BaudRate4800 = 4800,\n    //% block=2400\n    BaudRate2400 = 2400,\n    //% block=1200\n    BaudRate1200 = 1200,\n    //% block=300\n    BaudRate300 = 300,\n    }\n\n\n    declare const enum Delimiters {\n    //% block=\"new line\"\n    NewLine = 1,\n    //% block=\",\"\n    Comma = 2,\n    //% block=\"$\"\n    Dollar = 3,\n    //% block=\":\"\n    Colon = 4,\n    //% block=\".\"\n    Fullstop = 5,\n    //% block=\"#\"\n    Hash = 6,\n    }\ndeclare namespace serial {\n}\n\n\n    declare const enum NumberFormat {\n    Int8LE = 1,\n    UInt8LE = 2,\n    Int16LE = 3,\n    UInt16LE = 4,\n    Int32LE = 5,\n    Int8BE = 6,\n    UInt8BE = 7,\n    Int16BE = 8,\n    UInt16BE = 9,\n    Int32BE = 10,\n    // UInt32,\n    }\n\n// Auto-generated. Do not edit. Really.\n",
      "game.ts": "enum Direction {\n    //% block=right\n    Right,\n    //% block=left\n    Left\n}\n\nenum LedSpriteProperty {\n    //% block=x\n    X,\n    //% block=y\n    Y,\n    //% block=direction\n    Direction,\n    //% block=brightness\n    Brightness,\n    //% block=blink\n    Blink\n}\n\n/**\n * A single-LED sprite game engine\n */\n//% color=#008272 weight=32 icon=\"\\uf11b\"\n//% advanced=true\nnamespace game {\n    let _score: number = 0;\n    let _life: number = 3;\n    let _startTime: number = 0;\n    let _endTime: number = 0;\n    let _isGameOver: boolean = false;\n    let _countdownPause: number = 0;\n    let _level: number = 1;\n    let _gameId: number = 0;\n    let _img: Image;\n    let _sprites: LedSprite[];\n    let _paused: boolean = false;\n    let _backgroundAnimation = false; // indicates if an auxiliary animation (and fiber) is already running\n\n    /**\n     * Creates a new LED sprite pointing to the right.\n     * @param x sprite horizontal coordinate, eg: 2\n     * @param y sprite vertical coordinate, eg: 2\n     */\n    //% weight=60 blockGap=8 help=game/create-sprite\n    //% blockId=game_create_sprite block=\"create sprite at|x: %x|y: %y\"\n    //% parts=\"ledmatrix\"\n    export function createSprite(x: number, y: number): LedSprite {\n        init();\n        let p = new LedSprite(x, y);\n        return p;\n    }\n\n    /**\n     * Gets the current score\n     */\n    //% weight=9 help=game/score\n    //% blockId=game_score block=\"score\" blockGap=8\n    export function score(): number {\n        return _score;\n    }\n\n    /**\n     * Adds points to the current score and shows an animation\n     * @param points amount of points to change, eg: 1\n     */\n    //% weight=10 help=game/add-score\n    //% blockId=game_add_score block=\"change score by|%points\" blockGap=8\n    //% parts=\"ledmatrix\"\n    export function addScore(points: number): void {\n        setScore(_score + points);\n        if (!_paused && !_backgroundAnimation) {\n            _backgroundAnimation = true;\n            control.inBackground(() => {\n                led.stopAnimation();\n                basic.showAnimation(`0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0\n    0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0\n    0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n    0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0\n    0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 0 1 0 0 0 0 0`, 20);\n                _backgroundAnimation = false;\n            });\n        }\n    }\n\n    /**\n     * Shows an animation, then starts a game countdown timer, which causes Game Over when it reaches 0\n     * @param ms countdown duration in milliseconds, eg: 10000\n     */\n    //% weight=9 help=game/start-countdown\n    //% blockId=game_start_countdown block=\"start countdown|(ms) %duration\" blockGap=8\n    //% parts=\"ledmatrix\"\n    export function startCountdown(ms: number): void {\n        if (checkStart()) {\n            basic.showAnimation(`1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0\n0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0\n1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0\n0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0\n1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0`, 400);\n            _countdownPause = Math.max(500, ms);\n            _startTime = -1;\n            _endTime = input.runningTime() + _countdownPause;\n            _paused = false;\n            control.inBackground(() => {\n                basic.pause(_countdownPause);\n                gameOver();\n            });\n        }\n    }\n\n    /**\n     * Displays a game over animation and the score.\n     */\n    //% weight=8 help=game/game-over\n    //% blockId=game_game_over block=\"game over\"\n    //% parts=\"ledmatrix\"\n    export function gameOver(): void {\n        if (!_isGameOver) {\n            _isGameOver = true;\n            unplugEvents();\n            led.stopAnimation();\n            led.setBrightness(255);\n            while (true) {\n                for (let i = 0; i < 8; i++) {\n                    basic.clearScreen();\n                    basic.pause(100);\n                    basic.showLeds(`1 1 1 1 1\n1 1 1 1 1\n1 1 1 1 1\n1 1 1 1 1\n1 1 1 1 1`, 300);\n                }\n                basic.showAnimation(`1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0\n1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0`, 100);\n                for (let j = 0; j < 3; j++) {\n                    basic.showString(\" GAMEOVER \", 100);\n                    showScore();\n                }\n            }\n        } else {\n            // already in game over mode in another fiber\n            while (true) {\n                basic.pause(10000);\n            }\n        }\n    }\n\n    /**\n     * Sets the current score value\n     * @param value new score value.\n     */\n    //% blockId=game_set_score block=\"set score %points\" blockGap=8\n    //% weight=10 help=game/set-score\n    export function setScore(value: number): void {\n        _score = Math.max(0, value);\n    }\n\n    /**\n     * Gets the current life\n     */\n    //% weight=10\n    export function life(): number {\n        return _life;\n    }\n\n    /**\n     * Sets the current life value\n     * @param value TODO\n     */\n    //% weight=10\n    export function setLife(value: number): void {\n        _life = Math.max(0, value);\n        if (_life <= 0) {\n            gameOver();\n        }\n    }\n\n    /**\n     * Adds life points to the current life\n     * @param lives TODO\n     */\n    //% weight=10\n    export function addLife(lives: number): void {\n        setLife(_life + lives);\n    }\n\n    /**\n     * Gets the remaining time (since `start countdown`) or current time (since the device started or `start stopwatch`) in milliseconds.\n     */\n    //% weight=10\n    export function currentTime(): number {\n        if (_endTime > 0) {\n            return Math.max(0, _endTime - input.runningTime());\n        } else {\n            return input.runningTime() - _startTime;\n        }\n    }\n\n    /**\n     * Removes some life\n     * @param life TODO\n     */\n    //% weight=10\n    //% parts=\"ledmatrix\"\n    export function removeLife(life: number): void {\n        setLife(_life - life);\n        if (!_paused)\n            control.inBackground(() => {\n                led.stopAnimation();\n                basic.showAnimation(`1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0\n0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0\n0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0\n0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0\n1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0`, 40);\n            });\n    }\n\n    /**\n     * Increments the level and display a message.\n     */\n    //% weight=10\n    //% parts=\"ledmatrix\"\n    export function levelUp(): void {\n        _level = _level + 1;\n        basic.showString(\"LEVEL:\", 150);\n        basic.showNumber(_level, 150);\n    }\n\n    /**\n     * Gets the current level\n     */\n    //% weight=10\n    export function level(): number {\n        return _level;\n    }\n\n    /**\n     * Starts a stopwatch timer. `current time` will return the elapsed time.\n     */\n    //% weight=10\n    export function startStopwatch(): void {\n        _startTime = input.runningTime();\n        _endTime = -1;\n    }\n\n    /**\n     * Gets a value indicating if the game is still running. Returns `false` if game over.\n     */\n    //% weight=10\n    export function isRunning(): boolean {\n        let running: boolean;\n        return !_isGameOver;\n    }\n\n    /**\n     * Displays the score on the screen.\n     */\n    //%  weight=60\n    //% parts=\"ledmatrix\"\n    export function showScore(): void {\n        basic.showString(\" SCORE \", 100);\n        basic.showNumber(_score, 150);\n        basic.showString(\" \", 150);\n    }\n\n    /**\n     * Indicates if the game is display the game over sequence.\n     */\n    export function isGameOver(): boolean {\n        return _isGameOver;\n    }\n\n    /**\n     * Indicates if the game rendering is paused to allow other animations\n     */\n    //%\n    export function isPaused(): boolean {\n        return _paused;\n    }\n\n    /**\n     * Pauses the game rendering engine to allow other animations\n     */\n    //% blockId=game_pause block=\"pause\"\n    //% advanced=true blockGap=8 help=game/pause\n    export function pause(): void {\n        plot()\n        _paused = true;\n    }\n\n\n    /**\n     * Resumes the game rendering engine\n     */\n    //% blockId=game_resume block=\"resume\"\n    //% advanced=true blockGap=8 help=game/resumeP\n    export function resume(): void {\n        _paused = false;\n        plot();\n    }\n\n    /**\n     * returns false if game can't start\n     */\n    function checkStart(): boolean {\n        if (_countdownPause > 0 || _startTime > 0) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    function unplugEvents(): void {\n        input.onButtonPressed(Button.A, () => { });\n        input.onButtonPressed(Button.B, () => { });\n        input.onButtonPressed(Button.AB, () => {\n            control.reset();\n        });\n    }\n\n    /**\n     * A game sprite rendered as a single LED\n     */\n    //%\n    export class LedSprite {\n        private _x: number;\n        private _y: number;\n        private _dir: number;\n        private _brightness: number;\n        private _blink: number;\n        private _enabled: boolean;\n\n        constructor(x: number, y: number) {\n            this._x = Math.clamp(0, 4, x);\n            this._y = Math.clamp(0, 4, y);\n            this._dir = 90;\n            this._brightness = 255;\n            this._enabled = true;\n            init();\n            _sprites.push(this);\n            plot();\n        }\n\n        /**\n         * Move a certain number of LEDs in the current direction\n         * @param this the sprite to move\n         * @param leds number of leds to move, eg: 1, -1\n         */\n        //% weight=50 help=game/move\n        //% blockId=game_move_sprite block=\"%sprite|move by %leds\" blockGap=8\n        //% parts=\"ledmatrix\"\n        public move(leds: number): void {\n            if (this._dir == 0) {\n                this._y = this._y - leds;\n            } else if (this._dir == 45) {\n                this._x = this._x + leds;\n                this._y = this._y - leds;\n            } else if (this._dir == 90) {\n                this._x = this._x + leds;\n            } else if (this._dir == 135) {\n                this._x = this._x + leds;\n                this._y = this._y + leds;\n            } else if (this._dir == 180) {\n                this._y = this._y + leds;\n            } else if (this._dir == -45) {\n                this._x = this._x - leds;\n                this._y = this._y - leds;\n            } else if (this._dir == -90) {\n                this._x = this._x - leds;\n            } else {\n                this._x = this._x - leds;\n                this._y = this._y + leds;\n            }\n            this._x = Math.clamp(0, 4, this._x);\n            this._y = Math.clamp(0, 4, this._y);\n            plot();\n        }\n\n        /**\n         * Go to this position on the screen\n         * @param this TODO\n         * @param x TODO\n         * @param y TODO\n         */\n        //% parts=\"ledmatrix\"\n        public goTo(x: number, y: number): void {\n            this._x = x;\n            this._y = y;\n            this._x = Math.clamp(0, 4, this._x);\n            this._y = Math.clamp(0, 4, this._y);\n            plot();\n        }\n\n        /**\n         * If touching the edge of the stage and facing towards it, then turn away.\n         * @param this TODO\n         */\n        //% weight=18 help=game/if-on-edge-bounce\n        //% blockId=game_sprite_bounce block=\"%sprite|if on edge, bounce\"\n        //% parts=\"ledmatrix\"\n        public ifOnEdgeBounce(): void {\n            if (this._dir == 0 && this._y == 0) {\n                this._dir = 180;\n            } else if (this._dir == 45 && (this._x == 4 || this._y == 0)) {\n                if (this._x == 0 && this._y == 0) {\n                    this._dir = -135;\n                } else if (this._y == 0) {\n                    this._dir = 135;\n                } else {\n                    this._dir = -45;\n                }\n            } else if (this._dir == 90 && this._x == 4) {\n                this._dir = -90;\n            } else if (this._dir == 135 && (this._x == 4 || this._y == 4)) {\n                if (this.x() == 4 && this.y() == 4) {\n                    this._dir = -45;\n                } else if (this._y == 4) {\n                    this._dir = 45;\n                } else {\n                    this._dir = -135;\n                }\n            } else if (this._dir == 180 && this._y == 4) {\n                this._dir = 0;\n            } else if (this._dir == -45 && (this._x == 0 || this._y == 0)) {\n                if (this.x() == 0 && this.y() == 0) {\n                    this._dir = 135;\n                } else if (this._y == 0) {\n                    this._dir = -135;\n                } else {\n                    this._dir = 45;\n                }\n            } else if (this._dir == -90 && this._x == 0) {\n                this._dir = 90;\n            } else if (this._dir == -135 && (this._x == 0 || this._y == 4)) {\n                if (this._x == 0 && this._y == 4) {\n                    this._dir = 45;\n                } else if (this._y == 4) {\n                    this._dir = -45;\n                } else {\n                    this._dir = 135;\n                }\n            }\n            plot();\n        }\n\n        /**\n         * Turn the sprite\n         * @param this TODO\n         * @param direction left or right\n         * @param degrees angle in degrees to turn, eg: 45, 90, 180, 135\n         */\n        //% weight=49 help=game/turn\n        //% blockId=game_turn_sprite block=\"%sprite|turn %direction|by (°) %degrees\"\n        public turn(direction: Direction, degrees: number) {\n            if (direction == Direction.Right)\n                this.setDirection(this._dir + degrees);\n            else\n                this.setDirection(this._dir - degrees);\n        }\n\n        /**\n         * Turn to the right (clockwise)\n         * @param this TODO\n         * @param degrees TODO\n         */\n        public turnRight(degrees: number): void {\n            this.turn(Direction.Right, degrees);\n        }\n\n        /**\n         * Turn to the left (counter-clockwise)\n         * @param this TODO\n         * @param degrees TODO\n         */\n        public turnLeft(degrees: number): void {\n            this.turn(Direction.Left, degrees);\n        }\n\n        /**\n         * Sets a property of the sprite\n         * @param property the name of the property to change\n         * @param the updated value\n         */\n        //% weight=29 help=game/set\n        //% blockId=game_sprite_set_property block=\"%sprite|set %property|to %value\" blockGap=8\n        public set(property: LedSpriteProperty, value: number) {\n            switch (property) {\n                case LedSpriteProperty.X: this.setX(value); break;\n                case LedSpriteProperty.Y: this.setY(value); break;\n                case LedSpriteProperty.Direction: this.setDirection(value); break;\n                case LedSpriteProperty.Brightness: this.setBrightness(value); break;\n                case LedSpriteProperty.Blink: this.setBlink(value); break;\n            }\n        }\n\n        /**\n         * Changes a property of the sprite\n         * @param property the name of the property to change\n         * @param value amount of change, eg: 1\n         */\n        //% weight=30 help=game/change\n        //% blockId=game_sprite_change_xy block=\"%sprite|change %property|by %value\" blockGap=8\n        public change(property: LedSpriteProperty, value: number) {\n            switch (property) {\n                case LedSpriteProperty.X: this.changeXBy(value); break;\n                case LedSpriteProperty.Y: this.changeYBy(value); break;\n                case LedSpriteProperty.Direction: this.changeDirectionBy(value); break;\n                case LedSpriteProperty.Brightness: this.changeBrightnessBy(value); break;\n                case LedSpriteProperty.Blink: this.changeBlinkBy(value); break;\n            }\n        }\n\n        /**\n         * Gets a property of the sprite\n         * @param property the name of the property to change\n         */\n        //% weight=28 help=game/get\n        //% blockId=game_sprite_property block=\"%sprite|%property\"\n        public get(property: LedSpriteProperty) {\n            switch (property) {\n                case LedSpriteProperty.X: return this.x();\n                case LedSpriteProperty.Y: return this.y();\n                case LedSpriteProperty.Direction: return this.direction()\n                case LedSpriteProperty.Brightness: return this.brightness();\n                case LedSpriteProperty.Blink: return this.blink();\n                default: return 0;\n            }\n        }\n\n        /**\n         * Set the direction of the current sprite, rounded to the nearest multiple of 45\n         * @param this TODO\n         * @param degrees TODO\n         */\n        //% parts=\"ledmatrix\"\n        public setDirection(degrees: number): void {\n            this._dir = ((degrees / 45) % 8) * 45;\n            if (this._dir <= -180) {\n                this._dir = this._dir + 360;\n            } else if (this._dir > 180) {\n                this._dir = this._dir - 360;\n            }\n            plot();\n        }\n\n        /**\n         * Reports the ``x`` position of a sprite on the LED screen\n         * @param this TODO\n         */\n        public x(): number {\n            return this._x;\n        }\n\n        /**\n         * Reports the ``y`` position of a sprite on the LED screen\n         * @param this TODO\n         */\n        public y(): number {\n            return this._y;\n        }\n\n        /**\n         * Reports the current direction of a sprite\n         * @param this TODO\n         */\n        public direction(): number {\n            return this._dir;\n        }\n\n        /**\n         * Set the ``x`` position of a sprite\n         * @param this TODO\n         * @param x TODO\n         */\n        public setX(x: number): void {\n            this.goTo(x, this._y);\n        }\n\n        /**\n         * Set the ``y`` position of a sprite\n         * @param this TODO\n         * @param y TODO\n         */\n        public setY(y: number): void {\n            this.goTo(this._x, y);\n        }\n\n        /**\n         * Changes the ``y`` position by the given amount\n         * @param this TODO\n         * @param y TODO\n         */\n        public changeYBy(y: number): void {\n            this.goTo(this._x, this._y + y);\n        }\n\n        /**\n         * Changes the ``x`` position by the given amount\n         * @param this TODO\n         * @param x TODO\n         */\n        public changeXBy(x: number): void {\n            this.goTo(this._x + x, this._y);\n        }\n\n        /**\n         * Reports true if sprite has the same position as specified sprite\n         * @param this TODO\n         * @param other TODO\n         */\n        //% weight=20 help=game/is-touching\n        //% blockId=game_sprite_touching_sprite block=\"%sprite|touching %other|?\" blockGap=8\n        public isTouching(other: LedSprite): boolean {\n            return this._enabled && other._enabled && this._x == other._x && this._y == other._y;\n        }\n\n        /**\n         * Reports true if sprite is touching an edge\n         * @param this TODO\n         */\n        //% weight=19 help=game/is-touching-edge\n        //% blockId=game_sprite_touching_edge block=\"%sprite|touching edge?\" blockGap=8\n        public isTouchingEdge(): boolean {\n            return this._x == 0 || this._x == 4 || this._y == 0 || this._y == 4;\n        }\n\n        /**\n         * Turns on the sprite (on by default)\n         * @param this the sprite\n         */\n        public on(): void {\n            this.setBrightness(255);\n        }\n\n        /**\n         * Turns off the sprite (on by default)\n         * @param this the sprite\n         */\n        public off(): void {\n            this.setBrightness(0);\n        }\n\n        /**\n         * Set the ``brightness`` of a sprite\n         * @param this the sprite\n         * @param brightness the brightness from 0 (off) to 255 (on), eg: 255.\n         */\n        //% parts=\"ledmatrix\"\n        public setBrightness(brightness: number): void {\n            this._brightness = Math.clamp(0, 255, brightness);\n            plot();\n        }\n\n        /**\n         * Reports the ``brightness` of a sprite on the LED screen\n         * @param this the sprite\n         */\n        //% parts=\"ledmatrix\"\n        public brightness(): number {\n            let r: number;\n            return this._brightness;\n        }\n\n        /**\n         * Changes the ``y`` position by the given amount\n         * @param this the sprite\n         * @param value the value to change brightness\n         */\n        public changeBrightnessBy(value: number): void {\n            this.setBrightness(this._brightness + value);\n        }\n\n        /**\n         * Changes the ``direction`` position by the given amount by turning right\n         * @param this TODO\n         * @param angle TODO\n         */\n        public changeDirectionBy(angle: number): void {\n            this.turnRight(angle);\n        }\n\n        /**\n         * Deletes the sprite from the game engine. The sprite will no longer appear on the screen or interact with other sprites.\n         * @param this sprite to delete\n         */\n        //% weight=59 help=game/delete\n        //% blockId=\"game_delete_sprite\" block=\"delete %this\"\n        public delete(): void {\n            this._enabled = false;\n            if (_sprites.removeElement(this))\n                plot();\n        }\n\n        /**\n         * Sets the blink duration interval in millisecond.\n         * @param sprite TODO\n         * @param ms TODO\n         */\n        public setBlink(ms: number): void {\n            this._blink = Math.clamp(0, 10000, ms);\n        }\n\n        /**\n         * Changes the ``blink`` duration by the given amount of millisecons\n         * @param this TODO\n         * @param ms TODO\n         */\n        public changeBlinkBy(ms: number): void {\n            this.setBlink(this._blink + ms);\n        }\n\n        /**\n         * Reports the ``blink`` duration of a sprite\n         * @param this TODO\n         */\n        public blink(): number {\n            let r: number;\n            return this._blink;\n        }\n\n        //% weight=-1\n        //% parts=\"ledmatrix\"\n        public _plot(now: number) {\n            let ps = this\n            if (ps._brightness > 0) {\n                let r = 0;\n                if (ps._blink > 0) {\n                    r = (now / ps._blink) % 2;\n                }\n                if (r == 0) {\n                    _img.setPixelBrightness(ps._x, ps._y, _img.pixelBrightness(ps._x, ps._y) + ps._brightness);\n                }\n            }\n        }\n    }\n\n    function init(): void {\n        if (_img) return;\n        const img = images.createImage(\n`0 0 0 0 0\n0 0 0 0 0\n0 0 0 0 0\n0 0 0 0 0\n0 0 0 0 0`);\n        _sprites = (<LedSprite[]>[]);\n        basic.forever(() => {\n            basic.pause(30);\n            plot();\n            if (game.isGameOver()) {\n                basic.pause(600);\n            }\n        });\n        _img = img;\n    }\n\n    /**\n     * Plots the current sprites on the screen\n     */\n    //% parts=\"ledmatrix\"\n    function plot(): void {\n        if (game.isGameOver() || game.isPaused() || !_img || _backgroundAnimation) {\n            return;\n        }\n        // ensure greyscale mode\n        const dm = led.displayMode();\n        if (dm != DisplayMode.Greyscale)            \n            led.setDisplayMode(DisplayMode.Greyscale);\n        // render sprites\n        const now = input.runningTime();\n        _img.clear();\n        for (let i = 0; i < _sprites.length; i++) {\n            _sprites[i]._plot(now);\n        }\n        _img.plotImage(0);\n        // restore previous display mode\n        if (dm != DisplayMode.Greyscale)\n            led.setDisplayMode(dm);\n    }\n\n    /**\n     * Gets an invalid sprite; used to initialize locals.\n     */\n    //% weight=0\n    export function invalidSprite(): LedSprite {\n        return null;\n    }\n\n}\n\n",
      "helpers.ts": "namespace console {\n    export function log(msg: string) {\n        serial.writeString(msg);\n        serial.writeString(\"\\r\\n\");\n    }\n}\n\nnamespace Math {\n    /**\n     * Generates a `true` or `false` value randomly, just like flipping a coin.\n     */\n    //% blockId=logic_random block=\"pick random true or false\"\n    //% help=math/random-boolean\n    export function randomBoolean(): boolean {\n        return Math.random(2) == 0;\n    }\n}",
      "icons.ts": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2013-2016 The MicroPython-on-micro:bit Developers, as listed\nin the accompanying AUTHORS file\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n// Images from file microbitconstimage.cpp https://github.com/bbcmicrobit/micropython\n\nenum IconNames {\n    //% block=\"heart\"\n    //% blockImage=1\n    Heart = 0,\n    //% block=\"small heart\"\n    //% blockImage=1\n    SmallHeart,\n    //% block=\"yes\"\n    //% blockImage=1\n    Yes,\n    //% block=\"no\"\n    //% blockImage=1\n    No,\n    //% block=\"happy\"\n    //% blockImage=1\n    Happy,\n    //% block=\"sad\"\n    //% blockImage=1\n    Sad,\n    //% block=\"confused\"\n    //% blockImage=1\n    Confused,\n    //% block=\"angry\"\n    //% blockImage=1\n    Angry,\n    //% block=\"asleep\"\n    //% blockImage=1\n    Asleep,\n    //% block=\"surprised\"\n    //% blockImage=1\n    Surprised,\n    //% block=\"silly\"\n    //% blockImage=1\n    Silly,\n    //% block=\"fabulous\"\n    //% blockImage=1\n    Fabulous,\n    //% block=\"meh\"\n    //% blockImage=1\n    Meh,\n    //% block=\"t-shirt\"\n    //% blockImage=1\n    TShirt,\n    //% block=\"roller skate\"\n    //% blockImage=1\n    Rollerskate,\n    //% block=\"duck\"\n    //% blockImage=1\n    Duck,\n    //% block=\"house\"\n    //% blockImage=1\n    House,\n    //% block=\"tortoise\"\n    //% blockImage=1\n    Tortoise,\n    //% block=\"butterfly\"\n    //% blockImage=1\n    Butterfly,\n    //% block=\"stick figure\"\n    //% blockImage=1\n    StickFigure,\n    //% block=\"ghost\"\n    //% blockImage=1\n    Ghost,\n    //% block=\"sword\"\n    //% blockImage=1\n    Sword,\n    //% block=\"giraffe\"\n    //% blockImage=1\n    Giraffe,\n    //% block=\"skull\"\n    //% blockImage=1\n    Skull,\n    //% block=\"umbrella\"\n    //% blockImage=1\n    Umbrella,\n    //% block=\"snake\"\n    //% blockImage=1\n    Snake,\n    //% block=\"rabbit\"\n    //% blockImage=1\n    Rabbit,\n    //% block=\"cow\"\n    //% blockImage=1\n    Cow,\n    //% block=\"quarter note\"\n    //% blockImage=1\n    QuarterNote,\n    //% block=\"eigth note\"\n    //% blockImage=1\n    EigthNote,\n    //% block=\"pitchfork\"\n    //% blockImage=1\n    Pitchfork,\n    //% block=\"target\"\n    //% blockImage=1\n    Target,\n    //% block=\"triangle\"\n    //% blockImage=1\n    Triangle,\n    //% block=\"left triangle\"\n    //% blockImage=1\n    LeftTriangle,\n    //% block=\"chess board\"\n    //% blockImage=1\n    Chessboard,\n    //% block=\"diamond\"\n    //% blockImage=1\n    Diamond,\n    //% block=\"small diamond\"\n    //% blockImage=1\n    SmallDiamond,\n    //% block=\"square\"\n    //% blockImage=1\n    Square,\n    //% block=\"small square\"\n    //% blockImage=1\n    SmallSquare,\n    //% block=\"scissors\"\n    //% blockImage=1\n    Scissors\n}\n\nenum ArrowNames {\n    //% blockIdentity=images.arrowNumber block=\"North\"\n    North = 0,\n    //% blockIdentity=images.arrowNumber block=\"North East\"\n    NorthEast,\n    //% blockIdentity=images.arrowNumber block=\"East\"\n    East,\n    //% blockIdentity=images.arrowNumber block=\"South East\"\n    SouthEast,\n    //% blockIdentity=images.arrowNumber block=\"South\"\n    South,\n    //% blockIdentity=images.arrowNumber block=\"South West\"\n    SouthWest,\n    //% blockIdentity=images.arrowNumber block=\"West\"\n    West,\n    //% blockIdentity=images.arrowNumber block=\"North West\"\n    NorthWest,\n}\n\nnamespace basic {\n\n    /**\n     * Draws the selected icon on the LED screen\n     * @param icon the predifined icon id\n     * @param interval the amount of time (milliseconds) to show the icon. Default is 600.\n     */\n    //% weight=90 blockGap=8\n    //% blockId=basic_show_icon\n    //% block=\"show icon %i\" icon=\"\\uf00a\"\n    //% parts=\"ledmatrix\"\n    //% help=basic/show-icon\n    //% i.fieldEditor=\"gridpicker\"\n    //% i.fieldOptions.width=\"400\" i.fieldOptions.columns=\"5\"\n    //% i.fieldOptions.itemColour=\"black\" i.fieldOptions.tooltips=\"true\"\n    export function showIcon(icon: IconNames, interval = 600) {\n        let res = images.iconImage(icon)\n        res.showImage(0, interval)\n    }\n\n    /**\n     * Shows an arrow on screent\n     * @param direction the direction of the arrow\n     * @param interval the amount of time (milliseconds) to show the icon. Default is 600.\n     */\n    //% weight=50 blockGap=8\n    //% blockId=basic_show_arrow\n    //% block=\"show arrow %i=device_arrow\"\n    //% parts=\"ledmatrix\"\n    //% advanced=true\n    //% help=basic/show-arrow\n    export function showArrow(direction: number, interval = 600) {\n        let res = images.arrowImage(direction)\n        res.showImage(0, interval)\n    }\n}\n\n\nnamespace images {\n\n    //% weight=50 blockGap=8\n    //% help=images/arrow-image\n    //% blockId=builtin_arrow_image block=\"arrow image %i=device_arrow\"\n    export function arrowImage(i: ArrowNames): Image {\n        switch (i) {\n            // compass directions\n            case ArrowNames.North: return images.createImage(`    \n                                        . . # . .\n                                        . # # # .\n                                        # . # . #\n                                        . . # . .\n                                        . . # . .`);\n            case ArrowNames.NorthEast: return images.createImage(` \n                                        . . # # #\n                                        . . . # #\n                                        . . # . #\n                                        . # . . .\n                                        # . . . .`);\n            case ArrowNames.East: return images.createImage(` \n                                        . . # . .\n                                        . . . # .\n                                        # # # # #\n                                        . . . # .\n                                        . . # . .`);\n            case ArrowNames.SouthEast: return images.createImage(` \n                                        # . . . .\n                                        . # . . .\n                                        . . # . #\n                                        . . . # #\n                                        . . # # #`);\n            case ArrowNames.South: return images.createImage(` \n                                        . . # . .\n                                        . . # . .\n                                        # . # . #\n                                        . # # # .\n                                        . . # . .`);\n            case ArrowNames.SouthWest: return images.createImage(` \n                                        . . . . #\n                                        . . . # .\n                                        # . # . .\n                                        # # . . .\n                                        # # # . .`);\n            case ArrowNames.West: return images.createImage(` \n                                        . . # . .\n                                        . # . . .\n                                        # # # # #\n                                        . # . . .\n                                        . . # . .`);\n            case ArrowNames.NorthWest: return images.createImage(` \n                                        # # # . .\n                                        # # . . .\n                                        # . # . .\n                                        . . . # .\n                                        . . . . #`);\n            default: return images.createImage(`\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        `);\n        }\n    }\n\n    //% weight=50 blockGap=8\n    //% help=images/icon-image\n    //% blockId=builtin_image block=\"icon image %i\"\n    //% i.fieldEditor=\"gridpicker\"\n    //% i.fieldOptions.width=\"400\" i.fieldOptions.columns=\"5\"\n    //% i.fieldOptions.itemColour=\"black\" i.fieldOptions.tooltips=\"true\"\n    export function iconImage(i: IconNames): Image {\n        switch (i) {\n            case IconNames.Heart: return images.createImage(`\n                                        . # . # .\n                                        # # # # #\n                                        # # # # #\n                                        . # # # .\n                                        . . # . .`);\n\n            case IconNames.SmallHeart: return images.createImage(`\n                                        . . . . .\n                                        . # . # .\n                                        . # # # .\n                                        . . # . .\n                                        . . . . .`);\n            //faces\n            case IconNames.Happy: return images.createImage(`\n                                        . . . . .\n                                        . # . # .\n                                        . . . . .\n                                        # . . . #\n                                        . # # # .`);\n            case IconNames.Sad: return images.createImage(`\n                                        . . . . .\n                                        . # . # .\n                                        . . . . .\n                                        . # # # .\n                                        # . . . #`);\n            case IconNames.Confused: return images.createImage(`\n                                        . . . . .\n                                        . # . # .\n                                        . . . . .\n                                        . # . # .\n                                        # . # . #`);\n            case IconNames.Angry: return images.createImage(`\n                                        # . . . #\n                                        . # . # .\n                                        . . . . .\n                                        # # # # #\n                                        # . # . #`);\n            case IconNames.Asleep: return images.createImage(`\n                                        . . . . .\n                                        # # . # #\n                                        . . . . .\n                                        . # # # .\n                                        . . . . .`);\n            case IconNames.Surprised: return images.createImage(`\n                                        . # . # .\n                                        . . . . .\n                                        . . # . .\n                                        . # . # .\n                                        . . # . .`);\n            case IconNames.Silly: return images.createImage(`\n                                        # . . . #\n                                        . . . . .\n                                        # # # # #\n                                        . . . # #\n                                        . . . # #`);\n            case IconNames.Fabulous: return images.createImage(`\n                                        # # # # #\n                                        # # . # #\n                                        . . . . .\n                                        . # . # .\n                                        . # # # .`);\n            case IconNames.Meh: return images.createImage(`\n                                        # # . # #\n                                        . . . . .\n                                        . . . # .\n                                        . . # . .\n                                        . # . . .`);\n            case IconNames.Yes: return images.createImage(`\n                                        . . . . .\n                                        . . . . #\n                                        . . . # .\n                                        # . # . .\n                                        . # . . .`);\n            case IconNames.No: return images.createImage(`\n                                        # . . . #\n                                        . # . # .\n                                        . . # . .\n                                        . # . # .\n                                        # . . . #`);\n            case IconNames.Triangle: return images.createImage(`\n                                        . . . . .\n                                        . . # . .\n                                        . # . # .\n                                        # # # # #\n                                        . . . . .`);\n            case IconNames.LeftTriangle: return images.createImage(`\n                                        # . . . .\n                                        # # . . .\n                                        # . # . .\n                                        # . . # .\n                                        # # # # #`);\n            case IconNames.Chessboard: return images.createImage(`\n                                        . # . # .\n                                        # . # . #\n                                        . # . # .\n                                        # . # . #\n                                        . # . # .`);\n            case IconNames.Diamond: return images.createImage(`\n                                        . . # . .\n                                        . # . # .\n                                        # . . . #\n                                        . # . # .\n                                        . . # . .`);\n            case IconNames.SmallDiamond: return images.createImage(`\n                                        . . . . .\n                                        . . # . .\n                                        . # . # .\n                                        . . # . .\n                                        . . . . .`);\n            case IconNames.Square: return images.createImage(`\n                                        # # # # #\n                                        # . . . #\n                                        # . . . #\n                                        # . . . #\n                                        # # # # #`);\n            case IconNames.SmallSquare: return images.createImage(`\n                                        . . . . .\n                                        . # # # .\n                                        . # . # .\n                                        . # # # .\n                                        . . . . .`);\n\n            case IconNames.Scissors: return images.createImage(`\n                                        # # . . #\n                                        # # . # .\n                                        . . # . .\n                                        # # . # .\n                                        # # . . #`);\n            // The following images were designed by Abbie Brooks.\n            case IconNames.TShirt: return images.createImage(`\n                                        # # . # #\n                                        # # # # #\n                                        . # # # .\n                                        . # # # .\n                                        . # # # .`);\n            case IconNames.Rollerskate: return images.createImage(`\n                                        . . . # #\n                                        . . . # #\n                                        # # # # #\n                                        # # # # #\n                                        . # . # .`);\n            case IconNames.Duck: return images.createImage(`\n                                        . # # . .\n                                        # # # . .\n                                        . # # # #\n                                        . # # # .\n                                        . . . . .`);\n            case IconNames.House: return images.createImage(`\n                                        . . # . .\n                                        . # # # .\n                                        # # # # #\n                                        . # # # .\n                                        . # . # .`);\n            case IconNames.Tortoise: return images.createImage(`\n                                        . . . . .\n                                        . # # # .\n                                        # # # # #\n                                        . # . # .\n                                        . . . . .`);\n            case IconNames.Butterfly: return images.createImage(`\n                                        # # . # #\n                                        # # # # #\n                                        . . # . .\n                                        # # # # #\n                                        # # . # #`);\n            case IconNames.StickFigure: return images.createImage(`\n                                        . . # . .\n                                        # # # # #\n                                        . . # . .\n                                        . # . # .\n                                        # . . . #`);\n            case IconNames.Ghost: return images.createImage(`\n                                        . # # # .\n                                        # . # . #\n                                        # # # # #\n                                        # # # # #\n                                        # . # . #`);\n            case IconNames.Sword: return images.createImage(`\n                                        . . # . .\n                                        . . # . .\n                                        . . # . .\n                                        . # # # .\n                                        . . # . .`);\n            case IconNames.Giraffe: return images.createImage(`\n                                        # # . . .\n                                        . # . . .\n                                        . # . . .\n                                        . # # # .\n                                        . # . # .`);\n            case IconNames.Skull: return images.createImage(`\n                                        . # # # .\n                                        # . # . #\n                                        # # # # #\n                                        . # # # .\n                                        . # # # .`);\n            case IconNames.Umbrella: return images.createImage(`\n                                        . # # # .\n                                        # # # # #\n                                        . . # . .\n                                        # . # . .\n                                        # # # . .`);\n            case IconNames.Snake: return images.createImage(`\n                                        # # . . .\n                                        # # . # #\n                                        . # . # .\n                                        . # # # .\n                                        . . . . .`);\n            // animals\n            case IconNames.Rabbit: return images.createImage(`\n                                        # . # . .\n                                        # . # . .\n                                        # # # # .\n                                        # # . # .\n                                        # # # # .`);\n            case IconNames.Cow: return images.createImage(`\n                                        # . . . #\n                                        # . . . #\n                                        # # # # #\n                                        . # # # .\n                                        . . # . .`);\n            // musical notes\n            case IconNames.QuarterNote: return images.createImage(`\n                                        . . # . .\n                                        . . # . .\n                                        . . # . .\n                                        # # # . .\n                                        # # # . .`);\n            case IconNames.EigthNote: return images.createImage(`\n                                        . . # . .\n                                        . . # # .\n                                        . . # . #\n                                        # # # . .\n                                        # # # . .`);\n            // other icons\n            case IconNames.Pitchfork: return images.createImage(`\n                                        # . # . #\n                                        # . # . #\n                                        # # # # #\n                                        . . # . .\n                                        . . # . .`);\n            case IconNames.Target: return images.createImage(`\n                                        . . # . .\n                                        . # # # .\n                                        # # . # #\n                                        . # # # .\n                                        . . # . .`);\n            default: return images.createImage(`\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        . . . . .\n                                        `);\n        }\n    }\n\n    //% weight=50 blockGap=8\n    //% help=images/arrow-number\n    //% blockId=device_arrow block=\"%arrow\"\n    //% shim=TD_ID\n    export function arrowNumber(arrow: ArrowNames): number {\n        return arrow;\n    }\n}\n",
      "images.cpp": "#include \"pxt.h\"\r\n\r\n/**\r\n* Creation, manipulation and display of LED images.\r\n*/\r\n//% color=#5C2D91 weight=31 icon=\"\\uf03e\"\r\n//% advanced=true\r\nnamespace images {\r\n    /**\r\n     * Creates an image that fits on the LED screen.\r\n     */\r\n    //% weight=75 help=images/create-image\r\n    //% blockId=device_build_image block=\"create image\"\r\n    //% parts=\"ledmatrix\"\r\n    Image createImage(ImageLiteral leds) {\r\n        return MicroBitImage(imageBytes(leds)).clone().leakData();\r\n    }\r\n\r\n    /**\r\n     * Creates an image with 2 frames.\r\n     */\r\n    //% weight=74 help=images/create-big-image\r\n    //% blockId=device_build_big_image block=\"create big image\" imageLiteral=2\r\n    //% parts=\"ledmatrix\"\r\n    Image createBigImage(ImageLiteral leds) {\r\n        return createImage(leds);\r\n    }\r\n}\r\n\r\nnamespace ImageMethods {\r\n    /**\r\n     * Plots the image at a given column to the screen\r\n     */\r\n    //% help=images/plot-image\r\n    //% parts=\"ledmatrix\"\r\n    void plotImage(Image i, int xOffset = 0) {\r\n      uBit.display.print(MicroBitImage(i), -xOffset, 0, 0, 0);\r\n    }\r\n\r\n    /**\r\n     * Shows an frame from the image at offset ``x offset``.\r\n     * @param xOffset column index to start displaying the image\r\n     */\r\n    //% help=images/show-image weight=80 blockNamespace=images\r\n    //% blockId=device_show_image_offset block=\"show image %sprite|at offset %offset\" blockGap=8\r\n    //% parts=\"ledmatrix\" async\r\n    void showImage(Image sprite, int xOffset, int interval = 400) {\r\n      uBit.display.print(MicroBitImage(sprite), -xOffset, 0, 0, interval);\r\n    }\r\n\r\n    /**\r\n     * Draws the ``index``-th frame of the image on the screen.\r\n     * @param xOffset column index to start displaying the image\r\n     */\r\n    //% help=images/plot-frame weight=80\r\n    //% parts=\"ledmatrix\"\r\n    void plotFrame(Image i, int xOffset) {\r\n      // TODO showImage() used in original implementation\r\n      plotImage(i, xOffset * 5);\r\n    }\r\n\r\n    /**\r\n     * Scrolls an image .\r\n     * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5\r\n     * @param interval time between each animation step in milli seconds, eg: 200\r\n     */\r\n    //% help=images/scroll-image weight=79 async blockNamespace=images\r\n    //% blockId=device_scroll_image block=\"scroll image %sprite|with offset %frameoffset|and interval (ms) %delay\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    void scrollImage(Image id, int frameOffset, int interval) {\r\n      MicroBitImage i(id);\r\n      uBit.display.animate(i, interval, frameOffset, MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS, 0);\r\n    }\r\n\r\n\r\n    /**\r\n     * Sets all pixels off.\r\n     */\r\n    //% help=images/clear\r\n    //% parts=\"ledmatrix\"\r\n    void clear(Image i) {\r\n      MicroBitImage(i).clear();\r\n    }\r\n\r\n    /**\r\n     * Sets a specific pixel brightness at a given position\r\n     */\r\n    //%\r\n    //% parts=\"ledmatrix\"\r\n    void setPixelBrightness(Image i, int x, int y, int value) {\r\n      MicroBitImage(i).setPixelValue(x, y, value);\r\n    }\r\n\r\n\r\n    /**\r\n     * Gets the pixel brightness ([0..255]) at a given position\r\n     */\r\n    //%\r\n    //% parts=\"ledmatrix\"\r\n    int pixelBrightness(Image i, int x, int y) {\r\n      int pix = MicroBitImage(i).getPixelValue(x, y);\r\n      if (pix < 0) return 0;\r\n      return pix;\r\n    }\r\n\r\n\r\n    /**\r\n     * Gets the width in columns\r\n     */\r\n    //% help=functions/width\r\n    int width(Image i) {\r\n        return i->width;\r\n    }\r\n\r\n    /**\r\n     * Gets the height in rows (always 5)\r\n     */\r\n    //%\r\n    int height(Image i) {\r\n        return i->height;\r\n    }\r\n\r\n    /**\r\n     * Set a pixel state at position ``(x,y)``\r\n     * @param x TODO\r\n     * @param y TODO\r\n     * @param value TODO\r\n     */\r\n    //% help=images/set-pixel\r\n    //% parts=\"ledmatrix\"\r\n    void setPixel(Image i, int x, int y, bool value) {\r\n        setPixelBrightness(i, x, y, value ? 255 : 0);\r\n    }\r\n\r\n    /**\r\n     * Get the pixel state at position ``(x,y)``\r\n     * @param x TODO\r\n     * @param y TODO\r\n     */\r\n    //% help=images/pixel\r\n    //% parts=\"ledmatrix\"\r\n    bool pixel(Image i, int x, int y) {\r\n        return pixelBrightness(i, x, y) > 0;\r\n    }\r\n\r\n\r\n    /**\r\n     * Shows a particular frame of the image strip.\r\n     * @param frame TODO\r\n     */\r\n    //% weight=70 help=images/show-frame\r\n    //% parts=\"ledmatrix\"\r\n    void showFrame(Image i, int frame, int interval = 400) {\r\n        showImage(i, frame * 5, interval);\r\n    }\r\n}\r\n",
      "input.cpp": "#include \"pxt.h\"\r\n\r\nenum class Button {\r\n    A = MICROBIT_ID_BUTTON_A,\r\n    B = MICROBIT_ID_BUTTON_B,\r\n    //% block=\"A+B\"\r\n    AB = MICROBIT_ID_BUTTON_AB,\r\n};\r\n\r\nenum class Dimension {\r\n    //% block=x\r\n    X = 0,\r\n    //% block=y\r\n    Y = 1,\r\n    //% block=z\r\n    Z = 2,\r\n    //% block=strength\r\n    Strength = 3,\r\n};\r\n\r\nenum class Rotation {\r\n    //% block=pitch\r\n    Pitch = 0,\r\n    //% block=roll\r\n    Roll = 1,\r\n};\r\n\r\nenum class TouchPin {\r\n    P0 = MICROBIT_ID_IO_P0,\r\n    P1 = MICROBIT_ID_IO_P1,\r\n    P2 = MICROBIT_ID_IO_P2,\r\n};\r\n\r\nenum class AcceleratorRange {\r\n    /**\r\n     * The accelerator measures forces up to 1 gravity\r\n     */\r\n    //%  block=\"1g\"\r\n    OneG = 1,\r\n    /**\r\n     * The accelerator measures forces up to 2 gravity\r\n     */\r\n    //%  block=\"2g\"\r\n    TwoG = 2,\r\n    /**\r\n     * The accelerator measures forces up to 4 gravity\r\n     */\r\n    //% block=\"4g\"\r\n    FourG = 4,\r\n    /**\r\n     * The accelerator measures forces up to 8 gravity\r\n     */\r\n    //% block=\"8g\"\r\n    EightG = 8\r\n};\r\n\r\nenum class Gesture {\r\n    /**\r\n     * Raised when shaken\r\n     */\r\n    //% block=shake\r\n    Shake = MICROBIT_ACCELEROMETER_EVT_SHAKE,\r\n    /**\r\n     * Raised when the logo is upward and the screen is vertical\r\n     */\r\n    //% block=\"logo up\"\r\n    LogoUp = MICROBIT_ACCELEROMETER_EVT_TILT_UP,\r\n    /**\r\n     * Raised when the logo is downward and the screen is vertical\r\n     */\r\n    //% block=\"logo down\"\r\n    LogoDown = MICROBIT_ACCELEROMETER_EVT_TILT_DOWN,\r\n    /**\r\n     * Raised when the screen is pointing down and the board is horizontal\r\n     */\r\n    //% block=\"screen up\"\r\n    ScreenUp = MICROBIT_ACCELEROMETER_EVT_FACE_UP,\r\n    /**\r\n     * Raised when the screen is pointing up and the board is horizontal\r\n     */\r\n    //% block=\"screen down\"\r\n    ScreenDown = MICROBIT_ACCELEROMETER_EVT_FACE_DOWN,\r\n    /**\r\n     * Raised when the screen is pointing left\r\n     */\r\n    //% block=\"tilt left\"\r\n    TiltLeft = MICROBIT_ACCELEROMETER_EVT_TILT_LEFT,\r\n    /**\r\n     * Raised when the screen is pointing right\r\n     */\r\n    //% block=\"tilt right\"\r\n    TiltRight = MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT,\r\n    /**\r\n     * Raised when the board is falling!\r\n     */\r\n    //% block=\"free fall\"\r\n    FreeFall = MICROBIT_ACCELEROMETER_EVT_FREEFALL,\r\n    /**\r\n    * Raised when a 3G shock is detected\r\n    */\r\n    //% block=\"3g\"\r\n    ThreeG = MICROBIT_ACCELEROMETER_EVT_3G,\r\n    /**\r\n    * Raised when a 6G shock is detected\r\n    */\r\n    //% block=\"6g\"\r\n    SixG = MICROBIT_ACCELEROMETER_EVT_6G,\r\n    /**\r\n    * Raised when a 8G shock is detected\r\n    */\r\n    //% block=\"8g\"\r\n    EightG = MICROBIT_ACCELEROMETER_EVT_8G\r\n};\r\n\r\nenum class MesDpadButtonInfo {\r\n    //% block=\"A down\"\r\n    ADown = MES_DPAD_BUTTON_A_DOWN,\r\n    //% block=\"A up\"\r\n    AUp = MES_DPAD_BUTTON_A_UP,\r\n    //% block=\"B down\"\r\n    BDown = MES_DPAD_BUTTON_B_DOWN,\r\n    //% block=\"B up\"\r\n    BUp = MES_DPAD_BUTTON_B_UP,\r\n    //% block=\"C down\"\r\n    CDown = MES_DPAD_BUTTON_C_DOWN,\r\n    //% block=\"C up\"\r\n    CUp = MES_DPAD_BUTTON_C_UP,\r\n    //% block=\"D down\"\r\n    DDown = MES_DPAD_BUTTON_D_DOWN,\r\n    //% block=\"D up\"\r\n    DUp = MES_DPAD_BUTTON_D_UP,\r\n    //% block=\"1 down\"\r\n    _1Down = MES_DPAD_BUTTON_1_DOWN,\r\n    //% block=\"1 up\"\r\n    _1Up = MES_DPAD_BUTTON_1_UP,\r\n    //% block=\"2 down\"\r\n    _2Down = MES_DPAD_BUTTON_2_DOWN,\r\n    //% block=\"2 up\"\r\n    _2Up = MES_DPAD_BUTTON_2_UP,\r\n    //% block=\"3 down\"\r\n    _3Down = MES_DPAD_BUTTON_3_DOWN,\r\n    //% block=\"3 up\"\r\n    _3Up = MES_DPAD_BUTTON_3_UP,\r\n    //% block=\"4 down\"\r\n    _4Down = MES_DPAD_BUTTON_4_DOWN,\r\n    //% block=\"4 up\"\r\n    _4Up = MES_DPAD_BUTTON_4_UP,\r\n};\r\n\r\n//% color=#B4009E weight=99 icon=\"\\uf192\"\r\nnamespace input {\r\n    /**\r\n     * Do something when a button (A, B or both A+B) is pushed down and released again.\r\n     * @param button the button that needs to be pressed\r\n     * @param body code to run when event is raised\r\n     */\r\n    //% help=input/on-button-pressed weight=85 blockGap=8\r\n    //% blockId=device_button_event block=\"on button|%NAME|pressed\"\r\n    //% parts=\"buttonpair\"\r\n    void onButtonPressed(Button button, Action body) {\r\n        registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body);\r\n    }\r\n\r\n    /**\r\n     * Do something when when a gesture is done (like shaking the micro:bit).\r\n     * @param gesture the type of gesture to track, eg: Gesture.Shake\r\n     * @param body code to run when gesture is raised\r\n     */\r\n    //% help=input/on-gesture weight=84 blockGap=8\r\n    //% blockId=device_gesture_event block=\"on |%NAME\"\r\n    //% parts=\"accelerometer\"\r\n    //% NAME.fieldEditor=\"gridpicker\" NAME.fieldOptions.columns=4\r\n    void onGesture(Gesture gesture, Action body) {\r\n        int gi = (int)gesture;\r\n        if (gi == MICROBIT_ACCELEROMETER_EVT_3G && uBit.accelerometer.getRange() < 3)\r\n            uBit.accelerometer.setRange(4);\r\n        else if ((gi == MICROBIT_ACCELEROMETER_EVT_6G || gi == MICROBIT_ACCELEROMETER_EVT_8G) && uBit.accelerometer.getRange() < 6)\r\n            uBit.accelerometer.setRange(8);\r\n        registerWithDal(MICROBIT_ID_GESTURE, gi, body);\r\n    }\r\n\r\n     /**\r\n     * Do something when a pin is touched and released again (while also touching the GND pin).\r\n     * @param name the pin that needs to be pressed, eg: TouchPin.P0\r\n     * @param body the code to run when the pin is pressed\r\n     */\r\n    //% help=input/on-pin-pressed weight=83\r\n    //% blockId=device_pin_event block=\"on pin %name|pressed\"\r\n    void onPinPressed(TouchPin name, Action body) {\r\n        auto pin = getPin((int)name);\r\n        if (!pin) return;\r\n\r\n        // Forces the PIN to switch to makey-makey style detection.\r\n        pin->isTouched();\r\n        registerWithDal((int)name, MICROBIT_BUTTON_EVT_CLICK, body);\r\n    }\r\n\r\n    /**\r\n     * Do something when a pin is released.\r\n     * @param name the pin that needs to be released, eg: TouchPin.P0\r\n     * @param body the code to run when the pin is released\r\n     */\r\n    //% help=input/on-pin-released weight=6 blockGap=8\r\n    //% blockId=device_pin_released block=\"on pin %NAME|released\"\r\n    //% advanced=true\r\n    void onPinReleased(TouchPin name, Action body) {\r\n        auto pin = getPin((int)name);\r\n        if (!pin) return;\r\n\r\n        // Forces the PIN to switch to makey-makey style detection.\r\n        pin->isTouched();\r\n        registerWithDal((int)name, MICROBIT_BUTTON_EVT_UP, body);\r\n    }\r\n\r\n    /**\r\n     * Get the button state (pressed or not) for ``A`` and ``B``.\r\n     * @param button the button to query the request, eg: Button.A\r\n     */\r\n    //% help=input/button-is-pressed weight=60\r\n    //% block=\"button|%NAME|is pressed\"\r\n    //% blockId=device_get_button2\r\n    //% icon=\"\\uf192\" blockGap=8\r\n    //% parts=\"buttonpair\"\r\n    bool buttonIsPressed(Button button) {\r\n      if (button == Button::A)\r\n        return uBit.buttonA.isPressed();\r\n      else if (button == Button::B)\r\n        return uBit.buttonB.isPressed();\r\n      else if (button == Button::AB)\r\n        return uBit.buttonAB.isPressed();\r\n      return false;\r\n    }\r\n\r\n    /**\r\n     * Get the pin state (pressed or not). Requires to hold the ground to close the circuit.\r\n     * @param name pin used to detect the touch, eg: TouchPin.P0\r\n     */\r\n    //% help=input/pin-is-pressed weight=58\r\n    //% blockId=\"device_pin_is_pressed\" block=\"pin %NAME|is pressed\"\r\n    //% blockGap=8\r\n    bool pinIsPressed(TouchPin name) {\r\n        auto pin = getPin((int)name);\r\n        return pin && pin->isTouched();\r\n    }\r\n\r\n    int getAccelerationStrength() {\r\n        double x = uBit.accelerometer.getX();\r\n        double y = uBit.accelerometer.getY();\r\n        double z = uBit.accelerometer.getZ();\r\n        return (int)sqrt(x*x+y*y+z*z);\r\n    }\r\n\r\n    /**\r\n     * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)\r\n     * @param dimension TODO\r\n     */\r\n    //% help=input/acceleration weight=58\r\n    //% blockId=device_acceleration block=\"acceleration (mg)|%NAME\" blockGap=8\r\n    //% parts=\"accelerometer\"\r\n    int acceleration(Dimension dimension) {\r\n      switch (dimension) {\r\n      case Dimension::X: return uBit.accelerometer.getX();\r\n      case Dimension::Y: return uBit.accelerometer.getY();\r\n      case Dimension::Z: return uBit.accelerometer.getZ();\r\n      case Dimension::Strength: return getAccelerationStrength();\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    /**\r\n     * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.\r\n     */\r\n    //% help=input/light-level weight=57\r\n    //% blockId=device_get_light_level block=\"light level\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    int lightLevel() {\r\n        return uBit.display.readLightLevel();\r\n    }\r\n\r\n    /**\r\n     * Get the current compass heading in degrees.\r\n     */\r\n    //% help=input/compass-heading\r\n    //% weight=56\r\n    //% blockId=device_heading block=\"compass heading (°)\" blockGap=8\r\n    //% parts=\"compass\"\r\n    int compassHeading() {\r\n        return uBit.compass.heading();\r\n    }\r\n\r\n\r\n    /**\r\n     * Gets the temperature in Celsius degrees (°C).\r\n     */\r\n    //% weight=55\r\n    //% help=input/temperature\r\n    //% blockId=device_temperature block=\"temperature (°C)\" blockGap=8\r\n    //% parts=\"thermometer\"\r\n    int temperature() {\r\n        return uBit.thermometer.getTemperature();\r\n    }\r\n\r\n    /**\r\n     * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.\r\n     * @param kind TODO\r\n     */\r\n    //% help=input/rotation weight=52\r\n    //% blockId=device_get_rotation block=\"rotation (°)|%NAME\" blockGap=8\r\n    //% parts=\"accelerometer\" advanced=true\r\n    int rotation(Rotation kind) {\r\n      switch (kind) {\r\n      case Rotation::Pitch: return uBit.accelerometer.getPitch();\r\n      case Rotation::Roll: return uBit.accelerometer.getRoll();\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    /**\r\n     * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.\r\n     * @param dimension TODO\r\n     */\r\n    //% help=input/magnetic-force weight=51\r\n    //% blockId=device_get_magnetic_force block=\"magnetic force (µT)|%NAME\" blockGap=8\r\n    //% parts=\"compass\"\r\n    //% advanced=true\r\n    int magneticForce(Dimension dimension) {\r\n      if (!uBit.compass.isCalibrated())\r\n        uBit.compass.calibrate();\r\n\r\n      switch (dimension) {\r\n      case Dimension::X: return uBit.compass.getX() / 1000;\r\n      case Dimension::Y: return uBit.compass.getY() / 1000;\r\n      case Dimension::Z: return uBit.compass.getZ() / 1000;\r\n      case Dimension::Strength: return uBit.compass.getFieldStrength() / 1000;\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    /**\r\n     * Gets the number of milliseconds elapsed since power on.\r\n     */\r\n    //% help=input/running-time weight=50 blockGap=8\r\n    //% blockId=device_get_running_time block=\"running time (ms)\"\r\n    //% advanced=true\r\n    int runningTime() {\r\n        return system_timer_current_time();\r\n    }\r\n\r\n    /**\r\n     * Gets the number of microseconds elapsed since power on.\r\n     */\r\n    //% help=input/running-time-micros weight=49\r\n    //% blockId=device_get_running_time_micros block=\"running time (micros)\"\r\n    //% advanced=true\r\n    int runningTimeMicros() {\r\n        return system_timer_current_time_us();\r\n    }\r\n\r\n    /**\r\n     * Obsolete, compass calibration is automatic.\r\n     */\r\n    //% help=input/calibrate-compass advanced=true\r\n    //% blockId=\"input_compass_calibrate\" block=\"calibrate compass\"\r\n    void calibrateCompass() { \r\n        uBit.compass.calibrate();        \r\n    }\r\n\r\n    /**\r\n     * Sets the accelerometer sample range in gravities.\r\n     * @param range a value describe the maximum strengh of acceleration measured\r\n     */\r\n    //% help=input/set-accelerometer-range\r\n    //% blockId=device_set_accelerometer_range block=\"set accelerometer|range %range\"\r\n    //% weight=5\r\n    //% parts=\"accelerometer\"\r\n    //% advanced=true\r\n    void setAccelerometerRange(AcceleratorRange range) {\r\n        uBit.accelerometer.setRange((int)range);\r\n    }\r\n}\r\n",
      "input.ts": "/**\n * Events and data from sensors\n */\n//% color=#B4009E weight=99 icon=\"\\uf192\"\nnamespace input {\n    /**\n     * Attaches code to run when the screen is facing up.\n     * @param body TODO\n     */\n    //% help=input/on-screen-up\n    export function onScreenUp(body: Action): void {\n        onGesture(Gesture.ScreenUp, body);\n    }\n\n    /**\n     * Attaches code to run when the screen is facing down.\n     * @param body TODO\n     */\n    //% help=input/on-screen-down\n    export function onScreenDown(body: Action): void {\n        onGesture(Gesture.ScreenDown, body);\n    }\n\n    /**\n     * Attaches code to run when the device is shaken.\n     * @param body TODO\n     */\n    //% help=input/on-shake\n    export function onShake(body: Action): void {\n        onGesture(Gesture.Shake, body);\n    }\n\n    /**\n     * Attaches code to run when the logo is oriented upwards and the board is vertical.\n     * @param body TODO\n     */\n    //% help=input/on-logo-up\n    export function onLogoUp(body: Action): void {\n        onGesture(Gesture.LogoUp, body);\n    }\n\n    /**\n     * Attaches code to run when the logo is oriented downwards and the board is vertical.\n     * @param body TODO\n     */\n    //% help=input/on-logo-down\n    export function onLogoDown(body: Action): void {\n        onGesture(Gesture.LogoDown, body);\n    }\n\n    /**\n     * Obsolete, use input.calibrateCompass instead.\n     */\n    //% weight=0 help=input/calibrate-compass\n    export function calibrate() {\n        input.calibrateCompass();\n    }\n}\n",
      "led.cpp": "#include \"pxt.h\"\r\n\r\nenum class DisplayMode_ {\r\n    //% block=\"black and white\"\r\n    BackAndWhite = DISPLAY_MODE_BLACK_AND_WHITE,\r\n    //% block=\"greyscale\"\r\n    Greyscale = DISPLAY_MODE_GREYSCALE,\r\n    // TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE\r\n};\r\n\r\n//% color=#5C2D91 weight=97 icon=\"\\uf205\"\r\nnamespace led {\r\n\r\n    /**\r\n     * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\r\n     * @param x the horizontal coordinate of the LED starting at 0\r\n     * @param y the vertical coordinate of the LED starting at 0\r\n     */\r\n    //% help=led/plot weight=78\r\n    //% blockId=device_plot block=\"plot|x %x|y %y\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    //% x.min=0 x.max=4 y.min=0 y.max=4\r\n    void plot(int x, int y) {\r\n      uBit.display.image.setPixelValue(x, y, 0xff);\r\n    }\r\n\r\n    /**\r\n     * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\r\n     * @param x the horizontal coordinate of the LED starting at 0\r\n     * @param y the vertical coordinate of the LED starting at 0\r\n     * @param brightness the brightness from 0 (off) to 255 (bright), eg:255\r\n     */\r\n    //% help=led/plot-brightness weight=78\r\n    //% blockId=device_plot_brightness block=\"plot|x %x|y %y|brightness %brightness\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255\r\n    //% advanced=true\r\n    void plotBrightness(int x, int y, int brightness) {\r\n        brightness = max(0, min(0xff, brightness));\r\n        // enable greyscale as needed\r\n        if (brightness != 0 && brightness != 0xff && uBit.display.getDisplayMode() != DISPLAY_MODE_GREYSCALE)\r\n            uBit.display.setDisplayMode(DISPLAY_MODE_GREYSCALE);\r\n        uBit.display.image.setPixelValue(x, y, brightness);\r\n    }\r\n\r\n    /**\r\n     * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\r\n     * @param x TODO\r\n     * @param y TODO\r\n     */\r\n    //% help=led/unplot weight=77\r\n    //% blockId=device_unplot block=\"unplot|x %x|y %y\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    //% x.min=0 x.max=4 y.min=0 y.max=4\r\n    void unplot(int x, int y) {\r\n      uBit.display.image.setPixelValue(x, y, 0);\r\n    }\r\n\r\n    /**\r\n     * Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.\r\n     * @param x TODO\r\n     * @param y TODO\r\n     */\r\n    //% help=led/point weight=76\r\n    //% blockId=device_point block=\"point|x %x|y %y\"\r\n    //% parts=\"ledmatrix\"\r\n    //% x.min=0 x.max=4 y.min=0 y.max=4\r\n    bool point(int x, int y) {\r\n      int pix = uBit.display.image.getPixelValue(x, y);\r\n      return pix > 0;\r\n    }\r\n\r\n    /**\r\n     * Get the screen brightness from 0 (off) to 255 (full bright).\r\n     */\r\n    //% help=led/brightness weight=60\r\n    //% blockId=device_get_brightness block=\"brightness\" blockGap=8\r\n    //% parts=\"ledmatrix\"\r\n    //% advanced=true\r\n    int brightness() {\r\n      return uBit.display.getBrightness();\r\n    }\r\n\r\n    /**\r\n     * Set the screen brightness from 0 (off) to 255 (full bright).\r\n     * @param value the brightness value, eg:255, 127, 0\r\n     */\r\n    //% help=led/set-brightness weight=59\r\n    //% blockId=device_set_brightness block=\"set brightness %value\"\r\n    //% parts=\"ledmatrix\"\r\n    //% advanced=true\r\n    //% value.min=0 value.max=255\r\n    void setBrightness(int value) {\r\n       uBit.display.setBrightness(value);\r\n    }\r\n\r\n    /**\r\n     * Cancels the current animation and clears other pending animations.\r\n     */\r\n    //% weight=50 help=led/stop-animation\r\n    //% blockId=device_stop_animation block=\"stop animation\"\r\n    //% parts=\"ledmatrix\"\r\n    //% advanced=true\r\n    void stopAnimation() {\r\n       uBit.display.stopAnimation();\r\n    }\r\n\r\n    /**\r\n     * Sets the display mode between black and white and greyscale for rendering LEDs.\r\n     * @param mode mode the display mode in which the screen operates\r\n     */\r\n    //% weight=1 help=led/set-display-mode\r\n    //% parts=\"ledmatrix\" advanced=true\r\n    void setDisplayMode(DisplayMode_ mode) {\r\n        uBit.display.setDisplayMode((DisplayMode)mode);\r\n    }\r\n\r\n    /**\r\n    * Gets the current display mode\r\n    */\r\n    //% weight=1 parts=\"ledmatrix\" advanced=true\r\n    DisplayMode_ displayMode() {\r\n        return (DisplayMode_)uBit.display.getDisplayMode();\r\n    }\r\n\r\n    /**\r\n    * Turns on or off the display\r\n    */\r\n    //% help=led/enable blockId=device_led_enable block=\"led enable %on\"\r\n    //% advanced=true parts=\"ledmatrix\"\r\n    void enable(bool on) {\r\n        if (on) uBit.display.enable();\r\n        else uBit.display.disable();\r\n    }\r\n\r\n    /**\r\n     * Takes a screenshot of the LED screen and returns an image.\r\n     */\r\n    //% help=led/screenshot\r\n    //% parts=\"ledmatrix\"\r\n    Image screenshot() {\r\n      return uBit.display.screenShot().leakData();\r\n        /*\r\n        let Image img;\r\n        img = image.createImage(\"\");\r\n        for (let i = 0; i < 5; i++) {\r\n            for (let j = 0; j < 5; j++) {\r\n                if (led.point(i, j)) {\r\n                    img.setPixel(i, j, true);\r\n                }\r\n            }\r\n        }\r\n        return img;\r\n        */\r\n    }\r\n}\r\n",
      "led.ts": "/**\n * Control of the LED screen.\n */\n//% color=#5C2D91 weight=97 icon=\"\\uf205\"\n    namespace led {\n\n    // what's the current high value\n    let barGraphHigh = 0;\n    // when was the current high value recorded\n    let barGraphHighLast = 0;\n\n    /**\n     * Displays a vertical bar graph based on the `value` and `high` value.\n     * If `high` is 0, the chart gets adjusted automatically.\n     * @param value current value to plot\n     * @param high maximum value. If 0, maximum value adjusted automatically, eg: 0\n     */\n    //% help=led/plot-bar-graph weight=20\n    //% blockId=device_plot_bar_graph block=\"plot bar graph of %value |up to %high\" icon=\"\\uf080\" blockExternalInputs=true\n    //% parts=\"ledmatrix\"\n    export function plotBarGraph(value: number, high: number): void {\n        let now = input.runningTime();\n        serial.writeLine(value.toString());\n        value = Math.abs(value);\n\n        if (high != 0) barGraphHigh = high;\n        else if (value > barGraphHigh || now - barGraphHighLast > 10000) {\n            barGraphHigh = value;\n            barGraphHighLast = now;\n        }\n\n        barGraphHigh = Math.max(barGraphHigh, 16);\n\n        let v = (value * 15) / barGraphHigh;\n        let k = 0;\n        for (let y = 4; y >= 0; --y) {\n            for (let x = 0; x < 3; ++x) {\n                if (k > v) {\n                    unplot(2 - x, y);\n                    unplot(2 + x, y);\n                } else {\n                    plot(2 - x, y);\n                    plot(2 + x, y);\n                }\n                ++k;\n            }\n        }\n    }\n\n    /**\n     * Toggles a particular pixel\n     * @param x TODO\n     * @param y TODO\n     */\n    //% help=led/toggle weight=77\n    //% blockId=device_led_toggle block=\"toggle|x %x|y %y\" icon=\"\\uf204\" blockGap=8\n    //% parts=\"ledmatrix\"\n    //% x.min=0 x.max=4 y.min=0 y.max=4\n    export function toggle(x: number, y: number): void {\n        if (led.point(x, y)) {\n            led.unplot(x, y);\n        } else {\n            led.plot(x, y);\n        }\n    }\n\n    /**\n     * Turns all LEDS on\n     */\n    //% help=led/plot-all\n    //% parts=\"ledmatrix\"\n    export function plotAll(): void {\n        for (let i = 0; i < 5; i++) {\n            for (let j = 0; j < 5; j++) {\n                led.plot(i, j);\n            }\n        }\n    }\n\n    /**\n     * Inverts the current LED display\n     */\n    //% help=led/toggle-all\n    //% parts=\"ledmatrix\"\n    export function toggleAll(): void {\n        for (let i = 0; i < 5; i++) {\n            for (let j = 0; j < 5; j++) {\n                led.toggle(i, j);\n            }\n        }\n    }\n\n    /**\n     * Fades in the screen display.\n     * @param ms TODO\n     */\n    //% help=led/fade-in\n    //% parts=\"ledmatrix\"\n    export function fadeIn(ms: number = 700): void {\n        if (ms < 20) {\n            led.setBrightness(255);\n            return;\n        }\n        let dt = 50;\n        let brightness = led.brightness();\n        let start = input.runningTime();\n        let elapsed = 0;\n        while (elapsed < ms) {\n            led.setBrightness(brightness + ((255 - brightness) * elapsed) / ms);\n            basic.pause(dt);\n            elapsed = input.runningTime() - start;\n        }\n        led.setBrightness(255);\n    }\n\n    /**\n     * Fades out the screen brightness.\n     * @param ms TODO\n     */\n    //% help=led/fade-out\n    //% parts=\"ledmatrix\"\n    export function fadeOut(ms: number = 700): void {\n        if (ms < 20) {\n            led.setBrightness(0);\n            return;\n        }\n        let brightness = led.brightness();\n        let dt = 50;\n        let start = input.runningTime();\n        let elapsed = 0;\n        while (elapsed < ms) {\n            led.setBrightness(brightness - (brightness * elapsed) / ms);\n            basic.pause(dt);\n            elapsed = input.runningTime() - start;\n        }\n        led.setBrightness(0);\n    }\n\n\n}\n",
      "melodies.ts": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2013-2016 The MicroPython-on-micro:bit Developers, as listed\nin the accompanying AUTHORS file\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n// Melodies from file microbitmusictunes.c https://github.com/bbcmicrobit/MicroPython\n\nenum Melodies {\n    //% block=\"dadadum\" blockIdentity=music.builtInMelody\n    Dadadadum = 0,\n    //% block=\"entertainer\" blockIdentity=music.builtInMelody\n    Entertainer,\n    //% block=\"prelude\" blockIdentity=music.builtInMelody\n    Prelude,\n    //% block=\"ode\" blockIdentity=music.builtInMelody\n    Ode,\n    //% block=\"nyan\" blockIdentity=music.builtInMelody\n    Nyan,\n    //% block=\"ringtone\" blockIdentity=music.builtInMelody\n    Ringtone,\n    //% block=\"funk\" blockIdentity=music.builtInMelody\n    Funk,\n    //% block=\"blues\" blockIdentity=music.builtInMelody\n    Blues,\n    //% block=\"birthday\" blockIdentity=music.builtInMelody\n    Birthday,\n    //% block=\"wedding\" blockIdentity=music.builtInMelody\n    Wedding,\n    //% block=\"funereal\" blockIdentity=music.builtInMelody\n    Funeral,\n    //% block=\"punchline\" blockIdentity=music.builtInMelody\n    Punchline,\n    //% block=\"baddy\" blockIdentity=music.builtInMelody\n    Baddy,\n    //% block=\"chase\" blockIdentity=music.builtInMelody\n    Chase,\n    //% block=\"ba ding\" blockIdentity=music.builtInMelody\n    BaDing,\n    //% block=\"wawawawaa\" blockIdentity=music.builtInMelody\n    Wawawawaa,\n    //% block=\"jump up\" blockIdentity=music.builtInMelody\n    JumpUp,\n    //% block=\"jump down\" blockIdentity=music.builtInMelody\n    JumpDown,\n    //% block=\"power up\" blockIdentity=music.builtInMelody\n    PowerUp,\n    //% block=\"power down\" blockIdentity=music.builtInMelody\n    PowerDown,\n}\n\nnamespace music {\n\n    export function getMelody(melody: Melodies): string[] {\n        switch (melody) {\n            case Melodies.Dadadadum:\n                return ['r4:2', 'g', 'g', 'g', 'eb:8', 'r:2', 'f', 'f', 'f', 'd:8'];\n            case Melodies.Entertainer:\n                return ['d4:1', 'd#', 'e', 'c5:2', 'e4:1', 'c5:2', 'e4:1', 'c5:3', 'c:1', 'd', 'd#', 'e', 'c', 'd', 'e:2', 'b4:1', 'd5:2', 'c:4'];\n            case Melodies.Prelude:\n                return ['c4:1', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'd', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'c4', 'd', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'b3', 'd4', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'b3', 'd4', 'g', 'd5', 'f', 'g4', 'd5', 'f', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e', 'c4', 'e', 'g', 'c5', 'e', 'g4', 'c5', 'e'];\n            case Melodies.Ode:\n                return ['e4', 'e', 'f', 'g', 'g', 'f', 'e', 'd', 'c', 'c', 'd', 'e', 'e:6', 'd:2', 'd:8', 'e:4', 'e', 'f', 'g', 'g', 'f', 'e', 'd', 'c', 'c', 'd', 'e', 'd:6', 'c:2', 'c:8'];\n            case Melodies.Nyan:\n                return ['f#5:2', 'g#', 'c#:1', 'd#:2', 'b4:1', 'd5:1', 'c#', 'b4:2', 'b', 'c#5', 'd', 'd:1', 'c#', 'b4:1', 'c#5:1', 'd#', 'f#', 'g#', 'd#', 'f#', 'c#', 'd', 'b4', 'c#5', 'b4', 'd#5:2', 'f#', 'g#:1', 'd#', 'f#', 'c#', 'd#', 'b4', 'd5', 'd#', 'd', 'c#', 'b4', 'c#5', 'd:2', 'b4:1', 'c#5', 'd#', 'f#', 'c#', 'd', 'c#', 'b4', 'c#5:2', 'b4', 'c#5', 'b4', 'f#:1', 'g#', 'b:2', 'f#:1', 'g#', 'b', 'c#5', 'd#', 'b4', 'e5', 'd#', 'e', 'f#', 'b4:2', 'b', 'f#:1', 'g#', 'b', 'f#', 'e5', 'd#', 'c#', 'b4', 'f#', 'd#', 'e', 'f#', 'b:2', 'f#:1', 'g#', 'b:2', 'f#:1', 'g#', 'b', 'b', 'c#5', 'd#', 'b4', 'f#', 'g#', 'f#', 'b:2', 'b:1', 'a#', 'b', 'f#', 'g#', 'b', 'e5', 'd#', 'e', 'f#', 'b4:2', 'c#5'];\n            case Melodies.Ringtone:\n                return ['c4:1', 'd', 'e:2', 'g', 'd:1', 'e', 'f:2', 'a', 'e:1', 'f', 'g:2', 'b', 'c5:4'];\n            case Melodies.Funk:\n                return ['c2:2', 'c', 'd#', 'c:1', 'f:2', 'c:1', 'f:2', 'f#', 'g', 'c', 'c', 'g', 'c:1', 'f#:2', 'c:1', 'f#:2', 'f', 'd#'];\n            case Melodies.Blues:\n                return ['c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'f', 'a', 'c3', 'd', 'd#', 'd', 'c', 'a2', 'c2:2', 'e', 'g', 'a', 'a#', 'a', 'g', 'e', 'g', 'b', 'd3', 'f', 'f2', 'a', 'c3', 'd#', 'c2:2', 'e', 'g', 'e', 'g', 'f', 'e', 'd'];\n            case Melodies.Birthday:\n                return ['c4:3', 'c:1', 'd:4', 'c:4', 'f', 'e:8', 'c:3', 'c:1', 'd:4', 'c:4', 'g', 'f:8', 'c:3', 'c:1', 'c5:4', 'a4', 'f', 'e', 'd', 'a#:3', 'a#:1', 'a:4', 'f', 'g', 'f:8'];\n            case Melodies.Wedding:\n                return ['c4:4', 'f:3', 'f:1', 'f:8', 'c:4', 'g:3', 'e:1', 'f:8', 'c:4', 'f:3', 'a:1', 'c5:4', 'a4:3', 'f:1', 'f:4', 'e:3', 'f:1', 'g:8'];\n            case Melodies.Funeral:\n                return ['c3:4', 'c:3', 'c:1', 'c:4', 'd#:3', 'd:1', 'd:3', 'c:1', 'c:3', 'b2:1', 'c3:4'];\n            case Melodies.Punchline:\n                return ['c4:3', 'g3:1', 'f#', 'g', 'g#:3', 'g', 'r', 'b', 'c4'];\n            case Melodies.Baddy:\n                return ['c3:3', 'r', 'd:2', 'd#', 'r', 'c', 'r', 'f#:8'];\n            case Melodies.Chase:\n                return ['a4:1', 'b', 'c5', 'b4', 'a:2', 'r', 'a:1', 'b', 'c5', 'b4', 'a:2', 'r', 'a:2', 'e5', 'd#', 'e', 'f', 'e', 'd#', 'e', 'b4:1', 'c5', 'd', 'c', 'b4:2', 'r', 'b:1', 'c5', 'd', 'c', 'b4:2', 'r', 'b:2', 'e5', 'd#', 'e', 'f', 'e', 'd#', 'e'];\n            case Melodies.BaDing:\n                return ['b5:1', 'e6:3'];\n            case Melodies.Wawawawaa:\n                return ['e3:3', 'r:1', 'd#:3', 'r:1', 'd:4', 'r:1', 'c#:8'];\n            case Melodies.JumpUp:\n                return ['c5:1', 'd', 'e', 'f', 'g'];\n            case Melodies.JumpDown:\n                return ['g5:1', 'f', 'e', 'd', 'c'];\n            case Melodies.PowerUp:\n                return ['g4:1', 'c5', 'e', 'g:2', 'e:1', 'g:3'];\n            case Melodies.PowerDown:\n                return ['g5:1', 'd#', 'c', 'g4:2', 'b:1', 'c5:3'];\n            default:\n                return [];\n        }\n    }\n}",
      "music.ts": "enum Note {\n    //% blockIdentity=music.noteFrequency enumval=262\n    C = 262,\n    //% block=C#\n    //% blockIdentity=music.noteFrequency enumval=277\n    CSharp = 277,\n    //% blockIdentity=music.noteFrequency enumval=294\n    D = 294,\n    //% blockIdentity=music.noteFrequency enumval=311\n    Eb = 311,\n    //% blockIdentity=music.noteFrequency enumval=330\n    E = 330,\n    //% blockIdentity=music.noteFrequency enumval=349\n    F = 349,\n    //% block=F#\n    //% blockIdentity=music.noteFrequency enumval=370\n    FSharp = 370,\n    //% blockIdentity=music.noteFrequency enumval=392\n    G = 392,\n    //% block=G#\n    //% blockIdentity=music.noteFrequency enumval=415\n    GSharp = 415,\n    //% blockIdentity=music.noteFrequency enumval=440\n    A = 440,\n    //% blockIdentity=music.noteFrequency enumval=466\n    Bb = 466,\n    //% blockIdentity=music.noteFrequency enumval=494\n    B = 494,\n    //% blockIdentity=music.noteFrequency enumval=131\n    C3 = 131,\n    //% block=C#3\n    //% blockIdentity=music.noteFrequency enumval=139\n    CSharp3 = 139,\n    //% blockIdentity=music.noteFrequency enumval=147\n    D3 = 147,\n    //% blockIdentity=music.noteFrequency enumval=156\n    Eb3 = 156,\n    //% blockIdentity=music.noteFrequency enumval=165\n    E3 = 165,\n    //% blockIdentity=music.noteFrequency enumval=175\n    F3 = 175,\n    //% block=F#3\n    //% blockIdentity=music.noteFrequency enumval=185\n    FSharp3 = 185,\n    //% blockIdentity=music.noteFrequency enumval=196\n    G3 = 196,\n    //% block=G#3\n    //% blockIdentity=music.noteFrequency enumval=208\n    GSharp3 = 208,\n    //% blockIdentity=music.noteFrequency enumval=220\n    A3 = 220,\n    //% blockIdentity=music.noteFrequency enumval=233\n    Bb3 = 233,\n    //% blockIdentity=music.noteFrequency enumval=247\n    B3 = 247,\n    //% blockIdentity=music.noteFrequency enumval=262\n    C4 = 262,\n    //% block=C#4\n    //% blockIdentity=music.noteFrequency enumval=277\n    CSharp4 = 277,\n    //% blockIdentity=music.noteFrequency enumval=294\n    D4 = 294,\n    //% blockIdentity=music.noteFrequency enumval=311\n    Eb4 = 311,\n    //% blockIdentity=music.noteFrequency enumval=330\n    E4 = 330,\n    //% blockIdentity=music.noteFrequency enumval=349\n    F4 = 349,\n    //% block=F#4\n    //% blockIdentity=music.noteFrequency enumval=370\n    FSharp4 = 370,\n    //% blockIdentity=music.noteFrequency enumval=392\n    G4 = 392,\n    //% block=G#4\n    //% blockIdentity=music.noteFrequency enumval=415\n    GSharp4 = 415,\n    //% blockIdentity=music.noteFrequency enumval=440\n    A4 = 440,\n    //% blockIdentity=music.noteFrequency enumval=466\n    Bb4 = 466,\n    //% blockIdentity=music.noteFrequency enumval=494\n    B4 = 494,\n    //% blockIdentity=music.noteFrequency enumval=523\n    C5 = 523,\n    //% block=C#5\n    //% blockIdentity=music.noteFrequency enumval=555\n    CSharp5 = 555,\n    //% blockIdentity=music.noteFrequency enumval=587\n    D5 = 587,\n    //% blockIdentity=music.noteFrequency enumval=622\n    Eb5 = 622,\n    //% blockIdentity=music.noteFrequency enumval=659\n    E5 = 659,\n    //% blockIdentity=music.noteFrequency enumval=698\n    F5 = 698,\n    //% block=F#5\n    //% blockIdentity=music.noteFrequency enumval=740\n    FSharp5 = 740,\n    //% blockIdentity=music.noteFrequency enumval=784\n    G5 = 784,\n    //% block=G#5\n    //% blockIdentity=music.noteFrequency enumval=831\n    GSharp5 = 831,\n    //% blockIdentity=music.noteFrequency enumval=880\n    A5 = 880,\n    //% blockIdentity=music.noteFrequency enumval=932\n    Bb5 = 932,\n    //% blockIdentity=music.noteFrequency enumval=988\n    B5 = 988,\n}\n\nenum BeatFraction {\n    //% block=1\n    Whole = 1,\n    //% block=\"1/2\"\n    Half = 2,\n    //% block=\"1/4\"\n    Quarter = 4,\n    //% block=\"1/8\"\n    Eighth = 8,\n    //% block=\"1/16\"\n    Sixteenth = 16,\n    //% block=\"2\"\n    Double = 32,\n    //% block=\"4\",\n    Breve = 64\n}\n\nenum MelodyOptions {\n    //% block=\"once\"\"\n    Once = 1,\n    //% block=\"forever\"\n    Forever = 2,\n    //% block=\"once in background\"\n    OnceInBackground = 4,\n    //% block=\"forever in background\"\n    ForeverInBackground = 8\n}\n\nenum MusicEvent {\n    //% block=\"melody note played\"\n    MelodyNotePlayed = 1,\n    //% block=\"melody started\"\n    MelodyStarted = 2,\n    //% block=\"melody ended\"\n    MelodyEnded = 3,\n    //% block=\"melody repeated\"\n    MelodyRepeated = 4,\n    //% block=\"background melody note played\"\n    BackgroundMelodyNotePlayed = MelodyNotePlayed | 0xf0,\n    //% block=\"background melody started\"\n    BackgroundMelodyStarted = MelodyStarted | 0xf0,\n    //% block=\"background melody ended\"\n    BackgroundMelodyEnded = MelodyEnded | 0xf0,\n    //% block=\"background melody repeated\"\n    BackgroundMelodyRepeated = MelodyRepeated | 0xf0,\n    //% block=\"background melody paused\"\n    BackgroundMelodyPaused = 5 | 0xf0,\n    //% block=\"background melody resumed\"\n    BackgroundMelodyResumed = 6 | 0xf0\n}\n\n/**\n * Generation of music tones.\n */\n//% color=#D83B01 weight=98 icon=\"\\uf025\"\nnamespace music {\n    let beatsPerMinute: number = 120;\n    let freqTable: number[] = [];\n    let _playTone: (frequency: number, duration: number) => void;\n    const MICROBIT_MELODY_ID = 2000;\n\n    /**\n     * Plays a tone through pin ``P0`` for the given duration.\n     * @param frequency pitch of the tone to play in Hertz (Hz)\n     * @param ms tone duration in milliseconds (ms)\n     */\n    //% help=music/play-tone weight=90\n    //% blockId=device_play_note block=\"play|tone %note=device_note|for %duration=device_beat\" blockGap=8\n    //% parts=\"headphone\"\n    //% useEnumVal=1\n    export function playTone(frequency: number, ms: number): void {\n        if (_playTone) _playTone(frequency, ms);\n        else pins.analogPitch(frequency, ms);\n    }\n\n    /**\n     * Plays a tone through pin ``P0``.\n     * @param frequency pitch of the tone to play in Hertz (Hz)\n     */\n    //% help=music/ring-tone weight=80\n    //% blockId=device_ring block=\"ring tone (Hz)|%note=device_note\" blockGap=8\n    //% parts=\"headphone\"\n    //% useEnumVal=1\n    export function ringTone(frequency: number): void {\n        playTone(frequency, 0);\n    }\n\n    /**\n     * Rests (plays nothing) for a specified time through pin ``P0``.\n     * @param ms rest duration in milliseconds (ms)\n     */\n    //% help=music/rest weight=79\n    //% blockId=device_rest block=\"rest(ms)|%duration=device_beat\"\n    //% parts=\"headphone\"\n    export function rest(ms: number): void {\n        playTone(0, ms);\n    }\n\n\n    /**\n     * Gets the frequency of a note.\n     * @param name the note name, eg: Note.C\n     */\n    //% weight=50 help=music/note-frequency\n    //% blockId=device_note block=\"%note\"\n    //% shim=TD_ID\n    //% note.fieldEditor=\"note\" note.defl=\"262\"\n    //% useEnumVal=1\n    export function noteFrequency(name: Note): number {\n        return name;\n    }\n\n    function init() {\n        if (beatsPerMinute <= 0) beatsPerMinute = 120;\n        if (freqTable.length == 0) freqTable = [31, 33, 35, 37, 39, 41, 44, 46, 49, 52, 55, 58, 62, 65, 69, 73, 78, 82, 87, 92, 98, 104, 110, 117, 123, 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, 523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, 1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951, 4186]\n    }\n\n    /**\n     * Returns the duration of a beat in milli-seconds\n     */\n    //% help=music/beat weight=49\n    //% blockId=device_beat block=\"%fraction|beat\"\n    export function beat(fraction?: BeatFraction): number {\n        init();\n        if (fraction == null) fraction = BeatFraction.Whole;\n        let beat = 60000 / beatsPerMinute;\n        switch (fraction) {\n            case BeatFraction.Half: return beat / 2;\n            case BeatFraction.Quarter: return beat / 4;\n            case BeatFraction.Eighth: return beat / 8;\n            case BeatFraction.Sixteenth: return beat / 16;\n            case BeatFraction.Double: return beat * 2;\n            case BeatFraction.Breve: return beat * 4;\n            default: return beat;\n        }\n    }\n\n    /**\n     * Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.\n     */\n    //% help=music/tempo weight=40\n    //% blockId=device_tempo block=\"tempo (bpm)\" blockGap=8\n    export function tempo(): number {\n        init();\n        return beatsPerMinute;\n    }\n\n    /**\n     * Change the tempo by the specified amount\n     * @param bpm The change in beats per minute to the tempo, eg: 20\n     */\n    //% help=music/change-tempo-by weight=39\n    //% blockId=device_change_tempo block=\"change tempo by (bpm)|%value\" blockGap=8\n    export function changeTempoBy(bpm: number): void {\n        init();\n        setTempo(beatsPerMinute + bpm);\n    }\n\n    /**\n     * Sets the tempo to the specified amount\n     * @param bpm The new tempo in beats per minute, eg: 120\n     */\n    //% help=music/set-tempo weight=38\n    //% blockId=device_set_tempo block=\"set tempo to (bpm)|%value\"\n    //% bpm.min=4 bpm.max=400\n    export function setTempo(bpm: number): void {\n        init();\n        if (bpm > 0) {\n            beatsPerMinute = Math.max(1, bpm);\n        }\n    }\n\n    let currentMelody: Melody;\n    let currentBackgroundMelody: Melody;\n\n    /**\n     * Gets the melody array of a built-in melody.\n     * @param name the note name, eg: Note.C\n     */\n    //% weight=50 help=music/builtin-melody\n    //% blockId=device_builtin_melody block=\"%melody\"\n    //% blockHidden=true\n    export function builtInMelody(melody: Melodies): string[] {\n        return getMelody(melody);\n    }\n\n    /**\n     * Registers code to run on various melody events\n     */\n    //% blockId=melody_on_event block=\"music on %value\"\n    //% help=music/on-event weight=59\n    export function onEvent(value: MusicEvent, handler: Action) {\n        control.onEvent(MICROBIT_MELODY_ID, value, handler);\n    }\n\n    /**\n     * Starts playing a melody.\n     * Notes are expressed as a string of characters with this format: NOTE[octave][:duration]\n     * @param melodyArray the melody array to play, eg: ['g5:1']\n     * @param options melody options, once / forever, in the foreground / background\n     */\n    //% help=music/begin-melody weight=60 blockGap=8\n    //% blockId=device_start_melody block=\"start melody %melody=device_builtin_melody| repeating %options\"\n    //% parts=\"headphone\"\n    export function beginMelody(melodyArray: string[], options: MelodyOptions = 1) {\n        init();\n        if (currentMelody != undefined) {\n            if (((options & MelodyOptions.OnceInBackground) == 0)\n                && ((options & MelodyOptions.ForeverInBackground) == 0)\n                && currentMelody.background) {\n                currentBackgroundMelody = currentMelody;\n                currentMelody = null;\n                control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyPaused);\n            }\n            if (currentMelody)\n                control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyEnded : MusicEvent.MelodyEnded);\n            currentMelody = new Melody(melodyArray, options);\n            control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyStarted : MusicEvent.MelodyStarted);\n        } else {\n            currentMelody = new Melody(melodyArray, options);\n            control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyStarted : MusicEvent.MelodyStarted);\n            // Only start the fiber once\n            control.inBackground(() => {\n                while (currentMelody.hasNextNote()) {\n                    playNextNote(currentMelody);\n                    if (!currentMelody.hasNextNote() && currentBackgroundMelody) {\n                        // Swap the background melody back\n                        currentMelody = currentBackgroundMelody;\n                        currentBackgroundMelody = null;\n                        control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.MelodyEnded);\n                        control.raiseEvent(MICROBIT_MELODY_ID, MusicEvent.BackgroundMelodyResumed);\n                    }\n                }\n                control.raiseEvent(MICROBIT_MELODY_ID, currentMelody.background ? MusicEvent.BackgroundMelodyEnded : MusicEvent.MelodyEnded);\n                currentMelody = null;\n            })\n        }\n    }\n\n    /**\n     * Sets a custom playTone function for playing melodies\n     */\n    //% help=music/set-play-tone\n    //% advanced=true\n    export function setPlayTone(f: (frequency: number, duration: number) => void) {\n        _playTone = f;\n    }\n\n    function playNextNote(melody: Melody): void {\n        // cache elements\n        let currNote = melody.nextNote();\n        let currentPos = melody.currentPos;\n        let currentDuration = melody.currentDuration;\n        let currentOctave = melody.currentOctave;\n\n        let note: number;\n        let isrest: boolean = false;\n        let beatPos: number;\n        let parsingOctave: boolean = true;\n\n        for (let pos = 0; pos < currNote.length; pos++) {\n            let noteChar = currNote.charAt(pos);\n            switch (noteChar) {\n                case 'c': case 'C': note = 1; break;\n                case 'd': case 'D': note = 3; break;\n                case 'e': case 'E': note = 5; break;\n                case 'f': case 'F': note = 6; break;\n                case 'g': case 'G': note = 8; break;\n                case 'a': case 'A': note = 10; break;\n                case 'b': case 'B': note = 12; break;\n                case 'r': case 'R': isrest = true; break;\n                case '#': note++; break;\n                case 'b': note--; break;\n                case ':': parsingOctave = false; beatPos = pos; break;\n                default: if (parsingOctave) currentOctave = parseInt(noteChar);\n            }\n        }\n        if (!parsingOctave) {\n            currentDuration = parseInt(currNote.substr(beatPos + 1, currNote.length - beatPos));\n        }\n        let beat = (60000 / beatsPerMinute) / 4;\n        if (isrest) {\n            music.rest(currentDuration * beat)\n        } else {\n            let keyNumber = note + (12 * (currentOctave - 1));\n            let frequency = keyNumber >= 0 && keyNumber < freqTable.length ? freqTable[keyNumber] : 0;\n            music.playTone(frequency, currentDuration * beat);\n        }\n        melody.currentDuration = currentDuration;\n        melody.currentOctave = currentOctave;\n        const repeating = melody.repeating && currentPos == melody.melodyArray.length - 1;\n        melody.currentPos = repeating ? 0 : currentPos + 1;\n\n        control.raiseEvent(MICROBIT_MELODY_ID, melody.background ? MusicEvent.BackgroundMelodyNotePlayed : MusicEvent.MelodyNotePlayed);\n        if (repeating)\n            control.raiseEvent(MICROBIT_MELODY_ID, melody.background ? MusicEvent.BackgroundMelodyRepeated : MusicEvent.MelodyRepeated);\n    }\n\n    class Melody {\n        public melodyArray: string[];\n        public currentDuration: number;\n        public currentOctave: number;\n        public currentPos: number;\n        public repeating: boolean;\n        public background: boolean;\n\n        constructor(melodyArray: string[], options: MelodyOptions) {\n            this.melodyArray = melodyArray;\n            this.repeating = ((options & MelodyOptions.Forever) != 0);\n            this.repeating = this.repeating ? true : ((options & MelodyOptions.ForeverInBackground) != 0)\n            this.background = ((options & MelodyOptions.OnceInBackground) != 0);\n            this.background = this.background ? true : ((options & MelodyOptions.ForeverInBackground) != 0);\n            this.currentDuration = 4; //Default duration (Crotchet)\n            this.currentOctave = 4; //Middle octave\n            this.currentPos = 0;\n        }\n\n        hasNextNote() {\n            return this.repeating || this.currentPos < this.melodyArray.length;\n        }\n\n        nextNote(): string {\n            const currentNote = this.melodyArray[this.currentPos];\n            return currentNote;\n        }\n    }\n}\n",
      "parts/headphone.svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"142\" height=\"180\" viewBox=\"0 0 142 180\"><rect ry=\".3\" rx=\"1\" y=\"58.615\" x=\"-8.878\" height=\"23.571\" width=\"17.143\" transform=\"rotate(-45)\" fill=\"#b3b3b3\"/><rect ry=\".3\" rx=\"1\" y=\"32.043\" x=\"-8.878\" height=\"23.571\" width=\"17.143\" transform=\"rotate(-45)\" fill=\"#b3b3b3\"/><path d=\"M.346 7.296c-.394.39-.31 4.797-.18 4.898l13.404 10.18c.117.12.337 4.76.73 4.368l5.506-5.56.01.01 6.51-6.444c.39-.392-4.25-.614-4.366-.73L11.777.612c-.1-.132-4.51-.215-4.898.18L4.087 3.636l-.01-.01-3.73 3.67z\" fill=\"#b3b3b3\"/><rect ry=\"6.85\" rx=\"4.571\" y=\"84.758\" x=\"-20.128\" height=\"75.571\" width=\"39.643\" transform=\"rotate(-45)\"/><rect ry=\".374\" rx=\"1.038\" y=\"29.442\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\".374\" rx=\"1.038\" y=\"55.939\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\".374\" rx=\"1.038\" y=\"82.392\" x=\"-8.925\" height=\"2.228\" width=\"17.238\" transform=\"rotate(-45)\" fill=\"#fff\"/><rect ry=\"2.317\" rx=\"2.183\" y=\"158.876\" x=\"-9.774\" height=\"25.568\" width=\"18.935\" transform=\"rotate(-45)\"/><path d=\"M128.588 128.82s14.97 11.165 7.547 26.35c-8.426 17.24-25.57 20.653-25.57 20.653\" fill=\"none\" stroke=\"#000\" stroke-width=\"6.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>",
      "parts/speaker.svg": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg viewBox=\"0 0 500 500\" xmlns=\"http://www.w3.org/2000/svg\">\n  <g transform=\"matrix(1, 0, 0, 1, -0.00023, -58.230297)\">\n    <ellipse style=\"fill: rgb(70, 70, 70);\" cx=\"250.58\" cy=\"308.81\" rx=\"215\" ry=\"215\"/>\n    <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 1.000001, -232.069031, 248.780606)\" cx=\"482.069\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n    <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -232.067871, 110.041956)\" cx=\"482.067\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n    <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"389.12\" cy=\"308.23\" rx=\"23.028\" ry=\"23.028\"/>\n    <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"110.88\" cy=\"308.23\" rx=\"23.028\" ry=\"23.028\"/>\n    <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"169.393\" rx=\"23.028\" ry=\"23.028\"/>\n    <g transform=\"matrix(1, 0, 0, 1, -0.000009, 0.000015)\">\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n    </g>\n    <g transform=\"matrix(0.866026, 0.5, -0.5, 0.866026, 7.386552, -105.261086)\">\n      <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(0.999999, 0, 0, 0.999999, -65.212313, 177.387415)\" cx=\"482.068\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"555.975\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"277.735\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"416.855\" cy=\"97.999\" rx=\"23.028\" ry=\"23.028\"/>\n    </g>\n    <g transform=\"matrix(0.5, 0.866026, -0.866026, 0.5, 246.635941, -171.170502)\">\n      <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(0.999999, 0, 0, 0.999999, -65.212313, 177.387415)\" cx=\"482.068\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"555.975\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"277.735\" cy=\"236.836\" rx=\"23.028\" ry=\"23.028\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"416.855\" cy=\"97.999\" rx=\"23.028\" ry=\"23.028\"/>\n    </g>\n    <g transform=\"matrix(-0.5, 0.866026, -0.866026, -0.5, 641.934998, 245.84082)\">\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n    </g>\n    <g transform=\"matrix(-0.500001, -0.866026, 0.866026, -0.500001, 108.063393, 678.85083)\">\n      <ellipse style=\"fill: rgb(0, 0, 0);\" cx=\"250\" cy=\"238.513\" rx=\"23.028\" ry=\"23.028\" transform=\"matrix(1.000001, 0, 0, 0.999999, 69.996739, 69.71816)\"/>\n      <ellipse style=\"fill: rgb(0, 0, 0);\" transform=\"matrix(1, 0, 0, 0.999999, -302.064453, 110.043115)\" cx=\"482.064\" cy=\"198.188\" rx=\"23.028\" ry=\"23.028\"/>\n    </g>\n  </g>\n</svg>",
      "pins.cpp": "#include \"pxt.h\"\r\n\r\nenum class DigitalPin {\r\n    P0 = MICROBIT_ID_IO_P0,\r\n    P1 = MICROBIT_ID_IO_P1,\r\n    P2 = MICROBIT_ID_IO_P2,\r\n    P3 = MICROBIT_ID_IO_P3,\r\n    P4 = MICROBIT_ID_IO_P4,\r\n    P5 = MICROBIT_ID_IO_P5,\r\n    P6 = MICROBIT_ID_IO_P6,\r\n    P7 = MICROBIT_ID_IO_P7,\r\n    P8 = MICROBIT_ID_IO_P8,\r\n    P9 = MICROBIT_ID_IO_P9,\r\n    P10 = MICROBIT_ID_IO_P10,\r\n    P11 = MICROBIT_ID_IO_P11,\r\n    P12 = MICROBIT_ID_IO_P12,\r\n    P13 = MICROBIT_ID_IO_P13,\r\n    P14 = MICROBIT_ID_IO_P14,\r\n    P15 = MICROBIT_ID_IO_P15,\r\n    P16 = MICROBIT_ID_IO_P16,\r\n    P19 = MICROBIT_ID_IO_P19,\r\n    P20 = MICROBIT_ID_IO_P20,\r\n};\r\n\r\nenum class AnalogPin {\r\n    P0 = MICROBIT_ID_IO_P0,\r\n    P1 = MICROBIT_ID_IO_P1,\r\n    P2 = MICROBIT_ID_IO_P2,\r\n    P3 = MICROBIT_ID_IO_P3,\r\n    P4 = MICROBIT_ID_IO_P4,\r\n    P10 = MICROBIT_ID_IO_P10,\r\n    //% block=\"P5 (write only)\"\r\n    P5 = MICROBIT_ID_IO_P5,\r\n    //% block=\"P6 (write only)\"\r\n    P6 = MICROBIT_ID_IO_P6,\r\n    //% block=\"P7 (write only)\"\r\n    P7 = MICROBIT_ID_IO_P7,\r\n    //% block=\"P8 (write only)\"\r\n    P8 = MICROBIT_ID_IO_P8,\r\n    //% block=\"P9 (write only)\"\r\n    P9 = MICROBIT_ID_IO_P9,\r\n    //% block=\"P11 (write only)\"\r\n    P11 = MICROBIT_ID_IO_P11,\r\n    //% block=\"P12 (write only)\"\r\n    P12 = MICROBIT_ID_IO_P12,\r\n    //% block=\"P13 (write only)\"\r\n    P13 = MICROBIT_ID_IO_P13,\r\n    //% block=\"P14 (write only)\"\r\n    P14 = MICROBIT_ID_IO_P14,\r\n    //% block=\"P15 (write only)\"\r\n    P15 = MICROBIT_ID_IO_P15,\r\n    //% block=\"P16 (write only)\"\r\n    P16 = MICROBIT_ID_IO_P16,\r\n    //% block=\"P19 (write only)\"\r\n    P19 = MICROBIT_ID_IO_P19,\r\n    //% block=\"P20 (write only)\"\r\n    P20 = MICROBIT_ID_IO_P20\r\n};\r\n\r\nenum class PulseValue {\r\n    //% block=high\r\n    High = MICROBIT_PIN_EVT_PULSE_HI,\r\n    //% block=low\r\n    Low = MICROBIT_PIN_EVT_PULSE_LO\r\n};\r\n\r\nenum class PinPullMode {\r\n    //% block=\"down\"\r\n    PullDown = 0,\r\n    //% block=\"up\"\r\n    PullUp = 1,\r\n    //% block=\"none\"\r\n    PullNone = 2\r\n};\r\n\r\nenum class PinEventType {\r\n    //% block=\"edge\"\r\n    Edge = MICROBIT_PIN_EVENT_ON_EDGE,\r\n    //% block=\"pulse\"\r\n    Pulse = MICROBIT_PIN_EVENT_ON_PULSE,\r\n    //% block=\"touch\"\r\n    Touch = MICROBIT_PIN_EVENT_ON_TOUCH,\r\n    //% block=\"none\"\r\n    None = MICROBIT_PIN_EVENT_NONE\r\n};\r\n\r\nMicroBitPin *getPin(int id) {\r\n    switch (id) {\r\n        case MICROBIT_ID_IO_P0: return &uBit.io.P0;\r\n        case MICROBIT_ID_IO_P1: return &uBit.io.P1;\r\n        case MICROBIT_ID_IO_P2: return &uBit.io.P2;\r\n        case MICROBIT_ID_IO_P3: return &uBit.io.P3;\r\n        case MICROBIT_ID_IO_P4: return &uBit.io.P4;\r\n        case MICROBIT_ID_IO_P5: return &uBit.io.P5;\r\n        case MICROBIT_ID_IO_P6: return &uBit.io.P6;\r\n        case MICROBIT_ID_IO_P7: return &uBit.io.P7;\r\n        case MICROBIT_ID_IO_P8: return &uBit.io.P8;\r\n        case MICROBIT_ID_IO_P9: return &uBit.io.P9;\r\n        case MICROBIT_ID_IO_P10: return &uBit.io.P10;\r\n        case MICROBIT_ID_IO_P11: return &uBit.io.P11;\r\n        case MICROBIT_ID_IO_P12: return &uBit.io.P12;\r\n        case MICROBIT_ID_IO_P13: return &uBit.io.P13;\r\n        case MICROBIT_ID_IO_P14: return &uBit.io.P14;\r\n        case MICROBIT_ID_IO_P15: return &uBit.io.P15;\r\n        case MICROBIT_ID_IO_P16: return &uBit.io.P16;\r\n        case MICROBIT_ID_IO_P19: return &uBit.io.P19;\r\n        case MICROBIT_ID_IO_P20: return &uBit.io.P20;\r\n        default: return NULL;\r\n    }\r\n}\r\n\r\n\r\nnamespace pins {\r\n    #define PINOP(op) \\\r\n      MicroBitPin *pin = getPin((int)name); \\\r\n      if (!pin) return; \\\r\n      pin->op\r\n\r\n    #define PINREAD(op) \\\r\n      MicroBitPin *pin = getPin((int)name); \\\r\n      if (!pin) return 0; \\\r\n      return pin->op\r\n\r\n\r\n    //%\r\n    MicroBitPin *getPinAddress(int id) {\r\n        return getPin(id);\r\n    }\r\n\r\n    /**\r\n     * Read the specified pin or connector as either 0 or 1\r\n     * @param name pin to read from, eg: DigitalPin.P0\r\n     */\r\n    //% help=pins/digital-read-pin weight=30\r\n    //% blockId=device_get_digital_pin block=\"digital read|pin %name\" blockGap=8\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\"\r\n    int digitalReadPin(DigitalPin name) {\r\n        PINREAD(getDigitalValue());\r\n    }\r\n\r\n    /**\r\n      * Set a pin or connector value to either 0 or 1.\r\n      * @param name pin to write to, eg: DigitalPin.P0\r\n      * @param value value to set on the pin, 1 eg,0\r\n      */\r\n    //% help=pins/digital-write-pin weight=29\r\n    //% blockId=device_set_digital_pin block=\"digital write|pin %name|to %value\"\r\n    //% value.min=0 value.max=1\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\"\r\n    void digitalWritePin(DigitalPin name, int value) {\r\n        PINOP(setDigitalValue(value));\r\n    }\r\n\r\n    /**\r\n     * Read the connector value as analog, that is, as a value comprised between 0 and 1023.\r\n     * @param name pin to write to, eg: AnalogPin.P0\r\n     */\r\n    //% help=pins/analog-read-pin weight=25\r\n    //% blockId=device_get_analog_pin block=\"analog read|pin %name\" blockGap=\"8\"\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\"\r\n    int analogReadPin(AnalogPin name) {\r\n        PINREAD(getAnalogValue());\r\n    }\r\n\r\n    /**\r\n     * Set the connector value as analog. Value must be comprised between 0 and 1023.\r\n     * @param name pin name to write to, eg: AnalogPin.P0\r\n     * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0\r\n     */\r\n    //% help=pins/analog-write-pin weight=24\r\n    //% blockId=device_set_analog_pin block=\"analog write|pin %name|to %value\" blockGap=8\r\n    //% value.min=0 value.max=1023\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\"\r\n    void analogWritePin(AnalogPin name, int value) {\r\n        PINOP(setAnalogValue(value));\r\n    }\r\n\r\n    /**\r\n     * Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\r\n     * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.\r\n     * @param name analog pin to set period to, eg: AnalogPin.P0\r\n     * @param micros period in micro seconds. eg:20000\r\n     */\r\n    //% help=pins/analog-set-period weight=23 blockGap=8\r\n    //% blockId=device_set_analog_period block=\"analog set period|pin %pin|to (µs)%micros\"\r\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\r\n    //% pin.fieldOptions.tooltips=\"false\"\r\n    void analogSetPeriod(AnalogPin name, int micros) {\r\n        PINOP(setAnalogPeriodUs(micros));\r\n    }\r\n\r\n    /**\r\n    * Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.\r\n    * @param name digital pin to register to, eg: DigitalPin.P0\r\n    * @param pulse the value of the pulse, eg: PulseValue.High\r\n    */\r\n    //% help=pins/on-pulsed weight=22 blockGap=8 advanced=true\r\n    //% blockId=pins_on_pulsed block=\"on|pin %pin|pulsed %pulse\"\r\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\r\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\"\r\n    void onPulsed(DigitalPin name, PulseValue pulse, Action body) {\r\n        MicroBitPin* pin = getPin((int)name);\r\n        if (!pin) return;\r\n\r\n        pin->eventOn(MICROBIT_PIN_EVENT_ON_PULSE);\r\n        registerWithDal((int)name, (int)pulse, body);\r\n    }\r\n\r\n    /**\r\n    * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.\r\n    */\r\n    //% help=pins/pulse-duration advanced=true\r\n    //% blockId=pins_pulse_duration block=\"pulse duration (µs)\"\r\n    //% weight=21 blockGap=8\r\n    int pulseDuration() {\r\n        return pxt::lastEvent.timestamp;\r\n    }\r\n\r\n    /**\r\n    * Returns the duration of a pulse in microseconds\r\n    * @param name the pin which measures the pulse, eg: DigitalPin.P0\r\n    * @param value the value of the pulse, eg: PulseValue.High\r\n    * @param maximum duration in micro-seconds\r\n    */\r\n    //% blockId=\"pins_pulse_in\" block=\"pulse in (µs)|pin %name|pulsed %value\"\r\n    //% weight=20 advanced=true\r\n    //% help=pins/pulse-in\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\"\r\n    int pulseIn(DigitalPin name, PulseValue value, int maxDuration = 2000000) {\r\n        MicroBitPin* pin = getPin((int)name);\r\n        if (!pin) return 0;\r\n\r\n        int pulse = value == PulseValue::High ? 1 : 0;\r\n        uint64_t tick =  system_timer_current_time_us();\r\n        uint64_t maxd = (uint64_t)maxDuration;\r\n        while(pin->getDigitalValue() != pulse) {\r\n            if(system_timer_current_time_us() - tick > maxd)\r\n                return 0;\r\n        }\r\n\r\n        uint64_t start =  system_timer_current_time_us();\r\n        while(pin->getDigitalValue() == pulse) {\r\n            if(system_timer_current_time_us() - tick > maxd)\r\n                return 0;\r\n        }\r\n        uint64_t end =  system_timer_current_time_us();\r\n        return end - start;\r\n    }\r\n\r\n    /**\r\n     * Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).\r\n     * @param name pin to write to, eg: AnalogPin.P0\r\n     * @param value angle or rotation speed, eg:180,90,0\r\n     */\r\n    //% help=pins/servo-write-pin weight=20\r\n    //% blockId=device_set_servo_pin block=\"servo write|pin %name|to %value\" blockGap=8\r\n    //% parts=microservo trackArgs=0\r\n    //% value.min=0 value.max=180\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\"\r\n    void servoWritePin(AnalogPin name, int value) {\r\n        PINOP(setServoValue(value));\r\n    }\r\n\r\n    /**\r\n     * Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.\r\n     * @param name pin name\r\n     * @param micros pulse duration in micro seconds, eg:1500\r\n     */\r\n    //% help=pins/servo-set-pulse weight=19\r\n    //% blockId=device_set_servo_pulse block=\"servo set pulse|pin %value|to (µs) %micros\"\r\n    //% value.fieldEditor=\"gridpicker\" value.fieldOptions.columns=4\r\n    //% value.fieldOptions.tooltips=\"false\"\r\n    void servoSetPulse(AnalogPin name, int micros) {\r\n        PINOP(setServoPulseUs(micros));\r\n    }\r\n\r\n\r\n    MicroBitPin* pitchPin = NULL;\r\n\r\n    /**\r\n     * Sets the pin used when using `analog pitch` or music.\r\n     * @param name pin to modulate pitch from\r\n     */\r\n    //% blockId=device_analog_set_pitch_pin block=\"analog set pitch pin %name\"\r\n    //% help=pins/analog-set-pitch-pin weight=3 advanced=true\r\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\r\n    //% name.fieldOptions.tooltips=\"false\"\r\n    void analogSetPitchPin(AnalogPin name) {\r\n      pitchPin = getPin((int)name);\r\n    }\r\n\r\n    /**\r\n     * Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.\r\n     * @param frequency frequency to modulate in Hz.\r\n     * @param ms duration of the pitch in milli seconds.\r\n     */\r\n    //% blockId=device_analog_pitch block=\"analog pitch %frequency|for (ms) %ms\"\r\n    //% help=pins/analog-pitch weight=4 async advanced=true blockGap=8\r\n    void analogPitch(int frequency, int ms) {\r\n      if (pitchPin == NULL)\r\n        analogSetPitchPin(AnalogPin::P0);\r\n      if (frequency <= 0) {\r\n        pitchPin->setAnalogValue(0);\r\n      } else {\r\n        pitchPin->setAnalogValue(512);\r\n        pitchPin->setAnalogPeriodUs(1000000/frequency);\r\n      }\r\n\r\n      if (ms > 0) {\r\n          fiber_sleep(ms);\r\n          pitchPin->setAnalogValue(0);\r\n          // TODO why do we use wait_ms() here? it's a busy wait I think\r\n          wait_ms(5);\r\n      }\r\n    }\r\n\r\n\r\n    /**\r\n    * Configures the pull of this pin.\r\n    * @param name pin to set the pull mode on, eg: DigitalPin.P0\r\n    * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp\r\n    */\r\n    //% help=pins/set-pull weight=3 advanced=true\r\n    //% blockId=device_set_pull block=\"set pull|pin %pin|to %pull\"\r\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\r\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\"\r\n    void setPull(DigitalPin name, PinPullMode pull) {\r\n        PinMode m = pull == PinPullMode::PullDown\r\n            ? PinMode::PullDown\r\n            : pull == PinPullMode::PullUp ? PinMode::PullUp\r\n            : PinMode::PullNone;\r\n        PINOP(setPull(m));\r\n    }\r\n\r\n    /**\r\n    * Configures the events emitted by this pin. Events can be subscribed to\r\n    * using ``control.onEvent()``.\r\n    * @param name pin to set the event mode on, eg: DigitalPin.P0\r\n    * @param type the type of events for this pin to emit, eg: PinEventType.Edge\r\n    */\r\n    //% help=pins/set-events weight=4 advanced=true\r\n    //% blockId=device_set_pin_events block=\"set pin %pin|to emit %type|events\"\r\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\r\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\"\r\n    void setEvents(DigitalPin name, PinEventType type) {\r\n        getPin((int)name)->eventOn((int)type);\r\n    }\r\n\r\n    /**\r\n     * Create a new zero-initialized buffer.\r\n     * @param size number of bytes in the buffer\r\n     */\r\n    //%\r\n    Buffer createBuffer(int size)\r\n    {\r\n        return ManagedBuffer(size).leakData();\r\n    }\r\n\r\n    /**\r\n     * Read `size` bytes from a 7-bit I2C `address`.\r\n     */\r\n    //%\r\n    Buffer i2cReadBuffer(int address, int size, bool repeat = false)\r\n    {\r\n      Buffer buf = createBuffer(size);\r\n      uBit.i2c.read(address << 1, (char*)buf->payload, size, repeat);\r\n      return buf;\r\n    }\r\n\r\n    /**\r\n     * Write bytes to a 7-bit I2C `address`.\r\n     */\r\n    //%\r\n    void i2cWriteBuffer(int address, Buffer buf, bool repeat = false)\r\n    {\r\n      uBit.i2c.write(address << 1, (char*)buf->payload, buf->length, repeat);\r\n    }\r\n\r\n    SPI* spi = NULL;\r\n    SPI* allocSPI() {\r\n        if (NULL == spi)\r\n            spi = new SPI(MOSI, MISO, SCK);\r\n        return spi;\r\n    }\r\n\r\n    /**\r\n    * Write to the SPI slave and return the response\r\n    * @param value Data to be sent to the SPI slave\r\n    */\r\n    //% help=pins/spi-write weight=5 advanced=true\r\n    //% blockId=spi_write block=\"spi write %value\"\r\n    int spiWrite(int value) {\r\n        auto p = allocSPI();\r\n        return p->write(value);\r\n    }\r\n\r\n    /**\r\n    * Sets the SPI frequency\r\n    * @param frequency the clock frequency, eg: 1000000\r\n    */\r\n    //% help=pins/spi-frequency weight=4 advanced=true\r\n    //% blockId=spi_frequency block=\"spi frequency %frequency\"\r\n    void spiFrequency(int frequency) {\r\n        auto p = allocSPI();\r\n        p->frequency(frequency);\r\n    }\r\n\r\n    /**\r\n    * Sets the SPI bits and mode\r\n    * @param bits the number of bits, eg: 8\r\n    * @param mode the mode, eg: 3\r\n    */\r\n    //% help=pins/spi-format weight=3 advanced=true\r\n    //% blockId=spi_format block=\"spi format|bits %bits|mode %mode\"\r\n    void spiFormat(int bits, int mode) {\r\n        auto p = allocSPI();\r\n        p->format(bits, mode);        \r\n    }\r\n\r\n    /**\r\n    * Sets the MOSI, MISO, SCK pins used by the SPI instance\r\n    *\r\n    */\r\n    //% help=pins/spi-pins weight=2 advanced=true\r\n    //% blockId=spi_pins block=\"spi set pins|MOSI %mosi|MISO %miso|SCK %sck\"\r\n    //% mosi.fieldEditor=\"gridpicker\" mosi.fieldOptions.columns=4\r\n    //% mosi.fieldOptions.tooltips=\"false\" mosi.fieldOptions.width=\"300\"\r\n    //% miso.fieldEditor=\"gridpicker\" miso.fieldOptions.columns=4\r\n    //% miso.fieldOptions.tooltips=\"false\" miso.fieldOptions.width=\"300\"\r\n    //% sck.fieldEditor=\"gridpicker\" sck.fieldOptions.columns=4\r\n    //% sck.fieldOptions.tooltips=\"false\" sck.fieldOptions.width=\"300\"\r\n    void spiPins(DigitalPin mosi, DigitalPin miso, DigitalPin sck) {\r\n        if (NULL != spi) {\r\n            delete spi;\r\n            spi = NULL;\r\n        }\r\n\r\n        spi = new SPI(getPin((int)mosi)->name, getPin((int)miso)->name, getPin((int)sck)->name);\r\n    }\r\n}\r\n",
      "pins.ts": "/**\n * Control currents in Pins for analog/digital signals, servos, i2c, ...\n */\n//% color=#A80000 weight=30 icon=\"\\uf140\"\n//% advanced=true\nnamespace pins {\n    /**\n     * Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.\n     * @param value value to map in ranges\n     * @param fromLow the lower bound of the value's current range\n     * @param fromHigh the upper bound of the value's current range, eg: 1023\n     * @param toLow the lower bound of the value's target range\n     * @param toHigh the upper bound of the value's target range, eg: 4\n     */\n    //% help=pins/map weight=23\n    //% blockId=math_map block=\"map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh\"\n    export function map(value: number, fromLow: number, fromHigh: number, toLow: number, toHigh: number): number {\n        return ((value - fromLow) * (toHigh - toLow)) / (fromHigh - fromLow) + toLow;\n    }\n\n    /**\n     * Read one number from 7-bit I2C address.\n     */\n    //% help=pins/i2c-read-number blockGap=8 advanced=true\n    //% blockId=pins_i2c_readnumber block=\"i2c read number|at address %address|of format %format=i2c_sizeof|repeated %repeat\" weight=7\n    export function i2cReadNumber(address: number, format: NumberFormat, repeated?: boolean): number {\n        let buf = pins.i2cReadBuffer(address, pins.sizeOf(format), repeated)\n        return buf.getNumber(format, 0)\n    }\n\n    /**\n     * Write one number to a 7-bit I2C address.\n     */\n    //% help=pins/i2c-write-number blockGap=8 advanced=true\n    //% blockId=i2c_writenumber block=\"i2c write number|at address %address|with value %value|of format %format=i2c_sizeof|repeated %repeat\" weight=6\n    export function i2cWriteNumber(address: number, value: number, format: NumberFormat, repeated?: boolean): void {\n        let buf = createBuffer(pins.sizeOf(format))\n        buf.setNumber(format, 0, value)\n        pins.i2cWriteBuffer(address, buf, repeated)\n    }\n\n    /**\n     * Get the size in bytes of specified number format.\n     */\n    //%\n    export function sizeOf(format: NumberFormat) {\n        switch (format) {\n            case NumberFormat.Int8LE:\n            case NumberFormat.UInt8LE:\n            case NumberFormat.Int8BE:\n            case NumberFormat.UInt8BE:\n                return 1;\n            case NumberFormat.Int16LE:\n            case NumberFormat.UInt16LE:\n            case NumberFormat.Int16BE:\n            case NumberFormat.UInt16BE:\n                return 2;\n            case NumberFormat.Int32LE:\n            case NumberFormat.Int32BE:\n                return 4;\n        }\n        return 0;\n    }\n}\n\n\ninterface Buffer {\n    [index: number]: number;\n    // rest defined in buffer.cpp\n}\n",
      "pxt-core.d.ts": "/// <reference no-default-lib=\"true\"/>\n\ninterface Array<T> {\n    /**\n      * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.\n      */\n    //% shim=Array_::length weight=84\n    //% blockId=\"lists_length\" block=\"length of %VALUE\" blockBuiltin=true blockNamespace=\"arrays\"\n    length: number;\n\n    /**\n      * Append a new elements to an array.\n      * @param item to append to the Array.\n      */\n    //% help=arrays/push\n    //% shim=Array_::push weight=75\n    //% blockId=\"array_push\" block=\"%list| add value %value| to end\" blockNamespace=\"arrays\"\n    push(item: T): void;\n\n    /**\n      * Remove the last element from an array and return it.\n      */\n    //% help=arrays/pop\n    //% shim=Array_::pop weight=74\n    //% blockId=\"array_pop\" block=\"get and remove last value from %list\" blockNamespace=\"arrays\"\n    pop(): T;\n\n    /**\n      * Reverse the elements in an array. The first array element becomes the last, and the last array element becomes the first.\n      */\n    //% help=arrays/reverse\n    //% helper=arrayReverse weight=10 advanced=true\n    //% blockId=\"array_reverse\" block=\"reverse %list\" blockNamespace=\"arrays\"\n    reverse(): void;\n\n    /**\n      * Remove the first element from an array and return it. This method changes the length of the array.\n      */\n    //% help=arrays/shift\n    //% helper=arrayShift weight=70 advanced=true\n    //% blockId=\"array_shift\" block=\"get and remove first value from %list\" blockNamespace=\"arrays\"\n    shift(): T;\n\n    /**\n      * Add one element to the beginning of an array and return the new length of the array.\n      * @param value to insert at the start of the Array.\n      */\n    //% help=arrays/unshift\n    //% helper=arrayUnshift weight=69 advanced=true\n    //% blockId=\"array_unshift\" block=\"%list| insert %value| at beginning\" blockNamespace=\"arrays\"\n    //unshift(...values:T[]): number; //rest is not supported in our compiler yet.\n    unshift(value:T): number;\n\n    /**\n      * Return a section of an array.\n      * @param start The beginning of the specified portion of the array. eg: 0\n      * @param end The end of the specified portion of the array. eg: 0\n      */\n    //% help=arrays/slice\n    //% helper=arraySlice weight=41 advanced=true blockNamespace=\"arrays\"\n    slice(start: number, end: number): T[];\n\n    /**\n      * Remove elements from an array.\n      * @param start The zero-based location in the array from which to start removing elements. eg: 0\n      * @param deleteCount The number of elements to remove. eg: 0\n      */\n    //% helper=arraySplice weight=40\n    splice(start: number, deleteCount: number): void;\n\n    /**\n      * Sort the elements of an array in place and returns the array. The sort is not necessarily stable.\n      * @param specifies a function that defines the sort order. If omitted, the array is sorted according to the prmitive type\n      */\n    //% helper=arraySort weight=40\n    sort(callbackfn?: (value1: T, value2: T) => number): T[];\n\n    /**\n      * Call a defined callback function on each element of an array, and return an array containing the results.\n      * @param callbackfn A function that accepts up to two arguments. The map method calls the callbackfn function one time for each element in the array.\n      */\n    //% helper=arrayMap weight=40\n    map<U>(callbackfn: (value: T, index: number) => U): U[];\n\n    /**\n      * Return the elements of an array that meet the condition specified in a callback function.\n      * @param callbackfn A function that accepts up to two arguments. The filter method calls the callbackfn function one time for each element in the array.\n      */\n    //% helper=arrayFilter weight=40\n    filter(callbackfn: (value: T, index: number) => boolean): T[];\n\n    /**\n      * Call the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.\n      * @param callbackfn A function that accepts up to three arguments. The reduce method calls the callbackfn function one time for each element in the array.\n      * @param initialValue Initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.\n      */\n    //% helper=arrayReduce weight=40\n    reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U;\n\n\n    /**\n     * Remove the first occurence of an object. Return true if removed.\n     */\n    //% shim=Array_::removeElement weight=48\n    removeElement(element:T) : boolean;\n\n    /** \n     * Remove the element at a certain index.\n     * @param index the zero-based position in the list to remove the value from, eg: 0\n     */\n    //% help=arrays/remove-at\n    //% shim=Array_::removeAt weight=49 advanced=true\n    //% blockId=\"array_removeat\" block=\"%list| remove value at %index\" blockNamespace=\"arrays\"\n    removeAt(index:number) : T;\n\n    /**\n     * Insert the value at a particular index, increase the array length by 1.\n     * @param index the zero-based position in the list to insert the value, eg: 0\n     * @param value to insert, eg: 0\n     */\n    //% help=arrays/insert-at\n    //% shim=Array_::insertAt weight=84 advanced=true\n    //% blockId=\"array_insertAt\" block=\"%list| insert at %index| value %value\" blockNamespace=\"arrays\"\n    insertAt(index:number, value: T) : void;\n\n    /**\n      * Return the index of the first occurrence of a value in an array.\n      * @param item The value to locate in the array.\n      * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.\n      */\n    //% help=arrays/index-of\n    //% shim=Array_::indexOf weight=50 advanced=true\n    //% blockId=\"array_indexof\" block=\"%list| find index of %value\" blockNamespace=\"arrays\"\n    indexOf(item: T, fromIndex?: number): number;\n\n    /**\n     * Get the value at a particular index.\n     * @param index the zero-based position in the list of the item, eg: 0\n     */\n    //% help=arrays/get\n    //% shim=Array_::getAt weight=85\n    get(index: number): T;\n\n    /**\n     * Store a value at a particular index.\n     * @param index the zero-based position in the list to store the value, eg: 0\n     * @param the value to insert, eg: 0\n     */\n    //% help=arrays/set\n    //% shim=Array_::setAt weight=84\n    set(index: number, value : T) : void;\n\n    [n: number]: T;\n}\n\ndeclare interface String {\n    // This block is currently disabled in favor of the built-in Blockly \"Create text with\" block, which compiles to \"\" + \"\"\n    // Add % sign back to the block annotation to re-enable\n    /**\n     * Returns a string that contains the concatenation of two or more strings.\n     * @param other The string to append to the end of the string, eg: \"add me!\"\n     */\n    //% shim=String_::concat weight=80\n    //% blockId=\"string_concat\" blockNamespace=\"text\"\n    // block=\"join %list=text|%other\"\n    concat(other: string): string;\n\n    /**\n     * Return the character at the specified index.\n     * @param index The zero-based index of the desired character, eg: 0\n     */\n    //% shim=String_::charAt weight=77\n    //% help=text/char-at\n    //% blockId=\"string_get\" block=\"char from %this=text|at %pos\" blockNamespace=\"text\"\n    charAt(index: number): string;\n\n    /** Return the length of a String object. */\n    //% property shim=String_::length weight=75\n    //% blockId=\"text_length\" block=\"length of %VALUE\" blockBuiltin=true blockNamespace=\"text\"\n    length: number;\n\n    /**\n     * Return the Unicode value of the character at the specified location.\n     * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.\n     */\n    //% shim=String_::charCodeAt\n    charCodeAt(index: number): number;\n\n    /**\n     * See how the order of characters in two strings is different (in ASCII encoding).\n     * @param that String to compare to target string\n     */\n    //% shim=String_::compare\n    //% help=text/compare\n    //% blockId=\"string_compare\" block=\"compare %this=text| to %that\" blockNamespace=\"text\"\n    compare(that: string): number;\n\n    /**\n     * Return a substring of the current string.\n     * @param start first character index; can be negative from counting from the end, eg: 0\n     * @param length number of characters to extract, eg: 3\n     */\n    //% shim=String_::substr length.defl=1000000\n    //% help=text/substr\n    //% blockId=\"string_substr\" block=\"substring of %this=text|from %start|of length %length\" blockNamespace=\"text\"\n    substr(start: number, length?: number): string;\n\n    // This block is currently disabled, as it does not compile in some targets\n    // Add % sign back to the block annotation to re-enable\n    /** Returns a value indicating if the string is empty */\n    //% shim=String_::isEmpty\n    //% blockId=\"string_isempty\" blockNamespace=\"text\"\n    // block=\"%this=text| is empty\"\n    isEmpty(): boolean;\n\n\n    [index: number]: string;\n}\n\n/**\n  * Convert A string to an integer.\n  * @param s A string to convert into a number.\n  */\n//% shim=String_::toNumber\n//% help=text/parse-int\n//% blockId=\"string_parseint\" block=\"parse to integer %text\" blockNamespace=\"text\"\ndeclare function parseInt(text: string): number;\n\ninterface Object {}\ninterface Function {}\ninterface IArguments {}\ninterface RegExp {}\n\ntype uint8 = number;\ntype uint16 = number;\n//type uint32 = number;\ntype int8 = number;\ntype int16 = number;\ntype int32 = number;\n\n\ndeclare interface Boolean {\n    /**\n     * Returns a string representation of an object.\n     */\n    //% shim=Boolean_::toString\n    toString(): string;\n}\n\n/**\n * Combine, split, and search text strings.\n */\n//% blockNamespace=\"Text\"\ndeclare namespace String {\n\n    /**\n     * Make a string from the given ASCII character code.\n     */\n    //% help=math/from-char-code\n    //% shim=String_::fromCharCode\n    //% advanced=true\n    //% blockNamespace=\"Math\" blockId=\"stringFromCharCode\" block=\"text from char code %code\" weight=1\n    function fromCharCode(code: number): string;\n}\n\n\ndeclare interface Number {\n    /**\n     * Return a string representation of a number.\n     */\n    //% shim=Number_::toString\n    toString(): string;\n}\n\n/**\n * Add, remove, and replace items in lists.\n */\n//% blockNamespace=\"Arrays\"\ndeclare namespace Array {\n}\n\n/**\n * More complex operations with numbers.\n */\ndeclare namespace Math {\n\n    /**\n     * Return the value of a base expression taken to a specified power.\n     * @param x The base value of the expression.\n     * @param y The exponent value of the expression.\n     */\n    //% shim=Math_::pow\n    function pow(x: number, y: number): number;\n\n    /**\n     * Return a pseudorandom number between 0 and `limit`.\n     * @param limit the upper bound of the number generated, eg: 4\n     */\n    //% blockId=\"device_random\" block=\"pick random 0 to %limit\" blockGap=8\n    //% help=math/random\n    //% shim=Math_::random\n    function random(limit: number): number;\n\n    /**\n     * Return the square root of a number.\n     * @param x A numeric expression.\n     */\n    //% shim=Math_::sqrt\n    function sqrt(x: number): number;\n\n}\n",
      "pxt-helpers.ts": "type Action = () => void;\n\nnamespace helpers {\n    export function arraySplice<T>(arr: T[], start: number, len: number) {\n        if (start < 0) {\n            return;\n        }\n        for (let i = 0; i < len; ++i) {\n            arr.removeAt(start)\n        }\n    }\n\n    export function arrayReverse<T>(arr: T[]) : void {\n        let len = arr.length;\n        for (let i = 0; i < len/2; i++)\n        {\n            swap(arr, i, len - i - 1);\n        }\n    }\n\n    export function arrayShift<T>(arr: T[]) : T {\n        return arr.removeAt(0);\n    }\n\n/*TODO: Enable this multiple value unshift, after rest is enabled in our compiler.\n    export function arrayUnshift<T>(arr: T[], ...values: T[]) : number {\n        for(let i = values.length; i > 0; --i) {\n            arr.insertAt(0, values[i - 1]);\n        }\n        return arr.length;\n    }\n*/\n    export function arrayUnshift<T>(arr: T[], value: T) : number {\n        arr.insertAt(0, value);\n       return arr.length;\n    }\n\n    function swap<T>(arr: T[], i : number, j: number) : void {\n        let temp : T = arr[i];\n        arr[i] = arr[j];\n        arr[j] = temp;\n    }\n\n    function sortHelper<T>(arr: T[], callbackfn ?: (value1: T, value2: T) => number) : T[] {\n        if (arr.length <= 0 || !callbackfn) {\n            return arr;\n        }\n        let len = arr.length;\n        // simple selection sort.\n        for (let i = 0; i < len - 1; ++i) {\n            for (let j = i + 1; j < len; ++j)\n            {\n                if (callbackfn(arr[i], arr[j]) > 0) {\n                    swap(arr, i, j);\n                }\n            }\n        }\n        return arr;\n    }\n\n    export function arraySort<T>(arr: T[], callbackfn?: (value1: T, value2: T) => number): T[] {\n        if (!callbackfn) {\n            //TODO: support native strings and number sorting\n            /* callbackfn = function (value1: string, value2: string) : number {\n                return value1.compare(value2);\n                }*/\n        }\n        return sortHelper(arr, callbackfn);\n    }\n\n    export function arrayMap<T, U>(arr: T[], callbackfn: (value: T, index: number) => U): U[] {\n        let res: U[] = []\n        let len = arr.length // caching this seems to match V8\n        for (let i = 0; i < len; ++i) {\n            res.push(callbackfn(arr[i], i))\n        }\n        return res\n    }\n\n    export function arrayFilter<T>(arr: T[], callbackfn: (value: T, index: number) => boolean): T[] {\n        let res: T[] = []\n        let len = arr.length\n        for (let i = 0; i < len; ++i) {\n            let v = arr[i] // need to cache\n            if (callbackfn(v, i)) res.push(v)\n        }\n        return res\n    }\n\n    export function arrayReduce<T, U>(arr: T[], callbackfn: (previousValue: U, currentValue: T, currentIndex: number) => U, initialValue: U): U {\n        let len = arr.length\n        for (let i = 0; i < len; ++i) {\n            initialValue = callbackfn(initialValue, arr[i], i)\n        }\n        return initialValue\n    }\n\n    export function arraySlice<T>(arr: T[], start: number, end: number): T[] {\n        const res: T[] = [];\n        const len = arr.length;\n\n        if (start < 0) {\n            start = Math.max(len + start, 0);\n        }\n\n        if (end < 0) {\n            end = len + end;\n        }\n\n        const sliceLength = end - start;\n\n        for (let i = 0; i < sliceLength; ++i) {\n            const index = i + start;\n            if (index >= len) {\n                break;\n            }\n            res.push(arr[index]);\n        }\n        return res;\n    }\n}\n\nnamespace Math {\n    export function clamp(min: number, max: number, value: number): number {\n        return Math.min(max, Math.max(min, value));\n    }\n\n    /**\n      * Returns the absolute value of a number (the value without regard to whether it is positive or negative).\n      * For example, the absolute value of -5 is the same as the absolute value of 5.\n      * @param x A numeric expression for which the absolute value is needed.\n      */\n    export function abs(x: number): number {\n        return x < 0 ? -x : x;\n    }\n\n    /**\n      * Returns the sign of the x, indicating whether x is positive, negative or zero.\n      * @param x The numeric expression to test\n      */\n    export function sign(x: number): number {\n        if (x == 0) return 0;\n        if (x > 0) return 1;\n        return -1;\n    }\n\n    /**\n      * Returns the larger of two supplied numeric expressions.\n      */\n    export function max(a: number, b: number): number {\n        if (a >= b) return a;\n        return b;\n    }\n\n    /**\n      * Returns the smaller of two supplied numeric expressions.\n      */\n    export function min(a: number, b: number): number {\n        if (a <= b) return a;\n        return b;\n    }\n}\n",
      "pxt.cpp": "#include \"pxt.h\"\r\n#include <map>\r\n\r\nMicroBit uBit;\r\n\r\nnamespace pxt {\r\n    int incr(uint32_t e)\r\n    {\r\n      if (e) {\r\n        if (hasVTable(e))\r\n          ((RefObject*)e)->ref();\r\n        else\r\n          ((RefCounted*)e)->incr();\r\n      }\r\n      return e;\r\n    }\r\n\r\n    void decr(uint32_t e)\r\n    {\r\n      if (e) {\r\n        if (hasVTable(e))\r\n          ((RefObject*)e)->unref();\r\n        else\r\n          ((RefCounted*)e)->decr();\r\n      }\r\n    }\r\n\r\n    Action mkAction(int reflen, int totallen, int startptr)\r\n    {\r\n      check(0 <= reflen && reflen <= totallen, ERR_SIZE, 1);\r\n      check(reflen <= totallen && totallen <= 255, ERR_SIZE, 2);\r\n      check(bytecode[startptr] == 0xffff, ERR_INVALID_BINARY_HEADER, 3);\r\n      check(bytecode[startptr + 1] == 0, ERR_INVALID_BINARY_HEADER, 4);\r\n\r\n      uint32_t tmp = (uint32_t)&bytecode[startptr];\r\n\r\n      if (totallen == 0) {\r\n        return tmp; // no closure needed\r\n      }\r\n\r\n      void *ptr = ::operator new(sizeof(RefAction) + totallen * sizeof(uint32_t));\r\n      RefAction *r = new (ptr) RefAction();\r\n      r->len = totallen;\r\n      r->reflen = reflen;\r\n      r->func = (ActionCB)((tmp + 4) | 1);\r\n      memset(r->fields, 0, r->len * sizeof(uint32_t));\r\n\r\n      return (Action)r;\r\n    }\r\n\r\n    uint32_t runAction3(Action a, int arg0, int arg1, int arg2)\r\n    {\r\n      if (hasVTable(a))\r\n        return ((RefAction*)a)->runCore(arg0, arg1, arg2);\r\n      else {\r\n        check(*(uint16_t*)a == 0xffff, ERR_INVALID_BINARY_HEADER, 4);\r\n        return ((ActionCB)((a + 4) | 1))(NULL, arg0, arg1, arg2);\r\n      }\r\n    }\r\n\r\n    uint32_t runAction2(Action a, int arg0, int arg1)\r\n    {\r\n      return runAction3(a, arg0, arg1, 0);\r\n    }\r\n\r\n    uint32_t runAction1(Action a, int arg0)\r\n    {\r\n      return runAction3(a, arg0, 0, 0);\r\n    }\r\n\r\n    uint32_t runAction0(Action a)\r\n    {\r\n      return runAction3(a, 0, 0, 0);\r\n    }\r\n\r\n    RefRecord* mkClassInstance(int vtableOffset)\r\n    {\r\n      VTable *vtable = (VTable*)&bytecode[vtableOffset];\r\n\r\n      intcheck(vtable->methods[0] == &RefRecord_destroy, ERR_SIZE, 3);\r\n      intcheck(vtable->methods[1] == &RefRecord_print, ERR_SIZE, 4);\r\n\r\n      void *ptr = ::operator new(vtable->numbytes);\r\n      RefRecord *r = new (ptr) RefRecord(PXT_VTABLE_TO_INT(vtable));\r\n      memset(r->fields, 0, vtable->numbytes - sizeof(RefRecord));\r\n      return r;\r\n    }\r\n\r\n    uint32_t RefRecord::ld(int idx)\r\n    {\r\n      //intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, ERR_OUT_OF_BOUNDS, 1);\r\n      return fields[idx];\r\n    }\r\n\r\n    uint32_t RefRecord::ldref(int idx)\r\n    {\r\n      //printf(\"LD %p len=%d reflen=%d idx=%d\\n\", this, len, reflen, idx);\r\n      //intcheck(0 <= idx && idx < reflen, ERR_OUT_OF_BOUNDS, 2);\r\n      uint32_t tmp = fields[idx];\r\n      incr(tmp);\r\n      return tmp;\r\n    }\r\n\r\n    void RefRecord::st(int idx, uint32_t v)\r\n    {\r\n      //intcheck((reflen == 255 ? 0 : reflen) <= idx && idx < len, ERR_OUT_OF_BOUNDS, 3);\r\n      fields[idx] = v;\r\n    }\r\n\r\n    void RefRecord::stref(int idx, uint32_t v)\r\n    {\r\n      //printf(\"ST %p len=%d reflen=%d idx=%d\\n\", this, len, reflen, idx);\r\n      //intcheck(0 <= idx && idx < reflen, ERR_OUT_OF_BOUNDS, 4);\r\n      decr(fields[idx]);\r\n      fields[idx] = v;\r\n    }\r\n\r\n    void RefObject::destroy() {\r\n      ((RefObjectMethod)getVTable()->methods[0])(this);\r\n    }\r\n\r\n    void RefObject::print() {\r\n      ((RefObjectMethod)getVTable()->methods[1])(this);\r\n    }\r\n\r\n    void RefRecord_destroy(RefRecord *r) {\r\n        auto tbl = r->getVTable();\r\n        uint8_t *refmask = (uint8_t*)&tbl->methods[tbl->userdata & 0xff];\r\n        int len = (tbl->numbytes >> 2) - 1;\r\n        for (int i = 0; i < len; ++i) {\r\n          if (refmask[i]) decr(r->fields[i]);\r\n          r->fields[i] = 0;\r\n        }\r\n        //RefRecord is allocated using placement new\r\n        r->~RefRecord();\r\n        ::operator delete(r);\r\n    }\r\n\r\n    void RefRecord_print(RefRecord *r)\r\n    {\r\n      printf(\"RefRecord %p r=%d size=%d bytes\\n\", r, r->refcnt, r->getVTable()->numbytes);\r\n    }\r\n\r\n    uint32_t Segment::get(uint32_t i)\r\n    {\r\n#ifdef DEBUG_BUILD\r\n      printf(\"In Segment::get index:%u\\n\", i);\r\n      this->print();\r\n#endif\r\n\r\n      if (i < length)\r\n      {\r\n          return data[i];\r\n      }\r\n      return Segment::DefaultValue;\r\n    }\r\n\r\n    void Segment::set(uint32_t i, uint32_t value)\r\n    {\r\n        if (i < size)\r\n        {\r\n          data[i] = value;\r\n        }\r\n        else if (i < Segment::MaxSize)\r\n        {\r\n          growByMin(i + 1);\r\n          data[i] = value;\r\n        }\r\n        if (length <= i)\r\n        {\r\n           length = i + 1;\r\n        }\r\n\r\n#ifdef DEBUG_BUILD\r\n        printf(\"In Segment::set\\n\");\r\n        this->print();\r\n#endif\r\n\r\n        return;\r\n    }\r\n\r\n    uint16_t Segment::growthFactor(uint16_t size)\r\n    {\r\n      if (size == 0)\r\n      {\r\n        return 4;\r\n      }\r\n      if (size < 64)\r\n      {\r\n        return size * 2; // Double\r\n      }\r\n      if (size < 512)\r\n      {\r\n        return size * 5/3; //Grow by 1.66 rate\r\n      }\r\n      return size + 256; //Grow by constant rate\r\n    }\r\n\r\n    void Segment::growByMin(uint16_t minSize)\r\n    {\r\n      growBy(max(minSize, growthFactor(size)));\r\n    }\r\n\r\n    void Segment::growBy(uint16_t newSize)\r\n    {\r\n#ifdef DEBUG_BUILD\r\n         printf(\"growBy: %d\\n\", newSize);\r\n         this->print();\r\n#endif\r\n      if (size < newSize)\r\n      {\r\n         //this will throw if unable to allocate\r\n         uint32_t *tmp = (uint32_t*)(::operator new(newSize * sizeof(uint32_t)));\r\n\r\n         //Copy existing data\r\n         if (size)\r\n         {\r\n           memcpy(tmp, data, size * sizeof(uint32_t));\r\n         }\r\n        //fill the rest with default value\r\n         memset(tmp + size, Segment::DefaultValue, (newSize - size) * sizeof(uint32_t));\r\n\r\n         //free older segment;\r\n         ::operator delete(data);\r\n\r\n         data = tmp;\r\n         size = newSize;\r\n\r\n#ifdef DEBUG_BUILD\r\n         printf(\"growBy - after reallocation\\n\");\r\n         this->print();\r\n#endif\r\n\r\n      }\r\n      //else { no shrinking yet; }\r\n      return;\r\n    }\r\n\r\n    void Segment::ensure(uint16_t newSize)\r\n    {\r\n      if (newSize < size)\r\n      {\r\n        return;\r\n      }\r\n      growByMin(newSize);\r\n    }\r\n\r\n    void Segment::setLength(uint32_t newLength)\r\n    {\r\n      if (newLength > size)\r\n      {\r\n        ensure(length);\r\n      }\r\n      length = newLength;\r\n      return;\r\n    }\r\n\r\n    void Segment::push(uint32_t value)\r\n    {\r\n      this->set(length, value);\r\n    }\r\n\r\n    uint32_t Segment::pop()\r\n    {\r\n#ifdef DEBUG_BUILD\r\n      printf(\"In Segment::pop\\n\");\r\n      this->print();\r\n#endif\r\n\r\n      if (length > 0)\r\n      {\r\n        --length;\r\n        uint32_t value = data[length];\r\n        data[length] = Segment::DefaultValue;\r\n        return value;\r\n      }\r\n      return Segment::DefaultValue;\r\n    }\r\n\r\n    //this function removes an element at index i and shifts the rest of the elements to\r\n    //left to fill the gap\r\n    uint32_t Segment::remove(uint32_t i)\r\n    {\r\n#ifdef DEBUG_BUILD\r\n      printf(\"In Segment::remove index:%u\\n\", i);\r\n      this->print();\r\n#endif\r\n      if (i < length)\r\n      {\r\n        //value to return\r\n        uint32_t ret = data[i];\r\n        if (i + 1 < length)\r\n        {\r\n          //Move the rest of the elements to fill in the gap.\r\n          memmove(data + i, data + i + 1, (length - i - 1) * sizeof(uint32_t));\r\n        }\r\n        length--;\r\n        data[length] = Segment::DefaultValue;\r\n#ifdef DEBUG_BUILD\r\n        printf(\"After Segment::remove index:%u\\n\", i);\r\n        this->print();\r\n#endif\r\n        return ret;\r\n      }\r\n      return Segment::DefaultValue;\r\n    }\r\n\r\n    //this function inserts element value at index i by shifting the rest of the elements right.\r\n    void Segment::insert(uint32_t i, uint32_t value)\r\n    {\r\n#ifdef DEBUG_BUILD\r\n      printf(\"In Segment::insert index:%u value:%u\\n\", i, value);\r\n      this->print();\r\n#endif\r\n\r\n      if (i < length)\r\n      {\r\n        ensure(length + 1);\r\n        if (i + 1 < length)\r\n        {\r\n          //Move the rest of the elements to fill in the gap.\r\n          memmove(data + i + 1, data + i, (length - i) * sizeof(uint32_t));\r\n        }\r\n\r\n        data[i] = value;\r\n        length++;\r\n      }\r\n      else\r\n      {\r\n        //This is insert beyond the length, just call set which will adjust the length\r\n        set(i, value);\r\n      }\r\n#ifdef DEBUG_BUILD\r\n      printf(\"After Segment::insert index:%u\\n\", i);\r\n      this->print();\r\n#endif\r\n    }\r\n\r\n    void Segment::print()\r\n    {\r\n      printf(\"Segment: %x, length: %u, size: %u\\n\", data, (uint32_t)length, (uint32_t)size);\r\n      for(uint32_t i = 0; i < size; i++)\r\n      {\r\n        printf(\"%d \",(uint32_t)data[i]);\r\n      }\r\n      printf(\"\\n\");\r\n    }\r\n\r\n    bool Segment::isValidIndex(uint32_t i)\r\n    {\r\n      if (i > length)\r\n      {\r\n        return false;\r\n      }\r\n      return true;\r\n    }\r\n\r\n    void Segment::destroy()\r\n    {\r\n#ifdef DEBUG_BUILD\r\n      printf(\"In Segment::destroy\\n\");\r\n      this->print();\r\n#endif\r\n      length = size = 0;\r\n      ::operator delete(data);\r\n      data = nullptr;\r\n    }\r\n\r\n    void RefCollection::push(uint32_t x)\r\n    {\r\n      if (isRef()) incr(x);\r\n      head.push(x);\r\n    }\r\n\r\n    uint32_t RefCollection::pop()\r\n    {\r\n      uint32_t ret = head.pop();\r\n      if (isRef())\r\n      {\r\n        incr(ret);\r\n      }\r\n      return ret;\r\n    }\r\n\r\n    uint32_t RefCollection::getAt(int i)\r\n    {\r\n      uint32_t tmp = head.get(i);\r\n      if (isRef())\r\n      {\r\n        incr(tmp);\r\n      }\r\n      return tmp;\r\n    }\r\n\r\n    uint32_t RefCollection::removeAt(int i)\r\n    {\r\n      // no decr() - we return the result\r\n      return head.remove(i);\r\n    }\r\n\r\n    void RefCollection::insertAt(int i, uint32_t value)\r\n    {\r\n      head.insert(i, value);\r\n      if (isRef())\r\n      {\r\n        incr(value);\r\n      }\r\n    }\r\n\r\n    void RefCollection::setAt(int i, uint32_t value)\r\n    {\r\n      if (isRef())\r\n      {\r\n        if (head.isValidIndex((uint32_t)i))\r\n        {\r\n          decr(head.get(i));\r\n        }\r\n        incr(value);\r\n      }\r\n      head.set(i, value);\r\n    }\r\n\r\n    int RefCollection::indexOf(uint32_t x, int start)\r\n    {\r\n      if (isString())\r\n      {\r\n        StringData *xx = (StringData*)x;\r\n        uint32_t i = start;\r\n        while(head.isValidIndex(i))\r\n        {\r\n          StringData *ee = (StringData*)head.get(i);\r\n          if (ee == xx)\r\n          {\r\n            //handles ee being null\r\n            return (int) i;\r\n          }\r\n          if (ee && xx->len == ee->len && memcmp(xx->data, ee->data, xx->len) == 0)\r\n          {\r\n            return (int)i;\r\n          }\r\n          i++;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        uint32_t i = start;\r\n        while(head.isValidIndex(i))\r\n        {\r\n          if (head.get(i) == x)\r\n          {\r\n            return (int)i;\r\n          }\r\n          i++;\r\n        }\r\n      }\r\n\r\n      return -1;\r\n    }\r\n\r\n    int RefCollection::removeElement(uint32_t x)\r\n    {\r\n      int idx = indexOf(x, 0);\r\n      if (idx >= 0) {\r\n        uint32_t elt = removeAt(idx);\r\n        if (isRef()) decr(elt);\r\n        return 1;\r\n      }\r\n      return 0;\r\n    }\r\n\r\n    namespace Coll0 {\r\n      PXT_VTABLE_BEGIN(RefCollection, 0, 0)\r\n      PXT_VTABLE_END\r\n    }\r\n    namespace Coll1 {\r\n      PXT_VTABLE_BEGIN(RefCollection, 1, 0)\r\n      PXT_VTABLE_END\r\n    }\r\n    namespace Coll3 {\r\n      PXT_VTABLE_BEGIN(RefCollection, 3, 0)\r\n      PXT_VTABLE_END\r\n    }\r\n\r\n    RefCollection::RefCollection(uint16_t flags) : RefObject(0) {\r\n      switch (flags) {\r\n        case 0:\r\n          vtable = PXT_VTABLE_TO_INT(&Coll0::RefCollection_vtable);\r\n          break;\r\n        case 1:\r\n          vtable = PXT_VTABLE_TO_INT(&Coll1::RefCollection_vtable);\r\n          break;\r\n        case 3:\r\n          vtable = PXT_VTABLE_TO_INT(&Coll3::RefCollection_vtable);\r\n          break;\r\n        default:\r\n          error(ERR_SIZE);\r\n          break;\r\n      }\r\n    }\r\n\r\n    void RefCollection::destroy()\r\n    {\r\n      if (this->isRef())\r\n      {\r\n        for(uint32_t i = 0; i < this->head.getLength(); i++)\r\n        {\r\n          decr(this->head.get(i));\r\n        }\r\n      }\r\n      this->head.destroy();\r\n      delete this;\r\n    }\r\n\r\n    void RefCollection::print()\r\n    {\r\n      printf(\"RefCollection %p r=%d flags=%d size=%d\\n\", this, refcnt, getFlags(), head.getLength());\r\n      head.print();\r\n    }\r\n\r\n    PXT_VTABLE_CTOR(RefAction) {}\r\n\r\n    // fields[] contain captured locals\r\n    void RefAction::destroy()\r\n    {\r\n      for (int i = 0; i < this->reflen; ++i) {\r\n        decr(fields[i]);\r\n        fields[i] = 0;\r\n      }\r\n      //RefAction is allocated using placement new\r\n      this->~RefAction();\r\n      ::operator delete(this);\r\n    }\r\n\r\n    void RefAction::print()\r\n    {\r\n      printf(\"RefAction %p r=%d pc=0x%lx size=%d (%d refs)\\n\", this, refcnt, (const uint8_t*)func - (const uint8_t*)bytecode, len, reflen);\r\n    }\r\n\r\n    void RefLocal::print()\r\n    {\r\n      printf(\"RefLocal %p r=%d v=%d\\n\", this, refcnt, v);\r\n    }\r\n\r\n    void RefLocal::destroy()\r\n    {\r\n      delete this;\r\n    }\r\n\r\n    PXT_VTABLE_CTOR(RefLocal) {\r\n      v = 0;\r\n    }\r\n\r\n    PXT_VTABLE_CTOR(RefRefLocal) {\r\n      v = 0;\r\n    }\r\n\r\n    void RefRefLocal::print()\r\n    {\r\n      printf(\"RefRefLocal %p r=%d v=%p\\n\", this, refcnt, (void*)v);\r\n    }\r\n\r\n    void RefRefLocal::destroy()\r\n    {\r\n      decr(v);\r\n      delete this;\r\n    }\r\n\r\n    PXT_VTABLE_BEGIN(RefMap, 0, RefMapMarker)\r\n    PXT_VTABLE_END\r\n    RefMap::RefMap() : PXT_VTABLE_INIT(RefMap) {}\r\n\r\n    void RefMap::destroy() {\r\n      for (unsigned i = 0; i < data.size(); ++i) {\r\n        if (data[i].key & 1) {\r\n          decr(data[i].val);\r\n        }\r\n        data[i].val = 0;\r\n      }\r\n      data.resize(0);\r\n      delete this;\r\n    }\r\n\r\n    int RefMap::findIdx(uint32_t key) {\r\n      for (unsigned i = 0; i < data.size(); ++i) {\r\n        if (data[i].key >> 1 == key)\r\n          return i;\r\n      }\r\n      return -1;\r\n    }\r\n\r\n    void RefMap::print()\r\n    {\r\n      printf(\"RefMap %p r=%d size=%d\\n\", this, refcnt, data.size());\r\n    }\r\n\r\n\r\n#ifdef DEBUG_MEMLEAKS\r\n  std::set<RefObject*> allptrs;\r\n  void debugMemLeaks()\r\n  {\r\n    printf(\"LIVE POINTERS:\\n\");\r\n    for(std::set<RefObject*>::iterator itr = allptrs.begin();itr!=allptrs.end();itr++)\r\n    {\r\n      (*itr)->print();\r\n    }\r\n    printf(\"\\n\");\r\n  }\r\n#else\r\n  void debugMemLeaks() {}\r\n#endif\r\n\r\n\r\n    // ---------------------------------------------------------------------------\r\n    // An adapter for the API expected by the run-time.\r\n    // ---------------------------------------------------------------------------\r\n\r\n    map<pair<int, int>, Action> handlersMap;\r\n\r\n    MicroBitEvent lastEvent;\r\n\r\n    // We have the invariant that if [dispatchEvent] is registered against the DAL\r\n    // for a given event, then [handlersMap] contains a valid entry for that\r\n    // event.\r\n    void dispatchEvent(MicroBitEvent e) {\r\n\r\n      lastEvent = e;\r\n\r\n      Action curr = handlersMap[{ e.source, e.value }];\r\n      if (curr)\r\n        runAction1(curr, e.value);\r\n\r\n      curr = handlersMap[{ e.source, MICROBIT_EVT_ANY }];\r\n      if (curr)\r\n        runAction1(curr, e.value);\r\n    }\r\n\r\n    void registerWithDal(int id, int event, Action a) {\r\n      Action prev = handlersMap[{ id, event }];\r\n      if (prev)\r\n        decr(prev);\r\n      else\r\n        uBit.messageBus.listen(id, event, dispatchEvent);\r\n      incr(a);\r\n      handlersMap[{ id, event }] = a;\r\n    }\r\n\r\n    void fiberDone(void *a)\r\n    {\r\n      decr((Action)a);\r\n      release_fiber();\r\n    }\r\n\r\n\r\n    void runInBackground(Action a) {\r\n      if (a != 0) {\r\n        incr(a);\r\n        create_fiber((void(*)(void*))runAction0, (void*)a, fiberDone);\r\n      }\r\n    }\r\n\r\n\r\n  void error(ERROR code, int subcode)\r\n  {\r\n    printf(\"Error: %d [%d]\\n\", code, subcode);\r\n    uBit.panic(42);\r\n  }\r\n\r\n  uint16_t *bytecode;\r\n  uint32_t *globals;\r\n  int numGlobals;\r\n\r\n  uint32_t *allocate(uint16_t sz)\r\n  {\r\n    uint32_t *arr = new uint32_t[sz];\r\n    memset(arr, 0, sz * 4);\r\n    return arr;\r\n  }\r\n\r\n  void checkStr(bool cond, const char *msg)\r\n  {\r\n    if (!cond) {\r\n      while (true) {\r\n        uBit.display.scroll(msg, 100);\r\n        uBit.sleep(100);\r\n      }\r\n    }\r\n  }\r\n\r\n  int templateHash()\r\n  {\r\n    return ((int*)bytecode)[4];\r\n  }\r\n\r\n  int programHash()\r\n  {\r\n    return ((int*)bytecode)[6];\r\n  }\r\n\r\n  int getNumGlobals()\r\n  {\r\n    return bytecode[16];\r\n  }\r\n\r\n  void exec_binary(int32_t *pc)\r\n  {\r\n    // XXX re-enable once the calibration code is fixed and [editor/embedded.ts]\r\n    // properly prepends a call to [internal_main].\r\n    // ::touch_develop::internal_main();\r\n\r\n    // unique group for radio based on source hash\r\n    // ::touch_develop::micro_bit::radioDefaultGroup = programHash();\r\n\r\n    // repeat error 4 times and restart as needed\r\n    microbit_panic_timeout(4);\r\n\r\n    int32_t ver = *pc++;\r\n    checkStr(ver == 0x4209, \":( Bad runtime version\");\r\n\r\n    bytecode = *((uint16_t**)pc++);  // the actual bytecode is here\r\n    globals = allocate(getNumGlobals());\r\n\r\n    // just compare the first word\r\n    checkStr(((uint32_t*)bytecode)[0] == 0x923B8E70 &&\r\n             templateHash() == *pc,\r\n             \":( Failed partial flash\");\r\n\r\n    uint32_t startptr = (uint32_t)bytecode;\r\n    startptr += 48; // header\r\n    startptr |= 1; // Thumb state\r\n\r\n    ((uint32_t (*)())startptr)();\r\n\r\n#ifdef DEBUG_MEMLEAKS\r\n    pxt::debugMemLeaks();\r\n#endif\r\n\r\n    return;\r\n  }\r\n\r\n  void start()\r\n  {\r\n    exec_binary((int32_t*)functionsAndBytecode);\r\n  }\r\n}\r\n\r\n// vim: ts=2 sw=2 expandtab\r\n",
      "pxt.h": "#ifndef __PXT_H\r\n#define __PXT_H\r\n\r\n//#define DEBUG_MEMLEAKS 1\r\n\r\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\r\n\r\n#include \"MicroBit.h\"\r\n#include \"MicroBitImage.h\"\r\n#include \"ManagedString.h\"\r\n#include \"ManagedType.h\"\r\n#include \"ManagedBuffer.h\"\r\n\r\n#define printf(...) uBit.serial.printf(__VA_ARGS__)\r\n// #define printf(...)\r\n\r\n#define intcheck(...) check(__VA_ARGS__)\r\n//#define intcheck(...) do {} while (0)\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <vector>\r\n#include <stdint.h>\r\n\r\n#ifdef DEBUG_MEMLEAKS\r\n#include <set>\r\n#endif\r\n\r\nextern MicroBit uBit;\r\n\r\nnamespace pxt {\r\n  typedef uint32_t Action;\r\n  typedef uint32_t ImageLiteral;\r\n\r\n\r\n  typedef enum {\r\n    ERR_INVALID_BINARY_HEADER = 5,\r\n    ERR_OUT_OF_BOUNDS = 8,\r\n    ERR_REF_DELETED = 7,\r\n    ERR_SIZE = 9,\r\n  } ERROR;\r\n\r\n  extern const uint32_t functionsAndBytecode[];\r\n  extern uint32_t *globals;\r\n  extern uint16_t *bytecode;\r\n  class RefRecord;\r\n\r\n  // Utility functions\r\n  extern MicroBitEvent lastEvent;\r\n  void registerWithDal(int id, int event, Action a);\r\n  void runInBackground(Action a);\r\n  uint32_t runAction3(Action a, int arg0, int arg1, int arg2);\r\n  uint32_t runAction2(Action a, int arg0, int arg1);\r\n  uint32_t runAction1(Action a, int arg0);\r\n  uint32_t runAction0(Action a);\r\n  Action mkAction(int reflen, int totallen, int startptr);\r\n  void error(ERROR code, int subcode = 0);\r\n  void exec_binary(uint16_t *pc);\r\n  void start();\r\n  void debugMemLeaks();\r\n  // allocate [sz] words and clear them\r\n  uint32_t *allocate(uint16_t sz);\r\n  int templateHash();\r\n  int programHash();\r\n  uint32_t programSize();\r\n  uint32_t afterProgramPage();     \r\n  int getNumGlobals();\r\n  RefRecord* mkClassInstance(int vtableOffset);\r\n\r\n  // The standard calling convention is:\r\n  //   - when a pointer is loaded from a local/global/field etc, and incr()ed\r\n  //     (in other words, its presence on stack counts as a reference)\r\n  //   - after a function call, all pointers are popped off the stack and decr()ed\r\n  // This does not apply to the RefRecord and st/ld(ref) methods - they unref()\r\n  // the RefRecord* this.\r\n  int incr(uint32_t e);\r\n  void decr(uint32_t e);\r\n\r\n  inline void *ptrOfLiteral(int offset)\r\n  {\r\n    return &bytecode[offset];\r\n  }\r\n\r\n  inline ImageData* imageBytes(int offset)\r\n  {\r\n    return (ImageData*)(void*)&bytecode[offset];\r\n  }\r\n\r\n  // Checks if object has a VTable, or if its RefCounted* from the runtime.\r\n  inline bool hasVTable(uint32_t e)\r\n  {\r\n    return (*((uint32_t*)e) & 1) == 0;\r\n  }\r\n\r\n  inline void check(int cond, ERROR code, int subcode = 0)\r\n  {\r\n    if (!cond) error(code, subcode);\r\n  }\r\n\r\n\r\n  class RefObject;\r\n#ifdef DEBUG_MEMLEAKS\r\n  extern std::set<RefObject*> allptrs;\r\n#endif\r\n\r\n  typedef void (*RefObjectMethod)(RefObject *self);\r\n  typedef void *PVoid;\r\n  typedef void **PPVoid;\r\n\r\n  const PPVoid RefMapMarker = (PPVoid)(void*)43;\r\n\r\n  struct VTable {\r\n    uint16_t numbytes;  // in the entire object, including the vtable pointer\r\n    uint16_t userdata;\r\n    PVoid *ifaceTable;\r\n    PVoid methods[2]; // we only use up to two methods here; pxt will generate more\r\n    // refmask sits at &methods[nummethods]\r\n  };\r\n\r\n  const int vtableShift = 2;\r\n\r\n  // A base abstract class for ref-counted objects.\r\n  class RefObject\r\n  {\r\n  public:\r\n    uint16_t refcnt;\r\n    uint16_t vtable;\r\n\r\n    RefObject(uint16_t vt)\r\n    {\r\n      refcnt = 2;\r\n      vtable = vt;\r\n#ifdef DEBUG_MEMLEAKS\r\n      allptrs.insert(this);\r\n#endif\r\n    }\r\n\r\n    inline VTable *getVTable() {\r\n      return (VTable*)(vtable << vtableShift);\r\n    }\r\n\r\n    void destroy();\r\n    void print();\r\n\r\n    // Call to disable pointer tracking on the current instance (in destructor or some other hack)\r\n    inline void untrack() {\r\n#ifdef DEBUG_MEMLEAKS\r\n      allptrs.erase(this);\r\n#endif\r\n    }\r\n\r\n    // Increment/decrement the ref-count. Decrementing to zero deletes the current object.\r\n    inline void ref()\r\n    {\r\n      check(refcnt > 0, ERR_REF_DELETED);\r\n      //printf(\"INCR \"); this->print();\r\n      refcnt += 2;\r\n    }\r\n\r\n    inline void unref()\r\n    {\r\n      //printf(\"DECR \"); this->print();\r\n      check(refcnt > 0, ERR_REF_DELETED);\r\n      refcnt -= 2;\r\n      if (refcnt == 0) {\r\n        destroy();\r\n      }\r\n    }\r\n  };\r\n\r\n  class Segment {\r\n  private:    \r\n      uint32_t* data;\r\n      uint16_t length;\r\n      uint16_t size;\r\n\r\n      static const uint16_t MaxSize = 0xFFFF;\r\n      static const uint32_t DefaultValue = 0x0;\r\n\r\n      static uint16_t growthFactor(uint16_t size);      \r\n      void growByMin(uint16_t minSize);\r\n      void growBy(uint16_t newSize);\r\n      void ensure(uint16_t newSize);\r\n\r\n  public:\r\n      Segment() : data (nullptr), length(0), size(0) {};\r\n\r\n      uint32_t get(uint32_t i);\r\n      void set(uint32_t i, uint32_t value);      \r\n\r\n      uint32_t getLength() { return length;};\r\n      void setLength(uint32_t newLength);\r\n\r\n      void push(uint32_t value);\r\n      uint32_t pop();\r\n\r\n      uint32_t remove(uint32_t i);\r\n      void insert(uint32_t i, uint32_t value);\r\n\r\n      bool isValidIndex(uint32_t i);\r\n\r\n      void destroy();\r\n\r\n      void print();\r\n  };\r\n\r\n  // A ref-counted collection of either primitive or ref-counted objects (String, Image,\r\n  // user-defined record, another collection)\r\n  class RefCollection\r\n    : public RefObject\r\n  {\r\n  private:\r\n    Segment head;\r\n  public:\r\n    // 1 - collection of refs (need decr)\r\n    // 2 - collection of strings (in fact we always have 3, never 2 alone)\r\n    inline uint32_t getFlags() { return getVTable()->userdata; }\r\n    inline bool isRef() { return getFlags() & 1; }\r\n    inline bool isString() { return getFlags() & 2; }\r\n\r\n    RefCollection(uint16_t f);\r\n\r\n    void destroy();\r\n    void print();\r\n\r\n    uint32_t length() { return head.getLength();}\r\n    void setLength(uint32_t newLength) { head.setLength(newLength); }\r\n\r\n    void push(uint32_t x);\r\n    uint32_t pop();\r\n    uint32_t getAt(int i);\r\n    void setAt(int i, uint32_t x);\r\n    //removes the element at index i and shifts the other elements left\r\n    uint32_t removeAt(int i);\r\n    //inserts the element at index i and moves the other elements right.\r\n    void insertAt(int i, uint32_t x); \r\n\r\n    int indexOf(uint32_t x, int start);\r\n    int removeElement(uint32_t x);\r\n  };\r\n\r\n  struct MapEntry {\r\n    uint32_t key;\r\n    uint32_t val;\r\n  };\r\n\r\n  class RefMap\r\n    : public RefObject\r\n  {\r\n  public:\r\n    std::vector<MapEntry> data;\r\n\r\n    RefMap();\r\n    void destroy();\r\n    void print();\r\n    int findIdx(uint32_t key);\r\n  };\r\n\r\n  // A ref-counted, user-defined JS object.\r\n  class RefRecord\r\n    : public RefObject\r\n  {\r\n  public:\r\n    // The object is allocated, so that there is space at the end for the fields.\r\n    uint32_t fields[];\r\n\r\n    RefRecord(uint16_t v) : RefObject(v) {}\r\n\r\n    uint32_t ld(int idx);\r\n    uint32_t ldref(int idx);\r\n    void st(int idx, uint32_t v);\r\n    void stref(int idx, uint32_t v);\r\n  };\r\n\r\n  // these are needed when constructing vtables for user-defined classes\r\n  void RefRecord_destroy(RefRecord *r);\r\n  void RefRecord_print(RefRecord *r);\r\n\r\n  class RefAction;\r\n  typedef uint32_t (*ActionCB)(uint32_t *captured, uint32_t arg0, uint32_t arg1, uint32_t arg2);\r\n\r\n  // Ref-counted function pointer. It's currently always a ()=>void procedure pointer.\r\n  class RefAction\r\n    : public RefObject\r\n  {\r\n  public:\r\n    // This is the same as for RefRecord.\r\n    uint8_t len;\r\n    uint8_t reflen;\r\n    ActionCB func; // The function pointer\r\n    // fields[] contain captured locals\r\n    uint32_t fields[];\r\n\r\n    void destroy();\r\n    void print();\r\n\r\n    RefAction();\r\n\r\n    inline void stCore(int idx, uint32_t v)\r\n    {\r\n      //printf(\"ST [%d] = %d \", idx, v); this->print();\r\n      intcheck(0 <= idx && idx < len, ERR_OUT_OF_BOUNDS, 10);\r\n      intcheck(fields[idx] == 0, ERR_OUT_OF_BOUNDS, 11); // only one assignment permitted\r\n      fields[idx] = v;\r\n    }\r\n\r\n    inline uint32_t runCore(int arg0, int arg1, int arg2) // internal; use runAction*() functions\r\n    {\r\n      this->ref();\r\n      uint32_t r = this->func(&this->fields[0], arg0, arg1, arg2);\r\n      this->unref();\r\n      return r;\r\n    }\r\n  };\r\n\r\n  // These two are used to represent locals written from inside inline functions\r\n  class RefLocal\r\n    : public RefObject\r\n  {\r\n  public:\r\n    uint32_t v;\r\n    void destroy();\r\n    void print();\r\n    RefLocal();\r\n  };\r\n\r\n  class RefRefLocal\r\n    : public RefObject\r\n  {\r\n  public:\r\n    uint32_t v;\r\n    void destroy();\r\n    void print();\r\n    RefRefLocal();\r\n  };\r\n}\r\n\r\nusing namespace pxt;\r\nMicroBitPin *getPin(int id);\r\ntypedef ImageData* Image;\r\ntypedef BufferData* Buffer;\r\n\r\n// The ARM Thumb generator in the JavaScript code is parsing\r\n// the hex file and looks for the magic numbers as present here.\r\n//\r\n// Then it fetches function pointer addresses from there.\r\n  \r\n#define PXT_SHIMS_BEGIN \\\r\nnamespace pxt { \\\r\n  const uint32_t functionsAndBytecode[] __attribute__((aligned(0x20))) = { \\\r\n    0x08010801, 0x42424242, 0x08010801, 0x8de9d83e,\r\n\r\n#define PXT_SHIMS_END }; }\r\n\r\n#pragma GCC diagnostic ignored \"-Wpmf-conversions\"\r\n\r\n#define PXT_VTABLE_TO_INT(vt)  ((uint32_t)(vt) >> vtableShift)\r\n#define PXT_VTABLE_BEGIN(classname, flags, iface) \\\r\nconst VTable classname ## _vtable \\\r\n  __attribute__((aligned(1 << vtableShift))) \\\r\n  = { \\\r\n  sizeof(classname), \\\r\n  flags, \\\r\n  iface, \\\r\n  { \\\r\n    (void*)&classname::destroy, \\\r\n    (void*)&classname::print,\r\n\r\n#define PXT_VTABLE_END } };\r\n\r\n#define PXT_VTABLE_INIT(classname) \\\r\n  RefObject(PXT_VTABLE_TO_INT(&classname ## _vtable))\r\n\r\n#define PXT_VTABLE_CTOR(classname) \\\r\n  PXT_VTABLE_BEGIN(classname, 0, 0) PXT_VTABLE_END \\\r\n  classname::classname() : PXT_VTABLE_INIT(classname)\r\n\r\n#endif\r\n\r\n// vim: ts=2 sw=2 expandtab\r\n",
      "pxt.json": "{\n    \"name\": \"core\",\n    \"description\": \"The microbit core library\",\n    \"files\": [\n        \"README.md\",\n        \"ManagedBuffer.cpp\",\n        \"ManagedBuffer.h\",\n        \"pxt.cpp\",\n        \"pxt.h\",\n        \"dal.d.ts\",\n        \"enums.d.ts\",\n        \"shims.d.ts\",\n        \"pxt-core.d.ts\",\n        \"core.cpp\",\n        \"pxt-helpers.ts\",\n        \"helpers.ts\",\n        \"images.cpp\",\n        \"basic.cpp\",\n        \"icons.ts\",\n        \"input.cpp\",\n        \"input.ts\",\n        \"control.ts\",\n        \"control.cpp\",\n        \"game.ts\",\n        \"BitRobot.ts\",\n        \"sendbufferBitRobot.asm\",\n        \"led.cpp\",\n        \"led.ts\",\n        \"music.ts\",\n        \"melodies.ts\",\n        \"pins.cpp\",\n        \"pins.ts\",\n        \"serial.cpp\",\n        \"serial.ts\",\n        \"buffer.cpp\",\n        \"pxtparts.json\",\n        \"parts/speaker.svg\",\n        \"parts/headphone.svg\"\n    ],\n    \"public\": true,\n    \"dependencies\": {},\n    \"yotta\": {\n        \"optionalConfig\": {\n            \"microbit-dal\": {\n                \"bluetooth\": {\n                    \"private_addressing\": 0,\n                    \"advertising_timeout\": 0,\n                    \"tx_power\": 6,\n                    \"dfu_service\": 1,\n                    \"event_service\": 1,\n                    \"device_info_service\": 1,\n                    \"eddystone_url\": 1,\n                    \"eddystone_uid\": 1,\n                    \"open\": 0,\n                    \"pairing_mode\": 1,\n                    \"whitelist\": 1,\n                    \"security_level\": \"SECURITY_MODE_ENCRYPTION_NO_MITM\"\n                }\n            }\n        }\n    }\n}",
      "pxtparts.json": "{ \n     \"buttonpair\": {\n        \"simulationBehavior\": \"buttonpair\",\n        \"visual\": {\n            \"builtIn\": \"buttonpair\",\n            \"width\": 75,\n            \"height\": 45,\n            \"pinDistance\": 15,\n            \"pinLocations\": [\n                {\"x\": 0, \"y\": 0},\n                {\"x\": 30, \"y\": 45},\n                {\"x\": 45, \"y\": 0},\n                {\"x\": 75, \"y\": 45}\n            ]\n        },\n        \"numberOfPins\": 4,\n        \"pinDefinitions\": [\n            {\"target\": \"P14\", \"style\": \"male\", \"orientation\": \"-Z\"},\n            {\"target\": \"ground\", \"style\": \"male\", \"orientation\": \"-Z\"},\n            {\"target\": \"P15\", \"style\": \"male\", \"orientation\": \"-Z\"},\n            {\"target\": \"ground\", \"style\": \"male\", \"orientation\": \"-Z\"}\n        ],\n        \"instantiation\": {\n            \"kind\": \"singleton\"\n        },\n        \"assembly\": [\n            {\"part\": true},\n            {\"pinIndices\": [0, 1]},\n            {\"pinIndices\": [2, 3]}\n        ]\n    },\n    \"microservo\": {\n        \"simulationBehavior\": \"microservo\",\n        \"visual\": {\n            \"builtIn\": \"microservo\",\n            \"width\": 74.85,\n            \"height\": 200,\n            \"pinDistance\": 10,\n            \"pinLocations\": [\n                {\"x\": 30, \"y\": 5},\n                {\"x\": 37, \"y\": 5},\n                {\"x\": 45, \"y\": 5}\n            ]\n        },\n        \"numberOfPins\": 3,\n        \"pinDefinitions\": [\n            {\"target\": {\"pinInstantiationIdx\": 0}, \"style\": \"croc\", \"orientation\": \"+Z\"},\n            {\"target\": \"threeVolt\", \"style\": \"croc\", \"orientation\": \"+Z\"},\n            {\"target\": \"ground\", \"style\": \"croc\", \"orientation\": \"+Z\"}\n        ],\n        \"instantiation\": {\n            \"kind\": \"function\",\n            \"fullyQualifiedName\": \"pins.servoWritePin\",\n            \"argumentRoles\": [\n                {\"pinInstantiationIdx\": 0, \"partParameter\": \"name\"}\n            ]\n        },\n        \"assembly\": [\n            {\"part\": true, \"pinIndices\": [2]},\n            {\"pinIndices\": [0, 1]}\n        ]\n    },\n    \"neopixel\": {\n        \"simulationBehavior\": \"neopixel\",\n        \"visual\": {\n            \"builtIn\": \"neopixel\",\n            \"width\": 58,\n            \"height\": 113,\n            \"pinDistance\": 9,\n            \"pinLocations\": [\n                {\"x\": 10, \"y\": 0},\n                {\"x\": 19, \"y\": 0},\n                {\"x\": 28, \"y\": 0}\n            ]\n        },\n        \"numberOfPins\": 3,\n        \"pinDefinitions\": [\n            {\"target\": {\"pinInstantiationIdx\": 0}, \"style\": \"solder\", \"orientation\": \"+Z\"},\n            {\"target\": \"threeVolt\", \"style\": \"solder\", \"orientation\": \"+Z\"},\n            {\"target\": \"ground\", \"style\": \"solder\", \"orientation\": \"+Z\"}\n        ],\n        \"instantiation\": {\n            \"kind\": \"function\",\n            \"fullyQualifiedName\": \"neopixel.create\",\n            \"argumentRoles\": [\n                {\"pinInstantiationIdx\": 0, \"partParameter\": \"pin\"},\n                {\"partParameter\": \"mode\"}\n            ]\n        },\n        \"assembly\": [\n            {\"part\": true, \"pinIndices\": [2]},\n            {\"pinIndices\": [0, 1]}\n        ]\n    },\n    \"ledmatrix\": {\n        \"visual\": {\n            \"builtIn\": \"ledmatrix\",\n            \"width\": 105,\n            \"height\": 105,\n            \"pinDistance\": 15,\n            \"pinLocations\": [\n                {\"x\": 0, \"y\": 0},\n                {\"x\": 15, \"y\": 0},\n                {\"x\": 30, \"y\": 0},\n                {\"x\": 45, \"y\": 0},\n                {\"x\": 105, \"y\": 105},\n                {\"x\": 0, \"y\": 105},\n                {\"x\": 15, \"y\": 105},\n                {\"x\": 30, \"y\": 105},\n                {\"x\": 45, \"y\": 105},\n                {\"x\": 60, \"y\": 0}\n            ]\n        },\n        \"simulationBehavior\": \"ledmatrix\",\n        \"numberOfPins\": 10,\n        \"instantiation\": {\"kind\": \"singleton\"},\n        \"pinDefinitions\": [\n            {\"target\": \"P6\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 0},\n            {\"target\": \"P7\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 0},\n            {\"target\": \"P8\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 0},\n            {\"target\": \"P9\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 0},\n            {\"target\": \"P10\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 0},\n            {\"target\": \"P12\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 1},\n            {\"target\": \"P13\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 1},\n            {\"target\": \"P16\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 1},\n            {\"target\": \"P19\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 1},\n            {\"target\": \"P20\", \"style\": \"male\", \"orientation\": \"-Z\", \"colorGroup\": 1}\n        ],\n        \"assembly\": [\n            {\"part\": true},\n            {\"pinIndices\": [0, 1, 2, 3, 4]},\n            {\"pinIndices\": [5, 6, 7, 8, 9]}\n        ]\n    },\n    \"headphone\": {\n        \"numberOfPins\": 2,\n        \"visual\": {\n            \"image\": \"parts/headphone.svg\",\n            \"width\": 142,\n            \"height\": 180,\n            \"pinDistance\": 20,\n            \"pinLocations\": [\n                {\"x\": 17, \"y\": 11},\n                {\"x\": 55, \"y\": 50}\n            ]\n        },\n        \"pinDefinitions\": [\n            {\"target\": \"P0\", \"style\": \"croc\", \"orientation\": \"Y\"},\n            {\"target\": \"ground\", \"style\": \"croc\", \"orientation\": \"Y\"}\n        ],\n        \"instantiation\": {\"kind\": \"singleton\"},\n        \"assembly\": [\n            {\"part\": true, \"pinIndices\": [0]},\n            {\"pinIndices\": [1]}\n        ]\n    },\n    \"speaker\": {\n        \"numberOfPins\": 2,\n        \"visual\": {\n            \"image\": \"parts/speaker.svg\",\n            \"width\": 500,\n            \"height\": 500,\n            \"pinDistance\": 70,\n            \"pinLocations\": [\n                {\"x\": 180, \"y\": 135},\n                {\"x\": 320, \"y\": 135}\n            ]\n        },\n        \"pinDefinitions\": [\n            {\"target\": \"P0\", \"style\": \"male\", \"orientation\": \"-Z\"},\n            {\"target\": \"ground\", \"style\": \"male\", \"orientation\": \"-Z\"}\n        ],\n        \"instantiation\": {\"kind\": \"singleton\"},\n        \"assembly\": [\n            {\"part\": true, \"pinIndices\": [0]},\n            {\"pinIndices\": [1]}\n        ]\n    }\n}",
      "sendbufferBitRobot.asm": "sendBufferBitRobotAsm:\r\n\r\n    push {r4,r5,r6,r7,lr}\r\n    \r\n    mov r4, r0 ; save buff\r\n    mov r6, r1 ; save pin\r\n    \r\n    mov r0, r4\r\n    bl BufferMethods::length\r\n    mov r5, r0\r\n    \r\n    mov r0, r4\r\n    bl BufferMethods::getBytes\r\n    mov r4, r0\r\n    \r\n    ; setup pin as digital\r\n    mov r0, r6\r\n    movs r1, #0\r\n    bl pins::digitalWritePin\r\n    \r\n    ; load pin address\r\n    mov r0, r6\r\n    bl pins::getPinAddress\r\n\r\n    ldr r0, [r0, #8] ; get mbed DigitalOut from MicroBitPin\r\n    ldr r1, [r0, #4] ; r1-mask for this pin\r\n    ldr r2, [r0, #16] ; r2-clraddr\r\n    ldr r3, [r0, #12] ; r3-setaddr\r\n    \r\n    cpsid i ; disable irq\r\n    \r\n    b .start\r\n    \r\n.nextbit:               ;            C0\r\n    str r1, [r3, #0]    ; pin := hi  C2\r\n    tst r6, r0          ;            C3\r\n    bne .islate         ;            C4\r\n    str r1, [r2, #0]    ; pin := lo  C6\r\n.islate:\r\n    lsrs r6, r6, #1     ; r6 >>= 1   C7\r\n    bne .justbit        ;            C8\r\n    \r\n    ; not just a bit - need new byte\r\n    adds r4, #1         ; r4++       C9\r\n    subs r5, #1         ; r5--       C10\r\n    bcc .stop           ; if (r5<0) goto .stop  C11\r\n.start:\r\n    movs r6, #0x80      ; reset mask C12\r\n    nop                 ;            C13\r\n\r\n.common:               ;             C13\r\n    str r1, [r2, #0]   ; pin := lo   C15\r\n    ; always re-load byte - it just fits with the cycles better this way\r\n    ldrb r0, [r4, #0]  ; r0 := *r4   C17\r\n    b .nextbit         ;             C20\r\n\r\n.justbit: ; C10\r\n    ; no nops, branch taken is already 3 cycles\r\n    b .common ; C13\r\n\r\n.stop:    \r\n    str r1, [r2, #0]   ; pin := lo\r\n    cpsie i            ; enable irq\r\n\r\n    pop {r4,r5,r6,r7,pc}\r\n\r\n\r\n",
      "serial.cpp": "#include \"pxt.h\"\r\n\r\n#define MICROBIT_SERIAL_READ_BUFFER_LENGTH 64\r\n\r\nenum SerialPin {\r\n    P0 = MICROBIT_ID_IO_P0,\r\n    P1 = MICROBIT_ID_IO_P1,\r\n    P2 = MICROBIT_ID_IO_P2,\r\n    P8 = MICROBIT_ID_IO_P8,\r\n    P12 = MICROBIT_ID_IO_P12,\r\n    P13 = MICROBIT_ID_IO_P13,\r\n    P14 = MICROBIT_ID_IO_P14,\r\n    P15 = MICROBIT_ID_IO_P15,\r\n    P16 = MICROBIT_ID_IO_P16\r\n};\r\n\r\nenum BaudRate {\r\n  //% block=115200\r\n  BaudRate115200 = 115200,\r\n  //% block=57600\r\n  BaudRate57600 = 57600,\r\n  //% block=38400\r\n  BaudRate38400 = 38400,\r\n  //% block=31250\r\n  BaudRate31250 = 31250,\r\n  //% block=28800\r\n  BaudRate28800 = 28800,\r\n  //% block=19200\r\n  BaudRate19200 = 19200,\r\n  //% block=14400\r\n  BaudRate14400 = 14400,\r\n  //% block=9600\r\n  BaudRate9600 = 9600,\r\n  //% block=4800\r\n  BaudRate4800 = 4800,\r\n  //% block=2400\r\n  BaudRate2400 = 2400,\r\n  //% block=1200\r\n  BaudRate1200 = 1200,\r\n  //% block=300\r\n  BaudRate300 = 300\r\n};\r\n\r\nenum Delimiters {\r\n    //% block=\"new line\"\r\n    NewLine = 1,\r\n    //% block=\",\"\r\n    Comma = 2,\r\n    //% block=\"$\"\r\n    Dollar = 3,\r\n    //% block=\":\"\r\n    Colon = 4,\r\n    //% block=\".\"\r\n    Fullstop = 5,\r\n    //% block=\"#\"\r\n    Hash = 6,\r\n};\r\n\r\n//% weight=2 color=#002050 icon=\"\\uf287\"\r\n//% advanced=true\r\nnamespace serial {\r\n    // note that at least one // followed by % is needed per declaration!\r\n\r\n    /**\r\n     * Read a line of text from the serial port and return the buffer when the delimiter is met.\r\n     * @param delimiter text delimiter that separates each text chunk\r\n     */\r\n    //% help=serial/read-until\r\n    //% blockId=serial_read_until block=\"serial|read until %delimiter=serial_delimiter_conv\"\r\n    //% weight=19\r\n    StringData* readUntil(StringData* delimiter) {\r\n      return uBit.serial.readUntil(ManagedString(delimiter)).leakData();\r\n    }\r\n\r\n    /**\r\n    * Read the buffered received data as a string\r\n    */\r\n    //% help=serial/read-string\r\n    //% blockId=serial_read_buffer block=\"serial|read string\"\r\n    //% weight=18\r\n    StringData* readString() {\r\n      int n = uBit.serial.getRxBufferSize();\r\n      if (n == 0) return ManagedString(\"\").leakData();\r\n      return ManagedString(uBit.serial.read(n, MicroBitSerialMode::ASYNC)).leakData();\r\n    }\r\n\r\n    /**\r\n    * Register an event to be fired when one of the delimiter is matched.\r\n    * @param delimiters the characters to match received characters against.\r\n    */\r\n    //% help=serial/on-data-received\r\n    //% weight=18 blockId=serial_on_data_received block=\"serial|on data received %delimiters=serial_delimiter_conv\"\r\n    void onDataReceived(StringData* delimiters, Action body) {\r\n      uBit.serial.eventOn(ManagedString(delimiters));\r\n      registerWithDal(MICROBIT_ID_SERIAL, MICROBIT_SERIAL_EVT_DELIM_MATCH, body);\r\n      // lazy initialization of serial buffers\r\n      uBit.serial.read(MicroBitSerialMode::ASYNC);\r\n    }\r\n\r\n    /**\r\n     * Send a piece of text through the serial connection.\r\n     */\r\n    //% help=serial/write-string\r\n    //% weight=87 blockGap=8\r\n    //% blockId=serial_writestring block=\"serial|write string %text\"\r\n    void writeString(StringData *text) {\r\n      if (!text) return;\r\n\r\n      uBit.serial.send(ManagedString(text));\r\n    }\r\n\r\n    /**\r\n    * Send a buffer through serial connection\r\n    */\r\n    //% blockId=serial_writebuffer block=\"serial|write buffer %buffer\"\r\n    //% help=serial/write-buffer advanced=true weight=6\r\n    void writeBuffer(Buffer buffer) {\r\n      if (!buffer) return;\r\n\r\n      ManagedBuffer buf(buffer);\r\n      uBit.serial.send(buf.getBytes(), buf.length());\r\n    }\r\n\r\n    /**\r\n    * Read multiple characters from the receive buffer. Pause until enough characters are present.\r\n    * @param length default buffer length, eg: 64\r\n    */\r\n    //% blockId=serial_readbuffer block=\"serial|read buffer %length\"\r\n    //% help=serial/read-buffer advanced=true weight=5\r\n    Buffer readBuffer(int length) {\r\n      if (length <= 0)\r\n        length = MICROBIT_SERIAL_READ_BUFFER_LENGTH;\r\n        \r\n      ManagedBuffer buf(length);\r\n      int read = uBit.serial.read(buf.getBytes(), buf.length());\r\n      if (read != buf.length())\r\n        buf = buf.slice(read);\r\n\r\n      return buf.leakData();\r\n    }\r\n\r\n    /**\r\n    * Set the serial input and output to use pins instead of the USB connection.\r\n    * @param tx the new transmission pin, eg: SerialPin.P0\r\n    * @param rx the new reception pin, eg: SerialPin.P1\r\n    * @param rate the new baud rate. eg: 115200\r\n    */\r\n    //% weight=10\r\n    //% help=serial/redirect\r\n    //% blockId=serial_redirect block=\"serial|redirect to|TX %tx|RX %rx|at baud rate %rate\"\r\n    //% blockExternalInputs=1\r\n    //% tx.fieldEditor=\"gridpicker\" tx.fieldOptions.columns=3\r\n    //% tx.fieldOptions.tooltips=\"false\"\r\n    //% rx.fieldEditor=\"gridpicker\" rx.fieldOptions.columns=3\r\n    //% rx.fieldOptions.tooltips=\"false\"\r\n    //% blockGap=8\r\n    void redirect(SerialPin tx, SerialPin rx, BaudRate rate) {\r\n      MicroBitPin* txp = getPin(tx); if (!tx) return;\r\n      MicroBitPin* rxp = getPin(rx); if (!rx) return;\r\n\r\n      uBit.serial.redirect(txp->name, rxp->name);\r\n      uBit.serial.baud((int)rate);\r\n    }\r\n\r\n    /**\r\n    * Direct the serial input and output to use the USB connection.\r\n    */\r\n    //% weight=9 help=serial/redirect-to-usb\r\n    //% blockId=serial_redirect_to_usb block=\"serial|redirect to USB\"    \r\n    void redirectToUSB() {\r\n      uBit.serial.redirect(USBTX, USBRX);\r\n      uBit.serial.baud(115200);\r\n    }\r\n}\r\n",
      "serial.ts": "/**\n * Reading and writing data over a serial connection.\n */\n//% weight=2 color=#002050 icon=\"\\uf287\"\n//% advanced=true\nnamespace serial {\n    /**\n     * Print a line of text to the serial port  \n     * @param value to send over serial\n     */\n    //% weight=90\n    //% help=serial/write-line blockGap=8\n    //% blockId=serial_writeline block=\"serial|write line %text\"\n    export function writeLine(text: string): void {\n        if (!text) text = \"\";\n        // pad data to the 32 byte boundary\n        // to ensure apps receive the packet\n        let r = (32 - (text.length + 2) % 32) % 32;\n        serial.writeString(text);\n        for (let i = 0; i < r; ++i)\n            serial.writeString(\" \");\n        serial.writeString(\"\\r\\n\");\n    }\n\n    /**\n     * Print a numeric value to the serial port\n     */\n    //% help=serial/write-number\n    //% weight=89 blockGap=8\n    //% blockId=serial_writenumber block=\"serial|write number %value\"\n    export function writeNumber(value: number): void {\n        writeString(value.toString());\n    }\n\n    /**\n     * Print an array of numeric values as CSV to the serial port\n     */\n    //% help=serial/write-numbers\n    //% weight=86\n    //% blockId=serial_writenumbers block=\"serial|write numbers %values\"\n    export function writeNumbers(values: number[]): void {\n        if (!values) return;\n        for(let i = 0; i < values.length; ++i) {\n            if (i > 0) writeString(\",\");\n            writeNumber(values[i]);\n        }\n        writeLine(\"\")\n    }\n\n    /**\n     * Write a name:value pair as a line to the serial port.\n     * @param name name of the value stream, eg: x\n     * @param value to write\n     */\n    //% weight=88 blockGap=8\n    //% help=serial/write-value\n    //% blockId=serial_writevalue block=\"serial|write value %name|= %value\"\n    export function writeValue(name: string, value: number): void {\n        writeLine(name + \":\" + value);\n    }\n\n    /**\n     * Read a line of text from the serial port.\n     */\n    //% help=serial/read-line\n    //% blockId=serial_read_line block=\"serial|read line\"\n    //% weight=20 blockGap=8\n    export function readLine(): string {\n        return serial.readUntil(delimiters(Delimiters.NewLine));\n    }\n\n    /**\n     * Return the corresponding delimiter string\n     */\n    //% blockId=\"serial_delimiter_conv\" block=\"%del\"\n    //% weight=1 blockHidden=true\n    export function delimiters(del: Delimiters): string {\n        // even though it might not look like, this is more\n        // (memory) efficient than the C++ implementation, because the\n        // strings are statically allocated and take no RAM \n        switch (del) {\n            case Delimiters.NewLine: return \"\\n\"\n            case Delimiters.Comma: return \",\"\n            case Delimiters.Dollar: return \"$\"\n            case Delimiters.Colon: return \":\"\n            case Delimiters.Fullstop: return \".\"\n            case Delimiters.Hash: return \"#\"\n            default: return \"\\n\"\n        }\n    }\n}\n",
      "shims.d.ts": "// Auto-generated. Do not edit.\n\n\n    /**\n     * Creation, manipulation and display of LED images.\n     */\n    //% color=#5C2D91 weight=31 icon=\"\\uf03e\"\n    //% advanced=true\ndeclare namespace images {\n\n    /**\n     * Creates an image that fits on the LED screen.\n     */\n    //% weight=75 help=images/create-image\n    //% blockId=device_build_image block=\"create image\"\n    //% parts=\"ledmatrix\" imageLiteral=1 shim=images::createImage\n    function createImage(leds: string): Image;\n\n    /**\n     * Creates an image with 2 frames.\n     */\n    //% weight=74 help=images/create-big-image\n    //% blockId=device_build_big_image block=\"create big image\" imageLiteral=2\n    //% parts=\"ledmatrix\" shim=images::createBigImage\n    function createBigImage(leds: string): Image;\n}\n\n\ndeclare interface Image {\n    /**\n     * Plots the image at a given column to the screen\n     */\n    //% help=images/plot-image\n    //% parts=\"ledmatrix\" xOffset.defl=0 shim=ImageMethods::plotImage\n    plotImage(xOffset?: number): void;\n\n    /**\n     * Shows an frame from the image at offset ``x offset``.\n     * @param xOffset column index to start displaying the image\n     */\n    //% help=images/show-image weight=80 blockNamespace=images\n    //% blockId=device_show_image_offset block=\"show image %sprite|at offset %offset\" blockGap=8\n    //% parts=\"ledmatrix\" async interval.defl=400 shim=ImageMethods::showImage\n    showImage(xOffset: number, interval?: number): void;\n\n    /**\n     * Draws the ``index``-th frame of the image on the screen.\n     * @param xOffset column index to start displaying the image\n     */\n    //% help=images/plot-frame weight=80\n    //% parts=\"ledmatrix\" shim=ImageMethods::plotFrame\n    plotFrame(xOffset: number): void;\n\n    /**\n     * Scrolls an image .\n     * @param frameOffset x offset moved on each animation step, eg: 1, 2, 5\n     * @param interval time between each animation step in milli seconds, eg: 200\n     */\n    //% help=images/scroll-image weight=79 async blockNamespace=images\n    //% blockId=device_scroll_image block=\"scroll image %sprite|with offset %frameoffset|and interval (ms) %delay\" blockGap=8\n    //% parts=\"ledmatrix\" shim=ImageMethods::scrollImage\n    scrollImage(frameOffset: number, interval: number): void;\n\n    /**\n     * Sets all pixels off.\n     */\n    //% help=images/clear\n    //% parts=\"ledmatrix\" shim=ImageMethods::clear\n    clear(): void;\n\n    /**\n     * Sets a specific pixel brightness at a given position\n     */\n    //%\n    //% parts=\"ledmatrix\" shim=ImageMethods::setPixelBrightness\n    setPixelBrightness(x: number, y: number, value: number): void;\n\n    /**\n     * Gets the pixel brightness ([0..255]) at a given position\n     */\n    //%\n    //% parts=\"ledmatrix\" shim=ImageMethods::pixelBrightness\n    pixelBrightness(x: number, y: number): number;\n\n    /**\n     * Gets the width in columns\n     */\n    //% help=functions/width shim=ImageMethods::width\n    width(): number;\n\n    /**\n     * Gets the height in rows (always 5)\n     */\n    //% shim=ImageMethods::height\n    height(): number;\n\n    /**\n     * Set a pixel state at position ``(x,y)``\n     * @param x TODO\n     * @param y TODO\n     * @param value TODO\n     */\n    //% help=images/set-pixel\n    //% parts=\"ledmatrix\" shim=ImageMethods::setPixel\n    setPixel(x: number, y: number, value: boolean): void;\n\n    /**\n     * Get the pixel state at position ``(x,y)``\n     * @param x TODO\n     * @param y TODO\n     */\n    //% help=images/pixel\n    //% parts=\"ledmatrix\" shim=ImageMethods::pixel\n    pixel(x: number, y: number): boolean;\n\n    /**\n     * Shows a particular frame of the image strip.\n     * @param frame TODO\n     */\n    //% weight=70 help=images/show-frame\n    //% parts=\"ledmatrix\" interval.defl=400 shim=ImageMethods::showFrame\n    showFrame(frame: number, interval?: number): void;\n}\n\n\n    /**\n     * Provides access to basic micro:bit functionality.\n     */\n    //% color=#0078D7 weight=100 icon=\"\\uf00a\"\ndeclare namespace basic {\n\n    /**\n     * Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.\n     * @param interval speed of scroll; eg: 150, 100, 200, -100\n     */\n    //% help=basic/show-number\n    //% weight=96\n    //% blockId=device_show_number block=\"show|number %number\" blockGap=8\n    //% async\n    //% parts=\"ledmatrix\" interval.defl=150 shim=basic::showNumber\n    function showNumber(value: number, interval?: number): void;\n\n    /**\n     * Draws an image on the LED screen.\n     * @param leds the pattern of LED to turn on/off\n     * @param interval time in milliseconds to pause after drawing\n     */\n    //% help=basic/show-leds\n    //% weight=95 blockGap=8\n    //% imageLiteral=1 async\n    //% blockId=device_show_leds\n    //% block=\"show leds\" icon=\"\\uf00a\"\n    //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showLeds\n    function showLeds(leds: string, interval?: number): void;\n\n    /**\n     * Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.\n     * @param text the text to scroll on the screen, eg: \"Hello!\"\n     * @param interval how fast to shift characters; eg: 150, 100, 200, -100\n     */\n    //% help=basic/show-string\n    //% weight=87 blockGap=8\n    //% block=\"show|string %text\"\n    //% async\n    //% blockId=device_print_message\n    //% parts=\"ledmatrix\" interval.defl=150 shim=basic::showString\n    function showString(text: string, interval?: number): void;\n\n    /**\n     * Turn off all LEDs\n     */\n    //% help=basic/clear-screen weight=79\n    //% blockId=device_clear_display block=\"clear screen\"\n    //% parts=\"ledmatrix\"\n    //% advanced=true shim=basic::clearScreen\n    function clearScreen(): void;\n\n    /**\n     * Shows a sequence of LED screens as an animation.\n     * @param leds pattern of LEDs to turn on/off\n     * @param interval time in milliseconds between each redraw\n     */\n    //% help=basic/show-animation imageLiteral=1 async\n    //% parts=\"ledmatrix\" interval.defl=400 shim=basic::showAnimation\n    function showAnimation(leds: string, interval?: number): void;\n\n    /**\n     * Draws an image on the LED screen.\n     * @param leds pattern of LEDs to turn on/off\n     */\n    //% help=basic/plot-leds weight=80\n    //% parts=\"ledmatrix\" imageLiteral=1 shim=basic::plotLeds\n    function plotLeds(leds: string): void;\n\n    /**\n     * Repeats the code forever in the background. On each iteration, allows other codes to run.\n     * @param body code to execute\n     */\n    //% help=basic/forever weight=55 blockGap=8 blockAllowMultiple=1 afterOnStart=true\n    //% blockId=device_forever block=\"forever\" icon=\"\\uf01e\" shim=basic::forever\n    function forever(a: () => void): void;\n\n    /**\n     * Pause for the specified time in milliseconds\n     * @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000\n     */\n    //% help=basic/pause weight=54\n    //% async block=\"pause (ms) %pause\"\n    //% blockId=device_pause icon=\"\\uf110\" shim=basic::pause\n    function pause(ms: number): void;\n}\n\n\n\n    //% color=#B4009E weight=99 icon=\"\\uf192\"\ndeclare namespace input {\n\n    /**\n     * Do something when a button (A, B or both A+B) is pushed down and released again.\n     * @param button the button that needs to be pressed\n     * @param body code to run when event is raised\n     */\n    //% help=input/on-button-pressed weight=85 blockGap=8\n    //% blockId=device_button_event block=\"on button|%NAME|pressed\"\n    //% parts=\"buttonpair\" shim=input::onButtonPressed\n    function onButtonPressed(button: Button, body: () => void): void;\n\n    /**\n     * Do something when when a gesture is done (like shaking the micro:bit).\n     * @param gesture the type of gesture to track, eg: Gesture.Shake\n     * @param body code to run when gesture is raised\n     */\n    //% help=input/on-gesture weight=84 blockGap=8\n    //% blockId=device_gesture_event block=\"on |%NAME\"\n    //% parts=\"accelerometer\"\n    //% NAME.fieldEditor=\"gridpicker\" NAME.fieldOptions.columns=4 shim=input::onGesture\n    function onGesture(gesture: Gesture, body: () => void): void;\n\n    /**\n     * Do something when a pin is touched and released again (while also touching the GND pin).\n     * @param name the pin that needs to be pressed, eg: TouchPin.P0\n     * @param body the code to run when the pin is pressed\n     */\n    //% help=input/on-pin-pressed weight=83\n    //% blockId=device_pin_event block=\"on pin %name|pressed\" shim=input::onPinPressed\n    function onPinPressed(name: TouchPin, body: () => void): void;\n\n    /**\n     * Do something when a pin is released.\n     * @param name the pin that needs to be released, eg: TouchPin.P0\n     * @param body the code to run when the pin is released\n     */\n    //% help=input/on-pin-released weight=6 blockGap=8\n    //% blockId=device_pin_released block=\"on pin %NAME|released\"\n    //% advanced=true shim=input::onPinReleased\n    function onPinReleased(name: TouchPin, body: () => void): void;\n\n    /**\n     * Get the button state (pressed or not) for ``A`` and ``B``.\n     * @param button the button to query the request, eg: Button.A\n     */\n    //% help=input/button-is-pressed weight=60\n    //% block=\"button|%NAME|is pressed\"\n    //% blockId=device_get_button2\n    //% icon=\"\\uf192\" blockGap=8\n    //% parts=\"buttonpair\" shim=input::buttonIsPressed\n    function buttonIsPressed(button: Button): boolean;\n\n    /**\n     * Get the pin state (pressed or not). Requires to hold the ground to close the circuit.\n     * @param name pin used to detect the touch, eg: TouchPin.P0\n     */\n    //% help=input/pin-is-pressed weight=58\n    //% blockId=\"device_pin_is_pressed\" block=\"pin %NAME|is pressed\"\n    //% blockGap=8 shim=input::pinIsPressed\n    function pinIsPressed(name: TouchPin): boolean;\n\n    /**\n     * Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)\n     * @param dimension TODO\n     */\n    //% help=input/acceleration weight=58\n    //% blockId=device_acceleration block=\"acceleration (mg)|%NAME\" blockGap=8\n    //% parts=\"accelerometer\" shim=input::acceleration\n    function acceleration(dimension: Dimension): number;\n\n    /**\n     * Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.\n     */\n    //% help=input/light-level weight=57\n    //% blockId=device_get_light_level block=\"light level\" blockGap=8\n    //% parts=\"ledmatrix\" shim=input::lightLevel\n    function lightLevel(): number;\n\n    /**\n     * Get the current compass heading in degrees.\n     */\n    //% help=input/compass-heading\n    //% weight=56\n    //% blockId=device_heading block=\"compass heading (°)\" blockGap=8\n    //% parts=\"compass\" shim=input::compassHeading\n    function compassHeading(): number;\n\n    /**\n     * Gets the temperature in Celsius degrees (°C).\n     */\n    //% weight=55\n    //% help=input/temperature\n    //% blockId=device_temperature block=\"temperature (°C)\" blockGap=8\n    //% parts=\"thermometer\" shim=input::temperature\n    function temperature(): number;\n\n    /**\n     * The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.\n     * @param kind TODO\n     */\n    //% help=input/rotation weight=52\n    //% blockId=device_get_rotation block=\"rotation (°)|%NAME\" blockGap=8\n    //% parts=\"accelerometer\" advanced=true shim=input::rotation\n    function rotation(kind: Rotation): number;\n\n    /**\n     * Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.\n     * @param dimension TODO\n     */\n    //% help=input/magnetic-force weight=51\n    //% blockId=device_get_magnetic_force block=\"magnetic force (µT)|%NAME\" blockGap=8\n    //% parts=\"compass\"\n    //% advanced=true shim=input::magneticForce\n    function magneticForce(dimension: Dimension): number;\n\n    /**\n     * Gets the number of milliseconds elapsed since power on.\n     */\n    //% help=input/running-time weight=50 blockGap=8\n    //% blockId=device_get_running_time block=\"running time (ms)\"\n    //% advanced=true shim=input::runningTime\n    function runningTime(): number;\n\n    /**\n     * Gets the number of microseconds elapsed since power on.\n     */\n    //% help=input/running-time-micros weight=49\n    //% blockId=device_get_running_time_micros block=\"running time (micros)\"\n    //% advanced=true shim=input::runningTimeMicros\n    function runningTimeMicros(): number;\n\n    /**\n     * Obsolete, compass calibration is automatic.\n     */\n    //% help=input/calibrate-compass advanced=true\n    //% blockId=\"input_compass_calibrate\" block=\"calibrate compass\" shim=input::calibrateCompass\n    function calibrateCompass(): void;\n\n    /**\n     * Sets the accelerometer sample range in gravities.\n     * @param range a value describe the maximum strengh of acceleration measured\n     */\n    //% help=input/set-accelerometer-range\n    //% blockId=device_set_accelerometer_range block=\"set accelerometer|range %range\"\n    //% weight=5\n    //% parts=\"accelerometer\"\n    //% advanced=true shim=input::setAccelerometerRange\n    function setAccelerometerRange(range: AcceleratorRange): void;\n}\n\n\n\n    //% weight=1 color=\"#333333\"\n    //% advanced=true\ndeclare namespace control {\n\n    /**\n     * Schedules code that run in the background.\n     */\n    //% help=control/in-background blockAllowMultiple=1 afterOnStart=true\n    //% blockId=\"control_in_background\" block=\"run in background\" blockGap=8 shim=control::inBackground\n    function inBackground(a: () => void): void;\n\n    /**\n     * Resets the BBC micro:bit.\n     */\n    //% weight=30 async help=control/reset blockGap=8\n    //% blockId=\"control_reset\" block=\"reset\" shim=control::reset\n    function reset(): void;\n\n    /**\n     * Blocks the current fiber for the given microseconds\n     * @param micros number of micro-seconds to wait. eg: 4\n     */\n    //% help=control/wait-micros weight=29\n    //% blockId=\"control_wait_us\" block=\"wait (µs)%micros\" shim=control::waitMicros\n    function waitMicros(micros: number): void;\n\n    /**\n     * Raises an event in the event bus.\n     * @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.\n     * @param value Component specific code indicating the cause of the event.\n     * @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_FIRE).\n     */\n    //% weight=21 blockGap=12 blockId=\"control_raise_event\" block=\"raise event|from source %src=control_event_source_id|with value %value=control_event_value_id\" blockExternalInputs=1\n    //% help=control/raise-event\n    //% mode.defl=1 shim=control::raiseEvent\n    function raiseEvent(src: number, value: number, mode?: EventCreationMode): void;\n\n    /**\n     * Registers an event handler.\n     */\n    //% weight=20 blockGap=8 blockId=\"control_on_event\" block=\"on event|from %src=control_event_source_id|with value %value=control_event_value_id\"\n    //% help=control/on-event\n    //% blockExternalInputs=1 shim=control::onEvent\n    function onEvent(src: number, value: number, handler: () => void): void;\n\n    /**\n     * Gets the value of the last event executed on the bus\n     */\n    //% blockId=control_event_value\" block=\"event value\"\n    //% help=control/event-value\n    //% weight=18 shim=control::eventValue\n    function eventValue(): number;\n\n    /**\n     * Gets the timestamp of the last event executed on the bus\n     */\n    //% blockId=control_event_timestamp\" block=\"event timestamp\"\n    //% help=control/event-timestamp\n    //% weight=19 blockGap=8 shim=control::eventTimestamp\n    function eventTimestamp(): number;\n\n    /**\n     * Gets a friendly name for the device derived from the its serial number\n     */\n    //% blockId=\"control_device_name\" block=\"device name\" weight=10 blockGap=8\n    //% advanced=true shim=control::deviceName\n    function deviceName(): string;\n\n    /**\n     * Derive a unique, consistent serial number of this device from internal data.\n     */\n    //% blockId=\"control_device_serial_number\" block=\"device serial number\" weight=9\n    //% advanced=true shim=control::deviceSerialNumber\n    function deviceSerialNumber(): number;\n}\n\n\n\n    //% color=#5C2D91 weight=97 icon=\"\\uf205\"\ndeclare namespace led {\n\n    /**\n     * Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n     * @param x the horizontal coordinate of the LED starting at 0\n     * @param y the vertical coordinate of the LED starting at 0\n     */\n    //% help=led/plot weight=78\n    //% blockId=device_plot block=\"plot|x %x|y %y\" blockGap=8\n    //% parts=\"ledmatrix\"\n    //% x.min=0 x.max=4 y.min=0 y.max=4 shim=led::plot\n    function plot(x: number, y: number): void;\n\n    /**\n     * Turn on the specified LED with specific brightness using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n     * @param x the horizontal coordinate of the LED starting at 0\n     * @param y the vertical coordinate of the LED starting at 0\n     * @param brightness the brightness from 0 (off) to 255 (bright), eg:255\n     */\n    //% help=led/plot-brightness weight=78\n    //% blockId=device_plot_brightness block=\"plot|x %x|y %y|brightness %brightness\" blockGap=8\n    //% parts=\"ledmatrix\"\n    //% x.min=0 x.max=4 y.min=0 y.max=4 brightness.min=0 brightness.max=255\n    //% advanced=true shim=led::plotBrightness\n    function plotBrightness(x: number, y: number, brightness: number): void;\n\n    /**\n     * Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.\n     * @param x TODO\n     * @param y TODO\n     */\n    //% help=led/unplot weight=77\n    //% blockId=device_unplot block=\"unplot|x %x|y %y\" blockGap=8\n    //% parts=\"ledmatrix\"\n    //% x.min=0 x.max=4 y.min=0 y.max=4 shim=led::unplot\n    function unplot(x: number, y: number): void;\n\n    /**\n     * Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.\n     * @param x TODO\n     * @param y TODO\n     */\n    //% help=led/point weight=76\n    //% blockId=device_point block=\"point|x %x|y %y\"\n    //% parts=\"ledmatrix\"\n    //% x.min=0 x.max=4 y.min=0 y.max=4 shim=led::point\n    function point(x: number, y: number): boolean;\n\n    /**\n     * Get the screen brightness from 0 (off) to 255 (full bright).\n     */\n    //% help=led/brightness weight=60\n    //% blockId=device_get_brightness block=\"brightness\" blockGap=8\n    //% parts=\"ledmatrix\"\n    //% advanced=true shim=led::brightness\n    function brightness(): number;\n\n    /**\n     * Set the screen brightness from 0 (off) to 255 (full bright).\n     * @param value the brightness value, eg:255, 127, 0\n     */\n    //% help=led/set-brightness weight=59\n    //% blockId=device_set_brightness block=\"set brightness %value\"\n    //% parts=\"ledmatrix\"\n    //% advanced=true\n    //% value.min=0 value.max=255 shim=led::setBrightness\n    function setBrightness(value: number): void;\n\n    /**\n     * Cancels the current animation and clears other pending animations.\n     */\n    //% weight=50 help=led/stop-animation\n    //% blockId=device_stop_animation block=\"stop animation\"\n    //% parts=\"ledmatrix\"\n    //% advanced=true shim=led::stopAnimation\n    function stopAnimation(): void;\n\n    /**\n     * Sets the display mode between black and white and greyscale for rendering LEDs.\n     * @param mode mode the display mode in which the screen operates\n     */\n    //% weight=1 help=led/set-display-mode\n    //% parts=\"ledmatrix\" advanced=true shim=led::setDisplayMode\n    function setDisplayMode(mode: DisplayMode): void;\n\n    /**\n     * Gets the current display mode\n     */\n    //% weight=1 parts=\"ledmatrix\" advanced=true shim=led::displayMode\n    function displayMode(): DisplayMode;\n\n    /**\n     * Turns on or off the display\n     */\n    //% help=led/enable blockId=device_led_enable block=\"led enable %on\"\n    //% advanced=true parts=\"ledmatrix\" shim=led::enable\n    function enable(on: boolean): void;\n\n    /**\n     * Takes a screenshot of the LED screen and returns an image.\n     */\n    //% help=led/screenshot\n    //% parts=\"ledmatrix\" shim=led::screenshot\n    function screenshot(): Image;\n}\ndeclare namespace pins {\n\n    /**\n     * Read the specified pin or connector as either 0 or 1\n     * @param name pin to read from, eg: DigitalPin.P0\n     */\n    //% help=pins/digital-read-pin weight=30\n    //% blockId=device_get_digital_pin block=\"digital read|pin %name\" blockGap=8\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\" shim=pins::digitalReadPin\n    function digitalReadPin(name: DigitalPin): number;\n\n    /**\n     * Set a pin or connector value to either 0 or 1.\n     * @param name pin to write to, eg: DigitalPin.P0\n     * @param value value to set on the pin, 1 eg,0\n     */\n    //% help=pins/digital-write-pin weight=29\n    //% blockId=device_set_digital_pin block=\"digital write|pin %name|to %value\"\n    //% value.min=0 value.max=1\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\" shim=pins::digitalWritePin\n    function digitalWritePin(name: DigitalPin, value: number): void;\n\n    /**\n     * Read the connector value as analog, that is, as a value comprised between 0 and 1023.\n     * @param name pin to write to, eg: AnalogPin.P0\n     */\n    //% help=pins/analog-read-pin weight=25\n    //% blockId=device_get_analog_pin block=\"analog read|pin %name\" blockGap=\"8\"\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" shim=pins::analogReadPin\n    function analogReadPin(name: AnalogPin): number;\n\n    /**\n     * Set the connector value as analog. Value must be comprised between 0 and 1023.\n     * @param name pin name to write to, eg: AnalogPin.P0\n     * @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0\n     */\n    //% help=pins/analog-write-pin weight=24\n    //% blockId=device_set_analog_pin block=\"analog write|pin %name|to %value\" blockGap=8\n    //% value.min=0 value.max=1023\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" shim=pins::analogWritePin\n    function analogWritePin(name: AnalogPin, value: number): void;\n\n    /**\n     * Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\n     * If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.\n     * @param name analog pin to set period to, eg: AnalogPin.P0\n     * @param micros period in micro seconds. eg:20000\n     */\n    //% help=pins/analog-set-period weight=23 blockGap=8\n    //% blockId=device_set_analog_period block=\"analog set period|pin %pin|to (µs)%micros\"\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n    //% pin.fieldOptions.tooltips=\"false\" shim=pins::analogSetPeriod\n    function analogSetPeriod(name: AnalogPin, micros: number): void;\n\n    /**\n     * Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.\n     * @param name digital pin to register to, eg: DigitalPin.P0\n     * @param pulse the value of the pulse, eg: PulseValue.High\n     */\n    //% help=pins/on-pulsed weight=22 blockGap=8 advanced=true\n    //% blockId=pins_on_pulsed block=\"on|pin %pin|pulsed %pulse\"\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\" shim=pins::onPulsed\n    function onPulsed(name: DigitalPin, pulse: PulseValue, body: () => void): void;\n\n    /**\n     * Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.\n     */\n    //% help=pins/pulse-duration advanced=true\n    //% blockId=pins_pulse_duration block=\"pulse duration (µs)\"\n    //% weight=21 blockGap=8 shim=pins::pulseDuration\n    function pulseDuration(): number;\n\n    /**\n     * Returns the duration of a pulse in microseconds\n     * @param name the pin which measures the pulse, eg: DigitalPin.P0\n     * @param value the value of the pulse, eg: PulseValue.High\n     * @param maximum duration in micro-seconds\n     */\n    //% blockId=\"pins_pulse_in\" block=\"pulse in (µs)|pin %name|pulsed %value\"\n    //% weight=20 advanced=true\n    //% help=pins/pulse-in\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" name.fieldOptions.width=\"300\" maxDuration.defl=2000000 shim=pins::pulseIn\n    function pulseIn(name: DigitalPin, value: PulseValue, maxDuration?: number): number;\n\n    /**\n     * Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).\n     * @param name pin to write to, eg: AnalogPin.P0\n     * @param value angle or rotation speed, eg:180,90,0\n     */\n    //% help=pins/servo-write-pin weight=20\n    //% blockId=device_set_servo_pin block=\"servo write|pin %name|to %value\" blockGap=8\n    //% parts=microservo trackArgs=0\n    //% value.min=0 value.max=180\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" shim=pins::servoWritePin\n    function servoWritePin(name: AnalogPin, value: number): void;\n\n    /**\n     * Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.\n     * @param name pin name\n     * @param micros pulse duration in micro seconds, eg:1500\n     */\n    //% help=pins/servo-set-pulse weight=19\n    //% blockId=device_set_servo_pulse block=\"servo set pulse|pin %value|to (µs) %micros\"\n    //% value.fieldEditor=\"gridpicker\" value.fieldOptions.columns=4\n    //% value.fieldOptions.tooltips=\"false\" shim=pins::servoSetPulse\n    function servoSetPulse(name: AnalogPin, micros: number): void;\n\n    /**\n     * Sets the pin used when using `analog pitch` or music.\n     * @param name pin to modulate pitch from\n     */\n    //% blockId=device_analog_set_pitch_pin block=\"analog set pitch pin %name\"\n    //% help=pins/analog-set-pitch-pin weight=3 advanced=true\n    //% name.fieldEditor=\"gridpicker\" name.fieldOptions.columns=4\n    //% name.fieldOptions.tooltips=\"false\" shim=pins::analogSetPitchPin\n    function analogSetPitchPin(name: AnalogPin): void;\n\n    /**\n     * Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.\n     * @param frequency frequency to modulate in Hz.\n     * @param ms duration of the pitch in milli seconds.\n     */\n    //% blockId=device_analog_pitch block=\"analog pitch %frequency|for (ms) %ms\"\n    //% help=pins/analog-pitch weight=4 async advanced=true blockGap=8 shim=pins::analogPitch\n    function analogPitch(frequency: number, ms: number): void;\n\n    /**\n     * Configures the pull of this pin.\n     * @param name pin to set the pull mode on, eg: DigitalPin.P0\n     * @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp\n     */\n    //% help=pins/set-pull weight=3 advanced=true\n    //% blockId=device_set_pull block=\"set pull|pin %pin|to %pull\"\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\" shim=pins::setPull\n    function setPull(name: DigitalPin, pull: PinPullMode): void;\n\n    /**\n     * Configures the events emitted by this pin. Events can be subscribed to\n     * using ``control.onEvent()``.\n     * @param name pin to set the event mode on, eg: DigitalPin.P0\n     * @param type the type of events for this pin to emit, eg: PinEventType.Edge\n     */\n    //% help=pins/set-events weight=4 advanced=true\n    //% blockId=device_set_pin_events block=\"set pin %pin|to emit %type|events\"\n    //% pin.fieldEditor=\"gridpicker\" pin.fieldOptions.columns=4\n    //% pin.fieldOptions.tooltips=\"false\" pin.fieldOptions.width=\"300\" shim=pins::setEvents\n    function setEvents(name: DigitalPin, type: PinEventType): void;\n\n    /**\n     * Create a new zero-initialized buffer.\n     * @param size number of bytes in the buffer\n     */\n    //% shim=pins::createBuffer\n    function createBuffer(size: number): Buffer;\n\n    /**\n     * Read `size` bytes from a 7-bit I2C `address`.\n     */\n    //% repeat.defl=0 shim=pins::i2cReadBuffer\n    function i2cReadBuffer(address: number, size: number, repeat?: boolean): Buffer;\n\n    /**\n     * Write bytes to a 7-bit I2C `address`.\n     */\n    //% repeat.defl=0 shim=pins::i2cWriteBuffer\n    function i2cWriteBuffer(address: number, buf: Buffer, repeat?: boolean): void;\n\n    /**\n     * Write to the SPI slave and return the response\n     * @param value Data to be sent to the SPI slave\n     */\n    //% help=pins/spi-write weight=5 advanced=true\n    //% blockId=spi_write block=\"spi write %value\" shim=pins::spiWrite\n    function spiWrite(value: number): number;\n\n    /**\n     * Sets the SPI frequency\n     * @param frequency the clock frequency, eg: 1000000\n     */\n    //% help=pins/spi-frequency weight=4 advanced=true\n    //% blockId=spi_frequency block=\"spi frequency %frequency\" shim=pins::spiFrequency\n    function spiFrequency(frequency: number): void;\n\n    /**\n     * Sets the SPI bits and mode\n     * @param bits the number of bits, eg: 8\n     * @param mode the mode, eg: 3\n     */\n    //% help=pins/spi-format weight=3 advanced=true\n    //% blockId=spi_format block=\"spi format|bits %bits|mode %mode\" shim=pins::spiFormat\n    function spiFormat(bits: number, mode: number): void;\n\n    /**\n     * Sets the MOSI, MISO, SCK pins used by the SPI instance\n     *\n     */\n    //% help=pins/spi-pins weight=2 advanced=true\n    //% blockId=spi_pins block=\"spi set pins|MOSI %mosi|MISO %miso|SCK %sck\"\n    //% mosi.fieldEditor=\"gridpicker\" mosi.fieldOptions.columns=4\n    //% mosi.fieldOptions.tooltips=\"false\" mosi.fieldOptions.width=\"300\"\n    //% miso.fieldEditor=\"gridpicker\" miso.fieldOptions.columns=4\n    //% miso.fieldOptions.tooltips=\"false\" miso.fieldOptions.width=\"300\"\n    //% sck.fieldEditor=\"gridpicker\" sck.fieldOptions.columns=4\n    //% sck.fieldOptions.tooltips=\"false\" sck.fieldOptions.width=\"300\" shim=pins::spiPins\n    function spiPins(mosi: DigitalPin, miso: DigitalPin, sck: DigitalPin): void;\n}\n\n\n\n    //% weight=2 color=#002050 icon=\"\\uf287\"\n    //% advanced=true\ndeclare namespace serial {\n\n    /**\n     * Read a line of text from the serial port and return the buffer when the delimiter is met.\n     * @param delimiter text delimiter that separates each text chunk\n     */\n    //% help=serial/read-until\n    //% blockId=serial_read_until block=\"serial|read until %delimiter=serial_delimiter_conv\"\n    //% weight=19 shim=serial::readUntil\n    function readUntil(delimiter: string): string;\n\n    /**\n     * Read the buffered received data as a string\n     */\n    //% help=serial/read-string\n    //% blockId=serial_read_buffer block=\"serial|read string\"\n    //% weight=18 shim=serial::readString\n    function readString(): string;\n\n    /**\n     * Register an event to be fired when one of the delimiter is matched.\n     * @param delimiters the characters to match received characters against.\n     */\n    //% help=serial/on-data-received\n    //% weight=18 blockId=serial_on_data_received block=\"serial|on data received %delimiters=serial_delimiter_conv\" shim=serial::onDataReceived\n    function onDataReceived(delimiters: string, body: () => void): void;\n\n    /**\n     * Send a piece of text through the serial connection.\n     */\n    //% help=serial/write-string\n    //% weight=87 blockGap=8\n    //% blockId=serial_writestring block=\"serial|write string %text\" shim=serial::writeString\n    function writeString(text: string): void;\n\n    /**\n     * Send a buffer through serial connection\n     */\n    //% blockId=serial_writebuffer block=\"serial|write buffer %buffer\"\n    //% help=serial/write-buffer advanced=true weight=6 shim=serial::writeBuffer\n    function writeBuffer(buffer: Buffer): void;\n\n    /**\n     * Read multiple characters from the receive buffer. Pause until enough characters are present.\n     * @param length default buffer length, eg: 64\n     */\n    //% blockId=serial_readbuffer block=\"serial|read buffer %length\"\n    //% help=serial/read-buffer advanced=true weight=5 shim=serial::readBuffer\n    function readBuffer(length: number): Buffer;\n\n    /**\n     * Set the serial input and output to use pins instead of the USB connection.\n     * @param tx the new transmission pin, eg: SerialPin.P0\n     * @param rx the new reception pin, eg: SerialPin.P1\n     * @param rate the new baud rate. eg: 115200\n     */\n    //% weight=10\n    //% help=serial/redirect\n    //% blockId=serial_redirect block=\"serial|redirect to|TX %tx|RX %rx|at baud rate %rate\"\n    //% blockExternalInputs=1\n    //% tx.fieldEditor=\"gridpicker\" tx.fieldOptions.columns=3\n    //% tx.fieldOptions.tooltips=\"false\"\n    //% rx.fieldEditor=\"gridpicker\" rx.fieldOptions.columns=3\n    //% rx.fieldOptions.tooltips=\"false\"\n    //% blockGap=8 shim=serial::redirect\n    function redirect(tx: SerialPin, rx: SerialPin, rate: BaudRate): void;\n\n    /**\n     * Direct the serial input and output to use the USB connection.\n     */\n    //% weight=9 help=serial/redirect-to-usb\n    //% blockId=serial_redirect_to_usb block=\"serial|redirect to USB\" shim=serial::redirectToUSB\n    function redirectToUSB(): void;\n}\n\n\n\n    //% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte\ndeclare interface Buffer {\n    /**\n     * Write a number in specified format in the buffer.\n     */\n    //% shim=BufferMethods::setNumber\n    setNumber(format: NumberFormat, offset: number, value: number): void;\n\n    /**\n     * Read a number in specified format from the buffer.\n     */\n    //% shim=BufferMethods::getNumber\n    getNumber(format: NumberFormat, offset: number): number;\n\n    /** Returns the length of a Buffer object. */\n    //% property shim=BufferMethods::length\n    length: number;\n\n    /**\n     * Fill (a fragment) of the buffer with given value.\n     */\n    //% offset.defl=0 length.defl=-1 shim=BufferMethods::fill\n    fill(value: number, offset?: number, length?: number): void;\n\n    /**\n     * Return a copy of a fragment of a buffer.\n     */\n    //% offset.defl=0 length.defl=-1 shim=BufferMethods::slice\n    slice(offset?: number, length?: number): Buffer;\n\n    /**\n     * Shift buffer left in place, with zero padding.\n     * @param offset number of bytes to shift; use negative value to shift right\n     * @param start start offset in buffer. Default is 0.\n     * @param length number of elements in buffer. If negative, length is set as the buffer length minus start. eg: -1\n     */\n    //% start.defl=0 length.defl=-1 shim=BufferMethods::shift\n    shift(offset: number, start?: number, length?: number): void;\n\n    /**\n     * Rotate buffer left in place.\n     * @param offset number of bytes to shift; use negative value to shift right\n     * @param start start offset in buffer. Default is 0.\n     * @param length number of elements in buffer. If negative, length is set as the buffer length minus start. eg: -1\n     */\n    //% start.defl=0 length.defl=-1 shim=BufferMethods::rotate\n    rotate(offset: number, start?: number, length?: number): void;\n\n    /**\n     * Write contents of `src` at `dstOffset` in current buffer.\n     */\n    //% shim=BufferMethods::write\n    write(dstOffset: number, src: Buffer): void;\n}\n\n// Auto-generated. Do not edit. Really.\n"
    },
    "radio": {
      "README.md": "# radio\n\nThe radio library.\n\n",
      "enums.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace radio {\n}\n\n// Auto-generated. Do not edit. Really.\n",
      "pxt.json": "{\n    \"name\": \"radio\",\n    \"description\": \"The radio services\",\n    \"files\": [\n        \"README.md\",\n        \"shims.d.ts\",\n        \"enums.d.ts\",\n        \"radio.cpp\",\n        \"radio.ts\"\n    ],\n    \"public\": true,\n    \"dependencies\": {\n        \"core\": \"*\"\n    },\n    \"yotta\": {\n        \"config\": {\n            \"microbit-dal\": {\n                \"bluetooth\": {\n                    \"enabled\": 0\n                }\n            }\n        }\n    }\n}",
      "radio.cpp": "#include \"pxt.h\"\r\n\r\nusing namespace pxt;\r\n\r\n#define MAX_FIELD_NAME_LENGTH 12\r\n#define MAX_PAYLOAD_LENGTH 20\r\n#define PACKET_PREFIX_LENGTH 9\r\n#define VALUE_PACKET_NAME_LEN_OFFSET 13\r\n\r\n\r\n// Packet Spec:\r\n// | 0              | 1 ... 4       | 5 ... 8           | 9 ... 28\r\n// ----------------------------------------------------------------\r\n// | packet type    | system time   | serial number     | payload\r\n//\r\n// Serial number defaults to 0 unless enabled by user\r\n\r\n// payload: number (9 ... 12)\r\n#define PACKET_TYPE_NUMBER 0\r\n\r\n// payload: number (9 ... 12), name length (13), name (14 ... 26)\r\n#define PACKET_TYPE_VALUE 1\r\n\r\n// payload: string length (9), string (10 ... 28)\r\n#define PACKET_TYPE_STRING 2\r\n\r\n// payload: buffer length (9), buffer (10 ... 28)\r\n#define PACKET_TYPE_BUFFER 3\r\n\r\n//% color=270 weight=96 icon=\"\\uf012\"\r\nnamespace radio {\r\n\r\n    // -------------------------------------------------------------------------\r\n    // Radio\r\n    // -------------------------------------------------------------------------\r\n    bool radioEnabled = false;\r\n    bool transmitSerialNumber = false;\r\n\r\n    PacketBuffer packet;\r\n\r\n    uint8_t type;\r\n    uint32_t time;\r\n    uint32_t serial;\r\n    int value;\r\n    StringData* msg; // may be NULL before first packet\r\n    BufferData* bufMsg; // may be NULL before first packet\r\n\r\n    int radioEnable() {\r\n        int r = uBit.radio.enable();\r\n        if (r != MICROBIT_OK) {\r\n            uBit.panic(43);\r\n            return r;\r\n        }\r\n        if (!radioEnabled) {\r\n            uBit.radio.setGroup(pxt::programHash());\r\n            radioEnabled = true;\r\n        }\r\n        return r;\r\n    }\r\n\r\n    void broadcastMessage(int message) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        uBit.radio.event.eventReceived(MicroBitEvent(MES_BROADCAST_GENERAL_ID, message, CREATE_ONLY));\r\n    }\r\n\r\n    void onBroadcastMessageReceived(int message, Action f) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        registerWithDal(MES_BROADCAST_GENERAL_ID, message, f);\r\n    }\r\n\r\n    void setPacketPrefix(uint8_t* buf, int type) {\r\n        // prefix: type (0), time (1..4), serial (5..8)\r\n        uint32_t t = system_timer_current_time();\r\n        uint32_t sn = transmitSerialNumber ? microbit_serial_number() : 0;\r\n\r\n        buf[0] = (uint8_t) type;\r\n        memcpy(buf + 1, &t, 4);\r\n        memcpy(buf + 5, &sn, 4);\r\n    }\r\n\r\n    uint8_t copyStringValue(uint8_t* buf, StringData* data, uint8_t maxLength) {\r\n        ManagedString s(data);\r\n        uint8_t len = min(maxLength, s.length());\r\n\r\n        // One byte for length of the string\r\n        buf[0] = len;\r\n\r\n        if (len > 0) {\r\n            memcpy(buf + 1, s.toCharArray(), len);\r\n        }\r\n        return len + 1;\r\n    }\r\n\r\n    StringData* getStringValue(uint8_t* buf, uint8_t maxLength) {\r\n        // First byte is the string length\r\n        uint8_t len = min(maxLength, buf[0]);\r\n\r\n        if (len) {\r\n            char name[len + 1];\r\n            memcpy(name, buf + 1, len);\r\n            name[len] = 0;\r\n            return ManagedString(name).leakData();\r\n        }\r\n        return ManagedString().leakData();\r\n    }\r\n\r\n    uint8_t copyBufferValue(uint8_t* buf, BufferData* data, uint8_t maxLength) {\r\n        ManagedBuffer s(data);\r\n        uint8_t len = min(maxLength, s.length());\r\n\r\n        // One byte for length of the buffer\r\n        buf[0] = len;\r\n        if (len > 0) {\r\n            memcpy(buf + 1, s.getBytes(), len);\r\n        }\r\n        return len + 1;\r\n    }    \r\n\r\n    BufferData* getBufferValue(uint8_t* buf, uint8_t maxLength) {\r\n        // First byte is the buffer length\r\n        uint8_t len = min(maxLength, buf[0]);\r\n        if (len) {\r\n            // skip first byte\r\n            return ManagedBuffer(buf + 1, len).leakData();\r\n        }\r\n        return ManagedBuffer().leakData();\r\n    }\r\n\r\n    void writePacketAsJSON(uint8_t tp, int v, int s, int t, StringData* m, BufferData* b) {\r\n        // Convert the packet to JSON and send over serial\r\n        uBit.serial.send(\"{\");\r\n        uBit.serial.send(\"\\\"t\\\":\");\r\n        uBit.serial.send(t);\r\n        uBit.serial.send(\",\\\"s\\\":\");\r\n        uBit.serial.send(s);\r\n        if ((tp == PACKET_TYPE_STRING || tp == PACKET_TYPE_VALUE) && NULL != m) {\r\n            uBit.serial.send(\",\\\"n\\\":\\\"\");\r\n            uBit.serial.send(ManagedString(m));\r\n            uBit.serial.send(\"\\\"\");\r\n        }\r\n        if (tp == PACKET_TYPE_BUFFER && NULL != b) {\r\n            ManagedBuffer mb(b);\r\n            uBit.serial.send(\",\\\"b\\\":\\\"\");\r\n            // TODO: proper base64 encoding\r\n            uBit.serial.send(mb.getBytes(), mb.length());\r\n            uBit.serial.send(\"\\\"\");\r\n        }\r\n        if (tp == PACKET_TYPE_NUMBER || tp == PACKET_TYPE_VALUE) {\r\n            uBit.serial.send(\",\\\"v\\\":\");\r\n            uBit.serial.send(v);\r\n        }\r\n        uBit.serial.send(\"}\\r\\n\");\r\n    }\r\n\r\n    /**\r\n     * Takes a packet from the micro:bit radio queue.\r\n     * @param writeToSerial if true, write the received packet to serial without updating the global packet;\r\n                            if false, update the global packet instead\r\n     */\r\n    void receivePacket(bool writeToSerial) {\r\n        PacketBuffer p = uBit.radio.datagram.recv();\r\n\r\n        uint8_t* buf = p.getBytes();\r\n        uint8_t tp;\r\n        int t;\r\n        int s;\r\n        int v = 0;\r\n        StringData* m = NULL;\r\n        BufferData* b = NULL;\r\n\r\n        memcpy(&tp, buf, 1);\r\n        memcpy(&t, buf + 1, 4);\r\n        memcpy(&s, buf + 5, 4);\r\n\r\n        if (tp == PACKET_TYPE_STRING) {\r\n            m = getStringValue(buf + PACKET_PREFIX_LENGTH, MAX_PAYLOAD_LENGTH - 1);\r\n        }\r\n        else if (tp == PACKET_TYPE_BUFFER) {\r\n            b = getBufferValue(buf + PACKET_PREFIX_LENGTH, MAX_PAYLOAD_LENGTH - 1);\r\n        }\r\n        else {\r\n            memcpy(&v, buf + 9, 4);\r\n            if (tp == PACKET_TYPE_VALUE) {\r\n                m = getStringValue(buf + VALUE_PACKET_NAME_LEN_OFFSET, MAX_FIELD_NAME_LENGTH);\r\n            }\r\n        }\r\n\r\n        if (NULL == m)\r\n            m = ManagedString().leakData();\r\n        if (NULL == b)\r\n            b = ManagedBuffer().leakData();\r\n\r\n        if (!writeToSerial) {\r\n            // Refresh global packet\r\n            packet = p;\r\n            type = tp;\r\n            time = t;\r\n            serial = s;\r\n            value = v;\r\n            msg = m;\r\n            bufMsg = b;\r\n        }\r\n        else {\r\n            writePacketAsJSON(tp, v, s, t, m, b);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Broadcasts a number over radio to any connected micro:bit in the group.\r\n     */\r\n    //% help=radio/send-number\r\n    //% weight=60\r\n    //% blockId=radio_datagram_send block=\"radio send number %value\" blockGap=8\r\n    void sendNumber(int value) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        uint8_t length = PACKET_PREFIX_LENGTH + sizeof(uint32_t);\r\n        uint8_t buf[length];\r\n        memset(buf, 0, length);\r\n\r\n        setPacketPrefix(buf, PACKET_TYPE_NUMBER);\r\n        memcpy(buf + PACKET_PREFIX_LENGTH, &value, 4);\r\n\r\n        uBit.radio.datagram.send(buf, length);\r\n    }\r\n\r\n    /**\r\n    * Broadcasts a name / value pair along with the device serial number\r\n    * and running time to any connected micro:bit in the group.\r\n    * @param name the field name (max 12 characters), eg: \"name\"\r\n    * @param value the numberic value\r\n    */\r\n    //% help=radio/send-value\r\n    //% weight=59\r\n    //% blockId=radio_datagram_send_value block=\"radio send|value %name|= %value\" blockGap=8\r\n    void sendValue(StringData* name, int value) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n\r\n        ManagedString n(name);\r\n        uint8_t buf[32];\r\n        memset(buf, 0, 32);\r\n\r\n        setPacketPrefix(buf, PACKET_TYPE_VALUE);\r\n        memcpy(buf + PACKET_PREFIX_LENGTH, &value, 4);\r\n\r\n        int stringLen = copyStringValue(buf + VALUE_PACKET_NAME_LEN_OFFSET, name, MAX_FIELD_NAME_LENGTH);\r\n\r\n        uBit.radio.datagram.send(buf, VALUE_PACKET_NAME_LEN_OFFSET + stringLen);\r\n    }\r\n\r\n    /**\r\n     * Broadcasts a string along with the device serial number\r\n     * and running time to any connected micro:bit in the group.\r\n     */\r\n    //% help=radio/send-string\r\n    //% weight=58\r\n    //% blockId=radio_datagram_send_string block=\"radio send string %msg\"\r\n    void sendString(StringData* msg) {\r\n        if (radioEnable() != MICROBIT_OK || NULL == msg) return;\r\n\r\n        uint8_t buf[32];\r\n        memset(buf, 0, 32);\r\n\r\n        setPacketPrefix(buf, PACKET_TYPE_STRING);\r\n        int stringLen = copyStringValue(buf + PACKET_PREFIX_LENGTH, msg, MAX_PAYLOAD_LENGTH - 1);\r\n\r\n        uBit.radio.datagram.send(buf, PACKET_PREFIX_LENGTH + stringLen);\r\n    }\r\n\r\n    /**\r\n     * Broadcasts a buffer (up to 19 bytes long) along with the device serial number\r\n     * and running time to any connected micro:bit in the group.\r\n     */\r\n    //% help=radio/send-buffer\r\n    //% weight=57\r\n    //% advanced=true\r\n    void sendBuffer(Buffer msg) {\r\n        if (radioEnable() != MICROBIT_OK || NULL == msg) return;\r\n\r\n        uint8_t buf[32];\r\n        memset(buf, 0, 32);\r\n\r\n        setPacketPrefix(buf, PACKET_TYPE_BUFFER);\r\n        int bufLen = copyBufferValue(buf + PACKET_PREFIX_LENGTH, msg, MAX_PAYLOAD_LENGTH - 1);\r\n\r\n        uBit.radio.datagram.send(buf, PACKET_PREFIX_LENGTH + bufLen);\r\n    }\r\n\r\n\r\n    /**\r\n    * Reads the next packet from the radio queue and and writes it to serial\r\n    * as JSON.\r\n    */\r\n    //% help=radio/write-value-to-serial\r\n    //% weight=3\r\n    //% blockId=radio_write_value_serial block=\"radio write value to serial\"\r\n    //% deprecated=true\r\n    void writeValueToSerial() {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        receivePacket(true);\r\n    }\r\n\r\n    /**\r\n    * Writes the last received packet to serial as JSON. This should be called\r\n    * within an ``onDataPacketReceived`` callback.\r\n    */\r\n    //% help=radio/write-received-packet-to-serial\r\n    //% weight=3\r\n    //% blockId=radio_write_packet_serial block=\"radio write received packet to serial\"\r\n    //% advanced=true\r\n    void writeReceivedPacketToSerial() {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        writePacketAsJSON(type, value, (int) serial, (int) time, msg, bufMsg);\r\n    }\r\n\r\n    /**\r\n     * Reads the next packet from the radio queue and returns the packet's number\r\n     * payload or 0 if the packet did not contain a number.\r\n     */\r\n    //% help=radio/receive-number\r\n    //% weight=46\r\n    //% blockId=radio_datagram_receive block=\"radio receive number\" blockGap=8\r\n    //% deprecated=true\r\n    int receiveNumber()\r\n    {\r\n        if (radioEnable() != MICROBIT_OK) return 0;\r\n        receivePacket(false);\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * Registers code to run when a packet is received over radio.\r\n     */\r\n    //% help=radio/on-data-received\r\n    //% weight=50\r\n    //% blockId=radio_datagram_received_event block=\"radio on data received\" blockGap=8\r\n    //% deprecated=true\r\n    void onDataReceived(Action body) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        registerWithDal(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, body);\r\n        // make sure the receive buffer has a free spot\r\n        receiveNumber();\r\n    }\r\n\r\n\r\n    /**\r\n     * Reads the next packet from the radio queue and returns the packet's string\r\n     * payload or the empty string if the packet did not contain a string.\r\n     */\r\n    //% blockId=radio_datagram_receive_string block=\"radio receive string\" blockGap=8\r\n    //% weight=44\r\n    //% help=radio/receive-string\r\n    //% deprecated=true\r\n    StringData* receiveString() {\r\n        if (radioEnable() != MICROBIT_OK) return ManagedString().leakData();\r\n        receivePacket(false);\r\n        return msg;\r\n    }\r\n\r\n    /**\r\n     * Gets the received signal strength indicator (RSSI) from the last packet taken\r\n     * from the radio queue (via ``receiveNumber``, ``receiveString``, etc). Not supported in simulator.\r\n     * namespace=radio\r\n     */\r\n    //% help=radio/received-signal-strength\r\n    //% weight=40\r\n    //% blockId=radio_datagram_rssi block=\"radio received signal strength\"\r\n    //% deprecated=true\r\n    int receivedSignalStrength() {\r\n        if (radioEnable() != MICROBIT_OK) return 0;\r\n        return packet.getRSSI();\r\n    }\r\n\r\n    /**\r\n     * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\r\n     * @param id the group id between ``0`` and ``255``, eg: 1\r\n     */\r\n    //% help=radio/set-group\r\n    //% weight=10 blockGap=8\r\n    //% blockId=radio_set_group block=\"radio set group %ID\"\r\n    //% id.min=0 id.max=255\r\n    void setGroup(int id) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        uBit.radio.setGroup(id);\r\n    }\r\n\r\n    /**\r\n     * Change the output power level of the transmitter to the given value.\r\n    * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7\r\n    */\r\n    //% help=radio/set-transmit-power\r\n    //% weight=9 blockGap=8\r\n    //% blockId=radio_set_transmit_power block=\"radio set transmit power %power\"\r\n    //% power.min=0 power.max=7\r\n    //% advanced=true\r\n    void setTransmitPower(int power) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        uBit.radio.setTransmitPower(power);\r\n    }\r\n\r\n    /**\r\n    * Set the radio to transmit the serial number in each message.\r\n    * @param transmit value indicating if the serial number is transmitted, eg: true\r\n    */\r\n    //% help=radio/set-transmit-serial-number\r\n    //% weight=8 blockGap=8\r\n    //% blockId=radio_set_transmit_serial_number block=\"radio set transmit serial number %transmit\"\r\n    //% advanced=true\r\n    void setTransmitSerialNumber(bool transmit) {\r\n        if (radioEnable() != MICROBIT_OK) return;\r\n        transmitSerialNumber = transmit;\r\n    }\r\n\r\n    /**\r\n     * Returns the number payload from the last packet taken from the radio queue\r\n     * (via ``receiveNumber``, ``receiveString``, etc) or 0 if that packet did not\r\n     * contain a number.\r\n     */\r\n    //% help=radio/received-number\r\n    int receivedNumber() {\r\n        if (radioEnable() != MICROBIT_OK) return 0;\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * Returns the serial number of the sender micro:bit from the last packet taken\r\n     * from the radio queue (via ``receiveNumber``, ``receiveString``, etc) or 0 if\r\n     * that packet did not send a serial number.\r\n     */\r\n    //% help=radio/received-serial\r\n    uint32_t receivedSerial() {\r\n        if (radioEnable() != MICROBIT_OK) return 0;\r\n        return serial;\r\n    }\r\n\r\n    /**\r\n     * Returns the string payload from the last packet taken from the radio queue\r\n     * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that\r\n     * packet did not contain a string.\r\n     */\r\n    //% help=radio/received-string\r\n    StringData* receivedString() {\r\n        if (radioEnable() != MICROBIT_OK || NULL == msg) return ManagedString().leakData();\r\n        return msg;\r\n    }\r\n\r\n    /**\r\n     * Returns the buffer payload from the last packet taken from the radio queue\r\n     * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that\r\n     * packet did not contain a string.\r\n     */\r\n    //% help=radio/received-buffer\r\n    Buffer receivedBuffer() {\r\n        if (radioEnable() != MICROBIT_OK || NULL == bufMsg) return ManagedBuffer().leakData();\r\n        return bufMsg;\r\n    }\r\n\r\n    /**\r\n     * Returns the system time of the sender micro:bit at the moment when it sent the\r\n     * last packet taken from the radio queue (via ``receiveNumber``,\r\n     * ``receiveString``, etc).\r\n     */\r\n    //% help=radio/received-time\r\n    uint32_t receivedTime() {\r\n        if (radioEnable() != MICROBIT_OK) return 0;\r\n        return time;\r\n    }\r\n}\r\n",
      "radio.ts": "/**\n * Communicate data using radio packets\n */\n//% color=#E3008C weight=96 icon=\"\\uf012\"\nnamespace radio {\n    export class Packet {\n        /**\n         * The number payload if a number was sent in this packet (via ``sendNumber()`` or ``sendValue()``)\n         * or 0 if this packet did not contain a number.\n         */\n        public receivedNumber: number;\n        /**\n         * The string payload if a string was sent in this packet (via ``sendString()`` or ``sendValue()``)\n         * or the empty string if this packet did not contain a string.\n         */\n        public receivedString: string;\n        /**\n         * The buffer payload if a buffer was sent in this packet\n         * or the empty buffer\n         */\n        public receivedBuffer: Buffer;\n        /**\n         * The system time of the sender of the packet at the time the packet was sent.\n         */\n        public time: number;\n        /**\n         * The serial number of the sender of the packet or 0 if the sender did not sent their serial number.\n         */\n        public serial: number;\n        /**\n         * The received signal strength indicator (RSSI) of the packet.\n         */\n        public signal: number;\n    }\n\n    /**\n     * Registers code to run when the radio receives a packet. Also takes the\n     * received packet from the radio queue.\n     */\n    //% help=radio/on-data-packet-received\n    //% mutate=objectdestructuring\n    //% mutateText=Packet\n    //% mutateDefaults=\"receivedNumber;receivedString:name,receivedNumber:value;receivedString\"\n    //% blockId=radio_on_packet block=\"on radio received\" blockGap=8\n    export function onDataPacketReceived(cb: (packet: Packet) => void) {\n        onDataReceived(() => {\n            receiveNumber();\n            const packet = new Packet();\n            packet.receivedNumber = receivedNumber();\n            packet.time = receivedTime();\n            packet.serial = receivedSerial();\n            packet.receivedString = receivedString();\n            packet.receivedBuffer = receivedBuffer();\n            packet.signal = receivedSignalStrength();\n            cb(packet)\n        });\n    }\n}\n",
      "shims.d.ts": "// Auto-generated. Do not edit.\n\n\n\n    //% color=270 weight=96 icon=\"\\uf012\"\ndeclare namespace radio {\n\n    /**\n     * Broadcasts a number over radio to any connected micro:bit in the group.\n     */\n    //% help=radio/send-number\n    //% weight=60\n    //% blockId=radio_datagram_send block=\"radio send number %value\" blockGap=8 shim=radio::sendNumber\n    function sendNumber(value: number): void;\n\n    /**\n     * Broadcasts a name / value pair along with the device serial number\n     * and running time to any connected micro:bit in the group.\n     * @param name the field name (max 12 characters), eg: \"name\"\n     * @param value the numberic value\n     */\n    //% help=radio/send-value\n    //% weight=59\n    //% blockId=radio_datagram_send_value block=\"radio send|value %name|= %value\" blockGap=8 shim=radio::sendValue\n    function sendValue(name: string, value: number): void;\n\n    /**\n     * Broadcasts a string along with the device serial number\n     * and running time to any connected micro:bit in the group.\n     */\n    //% help=radio/send-string\n    //% weight=58\n    //% blockId=radio_datagram_send_string block=\"radio send string %msg\" shim=radio::sendString\n    function sendString(msg: string): void;\n\n    /**\n     * Broadcasts a buffer (up to 19 bytes long) along with the device serial number\n     * and running time to any connected micro:bit in the group.\n     */\n    //% help=radio/send-buffer\n    //% weight=57\n    //% advanced=true shim=radio::sendBuffer\n    function sendBuffer(msg: Buffer): void;\n\n    /**\n     * Reads the next packet from the radio queue and and writes it to serial\n     * as JSON.\n     */\n    //% help=radio/write-value-to-serial\n    //% weight=3\n    //% blockId=radio_write_value_serial block=\"radio write value to serial\"\n    //% deprecated=true shim=radio::writeValueToSerial\n    function writeValueToSerial(): void;\n\n    /**\n     * Writes the last received packet to serial as JSON. This should be called\n     * within an ``onDataPacketReceived`` callback.\n     */\n    //% help=radio/write-received-packet-to-serial\n    //% weight=3\n    //% blockId=radio_write_packet_serial block=\"radio write received packet to serial\"\n    //% advanced=true shim=radio::writeReceivedPacketToSerial\n    function writeReceivedPacketToSerial(): void;\n\n    /**\n     * Reads the next packet from the radio queue and returns the packet's number\n     * payload or 0 if the packet did not contain a number.\n     */\n    //% help=radio/receive-number\n    //% weight=46\n    //% blockId=radio_datagram_receive block=\"radio receive number\" blockGap=8\n    //% deprecated=true shim=radio::receiveNumber\n    function receiveNumber(): number;\n\n    /**\n     * Registers code to run when a packet is received over radio.\n     */\n    //% help=radio/on-data-received\n    //% weight=50\n    //% blockId=radio_datagram_received_event block=\"radio on data received\" blockGap=8\n    //% deprecated=true shim=radio::onDataReceived\n    function onDataReceived(body: () => void): void;\n\n    /**\n     * Reads the next packet from the radio queue and returns the packet's string\n     * payload or the empty string if the packet did not contain a string.\n     */\n    //% blockId=radio_datagram_receive_string block=\"radio receive string\" blockGap=8\n    //% weight=44\n    //% help=radio/receive-string\n    //% deprecated=true shim=radio::receiveString\n    function receiveString(): string;\n\n    /**\n     * Gets the received signal strength indicator (RSSI) from the last packet taken\n     * from the radio queue (via ``receiveNumber``, ``receiveString``, etc). Not supported in simulator.\n     * namespace=radio\n     */\n    //% help=radio/received-signal-strength\n    //% weight=40\n    //% blockId=radio_datagram_rssi block=\"radio received signal strength\"\n    //% deprecated=true shim=radio::receivedSignalStrength\n    function receivedSignalStrength(): number;\n\n    /**\n     * Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\n     * @param id the group id between ``0`` and ``255``, eg: 1\n     */\n    //% help=radio/set-group\n    //% weight=10 blockGap=8\n    //% blockId=radio_set_group block=\"radio set group %ID\"\n    //% id.min=0 id.max=255 shim=radio::setGroup\n    function setGroup(id: number): void;\n\n    /**\n     * Change the output power level of the transmitter to the given value.\n     * @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7\n     */\n    //% help=radio/set-transmit-power\n    //% weight=9 blockGap=8\n    //% blockId=radio_set_transmit_power block=\"radio set transmit power %power\"\n    //% power.min=0 power.max=7\n    //% advanced=true shim=radio::setTransmitPower\n    function setTransmitPower(power: number): void;\n\n    /**\n     * Set the radio to transmit the serial number in each message.\n     * @param transmit value indicating if the serial number is transmitted, eg: true\n     */\n    //% help=radio/set-transmit-serial-number\n    //% weight=8 blockGap=8\n    //% blockId=radio_set_transmit_serial_number block=\"radio set transmit serial number %transmit\"\n    //% advanced=true shim=radio::setTransmitSerialNumber\n    function setTransmitSerialNumber(transmit: boolean): void;\n\n    /**\n     * Returns the number payload from the last packet taken from the radio queue\n     * (via ``receiveNumber``, ``receiveString``, etc) or 0 if that packet did not\n     * contain a number.\n     */\n    //% help=radio/received-number shim=radio::receivedNumber\n    function receivedNumber(): number;\n\n    /**\n     * Returns the serial number of the sender micro:bit from the last packet taken\n     * from the radio queue (via ``receiveNumber``, ``receiveString``, etc) or 0 if\n     * that packet did not send a serial number.\n     */\n    //% help=radio/received-serial shim=radio::receivedSerial\n    function receivedSerial(): number;\n\n    /**\n     * Returns the string payload from the last packet taken from the radio queue\n     * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that\n     * packet did not contain a string.\n     */\n    //% help=radio/received-string shim=radio::receivedString\n    function receivedString(): string;\n\n    /**\n     * Returns the buffer payload from the last packet taken from the radio queue\n     * (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that\n     * packet did not contain a string.\n     */\n    //% help=radio/received-buffer shim=radio::receivedBuffer\n    function receivedBuffer(): Buffer;\n\n    /**\n     * Returns the system time of the sender micro:bit at the moment when it sent the\n     * last packet taken from the radio queue (via ``receiveNumber``,\n     * ``receiveString``, etc).\n     */\n    //% help=radio/received-time shim=radio::receivedTime\n    function receivedTime(): number;\n}\n\n// Auto-generated. Do not edit. Really.\n"
    },
    "devices": {
      "README.md": "# devices\n",
      "devices.cpp": "#include \"pxt.h\"\r\n#include \"MESEvents.h\"\r\n\r\nusing namespace pxt;\r\n\r\nenum class MesCameraEvent {\r\n    //% block=\"take photo\"\r\n    TakePhoto = MES_CAMERA_EVT_TAKE_PHOTO,\r\n    //% block=\"start video capture\"\r\n    StartVideoCapture = MES_CAMERA_EVT_START_VIDEO_CAPTURE,\r\n    //% block=\"stop video capture\"\r\n    StopVideoCapture = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,\r\n    //% block=\"toggle front-rear\"\r\n    ToggleFrontRear = MES_CAMERA_EVT_TOGGLE_FRONT_REAR,\r\n    //% block=\"launch photo mode\"\r\n    LaunchPhotoMode = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,\r\n    //% block=\"launch video mode\"\r\n    LaunchVideoMode = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,\r\n    //% block=\"stop photo mode\"\r\n    StopPhotoMode = MES_CAMERA_EVT_STOP_PHOTO_MODE,\r\n    //% block=\"stop video mode\"\r\n    StopVideoMode = MES_CAMERA_EVT_STOP_VIDEO_MODE,\r\n};\r\n\r\nenum class MesAlertEvent {\r\n    //% block=\"display toast\"\r\n    DisplayToast = MES_ALERT_EVT_DISPLAY_TOAST,\r\n    //% block=\"vibrate\"\r\n    Vibrate = MES_ALERT_EVT_VIBRATE,\r\n    //% block=\"play sound\"\r\n    PlaySound = MES_ALERT_EVT_PLAY_SOUND,\r\n    //% block=\"play ring tone\"\r\n    PlayRingtone = MES_ALERT_EVT_PLAY_RINGTONE,\r\n    //% block=\"find my phone\"\r\n    FindMyPhone = MES_ALERT_EVT_FIND_MY_PHONE,\r\n    //% block=\"ring alarm\"\r\n    RingAlarm = MES_ALERT_EVT_ALARM1,\r\n    //% block=\"ring alarm 2\"\r\n    RingAlarm2 = MES_ALERT_EVT_ALARM2,\r\n    //% block=\"ring alarm 3\"\r\n    RingAlarm3 = MES_ALERT_EVT_ALARM3,\r\n    //% block=\"ring alarm 4\"\r\n    RingAlarm4 = MES_ALERT_EVT_ALARM4,\r\n    //% block=\"ring alarm 5\"\r\n    RingAlarm5 = MES_ALERT_EVT_ALARM5,\r\n    //% block=\"ring alarm 6\"\r\n    RingAlarm6 = MES_ALERT_EVT_ALARM6,\r\n};\r\n\r\nenum class MesDeviceInfo {\r\n    //% block=\"incoming call\"\r\n    IncomingCall = MES_DEVICE_INCOMING_CALL,\r\n    //% block=\"incoming message\"\r\n    IncomingMessage = MES_DEVICE_INCOMING_MESSAGE,\r\n    //% block=\"orientation landscape\"\r\n    OrientationLandscape = MES_DEVICE_ORIENTATION_LANDSCAPE,\r\n    //% block=\"orientation portrait\"\r\n    OrientationPortrait = MES_DEVICE_ORIENTATION_PORTRAIT,\r\n    //% block=\"shaken\"\r\n    Shaken = MES_DEVICE_GESTURE_DEVICE_SHAKEN,\r\n    //% block=\"display off\"\r\n    DisplayOff = MES_DEVICE_DISPLAY_OFF,\r\n    //% block=\"display on\"\r\n    DisplayOn = MES_DEVICE_DISPLAY_ON,\r\n};\r\n\r\nenum class MesRemoteControlEvent {\r\n    //% block=\"play\"\r\n    play = MES_REMOTE_CONTROL_EVT_PLAY,\r\n    //% block=\"pause\"\r\n    pause = MES_REMOTE_CONTROL_EVT_PAUSE,\r\n    //% block=\"stop\"\r\n    stop = MES_REMOTE_CONTROL_EVT_STOP,\r\n    //% block=\"next track\"\r\n    nextTrack = MES_REMOTE_CONTROL_EVT_NEXTTRACK,\r\n    //% block=\"previous track\"\r\n    previousTrack = MES_REMOTE_CONTROL_EVT_PREVTRACK,\r\n    //% block=\"forward\"\r\n    forward = MES_REMOTE_CONTROL_EVT_FORWARD,\r\n    //% block=\"rewind\"\r\n    rewind = MES_REMOTE_CONTROL_EVT_REWIND,\r\n    //% block=\"volume up\"\r\n    volumeUp = MES_REMOTE_CONTROL_EVT_VOLUMEUP,\r\n    //% block=\"volume down\"\r\n    volumeDown = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,\r\n};\r\n\r\n/**\r\n * Control a phone with the BBC micro:bit via Bluetooth.\r\n */\r\n//% color=#008272 weight=80 icon=\"\\uf10b\"\r\nnamespace devices {\r\n\r\n    static int _signalStrength = -1;\r\n    static void signalStrengthHandler(MicroBitEvent ev) { \r\n        // keep in sync with MESEvents.h\r\n        _signalStrength = ev.value - 1; \r\n    }\r\n    static void initSignalStrength() {\r\n        if (_signalStrength < 0) {\r\n            _signalStrength = 0;\r\n            uBit.messageBus.listen(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, signalStrengthHandler);\r\n        }        \r\n    }\r\n    \r\n    /**\r\n     * Returns the last signal strength reported by the paired device.\r\n     */\r\n    //% help=devices/signal-strength weight=24\r\n    //% blockId=devices_signal_strength block=\"signal strength\" blockGap=14 icon=\"\\uf012\" blockGap=14\r\n    int signalStrength() {\r\n        initSignalStrength();\r\n        return _signalStrength;\r\n    }\r\n\r\n    /**\r\n     * Registers code to run when the device notifies about a change of signal strength.\r\n     * @param body Code run when the signal strength changes.\r\n     */\r\n    //% weight=23 help=devices/on-signal-strength-changed\r\n    //% blockId=devices_signal_strength_changed_event block=\"on signal strength changed\" icon=\"\\uf012\"\r\n    void onSignalStrengthChanged(Action body) {\r\n        initSignalStrength();    \r\n        registerWithDal(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, body);\r\n    }\r\n}\r\n",
      "devices.ts": "\nnamespace devices {\n    /**\n     * Sends a ``camera`` command to the parent device.\n     * @param event event description\n     */\n    //% weight=30 help=devices/tell-camera-to\n    //% blockId=devices_camera icon=\"\\uf030\" block=\"tell camera to|%property\" blockGap=8\n    export function tellCameraTo(event: MesCameraEvent) {\n        control.raiseEvent(DAL.MES_CAMERA_ID, event);\n    }\n\n    /**\n     * Sends a ``remote control`` command to the parent device.\n     * @param event event description\n     */\n    //% weight=29 help=devices/tell-remote-control-to\n    //% blockId=devices_remote_control block=\"tell remote control to|%property\" blockGap=14 icon=\"\\uf144\"\n    export function tellRemoteControlTo(event: MesRemoteControlEvent) {\n        control.raiseEvent(DAL.MES_REMOTE_CONTROL_ID, event);\n    }\n\n    /**\n     * Sends an ``alert`` command to the parent device.\n     * @param event event description\n     */\n    //% weight=27 help=devices/raise-alert-to\n    //% blockId=devices_alert block=\"raise alert to|%property\" icon=\"\\uf0f3\"\n    export function raiseAlertTo(event: MesAlertEvent) {\n        control.raiseEvent(DAL.MES_ALERTS_ID, event);\n    }\n\n    /**\n     * Registers code to run when the device notifies about a particular event.\n     * @param event event description\n     * @param body code handler when event is triggered\n     */\n    //% help=devices/on-notified weight=26\n    //% blockId=devices_device_info_event block=\"on notified|%event\" icon=\"\\uf10a\"\n    export function onNotified(event: MesDeviceInfo, body: Action) {\n        control.onEvent(DAL.MES_DEVICE_INFO_ID, event, body);\n    }\n\n    /**\n     * Register code to run when the micro:bit receives a command from the paired gamepad.\n     * @param name button name\n     * @param body code to run when button is pressed\n     */\n    //% help=devices/on-gamepad-button weight=40\n    //% weight=25\n    //% blockId=devices_gamepad_event block=\"on gamepad button|%NAME\" icon=\"\\uf11b\"\n    export function onGamepadButton(name: MesDpadButtonInfo, body: Action) {\n        control.onEvent(DAL.MES_DPAD_CONTROLLER_ID, name, body);\n    }\n}",
      "enums.d.ts": "// Auto-generated. Do not edit.\n\n\n    declare const enum MesCameraEvent {\n    //% block=\"take photo\"\n    TakePhoto = 3,  // MES_CAMERA_EVT_TAKE_PHOTO\n    //% block=\"start video capture\"\n    StartVideoCapture = 4,  // MES_CAMERA_EVT_START_VIDEO_CAPTURE\n    //% block=\"stop video capture\"\n    StopVideoCapture = 5,  // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE\n    //% block=\"toggle front-rear\"\n    ToggleFrontRear = 8,  // MES_CAMERA_EVT_TOGGLE_FRONT_REAR\n    //% block=\"launch photo mode\"\n    LaunchPhotoMode = 1,  // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE\n    //% block=\"launch video mode\"\n    LaunchVideoMode = 2,  // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE\n    //% block=\"stop photo mode\"\n    StopPhotoMode = 6,  // MES_CAMERA_EVT_STOP_PHOTO_MODE\n    //% block=\"stop video mode\"\n    StopVideoMode = 7,  // MES_CAMERA_EVT_STOP_VIDEO_MODE\n    }\n\n\n    declare const enum MesAlertEvent {\n    //% block=\"display toast\"\n    DisplayToast = 1,  // MES_ALERT_EVT_DISPLAY_TOAST\n    //% block=\"vibrate\"\n    Vibrate = 2,  // MES_ALERT_EVT_VIBRATE\n    //% block=\"play sound\"\n    PlaySound = 3,  // MES_ALERT_EVT_PLAY_SOUND\n    //% block=\"play ring tone\"\n    PlayRingtone = 4,  // MES_ALERT_EVT_PLAY_RINGTONE\n    //% block=\"find my phone\"\n    FindMyPhone = 5,  // MES_ALERT_EVT_FIND_MY_PHONE\n    //% block=\"ring alarm\"\n    RingAlarm = 6,  // MES_ALERT_EVT_ALARM1\n    //% block=\"ring alarm 2\"\n    RingAlarm2 = 7,  // MES_ALERT_EVT_ALARM2\n    //% block=\"ring alarm 3\"\n    RingAlarm3 = 8,  // MES_ALERT_EVT_ALARM3\n    //% block=\"ring alarm 4\"\n    RingAlarm4 = 9,  // MES_ALERT_EVT_ALARM4\n    //% block=\"ring alarm 5\"\n    RingAlarm5 = 10,  // MES_ALERT_EVT_ALARM5\n    //% block=\"ring alarm 6\"\n    RingAlarm6 = 11,  // MES_ALERT_EVT_ALARM6\n    }\n\n\n    declare const enum MesDeviceInfo {\n    //% block=\"incoming call\"\n    IncomingCall = 7,  // MES_DEVICE_INCOMING_CALL\n    //% block=\"incoming message\"\n    IncomingMessage = 8,  // MES_DEVICE_INCOMING_MESSAGE\n    //% block=\"orientation landscape\"\n    OrientationLandscape = 1,  // MES_DEVICE_ORIENTATION_LANDSCAPE\n    //% block=\"orientation portrait\"\n    OrientationPortrait = 2,  // MES_DEVICE_ORIENTATION_PORTRAIT\n    //% block=\"shaken\"\n    Shaken = 4,  // MES_DEVICE_GESTURE_DEVICE_SHAKEN\n    //% block=\"display off\"\n    DisplayOff = 5,  // MES_DEVICE_DISPLAY_OFF\n    //% block=\"display on\"\n    DisplayOn = 6,  // MES_DEVICE_DISPLAY_ON\n    }\n\n\n    declare const enum MesRemoteControlEvent {\n    //% block=\"play\"\n    play = 1,  // MES_REMOTE_CONTROL_EVT_PLAY\n    //% block=\"pause\"\n    pause = 2,  // MES_REMOTE_CONTROL_EVT_PAUSE\n    //% block=\"stop\"\n    stop = 3,  // MES_REMOTE_CONTROL_EVT_STOP\n    //% block=\"next track\"\n    nextTrack = 4,  // MES_REMOTE_CONTROL_EVT_NEXTTRACK\n    //% block=\"previous track\"\n    previousTrack = 5,  // MES_REMOTE_CONTROL_EVT_PREVTRACK\n    //% block=\"forward\"\n    forward = 6,  // MES_REMOTE_CONTROL_EVT_FORWARD\n    //% block=\"rewind\"\n    rewind = 7,  // MES_REMOTE_CONTROL_EVT_REWIND\n    //% block=\"volume up\"\n    volumeUp = 8,  // MES_REMOTE_CONTROL_EVT_VOLUMEUP\n    //% block=\"volume down\"\n    volumeDown = 9,  // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN\n    }\ndeclare namespace devices {\n}\n\n// Auto-generated. Do not edit. Really.\n",
      "pxt.json": "{\n    \"name\": \"devices\",\n    \"description\": \"BETA -  Camera, remote control and other Bluetooth services. App required.\",\n    \"files\": [\n        \"README.md\",\n        \"enums.d.ts\",\n        \"shims.d.ts\",\n        \"devices.cpp\",\n        \"devices.ts\"\n    ],\n    \"public\": true,\n    \"dependencies\": {\n        \"core\": \"*\",\n        \"bluetooth\": \"*\"\n    }\n}",
      "shims.d.ts": "// Auto-generated. Do not edit.\n\n\n    /**\n     * Control a phone with the BBC micro:bit via Bluetooth.\n     */\n    //% color=#008272 weight=80 icon=\"\\uf10b\"\ndeclare namespace devices {\n\n    /**\n     * Returns the last signal strength reported by the paired device.\n     */\n    //% help=devices/signal-strength weight=24\n    //% blockId=devices_signal_strength block=\"signal strength\" blockGap=14 icon=\"\\uf012\" blockGap=14 shim=devices::signalStrength\n    function signalStrength(): number;\n\n    /**\n     * Registers code to run when the device notifies about a change of signal strength.\n     * @param body Code run when the signal strength changes.\n     */\n    //% weight=23 help=devices/on-signal-strength-changed\n    //% blockId=devices_signal_strength_changed_event block=\"on signal strength changed\" icon=\"\\uf012\" shim=devices::onSignalStrengthChanged\n    function onSignalStrengthChanged(body: () => void): void;\n}\n\n// Auto-generated. Do not edit. Really.\n"
    },
    "bluetooth": {
      "README.md": "# Bluetooth services\n",
      "bluetooth.cpp": "#include \"pxt.h\"\r\n#include \"MESEvents.h\"\r\n#include \"MicroBitUARTService.h\"\r\n\r\nusing namespace pxt;\r\n\r\n/**\r\n * Support for additional Bluetooth services.\r\n */\r\n//% color=#0082FB weight=96 icon=\"\\uf294\"\r\nnamespace bluetooth {\r\n    MicroBitUARTService *uart = NULL;\r\n\r\n    /**\r\n    *  Starts the Bluetooth accelerometer service\r\n    */\r\n    //% help=bluetooth/start-accelerometer-service\r\n    //% blockId=bluetooth_start_accelerometer_service block=\"bluetooth accelerometer service\"\r\n    //% parts=\"bluetooth\" weight=90 blockGap=8\r\n    void startAccelerometerService() {\r\n        new MicroBitAccelerometerService(*uBit.ble, uBit.accelerometer);        \r\n    }   \r\n\r\n    /**\r\n    *  Starts the Bluetooth button service\r\n    */\r\n    //% help=bluetooth/start-button-service\r\n    //% blockId=bluetooth_start_button_service block=\"bluetooth button service\" blockGap=8\r\n    //% parts=\"bluetooth\" weight=89\r\n    void startButtonService() {\r\n        new MicroBitButtonService(*uBit.ble);      \r\n    }\r\n\r\n    /**\r\n    *  Starts the Bluetooth IO pin service.\r\n    */\r\n    //% help=bluetooth/start-io-pin-service\r\n    //% blockId=bluetooth_start_io_pin_service block=\"bluetooth io pin service\" blockGap=8\r\n    //% parts=\"bluetooth\" weight=88\r\n    void startIOPinService() {\r\n        new MicroBitIOPinService(*uBit.ble, uBit.io);\r\n    }\r\n\r\n    /**\r\n    *  Starts the Bluetooth LED service\r\n    */\r\n    //% help=bluetooth/start-led-service\r\n    //% blockId=bluetooth_start_led_service block=\"bluetooth led service\" blockGap=8\r\n    //% parts=\"bluetooth\" weight=87\r\n    void startLEDService() {\r\n        new MicroBitLEDService(*uBit.ble, uBit.display);\r\n    }\r\n\r\n    /**\r\n    *  Starts the Bluetooth temperature service\r\n    */\r\n    //% help=bluetooth/start-temperature-service\r\n    //% blockId=bluetooth_start_temperature_service block=\"bluetooth temperature service\" blockGap=8\r\n    //% parts=\"bluetooth\" weight=86\r\n    void startTemperatureService() {    \r\n        new MicroBitTemperatureService(*uBit.ble, uBit.thermometer);        \r\n    }\r\n\r\n    /**\r\n    *  Starts the Bluetooth magnetometer service\r\n    */\r\n    //% help=bluetooth/start-magnetometer-service\r\n    //% blockId=bluetooth_start_magnetometer_service block=\"bluetooth magnetometer service\"\r\n    //% parts=\"bluetooth\" weight=85\r\n    void startMagnetometerService() {    \r\n        new MicroBitMagnetometerService(*uBit.ble, uBit.compass); \r\n    }\r\n\r\n\r\n    /**\r\n    *  Starts the Bluetooth UART service\r\n    */\r\n    //% help=bluetooth/start-uart-service\r\n    //% blockId=bluetooth_start_uart_service block=\"bluetooth uart service\"\r\n    //% parts=\"bluetooth\" advanced=true\r\n    void startUartService() {\r\n        if (uart) return;\r\n        // 61 octet buffer size is 3 x (MTU - 3) + 1\r\n        // MTU on nRF51822 is 23 octets. 3 are used by Attribute Protocol header data leaving 20 octets for payload\r\n        // So we allow a RX buffer that can contain 3 x max length messages plus one octet for a terminator character\r\n        uart = new MicroBitUARTService(*uBit.ble, 61, 60);\r\n    }\r\n    \r\n    //%\r\n    void uartWriteString(StringData *data) {\r\n        startUartService();\r\n    \tuart->send(ManagedString(data));\r\n    }    \r\n\r\n    //%\r\n    StringData* uartReadUntil(StringData *del) {\r\n        startUartService();\r\n        return uart->readUntil(ManagedString(del)).leakData();\r\n    }    \r\n\r\n    /**\r\n    * Registers an event to be fired when one of the delimiter is matched.\r\n    * @param delimiters the characters to match received characters against.\r\n    */\r\n    //% help=bluetooth/on-uart-data-received\r\n    //% weight=18 blockId=bluetooth_on_data_received block=\"bluetooth|on data received %delimiters=serial_delimiter_conv\"\r\n    void onUartDataReceived(StringData* delimiters, Action body) {\r\n      startUartService();\r\n      uart->eventOn(ManagedString(delimiters));\r\n      registerWithDal(MICROBIT_ID_BLE_UART, MICROBIT_UART_S_EVT_DELIM_MATCH, body);\r\n    }\r\n\r\n    /**\r\n     * Register code to run when the micro:bit is connected to over Bluetooth\r\n     * @param body Code to run when a Bluetooth connection is established\r\n     */\r\n    //% help=bluetooth/on-bluetooth-connected weight=20\r\n    //% blockId=bluetooth_on_connected block=\"on bluetooth connected\" blockGap=8\r\n    //% parts=\"bluetooth\"\r\n    void onBluetoothConnected(Action body) {\r\n        registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_CONNECTED, body);\r\n    }    \r\n\r\n     /**\r\n     * Register code to run when a bluetooth connection to the micro:bit is lost\r\n     * @param body Code to run when a Bluetooth connection is lost\r\n     */\r\n    //% help=bluetooth/on-bluetooth-disconnected weight=19\r\n    //% blockId=bluetooth_on_disconnected block=\"on bluetooth disconnected\"\r\n    //% parts=\"bluetooth\"\r\n    void onBluetoothDisconnected(Action body) {\r\n        registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, body);\r\n    } \r\n\r\n    const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10};\r\n    /**\r\n    * Advertise an Eddystone URL\r\n\t* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://makecode.com\"\r\n\t* @param power power level between 0 and 7, eg: 7\r\n    * @param connectable true to keep bluetooth connectable for other services, false otherwise.\r\n    */\r\n    //% blockId=eddystone_advertise_url block=\"bluetooth advertise url %url|with power %power|connectable %connectable\"\r\n    //% parts=bluetooth weight=11 blockGap=8\r\n    //% help=bluetooth/advertise-url blockExternalInputs=1\r\n    void advertiseUrl(StringData* url, int power, bool connectable) {\r\n        power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));\r\n        int8_t level = CALIBRATED_POWERS[power];\r\n        uBit.bleManager.advertiseEddystoneUrl(ManagedString(url), level, connectable);\r\n        uBit.bleManager.setTransmitPower(power);\r\n    }\r\n\r\n    /**\r\n    * Advertise an Eddystone UID\r\n\t* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)\r\n\t* @param power power level between 0 and 7, eg: 7\r\n    * @param connectable true to keep bluetooth connectable for other services, false otherwise.\r\n    */\r\n    //% parts=bluetooth weight=12 advanced=true\r\n    void advertiseUidBuffer(Buffer nsAndInstance, int power, bool connectable) {\r\n        ManagedBuffer buf(nsAndInstance);\r\n        if (buf.length() != 16) return;\r\n\r\n        power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));\r\n        int8_t level = CALIBRATED_POWERS[power];\r\n        uint8_t uidNs[10]; buf.readBytes(uidNs, 0, 10);\r\n        uint8_t uidInst[6]; buf.readBytes(uidInst, 10, 6);\r\n        uBit.bleManager.advertiseEddystoneUid((const char*)uidNs, (const char*)uidInst, level, connectable);\r\n    }\r\n\r\n    /**\r\n    * Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).\r\n    * @param power power level between 0 (minimal) and 7 (maximum), eg: 7.\r\n    */\r\n    //% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true\r\n    //% blockId=bluetooth_settransmitpower block=\"bluetooth set transmit power %power\"\r\n    void setTransmitPower(int power) {\r\n        uBit.bleManager.setTransmitPower(min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power)));\r\n    }\r\n\r\n    /**\r\n    * Stops advertising Eddystone end points\r\n    */\r\n    //% blockId=eddystone_stop_advertising block=\"bluetooth stop advertising\"\r\n    //% parts=bluetooth weight=10\r\n    //% help=bluetooth/stop-advertising advanced=true\r\n    void stopAdvertising() {\r\n        uBit.bleManager.stopAdvertising();\r\n    } \r\n}",
      "bluetooth.ts": "/**\n * Support for additional Bluetooth services.\n */\n//% color=#0082FB weight=96 icon=\"\\uf294\"\nnamespace bluetooth {\n    /**\n    *  Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.\n    */\n    //% help=bluetooth/uart-write-string weight=80\n    //% blockId=bluetooth_uart_write block=\"bluetooth uart|write string %data\" blockGap=8\n    //% parts=\"bluetooth\" shim=bluetooth::uartWriteString advanced=true\n    export function uartWriteString(data: string): void {\n        // dummy implementation for simulator\n        console.log(\"UART Write: \" + data)\n    }\n\n    /**\n     * Prints a numeric value to the serial\n     */\n    //% help=bluetooth/uart-write-number weight=79\n    //% weight=89 blockGap=8 advanced=true\n    //% blockId=bluetooth_uart_writenumber block=\"bluetooth uart|write number %value\"\n    export function uartWriteNumber(value: number): void {\n        uartWriteString(value.toString());\n    }\n\n    /**\n     * Writes a ``name: value`` pair line to the serial.\n     * @param name name of the value stream, eg: x\n     * @param value to write\n     */\n    //% weight=88 weight=78\n    //% help=bluetooth/uart-write-value advanced=true\n    //% blockId=bluetooth_uart_writevalue block=\"bluetooth uart|write value %name|= %value\"\n    export function uartWriteValue(name: string, value: number): void {\n        uartWriteString(name + \":\" + value + \"\\r\\n\");\n    }\n\n    /**\n     *  Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered.\n     */\n    //% help=bluetooth/uart-read-until weight=75\n    //% blockId=bluetooth_uart_read block=\"bluetooth uart|read until %del=serial_delimiter_conv\"\n    //% parts=\"bluetooth\" shim=bluetooth::uartReadUntil advanced=true\n    export function uartReadUntil(del: string): string {\n        // dummy implementation for simulator\n        return \"???\"\n    }\n\n    /**\n    * Advertise an Eddystone UID\n    * @param ns 4 last bytes of the namespace uid\n    * @param instance 4 last bytes of the instance uid\n    * @param power power level between 0 and 7, eg: 7\n    * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n    */\n    //% blockId=eddystone_advertise_uid block=\"bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable\"\n    //% parts=bluetooth weight=12 blockGap=8\n    //% help=bluetooth/advertise-uid blockExternalInputs=1\n    export function advertiseUid(ns: number, instance: number, power: number, connectable: boolean) {\n        const buf = pins.createBuffer(16);\n        buf.setNumber(NumberFormat.Int32BE, 6, ns);\n        buf.setNumber(NumberFormat.Int32BE, 12, instance);\n        bluetooth.advertiseUidBuffer(buf, power, connectable);\n    }\n}\n",
      "enums.d.ts": "// Auto-generated. Do not edit.\ndeclare namespace bluetooth {\n}\n\n// Auto-generated. Do not edit. Really.\n",
      "pxt.json": "{\n    \"name\": \"bluetooth\",\n    \"description\": \"Bluetooth services\",\n    \"files\": [\n        \"README.md\",\n        \"enums.d.ts\",\n        \"shims.d.ts\",\n        \"bluetooth.ts\",\n        \"bluetooth.cpp\"\n    ],\n    \"public\": true,\n    \"dependencies\": {\n        \"core\": \"*\"\n    },\n    \"yotta\": {\n        \"config\": {\n            \"microbit-dal\": {\n                \"bluetooth\": {\n                    \"enabled\": 1\n                }\n            }\n        },\n        \"optionalConfig\": {\n            \"microbit-dal\": {\n                \"gatt_table_size\": \"0x700\"\n            }\n        },\n        \"userConfigs\": [\n            {\n                \"description\": \"No Pairing Required: Anyone can connect via Bluetooth.\",\n                \"config\": {\n                    \"microbit-dal\": {\n                        \"bluetooth\": {\n                            \"open\": 1,\n                            \"pairing_mode\": 0,\n                            \"whitelist\": 0,\n                            \"security_level\": null\n                        }\n                    }\n                }\n            },\n            {\n                \"description\": \"JustWorks pairing (default): Pairing is automatic once the pairing is initiated.\",\n                \"config\": {\n                    \"microbit-dal\": {\n                        \"bluetooth\": {\n                            \"open\": null,\n                            \"pairing_mode\": null,\n                            \"whitelist\": null,\n                            \"security_level\": null\n                        }\n                    }\n                }\n            },\n            {\n                \"description\": \"Passkey pairing: Pairing requires 6 digit key to pair.\",\n                \"config\": {\n                    \"microbit-dal\": {\n                        \"bluetooth\": {\n                            \"open\": 0,\n                            \"pairing_mode\": 1,\n                            \"whitelist\": 1,\n                            \"security_level\": \"SECURITY_MODE_ENCRYPTION_WITH_MITM\"\n                        }\n                    }\n                }\n            }\n        ]\n    }\n}",
      "shims.d.ts": "// Auto-generated. Do not edit.\n\n\n    /**\n     * Support for additional Bluetooth services.\n     */\n    //% color=#0082FB weight=96 icon=\"\\uf294\"\ndeclare namespace bluetooth {\n\n    /**\n     *  Starts the Bluetooth accelerometer service\n     */\n    //% help=bluetooth/start-accelerometer-service\n    //% blockId=bluetooth_start_accelerometer_service block=\"bluetooth accelerometer service\"\n    //% parts=\"bluetooth\" weight=90 blockGap=8 shim=bluetooth::startAccelerometerService\n    function startAccelerometerService(): void;\n\n    /**\n     *  Starts the Bluetooth button service\n     */\n    //% help=bluetooth/start-button-service\n    //% blockId=bluetooth_start_button_service block=\"bluetooth button service\" blockGap=8\n    //% parts=\"bluetooth\" weight=89 shim=bluetooth::startButtonService\n    function startButtonService(): void;\n\n    /**\n     *  Starts the Bluetooth IO pin service.\n     */\n    //% help=bluetooth/start-io-pin-service\n    //% blockId=bluetooth_start_io_pin_service block=\"bluetooth io pin service\" blockGap=8\n    //% parts=\"bluetooth\" weight=88 shim=bluetooth::startIOPinService\n    function startIOPinService(): void;\n\n    /**\n     *  Starts the Bluetooth LED service\n     */\n    //% help=bluetooth/start-led-service\n    //% blockId=bluetooth_start_led_service block=\"bluetooth led service\" blockGap=8\n    //% parts=\"bluetooth\" weight=87 shim=bluetooth::startLEDService\n    function startLEDService(): void;\n\n    /**\n     *  Starts the Bluetooth temperature service\n     */\n    //% help=bluetooth/start-temperature-service\n    //% blockId=bluetooth_start_temperature_service block=\"bluetooth temperature service\" blockGap=8\n    //% parts=\"bluetooth\" weight=86 shim=bluetooth::startTemperatureService\n    function startTemperatureService(): void;\n\n    /**\n     *  Starts the Bluetooth magnetometer service\n     */\n    //% help=bluetooth/start-magnetometer-service\n    //% blockId=bluetooth_start_magnetometer_service block=\"bluetooth magnetometer service\"\n    //% parts=\"bluetooth\" weight=85 shim=bluetooth::startMagnetometerService\n    function startMagnetometerService(): void;\n\n    /**\n     *  Starts the Bluetooth UART service\n     */\n    //% help=bluetooth/start-uart-service\n    //% blockId=bluetooth_start_uart_service block=\"bluetooth uart service\"\n    //% parts=\"bluetooth\" advanced=true shim=bluetooth::startUartService\n    function startUartService(): void;\n\n    /**\n     * Registers an event to be fired when one of the delimiter is matched.\n     * @param delimiters the characters to match received characters against.\n     */\n    //% help=bluetooth/on-uart-data-received\n    //% weight=18 blockId=bluetooth_on_data_received block=\"bluetooth|on data received %delimiters=serial_delimiter_conv\" shim=bluetooth::onUartDataReceived\n    function onUartDataReceived(delimiters: string, body: () => void): void;\n\n    /**\n     * Register code to run when the micro:bit is connected to over Bluetooth\n     * @param body Code to run when a Bluetooth connection is established\n     */\n    //% help=bluetooth/on-bluetooth-connected weight=20\n    //% blockId=bluetooth_on_connected block=\"on bluetooth connected\" blockGap=8\n    //% parts=\"bluetooth\" shim=bluetooth::onBluetoothConnected\n    function onBluetoothConnected(body: () => void): void;\n\n    /**\n     * Register code to run when a bluetooth connection to the micro:bit is lost\n     * @param body Code to run when a Bluetooth connection is lost\n     */\n    //% help=bluetooth/on-bluetooth-disconnected weight=19\n    //% blockId=bluetooth_on_disconnected block=\"on bluetooth disconnected\"\n    //% parts=\"bluetooth\" shim=bluetooth::onBluetoothDisconnected\n    function onBluetoothDisconnected(body: () => void): void;\n\n    /**\n     * Advertise an Eddystone URL\n     * @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://makecode.com\"\n     * @param power power level between 0 and 7, eg: 7\n     * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n     */\n    //% blockId=eddystone_advertise_url block=\"bluetooth advertise url %url|with power %power|connectable %connectable\"\n    //% parts=bluetooth weight=11 blockGap=8\n    //% help=bluetooth/advertise-url blockExternalInputs=1 shim=bluetooth::advertiseUrl\n    function advertiseUrl(url: string, power: number, connectable: boolean): void;\n\n    /**\n     * Advertise an Eddystone UID\n     * @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)\n     * @param power power level between 0 and 7, eg: 7\n     * @param connectable true to keep bluetooth connectable for other services, false otherwise.\n     */\n    //% parts=bluetooth weight=12 advanced=true shim=bluetooth::advertiseUidBuffer\n    function advertiseUidBuffer(nsAndInstance: Buffer, power: number, connectable: boolean): void;\n\n    /**\n     * Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).\n     * @param power power level between 0 (minimal) and 7 (maximum), eg: 7.\n     */\n    //% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true\n    //% blockId=bluetooth_settransmitpower block=\"bluetooth set transmit power %power\" shim=bluetooth::setTransmitPower\n    function setTransmitPower(power: number): void;\n\n    /**\n     * Stops advertising Eddystone end points\n     */\n    //% blockId=eddystone_stop_advertising block=\"bluetooth stop advertising\"\n    //% parts=bluetooth weight=10\n    //% help=bluetooth/stop-advertising advanced=true shim=bluetooth::stopAdvertising\n    function stopAdvertising(): void;\n}\n\n// Auto-generated. Do not edit. Really.\n"
    },
    "blocksprj": {
      "README.md": "",
      "main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\r\n  <block type=\"pxt-on-start\"></block>\r\n  <block type=\"device_forever\"></block>\r\n</xml>",
      "main.ts": "\n",
      "pxt.json": "{\n    \"name\": \"{0} block\",\n    \"dependencies\": {\n        \"core\": \"*\",\n        \"radio\": \"*\"\n    },\n    \"description\": \"\",\n    \"files\": [\n        \"main.blocks\",\n        \"main.ts\",\n        \"README.md\"\n    ]\n}"
    },
    "bluetoothprj": {
      "README.md": "",
      "main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\">\r\n  <block type=\"pxt-on-start\"></block>\r\n</xml>",
      "main.ts": "\n",
      "pxt.json": "{\n    \"name\": \"{0} block\",\n    \"dependencies\": {\n        \"core\": \"*\",\n        \"bluetooth\": \"*\"\n    },\n    \"description\": \"\",\n    \"files\": [\n        \"main.blocks\",\n        \"main.ts\",\n        \"README.md\"\n    ]\n}"
    },
    "tsprj": {
      "README.md": "",
      "main.ts": "basic.showLeds(`\n    . . . . .\n    . # . # .\n    . . . . .\n    # . . . #\n    . # # # .\n    `);",
      "pxt.json": "{\n    \"name\": \"{0} bit\",\n    \"dependencies\": {\n        \"core\": \"*\",\n        \"radio\": \"*\"\n    },\n    \"description\": \"\",\n    \"files\": [\n        \"main.ts\",\n        \"README.md\"\n    ]\n}"
    }
  },
  "versions": {
    "target": "0.1.11",
    "pxt": "0.17.14",
    "pxtCrowdinBranch": "v0"
  }
}