# 26 "editor/ed_ocaml_lexer.mll"
 
open Lexing

let prerr_endline _ = ()

type token =
    AMPERAMPER
  | AMPERSAND
  | AND
  | AS
  | ASSERT
  | BACKQUOTE
  | BAR
  | BARBAR
  | BARRBRACKET
  | BEGIN
  | CHAR
  | CLASS
  | COLON
  | COLONCOLON
  | COLONEQUAL
  | COLONGREATER
  | COMMA
  | CONSTRAINT
  | DO
  | DONE
  | DOT
  | DOTDOT
  | DOWNTO
  | ELSE
  | END
  | EOF
  | EQUAL
  | EXCEPTION
  | EXTERNAL
  | FALSE
  | FLOAT
  | FOR
  | FUN
  | FUNCTION
  | FUNCTOR
  | GREATER
  | GREATERRBRACE
  | GREATERRBRACKET
  | IF
  | IN
  | INCLUDE
  | INFIXOP0
  | INFIXOP1
  | INFIXOP2
  | INFIXOP3
  | INFIXOP4
  | INHERIT
  | INITIALIZER
  | INT | INT32 | INT64 | NATIVEINT
  | LABEL of string
  | LAZY
  | LBRACE
  | LBRACELESS
  | LBRACKET
  | LBRACKETBAR
  | LBRACKETGREATER
  | LBRACKETLESS
  | LESS
  | LESSMINUS
  | LET
  | LIDENT
  | LPAREN
  | MATCH
  | METHOD
  | MINUS
  | MINUSDOT
  | MINUSGREATER
  | MODULE
  | MUTABLE
  | NEW
  | OBJECT
  | OF
  | OPEN
  | OPTLABEL of string
  | OR
  | PARSER
  | PLUS
  | PREFIXOP
  | PRIVATE
  | QUESTION
  | QUESTIONQUESTION
  | QUOTE
  | RBRACE
  | RBRACKET
  | REC
  | RPAREN
  | SEMI
  | SEMISEMI
  | SHARP
  | SIG
  | STAR
  | STRING
  | STRUCT
  | SUBTRACTIVE
  | THEN
  | TO
  | TRUE
  | TRY
  | TYPE
  | UIDENT
  | UNDERSCORE
  | VAL
  | VIRTUAL
  | WHEN
  | WHILE
  | WITH
  | COMMENT
  | EOL
  | EOFCOMMENT
  | EOFSTRING
  | ERROR
(* for lexers *)
  | RULE
  | PARSE

type error =
  | Illegal_character of char
  | Illegal_escape of string
  | Unterminated_comment
  | Unterminated_string
  | Keyword_as_label of string
  | Literal_overflow of string
  | End_with_no_begin of string
;;

(** start and stop positions in characters *)

type location = int * int

let curr_loc lexbuf =
  (lexbuf.Lexing.lex_start_p.Lexing.pos_cnum,
   lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum)

exception Error of error * location

(* The table of keywords *)

let token_kw =
  [
    "and"AND;
    "as"AS;
    "assert"ASSERT;
    "begin"BEGIN;
    "class"CLASS;
    "constraint"CONSTRAINT;
    "do"DO;
    "done"DONE;
    "downto"DOWNTO;
    "else"ELSE;
    "end"END;
    "exception"EXCEPTION;
    "external"EXTERNAL;
    "false"FALSE;
    "for"FOR;
    "fun"FUN;
    "function"FUNCTION;
    "functor"FUNCTOR;
    "if"IF;
    "in"IN;
    "include"INCLUDE;
    "inherit"INHERIT;
    "initializer"INITIALIZER;
    "lazy"LAZY;
    "let"LET;
    "match"MATCH;
    "method"METHOD;
    "module"MODULE;
    "mutable"MUTABLE;
    "new"NEW;
    "object"OBJECT;
    "of"OF;
    "open"OPEN;
    "or"OR;
(*  "parser", PARSER; *)
    "private"PRIVATE;
    "rec"REC;
    "sig"SIG;
    "struct"STRUCT;
    "then"THEN;
    "to"TO;
    "true"TRUE;
    "try"TRY;
    "type"TYPE;
    "val"VAL;
    "virtual"VIRTUAL;
    "when"WHEN;
    "while"WHILE;
    "with"WITH;

    "mod"INFIXOP3 ;
    "land"INFIXOP3 ;
    "lor"INFIXOP3 ;
    "lxor"INFIXOP3 ;
    "lsl"INFIXOP4 ;
    "lsr"INFIXOP4 ;
    "asr"INFIXOP4 ;
    ]

let keyword_table = Hashtbl.create 149
let _ = List.iter
    (fun (k,v) -> Hashtbl.add keyword_table k v)
    token_kw

(* To translate escape sequences *)

let char_for_backslash = function
  | 'n' -> '\010'
  | 'r' -> '\013'
  | 'b' -> '\008'
  | 't' -> '\009'
  | c   -> c

let char_for_decimal_code lexbuf i =
(*  let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) +
           10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) +
                (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in
  if (c < 0 || c > 255) && not (in_comment ())
  then raise (Error(Illegal_escape (Lexing.lexeme lexbuf),
                    curr_loc lexbuf))
  else Char.chr c
*)

  'x'
let char_for_hexadecimal_code lexbuf i =
(*
  let d1 = Char.code (Lexing.lexeme_char lexbuf i) in
  let val1 = if d1 >= 97 then d1 - 87
             else if d1 >= 65 then d1 - 55
             else d1 - 48
  in
  let d2 = Char.code (Lexing.lexeme_char lexbuf (i+1)) in
  let val2 = if d2 >= 97 then d2 - 87
             else if d2 >= 65 then d2 - 55
             else d2 - 48
  in
  Char.chr (val1 * 16 + val2)
*)

  'x'

(* Remove underscores from float literals *)

let remove_underscores s =
  let l = String.length s in
  let rec remove src dst =
    if src >= l then
      if dst >= l then s else String.sub s 0 dst
    else
      match s.[src] with
        '_' -> remove (src + 1) dst
      |  c  -> s.[dst] <- c; remove (src + 1) (dst + 1)
  in remove 0 0

(* Update the current location with file name and line number. *)

let update_loc lexbuf file line absolute chars =
  let pos = lexbuf.lex_curr_p in
  let new_file = match file with
                 | None -> pos.pos_fname
                 | Some s -> s
  in
  lexbuf.lex_curr_p <- { pos with
    pos_fname = new_file;
    pos_lnum = if absolute then line else pos.pos_lnum + line;
    pos_bol = pos.pos_cnum - chars;
  }
;;

(* Error report *)

let report_error = function
  | Illegal_character c ->
      Printf.sprintf "Illegal character (%s)" (Char.escaped c)
  | Illegal_escape s ->
      Printf.sprintf "Illegal backslash escape in string or character (%s)" s
  | Unterminated_comment ->
      Printf.sprintf "Comment not terminated"
  | Unterminated_string ->
      Printf.sprintf "String literal not terminated"
  | Keyword_as_label kwd ->
      Printf.sprintf "`%s' is a keyword, it cannot be used as label name" kwd
  | Literal_overflow ty ->
      Printf.sprintf "Integer literal exceeds the range of representable integers of type %s" ty
  | End_with_no_begin s ->
      Printf.sprintf "The closing '%s' has no matching open equivalent" s
;;


(* Block stack *)

let blocks = ref []

type cst_indent = {
    ind_newline : int ;
    ind_bracket : int ;
    ind_brace : int ;
    ind_parent : int ;
    ind_let : int ;
    ind_begin : int ;
    ind_match : int ;
    ind_comment : int ;
    ind_if : int ;
    ind_fun : int ;
    ind_struct : int ;
    ind_object : int ;
    ind_class : int ;
    ind_module : int ;
    ind_type : int ;
    ind_exception : int ;
    ind_loop : int;
    ind_field : int ;
    ind_val : int;
  }

