master 8286116877bc cached
39 files
246.9 KB
81.7k tokens
438 symbols
1 requests
Download .txt
Showing preview only (259K chars total). Download the full file or copy to clipboard to get everything.
Repository: micropython/micropython-unicorn
Branch: master
Commit: 8286116877bc
Files: 39
Total size: 246.9 KB

Directory structure:
gitextract_1e21aora/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── unicorn/
│   ├── Makefile
│   ├── help.c
│   ├── machine_i2c.c
│   ├── machine_pin.c
│   ├── main.c
│   ├── modmachine.c
│   ├── modmachine.h
│   ├── modpyb.c
│   ├── modpyb.h
│   ├── modutime.c
│   ├── mpconfigport.h
│   ├── mpconfigport_features.h
│   ├── mpconfigport_minimal.h
│   ├── mpconfigport_pyboard.h
│   ├── mphalport.c
│   ├── mphalport.h
│   ├── pyb_adc.c
│   ├── pyb_led.c
│   ├── pyb_servo.c
│   ├── pyb_switch.c
│   ├── qstrdefsport.h
│   ├── uart.c
│   ├── unicorn.ld
│   └── unicorn_mcu.h
└── www-emu/
    ├── Makefile
    ├── codemirror.css
    ├── codemirror.js
    ├── demo_gen.py
    ├── features_demos.py
    ├── fit.js
    ├── index.html
    ├── minimal_demos.py
    ├── mp_unicorn.css
    ├── mp_unicorn.js
    └── pyboard_demos.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Build directories
######################
www-emu/build
unicorn/build_*


================================================
FILE: .gitmodules
================================================
[submodule "micropython"]
	path = micropython
	url = https://github.com/micropython/micropython


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2017 Damien P. George

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: README.md
================================================
MicroPython on Unicorn
======================

This repository contains an implementation of a virtual microcontroller based
on the Unicorn emulator, which is in turn based on QEMU.  It also contains a
port of MicroPython to that virtual microcontroller.  Unicorn has a JavaScript
version, unicorn.js, which is obtained by running Emscripten on the C version
of Unicorn, and allows the virtual microcontroller to run in the browser.  This
then gives a full MicroPython port running simulated-bare-metal in a web browser.

For a running demo please visit https://micropython.org/unicorn

Build Instructions
------------------

```
$ git submodule update --init
```

Firmware binaries can be customized in the unicorn directory.

```
$ cd unicorn
$ make CONFIG=pyboard
```

The web page may be built using

```
$ cd www-emu
$ make
```

In order to build without using gzip (For example when testing with `$ python -m http.server`)

```
$ cd www-emu
$ make nogzip
```

There is a critical bug in unicorn-engine which is addressed [here](https://github.com/unicorn-engine/unicorn/pull/880). In order for full functionality apply the patch to a unicorn submodule within a unicorn.js repository and build normally.


================================================
FILE: unicorn/Makefile
================================================
# Select the configuration to build with, defaulting to "minimal"
CONFIG ?= minimal
ifeq ($(wildcard mpconfigport_$(CONFIG).h),)
$(error Invalid CONFIG specified)
endif

BUILD = build_$(CONFIG)
FIRMWARE = $(BUILD)/firmware_$(CONFIG)

include ../micropython/py/mkenv.mk

# qstr definitions (must come before including py.mk)
QSTR_DEFS = qstrdefsport.h

# include py core make definitions
include $(TOP)/py/py.mk

CROSS_COMPILE = arm-none-eabi-

INC += -I.
INC += -I$(TOP)
INC += -I$(BUILD)

CFLAGS_CORTEX_M4 = -mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfloat-abi=soft -fsingle-precision-constant -Wdouble-promotion
CFLAGS = $(INC) -Wall -Werror -std=c99 -nostdlib $(CFLAGS_CORTEX_M4) $(COPT)
CFLAGS += -DMP_CONFIGFILE="<mpconfigport_$(CONFIG).h>"

#Debugging/Optimization
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -ggdb
else
CFLAGS += -Os -DNDEBUG
endif

LDFLAGS = -nostdlib -T unicorn.ld -Map=$@.map --cref
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)

# Remove uncalled code from the final image.
CFLAGS += -fdata-sections -ffunction-sections
LDFLAGS += --gc-sections

SRC_C = \
	main.c \
	uart.c \
	help.c \
	mphalport.c \
	modutime.c \
	modmachine.c \
	machine_pin.c \
	machine_i2c.c \
	modpyb.c \
	pyb_led.c \
	pyb_switch.c \
	pyb_servo.c \
	pyb_adc.c \
	shared/libc/string0.c \
	shared/readline/readline.c \
	shared/runtime/interrupt_char.c \
	shared/runtime/pyexec.c \
	shared/runtime/stdout_helpers.c \

SRC_C += \
	lib/libm/math.c \
	lib/libm/fmodf.c \
	lib/libm/nearbyintf.c \
	lib/libm/ef_sqrt.c \
	lib/libm/log1pf.c \
	lib/libm/acoshf.c \
	lib/libm/asinhf.c \
	lib/libm/atanhf.c \
	lib/libm/kf_rem_pio2.c \
	lib/libm/kf_sin.c \
	lib/libm/kf_cos.c \
	lib/libm/kf_tan.c \
	lib/libm/ef_rem_pio2.c \
	lib/libm/erf_lgamma.c \
	lib/libm/sf_sin.c \
	lib/libm/sf_cos.c \
	lib/libm/sf_tan.c \
	lib/libm/sf_frexp.c \
	lib/libm/sf_modf.c \
	lib/libm/sf_ldexp.c \
	lib/libm/sf_erf.c \
	lib/libm/wf_lgamma.c \
	lib/libm/wf_tgamma.c \
	lib/libm/asinfacosf.c \
	lib/libm/atanf.c \
	lib/libm/atan2f.c \

# List of sources for qstr extraction
SRC_QSTR += $(SRC_C)

OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o))

all: $(FIRMWARE).bin

$(FIRMWARE).elf: $(OBJ)
	$(ECHO) "LINK $@"
	$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
	$(Q)$(SIZE) $@

$(FIRMWARE).bin: $(FIRMWARE).elf
	$(Q)$(OBJCOPY) -O binary -j .isr_vector -j .text -j .data $^ $@

include $(TOP)/py/mkrules.mk


================================================
FILE: unicorn/help.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "py/builtin.h"

const char unicorn_help_text[] =
"Welcome to MicroPython running under Unicorn!\n"
"\n"
"Control commands:\n"
"  CTRL-A        -- on a blank line, enter raw REPL mode\n"
"  CTRL-B        -- on a blank line, enter normal REPL mode\n"
"  CTRL-C        -- interrupt a running program\n"
"  CTRL-D        -- on a blank line, do a soft reset of the board\n"
"  CTRL-E        -- on a blank line, enter paste mode\n"
"\n"
"For further help on a specific object, type help(obj)\n"
#if MICROPY_PY_BUILTINS_HELP_MODULES
"For a list of available modules, type help('modules')\n"
#endif
;


================================================
FILE: unicorn/machine_i2c.c
================================================
#include <stdio.h>
#include <string.h>

#include "py/runtime.h"
#include "py/mphal.h"
#include "py/mperrno.h"
#include "extmod/machine_i2c.h"
#include "unicorn_mcu.h"

typedef struct _machine_i2c_obj_t {
    mp_obj_base_t base;
} machine_i2c_obj_t;

STATIC const machine_i2c_obj_t machine_i2c_obj[] = {
    {{&machine_i2c_type}},
};

STATIC void machine_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    mp_printf(print, "I2C(1, freq=unicorn, timeout=unicorn)");
}

STATIC mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
    enum { ARG_id, ARG_scl, ARG_sda, ARG_freq, ARG_timeout };
    static const mp_arg_t allowed_args[] = {
        { MP_QSTR_id, MP_ARG_REQUIRED | MP_ARG_OBJ },
        { MP_QSTR_scl, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
        { MP_QSTR_sda, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
        { MP_QSTR_freq, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 400000} },
        { MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1000} },
    };
    mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
    mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);

    // work out i2c bus
    int i2c_id = 0;
    if (MP_OBJ_IS_STR(args[ARG_id].u_obj)) {
        const char *port = mp_obj_str_get_str(args[ARG_id].u_obj);
        if (0) {
        #ifdef MICROPY_HW_I2C1_NAME
        } else if (strcmp(port, "X") == 0) {
            i2c_id = 1;
        #endif
        } else {
            nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
                "I2C(%s) doesn't exist", port));
        }
    } else {
        nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError,
            "I2C(%d) doesn't exist", i2c_id));
    }

    // get static peripheral object
    machine_i2c_obj_t *self = (machine_i2c_obj_t*)&machine_i2c_obj[i2c_id - 1];

    // here we would check the scl/sda pins and configure them, but it's not implemented
    if (args[ARG_scl].u_obj != MP_OBJ_NULL || args[ARG_sda].u_obj != MP_OBJ_NULL) {
        mp_raise_ValueError("explicit choice of scl/sda is not implemented");
    }

    // initialise the I2C peripheral
    //machine_i2c_init(self, args[ARG_freq].u_int, args[ARG_timeout].u_int);

    return MP_OBJ_FROM_PTR(self);
}

STATIC int machine_i2c_readfrom(mp_obj_base_t *self_in, uint16_t addr, uint8_t *dest, size_t len, bool stop) {
    printf("READFROM\n");
    return 0;
}

STATIC int machine_i2c_writeto(mp_obj_base_t *self_in, uint16_t addr, const uint8_t *src, size_t len, bool stop) {

    I2C->COMMAND = 0;

    I2C->DATA = addr << 1;

    int ret = I2C->DATA;
    if (ret < 0) {
        return ret;
    } else if (ret != 0) {
        return -MP_ENODEV;
    }

    int num_acks = 0;

    while (len > 0U) {
        I2C->DATA = *src++;
        len--;
        ret = I2C->DATA;
        if (ret < 0) {
            return ret;
        } else if (ret != 0) {
            break;
        }
        ++num_acks;
    }

    if (stop) {
        I2C->COMMAND = 1;
    }

    return num_acks;
}

STATIC int machine_i2c_transfer_single(mp_obj_base_t *self_in, uint16_t addr, size_t len, uint8_t *buf, unsigned int flags) {
    if (flags & MP_MACHINE_I2C_FLAG_READ) {
        return machine_i2c_readfrom(self_in, addr, buf, len, flags & MP_MACHINE_I2C_FLAG_STOP);
    } else {
        return machine_i2c_writeto(self_in, addr, buf, len, flags & MP_MACHINE_I2C_FLAG_STOP);
    }
}

STATIC const mp_machine_i2c_p_t machine_i2c_p = {
    .transfer = mp_machine_i2c_transfer_adaptor,
    .transfer_single = machine_i2c_transfer_single,
};

const mp_obj_type_t machine_i2c_type = {
    { &mp_type_type },
    .name = MP_QSTR_I2C,
    .print = machine_i2c_print,
    .make_new = machine_i2c_make_new,
    .protocol = &machine_i2c_p,
    .locals_dict = (mp_obj_dict_t*)&mp_machine_i2c_locals_dict,
};


================================================
FILE: unicorn/machine_pin.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/runtime.h"
#include "modmachine.h"

STATIC const machine_pin_obj_t machine_pin_obj[] = {
    {{&machine_pin_type}, MP_QSTR_X1, GPIO_X, 1},
    {{&machine_pin_type}, MP_QSTR_X2, GPIO_X, 2},
    {{&machine_pin_type}, MP_QSTR_X3, GPIO_X, 3},
    {{&machine_pin_type}, MP_QSTR_X4, GPIO_X, 4},
    {{&machine_pin_type}, MP_QSTR_X5, GPIO_X, 5},
    {{&machine_pin_type}, MP_QSTR_X6, GPIO_X, 6},
    {{&machine_pin_type}, MP_QSTR_X7, GPIO_X, 7},
    {{&machine_pin_type}, MP_QSTR_X8, GPIO_X, 8},
    {{&machine_pin_type}, MP_QSTR_X9, GPIO_X, 9},
    {{&machine_pin_type}, MP_QSTR_X10, GPIO_X, 10},
    {{&machine_pin_type}, MP_QSTR_X11, GPIO_X, 11},
    {{&machine_pin_type}, MP_QSTR_X12, GPIO_X, 12},
    {{&machine_pin_type}, MP_QSTR_X13, GPIO_X, 13},
    {{&machine_pin_type}, MP_QSTR_X14, GPIO_X, 14},
    {{&machine_pin_type}, MP_QSTR_X15, GPIO_X, 15},
    {{&machine_pin_type}, MP_QSTR_X16, GPIO_X, 16},
    {{&machine_pin_type}, MP_QSTR_X17, GPIO_X, 17},
    {{&machine_pin_type}, MP_QSTR_X18, GPIO_X, 18},
    {{&machine_pin_type}, MP_QSTR_X19, GPIO_X, 19},
    {{&machine_pin_type}, MP_QSTR_X20, GPIO_X, 20},
    {{&machine_pin_type}, MP_QSTR_X21, GPIO_X, 21},
    {{&machine_pin_type}, MP_QSTR_X22, GPIO_X, 22},
    {{&machine_pin_type}, MP_QSTR_X23, GPIO_X, 23},
    {{&machine_pin_type}, MP_QSTR_X24, GPIO_X, 24},
    {{&machine_pin_type}, MP_QSTR_Y1, GPIO_Y, 1},
    {{&machine_pin_type}, MP_QSTR_Y2, GPIO_Y, 2},
    {{&machine_pin_type}, MP_QSTR_Y3, GPIO_Y, 3},
    {{&machine_pin_type}, MP_QSTR_Y4, GPIO_Y, 4},
    {{&machine_pin_type}, MP_QSTR_Y5, GPIO_Y, 5},
    {{&machine_pin_type}, MP_QSTR_Y6, GPIO_Y, 6},
    {{&machine_pin_type}, MP_QSTR_Y7, GPIO_Y, 7},
    {{&machine_pin_type}, MP_QSTR_Y8, GPIO_Y, 8},
    {{&machine_pin_type}, MP_QSTR_Y9, GPIO_Y, 9},
    {{&machine_pin_type}, MP_QSTR_Y10, GPIO_Y, 10},
    {{&machine_pin_type}, MP_QSTR_Y11, GPIO_Y, 11},
    {{&machine_pin_type}, MP_QSTR_Y12, GPIO_Y, 12},
};

machine_pin_obj_t *machine_pin_get(mp_obj_t *obj_in) {
    if (MP_OBJ_IS_TYPE(obj_in, &machine_pin_type)) {
        return (machine_pin_obj_t*)obj_in;
    }
    mp_raise_TypeError("expecting a Pin");
}

void pin_set(mp_obj_t self_in, int value) {
    machine_pin_obj_t *self = self_in;
    if (value) {
        self->port->ODR |= (1 << self->pin);
    } else {
        self->port->ODR &= ~(1 << self->pin);
    }
}

void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    machine_pin_obj_t *self = self_in;
    mp_printf(print, "Pin(%q)", self->name);
}

STATIC mp_obj_t machine_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
    qstr args0 = mp_obj_str_get_qstr(args[0]);
    for (int i = 0; i < MP_ARRAY_SIZE(machine_pin_obj); i++) {
        if (machine_pin_obj[i].name == args0) {
            return (mp_obj_t)&machine_pin_obj[i];
        }
    }
    return mp_const_none;
}

STATIC mp_obj_t machine_pin_off(mp_obj_t self_in) {
    pin_set(self_in, 0);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_off_obj, machine_pin_off);

STATIC mp_obj_t machine_pin_on(mp_obj_t self_in) {
    pin_set(self_in, 1);
    return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_on_obj, machine_pin_on);

mp_obj_t machine_pin_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 0, 1, false);
    machine_pin_obj_t *self = self_in;
    if (n_args <= 0) {
        return MP_OBJ_NEW_SMALL_INT((self->port->IDR & (1 << self->pin)) ? 1 : 0);
    } else {
        if (mp_obj_get_int(args[0]) == 0) {
            self->port->ODR &= ~(1 << self->pin);
        } else {
            self->port->ODR |= (1 << self->pin);
        }
        return mp_const_none;
    }
}

STATIC mp_obj_t machine_pin_value(mp_uint_t n_args, const mp_obj_t *args) {
    return machine_pin_call(args[0], n_args - 1, 0, args + 1);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_value_obj, 1, 2, machine_pin_value);

STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
    { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&machine_pin_on_obj) },
    { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&machine_pin_off_obj) },
    { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&machine_pin_value_obj) },

    { MP_ROM_QSTR(MP_QSTR_IN), MP_ROM_INT(0) },
    { MP_ROM_QSTR(MP_QSTR_OUT), MP_ROM_INT(1) },
    { MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(0) },
    { MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(1) },
    { MP_ROM_QSTR(MP_QSTR_PULL_NONE), MP_ROM_INT(0) },
};

STATIC MP_DEFINE_CONST_DICT(machine_pin_locals_dict, machine_pin_locals_dict_table);

const mp_obj_type_t machine_pin_type = {
    { &mp_type_type },
    .name = MP_QSTR_Pin,
    .print = machine_pin_print,
    .make_new = machine_pin_make_new,
    .call = machine_pin_call,
    .locals_dict = (mp_obj_dict_t*)&machine_pin_locals_dict,
};


================================================
FILE: unicorn/main.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include "py/builtin.h"
#include "py/compile.h"
#include "py/runtime.h"
#include "py/stackctrl.h"
#include "py/repl.h"
#include "py/gc.h"
#include "py/mperrno.h"
#include "shared/runtime/interrupt_char.h"
#include "shared/runtime/pyexec.h"
#include "unicorn_mcu.h"

void do_str(const char *src, mp_parse_input_kind_t input_kind) {
    nlr_buf_t nlr;
    if (nlr_push(&nlr) == 0) {
        mp_lexer_t *lex = mp_lexer_new_from_str_len(MP_QSTR__lt_stdin_gt_, src, strlen(src), 0);
        mp_parse_tree_t parse_tree = mp_parse(lex, input_kind);
        mp_obj_t module_fun = mp_compile(&parse_tree, MP_QSTR__lt_stdin_gt_, false);
        mp_call_function_0(module_fun);
        nlr_pop();
    } else {
        // uncaught exception
        mp_obj_print_exception(&mp_plat_print, (mp_obj_t)nlr.ret_val);
    }
}

int main(int argc, char **argv) {
    extern uint32_t _ebss;
    extern uint32_t _sdata;

    // Stack limit should be less than real stack size, so we have a chance
    // to recover from limit hit.  (Limit is measured in bytes.)
    mp_stack_set_top((uint8_t*)&_sdata + UNICORN_CONTROLLER->RAM_SIZE);
    mp_stack_set_limit(UNICORN_CONTROLLER->STACK_SIZE - 1024);

    while (true) {
        gc_init(&_ebss, (uint8_t*)&_sdata + UNICORN_CONTROLLER->RAM_SIZE - UNICORN_CONTROLLER->STACK_SIZE);
        mp_init();

        do_str("for i in range(1):pass", MP_PARSE_FILE_INPUT);

        for (;;) {
            if (pyexec_mode_kind == PYEXEC_MODE_RAW_REPL) {
                if (pyexec_raw_repl() != 0) {
                    break;
                }
            } else {
                if (pyexec_friendly_repl() != 0) {
                    break;
                }
            }
        }
        mp_deinit();
        printf("PYB: soft reboot\n");
    }
    return 0;
}

void gc_collect(void) {
    // WARNING: This gc_collect implementation doesn't try to get root
    // pointers from CPU registers, and thus may function incorrectly.
    void *dummy;
    gc_collect_start();
    gc_collect_root(&dummy, ((mp_uint_t)MP_STATE_THREAD(stack_top) - (mp_uint_t)&dummy) / sizeof(mp_uint_t));
    gc_collect_end();
}

mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
    mp_raise_OSError(MP_ENOENT);
}

mp_import_stat_t mp_import_stat(const char *path) {
    return MP_IMPORT_STAT_NO_EXIST;
}

mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kwargs) {
    return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_open_obj, 1, mp_builtin_open);

void nlr_jump_fail(void *val) {
    while (1);
}

void NORETURN __fatal_error(const char *msg) {
    while (1);
}

#ifndef NDEBUG
void MP_WEAK __assert_func(const char *file, int line, const char *func, const char *expr) {
    printf("Assertion '%s' failed, at file %s:%d\n", expr, file, line);
    __fatal_error("Assertion failed");
}
#endif

// this is a minimal IRQ and reset framework for any Cortex-M CPU

extern uint32_t _sidata, _sdata, _edata, _sbss, _ebss;

void Reset_Handler(void) __attribute__((naked));
void Reset_Handler(void) {
    // set stack pointer
    __asm volatile ("ldr r0, =0x08000000");
    __asm volatile ("ldr sp, [r0]");
    // copy .data section from flash to RAM
    for (uint32_t *src = &_sidata, *dest = &_sdata; dest < &_edata;) {
        *dest++ = *src++;
    }
    // zero out .bss section
    for (uint32_t *dest = &_sbss; dest < &_ebss;) {
        *dest++ = 0;
    }

    UNICORN_CONTROLLER->PENDING = (uint32_t) &MP_STATE_MAIN_THREAD(mp_pending_exception);
    UNICORN_CONTROLLER->EXCEPTION = (uint32_t) &MP_STATE_VM(mp_kbd_exception);
    UNICORN_CONTROLLER->INTR_CHAR = (uint32_t) &mp_interrupt_char;

    // jump to board initialisation
    void _start(void);
    _start();
}

void Default_Handler(void) {
    for (;;) {
    }
}

const uint32_t isr_vector[] __attribute__((section(".isr_vector"))) = {
    0, // will be set dynamically
    (uint32_t)&Reset_Handler,
    (uint32_t)&Default_Handler, // NMI_Handler
    (uint32_t)&Default_Handler, // HardFault_Handler
    (uint32_t)&Default_Handler, // MemManage_Handler
    (uint32_t)&Default_Handler, // BusFault_Handler
    (uint32_t)&Default_Handler, // UsageFault_Handler
    0,
    0,
    0,
    0,
    (uint32_t)&Default_Handler, // SVC_Handler
    (uint32_t)&Default_Handler, // DebugMon_Handler
    0,
    (uint32_t)&Default_Handler, // PendSV_Handler
    (uint32_t)&Default_Handler, // SysTick_Handler
};

void _start(void) {
    // when we get here: stack is initialised, bss is clear, data is copied

    // SCB->CCR: enable 8-byte stack alignment for IRQ handlers, in accord with EABI
    //*((volatile uint32_t*)0xe000ed14) |= 1 << 9;

    // initialise the cpu and peripherals

    // now that we have a basic system up and running we can call main
    main(0, NULL);

    // we must not return
    for (;;) {
    }
}


================================================
FILE: unicorn/modmachine.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2017 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/obj.h"
#include "modmachine.h"
#include "extmod/machine_mem.h"
#include "extmod/machine_i2c.h"

#if MICROPY_PY_MACHINE

STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_machine) },

    { MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj) },
    { MP_ROM_QSTR(MP_QSTR_mem16), MP_ROM_PTR(&machine_mem16_obj) },
    { MP_ROM_QSTR(MP_QSTR_mem32), MP_ROM_PTR(&machine_mem32_obj) },

    { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&machine_pin_type) },
    #if MICROPY_PY_MACHINE_I2C
    { MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) },
    { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&machine_i2c_type) },
    #endif
};
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);

const mp_obj_module_t mp_module_machine = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&machine_module_globals,
};

MP_REGISTER_MODULE(MP_QSTR_machine, mp_module_machine);

#endif // MICROPY_PY_MACHINE


================================================
FILE: unicorn/modmachine.h
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#ifndef MICROPY_INCLUDED_MODMACHINE_H
#define MICROPY_INCLUDED_MODMACHINE_H

#include "unicorn_mcu.h"

typedef struct _machine_pin_obj_t {
    mp_obj_base_t base;
    qstr name;
    gpio_t *port;
    mp_uint_t pin;
} machine_pin_obj_t;

extern const mp_obj_type_t machine_pin_type;

machine_pin_obj_t *machine_pin_get(mp_obj_t *obj_in);
void pin_set(mp_obj_t self_in, int value);

extern const mp_obj_type_t machine_i2c_type;

#endif


================================================
FILE: unicorn/modpyb.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include "py/obj.h"
#include "modpyb.h"

STATIC const mp_rom_map_elem_t pyb_module_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_pyb) },

    { MP_ROM_QSTR(MP_QSTR_Switch), MP_ROM_PTR(&pyb_switch_type) },
    { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pyb_led_type) },
    { MP_ROM_QSTR(MP_QSTR_Servo), MP_ROM_PTR(&pyb_servo_type) },
    { MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&pyb_adc_type) },
};

STATIC MP_DEFINE_CONST_DICT(pyb_module_globals, pyb_module_globals_table);

const mp_obj_module_t pyb_module = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&pyb_module_globals,
};

MP_REGISTER_MODULE(MP_QSTR_pyb, pyb_module);


================================================
FILE: unicorn/modpyb.h
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

typedef enum {
    PYB_LED_RED = 1,
    PYB_LED_GREEN = 2,
    PYB_LED_YELLOW = 3,
    PYB_LED_BLUE = 4,
} pyb_led_t;

void led_state(pyb_led_t led, int state);
void led_toggle(pyb_led_t led);

extern const mp_obj_type_t pyb_led_type;

void switch_init0(void);
int switch_get(void);

extern const mp_obj_type_t pyb_switch_type;

void servo_init(void);

extern const mp_obj_type_t pyb_servo_type;

extern const mp_obj_type_t pyb_adc_type;


================================================
FILE: unicorn/modutime.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>
#include <string.h>

#include "py/nlr.h"
#include "py/smallint.h"
#include "py/obj.h"
#include "shared/timeutils/timeutils.h"
#include "extmod/utime_mphal.h"
#include "unicorn_mcu.h"

#if MICROPY_PY_UTIME_MP_HAL

STATIC const mp_rom_map_elem_t time_module_globals_table[] = {
    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_utime) },

    { MP_ROM_QSTR(MP_QSTR_sleep), MP_ROM_PTR(&mp_utime_sleep_obj) },
    { MP_ROM_QSTR(MP_QSTR_sleep_ms), MP_ROM_PTR(&mp_utime_sleep_ms_obj) },
    { MP_ROM_QSTR(MP_QSTR_sleep_us), MP_ROM_PTR(&mp_utime_sleep_us_obj) },
    { MP_ROM_QSTR(MP_QSTR_ticks_ms), MP_ROM_PTR(&mp_utime_ticks_ms_obj) },
    { MP_ROM_QSTR(MP_QSTR_ticks_us), MP_ROM_PTR(&mp_utime_ticks_us_obj) },
    { MP_ROM_QSTR(MP_QSTR_ticks_cpu), MP_ROM_PTR(&mp_utime_ticks_cpu_obj) },
    { MP_ROM_QSTR(MP_QSTR_ticks_add), MP_ROM_PTR(&mp_utime_ticks_add_obj) },
    { MP_ROM_QSTR(MP_QSTR_ticks_diff), MP_ROM_PTR(&mp_utime_ticks_diff_obj) },
};

STATIC MP_DEFINE_CONST_DICT(time_module_globals, time_module_globals_table);

const mp_obj_module_t mp_module_utime = {
    .base = { &mp_type_module },
    .globals = (mp_obj_dict_t*)&time_module_globals,
};

MP_REGISTER_MODULE(MP_QSTR_utime, mp_module_utime);

#endif // MICROPY_PY_UTIME_MP_HAL


================================================
FILE: unicorn/mpconfigport.h
================================================
#include <stdint.h>

// options to control how Micro Python is built

#define MICROPY_QSTR_BYTES_IN_HASH  (1)
#define MICROPY_ALLOC_PATH_MAX      (256)
#define MICROPY_ALLOC_PARSE_CHUNK_INIT (16)
#define MICROPY_COMP_MODULE_CONST   (0)
#define MICROPY_STACK_CHECK         (1)
#define MICROPY_MEM_STATS           (0)
#define MICROPY_DEBUG_PRINTERS      (0)
#define MICROPY_ENABLE_GC           (1)
#define MICROPY_GC_ALLOC_THRESHOLD  (0)
#define MICROPY_REPL_EVENT_DRIVEN   (0)
#define MICROPY_HELPER_REPL         (1)
#define MICROPY_HELPER_LEXER_UNIX   (0)
#define MICROPY_ENABLE_SOURCE_LINE  (1)
#define MICROPY_ENABLE_DOC_STRING   (0)
#define MICROPY_PY_MICROPYTHON_MEM_INFO (1)
#define MICROPY_PY___FILE__         (1)
#define MICROPY_PY_IO               (1)
#define MICROPY_PY_STRUCT           (1)
#define MICROPY_PY_SYS              (1)
#define MICROPY_MODULE_FROZEN_MPY   (0)
#define MICROPY_CPYTHON_COMPAT      (0)

#define MICROPY_REPL_AUTO_INDENT    (1)
#define MICROPY_KBD_EXCEPTION       (1)
// type definitions for the specific machine

#define MICROPY_MAKE_POINTER_CALLABLE(p) ((void*)((mp_uint_t)(p) | 1))

