docs: private void processEndBlockCmd(String parms, int cmdTPosBegin, int cmdTPosEnd)
              throws MiniTemplator.TemplateSyntaxException {
          if (conditionalExclude(cmdTPosBegin, cmdTPosEnd)) {
              return;
          }
          int p0 = skipBlanks(parms, 0);
          if (p0 >= parms.length()) {
              throw new MiniTemplator.TemplateSyntaxException(
                      "Missing block name in $EndBlock command in template at offset " + cmdTPosBegin + ".");
          }
          int p = skipNonBlanks(parms, p0);
          String blockName = parms.substring(p0, p);
          if (!isRestOfStringBlank(parms, p)) {
              throw new MiniTemplator.TemplateSyntaxException(
                      "Extra parameter in $EndBlock command in template at offset " + cmdTPosBegin + ".");
          }
          int blockNo = lookupBlockName(blockName);
          if (blockNo == -1) {
              throw new MiniTemplator.TemplateSyntaxException("Undefined block name \"" + blockName
                      + "\" in $EndBlock command in template at offset " + cmdTPosBegin + ".");
          }
          currentNestingLevel--;
          BlockTabRec btr = blockTab[blockNo];
          if (!btr.definitionIsOpen) {
              throw new MiniTemplator.TemplateSyntaxException("Multiple $EndBlock command for block \"" + blockName
                      + "\" in template at offset " + cmdTPosBegin + ".");
          }
          if (btr.nestingLevel != currentNestingLevel) {
              throw new MiniTemplator.TemplateSyntaxException(
                      "Block nesting level mismatch at $EndBlock command for block \"" + blockName
                              + "\" in template at offset " + cmdTPosBegin + ".");
          }
          btr.tPosContentsEnd = cmdTPosBegin;
          btr.tPosEnd = cmdTPosEnd;
          btr.definitionIsOpen = false;
      }