let default_indent = {
  ind_newline = 2 ;
  ind_bracket = 2 ;
  ind_brace = 2 ;
  ind_parent = 1 ;
  ind_let = 2 ;
  ind_begin = 2 ;
  ind_match = 2 ;
  ind_comment = 3 ;
  ind_if = 2 ;
  ind_fun = 2 ;
  ind_struct = 2 ;
  ind_object = 2 ;
  ind_class = 2 ;
  ind_module = 2 ;
  ind_type = 2 ;
  ind_exception = 2 ;
  ind_loop = 2;
  ind_field = 2 ;
  ind_val = 2;
}
let cst_indent = ref default_indent

(* indentation for each line, in revert-order;
   Each time we encounter the first token of a line, we compute its
   indentation and add it to the list. [None] means that we should not
   touch the line (orelse this could change the blanks/tabs on the line).*)

let line_indentations = ref ([] : int option list)

let next_token_is_first = ref true
let next_line_is_more_indented = ref 0

(** Ad this indentation to the line_indentation list if we're on the first token of the line *)

let if_first_token_on_line n =
  if !next_token_is_first then
    (
     line_indentations := (Some n) :: !line_indentations;
     next_token_is_first := false
    )

let if_first_token_on_line_set_none () =
  if !next_token_is_first then
    (
     line_indentations := None :: !line_indentations;
     next_token_is_first := false
    )

let cur_indent = ref 0

let begin_comment_indentation = ref (!cur_indent, !next_line_is_more_indented)

let set_indent ?(touch_next_line=true) n =
  cur_indent := n ;
  if touch_next_line=true then
    next_line_is_more_indented := 0
let inc_indent ?(touch_next_line=true) n =
  cur_indent := !cur_indent + n;
  if touch_next_line=true then
    next_line_is_more_indented := 0
let dec_indent ?(touch_next_line=true) n =
  cur_indent := !cur_indent - n;
  if touch_next_line=true then
    next_line_is_more_indented := 0

let string_of_token =
  let l = List.map (fun (a,b) -> (b,a)) token_kw in
  fun t ->
    try List.assoc t l
    with Not_found -> "<other>"

let prerr_blocks_stack () =
  prerr_endline "Block stack is: ";
  List.iter
    (fun (tok,vext,vin) ->
      prerr_endline (Printf.sprintf "%s (%d, %+d)" (string_of_token tok) vext vin))
    !blocks

let last_popped = ref None
let rec pop tokens s lexbuf =
  match !blocks with
    [] ->
      prerr_blocks_stack ();
      raise (Error (End_with_no_begin s, curr_loc lexbuf))
  | (tok, vext, vin) :: q ->
      blocks := q;
      last_popped := Some (tok,vext,vin);
      if List.mem tok tokens then
        (
         prerr_endline (Printf.sprintf "popped %s (%d;%d)" (string_of_token tok) vext vin);
         (vext, vin)
        )
      else
        match tok with
          MATCH | TRY | FUN | FUNCTION | FUNCTOR | MINUSGREATER | MODULE
        | WITH | METHOD | VAL | ELSE | THEN | INCLUDE | LET
        | EXCEPTION | TYPE | INITIALIZER ->
             (* we can pop these ones and try with the next token
                because these contructions don't have an explicit end; *)

            pop tokens s lexbuf
        | _ ->
             (* we could jump the bad token to try to indent anyway
                but the result would be wrong *)

            prerr_blocks_stack ();
            raise (Error (End_with_no_begin s, curr_loc lexbuf))

let last_begin_let_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=LET) !blocks in
    Some (v, off)
  with Not_found -> None

let last_and_associated_indent () =
  try
    let (t,vext,vin) =
      List.find
        (fun (t,_,_) -> t=LET or t=MODULE or t=CLASS or t=TYPE)
        !blocks
    in
    Some (vext,vin)
  with Not_found -> None

let last_begin_module_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=MODULE) !blocks in
    Some (v, off)
  with Not_found -> None

let last_begin_struct_sig_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=STRUCT or t=SIG) !blocks in
    Some (v,off)
  with Not_found -> None

let last_begin_object_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=OBJECT) !blocks in
    Some (v,off)
  with Not_found -> None

let last_begin_sig_object_indent () =
  try
    let (_,v,off) = List.find (fun (t,_,_) -> t=OBJECT or t=SIG) !blocks in
    Some (v,off)
  with Not_found -> None

let push tok vext vin = blocks := (tok, vext, vin) :: !blocks

let push_if_different tok v off =
  match !blocks with
    (t,_,_) :: _ when t = tok -> false
  | _ -> push tok v off; true

let begin_tokens_of_token = function
    END -> [ BEGIN ; OBJECT ; SIG ; STRUCT ]
  | IN -> [ LET ]
  | DONE -> [ DO ]
  | DO -> [ WHILE ; FOR ]
  | RPAREN -> [LPAREN]
  | RBRACE -> [LBRACE]
  | RBRACKET -> [LBRACKETLBRACKETLESSLBRACKETGREATER]
  | BARRBRACKET -> [LBRACKETBAR]
  | GREATERRBRACE -> [LBRACELESS]
  | GREATERRBRACKET -> [LBRACKETLESS]
  | WITH -> [MATCH;TRY;LBRACE]
  | THEN -> [IF]
  | ELSE -> [THEN]
  | OBJECT ->  [CLASS]
  | STRUCT | SIG -> [MODULE]
  | _ -> assert false

let last_block_indent () =
  match !blocks with
    (_,n,off) :: _ -> (n, off)
  | _ -> (0, 0)

let last_block_inner_indent () =
  let (n,off) = last_block_indent () in n + off

let nl_info_stack = Stack.create ()
let push_nl_info () =
  Stack.push !next_line_is_more_indented nl_info_stack
let pop_nl_info () =
  try next_line_is_more_indented := Stack.pop nl_info_stack
  with Stack.Empty -> ()

let on_par_open token lexbuf =
  let cst = match token with
    LPAREN -> !cst_indent.ind_parent
  | LBRACE -> !cst_indent.ind_brace
  | LBRACKET
  | LBRACKETLESS
  | LBRACKETGREATER -> !cst_indent.ind_bracket
  | _ -> !cst_indent.ind_parent
  in
  if_first_token_on_line !cur_indent;
  (* keep the indentation of this block *)
  push_nl_info ();
  push token !cur_indent cst;
  (* then increment current indentation for lines in the parenthesis *)
(*
  let pos_on_line =
    let loc = lexbuf.Lexing.lex_start_p in
    loc.Lexing.pos_cnum - loc.Lexing.pos_bol
  in
*)

  inc_indent cst

let on_par_close lexbuf token s =
  set_indent ~touch_next_line: false
    (fst (pop (begin_tokens_of_token token) s lexbuf));
(*  next_line_is_more_indented := 1;*)
  if_first_token_on_line !cur_indent;
  pop_nl_info ()