// This port is intended to be 32-bit, but unfortunately, int32_t for
// different targets may be defined in different ways - either as int
// or as long. This requires different printf formatting specifiers
// to print such value. So, we avoid int32_t and use int directly.
#define UINT_FMT "%u"
#define INT_FMT "%d"
typedef int mp_int_t; // must be pointer size
typedef unsigned mp_uint_t; // must be pointer size

typedef long mp_off_t;

#define MP_PLAT_PRINT_STRN(str, len) mp_hal_stdout_tx_strn_cooked(str, len)

// extra built in names to add to the global namespace
#define MICROPY_PORT_BUILTINS \
    { MP_OBJ_NEW_QSTR(MP_QSTR_open), (mp_obj_t)&mp_builtin_open_obj },

// We need an implementation of the log2 function which is not a macro
#define MP_NEED_LOG2 (1)

// We need to provide a declaration/definition of alloca()
#include <alloca.h>

#define MICROPY_HW_BOARD_NAME "unicorn"
#define MICROPY_HW_MCU_NAME "Cortex-M3"

#define MP_STATE_PORT MP_STATE_VM

#define MICROPY_PORT_ROOT_POINTERS \
    const char *readline_hist[8];


================================================
FILE: unicorn/mpconfigport_features.h
================================================
#define MICROPY_EMIT_THUMB                  (1)
#define MICROPY_EMIT_INLINE_THUMB           (1)
#define MICROPY_COMP_CONST                  (1)
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN    (1)
#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN    (1)
#define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (1)
#define MICROPY_PY_ASYNC_AWAIT              (1)
#define MICROPY_PY_BUILTINS_BYTEARRAY       (1)
#define MICROPY_PY_BUILTINS_MEMORYVIEW      (1)
#define MICROPY_PY_BUILTINS_ENUMERATE       (1)
#define MICROPY_PY_BUILTINS_FILTER          (1)
#define MICROPY_PY_BUILTINS_FROZENSET       (1)
#define MICROPY_PY_BUILTINS_REVERSED        (1)
#define MICROPY_PY_BUILTINS_SET             (1)
#define MICROPY_PY_BUILTINS_SLICE           (1)
#define MICROPY_PY_BUILTINS_PROPERTY        (1)
#define MICROPY_PY_BUILTINS_MIN_MAX         (1)
#define MICROPY_PY_BUILTINS_HELP            (1)
#define MICROPY_PY_BUILTINS_HELP_TEXT       unicorn_help_text
#define MICROPY_PY_BUILTINS_HELP_MODULES    (1)
#define MICROPY_PY_GC                       (1)
#define MICROPY_PY_ARRAY                    (1)
#define MICROPY_PY_ATTRTUPLE                (1)
#define MICROPY_PY_COLLECTIONS              (1)
#define MICROPY_PY_MATH                     (1)
#define MICROPY_PY_MACHINE                  (1)
#define MICROPY_LONGINT_IMPL                (MICROPY_LONGINT_IMPL_MPZ)
#define MICROPY_FLOAT_IMPL                  (MICROPY_FLOAT_IMPL_FLOAT)

#include "mpconfigport.h"


================================================
FILE: unicorn/mpconfigport_minimal.h
================================================
#define MICROPY_COMP_CONST                  (0)
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN    (0)
#define MICROPY_ERROR_REPORTING             (MICROPY_ERROR_REPORTING_TERSE)
#define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (0)
#define MICROPY_PY_ASYNC_AWAIT              (0)
#define MICROPY_PY_BUILTINS_BYTEARRAY       (0)
#define MICROPY_PY_BUILTINS_ENUMERATE       (0)
#define MICROPY_PY_BUILTINS_FILTER          (0)
#define MICROPY_PY_BUILTINS_REVERSED        (0)
#define MICROPY_PY_BUILTINS_SET             (0)
#define MICROPY_PY_BUILTINS_SLICE           (0)
#define MICROPY_PY_BUILTINS_PROPERTY        (0)
#define MICROPY_PY_BUILTINS_MIN_MAX         (0)
#define MICROPY_PY_GC                       (0)
#define MICROPY_PY_ARRAY                    (0)
#define MICROPY_PY_ATTRTUPLE                (0)
#define MICROPY_PY_COLLECTIONS              (0)
#define MICROPY_PY_MATH                     (0)

#include "mpconfigport.h"


================================================
FILE: unicorn/mpconfigport_pyboard.h
================================================
#define MICROPY_EMIT_THUMB                  (1)
#define MICROPY_EMIT_INLINE_THUMB           (1)
#define MICROPY_COMP_CONST                  (1)
#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN    (1)
#define MICROPY_COMP_TRIPLE_TUPLE_ASSIGN    (1)
#define MICROPY_BUILTIN_METHOD_CHECK_SELF_ARG (1)
#define MICROPY_PY_ASYNC_AWAIT              (1)
#define MICROPY_PY_BUILTINS_BYTEARRAY       (1)
#define MICROPY_PY_BUILTINS_MEMORYVIEW      (1)
#define MICROPY_PY_BUILTINS_ENUMERATE       (1)
#define MICROPY_PY_BUILTINS_FILTER          (1)
#define MICROPY_PY_BUILTINS_FROZENSET       (1)
#define MICROPY_PY_BUILTINS_REVERSED        (1)
#define MICROPY_PY_BUILTINS_SET             (1)
#define MICROPY_PY_BUILTINS_SLICE           (1)
#define MICROPY_PY_BUILTINS_PROPERTY        (1)
#define MICROPY_PY_BUILTINS_MIN_MAX         (1)
#define MICROPY_PY_BUILTINS_INPUT           (1)
#define MICROPY_PY_BUILTINS_POW3            (1)
#define MICROPY_PY_FUNCTION_ATTRS           (1)
#define MICROPY_PY_BUILTINS_STR_UNICODE     (1)
#define MICROPY_PY_BUILTINS_STR_CENTER      (1)
#define MICROPY_PY_BUILTINS_STR_PARTITION   (1)
#define MICROPY_PY_BUILTINS_STR_SPLITLINES  (1)
#define MICROPY_PY_BUILTINS_SLICE_ATTRS     (1)
#define MICROPY_PY_ALL_SPECIAL_METHODS      (1)
#define MICROPY_PY_BUILTINS_HELP            (1)
#define MICROPY_PY_BUILTINS_HELP_TEXT       unicorn_help_text
#define MICROPY_PY_BUILTINS_HELP_MODULES    (1)
#define MICROPY_PY_BUILTINS_COMPILE         (1)
#define MICROPY_PY_BUILTINS_EXECFILE        (1)
#define MICROPY_PY_GC                       (1)
#define MICROPY_PY_ARRAY                    (1)
#define MICROPY_PY_ATTRTUPLE                (1)
#define MICROPY_PY_COLLECTIONS              (1)
#define MICROPY_PY_MATH                     (1)
#define MICROPY_PY_MATH_SPECIAL_FUNCTIONS   (1)
#define MICROPY_PY_CMATH                    (1)
#define MICROPY_PY_FRAMEBUF                 (1)
#define MICROPY_PY_MACHINE                  (1)
#define MICROPY_PY_MACHINE_I2C              (1)
#define MICROPY_PY_MACHINE_SOFTI2C          (1)
#define MICROPY_HW_I2C1_NAME "X"
#define MICROPY_PY_UTIME_MP_HAL             (1)
#define MICROPY_MODULE_WEAK_LINKS           (1)
#define MICROPY_LONGINT_IMPL                (MICROPY_LONGINT_IMPL_MPZ)
#define MICROPY_FLOAT_IMPL                  (MICROPY_FLOAT_IMPL_FLOAT)

#include "mpconfigport.h"


================================================
FILE: unicorn/mphalport.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdint.h>
#include <stdio.h>

#include "py/runtime.h"
#include "unicorn_mcu.h"
#include "mphalport.h"

void mp_hal_delay_ms(mp_uint_t ms) {
    uint32_t start = mp_hal_ticks_ms();
    while (mp_hal_ticks_ms() - start < ms) {
        mp_handle_pending(true);
        UNICORN_CONTROLLER->IDLE = 1;
    }
}

void mp_hal_delay_us(mp_uint_t us) {
    uint32_t start = mp_hal_ticks_us();
    while (mp_hal_ticks_us() - start < us) {
        mp_handle_pending(true);
    }
}

mp_uint_t mp_hal_ticks_us(void) {
    return RTC->TICKS_US;
}

mp_uint_t mp_hal_ticks_ms(void) {
    return RTC->TICKS_MS;
}

mp_uint_t mp_hal_ticks_cpu(void) {
    return UNICORN_CONTROLLER->INSNS;
}


================================================
FILE: unicorn/mphalport.h
================================================
#include "py/obj.h"
#include "modmachine.h"

void mp_hal_delay_ms(mp_uint_t ms);
void mp_hal_delay_us(mp_uint_t us);
mp_uint_t mp_hal_ticks_ms(void);
mp_uint_t mp_hal_ticks_us(void);
mp_uint_t mp_hal_ticks_cpu(void);
void mp_hal_set_interrupt_char(int c);

#define MP_HAL_PIN_FMT "%q"
#define mp_hal_pin_obj_t const machine_pin_obj_t*
#define mp_hal_pin_name(p) ((p)->name)
#define mp_hal_pin_od_low(p) pin_set((mp_obj_t)p, 0)
#define mp_hal_pin_od_high(p) pin_set((mp_obj_t)p, 1)
#define mp_hal_get_pin_obj(o) machine_pin_get(o)
#define mp_hal_pin_read(p) (((p)->port->IDR & (1 << (p)->pin)) ? 1 : 0)
#define mp_hal_pin_open_drain(p) mp_hal_pin_config((p), 0, 0, 0)


static inline void mp_hal_pin_config(mp_hal_pin_obj_t pin, uint32_t mode, uint32_t pull, uint32_t alt) { }

static inline void mp_hal_delay_us_fast(uint32_t us) { return; }


================================================
FILE: unicorn/pyb_adc.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/runtime.h"
#include "modpyb.h"
#include "modmachine.h"
#include "unicorn_mcu.h"

typedef struct _pyb_adc_obj_t {
    mp_obj_base_t base;
    qstr pin_name;
    adc_t *port;
    mp_uint_t number;
} pyb_adc_obj_t;

STATIC const pyb_adc_obj_t pyb_adc_obj[] = {
    {{&pyb_adc_type}, MP_QSTR_X1, ADC_X, 1},
    {{&pyb_adc_type}, MP_QSTR_X2, ADC_X, 2},
    {{&pyb_adc_type}, MP_QSTR_X3, ADC_X, 3},
    {{&pyb_adc_type}, MP_QSTR_X4, ADC_X, 4},
    {{&pyb_adc_type}, MP_QSTR_X5, ADC_X, 5},
    {{&pyb_adc_type}, MP_QSTR_X6, ADC_X, 6},
    {{&pyb_adc_type}, MP_QSTR_X7, ADC_X, 7},
    {{&pyb_adc_type}, MP_QSTR_X8, ADC_X, 8},
    {{&pyb_adc_type}, MP_QSTR_X9, ADC_X, 9},
    {{&pyb_adc_type}, MP_QSTR_X10, ADC_X, 10},
    {{&pyb_adc_type}, MP_QSTR_X11, ADC_X, 11},
    {{&pyb_adc_type}, MP_QSTR_X12, ADC_X, 12},
    {{&pyb_adc_type}, MP_QSTR_Y1, ADC_Y, 1},
    {{&pyb_adc_type}, MP_QSTR_Y2, ADC_Y, 2},
    {{&pyb_adc_type}, MP_QSTR_Y3, ADC_Y, 3},
    {{&pyb_adc_type}, MP_QSTR_Y4, ADC_Y, 4},
    {{&pyb_adc_type}, MP_QSTR_Y5, ADC_Y, 5},
    {{&pyb_adc_type}, MP_QSTR_Y6, ADC_Y, 6},
    {{&pyb_adc_type}, MP_QSTR_Y7, ADC_Y, 7},
    {{&pyb_adc_type}, MP_QSTR_Y8, ADC_Y, 8},
    {{&pyb_adc_type}, MP_QSTR_Y9, ADC_Y, 9},
    {{&pyb_adc_type}, MP_QSTR_Y10, ADC_Y, 10},
    {{&pyb_adc_type}, MP_QSTR_Y11, ADC_Y, 11},
    {{&pyb_adc_type}, MP_QSTR_Y12, ADC_Y, 12},
};

void pyb_adc_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    mp_printf(print, "<ADC on channel=?>");
}

STATIC mp_obj_t pyb_adc_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 1, 1, false);

    machine_pin_obj_t *pin = machine_pin_get(args[0]);

    for (int i = 0; i < MP_ARRAY_SIZE(pyb_adc_obj); i++) {
        if (pyb_adc_obj[i].pin_name == pin->name) {
            return (mp_obj_t)&pyb_adc_obj[i];
        }
    }
    return mp_const_none;
}

STATIC mp_obj_t pyb_adc_read(mp_obj_t self_in) {
    pyb_adc_obj_t *self = self_in;
    return mp_obj_new_int(self->port->IDR[self->number - 1]);
}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_adc_read_obj, pyb_adc_read);

STATIC const mp_rom_map_elem_t pyb_adc_locals_dict_table[] = {
    { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&pyb_adc_read_obj) },
};

STATIC MP_DEFINE_CONST_DICT(pyb_adc_locals_dict, pyb_adc_locals_dict_table);

const mp_obj_type_t pyb_adc_type = {
    { &mp_type_type },
    .name = MP_QSTR_ADC,
    .print = pyb_adc_print,
    .make_new = pyb_adc_make_new,
    .locals_dict = (mp_obj_dict_t*)&pyb_adc_locals_dict,
};


================================================
FILE: unicorn/pyb_led.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013-2016 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/nlr.h"
#include "py/runtime.h"
#include "modpyb.h"
#include "unicorn_mcu.h"

typedef struct _pyb_led_obj_t {
    mp_obj_base_t base;
    mp_uint_t led_id;
} pyb_led_obj_t;

STATIC const pyb_led_obj_t pyb_led_obj[] = {
    {{&pyb_led_type}, 1},
    {{&pyb_led_type}, 2},
    {{&pyb_led_type}, 3},
    {{&pyb_led_type}, 4},
};
#define NUM_LEDS MP_ARRAY_SIZE(pyb_led_obj)

void led_state(pyb_led_t led, int state) {
    if (led < 1 || led > NUM_LEDS) {
        return;
    }

    if (state == 0) {
        GPIO->ODR &= ~(1 << (led - 1));
    } else {
        GPIO->ODR |= (1 << (led - 1));
    }
}

void led_toggle(pyb_led_t led) {
    if (led < 1 || led > NUM_LEDS) {
        return;
    }

    GPIO->ODR ^= 1 << (led - 1);
}

void led_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    pyb_led_obj_t *self = self_in;
    mp_printf(print, "LED(%lu)", self->led_id);
}

STATIC mp_obj_t led_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    // check arguments
    mp_arg_check_num(n_args, n_kw, 1, 1, false);

    // get led number
    mp_int_t led_id = mp_obj_get_int(args[0]);

    // check led number
    if (!(1 <= led_id && led_id <= NUM_LEDS)) {
        nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "LED(%d) does not exist", led_id));
    }

    return (mp_obj_t)&pyb_led_obj[led_id - 1];
}

/// \method on()
/// Turn the LED on.
mp_obj_t led_obj_on(mp_obj_t self_in) {
    pyb_led_obj_t *self = self_in;
    led_state(self->led_id, 1);
    return mp_const_none;
}

/// \method off()
/// Turn the LED off.
mp_obj_t led_obj_off(mp_obj_t self_in) {
    pyb_led_obj_t *self = self_in;
    led_state(self->led_id, 0);
    return mp_const_none;
}

/// \method toggle()
/// Toggle the LED between on and off.
mp_obj_t led_obj_toggle(mp_obj_t self_in) {
    pyb_led_obj_t *self = self_in;
    led_toggle(self->led_id);
    return mp_const_none;
}

STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);

STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {
    { MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj) },
    { MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj) },
    { MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj) },
};

STATIC MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);

const mp_obj_type_t pyb_led_type = {
    { &mp_type_type },
    .name = MP_QSTR_LED,
    .print = led_obj_print,
    .make_new = led_obj_make_new,
    .locals_dict = (mp_obj_dict_t*)&led_locals_dict,
};


================================================
FILE: unicorn/pyb_servo.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/runtime.h"
#include "modpyb.h"
#include "unicorn_mcu.h"

#define PYB_SERVO_NUM (1)

typedef struct _pyb_servo_obj_t {
    mp_obj_base_t base;
    servo_t *pins;
    mp_uint_t servo_id;
} pyb_servo_obj_t;

STATIC const pyb_servo_obj_t pyb_servo_obj[] = {
    {{&pyb_servo_type}, SERVO_1, 1},
};

STATIC void pyb_servo_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    pyb_servo_obj_t *self = self_in;
    mp_printf(print, "<Servo %lu at ?us>", self->servo_id);
}

STATIC mp_obj_t pyb_servo_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 1, 1, false);

    mp_int_t servo_id = mp_obj_get_int(args[0]) - 1;

    if (!(0 <= servo_id && servo_id < PYB_SERVO_NUM)) {
        nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "Servo %d does not exist", servo_id + 1));
    }

    return (mp_obj_t)&pyb_servo_obj[servo_id];
}

STATIC mp_obj_t pyb_servo_angle(mp_uint_t n_args, const mp_obj_t *args) {
    pyb_servo_obj_t *self = args[0];
    if (n_args == 1) {
        return mp_obj_new_int(self->pins->ANGLE);
    } else {
        self->pins->ANGLE = mp_obj_get_int(args[1]);
        if (n_args == 3) {
            self->pins->TIME = mp_obj_get_int(args[2]);
        }
    }
    return mp_const_none;
}

STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_servo_angle_obj, 1, 3, pyb_servo_angle);

STATIC const mp_rom_map_elem_t pyb_servo_locals_dict_table[] = {
    { MP_ROM_QSTR(MP_QSTR_angle), MP_ROM_PTR(&pyb_servo_angle_obj) },
};

STATIC MP_DEFINE_CONST_DICT(pyb_servo_locals_dict, pyb_servo_locals_dict_table);

const mp_obj_type_t pyb_servo_type = {
    { &mp_type_type },
    .name = MP_QSTR_Servo,
    .print = pyb_servo_print,
    .make_new = pyb_servo_make_new,
    .locals_dict = (mp_obj_dict_t*)&pyb_servo_locals_dict,
};


================================================
FILE: unicorn/pyb_switch.c
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdio.h>

#include "py/runtime.h"
#include "modpyb.h"
#include "unicorn_mcu.h"

void switch_init0(void) {
    return;
}

int switch_get(void) {
    return GPIO->IDR;
}

typedef struct _pyb_switch_obj_t {
    mp_obj_base_t base;
} pyb_switch_obj_t;

STATIC const pyb_switch_obj_t pyb_switch_obj = {{&pyb_switch_type}};

void pyb_switch_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
    mp_print_str(print, "Switch()");
}

STATIC mp_obj_t pyb_switch_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 0, 0, false);
    return (mp_obj_t)&pyb_switch_obj;
}

mp_obj_t pyb_switch_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
    mp_arg_check_num(n_args, n_kw, 0, 0, false);
    return switch_get() ? mp_const_true : mp_const_false;
}

STATIC mp_obj_t switch_value(mp_obj_t self_in) {
    return switch_get() ? mp_const_true : mp_const_false;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(pyb_switch_value_obj, switch_value);

STATIC const mp_rom_map_elem_t pyb_switch_locals_dict_table[] = {
    { MP_ROM_QSTR(MP_QSTR_value), MP_ROM_PTR(&pyb_switch_value_obj) },
};

STATIC MP_DEFINE_CONST_DICT(pyb_switch_locals_dict, pyb_switch_locals_dict_table);

const mp_obj_type_t pyb_switch_type = {
    { &mp_type_type },
    .name = MP_QSTR_Switch,
    .print = pyb_switch_print,
    .make_new = pyb_switch_make_new,
    .call = pyb_switch_call,
    .locals_dict = (mp_obj_dict_t*)&pyb_switch_locals_dict,
};


================================================
FILE: unicorn/qstrdefsport.h
================================================
// qstrs specific to this port


================================================
FILE: unicorn/uart.c
================================================
#include <unistd.h>
#include "py/mpconfig.h"

typedef struct _ucp_uart_t {
    volatile uint32_t TXR;
    volatile uint32_t RXR;
} ucp_uart_t;

#define UART0 ((ucp_uart_t*)0x40000000)

// Receive single character
int mp_hal_stdin_rx_chr(void) {
    unsigned char c = 0;
    c = UART0->RXR;
    return c;
}

// Send string of given length
void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {
    while (len--) {
        UART0->TXR = *str++;
    }
}


================================================
FILE: unicorn/unicorn.ld
================================================
/*
    GNU linker script for unicorn
*/

/* Specify the memory areas */
MEMORY
{
    FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1M
    RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 64K /* the length is dynamically configured */
}
 
/* top end of the stack */
/* this is dynamically configured and the correct value is at 0x08000000 */
/* _estack = ORIGIN(RAM) + LENGTH(RAM); */

/* define output sections */
SECTIONS
{
    /* The program code and other data goes into FLASH */
    .text :
    {
        . = ALIGN(4);
        KEEP(*(.isr_vector)) /* isr vector table */
        *(.text)           /* .text sections (code) */
        *(.text*)          /* .text* sections (code) */
        *(.rodata)         /* .rodata sections (constants, strings, etc.) */
        *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */

        . = ALIGN(4);
        _etext = .;        /* define a global symbol at end of code */
        _sidata = _etext;  /* This is used by the startup in order to initialize the .data secion */
    } >FLASH

    /* This is the initialized data section
    The program executes knowing that the data is in the RAM
    but the loader puts the initial values in the FLASH (inidata).
    It is one task of the startup to copy the initial values from FLASH to RAM. */
    .data : AT ( _sidata )
    {
        . = ALIGN(4);
        _sdata = .;        /* create a global symbol at data start; used by startup code in order to initialise the .data section in RAM */
        *(.data)           /* .data sections */
        *(.data*)          /* .data* sections */

        . = ALIGN(4);
        _edata = .;        /* define a global symbol at data end; used by startup code in order to initialise the .data section in RAM */
    } >RAM
            
    /* Uninitialized data section */
    .bss :
    {
        . = ALIGN(4);
        _sbss = .;         /* define a global symbol at bss start; used by startup code */
        *(.bss)
        *(.bss*)
        *(COMMON)

        . = ALIGN(4);
        _ebss = .;         /* define a global symbol at bss end; used by startup code */
    } >RAM

    .ARM.attributes 0 : { *(.ARM.attributes) }
}


================================================
FILE: unicorn/unicorn_mcu.h
================================================
/*
 * This file is part of the MicroPython project, http://micropython.org/
 *
 * The MIT License (MIT)
 *
 * Copyright (c) 2013, 2014 Damien P. George
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#ifndef UNICORN_MCU
#define UNICORN_MCU

typedef struct _unicorn_controller_t {
    volatile uint32_t PENDING;
    volatile uint32_t EXCEPTION;
    volatile uint32_t INTR_CHAR;
    volatile uint32_t RAM_SIZE;
    volatile uint32_t STACK_SIZE;
    volatile uint32_t IDLE;
    volatile uint32_t INSNS;
} unicorn_controller_t;

#define UNICORN_CONTROLLER ((unicorn_controller_t*)0x40000100)

typedef struct _gpio_t {
    volatile uint32_t ODR;
    volatile uint32_t IDR;
} gpio_t;

#define GPIO ((gpio_t*)0x40000200)
#define GPIO_X ((gpio_t*)0x40000208)
#define GPIO_Y ((gpio_t*)0x40000210)

typedef struct _servo_t {
    volatile uint32_t ANGLE;
    volatile uint32_t TIME;
} servo_t;

#define SERVO_1 ((servo_t*)0x40000218)

typedef struct _adc_t {
    volatile uint32_t IDR[12];
} adc_t;

#define ADC_X ((adc_t*)0x40000220)
#define ADC_Y ((adc_t*)0x40000250)

typedef struct _rtc_t {
    volatile uint32_t TICKS_MS;
    volatile uint32_t TICKS_US;
} rtc_t;

#define RTC ((rtc_t*)0x40000300)

typedef struct _i2c_t {
    volatile uint32_t DATA;
    volatile uint32_t COMMAND; // (0) Start bit, (1) Stop bit
} i2c_t;

#define I2C ((i2c_t*)0x40000400)

#endif


================================================
FILE: www-emu/Makefile
================================================
BUILD = build
UNICORN_BUILDS = ../unicorn/build_
IMAGES = images

DEMO_GEN = demo_gen.py

INDEX = index.html
MP_UNICORN_JS = mp_unicorn.js
MP_UNICORN_CSS = mp_unicorn.css
FIRMWARE = firmware_
UNICORN_JS = unicorn-arm.min.js
XTERM_JS = xterm.js
XTERM_CSS = xterm.css
FIT_JS = fit.js
CODEMIRROR_JS = codemirror.js
CODEMIRROR_CSS = codemirror.css
BOOTSTRAP_CSS = bootstrap.min.css
JQUERY_JS = jquery-3.2.1.min.js
IMAGEMAPSTER_JS = jquery.imagemapster.min.js
DEMO_SCRIPTS = demo_scripts.js

# Using xterm.js release 2.6.0 and latest unicorn.js as no current release is functional
XTERM_HASH = 2221f70ff05ba2af42ee0d26bed2f75dafe2d116
UNICORN_JS_LINK = https://raw.githubusercontent.com/AlexAltea/unicorn.js/master/dist/$(UNICORN_JS)
XTERM_JS_LINK = https://raw.githubusercontent.com/sourcelair/xterm.js/$(XTERM_HASH)/dist/$(XTERM_JS)
XTERM_CSS_LINK = https://raw.githubusercontent.com/sourcelair/xterm.js/$(XTERM_HASH)/dist/$(XTERM_CSS)
FIT_JS_LINK = https://raw.githubusercontent.com/sourcelair/xterm.js/$(XTERM_HASH)/dist/addons/fit/$(FIT_JS)

all: gzip

gzip: $(BUILD) $(BUILD)/$(UNICORN_JS).gz $(BUILD)/$(XTERM_JS).gz $(BUILD)/$(XTERM_CSS).gz $(BUILD)/$(FIT_JS).gz $(BUILD)/$(CODEMIRROR_JS).gz $(BUILD)/$(CODEMIRROR_CSS).gz $(BUILD)/$(BOOTSTRAP_CSS).gz $(BUILD)/$(JQUERY_JS).gz $(BUILD)/$(IMAGEMAPSTER_JS).gz copy
	rm -f $(BUILD)/$(MP_UNICORN_JS).gz
	gzip $(BUILD)/$(MP_UNICORN_JS)

# Make clean before switching between gzip and nogzip builds
nogzip: $(BUILD) $(BUILD)/$(UNICORN_JS) $(BUILD)/$(XTERM_JS) $(BUILD)/$(XTERM_CSS) $(BUILD)/$(FIT_JS) $(BUILD)/$(CODEMIRROR_JS) $(BUILD)/$(CODEMIRROR_CSS) $(BUILD)/$(BOOTSTRAP_CSS) $(BUILD)/$(JQUERY_JS) $(BUILD)/$(IMAGEMAPSTER_JS) copy

copy:
	cp $(INDEX) $(BUILD)
	cp $(MP_UNICORN_JS) $(BUILD)
	cp $(MP_UNICORN_CSS) $(BUILD)
	cp -r $(IMAGES) $(BUILD)
	-cp $(UNICORN_BUILDS)*/$(FIRMWARE)*.bin $(BUILD)
	python $(DEMO_GEN)
	mv $(DEMO_SCRIPTS) $(BUILD)

$(BUILD):
	mkdir $(BUILD)

$(BUILD)/$(UNICORN_JS):
	wget -P $(BUILD) $(UNICORN_JS_LINK)

$(BUILD)/$(UNICORN_JS).gz:
	wget -P $(BUILD) $(UNICORN_JS_LINK)
	gzip $(BUILD)/$(UNICORN_JS)

$(BUILD)/$(XTERM_JS):
	wget -P $(BUILD) $(XTERM_JS_LINK)

$(BUILD)/$(XTERM_JS).gz:
	wget -P $(BUILD) $(XTERM_JS_LINK)
	gzip $(BUILD)/$(XTERM_JS)

$(BUILD)/$(XTERM_CSS):
	wget -P $(BUILD) $(XTERM_CSS_LINK)

$(BUILD)/$(XTERM_CSS).gz:
	wget -P $(BUILD) $(XTERM_CSS_LINK)
	gzip $(BUILD)/$(XTERM_CSS)

$(BUILD)/$(FIT_JS):
	wget -P $(BUILD) $(FIT_JS_LINK)

$(BUILD)/$(FIT_JS).gz:
	wget -P $(BUILD) $(FIT_JS_LINK)
	gzip $(BUILD)/$(FIT_JS)

$(BUILD)/$(CODEMIRROR_JS):
	cp $(CODEMIRROR_JS) $(BUILD)

$(BUILD)/$(CODEMIRROR_JS).gz:
	cp $(CODEMIRROR_JS) $(BUILD)
	gzip $(BUILD)/$(CODEMIRROR_JS)

$(BUILD)/$(CODEMIRROR_CSS):
	cp $(CODEMIRROR_CSS) $(BUILD)

$(BUILD)/$(CODEMIRROR_CSS).gz:
	cp $(CODEMIRROR_CSS) $(BUILD)
	gzip $(BUILD)/$(CODEMIRROR_CSS)

$(BUILD)/$(BOOTSTRAP_CSS):
	cp $(BOOTSTRAP_CSS) $(BUILD)

$(BUILD)/$(BOOTSTRAP_CSS).gz:
	cp $(BOOTSTRAP_CSS) $(BUILD)
	gzip $(BUILD)/$(BOOTSTRAP_CSS)

$(BUILD)/$(JQUERY_JS):
	cp $(JQUERY_JS) $(BUILD)

$(BUILD)/$(JQUERY_JS).gz:
	cp $(JQUERY_JS) $(BUILD)
	gzip $(BUILD)/$(JQUERY_JS)

$(BUILD)/$(IMAGEMAPSTER_JS):
	cp $(IMAGEMAPSTER_JS) $(BUILD)

$(BUILD)/$(IMAGEMAPSTER_JS).gz:
	cp $(IMAGEMAPSTER_JS) $(BUILD)
	gzip $(BUILD)/$(IMAGEMAPSTER_JS)

.PHONY: clean

clean:
	rm -rf $(BUILD)


================================================
FILE: www-emu/codemirror.css
================================================
/* BASICS */

.CodeMirror {
  /* Set height, width, borders, and global font properties here */
  font-family: monospace;
  height: 300px;
}

/* PADDING */

.CodeMirror-lines {
  padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
  padding: 0 4px; /* Horizontal padding of content */
}

.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  background-color: white; /* The little square between H and V scrollbars */
}

