text: // Copyright (c) 2014-16 Walter Bender
  //
  // This program is free software; you can redistribute it and/or
  // modify it under the terms of the The GNU Affero General Public
  // License as published by the Free Software Foundation; either
  // version 3 of the License, or (at your option) any later version.
  //
  // You should have received a copy of the GNU Affero General Public
  // License along with this library; if not, write to the Free Software
  // Foundation, 51 Franklin Street, Suite 500 Boston, MA 02110-1335 USA
  
  // Definition of basic blocks common to all branches
  
  // Some names changed between the Python verison and the
  // JS version so look up name in the conversion dictionary.
  var NAMEDICT = {
      'fullscreen': 'vspace',
      'fillscreen2': 'fillscreen',
      'comment': 'print',
      'sandwichclampcollapsed': 'clamp',
      'ifelse': 'ifthenelse',
      'xcor': 'x',
      'ycor': 'y',
      'seth': 'setheading',
      'remainder2': 'mod',
      'plus2': 'plus',
      'product2': 'multiply',
      'division2': 'divide',
      'minus2': 'minus',
      'stack': 'do',
      'hat': 'action',
      'stopstack': 'break',
      'clean': 'clear',
      'setxy2': 'setxy',
      'greater2': 'greater',
      'less2': 'less',
      'equal2': 'equal',
      'random2': 'random',
      'setvalue': 'setshade',
      'setchroma': 'setgrey',
      'setgray': 'setgrey',
      'gray': 'grey',
      'chroma': 'grey',
      'value': 'shade',
      'hue': 'color',
      'startfill': 'beginfill',
      'stopfill': 'endfill',
      'string': 'text',
      'shell': 'turtleshell'
  };
  
  
  // Define blocks here. Note: The blocks are placed on the palettes
  // from bottom to top, i.e., the block at the top of a palette will be
  // the last block added to a palette.
  
  function initBasicProtoBlocks(palettes, blocks) {
      blocks.palettes = palettes;
  
      // TURTLE PALETTE
  
      var headingBlock = new ProtoBlock('heading');
      headingBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['heading'] = headingBlock;
      headingBlock.staticLabels.push(_('heading'));
      headingBlock.adjustWidthToLabel();
      headingBlock.parameterBlock();
  
      var xBlock = new ProtoBlock('x');
      xBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['x'] = xBlock;
      xBlock.staticLabels.push(_('x'));
      xBlock.adjustWidthToLabel();
      xBlock.parameterBlock();
  
      var yBlock = new ProtoBlock('y');
      yBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['y'] = yBlock;
      yBlock.staticLabels.push(_('y'));
      yBlock.adjustWidthToLabel();
      yBlock.parameterBlock();
  
      var clearBlock = new ProtoBlock('clear');
      clearBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['clear'] = clearBlock;
      clearBlock.staticLabels.push(_('clear'));
      clearBlock.adjustWidthToLabel();
      clearBlock.zeroArgBlock();
  
      var controlPoint2Block = new ProtoBlock('controlpoint2');
      controlPoint2Block.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['controlpoint2'] = controlPoint2Block;
      controlPoint2Block.staticLabels.push(_('control point 2'), _('x'), _('y'));
      controlPoint2Block.adjustWidthToLabel();
      controlPoint2Block.twoArgBlock();
      controlPoint2Block.defaults.push(200);
      controlPoint2Block.defaults.push(100);
      controlPoint2Block.dockTypes[1] = 'numberin';
      controlPoint2Block.dockTypes[2] = 'numberin';
  
      var controlPoint1Block = new ProtoBlock('controlpoint1');
      controlPoint1Block.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['controlpoint1'] = controlPoint1Block;
      controlPoint1Block.staticLabels.push(_('control point 1'), _('x'), _('y'));
      controlPoint1Block.adjustWidthToLabel();
      controlPoint1Block.twoArgBlock();
      controlPoint1Block.defaults.push(0);
      controlPoint1Block.defaults.push(100);
      controlPoint1Block.dockTypes[1] = 'numberin';
      controlPoint1Block.dockTypes[2] = 'numberin';
  
      var bezierBlock = new ProtoBlock('bezier');
      bezierBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['bezier'] = bezierBlock;
      bezierBlock.staticLabels.push(_('bezier'), _('x'), _('y'));
      bezierBlock.adjustWidthToLabel();
      bezierBlock.twoArgBlock();
      bezierBlock.defaults.push(200);
      bezierBlock.defaults.push(0);
      bezierBlock.dockTypes[1] = 'numberin';
      bezierBlock.dockTypes[2] = 'numberin';
  
      var arcBlock = new ProtoBlock('arc');
      arcBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['arc'] = arcBlock;
      arcBlock.staticLabels.push(_('arc'), _('angle'), _('radius'));
      arcBlock.adjustWidthToLabel();
      arcBlock.twoArgBlock();
      arcBlock.defaults.push(90);
      arcBlock.defaults.push(100);
      arcBlock.dockTypes[1] = 'numberin';
  
      var setheadingBlock = new ProtoBlock('setheading');
      setheadingBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['setheading'] = setheadingBlock;
      setheadingBlock.staticLabels.push(_('set heading'));
      setheadingBlock.adjustWidthToLabel();
      setheadingBlock.oneArgBlock();
      setheadingBlock.defaults.push(0);
  
      var setxyBlock = new ProtoBlock('setxy');
      setxyBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['setxy'] = setxyBlock;
      setxyBlock.staticLabels.push(_('set xy'), _('x'), _('y'));
      setxyBlock.adjustWidthToLabel();
      setxyBlock.twoArgBlock();
      setxyBlock.defaults.push(0);
      setxyBlock.defaults.push(0);
      setxyBlock.dockTypes[1] = 'numberin';
  
      var rightBlock = new ProtoBlock('right');
      rightBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['right'] = rightBlock;
      rightBlock.staticLabels.push(_('right'));
      rightBlock.adjustWidthToLabel();
      rightBlock.oneArgBlock();
      rightBlock.defaults.push(90);
  
      var leftBlock = new ProtoBlock('left');
      leftBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['left'] = leftBlock;
      leftBlock.staticLabels.push(_('left'));
      leftBlock.adjustWidthToLabel();
      leftBlock.oneArgBlock();
      leftBlock.defaults.push(90);
  
      var backBlock = new ProtoBlock('back');
      backBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['back'] = backBlock;
      backBlock.staticLabels.push(_('back'));
      backBlock.adjustWidthToLabel();
      backBlock.oneArgBlock();
      backBlock.defaults.push(100);
  
      var forwardBlock = new ProtoBlock('forward');
      forwardBlock.palette = palettes.dict['turtle'];
      blocks.protoBlockDict['forward'] = forwardBlock;
      forwardBlock.staticLabels.push(_('forward'));
      forwardBlock.adjustWidthToLabel();
      forwardBlock.oneArgBlock();
      forwardBlock.defaults.push(100);
  
      // PEN PALETTE
      
      var beginFillBlock = new ProtoBlock('beginfill');
      beginFillBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['beginfill'] = beginFillBlock;
      beginFillBlock.hidden = true;
      beginFillBlock.staticLabels.push(_('begin fill'));
      beginFillBlock.adjustWidthToLabel();
      beginFillBlock.zeroArgBlock();
  
      var endFillBlock = new ProtoBlock('endfill');
      endFillBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['endfill'] = endFillBlock;
      endFillBlock.hidden = true;
      endFillBlock.staticLabels.push(_('end fill'));
      endFillBlock.adjustWidthToLabel();
      endFillBlock.zeroArgBlock();
  
      var fillscreenBlock = new ProtoBlock('fillscreen');
      fillscreenBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['fillscreen'] = fillscreenBlock;
      fillscreenBlock.hidden = true;
      fillscreenBlock.staticLabels.push(_('background'));
      fillscreenBlock.adjustWidthToLabel();
      fillscreenBlock.threeArgBlock();
  
      var colorBlock = new ProtoBlock('color');
      colorBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['color'] = colorBlock;
      colorBlock.staticLabels.push(_('color'));
      colorBlock.adjustWidthToLabel();
      colorBlock.parameterBlock();
  
      var shadeBlock = new ProtoBlock('shade');
      shadeBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['shade'] = shadeBlock;
      shadeBlock.staticLabels.push(_('shade'));
      shadeBlock.adjustWidthToLabel();
      shadeBlock.parameterBlock();
  
      var chromaBlock = new ProtoBlock('grey');
      chromaBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['grey'] = chromaBlock;
      chromaBlock.staticLabels.push(_('grey'));
      chromaBlock.adjustWidthToLabel();
      chromaBlock.parameterBlock();
  
      var pensizeBlock = new ProtoBlock('pensize');
      pensizeBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['pensize'] = pensizeBlock;
      pensizeBlock.staticLabels.push(_('pen size'));
      pensizeBlock.adjustWidthToLabel();
      pensizeBlock.parameterBlock();
  
      var setfontBlock = new ProtoBlock('setfont');
      setfontBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['setfont'] = setfontBlock;
      setfontBlock.staticLabels.push(_('set font'));
      setfontBlock.adjustWidthToLabel();
      setfontBlock.oneArgBlock();
      setfontBlock.defaults.push(DEFAULTFONT);
      setfontBlock.dockTypes[1] = 'textin';
  
      var backgroundBlock = new ProtoBlock('background');
      backgroundBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['background'] = backgroundBlock;
      backgroundBlock.staticLabels.push(_('background'));
      backgroundBlock.adjustWidthToLabel();
      backgroundBlock.zeroArgBlock();
  
      var hollowBlock = new ProtoBlock('hollowline');
      hollowBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['hollowline'] = hollowBlock;
      hollowBlock.staticLabels.push(_('hollow line'));
      hollowBlock.adjustWidthToLabel();
      hollowBlock.flowClampZeroArgBlock();
  
      var fillBlock = new ProtoBlock('fill');
      fillBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['fill'] = fillBlock;
      fillBlock.staticLabels.push(_('fill'));
      fillBlock.adjustWidthToLabel();
      fillBlock.flowClampZeroArgBlock();
  
      var penupBlock = new ProtoBlock('penup');
      penupBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['penup'] = penupBlock;
      penupBlock.staticLabels.push(_('pen up'));
      penupBlock.adjustWidthToLabel();
      penupBlock.zeroArgBlock();
  
      var pendownBlock = new ProtoBlock('pendown');
      pendownBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['pendown'] = pendownBlock;
      pendownBlock.staticLabels.push(_('pen down'));
      pendownBlock.adjustWidthToLabel();
      pendownBlock.zeroArgBlock();
  
      var setpensizeBlock = new ProtoBlock('setpensize');
      setpensizeBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['setpensize'] = setpensizeBlock;
      setpensizeBlock.staticLabels.push(_('set pen size'));
      setpensizeBlock.adjustWidthToLabel();
      setpensizeBlock.oneArgBlock();
      setpensizeBlock.defaults.push(5);
  
      var settranslucencyBlock = new ProtoBlock('settranslucency');
      settranslucencyBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['settranslucency'] = settranslucencyBlock;
      settranslucencyBlock.staticLabels.push(_('set translucency'));
      settranslucencyBlock.adjustWidthToLabel();
      settranslucencyBlock.oneArgBlock();
      settranslucencyBlock.defaults.push(50);
  
      var sethueBlock = new ProtoBlock('sethue');
      sethueBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['sethue'] = sethueBlock;
      sethueBlock.staticLabels.push(_('set hue'));
      sethueBlock.adjustWidthToLabel();
      sethueBlock.oneArgBlock();
      sethueBlock.defaults.push(0);
  
      var setshadeBlock = new ProtoBlock('setshade');
      setshadeBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['setshade'] = setshadeBlock;
      setshadeBlock.staticLabels.push(_('set shade'));
      setshadeBlock.adjustWidthToLabel();
      setshadeBlock.oneArgBlock();
      setshadeBlock.defaults.push(50);
  
      var setchromaBlock = new ProtoBlock('setgrey');
      setchromaBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['setgrey'] = setchromaBlock;
      setchromaBlock.staticLabels.push(_('set grey'));
      setchromaBlock.adjustWidthToLabel();
      setchromaBlock.oneArgBlock();
      setchromaBlock.defaults.push(100);
  
      var setcolorBlock = new ProtoBlock('setcolor');
      setcolorBlock.palette = palettes.dict['pen'];
      blocks.protoBlockDict['setcolor'] = setcolorBlock;
      setcolorBlock.staticLabels.push(_('set color'));
      setcolorBlock.adjustWidthToLabel();
      setcolorBlock.oneArgBlock();
      setcolorBlock.defaults.push(0);
  
      // NUMBERS PALETTE
      
      var intBlock = new ProtoBlock('int');
      intBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['int'] = intBlock;
      intBlock.staticLabels.push(_('int'));
      intBlock.adjustWidthToLabel();
      intBlock.oneArgMathBlock();
      intBlock.defaults.push(100)
  
      var greaterBlock = new ProtoBlock('greater');
      greaterBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['greater'] = greaterBlock;
      greaterBlock.fontsize = 14;
      greaterBlock.staticLabels.push('&gt;');
      greaterBlock.extraWidth = 20;
      greaterBlock.booleanTwoArgBlock();
  
      var lessBlock = new ProtoBlock('less');
      lessBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['less'] = lessBlock;
      lessBlock.fontsize = 14;
      lessBlock.staticLabels.push('&lt;');
      lessBlock.extraWidth = 20;
      lessBlock.booleanTwoArgBlock();
  
      var equalBlock = new ProtoBlock('equal');
      equalBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['equal'] = equalBlock;
      equalBlock.fontsize = 14;
      equalBlock.staticLabels.push('=');
      equalBlock.extraWidth = 20;
      equalBlock.booleanTwoArgBlock();
      equalBlock.dockTypes[0] = 'booleanout';
      equalBlock.dockTypes[1] = 'anyin';
      equalBlock.dockTypes[2] = 'anyin';
  
      var andBlock = new ProtoBlock('and');
      andBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['and'] = andBlock;
      andBlock.extraWidth = 10;
      andBlock.staticLabels.push(_('and'));
      andBlock.booleanTwoBooleanArgBlock();
  
      var orBlock = new ProtoBlock('or');
      orBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['or'] = orBlock;
      orBlock.extraWidth = 10;
      orBlock.staticLabels.push(_('or'));
      orBlock.booleanTwoBooleanArgBlock();
  
      var notBlock = new ProtoBlock('not');
      notBlock.palette = palettes.dict['boolean'];
      blocks.protoBlockDict['not'] = notBlock;
      notBlock.extraWidth = 30;
      notBlock.staticLabels.push(_('not'));
      notBlock.booleanOneBooleanArgBlock();
  
      var modBlock = new ProtoBlock('mod');
      modBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['mod'] = modBlock;
      modBlock.staticLabels.push(_('mod'));
      modBlock.adjustWidthToLabel();
      modBlock.twoArgMathBlock();
      modBlock.defaults.push(100, 10)
  
      var sqrtBlock = new ProtoBlock('sqrt');
      sqrtBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['sqrt'] = sqrtBlock;
      sqrtBlock.staticLabels.push(_('sqrt'));
      sqrtBlock.adjustWidthToLabel();
      sqrtBlock.oneArgMathBlock();
      sqrtBlock.defaults.push(100)
  
      var divideBlock = new ProtoBlock('divide');
      divideBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['divide'] = divideBlock;
      divideBlock.fontsize = 14;
      divideBlock.staticLabels.push('/');
      divideBlock.twoArgMathBlock();
      divideBlock.defaults.push(100, 10)
  
      var powerBlock = new ProtoBlock('power');
      powerBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['power'] = powerBlock;
      powerBlock.fontsize = 14;
      powerBlock.staticLabels.push('^');
      powerBlock.twoArgMathBlock();
      powerBlock.defaults.push(2,4)
  
      var multiplyBlock = new ProtoBlock('multiply');
      multiplyBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['multiply'] = multiplyBlock;
      multiplyBlock.fontsize = 14;
      multiplyBlock.staticLabels.push('×');
      multiplyBlock.twoArgMathBlock();
      multiplyBlock.defaults.push(10, 10)
  
      var negBlock = new ProtoBlock('neg');
      negBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['neg'] = negBlock;
      negBlock.fontsize = 14;
      negBlock.staticLabels.push('–');
      negBlock.oneArgMathBlock();
  
      var minusBlock = new ProtoBlock('minus');
      minusBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['minus'] = minusBlock;
      minusBlock.fontsize = 14;
      minusBlock.staticLabels.push('–');
      minusBlock.twoArgMathBlock();
      minusBlock.defaults.push(100, 50)
  
      var plusBlock = new ProtoBlock('plus');
      plusBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['plus'] = plusBlock;
      plusBlock.fontsize = 14;
      plusBlock.staticLabels.push('+');
      plusBlock.twoArgMathBlock();
      plusBlock.dockTypes[0] = 'anyout';
      plusBlock.dockTypes[1] = 'anyin';
      plusBlock.dockTypes[2] = 'anyin';
      plusBlock.defaults.push(100, 100)
  
      var oneOfBlock = new ProtoBlock('oneOf');
      oneOfBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['oneOf'] = oneOfBlock;
      oneOfBlock.staticLabels.push(_('one of'), _('this'), _('that'));
      oneOfBlock.adjustWidthToLabel();
      oneOfBlock.twoArgMathBlock();
      oneOfBlock.dockTypes[0] = 'anyout';
      oneOfBlock.dockTypes[1] = 'anyin';
      oneOfBlock.dockTypes[2] = 'anyin';
      oneOfBlock.defaults.push(-90, 90);
  
      var randomBlock = new ProtoBlock('random');
      randomBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['random'] = randomBlock;
      randomBlock.staticLabels.push(_('random'), _('min'), _('max'));
      randomBlock.adjustWidthToLabel();
      randomBlock.twoArgMathBlock();
      randomBlock.defaults.push(0, 100);
  
      var numberBlock = new ProtoBlock('number');
      numberBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['number'] = numberBlock;
      numberBlock.valueBlock();
  
      // BLOCKS PALETTE
  
      var incrementOneBlock = new ProtoBlock('incrementOne');
      incrementOneBlock.palette = palettes.dict['boxes'];
      blocks.protoBlockDict['incrementOne'] = incrementOneBlock;
      incrementOneBlock.staticLabels.push(_('add 1 to'));
      incrementOneBlock.adjustWidthToLabel();
      incrementOneBlock.oneArgBlock();
  
      var incrementBlock = new ProtoBlock('increment');
      incrementBlock.palette = palettes.dict['boxes'];
      blocks.protoBlockDict['increment'] = incrementBlock;
      incrementBlock.staticLabels.push(_('add'), _('to'), _('value'));
      incrementBlock.adjustWidthToLabel();
      incrementBlock.twoArgBlock();
      incrementBlock.dockTypes[1] = 'anyin';
      incrementBlock.dockTypes[2] = 'anyin';
  
      var boxBlock = new ProtoBlock('box');
      boxBlock.palette = palettes.dict['boxes'];
      blocks.protoBlockDict['box'] = boxBlock;
      boxBlock.staticLabels.push(_('box'));
      boxBlock.extraWidth = 10;
      boxBlock.adjustWidthToLabel();
      boxBlock.oneArgMathBlock();
      boxBlock.defaults.push(_('box'));
      boxBlock.dockTypes[0] = 'anyout';
      // Show the value in the box as if it were a parameter.
      boxBlock.parameter = true;
      boxBlock.dockTypes[1] = 'anyin';
  
      var storeinBlock = new ProtoBlock('storein');
      storeinBlock.palette = palettes.dict['boxes'];
      blocks.protoBlockDict['storein'] = storeinBlock;
      storeinBlock.staticLabels.push(_('store in'), _('name'), _('value'));
      storeinBlock.adjustWidthToLabel();
      storeinBlock.twoArgBlock();
      storeinBlock.defaults.push(_('box'));
      storeinBlock.defaults.push(100);
      storeinBlock.dockTypes[1] = 'anyin';
      storeinBlock.dockTypes[2] = 'anyin';
  
      var namedBoxBlock = new ProtoBlock('namedbox');
      namedBoxBlock.palette = palettes.dict['boxes'];
      blocks.protoBlockDict['namedbox'] = namedBoxBlock;
      namedBoxBlock.staticLabels.push(_('box'));
      namedBoxBlock.extraWidth = 10;
      namedBoxBlock.adjustWidthToLabel();
      namedBoxBlock.parameterBlock();
      namedBoxBlock.dockTypes[0] = 'anyout';
  
      // ACTION PALETTE
      
      var doBlock = new ProtoBlock('do');
      doBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['do'] = doBlock;
      doBlock.staticLabels.push(_('do'));
      doBlock.adjustWidthToLabel();
      doBlock.oneArgBlock();
      doBlock.defaults.push(_('action'));
      doBlock.dockTypes[1] = 'anyin';
  
      var returnBlock = new ProtoBlock('return');
      returnBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['return'] = returnBlock;
      returnBlock.staticLabels.push(_('return'));
      returnBlock.extraWidth = 10;
      returnBlock.adjustWidthToLabel();
      returnBlock.oneArgBlock();
      returnBlock.defaults.push(100);
      returnBlock.dockTypes[1] = 'anyin';
  
      var returnToUrlBlock = new ProtoBlock('returnToUrl');
      returnToUrlBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['returnToUrl'] = returnToUrlBlock;
      returnToUrlBlock.staticLabels.push(_('return to URL'));
      returnToUrlBlock.extraWidth = 10;
      returnToUrlBlock.adjustWidthToLabel();
      returnToUrlBlock.oneArgBlock();
      returnToUrlBlock.defaults.push(_('100'));
      returnToUrlBlock.dockTypes[1] = 'anyin';
  
      var calcBlock = new ProtoBlock('calc');
      calcBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['calc'] = calcBlock;
      calcBlock.staticLabels.push(_('calculate'));
      calcBlock.adjustWidthToLabel();
      calcBlock.oneArgMathBlock();
      calcBlock.defaults.push(_('action'));
      calcBlock.dockTypes[0] = 'anyout';
      calcBlock.dockTypes[1] = 'anyin';
  
      var namedCalcBlock = new ProtoBlock('namedcalc');
      namedCalcBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['namedcalc'] = namedCalcBlock;
      namedCalcBlock.staticLabels.push(_('action'));
      namedCalcBlock.extraWidth = 10;
      namedCalcBlock.adjustWidthToLabel();
      namedCalcBlock.parameterBlock();
  
      var namedDoArgBlock = new ProtoBlock('nameddoArg');
      namedDoArgBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['nameddoArg'] = namedDoArgBlock;
      namedDoArgBlock.staticLabels.push(_('do'));
      namedDoArgBlock.adjustWidthToLabel();
      namedDoArgBlock.argClampBlock();
      namedDoArgBlock.dockTypes[1] = 'anyin';
  
      var namedCalcArgBlock = new ProtoBlock('namedcalcArg');
      namedCalcArgBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['namedcalcArg'] = namedCalcArgBlock;
      namedCalcArgBlock.staticLabels.push(_('calculate'));
      namedCalcArgBlock.adjustWidthToLabel();
      namedCalcArgBlock.argClampMathBlock();
      namedCalcArgBlock.dockTypes[0] = 'anyout';
      namedCalcArgBlock.dockTypes[1] = 'anyin';
  
      var doArgBlock = new ProtoBlock('doArg');
      doArgBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['doArg'] = doArgBlock;
      doArgBlock.staticLabels.push(_('do'));
      doArgBlock.adjustWidthToLabel();
      doArgBlock.argClampOneArgBlock();
      doArgBlock.defaults.push(_('action'));
      doArgBlock.dockTypes[1] = 'anyin';
      doArgBlock.dockTypes[2] = 'anyin';
  
      var calcArgBlock = new ProtoBlock('calcArg');
      calcArgBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['calcArg'] = calcArgBlock;
      calcArgBlock.staticLabels.push(_('calculate'));
      calcArgBlock.adjustWidthToLabel();
      calcArgBlock.argClampOneArgMathBlock();
      calcArgBlock.defaults.push(_('action'));
      calcArgBlock.dockTypes[0] = 'anyout';
      calcArgBlock.dockTypes[1] = 'anyin';
      calcArgBlock.dockTypes[2] = 'anyin';
  
      var argBlock = new ProtoBlock('arg');
      argBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['arg'] = argBlock;
      argBlock.staticLabels.push('arg');
      argBlock.adjustWidthToLabel();
      argBlock.oneArgMathBlock();
      argBlock.defaults.push(1);
      argBlock.dockTypes[0] = 'anyout';
      argBlock.dockTypes[1] = 'numberin';
  
      var namedArgBlock = new ProtoBlock('namedarg');
      namedArgBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['namedarg'] = namedArgBlock;
      namedArgBlock.staticLabels.push('arg ' + 1);
      namedArgBlock.adjustWidthToLabel();
      namedArgBlock.parameterBlock();
  
      var listenBlock = new ProtoBlock('listen');
      listenBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['listen'] = listenBlock;
      listenBlock.staticLabels.push(_('on'), _('event'), _('do'));
      listenBlock.adjustWidthToLabel();
      listenBlock.twoArgBlock();
      listenBlock.defaults.push(_('event'));
      listenBlock.defaults.push(_('action'));
      listenBlock.dockTypes[1] = 'textin';
      listenBlock.dockTypes[2] = 'textin';
  
      var dispatchBlock = new ProtoBlock('dispatch');
      dispatchBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['dispatch'] = dispatchBlock;
      dispatchBlock.staticLabels.push(_('broadcast'));
      dispatchBlock.adjustWidthToLabel();
      dispatchBlock.oneArgBlock();
      dispatchBlock.defaults.push(_('event'));
      dispatchBlock.dockTypes[1] = 'textin';
  
      var startBlock = new ProtoBlock('start');
      startBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['start'] = startBlock;
      startBlock.staticLabels.push(_('start'));
      startBlock.extraWidth = 10;
      startBlock.adjustWidthToLabel();
      startBlock.stackClampZeroArgBlock();
  
      var actionBlock = new ProtoBlock('action');
      actionBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['action'] = actionBlock;
      actionBlock.staticLabels.push(_('action'));
      actionBlock.extraWidth = 25;
      actionBlock.adjustWidthToLabel();
      actionBlock.stackClampOneArgBlock();
      actionBlock.defaults.push(_('action'));
  
      var namedDoBlock = new ProtoBlock('nameddo');
      namedDoBlock.palette = palettes.dict['action'];
      blocks.protoBlockDict['nameddo'] = namedDoBlock;
      namedDoBlock.hidden = true;
      namedDoBlock.staticLabels.push(_('action'));
      namedDoBlock.extraWidth = 10;
      namedDoBlock.adjustWidthToLabel();
      namedDoBlock.zeroArgBlock();
  
      // HEAP PALETTE
      
      var loadHeapFromApp = new ProtoBlock('loadHeapFromApp');
      loadHeapFromApp.palette = palettes.dict['heap'];
      blocks.protoBlockDict['loadHeapFromApp'] = loadHeapFromApp;
      loadHeapFromApp.staticLabels.push(_('load heap from App'));
      loadHeapFromApp.adjustWidthToLabel();
      loadHeapFromApp.twoArgBlock();
      loadHeapFromApp.dockTypes[1] = 'textin';
      loadHeapFromApp.dockTypes[2] = 'textin';
      loadHeapFromApp.defaults.push('appName')
      loadHeapFromApp.defaults.push('localhost');
  
      var saveHeapToApp = new ProtoBlock('saveHeapToApp');
      saveHeapToApp.palette = palettes.dict['heap'];
      blocks.protoBlockDict['saveHeapToApp'] = saveHeapToApp;
      saveHeapToApp.staticLabels.push(_('save heap to App'));
      saveHeapToApp.adjustWidthToLabel();
      saveHeapToApp.twoArgBlock();
      saveHeapToApp.dockTypes[1] = 'textin';
      saveHeapToApp.dockTypes[2] = 'textin';
      saveHeapToApp.defaults.push('appName')
      saveHeapToApp.defaults.push('localhost');
  
      var setHeapEntry = new ProtoBlock('setHeapEntry');
      setHeapEntry.palette = palettes.dict['heap'];
      blocks.protoBlockDict['setHeapEntry'] = setHeapEntry;
      setHeapEntry.staticLabels.push(_('set heap'), _('index'), _('value'));
      setHeapEntry.adjustWidthToLabel();
      setHeapEntry.twoArgBlock();
      setHeapEntry.dockTypes[1] = 'numberin';
      setHeapEntry.dockTypes[2] = 'anyin';
      setHeapEntry.defaults.push(1);
      setHeapEntry.defaults.push(100);
  
      var showHeap = new ProtoBlock('showHeap');
      showHeap.palette = palettes.dict['heap'];
      blocks.protoBlockDict['showHeap'] = showHeap;
      showHeap.staticLabels.push(_('show heap'));
      showHeap.adjustWidthToLabel();
      showHeap.zeroArgBlock();
  
      var heapLength = new ProtoBlock('heapLength');
      heapLength.palette = palettes.dict['heap'];
      blocks.protoBlockDict['heapLength'] = heapLength;
      heapLength.staticLabels.push(_('heap length'));
      heapLength.adjustWidthToLabel();
      heapLength.parameterBlock();
      heapLength.dockTypes[0] = 'numberout';
  
      var heapEmpty = new ProtoBlock('heapEmpty');
      heapEmpty.palette = palettes.dict['heap'];
      blocks.protoBlockDict['heapEmpty'] = heapEmpty;
      heapEmpty.staticLabels.push(_('heap empty?'));
      heapEmpty.adjustWidthToLabel();
      heapEmpty.booleanZeroArgBlock();
  
      var emptyHeap = new ProtoBlock('emptyHeap');
      emptyHeap.palette = palettes.dict['heap'];
      blocks.protoBlockDict['emptyHeap'] = emptyHeap;
      emptyHeap.staticLabels.push(_('empty heap'));
      emptyHeap.adjustWidthToLabel();
      emptyHeap.zeroArgBlock();
  
      var saveHeap = new ProtoBlock('saveHeap');
      saveHeap.palette = palettes.dict['heap'];
      blocks.protoBlockDict['saveHeap'] = saveHeap;
      saveHeap.staticLabels.push(_('save heap'));
      saveHeap.adjustWidthToLabel();
      saveHeap.oneArgBlock();
      saveHeap.defaults.push('heap.json');
      saveHeap.dockTypes[1] = 'textin';
  
      var loadHeap = new ProtoBlock('loadHeap');
      loadHeap.palette = palettes.dict['heap'];
      blocks.protoBlockDict['loadHeap'] = loadHeap;
      loadHeap.staticLabels.push(_('load heap'));
      loadHeap.adjustWidthToLabel();
      loadHeap.oneArgBlock();
      loadHeap.dockTypes[1] = 'filein';
      loadHeap.defaults = [[null, null]];
  
      var indexHeap = new ProtoBlock('indexHeap');
      indexHeap.palette = palettes.dict['heap'];
      blocks.protoBlockDict['indexHeap'] = indexHeap;
      indexHeap.staticLabels.push(_('index heap'));
      indexHeap.adjustWidthToLabel();
      indexHeap.oneArgMathBlock();
      indexHeap.dockTypes[1] = 'numberin';
      indexHeap.defaults.push(1);
  
      var pushBlk = new ProtoBlock('push');
      pushBlk.palette = palettes.dict['heap'];
      blocks.protoBlockDict['push'] = pushBlk;
      pushBlk.staticLabels.push(_('push'));
      pushBlk.adjustWidthToLabel();
      pushBlk.oneArgBlock();
      pushBlk.dockTypes[1] = 'anyin';
  
      var popBlk = new ProtoBlock('pop');
      popBlk.palette = palettes.dict['heap'];
      blocks.protoBlockDict['pop'] = popBlk;
      popBlk.staticLabels.push(_('pop'));
      popBlk.adjustWidthToLabel();
      popBlk.parameterBlock();
  
      // MEDIA PALETTE
      
      var speakBlock = new ProtoBlock('speak');
      speakBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['speak'] = speakBlock;
      speakBlock.staticLabels.push(_('speak'));
      speakBlock.adjustWidthToLabel();
      speakBlock.oneArgBlock();
      speakBlock.defaults.push('hello');
      speakBlock.dockTypes[1] = 'textin';
  
      var cameraBlock = new ProtoBlock('camera');
      cameraBlock.palette = palettes.dict['media'];
      cameraBlock.image = 'images/camera.svg'
      blocks.protoBlockDict['camera'] = cameraBlock;
      cameraBlock.mediaBlock();
  
      var videoBlock = new ProtoBlock('video');
      videoBlock.palette = palettes.dict['media'];
      videoBlock.image = 'images/video.svg'
      blocks.protoBlockDict['video'] = videoBlock;
      videoBlock.mediaBlock();
  
      var loadFile = new ProtoBlock('loadFile');
      loadFile.palette = palettes.dict['media'];
      blocks.protoBlockDict['loadFile'] = loadFile;
      loadFile.staticLabels.push('');
      loadFile.parameterBlock();
      loadFile.dockTypes[0] = 'fileout';
  
      var stopVideoCamBlock = new ProtoBlock('stopvideocam');
      stopVideoCamBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['stopvideocam'] = stopVideoCamBlock;
      stopVideoCamBlock.staticLabels.push(_('stop media'));
      stopVideoCamBlock.adjustWidthToLabel();
      stopVideoCamBlock.zeroArgBlock();
  
      var toneBlock = new ProtoBlock('tone2');
      toneBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['tone2'] = toneBlock;
      toneBlock.staticLabels.push(_('tone'),  _('frequency'), _('duration (ms)'));
      toneBlock.adjustWidthToLabel();
      toneBlock.defaults.push(440, 200);
      toneBlock.twoArgBlock();
      toneBlock.dockTypes[1] = 'numberin';
      toneBlock.dockTypes[2] = 'numberin';
  
      var toFrequencyBlock = new ProtoBlock('tofrequency');
      toFrequencyBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['tofrequency'] = toFrequencyBlock;
      toFrequencyBlock.staticLabels.push(_('note to frequency'), _('name'), _('octave'));
      toFrequencyBlock.adjustWidthToLabel();
      toFrequencyBlock.defaults.push('A');
      toFrequencyBlock.defaults.push('4');
      toFrequencyBlock.twoArgMathBlock();
      toFrequencyBlock.dockTypes[1] = 'anyin';
      toFrequencyBlock.dockTypes[2] = 'numberin';
  
      var shellBlock = new ProtoBlock('turtleshell');
      shellBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['turtleshell'] = shellBlock;
      shellBlock.staticLabels.push(_('shell'), _('size'), _('image'));
      shellBlock.adjustWidthToLabel();
      shellBlock.twoArgBlock();
      shellBlock.defaults.push(55);
      shellBlock.defaults.push(null);
      shellBlock.dockTypes[1] = 'numberin';
      shellBlock.dockTypes[2] = 'mediain';
  
      var showBlock = new ProtoBlock('show');
      showBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['show'] = showBlock;
      showBlock.staticLabels.push(_('show'), _('size'), _('obj'));
      showBlock.adjustWidthToLabel();
      showBlock.twoArgBlock();
      showBlock.defaults.push(24);
      showBlock.defaults.push(_('text'));
      showBlock.dockTypes[1] = 'numberin';
      showBlock.dockTypes[2] = 'anyin';
  
      var mediaBlock = new ProtoBlock('media');
      mediaBlock.palette = palettes.dict['media'];
      mediaBlock.image = 'images/load-media.svg'
      blocks.protoBlockDict['media'] = mediaBlock;
      mediaBlock.mediaBlock();
      mediaBlock.dockTypes[0] = 'mediaout';
  
      var textBlock = new ProtoBlock('text');
      textBlock.palette = palettes.dict['media'];
      blocks.protoBlockDict['text'] = textBlock;
      textBlock.valueBlock();
      textBlock.dockTypes[0] = 'textout';
  
      // FLOW PALETTE
  
      var hiddenNoFlowBlock = new ProtoBlock('hiddennoflow');
      hiddenNoFlowBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['hiddennoflow'] = hiddenNoFlowBlock;
      hiddenNoFlowBlock.hiddenNoFlow = true;
      hiddenNoFlowBlock.hiddenBlockNoFlow();
      hiddenNoFlowBlock.hidden = true;
  
      var hiddenBlock = new ProtoBlock('hidden');
      hiddenBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['hidden'] = hiddenBlock;
      hiddenBlock.hidden = true;
      hiddenBlock.hiddenBlockFlow();
  
      var clampBlock = new ProtoBlock('clamp');
      clampBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['clamp'] = clampBlock;
      clampBlock.hidden = true;
      clampBlock.flowClampBlock();
  
      var breakBlock = new ProtoBlock('break');
      breakBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['break'] = breakBlock;
      breakBlock.staticLabels.push(_('stop'));
      breakBlock.adjustWidthToLabel();
      breakBlock.basicBlockNoFlow();
  
      var waitForBlock = new ProtoBlock('waitFor');
      waitForBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['waitFor'] = waitForBlock;
      waitForBlock.staticLabels.push(_('wait for'));
      waitForBlock.adjustWidthToLabel();
      waitForBlock.oneBooleanArgBlock();
  
      var untilBlock = new ProtoBlock('until');
      untilBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['until'] = untilBlock;
      untilBlock.staticLabels.push(_('until'), _('do'));
      untilBlock.adjustWidthToLabel();
      untilBlock.flowClampBooleanArgBlock();
  
      var whileBlock = new ProtoBlock('while');
      whileBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['while'] = whileBlock;
      whileBlock.staticLabels.push(_('while'), _('do'));
      whileBlock.adjustWidthToLabel();
      whileBlock.flowClampBooleanArgBlock();
  
      var ifthenelseBlock = new ProtoBlock('ifthenelse');
      ifthenelseBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['ifthenelse'] = ifthenelseBlock;
      ifthenelseBlock.staticLabels.push(_('if'), _('then'), _('else'));
      ifthenelseBlock.adjustWidthToLabel();
      ifthenelseBlock.doubleFlowClampBooleanArgBlock();
  
      var ifBlock = new ProtoBlock('if');
      ifBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['if'] = ifBlock;
      ifBlock.staticLabels.push(_('if'), _('then'));
      ifBlock.adjustWidthToLabel();
      ifBlock.flowClampBooleanArgBlock();
  
      var foreverBlock = new ProtoBlock('forever');
      foreverBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['forever'] = foreverBlock;
      foreverBlock.staticLabels.push(_('forever'));
      foreverBlock.adjustWidthToLabel();
      foreverBlock.flowClampZeroArgBlock();
  
      var repeatBlock = new ProtoBlock('repeat');
      repeatBlock.palette = palettes.dict['flow'];
      blocks.protoBlockDict['repeat'] = repeatBlock;
      repeatBlock.staticLabels.push(_('repeat'));
      repeatBlock.adjustWidthToLabel();
      repeatBlock.flowClampOneArgBlock();
      repeatBlock.defaults.push(4);
  
      // EXTRAS PALETTE
  
      // NOP blocks (used as placeholders when loaded blocks not found)
      var nopValueBlock = new ProtoBlock('nopValueBlock');
      blocks.protoBlockDict['nopValueBlock'] = nopValueBlock;
      nopValueBlock.hidden = true;
      nopValueBlock.palette = palettes.dict['extras'];
      nopValueBlock.staticLabels.push(_('unknown'));
      nopValueBlock.adjustWidthToLabel();
      nopValueBlock.valueBlock();
      nopValueBlock.dockTypes[0] = 'anyout';
  
      /*
      var nopOneArgMathBlock = new ProtoBlock('nopOneArgMathBlock');
      blocks.protoBlockDict['nopOneArgMathBlock'] = nopOneArgMathBlock;
      nopOneArgMathBlock.hidden = true;
      nopOneArgMathBlock.palette = palettes.dict['extras'];
      nopOneArgMathBlock.oneArgMathBlock();
      nopOneArgMathBlock.staticLabels.push(_('unknown'));
      nopOneArgMathBlock.dockTypes[0] = 'anyout';
      nopOneArgMathBlock.dockTypes[1] = 'anyin';
  
      var nopTwoArgMathBlock = new ProtoBlock('nopTwoArgMathBlock');
      blocks.protoBlockDict['nopTwoArgMathBlock'] = nopTwoArgMathBlock;
      nopTwoArgMathBlock.twoArgMathBlock();
      nopTwoArgMathBlock.hidden = true;
      nopTwoArgMathBlock.palette = palettes.dict['extras'];
      nopTwoArgMathBlock.staticLabels.push(_('unknown'));
      nopTwoArgMathBlock.dockTypes[0] = 'anyout';
      nopTwoArgMathBlock.dockTypes[1] = 'anyin';
      nopTwoArgMathBlock.dockTypes[2] = 'anyin';
      */
  
      var nopZeroArgBlock = new ProtoBlock('nopZeroArgBlock');
      blocks.protoBlockDict['nopZeroArgBlock'] = nopZeroArgBlock;
      nopZeroArgBlock.hidden = true;
      nopZeroArgBlock.palette = palettes.dict['extras'];
      nopZeroArgBlock.staticLabels.push(_('unknown'));
      nopZeroArgBlock.adjustWidthToLabel();
      nopZeroArgBlock.zeroArgBlock();
  
      var nopOneArgBlock = new ProtoBlock('nopOneArgBlock');
      blocks.protoBlockDict['nopOneArgBlock'] = nopOneArgBlock;
      nopOneArgBlock.hidden = true;
      nopOneArgBlock.palette = palettes.dict['extras'];
      nopOneArgBlock.staticLabels.push(_('unknown'));
      nopOneArgBlock.adjustWidthToLabel();
      nopOneArgBlock.oneArgBlock();
      nopOneArgBlock.dockTypes[1] = 'anyin';
  
      var nopTwoArgBlock = new ProtoBlock('nopTwoArgBlock');
      blocks.protoBlockDict['nopTwoArgBlock'] = nopTwoArgBlock;
      nopTwoArgBlock.hidden = true;
      nopTwoArgBlock.palette = palettes.dict['extras'];
      nopTwoArgBlock.staticLabels.push(_('unknown'));
      nopTwoArgBlock.adjustWidthToLabel();
      nopTwoArgBlock.twoArgBlock();
      nopTwoArgBlock.dockTypes[1] = 'anyin';
      nopTwoArgBlock.dockTypes[2] = 'anyin';
  
      var nopThreeArgBlock = new ProtoBlock('nopThreeArgBlock');
      blocks.protoBlockDict['nopThreeArgBlock'] = nopThreeArgBlock;
      nopThreeArgBlock.hidden = true;
      nopThreeArgBlock.palette = palettes.dict['extras'];
      nopThreeArgBlock.staticLabels.push(_('unknown'));
      nopThreeArgBlock.adjustWidthToLabel();
      nopThreeArgBlock.threeArgBlock();
      nopThreeArgBlock.dockTypes[1] = 'anyin';
      nopThreeArgBlock.dockTypes[2] = 'anyin';
      nopThreeArgBlock.dockTypes[3] = 'anyin';
  
      var audioBlock = new ProtoBlock('playback');
      audioBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['playback'] = audioBlock;
      audioBlock.defaults.push(null);
      audioBlock.staticLabels.push(_('play back'));
      audioBlock.adjustWidthToLabel();
      audioBlock.oneArgBlock();
      audioBlock.dockTypes[1] = 'mediain';
  
      var audioStopBlock = new ProtoBlock('stopplayback');
      audioStopBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['stopplayback'] = audioStopBlock;
      audioStopBlock.staticLabels.push(_('stop play'));
      audioStopBlock.adjustWidthToLabel();
      audioStopBlock.zeroArgBlock();
  
      var svgBlock = new ProtoBlock('savesvg');
      svgBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['savesvg'] = svgBlock;
      svgBlock.staticLabels.push(_('save svg'));
      svgBlock.adjustWidthToLabel();
      svgBlock.oneArgBlock();
      svgBlock.defaults.push(_('title') + '.svg');
      svgBlock.dockTypes[1] = 'textin';
  
      var publishBlock = new ProtoBlock('publish');
      publishBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['publish'] = publishBlock;
      publishBlock.staticLabels.push(_('publish to Facebook'));
      publishBlock.adjustWidthToLabel();
      publishBlock.oneArgBlock();
      publishBlock.defaults.push(_('title'));
      publishBlock.dockTypes[1] = 'textin';
      publishBlock.hidden = true;
  
      var getyTurtleBlock = new ProtoBlock('yturtle');
      getyTurtleBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['yturtle'] = getyTurtleBlock;
      getyTurtleBlock.staticLabels.push(_('turtle y'));
      getyTurtleBlock.adjustWidthToLabel();
      getyTurtleBlock.oneArgMathBlock();
      getyTurtleBlock.dockTypes[1] = 'anyin';
      getyTurtleBlock.defaults.push('0');
  
      var getxTurtleBlock = new ProtoBlock('xturtle');
      getxTurtleBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['xturtle'] = getxTurtleBlock;
      getxTurtleBlock.staticLabels.push(_('turtle x'));
      getxTurtleBlock.adjustWidthToLabel();
      getxTurtleBlock.oneArgMathBlock();
      getxTurtleBlock.dockTypes[1] = 'anyin';
      getxTurtleBlock.defaults.push('0');
  
      var startTurtleBlock = new ProtoBlock('startTurtle');
      startTurtleBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['startTurtle'] = startTurtleBlock;
      startTurtleBlock.staticLabels.push(_('start turtle'));
      startTurtleBlock.adjustWidthToLabel();
      startTurtleBlock.oneArgBlock();
      startTurtleBlock.dockTypes[1] = 'anyin';
      startTurtleBlock.defaults.push('0');
  
      var stopTurtleBlock = new ProtoBlock('stopTurtle');
      stopTurtleBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['stopTurtle'] = stopTurtleBlock;
      stopTurtleBlock.staticLabels.push(_('stop turtle'));
      stopTurtleBlock.adjustWidthToLabel();
      stopTurtleBlock.oneArgBlock();
      stopTurtleBlock.dockTypes[1] = 'anyin';
      stopTurtleBlock.defaults.push('0');
  
      var noBackgroundBlock = new ProtoBlock('nobackground');
      blocks.protoBlockDict['nobackground'] = noBackgroundBlock;
      noBackgroundBlock.palette = palettes.dict['extras'];
      noBackgroundBlock.staticLabels.push(_('no background'));
      noBackgroundBlock.adjustWidthToLabel();
      noBackgroundBlock.zeroArgBlock();
  
      var showBlocks = new ProtoBlock('showblocks');
      showBlocks.palette = palettes.dict['extras'];
      blocks.protoBlockDict['showblocks'] = showBlocks;
      showBlocks.staticLabels.push(_('show blocks'));
      showBlocks.adjustWidthToLabel();
      showBlocks.zeroArgBlock();
  
      var hideBlocks = new ProtoBlock('hideblocks');
      hideBlocks.palette = palettes.dict['extras'];
      blocks.protoBlockDict['hideblocks'] = hideBlocks;
      hideBlocks.staticLabels.push(_('hide blocks'));
      hideBlocks.adjustWidthToLabel();
      hideBlocks.zeroArgBlock();
  
      var openProjectBlock = new ProtoBlock('openProject');
      openProjectBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['openProject'] = openProjectBlock;
      openProjectBlock.staticLabels.push(_('open project'));
      openProjectBlock.adjustWidthToLabel();
      openProjectBlock.oneArgBlock();
      openProjectBlock.defaults.push('url');
      openProjectBlock.dockTypes[1] = 'textin';
  
      var vspaceBlock = new ProtoBlock('vspace');
      vspaceBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['vspace'] = vspaceBlock;
      vspaceBlock.staticLabels.push('↓');
      vspaceBlock.extraWidth = -10;
      vspaceBlock.zeroArgBlock();
  
      var hspaceBlock = new ProtoBlock('hspace');
      hspaceBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['hspace'] = hspaceBlock;
      hspaceBlock.oneArgMathBlock();
      hspaceBlock.staticLabels.push('←');
      hspaceBlock.dockTypes[0] = 'anyout';
      hspaceBlock.dockTypes[1] = 'anyin';
  
      var waitBlock = new ProtoBlock('wait');
      waitBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['wait'] = waitBlock;
      waitBlock.staticLabels.push(_('wait'));
      waitBlock.adjustWidthToLabel();
      waitBlock.oneArgBlock();
      waitBlock.defaults.push(1);
  
      var printBlock = new ProtoBlock('print');
      printBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['print'] = printBlock;
      printBlock.staticLabels.push(_('print'));
      printBlock.adjustWidthToLabel();
      printBlock.oneArgBlock();
      printBlock.dockTypes[1] = 'anyin';
  
      var turtleNameBlock = new ProtoBlock('turtlename');
      turtleNameBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['turtlename'] = turtleNameBlock;
      turtleNameBlock.staticLabels.push(_('turtle name'));
      turtleNameBlock.adjustWidthToLabel();
      turtleNameBlock.parameterBlock();
      turtleNameBlock.dockTypes[0] = 'textout';
  
      var setTurtleName = new ProtoBlock('setturtlename');
      setTurtleName.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setturtlename'] = setTurtleName;
      setTurtleName.staticLabels.push(_('turtle name'));
      setTurtleName.staticLabels.push(_('source'));
      setTurtleName.staticLabels.push(_('target'));
      setTurtleName.adjustWidthToLabel();
      setTurtleName.twoArgBlock();
      setTurtleName.dockTypes[1] = 'anyin';
      setTurtleName.dockTypes[2] = 'anyin';
      setTurtleName.defaults.push('0');
      setTurtleName.defaults.push('Yertle');
  
      var statusBlock = new ProtoBlock('status');
      statusBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['status'] = statusBlock;
      statusBlock.staticLabels.push(_('status'));
      statusBlock.adjustWidthToLabel();
      statusBlock.stackClampZeroArgBlock();
  
      // SENSORS PALETTE
  
      var loudnessBlock = new ProtoBlock('loudness');
      loudnessBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['loudness'] = loudnessBlock;
      loudnessBlock.staticLabels.push(_('loudness'));
      loudnessBlock.adjustWidthToLabel();
      loudnessBlock.parameterBlock();
  
      // Turtle-specific click event
      var myClickBlock = new ProtoBlock('myclick');
      myClickBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['myclick'] = myClickBlock;
      myClickBlock.staticLabels.push(_('click'));
      myClickBlock.adjustWidthToLabel();
      myClickBlock.parameterBlock();
      myClickBlock.dockTypes[0] = 'textout';
  
      var getBlue = new ProtoBlock('getblue');
      getBlue.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['getblue'] = getBlue;
      getBlue.staticLabels.push(_('blue'));
      getBlue.adjustWidthToLabel();
      getBlue.parameterBlock();
  
      var getGreen = new ProtoBlock('getgreen');
      getGreen.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['getgreen'] = getGreen;
      getGreen.staticLabels.push(_('green'));
      getGreen.adjustWidthToLabel();
      getGreen.parameterBlock();
  
      var getRed = new ProtoBlock('getred');
      getRed.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['getred'] = getRed;
      getRed.staticLabels.push(_('red'));
      getRed.adjustWidthToLabel();
      getRed.parameterBlock();
  
      var getColorPixel = new ProtoBlock('getcolorpixel');
      getColorPixel.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['getcolorpixel'] = getColorPixel;
      getColorPixel.staticLabels.push(_('pixel color'));
      getColorPixel.adjustWidthToLabel();
      getColorPixel.parameterBlock();
  
      var timeBlock = new ProtoBlock('time');
      timeBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['time'] = timeBlock;
      timeBlock.staticLabels.push(_('time'));
      timeBlock.adjustWidthToLabel();
      timeBlock.parameterBlock();
  
      var mousexBlock = new ProtoBlock('mousex');
      mousexBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['mousex'] = mousexBlock;
      mousexBlock.staticLabels.push(_('mouse x'));
      mousexBlock.extraWidth = 15;
      mousexBlock.adjustWidthToLabel();
      mousexBlock.parameterBlock();
  
      var mouseyBlock = new ProtoBlock('mousey');
      mouseyBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['mousey'] = mouseyBlock;
      mouseyBlock.staticLabels.push(_('mouse y'));
      mouseyBlock.extraWidth = 15;
      mouseyBlock.adjustWidthToLabel();
      mouseyBlock.parameterBlock();
  
      var mousebuttonBlock = new ProtoBlock('mousebutton');
      mousebuttonBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['mousebutton'] = mousebuttonBlock;
      mousebuttonBlock.staticLabels.push(_('mouse button'));
      mousebuttonBlock.adjustWidthToLabel();
      mousebuttonBlock.booleanZeroArgBlock();
  
      var toASCIIBlock = new ProtoBlock('toascii');
      toASCIIBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['toascii'] = toASCIIBlock;
      toASCIIBlock.staticLabels.push(_('to ASCII'));
      toASCIIBlock.defaults.push(65);
      toASCIIBlock.oneArgMathBlock();
  
      var keyboardBlock = new ProtoBlock('keyboard');
      keyboardBlock.palette = palettes.dict['sensors'];
      blocks.protoBlockDict['keyboard'] = keyboardBlock;
      keyboardBlock.staticLabels.push(_('keyboard'));
      keyboardBlock.adjustWidthToLabel();
      keyboardBlock.parameterBlock();
  
      // REMOVED UNTIL WE PLUG THE SECURITY HOLE
      /*
      var evalBlock = new ProtoBlock('eval');
      evalBlock.palette = palettes.dict['number'];
      blocks.protoBlockDict['eval'] = evalBlock;
      evalBlock.staticLabels.push(_('eval'));
      evalBlock.staticLabels.push('f(x)');
      evalBlock.staticLabels.push('x');
      evalBlock.adjustWidthToLabel();
      evalBlock.twoArgMathBlock();
      evalBlock.dockTypes[1] = 'textin';
      evalBlock.defaults.push('x');
      evalBlock.defaults.push(100);
      */
      
      // Music Blocks that we ignore
      var transposition = new ProtoBlock('transpositionfactor');
      transposition.palette = palettes.dict['extras'];
      blocks.protoBlockDict['transpositionfactor'] = transposition;
      transposition.staticLabels.push(_('transposition'));
      transposition.adjustWidthToLabel();
      transposition.parameterBlock();
      transposition.hidden = true;
  
      var consonantStepDownBlock = new ProtoBlock('consonantstepsizedown');
      consonantStepDownBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['consonantstepsizedown'] = consonantStepDownBlock;
      //.TRANS: step down one note in current mode
      consonantStepDownBlock.staticLabels.push(_('consonant step down'));
      consonantStepDownBlock.adjustWidthToLabel();
      consonantStepDownBlock.parameterBlock();
      consonantStepDownBlock.hidden = true;
  
      var consonantStepUpBlock = new ProtoBlock('consonantstepsizeup');
      consonantStepUpBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['consonantstepsizeup'] = consonantStepUpBlock;
      //.TRANS: step up one note in current mode
      consonantStepUpBlock.staticLabels.push(_('consonant step up'));
      consonantStepUpBlock.adjustWidthToLabel();
      consonantStepUpBlock.parameterBlock();
      consonantStepUpBlock.hidden = true;
  
      var turtlePitchBlock = new ProtoBlock('turtlepitch');
      turtlePitchBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['turtlepitch'] = turtlePitchBlock;
      //.TRANS: convert current note for this turtle to piano key (1-88)
      turtlePitchBlock.staticLabels.push(_('mouse pitch number'));
      turtlePitchBlock.oneArgMathBlock();
      turtlePitchBlock.adjustWidthToLabel();
      turtlePitchBlock.dockTypes[1] = 'anyin';
      turtlePitchBlock.hidden = true;
  
      var setPitchNumberOffsetBlock = new ProtoBlock('setpitchnumberoffset');
      setPitchNumberOffsetBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setpitchnumberoffset'] = setPitchNumberOffsetBlock;
      setPitchNumberOffsetBlock.staticLabels.push(_('set pitch number offset'), _('name'), _('octave'));
      setPitchNumberOffsetBlock.adjustWidthToLabel();
      setPitchNumberOffsetBlock.twoArgBlock();
      setPitchNumberOffsetBlock.defaults.push('4');
      setPitchNumberOffsetBlock.dockTypes[1] = 'notein';
      setPitchNumberOffsetBlock.dockTypes[2] = 'anyin';
      setPitchNumberOffsetBlock.hidden = true;
  
      var numberToPitchBlock = new ProtoBlock('number2pitch');
      numberToPitchBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['number2pitch'] = numberToPitchBlock;
      //.TRANS: convert piano key number (1-88) to pitch
      numberToPitchBlock.staticLabels.push(_('number to pitch'));
      numberToPitchBlock.oneArgMathBlock();
      numberToPitchBlock.adjustWidthToLabel();
      numberToPitchBlock.defaults.push(48);
      numberToPitchBlock.hidden = true;
  
      var numberToOctaveBlock = new ProtoBlock('number2octave');
      numberToOctaveBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['number2octave'] = numberToOctaveBlock;
      //.TRANS: convert piano key number (1-88) to octave
      numberToOctaveBlock.staticLabels.push(_('number to octave'));
      numberToOctaveBlock.oneArgMathBlock();
      numberToOctaveBlock.adjustWidthToLabel();
      numberToOctaveBlock.hidden = true;
      numberToOctaveBlock.defaults.push(48);
  
      // Value blocks
      var modenameBlock = new ProtoBlock('modename');
      modenameBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['modename'] = modenameBlock;
      modenameBlock.valueBlock();
      modenameBlock.dockTypes[0] = 'textout';
      modenameBlock.hidden = true;
  
      var notenameBlock = new ProtoBlock('notename');
      notenameBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['notename'] = notenameBlock;
      notenameBlock.valueBlock();
      notenameBlock.dockTypes[0] = 'noteout';
      notenameBlock.hidden = true;
  
      var solfegeBlock = new ProtoBlock('solfege');
      solfegeBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['solfege'] = solfegeBlock;
      solfegeBlock.valueBlock();
      solfegeBlock.dockTypes[0] = 'solfegeout';
      solfegeBlock.hidden = true;
  
      var eastindiansolfegeBlock = new ProtoBlock('eastindiansolfege');
      eastindiansolfegeBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['eastindiansolfege'] = eastindiansolfegeBlock;
      eastindiansolfegeBlock.valueBlock();
      eastindiansolfegeBlock.dockTypes[0] = 'solfegeout';
      eastindiansolfegeBlock.hidden = true;
  
      // Transposition blocks
      var invertBlock = new ProtoBlock('invert1');
      invertBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['invert1'] = invertBlock;
      invertBlock.staticLabels.push(_('invert'), _('name'), _('octave'), _('even') + '/' + _('odd'));
      invertBlock.adjustWidthToLabel();
      invertBlock.flowClampThreeArgBlock();
      invertBlock.adjustWidthToLabel();
      invertBlock.defaults.push('sol');
      invertBlock.defaults.push(4);
      invertBlock.defaults.push(_('even'));
      invertBlock.dockTypes[1] = 'solfegein';
      invertBlock.dockTypes[2] = 'anyin';
      invertBlock.dockTypes[3] = 'anyin';
      invertBlock.hidden = true;
  
      var transpositionBlock = new ProtoBlock('settransposition');
      transpositionBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['settransposition'] = transpositionBlock;
      transpositionBlock.staticLabels.push(_('adjust transposition'));
      transpositionBlock.adjustWidthToLabel();
      transpositionBlock.defaults.push('1');
      transpositionBlock.flowClampOneArgBlock();
      transpositionBlock.hidden = true;
  
      var octaveBlock = new ProtoBlock('octave');
      octaveBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['octave'] = octaveBlock;
      octaveBlock.staticLabels.push(_('octave'));
      octaveBlock.adjustWidthToLabel();
      octaveBlock.zeroArgBlock();
      octaveBlock.hidden = true;
  
      var flatBlock = new ProtoBlock('flat');
      flatBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['flat'] = flatBlock;
      flatBlock.staticLabels.push(_('flat'));
      flatBlock.adjustWidthToLabel();
      flatBlock.flowClampZeroArgBlock();
      flatBlock.hidden = true;
  
      var sharpBlock = new ProtoBlock('sharp');
      sharpBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['sharp'] = sharpBlock;
      sharpBlock.staticLabels.push(_('sharp'));
      sharpBlock.adjustWidthToLabel();
      sharpBlock.flowClampZeroArgBlock();
      sharpBlock.hidden = true;
  
      var hertzBlock = new ProtoBlock('hertz');
      hertzBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['hertz'] = hertzBlock;
      hertzBlock.staticLabels.push(_('hertz'));
      hertzBlock.adjustWidthToLabel();
      hertzBlock.oneArgBlock();
      hertzBlock.defaults.push(392);
      hertzBlock.hidden = true;
  
      var pitchNumberBlock = new ProtoBlock('pitchnumber');
      pitchNumberBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['pitchnumber'] = pitchNumberBlock;
      pitchNumberBlock.staticLabels.push(_('pitch number'));
      pitchNumberBlock.adjustWidthToLabel();
      pitchNumberBlock.oneArgBlock();
      pitchNumberBlock.defaults.push(7);
      pitchNumberBlock.dockTypes[1] = 'numberin';
      pitchNumberBlock.hidden = true;
  
      var scaleDegree = new ProtoBlock('scaledegree');
      scaleDegree.palette = palettes.dict['extras'];
      blocks.protoBlockDict['scaledegree'] = scaleDegree;
      scaleDegree.staticLabels.push(_('scale degree'), _('number'), _('octave'));
      scaleDegree.adjustWidthToLabel();
      scaleDegree.defaults.push(5); // G in C Major
      scaleDegree.defaults.push(4);
      scaleDegree.twoArgBlock();
      scaleDegree.dockTypes[1] = 'numberin';
      scaleDegree.dockTypes[2] = 'anyin';
      scaleDegree.hidden = true;
  
      var pitchStepBlock = new ProtoBlock('steppitch');
      pitchStepBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['steppitch'] = pitchStepBlock;
      //.TRANS: step some number of notes in current mode
      pitchStepBlock.staticLabels.push(_('step pitch'));
      pitchStepBlock.oneArgBlock();
      pitchStepBlock.adjustWidthToLabel();
      pitchStepBlock.dockTypes[1] = 'anyin';
      pitchStepBlock.defaults.push(1);
      pitchStepBlock.hidden = true;
  
      var pitch = new ProtoBlock('pitch');
      pitch.palette = palettes.dict['extras'];
      blocks.protoBlockDict['pitch'] = pitch;
      pitch.staticLabels.push(_('pitch'), _('name'), _('octave'));
      pitch.adjustWidthToLabel();
      pitch.defaults.push('sol');
      pitch.defaults.push(4);
      pitch.twoArgBlock();
      pitch.dockTypes[1] = 'solfegein';
      pitch.dockTypes[2] = 'anyin';
      pitch.hidden = true;
  
      var sixtyfourthNoteBlock = new ProtoBlock('sixtyfourthNote');
      sixtyfourthNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['sixtyfourthNote'] = sixtyfourthNoteBlock;
      sixtyfourthNoteBlock.staticLabels.push(_('1/64 note') + ' 𝅘𝅥𝅱');
      sixtyfourthNoteBlock.adjustWidthToLabel();
      sixtyfourthNoteBlock.zeroArgBlock();
      sixtyfourthNoteBlock.hidden = true;
  
      var thirtysecondNoteBlock = new ProtoBlock('thirtysecondNote');
      thirtysecondNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['thirtysecondNote'] = thirtysecondNoteBlock;
      thirtysecondNoteBlock.staticLabels.push(_('1/32 note') + ' 𝅘𝅥𝅰');
      thirtysecondNoteBlock.adjustWidthToLabel();
      thirtysecondNoteBlock.zeroArgBlock();
      thirtysecondNoteBlock.hidden = true;
  
      var sixteenthNoteBlock = new ProtoBlock('sixteenthNote');
      sixteenthNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['sixteenthNote'] = sixteenthNoteBlock;
      sixteenthNoteBlock.staticLabels.push(_('1/16 note') + ' 𝅘𝅥𝅯');
      sixteenthNoteBlock.adjustWidthToLabel();
      sixteenthNoteBlock.zeroArgBlock();
      sixteenthNoteBlock.hidden = true;
  
      var eighthNoteBlock = new ProtoBlock('eighthNote');
      eighthNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['eighthNote'] = eighthNoteBlock;
      eighthNoteBlock.staticLabels.push(_('eighth note') + ' ♪');
      eighthNoteBlock.adjustWidthToLabel();
      eighthNoteBlock.zeroArgBlock();
      eighthNoteBlock.hidden = true;
  
      var quarterNoteBlock = new ProtoBlock('quarterNote');
      quarterNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['quarterNote'] = quarterNoteBlock;
      quarterNoteBlock.staticLabels.push(_('quarter note') + ' ♩');
      quarterNoteBlock.adjustWidthToLabel();
      quarterNoteBlock.zeroArgBlock();
      quarterNoteBlock.hidden = true;
  
      var halfNoteBlock = new ProtoBlock('halfNote');
      halfNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['halfNote'] = halfNoteBlock;
      halfNoteBlock.staticLabels.push(_('half note') + ' 𝅗𝅥');
      halfNoteBlock.adjustWidthToLabel();
      halfNoteBlock.zeroArgBlock();
      halfNoteBlock.hidden = true;
  
      var wholeNoteBlock = new ProtoBlock('wholeNote');
      wholeNoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['wholeNote'] = wholeNoteBlock;
      wholeNoteBlock.staticLabels.push(_('whole note') + ' 𝅝');
      wholeNoteBlock.adjustWidthToLabel();
      wholeNoteBlock.zeroArgBlock();
      wholeNoteBlock.hidden = true;
  
      var tuplet4Block = new ProtoBlock('tuplet4');
      tuplet4Block.palette = palettes.dict['extras'];
      blocks.protoBlockDict['tuplet4'] = tuplet4Block;
      tuplet4Block.staticLabels.push(_('tuplet'), _('note value'));
      tuplet4Block.extraWidth = 20;
      tuplet4Block.adjustWidthToLabel();
      tuplet4Block.flowClampOneArgBlock();
      tuplet4Block.defaults.push(1 / 4);
      tuplet4Block.hidden = true;
  
      var simpleTupletBlock = new ProtoBlock('stuplet');
      simpleTupletBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['stuplet'] = simpleTupletBlock;
      simpleTupletBlock.staticLabels.push(_('simple tuplet'), _('number of notes'), _('note value'));
      simpleTupletBlock.adjustWidthToLabel();
      simpleTupletBlock.twoArgBlock();
      simpleTupletBlock.defaults.push(3);
      simpleTupletBlock.defaults.push(1 / 2);
      simpleTupletBlock.hidden = true;
  
      var rhythm2 = new ProtoBlock('rhythm2');
      rhythm2.palette = palettes.dict['extras'];
      blocks.protoBlockDict['rhythm2'] = rhythm2;
      rhythm2.staticLabels.push(_('rhythm'), _('number of notes'), _('note value'));
      rhythm2.extraWidth = 10;
      rhythm2.adjustWidthToLabel();
      rhythm2.defaults.push(3);
      rhythm2.defaults.push(4);
      rhythm2.twoArgBlock();
      rhythm2.dockTypes[1] = 'anyin';
      rhythm2.dockTypes[2] = 'anyin';
      rhythm2.hidden = true;
  
      var modewidgetBlock = new ProtoBlock('modewidget');
      modewidgetBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['modewidget'] = modewidgetBlock;
      modewidgetBlock.staticLabels.push(_('custom mode'));
      modewidgetBlock.adjustWidthToLabel();
      modewidgetBlock.stackClampZeroArgBlock();
      modewidgetBlock.hidden = true;
  
      var tempoBlock = new ProtoBlock('tempo');
      tempoBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['tempo'] = tempoBlock;
      tempoBlock.staticLabels.push(_('tempo'));
      tempoBlock.adjustWidthToLabel();
      tempoBlock.stackClampZeroArgBlock();
      tempoBlock.hidden = true;
  
      var pitchDrumMatrixBlock = new ProtoBlock('pitchdrummatrix');
      pitchDrumMatrixBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['pitchdrummatrix'] = pitchDrumMatrixBlock;
      pitchDrumMatrixBlock.staticLabels.push(_('pitch-drum matrix'));
      pitchDrumMatrixBlock.adjustWidthToLabel();
      pitchDrumMatrixBlock.stackClampZeroArgBlock();
      pitchDrumMatrixBlock.hidden = true;
  
      var pitchsliderBlock = new ProtoBlock('pitchslider');
      pitchsliderBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['pitchslider'] = pitchsliderBlock;
      //.TRANS: widget to generate pitches using a slider
      pitchsliderBlock.staticLabels.push(_('pitchslider'));
      pitchsliderBlock.adjustWidthToLabel();
      pitchsliderBlock.stackClampZeroArgBlock();
      pitchsliderBlock.hidden = true;
  
      var pitchstaircaseBlock = new ProtoBlock('pitchstaircase');
      pitchstaircaseBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['pitchstaircase'] = pitchstaircaseBlock;
      pitchstaircaseBlock.staticLabels.push(_('pitch staircase'));
      pitchstaircaseBlock.adjustWidthToLabel();
      pitchstaircaseBlock.stackClampZeroArgBlock();
      pitchstaircaseBlock.hidden = true;
  
      var rhythmrulerBlock = new ProtoBlock('rhythmruler');
      rhythmrulerBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['rhythmruler'] = rhythmrulerBlock;
      //.TRANS: widget for subdividing a measure into distinct rhythmic elements
      rhythmrulerBlock.staticLabels.push(_('rhythm ruler'));
      rhythmrulerBlock.adjustWidthToLabel();
      rhythmrulerBlock.stackClampOneArgBlock();
      rhythmrulerBlock.defaults.push(1);
      rhythmrulerBlock.hidden = true;
  
      var matrixBlock = new ProtoBlock('matrix');
      matrixBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['matrix'] = matrixBlock;
      matrixBlock.staticLabels.push(_('pitch-time matrix'));
      matrixBlock.adjustWidthToLabel();
      matrixBlock.stackClampZeroArgBlock();
      matrixBlock.hidden = true;
  
      var noteCounter = new ProtoBlock('notecounter');
      noteCounter.palette = palettes.dict['extras'];
      blocks.protoBlockDict['notecounter'] = noteCounter;
      noteCounter.staticLabels.push(_('note counter'));
      noteCounter.argFlowClampBlock();
      noteCounter.adjustWidthToLabel();
      noteCounter.hidden = true;
  
      var turtleNoteBlock2 = new ProtoBlock('turtlenote2');
      turtleNoteBlock2.palette = palettes.dict['extras'];
      blocks.protoBlockDict['turtlenote2'] = turtleNoteBlock2;
      turtleNoteBlock2.staticLabels.push(_('mouse note value'));
      turtleNoteBlock2.oneArgMathBlock();
      turtleNoteBlock2.adjustWidthToLabel();
      turtleNoteBlock2.dockTypes[1] = 'anyin';
      turtleNoteBlock2.hidden = true;
  
      var duplicateFactor = new ProtoBlock('duplicatefactor');
      duplicateFactor.palette = palettes.dict['extras'];
      blocks.protoBlockDict['duplicatefactor'] = duplicateFactor;
      duplicateFactor.staticLabels.push(_('duplicate factor'));
      duplicateFactor.adjustWidthToLabel();
      duplicateFactor.parameterBlock();
      duplicateFactor.hidden = true;
  
      var skipFactor = new ProtoBlock('skipfactor');
      skipFactor.palette = palettes.dict['extras'];
      blocks.protoBlockDict['skipfactor'] = skipFactor;
      skipFactor.staticLabels.push(_('skip factor'));
      skipFactor.adjustWidthToLabel();
      skipFactor.parameterBlock();
      skipFactor.hidden = true;
  
      var elapsedNotes = new ProtoBlock('elapsednotes');
      elapsedNotes.palette = palettes.dict['extras'];
      blocks.protoBlockDict['elapsednotes'] = elapsedNotes;
      //.TRANS: number of whole notes that have been played
      elapsedNotes.staticLabels.push(_('notes played'));
      elapsedNotes.adjustWidthToLabel();
      elapsedNotes.parameterBlock();
      elapsedNotes.hidden = true;
  
      var beatfactor = new ProtoBlock('beatfactor');
      beatfactor.palette = palettes.dict['extras'];
      blocks.protoBlockDict['beatfactor'] = beatfactor;
      //.TRANS: number of beats per minute
      beatfactor.staticLabels.push(_('beat factor'));
      beatfactor.adjustWidthToLabel();
      beatfactor.parameterBlock();
      beatfactor.hidden = true;
  
      var bpmBlock = new ProtoBlock('bpmfactor');
      bpmBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['bpmfactor'] = bpmBlock;
      bpmBlock.staticLabels.push(_('beats per minute'));
      bpmBlock.adjustWidthToLabel();
      bpmBlock.parameterBlock();
      bpmBlock.hidden = true;
  
      var driftBlock = new ProtoBlock('drift');
      driftBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['drift'] = driftBlock;
      driftBlock.staticLabels.push(_('free time'));
      driftBlock.adjustWidthToLabel();
      driftBlock.flowClampZeroArgBlock();
      driftBlock.hidden = true;
  
      var osctimeBlock = new ProtoBlock('osctime');
      osctimeBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['osctime'] = osctimeBlock;
      //.TRANS: oscillator time (in micro seconds)
      osctimeBlock.staticLabels.push(_('osctime'));
      osctimeBlock.adjustWidthToLabel();
      osctimeBlock.flowClampOneArgBlock();
      osctimeBlock.defaults.push(200);
      osctimeBlock.hidden = true;
  
      var newswingBlock = new ProtoBlock('newswing2');
      newswingBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['newswing2'] = newswingBlock;
      newswingBlock.staticLabels.push(_('swing'), _('swing value'), _('note value'));
      newswingBlock.extraWidth = 20;
      newswingBlock.adjustWidthToLabel();
      newswingBlock.flowClampTwoArgBlock();
      newswingBlock.defaults.push(1 / 24);
      newswingBlock.defaults.push(1 / 8);
      newswingBlock.hidden = true;
  
      var setbpmBlock = new ProtoBlock('setbpm');
      setbpmBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setbpm'] = setbpmBlock;
      setbpmBlock.staticLabels.push(_('beats per minute'));
      setbpmBlock.adjustWidthToLabel();
      setbpmBlock.flowClampOneArgBlock();
      setbpmBlock.defaults.push(90);
      setbpmBlock.hidden = true;
  
      var backwardBlock = new ProtoBlock('backward');
      backwardBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['backward'] = backwardBlock;
      backwardBlock.staticLabels.push(_('backward'));
      backwardBlock.adjustWidthToLabel();
      backwardBlock.flowClampZeroArgBlock();
      backwardBlock.hidden = true;
  
      var skipNotesBlock = new ProtoBlock('skipnotes');
      skipNotesBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['skipnotes'] = skipNotesBlock;
      skipNotesBlock.staticLabels.push(_('skip notes'));
      skipNotesBlock.adjustWidthToLabel();
      skipNotesBlock.flowClampOneArgBlock();
      skipNotesBlock.defaults.push(2);
      skipNotesBlock.hidden = true;
  
      var duplicateNotesBlock = new ProtoBlock('duplicatenotes');
      duplicateNotesBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['duplicatenotes'] = duplicateNotesBlock;
      duplicateNotesBlock.staticLabels.push(_('duplicate notes'));
      duplicateNotesBlock.adjustWidthToLabel();
      duplicateNotesBlock.flowClampOneArgBlock();
      duplicateNotesBlock.defaults.push(2);
      duplicateNotesBlock.hidden = true;
  
      var beatFactorBlock = new ProtoBlock('multiplybeatfactor');
      beatFactorBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['multiplybeatfactor'] = beatFactorBlock;
      //.TRANS: speed up note duration by some factor, e.g. convert 1/4 to 1/8 notes by using a factor of 2
      beatFactorBlock.staticLabels.push(_('multiply beat value'));
      beatFactorBlock.adjustWidthToLabel();
      beatFactorBlock.flowClampOneArgBlock();
      beatFactorBlock.defaults.push(2);
      beatFactorBlock.hidden = true;
  
      var beatFactorBlock2 = new ProtoBlock('dividebeatfactor');
      beatFactorBlock2.palette = palettes.dict['extras'];
      blocks.protoBlockDict['dividebeatfactor'] = beatFactorBlock2;
      //.TRANS: slow down note duration by some factor, e.g. convert 1/8 to 1/4 notes by using a factor of 2
      beatFactorBlock2.staticLabels.push(_('divide beat value'));
      beatFactorBlock2.adjustWidthToLabel();
      beatFactorBlock2.flowClampOneArgBlock();
      beatFactorBlock2.defaults.push(2);
      beatFactorBlock2.hidden = true;
  
      var tieBlock = new ProtoBlock('tie');
      tieBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['tie'] = tieBlock;
      //.TRANS: tie notes together into one longer note
      tieBlock.staticLabels.push(_('tie'));
      tieBlock.adjustWidthToLabel();
      tieBlock.flowClampZeroArgBlock();
      tieBlock.hidden = true;
  
      var rhythmicdotBlock = new ProtoBlock('rhythmicdot');
      rhythmicdotBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['rhythmicdot'] = rhythmicdotBlock;
      rhythmicdotBlock.staticLabels.push(_('dot'));
      rhythmicdotBlock.adjustWidthToLabel();
      rhythmicdotBlock.flowClampZeroArgBlock();
      rhythmicdotBlock.hidden = true;
  
      var rest2Block = new ProtoBlock('rest2');
      rest2Block.palette = palettes.dict['extras'];
      blocks.protoBlockDict['rest2'] = rest2Block;
      rest2Block.staticLabels.push(_('silence'));
      rest2Block.adjustWidthToLabel();
      rest2Block.zeroArgBlock();
      rest2Block.hidden = true;
  
      var newnoteBlock = new ProtoBlock('newnote');
      newnoteBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['newnote'] = newnoteBlock;
      newnoteBlock.staticLabels.push(_('note value'));
      newnoteBlock.adjustWidthToLabel();
      newnoteBlock.flowClampOneArgBlock();
      newnoteBlock.defaults.push(1 / 4);
      newnoteBlock.hidden = true;
  
      var setkey2Block = new ProtoBlock('setkey2');
      setkey2Block.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setkey2'] = setkey2Block;
      setkey2Block.staticLabels.push(_('set key'), _('key'), _('mode'));
      setkey2Block.adjustWidthToLabel();
      setkey2Block.twoArgBlock();
      setkey2Block.dockTypes[1] = 'anyin';
      setkey2Block.dockTypes[2] = 'anyin';
      setkey2Block.hidden = true;
  
      var keyBlock = new ProtoBlock('key');
      keyBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['key'] = keyBlock;
      keyBlock.staticLabels.push(_('key'));
      keyBlock.adjustWidthToLabel();
      keyBlock.parameterBlock();
      keyBlock.hidden = true;
  
      var meter = new ProtoBlock('meter');
      meter.palette = palettes.dict['extras'];
      blocks.protoBlockDict['meter'] = meter;
      meter.hidden = true;
      meter.staticLabels.push(_('meter'), _('numerator'), _('denominator'));
      meter.adjustWidthToLabel();
      meter.defaults.push(3);
      meter.defaults.push(4);
      meter.twoArgMathBlock();
      meter.dockTypes[1] = 'number';
      meter.dockTypes[2] = 'number';
      meter.hidden = true;
  
      var setMasterBPMBlock = new ProtoBlock('setmasterbpm');
      setMasterBPMBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setmasterbpm'] = setMasterBPMBlock;
      setMasterBPMBlock.staticLabels.push(_('master beats per minute'));
      setMasterBPMBlock.adjustWidthToLabel();
      setMasterBPMBlock.oneArgBlock();
      setMasterBPMBlock.defaults.push(90);
      setMasterBPMBlock.hidden = true;
  
      var voicenameBlock = new ProtoBlock('voicename');
      voicenameBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['voicename'] = voicenameBlock;
      voicenameBlock.valueBlock();
      voicenameBlock.dockTypes[0] = 'textout';
      voicenameBlock.hidden = true;
  
      var vibratoBlock = new ProtoBlock('vibrato');
      vibratoBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['vibrato'] = vibratoBlock;
      vibratoBlock.staticLabels.push(_('vibrato'), _('intensity'), _('rate'));
      vibratoBlock.adjustWidthToLabel();
      vibratoBlock.flowClampTwoArgBlock();
      vibratoBlock.defaults.push(10);
      vibratoBlock.defaults.push(1 / 16);
      vibratoBlock.hidden = true;
  
      var voiceBlock = new ProtoBlock('setvoice');
      voiceBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setvoice'] = voiceBlock;
      voiceBlock.staticLabels.push(_('set synth'));
      voiceBlock.adjustWidthToLabel();
      voiceBlock.flowClampOneArgBlock();
      voiceBlock.dockTypes[1] = 'textin';
      voiceBlock.defaults.push(_('violin'));
      voiceBlock.hidden = true;
  
      var articulationBlock = new ProtoBlock('articulation');
      articulationBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['articulation'] = articulationBlock;
      articulationBlock.staticLabels.push(_('set relative volume'));
      articulationBlock.adjustWidthToLabel();
      articulationBlock.flowClampOneArgBlock();
      articulationBlock.defaults.push(25);
      articulationBlock.hidden = true;
  
      var noteVolumeBlock2 = new ProtoBlock('setnotevolume2');
      noteVolumeBlock2.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setnotevolume2'] = noteVolumeBlock2;
      noteVolumeBlock2.staticLabels.push(_('set volume'));
      noteVolumeBlock2.adjustWidthToLabel();
      noteVolumeBlock2.flowClampOneArgBlock();
      noteVolumeBlock2.defaults.push(50);
      noteVolumeBlock2.hidden = true;
  
      var crescendoBlock = new ProtoBlock('crescendo');
      crescendoBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['crescendo'] = crescendoBlock;
      crescendoBlock.staticLabels.push(_('crescendo')+" +/-");
      crescendoBlock.adjustWidthToLabel();
      crescendoBlock.flowClampOneArgBlock();
      crescendoBlock.defaults.push(5);
      crescendoBlock.hidden = true;
  
      var newslurBlock = new ProtoBlock('newslur');
      newslurBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['newslur'] = newslurBlock;
      newslurBlock.staticLabels.push(_('slur'));
      newslurBlock.adjustWidthToLabel();
      newslurBlock.flowClampOneArgBlock();
      newslurBlock.defaults.push(1 / 16);
      newslurBlock.hidden = true;
  
      var newstaccatoBlock = new ProtoBlock('newstaccato');
      newstaccatoBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['newstaccato'] = newstaccatoBlock;
      newstaccatoBlock.staticLabels.push(_('staccato'));
      newstaccatoBlock.adjustWidthToLabel();
      newstaccatoBlock.flowClampOneArgBlock();
      newstaccatoBlock.defaults.push(1 / 32);
      newstaccatoBlock.hidden = true;
  
      var diminishedxBlock = new ProtoBlock('diminishedx');
      diminishedxBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['diminishedx'] = diminishedxBlock;
      diminishedxBlock.staticLabels.push(_('diminished'), _('interval'), _('octave') + '+/-');
      diminishedxBlock.extraWidth = 20;
      diminishedxBlock.adjustWidthToLabel();
      diminishedxBlock.flowClampTwoArgBlock();
      diminishedxBlock.dockTypes[2] = 'anyin';
      diminishedxBlock.defaults.push(5);
      diminishedxBlock.defaults.push(0);
      diminishedxBlock.hidden = true;
  
      var augmentedxBlock = new ProtoBlock('augmentedx');
      augmentedxBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['augmentedx'] = augmentedxBlock;
      augmentedxBlock.staticLabels.push(_('augmented'), _('interval'), _('octave') + '+/-');
      augmentedxBlock.extraWidth = 20;
      augmentedxBlock.adjustWidthToLabel();
      augmentedxBlock.flowClampTwoArgBlock();
      augmentedxBlock.dockTypes[2] = 'anyin';
      augmentedxBlock.defaults.push(5);
      augmentedxBlock.defaults.push(0);
      augmentedxBlock.hidden = true;
  
      var perfectxBlock = new ProtoBlock('perfectx');
      perfectxBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['perfectx'] = perfectxBlock;
      perfectxBlock.staticLabels.push(_('perfect'), _('interval'), _('octave') + '+/-');
      perfectxBlock.extraWidth = 20;
      perfectxBlock.adjustWidthToLabel();
      perfectxBlock.flowClampTwoArgBlock();
      perfectxBlock.dockTypes[2] = 'anyin';
      perfectxBlock.defaults.push(5);
      perfectxBlock.defaults.push(0);
      perfectxBlock.hidden = true;
  
      var minorxBlock = new ProtoBlock('minorx');
      minorxBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['minorx'] = minorxBlock;
      minorxBlock.staticLabels.push(_('minor'), _('interval'), _('octave') + '+/-');
      minorxBlock.extraWidth = 20;
      minorxBlock.adjustWidthToLabel();
      minorxBlock.flowClampTwoArgBlock();
      minorxBlock.dockTypes[2] = 'anyin';
      minorxBlock.defaults.push(3);
      minorxBlock.defaults.push(0);
      minorxBlock.hidden = true;
  
      var majorxBlock = new ProtoBlock('majorx');
      majorxBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['majorx'] = majorxBlock;
      majorxBlock.staticLabels.push(_('major'), _('interval'), _('octave') + '+/-');
      majorxBlock.extraWidth = 20;
      majorxBlock.adjustWidthToLabel();
      majorxBlock.flowClampTwoArgBlock();
      majorxBlock.dockTypes[2] = 'anyin';
      majorxBlock.defaults.push(3);
      majorxBlock.defaults.push(0);
      majorxBlock.hidden = true;
  
      var intervalBlock = new ProtoBlock('interval');
      intervalBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['interval'] = intervalBlock;
      //.TRANS: calculate a relative step between notes based on the current mode
      intervalBlock.staticLabels.push(_('relative interval'));
      intervalBlock.adjustWidthToLabel();
      intervalBlock.flowClampOneArgBlock();
      intervalBlock.defaults.push(5);
      intervalBlock.hidden = true;
  
      var drumnameBlock = new ProtoBlock('drumname');
      drumnameBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['drumname'] = drumnameBlock;
      drumnameBlock.valueBlock();
      drumnameBlock.dockTypes[0] = 'textout';
      drumnameBlock.hidden = true;
  
      var setdrumBlock = new ProtoBlock('setdrum');
      setdrumBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['setdrum'] = setdrumBlock;
      //.TRANS: set the current drum sound for playback
      setdrumBlock.staticLabels.push(_('set drum'));
      setdrumBlock.adjustWidthToLabel();
      setdrumBlock.flowClampOneArgBlock();
      setdrumBlock.dockTypes[1] = 'anyin';
      setdrumBlock.hidden = true;
  
      var playdrumBlock = new ProtoBlock('playdrum');
      playdrumBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['playdrum'] = playdrumBlock;
      playdrumBlock.staticLabels.push(_('drum'));
      playdrumBlock.adjustWidthToLabel();
      playdrumBlock.oneArgBlock();
      playdrumBlock.dockTypes[1] = 'anyin';
      playdrumBlock.hidden = true;
  
      var lilypondBlock = new ProtoBlock('savelilypond');
      lilypondBlock.palette = palettes.dict['extras'];
      blocks.protoBlockDict['savelilypond'] = lilypondBlock;
      lilypondBlock.staticLabels.push(_('save as lilypond'));
      lilypondBlock.adjustWidthToLabel();
      lilypondBlock.oneArgBlock();
      lilypondBlock.defaults.push(_('title') + '.ly');
      lilypondBlock.dockTypes[1] = 'textin';
      lilypondBlock.hidden = true;
  
      var notevolumeFactor = new ProtoBlock('notevolumefactor');
      notevolumeFactor.palette = palettes.dict['extras'];
      blocks.protoBlockDict['notevolumefactor'] = notevolumeFactor;
      //.TRANS: the volume at which notes are played
      notevolumeFactor.staticLabels.push(_('note volume'));
      notevolumeFactor.adjustWidthToLabel();
      notevolumeFactor.parameterBlock();
  
      // Push protoblocks onto their palettes.
      for (var protoblock in blocks.protoBlockDict) {
          if (blocks.protoBlockDict[protoblock].palette != null) {
              blocks.protoBlockDict[protoblock].palette.add(blocks.protoBlockDict[protoblock]);
          }
      }
  
      // Populate the lists of block types.
      blocks.findBlockTypes();
  }
  