let rec on_keyword lexbuf = function
    AND ->
      (
       match last_and_associated_indent () with
         Some (n, off) ->
           set_indent (n+off);
           if_first_token_on_line n
       | None -> if_first_token_on_line !cur_indent
      )
  | AS
  | ASSERT -> if_first_token_on_line !cur_indent
  | BAR ->
      (* can be associated to a WITH, a LBRACKET or a FUNCTION *)
      (
       match !blocks with
         (WITH,n,_) :: _ ->
           if_first_token_on_line n;
       | (LBRACKET,n,_) :: _ ->
           if_first_token_on_line n;
       | (FUNCTION,n,_) :: _ ->
           if_first_token_on_line n;
       | (ELSE,_,_) :: q
       | (THEN,_,_) :: q ->
           (* A bar is the end of a then or else if we're in a match/try *)
           blocks := q;
           on_keyword lexbuf BAR
       | _ ->
           if_first_token_on_line !cur_indent
      )
  | (BEGIN | STRUCT | SIG | OBJECTas token ->
      if token = BEGIN then push_nl_info ();
      if_first_token_on_line !cur_indent;
      let cst =
        match token with
          BEGIN -> !cst_indent.ind_begin
        | STRUCT | SIG -> !cst_indent.ind_struct
        | OBJECT -> !cst_indent.ind_object
        | _ -> assert false
      in
      push token !cur_indent cst;
      inc_indent cst
  | (CLASS | MODULE | CONSTRAINT | INCLUDEas token ->
      (
       let ind =
         match token with
           CLASS -> !cst_indent.ind_class
         | _ -> !cst_indent.ind_module
       in
       match last_begin_struct_sig_indent () with
         None ->
           if_first_token_on_line 0;
           push token 0 ind;
           set_indent ind
       | Some (n, off) ->
           let n = n + off in
           if_first_token_on_line n;
           push token n ind;
           set_indent (n + ind);
      );
      prerr_endline "CLASS";
      prerr_blocks_stack()
  | DO ->
      (
       set_indent (fst (pop (begin_tokens_of_token DO"do" lexbuf)) ;
       if_first_token_on_line !cur_indent;
       push DO !cur_indent !cst_indent.ind_loop;
       inc_indent !cst_indent.ind_loop
      )
  | DONE ->
      set_indent (fst (pop (begin_tokens_of_token DONE"done" lexbuf));
      if_first_token_on_line !cur_indent
  | DOWNTO ->
      if_first_token_on_line !cur_indent
  | THEN ->
      set_indent (fst (pop (begin_tokens_of_token THEN"then" lexbuf));
      push THEN !cur_indent !cst_indent.ind_if;
      if_first_token_on_line !cur_indent;
      inc_indent !cst_indent.ind_if
  | ELSE ->
      set_indent (fst (pop (begin_tokens_of_token ELSE"else" lexbuf));
      push ELSE !cur_indent !cst_indent.ind_if;
      if_first_token_on_line !cur_indent;
      inc_indent !cst_indent.ind_if;
  | END ->
      (
       (* if it is the end of a sig, a struct or an object, then
          we must pop also the previous module or class *)

       prerr_blocks_stack();
       let (t,n,off) =
         ignore(pop (begin_tokens_of_token END"end" lexbuf);
         match !last_popped with
           None -> assert false
         | Some info -> info
       in
       if_first_token_on_line n;
       match t with
         OBJECT | SIG | STRUCT ->
           set_indent (fst (last_block_indent ()))
       | _ ->
           set_indent ~touch_next_line: false n;
           pop_nl_info ();
      )

  | (EXCEPTION | EXTERNALas token ->
      (
       match last_begin_struct_sig_indent () with
         None ->
           if_first_token_on_line 0;
           set_indent !cst_indent.ind_exception
       | Some (n, off) ->
           let n = n + off in
           if_first_token_on_line n;
           push token n !cst_indent.ind_exception;
           set_indent (n + !cst_indent.ind_exception);
      )
  | FALSE | TRUE ->
      if_first_token_on_line !cur_indent
  | FOR ->
      if_first_token_on_line !cur_indent;
      push FOR !cur_indent 0;
  | FUN ->
      if !next_token_is_first then
        (
         if_first_token_on_line !cur_indent;
         push FUN !cur_indent !cst_indent.ind_fun;
         inc_indent !cst_indent.ind_fun
        )
      else
        (
         (* to prevent incrementing various times for sequences
            of fun ... -> fun ... -> on a same line *)

         match !blocks with
           (LET, n, _) :: _
         | (METHOD, n, _) :: _
         | (VAL, n, _) :: _ ->
             ()
         | _ ->
             if push_if_different FUN !cur_indent !cst_indent.ind_fun then
               inc_indent !cst_indent.ind_fun
        )
  | FUNCTION ->
      if !next_token_is_first then
        (
         if_first_token_on_line !cur_indent;
         push FUNCTION !cur_indent !cst_indent.ind_fun;
         inc_indent !cst_indent.ind_fun
        )
      else
        (
         match !blocks with
           (LET, n, _) :: _
         | (METHOD, n, _) :: _
         | (VAL, n, _) :: _ ->
             push FUNCTION n (2 * !cst_indent.ind_fun);
             set_indent (n + !cst_indent.ind_fun)
         | _ ->
             push FUNCTION !cur_indent (2 * !cst_indent.ind_fun);
             inc_indent (2 * !cst_indent.ind_fun)
        )
  | FUNCTOR ->
      if_first_token_on_line !cur_indent;
      (* to prevent incrementing various times for sequences
         of functor ... -> functor ... -> *)

      if push_if_different FUNCTOR !cur_indent !cst_indent.ind_fun then
        inc_indent !cst_indent.ind_fun
  | IF ->
      let p = last_block_inner_indent () in
      if_first_token_on_line p;
      push IF p !cst_indent.ind_if;
      set_indent (p + !cst_indent.ind_if)
  | IN ->
      set_indent (fst (pop (begin_tokens_of_token IN"in" lexbuf));
      if_first_token_on_line !cur_indent;
  | (INHERIT | INITIALIZER | METHODas token  ->
      (
       match last_begin_object_indent () with
         None ->
           if_first_token_on_line !cur_indent;
           if token = METHOD or token = INITIALIZER then
             push token !cur_indent !cst_indent.ind_field;
           inc_indent !cst_indent.ind_field;
       | Some (n,off) ->
           if_first_token_on_line (n+off);
           if token = METHOD or token = INITIALIZER then
             push token (n + off) !cst_indent.ind_field;
           set_indent (n + off + !cst_indent.ind_field);
      )
  | VIRTUAL ->
      if_first_token_on_line !cur_indent
  | VAL ->
       (* same heuristic as for LET *)
      if !next_token_is_first then
        (
         let loc = lexbuf.Lexing.lex_start_p in
         let pos_on_line = loc.Lexing.pos_cnum - loc.Lexing.pos_bol in
         let (top_align,off) =
           match last_begin_sig_object_indent () with
             None -> (0, 0)
           | Some (n, off) -> (n, off)
          in
         let pos =
           if top_align + off >= pos_on_line then
             top_align + off
            else
             !cur_indent
         in
         if_first_token_on_line pos;
         push VAL pos !cst_indent.ind_val;
         set_indent (pos + !cst_indent.ind_val)
        )
      else
        (
         push VAL !cur_indent !cst_indent.ind_val;
         inc_indent !cst_indent.ind_val
        )
  | LAZY ->
      if_first_token_on_line !cur_indent

  | LET ->
      (* heuristic: if the let is at the beginning of a line
         with at most n blanks before, with n being the current
         struct indentation, then consider it is a "top let" and
         align it on the other elements of the struct *)

      if !next_token_is_first then
        (
         let loc = lexbuf.Lexing.lex_start_p in
         let pos_on_line = loc.Lexing.pos_cnum - loc.Lexing.pos_bol in
         let (top_align, off) =
           match last_begin_struct_sig_indent () with
             None -> (0, 0)
           | Some (n, off) -> (n, off)
         in
         let pos =
           if top_align + off >= pos_on_line then
             top_align + off
           else
             last_block_inner_indent ()
         in
         if_first_token_on_line pos;
         push LET pos !cst_indent.ind_let;
         set_indent (pos + !cst_indent.ind_let)
        )
      else
        (
         push LET !cur_indent !cst_indent.ind_let;
         inc_indent !cst_indent.ind_let
        )
  | (MATCH | TRYas token ->
      if_first_token_on_line !cur_indent;
      push token !cur_indent !cst_indent.ind_match;
      inc_indent !cst_indent.ind_match
  | MINUSGREATER ->
      (
       if_first_token_on_line !cur_indent;
       (* can be associated to FUN, WITH and FUNCTOR ...
          or nothing. *)

       try
         match !blocks with
           (FUN,_,_) :: _
         | (FUNCTOR,_,_) :: _ ->
             ()
         | (FUNCTION,n,_) :: _ ->
             set_indent (n + 2 * !cst_indent.ind_fun)
         | (WITH,n,_) :: _ ->
             set_indent (n + 2 * !cst_indent.ind_match)
         | _ ->
             ()
       with
         Not_found ->
           inc_indent !cst_indent.ind_fun
      )
  | MUTABLE ->
      if_first_token_on_line !cur_indent;
  | NEW ->
      if_first_token_on_line !cur_indent;
  | OF | OPEN | OR | PRIVATE | REC | TO ->
      if_first_token_on_line !cur_indent;
  | TYPE ->
      (
       match !blocks with
         (MODULE,_,_) :: _
       | (CLASS,_,_) :: _ ->
           (* a module/class type, indentation has already been done
              when we encounterd MODULE/CLASS; do nothing *)

           prerr_endline "nothing to be done for type";
           prerr_blocks_stack ()
       | _ ->
           match last_begin_struct_sig_indent () with
             None ->
               if_first_token_on_line 0;
               set_indent !cst_indent.ind_type
           | Some (n, off) ->
               if_first_token_on_line (n + off);
               push TYPE (n + off) !cst_indent.ind_type;
               set_indent (n + off + !cst_indent.ind_type)
      )
  | WHEN ->
      if_first_token_on_line !cur_indent;
  | WHILE ->
      if_first_token_on_line !cur_indent;
      push WHILE !cur_indent !cst_indent.ind_loop;
      inc_indent !cst_indent.ind_loop
  | WITH ->
      (
       let (n,_) = pop (begin_tokens_of_token WITH"with" lexbuf in
       match !last_popped with
         Some (LBRACE,n,off) ->
           set_indent (n + off);
           if_first_token_on_line !cur_indent;
           push LBRACE n off
       | Some (MATCH,n,off) | Some (TRY,n,off) ->
           set_indent n;
           if_first_token_on_line !cur_indent;
           push WITH n (2 * !cst_indent.ind_match);
           inc_indent !cst_indent.ind_match
       | _ ->
           if_first_token_on_line n
      )
  | INFIXOP0 | INFIXOP1 | INFIXOP2 | INFIXOP3 | INFIXOP4 ->
      if_first_token_on_line !cur_indent

  | SEMI ->
      (
       match !blocks with
         (t,n,off) :: q ->
           let indent =
             match t with
               WITH | FUNCTION -> n + off
             | ELSE | THEN ->
                 blocks := q;
                 n
             | _ -> n + off
           in
           set_indent indent;
           if_first_token_on_line !cur_indent;
       | _ ->
           if_first_token_on_line !cur_indent;
      )
  | COMMA ->
      (
       match !blocks with
         (t,n,off) :: q ->
           let indent = n + off in
           set_indent indent;
           if_first_token_on_line !cur_indent;
       | _ ->
           if_first_token_on_line !cur_indent;
      )
  | _ ->
      if_first_token_on_line !cur_indent

# 886 "editor/ed_ocaml_lexer.ml"
let __ocaml_lex_tables = {
  Lexing.lex_base = 
   "\000\000\182\255\183\255\224\000\003\001&\001I\001l\001\196\255\143\001\180\001 \000\204\255C\000\217\001\252\001E\000H\000U\000\031\002\221\255\223\255\226\255B\002{\000e\002]\000/\001\240\255x\002\153\002\226\002\178\003\145\004\237\004\189\005\127\000\001\000\255\255\156\006\186\006\251\255\138\007i\008\248\255\241\255\242\255\243\255_\000-\003]\000p\0007\003\253\003\008\006g\002\173\004\133\000z\008b\000\237\000r\000\239\255\238\255\234\255a\005N\003s\000\237\255\026\004u\000\236\255\022\006v\000\235\255u\000\232\255\147\008\231\255,\007\016\005\004\000\230\255\007\000\t\001-\001\008\000\005\000\230\255\214\008\249\008\030\tA\t\218\255\214\255\215\255\216\255\212\255d\t\205\255\206\255\207\255\202\255\199\255\135\t\195\255\197\255\170\t\205\t\014\001\252\255\253\255\006\000\254\255\127\000>\002\t\000\135\000\135\000\182\000\012\000\016\000\225\000\017\000\224\000\013\000";
  Lexing.lex_backtrk = 
   "\255\255\255\255\255\255G\000D\000C\000>\000A\000\255\2559\0006\0004\000\255\255/\000.\000,\000*\000&\000$\000?\000\255\255\255\255\255\255\027\000\026\000!\000\031\000\030\000\255\255\n\000\n\000\t\000\008\000\005\000\003\000\002\000\001\000\000\000\255\255B\000\255\255\255\255\255\255\006\000\255\255\255\255\255\255\255\255\255\255\011\000\255\255\255\255\255\255\n\000\n\000\n\000\011\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\021\000\021\000\021\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\022\000\255\255F\000\255\255\255\255\255\255\025\000\255\255\255\255\255\255\255\255\255\255\025\000\255\255\028\000E\000@\000#\000\255\255\255\255\255\255\255\255\255\255-\000\255\255\255\255\255\255\255\255\255\2557\000\255\255\255\255A\000=\000\255\255\255\255\255\255\001\000\255\255\003\000\255\255\002\000\004\000\002\000\255\255\255\255\001\000\255\255\255\255\255\255\255\255";
  Lexing.lex_default = 
   "\001\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255;\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\255\255\000\000\255\255\255\255\000\000\000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255@\000\255\255\255\255\255\255\000\000\000\000\000\000\255\255\255\255\255\255\000\000\255\255\255\255\000\000\255\255\255\255\000\000\255\255\000\000\255\255\000\000S\000\255\255\255\255\000\000S\000T\000S\000V\000\255\255\000\000\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\255\255\255\255n\000\000\000\000\000\255\255\000\000\255\255)\000\255\255\255\255\255\255\255\255x\000{\000\255\255{\000\255\255\255\255";
  Lexing.lex_trans = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000&\000&\000$\000%\000R\000X\000q\000R\000X\000o\000Q\000W\000y\000&\000\000\000\000\000z\000z\000\000\000\000\000\000\000\000\000$\000\007\000\028\000\024\000\005\000\003\000\023\000\027\000\026\000\021\000\025\000\006\000\020\000\019\000\018\000\003\000\030\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\017\000\016\000\015\000\014\000\t\000!\000\004\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\013\000f\000\012\000\004\000#\000\022\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\011\000\n\000\008\000\"\000d\000a\000c\000`\000]\000P\000_\000^\000K\000$\000?\0009\000$\0009\0007\0007\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000>\000D\000P\000G\000J\000L\000$\0006\0006\0006\0006\0006\0006\0006\0006\000&\000&\000w\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000e\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000x\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000=\000 \000 \000 \000 \000 \000 \000 \000 \000\002\000\003\000|\000}\000\003\000\003\000\003\000\255\255\255\255\000\000\003\000\003\000\255\255\003\000\003\000\003\000\255\255\255\255\000\000R\000>\000\000\000Q\000\000\000q\000\000\000\003\000p\000\003\000\003\000\003\000\003\000\003\000\000\000\000\000\000\000\004\000\000\000\000\000\004\000\004\000\004\000\000\000V\000\000\000\004\000\004\000\000\000\004\000\004\000\004\000\000\000\000\000\000\000U\000R\000r\000=\000Q\000\000\000<\000\004\000\003\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000U\000\000\000T\000\005\000\005\000\000\000\005\000\005\000\005\000\255\255\000\000\000\000\000\000\000\000\000\000\003\000\000\000\003\000\000\000\005\000\004\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\000\000Z\000\005\000Z\000Z\000Z\000Z\000Z\000\000\000:\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000Z\000k\000l\000k\000k\000k\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000Z\000\000\000\005\000k\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000k\000\000\000k\000\000\000j\000\005\000\005\000\000\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\255\255\000\000\005\000i\000\005\000o\000\000\000\000\000g\000\005\000\005\000\000\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000b\000\005\000\005\000\000\000\255\255\000\000\255\255h\000\000\000\005\000\000\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000o\000Z\000Z\000t\000Z\000[\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000Z\000\005\000Z\000Z\000\\\000Z\000Z\000q\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000Y\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\005\000Z\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\003\000\000\000\000\000\003\000\003\000\003\000\000\000\000\000N\000M\000\003\000\000\000\003\000\003\000\003\000\000\000\000\0007\0007\000\000\000u\000Z\000\000\000Z\000\000\000\003\000\005\000\003\000\003\000\003\000\003\000\003\0001\000\000\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\000\000.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\005\000\000\000\000\000\003\000.\000\000\0007\0001\000\000\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000/\000\000\000-\000\000\000\029\000\000\000\000\000\000\0002\000\000\0000\0000\000\000\000\000\000\003\000\000\000\003\000/\000.\000-\000\000\0003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\000\000\000\000\000\000\000\000\000\000\000\000\000\029\000\000\000\000\0002\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\0003\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000n\000\000\000\000\000\031\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\0001\0001\0001\0001\0001\0001\0001\0001\0001\0001\0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\000\0000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\000E\000E\000E\000E\000E\000E\000E\000E\000E\000E\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\000\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000 \000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000.\000F\000F\000F\000F\000F\000F\000F\000F\000F\000F\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\0005\0005\0005\0005\0005\0005\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000+\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\0008\0008\0008\0008\0008\0008\0008\0008\0008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\0008\000'\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000P\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000'\000'\000\000\000\000\000P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000\000\000'\000(\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000'\000\000\000'\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000H\000H\000H\000H\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000H\000H\000H\000H\000H\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000 \000(\000(\000(\000(\000(\000(\000(\000(\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000\000\000\000\000\000\000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \0006\0006\0006\0006\0006\0006\0006\0006\000\000\000\000\000\000\000\000\000\000\000\000\000I\000I\000I\000I\000I\000I\000I\000I\000I\000I\000\000\000\000\000\000\000\000\000.\000\000\000\000\000I\000I\000I\000I\000I\000I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\000\000\000-\000I\000I\000I\000I\000I\000I\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\000\000 \000 \000 \000 \000 \000 \000 \000 \000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000'\000'\000'\000'\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000)\000\000\000\000\000\000\000\000\000\000\000'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000\000\000\000\000'\000(\000'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000U\000R\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000U\000\000\000T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\000\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000*\000(\000(\000(\000(\000(\000(\000(\000(\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000,\000\000\000\000\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000\000\000\000\000\000\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\000\000*\000*\000*\000*\000*\000*\000*\000*\000'\000\000\000\000\000'\000'\000'\000\000\000\000\000\000\000'\000'\000\000\000'\000'\000'\000\000\000C\000\000\000C\000\000\000\000\000\000\000\000\000C\000\000\000'\000\000\000'\000'\000'\000'\000'\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000M\000\000\000\000\000M\000M\000M\000\000\000\000\000\000\000M\000M\000\000\000M\000M\000M\000\000\000\000\000\000\000\000\000'\000\000\000\000\000\000\000\000\000\000\000M\000\000\000M\000M\000M\000M\000M\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\000\000\000'\000C\000\000\000\000\000\000\000C\000\000\000C\000\000\000\000\000M\000A\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000M\000\005\000M\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\005\000Z\000Z\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000\000\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000Z\000Z\000\000\000Z\000Z\000Z\000\000\000\000\000\000\000\000\000Z\000\000\000Z\000\000\000\000\000\255\255Z\000Z\000Z\000Z\000Z\000Z\000Z\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000Z\000\000\000\005\000Z\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\000\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\005\000\005\000\000\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000Z\000\000\000Z\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000\005\000k\000k\000k\000k\000k\000\000\000\000\000\000\000k\000\000\000\000\000k\000k\000k\000\000\000\000\000\000\000k\000k\000\000\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\005\000\000\000k\000k\000k\000k\000k\000k\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\000\000\000k\000\000\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000k\000\000\000k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_check = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\000\000%\000\000\000\000\000Q\000W\000p\000S\000V\000t\000S\000V\000x\000}\000\255\255\255\255y\000{\000\255\255\255\255\255\255\255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\013\000\016\000\013\000\017\000\018\000\024\000\017\000\017\000\026\000$\000;\0000\000$\0000\0002\0002\0000\0000\0000\0000\0000\0000\0000\0000\0000\0000\000=\000C\000\024\000F\000I\000K\000$\0003\0003\0003\0003\0003\0003\0003\0003\000r\000u\000v\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\0009\0009\0009\0009\0009\0009\0009\0009\0009\0009\000\013\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000z\000|\000\003\000\003\000\003\000S\000V\000\255\255\003\000\003\000x\000\003\000\003\000\003\000y\000{\000\255\255T\000<\000\255\255T\000\255\255m\000\255\255\003\000m\000\003\000\003\000\003\000\003\000\003\000\255\255\255\255\255\255\004\000\255\255\255\255\004\000\004\000\004\000\255\255T\000\255\255\004\000\004\000\255\255\004\000\004\000\004\000\255\255\255\255\255\255U\000U\000m\000\027\000U\000\255\255\027\000\004\000\003\000\004\000\004\000\004\000\004\000\004\000\255\255\255\255\255\255\005\000\255\255\255\255\005\000\005\000\005\000U\000\255\255U\000\005\000\005\000\255\255\005\000\005\000\005\000\027\000\255\255\255\255\255\255\255\255\255\255\003\000\255\255\003\000\255\255\005\000\004\000\005\000\005\000\005\000\005\000\005\000\255\255\255\255\255\255\006\000\255\255\255\255\006\000\006\000\006\000\255\255\255\255\255\255\006\000\006\000\255\255\006\000\006\000\006\000\255\255\255\255\255\255\255\255\255\255\255\255\004\000\255\255\004\000\255\255\006\000\005\000\006\000\006\000\006\000\006\000\006\000\255\255\027\000\255\255\007\000\255\255\255\255\007\000\007\000\007\000\255\255\255\255\255\255\007\000\007\000\255\255\007\000\007\000\007\000\255\255\255\255\255\255\255\255\255\255\255\255\005\000\255\255\005\000\255\255\007\000\006\000\007\000\007\000\007\000\007\000\007\000\255\255\255\255\255\255\t\000\255\255\255\255\t\000\t\000\t\000\255\255\255\255\255\255\t\000\t\000\255\255\t\000\t\000\t\000\255\255\255\255\255\255\255\255\255\255\255\255\006\000\255\255\006\000\255\255\t\000\007\000\t\000\t\000\t\000\t\000\t\000\255\255\255\255\255\255\255\255\255\255\n\000\255\255\255\255\n\000\n\000\n\000\255\255\255\255\255\255\n\000\n\000\255\255\n\000\n\000\n\000\255\255\255\255\255\255\255\255\007\000\255\255\007\000\255\255\t\000\t\000\n\000\255\255\n\000\n\000\n\000\n\000\n\000\255\255\255\255\255\255\255\255\255\255\014\000\255\255\255\255\014\000\014\000\014\000\255\255\255\255\255\255\014\000\014\000\255\255\014\000\014\000\014\000T\000\255\255\t\000\t\000\t\000m\000\255\255\255\255\n\000\n\000\014\000\255\255\014\000\014\000\014\000\014\000\014\000\255\255\255\255\255\255\015\000\255\255\255\255\015\000\015\000\015\000\255\255\255\255\255\255\015\000\015\000\255\255\015\000\015\000\015\000\255\255U\000\255\255\027\000\n\000\255\255\n\000\255\255\255\255\255\255\015\000\014\000\015\000\015\000\015\000\015\000\015\000\255\255\255\255\255\255\019\000\255\255\255\255\019\000\019\000\019\000\255\255\255\255s\000\019\000\019\000s\000\019\000\019\000\019\000\255\255\255\255\255\255\255\255\255\255\255\255\014\000\255\255\014\000\255\255\019\000\015\000\019\000\019\000\019\000\019\000\019\000s\000\255\255\255\255\023\000\255\255\255\255\023\000\023\000\023\000\255\255\255\255\255\255\023\000\023\000\255\255\023\000\023\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\015\000\255\255\015\000\255\255\023\000\019\000\023\000\023\000\023\000\023\000\023\000\255\255\255\255\255\255\025\000\255\255\255\255\025\000\025\000\025\000\255\255\255\255\025\000\025\000\025\000\255\255\025\000\025\000\025\000\255\255\255\2557\0007\000\255\255s\000\019\000\255\255\019\000\255\255\025\000\023\000\025\000\025\000\025\000\025\000\025\000\029\000\255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\255\2557\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\029\000\023\000\255\255\023\000\255\255\255\255\025\000\029\000\255\2557\000\030\000\255\255\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\000\030\0007\000\255\2557\000\255\255\029\000\255\255\255\255\255\255\030\000\255\255\029\000\030\000\255\255\255\255\025\000\255\255\025\000\029\000\030\000\029\000\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\255\255\030\000\255\255\255\255\030\000\255\255\255\255\255\255\255\255\255\255\255\255\030\000\255\255\030\000\030\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\030\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255s\000\255\255\255\255\031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\0001\0001\0001\0001\0001\0001\0001\0001\0001\0001\0004\0004\0004\0004\0004\0004\0004\0004\0004\0004\000\255\2551\000\255\255\255\255\255\255\255\255\255\2554\0004\0004\0004\0004\0004\000B\000B\000B\000B\000B\000B\000B\000B\000B\000B\000\255\255\255\255\255\255\255\2551\000\255\255\255\255\255\255\255\255\255\2551\000\255\255\255\255\255\255\255\255\255\2554\0004\0004\0004\0004\0004\000\255\255\255\255\255\255\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\255\255\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000 \000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\255\255\255\255\255\255\255\255\255\255\255\255\255\255 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\255\255\255\255\255\255\255\255 \000\255\255 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \0005\0005\0005\0005\0005\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\255\255\255\255\2555\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\2555\000E\000E\000E\000E\000E\000E\000E\000E\000E\000E\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2555\000\255\2555\0005\0005\0005\0005\0005\000\255\255\255\255\255\255\255\255\255\2555\000\255\2555\000\255\255\255\255\255\255\255\255\255\255\255\255 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\255\255 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000 \000\255\255 \000 \000 \000 \000 \000 \000 \000 \000!\000\255\255\255\255!\000!\000!\000\255\255\255\255\255\255!\000!\000\255\255!\000!\000!\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!\000\255\255!\000!\000!\000!\000!\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2558\0008\0008\0008\0008\0008\0008\0008\0008\0008\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255!\000!\000\255\255!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\0008\000!\000\"\000!\000\255\255\"\000\"\000\"\000\255\255\255\255\255\255\"\000\"\000P\000\"\000\"\000\"\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\"\000\255\255\"\000\"\000\"\000\"\000\"\000\255\255\255\255P\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000\255\255\"\000\"\000\255\255\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\255\255\"\000\255\255\"\000\255\255\255\255\255\255\255\255!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000!\000\255\255!\000!\000!\000!\000!\000!\000!\000!\000A\000A\000A\000A\000A\000A\000A\000A\000A\000A\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255A\000A\000A\000A\000A\000A\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255A\000A\000A\000A\000A\000A\000\255\255\255\255\255\255\255\255\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000#\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000\"\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000\255\255\255\255\255\255\255\255#\000\255\255#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\0006\0006\0006\0006\0006\0006\0006\0006\000\255\255\255\255\255\255\255\255\255\255\255\255H\000H\000H\000H\000H\000H\000H\000H\000H\000H\000\255\255\255\255\255\255\255\2556\000\255\255\255\255H\000H\000H\000H\000H\000H\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2556\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\2556\000\255\2556\000H\000H\000H\000H\000H\000H\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000\255\255#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000#\000\255\255#\000#\000#\000#\000#\000#\000#\000#\000'\000\255\255\255\255'\000'\000'\000\255\255\255\255\255\255'\000'\000\255\255'\000'\000'\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255'\000\255\255'\000'\000'\000'\000'\000\255\255\255\255\255\255\255\255(\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\255\255\255\255\255\255\255\255\255\255'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\255\255\255\255\255\255'\000(\000'\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000O\000O\000\255\255\255\255O\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\000\255\255O\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000\255\255(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000(\000*\000(\000(\000(\000(\000(\000(\000(\000(\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\255\255\255\255\255\255\255\255\255\255\255\255*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\255\255\255\255\255\255\255\255*\000\255\255*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\255\255*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000\255\255*\000*\000*\000*\000*\000*\000*\000*\000+\000\255\255\255\255+\000+\000+\000\255\255\255\255\255\255+\000+\000\255\255+\000+\000+\000\255\255:\000\255\255:\000\255\255\255\255\255\255\255\255:\000\255\255+\000\255\255+\000+\000+\000+\000+\000:\000:\000:\000:\000:\000:\000:\000:\000:\000:\000M\000\255\255\255\255M\000M\000M\000\255\255\255\255\255\255M\000M\000\255\255M\000M\000M\000\255\255\255\255\255\255\255\255+\000\255\255\255\255\255\255\255\255\255\255M\000\255\255M\000M\000M\000M\000M\000\255\255\255\255:\000\255\255\255\255\255\255\255\255\255\255:\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255+\000\255\255+\000:\000\255\255\255\255\255\255:\000\255\255:\000\255\255\255\255M\000:\000\255\255\255\255\255\255\255\255Y\000\255\255\255\255Y\000Y\000Y\000\255\255\255\255\255\255Y\000Y\000\255\255Y\000Y\000Y\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255M\000Y\000M\000Y\000Y\000Y\000Y\000Y\000\255\255\255\255\255\255Z\000\255\255\255\255Z\000Z\000Z\000\255\255\255\255\255\255Z\000Z\000\255\255Z\000Z\000Z\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255Z\000Y\000Z\000Z\000Z\000Z\000Z\000\255\255\255\255\255\255\255\255\255\255[\000\255\255\255\255[\000[\000[\000\255\255\255\255\255\255[\000[\000\255\255[\000[\000[\000\255\255\255\255\255\255\255\255Y\000\255\255Y\000\255\255\255\255Z\000[\000\255\255[\000[\000[\000[\000[\000\255\255\255\255\255\255\\\000\255\255\255\255\\\000\\\000\\\000\255\255\255\255\255\255\\\000\\\000\255\255\\\000\\\000\\\000\255\255\255\255\255\255\255\255Z\000\255\255Z\000\255\255\255\255:\000\\\000[\000\\\000\\\000\\\000\\\000\\\000\255\255\255\255\255\255b\000\255\255\255\255b\000b\000b\000\255\255\255\255\255\255b\000b\000\255\255b\000b\000b\000\255\255\255\255\255\255\255\255\255\255\255\255[\000\255\255[\000\255\255b\000\\\000b\000b\000b\000b\000b\000\255\255\255\255\255\255h\000\255\255\255\255h\000h\000h\000\255\255\255\255\255\255h\000h\000\255\255h\000h\000h\000\255\255\255\255\255\255\255\255\255\255\255\255\\\000\255\255\\\000\255\255h\000b\000h\000h\000h\000h\000h\000\255\255\255\255\255\255k\000\255\255\255\255k\000k\000k\000\255\255\255\255\255\255k\000k\000\255\255k\000k\000k\000\255\255\255\255\255\255\255\255\255\255\255\255b\000\255\255b\000\255\255k\000h\000k\000k\000k\000k\000k\000\255\255\255\255\255\255l\000\255\255\255\255l\000l\000l\000\255\255\255\255\255\255l\000l\000\255\255l\000l\000l\000\255\255\255\255\255\255\255\255\255\255\255\255h\000\255\255h\000\255\255l\000k\000l\000l\000l\000l\000l\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255k\000\255\255k\000\255\255\255\255l\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255l\000\255\255l\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_base_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000$\000\000\000\012\000\000\000\000\000\002\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_backtrk_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_default_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_trans_code = 
   "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\001\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\001\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000";
  Lexing.lex_check_code = 
   "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\024\000T\000\255\255\255\255T\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\024\000\255\255T\000\000\000U\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255O\000P\000\255\255\255\255\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000O\000O\000O\000O\000O\000O\000O\000O\000O\000O\000P\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255T\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255";
  Lexing.lex_code = 
   "\255\004\255\255\005\255\255\007\255\006\255\255\003\255\000\004\001\005\255\007\255\255\006\255\007\255\255\000\004\001\005\003\006\002\007\255";
}

let rec token lexbuf =
  lexbuf.Lexing.lex_mem <- Array.create 8 (-1) ;   __ocaml_lex_token_rec lexbuf 0
and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
  match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 935 "editor/ed_ocaml_lexer.mll"
      ( update_loc lexbuf None 1 false 0;
        (* increment only if this is not an empty line *)
        if (not !next_token_is_first) then
          if !next_line_is_more_indented > 0 &&
            (!cur_indent <= last_block_inner_indent ())
          then
            cur_indent := !cur_indent + !cst_indent.ind_newline
          else
            incr next_line_is_more_indented;
        if_first_token_on_line 0;
        next_token_is_first := true;
        token lexbuf
      )
# 1785 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 949 "editor/ed_ocaml_lexer.mll"
      ( token lexbuf )
# 1790 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 951 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent; token lexbuf )
# 1795 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 952 "editor/ed_ocaml_lexer.mll"
        ( if_first_token_on_line !cur_indent; token lexbuf )
# 1800 "editor/ed_ocaml_lexer.ml"

  | 4 ->
# 954 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent;
        let s = Lexing.lexeme lexbuf in
        let name = String.sub s 1 (String.length s - 2) in
        if Hashtbl.mem keyword_table name then
          raise (Error(Keyword_as_label name, curr_loc lexbuf));
        token lexbuf )
# 1810 "editor/ed_ocaml_lexer.ml"

  | 5 ->
# 960 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 1815 "editor/ed_ocaml_lexer.ml"

  | 6 ->
# 961 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 1820 "editor/ed_ocaml_lexer.ml"

  | 7 ->
# 963 "editor/ed_ocaml_lexer.mll"
      (
        let s = Lexing.lexeme lexbuf in
        let name = String.sub s 1 (String.length s - 2) in
        if Hashtbl.mem keyword_table name then
          raise (Error(Keyword_as_label name, curr_loc lexbuf));
        if_first_token_on_line !cur_indent;
        token lexbuf )
# 1831 "editor/ed_ocaml_lexer.ml"

  | 8 ->
# 971 "editor/ed_ocaml_lexer.mll"
      (
        let s = Lexing.lexeme lexbuf in
        try
          let kw = Hashtbl.find keyword_table s in
          on_keyword lexbuf kw;
          token lexbuf
        with Not_found ->
          if_first_token_on_line !cur_indent;
          token lexbuf
      )
# 1845 "editor/ed_ocaml_lexer.ml"

  | 9 ->
# 982 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf)
# 1852 "editor/ed_ocaml_lexer.ml"

  | 10 ->
# 986 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1860 "editor/ed_ocaml_lexer.ml"

  | 11 ->
# 991 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1867 "editor/ed_ocaml_lexer.ml"

  | 12 ->
# 995 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1875 "editor/ed_ocaml_lexer.ml"

  | 13 ->
# 1000 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1883 "editor/ed_ocaml_lexer.ml"

  | 14 ->
# 1005 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1891 "editor/ed_ocaml_lexer.ml"

  | 15 ->
# 1010 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        string lexbuf;
        token lexbuf
      )
# 1900 "editor/ed_ocaml_lexer.ml"

  | 16 ->
# 1016 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        next_token_is_first := true;
        if_first_token_on_line 0;
        update_loc lexbuf None 1 false 1;
        token lexbuf
      )
# 1911 "editor/ed_ocaml_lexer.ml"

  | 17 ->
# 1024 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1919 "editor/ed_ocaml_lexer.ml"

  | 18 ->
# 1029 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1927 "editor/ed_ocaml_lexer.ml"

  | 19 ->
# 1034 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1935 "editor/ed_ocaml_lexer.ml"

  | 20 ->
# 1039 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        token lexbuf
      )
# 1943 "editor/ed_ocaml_lexer.ml"

  | 21 ->
# 1044 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let l = Lexing.lexeme lexbuf in
        let esc = String.sub l 1 (String.length l - 1) in
        raise (Error(Illegal_escape esc, curr_loc lexbuf))
      )
# 1953 "editor/ed_ocaml_lexer.ml"

  | 22 ->
# 1051 "editor/ed_ocaml_lexer.mll"
      (
        begin_comment_indentation := (!cur_indent, !next_line_is_more_indented);
        if_first_token_on_line !cur_indent;
        comment lexbuf;
        token lexbuf )
# 1962 "editor/ed_ocaml_lexer.ml"

  | 23 ->
# 1057 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        comment lexbuf;
        token lexbuf
      )
# 1971 "editor/ed_ocaml_lexer.ml"

  | 24 ->
# 1063 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let curpos = lexbuf.lex_curr_p in
        lexbuf.lex_curr_p <- { curpos with pos_cnum = curpos.pos_cnum - 1 };
        token lexbuf
      )
# 1981 "editor/ed_ocaml_lexer.ml"

  | 25 ->
let
# 1069 "editor/ed_ocaml_lexer.mll"
                                   num
# 1987 "editor/ed_ocaml_lexer.ml"
Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_mem.(1)
and
# 1070 "editor/ed_ocaml_lexer.mll"
                                           name
# 1992 "editor/ed_ocaml_lexer.ml"
Lexing.sub_lexeme_opt lexbuf lexbuf.Lexing.lex_mem.(3) lexbuf.Lexing.lex_mem.(2) in
# 1072 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line 0;
        update_loc lexbuf name (int_of_string num) true 0;
        token lexbuf
      )
# 2000 "editor/ed_ocaml_lexer.ml"

  | 26 ->
# 1077 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2005 "editor/ed_ocaml_lexer.ml"

  | 27 ->
# 1078 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2010 "editor/ed_ocaml_lexer.ml"

  | 28 ->
# 1079 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2015 "editor/ed_ocaml_lexer.ml"

  | 29 ->
# 1080 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2020 "editor/ed_ocaml_lexer.ml"

  | 30 ->
# 1081 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent; token lexbuf )
# 2025 "editor/ed_ocaml_lexer.ml"

  | 31 ->
# 1082 "editor/ed_ocaml_lexer.mll"
         (
           on_par_open LPAREN lexbuf;
           token lexbuf
         )
# 2033 "editor/ed_ocaml_lexer.ml"

  | 32 ->
# 1086 "editor/ed_ocaml_lexer.mll"
         (
           on_par_close lexbuf RPAREN ")";
           token lexbuf )
# 2040 "editor/ed_ocaml_lexer.ml"

  | 33 ->
# 1089 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2046 "editor/ed_ocaml_lexer.ml"

  | 34 ->
# 1091 "editor/ed_ocaml_lexer.mll"
         ( on_keyword lexbuf COMMA;
           token lexbuf )
# 2052 "editor/ed_ocaml_lexer.ml"

  | 35 ->
# 1093 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           on_keyword lexbuf MINUSGREATER;
           token lexbuf )
# 2059 "editor/ed_ocaml_lexer.ml"

  | 36 ->
# 1096 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2065 "editor/ed_ocaml_lexer.ml"

  | 37 ->
# 1098 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2071 "editor/ed_ocaml_lexer.ml"

  | 38 ->
# 1100 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2077 "editor/ed_ocaml_lexer.ml"

  | 39 ->
# 1102 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2083 "editor/ed_ocaml_lexer.ml"

  | 40 ->
# 1104 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2089 "editor/ed_ocaml_lexer.ml"

  | 41 ->
# 1106 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2095 "editor/ed_ocaml_lexer.ml"

  | 42 ->
# 1108 "editor/ed_ocaml_lexer.mll"
         ( on_keyword lexbuf SEMI;
           token lexbuf )
# 2101 "editor/ed_ocaml_lexer.ml"

  | 43 ->
# 1110 "editor/ed_ocaml_lexer.mll"
         (
           set_indent 0;
           if_first_token_on_line !cur_indent;
           token lexbuf )
# 2109 "editor/ed_ocaml_lexer.ml"

  | 44 ->
# 1114 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2115 "editor/ed_ocaml_lexer.ml"

  | 45 ->
# 1116 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2121 "editor/ed_ocaml_lexer.ml"

  | 46 ->
# 1118 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2127 "editor/ed_ocaml_lexer.ml"

  | 47 ->
# 1120 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKET lexbuf;
           token lexbuf )
# 2133 "editor/ed_ocaml_lexer.ml"

  | 48 ->
# 1122 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETBAR lexbuf ;
           token lexbuf )
# 2139 "editor/ed_ocaml_lexer.ml"

  | 49 ->
# 1124 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETLESS lexbuf ;
           token lexbuf )
# 2145 "editor/ed_ocaml_lexer.ml"

  | 50 ->
# 1126 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACKETGREATER lexbuf;
           token lexbuf )