/* GUTTER */

.CodeMirror-gutters {
  border-right: 1px solid #ddd;
  background-color: #f7f7f7;
  white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
  padding: 0 3px 0 5px;
  min-width: 20px;
  text-align: right;
  color: #999;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}

.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }

/* CURSOR */

.CodeMirror div.CodeMirror-cursor {
  border-left: 1px solid black;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
  border-left: 1px solid silver;
}
.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
  width: auto;
  border: 0;
  background: #7e7;
}
.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
  z-index: 1;
}

.cm-animate-fat-cursor {
  width: auto;
  border: 0;
  -webkit-animation: blink 1.06s steps(1) infinite;
  -moz-animation: blink 1.06s steps(1) infinite;
  animation: blink 1.06s steps(1) infinite;
}
@-moz-keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}
@-webkit-keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}
@keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}

/* Can style cursor different in overwrite (non-insert) mode */
div.CodeMirror-overwrite div.CodeMirror-cursor {}

.cm-tab { display: inline-block; text-decoration: inherit; }

.CodeMirror-ruler {
  border-left: 1px solid #ccc;
  position: absolute;
}

/* DEFAULT THEME */

.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}

.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}

.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}

/* Default styles for common addons */

div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}

/* STOP */

/* The rest of this file contains styles related to the mechanics of
   the editor. You probably shouldn't touch them. */

.CodeMirror {
  line-height: 1;
  position: relative;
  overflow: hidden;
  background: white;
  color: black;
}

.CodeMirror-scroll {
  overflow: scroll !important; /* Things will break if this is overridden */
  /* 30px is the magic margin used to hide the element's real scrollbars */
  /* See overflow: hidden in .CodeMirror */
  margin-bottom: -30px; margin-right: -30px;
  padding-bottom: 30px;
  height: 100%;
  outline: none; /* Prevent dragging from highlighting the element */
  position: relative;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}
.CodeMirror-sizer {
  position: relative;
  border-right: 30px solid transparent;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}

/* The fake, visible scrollbars. Used to force redraw during scrolling
   before actuall scrolling happens, thus preventing shaking and
   flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  position: absolute;
  z-index: 6;
  display: none;
}
.CodeMirror-vscrollbar {
  right: 0; top: 0;
  overflow-x: hidden;
  overflow-y: scroll;
}
.CodeMirror-hscrollbar {
  bottom: 0; left: 0;
  overflow-y: hidden;
  overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
  right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
  left: 0; bottom: 0;
}

.CodeMirror-gutters {
  position: absolute; left: 0; top: 0;
  z-index: 3;
}
.CodeMirror-gutter {
  white-space: normal;
  height: 100%;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
  display: inline-block;
  margin-bottom: -30px;
  /* Hack to make IE7 behave */
  *zoom:1;
  *display:inline;
}
.CodeMirror-gutter-wrapper {
  position: absolute;
  z-index: 4;
  height: 100%;
}
.CodeMirror-gutter-elt {
  position: absolute;
  cursor: default;
  z-index: 4;
}

.CodeMirror-lines {
  cursor: text;
  min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
  /* Reset some styles that the rest of the page might have set */
  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
  border-width: 0;
  background: transparent;
  font-family: inherit;
  font-size: inherit;
  margin: 0;
  white-space: pre;
  word-wrap: normal;
  line-height: inherit;
  color: inherit;
  z-index: 2;
  position: relative;
  overflow: visible;
}
.CodeMirror-wrap pre {
  word-wrap: break-word;
  white-space: pre-wrap;
  word-break: normal;
}

.CodeMirror-linebackground {
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  z-index: 0;
}

.CodeMirror-linewidget {
  position: relative;
  z-index: 2;
  overflow: auto;
}

.CodeMirror-widget {}

.CodeMirror-measure {
  position: absolute;
  width: 100%;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}
.CodeMirror-measure pre { position: static; }

.CodeMirror div.CodeMirror-cursor {
  position: absolute;
  border-right: none;
  width: 0;
}

div.CodeMirror-cursors {
  visibility: hidden;
  position: relative;
  z-index: 3;
}
.CodeMirror-focused div.CodeMirror-cursors {
  visibility: visible;
}

.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }

.cm-searching {
  background: #ffa;
  background: rgba(255, 255, 0, .4);
}

/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }

/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }

@media print {
  /* Hide the cursor when printing */
  .CodeMirror div.CodeMirror-cursors {
    visibility: hidden;
  }
}

/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }

/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }


================================================
FILE: www-emu/codemirror.js
================================================
/* CodeMirror - Minified & Bundled
   Generated on 27/12/2014 with http://codemirror.net/doc/compress.html
   Version: HEAD

   CodeMirror Library:
   - codemirror.js
   Modes:
   - python.js
 */

