diff --git a/deps/flecs.c b/deps/flecs.c index fd3ab66..51e64fe 100644 --- a/deps/flecs.c +++ b/deps/flecs.c @@ -4557,6 +4557,9 @@ typedef enum ecs_script_token_kind_t { EcsTokKeywordTemplate = 122, EcsTokKeywordProp = 130, EcsTokKeywordConst = 131, + EcsTokKeywordMatch = 132, + EcsTokAddAssign = 133, + EcsTokMulAssign = 134, } ecs_script_token_kind_t; typedef struct ecs_script_token_t { @@ -4970,7 +4973,8 @@ typedef enum ecs_expr_node_kind_t { EcsExprElement, EcsExprComponent, EcsExprCast, - EcsExprCastNumber + EcsExprCastNumber, + EcsExprMatch } ecs_expr_node_kind_t; struct ecs_expr_node_t { @@ -4999,6 +5003,7 @@ typedef struct ecs_expr_initializer_element_t { const char *member; ecs_expr_node_t *value; uintptr_t offset; + ecs_script_token_kind_t operator; } ecs_expr_initializer_element_t; typedef struct ecs_expr_initializer_t { @@ -5009,12 +5014,6 @@ typedef struct ecs_expr_initializer_t { bool is_dynamic; } ecs_expr_initializer_t; -typedef struct ecs_expr_identifier_t { - ecs_expr_node_t node; - const char *value; - ecs_expr_node_t *expr; -} ecs_expr_identifier_t; - typedef struct ecs_expr_variable_t { ecs_expr_node_t node; const char *name; @@ -5022,6 +5021,12 @@ typedef struct ecs_expr_variable_t { int32_t sp; /* For fast variable lookups */ } ecs_expr_variable_t; +typedef struct ecs_expr_identifier_t { + ecs_expr_node_t node; + const char *value; + ecs_expr_node_t *expr; +} ecs_expr_identifier_t; + typedef struct ecs_expr_unary_t { ecs_expr_node_t node; ecs_expr_node_t *expr; @@ -5068,6 +5073,18 @@ typedef struct ecs_expr_cast_t { ecs_expr_node_t *expr; } ecs_expr_cast_t; +typedef struct ecs_expr_match_element_t { + ecs_expr_node_t *compare; + ecs_expr_node_t *expr; +} ecs_expr_match_element_t; + +typedef struct ecs_expr_match_t { + ecs_expr_node_t node; + ecs_expr_node_t *expr; + ecs_vec_t elements; + ecs_expr_match_element_t any; +} ecs_expr_match_t; + ecs_expr_value_node_t* flecs_expr_value_from( ecs_script_t *script, ecs_expr_node_t *node, @@ -5132,6 +5149,9 @@ ecs_expr_function_t* flecs_expr_function( ecs_expr_element_t* flecs_expr_element( ecs_script_parser_t *parser); +ecs_expr_match_t* flecs_expr_match( + ecs_script_parser_t *parser); + ecs_expr_cast_t* flecs_expr_cast( ecs_script_t *script, ecs_expr_node_t *node, @@ -5236,97 +5256,6 @@ bool flecs_expr_is_type_integer( bool flecs_expr_is_type_number( ecs_entity_t type); -#define ECS_VALUE_GET(value, T) (*(T*)(value)->ptr) - -#define ECS_BOP(left, right, result, op, R, T)\ - ECS_VALUE_GET(result, R) = (R)(ECS_VALUE_GET(left, T) op ECS_VALUE_GET(right, T)) - -#define ECS_BOP_COND(left, right, result, op, R, T)\ - ECS_VALUE_GET(result, ecs_bool_t) = ECS_VALUE_GET(left, T) op ECS_VALUE_GET(right, T) - -/* Unsigned operations */ -#define ECS_BINARY_UINT_OPS(left, right, result, op, OP)\ - if ((left)->type == ecs_id(ecs_u64_t)) { \ - OP(left, right, result, op, ecs_u64_t, ecs_u64_t);\ - } else if ((left)->type == ecs_id(ecs_u32_t)) { \ - OP(left, right, result, op, ecs_u32_t, ecs_u32_t);\ - } else if ((left)->type == ecs_id(ecs_u16_t)) { \ - OP(left, right, result, op, ecs_u16_t, ecs_u16_t);\ - } else if ((left)->type == ecs_id(ecs_u8_t)) { \ - OP(left, right, result, op, ecs_u8_t, ecs_u8_t);\ - } - -/* Unsigned + signed operations */ -#define ECS_BINARY_INT_OPS(left, right, result, op, OP)\ - ECS_BINARY_UINT_OPS(left, right, result, op, OP)\ - else if ((left)->type == ecs_id(ecs_i64_t)) { \ - OP(left, right, result, op, ecs_i64_t, ecs_i64_t);\ - } else if ((left)->type == ecs_id(ecs_i32_t)) { \ - OP(left, right, result, op, ecs_i32_t, ecs_i32_t);\ - } else if ((left)->type == ecs_id(ecs_i16_t)) { \ - OP(left, right, result, op, ecs_i16_t, ecs_i16_t);\ - } else if ((left)->type == ecs_id(ecs_i8_t)) { \ - OP(left, right, result, op, ecs_i8_t, ecs_i8_t);\ - } - -/* Unsigned + signed + floating point operations */ -#define ECS_BINARY_NUMBER_OPS(left, right, result, op, OP)\ - ECS_BINARY_INT_OPS(left, right, result, op, OP)\ - else if ((left)->type == ecs_id(ecs_f64_t)) { \ - OP(left, right, result, op, ecs_f64_t, ecs_f64_t);\ - } else if ((left)->type == ecs_id(ecs_f32_t)) { \ - OP(left, right, result, op, ecs_f32_t, ecs_f32_t);\ - } - - -/* Combinations + error checking */ - -#define ECS_BINARY_INT_OP(left, right, result, op)\ - ECS_BINARY_INT_OPS(left, right, result, op, ECS_BOP) else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - -#define ECS_BINARY_UINT_OP(left, right, result, op)\ - ECS_BINARY_UINT_OPS(left, right, result, op, ECS_BOP) else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - -#define ECS_BINARY_OP(left, right, result, op)\ - ECS_BINARY_NUMBER_OPS(left, right, result, op, ECS_BOP) else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - -#define ECS_BINARY_COND_EQ_OP(left, right, result, op)\ - ECS_BINARY_INT_OPS(left, right, result, op, ECS_BOP_COND)\ - else if ((left)->type == ecs_id(ecs_char_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_char_t);\ - } else if ((left)->type == ecs_id(ecs_u8_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_u8_t);\ - } else if ((left)->type == ecs_id(ecs_bool_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ - } else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - -#define ECS_BINARY_COND_OP(left, right, result, op)\ - ECS_BINARY_NUMBER_OPS(left, right, result, op, ECS_BOP_COND)\ - else if ((left)->type == ecs_id(ecs_char_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_char_t);\ - } else if ((left)->type == ecs_id(ecs_u8_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_u8_t);\ - } else if ((left)->type == ecs_id(ecs_bool_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ - } else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - -#define ECS_BINARY_BOOL_OP(left, right, result, op)\ - if ((left)->type == ecs_id(ecs_bool_t)) { \ - ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ - } else {\ - ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ - } - #endif /** @@ -20611,11 +20540,7 @@ void ecs_run_aperiodic( int32_t ecs_delete_empty_tables( ecs_world_t *world, - ecs_id_t id, - uint16_t clear_generation, - uint16_t delete_generation, - int32_t min_id_count, - double time_budget_seconds) + const ecs_delete_empty_tables_desc_t *desc) { flecs_poly_assert(world, ecs_world_t); @@ -20625,6 +20550,12 @@ int32_t ecs_delete_empty_tables( int32_t delete_count = 0; bool time_budget = false; + ecs_id_t id = desc->id; + uint16_t clear_generation = desc->clear_generation; + uint16_t delete_generation = desc->delete_generation; + int32_t min_id_count = desc->min_id_count; + double time_budget_seconds = desc->time_budget_seconds; + if (ECS_NEQZERO(time_budget_seconds) || (ecs_should_log_1() && ecs_os_has_time())) { ecs_time_measure(&start); } @@ -21610,12 +21541,13 @@ static ecs_app_desc_t ecs_app_desc; ecs_http_server_t *flecs_wasm_rest_server = NULL; EMSCRIPTEN_KEEPALIVE -char* flecs_explorer_request(const char *method, char *request) { +char* flecs_explorer_request(const char *method, char *request, char *body) { ecs_assert(flecs_wasm_rest_server != NULL, ECS_INVALID_OPERATION, "wasm REST server is not initialized yet"); ecs_http_reply_t reply = ECS_HTTP_REPLY_INIT; - ecs_http_server_request(flecs_wasm_rest_server, method, request, &reply); + ecs_http_server_request( + flecs_wasm_rest_server, method, request, body, &reply); if (reply.code == 200) { return ecs_strbuf_get(&reply.body); } else { @@ -22557,7 +22489,7 @@ typedef int ecs_http_socket_t; #define ECS_HTTP_MIN_STATS_INTERVAL (10 * 1000) /* Receive buffer size */ -#define ECS_HTTP_SEND_RECV_BUFFER_SIZE (16 * 1024) +#define ECS_HTTP_SEND_RECV_BUFFER_SIZE (64 * 1024) /* Max length of request (path + query + headers + body) */ #define ECS_HTTP_REQUEST_LEN_MAX (10 * 1024 * 1024) @@ -23277,7 +23209,7 @@ bool http_parse_request( frag->state = HttpFragStateCRLF; } else { frag->state = HttpFragStateHeaderStart; - } + } break; case HttpFragStateCRLF: if (c == '\r') { @@ -23520,13 +23452,15 @@ void http_recv_connection( ecs_http_socket_t sock) { ecs_size_t bytes_read; - char recv_buf[ECS_HTTP_SEND_RECV_BUFFER_SIZE]; + char *recv_buf = ecs_os_malloc(ECS_HTTP_SEND_RECV_BUFFER_SIZE); ecs_http_fragment_t frag = {0}; int32_t retries = 0; + ecs_os_sleep(0, 10 * 1000 * 1000); + do { if ((bytes_read = http_recv( - sock, recv_buf, ECS_SIZEOF(recv_buf), 0)) > 0) + sock, recv_buf, ECS_HTTP_SEND_RECV_BUFFER_SIZE, 0)) > 0) { bool is_alive = conn->pub.id == conn_id; if (!is_alive) { @@ -23571,11 +23505,17 @@ void http_recv_connection( ecs_os_sleep(0, 10 * 1000 * 1000); } while ((bytes_read == -1) && (++retries < ECS_HTTP_REQUEST_RECV_RETRY)); + if (bytes_read == ECS_HTTP_SEND_RECV_BUFFER_SIZE) { + ecs_warn("request exceeded receive buffer size (%d)", + ECS_HTTP_SEND_RECV_BUFFER_SIZE); + } + if (retries == ECS_HTTP_REQUEST_RECV_RETRY) { http_close(&sock); } done: + ecs_os_free(recv_buf); ecs_strbuf_reset(&frag.buf); } @@ -23802,7 +23742,6 @@ void http_do_request( if (srv->callback(ECS_CONST_CAST(ecs_http_request_t*, req), reply, srv->ctx) == false) { - reply->code = 404; reply->status = "Resource not found"; ecs_os_linc(&ecs_http_request_not_handled_count); } else { @@ -24182,25 +24121,52 @@ int ecs_http_server_request( ecs_http_server_t* srv, const char *method, const char *req, + const char *body, ecs_http_reply_t *reply_out) { - const char *http_ver = " HTTP/1.1\r\n\r\n"; + ecs_check(srv != NULL, ECS_INVALID_PARAMETER, NULL); + ecs_check(method != NULL, ECS_INVALID_PARAMETER, NULL); + ecs_check(req != NULL, ECS_INVALID_PARAMETER, NULL); + ecs_check(reply_out != NULL, ECS_INVALID_PARAMETER, NULL); + + const char *http_ver = " HTTP/1.1\r\n"; int32_t method_len = ecs_os_strlen(method); int32_t req_len = ecs_os_strlen(req); + int32_t body_len = body ? ecs_os_strlen(body) : 0; int32_t http_ver_len = ecs_os_strlen(http_ver); char reqbuf[1024], *reqstr = reqbuf; + char content_length[32] = {0}; + + if (body_len) { + ecs_os_snprintf(content_length, 32, + "Content-Length: %d\r\n\r\n", body_len); + } - int32_t len = method_len + req_len + http_ver_len + 1; - if (method_len + req_len + http_ver_len >= 1024) { - reqstr = ecs_os_malloc(len + 1); + int32_t content_length_len = ecs_os_strlen(content_length); + + int32_t len = method_len + req_len + content_length_len + body_len + + http_ver_len; + if (len >= 1024) { + reqstr = ecs_os_malloc(len); } + len += 3; + char *ptr = reqstr; ecs_os_memcpy(ptr, method, method_len); ptr += method_len; ptr[0] = ' '; ptr ++; ecs_os_memcpy(ptr, req, req_len); ptr += req_len; ecs_os_memcpy(ptr, http_ver, http_ver_len); ptr += http_ver_len; - ptr[0] = '\n'; + + if (body) { + ecs_os_memcpy(ptr, content_length, content_length_len); + ptr += content_length_len; + ecs_os_memcpy(ptr, body, body_len); + ptr += body_len; + } + + ptr[0] = '\r'; + ptr[1] = '\n'; int result = ecs_http_server_http_request(srv, reqstr, len, reply_out); if (reqbuf != reqstr) { @@ -24208,6 +24174,8 @@ int ecs_http_server_request( } return result; +error: + return -1; } void* ecs_http_server_ctx( @@ -24578,12 +24546,14 @@ void ecs_log_pop_( } } -void ecs_parser_errorv_( +static +void flecs_parser_errorv( const char *name, const char *expr, int64_t column_arg, const char *fmt, - va_list args) + va_list args, + bool is_warning) { if (column_arg > 65536) { /* Limit column size, which prevents the code from throwing up when the @@ -24659,11 +24629,35 @@ void ecs_parser_errorv_( } char *msg = ecs_strbuf_get(&msg_buf); - ecs_os_err(name, 0, msg); + if (is_warning) { + ecs_os_warn(name, 0, msg); + } else { + ecs_os_err(name, 0, msg); + } ecs_os_free(msg); } } +void ecs_parser_errorv_( + const char *name, + const char *expr, + int64_t column_arg, + const char *fmt, + va_list args) +{ + flecs_parser_errorv(name, expr, column_arg, fmt, args, false); +} + +void ecs_parser_warningv_( + const char *name, + const char *expr, + int64_t column_arg, + const char *fmt, + va_list args) +{ + flecs_parser_errorv(name, expr, column_arg, fmt, args, true); +} + void ecs_parser_error_( const char *name, const char *expr, @@ -24679,6 +24673,21 @@ void ecs_parser_error_( } } +void ecs_parser_warning_( + const char *name, + const char *expr, + int64_t column, + const char *fmt, + ...) +{ + if (ecs_os_api.log_level_ >= -2) { + va_list args; + va_start(args, fmt); + ecs_parser_warningv_(name, expr, column, fmt, args); + va_end(args); + } +} + void ecs_abort_( int32_t err, const char *file, @@ -24839,6 +24848,34 @@ void ecs_parser_errorv_( (void)args; } + +void ecs_parser_warning_( + const char *name, + const char *expr, + int64_t column, + const char *fmt, + ...) +{ + (void)name; + (void)expr; + (void)column; + (void)fmt; +} + +void ecs_parser_warningv_( + const char *name, + const char *expr, + int64_t column, + const char *fmt, + va_list args) +{ + (void)name; + (void)expr; + (void)column; + (void)fmt; + (void)args; +} + void ecs_abort_( int32_t error_code, const char *file, @@ -26286,7 +26323,7 @@ void flecs_rest_capture_log( } #ifdef FLECS_DEBUG - /* In debug mode, log unexpected errors and warnings to the console */ + /* In debug mode, log unexpected errors to the console */ if (level < 0) { /* Also log to previous log function in debug mode */ if (rest_prev_log) { @@ -26297,7 +26334,7 @@ void flecs_rest_capture_log( } #endif - if (!rest_last_err && level < 0) { + if (!rest_last_err && level <= -3) { rest_last_err = ecs_os_strdup(msg); } } @@ -26719,13 +26756,20 @@ bool flecs_rest_script( const char *code = ecs_http_get_param(req, "code"); if (!code) { - flecs_reply_error(reply, "missing data parameter"); - return true; + code = req->body; } - + bool try = false; flecs_rest_bool_param(req, "try", &try); + if (!code) { + flecs_reply_error(reply, "missing code parameter"); + if (!try) { + reply->code = 400; + } + return true; + } + bool prev_color = ecs_log_enable_colors(false); ecs_os_api_log_t prev_log = ecs_os_api.log_; flecs_set_prev_log(ecs_os_api.log_, try); @@ -48435,8 +48479,18 @@ int ecs_meta_push( if (cursor->depth == 0) { if (!cursor->is_primitive_scope) { + bool is_primitive = false; if ((op->kind > EcsOpScope) && (op->count <= 1)) { - cursor->is_primitive_scope = true; + is_primitive = true; + } else if (op->kind == EcsOpOpaque) { + const EcsOpaque *t = ecs_get(world, op->type, EcsOpaque); + ecs_assert(t != NULL, ECS_INTERNAL_ERROR, NULL); + if (ecs_has(world, t->as_type, EcsPrimitive)) { + is_primitive = true; + } + } + + if ((cursor->is_primitive_scope = is_primitive)) { return 0; } } @@ -56265,6 +56319,11 @@ void FlecsScriptMathImport( (pos - parser->script->pub.code) - 1, __VA_ARGS__);\ goto error +/* Warning */ +#define Warning(...)\ + ecs_parser_warning(parser->script->pub.name, parser->script->pub.code,\ + (pos - parser->script->pub.code) - 1, __VA_ARGS__);\ + /* Parse expression */ #define Expr(until, ...)\ {\ @@ -56687,6 +56746,123 @@ const char* flecs_script_paren_expr( ParserEnd; } +/* Parse a single statement */ +static +const char* flecs_script_if_stmt( + ecs_script_parser_t *parser, + const char *pos) +{ + ParserBegin; + + // if expr + Expr('\0', + // if expr { + Parse_1('{', { + ecs_script_if_t *stmt = flecs_script_insert_if(parser); + stmt->expr = EXPR; + pos = flecs_script_scope(parser, stmt->if_true, pos); + if (!pos) { + goto error; + } + + // if expr { } else + LookAhead_1(EcsTokKeywordElse, + pos = lookahead; + + Parse( + // if expr { } else if + case EcsTokKeywordIf: { + Scope(stmt->if_false, + return flecs_script_if_stmt(parser, pos); + ) + } + + // if expr { } else\n if + case EcsTokNewline: { + Parse_1(EcsTokKeywordIf, + Scope(stmt->if_false, + return flecs_script_if_stmt(parser, pos); + ) + ) + } + + // if expr { } else { + case '{': { + return flecs_script_scope(parser, stmt->if_false, pos); + } + ) + ) + + EndOfRule; + }); + ) + + ParserEnd; +} + +static +const char* flecs_script_parse_var( + ecs_script_parser_t *parser, + const char *pos, + ecs_script_tokenizer_t *tokenizer, + bool is_prop) +{ + Parse_1(EcsTokIdentifier, + ecs_script_var_node_t *var = flecs_script_insert_var( + parser, Token(1)); + var->node.kind = is_prop ? EcsAstProp : EcsAstConst; + + Parse( + // const color = + case '=': { + // const color = Color : + LookAhead_2(EcsTokIdentifier, ':', + pos = lookahead; + + var->type = Token(3); + + // const color = Color: { + LookAhead_1('{', + // const color = Color: {expr} + pos = lookahead; + Initializer('}', + var->expr = INITIALIZER; + EndOfRule; + ) + ) + + // const color = Color: expr\n + Initializer('\n', + var->expr = INITIALIZER; + EndOfRule; + ) + ) + + // const PI = expr\n + Expr('\n', + Warning("'%s var = expr' syntax is deprecated" + ", use '%s var: expr' instead", + is_prop ? "prop" : "const", + is_prop ? "prop" : "const"); + var->expr = EXPR; + EndOfRule; + ) + } + + case ':': { + // const PI: expr\n + Expr('\n', + var->expr = EXPR; + EndOfRule; + ) + } + ) + ) + +error: + return NULL; +} + /* Parse a single statement */ static const char* flecs_script_stmt( @@ -56701,8 +56877,7 @@ const char* flecs_script_stmt( Parse( case EcsTokIdentifier: goto identifier; case EcsTokString: goto string_name; - case '{': return flecs_script_scope(parser, - flecs_script_insert_scope(parser), pos); + case '{': goto anonymous_entity; case '(': goto paren; case '@': goto annotation; case EcsTokKeywordWith: goto with_stmt; @@ -56716,6 +56891,11 @@ const char* flecs_script_stmt( EcsTokEndOfStatement: EndOfRule; ); +anonymous_entity: { + return flecs_script_scope(parser, + flecs_script_insert_entity(parser, "_", false)->scope, pos); +} + string_name: /* If this is an interpolated string, we need to evaluate it as expression * at evaluation time. Otherwise we can just use the string as name. The @@ -56876,100 +57056,18 @@ template_stmt: { // prop prop_var: { // prop color = Color: - Parse_4(EcsTokIdentifier, '=', EcsTokIdentifier, ':', - ecs_script_var_node_t *var = flecs_script_insert_var( - parser, Token(1)); - var->node.kind = EcsAstProp; - var->type = Token(3); - - // prop color = Color : { - LookAhead_1('{', - // prop color = Color: {expr} - pos = lookahead; - Initializer('}', - var->expr = INITIALIZER; - EndOfRule; - ) - ) - - // prop color = Color : expr\n - Initializer('\n', - var->expr = INITIALIZER; - EndOfRule; - ) - ) + return flecs_script_parse_var(parser, pos, tokenizer, true); } // const const_var: { // const color - Parse_1(EcsTokIdentifier, - ecs_script_var_node_t *var = flecs_script_insert_var( - parser, Token(1)); - var->node.kind = EcsAstConst; - - Parse( - // const color = - case '=': { - // const color = Color : - LookAhead_2(EcsTokIdentifier, ':', - pos = lookahead; - - var->type = Token(3); - - // const color = Color: { - LookAhead_1('{', - // const color = Color: {expr} - pos = lookahead; - Initializer('}', - var->expr = INITIALIZER; - EndOfRule; - ) - ) - - // const color = Color: expr\n - Initializer('\n', - var->expr = INITIALIZER; - EndOfRule; - ) - ) - - // const PI = expr\n - Expr('\n', - var->expr = EXPR; - EndOfRule; - ) - } - ) - ) + return flecs_script_parse_var(parser, pos, tokenizer, false); } // if if_stmt: { - // if expr - Expr('\0', - // if expr { - Parse_1('{', { - ecs_script_if_t *stmt = flecs_script_insert_if(parser); - stmt->expr = EXPR; - pos = flecs_script_scope(parser, stmt->if_true, pos); - if (!pos) { - goto error; - } - - // if expr { } else - LookAhead_1(EcsTokKeywordElse, - pos = lookahead; - - // if expr { } else { - Parse_1('{', - return flecs_script_scope(parser, stmt->if_false, pos); - ) - ) - - EndOfRule; - }); - ) + return flecs_script_if_stmt(parser, pos); } // for @@ -56981,7 +57079,8 @@ for_stmt: { Parse_1(EcsTokRange, { Expr(0, { ecs_expr_node_t *to = EXPR; - ecs_script_for_range_t *stmt = flecs_script_insert_for_range(parser); + ecs_script_for_range_t *stmt = + flecs_script_insert_for_range(parser); stmt->loop_var = Token(1); stmt->from = from; stmt->to = to; @@ -57021,16 +57120,29 @@ pair: { // (Eats, Apples): case ':': { - // (Eats, Apples): { - Parse_1('{', - // (Eats, Apples): { expr } - Initializer('}', + // Use lookahead so that expression parser starts at "match" + LookAhead_1(EcsTokKeywordMatch, { + // (Eats, Apples): match expr + Expr('\n', { ecs_script_component_t *comp = flecs_script_insert_pair_component( parser, Token(1), Token(3)); - comp->expr = INITIALIZER; - EndOfRule; - ) + comp->expr = EXPR; + EndOfRule; + }) + }) + + // (Eats, Apples): { + Parse_1('{', { + // (Eats, Apples): { expr } + Initializer('}', + ecs_script_component_t *comp = + flecs_script_insert_pair_component( + parser, Token(1), Token(3)); + comp->expr = INITIALIZER; + EndOfRule; + ) + } ) } @@ -57100,8 +57212,9 @@ identifier_flag: { Parse_1('{', // auto_override | Position: {expr} Expr('}', { - ecs_script_component_t *comp = flecs_script_insert_component( - parser, Token(2)); + ecs_script_component_t *comp = + flecs_script_insert_component( + parser, Token(2)); comp->expr = EXPR; EndOfRule; }) @@ -57130,6 +57243,13 @@ identifier_colon: { ) } + { + // Position: match + LookAhead_1(EcsTokKeywordMatch, + goto component_expr_match; + ) + } + // enterprise : SpaceShip Parse_1(EcsTokIdentifier, { ecs_script_entity_t *entity = flecs_script_insert_entity( @@ -57165,6 +57285,18 @@ identifier_assign: { LookAhead_2(EcsTokIdentifier, ':', pos = lookahead; + // Use lookahead so that expression parser starts at "match" + LookAhead_1(EcsTokKeywordMatch, { + // (Eats, Apples): match expr + Expr('\n', { + ecs_script_component_t *comp = + flecs_script_insert_pair_component( + parser, Token(1), Token(3)); + comp->expr = EXPR; + EndOfRule; + }) + }) + // x = Position: { Parse_1('{', { // x = Position: {expr} @@ -57305,6 +57437,18 @@ component_expr_collection: { }) } +// Position: match +component_expr_match: { + + // Position: match expr + Expr('\n', { + ecs_script_component_t *comp = flecs_script_insert_component( + parser, Token(0)); + comp->expr = EXPR; + EndOfRule; + }) +} + ParserEnd; } @@ -59286,6 +59430,15 @@ int flecs_script_template_eval_prop( ecs_script_var_node_t *node) { ecs_script_template_t *template = v->template; + if (ecs_vec_count(&v->vars->vars) > + ecs_vec_count(&template->prop_defaults)) + { + flecs_script_eval_error(v, node, + "const variables declared before prop '%s' (props must come first)", + node->name); + return -1; + } + ecs_script_var_t *var = ecs_script_vars_declare(v->vars, node->name); if (!var) { flecs_script_eval_error(v, node, @@ -59293,16 +59446,18 @@ int flecs_script_template_eval_prop( return -1; } + ecs_entity_t type; + const ecs_type_info_t *ti; + if (node->type) { - ecs_entity_t type; if (flecs_script_find_entity(v, 0, node->type, NULL, &type) || !type) { flecs_script_eval_error(v, node, - "unresolved type '%s' for const variable '%s'", + "unresolved type '%s' for prop '%s'", node->type, node->name); return -1; } - const ecs_type_info_t *ti = flecs_script_get_type_info(v, node, type); + ti = flecs_script_get_type_info(v, node, type); if (!ti) { return -1; } @@ -59315,24 +59470,51 @@ int flecs_script_template_eval_prop( if (flecs_script_eval_expr(v, &node->expr, &var->value)) { return -1; } + } else { + /* We don't know the type yet, so we can't create a storage for it yet. + * Run the expression first to deduce the type. */ + ecs_value_t value = {0}; + if (flecs_script_eval_expr(v, &node->expr, &value)) { + flecs_script_eval_error(v, node, + "failed to evaluate expression for const variable '%s'", + node->name); + return -1; + } - ecs_script_var_t *value = ecs_vec_append_t(&v->base.script->allocator, - &template->prop_defaults, ecs_script_var_t); - value->value.ptr = flecs_calloc_w_dbg_info( - &v->base.script->allocator, ti->size, ti->name); - value->value.type = type; - value->type_info = ti; - ecs_value_copy_w_type_info( - v->world, ti, value->value.ptr, var->value.ptr); + ecs_assert(value.type != 0, ECS_INTERNAL_ERROR, NULL); + ti = ecs_get_type_info(v->world, value.type); + ecs_assert(ti != NULL, ECS_INTERNAL_ERROR, NULL); - ecs_entity_t mbr = ecs_entity(v->world, { - .name = node->name, - .parent = template->entity - }); + var->value.ptr = flecs_stack_calloc( + &v->r->stack, ti->size, ti->alignment); + type = var->value.type = value.type; + var->type_info = ti; + + if (ti->hooks.ctor) { + ti->hooks.ctor(var->value.ptr, 1, ti); + } - ecs_set(v->world, mbr, EcsMember, { .type = var->value.type }); + ecs_value_copy_w_type_info(v->world, ti, var->value.ptr, value.ptr); + ecs_value_fini_w_type_info(v->world, ti, value.ptr); + flecs_free(&v->world->allocator, ti->size, value.ptr); } + ecs_script_var_t *value = ecs_vec_append_t(&v->base.script->allocator, + &template->prop_defaults, ecs_script_var_t); + value->value.ptr = flecs_calloc_w_dbg_info( + &v->base.script->allocator, ti->size, ti->name); + value->value.type = type; + value->type_info = ti; + ecs_value_copy_w_type_info( + v->world, ti, value->value.ptr, var->value.ptr); + + ecs_entity_t mbr = ecs_entity(v->world, { + .name = node->name, + .parent = template->entity + }); + + ecs_set(v->world, mbr, EcsMember, { .type = var->value.type }); + return 0; } @@ -59590,6 +59772,10 @@ void flecs_script_template_import( #define Keyword(keyword, _kind)\ } else if (!ecs_os_strncmp(pos, keyword " ", ecs_os_strlen(keyword) + 1)) {\ + out->value = keyword;\ + out->kind = _kind;\ + return pos + ecs_os_strlen(keyword);\ + } else if (!ecs_os_strncmp(pos, keyword "\n", ecs_os_strlen(keyword) + 1)) {\ out->value = keyword;\ out->kind = _kind;\ return pos + ecs_os_strlen(keyword); @@ -59644,17 +59830,20 @@ const char* flecs_script_token_kind_str( case EcsTokRange: case EcsTokShiftLeft: case EcsTokShiftRight: + case EcsTokAddAssign: + case EcsTokMulAssign: return ""; case EcsTokKeywordWith: case EcsTokKeywordUsing: - case EcsTokKeywordTemplate: case EcsTokKeywordProp: case EcsTokKeywordConst: case EcsTokKeywordIf: case EcsTokKeywordElse: case EcsTokKeywordFor: case EcsTokKeywordIn: + case EcsTokKeywordTemplate: case EcsTokKeywordModule: + case EcsTokKeywordMatch: return "keyword "; case EcsTokIdentifier: return "identifier "; @@ -59710,15 +59899,18 @@ const char* flecs_script_token_str( case EcsTokRange: return ".."; case EcsTokShiftLeft: return "<<"; case EcsTokShiftRight: return ">>"; + case EcsTokAddAssign: return "+="; + case EcsTokMulAssign: return "*="; case EcsTokKeywordWith: return "with"; case EcsTokKeywordUsing: return "using"; - case EcsTokKeywordTemplate: return "template"; case EcsTokKeywordProp: return "prop"; case EcsTokKeywordConst: return "const"; + case EcsTokKeywordMatch: return "match"; case EcsTokKeywordIf: return "if"; case EcsTokKeywordElse: return "else"; case EcsTokKeywordFor: return "for"; case EcsTokKeywordIn: return "in"; + case EcsTokKeywordTemplate: return "template"; case EcsTokKeywordModule: return "module"; case EcsTokIdentifier: return "identifier"; case EcsTokString: return "string"; @@ -60110,6 +60302,8 @@ const char* flecs_script_token( } else if (flecs_script_is_number(pos)) { return flecs_script_number(parser, pos, out); + OperatorMultiChar ("+=", EcsTokAddAssign) + OperatorMultiChar ("*=", EcsTokMulAssign) Operator (":", EcsTokColon) Operator ("{", EcsTokScopeOpen) Operator ("}", EcsTokScopeClose) @@ -60157,6 +60351,7 @@ const char* flecs_script_token( Keyword ("else", EcsTokKeywordElse) Keyword ("for", EcsTokKeywordFor) Keyword ("in", EcsTokKeywordIn) + Keyword ("match", EcsTokKeywordMatch) Keyword ("module", EcsTokKeywordModule) } else if (pos[0] == '"') { @@ -61634,7 +61829,6 @@ int flecs_script_eval_expr( if (flecs_expr_visit_type(script, expr, &desc)) { goto error; } - if (flecs_expr_visit_fold(script, expr_ptr, &desc)) { goto error; } @@ -61978,6 +62172,10 @@ int flecs_script_eval_component( return -1; } } + + ecs_record_t *r = flecs_entities_get(v->world, src); + ecs_assert(r != NULL, ECS_INTERNAL_ERROR, NULL); + ecs_table_t *table = r->table; ecs_value_t value = { .ptr = ecs_ensure_id(v->world, src, node->id.eval), @@ -61986,13 +62184,15 @@ int flecs_script_eval_component( /* Assign entire value, including members not set by expression. This * prevents uninitialized or unexpected values. */ - if (!ti->hooks.ctor) { - ecs_os_memset(value.ptr, 0, ti->size); - } else if (ti->hooks.ctor) { - if (ti->hooks.dtor) { - ti->hooks.dtor(value.ptr, 1, ti); + if (r->table != table) { + if (!ti->hooks.ctor) { + ecs_os_memset(value.ptr, 0, ti->size); + } else if (ti->hooks.ctor) { + if (ti->hooks.dtor) { + ti->hooks.dtor(value.ptr, 1, ti); + } + ti->hooks.ctor(value.ptr, 1, ti); } - ti->hooks.ctor(value.ptr, 1, ti); } if (flecs_script_eval_expr(v, &node->expr, &value)) { @@ -62673,6 +62873,7 @@ int ecs_script_eval( flecs_script_eval_visit_init(impl, &v, &priv_desc); int result = ecs_script_visit(impl, &v, flecs_script_eval_node); flecs_script_eval_visit_fini(&v, &priv_desc); + return result; } @@ -75677,6 +75878,14 @@ ecs_expr_element_t* flecs_expr_element( return result; } +ecs_expr_match_t* flecs_expr_match( + ecs_script_parser_t *parser) +{ + ecs_expr_match_t *result = flecs_expr_ast_new( + parser, ecs_expr_match_t, EcsExprMatch); + return result; +} + static bool flecs_expr_explicit_cast_allowed( ecs_world_t *world, @@ -75722,7 +75931,7 @@ bool flecs_expr_explicit_cast_allowed( if (to_type->kind == EcsEnumType || to_type->kind == EcsBitmaskType) { - /* Can integers to enums/bitmasks */ + /* Can cast integers to enums/bitmasks */ return true; } } @@ -75849,6 +76058,65 @@ ecs_entity_t flecs_script_default_lookup( return ecs_lookup(world, name); } +static +const char* flecs_script_parse_match_elems( + ecs_script_parser_t *parser, + const char *pos, + ecs_expr_match_t *node) +{ + ecs_allocator_t *a = &parser->script->allocator; + bool old_significant_newline = parser->significant_newline; + parser->significant_newline = true; + + ecs_vec_init_t(NULL, &node->elements, ecs_expr_match_element_t, 0); + + do { + ParserBegin; + + LookAhead( + case '\n': { + pos = lookahead; + continue; + } + + case '}': { + /* Return last character of initializer */ + pos = lookahead - 1; + parser->significant_newline = old_significant_newline; + EndOfRule; + } + ) + + ecs_expr_match_element_t *elem = ecs_vec_append_t( + a, &node->elements, ecs_expr_match_element_t); + ecs_os_zeromem(elem); + + pos = flecs_script_parse_expr(parser, pos, 0, &elem->compare); + if (!pos) { + goto error; + } + + Parse_1(':', { + pos = flecs_script_parse_expr(parser, pos, 0, &elem->expr); + if (!pos) { + goto error; + } + + Parse( + case ';': + case '\n': { + break; + } + ) + + break; + }) + + } while (true); + + ParserEnd; +} + const char* flecs_script_parse_initializer( ecs_script_parser_t *parser, const char *pos, @@ -75883,8 +76151,8 @@ const char* flecs_script_parse_initializer( a, &node->elements, ecs_expr_initializer_element_t); ecs_os_zeromem(elem); + /* Parse member name */ { - /* Parse member name */ LookAhead_2(EcsTokIdentifier, ':', { elem->member = Token(0); LookAhead_Keep(); @@ -75892,6 +76160,24 @@ const char* flecs_script_parse_initializer( break; }) } + { + LookAhead_2(EcsTokIdentifier, EcsTokAddAssign, { + elem->member = Token(0); + elem->operator = EcsTokAddAssign; + LookAhead_Keep(); + pos = lookahead; + break; + }) + } + { + LookAhead_2(EcsTokIdentifier, EcsTokMulAssign, { + elem->member = Token(0); + elem->operator = EcsTokMulAssign; + LookAhead_Keep(); + pos = lookahead; + break; + }) + } pos = flecs_script_parse_expr(parser, pos, 0, &elem->value); if (!pos) { @@ -75940,7 +76226,7 @@ const char* flecs_script_parse_collection_initializer( /* End of initializer */ LookAhead_1(']', { - if (first) { + if (first) { node->node.kind = EcsExprEmptyInitializer; } pos = lookahead - 1; @@ -75959,7 +76245,7 @@ const char* flecs_script_parse_collection_initializer( } { - /* Parse next element or end of initializer*/ + /* Parse next element or end of initializer */ LookAhead( case ',': { pos = lookahead; @@ -76205,6 +76491,35 @@ const char* flecs_script_parse_lhs( break; } + case EcsTokKeywordMatch: { + ecs_expr_match_t *node = flecs_expr_match(parser); + pos = flecs_script_parse_expr(parser, pos, 0, &node->expr); + if (!pos) { + flecs_script_parser_expr_free(parser, (ecs_expr_node_t*)node); + goto error; + } + + Parse_1('{', { + pos = flecs_script_parse_match_elems(parser, pos, node); + if (!pos) { + flecs_script_parser_expr_free( + parser, (ecs_expr_node_t*)node); + goto error; + } + + Parse_1('}', { + *out = (ecs_expr_node_t*)node; + break; + }) + + break; + }) + + can_have_rhs = false; + + break; + } + case '(': { pos = flecs_script_parse_expr(parser, pos, 0, out); if (!pos) { @@ -76326,7 +76641,7 @@ ecs_script_t* ecs_expr_parse( goto error; } - // printf("%s\n", ecs_script_ast_to_str(script)); + //printf("%s\n", ecs_script_ast_to_str(script, true)); if (!desc || !desc->disable_folding) { if (flecs_expr_visit_fold(script, &impl->expr, &priv_desc)) { @@ -76334,7 +76649,7 @@ ecs_script_t* ecs_expr_parse( } } - // printf("%s\n", ecs_script_ast_to_str(script, true)); + //printf("%s\n", ecs_script_ast_to_str(script, true)); return script; error: @@ -76673,6 +76988,8 @@ int flecs_value_unary( case EcsTokRange: case EcsTokShiftLeft: case EcsTokShiftRight: + case EcsTokAddAssign: + case EcsTokMulAssign: case EcsTokIdentifier: case EcsTokString: case EcsTokNumber: @@ -76683,6 +77000,7 @@ int flecs_value_unary( case EcsTokKeywordElse: case EcsTokKeywordFor: case EcsTokKeywordIn: + case EcsTokKeywordMatch: case EcsTokKeywordTemplate: case EcsTokKeywordProp: case EcsTokKeywordConst: @@ -76693,6 +77011,113 @@ int flecs_value_unary( return 0; } +#define ECS_VALUE_GET(value, T) (*(T*)(value)->ptr) + +#define ECS_BOP(left, right, result, op, R, T)\ + ECS_VALUE_GET(result, R) = (R)(ECS_VALUE_GET(left, T) op ECS_VALUE_GET(right, T)) + +#define ECS_BOP_COND(left, right, result, op, R, T)\ + ECS_VALUE_GET(result, ecs_bool_t) = ECS_VALUE_GET(left, T) op ECS_VALUE_GET(right, T) + +#define ECS_BOP_ASSIGN(left, right, result, op, R, T)\ + ECS_VALUE_GET(result, R) op (R)(ECS_VALUE_GET(right, T)) + +/* Unsigned operations */ +#define ECS_BINARY_UINT_OPS(left, right, result, op, OP)\ + if ((right)->type == ecs_id(ecs_u64_t)) { \ + OP(left, right, result, op, ecs_u64_t, ecs_u64_t);\ + } else if ((right)->type == ecs_id(ecs_u32_t)) { \ + OP(left, right, result, op, ecs_u32_t, ecs_u32_t);\ + } else if ((right)->type == ecs_id(ecs_u16_t)) { \ + OP(left, right, result, op, ecs_u16_t, ecs_u16_t);\ + } else if ((right)->type == ecs_id(ecs_u8_t)) { \ + OP(left, right, result, op, ecs_u8_t, ecs_u8_t);\ + } + +/* Unsigned + signed operations */ +#define ECS_BINARY_INT_OPS(left, right, result, op, OP)\ + ECS_BINARY_UINT_OPS(left, right, result, op, OP)\ + else if ((right)->type == ecs_id(ecs_i64_t)) { \ + OP(left, right, result, op, ecs_i64_t, ecs_i64_t);\ + } else if ((right)->type == ecs_id(ecs_i32_t)) { \ + OP(left, right, result, op, ecs_i32_t, ecs_i32_t);\ + } else if ((right)->type == ecs_id(ecs_i16_t)) { \ + OP(left, right, result, op, ecs_i16_t, ecs_i16_t);\ + } else if ((right)->type == ecs_id(ecs_i8_t)) { \ + OP(left, right, result, op, ecs_i8_t, ecs_i8_t);\ + } + +/* Unsigned + signed + floating point operations */ +#define ECS_BINARY_NUMBER_OPS(left, right, result, op, OP)\ + ECS_BINARY_INT_OPS(left, right, result, op, OP)\ + else if ((right)->type == ecs_id(ecs_f64_t)) { \ + OP(left, right, result, op, ecs_f64_t, ecs_f64_t);\ + } else if ((right)->type == ecs_id(ecs_f32_t)) { \ + OP(left, right, result, op, ecs_f32_t, ecs_f32_t);\ + } + + +/* Combinations + error checking */ + +#define ECS_BINARY_INT_OP(left, right, result, op)\ + ECS_BINARY_INT_OPS(left, right, result, op, ECS_BOP) else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + +#define ECS_BINARY_UINT_OP(left, right, result, op)\ + ECS_BINARY_UINT_OPS(left, right, result, op, ECS_BOP) else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + +#define ECS_BINARY_OP(left, right, result, op)\ + ECS_BINARY_NUMBER_OPS(left, right, result, op, ECS_BOP) else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + +#define ECS_BINARY_COND_EQ_OP(left, right, result, op)\ + ECS_BINARY_INT_OPS(left, right, result, op, ECS_BOP_COND)\ + else if ((right)->type == ecs_id(ecs_char_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_char_t);\ + } else if ((right)->type == ecs_id(ecs_u8_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_u8_t);\ + } else if ((right)->type == ecs_id(ecs_bool_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ + } else if ((right)->type == ecs_id(ecs_entity_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_entity_t, ecs_entity_t);\ + } else if ((right)->type == ecs_id(ecs_string_t)) { \ + char *lstr = *(char**)(left)->ptr;\ + char *rstr = *(char**)(right)->ptr;\ + if (lstr && rstr) {\ + *(bool*)(result)->ptr = ecs_os_strcmp(lstr, rstr) op 0;\ + } else {\ + *(bool*)(result)->ptr = lstr == rstr;\ + }\ + } else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + +#define ECS_BINARY_COND_OP(left, right, result, op)\ + ECS_BINARY_NUMBER_OPS(left, right, result, op, ECS_BOP_COND)\ + else if ((right)->type == ecs_id(ecs_char_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_char_t);\ + } else if ((right)->type == ecs_id(ecs_u8_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_u8_t);\ + } else if ((right)->type == ecs_id(ecs_bool_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ + } else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + +#define ECS_BINARY_ASSIGN_OP(left, right, result, op)\ + ECS_BINARY_NUMBER_OPS(left, right, result, op, ECS_BOP_ASSIGN)\ + +#define ECS_BINARY_BOOL_OP(left, right, result, op)\ + if ((right)->type == ecs_id(ecs_bool_t)) { \ + ECS_BOP_COND(left, right, result, op, ecs_bool_t, ecs_bool_t);\ + } else {\ + ecs_abort(ECS_INTERNAL_ERROR, "unexpected type in binary expression");\ + } + int flecs_value_binary( const ecs_script_t *script, const ecs_value_t *left, @@ -76762,6 +77187,12 @@ int flecs_value_binary( case EcsTokShiftRight: ECS_BINARY_INT_OP(left, right, out, >>); break; + case EcsTokAddAssign: + ECS_BINARY_ASSIGN_OP(left, right, out, +=); + break; + case EcsTokMulAssign: + ECS_BINARY_ASSIGN_OP(left, right, out, *=); + break; case EcsTokEnd: case EcsTokUnknown: case EcsTokScopeOpen: @@ -76792,6 +77223,7 @@ int flecs_value_binary( case EcsTokKeywordFor: case EcsTokKeywordIn: case EcsTokKeywordTemplate: + case EcsTokKeywordMatch: case EcsTokKeywordProp: case EcsTokKeywordConst: default: @@ -77024,15 +77456,28 @@ int flecs_expr_initializer_eval_static( * a cast to the type of the initializer element. */ ecs_entity_t type = elem->value->type; - if (expr->owned) { - if (ecs_value_move(ctx->world, type, - ECS_OFFSET(value, elem->offset), expr->value.ptr)) - { - goto error; + if (!elem->operator) { + if (expr->owned) { + if (ecs_value_move(ctx->world, type, + ECS_OFFSET(value, elem->offset), expr->value.ptr)) + { + goto error; + } + } else { + if (ecs_value_copy(ctx->world, type, + ECS_OFFSET(value, elem->offset), expr->value.ptr)) + { + goto error; + } } } else { - if (ecs_value_copy(ctx->world, type, - ECS_OFFSET(value, elem->offset), expr->value.ptr)) + ecs_value_t dst = { + .type = type, + .ptr = ECS_OFFSET(value, elem->offset) + }; + + if (flecs_value_binary( + ctx->script, NULL, &expr->value, &dst, elem->operator)) { goto error; } @@ -77597,6 +78042,73 @@ int flecs_expr_element_visit_eval( return -1; } +static +int flecs_expr_match_visit_eval( + ecs_script_eval_ctx_t *ctx, + ecs_expr_match_t *node, + ecs_expr_value_t *out) +{ + flecs_expr_stack_push(ctx->stack); + + ecs_expr_value_t *expr = flecs_expr_stack_result(ctx->stack, node->expr); + if (flecs_expr_visit_eval_priv(ctx, node->expr, expr)) { + goto error; + } + + int32_t i, count = ecs_vec_count(&node->elements); + ecs_expr_match_element_t *elems = ecs_vec_first(&node->elements); + + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + + flecs_expr_stack_push(ctx->stack); + ecs_expr_value_t *compare = flecs_expr_stack_result( + ctx->stack, node->expr); + if (flecs_expr_visit_eval_priv(ctx, elem->compare, compare)) { + goto error; + } + + bool value = false; + ecs_value_t result = { .type = ecs_id(ecs_bool_t), .ptr = &value }; + + if (flecs_value_binary( + ctx->script, &expr->value, &compare->value, &result, EcsTokEq)) + { + goto error; + } + + flecs_expr_stack_pop(ctx->stack); + + if (value) { + if (flecs_expr_visit_eval_priv(ctx, elem->expr, out)) { + goto error; + } + break; + } + } + + if (i == count) { + if (node->any.expr) { + if (flecs_expr_visit_eval_priv(ctx, node->any.expr, out)) { + goto error; + } + } else { + char *str = ecs_ptr_to_str( + ctx->world, expr->value.type, expr->value.ptr); + flecs_expr_visit_error(ctx->script, node, + "match value '%s' not handled by case", str); + ecs_os_free(str); + goto error; + } + } + + flecs_expr_stack_pop(ctx->stack); + return 0; +error: + flecs_expr_stack_pop(ctx->stack); + return -1; +} + static int flecs_expr_component_visit_eval( ecs_script_eval_ctx_t *ctx, @@ -77738,6 +78250,13 @@ int flecs_expr_visit_eval_priv( goto error; } break; + case EcsExprMatch: + if (flecs_expr_match_visit_eval( + ctx, (ecs_expr_match_t*)node, out)) + { + goto error; + } + break; case EcsExprComponent: if (flecs_expr_component_visit_eval( ctx, (ecs_expr_element_t*)node, out)) @@ -77784,7 +78303,18 @@ int flecs_expr_visit_eval( flecs_expr_stack_push(stack); - ecs_expr_value_t *val = flecs_expr_stack_result(stack, node); + ecs_expr_value_t val_tmp; + ecs_expr_value_t *val; + if (out->type && (out->type == node->type) && out->ptr) { + val_tmp = (ecs_expr_value_t){ + .value = *out, + .owned = false, + .type_info = ecs_get_type_info(script->world, out->type) + }; + val = &val_tmp; + } else { + val = flecs_expr_stack_result(stack, node); + } ecs_script_eval_ctx_t ctx = { .script = script, @@ -77809,17 +78339,19 @@ int flecs_expr_visit_eval( out->ptr = ecs_value_new(ctx.world, out->type); } - if (val->owned) { - /* Values owned by the runtime can be moved to output */ - if (flecs_value_move_to(ctx.world, out, &val->value)) { - flecs_expr_visit_error(script, node, "failed to write to output"); - goto error; - } - } else { - /* Values not owned by runtime should be copied */ - if (flecs_value_copy_to(ctx.world, out, val)) { - flecs_expr_visit_error(script, node, "failed to write to output"); - goto error; + if (val != &val_tmp || out->ptr != val->value.ptr) { + if (val->owned) { + /* Values owned by the runtime can be moved to output */ + if (flecs_value_move_to(ctx.world, out, &val->value)) { + flecs_expr_visit_error(script, node, "failed to write to output"); + goto error; + } + } else { + /* Values not owned by runtime should be copied */ + if (flecs_value_copy_to(ctx.world, out, val)) { + flecs_expr_visit_error(script, node, "failed to write to output"); + goto error; + } } } @@ -78107,6 +78639,10 @@ int flecs_expr_initializer_pre_fold( if (elem->value->kind != EcsExprValue) { *can_fold = false; } + + if (elem->operator) { + *can_fold = false; + } } if (node->is_dynamic) { @@ -78345,6 +78881,37 @@ int flecs_expr_element_visit_fold( return -1; } +static +int flecs_expr_match_visit_fold( + ecs_script_t *script, + ecs_expr_node_t **node_ptr, + const ecs_expr_eval_desc_t *desc) +{ + ecs_expr_match_t *node = (ecs_expr_match_t*)*node_ptr; + + if (flecs_expr_visit_fold(script, &node->expr, desc)) { + goto error; + } + + int32_t i, count = ecs_vec_count(&node->elements); + ecs_expr_match_element_t *elems = ecs_vec_first(&node->elements); + + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + if (flecs_expr_visit_fold(script, &elem->compare, desc)) { + goto error; + } + + if (flecs_expr_visit_fold(script, &elem->expr, desc)) { + goto error; + } + } + + return 0; +error: + return -1; +} + int flecs_expr_visit_fold( ecs_script_t *script, ecs_expr_node_t **node_ptr, @@ -78409,6 +78976,11 @@ int flecs_expr_visit_fold( goto error; } break; + case EcsExprMatch: + if (flecs_expr_match_visit_fold(script, node_ptr, desc)) { + goto error; + } + break; case EcsExprCast: case EcsExprCastNumber: if (flecs_expr_cast_visit_fold(script, node_ptr, desc)) { @@ -78528,6 +79100,33 @@ void flecs_expr_element_visit_free( flecs_expr_visit_free(script, node->index); } +static +void flecs_expr_match_visit_free( + ecs_script_t *script, + ecs_expr_match_t *node) +{ + flecs_expr_visit_free(script, node->expr); + + int32_t i, count = ecs_vec_count(&node->elements); + ecs_expr_match_element_t *elems = ecs_vec_first(&node->elements); + + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + flecs_expr_visit_free(script, elem->compare); + flecs_expr_visit_free(script, elem->expr); + } + + if (node->any.compare) { + flecs_expr_visit_free(script, node->any.compare); + } + if (node->any.expr) { + flecs_expr_visit_free(script, node->any.expr); + } + + ecs_vec_fini_t(&flecs_script_impl(script)->allocator, + &node->elements, ecs_expr_match_element_t); +} + static void flecs_expr_cast_visit_free( ecs_script_t *script, @@ -78599,6 +79198,11 @@ void flecs_expr_visit_free( script, (ecs_expr_element_t*)node); flecs_free_t(a, ecs_expr_element_t, node); break; + case EcsExprMatch: + flecs_expr_match_visit_free( + script, (ecs_expr_match_t*)node); + flecs_free_t(a, ecs_expr_match_t, node); + break; case EcsExprCast: case EcsExprCastNumber: flecs_expr_cast_visit_free( @@ -78841,6 +79445,65 @@ int flecs_expr_element_to_str( return 0; } +static +int flecs_expr_match_to_str( + ecs_expr_str_visitor_t *v, + const ecs_expr_match_t *node) +{ + if (node->node.type) { + flecs_expr_color_to_str(v, ECS_BLUE); + const char *name = ecs_get_name(v->world, node->node.type); + if (name) { + ecs_strbuf_appendstr(v->buf, name); + } else { + char *path = ecs_get_path(v->world, node->node.type); + ecs_strbuf_appendstr(v->buf, path); + ecs_os_free(path); + } + flecs_expr_color_to_str(v, ECS_NORMAL); + ecs_strbuf_appendlit(v->buf, "("); + } + + flecs_expr_color_to_str(v, ECS_BLUE); + ecs_strbuf_appendlit(v->buf, "match "); + flecs_expr_color_to_str(v, ECS_GREEN); + if (flecs_expr_node_to_str(v, node->expr)) { + return -1; + } + + ecs_strbuf_appendlit(v->buf, " {\n"); + + int32_t i, count = ecs_vec_count(&node->elements); + ecs_expr_match_element_t *elems = ecs_vec_first(&node->elements); + + for (i = 0; i < count; i ++) { + ecs_strbuf_appendlit(v->buf, " "); + + ecs_expr_match_element_t *elem = &elems[i]; + if (flecs_expr_node_to_str(v, elem->compare)) { + return -1; + } + + ecs_strbuf_appendlit(v->buf, ": "); + + if (flecs_expr_node_to_str(v, elem->expr)) { + return -1; + } + + ecs_strbuf_appendlit(v->buf, "\n"); + } + + ecs_strbuf_appendlit(v->buf, "}"); + + if (node->node.type) { + ecs_strbuf_appendlit(v->buf, ")"); + } + + ecs_strbuf_appendlit(v->buf, "\n"); + + return 0; +} + static int flecs_expr_cast_to_str( ecs_expr_str_visitor_t *v, @@ -78951,6 +79614,13 @@ int flecs_expr_node_to_str( goto error; } break; + case EcsExprMatch: + if (flecs_expr_match_to_str(v, + (const ecs_expr_match_t*)node)) + { + goto error; + } + break; case EcsExprCast: case EcsExprCastNumber: if (flecs_expr_cast_to_str(v, @@ -79000,23 +79670,7 @@ int flecs_expr_visit_type_priv( bool flecs_expr_is_type_integer( ecs_entity_t type) { - if (type == ecs_id(ecs_bool_t)) return false; - else if (type == ecs_id(ecs_char_t)) return false; - else if (type == ecs_id(ecs_u8_t)) return false; - else if (type == ecs_id(ecs_u64_t)) return true; - else if (type == ecs_id(ecs_i64_t)) return true; - else if (type == ecs_id(ecs_f64_t)) return false; - else if (type == ecs_id(ecs_string_t)) return false; - else if (type == ecs_id(ecs_entity_t)) return false; - else return false; -} - -bool flecs_expr_is_type_number( - ecs_entity_t type) -{ - if (type == ecs_id(ecs_bool_t)) return false; - else if (type == ecs_id(ecs_char_t)) return false; - else if (type == ecs_id(ecs_u8_t)) return true; + if (type == ecs_id(ecs_u8_t)) return true; else if (type == ecs_id(ecs_u16_t)) return true; else if (type == ecs_id(ecs_u32_t)) return true; else if (type == ecs_id(ecs_u64_t)) return true; @@ -79026,10 +79680,15 @@ bool flecs_expr_is_type_number( else if (type == ecs_id(ecs_i32_t)) return true; else if (type == ecs_id(ecs_i64_t)) return true; else if (type == ecs_id(ecs_iptr_t)) return true; - else if (type == ecs_id(ecs_f32_t)) return true; - else if (type == ecs_id(ecs_f64_t)) return true; - else if (type == ecs_id(ecs_string_t)) return false; - else if (type == ecs_id(ecs_entity_t)) return false; + else return false; +} + +bool flecs_expr_is_type_number( + ecs_entity_t type) +{ + if (flecs_expr_is_type_integer(type)) return true; + else if (type == ecs_id(ecs_f32_t)) return true; + else if (type == ecs_id(ecs_f64_t)) return true; else return false; } @@ -79212,6 +79871,8 @@ bool flecs_expr_oper_valid_for_type( case EcsTokMul: case EcsTokDiv: case EcsTokMod: + case EcsTokAddAssign: + case EcsTokMulAssign: return flecs_expr_is_type_number(type); case EcsTokBitwiseAnd: case EcsTokBitwiseOr: @@ -79263,6 +79924,7 @@ bool flecs_expr_oper_valid_for_type( case EcsTokKeywordElse: case EcsTokKeywordFor: case EcsTokKeywordIn: + case EcsTokKeywordMatch: case EcsTokKeywordTemplate: case EcsTokKeywordProp: case EcsTokKeywordConst: @@ -79273,16 +79935,19 @@ bool flecs_expr_oper_valid_for_type( } static -int flecs_expr_type_for_oper( +int flecs_expr_type_for_operator( ecs_script_t *script, - ecs_expr_binary_t *node, + ecs_expr_node_t *node, /* Only used for error reporting */ + ecs_entity_t node_type, + ecs_expr_node_t *left, + ecs_expr_node_t *right, + ecs_script_token_kind_t operator, ecs_entity_t *operand_type, ecs_entity_t *result_type) { ecs_world_t *world = script->world; - ecs_expr_node_t *left = node->left, *right = node->right; - if (node->operator == EcsTokDiv || node->operator == EcsTokMod) { + if (operator == EcsTokDiv || operator == EcsTokMod) { if (right->kind == EcsExprValue) { ecs_expr_value_node_t *val = (ecs_expr_value_node_t*)right; ecs_value_t v = { .type = val->node.type, .ptr = val->ptr }; @@ -79294,7 +79959,7 @@ int flecs_expr_type_for_oper( } } - switch(node->operator) { + switch(operator) { case EcsTokDiv: /* Result type of a division is always a float */ if (left->type != ecs_id(ecs_f32_t) && left->type != ecs_id(ecs_f64_t)){ @@ -79338,6 +80003,8 @@ int flecs_expr_type_for_oper( case EcsTokSub: case EcsTokMul: break; + case EcsTokAddAssign: + case EcsTokMulAssign: case EcsTokUnknown: case EcsTokScopeOpen: case EcsTokScopeClose: @@ -79366,6 +80033,7 @@ int flecs_expr_type_for_oper( case EcsTokKeywordElse: case EcsTokKeywordFor: case EcsTokKeywordIn: + case EcsTokKeywordMatch: case EcsTokKeywordTemplate: case EcsTokKeywordProp: case EcsTokKeywordConst: @@ -79374,10 +80042,18 @@ int flecs_expr_type_for_oper( ecs_throw(ECS_INTERNAL_ERROR, "invalid operator"); } + /* If one of the types is an entity or id, the other one should be also */ + if (left->type == ecs_id(ecs_entity_t) || + right->type == ecs_id(ecs_entity_t)) + { + *operand_type = ecs_id(ecs_entity_t); + goto done; + } + const EcsPrimitive *ltype_ptr = ecs_get(world, left->type, EcsPrimitive); const EcsPrimitive *rtype_ptr = ecs_get(world, right->type, EcsPrimitive); if (!ltype_ptr || !rtype_ptr) { - /* Only primitives and bitmask constants are allowed */ + /* Only primitives, bitmask constants and enums are allowed */ if (left->type == right->type) { if (ecs_get(world, left->type, EcsBitmask) != NULL) { *operand_type = left->type; @@ -79385,10 +80061,26 @@ int flecs_expr_type_for_oper( } } + { + const EcsEnum *ptr = ecs_get(script->world, left->type, EcsEnum); + if (ptr) { + *operand_type = ptr->underlying_type; + goto done; + } + } + + { + const EcsEnum *ptr = ecs_get(script->world, right->type, EcsEnum); + if (ptr) { + *operand_type = ptr->underlying_type; + goto done; + } + } + char *lname = ecs_get_path(world, left->type); char *rname = ecs_get_path(world, right->type); flecs_expr_visit_error(script, node, - "invalid non-primitive type in binary expression (%s, %s)", + "invalid non-primitive type in expression (%s, %s)", lname, rname); ecs_os_free(lname); ecs_os_free(rname); @@ -79403,19 +80095,19 @@ int flecs_expr_type_for_oper( /* If types are not the same, find the smallest type for literals that can * represent the value without losing precision. */ - ecs_entity_t ltype = flecs_expr_narrow_type(node->node.type, left); - ecs_entity_t rtype = flecs_expr_narrow_type(node->node.type, right); + ecs_entity_t ltype = flecs_expr_narrow_type(node_type, left); + ecs_entity_t rtype = flecs_expr_narrow_type(node_type, right); /* If types are not the same, try to implicitly cast to expression type */ - ltype = flecs_expr_cast_to_lvalue(node->node.type, ltype); - rtype = flecs_expr_cast_to_lvalue(node->node.type, rtype); + ltype = flecs_expr_cast_to_lvalue(node_type, ltype); + rtype = flecs_expr_cast_to_lvalue(node_type, rtype); if (ltype == rtype) { *operand_type = ltype; goto done; } - if (node->operator == EcsTokEq || node->operator == EcsTokNeq) { + if (operator == EcsTokEq || operator == EcsTokNeq) { /* If this is an equality comparison and one of the operands is a bool, * cast the other operand to a bool as well. This ensures that * expressions such as true == 2 evaluate to true. */ @@ -79488,7 +80180,7 @@ int flecs_expr_type_for_oper( char *ltype_str = ecs_id_str(world, ltype); char *rtype_str = ecs_id_str(world, rtype); flecs_expr_visit_error(script, node, - "incompatible types in binary expression (%s vs %s)", + "incompatible types in expression (%s vs %s)", ltype_str, rtype_str); ecs_os_free(ltype_str); ecs_os_free(rtype_str); @@ -79496,7 +80188,7 @@ int flecs_expr_type_for_oper( return -1; done: - if (node->operator == EcsTokSub && *operand_type == ecs_id(ecs_u64_t)) { + if (operator == EcsTokSub && *operand_type == ecs_id(ecs_u64_t)) { /* Result of subtracting two unsigned ints can be negative */ *operand_type = ecs_id(ecs_i64_t); } @@ -79505,9 +80197,25 @@ int flecs_expr_type_for_oper( *result_type = *operand_type; } + if (ecs_get(script->world, *result_type, EcsBitmask) != NULL) { + *operand_type = ecs_id(ecs_u64_t); + } + return 0; } +static +int flecs_expr_type_for_binary_expr( + ecs_script_t *script, + ecs_expr_binary_t *node, + ecs_entity_t *operand_type, + ecs_entity_t *result_type) +{ + return flecs_expr_type_for_operator(script, (ecs_expr_node_t*)node, + node->node.type, node->left, node->right, node->operator, + operand_type, result_type); +} + static int flecs_expr_interpolated_string_visit_type( ecs_script_t *script, @@ -79639,6 +80347,105 @@ int flecs_expr_interpolated_string_visit_type( return -1; } +static +int flecs_expr_initializer_collection_check( + ecs_script_t *script, + ecs_expr_initializer_t *node, + ecs_meta_cursor_t *cur) +{ + if (cur) { + if (ecs_meta_is_collection(cur) != node->is_collection) { + char *type_str = ecs_get_path(script->world, node->node.type); + if (node->is_collection) { + flecs_expr_visit_error(script, node, + "invalid collection literal for non-collection type '%s'", + type_str); + } else { + flecs_expr_visit_error(script, node, + "invalid object literal for collection type '%s'", + type_str); + } + + ecs_os_free(type_str); + goto error; + } + } + + ecs_entity_t type = node->node.type; + if (type) { + const EcsOpaque *op = ecs_get(script->world, type, EcsOpaque); + if (op) { + type = op->as_type; + } + + const EcsType *ptr = ecs_get(script->world, type, EcsType); + if (ptr) { + ecs_type_kind_t kind = ptr->kind; + if (node->is_collection) { + /* Only do this check if no cursor is provided. Cursors also + * handle inline arrays. */ + if (!cur) { + if (kind != EcsArrayType && kind != EcsVectorType) { + char *type_str = ecs_get_path( + script->world, node->node.type); + flecs_expr_visit_error(script, node, + "invalid collection literal for type '%s'", + type_str); + ecs_os_free(type_str); + goto error; + } + } + } else { + if (kind != EcsStructType) { + char *type_str = ecs_get_path( + script->world, node->node.type); + flecs_expr_visit_error(script, node, + "invalid object literal for type '%s'", type_str); + ecs_os_free(type_str); + goto error; + } + } + } + } + + return 0; +error: + return -1; +} + +static +int flecs_expr_empty_initializer_visit_type( + ecs_script_t *script, + ecs_expr_initializer_t *node, + ecs_meta_cursor_t *cur, + const ecs_expr_eval_desc_t *desc) +{ + (void)desc; + + node->node.type = ecs_meta_get_type(cur); + if (!node->node.type) { + flecs_expr_visit_error(script, node, + "unknown type for initializer"); + goto error; + } + + if (ecs_meta_push(cur)) { + goto error; + } + + if (flecs_expr_initializer_collection_check(script, node, cur)) { + goto error; + } + + if (ecs_meta_pop(cur)) { + goto error; + } + + return 0; +error: + return -1; +} + static int flecs_expr_initializer_visit_type( ecs_script_t *script, @@ -79662,19 +80469,7 @@ int flecs_expr_initializer_visit_type( goto error; } - if (ecs_meta_is_collection(cur) != node->is_collection) { - char *type_str = ecs_get_path(script->world, type); - if (node->is_collection) { - flecs_expr_visit_error(script, node, - "invalid collection literal for non-collection type '%s'" - " (expected '[]')", type_str); - } else { - flecs_expr_visit_error(script, node, - "invalid object literal for collection type '%s' (expected {})", - type_str); - } - - ecs_os_free(type_str); + if (flecs_expr_initializer_collection_check(script, node, cur)) { goto error; } @@ -79725,6 +80520,18 @@ int flecs_expr_initializer_visit_type( elem->value = cast; } + if (elem->operator) { + if (!flecs_expr_oper_valid_for_type( + script->world, elem_type, elem->operator)) + { + char *type_str = ecs_get_path(script->world, elem_type); + flecs_expr_visit_error(script, node, + "invalid operator for type '%s'", type_str); + ecs_os_free(type_str); + goto error; + } + } + if (!is_opaque) { elem->offset = (uintptr_t)ecs_meta_get_ptr(cur); } @@ -79785,6 +80592,13 @@ int flecs_expr_binary_visit_type( /* Provides a hint to the type visitor. The lvalue type will be used to * reduce the number of casts where possible. */ node->node.type = ecs_meta_get_type(cur); + + /* If the result of the binary expression is a boolean it's likely a + * conditional expression. We don't want to hint that the operands + * of conditional expressions should be casted to booleans. */ + if (node->node.type == ecs_id(ecs_bool_t)) { + ecs_os_zeromem(cur); + } } if (flecs_expr_visit_type_priv(script, node->left, cur, desc)) { @@ -79795,7 +80609,9 @@ int flecs_expr_binary_visit_type( goto error; } - if (flecs_expr_type_for_oper(script, node, &operand_type, &result_type)) { + if (flecs_expr_type_for_binary_expr( + script, node, &operand_type, &result_type)) + { goto error; } @@ -79809,10 +80625,6 @@ int flecs_expr_binary_visit_type( goto error; } - if (ecs_get(script->world, result_type, EcsBitmask) != NULL) { - operand_type = ecs_id(ecs_u64_t); - } - if (operand_type != node->left->type) { node->left = (ecs_expr_node_t*)flecs_expr_cast( script, node->left, operand_type); @@ -79836,6 +80648,29 @@ int flecs_expr_binary_visit_type( return -1; } +static +int flecs_expr_constant_identifier_visit_type( + ecs_script_t *script, + ecs_expr_identifier_t *node) +{ + ecs_expr_value_node_t *result = flecs_expr_value_from( + script, (ecs_expr_node_t*)node, node->node.type); + + ecs_meta_cursor_t expr_cur = ecs_meta_cursor( + script->world, node->node.type, &result->storage.u64); + if (ecs_meta_set_string(&expr_cur, node->value)) { + flecs_expr_visit_free(script, (ecs_expr_node_t*)result); + goto error; + } + + result->ptr = &result->storage.u64; + node->expr = (ecs_expr_node_t*)result; + + return 0; +error: + return -1; +} + static int flecs_expr_identifier_visit_type( ecs_script_t *script, @@ -79844,43 +80679,95 @@ int flecs_expr_identifier_visit_type( const ecs_expr_eval_desc_t *desc) { (void)desc; + + ecs_entity_t type = node->node.type; if (cur->valid) { - node->node.type = ecs_meta_get_type(cur); - } else { - node->node.type = ecs_id(ecs_entity_t); - *cur = ecs_meta_cursor(script->world, ecs_id(ecs_entity_t), NULL); + type = ecs_meta_get_type(cur); } - ecs_entity_t type = node->node.type; + const EcsType *type_ptr = NULL; + if (type) { + type_ptr = ecs_get(script->world, type, EcsType); + ecs_assert(type_ptr != NULL, ECS_INTERNAL_ERROR, NULL); + } - ecs_expr_value_node_t *result = flecs_expr_value_from( - script, (ecs_expr_node_t*)node, type); + if (type_ptr && + (type_ptr->kind == EcsEnumType || type_ptr->kind == EcsBitmaskType)) + { + /* If the requested type is an enum or bitmask, use cursor to resolve + * identifier to correct type constant. This lets us type 'Red' in places + * where we expect a value of type Color, instead of Color.Red. */ + node->node.type = type; + if (flecs_expr_constant_identifier_visit_type(script, node)) { + goto error; + } - if (type == ecs_id(ecs_entity_t) || type == ecs_id(ecs_id_t)) { - result->storage.entity = desc->lookup_action( + return 0; + } else { + /* If not, try to resolve the identifier as entity */ + ecs_entity_t e = desc->lookup_action( script->world, node->value, desc->lookup_ctx); - result->ptr = &result->storage.entity; - if (!result->storage.entity) { - flecs_expr_visit_free(script, (ecs_expr_node_t*)result); - if (!desc->allow_unresolved_identifiers) { - flecs_expr_visit_error(script, node, - "unresolved identifier '%s'", node->value); + if (e) { + const EcsScriptConstVar *global = ecs_get( + script->world, e, EcsScriptConstVar); + if (!global) { + if (!type) { + type = ecs_id(ecs_entity_t); + } + + ecs_expr_value_node_t *result = flecs_expr_value_from( + script, (ecs_expr_node_t*)node, type); + result->storage.entity = e; + result->ptr = &result->storage.entity; + node->expr = (ecs_expr_node_t*)result; + node->node.type = type; + } else { + ecs_expr_variable_t *var_node = flecs_expr_variable_from( + script, (ecs_expr_node_t*)node, node->value); + node->expr = (ecs_expr_node_t*)var_node; + node->node.type = global->value.type; + + ecs_meta_cursor_t tmp_cur; ecs_os_zeromem(&tmp_cur); + if (flecs_expr_visit_type_priv( + script, (ecs_expr_node_t*)var_node, &tmp_cur, desc)) + { + goto error; + } + } + + return 0; + } + + /* If identifier could not be resolved as entity, try as variable */ + int32_t var_sp = -1; + ecs_script_var_t *var = flecs_script_find_var( + desc->vars, node->value, &var_sp); + if (var) { + ecs_expr_variable_t *var_node = flecs_expr_variable_from( + script, (ecs_expr_node_t*)node, node->value); + node->expr = (ecs_expr_node_t*)var_node; + node->node.type = var->value.type; + + ecs_meta_cursor_t tmp_cur; ecs_os_zeromem(&tmp_cur); + if (flecs_expr_visit_type_priv( + script, (ecs_expr_node_t*)var_node, &tmp_cur, desc)) + { goto error; } - result = NULL; + return 0; } - } else { - ecs_meta_cursor_t tmp_cur = ecs_meta_cursor( - script->world, type, &result->storage.u64); - if (ecs_meta_set_string(&tmp_cur, node->value)) { - flecs_expr_visit_free(script, (ecs_expr_node_t*)result); + + /* If unresolved identifiers aren't allowed here, throw error */ + if (!desc->allow_unresolved_identifiers) { + flecs_expr_visit_error(script, node, + "unresolved identifier '%s'", node->value); goto error; } - result->ptr = &result->storage.u64; - } - node->expr = (ecs_expr_node_t*)result; + /* Identifier will be resolved at eval time, default to entity */ + node->node.type = ecs_id(ecs_entity_t); + } return 0; error: @@ -80288,6 +81175,151 @@ not_a_collection: { return -1; } +static +bool flecs_expr_identifier_is_any( + ecs_expr_node_t *node) +{ + if (node->kind == EcsExprIdentifier) { + ecs_expr_identifier_t *id = (ecs_expr_identifier_t*)node; + if (id->value && !ecs_os_strcmp(id->value, "_")) { + return true; + } + } + return false; +} + +static +int flecs_expr_match_visit_type( + ecs_script_t *script, + ecs_expr_match_t *node, + ecs_meta_cursor_t *cur, + const ecs_expr_eval_desc_t *desc) +{ + ecs_assert(node != NULL, ECS_INVALID_PARAMETER, NULL); + + ecs_meta_cursor_t expr_cur; + ecs_os_zeromem(&expr_cur); + if (flecs_expr_visit_type_priv(script, node->expr, &expr_cur, desc)) { + goto error; + } + + int32_t i, count = ecs_vec_count(&node->elements); + ecs_expr_match_element_t *elems = ecs_vec_first(&node->elements); + + if (!count) { + flecs_expr_visit_error(script, node, + "match statement must have at least one case"); + goto error; + } + + /* Determine most expressive type of all elements */ + node->node.type = ecs_meta_get_type(cur); + + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + + if (node->node.type) { + expr_cur = ecs_meta_cursor(script->world, node->node.type, NULL); + } else { + ecs_os_zeromem(&expr_cur); + } + + if (flecs_expr_visit_type_priv(script, elem->expr, &expr_cur, desc)) { + goto error; + } + + if (!node->node.type) { + node->node.type = elem->expr->type; + continue; + } + + if (flecs_expr_is_type_number(node->node.type)) { + ecs_entity_t result_type = 0, operand_type = 0; + if (flecs_expr_type_for_operator(script, (ecs_expr_node_t*)node, 0, + (ecs_expr_node_t*)node, elem->expr, + EcsTokAdd, /* Use operator that doesn't change types */ + &operand_type, &result_type)) + { + goto error; + } + + /* "Accumulate" most expressive type in result node */ + node->node.type = result_type; + } else { + /* If type is not a number it must match exactly */ + if (elem->expr->type != node->node.type) { + char *got = ecs_get_path(script->world, elem->expr->type); + char *expect = ecs_get_path(script->world, node->node.type); + flecs_expr_visit_error(script, node, + "invalid type for case %d in match (got %s, expected %s)", + i + 1, got, expect); + ecs_os_free(got); + ecs_os_free(expect); + goto error; + } + } + } + + /* Loop over elements again, cast values to result type */ + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + if (elem->expr->type != node->node.type) { + elem->expr = (ecs_expr_node_t*) + flecs_expr_cast(script, elem->expr, node->node.type); + if (!elem->expr) { + goto error; + } + } + } + + /* If this is an enum type, cast to the underlying type. This is necessary + * because the compare operation executed by the match evaluation code isn't + * implemented for enums. */ + ecs_entity_t expr_type = node->expr->type; + const EcsEnum *ptr = ecs_get(script->world, expr_type, EcsEnum); + if (ptr) { + node->expr = (ecs_expr_node_t*) + flecs_expr_cast(script, node->expr, ptr->underlying_type); + } + + /* Make sure that case values match the input type */ + for (i = 0; i < count; i ++) { + ecs_expr_match_element_t *elem = &elems[i]; + + if (flecs_expr_identifier_is_any(elem->compare)) { + if (i != count - 1) { + flecs_expr_visit_error(script, node, + "any (_) must be the last case in match"); + goto error; + } + + node->any.compare = elem->compare; + node->any.expr = elem->expr; + ecs_vec_remove_last(&node->elements); + } else { + expr_cur = ecs_meta_cursor(script->world, expr_type, NULL); + if (flecs_expr_visit_type_priv( + script, elem->compare, &expr_cur, desc)) + { + goto error; + } + + ecs_expr_node_t *compare = elem->compare; + if (compare->type != node->expr->type) { + elem->compare = (ecs_expr_node_t*) + flecs_expr_cast(script, compare, node->expr->type); + if (!elem->compare) { + goto error; + } + } + } + } + + return 0; +error: + return -1; +} + static int flecs_expr_visit_type_priv( ecs_script_t *script, @@ -80308,6 +81340,11 @@ int flecs_expr_visit_type_priv( } break; case EcsExprEmptyInitializer: + if (flecs_expr_empty_initializer_visit_type( + script, (ecs_expr_initializer_t*)node, cur, desc)) + { + goto error; + } break; case EcsExprInitializer: if (flecs_expr_initializer_visit_type( @@ -80372,6 +81409,13 @@ int flecs_expr_visit_type_priv( goto error; } break; + case EcsExprMatch: + if (flecs_expr_match_visit_type( + script, (ecs_expr_match_t*)node, cur, desc)) + { + goto error; + } + break; case EcsExprCast: case EcsExprCastNumber: break; @@ -80382,11 +81426,8 @@ int flecs_expr_visit_type_priv( } ecs_assert(node->type != 0, ECS_INTERNAL_ERROR, NULL); - - if (node->type) { - node->type_info = ecs_get_type_info(script->world, node->type); - ecs_assert(node->type_info != NULL, ECS_INTERNAL_ERROR, NULL); - } + node->type_info = ecs_get_type_info(script->world, node->type); + ecs_assert(node->type_info != NULL, ECS_INTERNAL_ERROR, NULL); return 0; error: @@ -80401,9 +81442,15 @@ int flecs_expr_visit_type( if (node->kind == EcsExprEmptyInitializer) { node->type = desc->type; if (node->type) { + if (flecs_expr_initializer_collection_check( + script, (ecs_expr_initializer_t*)node, NULL)) + { + return -1; + } + node->type_info = ecs_get_type_info(script->world, node->type); + return 0; } - return 0; } if (desc->type) { diff --git a/deps/flecs.h b/deps/flecs.h index 6d15de6..2295d33 100644 --- a/deps/flecs.h +++ b/deps/flecs.h @@ -5821,6 +5821,24 @@ void ecs_run_aperiodic( ecs_world_t *world, ecs_flags32_t flags); +/** Used with ecs_delete_empty_tables(). */ +typedef struct ecs_delete_empty_tables_desc_t { + /** Optional component filter for the tables to evaluate. */ + ecs_id_t id; + + /** Free table data when generation > clear_generation. */ + uint16_t clear_generation; + + /** Delete table when generation > delete_generation. */ + uint16_t delete_generation; + + /** Minimum number of component ids the table should have. */ + int32_t min_id_count; + + /** Amount of time operation is allowed to spend. */ + double time_budget_seconds; +} ecs_delete_empty_tables_desc_t; + /** Cleanup empty tables. * This operation cleans up empty tables that meet certain conditions. Having * large amounts of empty tables does not negatively impact performance of the @@ -5847,21 +5865,13 @@ void ecs_run_aperiodic( * The time budget specifies how long the operation should take at most. * * @param world The world. - * @param id Optional component filter for the tables to evaluate. - * @param clear_generation Free table data when generation > clear_generation. - * @param delete_generation Delete table when generation > delete_generation. - * @param min_id_count Minimum number of component ids the table should have. - * @param time_budget_seconds Amount of time operation is allowed to spend. + * @param desc Configuration parameters. * @return Number of deleted tables. */ FLECS_API int32_t ecs_delete_empty_tables( ecs_world_t *world, - ecs_id_t id, - uint16_t clear_generation, - uint16_t delete_generation, - int32_t min_id_count, - double time_budget_seconds); + const ecs_delete_empty_tables_desc_t *desc); /** Get world from poly. * @@ -10727,6 +10737,22 @@ void ecs_parser_errorv_( const char *fmt, va_list args); +FLECS_API +void ecs_parser_warning_( + const char *name, + const char *expr, + int64_t column, + const char *fmt, + ...); + +FLECS_API +void ecs_parser_warningv_( + const char *name, + const char *expr, + int64_t column, + const char *fmt, + va_list args); + //////////////////////////////////////////////////////////////////////////////// //// Logging macros @@ -10972,6 +10998,12 @@ void ecs_parser_errorv_( #define ecs_parser_errorv(name, expr, column, fmt, args)\ ecs_parser_errorv_(name, expr, column, fmt, args) +#define ecs_parser_warning(name, expr, column, ...)\ + ecs_parser_warning_(name, expr, column, __VA_ARGS__) + +#define ecs_parser_warningv(name, expr, column, fmt, args)\ + ecs_parser_warningv_(name, expr, column, fmt, args) + #endif // FLECS_LEGACY @@ -11471,6 +11503,7 @@ int ecs_http_server_request( ecs_http_server_t* srv, const char *method, const char *req, + const char *body, ecs_http_reply_t *reply_out); /** Get context provided in ecs_http_server_desc_t */ diff --git a/deps/flecs_systems_sokol.c b/deps/flecs_systems_sokol.c index 8b9dc39..8c45c6f 100644 --- a/deps/flecs_systems_sokol.c +++ b/deps/flecs_systems_sokol.c @@ -29125,7 +29125,7 @@ SOKOL_API_IMPL sg_context_desc sapp_sgcontext(void) { #define SOKOL_MAX_FX_OUTPUTS (8) #define SOKOL_MAX_FX_PASS (8) #define SOKOL_MAX_FX_PARAMS (32) -#define SOKOL_SHADOW_MAP_SIZE (8192) +#define SOKOL_SHADOW_MAP_SIZE (8192 * 2) #define SOKOL_DEFAULT_DEPTH_NEAR (2.0) #define SOKOL_DEFAULT_DEPTH_FAR (2500.0) #define SOKOL_MAX_LIGHTS (32) @@ -29590,47 +29590,6 @@ void sokol_run_atmos_to_screen_pass( #endif -/** @file Internal materials module. - * - * Assigns material ids to new materials. Materials are uploaded to the vertex - * shader as a uniform array with SOKOL_MAX_MATERIALS elements. The data that is - * uploaded to the vertex shader includes this material id, which is then used - * by the vertex shader to pass the correct material properties to the fragment - * shader. - */ - -#ifndef SOKOL_MODULES_MATERIALS_H -#define SOKOL_MODULES_MATERIALS_H - - -#define SOKOL_MAX_MATERIALS (255) - -/* Component with material id, assigned to any entity that has material data */ -typedef struct { - uint32_t value; -} SokolMaterialId; - -/* Element with material parameters */ -typedef struct { - float specular_power; - float shininess; - float emissive; -} SokolMaterial; - -/* Array with material data. Is added to same entity as Renderer. */ -typedef struct { - bool changed; - SokolMaterial array[SOKOL_MAX_MATERIALS]; -} SokolMaterials; - -extern ECS_COMPONENT_DECLARE(SokolMaterialId); -extern ECS_COMPONENT_DECLARE(SokolMaterials); - -void FlecsSystemsSokolMaterialsImport( - ecs_world_t *world); - -#endif - /** @file Internal renderer module. */ @@ -29715,9 +29674,15 @@ typedef struct SokolGeometryQuery { ecs_entity_t component; ecs_query_t *parent_query; ecs_query_t *solid; - ecs_query_t *emissive; } SokolGeometryQuery; +/* Element with material parameters */ +typedef struct { + float specular_power; + float shininess; + float emissive; +} SokolMaterial; + extern ECS_COMPONENT_DECLARE(SokolGeometry); extern ECS_COMPONENT_DECLARE(SokolGeometryQuery); @@ -30045,7 +30010,6 @@ void FlecsSystemsSokolImport( ECS_IMPORT(world, FlecsComponentsGui); ECS_IMPORT(world, FlecsComponentsInput); - ECS_IMPORT(world, FlecsSystemsSokolMaterials); ECS_IMPORT(world, FlecsSystemsSokolRenderer); ECS_IMPORT(world, FlecsSystemsSokolGeometry); @@ -32019,7 +31983,6 @@ void sokol_run_shadow_pass( int b; for (b = 0; b < qit.count; b ++) { - /* Only draw solids, ignore emissive and transparent (for now) */ shadow_draw_instances(&geometry[b], &geometry[b].solid); } } @@ -32331,7 +32294,6 @@ void sokol_geometry_buffers_fini(ecs_allocator_t *a, sokol_geometry_buffers_t* r static void sokol_free_geometry(SokolGeometry *ptr) { sokol_geometry_buffers_fini(ptr->allocator, &ptr->solid); - sokol_geometry_buffers_fini(ptr->allocator, &ptr->emissive); if (ptr->allocator) { flecs_allocator_fini(ptr->allocator); ecs_os_free(ptr->allocator); @@ -32349,7 +32311,6 @@ ECS_CTOR(SokolGeometry, ptr, { sokol_geometry_buffers_init(ptr->allocator, &ptr->solid); - sokol_geometry_buffers_init(ptr->allocator, &ptr->emissive); }) ECS_MOVE(SokolGeometry, dst, src, { @@ -32457,8 +32418,7 @@ static void sokol_populate_buffers( SokolGeometry *geometry, sokol_geometry_buffers_t *buffers, - ecs_query_t *query, - const SokolMaterial *material_data) + ecs_query_t *query) { const ecs_world_t *world = ecs_get_world(query); ecs_allocator_t *a = geometry->allocator; @@ -32473,9 +32433,10 @@ void sokol_populate_buffers( while (ecs_query_next(&qit)) { EcsTransform3 *transforms = ecs_field(&qit, EcsTransform3, 0); EcsRgb *colors = ecs_field(&qit, EcsRgb, 1); - SokolMaterialId *materials = ecs_field(&qit, SokolMaterialId, 2); - void *geometry_data = ecs_field_w_size(&qit, 0, 3); - bool geometry_self = ecs_field_is_self(&qit, 3); + EcsEmissive *emissive = ecs_field(&qit, EcsEmissive, 2); + EcsSpecular *specular = ecs_field(&qit, EcsSpecular, 3); + void *geometry_data = ecs_field_w_size(&qit, 0, 4); + bool geometry_self = ecs_field_is_self(&qit, 4); int32_t cur = ecs_vec_count(&buffers->colors_data); int32_t count = qit.count; @@ -32498,15 +32459,42 @@ void sokol_populate_buffers( } } - // Copy material data - if (materials) { - uint64_t material_id = materials->value; - for (i = 0; i < count; i ++) { - // Fetch material data from material array. We can't pass - // the material index/array to the shader as this is not - // supported by WebGL. - *ecs_vec_get_t(&buffers->materials_data, SokolMaterial, cur + i) = - material_data[material_id]; + if (emissive || specular) { + SokolMaterial *m = ecs_vec_get_t( + &buffers->materials_data, SokolMaterial, cur); + if (emissive) { + if (ecs_field_is_self(&qit, 2)) { + for (i = 0; i < count; i ++) { + m[i].emissive = emissive[i].value; + } + } else { + for (i = 0; i < count; i ++) { + m[i].emissive = emissive->value; + } + } + } else { + for (i = 0; i < count; i ++) { + m[i].emissive = 0; + } + } + + if (specular) { + if (ecs_field_is_self(&qit, 3)) { + for (i = 0; i < count; i ++) { + m[i].specular_power = specular[i].specular_power; + m[i].shininess = specular[i].shininess; + } + } else { + for (i = 0; i < count; i ++) { + m[i].specular_power = specular->specular_power; + m[i].shininess = specular->shininess; + } + } + } else { + for (i = 0; i < count; i ++) { + m[i].specular_power = 0; + m[i].shininess = 0; + } } } else { ecs_os_memset_n( @@ -32562,16 +32550,9 @@ void SokolPopulateGeometry( SokolGeometry *g = ecs_field(it, SokolGeometry, 0); SokolGeometryQuery *q = ecs_field(it, SokolGeometryQuery, 1); - const SokolMaterials *materials = ecs_get( - it->world, SokolRendererInst, SokolMaterials); - const SokolMaterial *material_data = materials->array; - int i; for (i = 0; i < it->count; i ++) { - // Solid and emissive objects are split up, so we can treat emissive - // objects differently, for example when doing shadow mapping. - sokol_populate_buffers(&g[i], &g[i].solid, q[i].solid, material_data); - sokol_populate_buffers(&g[i], &g[i].emissive, q[i].emissive, material_data); + sokol_populate_buffers(&g[i], &g[i].solid, q[i].solid); } } @@ -32592,19 +32573,17 @@ void CreateGeometryQueries(ecs_iter_t *it) { }, { .id = ecs_id(EcsRgb), .inout = EcsIn - }, { - .id = ecs_id(SokolMaterialId), - .src.id = EcsUp, - .trav = EcsIsA, - .oper = EcsOptional, - .inout = EcsIn - }, { - .id = gq[i].component, - .inout = EcsIn }, { .id = ecs_id(EcsEmissive), .inout = EcsInOutNone, - .oper = EcsNot + .oper = EcsOptional + }, { + .id = ecs_id(EcsSpecular), + .inout = EcsInOutNone, + .oper = EcsOptional + }, { + .id = gq[i].component, + .inout = EcsIn }, { .id = ecs_id(EcsPosition3), .src.id = EcsSelf, @@ -32613,7 +32592,7 @@ void CreateGeometryQueries(ecs_iter_t *it) { .cache_kind = EcsQueryCacheAuto }; - /* Query for solid, non-emissive objects */ + /* Query for solid objects */ desc.entity = ecs_entity(world, { .name = ecs_get_name(world, gq[i].component), .parent = ecs_entity(world, { @@ -32628,23 +32607,6 @@ void CreateGeometryQueries(ecs_iter_t *it) { component_str); ecs_os_free(component_str); } - - /* Query for solid, emissive objects */ - desc.entity = ecs_entity(world, { - .name = ecs_get_name(world, gq[i].component), - .parent = ecs_entity(world, { - .name = "#0.flecs.systems.sokol.geometry_queries.emissive" - }) - }); - - desc.terms[4].oper = 0; /* Remove Not operator */ - gq[i].emissive = ecs_query_init(world, &desc); - if (!gq[i].emissive) { - char *component_str = ecs_id_str(world, gq[i].component); - ecs_err("sokol: failed to create query for emissive %s geometry", - component_str); - ecs_os_free(component_str); - } } } @@ -32673,7 +32635,7 @@ void FlecsSystemsSokolGeometryImport( ecs_set_scope(world, module); - /* Create queries for solid and emissive */ + /* Create queries for solid objects */ ECS_OBSERVER(world, CreateGeometryQueries, EcsOnSet, Geometry, GeometryQuery); @@ -32694,166 +32656,6 @@ void FlecsSystemsSokolGeometryImport( Geometry, [in] GeometryQuery); } - -ECS_COMPONENT_DECLARE(SokolMaterialId); -ECS_COMPONENT_DECLARE(SokolMaterials); - -void SokolInitMaterials(ecs_iter_t *it) { - const SokolQuery *q = ecs_field(it, SokolQuery, 0); - SokolMaterials *materials = ecs_field(it, SokolMaterials, 1); - - materials->changed = true; - materials->array[0].specular_power = 0.0; - materials->array[0].shininess = 1.0; - materials->array[0].emissive = 0.0; - - if (!ecs_query_changed(q->query)) { - materials->changed = false; - return; - } - - ecs_iter_t qit = ecs_query_iter(it->world, q->query); - while (ecs_query_next(&qit)) { - SokolMaterialId *mat = ecs_field(&qit, SokolMaterialId, 0); - EcsSpecular *spec = ecs_field(&qit, EcsSpecular, 1); - EcsEmissive *em = ecs_field(&qit, EcsEmissive, 2); - - int i; - if (spec) { - for (i = 0; i < qit.count; i ++) { - uint16_t id = mat[i].value; - materials->array[id].specular_power = spec[i].specular_power; - materials->array[id].shininess = spec[i].shininess; - } - } else { - for (i = 0; i < qit.count; i ++) { - uint16_t id = mat[i].value; - materials->array[id].specular_power = 0; - materials->array[id].shininess = 1.0; - } - } - - if (em) { - for (i = 0; i < qit.count; i ++) { - uint16_t id = mat[i].value; - materials->array[id].emissive = em[i].value; - } - } else { - for (i = 0; i < qit.count; i ++) { - uint16_t id = mat[i].value; - materials->array[id].emissive = 0; - } - } - } -} - -static -void SokolRegisterMaterial(ecs_iter_t *it) { - static uint16_t next_material = 1; /* 0 is the default material */ - - ecs_vec_t *material_free_list = it->ctx; - - int i; - for (i = 0; i < it->count; i ++) { - uint16_t material_id; - if (ecs_vec_count(material_free_list)) { - material_id = ecs_vec_last_t(material_free_list, uint16_t)[0]; - ecs_assert(material_id != 0, ECS_INTERNAL_ERROR, NULL); - ecs_vec_remove_last(material_free_list); - } else { - material_id = next_material ++; - } - - ecs_set(it->world, it->entities[i], SokolMaterialId, { material_id }); - } - - ecs_assert(next_material < SOKOL_MAX_MATERIALS, - ECS_INVALID_PARAMETER, NULL); -} - -static -void SokolOnMaterialRemove(ecs_iter_t *it) { - SokolMaterialId *m = ecs_field(it, SokolMaterialId, 0); - - ecs_vec_t *material_free_list = it->ctx; - - for (int i = 0; i < it->count; i ++) { - ecs_vec_append_t(NULL, material_free_list, uint16_t)[0] = m[i].value; - } -} - -void FlecsSystemsSokolMaterialsImport( - ecs_world_t *world) -{ - ECS_MODULE(world, FlecsSystemsSokolMaterials); - - /* Store components in parent sokol scope */ - ecs_entity_t parent = ecs_lookup(world, "flecs.systems.sokol"); - ecs_entity_t module = ecs_set_scope(world, parent); - ecs_set_name_prefix(world, "Sokol"); - - ECS_COMPONENT_DEFINE(world, SokolMaterialId); - ECS_COMPONENT_DEFINE(world, SokolMaterials); - - ecs_struct(world, { - .entity = ecs_id(SokolMaterialId), - .members = {{ "value", ecs_id(ecs_u16_t) }} - }); - - ecs_add_pair(world, ecs_id(SokolMaterialId), EcsOnInstantiate, EcsInherit); - - /* Register systems in module scope */ - ecs_set_scope(world, module); - - /* Query that finds all entities with material properties */ - const char *material_query = - "[in] flecs.systems.sokol.MaterialId(self)," - "[in] ?flecs.components.graphics.Specular(self)," - "[in] ?flecs.components.graphics.Emissive(self)," - " ?Prefab"; - - /* System that initializes material array that's sent to vertex shader */ - ECS_SYSTEM(world, SokolInitMaterials, EcsOnLoad, - [in] sokol.Query(InitMaterials, Materials), - [out] Materials); - - /* Set material query for InitMaterials system */ - ecs_set_pair(world, SokolInitMaterials, SokolQuery, ecs_id(SokolMaterials),{ - ecs_query(world, { - .entity = ecs_entity(world, { - .name = "#0.flecs.systems.sokol.materials.query" - }), - .expr = material_query, - .cache_kind = EcsQueryCacheAuto - }) - }); - - /* Assigns material id to entities with material properties */ - ECS_SYSTEM(world, SokolRegisterMaterial, EcsPostLoad, - [out] !flecs.systems.sokol.MaterialId(self), - [in] flecs.components.graphics.Specular(self) || - flecs.components.graphics.Emissive(self), - ?Prefab); - - /* Vector used to track free material ids */ - ecs_vec_t *material_free_list = ecs_os_calloc_t(ecs_vec_t); - ecs_vec_init_t(NULL, material_free_list, uint16_t, 0); - - ecs_system(world, { - .entity = ecs_id(SokolRegisterMaterial), - .ctx = material_free_list - }); - - ECS_OBSERVER(world, SokolOnMaterialRemove, EcsOnRemove, - flecs.systems.sokol.MaterialId(self), - ?Prefab); - - ecs_observer(world, { - .entity = ecs_id(SokolOnMaterialRemove), - .ctx = material_free_list - }); -} - #include "math.h" ECS_COMPONENT_DECLARE(SokolRenderer); @@ -33420,8 +33222,6 @@ void SokolInitRenderer(ecs_iter_t *it) { ecs_trace("sokol: canvas initialized"); - ecs_set(world, SokolRendererInst, SokolMaterials, { true }); - ecs_set_pair(world, SokolRendererInst, SokolQuery, ecs_id(SokolGeometry), { ecs_query(world, { .expr = "[in] flecs.systems.sokol.Geometry" }) }); @@ -33443,7 +33243,6 @@ void FlecsSystemsSokolRendererImport( ecs_world_t *world) { ECS_MODULE(world, FlecsSystemsSokolRenderer); - ECS_IMPORT(world, FlecsSystemsSokolMaterials); ECS_IMPORT(world, FlecsSystemsSokolGeometry); /* Create components in parent scope */ diff --git a/etc/assets/app.flecs b/etc/assets/app.flecs index 2f359a3..2f80975 100644 --- a/etc/assets/app.flecs +++ b/etc/assets/app.flecs @@ -15,8 +15,8 @@ $ { camera { CameraController - Position3: {-4.61, 5.61, 15.06} - Rotation3: {0, 2.63, 0} + Position3: {12.43, 5.65, 10.20} + Rotation3: {-0.23, 4.04, 0} Camera: { fov: 20 up: [0, 1, 0] diff --git a/etc/assets/scene.flecs b/etc/assets/scene.flecs index f0d8a11..94bf404 100644 --- a/etc/assets/scene.flecs +++ b/etc/assets/scene.flecs @@ -1,449 +1,50 @@ -// Happy holidays! +// Script that creates a pen +// +// For C/C++ examples and docs go to: +// https://github.com/SanderMertens/flecs using flecs.script.* using flecs.components.* -// Globals -const Green = Rgb: {0.02, 0.22, 0.04} -const Wood = Rgb: {0.15, 0.1, 0.05} -const DarkWood = Rgb: {0.06, 0.03, 0.01} -const TrunkWood = Rgb: {0.025, 0.014, 0.002} -const Wall = Rgb: {0.22, 0.21, 0.2} -const rng = Rng: {} - -// Materials -prefab LightMaterial { - Rgb: {1, 1, 0.3} - Emissive: {2} -} - -template Light { - Box: {0.05, 0.15, 0.05} - (IsA, LightMaterial) - - _ { - Box: {0.12, 0.1, 0.12} - Rgb: {0, 0, 0} - Position3: {y: -0.1} - } -} - -prefab Flame { - Rgb: {1, 0.8, 0.3} - Emissive: {2} - PointLight: { - color: [1, 0.8, 0.3] - intensity: 0.3 - distance: 0.3 - } -} - -template Gift { - prop s = f32: 1 - const rw = 0.05 - const srw = $s + $rw - _ { - Position3: {y: $s/2} - Box: {$s, $s, $s} - Rgb: {0.25, 0, 0} - } - _ { - Position3: {y: $srw/2} - Box: {$srw, $srw, $s/5} - Rgb: {0.8, 0.8, 0} - } - _ { - Position3: {y: $srw/2} - Box: {$s/5, $srw, $srw} - Rgb: {0.8, 0.8, 0} - } -} - -template Candle { - prop height = f32: 1.2 - prop base_height = f32: 0.6 - prop base_width = f32: 0.4 - _ { - Position3: {y: $base_height / 2} - Box: {$base_width, $base_height, $base_width} - Rgb: {0.03, 0.03, 0.03} - } - _ { - Position3: {y: $base_height + $height / 2} - Box: {0.2, $height, 0.2} - Rgb: {0.2} - } - _ : Flame { - Position3: {y: $base_height + $height} - Box: {0.1, 0.4, 0.1} - } -} - -template Sock { - _ { - Position3: {0, 0, 0} - Box: {0.3, 0.5, 0.8} - Rgb: {1, 0, 0} - } - _ { - Position3: {0, -0.5, 0} - Box: {0.3, 0.5, 0.8} - Rgb: {1, 1, 1} - } - _ { - Position3: {0, -1, 0} - Box: {0.3, 0.5, 0.8} - Rgb: {1, 0, 0} - } - _ { - Position3: {0, -1.5, 0.35} - Box: {0.3, 0.5, 1.5} - Rgb: {1, 1, 1} - } -} - -template FirePlace { - const width = 13 - const depth = 1.8 - const height = 5 - - _ { - Position3: {14.5 - $depth / 2, $height / 2, -$width / 2} - Box: {$depth, $height, 1.2} - $Wall - } - - _ { - Position3: {14.5 - $depth / 2, $height / 2, $width / 2} - Box: {$depth, $height, 1.2} - $Wall - } - - _ { - Position3: {14.5 - $depth / 2, $height - 0.6, 0} - Box: {$depth, 1.2, $width - 1.2} - $Wall - } - - _ { - Position3: {15, 15, 0} - Box: {1.5, 30, $width * 1.4} - $Wall - } - - _ { - Position3: {14.5 - $depth / 2, 0.25, 0} - Box: {$depth, 0.5, $width - 1.2} - Rgb: {0.025, 0.025, 0.025} - } - - _ { - Position3: {14.5 - $depth + $depth, $height / 2 - 1.2, 0} - Box: {0.8, $height, $width - 1.2} - Rgb: {0.025, 0.025, 0.025} - } - - _ { - Position3: {14.5 - $depth / 2, $height / 2 - 0.6, -$width / 2 + 0.6} - Box: {$depth, $height - 1.2, 0.2} - Rgb: {0.025, 0.025, 0.025} - } - - _ { - Position3: {14.5 - $depth / 2, $height / 2 - 0.6, $width / 2 - 0.6} - Box: {$depth, $height - 1.2, 0.2} - Rgb: {0.025, 0.025, 0.025} - } -} - -template Tv { - const width = 11 - const height = 6 - _ { - Position3: {} - Box: {0.1, $height, $width} - Rgb: {0.01, 0.01, 0.01} - } - with Rgb(0.1, 0.1, 0.1) { - _ { - Position3: {z: $width / 2} - Box: {0.2, $height, 0.2} - } - _ { - Position3: {z: -$width / 2} - Box: {0.2, $height, 0.2} - } - _ { - Position3: {z: -$width / 2} - Box: {0.2, $height, 0.2} - } - _ { - Position3: {y: $height / 2} - Box: {0.2, 0.2, $width + 0.2} - } - _ { - Position3: {y: -$height / 2} - Box: {0.2, 0.2, $width + 0.2} - } - } -} - -template Book { - const h = $rng.f(1) + 1; - const w = $rng.f(0.7) +0.3 - _ { - Box: {0.5, $h, $w} - Rgb: {$rng.f(0.03),$rng.f(0.03),$rng.f(0.03)} - Position3: {y: $h / 2, $w / 2} - } -} - -template BookCase { - const shelves = i32: 7 - const width = f32: 10 - const depth = f32: 3 - const shelve_height = 2.3 - const height = $shelves * $shelve_height - - with $DarkWood { - _ { - Position3: {-$width / 2, $height / 2, 0} - Box: {0.5, $height, $depth} - } - _ { - Position3: {$width / 2, $height / 2, 0} - Box: {0.5, $height, $depth} - } - _ { - Position3: {0, $height - 0.25, 0} - Box: {$width, 0.5, $depth} - } - _ { - Position3: {0, $height / 2, 0} - Box: {$width, $height, 0.1} - Rgb: {0.0, 0.0, 0.0} - } - for i in 0..$shelves { - _ { - Position3: {0, $i * $shelve_height, -0.25} - Box: {$width, 0.25, $depth - 0.5} - - for b in 0..($width * 2 - 1) { - Book() { - Position3: {x: (0.5 + $b * 0.5) - $width / 2} - } - } - } - } - } +template FencePost { + prop x: 0.0 + Position3: {x, 1} + Box: {0.5, 2, 0.5} } -template PostCard { - prop height = f32: 1 - prop color = Rgb: {0.2, 0, 0} - - _ { - Position3: {y: $height / 2} - Box: {0.05, $height, 0.6} - $color - } - _ { - Position3: {x: 0.25, y: $height / 2, z: -0.095} - Rotation3: {y: 0.8} - Box: {0.05, $height, 0.6} - $color - } +template FenceBoard { + prop width: 10.0 + prop y: 1.0 + Position3: {0, y} + Box: {width, 0.5, 0.2} } -template Plant { - prop height = f32: 1 - prop width = f32: 0.8 - prop plant_height = f32: 1.8 - - _ { - Position3: {y: 0.5 + 0.1} - Box: {$width, $height - 0.1, $width} - Rgb: {0.2, 0.2, 0.2} - } - - with $Wood, Box(0.2, $height, 0.2) { - const w = $width - 0.07 - _ { - Position3: {-$w / 2, $height / 2, -$w / 2} - } - _ { - Position3: {$w / 2, $height / 2, -$w / 2} - } - _ { - Position3: {-$w / 2, $height / 2, $w / 2} - } - _ { - Position3: {$w / 2, $height / 2, $w / 2} - } - } - - _ { - Position3: {y: $plant_height / 2} - Box: {0.1, $plant_height, 0.1} - $TrunkWood - } +template Fence { + prop width: 10.0 + const post_count = i32: 2 + width / 5 + const post_spacing: width / (post_count - 1) - with Rgb(0.05, 0.14) { - _ { - Position3: {y: $plant_height - 0.5} - Box: {0.2, 0.2, 0.2} - } - _ { - Position3: {y: $plant_height - 0.3} - Box: {0.4, 0.2, 0.4} + with Rgb(0.15, 0.1, 0.05) { + for i in 0..post_count { + FencePost(i * post_spacing - width / 2) } - _ { - Position3: {y: $plant_height} - Box: {0.3, 0.2, 0.3} - } - } -} - -scene { - Rotation3: {y: 0.2} - -// Floor -for x in 0..30 { - _ { - Position3: {$x * 1.1 - 15, 0.125, 0} - Box: {1, 0.25, 30} - $Wood - } -} - -_ { - Position3: {0, 0, 0} - Box: {30, 0.1, 30} - $Wood -} - -// Walls -_ { - Position3: {15, 15, 0} - Box: {1, 30, 30} - $Wall -} - -_ { - Position3: {0, 15, -15} - Box: {30, 30, 1} - $Wall -} - -// Tree -const Height = 11 -const TrunkHeight = 3.3 -const Lights = 60 - -_ { - Position3: {0, $TrunkHeight / 2, 0} - Box: {2, $TrunkHeight, 2} - $TrunkWood -} - -for y in 0..$Height { - const w = ($y - $Height) * 0.6 - _ { - Position3: {0, $y + $TrunkHeight, 0} - Box: {$w, 1, $w} - $Green - } -} - -for i in 0..$Lights { - for s in 0..4 { - const h = $rng.u(1 + $i * ($Height / $Lights)) - const w = ($h - $Height) * 0.6 - const x = $rng.f($w) - const hv = $h + ($rng.f(0.5) - 0.25) - Light () { - if $s == 0 { - Position3: {-$w / 2 + 0.05, $hv + $TrunkHeight, $x - $w / 2} - } - if $s == 1 { - Position3: {$w / 2 - 0.05, $hv + $TrunkHeight, $x - $w / 2} - } - if $s == 2 { - Position3: {$x - $w / 2, $hv + $TrunkHeight, $w / 2 - 0.05} - } - if $s == 3 { - Position3: {$x - $w / 2, $hv + $TrunkHeight, -$w / 2 + 0.05} - } - } + FenceBoard(width, 0.5) + FenceBoard(width, 1.5) } } -// Gifts -Gift(2) { - Position3: {-4, 0.4} - Rotation3: {y: 0.5} -} - -Gift(1.3) { - Position3: {-4.5, 0.4, 3} - Rotation3: {y: 0.1} -} - -Gift(1.7) { - Position3: {-2.5, 0.4, 2.6} - Rotation3: {y: -0.2} -} +template Pen { + prop width: 10.0 + prop depth: 10.0 + + Fence(width) { Position3: {z: 0.5 * -depth} } + Fence(width) { Position3: {z: 0.5 * depth} } -for i in 0..4 { - Sock() { - Position3: {12.6, 4, $i * 3 - 4.7} - Rotation3: {x: -0.1} + with Rotation3(y: PI / 2) { + Fence(depth) { Position3: {x: 0.5 * -width} } + Fence(depth) { Position3: {x: 0.5 * width} } } } -// Decoration -FirePlace() - -Tv() { - Position3: {14.1, 11, 0} -} - -BookCase() { - Position3: {-4, 0.3, -13} -} - -Candle(1.2) { - Position3: {13.4, 5, 6.5} - Rotation3: {y: -0.6} -} - -Candle(1) { - Position3: {13.5, 5, 5.8} - Rotation3: {y: 0.5} -} - -PostCard(0.8) { - Position3: {13.3, 5} - Rotation3: {y: 6.8} -} - -PostCard(1, {0.1, 0.2, 0.1}) { - Position3: {13.4, 5, 0.9} - Rotation3: {y: 6.9} -} - -PostCard(0.6, {0.4, 0.4, 0.4}) { - Position3: {13.5, 5, 1.6} - Rotation3: {y: 7.1} -} - -Plant() { - Position3: {13.5, 5, -6.2} -} - -} // scene - -$ { - flecs.game.TimeOfDay: {0.1} -} +Pen my_pen(width: 10, depth: 15) diff --git a/etc/flecs.js b/etc/flecs.js index 7d4ef60..dfcfd2b 100644 --- a/etc/flecs.js +++ b/etc/flecs.js @@ -323,7 +323,8 @@ const flecs = { // Update script code scriptUpdate: function(path, code, params, recv, err) { if (!params) params = {}; - params.code = encodeURIComponent(code); + params.pay + params.payload = code; path = this._.escapePath(path); return this._.request(this, "PUT", "script/" + path, params, (msg) => { @@ -385,11 +386,17 @@ const flecs = { // If this is a dryrun we're only returning the URL. Don't include the // dryrun parameter in the returned URL. let dryrun = false; - if (params.dryrun) { dryrun = true; delete params.dryrun; } + + let payload = undefined; + + if (params.payload) { + payload = params.payload; + delete params.payload; + } if (params.managed) { poll_interval_ms = conn.params.poll_interval_ms; @@ -494,7 +501,7 @@ const flecs = { }; // Send it - this.request.send(); + this.request.send(payload); conn.requests.sent ++; }, @@ -705,7 +712,7 @@ const flecs = { const name = wasm_url.slice(wasm_url.lastIndexOf("/") + 1, wasm_url.lastIndexOf(".")); wasm_module = Function(`return ` + name + `;`)(); wasm_module().then(function(Module) { - let nativeRequest = Module.cwrap('flecs_explorer_request', 'string', ['string', 'string']); + let nativeRequest = Module.cwrap('flecs_explorer_request', 'string', ['string', 'string', 'string']); flecs.captureKeyboardEvents = Module.sokol_capture_keyboard_events; if (flecs.captureKeyboardEvents) { Module.sokol_capture_keyboard_events(false); @@ -726,8 +733,8 @@ const flecs = { this.url = url; }, - send() { - const reply = nativeRequest(this.method, this.url); + send(body) { + const reply = nativeRequest(this.method, this.url, body); this.responseText = reply; // Check for errors, in which case we must set the status diff --git a/etc/flecs_explorer.js b/etc/flecs_explorer.js index 7c21ce2..14cdad4 100644 --- a/etc/flecs_explorer.js +++ b/etc/flecs_explorer.js @@ -5,7 +5,7 @@ var flecs_explorer = (() => { return ( function(moduleArg = {}) { -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;SOCKFS.root=FS.mount(SOCKFS,{},null);if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="flecs_explorer.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["Yb"];updateMemoryViews();wasmTable=wasmExports["lc"];addOnInit(wasmExports["Zb"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function sapp_js_create_textfield(){const _sapp_inp=document.createElement("input");_sapp_inp.type="text";_sapp_inp.id="_sokol_app_input_element";_sapp_inp.autocapitalize="none";_sapp_inp.addEventListener("focusout",function(_sapp_event){__sapp_emsc_notify_keyboard_hidden()});document.body.append(_sapp_inp)}function sapp_js_focus_textfield(){document.getElementById("_sokol_app_input_element").focus()}function sapp_js_unfocus_textfield(){document.getElementById("_sokol_app_input_element").blur()}function sapp_js_add_beforeunload_listener(){Module.sokol_beforeunload=event=>{if(__sapp_html5_get_ask_leave_site()!=0){event.preventDefault();event.returnValue=" "}};window.addEventListener("beforeunload",Module.sokol_beforeunload)}function sapp_js_remove_beforeunload_listener(){window.removeEventListener("beforeunload",Module.sokol_beforeunload)}function sapp_js_add_clipboard_listener(){Module.sokol_paste=event=>{const pasted_str=event.clipboardData.getData("text");withStackSave(()=>{const cstr=allocateUTF8OnStack(pasted_str);__sapp_emsc_onpaste(cstr)})};window.addEventListener("paste",Module.sokol_paste)}function sapp_js_remove_clipboard_listener(){window.removeEventListener("paste",Module.sokol_paste)}function sapp_js_add_dragndrop_listeners(canvas_name_cstr){Module.sokol_drop_files=[];const canvas_name=UTF8ToString(canvas_name_cstr);const canvas=document.getElementById(canvas_name);Module.sokol_dragenter=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_dragleave=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_dragover=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_drop=event=>{event.stopPropagation();event.preventDefault();const files=event.dataTransfer.files;Module.sokol_dropped_files=files;__sapp_emsc_begin_drop(files.length);for(let i=0;i{const cstr=allocateUTF8OnStack(files[i].name);__sapp_emsc_drop(i,cstr)})}__sapp_emsc_end_drop(event.clientX,event.clientY)};canvas.addEventListener("dragenter",Module.sokol_dragenter,false);canvas.addEventListener("dragleave",Module.sokol_dragleave,false);canvas.addEventListener("dragover",Module.sokol_dragover,false);canvas.addEventListener("drop",Module.sokol_drop,false)}function sapp_js_remove_dragndrop_listeners(canvas_name_cstr){const canvas_name=UTF8ToString(canvas_name_cstr);const canvas=document.getElementById(canvas_name);canvas.removeEventListener("dragenter",Module.sokol_dragenter);canvas.removeEventListener("dragleave",Module.sokol_dragleave);canvas.removeEventListener("dragover",Module.sokol_dragover);canvas.removeEventListener("drop",Module.sokol_drop)}function sapp_js_add_capture_keyboard_events(){Module.sokol_capture_keyboard_events=function(capture){__sapp_emsc_capture_keyboard_events(capture)}}function sapp_js_init(c_str_target){const target_str=UTF8ToString(c_str_target);Module.sapp_emsc_target=document.getElementById(target_str);if(!Module.sapp_emsc_target){console.log("sokol_app.h: invalid target:"+target_str)}if(!Module.sapp_emsc_target.requestPointerLock){console.log("sokol_app.h: target doesn't support requestPointerLock:"+target_str)}}function sapp_js_request_pointerlock(){if(Module.sapp_emsc_target){if(Module.sapp_emsc_target.requestPointerLock){Module.sapp_emsc_target.requestPointerLock()}}}function slog_js_log(level,c_str){const str=UTF8ToString(c_str);switch(level){case 0:console.error(str);break;case 1:console.error(str);break;case 2:console.warn(str);break;default:console.info(str);break}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn);var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SOCKFS={mount(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer(sock,addr,port){return sock.peers[addr+":"+port]},addPeer(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i{var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};var jstoi_q=str=>parseInt(str);var inetPton6=str=>{var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0};var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}};var getSocketAddress=(addrp,addrlen,allowNull)=>{if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info};function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.getp();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.getp();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.getp();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.getp();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.getp();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __emscripten_fs_load_embedded_files=ptr=>{do{var name_addr=HEAPU32[ptr>>2];ptr+=4;var len=HEAPU32[ptr>>2];ptr+=4;var content=HEAPU32[ptr>>2];ptr+=4;var name=UTF8ToString(name_addr);FS.createPath("/",PATH.dirname(name),true,true);FS.createDataFile(name,null,HEAP8.subarray(content,content+len),true,true,true)}while(HEAPU32[ptr>>2])};var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var _abort=()=>{abort("")};var _emscripten_date_now=()=>Date.now();var _emscripten_get_device_pixel_ratio=()=>typeof devicePixelRatio=="number"&&devicePixelRatio||1;var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var JSEvents={inEventHandler:0,removeAllEventListeners(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort((x,y)=>x.precedence{for(var i=0;icString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement};var getBoundingClientRect=e=>specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0};var _emscripten_get_element_css_size=(target,width,height)=>{target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0};var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var _emscripten_request_animation_frame_loop=(cb,userData)=>{function tick(timeStamp){if(getWasmTableEntry(cb)(timeStamp,userData)){requestAnimationFrame(tick)}}return requestAnimationFrame(tick)};var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var registerFocusEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=(e=event)=>{var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getWasmTableEntry(callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_blur_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);var findCanvasEventTarget=target=>findEventTarget(target);var _emscripten_set_canvas_element_size=(target,width,height)=>{var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0};var _emscripten_set_focus_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);var registerKeyEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(176);var keyEventHandlerFunc=e=>{var keyEventData=JSEvents.keyEvent;HEAPF64[keyEventData>>3]=e.timeStamp;var idx=keyEventData>>2;HEAP32[idx+2]=e.location;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;HEAP32[idx+7]=e.repeat;HEAP32[idx+8]=e.charCode;HEAP32[idx+9]=e.keyCode;HEAP32[idx+10]=e.which;stringToUTF8(e.key||"",keyEventData+44,32);stringToUTF8(e.code||"",keyEventData+76,32);stringToUTF8(e.char||"",keyEventData+108,32);stringToUTF8(e.locale||"",keyEventData+140,32);if(getWasmTableEntry(callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_keydown_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);var _emscripten_set_keypress_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread);var _emscripten_set_keyup_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);var fillMouseEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP32[idx+6]=e.ctrlKey;HEAP32[idx+7]=e.shiftKey;HEAP32[idx+8]=e.altKey;HEAP32[idx+9]=e.metaKey;HEAP16[idx*2+20]=e.button;HEAP16[idx*2+21]=e.buttons;HEAP32[idx+11]=e["movementX"];HEAP32[idx+12]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13]=e.clientX-rect.left;HEAP32[idx+14]=e.clientY-rect.top};var registerMouseEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=(e=event)=>{fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_mousedown_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);var _emscripten_set_mouseenter_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,33,"mouseenter",targetThread);var _emscripten_set_mouseleave_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,34,"mouseleave",targetThread);var _emscripten_set_mousemove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);var _emscripten_set_mouseup_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);var fillPointerlockChangeEventData=eventStruct=>{var pointerLockElement=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement||document.msPointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP32[eventStruct>>2]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement&&pointerLockElement.id?pointerLockElement.id:"";stringToUTF8(nodeName,eventStruct+4,128);stringToUTF8(id,eventStruct+132,128)};var registerPointerlockChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.pointerlockChangeEvent)JSEvents.pointerlockChangeEvent=_malloc(260);var pointerlockChangeEventHandlerFunc=(e=event)=>{var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;fillPointerlockChangeEventData(pointerlockChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_pointerlockchange_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!document||!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mozpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"webkitpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mspointerlockchange",targetThread);return registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread)};var registerPointerlockErrorEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var pointerlockErrorEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockErrorEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_pointerlockerror_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!document||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mozpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"webkitpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mspointerlockerror",targetThread);return registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"pointerlockerror",targetThread)};var registerUiEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=(e=event)=>{if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=e.detail;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset;HEAP32[uiEvent+32>>2]=pageYOffset;if(getWasmTableEntry(callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_resize_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);var registerTouchEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=e=>{var t,touches={},et=e.touches;for(var i=0;i>3]=e.timeStamp;var idx=touchEvent>>2;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_touchcancel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);var _emscripten_set_touchend_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);var _emscripten_set_touchmove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);var _emscripten_set_touchstart_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{var source="";for(var i=0;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:context=>{if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var registerWebGlEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var webGlEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:webGlEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_webglcontextlost_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{registerWebGlEventCallback(target,userData,useCapture,callbackfunc,31,"webglcontextlost",targetThread);return 0};var _emscripten_set_webglcontextrestored_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{registerWebGlEventCallback(target,userData,useCapture,callbackfunc,32,"webglcontextrestored",targetThread);return 0};var registerWheelEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(104);var wheelHandlerFunc=(e=event)=>{var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+72>>3]=e["deltaX"];HEAPF64[wheelEvent+80>>3]=e["deltaY"];HEAPF64[wheelEvent+88>>3]=e["deltaZ"];HEAP32[wheelEvent+96>>2]=e["deltaMode"];if(getWasmTableEntry(callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_wheel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{target=findEventTarget(target);if(!target)return-4;if(typeof target.onwheel!="undefined"){return registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread)}else{return-1}};var emscripten_webgl_power_preferences=["default","low-power","high-performance"];var _emscripten_webgl_do_create_context=(target,attributes)=>{var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle};var _emscripten_webgl_create_context=_emscripten_webgl_do_create_context;var _emscripten_webgl_enable_extension=(contextHandle,extension)=>{var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.substr(3);if(extString=="ANGLE_instanced_arrays")webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw")webgl_enable_WEBGL_multi_draw(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext};var _emscripten_webgl_init_context_attributes=attributes=>{var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1};var _emscripten_webgl_make_context_current=contextHandle=>{var success=GL.makeContextCurrent(contextHandle);return success?0:-5};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _getnameinfo=(sa,salen,node,nodelen,serv,servlen,flags)=>{var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0};function _glActiveTexture(x0){GLctx.activeTexture(x0)}var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _glBindBuffer=(target,buffer)=>{if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};function _glBlendColor(x0,x1,x2,x3){GLctx.blendColor(x0,x1,x2,x3)}function _glBlendEquationSeparate(x0,x1){GLctx.blendEquationSeparate(x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx.blendFuncSeparate(x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}var _glBufferData=(target,size,data,usage)=>{if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}};var _glBufferSubData=(target,offset,size,data)=>{if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};function _glCheckFramebufferStatus(x0){return GLctx.checkFramebufferStatus(x0)}function _glClear(x0){GLctx.clear(x0)}function _glClearBufferfi(x0,x1,x2,x3){GLctx.clearBufferfi(x0,x1,x2,x3)}var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,HEAPF32,value>>2)};var _glClearBufferiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferiv(buffer,drawbuffer,HEAP32,value>>2)};function _glClearColor(x0,x1,x2,x3){GLctx.clearColor(x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx.clearDepth(x0)}function _glClearStencil(x0){GLctx.clearStencil(x0)}var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)};var _glCompressedTexImage3D=(target,level,internalFormat,width,height,depth,border,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}};var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};function _glCullFace(x0){GLctx.cullFace(x0)}var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};function _glDepthFunc(x0){GLctx.depthFunc(x0)}var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};function _glDisable(x0){GLctx.disable(x0)}var _glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};var _glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _glDrawElements=(mode,count,type,indices)=>{GLctx.drawElements(mode,count,type,indices)};var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};function _glEnable(x0){GLctx.enable(x0)}var _glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};function _glFrontFace(x0){GLctx.frontFace(x0)}var __glGenObject=(n,buffers,createFunction,objectTable)=>{for(var i=0;i>2]=id}};var _glGenBuffers=(n,buffers)=>{__glGenObject(n,buffers,"createBuffer",GL.buffers)};var _glGenFramebuffers=(n,ids)=>{__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)};var _glGenRenderbuffers=(n,renderbuffers)=>{__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _glGenTextures=(n,textures)=>{__glGenObject(n,textures,"createTexture",GL.textures)};function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx.generateMipmap(x0)}var _glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}};var _glGetIntegerv=(name_,p)=>{emscriptenWebGLGet(name_,p,0)};var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(e=>"GL_"+e));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _glGetStringi=(name,index)=>{if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}};var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)};function _glPolygonOffset(x0,x1){GLctx.polygonOffset(x0,x1)}function _glReadBuffer(x0){GLctx.readBuffer(x0)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx.renderbufferStorage(x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4)}function _glScissor(x0,x1,x2,x3){GLctx.scissor(x0,x1,x2,x3)}var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};function _glStencilFunc(x0,x1,x2){GLctx.stencilFunc(x0,x1,x2)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx.stencilFuncSeparate(x0,x1,x2,x3)}function _glStencilMask(x0){GLctx.stencilMask(x0)}function _glStencilOp(x0,x1,x2){GLctx.stencilOp(x0,x1,x2)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx.stencilOpSeparate(x0,x1,x2,x3)}var computeUnpackAlignedImageSize=(width,height,sizePerPixel,alignment)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16};var heapAccessShiftForWebGLHeap=heap=>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)};var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)};var _glTexImage3D=(target,level,internalFormat,width,height,depth,border,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,null)}};function _glTexParameterf(x0,x1,x2){GLctx.texParameterf(x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx.texParameteri(x0,x1,x2)}var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}};var miniTempWebGLFloatBuffers=[];var _glUniform1fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)};var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var miniTempWebGLIntBuffers=[];var _glUniform1iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _glUniform2fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _glUniform2iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _glUniform3fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _glUniform3iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)};var _glUniform4fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _glUniform4iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)};var _glUniformMatrix4fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};function _glViewport(x0,x1,x2,x3){GLctx.viewport(x0,x1,x2,x3)}var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var allocateUTF8OnStack=stringToUTF8OnStack;var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i+1)}var wasmImports={Bb:___syscall_accept4,Ab:___syscall_bind,M:___syscall_fcntl64,Gb:___syscall_ioctl,zb:___syscall_listen,Hb:___syscall_openat,yb:___syscall_recvfrom,xb:___syscall_sendto,wb:___syscall_socket,Kb:__emscripten_fs_load_embedded_files,Ib:__emscripten_get_now_is_monotonic,a:_abort,Jb:_emscripten_date_now,Ca:_emscripten_get_device_pixel_ratio,Da:_emscripten_get_element_css_size,C:_emscripten_get_now,Db:_emscripten_memcpy_js,Ob:_emscripten_request_animation_frame_loop,Cb:_emscripten_resize_heap,ma:_emscripten_set_blur_callback_on_thread,Ba:_emscripten_set_canvas_element_size,na:_emscripten_set_focus_callback_on_thread,x:_emscripten_set_keydown_callback_on_thread,v:_emscripten_set_keypress_callback_on_thread,w:_emscripten_set_keyup_callback_on_thread,za:_emscripten_set_mousedown_callback_on_thread,wa:_emscripten_set_mouseenter_callback_on_thread,va:_emscripten_set_mouseleave_callback_on_thread,xa:_emscripten_set_mousemove_callback_on_thread,ya:_emscripten_set_mouseup_callback_on_thread,pa:_emscripten_set_pointerlockchange_callback_on_thread,oa:_emscripten_set_pointerlockerror_callback_on_thread,Pb:_emscripten_set_resize_callback_on_thread,qa:_emscripten_set_touchcancel_callback_on_thread,ra:_emscripten_set_touchend_callback_on_thread,sa:_emscripten_set_touchmove_callback_on_thread,ta:_emscripten_set_touchstart_callback_on_thread,la:_emscripten_set_webglcontextlost_callback_on_thread,ka:_emscripten_set_webglcontextrestored_callback_on_thread,ua:_emscripten_set_wheel_callback_on_thread,Aa:_emscripten_webgl_create_context,Lb:_emscripten_webgl_enable_extension,Nb:_emscripten_webgl_init_context_attributes,Mb:_emscripten_webgl_make_context_current,N:_fd_close,Fb:_fd_read,vb:_fd_seek,Eb:_fd_write,ja:_getnameinfo,l:_glActiveTexture,V:_glAttachShader,e:_glBindBuffer,f:_glBindFramebuffer,Y:_glBindRenderbuffer,c:_glBindTexture,fa:_glBindVertexArray,ba:_glBlendColor,ca:_glBlendEquationSeparate,da:_glBlendFuncSeparate,D:_glBlitFramebuffer,ib:_glBufferData,z:_glBufferSubData,s:_glCheckFramebufferStatus,Ma:_glClear,Ka:_glClearBufferfi,R:_glClearBufferfv,Ja:_glClearBufferiv,Pa:_glClearColor,Oa:_glClearDepthf,Na:_glClearStencil,u:_glColorMask,Va:_glCompileShader,eb:_glCompressedTexImage2D,bb:_glCompressedTexImage3D,$a:_glCreateProgram,Xa:_glCreateShader,_:_glCullFace,sb:_glDeleteBuffers,b:_glDeleteFramebuffers,ga:_glDeleteProgram,ha:_glDeleteRenderbuffers,H:_glDeleteShader,rb:_glDeleteTextures,qb:_glDeleteVertexArrays,L:_glDepthFunc,K:_glDepthMask,h:_glDisable,ea:_glDisableVertexAttribArray,n:_glDrawArrays,o:_glDrawArraysInstanced,r:_glDrawBuffers,p:_glDrawElements,q:_glDrawElementsInstanced,k:_glEnable,Ga:_glEnableVertexAttribArray,m:_glFramebufferRenderbuffer,d:_glFramebufferTexture2D,i:_glFramebufferTextureLayer,$:_glFrontFace,jb:_glGenBuffers,t:_glGenFramebuffers,Z:_glGenRenderbuffers,fb:_glGenTextures,ob:_glGenVertexArrays,I:_glGenerateMipmap,Ta:_glGetAttribLocation,g:_glGetIntegerv,Za:_glGetProgramInfoLog,U:_glGetProgramiv,Ua:_glGetShaderInfoLog,S:_glGetShaderiv,ub:_glGetString,tb:_glGetStringi,y:_glGetUniformLocation,_a:_glLinkProgram,nb:_glPixelStorei,aa:_glPolygonOffset,E:_glReadBuffer,gb:_glRenderbufferStorage,X:_glRenderbufferStorageMultisample,Qa:_glScissor,Wa:_glShaderSource,mb:_glStencilFunc,Q:_glStencilFuncSeparate,J:_glStencilMask,lb:_glStencilOp,P:_glStencilOpSeparate,db:_glTexImage2D,ab:_glTexImage3D,W:_glTexParameterf,j:_glTexParameteri,Fa:_glUniform1fv,T:_glUniform1i,Ub:_glUniform1iv,Ea:_glUniform2fv,Tb:_glUniform2iv,Wb:_glUniform3fv,Sb:_glUniform3iv,Vb:_glUniform4fv,Rb:_glUniform4iv,Qb:_glUniformMatrix4fv,A:_glUseProgram,Ha:_glVertexAttribDivisor,Ia:_glVertexAttribPointer,Ra:_glViewport,pb:sapp_js_add_beforeunload_listener,La:sapp_js_add_capture_keyboard_events,hb:sapp_js_add_clipboard_listener,Ya:sapp_js_add_dragndrop_listeners,G:sapp_js_create_textfield,F:sapp_js_focus_textfield,Xb:sapp_js_init,kb:sapp_js_remove_beforeunload_listener,cb:sapp_js_remove_clipboard_listener,Sa:sapp_js_remove_dragndrop_listeners,O:sapp_js_request_pointerlock,B:sapp_js_unfocus_textfield,ia:slog_js_log};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["Zb"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["_b"])(a0,a1);var __sapp_emsc_notify_keyboard_hidden=Module["__sapp_emsc_notify_keyboard_hidden"]=()=>(__sapp_emsc_notify_keyboard_hidden=Module["__sapp_emsc_notify_keyboard_hidden"]=wasmExports["$b"])();var __sapp_emsc_onpaste=Module["__sapp_emsc_onpaste"]=a0=>(__sapp_emsc_onpaste=Module["__sapp_emsc_onpaste"]=wasmExports["ac"])(a0);var __sapp_html5_get_ask_leave_site=Module["__sapp_html5_get_ask_leave_site"]=()=>(__sapp_html5_get_ask_leave_site=Module["__sapp_html5_get_ask_leave_site"]=wasmExports["bc"])();var __sapp_emsc_begin_drop=Module["__sapp_emsc_begin_drop"]=a0=>(__sapp_emsc_begin_drop=Module["__sapp_emsc_begin_drop"]=wasmExports["cc"])(a0);var __sapp_emsc_drop=Module["__sapp_emsc_drop"]=(a0,a1)=>(__sapp_emsc_drop=Module["__sapp_emsc_drop"]=wasmExports["dc"])(a0,a1);var __sapp_emsc_end_drop=Module["__sapp_emsc_end_drop"]=(a0,a1)=>(__sapp_emsc_end_drop=Module["__sapp_emsc_end_drop"]=wasmExports["ec"])(a0,a1);var __sapp_emsc_invoke_fetch_cb=Module["__sapp_emsc_invoke_fetch_cb"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(__sapp_emsc_invoke_fetch_cb=Module["__sapp_emsc_invoke_fetch_cb"]=wasmExports["fc"])(a0,a1,a2,a3,a4,a5,a6,a7);var __sapp_emsc_capture_keyboard_events=Module["__sapp_emsc_capture_keyboard_events"]=a0=>(__sapp_emsc_capture_keyboard_events=Module["__sapp_emsc_capture_keyboard_events"]=wasmExports["gc"])(a0);var _malloc=a0=>(_malloc=wasmExports["hc"])(a0);var _free=a0=>(_free=wasmExports["free"])(a0);var ___errno_location=()=>(___errno_location=wasmExports["ic"])();var _flecs_explorer_request=Module["_flecs_explorer_request"]=(a0,a1)=>(_flecs_explorer_request=Module["_flecs_explorer_request"]=wasmExports["jc"])(a0,a1);var _htons=a0=>(_htons=wasmExports["kc"])(a0);var _ntohs=a0=>(_ntohs=wasmExports["mc"])(a0);var stackSave=()=>(stackSave=wasmExports["nc"])();var stackRestore=a0=>(stackRestore=wasmExports["oc"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["pc"])(a0);var ___original_main=Module["___original_main"]=()=>(___original_main=Module["___original_main"]=wasmExports["qc"])();var ___emscripten_embedded_file_data=Module["___emscripten_embedded_file_data"]=28520;var ___start_em_js=Module["___start_em_js"]=229596;var ___stop_em_js=Module["___stop_em_js"]=235786;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["cwrap"]=cwrap;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_unlink"]=FS.unlink;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;SOCKFS.root=FS.mount(SOCKFS,{},null);if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="flecs_explorer.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(instance=>instance).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["Yb"];updateMemoryViews();wasmTable=wasmExports["lc"];addOnInit(wasmExports["Zb"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function sapp_js_create_textfield(){const _sapp_inp=document.createElement("input");_sapp_inp.type="text";_sapp_inp.id="_sokol_app_input_element";_sapp_inp.autocapitalize="none";_sapp_inp.addEventListener("focusout",function(_sapp_event){__sapp_emsc_notify_keyboard_hidden()});document.body.append(_sapp_inp)}function sapp_js_focus_textfield(){document.getElementById("_sokol_app_input_element").focus()}function sapp_js_unfocus_textfield(){document.getElementById("_sokol_app_input_element").blur()}function sapp_js_add_beforeunload_listener(){Module.sokol_beforeunload=event=>{if(__sapp_html5_get_ask_leave_site()!=0){event.preventDefault();event.returnValue=" "}};window.addEventListener("beforeunload",Module.sokol_beforeunload)}function sapp_js_remove_beforeunload_listener(){window.removeEventListener("beforeunload",Module.sokol_beforeunload)}function sapp_js_add_clipboard_listener(){Module.sokol_paste=event=>{const pasted_str=event.clipboardData.getData("text");withStackSave(()=>{const cstr=allocateUTF8OnStack(pasted_str);__sapp_emsc_onpaste(cstr)})};window.addEventListener("paste",Module.sokol_paste)}function sapp_js_remove_clipboard_listener(){window.removeEventListener("paste",Module.sokol_paste)}function sapp_js_add_dragndrop_listeners(canvas_name_cstr){Module.sokol_drop_files=[];const canvas_name=UTF8ToString(canvas_name_cstr);const canvas=document.getElementById(canvas_name);Module.sokol_dragenter=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_dragleave=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_dragover=event=>{event.stopPropagation();event.preventDefault()};Module.sokol_drop=event=>{event.stopPropagation();event.preventDefault();const files=event.dataTransfer.files;Module.sokol_dropped_files=files;__sapp_emsc_begin_drop(files.length);for(let i=0;i{const cstr=allocateUTF8OnStack(files[i].name);__sapp_emsc_drop(i,cstr)})}__sapp_emsc_end_drop(event.clientX,event.clientY)};canvas.addEventListener("dragenter",Module.sokol_dragenter,false);canvas.addEventListener("dragleave",Module.sokol_dragleave,false);canvas.addEventListener("dragover",Module.sokol_dragover,false);canvas.addEventListener("drop",Module.sokol_drop,false)}function sapp_js_remove_dragndrop_listeners(canvas_name_cstr){const canvas_name=UTF8ToString(canvas_name_cstr);const canvas=document.getElementById(canvas_name);canvas.removeEventListener("dragenter",Module.sokol_dragenter);canvas.removeEventListener("dragleave",Module.sokol_dragleave);canvas.removeEventListener("dragover",Module.sokol_dragover);canvas.removeEventListener("drop",Module.sokol_drop)}function sapp_js_add_capture_keyboard_events(){Module.sokol_capture_keyboard_events=function(capture){__sapp_emsc_capture_keyboard_events(capture)}}function sapp_js_init(c_str_target){const target_str=UTF8ToString(c_str_target);Module.sapp_emsc_target=document.getElementById(target_str);if(!Module.sapp_emsc_target){console.log("sokol_app.h: invalid target:"+target_str)}if(!Module.sapp_emsc_target.requestPointerLock){console.log("sokol_app.h: target doesn't support requestPointerLock:"+target_str)}}function sapp_js_request_pointerlock(){if(Module.sapp_emsc_target){if(Module.sapp_emsc_target.requestPointerLock){Module.sapp_emsc_target.requestPointerLock()}}}function slog_js_log(level,c_str){const str=UTF8ToString(c_str);switch(level){case 0:console.error(str);break;case 1:console.error(str);break;case 2:console.warn(str);break;default:console.info(str);break}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>PATH.normalize(l+"/"+r)};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn);var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get(){return this.node},set(val){this.node=val}},isRead:{get(){return(this.flags&2097155)!==1}},isWrite:{get(){return(this.flags&2097155)!==0}},isAppend:{get(){return this.flags&1024}},flags:{get(){return this.shared.flags},set(val){this.shared.flags=val}},position:{get(){return this.shared.position},set(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i0,ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SOCKFS={mount(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer(sock,addr,port){return sock.peers[addr+":"+port]},addPeer(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i{var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket};var setErrNo=value=>{HEAP32[___errno_location()>>2]=value;return value};var inetPton4=str=>{var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0};var jstoi_q=str=>parseInt(str);var inetPton6=str=>{var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w{switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0};var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var inetNtop4=addr=>(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255);var inetNtop6=ints=>{var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word{var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}};var getSocketAddress=(addrp,addrlen,allowNull)=>{if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info};function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.getp();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17>>0]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.getp();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17>>0])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.getp();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.getp();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.getp();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __emscripten_fs_load_embedded_files=ptr=>{do{var name_addr=HEAPU32[ptr>>2];ptr+=4;var len=HEAPU32[ptr>>2];ptr+=4;var content=HEAPU32[ptr>>2];ptr+=4;var name=UTF8ToString(name_addr);FS.createPath("/",PATH.dirname(name),true,true);FS.createDataFile(name,null,HEAP8.subarray(content,content+len),true,true,true)}while(HEAPU32[ptr>>2])};var nowIsMonotonic=true;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var _abort=()=>{abort("")};var _emscripten_date_now=()=>Date.now();var _emscripten_get_device_pixel_ratio=()=>typeof devicePixelRatio=="number"&&devicePixelRatio||1;var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var JSEvents={inEventHandler:0,removeAllEventListeners(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort((x,y)=>x.precedence{for(var i=0;icString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement};var getBoundingClientRect=e=>specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0};var _emscripten_get_element_css_size=(target,width,height)=>{target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0};var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_memcpy_js=(dest,src,num)=>HEAPU8.copyWithin(dest,src,src+num);var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var _emscripten_request_animation_frame_loop=(cb,userData)=>{function tick(timeStamp){if(getWasmTableEntry(cb)(timeStamp,userData)){requestAnimationFrame(tick)}}return requestAnimationFrame(tick)};var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var registerFocusEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.focusEvent)JSEvents.focusEvent=_malloc(256);var focusEventHandlerFunc=(e=event)=>{var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(getWasmTableEntry(callbackfunc)(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_blur_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);var findCanvasEventTarget=target=>findEventTarget(target);var _emscripten_set_canvas_element_size=(target,width,height)=>{var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0};var _emscripten_set_focus_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);var registerKeyEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.keyEvent)JSEvents.keyEvent=_malloc(176);var keyEventHandlerFunc=e=>{var keyEventData=JSEvents.keyEvent;HEAPF64[keyEventData>>3]=e.timeStamp;var idx=keyEventData>>2;HEAP32[idx+2]=e.location;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;HEAP32[idx+7]=e.repeat;HEAP32[idx+8]=e.charCode;HEAP32[idx+9]=e.keyCode;HEAP32[idx+10]=e.which;stringToUTF8(e.key||"",keyEventData+44,32);stringToUTF8(e.code||"",keyEventData+76,32);stringToUTF8(e.char||"",keyEventData+108,32);stringToUTF8(e.locale||"",keyEventData+140,32);if(getWasmTableEntry(callbackfunc)(eventTypeId,keyEventData,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:keyEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_keydown_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,2,"keydown",targetThread);var _emscripten_set_keypress_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,1,"keypress",targetThread);var _emscripten_set_keyup_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerKeyEventCallback(target,userData,useCapture,callbackfunc,3,"keyup",targetThread);var fillMouseEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP32[idx+6]=e.ctrlKey;HEAP32[idx+7]=e.shiftKey;HEAP32[idx+8]=e.altKey;HEAP32[idx+9]=e.metaKey;HEAP16[idx*2+20]=e.button;HEAP16[idx*2+21]=e.buttons;HEAP32[idx+11]=e["movementX"];HEAP32[idx+12]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13]=e.clientX-rect.left;HEAP32[idx+14]=e.clientY-rect.top};var registerMouseEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=(e=event)=>{fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_mousedown_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,5,"mousedown",targetThread);var _emscripten_set_mouseenter_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,33,"mouseenter",targetThread);var _emscripten_set_mouseleave_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,34,"mouseleave",targetThread);var _emscripten_set_mousemove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);var _emscripten_set_mouseup_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,6,"mouseup",targetThread);var fillPointerlockChangeEventData=eventStruct=>{var pointerLockElement=document.pointerLockElement||document.mozPointerLockElement||document.webkitPointerLockElement||document.msPointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP32[eventStruct>>2]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement&&pointerLockElement.id?pointerLockElement.id:"";stringToUTF8(nodeName,eventStruct+4,128);stringToUTF8(id,eventStruct+132,128)};var registerPointerlockChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.pointerlockChangeEvent)JSEvents.pointerlockChangeEvent=_malloc(260);var pointerlockChangeEventHandlerFunc=(e=event)=>{var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;fillPointerlockChangeEventData(pointerlockChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_pointerlockchange_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!document||!document.body||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mozpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"webkitpointerlockchange",targetThread);registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"mspointerlockchange",targetThread);return registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread)};var registerPointerlockErrorEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var pointerlockErrorEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:pointerlockErrorEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_pointerlockerror_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!document||!document.body.requestPointerLock&&!document.body.mozRequestPointerLock&&!document.body.webkitRequestPointerLock&&!document.body.msRequestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mozpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"webkitpointerlockerror",targetThread);registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"mspointerlockerror",targetThread);return registerPointerlockErrorEventCallback(target,userData,useCapture,callbackfunc,38,"pointerlockerror",targetThread)};var registerUiEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=(e=event)=>{if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=e.detail;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset;HEAP32[uiEvent+32>>2]=pageYOffset;if(getWasmTableEntry(callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_resize_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);var registerTouchEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=e=>{var t,touches={},et=e.touches;for(var i=0;i>3]=e.timeStamp;var idx=touchEvent>>2;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-targetRect.left;HEAP32[idx+10]=t.clientY-targetRect.top;idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_touchcancel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);var _emscripten_set_touchend_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);var _emscripten_set_touchmove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);var _emscripten_set_touchstart_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.dibvbi=ctx.getExtension("WEBGL_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance=ctx=>!!(ctx.mdibvbi=ctx.getExtension("WEBGL_multi_draw_instanced_base_vertex_base_instance"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{var source="";for(var i=0;i>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=webGLContextAttributes.majorVersion>1?canvas.getContext("webgl2",webGLContextAttributes):canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents=="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;GL.contexts[contextHandle]=null},initExtensions:context=>{if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(context.version>=2){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query_webgl2")}if(context.version<2||!GLctx.disjointTimerQueryExt){GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var registerWebGlEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var webGlEventHandlerFunc=(e=event)=>{if(getWasmTableEntry(callbackfunc)(eventTypeId,0,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:webGlEventHandlerFunc,useCapture:useCapture};JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_webglcontextlost_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{registerWebGlEventCallback(target,userData,useCapture,callbackfunc,31,"webglcontextlost",targetThread);return 0};var _emscripten_set_webglcontextrestored_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{registerWebGlEventCallback(target,userData,useCapture,callbackfunc,32,"webglcontextrestored",targetThread);return 0};var registerWheelEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.wheelEvent)JSEvents.wheelEvent=_malloc(104);var wheelHandlerFunc=(e=event)=>{var wheelEvent=JSEvents.wheelEvent;fillMouseEventData(wheelEvent,e,target);HEAPF64[wheelEvent+72>>3]=e["deltaX"];HEAPF64[wheelEvent+80>>3]=e["deltaY"];HEAPF64[wheelEvent+88>>3]=e["deltaZ"];HEAP32[wheelEvent+96>>2]=e["deltaMode"];if(getWasmTableEntry(callbackfunc)(eventTypeId,wheelEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:wheelHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_wheel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{target=findEventTarget(target);if(!target)return-4;if(typeof target.onwheel!="undefined"){return registerWheelEventCallback(target,userData,useCapture,callbackfunc,9,"wheel",targetThread)}else{return-1}};var emscripten_webgl_power_preferences=["default","low-power","high-performance"];var _emscripten_webgl_do_create_context=(target,attributes)=>{var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle};var _emscripten_webgl_create_context=_emscripten_webgl_do_create_context;var _emscripten_webgl_enable_extension=(contextHandle,extension)=>{var context=GL.getContext(contextHandle);var extString=UTF8ToString(extension);if(extString.startsWith("GL_"))extString=extString.substr(3);if(extString=="ANGLE_instanced_arrays")webgl_enable_ANGLE_instanced_arrays(GLctx);if(extString=="OES_vertex_array_object")webgl_enable_OES_vertex_array_object(GLctx);if(extString=="WEBGL_draw_buffers")webgl_enable_WEBGL_draw_buffers(GLctx);if(extString=="WEBGL_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw_instanced_base_vertex_base_instance")webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx);if(extString=="WEBGL_multi_draw")webgl_enable_WEBGL_multi_draw(GLctx);var ext=context.GLctx.getExtension(extString);return!!ext};var _emscripten_webgl_init_context_attributes=attributes=>{var a=attributes>>2;for(var i=0;i<56>>2;++i){HEAP32[a+i]=0}HEAP32[a+(0>>2)]=HEAP32[a+(4>>2)]=HEAP32[a+(12>>2)]=HEAP32[a+(16>>2)]=HEAP32[a+(32>>2)]=HEAP32[a+(40>>2)]=1};var _emscripten_webgl_make_context_current=contextHandle=>{var success=GL.makeContextCurrent(contextHandle);return success?0:-5};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _getnameinfo=(sa,salen,node,nodelen,serv,servlen,flags)=>{var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0};function _glActiveTexture(x0){GLctx.activeTexture(x0)}var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _glBindBuffer=(target,buffer)=>{if(target==35051){GLctx.currentPixelPackBufferBinding=buffer}else if(target==35052){GLctx.currentPixelUnpackBufferBinding=buffer}GLctx.bindBuffer(target,GL.buffers[buffer])};var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};function _glBlendColor(x0,x1,x2,x3){GLctx.blendColor(x0,x1,x2,x3)}function _glBlendEquationSeparate(x0,x1){GLctx.blendEquationSeparate(x0,x1)}function _glBlendFuncSeparate(x0,x1,x2,x3){GLctx.blendFuncSeparate(x0,x1,x2,x3)}function _glBlitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9){GLctx.blitFramebuffer(x0,x1,x2,x3,x4,x5,x6,x7,x8,x9)}var _glBufferData=(target,size,data,usage)=>{if(GL.currentContext.version>=2){if(data&&size){GLctx.bufferData(target,HEAPU8,usage,data,size)}else{GLctx.bufferData(target,size,usage)}}else{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)}};var _glBufferSubData=(target,offset,size,data)=>{if(GL.currentContext.version>=2){size&&GLctx.bufferSubData(target,offset,HEAPU8,data,size);return}GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};function _glCheckFramebufferStatus(x0){return GLctx.checkFramebufferStatus(x0)}function _glClear(x0){GLctx.clear(x0)}function _glClearBufferfi(x0,x1,x2,x3){GLctx.clearBufferfi(x0,x1,x2,x3)}var _glClearBufferfv=(buffer,drawbuffer,value)=>{GLctx.clearBufferfv(buffer,drawbuffer,HEAPF32,value>>2)};var _glClearBufferiv=(buffer,drawbuffer,value)=>{GLctx.clearBufferiv(buffer,drawbuffer,HEAP32,value>>2)};function _glClearColor(x0,x1,x2,x3){GLctx.clearColor(x0,x1,x2,x3)}function _glClearDepthf(x0){GLctx.clearDepth(x0)}function _glClearStencil(x0){GLctx.clearStencil(x0)}var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding||!imageSize){GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,data)}else{GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,HEAPU8,data,imageSize)}return}GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)};var _glCompressedTexImage3D=(target,level,internalFormat,width,height,depth,border,imageSize,data)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,data)}else{GLctx.compressedTexImage3D(target,level,internalFormat,width,height,depth,border,HEAPU8,data,imageSize)}};var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};function _glCullFace(x0){GLctx.cullFace(x0)}var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null;if(id==GLctx.currentPixelPackBufferBinding)GLctx.currentPixelPackBufferBinding=0;if(id==GLctx.currentPixelUnpackBufferBinding)GLctx.currentPixelUnpackBufferBinding=0}};var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};function _glDepthFunc(x0){GLctx.depthFunc(x0)}var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};function _glDisable(x0){GLctx.disable(x0)}var _glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};var _glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _glDrawElements=(mode,count,type,indices)=>{GLctx.drawElements(mode,count,type,indices)};var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};function _glEnable(x0){GLctx.enable(x0)}var _glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _glFramebufferTextureLayer=(target,attachment,texture,level,layer)=>{GLctx.framebufferTextureLayer(target,attachment,GL.textures[texture],level,layer)};function _glFrontFace(x0){GLctx.frontFace(x0)}var __glGenObject=(n,buffers,createFunction,objectTable)=>{for(var i=0;i>2]=id}};var _glGenBuffers=(n,buffers)=>{__glGenObject(n,buffers,"createBuffer",GL.buffers)};var _glGenFramebuffers=(n,ids)=>{__glGenObject(n,ids,"createFramebuffer",GL.framebuffers)};var _glGenRenderbuffers=(n,renderbuffers)=>{__glGenObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _glGenTextures=(n,textures)=>{__glGenObject(n,textures,"createTexture",GL.textures)};function _glGenVertexArrays(n,arrays){__glGenObject(n,arrays,"createVertexArray",GL.vaos)}function _glGenerateMipmap(x0){GLctx.generateMipmap(x0)}var _glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 34814:case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break;case 33309:if(GL.currentContext.version<2){GL.recordError(1282);return}var exts=GLctx.getSupportedExtensions()||[];ret=2*exts.length;break;case 33307:case 33308:if(GL.currentContext.version<2){GL.recordError(1280);return}ret=name_==33307?3:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 36662:case 36663:case 35053:case 35055:case 36010:case 35097:case 35869:case 32874:case 36389:case 35983:case 35368:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i>>0]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Unknown object returned from WebGL getParameter("+name_+")! (error: "+e+")");return}}break;default:GL.recordError(1280);err("GL_INVALID_ENUM in glGet"+type+"v: Native code calling glGet"+type+"v("+name_+") and it returns "+result+" of type "+typeof result+"!");return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p>>0]=ret?1:0;break}};var _glGetIntegerv=(name_,p)=>{emscriptenWebGLGet(name_,p,0)};var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(e=>"GL_"+e));ret=stringToNewUTF8(exts.join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s&&stringToNewUTF8(s);break;case 7938:var glVersion=GLctx.getParameter(7938);if(GL.currentContext.version>=2)glVersion="OpenGL ES 3.0 ("+glVersion+")";else{glVersion="OpenGL ES 2.0 ("+glVersion+")"}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion="OpenGL ES GLSL ES "+ver_num[1]+" ("+glslVersion+")"}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _glGetStringi=(name,index)=>{if(GL.currentContext.version<2){GL.recordError(1282);return 0}var stringiCache=GL.stringiCache[name];if(stringiCache){if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index]}switch(name){case 7939:var exts=GLctx.getSupportedExtensions()||[];exts=exts.concat(exts.map(function(e){return"GL_"+e}));exts=exts.map(function(e){return stringToNewUTF8(e)});stringiCache=GL.stringiCache[name]=exts;if(index<0||index>=stringiCache.length){GL.recordError(1281);return 0}return stringiCache[index];default:GL.recordError(1280);return 0}};var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)};function _glPolygonOffset(x0,x1){GLctx.polygonOffset(x0,x1)}function _glReadBuffer(x0){GLctx.readBuffer(x0)}function _glRenderbufferStorage(x0,x1,x2,x3){GLctx.renderbufferStorage(x0,x1,x2,x3)}function _glRenderbufferStorageMultisample(x0,x1,x2,x3,x4){GLctx.renderbufferStorageMultisample(x0,x1,x2,x3,x4)}function _glScissor(x0,x1,x2,x3){GLctx.scissor(x0,x1,x2,x3)}var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};function _glStencilFunc(x0,x1,x2){GLctx.stencilFunc(x0,x1,x2)}function _glStencilFuncSeparate(x0,x1,x2,x3){GLctx.stencilFuncSeparate(x0,x1,x2,x3)}function _glStencilMask(x0){GLctx.stencilMask(x0)}function _glStencilOp(x0,x1,x2){GLctx.stencilOp(x0,x1,x2)}function _glStencilOpSeparate(x0,x1,x2,x3){GLctx.stencilOpSeparate(x0,x1,x2,x3)}var computeUnpackAlignedImageSize=(width,height,sizePerPixel,alignment)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4,26917:2,26918:2,29846:3,29847:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==0)return HEAP8;if(type==1)return HEAPU8;if(type==2)return HEAP16;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922||type==28520||type==30779||type==30782)return HEAPU32;return HEAPU16};var heapAccessShiftForWebGLHeap=heap=>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var shift=heapAccessShiftForWebGLHeap(heap);var byteSize=1<>shift,pixels+bytes>>shift)};var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{if(GL.currentContext.version>=2){if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,null)}return}GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null)};var _glTexImage3D=(target,level,internalFormat,width,height,depth,border,format,type,pixels)=>{if(GLctx.currentPixelUnpackBufferBinding){GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,pixels)}else if(pixels){var heap=heapObjectForWebGLType(type);GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,heap,pixels>>heapAccessShiftForWebGLHeap(heap))}else{GLctx.texImage3D(target,level,internalFormat,width,height,depth,border,format,type,null)}};function _glTexParameterf(x0,x1,x2){GLctx.texParameterf(x0,x1,x2)}function _glTexParameteri(x0,x1,x2){GLctx.texParameteri(x0,x1,x2)}var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?"["+webglLoc+"]":""))}return webglLoc}else{GL.recordError(1282)}};var miniTempWebGLFloatBuffers=[];var _glUniform1fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1fv(webglGetUniformLocation(location),HEAPF32,value>>2,count);return}if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)};var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var miniTempWebGLIntBuffers=[];var _glUniform1iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform1iv(webglGetUniformLocation(location),HEAP32,value>>2,count);return}if(count<=288){var view=miniTempWebGLIntBuffers[count-1];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _glUniform2fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _glUniform2iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform2iv(webglGetUniformLocation(location),HEAP32,value>>2,count*2);return}if(count<=144){var view=miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _glUniform3fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _glUniform3iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform3iv(webglGetUniformLocation(location),HEAP32,value>>2,count*3);return}if(count<=96){var view=miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)};var _glUniform4fv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4fv(webglGetUniformLocation(location),HEAPF32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _glUniform4iv=(location,count,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniform4iv(webglGetUniformLocation(location),HEAP32,value>>2,count*4);return}if(count<=72){var view=miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)};var _glUniformMatrix4fv=(location,count,transpose,value)=>{if(GL.currentContext.version>=2){count&&GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,HEAPF32,value>>2,count*16);return}if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value>>=2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};function _glViewport(x0,x1,x2,x3){GLctx.viewport(x0,x1,x2,x3)}var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var allocateUTF8OnStack=stringToUTF8OnStack;var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={"string":str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},"array":arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}};var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_unlink"]=FS.unlink;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;var GLctx;for(var i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i+1)}var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i+1)}var wasmImports={Bb:___syscall_accept4,Ab:___syscall_bind,M:___syscall_fcntl64,Gb:___syscall_ioctl,zb:___syscall_listen,Hb:___syscall_openat,yb:___syscall_recvfrom,xb:___syscall_sendto,wb:___syscall_socket,Kb:__emscripten_fs_load_embedded_files,Ib:__emscripten_get_now_is_monotonic,a:_abort,Jb:_emscripten_date_now,Ca:_emscripten_get_device_pixel_ratio,Da:_emscripten_get_element_css_size,C:_emscripten_get_now,Db:_emscripten_memcpy_js,Ob:_emscripten_request_animation_frame_loop,Cb:_emscripten_resize_heap,ma:_emscripten_set_blur_callback_on_thread,Ba:_emscripten_set_canvas_element_size,na:_emscripten_set_focus_callback_on_thread,x:_emscripten_set_keydown_callback_on_thread,v:_emscripten_set_keypress_callback_on_thread,w:_emscripten_set_keyup_callback_on_thread,za:_emscripten_set_mousedown_callback_on_thread,wa:_emscripten_set_mouseenter_callback_on_thread,va:_emscripten_set_mouseleave_callback_on_thread,xa:_emscripten_set_mousemove_callback_on_thread,ya:_emscripten_set_mouseup_callback_on_thread,pa:_emscripten_set_pointerlockchange_callback_on_thread,oa:_emscripten_set_pointerlockerror_callback_on_thread,Pb:_emscripten_set_resize_callback_on_thread,qa:_emscripten_set_touchcancel_callback_on_thread,ra:_emscripten_set_touchend_callback_on_thread,sa:_emscripten_set_touchmove_callback_on_thread,ta:_emscripten_set_touchstart_callback_on_thread,la:_emscripten_set_webglcontextlost_callback_on_thread,ka:_emscripten_set_webglcontextrestored_callback_on_thread,ua:_emscripten_set_wheel_callback_on_thread,Aa:_emscripten_webgl_create_context,Lb:_emscripten_webgl_enable_extension,Nb:_emscripten_webgl_init_context_attributes,Mb:_emscripten_webgl_make_context_current,N:_fd_close,Fb:_fd_read,vb:_fd_seek,Eb:_fd_write,ja:_getnameinfo,l:_glActiveTexture,V:_glAttachShader,e:_glBindBuffer,f:_glBindFramebuffer,Y:_glBindRenderbuffer,c:_glBindTexture,fa:_glBindVertexArray,ba:_glBlendColor,ca:_glBlendEquationSeparate,da:_glBlendFuncSeparate,D:_glBlitFramebuffer,ib:_glBufferData,z:_glBufferSubData,s:_glCheckFramebufferStatus,Ma:_glClear,Ka:_glClearBufferfi,R:_glClearBufferfv,Ja:_glClearBufferiv,Pa:_glClearColor,Oa:_glClearDepthf,Na:_glClearStencil,u:_glColorMask,Va:_glCompileShader,eb:_glCompressedTexImage2D,bb:_glCompressedTexImage3D,$a:_glCreateProgram,Xa:_glCreateShader,_:_glCullFace,sb:_glDeleteBuffers,b:_glDeleteFramebuffers,ga:_glDeleteProgram,ha:_glDeleteRenderbuffers,H:_glDeleteShader,rb:_glDeleteTextures,qb:_glDeleteVertexArrays,L:_glDepthFunc,K:_glDepthMask,h:_glDisable,ea:_glDisableVertexAttribArray,n:_glDrawArrays,o:_glDrawArraysInstanced,r:_glDrawBuffers,p:_glDrawElements,q:_glDrawElementsInstanced,k:_glEnable,Ga:_glEnableVertexAttribArray,m:_glFramebufferRenderbuffer,d:_glFramebufferTexture2D,i:_glFramebufferTextureLayer,$:_glFrontFace,jb:_glGenBuffers,t:_glGenFramebuffers,Z:_glGenRenderbuffers,fb:_glGenTextures,ob:_glGenVertexArrays,I:_glGenerateMipmap,Ta:_glGetAttribLocation,g:_glGetIntegerv,Za:_glGetProgramInfoLog,U:_glGetProgramiv,Ua:_glGetShaderInfoLog,S:_glGetShaderiv,ub:_glGetString,tb:_glGetStringi,y:_glGetUniformLocation,_a:_glLinkProgram,nb:_glPixelStorei,aa:_glPolygonOffset,E:_glReadBuffer,gb:_glRenderbufferStorage,X:_glRenderbufferStorageMultisample,Qa:_glScissor,Wa:_glShaderSource,mb:_glStencilFunc,Q:_glStencilFuncSeparate,J:_glStencilMask,lb:_glStencilOp,P:_glStencilOpSeparate,db:_glTexImage2D,ab:_glTexImage3D,W:_glTexParameterf,j:_glTexParameteri,Fa:_glUniform1fv,T:_glUniform1i,Ub:_glUniform1iv,Ea:_glUniform2fv,Tb:_glUniform2iv,Wb:_glUniform3fv,Sb:_glUniform3iv,Vb:_glUniform4fv,Rb:_glUniform4iv,Qb:_glUniformMatrix4fv,A:_glUseProgram,Ha:_glVertexAttribDivisor,Ia:_glVertexAttribPointer,Ra:_glViewport,pb:sapp_js_add_beforeunload_listener,La:sapp_js_add_capture_keyboard_events,hb:sapp_js_add_clipboard_listener,Ya:sapp_js_add_dragndrop_listeners,G:sapp_js_create_textfield,F:sapp_js_focus_textfield,Xb:sapp_js_init,kb:sapp_js_remove_beforeunload_listener,cb:sapp_js_remove_clipboard_listener,Sa:sapp_js_remove_dragndrop_listeners,O:sapp_js_request_pointerlock,B:sapp_js_unfocus_textfield,ia:slog_js_log};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["Zb"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["_b"])(a0,a1);var __sapp_emsc_notify_keyboard_hidden=Module["__sapp_emsc_notify_keyboard_hidden"]=()=>(__sapp_emsc_notify_keyboard_hidden=Module["__sapp_emsc_notify_keyboard_hidden"]=wasmExports["$b"])();var __sapp_emsc_onpaste=Module["__sapp_emsc_onpaste"]=a0=>(__sapp_emsc_onpaste=Module["__sapp_emsc_onpaste"]=wasmExports["ac"])(a0);var __sapp_html5_get_ask_leave_site=Module["__sapp_html5_get_ask_leave_site"]=()=>(__sapp_html5_get_ask_leave_site=Module["__sapp_html5_get_ask_leave_site"]=wasmExports["bc"])();var __sapp_emsc_begin_drop=Module["__sapp_emsc_begin_drop"]=a0=>(__sapp_emsc_begin_drop=Module["__sapp_emsc_begin_drop"]=wasmExports["cc"])(a0);var __sapp_emsc_drop=Module["__sapp_emsc_drop"]=(a0,a1)=>(__sapp_emsc_drop=Module["__sapp_emsc_drop"]=wasmExports["dc"])(a0,a1);var __sapp_emsc_end_drop=Module["__sapp_emsc_end_drop"]=(a0,a1)=>(__sapp_emsc_end_drop=Module["__sapp_emsc_end_drop"]=wasmExports["ec"])(a0,a1);var __sapp_emsc_invoke_fetch_cb=Module["__sapp_emsc_invoke_fetch_cb"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(__sapp_emsc_invoke_fetch_cb=Module["__sapp_emsc_invoke_fetch_cb"]=wasmExports["fc"])(a0,a1,a2,a3,a4,a5,a6,a7);var __sapp_emsc_capture_keyboard_events=Module["__sapp_emsc_capture_keyboard_events"]=a0=>(__sapp_emsc_capture_keyboard_events=Module["__sapp_emsc_capture_keyboard_events"]=wasmExports["gc"])(a0);var _malloc=a0=>(_malloc=wasmExports["hc"])(a0);var _free=a0=>(_free=wasmExports["free"])(a0);var ___errno_location=()=>(___errno_location=wasmExports["ic"])();var _flecs_explorer_request=Module["_flecs_explorer_request"]=(a0,a1,a2)=>(_flecs_explorer_request=Module["_flecs_explorer_request"]=wasmExports["jc"])(a0,a1,a2);var _htons=a0=>(_htons=wasmExports["kc"])(a0);var _ntohs=a0=>(_ntohs=wasmExports["mc"])(a0);var stackSave=()=>(stackSave=wasmExports["nc"])();var stackRestore=a0=>(stackRestore=wasmExports["oc"])(a0);var stackAlloc=a0=>(stackAlloc=wasmExports["pc"])(a0);var ___original_main=Module["___original_main"]=()=>(___original_main=Module["___original_main"]=wasmExports["qc"])();var ___emscripten_embedded_file_data=Module["___emscripten_embedded_file_data"]=21732;var ___start_em_js=Module["___start_em_js"]=222572;var ___stop_em_js=Module["___stop_em_js"]=228762;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createPath"]=FS.createPath;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createDevice"]=FS.createDevice;Module["cwrap"]=cwrap;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_unlink"]=FS.unlink;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run(); return moduleArg.ready diff --git a/etc/flecs_explorer.wasm b/etc/flecs_explorer.wasm index 6683dc9..381b47e 100755 Binary files a/etc/flecs_explorer.wasm and b/etc/flecs_explorer.wasm differ diff --git a/etc/js/ace-flecs-script.js b/etc/js/ace-flecs-script.js index 0ace5b6..b5f1aba 100644 --- a/etc/js/ace-flecs-script.js +++ b/etc/js/ace-flecs-script.js @@ -38,7 +38,7 @@ ace.define("ace/mode/flecs-script-highlight_rules", ["require", "exports", "modu }, { token: "keyword", - regex: "\\b(?:if|else|module|using|const|prop|with|template|prefab|slot|for|in)\\b" + regex: "\\b(?:if|else|module|using|const|prop|with|template|prefab|slot|for|in|match)\\b" }, { token: "keyword.operator", diff --git a/etc/sokol/shaders/scene_frag.glsl b/etc/sokol/shaders/scene_frag.glsl index 71b5729..422c286 100644 --- a/etc/sokol/shaders/scene_frag.glsl +++ b/etc/sokol/shaders/scene_frag.glsl @@ -39,7 +39,7 @@ float sampleShadow(sampler2D shadowMap, vec2 uv, float compare, float bias) { float sampleShadowPCF(sampler2D shadowMap, vec2 uv, float texel_size, float compare, float n_dot_l, float d) { float result = 0.0; float cos_theta = clamp(n_dot_l, 0.0, 1.0); - float bias = 0.005; + float bias = 0.001; if (uv.x < 0. || uv.x > 1.) { return 1.0; diff --git a/src/main.c b/src/main.c index 448c4a4..8d37bfd 100644 --- a/src/main.c +++ b/src/main.c @@ -9,7 +9,7 @@ EMSCRIPTEN_KEEPALIVE int main() { - // ecs_log_set_level(0); + ecs_log_set_level(-1); ecs_world_t *world = ecs_init(); if (!world) {