# 2151 "editor/ed_ocaml_lexer.ml"

  | 51 ->
# 1128 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf RBRACKET "]";
           token lexbuf )
# 2157 "editor/ed_ocaml_lexer.ml"

  | 52 ->
# 1130 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACE lexbuf ;
           token lexbuf )
# 2163 "editor/ed_ocaml_lexer.ml"

  | 53 ->
# 1132 "editor/ed_ocaml_lexer.mll"
         ( on_par_open LBRACELESS lexbuf ;
           token lexbuf )
# 2169 "editor/ed_ocaml_lexer.ml"

  | 54 ->
# 1134 "editor/ed_ocaml_lexer.mll"
         (
           on_keyword lexbuf BAR;
           token lexbuf )
# 2176 "editor/ed_ocaml_lexer.ml"

  | 55 ->
# 1137 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2182 "editor/ed_ocaml_lexer.ml"

  | 56 ->
# 1139 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf BARRBRACKET "|]";
           token lexbuf )
# 2188 "editor/ed_ocaml_lexer.ml"

  | 57 ->
# 1141 "editor/ed_ocaml_lexer.mll"
         ( token lexbuf )
# 2193 "editor/ed_ocaml_lexer.ml"

  | 58 ->
# 1142 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf GREATERRBRACKET ">]";
           token lexbuf )