!function(a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else{if("function"==typeof define&&define.amd)return define([],a);this.CodeMirror=a()}}(function(){"use strict";function w(a,b){if(!(this instanceof w))return new w(a,b);this.options=b=b?Xg(b):{},Xg(pe,b,!1),J(b);var c=b.value;"string"==typeof c&&(c=new Sf(c,b.mode)),this.doc=c;var f=this.display=new x(a,c);f.wrapper.CodeMirror=this,F(this),D(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),b.autofocus&&!o&&fd(this),N(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new Ng,keySeq:null},d&&11>e&&setTimeout(Yg(ed,this,!0),20),id(this),ph(),Gc(this),this.curOp.forceUpdate=!0,Wf(this,c),b.autofocus&&!o||ih()==f.input?setTimeout(Yg(Od,this),20):Pd(this);for(var g in qe)qe.hasOwnProperty(g)&&qe[g](this,b[g],se);S(this);for(var h=0;h<we.length;++h)we[h](this);Ic(this)}function x(a,b){var c=this,g=c.input=dh("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none");f?g.style.width="1000px":g.setAttribute("wrap","off"),n&&(g.style.border="1px solid black"),g.setAttribute("autocorrect","off"),g.setAttribute("autocapitalize","off"),g.setAttribute("spellcheck","false"),c.inputDiv=dh("div",[g],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),c.scrollbarFiller=dh("div",null,"CodeMirror-scrollbar-filler"),c.scrollbarFiller.setAttribute("not-content","true"),c.gutterFiller=dh("div",null,"CodeMirror-gutter-filler"),c.gutterFiller.setAttribute("not-content","true"),c.lineDiv=dh("div",null,"CodeMirror-code"),c.selectionDiv=dh("div",null,null,"position: relative; z-index: 1"),c.cursorDiv=dh("div",null,"CodeMirror-cursors"),c.measure=dh("div",null,"CodeMirror-measure"),c.lineMeasure=dh("div",null,"CodeMirror-measure"),c.lineSpace=dh("div",[c.measure,c.lineMeasure,c.selectionDiv,c.cursorDiv,c.lineDiv],null,"position: relative; outline: none"),c.mover=dh("div",[dh("div",[c.lineSpace],"CodeMirror-lines")],null,"position: relative"),c.sizer=dh("div",[c.mover],"CodeMirror-sizer"),c.sizerWidth=null,c.heightForcer=dh("div",null,null,"position: absolute; height: "+Ig+"px; width: 1px;"),c.gutters=dh("div",null,"CodeMirror-gutters"),c.lineGutter=null,c.scroller=dh("div",[c.sizer,c.heightForcer,c.gutters],"CodeMirror-scroll"),c.scroller.setAttribute("tabIndex","-1"),c.wrapper=dh("div",[c.inputDiv,c.scrollbarFiller,c.gutterFiller,c.scroller],"CodeMirror"),d&&8>e&&(c.gutters.style.zIndex=-1,c.scroller.style.paddingRight=0),n&&(g.style.width="0px"),f||(c.scroller.draggable=!0),k&&(c.inputDiv.style.height="1px",c.inputDiv.style.position="absolute"),a&&(a.appendChild?a.appendChild(c.wrapper):a(c.wrapper)),c.viewFrom=c.viewTo=b.first,c.reportedViewFrom=c.reportedViewTo=b.first,c.view=[],c.renderedView=null,c.externalMeasured=null,c.viewOffset=0,c.lastWrapHeight=c.lastWrapWidth=0,c.updateLineNumbers=null,c.nativeBarWidth=c.barHeight=c.barWidth=0,c.scrollbarsClipped=!1,c.lineNumWidth=c.lineNumInnerWidth=c.lineNumChars=null,c.prevInput="",c.alignWidgets=!1,c.pollingFast=!1,c.poll=new Ng,c.cachedCharWidth=c.cachedTextHeight=c.cachedPaddingH=null,c.inaccurateSelection=!1,c.maxLine=null,c.maxLineLength=0,c.maxLineChanged=!1,c.wheelDX=c.wheelDY=c.wheelStartX=c.wheelStartY=null,c.shift=!1,c.selForContextMenu=null}function y(a){a.doc.mode=w.getMode(a.options,a.doc.modeOption),z(a)}function z(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,Wb(a,100),a.state.modeGen++,a.curOp&&Vc(a)}function A(a){a.options.lineWrapping?(lh(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(kh(a.display.wrapper,"CodeMirror-wrap"),I(a)),C(a),Vc(a),qc(a),setTimeout(function(){O(a)},100)}function B(a){var b=Cc(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/Dc(a.display)-3);return function(e){if(mf(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function C(a){var b=a.doc,c=B(a);b.iter(function(a){var b=c(a);b!=a.height&&$f(a,b)})}function D(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),qc(a)}function E(a){F(a),Vc(a),setTimeout(function(){R(a)},20)}function F(a){var b=a.display.gutters,c=a.options.gutters;fh(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(dh("div",null,"CodeMirror-gutter "+e));"CodeMirror-linenumbers"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+"px")}b.style.display=d?"":"none",G(a)}function G(a){var b=a.display.gutters.offsetWidth;a.display.sizer.style.marginLeft=b+"px"}function H(a){if(0==a.height)return 0;for(var c,b=a.text.length,d=a;c=ef(d);){var e=c.find(0,!0);d=e.from.line,b+=e.from.ch-e.to.ch}for(d=a;c=ff(d);){var e=c.find(0,!0);b-=d.text.length-e.from.ch,d=e.to.line,b+=d.text.length-e.to.ch}return b}function I(a){var b=a.display,c=a.doc;b.maxLine=Xf(c,c.first),b.maxLineLength=H(b.maxLine),b.maxLineChanged=!0,c.iter(function(a){var c=H(a);c>b.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function J(a){var b=Ug(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):b>-1&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function K(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+_b(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+bc(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function L(a,b,c){this.cm=c;var f=this.vert=dh("div",[dh("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),g=this.horiz=dh("div",[dh("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(f),a(g),yg(f,"scroll",function(){f.clientHeight&&b(f.scrollTop,"vertical")}),yg(g,"scroll",function(){g.clientWidth&&b(g.scrollLeft,"horizontal")}),this.checkedOverlay=!1,d&&8>e&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function M(){}function N(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&kh(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new w.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),yg(b,"mousedown",function(){a.state.focused&&setTimeout(Yg(fd,a),0)}),b.setAttribute("not-content","true")},function(b,c){"horizontal"==c?yd(a,b):xd(a,b)},a),a.display.scrollbars.addClass&&lh(a.display.wrapper,a.display.scrollbars.addClass)}function O(a,b){b||(b=K(a));var c=a.display.barWidth,d=a.display.barHeight;P(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&_(a),P(a,K(a)),c=a.display.barWidth,d=a.display.barHeight}function P(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function Q(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-$b(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=ag(b,d),g=ag(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;f>h?(f=h,g=ag(b,bg(Xf(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=ag(b,bg(Xf(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function R(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=U(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&c[g].gutter&&(c[g].gutter.style.left=f);var h=c[g].alignable;if(h)for(var i=0;i<h.length;i++)h[i].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+"px")}}function S(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=T(a.options,b.first+b.size-1),d=a.display;if(c.length!=d.lineNumChars){var e=d.measure.appendChild(dh("div",[dh("div",c)],"CodeMirror-linenumber CodeMirror-gutter-elt")),f=e.firstChild.offsetWidth,g=e.offsetWidth-f;return d.lineGutter.style.width="",d.lineNumInnerWidth=Math.max(f,d.lineGutter.offsetWidth-g),d.lineNumWidth=d.lineNumInnerWidth+g,d.lineNumChars=d.lineNumInnerWidth?c.length:-1,d.lineGutter.style.width=d.lineNumWidth+"px",G(a),!0}return!1}function T(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function U(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function V(a,b,c){var d=a.display;this.viewport=b,this.visible=Q(d,a.doc,b),this.editorIsHidden=!d.wrapper.offsetWidth,this.wrapperHeight=d.wrapper.clientHeight,this.wrapperWidth=d.wrapper.clientWidth,this.oldDisplayWidth=cc(a),this.force=c,this.dims=bb(a)}function W(a){var b=a.display;!b.scrollbarsClipped&&b.scroller.offsetWidth&&(b.nativeBarWidth=b.scroller.offsetWidth-b.scroller.clientWidth,b.heightForcer.style.height=bc(a)+"px",b.sizer.style.marginBottom=-b.nativeBarWidth+"px",b.sizer.style.borderRightWidth=bc(a)+"px",b.scrollbarsClipped=!0)}function X(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return Xc(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==_c(a))return!1;S(a)&&(Xc(a),b.dims=bb(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&f-c.viewFrom<20&&(f=Math.max(d.first,c.viewFrom)),c.viewTo>g&&c.viewTo-g<20&&(g=Math.min(e,c.viewTo)),v&&(f=kf(a.doc,f),g=lf(a.doc,g));var h=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;$c(a,f,g),c.viewOffset=bg(Xf(a.doc,c.viewFrom)),a.display.mover.style.top=c.viewOffset+"px";var i=_c(a);if(!h&&0==i&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;var j=ih();return i>4&&(c.lineDiv.style.display="none"),cb(a,c.updateLineNumbers,b.dims),i>4&&(c.lineDiv.style.display=""),c.renderedView=c.view,j&&ih()!=j&&j.offsetHeight&&j.focus(),fh(c.cursorDiv),fh(c.selectionDiv),c.heightForcer.style.top=c.gutters.style.height=0,h&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,Wb(a,400)),c.updateLineNumbers=null,!0}function Y(a,b){for(var c=b.force,d=b.viewport,e=!0;;e=!1){if(e&&a.options.lineWrapping&&b.oldDisplayWidth!=cc(a))c=!0;else if(c=!1,d&&null!=d.top&&(d={top:Math.min(a.doc.height+_b(a.display)-dc(a),d.top)}),b.visible=Q(a.display,a.doc,d),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!X(a,b))break;_(a);var f=K(a);Sb(a),$(a,f),O(a,f)}Cg(a,"update",a),(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)&&(Cg(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Z(a,b){var c=new V(a,b);if(X(a,c)){_(a),Y(a,c);var d=K(a);Sb(a),$(a,d),O(a,d)}}function $(a,b){a.display.sizer.style.minHeight=a.display.heightForcer.style.top=b.docHeight+"px",a.display.gutters.style.height=Math.max(b.docHeight+bc(a),b.clientHeight)+"px"}function _(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;f<b.view.length;f++){var h,g=b.view[f];if(!g.hidden){if(d&&8>e){var i=g.node.offsetTop+g.node.offsetHeight;h=i-c,c=i}else{var j=g.node.getBoundingClientRect();h=j.bottom-j.top}var k=g.line.height-h;if(2>h&&(h=Cc(b)),(k>.001||-.001>k)&&($f(g.line,h),ab(g.line),g.rest))for(var l=0;l<g.rest.length;l++)ab(g.rest[l])}}}function ab(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=a.widgets[b].node.offsetHeight}function bb(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:U(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function cb(a,b,c){function i(b){var c=b.nextSibling;return f&&p&&a.display.currentWheelTarget==b?b.style.display="none":b.parentNode.removeChild(b),c}for(var d=a.display,e=a.options.lineNumbers,g=d.lineDiv,h=g.firstChild,j=d.view,k=d.viewFrom,l=0;l<j.length;l++){var m=j[l];if(m.hidden);else if(m.node){for(;h!=m.node;)h=i(h);var o=e&&null!=b&&k>=b&&m.lineNumber;m.changes&&(Ug(m.changes,"gutter")>-1&&(o=!1),db(a,m,k,c)),o&&(fh(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(T(a.options,k)))),h=m.node.nextSibling}else{var n=lb(a,m,k,c);g.insertBefore(n,h)}k+=m.size}for(;h;)h=i(h)}function db(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];"text"==f?hb(a,b):"gutter"==f?jb(a,b,c,d):"class"==f?ib(b):"widget"==f&&kb(b,d)}b.changes=null}function eb(a){return a.node==a.text&&(a.node=dh("div",null,null,"position: relative"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),d&&8>e&&(a.node.style.zIndex=2)),a.node}function fb(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;if(b&&(b+=" CodeMirror-linebackground"),a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=eb(a);a.background=c.insertBefore(dh("div",null,b),c.firstChild)}}function gb(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Gf(a,b)}function hb(a,b){var c=b.text.className,d=gb(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,ib(b)):c&&(b.text.className=c)}function ib(a){fb(a),a.line.wrapClass?eb(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");var b=a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass;a.text.className=b||""}function jb(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);var e=b.line.gutterMarkers;if(a.options.lineNumbers||e){var f=eb(b),g=b.gutter=f.insertBefore(dh("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px"),b.text);if(b.line.gutterClass&&(g.className+=" "+b.line.gutterClass),!a.options.lineNumbers||e&&e["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(dh("div",T(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),e)for(var h=0;h<a.options.gutters.length;++h){var i=a.options.gutters[h],j=e.hasOwnProperty(i)&&e[i];j&&g.appendChild(dh("div",[j],"CodeMirror-gutter-elt","left: "+d.gutterLeft[i]+"px; width: "+d.gutterWidth[i]+"px"))}}}function kb(a,b){a.alignable&&(a.alignable=null);for(var d,c=a.node.firstChild;c;c=d){var d=c.nextSibling;"CodeMirror-linewidget"==c.className&&a.node.removeChild(c)}mb(a,b)}function lb(a,b,c,d){var e=gb(a,b);return b.text=b.node=e.pre,e.bgClass&&(b.bgClass=e.bgClass),e.textClass&&(b.textClass=e.textClass),ib(b),jb(a,b,c,d),mb(b,d),b.node}function mb(a,b){if(nb(a.line,a,b,!0),a.rest)for(var c=0;c<a.rest.length;c++)nb(a.rest[c],a,b,!1)}function nb(a,b,c,d){if(a.widgets)for(var e=eb(b),f=0,g=a.widgets;f<g.length;++f){var h=g[f],i=dh("div",[h.node],"CodeMirror-linewidget");h.handleMouseEvents||i.setAttribute("cm-ignore-events","true"),ob(h,i,b,c),d&&h.above?e.insertBefore(i,b.gutter||b.text):e.appendChild(i),Cg(h,"redraw")}}function ob(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).push(b);var e=d.wrapperWidth;b.style.left=d.fixedPos+"px",a.coverGutter||(e-=d.gutterTotalWidth,b.style.paddingLeft=d.gutterTotalWidth+"px"),b.style.width=e+"px"}a.coverGutter&&(b.style.zIndex=5,b.style.position="relative",a.noHScroll||(b.style.marginLeft=-d.gutterTotalWidth+"px"))}function rb(a){return pb(a.line,a.ch)}function sb(a,b){return qb(a,b)<0?b:a}function tb(a,b){return qb(a,b)<0?a:b}function ub(a,b){this.ranges=a,this.primIndex=b}function vb(a,b){this.anchor=a,this.head=b}function wb(a,b){var c=a[b];a.sort(function(a,b){return qb(a.from(),b.from())}),b=Ug(a,c);for(var d=1;d<a.length;d++){var e=a[d],f=a[d-1];if(qb(f.to(),e.from())>=0){var g=tb(f.from(),e.from()),h=sb(f.to(),e.to()),i=f.empty()?e.from()==e.head:f.from()==f.head;b>=d&&--b,a.splice(--d,2,new vb(i?h:g,i?g:h))}}return new ub(a,b)}function xb(a,b){return new ub([new vb(a,b||a)],0)}function yb(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function zb(a,b){if(b.line<a.first)return pb(a.first,0);var c=a.first+a.size-1;return b.line>c?pb(c,Xf(a,c).text.length):Ab(b,Xf(a,b.line).text.length)}function Ab(a,b){var c=a.ch;return null==c||c>b?pb(a.line,b):0>c?pb(a.line,0):a}function Bb(a,b){return b>=a.first&&b<a.first+a.size}function Cb(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=zb(a,b[d]);return c}function Db(a,b,c,d){if(a.cm&&a.cm.display.shift||a.extend){var e=b.anchor;if(d){var f=qb(c,e)<0;f!=qb(d,e)<0?(e=c,c=d):f!=qb(c,d)<0&&(c=d)}return new vb(e,c)}return new vb(d||c,c)}function Eb(a,b,c,d){Kb(a,new ub([Db(a,a.sel.primary(),b,c)],0),d)}function Fb(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=Db(a,a.sel.ranges[e],b[e],null);var f=wb(d,a.sel.primIndex);Kb(a,f,c)}function Gb(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,Kb(a,wb(e,a.sel.primIndex),d)}function Hb(a,b,c,d){Kb(a,xb(b,c),d)}function Ib(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new vb(zb(a,b[c].anchor),zb(a,b[c].head))}};return Ag(a,"beforeSelectionChange",a,c),a.cm&&Ag(a.cm,"beforeSelectionChange",a.cm,c),c.ranges!=b.ranges?wb(c.ranges,c.ranges.length-1):b}function Jb(a,b,c){var d=a.history.done,e=Sg(d);e&&e.ranges?(d[d.length-1]=b,Lb(a,b,c)):Kb(a,b,c)}function Kb(a,b,c){Lb(a,b,c),jg(a,a.sel,a.cm?a.cm.curOp.id:0/0,c)}function Lb(a,b,c){(Gg(a,"beforeSelectionChange")||a.cm&&Gg(a.cm,"beforeSelectionChange"))&&(b=Ib(a,b));var d=c&&c.bias||(qb(b.primary().head,a.sel.primary().head)<0?-1:1);Mb(a,Ob(a,b,d,!0)),c&&c.scroll===!1||!a.cm||ie(a.cm)}function Mb(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,Fg(a.cm)),Cg(a,"cursorActivity",a))}function Nb(a){Mb(a,Ob(a,a.sel,null,!1),Kg)}function Ob(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=Pb(a,g.anchor,c,d),i=Pb(a,g.head,c,d);(e||h!=g.anchor||i!=g.head)&&(e||(e=b.ranges.slice(0,f)),e[f]=new vb(h,i))}return e?wb(e,b.primIndex):b}function Pb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=Xf(a,f.line);if(h.markedSpans)for(var i=0;i<h.markedSpans.length;++i){var j=h.markedSpans[i],k=j.marker;if((null==j.from||(k.inclusiveLeft?j.from<=f.ch:j.from<f.ch))&&(null==j.to||(k.inclusiveRight?j.to>=f.ch:j.to>f.ch))){if(d&&(Ag(k,"beforeCursorEnter"),k.explicitlyCleared)){if(h.markedSpans){--i;continue}break}if(!k.atomic)continue;var l=k.find(0>g?-1:1);if(0==qb(l,f)&&(l.ch+=g,l.ch<0?l=l.line>a.first?zb(a,pb(l.line-1)):null:l.ch>h.text.length&&(l=l.line<a.first+a.size-1?pb(l.line+1,0):null),!l)){if(e)return d?(a.cantEdit=!0,pb(a.first,0)):Pb(a,b,c,!0);e=!0,l=b,g=-g}f=l;continue a}}return f}}function Qb(a){for(var b=a.display,c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++){var h=c.sel.ranges[g],i=h.empty();(i||a.options.showCursorWhenSelecting)&&Tb(a,h,e),i||Ub(a,h,f)}if(a.options.moveInputWithCursor){var j=wc(a,c.sel.primary().head,"div"),k=b.wrapper.getBoundingClientRect(),l=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,j.top+l.top-k.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,j.left+l.left-k.left))}return d}function Rb(a,b){gh(a.display.cursorDiv,b.cursors),gh(a.display.selectionDiv,b.selection),null!=b.teTop&&(a.display.inputDiv.style.top=b.teTop+"px",a.display.inputDiv.style.left=b.teLeft+"px")}function Sb(a){Rb(a,Qb(a))}function Tb(a,b,c){var d=wc(a,b.head,"div",null,null,!a.options.singleCursorHeightPerLine),e=c.appendChild(dh("div","\xa0","CodeMirror-cursor"));if(e.style.left=d.left+"px",e.style.top=d.top+"px",e.style.height=Math.max(0,d.bottom-d.top)*a.options.cursorHeight+"px",d.other){var f=c.appendChild(dh("div","\xa0","CodeMirror-cursor CodeMirror-secondarycursor"));f.style.display="",f.style.left=d.other.left+"px",f.style.top=d.other.top+"px",f.style.height=.85*(d.other.bottom-d.other.top)+"px"}}function Ub(a,b,c){function j(a,b,c,d){0>b&&(b=0),b=Math.round(b),d=Math.round(d),f.appendChild(dh("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?i-a:c)+"px; height: "+(d-b)+"px"))}function k(b,c,d){function m(c,d){return vc(a,pb(b,c),"div",f,d)}var k,l,f=Xf(e,b),g=f.text.length;return Ch(cg(f),c||0,null==d?g:d,function(a,b,e){var n,o,p,f=m(a,"left");if(a==b)n=f,o=p=f.left;else{if(n=m(b-1,"right"),"rtl"==e){var q=f;f=n,n=q}o=f.left,p=n.right}null==c&&0==a&&(o=h),n.top-f.top>3&&(j(o,f.top,null,f.bottom),o=h,f.bottom<n.top&&j(o,f.bottom,null,n.top)),null==d&&b==g&&(p=i),(!k||f.top<k.top||f.top==k.top&&f.left<k.left)&&(k=f),(!l||n.bottom>l.bottom||n.bottom==l.bottom&&n.right>l.right)&&(l=n),h+1>o&&(o=h),j(o,n.top,p-o,n.bottom)}),{start:k,end:l}}var d=a.display,e=a.doc,f=document.createDocumentFragment(),g=ac(a.display),h=g.left,i=Math.max(d.sizerWidth,cc(a)-d.sizer.offsetLeft)-g.right,l=b.from(),m=b.to();if(l.line==m.line)k(l.line,l.ch,m.ch);else{var n=Xf(e,l.line),o=Xf(e,m.line),p=hf(n)==hf(o),q=k(l.line,l.ch,p?n.text.length+1:null).end,r=k(m.line,p?0:null,m.ch).start;p&&(q.top<r.top-2?(j(q.right,q.top,null,q.bottom),j(h,r.top,r.left,r.bottom)):j(q.right,q.top,r.left-q.right,q.bottom)),q.bottom<r.top&&j(h,q.bottom,null,r.top)}c.appendChild(f)}function Vb(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility="",a.options.cursorBlinkRate>0?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function Wb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,Yg(Xb,a))}function Xb(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=ye(b.mode,Zb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=Af(a,f,d,!0);f.styles=h.styles;var i=f.styleClasses,j=h.classes;j?f.styleClasses=j:i&&(f.styleClasses=null);for(var k=!g||g.length!=f.styles.length||i!=j&&(!i||!j||i.bgClass!=j.bgClass||i.textClass!=j.textClass),l=0;!k&&l<g.length;++l)k=g[l]!=f.styles[l];k&&e.push(b.frontier),f.stateAfter=ye(b.mode,d)}else Cf(a,f.text,d),f.stateAfter=0==b.frontier%5?ye(b.mode,d):null;return++b.frontier,+new Date>c?(Wb(a,a.options.workDelay),!0):void 0}),e.length&&Pc(a,function(){for(var b=0;b<e.length;b++)Wc(a,e[b],"text")})}}function Yb(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e3:100),h=b;h>g;--h){if(h<=f.first)return f.first;var i=Xf(f,h-1);if(i.stateAfter&&(!c||h<=f.frontier))return h;var j=Og(i.text,null,a.options.tabSize);(null==e||d>j)&&(e=h-1,d=j)}return e}function Zb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=Yb(a,b,c),g=f>d.first&&Xf(d,f-1).stateAfter;return g=g?ye(d.mode,g):ze(d.mode),d.iter(f,b,function(c){Cf(a,c.text,g);var h=f==b-1||0==f%5||f>=e.viewFrom&&f<e.viewTo;c.stateAfter=h?ye(d.mode,g):null,++f}),c&&(d.frontier=f),g}function $b(a){return a.lineSpace.offsetTop}function _b(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function ac(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=gh(a.measure,dh("pre","x")),c=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,d={left:parseInt(c.paddingLeft),right:parseInt(c.paddingRight)};return isNaN(d.left)||isNaN(d.right)||(a.cachedPaddingH=d),d}function bc(a){return Ig-a.display.nativeBarWidth}function cc(a){return a.display.scroller.clientWidth-bc(a)-a.display.barWidth}function dc(a){return a.display.scroller.clientHeight-bc(a)-a.display.barHeight}function ec(a,b,c){var d=a.options.lineWrapping,e=d&&cc(a);if(!b.measure.heights||d&&b.measure.width!=e){var f=b.measure.heights=[];if(d){b.measure.width=e;for(var g=b.text.firstChild.getClientRects(),h=0;h<g.length-1;h++){var i=g[h],j=g[h+1];Math.abs(i.bottom-j.bottom)>2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function fc(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(var d=0;d<a.rest.length;d++)if(_f(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function gc(a,b){b=hf(b);var c=_f(b),d=a.display.externalMeasured=new Tc(a.doc,b,c);d.lineN=c;var e=d.built=Gf(a,d);return d.text=e.pre,gh(a.display.lineMeasure,e.pre),d}function hc(a,b,c,d){return kc(a,jc(a,b),c,d)}function ic(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[Yc(a,b)];var c=a.display.externalMeasured;return c&&b>=c.lineN&&b<c.lineN+c.size?c:void 0}function jc(a,b){var c=_f(b),d=ic(a,c);d&&!d.text?d=null:d&&d.changes&&db(a,d,c,bb(a)),d||(d=gc(a,b));var e=fc(d,b,c);return{line:b,view:d,rect:null,map:e.map,cache:e.cache,before:e.before,hasHeights:!1}}function kc(a,b,c,d,e){b.before&&(c=-1);var g,f=c+(d||"");return b.cache.hasOwnProperty(f)?g=b.cache[f]:(b.rect||(b.rect=b.view.text.getBoundingClientRect()),b.hasHeights||(ec(a,b.view,b.rect),b.hasHeights=!0),g=mc(a,b,c,d),g.bogus||(b.cache[f]=g)),{left:g.left,right:g.right,top:e?g.rtop:g.top,bottom:e?g.rbottom:g.bottom}}function mc(a,b,c,f){for(var h,i,j,k,g=b.map,l=0;l<g.length;l+=3){var m=g[l],n=g[l+1];if(m>c?(i=0,j=1,k="left"):n>c?(i=c-m,j=i+1):(l==g.length-3||c==n&&g[l+3]>c)&&(j=n-m,i=j-1,c>=n&&(k="right")),null!=i){if(h=g[l+2],m==n&&f==(h.insertLeft?"left":"right")&&(k=f),"left"==f&&0==i)for(;l&&g[l-2]==g[l-3]&&g[l-1].insertLeft;)h=g[(l-=3)+2],k="left";if("right"==f&&i==n-m)for(;l<g.length-3&&g[l+3]==g[l+4]&&!g[l+5].insertLeft;)h=g[(l+=3)+2],k="right";break}}var o;if(3==h.nodeType){for(var l=0;4>l;l++){for(;i&&ch(b.line.text.charAt(m+i));)--i;for(;n>m+j&&ch(b.line.text.charAt(m+j));)++j;if(d&&9>e&&0==i&&j==n-m)o=h.parentNode.getBoundingClientRect();else if(d&&a.options.lineWrapping){var p=eh(h,i,j).getClientRects();o=p.length?p["right"==f?p.length-1:0]:lc}else o=eh(h,i,j).getBoundingClientRect()||lc;if(o.left||o.right||0==i)break;j=i,i-=1,k="right"}d&&11>e&&(o=nc(a.display.measure,o))}else{i>0&&(k=f="right");var p;o=a.options.lineWrapping&&(p=h.getClientRects()).length>1?p["right"==f?p.length-1:0]:h.getBoundingClientRect()}if(d&&9>e&&!i&&(!o||!o.left&&!o.right)){var q=h.parentNode.getClientRects()[0];o=q?{left:q.left,right:q.left+Dc(a.display),top:q.top,bottom:q.bottom}:lc}for(var r=o.top-b.rect.top,s=o.bottom-b.rect.top,t=(r+s)/2,u=b.view.measure.heights,l=0;l<u.length-1&&!(t<u[l]);l++);var v=l?u[l-1]:0,w=u[l],x={left:("right"==k?o.right:o.left)-b.rect.left,right:("left"==k?o.left:o.right)-b.rect.left,top:v,bottom:w};return o.left||o.right||(x.bogus=!0),a.options.singleCursorHeightPerLine||(x.rtop=r,x.rbottom=s),x}function nc(a,b){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!Ah(a))return b;var c=screen.logicalXDPI/screen.deviceXDPI,d=screen.logicalYDPI/screen.deviceYDPI;return{left:b.left*c,right:b.right*c,top:b.top*d,bottom:b.bottom*d}}function oc(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function pc(a){a.display.externalMeasure=null,fh(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)oc(a.display.view[b])}function qc(a){pc(a),a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null,a.options.lineWrapping||(a.display.maxLineChanged=!0),a.display.lineNumChars=null}function rc(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function sc(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function tc(a,b,c,d){if(b.widgets)for(var e=0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=qf(b.widgets[e]);c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=bg(b);if("local"==d?g+=$b(a.display):g-=a.display.viewOffset,"page"==d||"window"==d){var h=a.display.lineSpace.getBoundingClientRect();g+=h.top+("window"==d?0:sc());var i=h.left+("window"==d?0:rc());c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function uc(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==c)d-=rc(),e-=sc();else if("local"==c||!c){var f=a.display.sizer.getBoundingClientRect();d+=f.left,e+=f.top}var g=a.display.lineSpace.getBoundingClientRect();return{left:d-g.left,top:e-g.top}}function vc(a,b,c,d,e){return d||(d=Xf(a.doc,b.line)),tc(a,d,hc(a,d,b.ch,e),c)}function wc(a,b,c,d,e,f){function g(b,g){var h=kc(a,e,b,g?"right":"left",f);return g?h.left=h.right:h.right=h.left,tc(a,d,h,c)}function h(a,b){var c=i[b],d=c.level%2;return a==Dh(c)&&b&&c.level<i[b-1].level?(c=i[--b],a=Eh(c)-(c.level%2?0:1),d=!0):a==Eh(c)&&b<i.length-1&&c.level<i[b+1].level&&(c=i[++b],a=Dh(c)-c.level%2,d=!1),d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||Xf(a.doc,b.line),e||(e=jc(a,d));var i=cg(d),j=b.ch;if(!i)return g(j);var k=Mh(i,j),l=h(j,k);return null!=Lh&&(l.other=h(j,Lh)),l}function xc(a,b){var c=0,b=zb(a.doc,b);a.options.lineWrapping||(c=Dc(a.display)*b.ch);var d=Xf(a.doc,b.line),e=bg(d)+$b(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function yc(a,b,c,d){var e=pb(a,b);return e.xRel=d,c&&(e.outside=!0),e}function zc(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return yc(d.first,0,!0,-1);var e=ag(d,c),f=d.first+d.size-1;if(e>f)return yc(d.first+d.size-1,Xf(d,f).text.length,!0,1);0>b&&(b=0);for(var g=Xf(d,e);;){var h=Ac(a,g,e,b,c),i=ff(g),j=i&&i.find(0,!0);if(!i||!(h.ch>j.from.ch||h.ch==j.from.ch&&h.xRel>0))return h;e=_f(g=j.to.line)}}function Ac(a,b,c,d,e){function j(d){var e=wc(a,pb(c,d),"line",b,i);return g=!0,f>e.bottom?e.left-h:f<e.top?e.left+h:(g=!1,e.left)}var f=e-bg(b),g=!1,h=2*a.display.wrapper.clientWidth,i=jc(a,b),k=cg(b),l=b.text.length,m=Fh(b),n=Gh(b),o=j(m),p=g,q=j(n),r=g;if(d>q)return yc(c,n,r,1);for(;;){if(k?n==m||n==Oh(b,m,1):1>=n-m){for(var s=o>d||q-d>=d-o?m:n,t=d-(s==m?o:q);ch(b.text.charAt(s));)++s;var u=yc(c,s,s==m?p:r,-1>t?-1:t>1?1:0);return u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=Oh(b,w,1)}var y=j(w);y>d?(n=w,q=y,(r=g)&&(q+=1e3),l=v):(m=w,o=y,p=g,l-=v)}}function Cc(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Bc){Bc=dh("pre");for(var b=0;49>b;++b)Bc.appendChild(document.createTextNode("x")),Bc.appendChild(dh("br"));Bc.appendChild(document.createTextNode("x"))}gh(a.measure,Bc);var c=Bc.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),fh(a.measure),c||1}function Dc(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=dh("span","xxxxxxxxxx"),c=dh("pre",[b]);gh(a.measure,c);var d=b.getBoundingClientRect(),e=(d.right-d.left)/10;return e>2&&(a.cachedCharWidth=e),e||10}function Gc(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,id:++Fc},Ec?Ec.ops.push(a.curOp):a.curOp.ownsGroup=Ec={ops:[a.curOp],delayedCallbacks:[]}
}function Hc(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c]();for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)}}while(c<b.length)}function Ic(a){var b=a.curOp,c=b.ownsGroup;if(c)try{Hc(c)}finally{Ec=null;for(var d=0;d<c.ops.length;d++)c.ops[d].cm.curOp=null;Jc(c)}}function Jc(a){for(var b=a.ops,c=0;c<b.length;c++)Kc(b[c]);for(var c=0;c<b.length;c++)Lc(b[c]);for(var c=0;c<b.length;c++)Mc(b[c]);for(var c=0;c<b.length;c++)Nc(b[c]);for(var c=0;c<b.length;c++)Oc(b[c])}function Kc(a){var b=a.cm,c=b.display;W(b),a.updateMaxLine&&I(b),a.mustUpdate=a.viewChanged||a.forceUpdate||null!=a.scrollTop||a.scrollToPos&&(a.scrollToPos.from.line<c.viewFrom||a.scrollToPos.to.line>=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new V(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function Lc(a){a.updatedDisplay=a.mustUpdate&&X(a.cm,a.update)}function Mc(a){var b=a.cm,c=b.display;a.updatedDisplay&&_(b),a.barMeasure=K(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=hc(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+bc(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-cc(b))),(a.updatedDisplay||a.selectionChanged)&&(a.newSelectionNodes=Qb(b))}function Nc(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeft<b.doc.scrollLeft&&yd(b,Math.min(b.display.scroller.scrollLeft,a.maxScrollLeft),!0),b.display.maxLineChanged=!1),a.newSelectionNodes&&Rb(b,a.newSelectionNodes),a.updatedDisplay&&$(b,a.barMeasure),(a.updatedDisplay||a.startHeight!=b.doc.height)&&O(b,a.barMeasure),a.selectionChanged&&Vb(b),b.state.focused&&a.updateInput&&ed(b,a.typing)}function Oc(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&Y(b,a.update),null==c.wheelStartX||null==a.scrollTop&&null==a.scrollLeft&&!a.scrollToPos||(c.wheelStartX=c.wheelStartY=null),null==a.scrollTop||c.scroller.scrollTop==a.scrollTop&&!a.forceScroll||(d.scrollTop=Math.max(0,Math.min(c.scroller.scrollHeight-c.scroller.clientHeight,a.scrollTop)),c.scrollbars.setScrollTop(d.scrollTop),c.scroller.scrollTop=d.scrollTop),null==a.scrollLeft||c.scroller.scrollLeft==a.scrollLeft&&!a.forceScroll||(d.scrollLeft=Math.max(0,Math.min(c.scroller.scrollWidth-cc(b),a.scrollLeft)),c.scrollbars.setScrollLeft(d.scrollLeft),c.scroller.scrollLeft=d.scrollLeft,R(b)),a.scrollToPos){var e=ee(b,zb(d,a.scrollToPos.from),zb(d,a.scrollToPos.to),a.scrollToPos.margin);a.scrollToPos.isCursor&&b.state.focused&&de(b,e)}var f=a.maybeHiddenMarkers,g=a.maybeUnhiddenMarkers;if(f)for(var h=0;h<f.length;++h)f[h].lines.length||Ag(f[h],"hide");if(g)for(var h=0;h<g.length;++h)g[h].lines.length&&Ag(g[h],"unhide");c.wrapper.offsetHeight&&(d.scrollTop=b.display.scroller.scrollTop),a.changeObjs&&Ag(b,"changes",b,a.changeObjs)}function Pc(a,b){if(a.curOp)return b();Gc(a);try{return b()}finally{Ic(a)}}function Qc(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Gc(a);try{return b.apply(a,arguments)}finally{Ic(a)}}}function Rc(a){return function(){if(this.curOp)return a.apply(this,arguments);Gc(this);try{return a.apply(this,arguments)}finally{Ic(this)}}}function Sc(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,arguments);Gc(b);try{return a.apply(this,arguments)}finally{Ic(b)}}}function Tc(a,b,c){this.line=b,this.rest=jf(b),this.size=this.rest?_f(Sg(this.rest))-c+1:1,this.node=this.text=null,this.hidden=mf(a,b)}function Uc(a,b,c){for(var e,d=[],f=b;c>f;f=e){var g=new Tc(a.doc,Xf(a.doc,f),f);e=f+g.size,d.push(g)}return d}function Vc(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&c<e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)v&&kf(a.doc,b)<e.viewTo&&Xc(a);else if(c<=e.viewFrom)v&&lf(a.doc,c+d)>e.viewFrom?Xc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)Xc(a);else if(b<=e.viewFrom){var f=Zc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):Xc(a)}else if(c>=e.viewTo){var f=Zc(a,b,b,-1);f?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):Xc(a)}else{var g=Zc(a,b,b,-1),h=Zc(a,c,c+d,1);g&&h?(e.view=e.view.slice(0,g.index).concat(Uc(a,g.lineN,h.lineN)).concat(e.view.slice(h.index)),e.viewTo+=d):Xc(a)}var i=e.externalMeasured;i&&(c<i.lineN?i.lineN+=d:b<i.lineN+i.size&&(e.externalMeasured=null))}function Wc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;if(e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null),!(b<d.viewFrom||b>=d.viewTo)){var f=d.view[Yc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==Ug(g,c)&&g.push(c)}}}function Xc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function Yc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.viewFrom,0>b)return null;for(var c=a.display.view,d=0;d<c.length;d++)if(b-=c[d].size,0>b)return d}function Zc(a,b,c,d){var f,e=Yc(a,b),g=a.display.view;if(!v||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var h=0,i=a.display.viewFrom;e>h;h++)i+=g[h].size;if(i!=b){if(d>0){if(e==g.length-1)return null;f=i+g[e].size-b,e++}else f=i-b;b+=f,c+=f}for(;kf(a.doc,c)!=c;){if(e==(0>d?0:g.length-1))return null;c+=d*g[e-(0>d?1:0)].size,e+=d}return{index:e,lineN:c}}function $c(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<=d.viewFrom?(d.view=Uc(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=Uc(a,b,d.viewFrom).concat(d.view):d.viewFrom<b&&(d.view=d.view.slice(Yc(a,b))),d.viewFrom=b,d.viewTo<c?d.view=d.view.concat(Uc(a,d.viewTo,c)):d.viewTo>c&&(d.view=d.view.slice(0,Yc(a,c)))),d.viewTo=c}function _c(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[d];e.hidden||e.node&&!e.changes||++c}return c}function ad(a){a.display.pollingFast||a.display.poll.set(a.options.pollInterval,function(){dd(a),a.state.focused&&ad(a)})}function bd(a){function c(){var d=dd(a);d||b?(a.display.pollingFast=!1,ad(a)):(b=!0,a.display.poll.set(60,c))}var b=!1;a.display.pollingFast=!0,a.display.poll.set(20,c)}function dd(a){var b=a.display.input,c=a.display.prevInput,f=a.doc;if(!a.state.focused||xh(b)&&!c||hd(a)||a.options.disableInput||a.state.keySeq)return!1;a.state.pasteIncoming&&a.state.fakedLastChar&&(b.value=b.value.substring(0,b.value.length-1),a.state.fakedLastChar=!1);var g=b.value;if(g==c&&!a.somethingSelected())return!1;if(d&&e>=9&&a.display.inputHasSelection===g||p&&/[\uf700-\uf7ff]/.test(g))return ed(a),!1;var h=!a.curOp;h&&Gc(a),a.display.shift=!1,8203!=g.charCodeAt(0)||f.sel!=a.display.selForContextMenu||c||(c="\u200b");for(var i=0,j=Math.min(c.length,g.length);j>i&&c.charCodeAt(i)==g.charCodeAt(i);)++i;var k=g.slice(i),l=wh(k),m=null;a.state.pasteIncoming&&f.sel.ranges.length>1&&(cd&&cd.join("\n")==k?m=0==f.sel.ranges.length%cd.length&&Vg(cd,wh):l.length==f.sel.ranges.length&&(m=Vg(l,function(a){return[a]})));for(var n=f.sel.ranges.length-1;n>=0;n--){var o=f.sel.ranges[n],q=o.from(),r=o.to();i<c.length?q=pb(q.line,q.ch-(c.length-i)):a.state.overwrite&&o.empty()&&!a.state.pasteIncoming&&(r=pb(r.line,Math.min(Xf(f,r.line).text.length,r.ch+Sg(l).length)));var s=a.curOp.updateInput,t={from:q,to:r,text:m?m[n%m.length]:l,origin:a.state.pasteIncoming?"paste":a.state.cutIncoming?"cut":"+input"};if(Yd(a.doc,t),Cg(a,"inputRead",a,t),k&&!a.state.pasteIncoming&&a.options.electricChars&&a.options.smartIndent&&o.head.ch<100&&(!n||f.sel.ranges[n-1].head.line!=o.head.line)){var u=a.getModeAt(o.head),v=Sd(t);if(u.electricChars){for(var w=0;w<u.electricChars.length;w++)if(k.indexOf(u.electricChars.charAt(w))>-1){ke(a,v.line,"smart");break}}else u.electricInput&&u.electricInput.test(Xf(f,v.line).text.slice(0,v.ch))&&ke(a,v.line,"smart")}}return ie(a),a.curOp.updateInput=s,a.curOp.typing=!0,g.length>1e3||g.indexOf("\n")>-1?b.value=a.display.prevInput="":a.display.prevInput=g,h&&Ic(a),a.state.pasteIncoming=a.state.cutIncoming=!1,!0}function ed(a,b){if(!a.display.contextMenuPending){var c,f,g=a.doc;if(a.somethingSelected()){a.display.prevInput="";var h=g.sel.primary();c=yh&&(h.to().line-h.from().line>100||(f=a.getSelection()).length>1e3);var i=c?"-":f||a.getSelection();a.display.input.value=i,a.state.focused&&Tg(a.display.input),d&&e>=9&&(a.display.inputHasSelection=i)}else b||(a.display.prevInput=a.display.input.value="",d&&e>=9&&(a.display.inputHasSelection=null));a.display.inaccurateSelection=c}}function fd(a){"nocursor"==a.options.readOnly||o&&ih()==a.display.input||a.display.input.focus()}function gd(a){a.state.focused||(fd(a),Od(a))}function hd(a){return a.options.readOnly||a.doc.cantEdit}function id(a){function c(b){Eg(a,b)||vg(b)}function g(c){if(a.somethingSelected())cd=a.getSelections(),b.inaccurateSelection&&(b.prevInput="",b.inaccurateSelection=!1,b.input.value=cd.join("\n"),Tg(b.input));else{for(var d=[],e=[],f=0;f<a.doc.sel.ranges.length;f++){var g=a.doc.sel.ranges[f].head.line,h={anchor:pb(g,0),head:pb(g+1,0)};e.push(h),d.push(a.getRange(h.anchor,h.head))}"cut"==c.type?a.setSelections(e,null,Kg):(b.prevInput="",b.input.value=d.join("\n"),Tg(b.input)),cd=d}"cut"==c.type&&(a.state.cutIncoming=!0)}var b=a.display;yg(b.scroller,"mousedown",Qc(a,md)),d&&11>e?yg(b.scroller,"dblclick",Qc(a,function(b){if(!Eg(a,b)){var c=ld(a,b);if(c&&!td(a,b)&&!kd(a.display,b)){sg(b);var d=a.findWordAt(c);Eb(a.doc,d.anchor,d.head)}}})):yg(b.scroller,"dblclick",function(b){Eg(a,b)||sg(b)}),yg(b.lineSpace,"selectstart",function(a){kd(b,a)||sg(a)}),t||yg(b.scroller,"contextmenu",function(b){Qd(a,b)}),yg(b.scroller,"scroll",function(){b.scroller.clientHeight&&(xd(a,b.scroller.scrollTop),yd(a,b.scroller.scrollLeft,!0),Ag(a,"scroll",a))}),yg(b.scroller,"mousewheel",function(b){Cd(a,b)}),yg(b.scroller,"DOMMouseScroll",function(b){Cd(a,b)}),yg(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),yg(b.input,"keyup",function(b){Md.call(a,b)}),yg(b.input,"input",function(){d&&e>=9&&a.display.inputHasSelection&&(a.display.inputHasSelection=null),dd(a)}),yg(b.input,"keydown",Qc(a,Kd)),yg(b.input,"keypress",Qc(a,Nd)),yg(b.input,"focus",Yg(Od,a)),yg(b.input,"blur",Yg(Pd,a)),a.options.dragDrop&&(yg(b.scroller,"dragstart",function(b){wd(a,b)}),yg(b.scroller,"dragenter",c),yg(b.scroller,"dragover",c),yg(b.scroller,"drop",Qc(a,vd))),yg(b.scroller,"paste",function(c){kd(b,c)||(a.state.pasteIncoming=!0,fd(a),bd(a))}),yg(b.input,"paste",function(){if(f&&!a.state.fakedLastChar&&!(new Date-a.state.lastMiddleDown<200)){var c=b.input.selectionStart,d=b.input.selectionEnd;b.input.value+="$",b.input.selectionEnd=d,b.input.selectionStart=c,a.state.fakedLastChar=!0}a.state.pasteIncoming=!0,bd(a)}),yg(b.input,"cut",g),yg(b.input,"copy",g),k&&yg(b.sizer,"mouseup",function(){ih()==b.input&&b.input.blur(),fd(a)})}function jd(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)&&(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function kd(a,b){for(var c=wg(b);c!=a.wrapper;c=c.parentNode)if(!c||"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function ld(a,b,c,d){var e=a.display;if(!c&&"true"==wg(b).getAttribute("not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(b){return null}var j,i=zc(a,f,g);if(d&&1==i.xRel&&(j=Xf(a.doc,i.line).text).length==i.ch){var k=Og(j,j.length,a.options.tabSize)-j.length;i=pb(i.line,Math.max(0,Math.round((f-ac(a.display).left)/Dc(a.display))-k))}return i}function md(a){if(!Eg(this,a)){var b=this,c=b.display;if(c.shift=a.shiftKey,kd(c,a))return f||(c.scroller.draggable=!1,setTimeout(function(){c.scroller.draggable=!0},100)),void 0;if(!td(b,a)){var d=ld(b,a);switch(window.focus(),xg(a)){case 1:d?pd(b,a,d):wg(a)==c.scroller&&sg(a);break;case 2:f&&(b.state.lastMiddleDown=+new Date),d&&Eb(b.doc,d),setTimeout(Yg(fd,b),20),sg(a);break;case 3:t&&Qd(b,a)}}}}function pd(a,b,c){setTimeout(Yg(gd,a),0);var e,d=+new Date;od&&od.time>d-400&&0==qb(od.pos,c)?e="triple":nd&&nd.time>d-400&&0==qb(nd.pos,c)?(e="double",od={time:d,pos:c}):(e="single",nd={time:d,pos:c});var h,f=a.doc.sel,g=p?b.metaKey:b.ctrlKey;a.options.dragDrop&&rh&&!hd(a)&&"single"==e&&(h=f.contains(c))>-1&&!f.ranges[h].empty()?qd(a,b,c,g):rd(a,b,c,e,g)}function qd(a,b,c,g){var h=a.display,i=Qc(a,function(j){f&&(h.scroller.draggable=!1),a.state.draggingText=!1,zg(document,"mouseup",i),zg(h.scroller,"drop",i),Math.abs(b.clientX-j.clientX)+Math.abs(b.clientY-j.clientY)<10&&(sg(j),g||Eb(a.doc,c),fd(a),d&&9==e&&setTimeout(function(){document.body.focus(),fd(a)},20))});f&&(h.scroller.draggable=!0),a.state.draggingText=i,h.scroller.dragDrop&&h.scroller.dragDrop(),yg(document,"mouseup",i),yg(h.scroller,"drop",i)}function rd(a,b,c,d,e){function o(b){if(0!=qb(n,b))if(n=b,"rect"==d){for(var e=[],f=a.options.tabSize,k=Og(Xf(g,c.line).text,c.ch,f),l=Og(Xf(g,b.line).text,b.ch,f),m=Math.min(k,l),o=Math.max(k,l),p=Math.min(c.line,b.line),q=Math.min(a.lastLine(),Math.max(c.line,b.line));q>=p;p++){var r=Xf(g,p).text,s=Pg(r,m,f);m==o?e.push(new vb(pb(p,s),pb(p,s))):r.length>s&&e.push(new vb(pb(p,s),pb(p,Pg(r,o,f))))}e.length||e.push(new vb(c,c)),Kb(g,wb(j.ranges.slice(0,i).concat(e),i),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var t=h,u=t.anchor,v=b;if("single"!=d){if("double"==d)var w=a.findWordAt(b);else var w=new vb(pb(b.line,0),zb(g,pb(b.line+1,0)));qb(w.anchor,u)>0?(v=w.head,u=tb(t.from(),w.anchor)):(v=w.anchor,u=sb(t.to(),w.head))}var e=j.ranges.slice(0);e[i]=new vb(zb(g,u),v),Kb(g,wb(e,i),Lg)}}function r(b){var c=++q,e=ld(a,b,!0,"rect"==d);if(e)if(0!=qb(e,n)){gd(a),o(e);var h=Q(f,g);(e.line>=h.to||e.line<h.from)&&setTimeout(Qc(a,function(){q==c&&r(b)}),150)}else{var i=b.clientY<p.top?-20:b.clientY>p.bottom?20:0;i&&setTimeout(Qc(a,function(){q==c&&(f.scroller.scrollTop+=i,r(b))}),50)}}function s(b){q=1/0,sg(b),fd(a),zg(document,"mousemove",t),zg(document,"mouseup",u),g.history.lastSelOrigin=null}var f=a.display,g=a.doc;sg(b);var h,i,j=g.sel,k=j.ranges;if(e&&!b.shiftKey?(i=g.sel.contains(c),h=i>-1?k[i]:new vb(c,c)):h=g.sel.primary(),b.altKey)d="rect",e||(h=new vb(c,c)),c=ld(a,b,!0,!0),i=-1;else if("double"==d){var l=a.findWordAt(c);h=a.display.shift||g.extend?Db(g,h,l.anchor,l.head):l}else if("triple"==d){var m=new vb(pb(c.line,0),zb(g,pb(c.line+1,0)));h=a.display.shift||g.extend?Db(g,h,m.anchor,m.head):m}else h=Db(g,h,c);e?-1==i?(i=k.length,Kb(g,wb(k.concat([h]),i),{scroll:!1,origin:"*mouse"})):k.length>1&&k[i].empty()&&"single"==d?(Kb(g,wb(k.slice(0,i).concat(k.slice(i+1)),0)),j=g.sel):Gb(g,i,h,Lg):(i=0,Kb(g,new ub([h],0),Lg),j=g.sel);var n=c,p=f.wrapper.getBoundingClientRect(),q=0,t=Qc(a,function(a){xg(a)?r(a):s(a)}),u=Qc(a,s);yg(document,"mousemove",t),yg(document,"mouseup",u)}function sd(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&sg(b);var h=a.display,i=h.lineDiv.getBoundingClientRect();if(g>i.bottom||!Gg(a,c))return ug(b);g-=i.top-h.viewOffset;for(var j=0;j<a.options.gutters.length;++j){var k=h.gutters.childNodes[j];if(k&&k.getBoundingClientRect().right>=f){var l=ag(a.doc,g),m=a.options.gutters[j];return e(a,c,a,l,m,b),ug(b)}}}function td(a,b){return sd(a,b,"gutterClick",!0,Cg)}function vd(a){var b=this;if(!Eg(b,a)&&!kd(b.display,a)){sg(a),d&&(ud=+new Date);var c=ld(b,a,!0),e=a.dataTransfer.files;if(c&&!hd(b))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,d){var e=new FileReader;e.onload=Qc(b,function(){if(g[d]=e.result,++h==f){c=zb(b.doc,c);var a={from:c,to:c,text:wh(g.join("\n")),origin:"paste"};Yd(b.doc,a),Jb(b.doc,xb(c,Sd(a)))}}),e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),setTimeout(Yg(fd,b),20),void 0;try{var g=a.dataTransfer.getData("Text");if(g){if(b.state.draggingText&&!(p?a.metaKey:a.ctrlKey))var k=b.listSelections();if(Lb(b.doc,xb(c,c)),k)for(var j=0;j<k.length;++j)ce(b.doc,"",k[j].anchor,k[j].head,"drag");b.replaceSelection(g,"around","paste"),fd(b)}}catch(a){}}}}function wd(a,b){if(d&&(!a.state.draggingText||+new Date-ud<100))return vg(b),void 0;if(!Eg(a,b)&&!kd(a.display,b)&&(b.dataTransfer.setData("Text",a.getSelection()),b.dataTransfer.setDragImage&&!j)){var c=dh("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",i&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop),b.dataTransfer.setDragImage(c,0,0),i&&c.parentNode.removeChild(c)}}function xd(b,c){Math.abs(b.doc.scrollTop-c)<2||(b.doc.scrollTop=c,a||Z(b,{top:c}),b.display.scroller.scrollTop!=c&&(b.display.scroller.scrollTop=c),b.display.scrollbars.setScrollTop(c),a&&Z(b),Wb(b,100))}function yd(a,b,c){(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2)||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,R(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function Cd(b,c){var d=Bd(c),e=d.x,g=d.y,h=b.display,j=h.scroller;if(e&&j.scrollWidth>j.clientWidth||g&&j.scrollHeight>j.clientHeight){if(g&&p&&f)a:for(var k=c.target,l=h.view;k!=j;k=k.parentNode)for(var m=0;m<l.length;m++)if(l[m].node==k){b.display.currentWheelTarget=k;break a}if(e&&!a&&!i&&null!=Ad)return g&&xd(b,Math.max(0,Math.min(j.scrollTop+g*Ad,j.scrollHeight-j.clientHeight))),yd(b,Math.max(0,Math.min(j.scrollLeft+e*Ad,j.scrollWidth-j.clientWidth))),sg(c),h.wheelStartX=null,void 0;if(g&&null!=Ad){var n=g*Ad,o=b.doc.scrollTop,q=o+h.wrapper.clientHeight;0>n?o=Math.max(0,o+n-50):q=Math.min(b.doc.height,q+n+50),Z(b,{top:o,bottom:q})}20>zd&&(null==h.wheelStartX?(h.wheelStartX=j.scrollLeft,h.wheelStartY=j.scrollTop,h.wheelDX=e,h.wheelDY=g,setTimeout(function(){if(null!=h.wheelStartX){var a=j.scrollLeft-h.wheelStartX,b=j.scrollTop-h.wheelStartY,c=b&&h.wheelDY&&b/h.wheelDY||a&&h.wheelDX&&a/h.wheelDX;h.wheelStartX=h.wheelStartY=null,c&&(Ad=(Ad*zd+c)/(zd+1),++zd)}},200)):(h.wheelDX+=e,h.wheelDY+=g))}}function Dd(a,b,c){if("string"==typeof b&&(b=Ae[b],!b))return!1;a.display.pollingFast&&dd(a)&&(a.display.pollingFast=!1);var d=a.display.shift,e=!1;try{hd(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Jg}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Ed(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=De(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&De(b,a.options.extraKeys,c,a)||De(b,a.options.keyMap,c,a)}function Gd(a,b,c,d){var e=a.state.keySeq;if(e){if(Ee(b))return"handled";Fd.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,ed(a))}),b=e+" "+b}var f=Ed(a,b,d);return"multi"==f&&(a.state.keySeq=b),"handled"==f&&Cg(a,"keyHandled",a,b,c),("handled"==f||"multi"==f)&&(sg(c),Vb(a)),e&&!f&&/\'$/.test(b)?(sg(c),!0):!!f}function Hd(a,b){var c=Fe(b,!0);return c?b.shiftKey&&!a.state.keySeq?Gd(a,"Shift-"+c,b,function(b){return Dd(a,b,!0)})||Gd(a,c,b,function(b){return("string"==typeof b?/^go[A-Z]/.test(b):b.motion)?Dd(a,b):void 0}):Gd(a,c,b,function(b){return Dd(a,b)}):!1}function Id(a,b,c){return Gd(a,"'"+c+"'",b,function(b){return Dd(a,b,!0)})}function Kd(a){var b=this;if(gd(b),!Eg(b,a)){d&&11>e&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var f=Hd(b,a);i&&(Jd=f?c:null,!f&&88==c&&!yh&&(p?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Ld(b)}}function Ld(a){function c(a){18!=a.keyCode&&a.altKey||(kh(b,"CodeMirror-crosshair"),zg(document,"keyup",c),zg(document,"mouseover",c))}var b=a.display.lineDiv;lh(b,"CodeMirror-crosshair"),yg(document,"keyup",c),yg(document,"mouseover",c)}function Md(a){16==a.keyCode&&(this.doc.sel.shift=!1),Eg(this,a)}function Nd(a){var b=this;if(!(Eg(b,a)||a.ctrlKey&&!a.altKey||p&&a.metaKey)){var c=a.keyCode,f=a.charCode;if(i&&c==Jd)return Jd=null,sg(a),void 0;if(!(i&&(!a.which||a.which<10)||k)||!Hd(b,a)){var g=String.fromCharCode(null==f?c:f);Id(b,a,g)||(d&&e>=9&&(b.display.inputHasSelection=null),bd(b))}}}function Od(a){"nocursor"!=a.options.readOnly&&(a.state.focused||(Ag(a,"focus",a),a.state.focused=!0,lh(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(ed(a),f&&setTimeout(Yg(ed,a,!0),0))),ad(a),Vb(a))}function Pd(a){a.state.focused&&(Ag(a,"blur",a),a.state.focused=!1,kh(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150)}function Qd(a,b){function m(){if(null!=c.input.selectionStart){var b=a.somethingSelected(),d=c.input.value="\u200b"+(b?c.input.value:"");c.prevInput=b?"":"\u200b",c.input.selectionStart=1,c.input.selectionEnd=d.length,c.selForContextMenu=a.doc.sel}}function n(){if(c.contextMenuPending=!1,c.inputDiv.style.position="relative",c.input.style.cssText=k,d&&9>e&&c.scrollbars.setScrollTop(c.scroller.scrollTop=h),ad(a),null!=c.input.selectionStart){(!d||d&&9>e)&&m();var b=0,f=function(){c.selForContextMenu==a.doc.sel&&0==c.input.selectionStart?Qc(a,Ae.selectAll)(a):b++<10?c.detectingSelectAll=setTimeout(f,500):ed(a)};c.detectingSelectAll=setTimeout(f,200)}}if(!Eg(a,b,"contextmenu")){var c=a.display;if(!kd(c,b)&&!Rd(a,b)){var g=ld(a,b),h=c.scroller.scrollTop;if(g&&!i){var j=a.options.resetSelectionOnContextMenu;j&&-1==a.doc.sel.contains(g)&&Qc(a,Kb)(a.doc,xb(g),Kg);var k=c.input.style.cssText;if(c.inputDiv.style.position="absolute",c.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(b.clientY-5)+"px; left: "+(b.clientX-5)+"px; z-index: 1000; background: "+(d?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f)var l=window.scrollY;if(fd(a),f&&window.scrollTo(null,l),ed(a),a.somethingSelected()||(c.input.value=c.prevInput=" "),c.contextMenuPending=!0,c.selForContextMenu=a.doc.sel,clearTimeout(c.detectingSelectAll),d&&e>=9&&m(),t){vg(b);var o=function(){zg(window,"mouseup",o),setTimeout(n,20)};yg(window,"mouseup",o)}else setTimeout(n,50)}}}}function Rd(a,b){return Gg(a,"gutterContextMenu")?sd(a,b,"gutterContextMenu",!1,Ag):!1}function Td(a,b){if(qb(a,b.from)<0)return a;if(qb(a,b.to)<=0)return Sd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=Sd(b).ch-b.to.ch),pb(c,d)}function Ud(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new vb(Td(e.anchor,b),Td(e.head,b)))}return wb(c,a.sel.primIndex)}function Vd(a,b,c){return a.line==b.line?pb(c.line,a.ch-b.ch+c.ch):pb(c.line+(a.line-b.line),a.ch)}function Wd(a,b,c){for(var d=[],e=pb(a.first,0),f=e,g=0;g<b.length;g++){var h=b[g],i=Vd(h.from,e,f),j=Vd(Sd(h),e,f);if(e=h.to,f=j,"around"==c){var k=a.sel.ranges[g],l=qb(k.head,k.anchor)<0;d[g]=new vb(l?j:i,l?i:j)}else d[g]=new vb(i,i)}return new ub(d,a.sel.primIndex)}function Xd(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};return c&&(d.update=function(b,c,d,e){b&&(this.from=zb(a,b)),c&&(this.to=zb(a,c)),d&&(this.text=d),void 0!==e&&(this.origin=e)}),Ag(a,"beforeChange",a,d),a.cm&&Ag(a.cm,"beforeChange",a.cm,d),d.canceled?null:{from:d.from,to:d.to,text:d.text,origin:d.origin}}function Yd(a,b,c){if(a.cm){if(!a.cm.curOp)return Qc(a.cm,Yd)(a,b,c);if(a.cm.state.suppressEdits)return}if(!(Gg(a,"beforeChange")||a.cm&&Gg(a.cm,"beforeChange"))||(b=Xd(a,b,!0))){var d=u&&!c&&Ze(a,b.from,b.to);if(d)for(var e=d.length-1;e>=0;--e)Zd(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text});else Zd(a,b)}}function Zd(a,b){if(1!=b.text.length||""!=b.text[0]||0!=qb(b.from,b.to)){var c=Ud(a,b);hg(a,b,c,a.cm?a.cm.curOp.id:0/0),ae(a,b,c,We(a,b));var d=[];Vf(a,function(a,c){c||-1!=Ug(d,a.history)||(rg(a.history,b),d.push(a.history)),ae(a,b,null,We(a,b))})}}function $d(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.history,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,i=0;i<g.length&&(e=g[i],c?!e.ranges||e.equals(a.sel):e.ranges);i++);if(i!=g.length){for(d.lastOrigin=d.lastSelOrigin=null;e=g.pop(),e.ranges;){if(kg(e,h),c&&!e.equals(a.sel))return Kb(a,e,{clearRedo:!1}),void 0;f=e}var j=[];kg(f,h),h.push({changes:j,generation:d.generation}),d.generation=e.generation||++d.maxGeneration;for(var k=Gg(a,"beforeChange")||a.cm&&Gg(a.cm,"beforeChange"),i=e.changes.length-1;i>=0;--i){var l=e.changes[i];if(l.origin=b,k&&!Xd(a,l,!1))return g.length=0,void 0;j.push(eg(a,l));var m=i?Ud(a,l):Sg(g);ae(a,l,m,Ye(a,l)),!i&&a.cm&&a.cm.scrollIntoView({from:l.from,to:Sd(l)});var n=[];Vf(a,function(a,b){b||-1!=Ug(n,a.history)||(rg(a.history,l),n.push(a.history)),ae(a,l,null,Ye(a,l))})}}}}function _d(a,b){if(0!=b&&(a.first+=b,a.sel=new ub(Vg(a.sel.ranges,function(a){return new vb(pb(a.anchor.line+b,a.anchor.ch),pb(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){Vc(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)Wc(a.cm,d,"gutter")}}function ae(a,b,c,d){if(a.cm&&!a.cm.curOp)return Qc(a.cm,ae)(a,b,c,d);if(b.to.line<a.first)return _d(a,b.text.length-1-(b.to.line-b.from.line)),void 0;if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);_d(a,e),b={from:pb(a.first,0),to:pb(b.to.line+e,b.to.ch),text:[Sg(b.text)],origin:b.origin}}var f=a.lastLine();b.to.line>f&&(b={from:b.from,to:pb(f,Xf(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=Yf(a,b.from,b.to),c||(c=Ud(a,b)),a.cm?be(a.cm,b,d):Of(a,b,d),Lb(a,c,Kg)}}function be(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=_f(hf(Xf(d,f.line))),d.iter(i,g.line+1,function(a){return a==e.maxLine?(h=!0,!0):void 0})),d.sel.contains(b.from,b.to)>-1&&Fg(a),Of(d,b,c,B(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,function(a){var b=H(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0)),d.frontier=Math.min(d.frontier,f.line),Wb(a,400);var j=b.text.length-(g.line-f.line)-1;f.line!=g.line||1!=b.text.length||Nf(a.doc,b)?Vc(a,f.line,g.line+1,j):Wc(a,f.line,"text");var k=Gg(a,"changes"),l=Gg(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&Cg(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function ce(a,b,c,d,e){if(d||(d=c),qb(d,c)<0){var f=d;d=c,c=f}"string"==typeof b&&(b=wh(b)),Yd(a,{from:c,to:d,text:b,origin:e})}function de(a,b){if(!Eg(a,"scrollCursorIntoView")){var c=a.display,d=c.sizer.getBoundingClientRect(),e=null;if(b.top+d.top<0?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!m){var f=dh("div","\u200b",null,"position: absolute; top: "+(b.top-c.viewOffset-$b(a.display))+"px; height: "+(b.bottom-b.top+bc(a)+c.barHeight)+"px; left: "+b.left+"px; width: 2px;");a.display.lineSpace.appendChild(f),f.scrollIntoView(e),a.display.lineSpace.removeChild(f)}}}function ee(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=wc(a,b),h=c&&c!=b?wc(a,c):g,i=ge(a,Math.min(g.left,h.left),Math.min(g.top,h.top)-d,Math.max(g.left,h.left),Math.max(g.bottom,h.bottom)+d),j=a.doc.scrollTop,k=a.doc.scrollLeft;if(null!=i.scrollTop&&(xd(a,i.scrollTop),Math.abs(a.doc.scrollTop-j)>1&&(f=!0)),null!=i.scrollLeft&&(yd(a,i.scrollLeft),Math.abs(a.doc.scrollLeft-k)>1&&(f=!0)),!f)break}return g}function fe(a,b,c,d,e){var f=ge(a,b,c,d,e);null!=f.scrollTop&&xd(a,f.scrollTop),null!=f.scrollLeft&&yd(a,f.scrollLeft)}function ge(a,b,c,d,e){var f=a.display,g=Cc(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=dc(a),j={};e-c>i&&(e=c+i);var k=a.doc.height+_b(f),l=g>c,m=e>k-g;if(h>c)j.scrollTop=l?0:c;else if(e>h+i){var n=Math.min(c,(m?k:e)-i);n!=h&&(j.scrollTop=n)}var o=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft,p=cc(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0),q=d-b>p;return q&&(d=b+p),10>b?j.scrollLeft=0:o>b?j.scrollLeft=Math.max(0,b-(q?0:10)):d>p+o-3&&(j.scrollLeft=d+(q?0:10)-p),j}function he(a,b,c){(null!=b||null!=c)&&je(a),null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b),null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function ie(a){je(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?pb(b.line,b.ch-1):b,d=pb(b.line,b.ch+1)),a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function je(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=xc(a,b.from),d=xc(a,b.to),e=ge(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(e.scrollLeft,e.scrollTop)}}function ke(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mode.indent?f=Zb(a,b):c="prev");var g=a.options.tabSize,h=Xf(e,b),i=Og(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var k,j=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==Jg||k>150)){if(!d)return;c="prev"}}else k=0,c="not";"prev"==c?k=b>e.first?Og(Xf(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c),k=Math.max(0,k);var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+="	";if(k>m&&(l+=Rg(k-m)),l!=j)ce(e,l,pb(b,0),pb(b,j.length),"+input");else for(var n=0;n<e.sel.ranges.length;n++){var o=e.sel.ranges[n];if(o.head.line==b&&o.head.ch<j.length){var m=pb(b,j.length);Gb(e,n,new vb(m,m));break}}h.stateAfter=null}function le(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=Xf(a,yb(a,b)):e=_f(b),null==e?null:(d(f,e)&&a.cm&&Wc(a.cm,e,c),f)}function me(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&qb(f.from,Sg(d).to)<=0;){var g=d.pop();if(qb(g.from,f.from)<0){f.from=g.from;break}}d.push(f)}Pc(a,function(){for(var b=d.length-1;b>=0;b--)ce(a.doc,"",d[b].from,d[b].to,"+delete");ie(a)})}function ne(a,b,c,d,e){function k(){var b=f+c;return b<a.first||b>=a.first+a.size?j=!1:(f=b,i=Xf(a,b))}function l(a){var b=(e?Oh:Ph)(i,g,c,!0);if(null==b){if(a||!k())return j=!1;g=e?(0>c?Gh:Fh)(i):0>c?i.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=c,i=Xf(a,f),j=!0;if("char"==d)l();else if("column"==d)l(!0);else if("word"==d||"group"==d)for(var m=null,n="group"==d,o=a.cm&&a.cm.getHelper(b,"wordChars"),p=!0;!(0>c)||l(!p);p=!1){var q=i.text.charAt(g)||"\n",r=_g(q,o)?"w":n&&"\n"==q?"n":!n||/\s/.test(q)?null:"p";if(!n||p||r||(r="s"),m&&m!=r){0>c&&(c=1,l());break}if(r&&(m=r),c>0&&!l(!p))break}var s=Pb(a,pb(f,g),h,!0);return j||(s.hitSide=!0),s}function oe(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);g=b.top+c*(h-(0>c?1.5:.5)*Cc(a.display))}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=zc(a,f,g);if(!i.outside)break;if(0>c?0>=g:g>=e.height){i.hitSide=!0;break}g+=5*c}return i}function re(a,b,c,d){w.defaults[a]=b,c&&(qe[a]=d?function(a,b,d){d!=se&&c(a,b,d)}:c)}function Ce(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g<b.length-1;g++){var h=b[g];if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else{if(!/^s(hift)$/i.test(h))throw new Error("Unrecognized modifier name: "+h);e=!0}}return c&&(a="Alt-"+a),d&&(a="Ctrl-"+a),f&&(a="Cmd-"+a),e&&(a="Shift-"+a),a}function Ge(a){return"string"==typeof a?Be[a]:a}function Ke(a,b,c,d,e){if(d&&d.shared)return Me(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return Qc(a.cm,Ke)(a,b,c,d,e);var f=new Ie(a,e),g=qb(b,c);
if(d&&Xg(d,f,!1),g>0||0==g&&f.clearWhenEmpty!==!1)return f;if(f.replacedWith&&(f.collapsed=!0,f.widgetNode=dh("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=!0)),f.collapsed){if(gf(a,b.line,b,c,f)||b.line!=c.line&&gf(a,c.line,b,c,f))throw new Error("Inserting collapsed marker partially overlapping an existing one");v=!0}f.addToHistory&&hg(a,{from:b,to:c,origin:"markText"},a.sel,0/0);var j,h=b.line,i=a.cm;if(a.iter(h,c.line+1,function(a){i&&f.collapsed&&!i.options.lineWrapping&&hf(a)==i.display.maxLine&&(j=!0),f.collapsed&&h!=b.line&&$f(a,0),Te(a,new Qe(f,h==b.line?b.ch:null,h==c.line?c.ch:null)),++h}),f.collapsed&&a.iter(b.line,c.line+1,function(b){mf(a,b)&&$f(b,0)}),f.clearOnEnter&&yg(f,"beforeCursorEnter",function(){f.clear()}),f.readOnly&&(u=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed&&(f.id=++Je,f.atomic=!0),i){if(j&&(i.curOp.updateMaxLine=!0),f.collapsed)Vc(i,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(var k=b.line;k<=c.line;k++)Wc(i,k,"text");f.atomic&&Nb(i.doc),Cg(i,"markerAdded",i,f)}return f}function Me(a,b,c,d,e){d=Xg(d),d.shared=!1;var f=[Ke(a,b,c,d,e)],g=f[0],h=d.widgetNode;return Vf(a,function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Ke(a,zb(a,b),zb(a,c),d,e));for(var i=0;i<a.linked.length;++i)if(a.linked[i].isParent)return;g=Sg(f)}),new Le(f,g)}function Ne(a){return a.findMarks(pb(a.first,0),a.clipPos(pb(a.lastLine())),function(a){return a.parent})}function Oe(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.clipPos(e.from),g=a.clipPos(e.to);if(qb(f,g)){var h=Ke(a,f,g,d.primary,d.primary.type);d.markers.push(h),h.parent=d}}}function Pe(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];Vf(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==Ug(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}}}function Qe(a,b,c){this.marker=a,this.from=b,this.to=c}function Re(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function Se(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function Te(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.attachLine(a)}function Ue(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);if(h||f.from==b&&"bookmark"==g.type&&(!c||!f.marker.insertLeft)){var i=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);(e||(e=[])).push(new Qe(g,f.from,i?null:f.to))}}return e}function Ve(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);(e||(e=[])).push(new Qe(g,i?null:f.from-b,null==f.to?null:f.to-b))}}return e}function We(a,b){var c=Bb(a,b.from.line)&&Xf(a,b.from.line).markedSpans,d=Bb(a,b.to.line)&&Xf(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==qb(b.from,b.to),h=Ue(c,e,g),i=Ve(d,f,g),j=1==b.text.length,k=Sg(b.text).length+(j?e:0);if(h)for(var l=0;l<h.length;++l){var m=h[l];if(null==m.to){var n=Re(i,m.marker);n?j&&(m.to=null==n.to?null:n.to+k):m.to=e}}if(i)for(var l=0;l<i.length;++l){var m=i[l];if(null!=m.to&&(m.to+=k),null==m.from){var n=Re(h,m.marker);n||(m.from=k,j&&(h||(h=[])).push(m))}else m.from+=k,j&&(h||(h=[])).push(m)}h&&(h=Xe(h)),i&&i!=h&&(i=Xe(i));var o=[h];if(!j){var q,p=b.text.length-2;if(p>0&&h)for(var l=0;l<h.length;++l)null==h[l].to&&(q||(q=[])).push(new Qe(h[l].marker,null,null));for(var l=0;p>l;++l)o.push(q);o.push(i)}return o}function Xe(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&c.marker.clearWhenEmpty!==!1&&a.splice(b--,1)}return a.length?a:null}function Ye(a,b){var c=ng(a,b),d=We(a,b);if(!c)return d;if(!d)return c;for(var e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g)a:for(var h=0;h<g.length;++h){for(var i=g[h],j=0;j<f.length;++j)if(f[j].marker==i.marker)continue a;f.push(i)}else g&&(c[e]=g)}return c}function Ze(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=Ug(d,c)||(d||(d=[])).push(c)}}),!d)return null;for(var e=[{from:b,to:c}],f=0;f<d.length;++f)for(var g=d[f],h=g.find(0),i=0;i<e.length;++i){var j=e[i];if(!(qb(j.to,h.from)<0||qb(j.from,h.to)>0)){var k=[i,1],l=qb(j.from,h.from),m=qb(j.to,h.to);(0>l||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(m>0||!g.inclusiveRight&&!m)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function $e(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function _e(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function af(a){return a.inclusiveLeft?-1:0}function bf(a){return a.inclusiveRight?1:0}function cf(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var d=a.find(),e=b.find(),f=qb(d.from,e.from)||af(a)-af(b);if(f)return-f;var g=qb(d.to,e.to)||bf(a)-bf(b);return g?g:b.id-a.id}function df(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;f<c.length;++f)e=c[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!d||cf(d,e.marker)<0)&&(d=e.marker);return d}function ef(a){return df(a,!0)}function ff(a){return df(a,!1)}function gf(a,b,c,d,e){var f=Xf(a,b),g=v&&f.markedSpans;if(g)for(var h=0;h<g.length;++h){var i=g[h];if(i.marker.collapsed){var j=i.marker.find(0),k=qb(j.from,c)||af(i.marker)-af(e),l=qb(j.to,d)||bf(i.marker)-bf(e);if(!(k>=0&&0>=l||0>=k&&l>=0)&&(0>=k&&(qb(j.to,c)>0||i.marker.inclusiveRight&&e.inclusiveLeft)||k>=0&&(qb(j.from,d)<0||i.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function hf(a){for(var b;b=ef(a);)a=b.find(-1,!0).line;return a}function jf(a){for(var b,c;b=ff(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function kf(a,b){var c=Xf(a,b),d=hf(c);return c==d?b:_f(d)}function lf(a,b){if(b>a.lastLine())return b;var d,c=Xf(a,b);if(!mf(a,c))return b;for(;d=ff(c);)c=d.find(1,!0).line;return _f(c)+1}function mf(a,b){var c=v&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed){if(null==d.from)return!0;if(!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&nf(a,b,d))return!0}}function nf(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return nf(a,d.line,Re(d.line.markedSpans,c.marker))}if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var e,f=0;f<b.markedSpans.length;++f)if(e=b.markedSpans[f],e.marker.collapsed&&!e.marker.widgetNode&&e.from==c.to&&(null==e.to||e.to!=c.from)&&(e.marker.inclusiveLeft||c.marker.inclusiveRight)&&nf(a,b,e))return!0}function pf(a,b,c){bg(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&he(a,null,c)}function qf(a){if(null!=a.height)return a.height;if(!hh(document.body,a.node)){var b="position: relative;";a.coverGutter&&(b+="margin-left: -"+a.cm.getGutterElement().offsetWidth+"px;"),gh(a.cm.display.measure,dh("div",[a.node],null,b))}return a.height=a.node.offsetHeight}function rf(a,b,c,d){var e=new of(a,c,d);return e.noHScroll&&(a.display.alignWidgets=!0),le(a.doc,b,"widget",function(b){var c=b.widgets||(b.widgets=[]);if(null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e),e.line=b,!mf(a.doc,b)){var d=bg(b)<a.doc.scrollTop;$f(b,b.height+qf(e)),d&&he(a,null,e.height),a.curOp.forceUpdate=!0}return!0}),e}function tf(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null),null!=a.order&&(a.order=null),$e(a),_e(a,c);var e=d?d(a):1;e!=a.height&&$f(a,e)}function uf(a){a.parent=null,$e(a)}function vf(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?"bgClass":"textClass";null==b[d]?b[d]=c[2]:new RegExp("(?:^|s)"+c[2]+"(?:$|s)").test(b[d])||(b[d]+=" "+c[2])}return a}function wf(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=w.innerMode(a,b);return c.mode.blankLine?c.mode.blankLine(c.state):void 0}}function xf(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=w.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function yf(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?ye(f.mode,j):j}}var h,f=a.doc,g=f.mode;b=zb(f,b);var l,i=Xf(f,b.line),j=Zb(a,b.line,c),k=new He(i.text,a.options.tabSize);for(d&&(l=[]);(d||k.pos<b.ch)&&!k.eol();)k.start=k.pos,h=xf(g,k,j),d&&l.push(e(!0));return d?l:e()}function zf(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var l,i=0,j=null,k=new He(b,a.options.tabSize),m=a.options.addModeClass&&[null];for(""==b&&vf(wf(c,d),f);!k.eol();){if(k.pos>a.options.maxHighlightLength?(h=!1,g&&Cf(a,b,d,k.pos),k.pos=b.length,l=null):l=vf(xf(c,k,d,m),f),m){var n=m[0].name;n&&(l="m-"+(l?n+" "+l:n))}if(!h||j!=l){for(;i<k.start;)i=Math.min(k.start,i+5e4),e(i,j);j=l}k.start=k.pos}for(;i<k.pos;){var o=Math.min(k.pos,i+5e4);e(o,j),i=o}}function Af(a,b,c,d){var e=[a.state.modeGen],f={};zf(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(var g=0;g<a.state.overlays.length;++g){var h=a.state.overlays[g],i=1,j=0;zf(a,b.text,h.mode,!0,function(a,b){for(var c=i;a>j;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"cm-overlay "+b),i=c+2;else for(;i>c;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"cm-overlay "+b}},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function Bf(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=Af(a,b,b.stateAfter=Zb(a,_f(b)));b.styles=d.styles,d.classes?b.styleClasses=d.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Cf(a,b,c,d){var e=a.doc.mode,f=new He(b,a.options.tabSize);for(f.start=f.pos=d||0,""==b&&wf(e,c);!f.eol()&&f.pos<=a.options.maxHighlightLength;)xf(e,f,c),f.start=f.pos}function Ff(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?Ef:Df;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Gf(a,b){var c=dh("span",null,null,f?"padding-right: .1px":null),e={pre:dh("pre",[c]),content:c,col:0,pos:0,cm:a};b.measure={};for(var g=0;g<=(b.rest?b.rest.length:0);g++){var i,h=g?b.rest[g-1]:b.line;e.pos=0,e.addToken=If,(d||f)&&a.getOption("lineWrapping")&&(e.addToken=Jf(e.addToken)),vh(a.display.measure)&&(i=cg(h))&&(e.addToken=Kf(e.addToken,i)),e.map=[];var j=b!=a.display.externalMeasured&&_f(h);Mf(h,e,Bf(a,h,j)),h.styleClasses&&(h.styleClasses.bgClass&&(e.bgClass=mh(h.styleClasses.bgClass,e.bgClass||"")),h.styleClasses.textClass&&(e.textClass=mh(h.styleClasses.textClass,e.textClass||""))),0==e.map.length&&e.map.push(0,0,e.content.appendChild(th(a.display.measure))),0==g?(b.measure.map=e.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(e.map),(b.measure.caches||(b.measure.caches=[])).push({}))}return f&&/\bcm-tab\b/.test(e.content.lastChild.className)&&(e.content.className="cm-tab-wrap-hack"),Ag(a,"renderLine",a,b.line,e.pre),e.pre.className&&(e.textClass=mh(e.pre.className,e.textClass||"")),e}function Hf(a){var b=dh("span","\u2022","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b}function If(a,b,c,f,g,h,i){if(b){var j=a.cm.options.specialChars,k=!1;if(j.test(b))for(var l=document.createDocumentFragment(),m=0;;){j.lastIndex=m;var n=j.exec(b),o=n?n.index-m:b.length-m;if(o){var p=document.createTextNode(b.slice(m,m+o));d&&9>e?l.appendChild(dh("span",[p])):l.appendChild(p),a.map.push(a.pos,a.pos+o,p),a.col+=o,a.pos+=o}if(!n)break;if(m+=o+1,"	"==n[0]){var q=a.cm.options.tabSize,r=q-a.col%q,p=l.appendChild(dh("span",Rg(r),"cm-tab"));a.col+=r}else{var p=a.cm.options.specialCharPlaceholder(n[0]);d&&9>e?l.appendChild(dh("span",[p])):l.appendChild(p),a.col+=1}a.map.push(a.pos,a.pos+1,p),a.pos++}else{a.col+=b.length;var l=document.createTextNode(b);a.map.push(a.pos,a.pos+b.length,l),d&&9>e&&(k=!0),a.pos+=b.length}if(c||f||g||k||i){var s=c||"";f&&(s+=f),g&&(s+=g);var t=dh("span",[l],s,i);return h&&(t.title=h),a.content.appendChild(t)}a.content.appendChild(l)}}function Jf(a){function b(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?" ":"\xa0";return b+=" "}return function(c,d,e,f,g,h){a(c,d.replace(/ {3,}/g,b),e,f,g,h)}}function Kf(a,b){return function(c,d,e,f,g,h){e=e?e+" cm-force-border":"cm-force-border";for(var i=c.pos,j=i+d.length;;){for(var k=0;k<b.length;k++){var l=b[k];if(l.to>i&&l.from<=i)break}if(l.to>=j)return a(c,d,e,f,g,h);a(c,d.slice(0,l.to-i),e,f,null,h),f=null,d=d.slice(l.to-i),i=l.to}}}function Lf(a,b,c,d){var e=!d&&c.widgetNode;e&&(a.map.push(a.pos,a.pos+b,e),a.content.appendChild(e)),a.pos+=b}function Mf(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o,p,q,r,h=e.length,i=0,g=1,j="",m=0;;){if(m==i){n=o=p=q=l="",r=null,m=1/0;for(var s=[],t=0;t<d.length;++t){var u=d[t],v=u.marker;u.from<=i&&(null==u.to||u.to>i)?(null!=u.to&&m>u.to&&(m=u.to,o=""),v.className&&(n+=" "+v.className),v.css&&(l=v.css),v.startStyle&&u.from==i&&(p+=" "+v.startStyle),v.endStyle&&u.to==m&&(o+=" "+v.endStyle),v.title&&!q&&(q=v.title),v.collapsed&&(!r||cf(r.marker,v)<0)&&(r=u)):u.from>i&&m>u.from&&(m=u.from),"bookmark"==v.type&&u.from==i&&v.widgetNode&&s.push(v)}if(r&&(r.from||0)==i&&(Lf(b,(null==r.to?h+1:r.to)-i,r.marker,null==r.from),null==r.to))return;if(!r&&s.length)for(var t=0;t<s.length;++t)Lf(b,0,s[t])}if(i>=h)break;for(var w=Math.min(h,m);;){if(j){var x=i+j.length;if(!r){var y=x>w?j.slice(0,w-i):j;b.addToken(b,y,k?k+n:n,p,i+y.length==m?o:"",q,l)}if(x>=w){j=j.slice(w-i),i=w;break}i=x,p=""}j=e.slice(f,f=c[g++]),k=Ff(c[g++],b.cm.options)}}else for(var g=1;g<c.length;g+=2)b.addToken(b,e.slice(f,f=c[g]),Ff(c[g+1],b.cm.options))}function Nf(a,b){return 0==b.from.ch&&0==b.to.ch&&""==Sg(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function Of(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){tf(a,c,e,d),Cg(a,"change",a,b)}var g=b.from,h=b.to,i=b.text,j=Xf(a,g.line),k=Xf(a,h.line),l=Sg(i),m=e(i.length-1),n=h.line-g.line;if(Nf(a,b)){for(var o=0,p=[];o<i.length-1;++o)p.push(new sf(i[o],e(o),d));f(k,k.text,m),n&&a.remove(g.line,n),p.length&&a.insert(g.line,p)}else if(j==k)if(1==i.length)f(j,j.text.slice(0,g.ch)+l+j.text.slice(h.ch),m);else{for(var p=[],o=1;o<i.length-1;++o)p.push(new sf(i[o],e(o),d));p.push(new sf(l+j.text.slice(h.ch),m,d)),f(j,j.text.slice(0,g.ch)+i[0],e(0)),a.insert(g.line+1,p)}else if(1==i.length)f(j,j.text.slice(0,g.ch)+i[0]+k.text.slice(h.ch),e(0)),a.remove(g.line+1,n);else{f(j,j.text.slice(0,g.ch)+i[0],e(0)),f(k,l+k.text.slice(h.ch),m);for(var o=1,p=[];o<i.length-1;++o)p.push(new sf(i[o],e(o),d));n>1&&a.remove(g.line+1,n-1),a.insert(g.line+1,p)}Cg(a,"change",a,b)}function Pf(a){this.lines=a,this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function Qf(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d];b+=e.chunkSize(),c+=e.height,e.parent=this}this.size=b,this.height=c,this.parent=null}function Vf(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked.length;++g){var h=a.linked[g];if(h.doc!=e){var i=f&&h.sharedHist;(!c||i)&&(b(h.doc,i),d(h.doc,a,i))}}}d(a,null,!0)}function Wf(a,b){if(b.cm)throw new Error("This document is already in use.");a.doc=b,b.cm=a,C(a),y(a),a.options.lineWrapping||I(a),a.options.mode=b.modeOption,Vc(a)}function Xf(a,b){if(b-=a.first,0>b||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(f>b){c=e;break}b-=f}return c.lines[b]}function Yf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e}),d}function Zf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function $f(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function _f(a){if(null==a.parent)return null;for(var b=a.parent,c=Ug(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function ag(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(f>b){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var d=0;d<a.lines.length;++d){var g=a.lines[d],h=g.height;if(h>b)break;b-=h}return c+d}function bg(a){a=hf(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;b+=e.height}for(var f=c.parent;f;c=f,f=c.parent)for(var d=0;d<f.children.length;++d){var g=f.children[d];if(g==c)break;b+=g.height}return b}function cg(a){var b=a.order;return null==b&&(b=a.order=Qh(a.text)),b}function dg(a){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=a||1}function eg(a,b){var c={from:rb(b.from),to:Sd(b),text:Yf(a,b.from,b.to)};return lg(a,c,b.from.line,b.to.line+1),Vf(a,function(a){lg(a,c,b.from.line,b.to.line+1)},!0),c}function fg(a){for(;a.length;){var b=Sg(a);if(!b.ranges)break;a.pop()}}function gg(a,b){return b?(fg(a.done),Sg(a.done)):a.done.length&&!Sg(a.done).ranges?Sg(a.done):a.done.length>1&&!a.done[a.done.length-2].ranges?(a.done.pop(),Sg(a.done)):void 0}function hg(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0)))&&(g=gg(e,e.lastOp==d))){var h=Sg(g.changes);0==qb(b.from,b.to)&&0==qb(b.from,h.to)?h.to=Sd(b):g.changes.push(eg(a,b))}else{var i=Sg(e.done);for(i&&i.ranges||kg(a.sel,e.done),g={changes:[eg(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=f,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,h||Ag(a,"historyAdded")}function ig(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function jg(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||ig(a,f,Sg(e.done),b))?e.done[e.done.length-1]=b:kg(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&d.clearRedo!==!1&&fg(e.undone)}function kg(a,b){var c=Sg(b);c&&c.ranges&&c.equals(a)||b.push(a)}function lg(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f})}function mg(a){if(!a)return null;for(var c,b=0;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);return c?c.length?c:null:a}function ng(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=[];d<b.text.length;++d)e.push(mg(c[d]));return e}function og(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?ub.prototype.deepCopy.call(f):f);else{var g=f.changes,h=[];e.push({changes:h});for(var i=0;i<g.length;++i){var k,j=g[i];if(h.push({from:j.from,to:j.to,text:j.text}),b)for(var l in j)(k=l.match(/^spans_(\d+)$/))&&Ug(b,Number(k[1]))>-1&&(Sg(h)[l]=j[l],delete j[l])}}}return e}function pg(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function qg(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)pg(f.ranges[h].anchor,b,c,d),pg(f.ranges[h].head,b,c,d)}else{for(var h=0;h<f.changes.length;++h){var i=f.changes[h];if(c<i.from.line)i.from=pb(i.from.line+d,i.from.ch),i.to=pb(i.to.line+d,i.to.ch);else if(b<=i.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function rg(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;qg(a.done,c,d,e),qg(a.undone,c,d,e)}function ug(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.returnValue}function wg(a){return a.target||a.srcElement}function xg(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),p&&a.ctrlKey&&1==b&&(b=3),b}function Cg(a,b){function f(a){return function(){a.apply(null,d)}}var c=a._handlers&&a._handlers[b];if(c){var e,d=Array.prototype.slice.call(arguments,2);Ec?e=Ec.delayedCallbacks:Bg?e=Bg:(e=Bg=[],setTimeout(Dg,0));for(var g=0;g<c.length;++g)e.push(f(c[g]))}}function Dg(){var a=Bg;Bg=null;for(var b=0;b<a.length;++b)a[b]()}function Eg(a,b,c){return"string"==typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}}),Ag(a,c||b.type,a,b),ug(b)||b.codemirrorIgnore}function Fg(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(var c=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]),d=0;d<b.length;++d)-1==Ug(c,b[d])&&c.push(b[d])}function Gg(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}function Hg(a){a.prototype.on=function(a,b){yg(this,a,b)},a.prototype.off=function(a,b){zg(this,a,b)}}function Ng(){this.id=null}function Pg(a,b,c){for(var d=0,e=0;;){var f=a.indexOf("	",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}}function Rg(a){for(;Qg.length<=a;)Qg.push(Sg(Qg)+" ");return Qg[a]}function Sg(a){return a[a.length-1]}function Ug(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function Vg(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function Wg(a,b){var c;if(Object.create)c=Object.create(a);else{var d=function(){};d.prototype=a,c=new d}return b&&Xg(b,c),c}function Xg(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||c===!1&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function Yg(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function _g(a,b){return b?b.source.indexOf("\\w")>-1&&$g(a)?!0:b.test(a):$g(a)}function ah(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function ch(a){return a.charCodeAt(0)>=768&&bh.test(a)}function dh(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f<b.length;++f)e.appendChild(b[f]);return e}function fh(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.firstChild);return a}function gh(a,b){return fh(a).appendChild(b)}function hh(a,b){if(a.contains)return a.contains(b);for(;b=b.parentNode;)if(b==a)return!0}function ih(){return document.activeElement}function jh(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function mh(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!jh(c[d]).test(b)&&(b+=" "+c[d]);return b}function nh(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName("CodeMirror"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function ph(){oh||(qh(),oh=!0)}function qh(){var a;yg(window,"resize",function(){null==a&&(a=setTimeout(function(){a=null,nh(jd)},100))}),yg(window,"blur",function(){nh(Pd)})}function th(a){if(null==sh){var b=dh("span","\u200b");gh(a,dh("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(sh=b.offsetWidth<=1&&b.offsetHeight>2&&!(d&&8>e))}return sh?dh("span","\u200b"):dh("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px")}function vh(a){if(null!=uh)return uh;var b=gh(a,document.createTextNode("A\u062eA")),c=eh(b,0,1).getBoundingClientRect();if(!c||c.left==c.right)return!1;var d=eh(b,1,2).getBoundingClientRect();return uh=d.right-c.right<3}function Ah(a){if(null!=zh)return zh;var b=gh(a,dh("span","x")),c=b.getBoundingClientRect(),d=eh(b,0,1).getBoundingClientRect();return zh=Math.abs(c.left-d.left)>1}function Ch(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.length;++f){var g=a[f];(g.from<c&&g.to>b||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0)}e||d(b,c,"ltr")}function Dh(a){return a.level%2?a.to:a.from}function Eh(a){return a.level%2?a.from:a.to}function Fh(a){var b=cg(a);return b?Dh(b[0]):0}function Gh(a){var b=cg(a);return b?Eh(Sg(b)):a.text.length}function Hh(a,b){var c=Xf(a.doc,b),d=hf(c);d!=c&&(b=_f(d));var e=cg(d),f=e?e[0].level%2?Gh(d):Fh(d):0;return pb(b,f)}function Ih(a,b){for(var c,d=Xf(a.doc,b);c=ff(d);)d=c.find(1,!0).line,b=null;var e=cg(d),f=e?e[0].level%2?Fh(d):Gh(d):d.text.length;return pb(null==b?_f(d):b,f)}function Jh(a,b){var c=Hh(a,b.line),d=Xf(a.doc,c.line),e=cg(d);if(!e||0==e[0].level){var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return pb(c.line,g?0:f)}return c}function Kh(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}function Mh(a,b){Lh=null;for(var d,c=0;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b){if(null!=d)return Kh(a,e.level,a[d].level)?(e.from!=e.to&&(Lh=d),c):(e.from!=e.to&&(Lh=c),d);d=c}}return d}function Nh(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&ch(a.text.charAt(b)));return b}function Oh(a,b,c,d){var e=cg(a);if(!e)return Ph(a,b,c,d);for(var f=Mh(e,b),g=e[f],h=Nh(a,b,g.level%2?-c:c,d);;){if(h>g.from&&h<g.to)return h;if(h==g.from||h==g.to)return Mh(e,h)==f?h:(g=e[f+=c],c>0==g.level%2?g.to:g.from);if(g=e[f+=c],!g)return null;h=c>0==g.level%2?Nh(a,g.to,-1,d):Nh(a,g.from,1,d)}}function Ph(a,b,c,d){var e=b+c;if(d)for(;e>0&&ch(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),d=b||c,e=d&&(b?document.documentMode||6:c[1]),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/KHTML\//.test(navigator.userAgent),l=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),m=/PhantomJS/.test(navigator.userAgent),n=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),o=n||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),p=n||/Mac/.test(navigator.platform),q=/win/i.test(navigator.platform),r=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);r&&(r=Number(r[1])),r&&r>=15&&(i=!1,f=!0);var s=p&&(g||i&&(null==r||12.11>r)),t=a||d&&e>=9,u=!1,v=!1;L.prototype=Xg({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+f+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&a.clientHeight>0&&(0==d&&this.overlayHack(),this.checkedOverlay=!0),{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){var a=p&&!l?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=a;var b=this,c=function(a){wg(a)!=b.vert&&wg(a)!=b.horiz&&Qc(b.cm,md)(a)};yg(this.vert,"mousedown",c),yg(this.horiz,"mousedown",c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)}},L.prototype),M.prototype=Xg({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},M.prototype),w.scrollbarModel={"native":L,"null":M};var pb=w.Pos=function(a,b){return this instanceof pb?(this.line=a,this.ch=b,void 0):new pb(a,b)},qb=w.cmpPos=function(a,b){return a.line-b.line||a.ch-b.ch};ub.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=qb(c.anchor,d.anchor)||0!=qb(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new vb(rb(this.ranges[b].anchor),rb(this.ranges[b].head));return new ub(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},contains:function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(qb(b,d.from())>=0&&qb(a,d.to())<=0)return c}return-1}},vb.prototype={from:function(){return tb(this.anchor,this.head)},to:function(){return sb(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Bc,nd,od,lc={left:0,right:0,top:0,bottom:0},Ec=null,Fc=0,cd=null,ud=0,zd=0,Ad=null;d?Ad=-.53:a?Ad=15:h?Ad=-.7:j&&(Ad=-1/3);var Bd=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}};w.wheelEventPixels=function(a){var b=Bd(a);return b.x*=Ad,b.y*=Ad,b};var Fd=new Ng,Jd=null,Sd=w.changeEnd=function(a){return a.text?pb(a.from.line+a.text.length-1,Sg(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};w.prototype={constructor:w,focus:function(){window.focus(),fd(this),bd(this)},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,qe.hasOwnProperty(a)&&Qc(this,qe[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](Ge(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:Rc(function(a,b){var c=a.token?a:w.getMode(this.options,a);if(c.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:c,modeSpec:a,opaque:b&&b.opaque}),this.state.modeGen++,Vc(this)}),removeOverlay:Rc(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||"string"==typeof a&&d.name==a)return b.splice(c,1),this.state.modeGen++,Vc(this),void 0}}),indentLine:Rc(function(a,b,c){"string"!=typeof b&&"number"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),Bb(this.doc,a)&&ke(this,a,b,c)}),indentSelection:Rc(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=b[d];if(e.empty())e.head.line>c&&(ke(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&ie(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;c>i;++i)ke(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&Gb(this.doc,d,new vb(f,j[d].to()),Kg)}}}),getTokenAt:function(a,b){return yf(this,a,b)},getLineTokens:function(a,b){return yf(this,pb(a),b,!0)},getTokenTypeAt:function(a){a=zb(this.doc,a);var f,b=Bf(this,Xf(this.doc,a.line)),c=0,d=(b.length-1)/2,e=a.ch;if(0==e)f=b[2];else for(;;){var g=c+d>>1;if((g?b[2*g-1]:0)>=e)d=g;else{if(!(b[2*g+1]<e)){f=b[2*g+2];break}c=g+1}}var h=f?f.indexOf("cm-overlay "):-1;return 0>h?f:0==h?null:f.slice(0,h-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?w.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!xe.hasOwnProperty(b))return xe;var d=xe[b],e=this.getModeAt(a);if("string"==typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;f<e[b].length;f++){var g=d[e[b][f]];g&&c.push(g)}else e.helperType&&d[e.helperType]?c.push(d[e.helperType]):d[e.name]&&c.push(d[e.name]);for(var f=0;f<d._global.length;f++){var h=d._global[f];
h.pred(e,this)&&-1==Ug(c,h.val)&&c.push(h.val)}return c},getStateAfter:function(a,b){var c=this.doc;return a=yb(c,null==a?c.first+c.size-1:a),Zb(this,a+1,b)},cursorCoords:function(a,b){var c,d=this.doc.sel.primary();return c=null==a?d.head:"object"==typeof a?zb(this.doc,a):a?d.from():d.to(),wc(this,c,b||"page")},charCoords:function(a,b){return vc(this,zb(this.doc,a),b||"page")},coordsChar:function(a,b){return a=uc(this,a,b||"page"),zc(this,a.left,a.top)},lineAtHeight:function(a,b){return a=uc(this,{top:a,left:0},b||"page").top,ag(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var c=!1,d=this.doc.first+this.doc.size-1;a<this.doc.first?a=this.doc.first:a>d&&(a=d,c=!0);var e=Xf(this.doc,a);return tc(this,e,{top:0,left:0},b||"page").top+(c?this.doc.height-bg(e):0)},defaultTextHeight:function(){return Cc(this.display)},defaultCharWidth:function(){return Dc(this.display)},setGutterMarker:Rc(function(a,b,c){return le(this.doc,a,"gutter",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&ah(d)&&(a.gutterMarkers=null),!0})}),clearGutter:Rc(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,Wc(b,d,"gutter"),ah(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),addLineWidget:Rc(function(a,b,c){return rf(this,a,b,c)}),removeLineWidget:function(a){a.clear()},lineInfo:function(a){if("number"==typeof a){if(!Bb(this.doc,a))return null;var b=a;if(a=Xf(this.doc,a),!a)return null}else{var b=_f(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=wc(this,zb(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&fe(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:Rc(Kd),triggerOnKeyPress:Rc(Nd),triggerOnKeyUp:Md,execCommand:function(a){return Ae.hasOwnProperty(a)?Ae[a](this):void 0},findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=zb(this.doc,a);b>f&&(g=ne(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:Rc(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?ne(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Mg)}),deleteH:Rc(function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):me(this,function(c){var e=ne(d,c.head,a,b,!1);return 0>a?{from:e,to:c.head}:{from:c.head,to:e}})}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=zb(this.doc,a);b>g;++g){var i=wc(this,h,"div");if(null==f?f=i.left:i.left=f,h=oe(this,i,e,c),h.hitSide)break}return h},moveV:Rc(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=wc(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=oe(c,h,a,b);return"page"==b&&g==d.sel.primary()&&he(c,null,vc(c,i,"div").top-h.top),i},Mg),e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=this.doc,c=Xf(b,a.line).text,d=a.ch,e=a.ch;if(c){var f=this.getHelper(a,"wordChars");(a.xRel<0||e==c.length)&&d?--d:++e;for(var g=c.charAt(d),h=_g(g,f)?function(a){return _g(a,f)}:/\s/.test(g)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!_g(a)};d>0&&h(c.charAt(d-1));)--d;for(;e<c.length&&h(c.charAt(e));)++e}return new vb(pb(a.line,d),pb(a.line,e))},toggleOverwrite:function(a){(null==a||a!=this.state.overwrite)&&((this.state.overwrite=!this.state.overwrite)?lh(this.display.cursorDiv,"CodeMirror-overwrite"):kh(this.display.cursorDiv,"CodeMirror-overwrite"),Ag(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return ih()==this.display.input},scrollTo:Rc(function(a,b){(null!=a||null!=b)&&je(this),null!=a&&(this.curOp.scrollLeft=a),null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-bc(this)-this.display.barHeight,width:a.scrollWidth-bc(this)-this.display.barWidth,clientHeight:dc(this),clientWidth:cc(this)}},scrollIntoView:Rc(function(a,b){if(null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):"number"==typeof a?a={from:pb(a,0),to:null}:null==a.from&&(a={from:a,to:null}),a.to||(a.to=a.from),a.margin=b||0,null!=a.from.line)je(this),this.curOp.scrollToPos=a;else{var c=ge(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,a.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin);this.scrollTo(c.scrollLeft,c.scrollTop)}}),setSize:Rc(function(a,b){function d(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}var c=this;null!=a&&(c.display.wrapper.style.width=d(a)),null!=b&&(c.display.wrapper.style.height=d(b)),c.options.lineWrapping&&pc(this);var e=c.display.viewFrom;c.doc.iter(e,c.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){Wc(c,e,"widget");break}++e}),c.curOp.forceUpdate=!0,Ag(c,"refresh",this)}),operation:function(a){return Pc(this,a)},refresh:Rc(function(){var a=this.display.cachedTextHeight;Vc(this),this.curOp.forceUpdate=!0,qc(this),this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop),G(this),(null==a||Math.abs(a-Cc(this.display))>.5)&&C(this),Ag(this,"refresh",this)}),swapDoc:Rc(function(a){var b=this.doc;return b.cm=null,Wf(this,a),qc(this),ed(this),this.scrollTo(a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,Cg(this,"swapDoc",this,b),b}),getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Hg(w);var pe=w.defaults={},qe=w.optionHandlers={},se=w.Init={toString:function(){return"CodeMirror.Init"}};re("value","",function(a,b){a.setValue(b)},!0),re("mode",null,function(a,b){a.doc.modeOption=b,y(a)},!0),re("indentUnit",2,y,!0),re("indentWithTabs",!1),re("smartIndent",!0),re("tabSize",4,function(a){z(a),qc(a),Vc(a)},!0),re("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b){a.options.specialChars=new RegExp(b.source+(b.test("	")?"":"|	"),"g"),a.refresh()},!0),re("specialCharPlaceholder",Hf,function(a){a.refresh()},!0),re("electricChars",!0),re("rtlMoveVisually",!q),re("wholeLineUpdateBefore",!0),re("theme","default",function(a){D(a),E(a)},!0),re("keyMap","default",function(a,b,c){var d=Ge(b),e=c!=w.Init&&Ge(c);e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)}),re("extraKeys",null),re("lineWrapping",!1,A,!0),re("gutters",[],function(a){J(a.options),E(a)},!0),re("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?U(a.display)+"px":"0",a.refresh()},!0),re("coverGutterNextToScrollbar",!1,function(a){O(a)},!0),re("scrollbarStyle","native",function(a){N(a),O(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0),re("lineNumbers",!1,function(a){J(a.options),E(a)},!0),re("firstLineNumber",1,E,!0),re("lineNumberFormatter",function(a){return a},E,!0),re("showCursorWhenSelecting",!1,Sb,!0),re("resetSelectionOnContextMenu",!0),re("readOnly",!1,function(a,b){"nocursor"==b?(Pd(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||ed(a))}),re("disableInput",!1,function(a,b){b||ed(a)},!0),re("dragDrop",!0),re("cursorBlinkRate",530),re("cursorScrollMargin",0),re("cursorHeight",1,Sb,!0),re("singleCursorHeightPerLine",!0,Sb,!0),re("workTime",100),re("workDelay",100),re("flattenSpans",!0,z,!0),re("addModeClass",!1,z,!0),re("pollInterval",100),re("undoDepth",200,function(a,b){a.doc.history.undoDepth=b}),re("historyEventDelay",1250),re("viewportMargin",10,function(a){a.refresh()},!0),re("maxHighlightLength",1e4,z,!0),re("moveInputWithCursor",!0,function(a,b){b||(a.display.inputDiv.style.top=a.display.inputDiv.style.left=0)}),re("tabindex",null,function(a,b){a.display.input.tabIndex=b||""}),re("autofocus",null);var te=w.modes={},ue=w.mimeModes={};w.defineMode=function(a,b){w.defaults.mode||"null"==a||(w.defaults.mode=a),arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),te[a]=b},w.defineMIME=function(a,b){ue[a]=b},w.resolveMode=function(a){if("string"==typeof a&&ue.hasOwnProperty(a))a=ue[a];else if(a&&"string"==typeof a.name&&ue.hasOwnProperty(a.name)){var b=ue[a.name];"string"==typeof b&&(b={name:b}),a=Wg(b,a),a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return w.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},w.getMode=function(a,b){var b=w.resolveMode(b),c=te[b.name];if(!c)return w.getMode(a,"text/plain");var d=c(a,b);if(ve.hasOwnProperty(b.name)){var e=ve[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var f in b.modeProps)d[f]=b.modeProps[f];return d},w.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),w.defineMIME("text/plain","null");var ve=w.modeExtensions={};w.extendMode=function(a,b){var c=ve.hasOwnProperty(a)?ve[a]:ve[a]={};Xg(b,c)},w.defineExtension=function(a,b){w.prototype[a]=b},w.defineDocExtension=function(a,b){Sf.prototype[a]=b},w.defineOption=re;var we=[];w.defineInitHook=function(a){we.push(a)};var xe=w.helpers={};w.registerHelper=function(a,b,c){xe.hasOwnProperty(a)||(xe[a]=w[a]={_global:[]}),xe[a][b]=c},w.registerGlobalHelper=function(a,b,c,d){w.registerHelper(a,b,d),xe[a]._global.push({pred:c,val:d})};var ye=w.copyState=function(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c},ze=w.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};w.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state,a=c.mode}return c||{mode:a,state:b}};var Ae=w.commands={selectAll:function(a){a.setSelection(pb(a.firstLine(),0),pb(a.lastLine()),Kg)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Kg)},killLine:function(a){me(a,function(b){if(b.empty()){var c=Xf(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:pb(b.head.line+1,0)}:{from:b.head,to:pb(b.head.line,c)}}return{from:b.from(),to:b.to()}})},deleteLine:function(a){me(a,function(b){return{from:pb(b.from().line,0),to:zb(a.doc,pb(b.to().line+1,0))}})},delLineLeft:function(a){me(a,function(a){return{from:pb(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){me(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return{from:d,to:b.from()}})},delWrappedLineRight:function(a){me(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div");return{from:b.from(),to:d}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(pb(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(pb(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return Hh(a,b.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return Jh(a,b.head)},{origin:"+move",bias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){return Ih(a,b.head.line)},{origin:"+move",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div")},Mg)},goLineLeft:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:0,top:c},"div")},Mg)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return d.ch<a.getLine(d.line).search(/\S/)?Jh(a,b.head):d},Mg)},goLineUp:function(a){a.moveV(-1,"line")},goLineDown:function(a){a.moveV(1,"line")},goPageUp:function(a){a.moveV(-1,"page")},goPageDown:function(a){a.moveV(1,"page")},goCharLeft:function(a){a.moveH(-1,"char")},goCharRight:function(a){a.moveH(1,"char")},goColumnLeft:function(a){a.moveH(-1,"column")},goColumnRight:function(a){a.moveH(1,"column")},goWordLeft:function(a){a.moveH(-1,"word")},goGroupRight:function(a){a.moveH(1,"group")},goGroupLeft:function(a){a.moveH(-1,"group")},goWordRight:function(a){a.moveH(1,"word")},delCharBefore:function(a){a.deleteH(-1,"char")},delCharAfter:function(a){a.deleteH(1,"char")},delWordBefore:function(a){a.deleteH(-1,"word")},delWordAfter:function(a){a.deleteH(1,"word")},delGroupBefore:function(a){a.deleteH(-1,"group")},delGroupAfter:function(a){a.deleteH(1,"group")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection("	")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),g=Og(a.getLine(f.line),f.ch,d);b.push(new Array(d-g%d+1).join(" "))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.execCommand("insertTab")},transposeChars:function(a){Pc(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=Xf(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new pb(e.line,e.ch-1)),e.ch>0)e=new pb(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),pb(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=Xf(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+"\n"+g.charAt(g.length-1),pb(e.line-1,g.length-1),pb(e.line,1),"+transpose")}c.push(new vb(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){Pc(a,function(){for(var b=a.listSelections().length,c=0;b>c;c++){var d=a.listSelections()[c];a.replaceRange("\n",d.anchor,d.head,"+input"),a.indentLine(d.from().line+1,null,!0),ie(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},Be=w.keyMap={};Be.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Be.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Be.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},Be.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Be["default"]=p?Be.macDefault:Be.pcDefault,w.normalizeKeyMap=function(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=Vg(c.split(" "),Ce),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=c,g=d):(h=e.slice(0,f+1).join(" "),g="...");var i=b[h];if(i){if(i!=g)throw new Error("Inconsistent bindings for "+h)}else b[h]=g}delete a[c]}for(var j in b)a[j]=b[j];return a};var De=w.lookupKey=function(a,b,c,d){b=Ge(b);var e=b.call?b.call(a,d):b[a];if(e===!1)return"nothing";if("..."===e)return"multi";if(null!=e&&c(e))return"handled";if(b.fallthrough){if("[object Array]"!=Object.prototype.toString.call(b.fallthrough))return De(a,b.fallthrough,c,d);for(var f=0;f<b.fallthrough.length;f++){var g=De(a,b.fallthrough[f],c,d);if(g)return g}}},Ee=w.isModifierKey=function(a){var b="string"==typeof a?a:Bh[a.keyCode];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b},Fe=w.keyName=function(a,b){if(i&&34==a.keyCode&&a["char"])return!1;var c=Bh[a.keyCode],d=c;return null==d||a.altGraphKey?!1:(a.altKey&&"Alt"!=c&&(d="Alt-"+d),(s?a.metaKey:a.ctrlKey)&&"Ctrl"!=c&&(d="Ctrl-"+d),(s?a.ctrlKey:a.metaKey)&&"Cmd"!=c&&(d="Cmd-"+d),!b&&a.shiftKey&&"Shift"!=c&&(d="Shift-"+d),d)};w.fromTextArea=function(a,b){function d(){a.value=i.getValue()}if(b||(b={}),b.value=a.value,!b.tabindex&&a.tabindex&&(b.tabindex=a.tabindex),!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder),null==b.autofocus){var c=ih();b.autofocus=c==a||null!=a.getAttribute("autofocus")&&c==document.body}if(a.form&&(yg(a.form,"submit",d),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){d(),e.submit=f,e.submit(),e.submit=g}}catch(h){}}a.style.display="none";var i=w(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return i.save=d,i.getTextArea=function(){return a},i.toTextArea=function(){i.toTextArea=isNaN,d(),a.parentNode.removeChild(i.getWrapperElement()),a.style.display="",a.form&&(zg(a.form,"submit",d),"function"==typeof a.form.submit&&(a.form.submit=f))},i};var He=w.StringStream=function(a,b){this.pos=this.start=0,this.string=a,this.tabSize=b||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};He.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.pos<this.string.length?this.string.charAt(this.pos++):void 0},eat:function(a){var b=this.string.charAt(this.pos);if("string"==typeof a)var c=b==a;else var c=b&&(a.test?a.test(b):a(b));return c?(++this.pos,b):void 0},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=Og(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?Og(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return Og(this.string,null,this.tabSize)-(this.lineStart?Og(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if("string"!=typeof a){var f=this.string.slice(this.pos).match(a);return f&&f.index>0?null:(f&&b!==!1&&(this.pos+=f[0].length),f)}var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);return d(e)==d(a)?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var Ie=w.TextMarker=function(a,b){this.lines=[],this.type=b,this.doc=a};Hg(Ie),Ie.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&Gc(a),Gg(this,"clear")){var c=this.find();c&&Cg(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;f<this.lines.length;++f){var g=this.lines[f],h=Re(g.markedSpans,this);a&&!this.collapsed?Wc(a,_f(g),"text"):a&&(null!=h.to&&(e=_f(g)),null!=h.from&&(d=_f(g))),g.markedSpans=Se(g.markedSpans,h),null==h.from&&this.collapsed&&!mf(this.doc,g)&&a&&$f(g,Cc(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(var f=0;f<this.lines.length;++f){var i=hf(this.lines[f]),j=H(i);j>a.display.maxLineLength&&(a.display.maxLine=i,a.display.maxLineLength=j,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&Vc(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&Nb(a.doc)),a&&Cg(a,"markerCleared",a,this),b&&Ic(a),this.parent&&this.parent.clear()}},Ie.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=Re(f.markedSpans,this);if(null!=g.from&&(c=pb(b?f:_f(f),g.from),-1==a))return c;if(null!=g.to&&(d=pb(b?f:_f(f),g.to),1==a))return d}return c&&{from:c,to:d}},Ie.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;a&&c&&Pc(c,function(){var d=a.line,e=_f(a.line),f=ic(c,e);if(f&&(oc(f),c.curOp.selectionChanged=c.curOp.forceUpdate=!0),c.curOp.updateMaxLine=!0,!mf(b.doc,d)&&null!=b.height){var g=b.height;b.height=null;var h=qf(b)-g;h&&$f(d,d.height+h)}})},Ie.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=Ug(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)},Ie.prototype.detachLine=function(a){if(this.lines.splice(Ug(this.lines,a),1),!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;(b.maybeHiddenMarkers||(b.maybeHiddenMarkers=[])).push(this)}};var Je=0,Le=w.SharedTextMarker=function(a,b){this.markers=a,this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Hg(Le),Le.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();Cg(this,"clear")}},Le.prototype.find=function(a,b){return this.primary.find(a,b)};var of=w.LineWidget=function(a,b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.cm=a,this.node=b};Hg(of),of.prototype.clear=function(){var a=this.cm,b=this.line.widgets,c=this.line,d=_f(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=qf(this);Pc(a,function(){pf(a,c,-f),Wc(a,d,"widget"),$f(c,Math.max(0,c.height-f))})}},of.prototype.changed=function(){var a=this.height,b=this.cm,c=this.line;this.height=null;var d=qf(this)-a;d&&Pc(b,function(){b.curOp.forceUpdate=!0,pf(b,c,d),$f(c,c.height+d)})};var sf=w.Line=function(a,b,c){this.text=a,_e(this,b),this.height=c?c(this):1};Hg(sf),sf.prototype.lineNo=function(){return _f(this)};var Df={},Ef={};Pf.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;d>c;++c){var e=this.lines[c];this.height-=e.height,uf(e),Cg(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;d<b.length;++d)b[d].parent=this},iterN:function(a,b,c){for(var d=a+b;d>a;++a)if(c(this.lines[a]))return!0}},Qf.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(e>a){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Pf))){var h=[];this.collapse(h),this.children=[new Pf(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>=a){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(;e.lines.length>50;){var g=e.lines.splice(e.lines.length-25,25),h=new Pf(g);e.height-=h.height,this.children.splice(d+1,0,h),h.parent=this}this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new Qf(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=Ug(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new Qf(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>a){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var Rf=0,Sf=w.Doc=function(a,b,c){if(!(this instanceof Sf))return new Sf(a,b,c);null==c&&(c=0),Qf.call(this,[new Pf([new sf("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=c;var d=pb(c,0);this.sel=xb(d),this.history=new dg(null),this.id=++Rf,this.modeOption=b,"string"==typeof a&&(a=wh(a)),Of(this,{from:d,to:d,text:a}),Kb(this,xb(d),Kg)};Sf.prototype=Wg(Qf.prototype,{constructor:Sf,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=Zf(this,this.first,this.first+this.size);return a===!1?b:b.join(a||"\n")},setValue:Sc(function(a){var b=pb(this.first,0),c=this.first+this.size-1;Yd(this,{from:b,to:pb(c,Xf(this,c).text.length),text:wh(a),origin:"setValue"},!0),Kb(this,xb(b))}),replaceRange:function(a,b,c,d){b=zb(this,b),c=c?zb(this,c):b,ce(this,a,b,c,d)},getRange:function(a,b,c){var d=Yf(this,zb(this,a),zb(this,b));return c===!1?d:d.join(c||"\n")},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},getLineHandle:function(a){return Bb(this,a)?Xf(this,a):void 0},getLineNumber:function(a){return _f(a)},getLineHandleVisualStart:function(a){return"number"==typeof a&&(a=Xf(this,a)),hf(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return zb(this,a)},getCursor:function(a){var c,b=this.sel.primary();return c=
Download .txt
gitextract_1e21aora/

├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── unicorn/
│   ├── Makefile
│   ├── help.c
│   ├── machine_i2c.c
│   ├── machine_pin.c
│   ├── main.c
│   ├── modmachine.c
│   ├── modmachine.h
│   ├── modpyb.c
│   ├── modpyb.h
│   ├── modutime.c
│   ├── mpconfigport.h
│   ├── mpconfigport_features.h
│   ├── mpconfigport_minimal.h
│   ├── mpconfigport_pyboard.h
│   ├── mphalport.c
│   ├── mphalport.h
│   ├── pyb_adc.c
│   ├── pyb_led.c
│   ├── pyb_servo.c
│   ├── pyb_switch.c
│   ├── qstrdefsport.h
│   ├── uart.c
│   ├── unicorn.ld
│   └── unicorn_mcu.h
└── www-emu/
    ├── Makefile
    ├── codemirror.css
    ├── codemirror.js
    ├── demo_gen.py
    ├── features_demos.py
    ├── fit.js
    ├── index.html
    ├── minimal_demos.py
    ├── mp_unicorn.css
    ├── mp_unicorn.js
    └── pyboard_demos.py
Download .txt
SYMBOL INDEX (438 symbols across 18 files)

FILE: unicorn/machine_i2c.c
  type machine_i2c_obj_t (line 10) | typedef struct _machine_i2c_obj_t {
  function STATIC (line 18) | STATIC void machine_i2c_print(const mp_print_t *print, mp_obj_t self_in,...
  function STATIC (line 22) | STATIC mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n...
  function STATIC (line 66) | STATIC int machine_i2c_readfrom(mp_obj_base_t *self_in, uint16_t addr, u...
  function STATIC (line 71) | STATIC int machine_i2c_writeto(mp_obj_base_t *self_in, uint16_t addr, co...
  function STATIC (line 105) | STATIC int machine_i2c_transfer_single(mp_obj_base_t *self_in, uint16_t ...

FILE: unicorn/machine_pin.c
  function machine_pin_obj_t (line 71) | machine_pin_obj_t *machine_pin_get(mp_obj_t *obj_in) {
  function pin_set (line 78) | void pin_set(mp_obj_t self_in, int value) {
  function machine_pin_print (line 87) | void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_pri...
  function STATIC (line 92) | STATIC mp_obj_t machine_pin_make_new(const mp_obj_type_t *type, size_t n...
  function STATIC (line 103) | STATIC mp_obj_t machine_pin_off(mp_obj_t self_in) {
  function STATIC (line 109) | STATIC mp_obj_t machine_pin_on(mp_obj_t self_in) {
  function mp_obj_t (line 115) | mp_obj_t machine_pin_call(mp_obj_t self_in, size_t n_args, size_t n_kw, ...
  function STATIC (line 130) | STATIC mp_obj_t machine_pin_value(mp_uint_t n_args, const mp_obj_t *args) {

FILE: unicorn/main.c
  function do_str (line 42) | void do_str(const char *src, mp_parse_input_kind_t input_kind) {
  function main (line 56) | int main(int argc, char **argv) {
  function gc_collect (line 88) | void gc_collect(void) {
  function mp_lexer_t (line 97) | mp_lexer_t *mp_lexer_new_from_file(const char *filename) {
  function mp_import_stat_t (line 101) | mp_import_stat_t mp_import_stat(const char *path) {
  function mp_obj_t (line 105) | mp_obj_t mp_builtin_open(uint n_args, const mp_obj_t *args, mp_map_t *kw...
  function nlr_jump_fail (line 110) | void nlr_jump_fail(void *val) {
  function __fatal_error (line 114) | void NORETURN __fatal_error(const char *msg) {
  function __assert_func (line 119) | void MP_WEAK __assert_func(const char *file, int line, const char *func,...
  function Reset_Handler (line 130) | void Reset_Handler(void) {
  function Default_Handler (line 152) | void Default_Handler(void) {
  function _start (line 176) | void _start(void) {

FILE: unicorn/modmachine.h
  type machine_pin_obj_t (line 31) | typedef struct _machine_pin_obj_t {

FILE: unicorn/modpyb.h
  type pyb_led_t (line 27) | typedef enum {

FILE: unicorn/mpconfigport.h
  type mp_int_t (line 39) | typedef int mp_int_t;
  type mp_uint_t (line 40) | typedef unsigned mp_uint_t;
  type mp_off_t (line 42) | typedef long mp_off_t;

FILE: unicorn/mphalport.c
  function mp_hal_delay_ms (line 34) | void mp_hal_delay_ms(mp_uint_t ms) {
  function mp_hal_delay_us (line 42) | void mp_hal_delay_us(mp_uint_t us) {
  function mp_uint_t (line 49) | mp_uint_t mp_hal_ticks_us(void) {
  function mp_uint_t (line 53) | mp_uint_t mp_hal_ticks_ms(void) {
  function mp_uint_t (line 57) | mp_uint_t mp_hal_ticks_cpu(void) {

FILE: unicorn/mphalport.h
  function mp_hal_pin_config (line 21) | static inline void mp_hal_pin_config(mp_hal_pin_obj_t pin, uint32_t mode...
  function mp_hal_delay_us_fast (line 23) | static inline void mp_hal_delay_us_fast(uint32_t us) { return; }

FILE: unicorn/pyb_adc.c
  type pyb_adc_obj_t (line 34) | typedef struct _pyb_adc_obj_t {
  function pyb_adc_print (line 68) | void pyb_adc_print(const mp_print_t *print, mp_obj_t self_in, mp_print_k...
  function STATIC (line 72) | STATIC mp_obj_t pyb_adc_make_new(const mp_obj_type_t *type, size_t n_arg...
  function STATIC (line 85) | STATIC mp_obj_t pyb_adc_read(mp_obj_t self_in) {

FILE: unicorn/pyb_led.c
  type pyb_led_obj_t (line 34) | typedef struct _pyb_led_obj_t {
  function led_state (line 47) | void led_state(pyb_led_t led, int state) {
  function led_toggle (line 59) | void led_toggle(pyb_led_t led) {
  function led_obj_print (line 67) | void led_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_k...
  function STATIC (line 72) | STATIC mp_obj_t led_obj_make_new(const mp_obj_type_t *type, size_t n_arg...
  function mp_obj_t (line 89) | mp_obj_t led_obj_on(mp_obj_t self_in) {
  function mp_obj_t (line 97) | mp_obj_t led_obj_off(mp_obj_t self_in) {
  function mp_obj_t (line 105) | mp_obj_t led_obj_toggle(mp_obj_t self_in) {

FILE: unicorn/pyb_servo.c
  type pyb_servo_obj_t (line 35) | typedef struct _pyb_servo_obj_t {
  function STATIC (line 45) | STATIC void pyb_servo_print(const mp_print_t *print, mp_obj_t self_in, m...
  function STATIC (line 50) | STATIC mp_obj_t pyb_servo_make_new(const mp_obj_type_t *type, size_t n_a...
  function STATIC (line 62) | STATIC mp_obj_t pyb_servo_angle(mp_uint_t n_args, const mp_obj_t *args) {

FILE: unicorn/pyb_switch.c
  function switch_init0 (line 33) | void switch_init0(void) {
  function switch_get (line 37) | int switch_get(void) {
  type pyb_switch_obj_t (line 41) | typedef struct _pyb_switch_obj_t {
  function pyb_switch_print (line 47) | void pyb_switch_print(const mp_print_t *print, mp_obj_t self_in, mp_prin...
  function STATIC (line 51) | STATIC mp_obj_t pyb_switch_make_new(const mp_obj_type_t *type, size_t n_...
  function mp_obj_t (line 56) | mp_obj_t pyb_switch_call(mp_obj_t self_in, size_t n_args, size_t n_kw, c...
  function STATIC (line 61) | STATIC mp_obj_t switch_value(mp_obj_t self_in) {

FILE: unicorn/uart.c
  type ucp_uart_t (line 4) | typedef struct _ucp_uart_t {
  function mp_hal_stdin_rx_chr (line 12) | int mp_hal_stdin_rx_chr(void) {
  function mp_hal_stdout_tx_strn (line 19) | void mp_hal_stdout_tx_strn(const char *str, mp_uint_t len) {

FILE: unicorn/unicorn_mcu.h
  type unicorn_controller_t (line 30) | typedef struct _unicorn_controller_t {
  type gpio_t (line 42) | typedef struct _gpio_t {
  type servo_t (line 51) | typedef struct _servo_t {
  type adc_t (line 58) | typedef struct _adc_t {
  type rtc_t (line 65) | typedef struct _rtc_t {
  type i2c_t (line 72) | typedef struct _i2c_t {

FILE: www-emu/codemirror.js
  function w (line 11) | function w(a,b){if(!(this instanceof w))return new w(a,b);this.options=b...
  function x (line 11) | function x(a,b){var c=this,g=c.input=dh("textarea",null,null,"position: ...
  function y (line 11) | function y(a){a.doc.mode=w.getMode(a.options,a.doc.modeOption),z(a)}
  function z (line 11) | function z(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a...
  function A (line 11) | function A(a){a.options.lineWrapping?(lh(a.display.wrapper,"CodeMirror-w...
  function B (line 11) | function B(a){var b=Cc(a.display),c=a.options.lineWrapping,d=c&&Math.max...
  function C (line 11) | function C(a){var b=a.doc,c=B(a);b.iter(function(a){var b=c(a);b!=a.heig...
  function D (line 11) | function D(a){a.display.wrapper.className=a.display.wrapper.className.re...
  function E (line 11) | function E(a){F(a),Vc(a),setTimeout(function(){R(a)},20)}
  function F (line 11) | function F(a){var b=a.display.gutters,c=a.options.gutters;fh(b);for(var ...
  function G (line 11) | function G(a){var b=a.display.gutters.offsetWidth;a.display.sizer.style....
  function H (line 11) | function H(a){if(0==a.height)return 0;for(var c,b=a.text.length,d=a;c=ef...
  function I (line 11) | function I(a){var b=a.display,c=a.doc;b.maxLine=Xf(c,c.first),b.maxLineL...
  function J (line 11) | function J(a){var b=Ug(a.gutters,"CodeMirror-linenumbers");-1==b&&a.line...
  function K (line 11) | function K(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc...
  function L (line 11) | function L(a,b,c){this.cm=c;var f=this.vert=dh("div",[dh("div",null,null...
  function M (line 11) | function M(){}
  function N (line 11) | function N(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.disp...
  function O (line 11) | function O(a,b){b||(b=K(a));var c=a.display.barWidth,d=a.display.barHeig...
  function P (line 11) | function P(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.p...
  function Q (line 11) | function Q(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scro...
  function R (line 11) | function R(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firs...
  function S (line 11) | function S(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=T(a.optio...
  function T (line 11) | function T(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}
  function U (line 11) | function U(a){return a.scroller.getBoundingClientRect().left-a.sizer.get...
  function V (line 11) | function V(a,b,c){var d=a.display;this.viewport=b,this.visible=Q(d,a.doc...
  function W (line 11) | function W(a){var b=a.display;!b.scrollbarsClipped&&b.scroller.offsetWid...
  function X (line 11) | function X(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return Xc(a)...
  function Y (line 11) | function Y(a,b){for(var c=b.force,d=b.viewport,e=!0;;e=!1){if(e&&a.optio...
  function Z (line 11) | function Z(a,b){var c=new V(a,b);if(X(a,c)){_(a),Y(a,c);var d=K(a);Sb(a)...
  function $ (line 11) | function $(a,b){a.display.sizer.style.minHeight=a.display.heightForcer.s...
  function _ (line 11) | function _(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;f<b.view.len...
  function ab (line 11) | function ab(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets...
  function bb (line 11) | function bb(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b....
  function cb (line 11) | function cb(a,b,c){function i(b){var c=b.nextSibling;return f&&p&&a.disp...
  function db (line 11) | function db(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes...
  function eb (line 11) | function eb(a){return a.node==a.text&&(a.node=dh("div",null,null,"positi...
  function fb (line 11) | function fb(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line...
  function gb (line 11) | function gb(a,b){var c=a.display.externalMeasured;return c&&c.line==b.li...
  function hb (line 11) | function hb(a,b){var c=b.text.className,d=gb(a,b);b.text==b.node&&(b.nod...
  function ib (line 11) | function ib(a){fb(a),a.line.wrapClass?eb(a).className=a.line.wrapClass:a...
  function jb (line 11) | function jb(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=nu...
  function kb (line 11) | function kb(a,b){a.alignable&&(a.alignable=null);for(var d,c=a.node.firs...
  function lb (line 11) | function lb(a,b,c,d){var e=gb(a,b);return b.text=b.node=e.pre,e.bgClass&...
  function mb (line 11) | function mb(a,b){if(nb(a.line,a,b,!0),a.rest)for(var c=0;c<a.rest.length...
  function nb (line 11) | function nb(a,b,c,d){if(a.widgets)for(var e=eb(b),f=0,g=a.widgets;f<g.le...
  function ob (line 11) | function ob(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).pus...
  function rb (line 11) | function rb(a){return pb(a.line,a.ch)}
  function sb (line 11) | function sb(a,b){return qb(a,b)<0?b:a}
  function tb (line 11) | function tb(a,b){return qb(a,b)<0?a:b}
  function ub (line 11) | function ub(a,b){this.ranges=a,this.primIndex=b}
  function vb (line 11) | function vb(a,b){this.anchor=a,this.head=b}
  function wb (line 11) | function wb(a,b){var c=a[b];a.sort(function(a,b){return qb(a.from(),b.fr...
  function xb (line 11) | function xb(a,b){return new ub([new vb(a,b||a)],0)}
  function yb (line 11) | function yb(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}
  function zb (line 11) | function zb(a,b){if(b.line<a.first)return pb(a.first,0);var c=a.first+a....
  function Ab (line 11) | function Ab(a,b){var c=a.ch;return null==c||c>b?pb(a.line,b):0>c?pb(a.li...
  function Bb (line 11) | function Bb(a,b){return b>=a.first&&b<a.first+a.size}
  function Cb (line 11) | function Cb(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=zb(a,b[d]);return c}
  function Db (line 11) | function Db(a,b,c,d){if(a.cm&&a.cm.display.shift||a.extend){var e=b.anch...
  function Eb (line 11) | function Eb(a,b,c,d){Kb(a,new ub([Db(a,a.sel.primary(),b,c)],0),d)}
  function Fb (line 11) | function Fb(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=Db(a,...
  function Gb (line 11) | function Gb(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,Kb(a,wb(e,a.sel....
  function Hb (line 11) | function Hb(a,b,c,d){Kb(a,xb(b,c),d)}
  function Ib (line 11) | function Ib(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[...
  function Jb (line 11) | function Jb(a,b,c){var d=a.history.done,e=Sg(d);e&&e.ranges?(d[d.length-...
  function Kb (line 11) | function Kb(a,b,c){Lb(a,b,c),jg(a,a.sel,a.cm?a.cm.curOp.id:0/0,c)}
  function Lb (line 11) | function Lb(a,b,c){(Gg(a,"beforeSelectionChange")||a.cm&&Gg(a.cm,"before...
  function Mb (line 11) | function Mb(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput...
  function Nb (line 11) | function Nb(a){Mb(a,Ob(a,a.sel,null,!1),Kg)}
  function Ob (line 11) | function Ob(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges...
  function Pb (line 11) | function Pb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=X...
  function Qb (line 11) | function Qb(a){for(var b=a.display,c=a.doc,d={},e=d.cursors=document.cre...
  function Rb (line 11) | function Rb(a,b){gh(a.display.cursorDiv,b.cursors),gh(a.display.selectio...
  function Sb (line 11) | function Sb(a){Rb(a,Qb(a))}
  function Tb (line 11) | function Tb(a,b,c){var d=wc(a,b.head,"div",null,null,!a.options.singleCu...
  function Ub (line 11) | function Ub(a,b,c){function j(a,b,c,d){0>b&&(b=0),b=Math.round(b),d=Math...
  function Vb (line 11) | function Vb(a){if(a.state.focused){var b=a.display;clearInterval(b.blink...
  function Wb (line 11) | function Wb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&...
  function Xb (line 11) | function Xb(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!...
  function Yb (line 11) | function Yb(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e...
  function Zb (line 11) | function Zb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!...
  function $b (line 11) | function $b(a){return a.lineSpace.offsetTop}
  function _b (line 11) | function _b(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}
  function ac (line 11) | function ac(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=gh(a.me...
  function bc (line 11) | function bc(a){return Ig-a.display.nativeBarWidth}
  function cc (line 11) | function cc(a){return a.display.scroller.clientWidth-bc(a)-a.display.bar...
  function dc (line 11) | function dc(a){return a.display.scroller.clientHeight-bc(a)-a.display.ba...
  function ec (line 11) | function ec(a,b,c){var d=a.options.lineWrapping,e=d&&cc(a);if(!b.measure...
  function fc (line 11) | function fc(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure...
  function gc (line 11) | function gc(a,b){b=hf(b);var c=_f(b),d=a.display.externalMeasured=new Tc...
  function hc (line 11) | function hc(a,b,c,d){return kc(a,jc(a,b),c,d)}
  function ic (line 11) | function ic(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.d...
  function jc (line 11) | function jc(a,b){var c=_f(b),d=ic(a,c);d&&!d.text?d=null:d&&d.changes&&d...
  function kc (line 11) | function kc(a,b,c,d,e){b.before&&(c=-1);var g,f=c+(d||"");return b.cache...
  function mc (line 11) | function mc(a,b,c,f){for(var h,i,j,k,g=b.map,l=0;l<g.length;l+=3){var m=...
  function nc (line 11) | function nc(a,b){if(!window.screen||null==screen.logicalXDPI||screen.log...
  function oc (line 11) | function oc(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,...
  function pc (line 11) | function pc(a){a.display.externalMeasure=null,fh(a.display.lineMeasure);...
  function qc (line 11) | function qc(a){pc(a),a.display.cachedCharWidth=a.display.cachedTextHeigh...
  function rc (line 11) | function rc(){return window.pageXOffset||(document.documentElement||docu...
  function sc (line 11) | function sc(){return window.pageYOffset||(document.documentElement||docu...
  function tc (line 11) | function tc(a,b,c,d){if(b.widgets)for(var e=0;e<b.widgets.length;++e)if(...
  function uc (line 11) | function uc(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==...
  function vc (line 11) | function vc(a,b,c,d,e){return d||(d=Xf(a.doc,b.line)),tc(a,d,hc(a,d,b.ch...
  function wc (line 11) | function wc(a,b,c,d,e,f){function g(b,g){var h=kc(a,e,b,g?"right":"left"...
  function xc (line 11) | function xc(a,b){var c=0,b=zb(a.doc,b);a.options.lineWrapping||(c=Dc(a.d...
  function yc (line 11) | function yc(a,b,c,d){var e=pb(a,b);return e.xRel=d,c&&(e.outside=!0),e}
  function zc (line 11) | function zc(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return yc(...
  function Ac (line 11) | function Ac(a,b,c,d,e){function j(d){var e=wc(a,pb(c,d),"line",b,i);retu...
  function Cc (line 11) | function Cc(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(...
  function Dc (line 11) | function Dc(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b...
  function Gc (line 11) | function Gc(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,for...
  function Hc (line 12) | function Hc(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c](...
  function Ic (line 12) | function Ic(a){var b=a.curOp,c=b.ownsGroup;if(c)try{Hc(c)}finally{Ec=nul...
  function Jc (line 12) | function Jc(a){for(var b=a.ops,c=0;c<b.length;c++)Kc(b[c]);for(var c=0;c...
  function Kc (line 12) | function Kc(a){var b=a.cm,c=b.display;W(b),a.updateMaxLine&&I(b),a.mustU...
  function Lc (line 12) | function Lc(a){a.updatedDisplay=a.mustUpdate&&X(a.cm,a.update)}
  function Mc (line 12) | function Mc(a){var b=a.cm,c=b.display;a.updatedDisplay&&_(b),a.barMeasur...
  function Nc (line 12) | function Nc(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style....
  function Oc (line 12) | function Oc(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&Y(b,a...
  function Pc (line 12) | function Pc(a,b){if(a.curOp)return b();Gc(a);try{return b()}finally{Ic(a)}}
  function Qc (line 12) | function Qc(a,b){return function(){if(a.curOp)return b.apply(a,arguments...
  function Rc (line 12) | function Rc(a){return function(){if(this.curOp)return a.apply(this,argum...
  function Sc (line 12) | function Sc(a){return function(){var b=this.cm;if(!b||b.curOp)return a.a...
  function Tc (line 12) | function Tc(a,b,c){this.line=b,this.rest=jf(b),this.size=this.rest?_f(Sg...
  function Uc (line 12) | function Uc(a,b,c){for(var e,d=[],f=b;c>f;f=e){var g=new Tc(a.doc,Xf(a.d...
  function Vc (line 12) | function Vc(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a....
  function Wc (line 12) | function Wc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.ex...
  function Xc (line 12) | function Xc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display...
  function Yc (line 12) | function Yc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.view...
  function Zc (line 12) | function Zc(a,b,c,d){var f,e=Yc(a,b),g=a.display.view;if(!v||c==a.doc.fi...
  function $c (line 12) | function $c(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<...
  function _c (line 12) | function _c(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[...
  function ad (line 12) | function ad(a){a.display.pollingFast||a.display.poll.set(a.options.pollI...
  function bd (line 12) | function bd(a){function c(){var d=dd(a);d||b?(a.display.pollingFast=!1,a...
  function dd (line 12) | function dd(a){var b=a.display.input,c=a.display.prevInput,f=a.doc;if(!a...
  function ed (line 12) | function ed(a,b){if(!a.display.contextMenuPending){var c,f,g=a.doc;if(a....
  function fd (line 12) | function fd(a){"nocursor"==a.options.readOnly||o&&ih()==a.display.input|...
  function gd (line 12) | function gd(a){a.state.focused||(fd(a),Od(a))}
  function hd (line 12) | function hd(a){return a.options.readOnly||a.doc.cantEdit}
  function id (line 12) | function id(a){function c(b){Eg(a,b)||vg(b)}function g(c){if(a.something...
  function jd (line 12) | function jd(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight...
  function kd (line 12) | function kd(a,b){for(var c=wg(b);c!=a.wrapper;c=c.parentNode)if(!c||"tru...
  function ld (line 12) | function ld(a,b,c,d){var e=a.display;if(!c&&"true"==wg(b).getAttribute("...
  function md (line 12) | function md(a){if(!Eg(this,a)){var b=this,c=b.display;if(c.shift=a.shift...
  function pd (line 12) | function pd(a,b,c){setTimeout(Yg(gd,a),0);var e,d=+new Date;od&&od.time>...
  function qd (line 12) | function qd(a,b,c,g){var h=a.display,i=Qc(a,function(j){f&&(h.scroller.d...
  function rd (line 12) | function rd(a,b,c,d,e){function o(b){if(0!=qb(n,b))if(n=b,"rect"==d){for...
  function sd (line 12) | function sd(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1...
  function td (line 12) | function td(a,b){return sd(a,b,"gutterClick",!0,Cg)}
  function vd (line 12) | function vd(a){var b=this;if(!Eg(b,a)&&!kd(b.display,a)){sg(a),d&&(ud=+n...
  function wd (line 12) | function wd(a,b){if(d&&(!a.state.draggingText||+new Date-ud<100))return ...
  function xd (line 12) | function xd(b,c){Math.abs(b.doc.scrollTop-c)<2||(b.doc.scrollTop=c,a||Z(...
  function yd (line 12) | function yd(a,b,c){(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2...
  function Cd (line 12) | function Cd(b,c){var d=Bd(c),e=d.x,g=d.y,h=b.display,j=h.scroller;if(e&&...
  function Dd (line 12) | function Dd(a,b,c){if("string"==typeof b&&(b=Ae[b],!b))return!1;a.displa...
  function Ed (line 12) | function Ed(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=De(b,...
  function Gd (line 12) | function Gd(a,b,c,d){var e=a.state.keySeq;if(e){if(Ee(b))return"handled"...
  function Hd (line 12) | function Hd(a,b){var c=Fe(b,!0);return c?b.shiftKey&&!a.state.keySeq?Gd(...
  function Id (line 12) | function Id(a,b,c){return Gd(a,"'"+c+"'",b,function(b){return Dd(a,b,!0)})}
  function Kd (line 12) | function Kd(a){var b=this;if(gd(b),!Eg(b,a)){d&&11>e&&27==a.keyCode&&(a....
  function Ld (line 12) | function Ld(a){function c(a){18!=a.keyCode&&a.altKey||(kh(b,"CodeMirror-...
  function Md (line 12) | function Md(a){16==a.keyCode&&(this.doc.sel.shift=!1),Eg(this,a)}
  function Nd (line 12) | function Nd(a){var b=this;if(!(Eg(b,a)||a.ctrlKey&&!a.altKey||p&&a.metaK...
  function Od (line 12) | function Od(a){"nocursor"!=a.options.readOnly&&(a.state.focused||(Ag(a,"...
  function Pd (line 12) | function Pd(a){a.state.focused&&(Ag(a,"blur",a),a.state.focused=!1,kh(a....
  function Qd (line 12) | function Qd(a,b){function m(){if(null!=c.input.selectionStart){var b=a.s...
  function Rd (line 12) | function Rd(a,b){return Gg(a,"gutterContextMenu")?sd(a,b,"gutterContextM...
  function Td (line 12) | function Td(a,b){if(qb(a,b.from)<0)return a;if(qb(a,b.to)<=0)return Sd(b...
  function Ud (line 12) | function Ud(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel...
  function Vd (line 12) | function Vd(a,b,c){return a.line==b.line?pb(c.line,a.ch-b.ch+c.ch):pb(c....
  function Wd (line 12) | function Wd(a,b,c){for(var d=[],e=pb(a.first,0),f=e,g=0;g<b.length;g++){...
  function Xd (line 12) | function Xd(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,or...
  function Yd (line 12) | function Yd(a,b,c){if(a.cm){if(!a.cm.curOp)return Qc(a.cm,Yd)(a,b,c);if(...
  function Zd (line 12) | function Zd(a,b){if(1!=b.text.length||""!=b.text[0]||0!=qb(b.from,b.to))...
  function $d (line 12) | function $d(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.hi...
  function _d (line 12) | function _d(a,b){if(0!=b&&(a.first+=b,a.sel=new ub(Vg(a.sel.ranges,funct...
  function ae (line 12) | function ae(a,b,c,d){if(a.cm&&!a.cm.curOp)return Qc(a.cm,ae)(a,b,c,d);if...
  function be (line 12) | function be(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line...
  function ce (line 12) | function ce(a,b,c,d,e){if(d||(d=c),qb(d,c)<0){var f=d;d=c,c=f}"string"==...
  function de (line 12) | function de(a,b){if(!Eg(a,"scrollCursorIntoView")){var c=a.display,d=c.s...
  function ee (line 12) | function ee(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=wc(a...
  function fe (line 12) | function fe(a,b,c,d,e){var f=ge(a,b,c,d,e);null!=f.scrollTop&&xd(a,f.scr...
  function ge (line 12) | function ge(a,b,c,d,e){var f=a.display,g=Cc(a.display);0>c&&(c=0);var h=...
  function he (line 12) | function he(a,b,c){(null!=b||null!=c)&&je(a),null!=b&&(a.curOp.scrollLef...
  function ie (line 12) | function ie(a){je(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping|...
  function je (line 12) | function je(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;...
  function ke (line 12) | function ke(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mod...
  function le (line 12) | function le(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=Xf(a,yb(a,b)...
  function me (line 12) | function me(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for...
  function ne (line 12) | function ne(a,b,c,d,e){function k(){var b=f+c;return b<a.first||b>=a.fir...
  function oe (line 12) | function oe(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min...
  function re (line 12) | function re(a,b,c,d){w.defaults[a]=b,c&&(qe[a]=d?function(a,b,d){d!=se&&...
  function Ce (line 12) | function Ce(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g...
  function Ge (line 12) | function Ge(a){return"string"==typeof a?Be[a]:a}
  function Ke (line 12) | function Ke(a,b,c,d,e){if(d&&d.shared)return Me(a,b,c,d,e);if(a.cm&&!a.c...
  function Me (line 13) | function Me(a,b,c,d,e){d=Xg(d),d.shared=!1;var f=[Ke(a,b,c,d,e)],g=f[0],...
  function Ne (line 13) | function Ne(a){return a.findMarks(pb(a.first,0),a.clipPos(pb(a.lastLine(...
  function Oe (line 13) | function Oe(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.c...
  function Pe (line 13) | function Pe(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];...
  function Qe (line 13) | function Qe(a,b,c){this.marker=a,this.from=b,this.to=c}
  function Re (line 13) | function Re(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker...
  function Se (line 13) | function Se(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(...
  function Te (line 13) | function Te(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[...
  function Ue (line 13) | function Ue(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.mar...
  function Ve (line 13) | function Ve(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.mar...
  function We (line 13) | function We(a,b){var c=Bb(a,b.from.line)&&Xf(a,b.from.line).markedSpans,...
  function Xe (line 13) | function Xe(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.fr...
  function Ye (line 13) | function Ye(a,b){var c=ng(a,b),d=We(a,b);if(!c)return d;if(!d)return c;f...
  function Ze (line 13) | function Ze(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a...
  function $e (line 13) | function $e(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c]...
  function _e (line 13) | function _e(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine...
  function af (line 13) | function af(a){return a.inclusiveLeft?-1:0}
  function bf (line 13) | function bf(a){return a.inclusiveRight?1:0}
  function cf (line 13) | function cf(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;va...
  function df (line 13) | function df(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;f<c.length;...
  function ef (line 13) | function ef(a){return df(a,!0)}
  function ff (line 13) | function ff(a){return df(a,!1)}
  function gf (line 13) | function gf(a,b,c,d,e){var f=Xf(a,b),g=v&&f.markedSpans;if(g)for(var h=0...
  function hf (line 13) | function hf(a){for(var b;b=ef(a);)a=b.find(-1,!0).line;return a}
  function jf (line 13) | function jf(a){for(var b,c;b=ff(a);)a=b.find(1,!0).line,(c||(c=[])).push...
  function kf (line 13) | function kf(a,b){var c=Xf(a,b),d=hf(c);return c==d?b:_f(d)}
  function lf (line 13) | function lf(a,b){if(b>a.lastLine())return b;var d,c=Xf(a,b);if(!mf(a,c))...
  function mf (line 13) | function mf(a,b){var c=v&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++...
  function nf (line 13) | function nf(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return nf(a,...
  function pf (line 13) | function pf(a,b,c){bg(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&...
  function qf (line 13) | function qf(a){if(null!=a.height)return a.height;if(!hh(document.body,a....
  function rf (line 13) | function rf(a,b,c,d){var e=new of(a,c,d);return e.noHScroll&&(a.display....
  function tf (line 13) | function tf(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles...
  function uf (line 13) | function uf(a){a.parent=null,$e(a)}
  function vf (line 13) | function vf(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)...
  function wf (line 13) | function wf(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){va...
  function xf (line 13) | function xf(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=w.innerMode(a,c).mod...
  function yf (line 13) | function yf(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string...
  function zf (line 13) | function zf(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.fl...
  function Af (line 13) | function Af(a,b,c,d){var e=[a.state.modeGen],f={};zf(a,b.text,a.doc.mode...
  function Bf (line 13) | function Bf(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=Af(...
  function Cf (line 13) | function Cf(a,b,c,d){var e=a.doc.mode,f=new He(b,a.options.tabSize);for(...
  function Ff (line 13) | function Ff(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass...
  function Gf (line 13) | function Gf(a,b){var c=dh("span",null,null,f?"padding-right: .1px":null)...
  function Hf (line 13) | function Hf(a){var b=dh("span","\u2022","cm-invalidchar");return b.title...
  function If (line 13) | function If(a,b,c,f,g,h,i){if(b){var j=a.cm.options.specialChars,k=!1;if...
  function Jf (line 13) | function Jf(a){function b(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?"...
  function Kf (line 13) | function Kf(a,b){return function(c,d,e,f,g,h){e=e?e+" cm-force-border":"...
  function Lf (line 13) | function Lf(a,b,c,d){var e=!d&&c.widgetNode;e&&(a.map.push(a.pos,a.pos+b...
  function Mf (line 13) | function Mf(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o...
  function Nf (line 13) | function Nf(a,b){return 0==b.from.ch&&0==b.to.ch&&""==Sg(b.text)&&(!a.cm...
  function Of (line 13) | function Of(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){...
  function Pf (line 13) | function Pf(a){this.lines=a,this.parent=null;for(var b=0,c=0;b<a.length;...
  function Qf (line 13) | function Qf(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e...
  function Vf (line 13) | function Vf(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked....
  function Wf (line 13) | function Wf(a,b){if(b.cm)throw new Error("This document is already in us...
  function Xf (line 13) | function Xf(a,b){if(b-=a.first,0>b||b>=a.size)throw new Error("There is ...
  function Yf (line 13) | function Yf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,funct...
  function Zf (line 13) | function Zf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)...
  function $f (line 13) | function $f(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height...
  function _f (line 13) | function _f(a){if(null==a.parent)return null;for(var b=a.parent,c=Ug(b.l...
  function ag (line 13) | function ag(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d)...
  function bg (line 13) | function bg(a){a=hf(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){...
  function cg (line 13) | function cg(a){var b=a.order;return null==b&&(b=a.order=Qh(a.text)),b}
  function dg (line 13) | function dg(a){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastM...
  function eg (line 13) | function eg(a,b){var c={from:rb(b.from),to:Sd(b),text:Yf(a,b.from,b.to)}...
  function fg (line 13) | function fg(a){for(;a.length;){var b=Sg(a);if(!b.ranges)break;a.pop()}}
  function gg (line 13) | function gg(a,b){return b?(fg(a.done),Sg(a.done)):a.done.length&&!Sg(a.d...
  function hg (line 13) | function hg(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date...
  function ig (line 13) | function ig(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.le...
  function jg (line 13) | function jg(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e....
  function kg (line 13) | function kg(a,b){var c=Sg(b);c&&c.ranges&&c.equals(a)||b.push(a)}
  function lg (line 13) | function lg(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,...
  function mg (line 13) | function mg(a){if(!a)return null;for(var c,b=0;b<a.length;++b)a[b].marke...
  function ng (line 13) | function ng(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=...
  function og (line 13) | function og(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.rang...
  function pg (line 13) | function pg(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}
  function qg (line 13) | function qg(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ra...
  function rg (line 13) | function rg(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;q...
  function ug (line 13) | function ug(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.r...
  function wg (line 13) | function wg(a){return a.target||a.srcElement}
  function xg (line 13) | function xg(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?...
  function Cg (line 13) | function Cg(a,b){function f(a){return function(){a.apply(null,d)}}var c=...
  function Dg (line 13) | function Dg(){var a=Bg;Bg=null;for(var b=0;b<a.length;++b)a[b]()}
  function Eg (line 13) | function Eg(a,b,c){return"string"==typeof b&&(b={type:b,preventDefault:f...
  function Fg (line 13) | function Fg(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(va...
  function Gg (line 13) | function Gg(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}
  function Hg (line 13) | function Hg(a){a.prototype.on=function(a,b){yg(this,a,b)},a.prototype.of...
  function Ng (line 13) | function Ng(){this.id=null}
  function Pg (line 13) | function Pg(a,b,c){for(var d=0,e=0;;){var f=a.indexOf("	",d);-1==f&&(f=a...
  function Rg (line 13) | function Rg(a){for(;Qg.length<=a;)Qg.push(Sg(Qg)+" ");return Qg[a]}
  function Sg (line 13) | function Sg(a){return a[a.length-1]}
  function Ug (line 13) | function Ug(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}
  function Vg (line 13) | function Vg(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}
  function Wg (line 13) | function Wg(a,b){var c;if(Object.create)c=Object.create(a);else{var d=fu...
  function Xg (line 13) | function Xg(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||c===!1...
  function Yg (line 13) | function Yg(a){var b=Array.prototype.slice.call(arguments,1);return func...
  function _g (line 13) | function _g(a,b){return b?b.source.indexOf("\\w")>-1&&$g(a)?!0:b.test(a)...
  function ah (line 13) | function ah(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;retu...
  function ch (line 13) | function ch(a){return a.charCodeAt(0)>=768&&bh.test(a)}
  function dh (line 13) | function dh(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=...
  function fh (line 13) | function fh(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.fir...
  function gh (line 13) | function gh(a,b){return fh(a).appendChild(b)}
  function hh (line 13) | function hh(a,b){if(a.contains)return a.contains(b);for(;b=b.parentNode;...
  function ih (line 13) | function ih(){return document.activeElement}
  function jh (line 13) | function jh(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}
  function mh (line 13) | function mh(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!jh(c[d...
  function nh (line 13) | function nh(a){if(document.body.getElementsByClassName)for(var b=documen...
  function ph (line 13) | function ph(){oh||(qh(),oh=!0)}
  function qh (line 13) | function qh(){var a;yg(window,"resize",function(){null==a&&(a=setTimeout...
  function th (line 13) | function th(a){if(null==sh){var b=dh("span","\u200b");gh(a,dh("span",[b,...
  function vh (line 13) | function vh(a){if(null!=uh)return uh;var b=gh(a,document.createTextNode(...
  function Ah (line 13) | function Ah(a){if(null!=zh)return zh;var b=gh(a,dh("span","x")),c=b.getB...
  function Ch (line 13) | function Ch(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.leng...
  function Dh (line 13) | function Dh(a){return a.level%2?a.to:a.from}
  function Eh (line 13) | function Eh(a){return a.level%2?a.from:a.to}
  function Fh (line 13) | function Fh(a){var b=cg(a);return b?Dh(b[0]):0}
  function Gh (line 13) | function Gh(a){var b=cg(a);return b?Eh(Sg(b)):a.text.length}
  function Hh (line 13) | function Hh(a,b){var c=Xf(a.doc,b),d=hf(c);d!=c&&(b=_f(d));var e=cg(d),f...
  function Ih (line 13) | function Ih(a,b){for(var c,d=Xf(a.doc,b);c=ff(d);)d=c.find(1,!0).line,b=...
  function Jh (line 13) | function Jh(a,b){var c=Hh(a,b.line),d=Xf(a.doc,c.line),e=cg(d);if(!e||0=...
  function Kh (line 13) | function Kh(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}
  function Mh (line 13) | function Mh(a,b){Lh=null;for(var d,c=0;c<a.length;++c){var e=a[c];if(e.f...
  function Nh (line 13) | function Nh(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&ch(a.text.charA...
  function Oh (line 13) | function Oh(a,b,c,d){var e=cg(a);if(!e)return Ph(a,b,c,d);for(var f=Mh(e...
  function Ph (line 13) | function Ph(a,b,c,d){var e=b+c;if(d)for(;e>0&&ch(a.text.charAt(e));)e+=c...
  function d (line 14) | function d(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}
  function d (line 14) | function d(){a.value=i.getValue()}
  function c (line 15) | function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&17...
  function j (line 15) | function j(a,b,c){this.level=a,this.from=b,this.to=c}
  function b (line 15) | function b(a){return new RegExp("^(("+a.join(")|(")+"))\\b")}
  function h (line 15) | function h(a){return a.scopes[a.scopes.length-1]}
  function x (line 15) | function x(a,b){if(a.sol()&&"py"==h(b).type){var c=h(b).offset;if(a.eatS...
  function y (line 15) | function y(a,b){if(a.eatSpace())return null;var d=a.peek();if("#"==d)ret...
  function z (line 15) | function z(a){function d(d,e){for(;!d.eol();)if(d.eatWhile(/[^'"\\]/),d....
  function A (line 15) | function A(a,b,c){var d=0,e=null;if("py"==c)for(;"py"!=h(b).type;)b.scop...
  function B (line 15) | function B(a,b){for(var c=a.indentation();h(b).offset>c;){if("py"!=h(b)....
  function C (line 15) | function C(a,b){var c=b.tokenize(a,b),d=a.current();if("."==d)return c=a...

FILE: www-emu/features_demos.py
  function asm_add (line 12) | def asm_add(r0, r1):

FILE: www-emu/mp_unicorn.js
  class I2C (line 48) | class I2C {
    method constructor (line 49) | constructor(address, scl, sda) {
    method write (line 65) | write(val) {
    method read (line 114) | read(GPIO, pins) {
    method process (line 122) | process() {
  class LCD (line 126) | class LCD extends I2C {
    method process (line 127) | process() {
  function write_to_i2c_devices (line 150) | function write_to_i2c_devices(pins) {
  function set_pin (line 157) | function set_pin(pins, pin_no, val) {
  function hard_i2c_write (line 165) | function hard_i2c_write(scl, sda) {
  function extract_pin (line 173) | function extract_pin(pins, n) {
  function X (line 177) | function X(n) {
  function Y (line 181) | function Y(n) {
  function int_to_bytes (line 185) | function int_to_bytes(n) {
  function hook_read (line 189) | function hook_read(handle, type, addr_lo, addr_hi, size,  value_lo, valu...
  function hook_write (line 244) | function hook_write(handle, type, addr_lo, addr_hi, size,  value_lo, val...
  function start (line 313) | function start() {
  function continue_start (line 340) | function continue_start() {
  function execute (line 373) | function execute() {
  function inject (line 390) | function inject(data) {
  function reset_emu (line 415) | function reset_emu() {
  function set_demos (line 442) | function set_demos() {
  function set_LEDs (line 466) | function set_LEDs() {
  function set_editor_height (line 473) | function set_editor_height(){
  function rotate_servo (line 494) | function rotate_servo() {

FILE: www-emu/pyboard_demos.py
  function asm_add (line 15) | def asm_add(r0, r1):
  class Entity (line 185) | class Entity:
    method __init__ (line 186) | def __init__(self, x, y, w, h, vx, vy):
    method draw (line 194) | def draw(self, fbuf):
  class Ball (line 197) | class Ball(Entity):
    method update (line 198) | def update(self, dt, player):
  class Player (line 224) | class Player(Entity):
Condensed preview — 39 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (262K chars).
[
  {
    "path": ".gitignore",
    "chars": 73,
    "preview": "# Build directories\n######################\nwww-emu/build\nunicorn/build_*\n"
  },
  {
    "path": ".gitmodules",
    "chars": 96,
    "preview": "[submodule \"micropython\"]\n\tpath = micropython\n\turl = https://github.com/micropython/micropython\n"
  },
  {
    "path": "LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2017 Damien P. George\n\nPermission is hereby granted, free of charge, to any person "
  },
  {
    "path": "README.md",
    "chars": 1209,
    "preview": "MicroPython on Unicorn\n======================\n\nThis repository contains an implementation of a virtual microcontroller b"
  },
  {
    "path": "unicorn/Makefile",
    "chars": 2364,
    "preview": "# Select the configuration to build with, defaulting to \"minimal\"\nCONFIG ?= minimal\nifeq ($(wildcard mpconfigport_$(CONF"
  },
  {
    "path": "unicorn/help.c",
    "chars": 1828,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/machine_i2c.c",
    "chars": 3915,
    "preview": "#include <stdio.h>\n#include <string.h>\n\n#include \"py/runtime.h\"\n#include \"py/mphal.h\"\n#include \"py/mperrno.h\"\n#include \""
  },
  {
    "path": "unicorn/machine_pin.c",
    "chars": 6198,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/main.c",
    "chars": 6100,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/modmachine.c",
    "chars": 2277,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/modmachine.h",
    "chars": 1665,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/modpyb.c",
    "chars": 1906,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/modpyb.h",
    "chars": 1670,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/modutime.c",
    "chars": 2498,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/mpconfigport.h",
    "chars": 2160,
    "preview": "#include <stdint.h>\n\n// options to control how Micro Python is built\n\n#define MICROPY_QSTR_BYTES_IN_HASH  (1)\n#define MI"
  },
  {
    "path": "unicorn/mpconfigport_features.h",
    "chars": 1433,
    "preview": "#define MICROPY_EMIT_THUMB                  (1)\n#define MICROPY_EMIT_INLINE_THUMB           (1)\n#define MICROPY_COMP_CON"
  },
  {
    "path": "unicorn/mpconfigport_minimal.h",
    "chars": 921,
    "preview": "#define MICROPY_COMP_CONST                  (0)\n#define MICROPY_COMP_DOUBLE_TUPLE_ASSIGN    (0)\n#define MICROPY_ERROR_RE"
  },
  {
    "path": "unicorn/mpconfigport_pyboard.h",
    "chars": 2330,
    "preview": "#define MICROPY_EMIT_THUMB                  (1)\n#define MICROPY_EMIT_INLINE_THUMB           (1)\n#define MICROPY_COMP_CON"
  },
  {
    "path": "unicorn/mphalport.c",
    "chars": 1912,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/mphalport.h",
    "chars": 842,
    "preview": "#include \"py/obj.h\"\n#include \"modmachine.h\"\n\nvoid mp_hal_delay_ms(mp_uint_t ms);\nvoid mp_hal_delay_us(mp_uint_t us);\nmp_"
  },
  {
    "path": "unicorn/pyb_adc.c",
    "chars": 3806,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/pyb_led.c",
    "chars": 3928,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/pyb_servo.c",
    "chars": 3103,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/pyb_switch.c",
    "chars": 2756,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "unicorn/qstrdefsport.h",
    "chars": 31,
    "preview": "// qstrs specific to this port\n"
  },
  {
    "path": "unicorn/uart.c",
    "chars": 456,
    "preview": "#include <unistd.h>\n#include \"py/mpconfig.h\"\n\ntypedef struct _ucp_uart_t {\n    volatile uint32_t TXR;\n    volatile uint3"
  },
  {
    "path": "unicorn/unicorn.ld",
    "chars": 2174,
    "preview": "/*\n    GNU linker script for unicorn\n*/\n\n/* Specify the memory areas */\nMEMORY\n{\n    FLASH (rx)      : ORIGIN = 0x080000"
  },
  {
    "path": "unicorn/unicorn_mcu.h",
    "chars": 2389,
    "preview": "/*\n * This file is part of the MicroPython project, http://micropython.org/\n *\n * The MIT License (MIT)\n *\n * Copyright "
  },
  {
    "path": "www-emu/Makefile",
    "chars": 3301,
    "preview": "BUILD = build\nUNICORN_BUILDS = ../unicorn/build_\nIMAGES = images\n\nDEMO_GEN = demo_gen.py\n\nINDEX = index.html\nMP_UNICORN_"
  },
  {
    "path": "www-emu/codemirror.css",
    "chars": 7422,
    "preview": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace"
  },
  {
    "path": "www-emu/codemirror.js",
    "chars": 143989,
    "preview": "/* CodeMirror - Minified & Bundled\n   Generated on 27/12/2014 with http://codemirror.net/doc/compress.html\n   Version: H"
  },
  {
    "path": "www-emu/demo_gen.py",
    "chars": 1234,
    "preview": "import sys\nimport os\n\noutfile = open('demo_scripts.js', 'w')\nfor filename in os.listdir():\n    if filename[-9:] == '_dem"
  },
  {
    "path": "www-emu/features_demos.py",
    "chars": 218,
    "preview": "# HELLO WORLD!\n# hello world!\nprint('hello world')\n#####\n# BIG INTEGER\n# bignum\nprint(1 << 1000)\n#####\n# ASSEMBLY\n# inli"
  },
  {
    "path": "www-emu/fit.js",
    "chars": 2942,
    "preview": "/**\n * Fit terminal columns and rows to the dimensions of its DOM element.\n *\n * ## Approach\n * - Rows: Truncate the div"
  },
  {
    "path": "www-emu/index.html",
    "chars": 7047,
    "preview": "<!DOCTYPE html>\n  <html>\n    <head>\n      <title>MicroPython on Unicorn</title>\n      <link rel=\"stylesheet\" href=\"xterm"
  },
  {
    "path": "www-emu/minimal_demos.py",
    "chars": 51,
    "preview": "# HELLO WORLD!\n# hello world!\nprint('hello world')\n"
  },
  {
    "path": "www-emu/mp_unicorn.css",
    "chars": 3612,
    "preview": "body {\n  font-size: 11pt;\n  font-family: 'Open Sans';\n  margin: 0 0 0 0;\n  line-height: 200%;\n}\n\np {\n  display: inline-b"
  },
  {
    "path": "www-emu/mp_unicorn.js",
    "chars": 16521,
    "preview": "var FLASH_ADDRESS = 0x08000000;\nvar FLASH_SIZE = 0x100000;\nvar RAM_ADDRESS = 0x20000000;\nvar MAX_RAM_SIZE = 0x40000;\nvar"
  },
  {
    "path": "www-emu/pyboard_demos.py",
    "chars": 5394,
    "preview": "# HELLO WORLD!\n# hello world!\n\nprint('hello world')\n#####\n# BIG INTEGER\n# bignum\n\nprint(1 << 1000)\n#####\n# ASSEMBLY\n# in"
  }
]

About this extraction

This page contains the full source code of the micropython/micropython-unicorn GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 39 files (246.9 KB), approximately 81.7k tokens, and a symbol index with 438 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!