# 2199 "editor/ed_ocaml_lexer.ml"

  | 59 ->
# 1144 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf RBRACE "}";
           token lexbuf )
# 2205 "editor/ed_ocaml_lexer.ml"

  | 60 ->
# 1146 "editor/ed_ocaml_lexer.mll"
         ( on_par_close lexbuf GREATERRBRACE ">}";
           token lexbuf )
# 2211 "editor/ed_ocaml_lexer.ml"

  | 61 ->
# 1148 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2217 "editor/ed_ocaml_lexer.ml"

  | 62 ->
# 1150 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2223 "editor/ed_ocaml_lexer.ml"

  | 63 ->
# 1152 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2229 "editor/ed_ocaml_lexer.ml"

  | 64 ->
# 1154 "editor/ed_ocaml_lexer.mll"
         ( if_first_token_on_line !cur_indent;
           token lexbuf )
# 2235 "editor/ed_ocaml_lexer.ml"

  | 65 ->
# 1158 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2241 "editor/ed_ocaml_lexer.ml"

  | 66 ->
# 1161 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2247 "editor/ed_ocaml_lexer.ml"

  | 67 ->
# 1164 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2253 "editor/ed_ocaml_lexer.ml"

  | 68 ->
# 1167 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2259 "editor/ed_ocaml_lexer.ml"

  | 69 ->
# 1170 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2265 "editor/ed_ocaml_lexer.ml"

  | 70 ->
# 1173 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2271 "editor/ed_ocaml_lexer.ml"

  | 71 ->
# 1176 "editor/ed_ocaml_lexer.mll"
            ( if_first_token_on_line !cur_indent;
              token lexbuf )
# 2277 "editor/ed_ocaml_lexer.ml"

  | 72 ->
# 1178 "editor/ed_ocaml_lexer.mll"
        ( EOF )
# 2282 "editor/ed_ocaml_lexer.ml"

  | 73 ->
# 1180 "editor/ed_ocaml_lexer.mll"
      ( raise (Error(Illegal_character (Lexing.lexeme_char lexbuf 0),
                     curr_loc lexbuf))
      )
# 2289 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state

and comment lexbuf =
    __ocaml_lex_comment_rec lexbuf 109
and __ocaml_lex_comment_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1186 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line !cur_indent;
        let indent, next_indented = !begin_comment_indentation in
        cur_indent := indent;
        next_line_is_more_indented := next_indented - 1
          (* usually, non-debug comments end a line *)
      )
# 2306 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1194 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line 0;
        next_token_is_first := true;
        update_loc lexbuf None 1 false 1;
        comment lexbuf
      )
# 2316 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1201 "editor/ed_ocaml_lexer.mll"
      ( raise (Error (Unterminated_comment, curr_loc lexbuf)) )
# 2321 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 1203 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line (!cur_indent + !cst_indent.ind_comment);
        comment lexbuf )
# 2328 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec lexbuf __ocaml_lex_state

and string lexbuf =
    __ocaml_lex_string_rec lexbuf 115
and __ocaml_lex_string_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1209 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line_set_none () ;
        string lexbuf
      )
# 2341 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1213 "editor/ed_ocaml_lexer.mll"
      ( if_first_token_on_line_set_none () )
# 2346 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1215 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line_set_none () ;
        next_token_is_first := true;
        update_loc lexbuf None 1 false 1;
        string lexbuf
      )
# 2356 "editor/ed_ocaml_lexer.ml"

  | 3 ->
# 1222 "editor/ed_ocaml_lexer.mll"
      ( raise (Error (Unterminated_string, curr_loc lexbuf)) )
# 2361 "editor/ed_ocaml_lexer.ml"

  | 4 ->
# 1224 "editor/ed_ocaml_lexer.mll"
      (
        if_first_token_on_line_set_none ();
        string lexbuf )
# 2368 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_rec lexbuf __ocaml_lex_state

and skip_sharp_bang lexbuf =
    __ocaml_lex_skip_sharp_bang_rec lexbuf 118
and __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state =
  match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
      | 0 ->
# 1230 "editor/ed_ocaml_lexer.mll"
       ( update_loc lexbuf None 3 false 0 )
# 2379 "editor/ed_ocaml_lexer.ml"

  | 1 ->
# 1232 "editor/ed_ocaml_lexer.mll"
       ( update_loc lexbuf None 1 false 0 )
# 2384 "editor/ed_ocaml_lexer.ml"

  | 2 ->
# 1233 "editor/ed_ocaml_lexer.mll"
       ( () )
# 2389 "editor/ed_ocaml_lexer.ml"

  | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_skip_sharp_bang_rec lexbuf __ocaml_lex_state

;;

# 1235 "editor/ed_ocaml_lexer.mll"
 
let get_lines_indentation ?(indent_spec=default_indent) s =
  let lexbuf = Lexing.from_string s in
  blocks := [];
  line_indentations := [];
  next_token_is_first := true;
  set_indent 0;
  cst_indent := indent_spec;
  try ignore(token lexbuf);
      `Success (List.rev !line_indentations);
  with Error (e,loc) -> `Failure (e,loc,(List.rev !line_indentations))


# 2409 "editor/ed_ocaml_lexer.ml"