diff --git a/test.js b/test.js deleted file mode 100644 index ea4e2f14..00000000 --- a/test.js +++ /dev/null @@ -1,322 +0,0 @@ -const duckdb_native = require('.'); - -// some warmup -console.log("DuckDB version:", duckdb_native.duckdb_library_version()); - -function convert_validity(vector, n) { - const res = Array.from({ length: n }).fill(true); - const validity_buf = duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_validity(vector), - Math.ceil(n / 64) * 8); // this will be null if all rows are valid - if (validity_buf == null) { - return res; // TODO maybe return a singleton so we dont have to allocate? - } - const typed_validity_buf = new BigUint64Array(validity_buf.buffer); - for (let row_idx = 0; row_idx < n; row_idx++) { - res[row_idx] = (typed_validity_buf[Math.floor(row_idx / 64)] & (BigInt(1) << BigInt(row_idx % 64))) > 0; - } - return res; -} - -function convert_string_vector(vector, n) { - const validity = convert_validity(vector, n); - // from string_type.hpp - const SIZEOF_STRING_T = 16; - const INLINE_LENGTH = 12; - - const data_buf = - duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_data(vector), SIZEOF_STRING_T * n); - // TODO can we really have a case without data_buf??? if so, we could end here. - const lenghts_arr = new Uint32Array(data_buf.buffer); - // we pretend the pointers are doubles for node reasons - const pointers_arr = new Float64Array(data_buf.buffer); - - const vector_data = new Array(n).fill(null); - for (let row_idx = 0; row_idx < n; row_idx++) { - if (!validity[row_idx]) { - continue; - } - const length = lenghts_arr[row_idx*(SIZEOF_STRING_T/Uint32Array.BYTES_PER_ELEMENT)]; - const string_start_bytes = row_idx * SIZEOF_STRING_T + Uint32Array.BYTES_PER_ELEMENT; - - if (length <= INLINE_LENGTH) { // short string is inlined. - vector_data[row_idx] = data_buf.slice(string_start_bytes, string_start_bytes + length); - } else { // long string has prefix (ignored) and pointer - const pointer = pointers_arr[row_idx * (SIZEOF_STRING_T/Float64Array.BYTES_PER_ELEMENT) + 1]; - vector_data[row_idx] = duckdb_native.copy_buffer_double(pointer, length); - } - } - return vector_data; -} - -function convert_primitive_vector(vector, n, array_type) { - const validity = convert_validity(vector, n); - const data_buf = - duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_data(vector), array_type.BYTES_PER_ELEMENT * n); - const typed_data_arr = data_buf ? new array_type(data_buf.buffer) : null; - const vector_data = new Array(n) - for (let row_idx = 0; row_idx < n; row_idx++) { - vector_data[row_idx] = validity[row_idx] ? (typed_data_arr ? typed_data_arr[row_idx] : undefined) : null; - } - return vector_data; -} - -function convert_vector(vector, n) { - const type = duckdb_native.duckdb_vector_get_column_type(vector); - const type_id = duckdb_native.duckdb_get_type_id(type); - - switch (type_id) { - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIGINT: - return convert_primitive_vector(vector, n, BigInt64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIT: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_BOOLEAN: - return convert_primitive_vector(vector, n, Uint8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_DATE: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_DECIMAL: { - const decimal_type = duckdb_native.duckdb_decimal_internal_type(type); - switch (decimal_type) { - case duckdb_native.duckdb_type.DUCKDB_TYPE_TINYINT: - return convert_primitive_vector(vector, n, Int8Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_SMALLINT: - return convert_primitive_vector(vector, n, Int16Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTEGER: - return convert_primitive_vector(vector, n, Int32Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIGINT: - return convert_primitive_vector(vector, n, BigInt64Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_HUGEINT: - console.log('TODO HUGEINT'); - default: - console.log('unkown decimal internal type'); - } - return null; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_DOUBLE: - return convert_primitive_vector(vector, n, Float64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_ENUM: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_FLOAT: - return convert_primitive_vector(vector, n, Float32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_HUGEINT: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTEGER: - return convert_primitive_vector(vector, n, Int32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTERVAL: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_LIST: { - const validity = convert_validity(vector, n); - - const result = Array(n); - const child = convert_vector(duckdb_native.duckdb_list_vector_get_child(vector), - duckdb_native.duckdb_list_vector_get_size(vector)); - - const list_buf = - duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_data(vector), 128 * n); // two 64 bit numbers - const typed_list_buf = list_buf ? new BigUint64Array(list_buf.buffer) : null; - - for (let row_idx = 0; row_idx < n; row_idx++) { - if (typed_list_buf) { - const offset = typed_list_buf[2 * row_idx]; - const len = typed_list_buf[2 * row_idx + 1]; - result[row_idx] = validity[row_idx] ? child.slice(Number(offset), Number(offset + len)) : null; - } else { - result[row_idx] = undefined; - } - } - return result; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_MAP: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_SMALLINT: - return convert_primitive_vector(vector, n, Int16Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_STRUCT: { - const validity = convert_validity(vector, n); - - // TODO handle whole NULL - const result = {}; - for (let child_idx = 0; child_idx < duckdb_native.duckdb_struct_type_child_count(type); child_idx++) { - const child_name = duckdb_native.duckdb_struct_type_child_name(type, child_idx); - result[child_name] = convert_vector(duckdb_native.duckdb_struct_vector_get_child(vector, child_idx), n); - } - result['__struct_validity'] = validity; // TODO this is uuugly - return result; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIME: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_MS: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_NS: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_S: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TINYINT: - return convert_primitive_vector(vector, n, Int8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UBIGINT: - return convert_primitive_vector(vector, n, BigUint64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UINTEGER: - return convert_primitive_vector(vector, n, Uint32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UNION: - break; - - case duckdb_native.duckdb_type.DUCKDB_TYPE_USMALLINT: - return convert_primitive_vector(vector, n, Uint16Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UTINYINT: - return convert_primitive_vector(vector, n, Uint8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UUID: { - - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_BLOB: - return convert_string_vector(vector, n); - case duckdb_native.duckdb_type.DUCKDB_TYPE_VARCHAR: { - const bytes = convert_string_vector(vector, n); - const decoder = new TextDecoder('utf-8'); - const ret = new Array(n); - for (let i = 0; i < n; i++) { - ret[i] = bytes[i] == null ? null : decoder.decode(bytes[i]); - } - return ret; - } - default: - console.log('Unsupported type :/'); - return null; - } -} - -async function test() { - - const config = new duckdb_native.duckdb_config; - duckdb_native.duckdb_create_config(config); - - /* in case someone would want to list conf options - for (let conf_idx = 0; conf_idx < duckdb_native.duckdb_config_count(); conf_idx++) { - const conf_name = new duckdb_native.out_string_wrapper; - const conf_desc = new duckdb_native.out_string_wrapper; - - const status = duckdb_native.duckdb_get_config_flag(conf_idx, conf_name, conf_desc); - if (status == duckdb_native.duckdb_state.DuckDBSuccess) { - console.log(duckdb_native.out_get_string(conf_name), duckdb_native.out_get_string(conf_desc)); - } - } */ - - duckdb_native.duckdb_set_config(config, "threads", "1"); - - const db = new duckdb_native.duckdb_database; - const open_error = new duckdb_native.out_string_wrapper; - const open_status = await duckdb_native.duckdb_open_ext(":memory:", db, config, open_error); - - if (open_status != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error("Failed to initialize database", duckdb_native.out_get_string(open_error)); - return; - } - - const con = new duckdb_native.duckdb_connection; - await duckdb_native.duckdb_connect(db, con); - - // create a statement and bind a value to it - const prepared_statement = new duckdb_native.duckdb_prepared_statement; - - const prepare_status = await duckdb_native.duckdb_prepare( - con, - "SELECT 42.0::DECIMAL, CASE WHEN range % 2 == 0 THEN [1, 2, 3] ELSE NULL END, CASE WHEN range % 2 == 0 THEN {'key1': 'string', 'key2': 1, 'key3': 12.345} ELSE NULL END , range::INTEGER, CASE WHEN range % 2 == 0 THEN range ELSE NULL END, CASE WHEN range % 2 == 0 THEN range::VARCHAR ELSE NULL END, CASE WHEN range % 2 == 0 THEN 'somewhat long string ' || range::VARCHAR ELSE NULL END FROM range(?)", prepared_statement); - - - if (prepare_status != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error(duckdb_native.duckdb_prepare_error(prepared_statement)); - duckdb_native.duckdb_destroy_prepare(prepared_statement); - return; - } - const bind_state = duckdb_native.duckdb_bind_int64(prepared_statement, 1, 10000); - if (bind_state != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error("Failed to bind parameter"); - return; - } - - // we want an incremental AND streaming query result - const pending_result = new duckdb_native.duckdb_pending_result; - duckdb_native.duckdb_pending_prepared(prepared_statement, pending_result); // TODO can this fail? - - // pending query api, allows abandoning query processing between each call to pending_execute_task() - const result = new duckdb_native.duckdb_result; - var continue_execute = true; - while (continue_execute) { - const pending_status = await duckdb_native.duckdb_pending_execute_task(pending_result); - - switch (pending_status) { - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_RESULT_NOT_READY: - continue; - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_RESULT_READY: - await duckdb_native.duckdb_execute_pending(pending_result, result); - continue_execute = false; - break; - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_ERROR: - console.error(duckdb_native.duckdb_pending_error(pending_result)); // TODO this seems broken - return; - } - } - // can clean this stuff up already - duckdb_native.duckdb_destroy_pending(pending_result); - duckdb_native.duckdb_destroy_prepare(prepared_statement); - - - for (let col_idx = 0; col_idx < duckdb_native.duckdb_column_count(result); col_idx++) { - const colname = duckdb_native.duckdb_column_name(result, col_idx); - console.log(colname, ':', duckdb_native.duckdb_column_type(result, col_idx)); - } - - const start = Date.now(); - - // now consume result set stream - while (true) { - const chunk = await duckdb_native.duckdb_fetch_chunk(result); - - const n = duckdb_native.duckdb_data_chunk_get_size(chunk); - if (n == 0) { // empty chunk means end of stream - break; - } - - // loop over columns and interpret vector bytes - for (let col_idx = 0; col_idx < duckdb_native.duckdb_data_chunk_get_column_count(chunk); col_idx++) { - const vec = convert_vector(duckdb_native.duckdb_data_chunk_get_vector(chunk, col_idx), n); - console.log(vec); - } - - duckdb_native.duckdb_destroy_data_chunk(chunk); - } - - const end = Date.now(); - console.log(`Execution time: ${end - start} ms`); - - // clean up again - duckdb_native.duckdb_destroy_result(result); - - duckdb_native.duckdb_disconnect(con); - duckdb_native.duckdb_close(db); - duckdb_native.duckdb_destroy_config(config); -} - -test(); diff --git a/test.ts b/test.ts deleted file mode 100644 index a15fb276..00000000 --- a/test.ts +++ /dev/null @@ -1,303 +0,0 @@ -import * as duckdb_native from '.'; - -// some warmup -console.log("DuckDB version:", duckdb_native.duckdb_library_version()); - -function convert_validity(vector: duckdb_native.duckdb_vector, n: number) { - const res: boolean[] = Array.from({ length: n }).fill(true); - const validity_buf = duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_validity(vector), - Math.ceil(n / 64) * 8); // this will be null if all rows are valid - if (validity_buf == null) { - return res; // TODO maybe return a singleton so we dont have to allocate? - } - const typed_validity_buf = new BigUint64Array(validity_buf.buffer); - for (let row_idx = 0; row_idx < n; row_idx++) { - res[row_idx] = (typed_validity_buf[Math.floor(row_idx / 64)] & (BigInt(1) << BigInt(row_idx % 64))) > 0; - } - return res; -} - -type ArrayType = - | BigInt64ArrayConstructor - | BigUint64ArrayConstructor - | Float32ArrayConstructor - | Float64ArrayConstructor - | Int8ArrayConstructor - | Int16ArrayConstructor - | Int32ArrayConstructor - | Uint8ArrayConstructor - | Uint16ArrayConstructor - | Uint32ArrayConstructor - ; - -function convert_primitive_vector(vector: duckdb_native.duckdb_vector, n: number, array_type: ArrayType) { - const validity = convert_validity(vector, n); - const data_buf = - duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_data(vector), array_type.BYTES_PER_ELEMENT * n); - const typed_data_arr = data_buf ? new array_type(data_buf.buffer) : null; - const vector_data = new Array(n) - for (let row_idx = 0; row_idx < n; row_idx++) { - vector_data[row_idx] = validity[row_idx] ? (typed_data_arr ? typed_data_arr[row_idx] : undefined) : null; - } - return vector_data; -} - -function convert_vector(vector: duckdb_native.duckdb_vector, n: number) { - const type = duckdb_native.duckdb_vector_get_column_type(vector); - const type_id = duckdb_native.duckdb_get_type_id(type); - - switch (type_id) { - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIGINT: - return convert_primitive_vector(vector, n, BigInt64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIT: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_BOOLEAN: - return convert_primitive_vector(vector, n, Uint8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_DATE: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_DECIMAL: { - const decimal_type = duckdb_native.duckdb_decimal_internal_type(type); - switch (decimal_type) { - case duckdb_native.duckdb_type.DUCKDB_TYPE_TINYINT: - return convert_primitive_vector(vector, n, Int8Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_SMALLINT: - return convert_primitive_vector(vector, n, Int16Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTEGER: - return convert_primitive_vector(vector, n, Int32Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_BIGINT: - return convert_primitive_vector(vector, n, BigInt64Array); - case duckdb_native.duckdb_type.DUCKDB_TYPE_HUGEINT: - console.log('TODO HUGEINT'); - default: - console.log('unkown decimal internal type'); - } - return null; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_DOUBLE: - return convert_primitive_vector(vector, n, Float64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_ENUM: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_FLOAT: - return convert_primitive_vector(vector, n, Float32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_HUGEINT: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTEGER: - return convert_primitive_vector(vector, n, Int32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_INTERVAL: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_LIST: { - const validity = convert_validity(vector, n); - - const result = Array(n); - const child = convert_vector(duckdb_native.duckdb_list_vector_get_child(vector), - duckdb_native.duckdb_list_vector_get_size(vector)); - - const list_buf = - duckdb_native.copy_buffer(duckdb_native.duckdb_vector_get_data(vector), 128 * n); // two 64 bit numbers - const typed_list_buf = list_buf ? new BigUint64Array(list_buf.buffer) : null; - - for (let row_idx = 0; row_idx < n; row_idx++) { - if (typed_list_buf) { - const offset = typed_list_buf[2 * row_idx]; - const len = typed_list_buf[2 * row_idx + 1]; - result[row_idx] = validity[row_idx] ? child.slice(Number(offset), Number(offset + len)) : null; - } else { - result[row_idx] = undefined; - } - } - return result; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_MAP: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_SMALLINT: - return convert_primitive_vector(vector, n, Int16Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_STRUCT: { - const validity = convert_validity(vector, n); - - // TODO handle whole NULL - const result: any = {}; - for (let child_idx = 0; child_idx < duckdb_native.duckdb_struct_type_child_count(type); child_idx++) { - const child_name = duckdb_native.duckdb_struct_type_child_name(type, child_idx); - result[child_name] = convert_vector(duckdb_native.duckdb_struct_vector_get_child(vector, child_idx), n); - } - result['__struct_validity'] = validity; // TODO this is uuugly - return result; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIME: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_MS: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_NS: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TIMESTAMP_S: { - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_TINYINT: - return convert_primitive_vector(vector, n, Int8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UBIGINT: - return convert_primitive_vector(vector, n, BigUint64Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UINTEGER: - return convert_primitive_vector(vector, n, Uint32Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UNION: - break; - - case duckdb_native.duckdb_type.DUCKDB_TYPE_USMALLINT: - return convert_primitive_vector(vector, n, Uint16Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UTINYINT: - return convert_primitive_vector(vector, n, Uint8Array); - - case duckdb_native.duckdb_type.DUCKDB_TYPE_UUID: { - - break; - } - case duckdb_native.duckdb_type.DUCKDB_TYPE_BLOB: - return duckdb_native.convert_string_vector(vector, n); - case duckdb_native.duckdb_type.DUCKDB_TYPE_VARCHAR: { - const bytes = duckdb_native.convert_string_vector(vector, n); - const decoder = new TextDecoder('utf-8'); - const ret = new Array(n); - for (let i = 0; i < n; i++) { - ret[i] = bytes[i] == null ? null : decoder.decode(bytes[i]); - } - return ret; - } - default: - console.log('Unsupported type :/'); - return null; - } -} - -async function test() { - - const config = new duckdb_native.duckdb_config; - duckdb_native.duckdb_create_config(config); - - /* in case someone would want to list conf options - for (let conf_idx = 0; conf_idx < duckdb_native.duckdb_config_count(); conf_idx++) { - const conf_name = new duckdb_native.out_string_wrapper; - const conf_desc = new duckdb_native.out_string_wrapper; - - const status = duckdb_native.duckdb_get_config_flag(conf_idx, conf_name, conf_desc); - if (status == duckdb_native.duckdb_state.DuckDBSuccess) { - console.log(duckdb_native.out_get_string(conf_name), duckdb_native.out_get_string(conf_desc)); - } - } */ - - duckdb_native.duckdb_set_config(config, "threads", "1"); - - const db = new duckdb_native.duckdb_database; - const open_error = new duckdb_native.out_string_wrapper; - const open_status = await duckdb_native.duckdb_open_ext(":memory:", db, config, open_error); - - if (open_status != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error("Failed to initialize database", duckdb_native.out_get_string(open_error)); - return; - } - - const con = new duckdb_native.duckdb_connection; - await duckdb_native.duckdb_connect(db, con); - - // create a statement and bind a value to it - const prepared_statement = new duckdb_native.duckdb_prepared_statement; - // const prepare_status = await duckdb_native.duckdb_prepare( - // con, - // "SELECT 42.0::DECIMAL, CASE WHEN range % 2 == 0 THEN [1, 2, 3] ELSE NULL END, CASE WHEN range % 2 == 0 - // THEN {'key1': 'string', 'key2': 1, 'key3': 12.345} ELSE NULL END , range::INTEGER, CASE WHEN range % 2 == 0 - // THEN range ELSE NULL END, CASE WHEN range % 2 == 0 THEN range::VARCHAR ELSE NULL END FROM range(?)", - // prepared_statement); - // - - const prepare_status = - await duckdb_native.duckdb_prepare(con, "SELECT range::DECIMAL(10,4) asdf FROM range(?)", prepared_statement); - - if (prepare_status != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error(duckdb_native.duckdb_prepare_error(prepared_statement)); - duckdb_native.duckdb_destroy_prepare(prepared_statement); - return; - } - const bind_state = duckdb_native.duckdb_bind_int64(prepared_statement, 1, 4000); - if (bind_state != duckdb_native.duckdb_state.DuckDBSuccess) { - console.error("Failed to bind parameter"); - return; - } - - // we want an incremental AND streaming query result - const pending_result = new duckdb_native.duckdb_pending_result; - duckdb_native.duckdb_pending_prepared(prepared_statement, pending_result); // TODO can this fail? - - // pending query api, allows abandoning query processing between each call to pending_execute_task() - const result = new duckdb_native.duckdb_result; - var continue_execute = true; - while (continue_execute) { - const pending_status = await duckdb_native.duckdb_pending_execute_task(pending_result); - - switch (pending_status) { - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_RESULT_NOT_READY: - continue; - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_RESULT_READY: - await duckdb_native.duckdb_execute_pending(pending_result, result); - continue_execute = false; - break; - case duckdb_native.duckdb_pending_state.DUCKDB_PENDING_ERROR: - console.error(duckdb_native.duckdb_pending_error(pending_result)); // TODO this seems broken - return; - } - } - // can clean this stuff up already - duckdb_native.duckdb_destroy_pending(pending_result); - duckdb_native.duckdb_destroy_prepare(prepared_statement); - - - for (let col_idx = 0; col_idx < duckdb_native.duckdb_column_count(result); col_idx++) { - const colname = duckdb_native.duckdb_column_name(result, col_idx); - console.log(colname, ':', duckdb_native.duckdb_column_type(result, col_idx)); - } - - // now consume result set stream - while (true) { - const chunk = await duckdb_native.duckdb_fetch_chunk(result); - - const n = duckdb_native.duckdb_data_chunk_get_size(chunk); - if (n == 0) { // empty chunk means end of stream - break; - } - - // loop over columns and interpret vector bytes - for (let col_idx = 0; col_idx < duckdb_native.duckdb_data_chunk_get_column_count(chunk); col_idx++) { - console.log(convert_vector(duckdb_native.duckdb_data_chunk_get_vector(chunk, col_idx), n)); - } - - duckdb_native.duckdb_destroy_data_chunk(chunk); - } - - // clean up again - duckdb_native.duckdb_destroy_result(result); - - duckdb_native.duckdb_disconnect(con); - duckdb_native.duckdb_close(db); - duckdb_native.duckdb_destroy_config(config); -} - -test(); diff --git a/test/affected.test.ts b/test/affected.test.ts deleted file mode 100644 index c58b653f..00000000 --- a/test/affected.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; - -describe('query properties', function() { - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database(':memory:'); - db.run("CREATE TABLE foo (id INT, txt TEXT)", done); - }); - - it.skip('should return the correct lastID', function(done) { - var stmt = db.prepare("INSERT INTO foo VALUES(?, ?)"); - var j = 1; - for (var i = 0; i < 5000; i++) { - stmt.run(i, "demo", function(err: null | Error) { - if (err) throw err; - // Relies on SQLite's row numbering to be gapless and starting - // from 1. - // @ts-ignore - assert.equal(j++, this.lastID); - }); - } - db.wait(done); - }); - - - it.skip('should return the correct changes count', function(done) { - db.run("UPDATE foo SET id = id + 1 WHERE id % 2 = 0", function(err: null | Error) { - if (err) throw err; - // FIXME assert.equal(2500, this.changes); - done(); - }); - }); -}); diff --git a/test/arrow.test.ts b/test/arrow.test.ts deleted file mode 100644 index cf744982..00000000 --- a/test/arrow.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as duckdb from '..'; -import * as assert from 'assert'; -import {ArrowArray} from ".."; - -describe('arrow IPC API fails neatly when extension not loaded', function() { - // Note: arrow IPC api requires the arrow extension to be loaded. The tests for this functionality reside in: - // https://github.com/duckdblabs/arrow - let db: duckdb.Database; - let conn; - before((done) => { - db = new duckdb.Database(':memory:', {"allow_unsigned_extensions": "true"}, () => { - db.all('SET autoload_known_extensions=false;', () => { - done(); - }); - }); - }); - - it(`basic examples`, async () => { - const range_size = 130000; - const query = `SELECT * FROM range(0,${range_size}) tbl(i)`; - - db.arrowIPCStream(query).then( - () => Promise.reject(new Error('Expected method to reject.')), - err => { - assert.ok(err.message.includes("arrow")) - } - ); - - db.arrowIPCAll(`SELECT * FROM ipc_table`, function (err: null | Error, result: ArrowArray) { - if (err) { - assert.ok(err.message.includes("arrow")) - } else { - assert.fail("Expected error"); - } - }); - - // @ts-expect-error - assert.throws(() => db.register_buffer("ipc_table", [1,'a',1], true), TypeError, "Incorrect parameters"); - }); - - it('register buffer should be disabled currently', function(done) { - db.register_buffer("test", [new Uint8Array(new ArrayBuffer(10))], true, (err: null | Error) => { - assert.ok(err) - assert.ok(err.toString().includes("arrow")); - done() - }); - }); - - it('unregister will silently do nothing', function(done) { - db.unregister_buffer("test", (err) => { - assert.ok(!err) - done() - }); - }); -}); diff --git a/test/close_hang.test.ts b/test/close_hang.test.ts deleted file mode 100644 index cce52bf2..00000000 --- a/test/close_hang.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import 'chai-as-promised'; -import {exec as _exec} from "child_process"; -import fs from "fs-extra"; -import path from "path"; -import {Database, OPEN_READWRITE} from ".."; -import {promisify} from "util"; -import {expect} from "chai"; - -const exec = promisify(_exec); - -it("close hang", async function main() { - if (process.platform == 'win32') this.skip(); - - const databasePath = path.join(__dirname, "tmp", "close_hang.db"); - const pathExists = await fs.pathExists(databasePath); - if (pathExists) { - await fs.remove(databasePath); - } - await fs.mkdirp(path.dirname(databasePath)); - - const db = await new Promise((resolve, reject) => { - let db: Database = new Database( - databasePath, - OPEN_READWRITE, - (err: unknown) => (err ? reject(err) : resolve(db)), - ); - }); - try { - await new Promise((resolve) => - db.exec("create table foo(bar int)", resolve), - ); - } finally { - await new Promise((resolve) => db.close(resolve)); - } - - // exit code 1 and stdout blank means no open handles - await expect(exec( - `lsof ${databasePath}`)).to.eventually.be.rejected.and.to.include({ 'code': 1 ,'stdout': ''}); -}); diff --git a/test/columns.test.ts b/test/columns.test.ts deleted file mode 100644 index 52bfdb3d..00000000 --- a/test/columns.test.ts +++ /dev/null @@ -1,265 +0,0 @@ -import * as duckdb from '..'; -import * as assert from 'assert'; - -describe('Column Types', function() { - let db: duckdb.Database; - before(function(done) { db = new duckdb.Database(':memory:', done); }); - - it('should prepare a statement and return the columns and their types', function(done) { - // we dont include the large_enum and small_enum since they are huge and test the same code path as the small_enum - var stmt = db.prepare("SELECT * EXCLUDE(medium_enum, large_enum) FROM test_all_types()", function(err: null | Error) { - if (err) throw err; - - let cols = stmt.columns(); - - assert.equal(cols.length, 42); - - var expected = [ - { name: 'bool', type: { id: 'BOOLEAN', sql_type: 'BOOLEAN' } }, - { name: 'tinyint', type: { id: 'TINYINT', sql_type: 'TINYINT' } }, - { name: 'smallint', type: { id: 'SMALLINT', sql_type: 'SMALLINT' } }, - { name: 'int', type: { id: 'INTEGER', sql_type: 'INTEGER' } }, - { name: 'bigint', type: { id: 'BIGINT', sql_type: 'BIGINT' } }, - { name: 'hugeint', type: { id: 'HUGEINT', sql_type: 'HUGEINT' } }, - { name: 'utinyint', type: { id: 'UTINYINT', sql_type: 'UTINYINT' } }, - { name: 'usmallint', type: { id: 'USMALLINT', sql_type: 'USMALLINT' } }, - { name: 'uint', type: { id: 'UINTEGER', sql_type: 'UINTEGER' } }, - { name: 'ubigint', type: { id: 'UBIGINT', sql_type: 'UBIGINT' } }, - { name: 'date', type: { id: 'DATE', sql_type: 'DATE' } }, - { name: 'time', type: { id: 'TIME', sql_type: 'TIME' } }, - { name: 'timestamp', type: { id: 'TIMESTAMP', sql_type: 'TIMESTAMP' } }, - { name: 'timestamp_s', type: { id: 'TIMESTAMP_S', sql_type: 'TIMESTAMP_S' } }, - { name: 'timestamp_ms', type: { id: 'TIMESTAMP_MS', sql_type: 'TIMESTAMP_MS' } }, - { name: 'timestamp_ns', type: { id: 'TIMESTAMP_NS', sql_type: 'TIMESTAMP_NS' } }, - { name: 'time_tz', type: { id: 'TIME WITH TIME ZONE', sql_type: 'TIME WITH TIME ZONE' } }, - { name: 'timestamp_tz', type: { id: 'TIMESTAMP WITH TIME ZONE', sql_type: 'TIMESTAMP WITH TIME ZONE' } }, - { name: 'float', type: { id: 'FLOAT', sql_type: 'FLOAT' } }, - { name: 'double', type: { id: 'DOUBLE', sql_type: 'DOUBLE' } }, - { name: 'dec_4_1', type: { id: 'DECIMAL', sql_type: 'DECIMAL(4,1)', width: 4, scale: 1 } }, - { name: 'dec_9_4', type: { id: 'DECIMAL', sql_type: 'DECIMAL(9,4)', width: 9, scale: 4 } }, - { name: 'dec_18_6', type: { id: 'DECIMAL', sql_type: 'DECIMAL(18,6)', width: 18, scale: 6 } }, - { name: 'dec38_10', type: { id: 'DECIMAL', sql_type: 'DECIMAL(38,10)', width: 38, scale: 10 } }, - { name: 'uuid', type: { id: 'UUID', sql_type: 'UUID' } }, - { name: 'interval', type: { id: 'INTERVAL', sql_type: 'INTERVAL' } }, - { name: 'varchar', type: { id: 'VARCHAR', sql_type: 'VARCHAR' } }, - { name: 'blob', type: { id: 'BLOB', sql_type: 'BLOB' } }, - { name: 'bit', type: { id: 'BIT', sql_type: 'BIT' } }, - { - name: 'small_enum', - type: { - id: 'ENUM', - sql_type: "ENUM('DUCK_DUCK_ENUM', 'GOOSE')", - values: [ - "DUCK_DUCK_ENUM", - "GOOSE" - ] - } - }, - { - name: 'int_array', - type: { - id: 'LIST', - sql_type: 'INTEGER[]', - child: { - id: 'INTEGER', - sql_type: 'INTEGER' - } - } - }, - { - name: 'double_array', - type: { - id: 'LIST', - sql_type: 'DOUBLE[]', - child: { - id: 'DOUBLE', - sql_type: 'DOUBLE' - } - } - }, - { - name: 'date_array', - type: { - id: 'LIST', - sql_type: 'DATE[]', - child: { - id: 'DATE', - sql_type: 'DATE' - } - } - }, - { - name: 'timestamp_array', - type: { - id: 'LIST', - sql_type: 'TIMESTAMP[]', - child: { - id: 'TIMESTAMP', - sql_type: 'TIMESTAMP' - } - } - }, - { - name: 'timestamptz_array', - type: { - id: 'LIST', - sql_type: 'TIMESTAMP WITH TIME ZONE[]', - child: { - id: 'TIMESTAMP WITH TIME ZONE', - sql_type: 'TIMESTAMP WITH TIME ZONE' - } - } - }, - { - name: 'varchar_array', - type: { - id: 'LIST', - sql_type: 'VARCHAR[]', - child: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - } - } - }, - { - name: 'nested_int_array', - type: { - id: 'LIST', - sql_type: 'INTEGER[][]', - child: { - id: 'LIST', - sql_type: 'INTEGER[]', - child: { - id: 'INTEGER', - sql_type: 'INTEGER' - } - } - } - }, - { - name: 'struct', - type: { - id: 'STRUCT', - sql_type: 'STRUCT(a INTEGER, b VARCHAR)', - children: [ - { - name: 'a', - type: { - id: 'INTEGER', - sql_type: 'INTEGER' - } - }, - { - name: 'b', - type: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - } - } - ] - } - }, - { - name: 'struct_of_arrays', - type: { - id: 'STRUCT', - sql_type: 'STRUCT(a INTEGER[], b VARCHAR[])', - children: [ - { - name: 'a', - type: { - id: 'LIST', - sql_type: 'INTEGER[]', - child: { - id: 'INTEGER', - sql_type: 'INTEGER' - } - } - }, - { - name: 'b', - type: { - id: 'LIST', - sql_type: 'VARCHAR[]', - child: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - } - } - } - ] - } - }, - { - name: 'array_of_structs', - type: { - id: 'LIST', - sql_type: 'STRUCT(a INTEGER, b VARCHAR)[]', - child: { - id: 'STRUCT', - sql_type: 'STRUCT(a INTEGER, b VARCHAR)', - children: [ - { - name: 'a', - type: { - id: 'INTEGER', - sql_type: 'INTEGER' - } - }, - { - name: 'b', - type: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - } - } - ] - } - } - }, - { - name: 'map', - type: { - id: 'MAP', - sql_type: 'MAP(VARCHAR, VARCHAR)', - key: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - }, - value: { - id: 'VARCHAR', - sql_type: 'VARCHAR' - } - } - }, - { - name: "union", - type: { - id: "UNION", - sql_type: "UNION(\"name\" VARCHAR, age SMALLINT)", - children: [ - { - name: "name", - type: { - id: "VARCHAR", - sql_type: "VARCHAR" - } - }, - { - name: "age", - type: { - id: "SMALLINT", - sql_type: "SMALLINT", - } - } - ], - } - } - ] - - assert.deepEqual(cols, expected); - - }); - stmt.finalize(done); - }); -}); \ No newline at end of file diff --git a/test/data_type_support.test.ts b/test/data_type_support.test.ts deleted file mode 100644 index 46c1a0fb..00000000 --- a/test/data_type_support.test.ts +++ /dev/null @@ -1,198 +0,0 @@ -import * as sqlite3 from ".."; -import * as assert from "assert"; -import {RowData, TableData} from ".."; - -describe("data type support", function () { - let db: sqlite3.Database; - before(function (done) { - db = new sqlite3.Database(":memory:", done); - }); - - it("supports BOOLEAN values", function (done) { - db.run("CREATE TABLE boolean_table (i BOOLEAN)"); - const stmt = db.prepare("INSERT INTO boolean_table VALUES (?)"); - const values = [true, false, null]; - values.forEach((bool) => { - stmt.run(bool); - }); - db.prepare("SELECT i from boolean_table;").all((err: null | Error, res: TableData) => { - assert.equal(err, null); - assert.ok(res.every((v, i) => v.i === values[i])); - done(); - }); - }); - - it("supports INTEGER values", function (done) { - db.run("CREATE TABLE integer_table (a TINYINT, b SMALLINT, c INTEGER, d BIGINT, e UTINYINT, f USMALLINT, g UINTEGER, h UBIGINT)"); - const stmt = db.prepare("INSERT INTO integer_table VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); - - // Numerical limits - let signedMinValue = (bitWidth: number) => Math.max(-(2**(bitWidth-1)-1)-1, Number.MIN_SAFE_INTEGER); - let signedMaxValue = (bitWidth: number) => Math.min(2**(bitWidth-1)-1, Number.MAX_SAFE_INTEGER); - let unsignedMaxValue = (bitWidth: number) => Math.min(2**(bitWidth)-1, Number.MAX_SAFE_INTEGER); - let minValues = [signedMinValue(8), signedMinValue(16), signedMinValue(32), signedMinValue(64), 0, 0, 0, 0]; - let maxValues = [signedMinValue(8), signedMinValue(16), signedMinValue(32), signedMinValue(64), unsignedMaxValue(8), unsignedMaxValue(16), unsignedMaxValue(32), unsignedMaxValue(64)]; - - // Insert values - stmt.run(...minValues); - stmt.run(...maxValues); - - db.prepare("SELECT * from integer_table;").all((err: null | Error, res: TableData) => { - assert.equal(err, null); - assert.equal(res.length, 2); - assert.equal(Object.entries(res[0]).length, 8); - assert.equal(Object.entries(res[1]).length, 8); - assert.deepEqual(Object.entries(res[0]).map(v => v[1]), minValues); - assert.deepEqual(Object.entries(res[1]).map(v => v[1]), maxValues); - done(); - }); - }); - - it("supports INTERVAL values", function (done) { - db.prepare( - `SELECT - INTERVAL 1 MINUTE as minutes, - INTERVAL 5 DAY as days, - INTERVAL 4 MONTH as months, - INTERVAL 4 MONTH + INTERVAL 5 DAY + INTERVAL 1 MINUTE as combined;` - ).each((err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.minutes, { - months: 0, - days: 0, - micros: 60 * 1000 * 1000, - }); - assert.deepEqual(row.days, { months: 0, days: 5, micros: 0 }); - assert.deepEqual(row.months, { months: 4, days: 0, micros: 0 }); - assert.deepEqual(row.combined, { - months: 4, - days: 5, - micros: 60 * 1000 * 1000, - }); - done(); - }); - }); - - it("supports STRUCT values", function (done) { - db.prepare(`SELECT {'x': 1, 'y': 2, 'z': {'a': 'b'}} as struct`).each( - (err: null | Error, row: RowData) => { - assert.deepEqual(row.struct, { x: 1, y: 2, z: { a: "b" } }); - done(); - } - ); - }); - - it("supports STRUCT values with NULL", function (done) { - db.run("CREATE TABLE struct_table (s STRUCT(a VARCHAR, b BOOLEAN))"); - db.run("INSERT INTO struct_table VALUES ({'a': 'hello', 'b': true})"); - db.run("INSERT INTO struct_table VALUES ({'a': 'goodbye', 'b': false})"); - db.run("INSERT INTO struct_table VALUES ({'a': 'aloha', 'b': NULL})"); - db.prepare("SELECT s from struct_table;").all((err: null | Error, res: RowData) => { - assert.equal(err, null); - assert.deepEqual(res, [ - { s: { a: "hello", b: true } }, - { s: { a: "goodbye", b: false } }, - { s: { a: "aloha", b: null } }, - ]); - done(); - }); - }); - - it("recursively supports NULL values", function (done) { - db.run( - `CREATE TABLE recursive_struct AS SELECT [ - { 'a': 42, 'b': [1, 2, 3]}, - NULL, - { 'a': NULL, 'b': [4, NULL, 6]}, - {'a': 43, 'b': NULL} - ] l UNION ALL SELECT NULL` - ); - db.prepare("SELECT l from recursive_struct").all((err: null | Error, res: RowData) => { - assert.equal(err, null); - assert.deepEqual(res, [ - { - l: [ - { - a: 42, - b: [1, 2, 3], - }, - null, - { - a: null, - b: [4, null, 6], - }, - { - a: 43, - b: null, - }, - ], - }, - { - l: null, - }, - ]); - done(); - }); - }); - - it("supports LIST values", function (done) { - db.prepare(`SELECT ['duck', 'duck', 'goose'] as list`).each((err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.list, ["duck", "duck", "goose"]); - done(); - }); - }); - - it("supports LIST with NULL values", function (done) { - db.prepare(`SELECT ['duck', 'duck', NULL] as list`).each((err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.list, ["duck", "duck", null]); - done(); - }); - }); - - it("supports DATE values", function (done) { - db.prepare(`SELECT '2021-01-01'::DATE as dt;`).each((err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.dt, new Date(Date.UTC(2021, 0, 1))); - done(); - }); - }); - it("supports TIMESTAMP values", function (done) { - db.prepare(`SELECT '2021-01-01T00:00:00'::TIMESTAMP as ts;`).each( - (err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.ts, new Date(Date.UTC(2021, 0, 1))); - done(); - } - ); - }); - it("supports TIMESTAMP WITH TIME ZONE values", function (done) { - db.prepare(`SELECT '2021-01-01T00:00:00Z'::TIMESTAMPTZ as tstz;`).each( - (err: null | Error, row: RowData) => { - assert.equal(err, null); - assert.deepEqual(row.tstz, new Date(Date.UTC(2021, 0, 1))); - done(); - } - ); - }); - it("supports DECIMAL values", function (done) { - db.run("CREATE TABLE decimal_table (d DECIMAL(24, 6))"); - const stmt = db.prepare("INSERT INTO decimal_table VALUES (?)"); - const values = [0, -1, 23534642362547.543463, null]; - values.forEach((d) => { - stmt.run(d); - }); - db.prepare("SELECT d from decimal_table;").all((err: null | Error, res: TableData) => { - assert.equal(err, null); - assert.ok(res.every((v, i) => v.d === values[i])); - done(); - }); - }); - it("converts unsupported data types to strings", function(done) { - db.all("SELECT CAST('11:10:10' AS TIME) as time", function(err: null | Error, rows: TableData) { - assert.equal(rows[0].time, '11:10:10'); - done(); - }); - }); -}); diff --git a/test/database_fail.test.ts b/test/database_fail.test.ts deleted file mode 100644 index ab127438..00000000 --- a/test/database_fail.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import {DuckDbError, RowData} from ".."; -import {Worker} from 'worker_threads'; -import {expect} from 'chai'; - -describe('error handling', function() { - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('throw when calling Database() without new', function() { - assert.throws(function() { - // @ts-ignore - sqlite3.Database(':memory:'); - }, (/Class constructors cannot be invoked without 'new'/)); - - assert.throws(function() { - // @ts-ignore - sqlite3.Statement(); - }, (/Class constructors cannot be invoked without 'new'/)); - }); - - it('should error when calling Database#each on a missing table', function(done) { - db.each('SELECT id, txt FROM foo', function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#all prepare fail', function(done) { - db.all('SELECT id, txt FROM foo', function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#run prepare fail', function(done) { - db.run('SELECT id, txt FROM foo', function(err: null | DuckDbError, row: void) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it.skip('Database#each prepare fail', function(done) { - db.each('SELECT id, txt FROM foo', function(err: null | DuckDbError, row: RowData) { - assert.ok(false, "this should not be called"); - }, function(err: null | DuckDbError, num: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#each prepare fail without completion handler', function(done) { - db.each('SELECT id, txt FROM foo', function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it.skip('Database#get prepare fail with param binding', function(done) { - db.get('SELECT id, txt FROM foo WHERE id = ?', 1, function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#all prepare fail with param binding', function(done) { - db.all('SELECT id, txt FROM foo WHERE id = ?', 1, function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#run prepare fail with param binding', function(done) { - db.run('SELECT id, txt FROM foo WHERE id = ?', 1, function(err: null | DuckDbError, row: void) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it.skip('Database#each prepare fail with param binding', function(done) { - db.each('SELECT id, txt FROM foo WHERE id = ?', 1, function(err: null | DuckDbError, row: RowData) { - assert.ok(false, "this should not be called"); - }, function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('Database#each prepare fail with param binding without completion handler', function(done) { - db.each('SELECT id, txt FROM foo WHERE id = ?', 1, function(err: null | DuckDbError, row: RowData) { - if (err) { - assert.equal(err.message.includes('does not exist'), 1); - assert.equal(err.errno, sqlite3.ERROR); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - - it('should not error when multiple instances are started in one process', async () => { - async function run_worker() { - return new Promise((resolve, reject) => { - const worker = new Worker(__dirname + '/worker.js', { workerData: 'test' }); - - worker.on('message', resolve); - worker.on('error', reject); - worker.on('exit', (code: number) => { - if (code !== 0) { - console.log(new Error(`Worker stopped with exit code ${code}`)); - } - }) - }); - } - - await run_worker(); // first should always succeed - await run_worker(); // second fails without thread safety - }) - - it("shouldn't crash on an exception", () => { - expect(() => new sqlite3.Database(':memory:', {file_search_path: '/'})).to.throw('Could not set option "file_search_path" as a global option'); - }); -}); - diff --git a/test/each.test.ts b/test/each.test.ts deleted file mode 100644 index de67c7c6..00000000 --- a/test/each.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import {RowData} from ".."; - -describe('each', function() { - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database('test/support/big.db', done); - }); - - it('retrieve 100,000 rows with Statement#each', function(done) { - var total = 100000; - var retrieved = 0; - - - db.each('SELECT id, txt FROM foo WHERE ROWID < ?', total, function(err: null | Error, row: RowData) { - if (err) throw err; - retrieved++; - - if(retrieved === total) { - assert.equal(retrieved, total, "Only retrieved " + retrieved + " out of " + total + " rows."); - done(); - } - }); - }); - - it.skip('Statement#each with complete callback', function(done) { - var total = 10000; - var retrieved = 0; - - db.each('SELECT id, txt FROM foo WHERE ROWID < ?', total, function(err: null | Error, row: RowData) { - if (err) throw err; - retrieved++; - }, function(err: null | Error, num: RowData) { - assert.equal(retrieved, num); - assert.equal(retrieved, total, "Only retrieved " + retrieved + " out of " + total + " rows."); - done(); - }); - }); -}); diff --git a/test/exec.test.ts b/test/exec.test.ts deleted file mode 100644 index 9cde91de..00000000 --- a/test/exec.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import * as fs from 'fs'; -import {TableData} from ".."; - -describe('exec', function() { - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('Database#exec', function(done) { - var sql = fs.readFileSync('test/support/script.sql', 'utf8'); - db.exec(sql, function(err: null | Error) { - if (err) throw err; - done(); - }); - }); - - it('retrieve database structure', function(done) { - db.all("SELECT type, name FROM sqlite_master ORDER BY type, name", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.deepEqual(rows, [ - // { type: 'index', name: 'grid_key_lookup' }, - // { type: 'index', name: 'grid_utfgrid_lookup' }, - // { type: 'index', name: 'images_id' }, - // { type: 'index', name: 'keymap_lookup' }, - // { type: 'index', name: 'map_index' }, - // { type: 'index', name: 'name' }, - { type: 'table', name: 'grid_key' }, - { type: 'table', name: 'grid_utfgrid' }, - { type: 'table', name: 'images' }, - { type: 'table', name: 'keymap' }, - { type: 'table', name: 'map' }, - { type: 'table', name: 'metadata' }, - { type: 'view', name: 'grid_data' }, - { type: 'view', name: 'grids' }, - { type: 'view', name: 'tiles' } - ]); - done(); - }); - }); -}); diff --git a/test/extension.test.ts b/test/extension.test.ts deleted file mode 100644 index a4a5c831..00000000 --- a/test/extension.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -import * as duckdb from '..'; -import {Database, DuckDbError, HttpError, TableData} from '..'; -import * as fs from 'fs'; -import * as assert from 'assert'; -import * as path from 'path'; -import chaiAsPromised from 'chai-as-promised'; -import chai, {expect} from "chai"; - -chai.use(chaiAsPromised); - -const extension_base_path = "../../../build/release/extension"; - -// Look for extensions that we can load and test -let extension_paths: string[] = []; -const extension_full_path = path.resolve(__dirname, extension_base_path); -if (fs.existsSync(extension_full_path)) { - extension_paths = fs.readdirSync(extension_full_path).map(function (file) { - if (!fs.statSync(extension_full_path + '/' + file).isDirectory()) - return undefined; - const potential_extension_path = extension_full_path + `/${file}/${file}.duckdb_extension`; - if (fs.existsSync(potential_extension_path)) { - return potential_extension_path; - } - }).filter(a => a) as string[]; -} - -function isHTTPException(err: DuckDbError): err is HttpError { - return err.errorType === 'HTTP'; -} - -// Note: test will pass on http request failing due to connection issues. -const test_httpfs = async function (db: duckdb.Database) { - const promise = new Promise((resolve, reject) => - db.exec(`SELECT * - FROM parquet_scan('http://localhost:1234/whatever.parquet')`, function (err: DuckDbError | null) { - err ? reject(err) : resolve() - })); - await chai.assert.isRejected(promise, 'IO Error: Connection error for HTTP HEAD'); - - await new Promise((resolve, reject) => db.all("SELECT id, first_name, last_name FROM PARQUET_SCAN('https://raw.githubusercontent.com/duckdb/duckdb/main/data/parquet-testing/userdata1.parquet') LIMIT 3;", function (err: null | Error, rows: TableData) { - if (err) { - if (err.message.startsWith("Unable to connect to URL")) { - console.warn("Warning: HTTP request failed in extension.test.js"); - resolve(); - } else { - reject(err); - } - } else { - assert.deepEqual(rows, [ - {id: 1, first_name: 'Amanda', last_name: 'Jordan'}, - {id: 2, first_name: 'Albert', last_name: 'Freeman'}, - {id: 3, first_name: 'Evelyn', last_name: 'Morgan'}, - ]); - resolve(); - } - })); - - await new Promise((resolve) => { - db.exec("select * from read_csv_auto('https://example.com/hello.csv')", (err: DuckDbError | null) => { - assert.ok(err); - assert.ok(isHTTPException(err)); - if (isHTTPException(err)) { - assert.equal(err.statusCode, 404); - assert.equal(err.reason, 'Not Found'); - assert.equal(err.response, ''); - assert.ok('Content-Length' in err.headers, JSON.stringify(err.headers)); - } - resolve(); - }); - }) -}; - -const test_tpch = async function (db: Database) { - await new Promise((resolve, reject) => db.all("CALL DBGEN(sf=0.01);", function (err: null | Error) { - if (err) { - reject(err); - } - resolve(); - })); -}; - -const test_extension = async function (extension_name: string, db: duckdb.Database) { - switch (extension_name) { - case 'httpfs.duckdb_extension': - await test_httpfs(db); - break; - case 'tpch.duckdb_extension': - await test_tpch(db); - break; - default: - break; - } -}; - -describe('Extension loading', function() { - var db: Database; - - before(function(done) { - db = new duckdb.Database(':memory:', {"allow_unsigned_extensions":"true"}, done); - }); - - for (let extension_path of extension_paths) { - const extension_name = extension_path.replace(/^.*[\\\/]/, ''); - - if (extension_name.startsWith('parquet')) { // Parquet is built-in in the Node client, so skip - continue; - } - - it(extension_name, async function () { - await new Promise((resolve, reject) => db.run(`LOAD '${extension_path}';`, function (err: null | Error) { - if (err) { - reject(err); - } - resolve() - })); - - await test_extension(extension_name, db); - }); - } -}); diff --git a/test/interrupt.test.ts b/test/interrupt.test.ts deleted file mode 100644 index 524e655e..00000000 --- a/test/interrupt.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import {DuckDbError} from ".."; - -// FIXME each is not streaming yet - -describe.skip('interrupt', function() { - it('should interrupt queries', function(done) { - var interrupted = false; - var saved: DuckDbError | null = null; - - var db = new sqlite3.Database(':memory:', function() { - db.serialize(); - - var setup = 'create table t (n int);'; - for (var i = 0; i < 8; i += 1) { - setup += 'insert into t values (' + i + ');'; - } - - db.exec(setup, function(err: null | Error) { - if (err) { - return done(err); - } - - var query = 'select last.n ' + - 'from t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t as last'; - - db.each(query, function(err: null | DuckDbError) { - if (err) { - saved = err; - } else if (!interrupted) { - interrupted = true; - db.interrupt(); - } - }); - - db.close(function() { - if (saved) { - assert.equal(saved.message, 'SQLITE_INTERRUPT: interrupted'); - assert.equal(saved.errno, sqlite3.INTERRUPT); - assert.equal(saved.code, 'SQLITE_INTERRUPT'); - done(); - } else { - done(new Error('Completed query without error, but expected error')); - } - }); - }); - }); - }); - - it('should throw if interrupt is called before open', function(done) { - var db = new sqlite3.Database(':memory:'); - - assert.throws(function() { - db.interrupt(); - }, (/Database is not open/)); - - db.close(); - done(); - }); - - it('should throw if interrupt is called after close', function(done) { - var db = new sqlite3.Database(':memory:'); - - db.close(function() { - assert.throws(function() { - db.interrupt(); - }, (/Database is not open/)); - - done(); - }); - }); - - it('should throw if interrupt is called during close', function(done) { - var db = new sqlite3.Database(':memory:', function() { - db.close(); - assert.throws(function() { - db.interrupt(); - }, (/Database is closing/)); - done(); - }); - }); -}); diff --git a/test/jsdoc.test.ts b/test/jsdoc.test.ts deleted file mode 100644 index 7e6f7086..00000000 --- a/test/jsdoc.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Intended to be similar to stubtest for python - */ - -import * as duckdb from ".."; -// @ts-ignore -import jsdoc from "jsdoc3-parser"; -const { expect } = require('chai'); -const { promisify } = require('util'); - -function lastDot(string: string) { - if (string.endsWith(')')) { - string = string.substring(0, string.length - 1); - } - const array = string.split('.'); - return array[array.length - 1]; -} - -export interface Node { - undocumented: boolean; - name: string; - memberof: string; - longname: string; - scope: string; -} -describe("JSDoc contains all methods", () => { - let docs: Node[]; - before(async () => { - docs = await promisify(jsdoc)(require.resolve("../lib/duckdb")); - }) - - function checkDocs(obj: object, scope: string) { - const symbols = Object.getOwnPropertySymbols(obj).map(i => lastDot(i.toString())); - const expected = Object - .getOwnPropertyNames(obj) - .concat(symbols) - .sort() - .filter(name => name !== 'constructor' && name !== 'default'); - - const actual = docs - .filter((node) => node.memberof === scope && !node.undocumented && node.name !== 'sql') // `sql` is a field, so won't show up in the prototype - .map((node) => lastDot(node.name)) - .sort(); - - expect(expected).to.deep.equals(actual, 'items missing from documentation'); - } - - for (const clazz of ['Database', 'QueryResult', 'Connection', 'Statement']) { - it(clazz, () => { - // @ts-ignore - let clazzObj = duckdb[clazz]; - checkDocs(clazzObj.prototype, `module:duckdb~${clazz}`); - }); - } - - it('module root', () => { - checkDocs(duckdb, 'module:duckdb'); - }); -}); diff --git a/test/named_columns.test.ts b/test/named_columns.test.ts deleted file mode 100644 index 9c35df74..00000000 --- a/test/named_columns.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; - -// TODO -describe.skip('named columns', function() { - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('should create the table', function(done) { - db.run("CREATE TABLE foo (txt TEXT, num INT)", done); - }); - - it('should insert a value', function(done) { - db.run("INSERT INTO foo VALUES($text, $id)", { - $id: 1, - $text: "Lorem Ipsum" - }, done); - }); - - it('should retrieve the values', function(done) { - db.get("SELECT txt, num FROM foo ORDER BY num", function(err, row) { - if (err) throw err; - assert.equal(row.txt, "Lorem Ipsum"); - assert.equal(row.num, 1); - done(); - }); - }); - - it('should be able to retrieve rowid of last inserted value', function(done) { - db.get("SELECT last_insert_rowid() as last_id FROM foo", function(err, row) { - if (err) throw err; - assert.equal(row.last_id, 1); - done(); - }); - }); - -}); diff --git a/test/null_error.test.ts b/test/null_error.test.ts deleted file mode 100644 index 5c361b41..00000000 --- a/test/null_error.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as sqlite3 from '..'; -import * as helper from './support/helper'; - -describe('null error', function() { - var filename = 'test/tmp/test_sqlite_ok_error.db'; - var db: sqlite3.Database; - - before(function(done) { - helper.ensureExists('test/tmp'); - helper.deleteFile(filename); - db = new sqlite3.Database(filename, done); - }); - - it('should create a table', function(done) { - db.run("CREATE TABLE febp_data (leacode TEXT, leaname TEXT, state TEXT, postcode TEXT, fips TEXT, titleistim TEXT, ideastim TEXT, ideapool TEXT, ideapoolname TEXT, localebasis TEXT, localetype2 TEXT, version TEXT, leacount_2006 TEXT, ppexpend_2005 TEXT, ppexpend_2006 TEXT, ppexpend_2007 TEXT, ppexpend_2008 TEXT, ppexpendrank_2006 TEXT, ppexpendrank_2007 TEXT, ppexpendrank_2008 TEXT, rankppexpend_2005 TEXT, opbud_2004 TEXT, opbud_2006 TEXT, opbud_2007 TEXT, opbud_2008 TEXT, titlei_2004 TEXT, titlei_2006 TEXT, titlei_2007 TEXT, titlei_2008 TEXT, titlei_2009 TEXT, titlei_2010 TEXT, idea_2004 TEXT, idea_2005 TEXT, idea_2006 TEXT, idea_2007 TEXT, idea_2008 TEXT, idea_2009 TEXT, ideaest_2010 TEXT, impact_2007 TEXT, impact_2008 TEXT, impact_2009 TEXT, impact_2010 TEXT, fedrev_2006 TEXT, fedrev_2007 TEXT, fedrev_2008 TEXT, schonut_2006 TEXT, schonut_2007 TEXT, schomeal_2006 TEXT, schomeal_2007 TEXT, schoco_2006 TEXT, schocom_2007 TEXT, medicaid_2006 TEXT, medicaid_2007 TEXT, medicaid_2008 TEXT, cenpov_2004 TEXT, cenpov_2007 TEXT, cenpov_2008 TEXT, rankcenpov_2004 TEXT, rankcenpov_2007 TEXT, rankcenpov_2008 TEXT, enroll_2006 TEXT, enroll_2007 TEXT, enroll_2008 TEXT, white_2006 TEXT, white_2007 TEXT, white_2008 TEXT, afam_2006 TEXT, afam_2007 TEXT, afam_2008 TEXT, amin_2006 TEXT, amin_2007 TEXT, amin_2008 TEXT, asian_2006 TEXT, asian_2007 TEXT, asian_2008 TEXT, hisp_2006 TEXT, hisp_2007 TEXT, hisp_2008 TEXT, frpl_2006 TEXT, frpl_2007 TEXT, frpl_2008 TEXT, ell_2006 TEXT, ell_2007 TEXT, ell_2008 TEXT, sped_2006 TEXT, sped_2007 TEXT, sped_2008 TEXT, state4read_2005 TEXT, state4read_2006 TEXT, state4read_2007 TEXT, state4read_2008 TEXT, state4read_2009 TEXT, state4math_2005 TEXT, state4math_2006 TEXT, state4math_2007 TEXT, state4math_2008 TEXT, state4math_2009 TEXT, minor_2007 TEXT, minor_2008 TEXT, state8math_2006 TEXT, state8math_2007 TEXT, state8math_2008 TEXT, state8math_2009 TEXT, state8read_2006 TEXT, state8read_2007 TEXT, state8read_2008 TEXT, state8read_2009 TEXT, statehsmath_2006 TEXT, statehsmath_2007 TEXT, statehsmath_2008 TEXT, statehsmath_2009 TEXT, statehsread_2006 TEXT, statehsread_2007 TEXT, statehsread_2008 TEXT, statehsread_2009 TEXT)", done); - }); - - it('should insert rows with lots of null values', function(done) { - var stmt = db.prepare('INSERT INTO febp_data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', function(err: null | Error) { - if (err) throw err; - - for (var i = 0; i < 100; i++) { - stmt.run([ '100005', 'Albertville City School District', 'ALABAMA', 'AL', '1', '856031', '753000', 'NULL', 'NULL', '6-Small Town', 'Town', 21, '130', '6624', '7140', '8731', '8520', '102', '88', '100', '94', '23352000', '27280000', '30106000', '33028000', '768478', '845886', '782696', '1096819', '1279663', '1168521', '561522', '657649', '684366', '687531', '710543', '727276', '726647', 'N/A', 'N/A', 'N/A', 'N/A', '986', '977', '1006', '1080250', '1202325', '1009962', '1109310', '70287', '93015', '14693.56', '13634.58', 'N/A', '0.230', '0.301', '0.268882175', '73', '26', '29', '3718', '3747', '3790', '2663', '2615', '2575', '75', '82', '89', '3', '2', '6', '11', '9', '8', '955', '1028', '1102', '1991', '2061', '2146', '649', '729', '770', '443', '278', '267', '0.860', '0.86', '0.8474', '0.84', '0.8235', '0.810', '0.84', '0.7729', '0.75', '0.7843', '1121', '1205', '0.74', '0.6862', '0.72', '0.7317', '0.78', '0.7766', '0.79', '0.7387', '0.84', '0.9255', '0.86', '0.9302', '0.88', '0.9308', '0.84', '0.8605' ]); - } - - stmt.finalize(function(err) { - if (err) throw err; - done(); - }); - }); - }); - - it('should have created the database', function() { - helper.fileExists(filename); - }); - - after(function() { - helper.deleteFile(filename); - }); -}); diff --git a/test/open_close.test.ts b/test/open_close.test.ts deleted file mode 100644 index 6833c031..00000000 --- a/test/open_close.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import * as fs from 'fs'; -import * as helper from './support/helper'; - -describe('open/close', function() { - before(function() { - helper.ensureExists('test/tmp'); - }); - - describe('open and close non-existant database', function() { - before(function() { - helper.deleteFile('test/tmp/test_create.db'); - }); - - var db: sqlite3.Database; - it('should open the database', function(done) { - db = new sqlite3.Database('test/tmp/test_create.db', done); - }); - - it('should close the database', function(done) { - db.close(done); - }); - - it('should have created the file', function() { - helper.fileExists('test/tmp/test_create.db'); - }); - - after(function() { - helper.deleteFile('test/tmp/test_create.db'); - }); - }); - - // describe('open and close non-existant shared database', function() { - // before(function() { - // helper.deleteFile('test/tmp/test_create_shared.db'); - // }); - - // var db; - // it('should open the database', function(done) { - // db = new sqlite3.Database('file:./test/tmp/test_create_shared.db', sqlite3.OPEN_URI | sqlite3.OPEN_SHAREDCACHE | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, done); - // }); - - // it('should close the database', function(done) { - // db.close(done); - // }); - - // it('should have created the file', function() { - // assert.fileExists('test/tmp/test_create_shared.db'); - // }); - - // after(function() { - // helper.deleteFile('test/tmp/test_create_shared.db'); - // }); - // }); - - - // (sqlite3.VERSION_NUMBER < 3008000 ? describe.skip : describe)('open and close shared memory database', function() { - - // var db1; - // var db2; - - // it('should open the first database', function(done) { - // db1 = new sqlite3.Database('file:./test/tmp/test_memory.db?mode=memory', sqlite3.OPEN_URI | sqlite3.OPEN_SHAREDCACHE | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, done); - // }); - - // it('should open the second database', function(done) { - // db2 = new sqlite3.Database('file:./test/tmp/test_memory.db?mode=memory', sqlite3.OPEN_URI | sqlite3.OPEN_SHAREDCACHE | sqlite3.OPEN_READWRITE | sqlite3.OPEN_CREATE, done); - // }); - - // it('first database should set the user_version', function(done) { - // db1.exec('PRAGMA user_version=42', done); - // }); - - // it('second database should get the user_version', function(done) { - // db2.get('PRAGMA user_version', function(err, row) { - // if (err) throw err; - // assert.equal(row.user_version, 42); - // done(); - // }); - // }); - - // it('should close the first database', function(done) { - // db1.close(done); - // }); - - // it('should close the second database', function(done) { - // db2.close(done); - // }); - // }); - - it('should not be unable to open an inaccessible database', function(done) { - // NOTE: test assumes that the user is not allowed to create new files - // in /test. - var db = new sqlite3.Database('/test/tmp/directory-does-not-exist/test.db', function(err) { - - if (err && err.errno === sqlite3.ERROR) { - done(); - } else if (err) { - done(err); - } else { - done('Opened database that should be inaccessible'); - } - }); - }); - - - describe('creating database without create flag', function() { - before(function() { - helper.deleteFile('test/tmp/test_readonly.db'); - }); - - it('should fail to open the database', function(done) { - new sqlite3.Database('tmp/test_readonly.db', sqlite3.OPEN_READONLY, function(err) { - if (err && err.errno === sqlite3.ERROR) { - done(); - } else if (err) { - done(err); - } else { - done('Created database without create flag'); - } - }); - }); - - it('should not have created the file', function() { - helper.fileDoesNotExist('test/tmp/test_readonly.db'); - }); - - after(function() { - helper.deleteFile('test/tmp/test_readonly.db'); - }); - }); - - describe('open and close memory database queuing', function() { - var db: sqlite3.Database; - it('should open the database', function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('should close the database', function(done) { - db.close(done); - }); - - it('shouldn\'t close the database again', function(done) { - db.close(function(err) { - assert.ok(err, 'No error object received on second close'); - assert.ok(err.errno === sqlite3.ERROR); - done(); - }); - }); - }); - - describe('closing with unfinalized statements', function() { - var completed = false; - var completedSecond = false; - var closed = false; - - var db: sqlite3.Database; - before(function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('should create a table', function(done) { - db.run("CREATE TABLE foo (id INT, num INT)", done); - }); - - var stmt: sqlite3.Statement; - it('should prepare/run a statement', function(done) { - stmt = db.prepare('INSERT INTO foo VALUES (?, ?)'); - stmt.run(1, 2, done); - }); - - // it('should fail to close the database', function(done) { - // db.close(function(err) { - // assert.ok(err.message, - // "SQLITE_BUSY: unable to close due to unfinalised statements"); - // done(); - // }); - // }); - - it('should succeed to close the database after finalizing', function(done) { - stmt.run(3, 4, function() { - stmt.finalize(); - db.close(done); - }); - }); - }); -}); diff --git a/test/parallel_insert.test.ts b/test/parallel_insert.test.ts deleted file mode 100644 index 7a8741da..00000000 --- a/test/parallel_insert.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as sqlite3 from '..'; -import * as helper from './support/helper'; - -describe('parallel', function() { - var db: sqlite3.Database; - before(function(done) { - helper.deleteFile('test/tmp/test_parallel_inserts.db'); - helper.ensureExists('test/tmp'); - db = new sqlite3.Database('test/tmp/test_parallel_inserts.db', done); - }); - - var columns: string[] = []; - for (var i = 0; i < 128; i++) { - columns.push('id' + i + " INTEGER"); - } - - it('should create the table', function(done) { - db.run("CREATE TABLE foo (" + columns + ")", function(err: null | Error) { - done(); - }); - }); - - it('should insert in parallel', function(done) { - for (var i = 0; i < 1000; i++) { - for (var values = [], j = 0; j < columns.length; j++) { - values.push(i * j); - } - db.run("INSERT INTO foo VALUES (" + values + ")"); - } - - db.wait(done); - }); - - it('should close the database', function(done) { - db.close(done); - }); - - it('should verify that the database exists', function() { - helper.fileExists('test/tmp/test_parallel_inserts.db'); - }); - - after(function() { - helper.deleteFile('test/tmp/test_parallel_inserts.db'); - }); -}); diff --git a/test/parquet.test.ts b/test/parquet.test.ts deleted file mode 100644 index 83c6e1c0..00000000 --- a/test/parquet.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as sqlite3 from '..'; - -describe('can query parquet', function() { - var db: sqlite3.Database; - - before(function(done) { - db = new sqlite3.Database(':memory:', done); - }); - - it('should be able to read parquet files', function(done) { - db.run("select * from parquet_scan('test/userdata1.parquet')", done); - }); - -}); diff --git a/test/pathnames.test.ts b/test/pathnames.test.ts deleted file mode 100644 index a14b0610..00000000 --- a/test/pathnames.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import * as sqlite3 from ".."; -import * as assert from "assert"; -import {DuckDbError, TableData} from ".."; - -describe("pathname search support", function () { - let db: sqlite3.Database; - describe("without search paths", () => { - before((done) => { - db = new sqlite3.Database(":memory:", done); - }); - - it("supports a full path", function (done) { - db.prepare('select * from "test/support/prepare.csv"').all( - (err: null | Error, result: TableData) => { - assert.equal(err, null); - assert.equal(result.length, 5000); - done(); - } - ); - }); - - it("don't not support a partial path", function (done) { - db.prepare('select * from "prepare.csv"').all((err: null | DuckDbError, result: TableData) => { - assert.ok(err); - assert.equal(err.code, "DUCKDB_NODEJS_ERROR"); - assert.equal(err.errno, -1); - assert.equal(result, null); - done(); - }); - }); - }); - - describe("with search paths", () => { - before((done) => { - db = new sqlite3.Database(":memory:", () => { - db.prepare("SET FILE_SEARCH_PATH='test/support'").run(done); - }); - }); - - it("supports a full path", function (done) { - db.prepare('select * from "test/support/prepare.csv"').all( - (err: null | Error, result: TableData) => { - assert.equal(err, null); - assert.equal(result.length, 5000); - done(); - } - ); - }); - - it("supports a partial path", function (done) { - db.prepare('select * from "prepare.csv"').all((err: null | Error, result: TableData) => { - assert.equal(err, null); - assert.equal(result.length, 5000); - done(); - }); - }); - }); - - describe("with multiple search paths", () => { - before((done) => { - db = new sqlite3.Database(":memory:", () => { - db.prepare("SET FILE_SEARCH_PATH='test/support'").run(done); - }); - }); - - it("supports a full path", function (done) { - db.prepare('select * from "test/support/prepare.csv"').all( - (err: null | Error, result: TableData) => { - assert.equal(err, null); - assert.equal(result.length, 5000); - done(); - } - ); - }); - - it("supports a partial path", function (done) { - db.prepare('select * from "prepare.csv"').all((err: null | Error, result: TableData) => { - assert.equal(err, null); - assert.equal(result.length, 5000); - done(); - }); - }); - }); -}); diff --git a/test/prepare.test.ts b/test/prepare.test.ts deleted file mode 100644 index a75092cc..00000000 --- a/test/prepare.test.ts +++ /dev/null @@ -1,696 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import {DuckDbError, RowData, Statement, TableData} from ".."; - -describe('prepare', function() { - describe('invalid SQL', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var stmt; - it('should fail preparing a statement with invalid SQL', function(done) { - stmt = db.prepare('CRATE TALE foo text bar)', function(err: null | DuckDbError, statement: Statement) { - if (err && err.errno == sqlite3.ERROR /*&& - err.message === 'Parser: syntax error at or near "CRATE' */) { - done(); - } - else throw err; - }); - }); - - after(function(done) { db.close(done); }); - }); - - describe('simple prepared statement', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - it('should prepare, run and finalize the statement', function(done) { - db.prepare("CREATE TABLE foo (bar text)") - .run() - .finalize(done); - }); - - after(function(done) { db.close(done); }); - }); - - describe('inserting and retrieving rows', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var inserted = 0; - var retrieved = 0; - - // We insert and retrieve that many rows. - var count = 1000; - - it('should create the table', function(done) { - db.prepare("CREATE TABLE foo (txt text, num int, flt double, blb blob)").run().finalize(done); - }); - - it('should insert ' + count + ' rows', function(done) { - for (var i = 0; i < count; i++) { - db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)").run( - 'String ' + i, - i, - i * Math.PI, - null, - function(err: null | Error) { - if (err) throw err; - inserted++; - } - ).finalize(function(err) { - if (err) throw err; - if (inserted == count) done(); - }); - } - }); - - it('should prepare a statement and return values again', function(done) { - var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error) { - if (err) throw err; - assert.equal(stmt.sql, 'SELECT txt, num, flt, blb FROM foo ORDER BY num'); - }); - - stmt.each(function(err: null | Error, row: RowData) { - if (err) throw err; - assert.equal(row.txt, 'String ' + retrieved); - assert.equal(row.num, retrieved); - assert.equal(row.flt, retrieved * Math.PI); - assert.equal(row.blb, null); - retrieved++; - - }); - - stmt.finalize(done); - }); - - it('should have retrieved ' + (count) + ' rows', function() { - assert.equal(count, retrieved, "Didn't retrieve all rows"); - }); - - -/* // get() is an abomination and should be killed - it('should prepare a statement and run it ' + (count + 5) + ' times', function(done) { - var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err) { - if (err) throw err; - assert.equal(stmt.sql, 'SELECT txt, num, flt, blb FROM foo ORDER BY num'); - }); - - for (var i = 0; i < count + 5; i++) (function(i) { - stmt.get(function(err, row) { - if (err) throw err; - - if (retrieved >= 1000) { - assert.equal(row, undefined); - } else { - assert.equal(row.txt, 'String ' + i); - assert.equal(row.num, i); - assert.equal(row.flt, i * Math.PI); - assert.equal(row.blb, null); - } - retrieved++; - }); - })(i); - - stmt.finalize(done); - }); - - it('should have retrieved ' + (count + 5) + ' rows', function() { - assert.equal(count + 5, retrieved, "Didn't retrieve all rows"); - }); -*/ - - after(function(done) { db.close(done); }); - }); - - - describe('inserting with accidental undefined', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var inserted = 0; - var retrieved = 0; - - it('should create the table', function(done) { - db.prepare("CREATE TABLE foo (num int)").run().finalize(done); - }); - - it('should insert two rows', function(done) { - db.prepare('INSERT INTO foo VALUES(4)').run(function(err: null | Error) { - if (err) throw err; - inserted++; - }).run(undefined, function (err: null | Error) { - // The second time we pass undefined as a parameter. This is - // a mistake, but it should either throw an error or be ignored, - // not silently fail to run the statement. - if (err) { - // errors are fine - }; - inserted++; - }).finalize(function(err) { - if (err) throw err; - if (inserted == 2) done(); - }); - }); - -/* - it('should retrieve the data', function(done) { - var stmt = db.prepare("SELECT num FROM foo", function(err) { - if (err) throw err; - }); - - for (var i = 0; i < 2; i++) (function(i) { - stmt.get(function(err, row) { - if (err) throw err; - assert(row); - assert.equal(row.num, 4); - retrieved++; - }); - })(i); - - stmt.finalize(done); - }); - */ - - it('should retrieve the data', function(done) { - var stmt = db.prepare("SELECT num FROM foo", function(err: null | Error) { - if (err) throw err; - }); - - stmt.each(function(err: null | Error, row: RowData) { - if (err) throw err; - assert.ok(row); - assert.equal(row.num, 4); - retrieved++; - }); - - stmt.finalize(done); - }); - - it('should have retrieved two rows', function() { - assert.equal(2, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); - -/* - describe('retrieving reset() function', function() { - var db; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - var retrieved = 0; - - it('should retrieve the same row over and over again', function(done) { - var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo ORDER BY num"); - for (var i = 0; i < 10; i++) { - stmt.reset(); - stmt.get(function(err, row) { - if (err) throw err; - assert.equal(row.txt, 'String 0'); - assert.equal(row.num, 0); - assert.equal(row.flt, 0.0); - assert.equal(row.blb, null); - retrieved++; - }); - } - stmt.finalize(done); - }); - - it('should have retrieved 10 rows', function() { - assert.equal(10, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); - - - describe('multiple get() parameter binding', function() { - var db; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - var retrieved = 0; - - it('should retrieve particular rows', function(done) { - var stmt = db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ?"); - - for (var i = 0; i < 10; i++) (function(i) { - stmt.get(i * 10 + 1, function(err, row) { - if (err) throw err; - var val = i * 10 + 1; - assert.equal(row.txt, 'String ' + val); - assert.equal(row.num, val); - assert.equal(row.flt, val * Math.PI); - assert.equal(row.blb, null); - retrieved++; - }); - })(i); - - stmt.finalize(done); - }); - - it('should have retrieved 10 rows', function() { - assert.equal(10, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); - */ - - describe('prepare() parameter binding', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - var retrieved = 0; - - /* it('should retrieve particular rows', function(done) { - db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10') - .get(function(err, row) { - if (err) throw err; - assert.equal(row.txt, 'String 10'); - assert.equal(row.num, 10); - assert.equal(row.flt, 10 * Math.PI); - assert.equal(row.blb, null); - retrieved++; - }) - .finalize(done); - }); */ - - it('should retrieve particular rows', function(done) { - db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?") - .each(10, 'String 10', function(err: null | Error, row: RowData) { - if (err) throw err; - assert.equal(row.txt, 'String 10'); - assert.equal(row.num, 10); - // assert.equal(row.flt, 10 * Math.PI); - // assert.equal(row.blb, null); - retrieved++; - }) - .finalize(done); - }); - - it('should have retrieved 1 row', function() { - assert.equal(1, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); - - describe('all()', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - var retrieved = 0; - var count = 1000; - - it('should retrieve particular rows', function(done) { - db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num < ? ORDER BY num") - .all(count, function(err: null | Error, rows: TableData) { - if (err) throw err; - for (var i = 0; i < rows.length; i++) { - assert.equal(rows[i].txt, 'String ' + i); - assert.equal(rows[i].num, i); - //assert.equal(rows[i].flt, i * Math.PI); - //assert.equal(rows[i].blb, null); - retrieved++; - } - }) - .finalize(done); - }); - - it('should have retrieved all rows', function() { - assert.equal(count, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); - - describe('prepare multiple statements', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TABLE foo (a integer)", done) - } - ); }); - - it('should directly execute first statements', function(done) { - db.prepare("insert into foo values (3); insert into foo values (4); select * from foo") - .all(function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].a, 3); - assert.equal(rows[1].a, 4); - }) - .finalize(done); - }); - - it('should fail in prepare, when executing the first statement', function(done) { - let prepared = db.prepare("SELECT * FROM non_existent_table; SELECT 42", function(err: null | Error) { - if (err) { - done(); - return; - } - }); - }); - - it('should fail in prepare, when preparing the first statement', function(done) { - let prepared = db.prepare("SELCET * FROM foo; SELECT 42", function(err: null | Error) { - if (err) { - done(); - return; - } - }); - }); - - after(function(done) { db.close(done); }); - }); - - describe('all()', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - it('should retrieve particular rows', function(done) { - db.prepare("SELECT txt, num, flt, blb FROM foo WHERE num > 5000") - .all(function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.ok(rows.length === 0); - }) - .finalize(done); - }); - - after(function(done) { db.close(done); }); - }); - - describe('high concurrency', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - function randomString() { - var str = ''; - var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 '; - - for (var i = Math.random() * 300; i > 0; i--) { - str += characters.charAt(Math.floor(Math.random() * characters.length)) - } - return str; - - } - - // Generate random data. - var data: [string, number, number, null][] = []; - var retrieved_marks: boolean[] = []; - var length = Math.floor(Math.random() * 1000) + 200; - for (var i = 0; i < length; i++) { - data.push([ randomString(), i, i * Math.random(), null ]); - retrieved_marks.push(false); - } - var inserted = 0; - var retrieved = 0; - - it('should create the table', function(done) { - db.prepare("CREATE TABLE foo (txt text, num int, flt float, blb blob)").run().finalize(done); - }); - - it('should insert all values', function(done) { - for (var i = 0; i < data.length; i++) { - var stmt = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)"); - stmt.run(data[i][0], data[i][1], data[i][2], data[i][3], function(err: null | Error) { - if (err) throw err; - inserted++; - }).finalize(function(err) { - if (err) throw err; - if (inserted == data.length) done(); - }); - } - }); - - it('should retrieve all values', function(done) { - db.prepare("SELECT txt, num, flt, blb FROM foo") - .all(function(err: null | Error, rows: TableData) { - if (err) throw err; - - for (var i = 0; i < rows.length; i++) { - assert.ok(retrieved_marks[rows[i].num] !== true); - - assert.equal(rows[i].txt, data[rows[i].num][0]); - assert.equal(rows[i].num, data[rows[i].num][1]); - //assert.equal(rows[i].flt, data[rows[i].num][2]); - //assert.equal(rows[i].blb, data[rows[i].num][3]); - - // Mark the data row as already retrieved. - retrieved_marks[rows[i].num] = true; - retrieved++; - - } - - assert.equal(retrieved, data.length); - assert.equal(retrieved, inserted); - }) - .finalize(done); - }); - - after(function(done) { db.close(done); }); - }); - -/* - describe('test Database#get()', function() { - var db; - before(function(done) { db = new sqlite3.Database(':memory:', - function(err) { - db.run("CREATE TEMPORARY VIEW foo AS SELECT * FROM read_csv_auto('test/support/prepare.csv')", done) - } - ); }); - - var retrieved = 0; - - it('should get a row', function(done) { - db.get("SELECT txt, num, flt, blb FROM foo WHERE num = ? AND txt = ?", 10, 'String 10', function(err, row) { - if (err) throw err; - assert.equal(row.txt, 'String 10'); - assert.equal(row.num, 10); - assert.equal(row.flt, 10 * Math.PI); - assert.equal(row.blb, null); - retrieved++; - done(); - }); - }); - - it('should have retrieved all rows', function() { - assert.equal(1, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); - }); -*/ - describe('Database#run() and Database#all()', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var inserted = 0; - var retrieved = 0; - - // We insert and retrieve that many rows. - var count = 1000; - - it('should create the table', function(done) { - db.run("CREATE TABLE foo (txt text, num int, flt double, blb blob)", done); - }); - - it('should insert ' + count + ' rows', function(done) { - for (var i = 0; i < count; i++) { - db.run("INSERT INTO foo VALUES(?, ?, ?, ?)", - 'String ' + i, - i, - i * Math.PI, - null, - function(err: null | Error) { - if (err) throw err; - inserted++; - if (inserted == count) done(); - } - ); - } - }); - - it('should retrieve all rows', function(done) { - db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error, rows: TableData) { - if (err) throw err; - for (var i = 0; i < rows.length; i++) { - assert.equal(rows[i].txt, 'String ' + i); - assert.equal(rows[i].num, i); - assert.equal(rows[i].flt, i * Math.PI); - assert.equal(rows[i].blb, null); - retrieved++; - } - - assert.equal(retrieved, count); - assert.equal(retrieved, inserted); - - done(); - }); - }); - - describe('using aggregate functions', function() { - it("should aggregate string_agg(txt)", function (done) { - db.all("SELECT string_agg(txt, ',') as string_agg FROM foo WHERE num < 2", function (err: null | Error, res: TableData) { - assert.equal(res[0].string_agg, "String 0,String 1"); - done(err); - }); - }); - - it("should aggregate min(flt)", function (done) { - db.all("SELECT min(flt) as min FROM foo WHERE flt > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].min, Math.PI); - done(err); - }); - }); - it("should aggregate max(flt)", function (done) { - db.all("SELECT max(flt) as max FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].max, Math.PI * 999); - done(err); - }); - }); - it("should aggregate avg(flt)", function (done) { - db.all("SELECT avg(flt) as avg FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].avg, 1569.2255304681016); - done(err); - }); - }); - it("should aggregate first(flt)", function (done) { - db.all("SELECT first(flt) as first FROM foo WHERE flt > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].first, Math.PI); - done(err); - }); - }); - it("should aggregate approx_count_distinct(flt)", function (done) { - db.all("SELECT approx_count_distinct(flt) as approx_count_distinct FROM foo", function (err: null | Error, res: TableData) { - assert.ok(res[0].approx_count_distinct >= 950); - done(err); - }); - }); - it("should aggregate sum(flt)", function (done) { - db.all("SELECT sum(flt) as sum FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].sum, 1569225.5304681016); - done(err); - }); - }); - - - it("should aggregate min(num)", function (done) { - db.all("SELECT min(num) as min FROM foo WHERE num > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].min, 1); - done(err); - }); - }); - it("should aggregate max(num)", function (done) { - db.all("SELECT max(num) as max FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].max, 999); - done(err); - }); - }); - it("should aggregate count(num)", function (done) { - db.all("SELECT count(num) as count FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].count, 1000); - done(err); - }); - }); - it("should aggregate avg(num)", function (done) { - db.all("SELECT avg(num) as avg FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].avg, 499.5); - done(err); - }); - }); - it("should aggregate first(num)", function (done) { - db.all("SELECT first(num) as first FROM foo WHERE num > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].first, 1); - done(err); - }); - }); - it("should aggregate approx_count_distinct(num)", function (done) { - db.all("SELECT approx_count_distinct(num) as approx_count_distinct FROM foo", function (err: null | Error, res: TableData) { - assert.ok(res[0].approx_count_distinct >= 950); - done(err); - }); - }); - it("should aggregate approx_quantile(num, 0.5)", function (done) { - db.all("SELECT approx_quantile(num, 0.5) as approx_quantile FROM foo", function (err: null | Error, res: TableData) { - assert.ok(res[0].approx_quantile >= 499); - done(err); - }); - }); - it("should aggregate reservoir_quantile(num, 0.5, 10)", function (done) { - db.all("SELECT reservoir_quantile(num, 0.5, 10) as reservoir_quantile FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].reservoir_quantile, 4); - done(err); - }); - }); - it("should aggregate var_samp(num)", function (done) { - db.all("SELECT var_samp(num) as var_samp FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].var_samp, 83416.66666666667); - done(err); - }); - }); - it("should aggregate kurtosis(num)", function (done) { - db.all("SELECT kurtosis(num) as kurtosis FROM foo", function (err: null | Error, res: TableData) { - // The `num` column of table `foo` contains each integer from 0 to 999,999 exactly once. - // This is a uniform distribution. The excess kurtosis for a uniform distribution is exactly -1.2. - // See https://en.wikipedia.org/wiki/Kurtosis#Other_well-known_distributions - const expected = -1.2; - - // The calculated value can differ from the exact answer by small amounts on different platforms due - // to floating-point errors. This tolerance was determined experimentally. - const tolerance = Number.EPSILON * 10; - - assert.ok(Math.abs(res[0].kurtosis - expected) < tolerance); - done(err); - }); - }); - - it("should aggregate sum(num)", function (done) { - db.all("SELECT sum(num) as sum FROM foo", function (err: null | Error, res: TableData) { - assert.equal(res[0].sum, 499500); - done(err); - }); - }); - - it("should aggregate product(num)", function (done) { - db.all("SELECT product(num) as product FROM foo WHERE num < 20 AND num > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].product, 121645100408832000); - done(err); - }); - }); - - - it("should aggregate product(flt)", function (done) { - db.all("SELECT product(flt) as product FROM foo WHERE num < 10 AND num > 0", function (err: null | Error, res: TableData) { - assert.equal(res[0].product, 10817125966.120956); - done(err); - }); - }); - - - }); - - after(function(done) { db.close(done); }); - }); -}); diff --git a/test/query_result.test.ts b/test/query_result.test.ts deleted file mode 100644 index 16eb231c..00000000 --- a/test/query_result.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as duckdb from '..'; -import * as assert from 'assert'; - -describe('QueryResult', () => { - const total = 1000; - - let db: duckdb.Database; - let conn: duckdb.Connection; - before((done) => { - db = new duckdb.Database(':memory:', () => { - conn = new duckdb.Connection(db, done); - }); - }); - - it('streams results', async () => { - let retrieved = 0; - const stream = conn.stream('SELECT * FROM range(0, ?)', total); - for await (const row of stream) { - retrieved++; - } - assert.equal(total, retrieved) - }) -}) diff --git a/test/replacement_scan.test.ts b/test/replacement_scan.test.ts deleted file mode 100644 index b97cc2e3..00000000 --- a/test/replacement_scan.test.ts +++ /dev/null @@ -1,144 +0,0 @@ -import * as sqlite3 from "../lib/duckdb"; -import type { TableData } from "../lib/duckdb"; -import { expect } from "chai"; - -const replacementScan = (table: string) => { - if (table.endsWith(".csv")) { - return null; - } else { - return { - function: "read_csv_auto", - parameters: [`test/support/${table}.csv`], - }; - } -}; - -const invalidTableFunction = (table: string) => { - return { - function: "foo", - parameters: ["bar"], - }; -}; - -const invalidResultType = (table: string) => { - return "hello" as unknown as sqlite3.ReplacementScanResult; -}; - -const invalidResultKeys = (table: string) => { - return { - foo: "foo", - bar: "bar", - } as unknown as sqlite3.ReplacementScanResult; -}; - -describe("replacement scan", () => { - var db: sqlite3.Database; - describe("without replacement scan", () => { - before(function (done) { - db = new sqlite3.Database(":memory:", done); - }); - - it("is not found", (done) => { - db.all( - "SELECT * FROM 'prepare' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(err).not.to.be.null; - expect(err!.message).to.match( - /Table with name prepare does not exist/ - ); - done(); - } - ); - }); - }); - - describe("with replacement scan", () => { - before((done) => { - db = new sqlite3.Database(":memory:", () => { - db.registerReplacementScan(replacementScan).then(done); - }); - }); - - it("is found when pattern matches", (done) => { - db.all( - "SELECT * FROM 'prepare' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(rows.length).to.equal(5); - done(); - } - ); - }); - - it("handles null response", (done) => { - db.all( - "SELECT * FROM 'test/support/prepare.csv' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(rows.length).to.equal(5); - done(); - } - ); - }); - - it("errors with invalid table", (done) => { - db.all( - "SELECT * FROM 'missing' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(err).not.to.be.null; - expect(err!.message).to.match( - /No files found that match the pattern "test\/support\/missing.csv"/ - ); - done(); - } - ); - }); - }); - - describe("with invalid replacement scan functions", () => { - it("does not crash with bad return values", (done) => { - db = new sqlite3.Database(":memory:", () => { - db.registerReplacementScan(invalidTableFunction).then(() => { - db.all( - "SELECT * FROM 'missing' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(err).not.to.be.null; - expect(err!.message).to.match( - /Table Function with name foo does not exist/ - ); - done(); - } - ); - }); - }); - }); - - it("does not crash with invalid response", (done) => { - db = new sqlite3.Database(":memory:", () => { - db.registerReplacementScan(invalidResultType).then(() => { - db.all( - "SELECT * FROM 'missing' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(err).not.to.be.null; - expect(err!.message).to.match(/Invalid scan replacement result/); - done(); - } - ); - }); - }); - }); - - it("does not crash with invalid response object", (done) => { - db = new sqlite3.Database(":memory:", () => { - db.registerReplacementScan(invalidResultKeys).then(() => { - db.all( - "SELECT * FROM 'missing' LIMIT 5", - function (err: null | Error, rows: TableData) { - expect(err).not.to.be.null; - expect(err!.message).to.match(/Expected parameter array/); - done(); - } - ); - }); - }); - }); - }); -}); diff --git a/test/serialization.test.ts b/test/serialization.test.ts deleted file mode 100644 index 3ebacff2..00000000 --- a/test/serialization.test.ts +++ /dev/null @@ -1,111 +0,0 @@ -import * as sqlite3 from '..'; -import * as assert from 'assert'; -import {TableData} from ".."; - - -describe('serialize() and parallelize()', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var inserted1 = 0; - var inserted2 = 0; - var retrieved = 0; - - var count = 1000; - - it('should toggle', function(done) { - db.serialize(); - db.run("CREATE TABLE foo (txt text, num int, flt double, blb blob)"); - db.parallelize(done); - }); - - it('should insert rows', function() { - var stmt1 = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)"); - var stmt2 = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)"); - for (var i = 0; i < count; i++) { - // Interleaved inserts with two statements. - stmt1.run('String ' + i, i, i * Math.PI, null, function(err: null | Error) { - if (err) throw err; - inserted1++; - }); - i++; - stmt2.run('String ' + i, i, i * Math.PI, null, function(err: null | Error) { - if (err) throw err; - inserted2++; - }); - } - stmt1.finalize(); - stmt2.finalize(); - }); - - it('should have inserted all the rows after synchronizing with serialize()', function(done) { - db.serialize(); - db.all("SELECT txt, num, flt, blb FROM foo ORDER BY num", function(err: null | Error, rows: TableData) { - if (err) throw err; - for (var i = 0; i < rows.length; i++) { - assert.equal(rows[i].txt, 'String ' + i); - assert.equal(rows[i].num, i); - assert.equal(rows[i].flt, i * Math.PI); - assert.equal(rows[i].blb, null); - retrieved++; - } - - assert.equal(count, inserted1 + inserted2, "Didn't insert all rows"); - assert.equal(count, retrieved, "Didn't retrieve all rows"); - done(); - }); - }); - - after(function(done) { db.close(done); }); -}); - -describe('serialize(fn)', function() { - var db: sqlite3.Database; - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - var inserted = 0; - var retrieved = 0; - - var count = 1000; - - it('should call the callback', function(done) { - db.serialize(function() { - db.run("CREATE TABLE foo (txt text, num int, flt double, blb blob, d date, ts timestamp)"); - - var stmt = db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?, ?, ?)"); - for (var i = 0; i < count; i++) { - var d = new Date(Date.UTC(2018, 0, i)); - var ts = new Date(Date.UTC(2021, 6, 10, 0, 0, i)); - stmt.run('String ' + i, i, i * Math.PI, null, d, ts, function(err: null | Error) { - if (err) throw err; - inserted++; - }); - } - stmt.finalize(); - - db.all("SELECT txt, num, flt, blb, d, ts FROM foo ORDER BY num", function(err: null | Error, rows: TableData) { - if (err) throw err; - for (var i = 0; i < rows.length; i++) { - var d = new Date(Date.UTC(2018, 0, i)); - var ts = new Date(Date.UTC(2021, 6, 10, 0, 0, i)); - assert.equal(rows[i].txt, 'String ' + i); - assert.equal(rows[i].num, i); - assert.equal(rows[i].flt, i * Math.PI); - assert.equal(rows[i].blb, null); - assert.equal(rows[i].d.toString(), d.toString()); - assert.equal(rows[i].ts.toString(), ts.toString()); - retrieved++; - } - done(); - }); - }); - }); - - - it('should have inserted and retrieved all rows', function() { - assert.equal(count, inserted, "Didn't insert all rows"); - assert.equal(count, retrieved, "Didn't retrieve all rows"); - }); - - after(function(done) { db.close(done); }); -}); diff --git a/test/support/createdb.js b/test/support/createdb.js deleted file mode 100755 index d81fee33..00000000 --- a/test/support/createdb.js +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env node - -function createdb(callback) { - var existsSync = require('fs').existsSync || require('path').existsSync; - var path = require('path'); - - var sqlite3 = require('../../lib/duckdb'); - - var count = 1000000; - var db_path = path.join(__dirname,'big.db'); - - function randomString() { - var str = ''; - var chars = 'abcdefghijklmnopqrstuvwxzyABCDEFGHIJKLMNOPQRSTUVWXZY0123456789 '; - for (var i = Math.random() * 100; i > 0; i--) { - str += chars[Math.floor(Math.random() * chars.length)]; - } - return str; - }; - - - if (existsSync(db_path)) { - console.log('okay: database already created (' + db_path + ')'); - if (callback) callback(); - } else { - console.log("Creating test database... This may take several minutes."); - var db = new sqlite3.Database(db_path, () => { - db.serialize(function() { - db.run("CREATE TABLE foo (id INT, txt TEXT)"); - db.run("BEGIN TRANSACTION"); - var stmt = db.prepare("INSERT INTO foo VALUES(?, ?)"); - for (var i = 0; i < count; i++) { - stmt.run(i, randomString()); - } - - stmt.finalize(); - db.run("COMMIT TRANSACTION", function () { - db.close(callback); - }); - }); - }); - } -}; - -if (require.main === module) { - createdb(); -} - -module.exports = createdb; diff --git a/test/support/elmo.png b/test/support/elmo.png deleted file mode 100644 index 37000d47..00000000 Binary files a/test/support/elmo.png and /dev/null differ diff --git a/test/support/helper.ts b/test/support/helper.ts deleted file mode 100644 index 7b384be7..00000000 --- a/test/support/helper.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as fs from 'fs'; -import {constants} from "os"; - -const ENOENT = constants.errno.ENOENT; - -function notUnlinkError(err: any) { - return err.errno !== ENOENT && err.code !== 'ENOENT' && err.syscall !== 'unlink'; -} - -export function deleteFile(name: fs.PathLike) { - try { - fs.unlinkSync(name); - } catch(err) { - if (notUnlinkError(err)) { - throw err; - } - } -} - -export function ensureExists(name: fs.PathLike) { - if (!fs.existsSync(name)) { - fs.mkdirSync(name); - } -} - -export function fileDoesNotExist(name: fs.PathLike) { - try { - fs.statSync(name); - } catch(err) { - if (notUnlinkError(err)) { - throw err; - } - } -} - -export function fileExists(name: fs.PathLike) { - try { - fs.statSync(name); - } catch(err) { - throw err; - } -} diff --git a/test/support/prepare.csv b/test/support/prepare.csv deleted file mode 100644 index 8711367c..00000000 --- a/test/support/prepare.csv +++ /dev/null @@ -1,5001 +0,0 @@ -"","txt","num","flt","blb" -"1","String 0",0,0,NA -"2","String 1",1,3.14159265358979,NA -"3","String 2",2,6.28318530717959,NA -"4","String 3",3,9.42477796076938,NA -"5","String 4",4,12.5663706143592,NA -"6","String 5",5,15.707963267949,NA -"7","String 6",6,18.8495559215388,NA -"8","String 7",7,21.9911485751286,NA -"9","String 8",8,25.1327412287183,NA -"10","String 9",9,28.2743338823081,NA -"11","String 10",10,31.4159265358979,NA -"12","String 11",11,34.5575191894877,NA -"13","String 12",12,37.6991118430775,NA -"14","String 13",13,40.8407044966673,NA -"15","String 14",14,43.9822971502571,NA -"16","String 15",15,47.1238898038469,NA -"17","String 16",16,50.2654824574367,NA -"18","String 17",17,53.4070751110265,NA -"19","String 18",18,56.5486677646163,NA -"20","String 19",19,59.6902604182061,NA -"21","String 20",20,62.8318530717959,NA -"22","String 21",21,65.9734457253857,NA -"23","String 22",22,69.1150383789754,NA -"24","String 23",23,72.2566310325652,NA -"25","String 24",24,75.398223686155,NA -"26","String 25",25,78.5398163397448,NA -"27","String 26",26,81.6814089933346,NA -"28","String 27",27,84.8230016469244,NA -"29","String 28",28,87.9645943005142,NA -"30","String 29",29,91.106186954104,NA -"31","String 30",30,94.2477796076938,NA -"32","String 31",31,97.3893722612836,NA -"33","String 32",32,100.530964914873,NA -"34","String 33",33,103.672557568463,NA -"35","String 34",34,106.814150222053,NA -"36","String 35",35,109.955742875643,NA -"37","String 36",36,113.097335529233,NA -"38","String 37",37,116.238928182822,NA -"39","String 38",38,119.380520836412,NA -"40","String 39",39,122.522113490002,NA -"41","String 40",40,125.663706143592,NA -"42","String 41",41,128.805298797182,NA -"43","String 42",42,131.946891450771,NA -"44","String 43",43,135.088484104361,NA -"45","String 44",44,138.230076757951,NA -"46","String 45",45,141.371669411541,NA -"47","String 46",46,144.51326206513,NA -"48","String 47",47,147.65485471872,NA -"49","String 48",48,150.79644737231,NA -"50","String 49",49,153.9380400259,NA -"51","String 50",50,157.07963267949,NA -"52","String 51",51,160.221225333079,NA -"53","String 52",52,163.362817986669,NA -"54","String 53",53,166.504410640259,NA -"55","String 54",54,169.646003293849,NA -"56","String 55",55,172.787595947439,NA -"57","String 56",56,175.929188601028,NA -"58","String 57",57,179.070781254618,NA -"59","String 58",58,182.212373908208,NA -"60","String 59",59,185.353966561798,NA -"61","String 60",60,188.495559215388,NA -"62","String 61",61,191.637151868977,NA -"63","String 62",62,194.778744522567,NA -"64","String 63",63,197.920337176157,NA -"65","String 64",64,201.061929829747,NA -"66","String 65",65,204.203522483337,NA -"67","String 66",66,207.345115136926,NA -"68","String 67",67,210.486707790516,NA -"69","String 68",68,213.628300444106,NA -"70","String 69",69,216.769893097696,NA -"71","String 70",70,219.911485751286,NA -"72","String 71",71,223.053078404875,NA -"73","String 72",72,226.194671058465,NA -"74","String 73",73,229.336263712055,NA -"75","String 74",74,232.477856365645,NA -"76","String 75",75,235.619449019234,NA -"77","String 76",76,238.761041672824,NA -"78","String 77",77,241.902634326414,NA -"79","String 78",78,245.044226980004,NA -"80","String 79",79,248.185819633594,NA -"81","String 80",80,251.327412287183,NA -"82","String 81",81,254.469004940773,NA -"83","String 82",82,257.610597594363,NA -"84","String 83",83,260.752190247953,NA -"85","String 84",84,263.893782901543,NA -"86","String 85",85,267.035375555132,NA -"87","String 86",86,270.176968208722,NA -"88","String 87",87,273.318560862312,NA -"89","String 88",88,276.460153515902,NA -"90","String 89",89,279.601746169492,NA -"91","String 90",90,282.743338823081,NA -"92","String 91",91,285.884931476671,NA -"93","String 92",92,289.026524130261,NA -"94","String 93",93,292.168116783851,NA -"95","String 94",94,295.309709437441,NA -"96","String 95",95,298.45130209103,NA -"97","String 96",96,301.59289474462,NA -"98","String 97",97,304.73448739821,NA -"99","String 98",98,307.8760800518,NA -"100","String 99",99,311.01767270539,NA -"101","String 100",100,314.159265358979,NA -"102","String 101",101,317.300858012569,NA -"103","String 102",102,320.442450666159,NA -"104","String 103",103,323.584043319749,NA -"105","String 104",104,326.725635973339,NA -"106","String 105",105,329.867228626928,NA -"107","String 106",106,333.008821280518,NA -"108","String 107",107,336.150413934108,NA -"109","String 108",108,339.292006587698,NA -"110","String 109",109,342.433599241287,NA -"111","String 110",110,345.575191894877,NA -"112","String 111",111,348.716784548467,NA -"113","String 112",112,351.858377202057,NA -"114","String 113",113,354.999969855647,NA -"115","String 114",114,358.141562509236,NA -"116","String 115",115,361.283155162826,NA -"117","String 116",116,364.424747816416,NA -"118","String 117",117,367.566340470006,NA -"119","String 118",118,370.707933123596,NA -"120","String 119",119,373.849525777185,NA -"121","String 120",120,376.991118430775,NA -"122","String 121",121,380.132711084365,NA -"123","String 122",122,383.274303737955,NA -"124","String 123",123,386.415896391545,NA -"125","String 124",124,389.557489045134,NA -"126","String 125",125,392.699081698724,NA -"127","String 126",126,395.840674352314,NA -"128","String 127",127,398.982267005904,NA -"129","String 128",128,402.123859659494,NA -"130","String 129",129,405.265452313083,NA -"131","String 130",130,408.407044966673,NA -"132","String 131",131,411.548637620263,NA -"133","String 132",132,414.690230273853,NA -"134","String 133",133,417.831822927442,NA -"135","String 134",134,420.973415581032,NA -"136","String 135",135,424.115008234622,NA -"137","String 136",136,427.256600888212,NA -"138","String 137",137,430.398193541802,NA -"139","String 138",138,433.539786195391,NA -"140","String 139",139,436.681378848981,NA -"141","String 140",140,439.822971502571,NA -"142","String 141",141,442.964564156161,NA -"143","String 142",142,446.106156809751,NA -"144","String 143",143,449.24774946334,NA -"145","String 144",144,452.38934211693,NA -"146","String 145",145,455.53093477052,NA -"147","String 146",146,458.67252742411,NA -"148","String 147",147,461.8141200777,NA -"149","String 148",148,464.955712731289,NA -"150","String 149",149,468.097305384879,NA -"151","String 150",150,471.238898038469,NA -"152","String 151",151,474.380490692059,NA -"153","String 152",152,477.522083345649,NA -"154","String 153",153,480.663675999238,NA -"155","String 154",154,483.805268652828,NA -"156","String 155",155,486.946861306418,NA -"157","String 156",156,490.088453960008,NA -"158","String 157",157,493.230046613597,NA -"159","String 158",158,496.371639267187,NA -"160","String 159",159,499.513231920777,NA -"161","String 160",160,502.654824574367,NA -"162","String 161",161,505.796417227957,NA -"163","String 162",162,508.938009881546,NA -"164","String 163",163,512.079602535136,NA -"165","String 164",164,515.221195188726,NA -"166","String 165",165,518.362787842316,NA -"167","String 166",166,521.504380495906,NA -"168","String 167",167,524.645973149495,NA -"169","String 168",168,527.787565803085,NA -"170","String 169",169,530.929158456675,NA -"171","String 170",170,534.070751110265,NA -"172","String 171",171,537.212343763855,NA -"173","String 172",172,540.353936417444,NA -"174","String 173",173,543.495529071034,NA -"175","String 174",174,546.637121724624,NA -"176","String 175",175,549.778714378214,NA -"177","String 176",176,552.920307031804,NA -"178","String 177",177,556.061899685393,NA -"179","String 178",178,559.203492338983,NA -"180","String 179",179,562.345084992573,NA -"181","String 180",180,565.486677646163,NA -"182","String 181",181,568.628270299753,NA -"183","String 182",182,571.769862953342,NA -"184","String 183",183,574.911455606932,NA -"185","String 184",184,578.053048260522,NA -"186","String 185",185,581.194640914112,NA -"187","String 186",186,584.336233567701,NA -"188","String 187",187,587.477826221291,NA -"189","String 188",188,590.619418874881,NA -"190","String 189",189,593.761011528471,NA -"191","String 190",190,596.902604182061,NA -"192","String 191",191,600.04419683565,NA -"193","String 192",192,603.18578948924,NA -"194","String 193",193,606.32738214283,NA -"195","String 194",194,609.46897479642,NA -"196","String 195",195,612.61056745001,NA -"197","String 196",196,615.752160103599,NA -"198","String 197",197,618.893752757189,NA -"199","String 198",198,622.035345410779,NA -"200","String 199",199,625.176938064369,NA -"201","String 200",200,628.318530717959,NA -"202","String 201",201,631.460123371548,NA -"203","String 202",202,634.601716025138,NA -"204","String 203",203,637.743308678728,NA -"205","String 204",204,640.884901332318,NA -"206","String 205",205,644.026493985908,NA -"207","String 206",206,647.168086639497,NA -"208","String 207",207,650.309679293087,NA -"209","String 208",208,653.451271946677,NA -"210","String 209",209,656.592864600267,NA -"211","String 210",210,659.734457253857,NA -"212","String 211",211,662.876049907446,NA -"213","String 212",212,666.017642561036,NA -"214","String 213",213,669.159235214626,NA -"215","String 214",214,672.300827868216,NA -"216","String 215",215,675.442420521806,NA -"217","String 216",216,678.584013175395,NA -"218","String 217",217,681.725605828985,NA -"219","String 218",218,684.867198482575,NA -"220","String 219",219,688.008791136165,NA -"221","String 220",220,691.150383789755,NA -"222","String 221",221,694.291976443344,NA -"223","String 222",222,697.433569096934,NA -"224","String 223",223,700.575161750524,NA -"225","String 224",224,703.716754404114,NA -"226","String 225",225,706.858347057703,NA -"227","String 226",226,709.999939711293,NA -"228","String 227",227,713.141532364883,NA -"229","String 228",228,716.283125018473,NA -"230","String 229",229,719.424717672063,NA -"231","String 230",230,722.566310325652,NA -"232","String 231",231,725.707902979242,NA -"233","String 232",232,728.849495632832,NA -"234","String 233",233,731.991088286422,NA -"235","String 234",234,735.132680940012,NA -"236","String 235",235,738.274273593601,NA -"237","String 236",236,741.415866247191,NA -"238","String 237",237,744.557458900781,NA -"239","String 238",238,747.699051554371,NA -"240","String 239",239,750.840644207961,NA -"241","String 240",240,753.98223686155,NA -"242","String 241",241,757.12382951514,NA -"243","String 242",242,760.26542216873,NA -"244","String 243",243,763.40701482232,NA -"245","String 244",244,766.54860747591,NA -"246","String 245",245,769.690200129499,NA -"247","String 246",246,772.831792783089,NA -"248","String 247",247,775.973385436679,NA -"249","String 248",248,779.114978090269,NA -"250","String 249",249,782.256570743858,NA -"251","String 250",250,785.398163397448,NA -"252","String 251",251,788.539756051038,NA -"253","String 252",252,791.681348704628,NA -"254","String 253",253,794.822941358218,NA -"255","String 254",254,797.964534011807,NA -"256","String 255",255,801.106126665397,NA -"257","String 256",256,804.247719318987,NA -"258","String 257",257,807.389311972577,NA -"259","String 258",258,810.530904626167,NA -"260","String 259",259,813.672497279756,NA -"261","String 260",260,816.814089933346,NA -"262","String 261",261,819.955682586936,NA -"263","String 262",262,823.097275240526,NA -"264","String 263",263,826.238867894116,NA -"265","String 264",264,829.380460547705,NA -"266","String 265",265,832.522053201295,NA -"267","String 266",266,835.663645854885,NA -"268","String 267",267,838.805238508475,NA -"269","String 268",268,841.946831162065,NA -"270","String 269",269,845.088423815654,NA -"271","String 270",270,848.230016469244,NA -"272","String 271",271,851.371609122834,NA -"273","String 272",272,854.513201776424,NA -"274","String 273",273,857.654794430014,NA -"275","String 274",274,860.796387083603,NA -"276","String 275",275,863.937979737193,NA -"277","String 276",276,867.079572390783,NA -"278","String 277",277,870.221165044373,NA -"279","String 278",278,873.362757697962,NA -"280","String 279",279,876.504350351552,NA -"281","String 280",280,879.645943005142,NA -"282","String 281",281,882.787535658732,NA -"283","String 282",282,885.929128312322,NA -"284","String 283",283,889.070720965912,NA -"285","String 284",284,892.212313619501,NA -"286","String 285",285,895.353906273091,NA -"287","String 286",286,898.495498926681,NA -"288","String 287",287,901.637091580271,NA -"289","String 288",288,904.77868423386,NA -"290","String 289",289,907.92027688745,NA -"291","String 290",290,911.06186954104,NA -"292","String 291",291,914.20346219463,NA -"293","String 292",292,917.34505484822,NA -"294","String 293",293,920.486647501809,NA -"295","String 294",294,923.628240155399,NA -"296","String 295",295,926.769832808989,NA -"297","String 296",296,929.911425462579,NA -"298","String 297",297,933.053018116169,NA -"299","String 298",298,936.194610769758,NA -"300","String 299",299,939.336203423348,NA -"301","String 300",300,942.477796076938,NA -"302","String 301",301,945.619388730528,NA -"303","String 302",302,948.760981384117,NA -"304","String 303",303,951.902574037707,NA -"305","String 304",304,955.044166691297,NA -"306","String 305",305,958.185759344887,NA -"307","String 306",306,961.327351998477,NA -"308","String 307",307,964.468944652067,NA -"309","String 308",308,967.610537305656,NA -"310","String 309",309,970.752129959246,NA -"311","String 310",310,973.893722612836,NA -"312","String 311",311,977.035315266426,NA -"313","String 312",312,980.176907920015,NA -"314","String 313",313,983.318500573605,NA -"315","String 314",314,986.460093227195,NA -"316","String 315",315,989.601685880785,NA -"317","String 316",316,992.743278534375,NA -"318","String 317",317,995.884871187964,NA -"319","String 318",318,999.026463841554,NA -"320","String 319",319,1002.16805649514,NA -"321","String 320",320,1005.30964914873,NA -"322","String 321",321,1008.45124180232,NA -"323","String 322",322,1011.59283445591,NA -"324","String 323",323,1014.7344271095,NA -"325","String 324",324,1017.87601976309,NA -"326","String 325",325,1021.01761241668,NA -"327","String 326",326,1024.15920507027,NA -"328","String 327",327,1027.30079772386,NA -"329","String 328",328,1030.44239037745,NA -"330","String 329",329,1033.58398303104,NA -"331","String 330",330,1036.72557568463,NA -"332","String 331",331,1039.86716833822,NA -"333","String 332",332,1043.00876099181,NA -"334","String 333",333,1046.1503536454,NA -"335","String 334",334,1049.29194629899,NA -"336","String 335",335,1052.43353895258,NA -"337","String 336",336,1055.57513160617,NA -"338","String 337",337,1058.71672425976,NA -"339","String 338",338,1061.85831691335,NA -"340","String 339",339,1064.99990956694,NA -"341","String 340",340,1068.14150222053,NA -"342","String 341",341,1071.28309487412,NA -"343","String 342",342,1074.42468752771,NA -"344","String 343",343,1077.5662801813,NA -"345","String 344",344,1080.70787283489,NA -"346","String 345",345,1083.84946548848,NA -"347","String 346",346,1086.99105814207,NA -"348","String 347",347,1090.13265079566,NA -"349","String 348",348,1093.27424344925,NA -"350","String 349",349,1096.41583610284,NA -"351","String 350",350,1099.55742875643,NA -"352","String 351",351,1102.69902141002,NA -"353","String 352",352,1105.84061406361,NA -"354","String 353",353,1108.9822067172,NA -"355","String 354",354,1112.12379937079,NA -"356","String 355",355,1115.26539202438,NA -"357","String 356",356,1118.40698467797,NA -"358","String 357",357,1121.54857733156,NA -"359","String 358",358,1124.69016998515,NA -"360","String 359",359,1127.83176263874,NA -"361","String 360",360,1130.97335529233,NA -"362","String 361",361,1134.11494794592,NA -"363","String 362",362,1137.25654059951,NA -"364","String 363",363,1140.3981332531,NA -"365","String 364",364,1143.53972590668,NA -"366","String 365",365,1146.68131856027,NA -"367","String 366",366,1149.82291121386,NA -"368","String 367",367,1152.96450386745,NA -"369","String 368",368,1156.10609652104,NA -"370","String 369",369,1159.24768917463,NA -"371","String 370",370,1162.38928182822,NA -"372","String 371",371,1165.53087448181,NA -"373","String 372",372,1168.6724671354,NA -"374","String 373",373,1171.81405978899,NA -"375","String 374",374,1174.95565244258,NA -"376","String 375",375,1178.09724509617,NA -"377","String 376",376,1181.23883774976,NA -"378","String 377",377,1184.38043040335,NA -"379","String 378",378,1187.52202305694,NA -"380","String 379",379,1190.66361571053,NA -"381","String 380",380,1193.80520836412,NA -"382","String 381",381,1196.94680101771,NA -"383","String 382",382,1200.0883936713,NA -"384","String 383",383,1203.22998632489,NA -"385","String 384",384,1206.37157897848,NA -"386","String 385",385,1209.51317163207,NA -"387","String 386",386,1212.65476428566,NA -"388","String 387",387,1215.79635693925,NA -"389","String 388",388,1218.93794959284,NA -"390","String 389",389,1222.07954224643,NA -"391","String 390",390,1225.22113490002,NA -"392","String 391",391,1228.36272755361,NA -"393","String 392",392,1231.5043202072,NA -"394","String 393",393,1234.64591286079,NA -"395","String 394",394,1237.78750551438,NA -"396","String 395",395,1240.92909816797,NA -"397","String 396",396,1244.07069082156,NA -"398","String 397",397,1247.21228347515,NA -"399","String 398",398,1250.35387612874,NA -"400","String 399",399,1253.49546878233,NA -"401","String 400",400,1256.63706143592,NA -"402","String 401",401,1259.77865408951,NA -"403","String 402",402,1262.9202467431,NA -"404","String 403",403,1266.06183939669,NA -"405","String 404",404,1269.20343205028,NA -"406","String 405",405,1272.34502470387,NA -"407","String 406",406,1275.48661735746,NA -"408","String 407",407,1278.62821001105,NA -"409","String 408",408,1281.76980266464,NA -"410","String 409",409,1284.91139531823,NA -"411","String 410",410,1288.05298797182,NA -"412","String 411",411,1291.19458062541,NA -"413","String 412",412,1294.33617327899,NA -"414","String 413",413,1297.47776593258,NA -"415","String 414",414,1300.61935858617,NA -"416","String 415",415,1303.76095123976,NA -"417","String 416",416,1306.90254389335,NA -"418","String 417",417,1310.04413654694,NA -"419","String 418",418,1313.18572920053,NA -"420","String 419",419,1316.32732185412,NA -"421","String 420",420,1319.46891450771,NA -"422","String 421",421,1322.6105071613,NA -"423","String 422",422,1325.75209981489,NA -"424","String 423",423,1328.89369246848,NA -"425","String 424",424,1332.03528512207,NA -"426","String 425",425,1335.17687777566,NA -"427","String 426",426,1338.31847042925,NA -"428","String 427",427,1341.46006308284,NA -"429","String 428",428,1344.60165573643,NA -"430","String 429",429,1347.74324839002,NA -"431","String 430",430,1350.88484104361,NA -"432","String 431",431,1354.0264336972,NA -"433","String 432",432,1357.16802635079,NA -"434","String 433",433,1360.30961900438,NA -"435","String 434",434,1363.45121165797,NA -"436","String 435",435,1366.59280431156,NA -"437","String 436",436,1369.73439696515,NA -"438","String 437",437,1372.87598961874,NA -"439","String 438",438,1376.01758227233,NA -"440","String 439",439,1379.15917492592,NA -"441","String 440",440,1382.30076757951,NA -"442","String 441",441,1385.4423602331,NA -"443","String 442",442,1388.58395288669,NA -"444","String 443",443,1391.72554554028,NA -"445","String 444",444,1394.86713819387,NA -"446","String 445",445,1398.00873084746,NA -"447","String 446",446,1401.15032350105,NA -"448","String 447",447,1404.29191615464,NA -"449","String 448",448,1407.43350880823,NA -"450","String 449",449,1410.57510146182,NA -"451","String 450",450,1413.71669411541,NA -"452","String 451",451,1416.858286769,NA -"453","String 452",452,1419.99987942259,NA -"454","String 453",453,1423.14147207618,NA -"455","String 454",454,1426.28306472977,NA -"456","String 455",455,1429.42465738336,NA -"457","String 456",456,1432.56625003695,NA -"458","String 457",457,1435.70784269054,NA -"459","String 458",458,1438.84943534413,NA -"460","String 459",459,1441.99102799772,NA -"461","String 460",460,1445.1326206513,NA -"462","String 461",461,1448.27421330489,NA -"463","String 462",462,1451.41580595848,NA -"464","String 463",463,1454.55739861207,NA -"465","String 464",464,1457.69899126566,NA -"466","String 465",465,1460.84058391925,NA -"467","String 466",466,1463.98217657284,NA -"468","String 467",467,1467.12376922643,NA -"469","String 468",468,1470.26536188002,NA -"470","String 469",469,1473.40695453361,NA -"471","String 470",470,1476.5485471872,NA -"472","String 471",471,1479.69013984079,NA -"473","String 472",472,1482.83173249438,NA -"474","String 473",473,1485.97332514797,NA -"475","String 474",474,1489.11491780156,NA -"476","String 475",475,1492.25651045515,NA -"477","String 476",476,1495.39810310874,NA -"478","String 477",477,1498.53969576233,NA -"479","String 478",478,1501.68128841592,NA -"480","String 479",479,1504.82288106951,NA -"481","String 480",480,1507.9644737231,NA -"482","String 481",481,1511.10606637669,NA -"483","String 482",482,1514.24765903028,NA -"484","String 483",483,1517.38925168387,NA -"485","String 484",484,1520.53084433746,NA -"486","String 485",485,1523.67243699105,NA -"487","String 486",486,1526.81402964464,NA -"488","String 487",487,1529.95562229823,NA -"489","String 488",488,1533.09721495182,NA -"490","String 489",489,1536.23880760541,NA -"491","String 490",490,1539.380400259,NA -"492","String 491",491,1542.52199291259,NA -"493","String 492",492,1545.66358556618,NA -"494","String 493",493,1548.80517821977,NA -"495","String 494",494,1551.94677087336,NA -"496","String 495",495,1555.08836352695,NA -"497","String 496",496,1558.22995618054,NA -"498","String 497",497,1561.37154883413,NA -"499","String 498",498,1564.51314148772,NA -"500","String 499",499,1567.65473414131,NA -"501","String 500",500,1570.7963267949,NA -"502","String 501",501,1573.93791944849,NA -"503","String 502",502,1577.07951210208,NA -"504","String 503",503,1580.22110475567,NA -"505","String 504",504,1583.36269740926,NA -"506","String 505",505,1586.50429006285,NA -"507","String 506",506,1589.64588271644,NA -"508","String 507",507,1592.78747537003,NA -"509","String 508",508,1595.92906802361,NA -"510","String 509",509,1599.0706606772,NA -"511","String 510",510,1602.21225333079,NA -"512","String 511",511,1605.35384598438,NA -"513","String 512",512,1608.49543863797,NA -"514","String 513",513,1611.63703129156,NA -"515","String 514",514,1614.77862394515,NA -"516","String 515",515,1617.92021659874,NA -"517","String 516",516,1621.06180925233,NA -"518","String 517",517,1624.20340190592,NA -"519","String 518",518,1627.34499455951,NA -"520","String 519",519,1630.4865872131,NA -"521","String 520",520,1633.62817986669,NA -"522","String 521",521,1636.76977252028,NA -"523","String 522",522,1639.91136517387,NA -"524","String 523",523,1643.05295782746,NA -"525","String 524",524,1646.19455048105,NA -"526","String 525",525,1649.33614313464,NA -"527","String 526",526,1652.47773578823,NA -"528","String 527",527,1655.61932844182,NA -"529","String 528",528,1658.76092109541,NA -"530","String 529",529,1661.902513749,NA -"531","String 530",530,1665.04410640259,NA -"532","String 531",531,1668.18569905618,NA -"533","String 532",532,1671.32729170977,NA -"534","String 533",533,1674.46888436336,NA -"535","String 534",534,1677.61047701695,NA -"536","String 535",535,1680.75206967054,NA -"537","String 536",536,1683.89366232413,NA -"538","String 537",537,1687.03525497772,NA -"539","String 538",538,1690.17684763131,NA -"540","String 539",539,1693.3184402849,NA -"541","String 540",540,1696.46003293849,NA -"542","String 541",541,1699.60162559208,NA -"543","String 542",542,1702.74321824567,NA -"544","String 543",543,1705.88481089926,NA -"545","String 544",544,1709.02640355285,NA -"546","String 545",545,1712.16799620644,NA -"547","String 546",546,1715.30958886003,NA -"548","String 547",547,1718.45118151362,NA -"549","String 548",548,1721.59277416721,NA -"550","String 549",549,1724.7343668208,NA -"551","String 550",550,1727.87595947439,NA -"552","String 551",551,1731.01755212798,NA -"553","String 552",552,1734.15914478157,NA -"554","String 553",553,1737.30073743516,NA -"555","String 554",554,1740.44233008875,NA -"556","String 555",555,1743.58392274234,NA -"557","String 556",556,1746.72551539592,NA -"558","String 557",557,1749.86710804951,NA -"559","String 558",558,1753.0087007031,NA -"560","String 559",559,1756.15029335669,NA -"561","String 560",560,1759.29188601028,NA -"562","String 561",561,1762.43347866387,NA -"563","String 562",562,1765.57507131746,NA -"564","String 563",563,1768.71666397105,NA -"565","String 564",564,1771.85825662464,NA -"566","String 565",565,1774.99984927823,NA -"567","String 566",566,1778.14144193182,NA -"568","String 567",567,1781.28303458541,NA -"569","String 568",568,1784.424627239,NA -"570","String 569",569,1787.56621989259,NA -"571","String 570",570,1790.70781254618,NA -"572","String 571",571,1793.84940519977,NA -"573","String 572",572,1796.99099785336,NA -"574","String 573",573,1800.13259050695,NA -"575","String 574",574,1803.27418316054,NA -"576","String 575",575,1806.41577581413,NA -"577","String 576",576,1809.55736846772,NA -"578","String 577",577,1812.69896112131,NA -"579","String 578",578,1815.8405537749,NA -"580","String 579",579,1818.98214642849,NA -"581","String 580",580,1822.12373908208,NA -"582","String 581",581,1825.26533173567,NA -"583","String 582",582,1828.40692438926,NA -"584","String 583",583,1831.54851704285,NA -"585","String 584",584,1834.69010969644,NA -"586","String 585",585,1837.83170235003,NA -"587","String 586",586,1840.97329500362,NA -"588","String 587",587,1844.11488765721,NA -"589","String 588",588,1847.2564803108,NA -"590","String 589",589,1850.39807296439,NA -"591","String 590",590,1853.53966561798,NA -"592","String 591",591,1856.68125827157,NA -"593","String 592",592,1859.82285092516,NA -"594","String 593",593,1862.96444357875,NA -"595","String 594",594,1866.10603623234,NA -"596","String 595",595,1869.24762888593,NA -"597","String 596",596,1872.38922153952,NA -"598","String 597",597,1875.53081419311,NA -"599","String 598",598,1878.6724068467,NA -"600","String 600",600,1884.95559215388,NA -"601","String 601",601,1888.09718480747,NA -"602","String 602",602,1891.23877746106,NA -"603","String 603",603,1894.38037011465,NA -"604","String 604",604,1897.52196276823,NA -"605","String 605",605,1900.66355542182,NA -"606","String 606",606,1903.80514807541,NA -"607","String 607",607,1906.946740729,NA -"608","String 608",608,1910.08833338259,NA -"609","String 609",609,1913.22992603618,NA -"610","String 610",610,1916.37151868977,NA -"611","String 611",611,1919.51311134336,NA -"612","String 612",612,1922.65470399695,NA -"613","String 599",599,1881.81399950029,NA -"614","String 613",613,1925.79629665054,NA -"615","String 614",614,1928.93788930413,NA -"616","String 615",615,1932.07948195772,NA -"617","String 616",616,1935.22107461131,NA -"618","String 617",617,1938.3626672649,NA -"619","String 618",618,1941.50425991849,NA -"620","String 619",619,1944.64585257208,NA -"621","String 620",620,1947.78744522567,NA -"622","String 621",621,1950.92903787926,NA -"623","String 622",622,1954.07063053285,NA -"624","String 623",623,1957.21222318644,NA -"625","String 624",624,1960.35381584003,NA -"626","String 625",625,1963.49540849362,NA -"627","String 626",626,1966.63700114721,NA -"628","String 627",627,1969.7785938008,NA -"629","String 628",628,1972.92018645439,NA -"630","String 629",629,1976.06177910798,NA -"631","String 630",630,1979.20337176157,NA -"632","String 631",631,1982.34496441516,NA -"633","String 632",632,1985.48655706875,NA -"634","String 633",633,1988.62814972234,NA -"635","String 634",634,1991.76974237593,NA -"636","String 635",635,1994.91133502952,NA -"637","String 636",636,1998.05292768311,NA -"638","String 637",637,2001.1945203367,NA -"639","String 638",638,2004.33611299029,NA -"640","String 639",639,2007.47770564388,NA -"641","String 640",640,2010.61929829747,NA -"642","String 641",641,2013.76089095106,NA -"643","String 642",642,2016.90248360465,NA -"644","String 643",643,2020.04407625824,NA -"645","String 644",644,2023.18566891183,NA -"646","String 645",645,2026.32726156542,NA -"647","String 646",646,2029.46885421901,NA -"648","String 647",647,2032.6104468726,NA -"649","String 648",648,2035.75203952619,NA -"650","String 649",649,2038.89363217978,NA -"651","String 650",650,2042.03522483337,NA -"652","String 651",651,2045.17681748696,NA -"653","String 652",652,2048.31841014054,NA -"654","String 653",653,2051.46000279414,NA -"655","String 654",654,2054.60159544772,NA -"656","String 655",655,2057.74318810131,NA -"657","String 656",656,2060.8847807549,NA -"658","String 657",657,2064.02637340849,NA -"659","String 658",658,2067.16796606208,NA -"660","String 659",659,2070.30955871567,NA -"661","String 660",660,2073.45115136926,NA -"662","String 661",661,2076.59274402285,NA -"663","String 662",662,2079.73433667644,NA -"664","String 663",663,2082.87592933003,NA -"665","String 664",664,2086.01752198362,NA -"666","String 665",665,2089.15911463721,NA -"667","String 666",666,2092.3007072908,NA -"668","String 667",667,2095.44229994439,NA -"669","String 668",668,2098.58389259798,NA -"670","String 669",669,2101.72548525157,NA -"671","String 670",670,2104.86707790516,NA -"672","String 671",671,2108.00867055875,NA -"673","String 672",672,2111.15026321234,NA -"674","String 673",673,2114.29185586593,NA -"675","String 674",674,2117.43344851952,NA -"676","String 675",675,2120.57504117311,NA -"677","String 676",676,2123.7166338267,NA -"678","String 677",677,2126.85822648029,NA -"679","String 678",678,2129.99981913388,NA -"680","String 679",679,2133.14141178747,NA -"681","String 680",680,2136.28300444106,NA -"682","String 681",681,2139.42459709465,NA -"683","String 682",682,2142.56618974824,NA -"684","String 683",683,2145.70778240183,NA -"685","String 684",684,2148.84937505542,NA -"686","String 685",685,2151.99096770901,NA -"687","String 686",686,2155.1325603626,NA -"688","String 687",687,2158.27415301619,NA -"689","String 688",688,2161.41574566978,NA -"690","String 689",689,2164.55733832337,NA -"691","String 690",690,2167.69893097696,NA -"692","String 691",691,2170.84052363055,NA -"693","String 692",692,2173.98211628414,NA -"694","String 693",693,2177.12370893773,NA -"695","String 694",694,2180.26530159132,NA -"696","String 695",695,2183.40689424491,NA -"697","String 696",696,2186.5484868985,NA -"698","String 697",697,2189.69007955209,NA -"699","String 698",698,2192.83167220568,NA -"700","String 699",699,2195.97326485927,NA -"701","String 700",700,2199.11485751285,NA -"702","String 701",701,2202.25645016645,NA -"703","String 702",702,2205.39804282003,NA -"704","String 703",703,2208.53963547362,NA -"705","String 704",704,2211.68122812721,NA -"706","String 705",705,2214.8228207808,NA -"707","String 706",706,2217.96441343439,NA -"708","String 707",707,2221.10600608798,NA -"709","String 708",708,2224.24759874157,NA -"710","String 709",709,2227.38919139516,NA -"711","String 710",710,2230.53078404875,NA -"712","String 711",711,2233.67237670234,NA -"713","String 712",712,2236.81396935593,NA -"714","String 713",713,2239.95556200952,NA -"715","String 714",714,2243.09715466311,NA -"716","String 715",715,2246.2387473167,NA -"717","String 716",716,2249.38033997029,NA -"718","String 717",717,2252.52193262388,NA -"719","String 718",718,2255.66352527747,NA -"720","String 719",719,2258.80511793106,NA -"721","String 720",720,2261.94671058465,NA -"722","String 721",721,2265.08830323824,NA -"723","String 722",722,2268.22989589183,NA -"724","String 723",723,2271.37148854542,NA -"725","String 724",724,2274.51308119901,NA -"726","String 725",725,2277.6546738526,NA -"727","String 726",726,2280.79626650619,NA -"728","String 727",727,2283.93785915978,NA -"729","String 728",728,2287.07945181337,NA -"730","String 729",729,2290.22104446696,NA -"731","String 730",730,2293.36263712055,NA -"732","String 731",731,2296.50422977414,NA -"733","String 732",732,2299.64582242773,NA -"734","String 733",733,2302.78741508132,NA -"735","String 734",734,2305.92900773491,NA -"736","String 735",735,2309.0706003885,NA -"737","String 736",736,2312.21219304209,NA -"738","String 737",737,2315.35378569568,NA -"739","String 738",738,2318.49537834927,NA -"740","String 739",739,2321.63697100286,NA -"741","String 740",740,2324.77856365645,NA -"742","String 741",741,2327.92015631004,NA -"743","String 742",742,2331.06174896363,NA -"744","String 743",743,2334.20334161722,NA -"745","String 744",744,2337.34493427081,NA -"746","String 745",745,2340.4865269244,NA -"747","String 746",746,2343.62811957799,NA -"748","String 747",747,2346.76971223158,NA -"749","String 748",748,2349.91130488517,NA -"750","String 749",749,2353.05289753876,NA -"751","String 750",750,2356.19449019234,NA -"752","String 751",751,2359.33608284593,NA -"753","String 752",752,2362.47767549952,NA -"754","String 753",753,2365.61926815311,NA -"755","String 754",754,2368.7608608067,NA -"756","String 755",755,2371.90245346029,NA -"757","String 756",756,2375.04404611388,NA -"758","String 757",757,2378.18563876747,NA -"759","String 758",758,2381.32723142106,NA -"760","String 759",759,2384.46882407465,NA -"761","String 760",760,2387.61041672824,NA -"762","String 761",761,2390.75200938183,NA -"763","String 762",762,2393.89360203542,NA -"764","String 763",763,2397.03519468901,NA -"765","String 764",764,2400.1767873426,NA -"766","String 765",765,2403.31837999619,NA -"767","String 766",766,2406.45997264978,NA -"768","String 767",767,2409.60156530337,NA -"769","String 768",768,2412.74315795696,NA -"770","String 769",769,2415.88475061055,NA -"771","String 770",770,2419.02634326414,NA -"772","String 771",771,2422.16793591773,NA -"773","String 772",772,2425.30952857132,NA -"774","String 773",773,2428.45112122491,NA -"775","String 774",774,2431.5927138785,NA -"776","String 775",775,2434.73430653209,NA -"777","String 776",776,2437.87589918568,NA -"778","String 777",777,2441.01749183927,NA -"779","String 778",778,2444.15908449286,NA -"780","String 779",779,2447.30067714645,NA -"781","String 780",780,2450.44226980004,NA -"782","String 781",781,2453.58386245363,NA -"783","String 782",782,2456.72545510722,NA -"784","String 783",783,2459.86704776081,NA -"785","String 784",784,2463.0086404144,NA -"786","String 785",785,2466.15023306799,NA -"787","String 786",786,2469.29182572158,NA -"788","String 787",787,2472.43341837517,NA -"789","String 788",788,2475.57501102876,NA -"790","String 789",789,2478.71660368235,NA -"791","String 790",790,2481.85819633594,NA -"792","String 791",791,2484.99978898953,NA -"793","String 792",792,2488.14138164312,NA -"794","String 793",793,2491.28297429671,NA -"795","String 794",794,2494.4245669503,NA -"796","String 795",795,2497.56615960389,NA -"797","String 796",796,2500.70775225748,NA -"798","String 797",797,2503.84934491107,NA -"799","String 798",798,2506.99093756465,NA -"800","String 799",799,2510.13253021824,NA -"801","String 800",800,2513.27412287183,NA -"802","String 801",801,2516.41571552542,NA -"803","String 802",802,2519.55730817901,NA -"804","String 803",803,2522.6989008326,NA -"805","String 804",804,2525.84049348619,NA -"806","String 805",805,2528.98208613978,NA -"807","String 806",806,2532.12367879337,NA -"808","String 807",807,2535.26527144696,NA -"809","String 808",808,2538.40686410055,NA -"810","String 809",809,2541.54845675414,NA -"811","String 810",810,2544.69004940773,NA -"812","String 811",811,2547.83164206132,NA -"813","String 812",812,2550.97323471491,NA -"814","String 813",813,2554.1148273685,NA -"815","String 814",814,2557.25642002209,NA -"816","String 815",815,2560.39801267568,NA -"817","String 816",816,2563.53960532927,NA -"818","String 817",817,2566.68119798286,NA -"819","String 818",818,2569.82279063645,NA -"820","String 819",819,2572.96438329004,NA -"821","String 820",820,2576.10597594363,NA -"822","String 821",821,2579.24756859722,NA -"823","String 822",822,2582.38916125081,NA -"824","String 823",823,2585.5307539044,NA -"825","String 824",824,2588.67234655799,NA -"826","String 825",825,2591.81393921158,NA -"827","String 826",826,2594.95553186517,NA -"828","String 827",827,2598.09712451876,NA -"829","String 828",828,2601.23871717235,NA -"830","String 829",829,2604.38030982594,NA -"831","String 830",830,2607.52190247953,NA -"832","String 831",831,2610.66349513312,NA -"833","String 832",832,2613.80508778671,NA -"834","String 833",833,2616.9466804403,NA -"835","String 834",834,2620.08827309389,NA -"836","String 835",835,2623.22986574748,NA -"837","String 836",836,2626.37145840107,NA -"838","String 837",837,2629.51305105466,NA -"839","String 838",838,2632.65464370825,NA -"840","String 839",839,2635.79623636184,NA -"841","String 840",840,2638.93782901543,NA -"842","String 841",841,2642.07942166902,NA -"843","String 842",842,2645.22101432261,NA -"844","String 843",843,2648.3626069762,NA -"845","String 844",844,2651.50419962979,NA -"846","String 845",845,2654.64579228338,NA -"847","String 846",846,2657.78738493696,NA -"848","String 847",847,2660.92897759055,NA -"849","String 848",848,2664.07057024414,NA -"850","String 849",849,2667.21216289773,NA -"851","String 850",850,2670.35375555132,NA -"852","String 851",851,2673.49534820491,NA -"853","String 852",852,2676.6369408585,NA -"854","String 853",853,2679.77853351209,NA -"855","String 854",854,2682.92012616568,NA -"856","String 855",855,2686.06171881927,NA -"857","String 856",856,2689.20331147286,NA -"858","String 857",857,2692.34490412645,NA -"859","String 858",858,2695.48649678004,NA -"860","String 859",859,2698.62808943363,NA -"861","String 860",860,2701.76968208722,NA -"862","String 861",861,2704.91127474081,NA -"863","String 862",862,2708.0528673944,NA -"864","String 863",863,2711.19446004799,NA -"865","String 864",864,2714.33605270158,NA -"866","String 865",865,2717.47764535517,NA -"867","String 866",866,2720.61923800876,NA -"868","String 867",867,2723.76083066235,NA -"869","String 868",868,2726.90242331594,NA -"870","String 869",869,2730.04401596953,NA -"871","String 870",870,2733.18560862312,NA -"872","String 871",871,2736.32720127671,NA -"873","String 872",872,2739.4687939303,NA -"874","String 873",873,2742.61038658389,NA -"875","String 874",874,2745.75197923748,NA -"876","String 875",875,2748.89357189107,NA -"877","String 876",876,2752.03516454466,NA -"878","String 877",877,2755.17675719825,NA -"879","String 878",878,2758.31834985184,NA -"880","String 879",879,2761.45994250543,NA -"881","String 880",880,2764.60153515902,NA -"882","String 881",881,2767.74312781261,NA -"883","String 882",882,2770.8847204662,NA -"884","String 883",883,2774.02631311979,NA -"885","String 884",884,2777.16790577338,NA -"886","String 885",885,2780.30949842697,NA -"887","String 886",886,2783.45109108056,NA -"888","String 887",887,2786.59268373415,NA -"889","String 888",888,2789.73427638774,NA -"890","String 889",889,2792.87586904133,NA -"891","String 890",890,2796.01746169492,NA -"892","String 891",891,2799.15905434851,NA -"893","String 892",892,2802.3006470021,NA -"894","String 893",893,2805.44223965569,NA -"895","String 894",894,2808.58383230927,NA -"896","String 895",895,2811.72542496286,NA -"897","String 896",896,2814.86701761645,NA -"898","String 897",897,2818.00861027004,NA -"899","String 898",898,2821.15020292363,NA -"900","String 899",899,2824.29179557722,NA -"901","String 900",900,2827.43338823081,NA -"902","String 901",901,2830.5749808844,NA -"903","String 902",902,2833.71657353799,NA -"904","String 903",903,2836.85816619158,NA -"905","String 904",904,2839.99975884517,NA -"906","String 905",905,2843.14135149876,NA -"907","String 906",906,2846.28294415235,NA -"908","String 907",907,2849.42453680594,NA -"909","String 908",908,2852.56612945953,NA -"910","String 909",909,2855.70772211312,NA -"911","String 910",910,2858.84931476671,NA -"912","String 911",911,2861.9909074203,NA -"913","String 912",912,2865.13250007389,NA -"914","String 913",913,2868.27409272748,NA -"915","String 914",914,2871.41568538107,NA -"916","String 915",915,2874.55727803466,NA -"917","String 916",916,2877.69887068825,NA -"918","String 917",917,2880.84046334184,NA -"919","String 918",918,2883.98205599543,NA -"920","String 919",919,2887.12364864902,NA -"921","String 920",920,2890.26524130261,NA -"922","String 921",921,2893.4068339562,NA -"923","String 922",922,2896.54842660979,NA -"924","String 923",923,2899.69001926338,NA -"925","String 924",924,2902.83161191697,NA -"926","String 925",925,2905.97320457056,NA -"927","String 926",926,2909.11479722415,NA -"928","String 927",927,2912.25638987774,NA -"929","String 928",928,2915.39798253133,NA -"930","String 929",929,2918.53957518492,NA -"931","String 930",930,2921.68116783851,NA -"932","String 931",931,2924.8227604921,NA -"933","String 932",932,2927.96435314569,NA -"934","String 933",933,2931.10594579928,NA -"935","String 934",934,2934.24753845287,NA -"936","String 935",935,2937.38913110646,NA -"937","String 936",936,2940.53072376005,NA -"938","String 937",937,2943.67231641364,NA -"939","String 938",938,2946.81390906723,NA -"940","String 939",939,2949.95550172082,NA -"941","String 940",940,2953.09709437441,NA -"942","String 941",941,2956.238687028,NA -"943","String 942",942,2959.38027968159,NA -"944","String 943",943,2962.52187233517,NA -"945","String 944",944,2965.66346498876,NA -"946","String 945",945,2968.80505764235,NA -"947","String 946",946,2971.94665029594,NA -"948","String 947",947,2975.08824294953,NA -"949","String 948",948,2978.22983560312,NA -"950","String 949",949,2981.37142825671,NA -"951","String 950",950,2984.5130209103,NA -"952","String 951",951,2987.65461356389,NA -"953","String 952",952,2990.79620621748,NA -"954","String 953",953,2993.93779887107,NA -"955","String 954",954,2997.07939152466,NA -"956","String 955",955,3000.22098417825,NA -"957","String 956",956,3003.36257683184,NA -"958","String 957",957,3006.50416948543,NA -"959","String 958",958,3009.64576213902,NA -"960","String 959",959,3012.78735479261,NA -"961","String 960",960,3015.9289474462,NA -"962","String 961",961,3019.07054009979,NA -"963","String 962",962,3022.21213275338,NA -"964","String 963",963,3025.35372540697,NA -"965","String 964",964,3028.49531806056,NA -"966","String 965",965,3031.63691071415,NA -"967","String 966",966,3034.77850336774,NA -"968","String 967",967,3037.92009602133,NA -"969","String 968",968,3041.06168867492,NA -"970","String 969",969,3044.20328132851,NA -"971","String 970",970,3047.3448739821,NA -"972","String 971",971,3050.48646663569,NA -"973","String 972",972,3053.62805928928,NA -"974","String 973",973,3056.76965194287,NA -"975","String 974",974,3059.91124459646,NA -"976","String 975",975,3063.05283725005,NA -"977","String 976",976,3066.19442990364,NA -"978","String 977",977,3069.33602255723,NA -"979","String 978",978,3072.47761521082,NA -"980","String 979",979,3075.61920786441,NA -"981","String 980",980,3078.760800518,NA -"982","String 981",981,3081.90239317159,NA -"983","String 982",982,3085.04398582518,NA -"984","String 983",983,3088.18557847877,NA -"985","String 984",984,3091.32717113236,NA -"986","String 985",985,3094.46876378595,NA -"987","String 986",986,3097.61035643954,NA -"988","String 987",987,3100.75194909313,NA -"989","String 988",988,3103.89354174672,NA -"990","String 989",989,3107.03513440031,NA -"991","String 990",990,3110.1767270539,NA -"992","String 991",991,3113.31831970748,NA -"993","String 992",992,3116.45991236107,NA -"994","String 993",993,3119.60150501466,NA -"995","String 994",994,3122.74309766825,NA -"996","String 995",995,3125.88469032184,NA -"997","String 996",996,3129.02628297543,NA -"998","String 997",997,3132.16787562902,NA -"999","String 998",998,3135.30946828261,NA -"1000","String 999",999,3138.4510609362,NA -"1001","String 1000",1000,3141.59265358979,NA -"1002","String 1001",1001,3144.73424624338,NA -"1003","String 1002",1002,3147.87583889697,NA -"1004","String 1003",1003,3151.01743155056,NA -"1005","String 1004",1004,3154.15902420415,NA -"1006","String 1005",1005,3157.30061685774,NA -"1007","String 1006",1006,3160.44220951133,NA -"1008","String 1007",1007,3163.58380216492,NA -"1009","String 1008",1008,3166.72539481851,NA -"1010","String 1009",1009,3169.8669874721,NA -"1011","String 1010",1010,3173.00858012569,NA -"1012","String 1011",1011,3176.15017277928,NA -"1013","String 1012",1012,3179.29176543287,NA -"1014","String 1013",1013,3182.43335808646,NA -"1015","String 1014",1014,3185.57495074005,NA -"1016","String 1015",1015,3188.71654339364,NA -"1017","String 1016",1016,3191.85813604723,NA -"1018","String 1017",1017,3194.99972870082,NA -"1019","String 1018",1018,3198.14132135441,NA -"1020","String 1019",1019,3201.282914008,NA -"1021","String 1020",1020,3204.42450666159,NA -"1022","String 1021",1021,3207.56609931518,NA -"1023","String 1022",1022,3210.70769196877,NA -"1024","String 1023",1023,3213.84928462236,NA -"1025","String 1024",1024,3216.99087727595,NA -"1026","String 1025",1025,3220.13246992954,NA -"1027","String 1026",1026,3223.27406258313,NA -"1028","String 1027",1027,3226.41565523672,NA -"1029","String 1028",1028,3229.55724789031,NA -"1030","String 1029",1029,3232.6988405439,NA -"1031","String 1030",1030,3235.84043319749,NA -"1032","String 1031",1031,3238.98202585108,NA -"1033","String 1032",1032,3242.12361850467,NA -"1034","String 1033",1033,3245.26521115826,NA -"1035","String 1034",1034,3248.40680381185,NA -"1036","String 1035",1035,3251.54839646544,NA -"1037","String 1036",1036,3254.68998911903,NA -"1038","String 1037",1037,3257.83158177262,NA -"1039","String 1038",1038,3260.97317442621,NA -"1040","String 1039",1039,3264.1147670798,NA -"1041","String 1040",1040,3267.25635973338,NA -"1042","String 1041",1041,3270.39795238697,NA -"1043","String 1042",1042,3273.53954504056,NA -"1044","String 1043",1043,3276.68113769415,NA -"1045","String 1044",1044,3279.82273034774,NA -"1046","String 1045",1045,3282.96432300133,NA -"1047","String 1046",1046,3286.10591565492,NA -"1048","String 1047",1047,3289.24750830851,NA -"1049","String 1048",1048,3292.3891009621,NA -"1050","String 1049",1049,3295.53069361569,NA -"1051","String 1050",1050,3298.67228626928,NA -"1052","String 1051",1051,3301.81387892287,NA -"1053","String 1052",1052,3304.95547157646,NA -"1054","String 1053",1053,3308.09706423005,NA -"1055","String 1054",1054,3311.23865688364,NA -"1056","String 1055",1055,3314.38024953723,NA -"1057","String 1056",1056,3317.52184219082,NA -"1058","String 1057",1057,3320.66343484441,NA -"1059","String 1058",1058,3323.805027498,NA -"1060","String 1059",1059,3326.94662015159,NA -"1061","String 1060",1060,3330.08821280518,NA -"1062","String 1061",1061,3333.22980545877,NA -"1063","String 1062",1062,3336.37139811236,NA -"1064","String 1063",1063,3339.51299076595,NA -"1065","String 1064",1064,3342.65458341954,NA -"1066","String 1065",1065,3345.79617607313,NA -"1067","String 1066",1066,3348.93776872672,NA -"1068","String 1067",1067,3352.07936138031,NA -"1069","String 1068",1068,3355.2209540339,NA -"1070","String 1069",1069,3358.36254668749,NA -"1071","String 1070",1070,3361.50413934108,NA -"1072","String 1071",1071,3364.64573199467,NA -"1073","String 1072",1072,3367.78732464826,NA -"1074","String 1073",1073,3370.92891730185,NA -"1075","String 1074",1074,3374.07050995544,NA -"1076","String 1075",1075,3377.21210260903,NA -"1077","String 1076",1076,3380.35369526262,NA -"1078","String 1077",1077,3383.49528791621,NA -"1079","String 1078",1078,3386.6368805698,NA -"1080","String 1079",1079,3389.77847322339,NA -"1081","String 1080",1080,3392.92006587698,NA -"1082","String 1081",1081,3396.06165853057,NA -"1083","String 1082",1082,3399.20325118416,NA -"1084","String 1083",1083,3402.34484383775,NA -"1085","String 1084",1084,3405.48643649134,NA -"1086","String 1085",1085,3408.62802914493,NA -"1087","String 1086",1086,3411.76962179852,NA -"1088","String 1087",1087,3414.91121445211,NA -"1089","String 1088",1088,3418.0528071057,NA -"1090","String 1089",1089,3421.19439975928,NA -"1091","String 1090",1090,3424.33599241287,NA -"1092","String 1091",1091,3427.47758506646,NA -"1093","String 1092",1092,3430.61917772005,NA -"1094","String 1093",1093,3433.76077037364,NA -"1095","String 1094",1094,3436.90236302723,NA -"1096","String 1095",1095,3440.04395568082,NA -"1097","String 1096",1096,3443.18554833441,NA -"1098","String 1097",1097,3446.327140988,NA -"1099","String 1098",1098,3449.46873364159,NA -"1100","String 1099",1099,3452.61032629518,NA -"1101","String 1100",1100,3455.75191894877,NA -"1102","String 1101",1101,3458.89351160236,NA -"1103","String 1102",1102,3462.03510425595,NA -"1104","String 1103",1103,3465.17669690954,NA -"1105","String 1104",1104,3468.31828956313,NA -"1106","String 1105",1105,3471.45988221672,NA -"1107","String 1106",1106,3474.60147487031,NA -"1108","String 1107",1107,3477.7430675239,NA -"1109","String 1108",1108,3480.88466017749,NA -"1110","String 1109",1109,3484.02625283108,NA -"1111","String 1110",1110,3487.16784548467,NA -"1112","String 1111",1111,3490.30943813826,NA -"1113","String 1112",1112,3493.45103079185,NA -"1114","String 1113",1113,3496.59262344544,NA -"1115","String 1114",1114,3499.73421609903,NA -"1116","String 1115",1115,3502.87580875262,NA -"1117","String 1116",1116,3506.01740140621,NA -"1118","String 1117",1117,3509.1589940598,NA -"1119","String 1118",1118,3512.30058671339,NA -"1120","String 1119",1119,3515.44217936698,NA -"1121","String 1120",1120,3518.58377202057,NA -"1122","String 1121",1121,3521.72536467416,NA -"1123","String 1122",1122,3524.86695732775,NA -"1124","String 1123",1123,3528.00854998134,NA -"1125","String 1124",1124,3531.15014263493,NA -"1126","String 1125",1125,3534.29173528852,NA -"1127","String 1126",1126,3537.43332794211,NA -"1128","String 1127",1127,3540.5749205957,NA -"1129","String 1128",1128,3543.71651324929,NA -"1130","String 1129",1129,3546.85810590288,NA -"1131","String 1130",1130,3549.99969855647,NA -"1132","String 1131",1131,3553.14129121006,NA -"1133","String 1132",1132,3556.28288386365,NA -"1134","String 1133",1133,3559.42447651724,NA -"1135","String 1134",1134,3562.56606917083,NA -"1136","String 1135",1135,3565.70766182442,NA -"1137","String 1136",1136,3568.84925447801,NA -"1138","String 1137",1137,3571.99084713159,NA -"1139","String 1138",1138,3575.13243978518,NA -"1140","String 1139",1139,3578.27403243877,NA -"1141","String 1140",1140,3581.41562509236,NA -"1142","String 1141",1141,3584.55721774595,NA -"1143","String 1142",1142,3587.69881039954,NA -"1144","String 1143",1143,3590.84040305313,NA -"1145","String 1144",1144,3593.98199570672,NA -"1146","String 1145",1145,3597.12358836031,NA -"1147","String 1146",1146,3600.2651810139,NA -"1148","String 1147",1147,3603.40677366749,NA -"1149","String 1148",1148,3606.54836632108,NA -"1150","String 1149",1149,3609.68995897467,NA -"1151","String 1150",1150,3612.83155162826,NA -"1152","String 1151",1151,3615.97314428185,NA -"1153","String 1152",1152,3619.11473693544,NA -"1154","String 1153",1153,3622.25632958903,NA -"1155","String 1154",1154,3625.39792224262,NA -"1156","String 1155",1155,3628.53951489621,NA -"1157","String 1156",1156,3631.6811075498,NA -"1158","String 1157",1157,3634.82270020339,NA -"1159","String 1158",1158,3637.96429285698,NA -"1160","String 1159",1159,3641.10588551057,NA -"1161","String 1160",1160,3644.24747816416,NA -"1162","String 1161",1161,3647.38907081775,NA -"1163","String 1162",1162,3650.53066347134,NA -"1164","String 1163",1163,3653.67225612493,NA -"1165","String 1164",1164,3656.81384877852,NA -"1166","String 1165",1165,3659.95544143211,NA -"1167","String 1166",1166,3663.0970340857,NA -"1168","String 1167",1167,3666.23862673929,NA -"1169","String 1168",1168,3669.38021939288,NA -"1170","String 1169",1169,3672.52181204647,NA -"1171","String 1170",1170,3675.66340470006,NA -"1172","String 1171",1171,3678.80499735365,NA -"1173","String 1172",1172,3681.94659000724,NA -"1174","String 1173",1173,3685.08818266083,NA -"1175","String 1174",1174,3688.22977531442,NA -"1176","String 1175",1175,3691.37136796801,NA -"1177","String 1176",1176,3694.5129606216,NA -"1178","String 1177",1177,3697.65455327519,NA -"1179","String 1178",1178,3700.79614592878,NA -"1180","String 1179",1179,3703.93773858237,NA -"1181","String 1180",1180,3707.07933123596,NA -"1182","String 1181",1181,3710.22092388955,NA -"1183","String 1182",1182,3713.36251654314,NA -"1184","String 1183",1183,3716.50410919673,NA -"1185","String 1184",1184,3719.64570185032,NA -"1186","String 1185",1185,3722.7872945039,NA -"1187","String 1186",1186,3725.92888715749,NA -"1188","String 1187",1187,3729.07047981108,NA -"1189","String 1188",1188,3732.21207246467,NA -"1190","String 1189",1189,3735.35366511826,NA -"1191","String 1190",1190,3738.49525777185,NA -"1192","String 1191",1191,3741.63685042544,NA -"1193","String 1192",1192,3744.77844307903,NA -"1194","String 1193",1193,3747.92003573262,NA -"1195","String 1194",1194,3751.06162838621,NA -"1196","String 1195",1195,3754.2032210398,NA -"1197","String 1196",1196,3757.34481369339,NA -"1198","String 1197",1197,3760.48640634698,NA -"1199","String 1198",1198,3763.62799900057,NA -"1200","String 1199",1199,3766.76959165416,NA -"1201","String 1200",1200,3769.91118430775,NA -"1202","String 1201",1201,3773.05277696134,NA -"1203","String 1202",1202,3776.19436961493,NA -"1204","String 1203",1203,3779.33596226852,NA -"1205","String 1204",1204,3782.47755492211,NA -"1206","String 1205",1205,3785.6191475757,NA -"1207","String 1206",1206,3788.76074022929,NA -"1208","String 1207",1207,3791.90233288288,NA -"1209","String 1208",1208,3795.04392553647,NA -"1210","String 1209",1209,3798.18551819006,NA -"1211","String 1210",1210,3801.32711084365,NA -"1212","String 1211",1211,3804.46870349724,NA -"1213","String 1212",1212,3807.61029615083,NA -"1214","String 1213",1213,3810.75188880442,NA -"1215","String 1214",1214,3813.89348145801,NA -"1216","String 1215",1215,3817.0350741116,NA -"1217","String 1216",1216,3820.17666676519,NA -"1218","String 1217",1217,3823.31825941878,NA -"1219","String 1218",1218,3826.45985207237,NA -"1220","String 1219",1219,3829.60144472596,NA -"1221","String 1220",1220,3832.74303737955,NA -"1222","String 1221",1221,3835.88463003314,NA -"1223","String 1222",1222,3839.02622268673,NA -"1224","String 1223",1223,3842.16781534032,NA -"1225","String 1224",1224,3845.30940799391,NA -"1226","String 1225",1225,3848.4510006475,NA -"1227","String 1226",1226,3851.59259330109,NA -"1228","String 1227",1227,3854.73418595468,NA -"1229","String 1228",1228,3857.87577860827,NA -"1230","String 1229",1229,3861.01737126186,NA -"1231","String 1230",1230,3864.15896391545,NA -"1232","String 1231",1231,3867.30055656904,NA -"1233","String 1232",1232,3870.44214922263,NA -"1234","String 1233",1233,3873.58374187621,NA -"1235","String 1234",1234,3876.7253345298,NA -"1236","String 1235",1235,3879.86692718339,NA -"1237","String 1236",1236,3883.00851983698,NA -"1238","String 1237",1237,3886.15011249057,NA -"1239","String 1238",1238,3889.29170514416,NA -"1240","String 1239",1239,3892.43329779775,NA -"1241","String 1240",1240,3895.57489045134,NA -"1242","String 1241",1241,3898.71648310493,NA -"1243","String 1242",1242,3901.85807575852,NA -"1244","String 1243",1243,3904.99966841211,NA -"1245","String 1244",1244,3908.1412610657,NA -"1246","String 1245",1245,3911.28285371929,NA -"1247","String 1246",1246,3914.42444637288,NA -"1248","String 1247",1247,3917.56603902647,NA -"1249","String 1248",1248,3920.70763168006,NA -"1250","String 1249",1249,3923.84922433365,NA -"1251","String 1250",1250,3926.99081698724,NA -"1252","String 1251",1251,3930.13240964083,NA -"1253","String 1252",1252,3933.27400229442,NA -"1254","String 1253",1253,3936.41559494801,NA -"1255","String 1254",1254,3939.5571876016,NA -"1256","String 1255",1255,3942.69878025519,NA -"1257","String 1256",1256,3945.84037290878,NA -"1258","String 1257",1257,3948.98196556237,NA -"1259","String 1258",1258,3952.12355821596,NA -"1260","String 1259",1259,3955.26515086955,NA -"1261","String 1260",1260,3958.40674352314,NA -"1262","String 1261",1261,3961.54833617673,NA -"1263","String 1262",1262,3964.68992883032,NA -"1264","String 1263",1263,3967.83152148391,NA -"1265","String 1264",1264,3970.9731141375,NA -"1266","String 1265",1265,3974.11470679109,NA -"1267","String 1266",1266,3977.25629944468,NA -"1268","String 1267",1267,3980.39789209827,NA -"1269","String 1268",1268,3983.53948475186,NA -"1270","String 1269",1269,3986.68107740545,NA -"1271","String 1270",1270,3989.82267005904,NA -"1272","String 1271",1271,3992.96426271263,NA -"1273","String 1272",1272,3996.10585536622,NA -"1274","String 1273",1273,3999.24744801981,NA -"1275","String 1274",1274,4002.3890406734,NA -"1276","String 1275",1275,4005.53063332699,NA -"1277","String 1276",1276,4008.67222598058,NA -"1278","String 1277",1277,4011.81381863417,NA -"1279","String 1278",1278,4014.95541128776,NA -"1280","String 1279",1279,4018.09700394135,NA -"1281","String 1280",1280,4021.23859659494,NA -"1282","String 1281",1281,4024.38018924852,NA -"1283","String 1282",1282,4027.52178190211,NA -"1284","String 1283",1283,4030.6633745557,NA -"1285","String 1284",1284,4033.80496720929,NA -"1286","String 1285",1285,4036.94655986288,NA -"1287","String 1286",1286,4040.08815251647,NA -"1288","String 1287",1287,4043.22974517006,NA -"1289","String 1288",1288,4046.37133782365,NA -"1290","String 1289",1289,4049.51293047724,NA -"1291","String 1290",1290,4052.65452313083,NA -"1292","String 1291",1291,4055.79611578442,NA -"1293","String 1292",1292,4058.93770843801,NA -"1294","String 1293",1293,4062.0793010916,NA -"1295","String 1294",1294,4065.22089374519,NA -"1296","String 1295",1295,4068.36248639878,NA -"1297","String 1296",1296,4071.50407905237,NA -"1298","String 1297",1297,4074.64567170596,NA -"1299","String 1298",1298,4077.78726435955,NA -"1300","String 1299",1299,4080.92885701314,NA -"1301","String 1300",1300,4084.07044966673,NA -"1302","String 1301",1301,4087.21204232032,NA -"1303","String 1302",1302,4090.35363497391,NA -"1304","String 1303",1303,4093.4952276275,NA -"1305","String 1304",1304,4096.63682028109,NA -"1306","String 1305",1305,4099.77841293468,NA -"1307","String 1306",1306,4102.92000558827,NA -"1308","String 1307",1307,4106.06159824186,NA -"1309","String 1308",1308,4109.20319089545,NA -"1310","String 1309",1309,4112.34478354904,NA -"1311","String 1310",1310,4115.48637620263,NA -"1312","String 1311",1311,4118.62796885622,NA -"1313","String 1312",1312,4121.76956150981,NA -"1314","String 1313",1313,4124.9111541634,NA -"1315","String 1314",1314,4128.05274681699,NA -"1316","String 1315",1315,4131.19433947058,NA -"1317","String 1316",1316,4134.33593212417,NA -"1318","String 1317",1317,4137.47752477776,NA -"1319","String 1318",1318,4140.61911743135,NA -"1320","String 1319",1319,4143.76071008494,NA -"1321","String 1320",1320,4146.90230273853,NA -"1322","String 1321",1321,4150.04389539212,NA -"1323","String 1322",1322,4153.18548804571,NA -"1324","String 1323",1323,4156.3270806993,NA -"1325","String 1324",1324,4159.46867335289,NA -"1326","String 1325",1325,4162.61026600648,NA -"1327","String 1326",1326,4165.75185866007,NA -"1328","String 1327",1327,4168.89345131366,NA -"1329","String 1328",1328,4172.03504396725,NA -"1330","String 1329",1329,4175.17663662083,NA -"1331","String 1330",1330,4178.31822927442,NA -"1332","String 1331",1331,4181.45982192801,NA -"1333","String 1332",1332,4184.6014145816,NA -"1334","String 1333",1333,4187.74300723519,NA -"1335","String 1334",1334,4190.88459988878,NA -"1336","String 1335",1335,4194.02619254237,NA -"1337","String 1336",1336,4197.16778519596,NA -"1338","String 1337",1337,4200.30937784955,NA -"1339","String 1338",1338,4203.45097050314,NA -"1340","String 1339",1339,4206.59256315673,NA -"1341","String 1340",1340,4209.73415581032,NA -"1342","String 1341",1341,4212.87574846391,NA -"1343","String 1342",1342,4216.0173411175,NA -"1344","String 1343",1343,4219.15893377109,NA -"1345","String 1344",1344,4222.30052642468,NA -"1346","String 1345",1345,4225.44211907827,NA -"1347","String 1346",1346,4228.58371173186,NA -"1348","String 1347",1347,4231.72530438545,NA -"1349","String 1348",1348,4234.86689703904,NA -"1350","String 1349",1349,4238.00848969263,NA -"1351","String 1350",1350,4241.15008234622,NA -"1352","String 1351",1351,4244.29167499981,NA -"1353","String 1352",1352,4247.4332676534,NA -"1354","String 1353",1353,4250.57486030699,NA -"1355","String 1354",1354,4253.71645296058,NA -"1356","String 1355",1355,4256.85804561417,NA -"1357","String 1356",1356,4259.99963826776,NA -"1358","String 1357",1357,4263.14123092135,NA -"1359","String 1358",1358,4266.28282357494,NA -"1360","String 1359",1359,4269.42441622853,NA -"1361","String 1360",1360,4272.56600888212,NA -"1362","String 1361",1361,4275.70760153571,NA -"1363","String 1362",1362,4278.8491941893,NA -"1364","String 1363",1363,4281.99078684289,NA -"1365","String 1364",1364,4285.13237949648,NA -"1366","String 1365",1365,4288.27397215007,NA -"1367","String 1366",1366,4291.41556480366,NA -"1368","String 1367",1367,4294.55715745725,NA -"1369","String 1368",1368,4297.69875011084,NA -"1370","String 1369",1369,4300.84034276443,NA -"1371","String 1370",1370,4303.98193541802,NA -"1372","String 1371",1371,4307.12352807161,NA -"1373","String 1372",1372,4310.2651207252,NA -"1374","String 1373",1373,4313.40671337879,NA -"1375","String 1374",1374,4316.54830603238,NA -"1376","String 1375",1375,4319.68989868597,NA -"1377","String 1376",1376,4322.83149133956,NA -"1378","String 1377",1377,4325.97308399315,NA -"1379","String 1378",1378,4329.11467664673,NA -"1380","String 1379",1379,4332.25626930032,NA -"1381","String 1380",1380,4335.39786195391,NA -"1382","String 1381",1381,4338.5394546075,NA -"1383","String 1382",1382,4341.68104726109,NA -"1384","String 1383",1383,4344.82263991468,NA -"1385","String 1384",1384,4347.96423256827,NA -"1386","String 1385",1385,4351.10582522186,NA -"1387","String 1386",1386,4354.24741787545,NA -"1388","String 1387",1387,4357.38901052904,NA -"1389","String 1388",1388,4360.53060318263,NA -"1390","String 1389",1389,4363.67219583622,NA -"1391","String 1390",1390,4366.81378848981,NA -"1392","String 1391",1391,4369.9553811434,NA -"1393","String 1392",1392,4373.09697379699,NA -"1394","String 1393",1393,4376.23856645058,NA -"1395","String 1394",1394,4379.38015910417,NA -"1396","String 1395",1395,4382.52175175776,NA -"1397","String 1396",1396,4385.66334441135,NA -"1398","String 1397",1397,4388.80493706494,NA -"1399","String 1398",1398,4391.94652971853,NA -"1400","String 1399",1399,4395.08812237212,NA -"1401","String 1400",1400,4398.22971502571,NA -"1402","String 1401",1401,4401.3713076793,NA -"1403","String 1402",1402,4404.51290033289,NA -"1404","String 1403",1403,4407.65449298648,NA -"1405","String 1404",1404,4410.79608564007,NA -"1406","String 1405",1405,4413.93767829366,NA -"1407","String 1406",1406,4417.07927094725,NA -"1408","String 1407",1407,4420.22086360084,NA -"1409","String 1408",1408,4423.36245625443,NA -"1410","String 1409",1409,4426.50404890802,NA -"1411","String 1410",1410,4429.64564156161,NA -"1412","String 1411",1411,4432.7872342152,NA -"1413","String 1412",1412,4435.92882686879,NA -"1414","String 1413",1413,4439.07041952238,NA -"1415","String 1414",1414,4442.21201217597,NA -"1416","String 1415",1415,4445.35360482956,NA -"1417","String 1416",1416,4448.49519748315,NA -"1418","String 1417",1417,4451.63679013674,NA -"1419","String 1418",1418,4454.77838279033,NA -"1420","String 1419",1419,4457.91997544392,NA -"1421","String 1420",1420,4461.06156809751,NA -"1422","String 1421",1421,4464.2031607511,NA -"1423","String 1422",1422,4467.34475340469,NA -"1424","String 1423",1423,4470.48634605828,NA -"1425","String 1424",1424,4473.62793871187,NA -"1426","String 1425",1425,4476.76953136545,NA -"1427","String 1426",1426,4479.91112401905,NA -"1428","String 1427",1427,4483.05271667264,NA -"1429","String 1428",1428,4486.19430932622,NA -"1430","String 1429",1429,4489.33590197981,NA -"1431","String 1430",1430,4492.4774946334,NA -"1432","String 1431",1431,4495.61908728699,NA -"1433","String 1432",1432,4498.76067994058,NA -"1434","String 1433",1433,4501.90227259417,NA -"1435","String 1434",1434,4505.04386524776,NA -"1436","String 1435",1435,4508.18545790135,NA -"1437","String 1436",1436,4511.32705055494,NA -"1438","String 1437",1437,4514.46864320853,NA -"1439","String 1438",1438,4517.61023586212,NA -"1440","String 1439",1439,4520.75182851571,NA -"1441","String 1440",1440,4523.8934211693,NA -"1442","String 1441",1441,4527.03501382289,NA -"1443","String 1442",1442,4530.17660647648,NA -"1444","String 1443",1443,4533.31819913007,NA -"1445","String 1444",1444,4536.45979178366,NA -"1446","String 1445",1445,4539.60138443725,NA -"1447","String 1446",1446,4542.74297709084,NA -"1448","String 1447",1447,4545.88456974443,NA -"1449","String 1448",1448,4549.02616239802,NA -"1450","String 1449",1449,4552.16775505161,NA -"1451","String 1450",1450,4555.3093477052,NA -"1452","String 1451",1451,4558.45094035879,NA -"1453","String 1452",1452,4561.59253301238,NA -"1454","String 1453",1453,4564.73412566597,NA -"1455","String 1454",1454,4567.87571831956,NA -"1456","String 1455",1455,4571.01731097315,NA -"1457","String 1456",1456,4574.15890362674,NA -"1458","String 1457",1457,4577.30049628033,NA -"1459","String 1458",1458,4580.44208893392,NA -"1460","String 1459",1459,4583.58368158751,NA -"1461","String 1460",1460,4586.7252742411,NA -"1462","String 1461",1461,4589.86686689469,NA -"1463","String 1462",1462,4593.00845954828,NA -"1464","String 1463",1463,4596.15005220187,NA -"1465","String 1464",1464,4599.29164485546,NA -"1466","String 1465",1465,4602.43323750905,NA -"1467","String 1466",1466,4605.57483016264,NA -"1468","String 1467",1467,4608.71642281623,NA -"1469","String 1468",1468,4611.85801546982,NA -"1470","String 1469",1469,4614.99960812341,NA -"1471","String 1470",1470,4618.141200777,NA -"1472","String 1471",1471,4621.28279343059,NA -"1473","String 1472",1472,4624.42438608418,NA -"1474","String 1473",1473,4627.56597873777,NA -"1475","String 1474",1474,4630.70757139136,NA -"1476","String 1475",1475,4633.84916404494,NA -"1477","String 1476",1476,4636.99075669853,NA -"1478","String 1477",1477,4640.13234935212,NA -"1479","String 1478",1478,4643.27394200571,NA -"1480","String 1479",1479,4646.4155346593,NA -"1481","String 1480",1480,4649.55712731289,NA -"1482","String 1481",1481,4652.69871996648,NA -"1483","String 1482",1482,4655.84031262007,NA -"1484","String 1483",1483,4658.98190527366,NA -"1485","String 1484",1484,4662.12349792725,NA -"1486","String 1485",1485,4665.26509058084,NA -"1487","String 1486",1486,4668.40668323443,NA -"1488","String 1487",1487,4671.54827588802,NA -"1489","String 1488",1488,4674.68986854161,NA -"1490","String 1489",1489,4677.8314611952,NA -"1491","String 1490",1490,4680.97305384879,NA -"1492","String 1491",1491,4684.11464650238,NA -"1493","String 1492",1492,4687.25623915597,NA -"1494","String 1493",1493,4690.39783180956,NA -"1495","String 1494",1494,4693.53942446315,NA -"1496","String 1495",1495,4696.68101711674,NA -"1497","String 1496",1496,4699.82260977033,NA -"1498","String 1497",1497,4702.96420242392,NA -"1499","String 1498",1498,4706.10579507751,NA -"1500","String 1499",1499,4709.2473877311,NA -"1501","String 1500",1500,4712.38898038469,NA -"1502","String 1501",1501,4715.53057303828,NA -"1503","String 1502",1502,4718.67216569187,NA -"1504","String 1503",1503,4721.81375834546,NA -"1505","String 1504",1504,4724.95535099905,NA -"1506","String 1505",1505,4728.09694365264,NA -"1507","String 1506",1506,4731.23853630623,NA -"1508","String 1507",1507,4734.38012895982,NA -"1509","String 1508",1508,4737.52172161341,NA -"1510","String 1509",1509,4740.663314267,NA -"1511","String 1510",1510,4743.80490692059,NA -"1512","String 1511",1511,4746.94649957418,NA -"1513","String 1512",1512,4750.08809222777,NA -"1514","String 1513",1513,4753.22968488136,NA -"1515","String 1514",1514,4756.37127753495,NA -"1516","String 1515",1515,4759.51287018854,NA -"1517","String 1516",1516,4762.65446284213,NA -"1518","String 1517",1517,4765.79605549572,NA -"1519","String 1518",1518,4768.93764814931,NA -"1520","String 1519",1519,4772.0792408029,NA -"1521","String 1520",1520,4775.22083345649,NA -"1522","String 1521",1521,4778.36242611007,NA -"1523","String 1522",1522,4781.50401876367,NA -"1524","String 1523",1523,4784.64561141726,NA -"1525","String 1525",1525,4790.92879672443,NA -"1526","String 1524",1524,4787.78720407084,NA -"1527","String 1526",1526,4794.07038937802,NA -"1528","String 1527",1527,4797.21198203161,NA -"1529","String 1528",1528,4800.3535746852,NA -"1530","String 1529",1529,4803.49516733879,NA -"1531","String 1530",1530,4806.63675999238,NA -"1532","String 1531",1531,4809.77835264597,NA -"1533","String 1532",1532,4812.91994529956,NA -"1534","String 1533",1533,4816.06153795315,NA -"1535","String 1534",1534,4819.20313060674,NA -"1536","String 1535",1535,4822.34472326033,NA -"1537","String 1536",1536,4825.48631591392,NA -"1538","String 1537",1537,4828.62790856751,NA -"1539","String 1538",1538,4831.7695012211,NA -"1540","String 1539",1539,4834.91109387469,NA -"1541","String 1540",1540,4838.05268652828,NA -"1542","String 1541",1541,4841.19427918187,NA -"1543","String 1542",1542,4844.33587183546,NA -"1544","String 1543",1543,4847.47746448905,NA -"1545","String 1544",1544,4850.61905714264,NA -"1546","String 1545",1545,4853.76064979623,NA -"1547","String 1546",1546,4856.90224244982,NA -"1548","String 1547",1547,4860.04383510341,NA -"1549","String 1548",1548,4863.185427757,NA -"1550","String 1549",1549,4866.32702041059,NA -"1551","String 1550",1550,4869.46861306418,NA -"1552","String 1551",1551,4872.61020571777,NA -"1553","String 1552",1552,4875.75179837136,NA -"1554","String 1553",1553,4878.89339102495,NA -"1555","String 1554",1554,4882.03498367854,NA -"1556","String 1555",1555,4885.17657633213,NA -"1557","String 1556",1556,4888.31816898572,NA -"1558","String 1557",1557,4891.45976163931,NA -"1559","String 1558",1558,4894.6013542929,NA -"1560","String 1559",1559,4897.74294694649,NA -"1561","String 1560",1560,4900.88453960008,NA -"1562","String 1561",1561,4904.02613225367,NA -"1563","String 1562",1562,4907.16772490726,NA -"1564","String 1563",1563,4910.30931756085,NA -"1565","String 1564",1564,4913.45091021444,NA -"1566","String 1565",1565,4916.59250286803,NA -"1567","String 1566",1566,4919.73409552162,NA -"1568","String 1567",1567,4922.87568817521,NA -"1569","String 1568",1568,4926.0172808288,NA -"1570","String 1569",1569,4929.15887348239,NA -"1571","String 1570",1570,4932.30046613598,NA -"1572","String 1571",1571,4935.44205878956,NA -"1573","String 1572",1572,4938.58365144315,NA -"1574","String 1573",1573,4941.72524409674,NA -"1575","String 1574",1574,4944.86683675033,NA -"1576","String 1575",1575,4948.00842940392,NA -"1577","String 1576",1576,4951.15002205751,NA -"1578","String 1577",1577,4954.2916147111,NA -"1579","String 1578",1578,4957.43320736469,NA -"1580","String 1579",1579,4960.57480001828,NA -"1581","String 1580",1580,4963.71639267187,NA -"1582","String 1581",1581,4966.85798532546,NA -"1583","String 1582",1582,4969.99957797905,NA -"1584","String 1583",1583,4973.14117063264,NA -"1585","String 1584",1584,4976.28276328623,NA -"1586","String 1585",1585,4979.42435593982,NA -"1587","String 1586",1586,4982.56594859341,NA -"1588","String 1587",1587,4985.707541247,NA -"1589","String 1588",1588,4988.84913390059,NA -"1590","String 1589",1589,4991.99072655418,NA -"1591","String 1590",1590,4995.13231920777,NA -"1592","String 1591",1591,4998.27391186136,NA -"1593","String 1592",1592,5001.41550451495,NA -"1594","String 1593",1593,5004.55709716854,NA -"1595","String 1594",1594,5007.69868982213,NA -"1596","String 1595",1595,5010.84028247572,NA -"1597","String 1596",1596,5013.98187512931,NA -"1598","String 1597",1597,5017.1234677829,NA -"1599","String 1598",1598,5020.26506043649,NA -"1600","String 1599",1599,5023.40665309008,NA -"1601","String 1600",1600,5026.54824574367,NA -"1602","String 1601",1601,5029.68983839726,NA -"1603","String 1602",1602,5032.83143105085,NA -"1604","String 1603",1603,5035.97302370444,NA -"1605","String 1604",1604,5039.11461635803,NA -"1606","String 1605",1605,5042.25620901162,NA -"1607","String 1606",1606,5045.39780166521,NA -"1608","String 1607",1607,5048.5393943188,NA -"1609","String 1608",1608,5051.68098697239,NA -"1610","String 1609",1609,5054.82257962598,NA -"1611","String 1610",1610,5057.96417227957,NA -"1612","String 1611",1611,5061.10576493316,NA -"1613","String 1612",1612,5064.24735758675,NA -"1614","String 1613",1613,5067.38895024034,NA -"1615","String 1614",1614,5070.53054289393,NA -"1616","String 1615",1615,5073.67213554752,NA -"1617","String 1616",1616,5076.81372820111,NA -"1618","String 1617",1617,5079.9553208547,NA -"1619","String 1618",1618,5083.09691350829,NA -"1620","String 1619",1619,5086.23850616188,NA -"1621","String 1620",1620,5089.38009881546,NA -"1622","String 1621",1621,5092.52169146905,NA -"1623","String 1622",1622,5095.66328412264,NA -"1624","String 1623",1623,5098.80487677623,NA -"1625","String 1624",1624,5101.94646942982,NA -"1626","String 1625",1625,5105.08806208341,NA -"1627","String 1626",1626,5108.229654737,NA -"1628","String 1627",1627,5111.37124739059,NA -"1629","String 1628",1628,5114.51284004418,NA -"1630","String 1629",1629,5117.65443269777,NA -"1631","String 1630",1630,5120.79602535136,NA -"1632","String 1631",1631,5123.93761800495,NA -"1633","String 1632",1632,5127.07921065854,NA -"1634","String 1633",1633,5130.22080331213,NA -"1635","String 1634",1634,5133.36239596572,NA -"1636","String 1635",1635,5136.50398861931,NA -"1637","String 1636",1636,5139.6455812729,NA -"1638","String 1637",1637,5142.78717392649,NA -"1639","String 1638",1638,5145.92876658008,NA -"1640","String 1639",1639,5149.07035923367,NA -"1641","String 1640",1640,5152.21195188726,NA -"1642","String 1641",1641,5155.35354454085,NA -"1643","String 1642",1642,5158.49513719444,NA -"1644","String 1643",1643,5161.63672984803,NA -"1645","String 1644",1644,5164.77832250162,NA -"1646","String 1645",1645,5167.91991515521,NA -"1647","String 1646",1646,5171.0615078088,NA -"1648","String 1647",1647,5174.20310046239,NA -"1649","String 1648",1648,5177.34469311598,NA -"1650","String 1649",1649,5180.48628576957,NA -"1651","String 1650",1650,5183.62787842316,NA -"1652","String 1651",1651,5186.76947107675,NA -"1653","String 1652",1652,5189.91106373034,NA -"1654","String 1653",1653,5193.05265638393,NA -"1655","String 1654",1654,5196.19424903752,NA -"1656","String 1655",1655,5199.33584169111,NA -"1657","String 1656",1656,5202.4774343447,NA -"1658","String 1657",1657,5205.61902699829,NA -"1659","String 1658",1658,5208.76061965188,NA -"1660","String 1659",1659,5211.90221230547,NA -"1661","String 1660",1660,5215.04380495906,NA -"1662","String 1661",1661,5218.18539761265,NA -"1663","String 1662",1662,5221.32699026624,NA -"1664","String 1663",1663,5224.46858291983,NA -"1665","String 1664",1664,5227.61017557342,NA -"1666","String 1665",1665,5230.75176822701,NA -"1667","String 1666",1666,5233.8933608806,NA -"1668","String 1667",1667,5237.03495353418,NA -"1669","String 1668",1668,5240.17654618777,NA -"1670","String 1669",1669,5243.31813884136,NA -"1671","String 1670",1670,5246.45973149495,NA -"1672","String 1671",1671,5249.60132414854,NA -"1673","String 1673",1673,5255.88450945572,NA -"1674","String 1672",1672,5252.74291680213,NA -"1675","String 1674",1674,5259.02610210931,NA -"1676","String 1675",1675,5262.1676947629,NA -"1677","String 1676",1676,5265.30928741649,NA -"1678","String 1677",1677,5268.45088007008,NA -"1679","String 1678",1678,5271.59247272367,NA -"1680","String 1679",1679,5274.73406537726,NA -"1681","String 1680",1680,5277.87565803085,NA -"1682","String 1681",1681,5281.01725068444,NA -"1683","String 1682",1682,5284.15884333803,NA -"1684","String 1683",1683,5287.30043599162,NA -"1685","String 1684",1684,5290.44202864521,NA -"1686","String 1685",1685,5293.5836212988,NA -"1687","String 1686",1686,5296.72521395239,NA -"1688","String 1687",1687,5299.86680660598,NA -"1689","String 1688",1688,5303.00839925957,NA -"1690","String 1689",1689,5306.14999191316,NA -"1691","String 1690",1690,5309.29158456675,NA -"1692","String 1691",1691,5312.43317722034,NA -"1693","String 1692",1692,5315.57476987393,NA -"1694","String 1693",1693,5318.71636252752,NA -"1695","String 1694",1694,5321.85795518111,NA -"1696","String 1695",1695,5324.9995478347,NA -"1697","String 1696",1696,5328.14114048829,NA -"1698","String 1697",1697,5331.28273314188,NA -"1699","String 1698",1698,5334.42432579547,NA -"1700","String 1699",1699,5337.56591844906,NA -"1701","String 1700",1700,5340.70751110265,NA -"1702","String 1701",1701,5343.84910375624,NA -"1703","String 1702",1702,5346.99069640983,NA -"1704","String 1703",1703,5350.13228906342,NA -"1705","String 1704",1704,5353.27388171701,NA -"1706","String 1705",1705,5356.4154743706,NA -"1707","String 1706",1706,5359.55706702419,NA -"1708","String 1707",1707,5362.69865967778,NA -"1709","String 1708",1708,5365.84025233137,NA -"1710","String 1709",1709,5368.98184498496,NA -"1711","String 1710",1710,5372.12343763855,NA -"1712","String 1711",1711,5375.26503029214,NA -"1713","String 1712",1712,5378.40662294573,NA -"1714","String 1713",1713,5381.54821559932,NA -"1715","String 1714",1714,5384.68980825291,NA -"1716","String 1715",1715,5387.8314009065,NA -"1717","String 1716",1716,5390.97299356009,NA -"1718","String 1717",1717,5394.11458621367,NA -"1719","String 1718",1718,5397.25617886726,NA -"1720","String 1719",1719,5400.39777152085,NA -"1721","String 1720",1720,5403.53936417444,NA -"1722","String 1721",1721,5406.68095682803,NA -"1723","String 1722",1722,5409.82254948162,NA -"1724","String 1723",1723,5412.96414213521,NA -"1725","String 1724",1724,5416.1057347888,NA -"1726","String 1725",1725,5419.24732744239,NA -"1727","String 1726",1726,5422.38892009598,NA -"1728","String 1727",1727,5425.53051274957,NA -"1729","String 1728",1728,5428.67210540316,NA -"1730","String 1729",1729,5431.81369805675,NA -"1731","String 1730",1730,5434.95529071034,NA -"1732","String 1731",1731,5438.09688336393,NA -"1733","String 1732",1732,5441.23847601752,NA -"1734","String 1733",1733,5444.38006867111,NA -"1735","String 1734",1734,5447.5216613247,NA -"1736","String 1735",1735,5450.66325397829,NA -"1737","String 1736",1736,5453.80484663188,NA -"1738","String 1737",1737,5456.94643928547,NA -"1739","String 1738",1738,5460.08803193906,NA -"1740","String 1739",1739,5463.22962459265,NA -"1741","String 1740",1740,5466.37121724624,NA -"1742","String 1741",1741,5469.51280989983,NA -"1743","String 1742",1742,5472.65440255342,NA -"1744","String 1743",1743,5475.79599520701,NA -"1745","String 1744",1744,5478.9375878606,NA -"1746","String 1745",1745,5482.07918051419,NA -"1747","String 1746",1746,5485.22077316778,NA -"1748","String 1747",1747,5488.36236582137,NA -"1749","String 1748",1748,5491.50395847496,NA -"1750","String 1749",1749,5494.64555112855,NA -"1751","String 1750",1750,5497.78714378214,NA -"1752","String 1751",1751,5500.92873643573,NA -"1753","String 1752",1752,5504.07032908932,NA -"1754","String 1753",1753,5507.21192174291,NA -"1755","String 1754",1754,5510.3535143965,NA -"1756","String 1755",1755,5513.49510705009,NA -"1757","String 1756",1756,5516.63669970368,NA -"1758","String 1757",1757,5519.77829235727,NA -"1759","String 1758",1758,5522.91988501086,NA -"1760","String 1759",1759,5526.06147766445,NA -"1761","String 1760",1760,5529.20307031804,NA -"1762","String 1761",1761,5532.34466297163,NA -"1763","String 1762",1762,5535.48625562522,NA -"1764","String 1763",1763,5538.62784827881,NA -"1765","String 1764",1764,5541.76944093239,NA -"1766","String 1765",1765,5544.91103358599,NA -"1767","String 1766",1766,5548.05262623957,NA -"1768","String 1767",1767,5551.19421889316,NA -"1769","String 1768",1768,5554.33581154675,NA -"1770","String 1769",1769,5557.47740420034,NA -"1771","String 1770",1770,5560.61899685393,NA -"1772","String 1771",1771,5563.76058950752,NA -"1773","String 1772",1772,5566.90218216111,NA -"1774","String 1773",1773,5570.0437748147,NA -"1775","String 1774",1774,5573.18536746829,NA -"1776","String 1775",1775,5576.32696012188,NA -"1777","String 1776",1776,5579.46855277547,NA -"1778","String 1777",1777,5582.61014542906,NA -"1779","String 1778",1778,5585.75173808265,NA -"1780","String 1779",1779,5588.89333073624,NA -"1781","String 1780",1780,5592.03492338983,NA -"1782","String 1781",1781,5595.17651604342,NA -"1783","String 1782",1782,5598.31810869701,NA -"1784","String 1783",1783,5601.4597013506,NA -"1785","String 1784",1784,5604.60129400419,NA -"1786","String 1785",1785,5607.74288665778,NA -"1787","String 1786",1786,5610.88447931137,NA -"1788","String 1787",1787,5614.02607196496,NA -"1789","String 1788",1788,5617.16766461855,NA -"1790","String 1789",1789,5620.30925727214,NA -"1791","String 1790",1790,5623.45084992573,NA -"1792","String 1791",1791,5626.59244257932,NA -"1793","String 1792",1792,5629.73403523291,NA -"1794","String 1793",1793,5632.8756278865,NA -"1795","String 1794",1794,5636.01722054009,NA -"1796","String 1795",1795,5639.15881319368,NA -"1797","String 1796",1796,5642.30040584727,NA -"1798","String 1797",1797,5645.44199850086,NA -"1799","String 1798",1798,5648.58359115445,NA -"1800","String 1799",1799,5651.72518380804,NA -"1801","String 1800",1800,5654.86677646163,NA -"1802","String 1801",1801,5658.00836911522,NA -"1803","String 1802",1802,5661.14996176881,NA -"1804","String 1803",1803,5664.2915544224,NA -"1805","String 1804",1804,5667.43314707599,NA -"1806","String 1805",1805,5670.57473972958,NA -"1807","String 1806",1806,5673.71633238317,NA -"1808","String 1807",1807,5676.85792503676,NA -"1809","String 1808",1808,5679.99951769035,NA -"1810","String 1809",1809,5683.14111034394,NA -"1811","String 1810",1810,5686.28270299753,NA -"1812","String 1811",1811,5689.42429565112,NA -"1813","String 1812",1812,5692.56588830471,NA -"1814","String 1813",1813,5695.70748095829,NA -"1815","String 1814",1814,5698.84907361188,NA -"1816","String 1815",1815,5701.99066626547,NA -"1817","String 1816",1816,5705.13225891906,NA -"1818","String 1817",1817,5708.27385157265,NA -"1819","String 1818",1818,5711.41544422624,NA -"1820","String 1819",1819,5714.55703687983,NA -"1821","String 1820",1820,5717.69862953342,NA -"1822","String 1821",1821,5720.84022218701,NA -"1823","String 1822",1822,5723.9818148406,NA -"1824","String 1823",1823,5727.12340749419,NA -"1825","String 1824",1824,5730.26500014778,NA -"1826","String 1825",1825,5733.40659280137,NA -"1827","String 1826",1826,5736.54818545496,NA -"1828","String 1827",1827,5739.68977810855,NA -"1829","String 1828",1828,5742.83137076214,NA -"1830","String 1829",1829,5745.97296341573,NA -"1831","String 1830",1830,5749.11455606932,NA -"1832","String 1831",1831,5752.25614872291,NA -"1833","String 1832",1832,5755.3977413765,NA -"1834","String 1833",1833,5758.53933403009,NA -"1835","String 1834",1834,5761.68092668368,NA -"1836","String 1835",1835,5764.82251933727,NA -"1837","String 1836",1836,5767.96411199086,NA -"1838","String 1837",1837,5771.10570464445,NA -"1839","String 1838",1838,5774.24729729804,NA -"1840","String 1839",1839,5777.38888995163,NA -"1841","String 1840",1840,5780.53048260522,NA -"1842","String 1841",1841,5783.67207525881,NA -"1843","String 1842",1842,5786.8136679124,NA -"1844","String 1843",1843,5789.95526056599,NA -"1845","String 1844",1844,5793.09685321958,NA -"1846","String 1845",1845,5796.23844587317,NA -"1847","String 1846",1846,5799.38003852676,NA -"1848","String 1847",1847,5802.52163118035,NA -"1849","String 1848",1848,5805.66322383394,NA -"1850","String 1849",1849,5808.80481648753,NA -"1851","String 1850",1850,5811.94640914112,NA -"1852","String 1851",1851,5815.08800179471,NA -"1853","String 1852",1852,5818.2295944483,NA -"1854","String 1853",1853,5821.37118710189,NA -"1855","String 1854",1854,5824.51277975548,NA -"1856","String 1855",1855,5827.65437240907,NA -"1857","String 1856",1856,5830.79596506266,NA -"1858","String 1858",1858,5837.07915036984,NA -"1859","String 1859",1859,5840.22074302343,NA -"1860","String 1860",1860,5843.36233567701,NA -"1861","String 1861",1861,5846.50392833061,NA -"1862","String 1862",1862,5849.6455209842,NA -"1863","String 1863",1863,5852.78711363778,NA -"1864","String 1864",1864,5855.92870629137,NA -"1865","String 1865",1865,5859.07029894496,NA -"1866","String 1866",1866,5862.21189159855,NA -"1867","String 1867",1867,5865.35348425214,NA -"1868","String 1868",1868,5868.49507690573,NA -"1869","String 1869",1869,5871.63666955932,NA -"1870","String 1870",1870,5874.77826221291,NA -"1871","String 1871",1871,5877.9198548665,NA -"1872","String 1857",1857,5833.93755771625,NA -"1873","String 1872",1872,5881.06144752009,NA -"1874","String 1873",1873,5884.20304017368,NA -"1875","String 1874",1874,5887.34463282727,NA -"1876","String 1875",1875,5890.48622548086,NA -"1877","String 1876",1876,5893.62781813445,NA -"1878","String 1877",1877,5896.76941078804,NA -"1879","String 1878",1878,5899.91100344163,NA -"1880","String 1879",1879,5903.05259609522,NA -"1881","String 1880",1880,5906.19418874881,NA -"1882","String 1881",1881,5909.3357814024,NA -"1883","String 1882",1882,5912.47737405599,NA -"1884","String 1883",1883,5915.61896670958,NA -"1885","String 1884",1884,5918.76055936317,NA -"1886","String 1885",1885,5921.90215201676,NA -"1887","String 1886",1886,5925.04374467035,NA -"1888","String 1887",1887,5928.18533732394,NA -"1889","String 1888",1888,5931.32692997753,NA -"1890","String 1889",1889,5934.46852263112,NA -"1891","String 1890",1890,5937.61011528471,NA -"1892","String 1891",1891,5940.7517079383,NA -"1893","String 1892",1892,5943.89330059189,NA -"1894","String 1893",1893,5947.03489324548,NA -"1895","String 1894",1894,5950.17648589907,NA -"1896","String 1895",1895,5953.31807855266,NA -"1897","String 1896",1896,5956.45967120625,NA -"1898","String 1897",1897,5959.60126385984,NA -"1899","String 1898",1898,5962.74285651343,NA -"1900","String 1899",1899,5965.88444916702,NA -"1901","String 1900",1900,5969.02604182061,NA -"1902","String 1901",1901,5972.1676344742,NA -"1903","String 1902",1902,5975.30922712779,NA -"1904","String 1903",1903,5978.45081978138,NA -"1905","String 1904",1904,5981.59241243497,NA -"1906","String 1905",1905,5984.73400508856,NA -"1907","String 1906",1906,5987.87559774215,NA -"1908","String 1907",1907,5991.01719039574,NA -"1909","String 1908",1908,5994.15878304933,NA -"1910","String 1909",1909,5997.30037570291,NA -"1911","String 1910",1910,6000.4419683565,NA -"1912","String 1911",1911,6003.58356101009,NA -"1913","String 1912",1912,6006.72515366368,NA -"1914","String 1913",1913,6009.86674631727,NA -"1915","String 1914",1914,6013.00833897086,NA -"1916","String 1915",1915,6016.14993162445,NA -"1917","String 1916",1916,6019.29152427804,NA -"1918","String 1917",1917,6022.43311693163,NA -"1919","String 1918",1918,6025.57470958522,NA -"1920","String 1919",1919,6028.71630223881,NA -"1921","String 1920",1920,6031.8578948924,NA -"1922","String 1921",1921,6034.99948754599,NA -"1923","String 1922",1922,6038.14108019958,NA -"1924","String 1923",1923,6041.28267285317,NA -"1925","String 1924",1924,6044.42426550676,NA -"1926","String 1925",1925,6047.56585816035,NA -"1927","String 1926",1926,6050.70745081394,NA -"1928","String 1927",1927,6053.84904346753,NA -"1929","String 1928",1928,6056.99063612112,NA -"1930","String 1929",1929,6060.13222877471,NA -"1931","String 1930",1930,6063.2738214283,NA -"1932","String 1931",1931,6066.41541408189,NA -"1933","String 1932",1932,6069.55700673548,NA -"1934","String 1933",1933,6072.69859938907,NA -"1935","String 1934",1934,6075.84019204266,NA -"1936","String 1935",1935,6078.98178469625,NA -"1937","String 1936",1936,6082.12337734984,NA -"1938","String 1937",1937,6085.26497000343,NA -"1939","String 1938",1938,6088.40656265702,NA -"1940","String 1939",1939,6091.54815531061,NA -"1941","String 1940",1940,6094.6897479642,NA -"1942","String 1941",1941,6097.83134061779,NA -"1943","String 1942",1942,6100.97293327138,NA -"1944","String 1943",1943,6104.11452592497,NA -"1945","String 1944",1944,6107.25611857856,NA -"1946","String 1945",1945,6110.39771123215,NA -"1947","String 1946",1946,6113.53930388574,NA -"1948","String 1947",1947,6116.68089653933,NA -"1949","String 1948",1948,6119.82248919292,NA -"1950","String 1949",1949,6122.96408184651,NA -"1951","String 1950",1950,6126.1056745001,NA -"1952","String 1951",1951,6129.24726715369,NA -"1953","String 1952",1952,6132.38885980728,NA -"1954","String 1953",1953,6135.53045246087,NA -"1955","String 1954",1954,6138.67204511446,NA -"1956","String 1955",1955,6141.81363776805,NA -"1957","String 1956",1956,6144.95523042163,NA -"1958","String 1957",1957,6148.09682307523,NA -"1959","String 1958",1958,6151.23841572882,NA -"1960","String 1959",1959,6154.3800083824,NA -"1961","String 1960",1960,6157.52160103599,NA -"1962","String 1961",1961,6160.66319368958,NA -"1963","String 1962",1962,6163.80478634317,NA -"1964","String 1963",1963,6166.94637899676,NA -"1965","String 1964",1964,6170.08797165035,NA -"1966","String 1965",1965,6173.22956430394,NA -"1967","String 1966",1966,6176.37115695753,NA -"1968","String 1967",1967,6179.51274961112,NA -"1969","String 1968",1968,6182.65434226471,NA -"1970","String 1969",1969,6185.7959349183,NA -"1971","String 1970",1970,6188.93752757189,NA -"1972","String 1971",1971,6192.07912022548,NA -"1973","String 1972",1972,6195.22071287907,NA -"1974","String 1973",1973,6198.36230553266,NA -"1975","String 1974",1974,6201.50389818625,NA -"1976","String 1975",1975,6204.64549083984,NA -"1977","String 1976",1976,6207.78708349343,NA -"1978","String 1977",1977,6210.92867614702,NA -"1979","String 1978",1978,6214.07026880061,NA -"1980","String 1979",1979,6217.2118614542,NA -"1981","String 1980",1980,6220.35345410779,NA -"1982","String 1981",1981,6223.49504676138,NA -"1983","String 1982",1982,6226.63663941497,NA -"1984","String 1983",1983,6229.77823206856,NA -"1985","String 1984",1984,6232.91982472215,NA -"1986","String 1985",1985,6236.06141737574,NA -"1987","String 1986",1986,6239.20301002933,NA -"1988","String 1987",1987,6242.34460268292,NA -"1989","String 1988",1988,6245.48619533651,NA -"1990","String 1989",1989,6248.6277879901,NA -"1991","String 1990",1990,6251.76938064369,NA -"1992","String 1991",1991,6254.91097329728,NA -"1993","String 1992",1992,6258.05256595087,NA -"1994","String 1993",1993,6261.19415860446,NA -"1995","String 1994",1994,6264.33575125805,NA -"1996","String 1995",1995,6267.47734391164,NA -"1997","String 1996",1996,6270.61893656523,NA -"1998","String 1997",1997,6273.76052921882,NA -"1999","String 1998",1998,6276.90212187241,NA -"2000","String 1999",1999,6280.043714526,NA -"2001","String 2000",2000,6283.18530717959,NA -"2002","String 2001",2001,6286.32689983318,NA -"2003","String 2002",2002,6289.46849248677,NA -"2004","String 2003",2003,6292.61008514036,NA -"2005","String 2004",2004,6295.75167779395,NA -"2006","String 2005",2005,6298.89327044754,NA -"2007","String 2006",2006,6302.03486310112,NA -"2008","String 2007",2007,6305.17645575471,NA -"2009","String 2008",2008,6308.31804840831,NA -"2010","String 2009",2009,6311.45964106189,NA -"2011","String 2010",2010,6314.60123371548,NA -"2012","String 2011",2011,6317.74282636907,NA -"2013","String 2012",2012,6320.88441902266,NA -"2014","String 2013",2013,6324.02601167625,NA -"2015","String 2014",2014,6327.16760432984,NA -"2016","String 2015",2015,6330.30919698343,NA -"2017","String 2016",2016,6333.45078963702,NA -"2018","String 2017",2017,6336.59238229061,NA -"2019","String 2018",2018,6339.7339749442,NA -"2020","String 2019",2019,6342.87556759779,NA -"2021","String 2020",2020,6346.01716025138,NA -"2022","String 2021",2021,6349.15875290497,NA -"2023","String 2022",2022,6352.30034555856,NA -"2024","String 2023",2023,6355.44193821215,NA -"2025","String 2024",2024,6358.58353086574,NA -"2026","String 2025",2025,6361.72512351933,NA -"2027","String 2026",2026,6364.86671617292,NA -"2028","String 2027",2027,6368.00830882651,NA -"2029","String 2028",2028,6371.1499014801,NA -"2030","String 2029",2029,6374.29149413369,NA -"2031","String 2030",2030,6377.43308678728,NA -"2032","String 2031",2031,6380.57467944087,NA -"2033","String 2032",2032,6383.71627209446,NA -"2034","String 2033",2033,6386.85786474805,NA -"2035","String 2034",2034,6389.99945740164,NA -"2036","String 2035",2035,6393.14105005523,NA -"2037","String 2036",2036,6396.28264270882,NA -"2038","String 2037",2037,6399.42423536241,NA -"2039","String 2038",2038,6402.565828016,NA -"2040","String 2039",2039,6405.70742066959,NA -"2041","String 2040",2040,6408.84901332318,NA -"2042","String 2041",2041,6411.99060597677,NA -"2043","String 2042",2042,6415.13219863036,NA -"2044","String 2043",2043,6418.27379128395,NA -"2045","String 2044",2044,6421.41538393754,NA -"2046","String 2045",2045,6424.55697659113,NA -"2047","String 2046",2046,6427.69856924472,NA -"2048","String 2047",2047,6430.84016189831,NA -"2049","String 2048",2048,6433.9817545519,NA -"2050","String 2049",2049,6437.12334720549,NA -"2051","String 2050",2050,6440.26493985908,NA -"2052","String 2051",2051,6443.40653251267,NA -"2053","String 2052",2052,6446.54812516626,NA -"2054","String 2053",2053,6449.68971781985,NA -"2055","String 2054",2054,6452.83131047344,NA -"2056","String 2055",2055,6455.97290312702,NA -"2057","String 2056",2056,6459.11449578061,NA -"2058","String 2057",2057,6462.2560884342,NA -"2059","String 2058",2058,6465.39768108779,NA -"2060","String 2059",2059,6468.53927374138,NA -"2061","String 2060",2060,6471.68086639497,NA -"2062","String 2061",2061,6474.82245904856,NA -"2063","String 2062",2062,6477.96405170215,NA -"2064","String 2063",2063,6481.10564435574,NA -"2065","String 2064",2064,6484.24723700933,NA -"2066","String 2065",2065,6487.38882966292,NA -"2067","String 2066",2066,6490.53042231651,NA -"2068","String 2067",2067,6493.6720149701,NA -"2069","String 2068",2068,6496.81360762369,NA -"2070","String 2069",2069,6499.95520027728,NA -"2071","String 2070",2070,6503.09679293087,NA -"2072","String 2071",2071,6506.23838558446,NA -"2073","String 2072",2072,6509.37997823805,NA -"2074","String 2073",2073,6512.52157089164,NA -"2075","String 2074",2074,6515.66316354523,NA -"2076","String 2075",2075,6518.80475619882,NA -"2077","String 2076",2076,6521.94634885241,NA -"2078","String 2077",2077,6525.087941506,NA -"2079","String 2078",2078,6528.22953415959,NA -"2080","String 2079",2079,6531.37112681318,NA -"2081","String 2080",2080,6534.51271946677,NA -"2082","String 2081",2081,6537.65431212036,NA -"2083","String 2082",2082,6540.79590477395,NA -"2084","String 2083",2083,6543.93749742754,NA -"2085","String 2084",2084,6547.07909008113,NA -"2086","String 2085",2085,6550.22068273472,NA -"2087","String 2086",2086,6553.36227538831,NA -"2088","String 2087",2087,6556.5038680419,NA -"2089","String 2088",2088,6559.64546069549,NA -"2090","String 2089",2089,6562.78705334908,NA -"2091","String 2090",2090,6565.92864600267,NA -"2092","String 2091",2091,6569.07023865626,NA -"2093","String 2092",2092,6572.21183130985,NA -"2094","String 2093",2093,6575.35342396344,NA -"2095","String 2094",2094,6578.49501661703,NA -"2096","String 2095",2095,6581.63660927062,NA -"2097","String 2096",2096,6584.77820192421,NA -"2098","String 2097",2097,6587.9197945778,NA -"2099","String 2098",2098,6591.06138723139,NA -"2100","String 2099",2099,6594.20297988498,NA -"2101","String 2100",2100,6597.34457253857,NA -"2102","String 2101",2101,6600.48616519216,NA -"2103","String 2102",2102,6603.62775784574,NA -"2104","String 2103",2103,6606.76935049933,NA -"2105","String 2104",2104,6609.91094315293,NA -"2106","String 2105",2105,6613.05253580651,NA -"2107","String 2106",2106,6616.1941284601,NA -"2108","String 2107",2107,6619.33572111369,NA -"2109","String 2108",2108,6622.47731376728,NA -"2110","String 2109",2109,6625.61890642087,NA -"2111","String 2110",2110,6628.76049907446,NA -"2112","String 2111",2111,6631.90209172805,NA -"2113","String 2112",2112,6635.04368438164,NA -"2114","String 2113",2113,6638.18527703523,NA -"2115","String 2114",2114,6641.32686968882,NA -"2116","String 2115",2115,6644.46846234241,NA -"2117","String 2116",2116,6647.610054996,NA -"2118","String 2117",2117,6650.75164764959,NA -"2119","String 2118",2118,6653.89324030318,NA -"2120","String 2119",2119,6657.03483295677,NA -"2121","String 2120",2120,6660.17642561036,NA -"2122","String 2121",2121,6663.31801826395,NA -"2123","String 2122",2122,6666.45961091754,NA -"2124","String 2123",2123,6669.60120357113,NA -"2125","String 2124",2124,6672.74279622472,NA -"2126","String 2125",2125,6675.88438887831,NA -"2127","String 2126",2126,6679.0259815319,NA -"2128","String 2127",2127,6682.16757418549,NA -"2129","String 2128",2128,6685.30916683908,NA -"2130","String 2129",2129,6688.45075949267,NA -"2131","String 2130",2130,6691.59235214626,NA -"2132","String 2131",2131,6694.73394479985,NA -"2133","String 2132",2132,6697.87553745344,NA -"2134","String 2133",2133,6701.01713010703,NA -"2135","String 2134",2134,6704.15872276062,NA -"2136","String 2135",2135,6707.30031541421,NA -"2137","String 2136",2136,6710.4419080678,NA -"2138","String 2137",2137,6713.58350072139,NA -"2139","String 2138",2138,6716.72509337498,NA -"2140","String 2139",2139,6719.86668602857,NA -"2141","String 2140",2140,6723.00827868216,NA -"2142","String 2141",2141,6726.14987133575,NA -"2143","String 2142",2142,6729.29146398934,NA -"2144","String 2143",2143,6732.43305664293,NA -"2145","String 2144",2144,6735.57464929652,NA -"2146","String 2145",2145,6738.71624195011,NA -"2147","String 2146",2146,6741.8578346037,NA -"2148","String 2147",2147,6744.99942725729,NA -"2149","String 2148",2148,6748.14101991088,NA -"2150","String 2149",2149,6751.28261256447,NA -"2151","String 2150",2150,6754.42420521806,NA -"2152","String 2151",2151,6757.56579787165,NA -"2153","String 2152",2152,6760.70739052523,NA -"2154","String 2153",2153,6763.84898317882,NA -"2155","String 2154",2154,6766.99057583241,NA -"2156","String 2155",2155,6770.132168486,NA -"2157","String 2156",2156,6773.27376113959,NA -"2158","String 2157",2157,6776.41535379318,NA -"2159","String 2158",2158,6779.55694644677,NA -"2160","String 2159",2159,6782.69853910036,NA -"2161","String 2160",2160,6785.84013175395,NA -"2162","String 2161",2161,6788.98172440754,NA -"2163","String 2162",2162,6792.12331706113,NA -"2164","String 2163",2163,6795.26490971472,NA -"2165","String 2164",2164,6798.40650236831,NA -"2166","String 2165",2165,6801.5480950219,NA -"2167","String 2166",2166,6804.68968767549,NA -"2168","String 2167",2167,6807.83128032908,NA -"2169","String 2168",2168,6810.97287298267,NA -"2170","String 2169",2169,6814.11446563626,NA -"2171","String 2170",2170,6817.25605828985,NA -"2172","String 2171",2171,6820.39765094344,NA -"2173","String 2172",2172,6823.53924359703,NA -"2174","String 2173",2173,6826.68083625062,NA -"2175","String 2174",2174,6829.82242890421,NA -"2176","String 2175",2175,6832.9640215578,NA -"2177","String 2176",2176,6836.10561421139,NA -"2178","String 2177",2177,6839.24720686498,NA -"2179","String 2178",2178,6842.38879951857,NA -"2180","String 2179",2179,6845.53039217216,NA -"2181","String 2180",2180,6848.67198482575,NA -"2182","String 2181",2181,6851.81357747934,NA -"2183","String 2182",2182,6854.95517013293,NA -"2184","String 2183",2183,6858.09676278652,NA -"2185","String 2184",2184,6861.23835544011,NA -"2186","String 2185",2185,6864.3799480937,NA -"2187","String 2186",2186,6867.52154074729,NA -"2188","String 2187",2187,6870.66313340088,NA -"2189","String 2188",2188,6873.80472605447,NA -"2190","String 2189",2189,6876.94631870806,NA -"2191","String 2190",2190,6880.08791136165,NA -"2192","String 2191",2191,6883.22950401524,NA -"2193","String 2192",2192,6886.37109666883,NA -"2194","String 2193",2193,6889.51268932242,NA -"2195","String 2194",2194,6892.65428197601,NA -"2196","String 2195",2195,6895.7958746296,NA -"2197","String 2196",2196,6898.93746728319,NA -"2198","String 2197",2197,6902.07905993678,NA -"2199","String 2198",2198,6905.22065259037,NA -"2200","String 2199",2199,6908.36224524395,NA -"2201","String 2200",2200,6911.50383789755,NA -"2202","String 2201",2201,6914.64543055113,NA -"2203","String 2202",2202,6917.78702320472,NA -"2204","String 2203",2203,6920.92861585831,NA -"2205","String 2204",2204,6924.0702085119,NA -"2206","String 2205",2205,6927.21180116549,NA -"2207","String 2206",2206,6930.35339381908,NA -"2208","String 2207",2207,6933.49498647267,NA -"2209","String 2208",2208,6936.63657912626,NA -"2210","String 2209",2209,6939.77817177985,NA -"2211","String 2210",2210,6942.91976443344,NA -"2212","String 2211",2211,6946.06135708703,NA -"2213","String 2212",2212,6949.20294974062,NA -"2214","String 2213",2213,6952.34454239421,NA -"2215","String 2214",2214,6955.4861350478,NA -"2216","String 2215",2215,6958.62772770139,NA -"2217","String 2216",2216,6961.76932035498,NA -"2218","String 2217",2217,6964.91091300857,NA -"2219","String 2218",2218,6968.05250566216,NA -"2220","String 2219",2219,6971.19409831575,NA -"2221","String 2220",2220,6974.33569096934,NA -"2222","String 2221",2221,6977.47728362293,NA -"2223","String 2222",2222,6980.61887627652,NA -"2224","String 2223",2223,6983.76046893011,NA -"2225","String 2224",2224,6986.9020615837,NA -"2226","String 2225",2225,6990.04365423729,NA -"2227","String 2226",2226,6993.18524689088,NA -"2228","String 2227",2227,6996.32683954447,NA -"2229","String 2228",2228,6999.46843219806,NA -"2230","String 2229",2229,7002.61002485165,NA -"2231","String 2230",2230,7005.75161750524,NA -"2232","String 2231",2231,7008.89321015883,NA -"2233","String 2232",2232,7012.03480281242,NA -"2234","String 2233",2233,7015.17639546601,NA -"2235","String 2234",2234,7018.3179881196,NA -"2236","String 2235",2235,7021.45958077319,NA -"2237","String 2236",2236,7024.60117342678,NA -"2238","String 2237",2237,7027.74276608037,NA -"2239","String 2238",2238,7030.88435873396,NA -"2240","String 2239",2239,7034.02595138755,NA -"2241","String 2240",2240,7037.16754404114,NA -"2242","String 2241",2241,7040.30913669473,NA -"2243","String 2242",2242,7043.45072934832,NA -"2244","String 2243",2243,7046.59232200191,NA -"2245","String 2244",2244,7049.7339146555,NA -"2246","String 2245",2245,7052.87550730909,NA -"2247","String 2246",2246,7056.01709996268,NA -"2248","String 2247",2247,7059.15869261627,NA -"2249","String 2248",2248,7062.30028526985,NA -"2250","String 2249",2249,7065.44187792344,NA -"2251","String 2250",2250,7068.58347057703,NA -"2252","String 2251",2251,7071.72506323062,NA -"2253","String 2252",2252,7074.86665588421,NA -"2254","String 2253",2253,7078.0082485378,NA -"2255","String 2254",2254,7081.14984119139,NA -"2256","String 2255",2255,7084.29143384498,NA -"2257","String 2256",2256,7087.43302649857,NA -"2258","String 2257",2257,7090.57461915216,NA -"2259","String 2258",2258,7093.71621180575,NA -"2260","String 2259",2259,7096.85780445934,NA -"2261","String 2260",2260,7099.99939711293,NA -"2262","String 2261",2261,7103.14098976652,NA -"2263","String 2262",2262,7106.28258242011,NA -"2264","String 2263",2263,7109.4241750737,NA -"2265","String 2264",2264,7112.56576772729,NA -"2266","String 2265",2265,7115.70736038088,NA -"2267","String 2266",2266,7118.84895303447,NA -"2268","String 2267",2267,7121.99054568806,NA -"2269","String 2268",2268,7125.13213834165,NA -"2270","String 2269",2269,7128.27373099524,NA -"2271","String 2270",2270,7131.41532364883,NA -"2272","String 2271",2271,7134.55691630242,NA -"2273","String 2272",2272,7137.69850895601,NA -"2274","String 2273",2273,7140.8401016096,NA -"2275","String 2274",2274,7143.98169426319,NA -"2276","String 2275",2275,7147.12328691678,NA -"2277","String 2276",2276,7150.26487957037,NA -"2278","String 2277",2277,7153.40647222396,NA -"2279","String 2278",2278,7156.54806487755,NA -"2280","String 2279",2279,7159.68965753114,NA -"2281","String 2280",2280,7162.83125018473,NA -"2282","String 2281",2281,7165.97284283832,NA -"2283","String 2282",2282,7169.11443549191,NA -"2284","String 2283",2283,7172.2560281455,NA -"2285","String 2284",2284,7175.39762079909,NA -"2286","String 2285",2285,7178.53921345268,NA -"2287","String 2286",2286,7181.68080610627,NA -"2288","String 2287",2287,7184.82239875986,NA -"2289","String 2288",2288,7187.96399141345,NA -"2290","String 2289",2289,7191.10558406704,NA -"2291","String 2290",2290,7194.24717672063,NA -"2292","String 2291",2291,7197.38876937422,NA -"2293","String 2292",2292,7200.53036202781,NA -"2294","String 2293",2293,7203.6719546814,NA -"2295","String 2294",2294,7206.81354733499,NA -"2296","String 2295",2295,7209.95513998857,NA -"2297","String 2296",2296,7213.09673264217,NA -"2298","String 2297",2297,7216.23832529576,NA -"2299","String 2298",2298,7219.37991794934,NA -"2300","String 2299",2299,7222.52151060293,NA -"2301","String 2300",2300,7225.66310325652,NA -"2302","String 2301",2301,7228.80469591011,NA -"2303","String 2302",2302,7231.9462885637,NA -"2304","String 2303",2303,7235.08788121729,NA -"2305","String 2304",2304,7238.22947387088,NA -"2306","String 2305",2305,7241.37106652447,NA -"2307","String 2306",2306,7244.51265917806,NA -"2308","String 2307",2307,7247.65425183165,NA -"2309","String 2308",2308,7250.79584448524,NA -"2310","String 2309",2309,7253.93743713883,NA -"2311","String 2310",2310,7257.07902979242,NA -"2312","String 2311",2311,7260.22062244601,NA -"2313","String 2312",2312,7263.3622150996,NA -"2314","String 2313",2313,7266.50380775319,NA -"2315","String 2314",2314,7269.64540040678,NA -"2316","String 2315",2315,7272.78699306037,NA -"2317","String 2316",2316,7275.92858571396,NA -"2318","String 2317",2317,7279.07017836755,NA -"2319","String 2318",2318,7282.21177102114,NA -"2320","String 2319",2319,7285.35336367473,NA -"2321","String 2320",2320,7288.49495632832,NA -"2322","String 2321",2321,7291.63654898191,NA -"2323","String 2322",2322,7294.7781416355,NA -"2324","String 2323",2323,7297.91973428909,NA -"2325","String 2324",2324,7301.06132694268,NA -"2326","String 2325",2325,7304.20291959627,NA -"2327","String 2326",2326,7307.34451224986,NA -"2328","String 2327",2327,7310.48610490345,NA -"2329","String 2328",2328,7313.62769755704,NA -"2330","String 2329",2329,7316.76929021063,NA -"2331","String 2330",2330,7319.91088286422,NA -"2332","String 2331",2331,7323.05247551781,NA -"2333","String 2332",2332,7326.1940681714,NA -"2334","String 2333",2333,7329.33566082499,NA -"2335","String 2334",2334,7332.47725347858,NA -"2336","String 2335",2335,7335.61884613217,NA -"2337","String 2336",2336,7338.76043878576,NA -"2338","String 2337",2337,7341.90203143935,NA -"2339","String 2338",2338,7345.04362409294,NA -"2340","String 2339",2339,7348.18521674653,NA -"2341","String 2340",2340,7351.32680940012,NA -"2342","String 2341",2341,7354.46840205371,NA -"2343","String 2342",2342,7357.6099947073,NA -"2344","String 2343",2343,7360.75158736089,NA -"2345","String 2344",2344,7363.89318001447,NA -"2346","String 2345",2345,7367.03477266806,NA -"2347","String 2346",2346,7370.17636532165,NA -"2348","String 2347",2347,7373.31795797524,NA -"2349","String 2348",2348,7376.45955062883,NA -"2350","String 2349",2349,7379.60114328242,NA -"2351","String 2350",2350,7382.74273593601,NA -"2352","String 2351",2351,7385.8843285896,NA -"2353","String 2352",2352,7389.02592124319,NA -"2354","String 2353",2353,7392.16751389678,NA -"2355","String 2354",2354,7395.30910655037,NA -"2356","String 2355",2355,7398.45069920396,NA -"2357","String 2356",2356,7401.59229185755,NA -"2358","String 2357",2357,7404.73388451114,NA -"2359","String 2358",2358,7407.87547716473,NA -"2360","String 2359",2359,7411.01706981832,NA -"2361","String 2360",2360,7414.15866247191,NA -"2362","String 2361",2361,7417.3002551255,NA -"2363","String 2362",2362,7420.44184777909,NA -"2364","String 2363",2363,7423.58344043268,NA -"2365","String 2364",2364,7426.72503308627,NA -"2366","String 2365",2365,7429.86662573986,NA -"2367","String 2366",2366,7433.00821839345,NA -"2368","String 2367",2367,7436.14981104704,NA -"2369","String 2368",2368,7439.29140370063,NA -"2370","String 2369",2369,7442.43299635422,NA -"2371","String 2370",2370,7445.57458900781,NA -"2372","String 2371",2371,7448.7161816614,NA -"2373","String 2372",2372,7451.85777431499,NA -"2374","String 2373",2373,7454.99936696858,NA -"2375","String 2374",2374,7458.14095962217,NA -"2376","String 2375",2375,7461.28255227576,NA -"2377","String 2376",2376,7464.42414492935,NA -"2378","String 2377",2377,7467.56573758294,NA -"2379","String 2378",2378,7470.70733023653,NA -"2380","String 2379",2379,7473.84892289012,NA -"2381","String 2380",2380,7476.99051554371,NA -"2382","String 2381",2381,7480.1321081973,NA -"2383","String 2382",2382,7483.27370085089,NA -"2384","String 2383",2383,7486.41529350448,NA -"2385","String 2384",2384,7489.55688615807,NA -"2386","String 2385",2385,7492.69847881166,NA -"2387","String 2386",2386,7495.84007146525,NA -"2388","String 2387",2387,7498.98166411884,NA -"2389","String 2388",2388,7502.12325677243,NA -"2390","String 2389",2389,7505.26484942602,NA -"2391","String 2390",2390,7508.40644207961,NA -"2392","String 2391",2391,7511.54803473319,NA -"2393","String 2392",2392,7514.68962738679,NA -"2394","String 2393",2393,7517.83122004038,NA -"2395","String 2394",2394,7520.97281269396,NA -"2396","String 2395",2395,7524.11440534755,NA -"2397","String 2396",2396,7527.25599800114,NA -"2398","String 2397",2397,7530.39759065473,NA -"2399","String 2398",2398,7533.53918330832,NA -"2400","String 2399",2399,7536.68077596191,NA -"2401","String 2400",2400,7539.8223686155,NA -"2402","String 2401",2401,7542.96396126909,NA -"2403","String 2402",2402,7546.10555392268,NA -"2404","String 2403",2403,7549.24714657627,NA -"2405","String 2404",2404,7552.38873922986,NA -"2406","String 2405",2405,7555.53033188345,NA -"2407","String 2406",2406,7558.67192453704,NA -"2408","String 2407",2407,7561.81351719063,NA -"2409","String 2408",2408,7564.95510984422,NA -"2410","String 2409",2409,7568.09670249781,NA -"2411","String 2410",2410,7571.2382951514,NA -"2412","String 2411",2411,7574.37988780499,NA -"2413","String 2412",2412,7577.52148045858,NA -"2414","String 2413",2413,7580.66307311217,NA -"2415","String 2414",2414,7583.80466576576,NA -"2416","String 2415",2415,7586.94625841935,NA -"2417","String 2416",2416,7590.08785107294,NA -"2418","String 2417",2417,7593.22944372653,NA -"2419","String 2418",2418,7596.37103638012,NA -"2420","String 2419",2419,7599.51262903371,NA -"2421","String 2420",2420,7602.6542216873,NA -"2422","String 2421",2421,7605.79581434089,NA -"2423","String 2422",2422,7608.93740699448,NA -"2424","String 2423",2423,7612.07899964807,NA -"2425","String 2424",2424,7615.22059230166,NA -"2426","String 2425",2425,7618.36218495525,NA -"2427","String 2426",2426,7621.50377760884,NA -"2428","String 2427",2427,7624.64537026243,NA -"2429","String 2428",2428,7627.78696291602,NA -"2430","String 2429",2429,7630.92855556961,NA -"2431","String 2430",2430,7634.0701482232,NA -"2432","String 2431",2431,7637.21174087679,NA -"2433","String 2432",2432,7640.35333353038,NA -"2434","String 2433",2433,7643.49492618397,NA -"2435","String 2434",2434,7646.63651883756,NA -"2436","String 2435",2435,7649.77811149115,NA -"2437","String 2436",2436,7652.91970414474,NA -"2438","String 2437",2437,7656.06129679833,NA -"2439","String 2438",2438,7659.20288945192,NA -"2440","String 2439",2439,7662.34448210551,NA -"2441","String 2440",2440,7665.4860747591,NA -"2442","String 2441",2441,7668.62766741268,NA -"2443","String 2442",2442,7671.76926006627,NA -"2444","String 2443",2443,7674.91085271987,NA -"2445","String 2444",2444,7678.05244537345,NA -"2446","String 2445",2445,7681.19403802704,NA -"2447","String 2446",2446,7684.33563068063,NA -"2448","String 2447",2447,7687.47722333422,NA -"2449","String 2448",2448,7690.61881598781,NA -"2450","String 2449",2449,7693.7604086414,NA -"2451","String 2450",2450,7696.90200129499,NA -"2452","String 2451",2451,7700.04359394858,NA -"2453","String 2452",2452,7703.18518660217,NA -"2454","String 2453",2453,7706.32677925576,NA -"2455","String 2454",2454,7709.46837190935,NA -"2456","String 2455",2455,7712.60996456294,NA -"2457","String 2456",2456,7715.75155721653,NA -"2458","String 2457",2457,7718.89314987012,NA -"2459","String 2458",2458,7722.03474252371,NA -"2460","String 2459",2459,7725.1763351773,NA -"2461","String 2460",2460,7728.31792783089,NA -"2462","String 2461",2461,7731.45952048448,NA -"2463","String 2462",2462,7734.60111313807,NA -"2464","String 2463",2463,7737.74270579166,NA -"2465","String 2464",2464,7740.88429844525,NA -"2466","String 2465",2465,7744.02589109884,NA -"2467","String 2466",2466,7747.16748375243,NA -"2468","String 2467",2467,7750.30907640602,NA -"2469","String 2468",2468,7753.45066905961,NA -"2470","String 2469",2469,7756.5922617132,NA -"2471","String 2470",2470,7759.73385436679,NA -"2472","String 2471",2471,7762.87544702038,NA -"2473","String 2472",2472,7766.01703967397,NA -"2474","String 2473",2473,7769.15863232756,NA -"2475","String 2474",2474,7772.30022498115,NA -"2476","String 2475",2475,7775.44181763474,NA -"2477","String 2476",2476,7778.58341028833,NA -"2478","String 2477",2477,7781.72500294192,NA -"2479","String 2478",2478,7784.86659559551,NA -"2480","String 2479",2479,7788.0081882491,NA -"2481","String 2480",2480,7791.14978090269,NA -"2482","String 2481",2481,7794.29137355628,NA -"2483","String 2482",2482,7797.43296620987,NA -"2484","String 2483",2483,7800.57455886346,NA -"2485","String 2484",2484,7803.71615151705,NA -"2486","String 2485",2485,7806.85774417064,NA -"2487","String 2486",2486,7809.99933682423,NA -"2488","String 2487",2487,7813.14092947782,NA -"2489","String 2488",2488,7816.28252213141,NA -"2490","String 2489",2489,7819.424114785,NA -"2491","String 2490",2490,7822.56570743858,NA -"2492","String 2491",2491,7825.70730009217,NA -"2493","String 2492",2492,7828.84889274576,NA -"2494","String 2493",2493,7831.99048539935,NA -"2495","String 2494",2494,7835.13207805294,NA -"2496","String 2495",2495,7838.27367070653,NA -"2497","String 2496",2496,7841.41526336012,NA -"2498","String 2497",2497,7844.55685601371,NA -"2499","String 2498",2498,7847.6984486673,NA -"2500","String 2499",2499,7850.84004132089,NA -"2501","String 2500",2500,7853.98163397448,NA -"2502","String 2501",2501,7857.12322662807,NA -"2503","String 2502",2502,7860.26481928166,NA -"2504","String 2503",2503,7863.40641193525,NA -"2505","String 2504",2504,7866.54800458884,NA -"2506","String 2505",2505,7869.68959724243,NA -"2507","String 2506",2506,7872.83118989602,NA -"2508","String 2507",2507,7875.97278254961,NA -"2509","String 2508",2508,7879.1143752032,NA -"2510","String 2509",2509,7882.25596785679,NA -"2511","String 2510",2510,7885.39756051038,NA -"2512","String 2511",2511,7888.53915316397,NA -"2513","String 2512",2512,7891.68074581756,NA -"2514","String 2513",2513,7894.82233847115,NA -"2515","String 2514",2514,7897.96393112474,NA -"2516","String 2515",2515,7901.10552377833,NA -"2517","String 2516",2516,7904.24711643192,NA -"2518","String 2517",2517,7907.38870908551,NA -"2519","String 2518",2518,7910.5303017391,NA -"2520","String 2519",2519,7913.67189439269,NA -"2521","String 2520",2520,7916.81348704628,NA -"2522","String 2521",2521,7919.95507969987,NA -"2523","String 2522",2522,7923.09667235346,NA -"2524","String 2523",2523,7926.23826500705,NA -"2525","String 2524",2524,7929.37985766064,NA -"2526","String 2525",2525,7932.52145031423,NA -"2527","String 2526",2526,7935.66304296782,NA -"2528","String 2527",2527,7938.80463562141,NA -"2529","String 2528",2528,7941.946228275,NA -"2530","String 2529",2529,7945.08782092859,NA -"2531","String 2530",2530,7948.22941358218,NA -"2532","String 2531",2531,7951.37100623577,NA -"2533","String 2532",2532,7954.51259888936,NA -"2534","String 2533",2533,7957.65419154295,NA -"2535","String 2534",2534,7960.79578419654,NA -"2536","String 2535",2535,7963.93737685013,NA -"2537","String 2536",2536,7967.07896950372,NA -"2538","String 2537",2537,7970.2205621573,NA -"2539","String 2538",2538,7973.36215481089,NA -"2540","String 2539",2539,7976.50374746449,NA -"2541","String 2540",2540,7979.64534011807,NA -"2542","String 2541",2541,7982.78693277166,NA -"2543","String 2542",2542,7985.92852542525,NA -"2544","String 2543",2543,7989.07011807884,NA -"2545","String 2544",2544,7992.21171073243,NA -"2546","String 2545",2545,7995.35330338602,NA -"2547","String 2546",2546,7998.49489603961,NA -"2548","String 2547",2547,8001.6364886932,NA -"2549","String 2548",2548,8004.77808134679,NA -"2550","String 2549",2549,8007.91967400038,NA -"2551","String 2550",2550,8011.06126665397,NA -"2552","String 2551",2551,8014.20285930756,NA -"2553","String 2552",2552,8017.34445196115,NA -"2554","String 2553",2553,8020.48604461474,NA -"2555","String 2554",2554,8023.62763726833,NA -"2556","String 2555",2555,8026.76922992192,NA -"2557","String 2556",2556,8029.91082257551,NA -"2558","String 2557",2557,8033.0524152291,NA -"2559","String 2558",2558,8036.19400788269,NA -"2560","String 2559",2559,8039.33560053628,NA -"2561","String 2560",2560,8042.47719318987,NA -"2562","String 2561",2561,8045.61878584346,NA -"2563","String 2562",2562,8048.76037849705,NA -"2564","String 2563",2563,8051.90197115064,NA -"2565","String 2564",2564,8055.04356380423,NA -"2566","String 2565",2565,8058.18515645782,NA -"2567","String 2566",2566,8061.32674911141,NA -"2568","String 2567",2567,8064.468341765,NA -"2569","String 2568",2568,8067.60993441859,NA -"2570","String 2569",2569,8070.75152707218,NA -"2571","String 2570",2570,8073.89311972577,NA -"2572","String 2571",2571,8077.03471237936,NA -"2573","String 2572",2572,8080.17630503295,NA -"2574","String 2573",2573,8083.31789768654,NA -"2575","String 2574",2574,8086.45949034013,NA -"2576","String 2575",2575,8089.60108299372,NA -"2577","String 2576",2576,8092.74267564731,NA -"2578","String 2577",2577,8095.8842683009,NA -"2579","String 2578",2578,8099.02586095449,NA -"2580","String 2579",2579,8102.16745360808,NA -"2581","String 2580",2580,8105.30904626167,NA -"2582","String 2581",2581,8108.45063891526,NA -"2583","String 2582",2582,8111.59223156885,NA -"2584","String 2583",2583,8114.73382422244,NA -"2585","String 2584",2584,8117.87541687603,NA -"2586","String 2585",2585,8121.01700952962,NA -"2587","String 2586",2586,8124.15860218321,NA -"2588","String 2587",2587,8127.30019483679,NA -"2589","String 2588",2588,8130.44178749038,NA -"2590","String 2589",2589,8133.58338014397,NA -"2591","String 2590",2590,8136.72497279756,NA -"2592","String 2591",2591,8139.86656545115,NA -"2593","String 2592",2592,8143.00815810474,NA -"2594","String 2593",2593,8146.14975075833,NA -"2595","String 2594",2594,8149.29134341192,NA -"2596","String 2595",2595,8152.43293606551,NA -"2597","String 2596",2596,8155.5745287191,NA -"2598","String 2597",2597,8158.71612137269,NA -"2599","String 2598",2598,8161.85771402628,NA -"2600","String 2599",2599,8164.99930667987,NA -"2601","String 2600",2600,8168.14089933346,NA -"2602","String 2601",2601,8171.28249198705,NA -"2603","String 2602",2602,8174.42408464064,NA -"2604","String 2603",2603,8177.56567729423,NA -"2605","String 2604",2604,8180.70726994782,NA -"2606","String 2605",2605,8183.84886260141,NA -"2607","String 2606",2606,8186.990455255,NA -"2608","String 2607",2607,8190.13204790859,NA -"2609","String 2608",2608,8193.27364056218,NA -"2610","String 2609",2609,8196.41523321577,NA -"2611","String 2610",2610,8199.55682586936,NA -"2612","String 2611",2611,8202.69841852295,NA -"2613","String 2612",2612,8205.84001117654,NA -"2614","String 2613",2613,8208.98160383013,NA -"2615","String 2614",2614,8212.12319648372,NA -"2616","String 2615",2615,8215.26478913731,NA -"2617","String 2616",2616,8218.4063817909,NA -"2618","String 2617",2617,8221.54797444449,NA -"2619","String 2618",2618,8224.68956709808,NA -"2620","String 2619",2619,8227.83115975167,NA -"2621","String 2620",2620,8230.97275240526,NA -"2622","String 2621",2621,8234.11434505885,NA -"2623","String 2622",2622,8237.25593771244,NA -"2624","String 2623",2623,8240.39753036603,NA -"2625","String 2624",2624,8243.53912301962,NA -"2626","String 2625",2625,8246.68071567321,NA -"2627","String 2626",2626,8249.8223083268,NA -"2628","String 2627",2627,8252.96390098039,NA -"2629","String 2628",2628,8256.10549363398,NA -"2630","String 2629",2629,8259.24708628757,NA -"2631","String 2630",2630,8262.38867894116,NA -"2632","String 2631",2631,8265.53027159475,NA -"2633","String 2632",2632,8268.67186424834,NA -"2634","String 2633",2633,8271.81345690193,NA -"2635","String 2634",2634,8274.95504955552,NA -"2636","String 2635",2635,8278.0966422091,NA -"2637","String 2636",2636,8281.23823486269,NA -"2638","String 2637",2637,8284.37982751628,NA -"2639","String 2638",2638,8287.52142016987,NA -"2640","String 2639",2639,8290.66301282346,NA -"2641","String 2640",2640,8293.80460547705,NA -"2642","String 2641",2641,8296.94619813064,NA -"2643","String 2642",2642,8300.08779078423,NA -"2644","String 2643",2643,8303.22938343782,NA -"2645","String 2644",2644,8306.37097609141,NA -"2646","String 2645",2645,8309.512568745,NA -"2647","String 2646",2646,8312.65416139859,NA -"2648","String 2647",2647,8315.79575405218,NA -"2649","String 2648",2648,8318.93734670577,NA -"2650","String 2649",2649,8322.07893935936,NA -"2651","String 2650",2650,8325.22053201295,NA -"2652","String 2651",2651,8328.36212466654,NA -"2653","String 2652",2652,8331.50371732013,NA -"2654","String 2653",2653,8334.64530997372,NA -"2655","String 2654",2654,8337.78690262731,NA -"2656","String 2655",2655,8340.9284952809,NA -"2657","String 2656",2656,8344.07008793449,NA -"2658","String 2657",2657,8347.21168058808,NA -"2659","String 2658",2658,8350.35327324167,NA -"2660","String 2659",2659,8353.49486589526,NA -"2661","String 2660",2660,8356.63645854885,NA -"2662","String 2661",2661,8359.77805120244,NA -"2663","String 2662",2662,8362.91964385603,NA -"2664","String 2663",2663,8366.06123650962,NA -"2665","String 2664",2664,8369.20282916321,NA -"2666","String 2665",2665,8372.3444218168,NA -"2667","String 2666",2666,8375.48601447039,NA -"2668","String 2667",2667,8378.62760712398,NA -"2669","String 2668",2668,8381.76919977757,NA -"2670","String 2669",2669,8384.91079243116,NA -"2671","String 2670",2670,8388.05238508475,NA -"2672","String 2671",2671,8391.19397773834,NA -"2673","String 2672",2672,8394.33557039193,NA -"2674","String 2673",2673,8397.47716304552,NA -"2675","String 2674",2674,8400.61875569911,NA -"2676","String 2675",2675,8403.7603483527,NA -"2677","String 2676",2676,8406.90194100629,NA -"2678","String 2677",2677,8410.04353365988,NA -"2679","String 2678",2678,8413.18512631347,NA -"2680","String 2679",2679,8416.32671896706,NA -"2681","String 2680",2680,8419.46831162065,NA -"2682","String 2681",2681,8422.60990427424,NA -"2683","String 2682",2682,8425.75149692783,NA -"2684","String 2683",2683,8428.89308958142,NA -"2685","String 2684",2684,8432.034682235,NA -"2686","String 2685",2685,8435.17627488859,NA -"2687","String 2686",2686,8438.31786754218,NA -"2688","String 2687",2687,8441.45946019577,NA -"2689","String 2688",2688,8444.60105284936,NA -"2690","String 2689",2689,8447.74264550295,NA -"2691","String 2690",2690,8450.88423815654,NA -"2692","String 2691",2691,8454.02583081013,NA -"2693","String 2692",2692,8457.16742346372,NA -"2694","String 2693",2693,8460.30901611731,NA -"2695","String 2694",2694,8463.4506087709,NA -"2696","String 2695",2695,8466.59220142449,NA -"2697","String 2696",2696,8469.73379407808,NA -"2698","String 2697",2697,8472.87538673167,NA -"2699","String 2698",2698,8476.01697938526,NA -"2700","String 2699",2699,8479.15857203885,NA -"2701","String 2700",2700,8482.30016469244,NA -"2702","String 2701",2701,8485.44175734603,NA -"2703","String 2702",2702,8488.58334999962,NA -"2704","String 2703",2703,8491.72494265321,NA -"2705","String 2704",2704,8494.8665353068,NA -"2706","String 2705",2705,8498.00812796039,NA -"2707","String 2706",2706,8501.14972061398,NA -"2708","String 2707",2707,8504.29131326757,NA -"2709","String 2708",2708,8507.43290592116,NA -"2710","String 2709",2709,8510.57449857475,NA -"2711","String 2710",2710,8513.71609122834,NA -"2712","String 2711",2711,8516.85768388193,NA -"2713","String 2712",2712,8519.99927653552,NA -"2714","String 2713",2713,8523.14086918911,NA -"2715","String 2714",2714,8526.2824618427,NA -"2716","String 2715",2715,8529.42405449629,NA -"2717","String 2716",2716,8532.56564714988,NA -"2718","String 2717",2717,8535.70723980347,NA -"2719","String 2718",2718,8538.84883245706,NA -"2720","String 2719",2719,8541.99042511065,NA -"2721","String 2720",2720,8545.13201776424,NA -"2722","String 2721",2721,8548.27361041783,NA -"2723","String 2722",2722,8551.41520307142,NA -"2724","String 2723",2723,8554.55679572501,NA -"2725","String 2724",2724,8557.6983883786,NA -"2726","String 2725",2725,8560.83998103219,NA -"2727","String 2726",2726,8563.98157368578,NA -"2728","String 2727",2727,8567.12316633937,NA -"2729","String 2728",2728,8570.26475899295,NA -"2730","String 2729",2729,8573.40635164654,NA -"2731","String 2730",2730,8576.54794430013,NA -"2732","String 2731",2731,8579.68953695373,NA -"2733","String 2732",2732,8582.83112960732,NA -"2734","String 2733",2733,8585.97272226091,NA -"2735","String 2734",2734,8589.11431491449,NA -"2736","String 2735",2735,8592.25590756808,NA -"2737","String 2736",2736,8595.39750022167,NA -"2738","String 2737",2737,8598.53909287526,NA -"2739","String 2738",2738,8601.68068552885,NA -"2740","String 2739",2739,8604.82227818244,NA -"2741","String 2740",2740,8607.96387083603,NA -"2742","String 2741",2741,8611.10546348962,NA -"2743","String 2742",2742,8614.24705614321,NA -"2744","String 2743",2743,8617.3886487968,NA -"2745","String 2744",2744,8620.53024145039,NA -"2746","String 2745",2745,8623.67183410398,NA -"2747","String 2746",2746,8626.81342675757,NA -"2748","String 2747",2747,8629.95501941116,NA -"2749","String 2748",2748,8633.09661206475,NA -"2750","String 2749",2749,8636.23820471834,NA -"2751","String 2750",2750,8639.37979737193,NA -"2752","String 2751",2751,8642.52139002552,NA -"2753","String 2752",2752,8645.66298267911,NA -"2754","String 2753",2753,8648.8045753327,NA -"2755","String 2754",2754,8651.94616798629,NA -"2756","String 2755",2755,8655.08776063988,NA -"2757","String 2756",2756,8658.22935329347,NA -"2758","String 2757",2757,8661.37094594706,NA -"2759","String 2758",2758,8664.51253860065,NA -"2760","String 2759",2759,8667.65413125424,NA -"2761","String 2760",2760,8670.79572390783,NA -"2762","String 2761",2761,8673.93731656142,NA -"2763","String 2762",2762,8677.07890921501,NA -"2764","String 2763",2763,8680.2205018686,NA -"2765","String 2764",2764,8683.36209452219,NA -"2766","String 2765",2765,8686.50368717578,NA -"2767","String 2766",2766,8689.64527982937,NA -"2768","String 2767",2767,8692.78687248296,NA -"2769","String 2768",2768,8695.92846513655,NA -"2770","String 2769",2769,8699.07005779014,NA -"2771","String 2770",2770,8702.21165044373,NA -"2772","String 2771",2771,8705.35324309732,NA -"2773","String 2772",2772,8708.49483575091,NA -"2774","String 2773",2773,8711.6364284045,NA -"2775","String 2774",2774,8714.77802105809,NA -"2776","String 2775",2775,8717.91961371168,NA -"2777","String 2776",2776,8721.06120636527,NA -"2778","String 2777",2777,8724.20279901886,NA -"2779","String 2778",2778,8727.34439167244,NA -"2780","String 2779",2779,8730.48598432603,NA -"2781","String 2780",2780,8733.62757697962,NA -"2782","String 2781",2781,8736.76916963321,NA -"2783","String 2782",2782,8739.91076228681,NA -"2784","String 2783",2783,8743.05235494039,NA -"2785","String 2784",2784,8746.19394759398,NA -"2786","String 2785",2785,8749.33554024757,NA -"2787","String 2786",2786,8752.47713290116,NA -"2788","String 2787",2787,8755.61872555475,NA -"2789","String 2788",2788,8758.76031820834,NA -"2790","String 2789",2789,8761.90191086193,NA -"2791","String 2790",2790,8765.04350351552,NA -"2792","String 2791",2791,8768.18509616911,NA -"2793","String 2792",2792,8771.3266888227,NA -"2794","String 2793",2793,8774.46828147629,NA -"2795","String 2794",2794,8777.60987412988,NA -"2796","String 2795",2795,8780.75146678347,NA -"2797","String 2796",2796,8783.89305943706,NA -"2798","String 2797",2797,8787.03465209065,NA -"2799","String 2798",2798,8790.17624474424,NA -"2800","String 2799",2799,8793.31783739783,NA -"2801","String 2800",2800,8796.45943005142,NA -"2802","String 2801",2801,8799.60102270501,NA -"2803","String 2802",2802,8802.7426153586,NA -"2804","String 2803",2803,8805.88420801219,NA -"2805","String 2804",2804,8809.02580066578,NA -"2806","String 2805",2805,8812.16739331937,NA -"2807","String 2806",2806,8815.30898597296,NA -"2808","String 2807",2807,8818.45057862655,NA -"2809","String 2808",2808,8821.59217128014,NA -"2810","String 2809",2809,8824.73376393373,NA -"2811","String 2810",2810,8827.87535658732,NA -"2812","String 2811",2811,8831.01694924091,NA -"2813","String 2812",2812,8834.1585418945,NA -"2814","String 2813",2813,8837.30013454809,NA -"2815","String 2814",2814,8840.44172720168,NA -"2816","String 2815",2815,8843.58331985527,NA -"2817","String 2816",2816,8846.72491250886,NA -"2818","String 2817",2817,8849.86650516245,NA -"2819","String 2818",2818,8853.00809781604,NA -"2820","String 2819",2819,8856.14969046963,NA -"2821","String 2820",2820,8859.29128312322,NA -"2822","String 2821",2821,8862.43287577681,NA -"2823","String 2822",2822,8865.5744684304,NA -"2824","String 2823",2823,8868.71606108399,NA -"2825","String 2824",2824,8871.85765373758,NA -"2826","String 2825",2825,8874.99924639117,NA -"2827","String 2826",2826,8878.14083904476,NA -"2828","String 2827",2827,8881.28243169835,NA -"2829","String 2828",2828,8884.42402435193,NA -"2830","String 2829",2829,8887.56561700552,NA -"2831","String 2830",2830,8890.70720965911,NA -"2832","String 2831",2831,8893.8488023127,NA -"2833","String 2832",2832,8896.99039496629,NA -"2834","String 2833",2833,8900.13198761988,NA -"2835","String 2834",2834,8903.27358027347,NA -"2836","String 2835",2835,8906.41517292706,NA -"2837","String 2836",2836,8909.55676558065,NA -"2838","String 2837",2837,8912.69835823424,NA -"2839","String 2838",2838,8915.83995088783,NA -"2840","String 2839",2839,8918.98154354142,NA -"2841","String 2840",2840,8922.12313619501,NA -"2842","String 2841",2841,8925.2647288486,NA -"2843","String 2842",2842,8928.40632150219,NA -"2844","String 2843",2843,8931.54791415578,NA -"2845","String 2844",2844,8934.68950680937,NA -"2846","String 2845",2845,8937.83109946296,NA -"2847","String 2846",2846,8940.97269211655,NA -"2848","String 2847",2847,8944.11428477014,NA -"2849","String 2848",2848,8947.25587742373,NA -"2850","String 2849",2849,8950.39747007732,NA -"2851","String 2850",2850,8953.53906273091,NA -"2852","String 2851",2851,8956.6806553845,NA -"2853","String 2852",2852,8959.82224803809,NA -"2854","String 2853",2853,8962.96384069168,NA -"2855","String 2854",2854,8966.10543334527,NA -"2856","String 2855",2855,8969.24702599886,NA -"2857","String 2856",2856,8972.38861865245,NA -"2858","String 2857",2857,8975.53021130604,NA -"2859","String 2858",2858,8978.67180395963,NA -"2860","String 2859",2859,8981.81339661322,NA -"2861","String 2860",2860,8984.95498926681,NA -"2862","String 2861",2861,8988.0965819204,NA -"2863","String 2862",2862,8991.23817457399,NA -"2864","String 2863",2863,8994.37976722758,NA -"2865","String 2864",2864,8997.52135988117,NA -"2866","String 2865",2865,9000.66295253476,NA -"2867","String 2866",2866,9003.80454518835,NA -"2868","String 2867",2867,9006.94613784194,NA -"2869","String 2868",2868,9010.08773049553,NA -"2870","String 2869",2869,9013.22932314912,NA -"2871","String 2870",2870,9016.37091580271,NA -"2872","String 2871",2871,9019.5125084563,NA -"2873","String 2872",2872,9022.65410110989,NA -"2874","String 2873",2873,9025.79569376348,NA -"2875","String 2874",2874,9028.93728641707,NA -"2876","String 2875",2875,9032.07887907066,NA -"2877","String 2876",2876,9035.22047172425,NA -"2878","String 2877",2877,9038.36206437783,NA -"2879","String 2878",2878,9041.50365703142,NA -"2880","String 2879",2879,9044.64524968501,NA -"2881","String 2880",2880,9047.7868423386,NA -"2882","String 2881",2881,9050.92843499219,NA -"2883","String 2882",2882,9054.07002764578,NA -"2884","String 2883",2883,9057.21162029937,NA -"2885","String 2884",2884,9060.35321295296,NA -"2886","String 2885",2885,9063.49480560655,NA -"2887","String 2886",2886,9066.63639826014,NA -"2888","String 2887",2887,9069.77799091373,NA -"2889","String 2888",2888,9072.91958356732,NA -"2890","String 2889",2889,9076.06117622091,NA -"2891","String 2890",2890,9079.2027688745,NA -"2892","String 2891",2891,9082.34436152809,NA -"2893","String 2892",2892,9085.48595418168,NA -"2894","String 2893",2893,9088.62754683527,NA -"2895","String 2894",2894,9091.76913948886,NA -"2896","String 2895",2895,9094.91073214245,NA -"2897","String 2896",2896,9098.05232479604,NA -"2898","String 2897",2897,9101.19391744963,NA -"2899","String 2898",2898,9104.33551010322,NA -"2900","String 2899",2899,9107.47710275681,NA -"2901","String 2900",2900,9110.6186954104,NA -"2902","String 2901",2901,9113.76028806399,NA -"2903","String 2902",2902,9116.90188071758,NA -"2904","String 2903",2903,9120.04347337117,NA -"2905","String 2904",2904,9123.18506602476,NA -"2906","String 2905",2905,9126.32665867835,NA -"2907","String 2906",2906,9129.46825133194,NA -"2908","String 2907",2907,9132.60984398553,NA -"2909","String 2908",2908,9135.75143663912,NA -"2910","String 2909",2909,9138.89302929271,NA -"2911","String 2910",2910,9142.0346219463,NA -"2912","String 2911",2911,9145.17621459989,NA -"2913","String 2912",2912,9148.31780725348,NA -"2914","String 2913",2913,9151.45939990707,NA -"2915","String 2914",2914,9154.60099256066,NA -"2916","String 2915",2915,9157.74258521425,NA -"2917","String 2916",2916,9160.88417786784,NA -"2918","String 2917",2917,9164.02577052143,NA -"2919","String 2918",2918,9167.16736317502,NA -"2920","String 2919",2919,9170.30895582861,NA -"2921","String 2920",2920,9173.4505484822,NA -"2922","String 2921",2921,9176.59214113578,NA -"2923","String 2922",2922,9179.73373378938,NA -"2924","String 2923",2923,9182.87532644297,NA -"2925","String 2924",2924,9186.01691909656,NA -"2926","String 2925",2925,9189.15851175015,NA -"2927","String 2926",2926,9192.30010440374,NA -"2928","String 2927",2927,9195.44169705732,NA -"2929","String 2928",2928,9198.58328971091,NA -"2930","String 2929",2929,9201.7248823645,NA -"2931","String 2930",2930,9204.86647501809,NA -"2932","String 2931",2931,9208.00806767168,NA -"2933","String 2932",2932,9211.14966032527,NA -"2934","String 2933",2933,9214.29125297886,NA -"2935","String 2934",2934,9217.43284563245,NA -"2936","String 2935",2935,9220.57443828604,NA -"2937","String 2936",2936,9223.71603093963,NA -"2938","String 2937",2937,9226.85762359322,NA -"2939","String 2938",2938,9229.99921624681,NA -"2940","String 2939",2939,9233.1408089004,NA -"2941","String 2940",2940,9236.28240155399,NA -"2942","String 2941",2941,9239.42399420758,NA -"2943","String 2942",2942,9242.56558686117,NA -"2944","String 2943",2943,9245.70717951476,NA -"2945","String 2944",2944,9248.84877216835,NA -"2946","String 2945",2945,9251.99036482194,NA -"2947","String 2946",2946,9255.13195747553,NA -"2948","String 2947",2947,9258.27355012912,NA -"2949","String 2948",2948,9261.41514278271,NA -"2950","String 2949",2949,9264.5567354363,NA -"2951","String 2950",2950,9267.69832808989,NA -"2952","String 2951",2951,9270.83992074348,NA -"2953","String 2952",2952,9273.98151339707,NA -"2954","String 2953",2953,9277.12310605066,NA -"2955","String 2954",2954,9280.26469870425,NA -"2956","String 2955",2955,9283.40629135784,NA -"2957","String 2956",2956,9286.54788401143,NA -"2958","String 2957",2957,9289.68947666502,NA -"2959","String 2958",2958,9292.83106931861,NA -"2960","String 2959",2959,9295.9726619722,NA -"2961","String 2960",2960,9299.11425462579,NA -"2962","String 2961",2961,9302.25584727938,NA -"2963","String 2962",2962,9305.39743993297,NA -"2964","String 2963",2963,9308.53903258656,NA -"2965","String 2964",2964,9311.68062524015,NA -"2966","String 2965",2965,9314.82221789374,NA -"2967","String 2966",2966,9317.96381054733,NA -"2968","String 2967",2967,9321.10540320092,NA -"2969","String 2968",2968,9324.24699585451,NA -"2970","String 2969",2969,9327.3885885081,NA -"2971","String 2970",2970,9330.53018116169,NA -"2972","String 2971",2971,9333.67177381527,NA -"2973","String 2972",2972,9336.81336646886,NA -"2974","String 2973",2973,9339.95495912245,NA -"2975","String 2974",2974,9343.09655177605,NA -"2976","String 2975",2975,9346.23814442964,NA -"2977","String 2976",2976,9349.37973708322,NA -"2978","String 2977",2977,9352.52132973681,NA -"2979","String 2978",2978,9355.6629223904,NA -"2980","String 2979",2979,9358.80451504399,NA -"2981","String 2980",2980,9361.94610769758,NA -"2982","String 2981",2981,9365.08770035117,NA -"2983","String 2982",2982,9368.22929300476,NA -"2984","String 2983",2983,9371.37088565835,NA -"2985","String 2984",2984,9374.51247831194,NA -"2986","String 2985",2985,9377.65407096553,NA -"2987","String 2986",2986,9380.79566361912,NA -"2988","String 2987",2987,9383.93725627271,NA -"2989","String 2988",2988,9387.0788489263,NA -"2990","String 2989",2989,9390.22044157989,NA -"2991","String 2990",2990,9393.36203423348,NA -"2992","String 2991",2991,9396.50362688707,NA -"2993","String 2992",2992,9399.64521954066,NA -"2994","String 2993",2993,9402.78681219425,NA -"2995","String 2994",2994,9405.92840484784,NA -"2996","String 2995",2995,9409.06999750143,NA -"2997","String 2996",2996,9412.21159015502,NA -"2998","String 2997",2997,9415.35318280861,NA -"2999","String 2998",2998,9418.4947754622,NA -"3000","String 2999",2999,9421.63636811579,NA -"3001","String 3000",3000,9424.77796076938,NA -"3002","String 3001",3001,9427.91955342297,NA -"3003","String 3002",3002,9431.06114607656,NA -"3004","String 3003",3003,9434.20273873015,NA -"3005","String 3004",3004,9437.34433138374,NA -"3006","String 3005",3005,9440.48592403733,NA -"3007","String 3006",3006,9443.62751669092,NA -"3008","String 3007",3007,9446.76910934451,NA -"3009","String 3008",3008,9449.9107019981,NA -"3010","String 3009",3009,9453.05229465169,NA -"3011","String 3010",3010,9456.19388730528,NA -"3012","String 3011",3011,9459.33547995887,NA -"3013","String 3012",3012,9462.47707261246,NA -"3014","String 3013",3013,9465.61866526605,NA -"3015","String 3014",3014,9468.76025791964,NA -"3016","String 3015",3015,9471.90185057323,NA -"3017","String 3016",3016,9475.04344322682,NA -"3018","String 3017",3017,9478.18503588041,NA -"3019","String 3018",3018,9481.326628534,NA -"3020","String 3019",3019,9484.46822118759,NA -"3021","String 3020",3020,9487.60981384117,NA -"3022","String 3021",3021,9490.75140649476,NA -"3023","String 3022",3022,9493.89299914835,NA -"3024","String 3023",3023,9497.03459180194,NA -"3025","String 3024",3024,9500.17618445553,NA -"3026","String 3025",3025,9503.31777710913,NA -"3027","String 3026",3026,9506.45936976271,NA -"3028","String 3027",3027,9509.6009624163,NA -"3029","String 3028",3028,9512.74255506989,NA -"3030","String 3029",3029,9515.88414772348,NA -"3031","String 3030",3030,9519.02574037707,NA -"3032","String 3031",3031,9522.16733303066,NA -"3033","String 3032",3032,9525.30892568425,NA -"3034","String 3033",3033,9528.45051833784,NA -"3035","String 3034",3034,9531.59211099143,NA -"3036","String 3035",3035,9534.73370364502,NA -"3037","String 3036",3036,9537.87529629861,NA -"3038","String 3037",3037,9541.0168889522,NA -"3039","String 3038",3038,9544.15848160579,NA -"3040","String 3039",3039,9547.30007425938,NA -"3041","String 3040",3040,9550.44166691297,NA -"3042","String 3041",3041,9553.58325956656,NA -"3043","String 3042",3042,9556.72485222015,NA -"3044","String 3043",3043,9559.86644487374,NA -"3045","String 3044",3044,9563.00803752733,NA -"3046","String 3045",3045,9566.14963018092,NA -"3047","String 3046",3046,9569.29122283451,NA -"3048","String 3047",3047,9572.4328154881,NA -"3049","String 3048",3048,9575.57440814169,NA -"3050","String 3049",3049,9578.71600079528,NA -"3051","String 3050",3050,9581.85759344887,NA -"3052","String 3051",3051,9584.99918610246,NA -"3053","String 3052",3052,9588.14077875605,NA -"3054","String 3053",3053,9591.28237140964,NA -"3055","String 3054",3054,9594.42396406323,NA -"3056","String 3055",3055,9597.56555671682,NA -"3057","String 3056",3056,9600.70714937041,NA -"3058","String 3057",3057,9603.848742024,NA -"3059","String 3058",3058,9606.99033467759,NA -"3060","String 3059",3059,9610.13192733118,NA -"3061","String 3060",3060,9613.27351998477,NA -"3062","String 3061",3061,9616.41511263836,NA -"3063","String 3062",3062,9619.55670529195,NA -"3064","String 3063",3063,9622.69829794554,NA -"3065","String 3064",3064,9625.83989059913,NA -"3066","String 3065",3065,9628.98148325272,NA -"3067","String 3066",3066,9632.12307590631,NA -"3068","String 3067",3067,9635.2646685599,NA -"3069","String 3068",3068,9638.40626121349,NA -"3070","String 3069",3069,9641.54785386708,NA -"3071","String 3070",3070,9644.68944652066,NA -"3072","String 3071",3071,9647.83103917425,NA -"3073","String 3072",3072,9650.97263182784,NA -"3074","String 3073",3073,9654.11422448143,NA -"3075","String 3074",3074,9657.25581713502,NA -"3076","String 3075",3075,9660.39740978861,NA -"3077","String 3076",3076,9663.5390024422,NA -"3078","String 3077",3077,9666.68059509579,NA -"3079","String 3078",3078,9669.82218774938,NA -"3080","String 3079",3079,9672.96378040297,NA -"3081","String 3080",3080,9676.10537305656,NA -"3082","String 3081",3081,9679.24696571015,NA -"3083","String 3082",3082,9682.38855836374,NA -"3084","String 3083",3083,9685.53015101733,NA -"3085","String 3084",3084,9688.67174367092,NA -"3086","String 3085",3085,9691.81333632451,NA -"3087","String 3086",3086,9694.9549289781,NA -"3088","String 3087",3087,9698.09652163169,NA -"3089","String 3088",3088,9701.23811428528,NA -"3090","String 3089",3089,9704.37970693887,NA -"3091","String 3090",3090,9707.52129959246,NA -"3092","String 3091",3091,9710.66289224605,NA -"3093","String 3092",3092,9713.80448489964,NA -"3094","String 3093",3093,9716.94607755323,NA -"3095","String 3094",3094,9720.08767020682,NA -"3096","String 3095",3095,9723.22926286041,NA -"3097","String 3096",3096,9726.370855514,NA -"3098","String 3097",3097,9729.51244816759,NA -"3099","String 3098",3098,9732.65404082118,NA -"3100","String 3099",3099,9735.79563347477,NA -"3101","String 3100",3100,9738.93722612836,NA -"3102","String 3101",3101,9742.07881878195,NA -"3103","String 3102",3102,9745.22041143554,NA -"3104","String 3103",3103,9748.36200408913,NA -"3105","String 3104",3104,9751.50359674272,NA -"3106","String 3105",3105,9754.64518939631,NA -"3107","String 3106",3106,9757.7867820499,NA -"3108","String 3107",3107,9760.92837470349,NA -"3109","String 3108",3108,9764.06996735708,NA -"3110","String 3109",3109,9767.21156001067,NA -"3111","String 3110",3110,9770.35315266426,NA -"3112","String 3111",3111,9773.49474531785,NA -"3113","String 3112",3112,9776.63633797144,NA -"3114","String 3113",3113,9779.77793062503,NA -"3115","String 3114",3114,9782.91952327862,NA -"3116","String 3115",3115,9786.06111593221,NA -"3117","String 3116",3116,9789.2027085858,NA -"3118","String 3117",3117,9792.34430123939,NA -"3119","String 3118",3118,9795.48589389298,NA -"3120","String 3119",3119,9798.62748654656,NA -"3121","String 3120",3120,9801.76907920015,NA -"3122","String 3121",3121,9804.91067185374,NA -"3123","String 3122",3122,9808.05226450733,NA -"3124","String 3123",3123,9811.19385716092,NA -"3125","String 3124",3124,9814.33544981451,NA -"3126","String 3125",3125,9817.4770424681,NA -"3127","String 3126",3126,9820.61863512169,NA -"3128","String 3127",3127,9823.76022777528,NA -"3129","String 3128",3128,9826.90182042887,NA -"3130","String 3129",3129,9830.04341308246,NA -"3131","String 3130",3130,9833.18500573605,NA -"3132","String 3131",3131,9836.32659838964,NA -"3133","String 3132",3132,9839.46819104323,NA -"3134","String 3133",3133,9842.60978369682,NA -"3135","String 3134",3134,9845.75137635041,NA -"3136","String 3135",3135,9848.892969004,NA -"3137","String 3136",3136,9852.03456165759,NA -"3138","String 3137",3137,9855.17615431118,NA -"3139","String 3138",3138,9858.31774696477,NA -"3140","String 3139",3139,9861.45933961836,NA -"3141","String 3140",3140,9864.60093227195,NA -"3142","String 3141",3141,9867.74252492554,NA -"3143","String 3142",3142,9870.88411757913,NA -"3144","String 3143",3143,9874.02571023272,NA -"3145","String 3144",3144,9877.16730288631,NA -"3146","String 3145",3145,9880.3088955399,NA -"3147","String 3146",3146,9883.45048819349,NA -"3148","String 3147",3147,9886.59208084708,NA -"3149","String 3148",3148,9889.73367350067,NA -"3150","String 3149",3149,9892.87526615426,NA -"3151","String 3150",3150,9896.01685880785,NA -"3152","String 3151",3151,9899.15845146144,NA -"3153","String 3152",3152,9902.30004411503,NA -"3154","String 3153",3153,9905.44163676862,NA -"3155","String 3154",3154,9908.58322942221,NA -"3156","String 3155",3155,9911.7248220758,NA -"3157","String 3156",3156,9914.86641472939,NA -"3158","String 3157",3157,9918.00800738298,NA -"3159","String 3158",3158,9921.14960003657,NA -"3160","String 3159",3159,9924.29119269016,NA -"3161","String 3160",3160,9927.43278534375,NA -"3162","String 3161",3161,9930.57437799734,NA -"3163","String 3162",3162,9933.71597065093,NA -"3164","String 3163",3163,9936.85756330451,NA -"3165","String 3164",3164,9939.9991559581,NA -"3166","String 3165",3165,9943.1407486117,NA -"3167","String 3166",3166,9946.28234126529,NA -"3168","String 3167",3167,9949.42393391888,NA -"3169","String 3168",3168,9952.56552657247,NA -"3170","String 3169",3169,9955.70711922605,NA -"3171","String 3170",3170,9958.84871187964,NA -"3172","String 3171",3171,9961.99030453323,NA -"3173","String 3172",3172,9965.13189718682,NA -"3174","String 3173",3173,9968.27348984041,NA -"3175","String 3174",3174,9971.415082494,NA -"3176","String 3175",3175,9974.55667514759,NA -"3177","String 3176",3176,9977.69826780118,NA -"3178","String 3177",3177,9980.83986045477,NA -"3179","String 3178",3178,9983.98145310836,NA -"3180","String 3179",3179,9987.12304576195,NA -"3181","String 3180",3180,9990.26463841554,NA -"3182","String 3181",3181,9993.40623106913,NA -"3183","String 3182",3182,9996.54782372272,NA -"3184","String 3183",3183,9999.68941637631,NA -"3185","String 3184",3184,10002.8310090299,NA -"3186","String 3185",3185,10005.9726016835,NA -"3187","String 3186",3186,10009.1141943371,NA -"3188","String 3187",3187,10012.2557869907,NA -"3189","String 3188",3188,10015.3973796443,NA -"3190","String 3189",3189,10018.5389722979,NA -"3191","String 3190",3190,10021.6805649514,NA -"3192","String 3191",3191,10024.822157605,NA -"3193","String 3192",3192,10027.9637502586,NA -"3194","String 3193",3193,10031.1053429122,NA -"3195","String 3194",3194,10034.2469355658,NA -"3196","String 3195",3195,10037.3885282194,NA -"3197","String 3196",3196,10040.530120873,NA -"3198","String 3197",3197,10043.6717135266,NA -"3199","String 3198",3198,10046.8133061802,NA -"3200","String 3199",3199,10049.9548988337,NA -"3201","String 3200",3200,10053.0964914873,NA -"3202","String 3201",3201,10056.2380841409,NA -"3203","String 3202",3202,10059.3796767945,NA -"3204","String 3203",3203,10062.5212694481,NA -"3205","String 3204",3204,10065.6628621017,NA -"3206","String 3205",3205,10068.8044547553,NA -"3207","String 3206",3206,10071.9460474089,NA -"3208","String 3207",3207,10075.0876400625,NA -"3209","String 3208",3208,10078.2292327161,NA -"3210","String 3209",3209,10081.3708253696,NA -"3211","String 3210",3210,10084.5124180232,NA -"3212","String 3211",3211,10087.6540106768,NA -"3213","String 3212",3212,10090.7956033304,NA -"3214","String 3213",3213,10093.937195984,NA -"3215","String 3214",3214,10097.0787886376,NA -"3216","String 3215",3215,10100.2203812912,NA -"3217","String 3216",3216,10103.3619739448,NA -"3218","String 3217",3217,10106.5035665984,NA -"3219","String 3218",3218,10109.645159252,NA -"3220","String 3219",3219,10112.7867519055,NA -"3221","String 3220",3220,10115.9283445591,NA -"3222","String 3221",3221,10119.0699372127,NA -"3223","String 3222",3222,10122.2115298663,NA -"3224","String 3223",3223,10125.3531225199,NA -"3225","String 3224",3224,10128.4947151735,NA -"3226","String 3225",3225,10131.6363078271,NA -"3227","String 3226",3226,10134.7779004807,NA -"3228","String 3227",3227,10137.9194931343,NA -"3229","String 3228",3228,10141.0610857879,NA -"3230","String 3229",3229,10144.2026784414,NA -"3231","String 3230",3230,10147.344271095,NA -"3232","String 3231",3231,10150.4858637486,NA -"3233","String 3232",3232,10153.6274564022,NA -"3234","String 3233",3233,10156.7690490558,NA -"3235","String 3234",3234,10159.9106417094,NA -"3236","String 3235",3235,10163.052234363,NA -"3237","String 3236",3236,10166.1938270166,NA -"3238","String 3237",3237,10169.3354196702,NA -"3239","String 3238",3238,10172.4770123238,NA -"3240","String 3239",3239,10175.6186049773,NA -"3241","String 3240",3240,10178.7601976309,NA -"3242","String 3241",3241,10181.9017902845,NA -"3243","String 3242",3242,10185.0433829381,NA -"3244","String 3243",3243,10188.1849755917,NA -"3245","String 3244",3244,10191.3265682453,NA -"3246","String 3245",3245,10194.4681608989,NA -"3247","String 3246",3246,10197.6097535525,NA -"3248","String 3247",3247,10200.7513462061,NA -"3249","String 3248",3248,10203.8929388596,NA -"3250","String 3249",3249,10207.0345315132,NA -"3251","String 3250",3250,10210.1761241668,NA -"3252","String 3251",3251,10213.3177168204,NA -"3253","String 3252",3252,10216.459309474,NA -"3254","String 3253",3253,10219.6009021276,NA -"3255","String 3254",3254,10222.7424947812,NA -"3256","String 3255",3255,10225.8840874348,NA -"3257","String 3256",3256,10229.0256800884,NA -"3258","String 3257",3257,10232.167272742,NA -"3259","String 3258",3258,10235.3088653955,NA -"3260","String 3259",3259,10238.4504580491,NA -"3261","String 3260",3260,10241.5920507027,NA -"3262","String 3261",3261,10244.7336433563,NA -"3263","String 3262",3262,10247.8752360099,NA -"3264","String 3263",3263,10251.0168286635,NA -"3265","String 3264",3264,10254.1584213171,NA -"3266","String 3265",3265,10257.3000139707,NA -"3267","String 3266",3266,10260.4416066243,NA -"3268","String 3267",3267,10263.5831992779,NA -"3269","String 3268",3268,10266.7247919314,NA -"3270","String 3269",3269,10269.866384585,NA -"3271","String 3270",3270,10273.0079772386,NA -"3272","String 3271",3271,10276.1495698922,NA -"3273","String 3272",3272,10279.2911625458,NA -"3274","String 3273",3273,10282.4327551994,NA -"3275","String 3274",3274,10285.574347853,NA -"3276","String 3275",3275,10288.7159405066,NA -"3277","String 3276",3276,10291.8575331602,NA -"3278","String 3277",3277,10294.9991258138,NA -"3279","String 3278",3278,10298.1407184673,NA -"3280","String 3279",3279,10301.2823111209,NA -"3281","String 3280",3280,10304.4239037745,NA -"3282","String 3281",3281,10307.5654964281,NA -"3283","String 3282",3282,10310.7070890817,NA -"3284","String 3283",3283,10313.8486817353,NA -"3285","String 3284",3284,10316.9902743889,NA -"3286","String 3285",3285,10320.1318670425,NA -"3287","String 3286",3286,10323.2734596961,NA -"3288","String 3287",3287,10326.4150523497,NA -"3289","String 3288",3288,10329.5566450032,NA -"3290","String 3289",3289,10332.6982376568,NA -"3291","String 3290",3290,10335.8398303104,NA -"3292","String 3291",3291,10338.981422964,NA -"3293","String 3292",3292,10342.1230156176,NA -"3294","String 3293",3293,10345.2646082712,NA -"3295","String 3294",3294,10348.4062009248,NA -"3296","String 3295",3295,10351.5477935784,NA -"3297","String 3296",3296,10354.689386232,NA -"3298","String 3297",3297,10357.8309788855,NA -"3299","String 3298",3298,10360.9725715391,NA -"3300","String 3299",3299,10364.1141641927,NA -"3301","String 3300",3300,10367.2557568463,NA -"3302","String 3301",3301,10370.3973494999,NA -"3303","String 3302",3302,10373.5389421535,NA -"3304","String 3303",3303,10376.6805348071,NA -"3305","String 3304",3304,10379.8221274607,NA -"3306","String 3305",3305,10382.9637201143,NA -"3307","String 3306",3306,10386.1053127679,NA -"3308","String 3307",3307,10389.2469054214,NA -"3309","String 3308",3308,10392.388498075,NA -"3310","String 3309",3309,10395.5300907286,NA -"3311","String 3310",3310,10398.6716833822,NA -"3312","String 3311",3311,10401.8132760358,NA -"3313","String 3312",3312,10404.9548686894,NA -"3314","String 3313",3313,10408.096461343,NA -"3315","String 3314",3314,10411.2380539966,NA -"3316","String 3315",3315,10414.3796466502,NA -"3317","String 3316",3316,10417.5212393038,NA -"3318","String 3317",3317,10420.6628319573,NA -"3319","String 3318",3318,10423.8044246109,NA -"3320","String 3319",3319,10426.9460172645,NA -"3321","String 3320",3320,10430.0876099181,NA -"3322","String 3321",3321,10433.2292025717,NA -"3323","String 3322",3322,10436.3707952253,NA -"3324","String 3323",3323,10439.5123878789,NA -"3325","String 3324",3324,10442.6539805325,NA -"3326","String 3325",3325,10445.7955731861,NA -"3327","String 3326",3326,10448.9371658397,NA -"3328","String 3327",3327,10452.0787584932,NA -"3329","String 3328",3328,10455.2203511468,NA -"3330","String 3329",3329,10458.3619438004,NA -"3331","String 3330",3330,10461.503536454,NA -"3332","String 3331",3331,10464.6451291076,NA -"3333","String 3332",3332,10467.7867217612,NA -"3334","String 3333",3333,10470.9283144148,NA -"3335","String 3334",3334,10474.0699070684,NA -"3336","String 3335",3335,10477.211499722,NA -"3337","String 3336",3336,10480.3530923755,NA -"3338","String 3337",3337,10483.4946850291,NA -"3339","String 3338",3338,10486.6362776827,NA -"3340","String 3339",3339,10489.7778703363,NA -"3341","String 3340",3340,10492.9194629899,NA -"3342","String 3341",3341,10496.0610556435,NA -"3343","String 3342",3342,10499.2026482971,NA -"3344","String 3343",3343,10502.3442409507,NA -"3345","String 3344",3344,10505.4858336043,NA -"3346","String 3345",3345,10508.6274262579,NA -"3347","String 3346",3346,10511.7690189114,NA -"3348","String 3347",3347,10514.910611565,NA -"3349","String 3348",3348,10518.0522042186,NA -"3350","String 3349",3349,10521.1937968722,NA -"3351","String 3350",3350,10524.3353895258,NA -"3352","String 3351",3351,10527.4769821794,NA -"3353","String 3352",3352,10530.618574833,NA -"3354","String 3353",3353,10533.7601674866,NA -"3355","String 3354",3354,10536.9017601402,NA -"3356","String 3355",3355,10540.0433527938,NA -"3357","String 3356",3356,10543.1849454473,NA -"3358","String 3357",3357,10546.3265381009,NA -"3359","String 3358",3358,10549.4681307545,NA -"3360","String 3359",3359,10552.6097234081,NA -"3361","String 3360",3360,10555.7513160617,NA -"3362","String 3361",3361,10558.8929087153,NA -"3363","String 3362",3362,10562.0345013689,NA -"3364","String 3363",3363,10565.1760940225,NA -"3365","String 3364",3364,10568.3176866761,NA -"3366","String 3365",3365,10571.4592793297,NA -"3367","String 3366",3366,10574.6008719832,NA -"3368","String 3367",3367,10577.7424646368,NA -"3369","String 3368",3368,10580.8840572904,NA -"3370","String 3369",3369,10584.025649944,NA -"3371","String 3370",3370,10587.1672425976,NA -"3372","String 3371",3371,10590.3088352512,NA -"3373","String 3372",3372,10593.4504279048,NA -"3374","String 3373",3373,10596.5920205584,NA -"3375","String 3374",3374,10599.733613212,NA -"3376","String 3375",3375,10602.8752058656,NA -"3377","String 3376",3376,10606.0167985191,NA -"3378","String 3377",3377,10609.1583911727,NA -"3379","String 3378",3378,10612.2999838263,NA -"3380","String 3379",3379,10615.4415764799,NA -"3381","String 3380",3380,10618.5831691335,NA -"3382","String 3381",3381,10621.7247617871,NA -"3383","String 3382",3382,10624.8663544407,NA -"3384","String 3383",3383,10628.0079470943,NA -"3385","String 3384",3384,10631.1495397479,NA -"3386","String 3385",3385,10634.2911324014,NA -"3387","String 3386",3386,10637.432725055,NA -"3388","String 3387",3387,10640.5743177086,NA -"3389","String 3388",3388,10643.7159103622,NA -"3390","String 3389",3389,10646.8575030158,NA -"3391","String 3390",3390,10649.9990956694,NA -"3392","String 3391",3391,10653.140688323,NA -"3393","String 3392",3392,10656.2822809766,NA -"3394","String 3393",3393,10659.4238736302,NA -"3395","String 3394",3394,10662.5654662838,NA -"3396","String 3395",3395,10665.7070589373,NA -"3397","String 3396",3396,10668.8486515909,NA -"3398","String 3397",3397,10671.9902442445,NA -"3399","String 3398",3398,10675.1318368981,NA -"3400","String 3399",3399,10678.2734295517,NA -"3401","String 3400",3400,10681.4150222053,NA -"3402","String 3401",3401,10684.5566148589,NA -"3403","String 3402",3402,10687.6982075125,NA -"3404","String 3403",3403,10690.8398001661,NA -"3405","String 3404",3404,10693.9813928197,NA -"3406","String 3405",3405,10697.1229854732,NA -"3407","String 3406",3406,10700.2645781268,NA -"3408","String 3407",3407,10703.4061707804,NA -"3409","String 3408",3408,10706.547763434,NA -"3410","String 3409",3409,10709.6893560876,NA -"3411","String 3410",3410,10712.8309487412,NA -"3412","String 3411",3411,10715.9725413948,NA -"3413","String 3412",3412,10719.1141340484,NA -"3414","String 3413",3413,10722.255726702,NA -"3415","String 3414",3414,10725.3973193556,NA -"3416","String 3415",3415,10728.5389120091,NA -"3417","String 3416",3416,10731.6805046627,NA -"3418","String 3417",3417,10734.8220973163,NA -"3419","String 3418",3418,10737.9636899699,NA -"3420","String 3419",3419,10741.1052826235,NA -"3421","String 3420",3420,10744.2468752771,NA -"3422","String 3421",3421,10747.3884679307,NA -"3423","String 3422",3422,10750.5300605843,NA -"3424","String 3423",3423,10753.6716532379,NA -"3425","String 3424",3424,10756.8132458915,NA -"3426","String 3425",3425,10759.954838545,NA -"3427","String 3426",3426,10763.0964311986,NA -"3428","String 3427",3427,10766.2380238522,NA -"3429","String 3428",3428,10769.3796165058,NA -"3430","String 3429",3429,10772.5212091594,NA -"3431","String 3430",3430,10775.662801813,NA -"3432","String 3431",3431,10778.8043944666,NA -"3433","String 3432",3432,10781.9459871202,NA -"3434","String 3433",3433,10785.0875797738,NA -"3435","String 3434",3434,10788.2291724273,NA -"3436","String 3435",3435,10791.3707650809,NA -"3437","String 3436",3436,10794.5123577345,NA -"3438","String 3437",3437,10797.6539503881,NA -"3439","String 3438",3438,10800.7955430417,NA -"3440","String 3439",3439,10803.9371356953,NA -"3441","String 3440",3440,10807.0787283489,NA -"3442","String 3441",3441,10810.2203210025,NA -"3443","String 3442",3442,10813.3619136561,NA -"3444","String 3443",3443,10816.5035063097,NA -"3445","String 3444",3444,10819.6450989632,NA -"3446","String 3445",3445,10822.7866916168,NA -"3447","String 3446",3446,10825.9282842704,NA -"3448","String 3447",3447,10829.069876924,NA -"3449","String 3448",3448,10832.2114695776,NA -"3450","String 3449",3449,10835.3530622312,NA -"3451","String 3450",3450,10838.4946548848,NA -"3452","String 3451",3451,10841.6362475384,NA -"3453","String 3452",3452,10844.777840192,NA -"3454","String 3453",3453,10847.9194328456,NA -"3455","String 3454",3454,10851.0610254991,NA -"3456","String 3455",3455,10854.2026181527,NA -"3457","String 3456",3456,10857.3442108063,NA -"3458","String 3457",3457,10860.4858034599,NA -"3459","String 3458",3458,10863.6273961135,NA -"3460","String 3459",3459,10866.7689887671,NA -"3461","String 3460",3460,10869.9105814207,NA -"3462","String 3461",3461,10873.0521740743,NA -"3463","String 3462",3462,10876.1937667279,NA -"3464","String 3463",3463,10879.3353593815,NA -"3465","String 3464",3464,10882.476952035,NA -"3466","String 3465",3465,10885.6185446886,NA -"3467","String 3466",3466,10888.7601373422,NA -"3468","String 3467",3467,10891.9017299958,NA -"3469","String 3468",3468,10895.0433226494,NA -"3470","String 3469",3469,10898.184915303,NA -"3471","String 3470",3470,10901.3265079566,NA -"3472","String 3471",3471,10904.4681006102,NA -"3473","String 3472",3472,10907.6096932638,NA -"3474","String 3473",3473,10910.7512859174,NA -"3475","String 3474",3474,10913.8928785709,NA -"3476","String 3475",3475,10917.0344712245,NA -"3477","String 3476",3476,10920.1760638781,NA -"3478","String 3477",3477,10923.3176565317,NA -"3479","String 3478",3478,10926.4592491853,NA -"3480","String 3479",3479,10929.6008418389,NA -"3481","String 3480",3480,10932.7424344925,NA -"3482","String 3481",3481,10935.8840271461,NA -"3483","String 3482",3482,10939.0256197997,NA -"3484","String 3483",3483,10942.1672124532,NA -"3485","String 3484",3484,10945.3088051068,NA -"3486","String 3485",3485,10948.4503977604,NA -"3487","String 3486",3486,10951.591990414,NA -"3488","String 3487",3487,10954.7335830676,NA -"3489","String 3488",3488,10957.8751757212,NA -"3490","String 3489",3489,10961.0167683748,NA -"3491","String 3490",3490,10964.1583610284,NA -"3492","String 3491",3491,10967.299953682,NA -"3493","String 3492",3492,10970.4415463356,NA -"3494","String 3493",3493,10973.5831389891,NA -"3495","String 3494",3494,10976.7247316427,NA -"3496","String 3495",3495,10979.8663242963,NA -"3497","String 3496",3496,10983.0079169499,NA -"3498","String 3497",3497,10986.1495096035,NA -"3499","String 3498",3498,10989.2911022571,NA -"3500","String 3499",3499,10992.4326949107,NA -"3501","String 3500",3500,10995.5742875643,NA -"3502","String 3501",3501,10998.7158802179,NA -"3503","String 3502",3502,11001.8574728715,NA -"3504","String 3503",3503,11004.999065525,NA -"3505","String 3504",3504,11008.1406581786,NA -"3506","String 3505",3505,11011.2822508322,NA -"3507","String 3506",3506,11014.4238434858,NA -"3508","String 3507",3507,11017.5654361394,NA -"3509","String 3508",3508,11020.707028793,NA -"3510","String 3509",3509,11023.8486214466,NA -"3511","String 3510",3510,11026.9902141002,NA -"3512","String 3511",3511,11030.1318067538,NA -"3513","String 3512",3512,11033.2733994074,NA -"3514","String 3513",3513,11036.4149920609,NA -"3515","String 3514",3514,11039.5565847145,NA -"3516","String 3515",3515,11042.6981773681,NA -"3517","String 3516",3516,11045.8397700217,NA -"3518","String 3517",3517,11048.9813626753,NA -"3519","String 3518",3518,11052.1229553289,NA -"3520","String 3519",3519,11055.2645479825,NA -"3521","String 3520",3520,11058.4061406361,NA -"3522","String 3521",3521,11061.5477332897,NA -"3523","String 3522",3522,11064.6893259433,NA -"3524","String 3523",3523,11067.8309185968,NA -"3525","String 3524",3524,11070.9725112504,NA -"3526","String 3525",3525,11074.114103904,NA -"3527","String 3526",3526,11077.2556965576,NA -"3528","String 3527",3527,11080.3972892112,NA -"3529","String 3528",3528,11083.5388818648,NA -"3530","String 3529",3529,11086.6804745184,NA -"3531","String 3530",3530,11089.822067172,NA -"3532","String 3531",3531,11092.9636598256,NA -"3533","String 3532",3532,11096.1052524791,NA -"3534","String 3533",3533,11099.2468451327,NA -"3535","String 3534",3534,11102.3884377863,NA -"3536","String 3535",3535,11105.5300304399,NA -"3537","String 3536",3536,11108.6716230935,NA -"3538","String 3537",3537,11111.8132157471,NA -"3539","String 3538",3538,11114.9548084007,NA -"3540","String 3539",3539,11118.0964010543,NA -"3541","String 3540",3540,11121.2379937079,NA -"3542","String 3541",3541,11124.3795863615,NA -"3543","String 3542",3542,11127.521179015,NA -"3544","String 3543",3543,11130.6627716686,NA -"3545","String 3544",3544,11133.8043643222,NA -"3546","String 3545",3545,11136.9459569758,NA -"3547","String 3546",3546,11140.0875496294,NA -"3548","String 3547",3547,11143.229142283,NA -"3549","String 3548",3548,11146.3707349366,NA -"3550","String 3549",3549,11149.5123275902,NA -"3551","String 3550",3550,11152.6539202438,NA -"3552","String 3551",3551,11155.7955128974,NA -"3553","String 3552",3552,11158.9371055509,NA -"3554","String 3553",3553,11162.0786982045,NA -"3555","String 3554",3554,11165.2202908581,NA -"3556","String 3555",3555,11168.3618835117,NA -"3557","String 3556",3556,11171.5034761653,NA -"3558","String 3557",3557,11174.6450688189,NA -"3559","String 3558",3558,11177.7866614725,NA -"3560","String 3559",3559,11180.9282541261,NA -"3561","String 3560",3560,11184.0698467797,NA -"3562","String 3561",3561,11187.2114394333,NA -"3563","String 3562",3562,11190.3530320868,NA -"3564","String 3563",3563,11193.4946247404,NA -"3565","String 3564",3564,11196.636217394,NA -"3566","String 3565",3565,11199.7778100476,NA -"3567","String 3566",3566,11202.9194027012,NA -"3568","String 3567",3567,11206.0609953548,NA -"3569","String 3568",3568,11209.2025880084,NA -"3570","String 3569",3569,11212.344180662,NA -"3571","String 3570",3570,11215.4857733156,NA -"3572","String 3571",3571,11218.6273659692,NA -"3573","String 3572",3572,11221.7689586227,NA -"3574","String 3573",3573,11224.9105512763,NA -"3575","String 3574",3574,11228.0521439299,NA -"3576","String 3575",3575,11231.1937365835,NA -"3577","String 3576",3576,11234.3353292371,NA -"3578","String 3577",3577,11237.4769218907,NA -"3579","String 3578",3578,11240.6185145443,NA -"3580","String 3579",3579,11243.7601071979,NA -"3581","String 3580",3580,11246.9016998515,NA -"3582","String 3581",3581,11250.043292505,NA -"3583","String 3582",3582,11253.1848851586,NA -"3584","String 3583",3583,11256.3264778122,NA -"3585","String 3584",3584,11259.4680704658,NA -"3586","String 3585",3585,11262.6096631194,NA -"3587","String 3586",3586,11265.751255773,NA -"3588","String 3587",3587,11268.8928484266,NA -"3589","String 3588",3588,11272.0344410802,NA -"3590","String 3589",3589,11275.1760337338,NA -"3591","String 3590",3590,11278.3176263874,NA -"3592","String 3591",3591,11281.4592190409,NA -"3593","String 3592",3592,11284.6008116945,NA -"3594","String 3593",3593,11287.7424043481,NA -"3595","String 3594",3594,11290.8839970017,NA -"3596","String 3595",3595,11294.0255896553,NA -"3597","String 3596",3596,11297.1671823089,NA -"3598","String 3597",3597,11300.3087749625,NA -"3599","String 3598",3598,11303.4503676161,NA -"3600","String 3599",3599,11306.5919602697,NA -"3601","String 3600",3600,11309.7335529233,NA -"3602","String 3601",3601,11312.8751455768,NA -"3603","String 3602",3602,11316.0167382304,NA -"3604","String 3603",3603,11319.158330884,NA -"3605","String 3604",3604,11322.2999235376,NA -"3606","String 3605",3605,11325.4415161912,NA -"3607","String 3606",3606,11328.5831088448,NA -"3608","String 3607",3607,11331.7247014984,NA -"3609","String 3608",3608,11334.866294152,NA -"3610","String 3609",3609,11338.0078868056,NA -"3611","String 3610",3610,11341.1494794592,NA -"3612","String 3611",3611,11344.2910721127,NA -"3613","String 3612",3612,11347.4326647663,NA -"3614","String 3613",3613,11350.5742574199,NA -"3615","String 3614",3614,11353.7158500735,NA -"3616","String 3615",3615,11356.8574427271,NA -"3617","String 3616",3616,11359.9990353807,NA -"3618","String 3617",3617,11363.1406280343,NA -"3619","String 3618",3618,11366.2822206879,NA -"3620","String 3619",3619,11369.4238133415,NA -"3621","String 3620",3620,11372.5654059951,NA -"3622","String 3621",3621,11375.7069986486,NA -"3623","String 3622",3622,11378.8485913022,NA -"3624","String 3623",3623,11381.9901839558,NA -"3625","String 3624",3624,11385.1317766094,NA -"3626","String 3625",3625,11388.273369263,NA -"3627","String 3626",3626,11391.4149619166,NA -"3628","String 3627",3627,11394.5565545702,NA -"3629","String 3628",3628,11397.6981472238,NA -"3630","String 3629",3629,11400.8397398774,NA -"3631","String 3630",3630,11403.9813325309,NA -"3632","String 3631",3631,11407.1229251845,NA -"3633","String 3632",3632,11410.2645178381,NA -"3634","String 3633",3633,11413.4061104917,NA -"3635","String 3634",3634,11416.5477031453,NA -"3636","String 3635",3635,11419.6892957989,NA -"3637","String 3636",3636,11422.8308884525,NA -"3638","String 3637",3637,11425.9724811061,NA -"3639","String 3638",3638,11429.1140737597,NA -"3640","String 3639",3639,11432.2556664133,NA -"3641","String 3640",3640,11435.3972590668,NA -"3642","String 3641",3641,11438.5388517204,NA -"3643","String 3642",3642,11441.680444374,NA -"3644","String 3643",3643,11444.8220370276,NA -"3645","String 3644",3644,11447.9636296812,NA -"3646","String 3645",3645,11451.1052223348,NA -"3647","String 3646",3646,11454.2468149884,NA -"3648","String 3647",3647,11457.388407642,NA -"3649","String 3648",3648,11460.5300002956,NA -"3650","String 3649",3649,11463.6715929492,NA -"3651","String 3650",3650,11466.8131856027,NA -"3652","String 3651",3651,11469.9547782563,NA -"3653","String 3652",3652,11473.0963709099,NA -"3654","String 3653",3653,11476.2379635635,NA -"3655","String 3654",3654,11479.3795562171,NA -"3656","String 3655",3655,11482.5211488707,NA -"3657","String 3656",3656,11485.6627415243,NA -"3658","String 3657",3657,11488.8043341779,NA -"3659","String 3658",3658,11491.9459268315,NA -"3660","String 3659",3659,11495.0875194851,NA -"3661","String 3660",3660,11498.2291121386,NA -"3662","String 3661",3661,11501.3707047922,NA -"3663","String 3662",3662,11504.5122974458,NA -"3664","String 3663",3663,11507.6538900994,NA -"3665","String 3664",3664,11510.795482753,NA -"3666","String 3665",3665,11513.9370754066,NA -"3667","String 3666",3666,11517.0786680602,NA -"3668","String 3667",3667,11520.2202607138,NA -"3669","String 3668",3668,11523.3618533674,NA -"3670","String 3669",3669,11526.503446021,NA -"3671","String 3670",3670,11529.6450386745,NA -"3672","String 3671",3671,11532.7866313281,NA -"3673","String 3672",3672,11535.9282239817,NA -"3674","String 3673",3673,11539.0698166353,NA -"3675","String 3674",3674,11542.2114092889,NA -"3676","String 3675",3675,11545.3530019425,NA -"3677","String 3676",3676,11548.4945945961,NA -"3678","String 3677",3677,11551.6361872497,NA -"3679","String 3678",3678,11554.7777799033,NA -"3680","String 3679",3679,11557.9193725568,NA -"3681","String 3680",3680,11561.0609652104,NA -"3682","String 3681",3681,11564.202557864,NA -"3683","String 3682",3682,11567.3441505176,NA -"3684","String 3683",3683,11570.4857431712,NA -"3685","String 3684",3684,11573.6273358248,NA -"3686","String 3685",3685,11576.7689284784,NA -"3687","String 3686",3686,11579.910521132,NA -"3688","String 3687",3687,11583.0521137856,NA -"3689","String 3688",3688,11586.1937064392,NA -"3690","String 3689",3689,11589.3352990927,NA -"3691","String 3690",3690,11592.4768917463,NA -"3692","String 3691",3691,11595.6184843999,NA -"3693","String 3692",3692,11598.7600770535,NA -"3694","String 3693",3693,11601.9016697071,NA -"3695","String 3694",3694,11605.0432623607,NA -"3696","String 3695",3695,11608.1848550143,NA -"3697","String 3696",3696,11611.3264476679,NA -"3698","String 3697",3697,11614.4680403215,NA -"3699","String 3698",3698,11617.6096329751,NA -"3700","String 3699",3699,11620.7512256286,NA -"3701","String 3700",3700,11623.8928182822,NA -"3702","String 3701",3701,11627.0344109358,NA -"3703","String 3702",3702,11630.1760035894,NA -"3704","String 3703",3703,11633.317596243,NA -"3705","String 3704",3704,11636.4591888966,NA -"3706","String 3705",3705,11639.6007815502,NA -"3707","String 3706",3706,11642.7423742038,NA -"3708","String 3707",3707,11645.8839668574,NA -"3709","String 3708",3708,11649.025559511,NA -"3710","String 3709",3709,11652.1671521645,NA -"3711","String 3710",3710,11655.3087448181,NA -"3712","String 3711",3711,11658.4503374717,NA -"3713","String 3712",3712,11661.5919301253,NA -"3714","String 3713",3713,11664.7335227789,NA -"3715","String 3714",3714,11667.8751154325,NA -"3716","String 3715",3715,11671.0167080861,NA -"3717","String 3716",3716,11674.1583007397,NA -"3718","String 3717",3717,11677.2998933933,NA -"3719","String 3718",3718,11680.4414860469,NA -"3720","String 3719",3719,11683.5830787004,NA -"3721","String 3720",3720,11686.724671354,NA -"3722","String 3721",3721,11689.8662640076,NA -"3723","String 3722",3722,11693.0078566612,NA -"3724","String 3723",3723,11696.1494493148,NA -"3725","String 3724",3724,11699.2910419684,NA -"3726","String 3725",3725,11702.432634622,NA -"3727","String 3726",3726,11705.5742272756,NA -"3728","String 3727",3727,11708.7158199292,NA -"3729","String 3728",3728,11711.8574125827,NA -"3730","String 3729",3729,11714.9990052363,NA -"3731","String 3730",3730,11718.1405978899,NA -"3732","String 3731",3731,11721.2821905435,NA -"3733","String 3732",3732,11724.4237831971,NA -"3734","String 3733",3733,11727.5653758507,NA -"3735","String 3734",3734,11730.7069685043,NA -"3736","String 3735",3735,11733.8485611579,NA -"3737","String 3736",3736,11736.9901538115,NA -"3738","String 3737",3737,11740.1317464651,NA -"3739","String 3738",3738,11743.2733391186,NA -"3740","String 3739",3739,11746.4149317722,NA -"3741","String 3740",3740,11749.5565244258,NA -"3742","String 3741",3741,11752.6981170794,NA -"3743","String 3742",3742,11755.839709733,NA -"3744","String 3743",3743,11758.9813023866,NA -"3745","String 3744",3744,11762.1228950402,NA -"3746","String 3745",3745,11765.2644876938,NA -"3747","String 3746",3746,11768.4060803474,NA -"3748","String 3747",3747,11771.547673001,NA -"3749","String 3748",3748,11774.6892656545,NA -"3750","String 3749",3749,11777.8308583081,NA -"3751","String 3750",3750,11780.9724509617,NA -"3752","String 3751",3751,11784.1140436153,NA -"3753","String 3752",3752,11787.2556362689,NA -"3754","String 3753",3753,11790.3972289225,NA -"3755","String 3754",3754,11793.5388215761,NA -"3756","String 3755",3755,11796.6804142297,NA -"3757","String 3756",3756,11799.8220068833,NA -"3758","String 3757",3757,11802.9635995369,NA -"3759","String 3758",3758,11806.1051921904,NA -"3760","String 3759",3759,11809.246784844,NA -"3761","String 3760",3760,11812.3883774976,NA -"3762","String 3761",3761,11815.5299701512,NA -"3763","String 3762",3762,11818.6715628048,NA -"3764","String 3763",3763,11821.8131554584,NA -"3765","String 3764",3764,11824.954748112,NA -"3766","String 3765",3765,11828.0963407656,NA -"3767","String 3766",3766,11831.2379334192,NA -"3768","String 3767",3767,11834.3795260728,NA -"3769","String 3768",3768,11837.5211187263,NA -"3770","String 3769",3769,11840.6627113799,NA -"3771","String 3770",3770,11843.8043040335,NA -"3772","String 3771",3771,11846.9458966871,NA -"3773","String 3772",3772,11850.0874893407,NA -"3774","String 3773",3773,11853.2290819943,NA -"3775","String 3774",3774,11856.3706746479,NA -"3776","String 3775",3775,11859.5122673015,NA -"3777","String 3776",3776,11862.6538599551,NA -"3778","String 3777",3777,11865.7954526086,NA -"3779","String 3778",3778,11868.9370452622,NA -"3780","String 3779",3779,11872.0786379158,NA -"3781","String 3780",3780,11875.2202305694,NA -"3782","String 3781",3781,11878.361823223,NA -"3783","String 3782",3782,11881.5034158766,NA -"3784","String 3783",3783,11884.6450085302,NA -"3785","String 3784",3784,11887.7866011838,NA -"3786","String 3785",3785,11890.9281938374,NA -"3787","String 3786",3786,11894.069786491,NA -"3788","String 3787",3787,11897.2113791445,NA -"3789","String 3788",3788,11900.3529717981,NA -"3790","String 3789",3789,11903.4945644517,NA -"3791","String 3790",3790,11906.6361571053,NA -"3792","String 3791",3791,11909.7777497589,NA -"3793","String 3792",3792,11912.9193424125,NA -"3794","String 3793",3793,11916.0609350661,NA -"3795","String 3794",3794,11919.2025277197,NA -"3796","String 3795",3795,11922.3441203733,NA -"3797","String 3796",3796,11925.4857130269,NA -"3798","String 3797",3797,11928.6273056804,NA -"3799","String 3798",3798,11931.768898334,NA -"3800","String 3799",3799,11934.9104909876,NA -"3801","String 3800",3800,11938.0520836412,NA -"3802","String 3801",3801,11941.1936762948,NA -"3803","String 3802",3802,11944.3352689484,NA -"3804","String 3803",3803,11947.476861602,NA -"3805","String 3804",3804,11950.6184542556,NA -"3806","String 3805",3805,11953.7600469092,NA -"3807","String 3806",3806,11956.9016395628,NA -"3808","String 3807",3807,11960.0432322163,NA -"3809","String 3808",3808,11963.1848248699,NA -"3810","String 3809",3809,11966.3264175235,NA -"3811","String 3810",3810,11969.4680101771,NA -"3812","String 3811",3811,11972.6096028307,NA -"3813","String 3812",3812,11975.7511954843,NA -"3814","String 3813",3813,11978.8927881379,NA -"3815","String 3814",3814,11982.0343807915,NA -"3816","String 3815",3815,11985.1759734451,NA -"3817","String 3816",3816,11988.3175660987,NA -"3818","String 3817",3817,11991.4591587522,NA -"3819","String 3818",3818,11994.6007514058,NA -"3820","String 3819",3819,11997.7423440594,NA -"3821","String 3820",3820,12000.883936713,NA -"3822","String 3821",3821,12004.0255293666,NA -"3823","String 3822",3822,12007.1671220202,NA -"3824","String 3823",3823,12010.3087146738,NA -"3825","String 3824",3824,12013.4503073274,NA -"3826","String 3825",3825,12016.591899981,NA -"3827","String 3826",3826,12019.7334926345,NA -"3828","String 3827",3827,12022.8750852881,NA -"3829","String 3828",3828,12026.0166779417,NA -"3830","String 3829",3829,12029.1582705953,NA -"3831","String 3830",3830,12032.2998632489,NA -"3832","String 3831",3831,12035.4414559025,NA -"3833","String 3832",3832,12038.5830485561,NA -"3834","String 3833",3833,12041.7246412097,NA -"3835","String 3834",3834,12044.8662338633,NA -"3836","String 3835",3835,12048.0078265169,NA -"3837","String 3836",3836,12051.1494191704,NA -"3838","String 3837",3837,12054.291011824,NA -"3839","String 3838",3838,12057.4326044776,NA -"3840","String 3839",3839,12060.5741971312,NA -"3841","String 3840",3840,12063.7157897848,NA -"3842","String 3841",3841,12066.8573824384,NA -"3843","String 3842",3842,12069.998975092,NA -"3844","String 3843",3843,12073.1405677456,NA -"3845","String 3844",3844,12076.2821603992,NA -"3846","String 3845",3845,12079.4237530528,NA -"3847","String 3846",3846,12082.5653457063,NA -"3848","String 3847",3847,12085.7069383599,NA -"3849","String 3848",3848,12088.8485310135,NA -"3850","String 3849",3849,12091.9901236671,NA -"3851","String 3850",3850,12095.1317163207,NA -"3852","String 3851",3851,12098.2733089743,NA -"3853","String 3852",3852,12101.4149016279,NA -"3854","String 3853",3853,12104.5564942815,NA -"3855","String 3854",3854,12107.6980869351,NA -"3856","String 3855",3855,12110.8396795887,NA -"3857","String 3856",3856,12113.9812722422,NA -"3858","String 3857",3857,12117.1228648958,NA -"3859","String 3858",3858,12120.2644575494,NA -"3860","String 3859",3859,12123.406050203,NA -"3861","String 3860",3860,12126.5476428566,NA -"3862","String 3861",3861,12129.6892355102,NA -"3863","String 3862",3862,12132.8308281638,NA -"3864","String 3863",3863,12135.9724208174,NA -"3865","String 3864",3864,12139.114013471,NA -"3866","String 3865",3865,12142.2556061246,NA -"3867","String 3866",3866,12145.3971987781,NA -"3868","String 3867",3867,12148.5387914317,NA -"3869","String 3868",3868,12151.6803840853,NA -"3870","String 3869",3869,12154.8219767389,NA -"3871","String 3870",3870,12157.9635693925,NA -"3872","String 3871",3871,12161.1051620461,NA -"3873","String 3872",3872,12164.2467546997,NA -"3874","String 3873",3873,12167.3883473533,NA -"3875","String 3874",3874,12170.5299400069,NA -"3876","String 3875",3875,12173.6715326604,NA -"3877","String 3876",3876,12176.813125314,NA -"3878","String 3877",3877,12179.9547179676,NA -"3879","String 3878",3878,12183.0963106212,NA -"3880","String 3879",3879,12186.2379032748,NA -"3881","String 3880",3880,12189.3794959284,NA -"3882","String 3881",3881,12192.521088582,NA -"3883","String 3882",3882,12195.6626812356,NA -"3884","String 3883",3883,12198.8042738892,NA -"3885","String 3884",3884,12201.9458665428,NA -"3886","String 3885",3885,12205.0874591963,NA -"3887","String 3886",3886,12208.2290518499,NA -"3888","String 3887",3887,12211.3706445035,NA -"3889","String 3888",3888,12214.5122371571,NA -"3890","String 3889",3889,12217.6538298107,NA -"3891","String 3890",3890,12220.7954224643,NA -"3892","String 3891",3891,12223.9370151179,NA -"3893","String 3892",3892,12227.0786077715,NA -"3894","String 3893",3893,12230.2202004251,NA -"3895","String 3894",3894,12233.3617930787,NA -"3896","String 3895",3895,12236.5033857322,NA -"3897","String 3896",3896,12239.6449783858,NA -"3898","String 3897",3897,12242.7865710394,NA -"3899","String 3898",3898,12245.928163693,NA -"3900","String 3899",3899,12249.0697563466,NA -"3901","String 3900",3900,12252.2113490002,NA -"3902","String 3901",3901,12255.3529416538,NA -"3903","String 3902",3902,12258.4945343074,NA -"3904","String 3903",3903,12261.636126961,NA -"3905","String 3904",3904,12264.7777196146,NA -"3906","String 3905",3905,12267.9193122681,NA -"3907","String 3906",3906,12271.0609049217,NA -"3908","String 3907",3907,12274.2024975753,NA -"3909","String 3908",3908,12277.3440902289,NA -"3910","String 3909",3909,12280.4856828825,NA -"3911","String 3910",3910,12283.6272755361,NA -"3912","String 3911",3911,12286.7688681897,NA -"3913","String 3912",3912,12289.9104608433,NA -"3914","String 3913",3913,12293.0520534969,NA -"3915","String 3914",3914,12296.1936461505,NA -"3916","String 3915",3915,12299.335238804,NA -"3917","String 3916",3916,12302.4768314576,NA -"3918","String 3917",3917,12305.6184241112,NA -"3919","String 3918",3918,12308.7600167648,NA -"3920","String 3919",3919,12311.9016094184,NA -"3921","String 3920",3920,12315.043202072,NA -"3922","String 3921",3921,12318.1847947256,NA -"3923","String 3922",3922,12321.3263873792,NA -"3924","String 3923",3923,12324.4679800328,NA -"3925","String 3924",3924,12327.6095726863,NA -"3926","String 3925",3925,12330.7511653399,NA -"3927","String 3926",3926,12333.8927579935,NA -"3928","String 3927",3927,12337.0343506471,NA -"3929","String 3928",3928,12340.1759433007,NA -"3930","String 3929",3929,12343.3175359543,NA -"3931","String 3930",3930,12346.4591286079,NA -"3932","String 3931",3931,12349.6007212615,NA -"3933","String 3932",3932,12352.7423139151,NA -"3934","String 3933",3933,12355.8839065687,NA -"3935","String 3934",3934,12359.0254992222,NA -"3936","String 3935",3935,12362.1670918758,NA -"3937","String 3936",3936,12365.3086845294,NA -"3938","String 3937",3937,12368.450277183,NA -"3939","String 3938",3938,12371.5918698366,NA -"3940","String 3939",3939,12374.7334624902,NA -"3941","String 3940",3940,12377.8750551438,NA -"3942","String 3941",3941,12381.0166477974,NA -"3943","String 3942",3942,12384.158240451,NA -"3944","String 3943",3943,12387.2998331046,NA -"3945","String 3944",3944,12390.4414257581,NA -"3946","String 3945",3945,12393.5830184117,NA -"3947","String 3946",3946,12396.7246110653,NA -"3948","String 3947",3947,12399.8662037189,NA -"3949","String 3948",3948,12403.0077963725,NA -"3950","String 3949",3949,12406.1493890261,NA -"3951","String 3950",3950,12409.2909816797,NA -"3952","String 3951",3951,12412.4325743333,NA -"3953","String 3952",3952,12415.5741669869,NA -"3954","String 3953",3953,12418.7157596405,NA -"3955","String 3954",3954,12421.857352294,NA -"3956","String 3955",3955,12424.9989449476,NA -"3957","String 3956",3956,12428.1405376012,NA -"3958","String 3957",3957,12431.2821302548,NA -"3959","String 3958",3958,12434.4237229084,NA -"3960","String 3959",3959,12437.565315562,NA -"3961","String 3960",3960,12440.7069082156,NA -"3962","String 3961",3961,12443.8485008692,NA -"3963","String 3962",3962,12446.9900935228,NA -"3964","String 3963",3963,12450.1316861763,NA -"3965","String 3964",3964,12453.2732788299,NA -"3966","String 3965",3965,12456.4148714835,NA -"3967","String 3966",3966,12459.5564641371,NA -"3968","String 3967",3967,12462.6980567907,NA -"3969","String 3968",3968,12465.8396494443,NA -"3970","String 3969",3969,12468.9812420979,NA -"3971","String 3970",3970,12472.1228347515,NA -"3972","String 3971",3971,12475.2644274051,NA -"3973","String 3972",3972,12478.4060200587,NA -"3974","String 3973",3973,12481.5476127122,NA -"3975","String 3974",3974,12484.6892053658,NA -"3976","String 3975",3975,12487.8307980194,NA -"3977","String 3976",3976,12490.972390673,NA -"3978","String 3977",3977,12494.1139833266,NA -"3979","String 3978",3978,12497.2555759802,NA -"3980","String 3979",3979,12500.3971686338,NA -"3981","String 3980",3980,12503.5387612874,NA -"3982","String 3981",3981,12506.680353941,NA -"3983","String 3982",3982,12509.8219465946,NA -"3984","String 3983",3983,12512.9635392481,NA -"3985","String 3984",3984,12516.1051319017,NA -"3986","String 3985",3985,12519.2467245553,NA -"3987","String 3986",3986,12522.3883172089,NA -"3988","String 3987",3987,12525.5299098625,NA -"3989","String 3988",3988,12528.6715025161,NA -"3990","String 3989",3989,12531.8130951697,NA -"3991","String 3990",3990,12534.9546878233,NA -"3992","String 3991",3991,12538.0962804769,NA -"3993","String 3992",3992,12541.2378731305,NA -"3994","String 3993",3993,12544.379465784,NA -"3995","String 3994",3994,12547.5210584376,NA -"3996","String 3995",3995,12550.6626510912,NA -"3997","String 3996",3996,12553.8042437448,NA -"3998","String 3997",3997,12556.9458363984,NA -"3999","String 3998",3998,12560.087429052,NA -"4000","String 3999",3999,12563.2290217056,NA -"4001","String 4000",4000,12566.3706143592,NA -"4002","String 4001",4001,12569.5122070128,NA -"4003","String 4002",4002,12572.6537996664,NA -"4004","String 4003",4003,12575.7953923199,NA -"4005","String 4004",4004,12578.9369849735,NA -"4006","String 4005",4005,12582.0785776271,NA -"4007","String 4006",4006,12585.2201702807,NA -"4008","String 4007",4007,12588.3617629343,NA -"4009","String 4008",4008,12591.5033555879,NA -"4010","String 4009",4009,12594.6449482415,NA -"4011","String 4010",4010,12597.7865408951,NA -"4012","String 4011",4011,12600.9281335487,NA -"4013","String 4012",4012,12604.0697262022,NA -"4014","String 4013",4013,12607.2113188558,NA -"4015","String 4014",4014,12610.3529115094,NA -"4016","String 4015",4015,12613.494504163,NA -"4017","String 4016",4016,12616.6360968166,NA -"4018","String 4017",4017,12619.7776894702,NA -"4019","String 4018",4018,12622.9192821238,NA -"4020","String 4019",4019,12626.0608747774,NA -"4021","String 4020",4020,12629.202467431,NA -"4022","String 4021",4021,12632.3440600846,NA -"4023","String 4022",4022,12635.4856527381,NA -"4024","String 4023",4023,12638.6272453917,NA -"4025","String 4024",4024,12641.7688380453,NA -"4026","String 4025",4025,12644.9104306989,NA -"4027","String 4026",4026,12648.0520233525,NA -"4028","String 4027",4027,12651.1936160061,NA -"4029","String 4028",4028,12654.3352086597,NA -"4030","String 4029",4029,12657.4768013133,NA -"4031","String 4030",4030,12660.6183939669,NA -"4032","String 4031",4031,12663.7599866205,NA -"4033","String 4032",4032,12666.901579274,NA -"4034","String 4033",4033,12670.0431719276,NA -"4035","String 4034",4034,12673.1847645812,NA -"4036","String 4035",4035,12676.3263572348,NA -"4037","String 4036",4036,12679.4679498884,NA -"4038","String 4037",4037,12682.609542542,NA -"4039","String 4038",4038,12685.7511351956,NA -"4040","String 4039",4039,12688.8927278492,NA -"4041","String 4040",4040,12692.0343205028,NA -"4042","String 4041",4041,12695.1759131564,NA -"4043","String 4042",4042,12698.3175058099,NA -"4044","String 4043",4043,12701.4590984635,NA -"4045","String 4044",4044,12704.6006911171,NA -"4046","String 4045",4045,12707.7422837707,NA -"4047","String 4046",4046,12710.8838764243,NA -"4048","String 4047",4047,12714.0254690779,NA -"4049","String 4048",4048,12717.1670617315,NA -"4050","String 4049",4049,12720.3086543851,NA -"4051","String 4050",4050,12723.4502470387,NA -"4052","String 4051",4051,12726.5918396923,NA -"4053","String 4052",4052,12729.7334323458,NA -"4054","String 4053",4053,12732.8750249994,NA -"4055","String 4054",4054,12736.016617653,NA -"4056","String 4055",4055,12739.1582103066,NA -"4057","String 4056",4056,12742.2998029602,NA -"4058","String 4057",4057,12745.4413956138,NA -"4059","String 4058",4058,12748.5829882674,NA -"4060","String 4059",4059,12751.724580921,NA -"4061","String 4060",4060,12754.8661735746,NA -"4062","String 4061",4061,12758.0077662281,NA -"4063","String 4062",4062,12761.1493588817,NA -"4064","String 4063",4063,12764.2909515353,NA -"4065","String 4064",4064,12767.4325441889,NA -"4066","String 4065",4065,12770.5741368425,NA -"4067","String 4066",4066,12773.7157294961,NA -"4068","String 4067",4067,12776.8573221497,NA -"4069","String 4068",4068,12779.9989148033,NA -"4070","String 4069",4069,12783.1405074569,NA -"4071","String 4070",4070,12786.2821001105,NA -"4072","String 4071",4071,12789.423692764,NA -"4073","String 4072",4072,12792.5652854176,NA -"4074","String 4073",4073,12795.7068780712,NA -"4075","String 4074",4074,12798.8484707248,NA -"4076","String 4075",4075,12801.9900633784,NA -"4077","String 4076",4076,12805.131656032,NA -"4078","String 4077",4077,12808.2732486856,NA -"4079","String 4078",4078,12811.4148413392,NA -"4080","String 4079",4079,12814.5564339928,NA -"4081","String 4080",4080,12817.6980266464,NA -"4082","String 4081",4081,12820.8396192999,NA -"4083","String 4082",4082,12823.9812119535,NA -"4084","String 4083",4083,12827.1228046071,NA -"4085","String 4084",4084,12830.2643972607,NA -"4086","String 4085",4085,12833.4059899143,NA -"4087","String 4086",4086,12836.5475825679,NA -"4088","String 4087",4087,12839.6891752215,NA -"4089","String 4088",4088,12842.8307678751,NA -"4090","String 4089",4089,12845.9723605287,NA -"4091","String 4090",4090,12849.1139531823,NA -"4092","String 4091",4091,12852.2555458358,NA -"4093","String 4092",4092,12855.3971384894,NA -"4094","String 4093",4093,12858.538731143,NA -"4095","String 4094",4094,12861.6803237966,NA -"4096","String 4095",4095,12864.8219164502,NA -"4097","String 4096",4096,12867.9635091038,NA -"4098","String 4097",4097,12871.1051017574,NA -"4099","String 4098",4098,12874.246694411,NA -"4100","String 4099",4099,12877.3882870646,NA -"4101","String 4100",4100,12880.5298797182,NA -"4102","String 4101",4101,12883.6714723717,NA -"4103","String 4102",4102,12886.8130650253,NA -"4104","String 4103",4103,12889.9546576789,NA -"4105","String 4104",4104,12893.0962503325,NA -"4106","String 4105",4105,12896.2378429861,NA -"4107","String 4106",4106,12899.3794356397,NA -"4108","String 4107",4107,12902.5210282933,NA -"4109","String 4108",4108,12905.6626209469,NA -"4110","String 4109",4109,12908.8042136005,NA -"4111","String 4110",4110,12911.945806254,NA -"4112","String 4111",4111,12915.0873989076,NA -"4113","String 4112",4112,12918.2289915612,NA -"4114","String 4113",4113,12921.3705842148,NA -"4115","String 4114",4114,12924.5121768684,NA -"4116","String 4115",4115,12927.653769522,NA -"4117","String 4116",4116,12930.7953621756,NA -"4118","String 4117",4117,12933.9369548292,NA -"4119","String 4118",4118,12937.0785474828,NA -"4120","String 4119",4119,12940.2201401364,NA -"4121","String 4120",4120,12943.3617327899,NA -"4122","String 4121",4121,12946.5033254435,NA -"4123","String 4122",4122,12949.6449180971,NA -"4124","String 4123",4123,12952.7865107507,NA -"4125","String 4124",4124,12955.9281034043,NA -"4126","String 4125",4125,12959.0696960579,NA -"4127","String 4126",4126,12962.2112887115,NA -"4128","String 4127",4127,12965.3528813651,NA -"4129","String 4128",4128,12968.4944740187,NA -"4130","String 4129",4129,12971.6360666723,NA -"4131","String 4130",4130,12974.7776593258,NA -"4132","String 4131",4131,12977.9192519794,NA -"4133","String 4132",4132,12981.060844633,NA -"4134","String 4133",4133,12984.2024372866,NA -"4135","String 4134",4134,12987.3440299402,NA -"4136","String 4135",4135,12990.4856225938,NA -"4137","String 4136",4136,12993.6272152474,NA -"4138","String 4137",4137,12996.768807901,NA -"4139","String 4138",4138,12999.9104005546,NA -"4140","String 4139",4139,13003.0519932082,NA -"4141","String 4140",4140,13006.1935858617,NA -"4142","String 4141",4141,13009.3351785153,NA -"4143","String 4142",4142,13012.4767711689,NA -"4144","String 4143",4143,13015.6183638225,NA -"4145","String 4144",4144,13018.7599564761,NA -"4146","String 4145",4145,13021.9015491297,NA -"4147","String 4146",4146,13025.0431417833,NA -"4148","String 4147",4147,13028.1847344369,NA -"4149","String 4148",4148,13031.3263270905,NA -"4150","String 4149",4149,13034.4679197441,NA -"4151","String 4150",4150,13037.6095123976,NA -"4152","String 4151",4151,13040.7511050512,NA -"4153","String 4152",4152,13043.8926977048,NA -"4154","String 4153",4153,13047.0342903584,NA -"4155","String 4154",4154,13050.175883012,NA -"4156","String 4155",4155,13053.3174756656,NA -"4157","String 4156",4156,13056.4590683192,NA -"4158","String 4157",4157,13059.6006609728,NA -"4159","String 4158",4158,13062.7422536264,NA -"4160","String 4159",4159,13065.88384628,NA -"4161","String 4160",4160,13069.0254389335,NA -"4162","String 4161",4161,13072.1670315871,NA -"4163","String 4162",4162,13075.3086242407,NA -"4164","String 4163",4163,13078.4502168943,NA -"4165","String 4164",4164,13081.5918095479,NA -"4166","String 4165",4165,13084.7334022015,NA -"4167","String 4166",4166,13087.8749948551,NA -"4168","String 4167",4167,13091.0165875087,NA -"4169","String 4168",4168,13094.1581801623,NA -"4170","String 4169",4169,13097.2997728158,NA -"4171","String 4170",4170,13100.4413654694,NA -"4172","String 4171",4171,13103.582958123,NA -"4173","String 4172",4172,13106.7245507766,NA -"4174","String 4173",4173,13109.8661434302,NA -"4175","String 4174",4174,13113.0077360838,NA -"4176","String 4175",4175,13116.1493287374,NA -"4177","String 4176",4176,13119.290921391,NA -"4178","String 4177",4177,13122.4325140446,NA -"4179","String 4178",4178,13125.5741066982,NA -"4180","String 4179",4179,13128.7156993517,NA -"4181","String 4180",4180,13131.8572920053,NA -"4182","String 4181",4181,13134.9988846589,NA -"4183","String 4182",4182,13138.1404773125,NA -"4184","String 4183",4183,13141.2820699661,NA -"4185","String 4184",4184,13144.4236626197,NA -"4186","String 4185",4185,13147.5652552733,NA -"4187","String 4186",4186,13150.7068479269,NA -"4188","String 4187",4187,13153.8484405805,NA -"4189","String 4188",4188,13156.9900332341,NA -"4190","String 4189",4189,13160.1316258876,NA -"4191","String 4190",4190,13163.2732185412,NA -"4192","String 4191",4191,13166.4148111948,NA -"4193","String 4192",4192,13169.5564038484,NA -"4194","String 4193",4193,13172.697996502,NA -"4195","String 4194",4194,13175.8395891556,NA -"4196","String 4195",4195,13178.9811818092,NA -"4197","String 4196",4196,13182.1227744628,NA -"4198","String 4197",4197,13185.2643671164,NA -"4199","String 4198",4198,13188.40595977,NA -"4200","String 4199",4199,13191.5475524235,NA -"4201","String 4200",4200,13194.6891450771,NA -"4202","String 4201",4201,13197.8307377307,NA -"4203","String 4202",4202,13200.9723303843,NA -"4204","String 4203",4203,13204.1139230379,NA -"4205","String 4204",4204,13207.2555156915,NA -"4206","String 4205",4205,13210.3971083451,NA -"4207","String 4206",4206,13213.5387009987,NA -"4208","String 4207",4207,13216.6802936523,NA -"4209","String 4208",4208,13219.8218863059,NA -"4210","String 4209",4209,13222.9634789594,NA -"4211","String 4210",4210,13226.105071613,NA -"4212","String 4211",4211,13229.2466642666,NA -"4213","String 4212",4212,13232.3882569202,NA -"4214","String 4213",4213,13235.5298495738,NA -"4215","String 4214",4214,13238.6714422274,NA -"4216","String 4215",4215,13241.813034881,NA -"4217","String 4216",4216,13244.9546275346,NA -"4218","String 4217",4217,13248.0962201882,NA -"4219","String 4218",4218,13251.2378128417,NA -"4220","String 4219",4219,13254.3794054953,NA -"4221","String 4220",4220,13257.5209981489,NA -"4222","String 4221",4221,13260.6625908025,NA -"4223","String 4222",4222,13263.8041834561,NA -"4224","String 4223",4223,13266.9457761097,NA -"4225","String 4224",4224,13270.0873687633,NA -"4226","String 4225",4225,13273.2289614169,NA -"4227","String 4226",4226,13276.3705540705,NA -"4228","String 4227",4227,13279.5121467241,NA -"4229","String 4228",4228,13282.6537393776,NA -"4230","String 4229",4229,13285.7953320312,NA -"4231","String 4230",4230,13288.9369246848,NA -"4232","String 4231",4231,13292.0785173384,NA -"4233","String 4232",4232,13295.220109992,NA -"4234","String 4233",4233,13298.3617026456,NA -"4235","String 4234",4234,13301.5032952992,NA -"4236","String 4235",4235,13304.6448879528,NA -"4237","String 4236",4236,13307.7864806064,NA -"4238","String 4237",4237,13310.92807326,NA -"4239","String 4238",4238,13314.0696659135,NA -"4240","String 4239",4239,13317.2112585671,NA -"4241","String 4240",4240,13320.3528512207,NA -"4242","String 4241",4241,13323.4944438743,NA -"4243","String 4242",4242,13326.6360365279,NA -"4244","String 4243",4243,13329.7776291815,NA -"4245","String 4244",4244,13332.9192218351,NA -"4246","String 4245",4245,13336.0608144887,NA -"4247","String 4246",4246,13339.2024071423,NA -"4248","String 4247",4247,13342.3439997959,NA -"4249","String 4248",4248,13345.4855924494,NA -"4250","String 4249",4249,13348.627185103,NA -"4251","String 4250",4250,13351.7687777566,NA -"4252","String 4251",4251,13354.9103704102,NA -"4253","String 4252",4252,13358.0519630638,NA -"4254","String 4253",4253,13361.1935557174,NA -"4255","String 4254",4254,13364.335148371,NA -"4256","String 4255",4255,13367.4767410246,NA -"4257","String 4256",4256,13370.6183336782,NA -"4258","String 4257",4257,13373.7599263317,NA -"4259","String 4258",4258,13376.9015189853,NA -"4260","String 4259",4259,13380.0431116389,NA -"4261","String 4260",4260,13383.1847042925,NA -"4262","String 4261",4261,13386.3262969461,NA -"4263","String 4262",4262,13389.4678895997,NA -"4264","String 4263",4263,13392.6094822533,NA -"4265","String 4264",4264,13395.7510749069,NA -"4266","String 4265",4265,13398.8926675605,NA -"4267","String 4266",4266,13402.0342602141,NA -"4268","String 4267",4267,13405.1758528676,NA -"4269","String 4268",4268,13408.3174455212,NA -"4270","String 4269",4269,13411.4590381748,NA -"4271","String 4270",4270,13414.6006308284,NA -"4272","String 4271",4271,13417.742223482,NA -"4273","String 4272",4272,13420.8838161356,NA -"4274","String 4273",4273,13424.0254087892,NA -"4275","String 4274",4274,13427.1670014428,NA -"4276","String 4275",4275,13430.3085940964,NA -"4277","String 4276",4276,13433.45018675,NA -"4278","String 4277",4277,13436.5917794035,NA -"4279","String 4278",4278,13439.7333720571,NA -"4280","String 4279",4279,13442.8749647107,NA -"4281","String 4280",4280,13446.0165573643,NA -"4282","String 4281",4281,13449.1581500179,NA -"4283","String 4282",4282,13452.2997426715,NA -"4284","String 4283",4283,13455.4413353251,NA -"4285","String 4284",4284,13458.5829279787,NA -"4286","String 4285",4285,13461.7245206323,NA -"4287","String 4286",4286,13464.8661132859,NA -"4288","String 4287",4287,13468.0077059394,NA -"4289","String 4288",4288,13471.149298593,NA -"4290","String 4289",4289,13474.2908912466,NA -"4291","String 4290",4290,13477.4324839002,NA -"4292","String 4291",4291,13480.5740765538,NA -"4293","String 4292",4292,13483.7156692074,NA -"4294","String 4293",4293,13486.857261861,NA -"4295","String 4294",4294,13489.9988545146,NA -"4296","String 4295",4295,13493.1404471682,NA -"4297","String 4296",4296,13496.2820398218,NA -"4298","String 4297",4297,13499.4236324753,NA -"4299","String 4298",4298,13502.5652251289,NA -"4300","String 4299",4299,13505.7068177825,NA -"4301","String 4300",4300,13508.8484104361,NA -"4302","String 4301",4301,13511.9900030897,NA -"4303","String 4302",4302,13515.1315957433,NA -"4304","String 4303",4303,13518.2731883969,NA -"4305","String 4304",4304,13521.4147810505,NA -"4306","String 4305",4305,13524.5563737041,NA -"4307","String 4306",4306,13527.6979663576,NA -"4308","String 4307",4307,13530.8395590112,NA -"4309","String 4308",4308,13533.9811516648,NA -"4310","String 4309",4309,13537.1227443184,NA -"4311","String 4310",4310,13540.264336972,NA -"4312","String 4311",4311,13543.4059296256,NA -"4313","String 4312",4312,13546.5475222792,NA -"4314","String 4313",4313,13549.6891149328,NA -"4315","String 4314",4314,13552.8307075864,NA -"4316","String 4315",4315,13555.97230024,NA -"4317","String 4316",4316,13559.1138928935,NA -"4318","String 4317",4317,13562.2554855471,NA -"4319","String 4318",4318,13565.3970782007,NA -"4320","String 4319",4319,13568.5386708543,NA -"4321","String 4320",4320,13571.6802635079,NA -"4322","String 4321",4321,13574.8218561615,NA -"4323","String 4322",4322,13577.9634488151,NA -"4324","String 4323",4323,13581.1050414687,NA -"4325","String 4324",4324,13584.2466341223,NA -"4326","String 4325",4325,13587.3882267759,NA -"4327","String 4326",4326,13590.5298194294,NA -"4328","String 4327",4327,13593.671412083,NA -"4329","String 4328",4328,13596.8130047366,NA -"4330","String 4329",4329,13599.9545973902,NA -"4331","String 4330",4330,13603.0961900438,NA -"4332","String 4331",4331,13606.2377826974,NA -"4333","String 4332",4332,13609.379375351,NA -"4334","String 4333",4333,13612.5209680046,NA -"4335","String 4334",4334,13615.6625606582,NA -"4336","String 4335",4335,13618.8041533118,NA -"4337","String 4336",4336,13621.9457459653,NA -"4338","String 4337",4337,13625.0873386189,NA -"4339","String 4338",4338,13628.2289312725,NA -"4340","String 4339",4339,13631.3705239261,NA -"4341","String 4340",4340,13634.5121165797,NA -"4342","String 4341",4341,13637.6537092333,NA -"4343","String 4342",4342,13640.7953018869,NA -"4344","String 4343",4343,13643.9368945405,NA -"4345","String 4344",4344,13647.0784871941,NA -"4346","String 4345",4345,13650.2200798477,NA -"4347","String 4346",4346,13653.3616725012,NA -"4348","String 4347",4347,13656.5032651548,NA -"4349","String 4348",4348,13659.6448578084,NA -"4350","String 4349",4349,13662.786450462,NA -"4351","String 4350",4350,13665.9280431156,NA -"4352","String 4351",4351,13669.0696357692,NA -"4353","String 4352",4352,13672.2112284228,NA -"4354","String 4353",4353,13675.3528210764,NA -"4355","String 4354",4354,13678.49441373,NA -"4356","String 4355",4355,13681.6360063835,NA -"4357","String 4356",4356,13684.7775990371,NA -"4358","String 4357",4357,13687.9191916907,NA -"4359","String 4358",4358,13691.0607843443,NA -"4360","String 4359",4359,13694.2023769979,NA -"4361","String 4360",4360,13697.3439696515,NA -"4362","String 4361",4361,13700.4855623051,NA -"4363","String 4362",4362,13703.6271549587,NA -"4364","String 4363",4363,13706.7687476123,NA -"4365","String 4364",4364,13709.9103402659,NA -"4366","String 4365",4365,13713.0519329194,NA -"4367","String 4366",4366,13716.193525573,NA -"4368","String 4367",4367,13719.3351182266,NA -"4369","String 4368",4368,13722.4767108802,NA -"4370","String 4369",4369,13725.6183035338,NA -"4371","String 4370",4370,13728.7598961874,NA -"4372","String 4371",4371,13731.901488841,NA -"4373","String 4372",4372,13735.0430814946,NA -"4374","String 4373",4373,13738.1846741482,NA -"4375","String 4374",4374,13741.3262668018,NA -"4376","String 4375",4375,13744.4678594553,NA -"4377","String 4376",4376,13747.6094521089,NA -"4378","String 4377",4377,13750.7510447625,NA -"4379","String 4378",4378,13753.8926374161,NA -"4380","String 4379",4379,13757.0342300697,NA -"4381","String 4380",4380,13760.1758227233,NA -"4382","String 4381",4381,13763.3174153769,NA -"4383","String 4382",4382,13766.4590080305,NA -"4384","String 4383",4383,13769.6006006841,NA -"4385","String 4384",4384,13772.7421933377,NA -"4386","String 4385",4385,13775.8837859912,NA -"4387","String 4386",4386,13779.0253786448,NA -"4388","String 4387",4387,13782.1669712984,NA -"4389","String 4388",4388,13785.308563952,NA -"4390","String 4389",4389,13788.4501566056,NA -"4391","String 4390",4390,13791.5917492592,NA -"4392","String 4391",4391,13794.7333419128,NA -"4393","String 4392",4392,13797.8749345664,NA -"4394","String 4393",4393,13801.01652722,NA -"4395","String 4394",4394,13804.1581198736,NA -"4396","String 4395",4395,13807.2997125271,NA -"4397","String 4396",4396,13810.4413051807,NA -"4398","String 4397",4397,13813.5828978343,NA -"4399","String 4398",4398,13816.7244904879,NA -"4400","String 4399",4399,13819.8660831415,NA -"4401","String 4400",4400,13823.0076757951,NA -"4402","String 4401",4401,13826.1492684487,NA -"4403","String 4402",4402,13829.2908611023,NA -"4404","String 4403",4403,13832.4324537559,NA -"4405","String 4404",4404,13835.5740464094,NA -"4406","String 4405",4405,13838.715639063,NA -"4407","String 4406",4406,13841.8572317166,NA -"4408","String 4407",4407,13844.9988243702,NA -"4409","String 4408",4408,13848.1404170238,NA -"4410","String 4409",4409,13851.2820096774,NA -"4411","String 4410",4410,13854.423602331,NA -"4412","String 4411",4411,13857.5651949846,NA -"4413","String 4412",4412,13860.7067876382,NA -"4414","String 4413",4413,13863.8483802918,NA -"4415","String 4414",4414,13866.9899729453,NA -"4416","String 4415",4415,13870.1315655989,NA -"4417","String 4416",4416,13873.2731582525,NA -"4418","String 4417",4417,13876.4147509061,NA -"4419","String 4418",4418,13879.5563435597,NA -"4420","String 4419",4419,13882.6979362133,NA -"4421","String 4420",4420,13885.8395288669,NA -"4422","String 4421",4421,13888.9811215205,NA -"4423","String 4422",4422,13892.1227141741,NA -"4424","String 4423",4423,13895.2643068277,NA -"4425","String 4424",4424,13898.4058994812,NA -"4426","String 4425",4425,13901.5474921348,NA -"4427","String 4426",4426,13904.6890847884,NA -"4428","String 4427",4427,13907.830677442,NA -"4429","String 4428",4428,13910.9722700956,NA -"4430","String 4429",4429,13914.1138627492,NA -"4431","String 4430",4430,13917.2554554028,NA -"4432","String 4431",4431,13920.3970480564,NA -"4433","String 4432",4432,13923.53864071,NA -"4434","String 4433",4433,13926.6802333636,NA -"4435","String 4434",4434,13929.8218260171,NA -"4436","String 4435",4435,13932.9634186707,NA -"4437","String 4436",4436,13936.1050113243,NA -"4438","String 4437",4437,13939.2466039779,NA -"4439","String 4438",4438,13942.3881966315,NA -"4440","String 4439",4439,13945.5297892851,NA -"4441","String 4440",4440,13948.6713819387,NA -"4442","String 4441",4441,13951.8129745923,NA -"4443","String 4442",4442,13954.9545672459,NA -"4444","String 4443",4443,13958.0961598995,NA -"4445","String 4444",4444,13961.237752553,NA -"4446","String 4445",4445,13964.3793452066,NA -"4447","String 4446",4446,13967.5209378602,NA -"4448","String 4447",4447,13970.6625305138,NA -"4449","String 4448",4448,13973.8041231674,NA -"4450","String 4449",4449,13976.945715821,NA -"4451","String 4450",4450,13980.0873084746,NA -"4452","String 4451",4451,13983.2289011282,NA -"4453","String 4452",4452,13986.3704937818,NA -"4454","String 4453",4453,13989.5120864353,NA -"4455","String 4454",4454,13992.6536790889,NA -"4456","String 4455",4455,13995.7952717425,NA -"4457","String 4456",4456,13998.9368643961,NA -"4458","String 4457",4457,14002.0784570497,NA -"4459","String 4458",4458,14005.2200497033,NA -"4460","String 4459",4459,14008.3616423569,NA -"4461","String 4460",4460,14011.5032350105,NA -"4462","String 4461",4461,14014.6448276641,NA -"4463","String 4462",4462,14017.7864203177,NA -"4464","String 4463",4463,14020.9280129712,NA -"4465","String 4464",4464,14024.0696056248,NA -"4466","String 4465",4465,14027.2111982784,NA -"4467","String 4466",4466,14030.352790932,NA -"4468","String 4467",4467,14033.4943835856,NA -"4469","String 4468",4468,14036.6359762392,NA -"4470","String 4469",4469,14039.7775688928,NA -"4471","String 4470",4470,14042.9191615464,NA -"4472","String 4471",4471,14046.0607542,NA -"4473","String 4472",4472,14049.2023468536,NA -"4474","String 4473",4473,14052.3439395071,NA -"4475","String 4474",4474,14055.4855321607,NA -"4476","String 4475",4475,14058.6271248143,NA -"4477","String 4476",4476,14061.7687174679,NA -"4478","String 4477",4477,14064.9103101215,NA -"4479","String 4478",4478,14068.0519027751,NA -"4480","String 4479",4479,14071.1934954287,NA -"4481","String 4480",4480,14074.3350880823,NA -"4482","String 4481",4481,14077.4766807359,NA -"4483","String 4482",4482,14080.6182733895,NA -"4484","String 4483",4483,14083.759866043,NA -"4485","String 4484",4484,14086.9014586966,NA -"4486","String 4485",4485,14090.0430513502,NA -"4487","String 4486",4486,14093.1846440038,NA -"4488","String 4487",4487,14096.3262366574,NA -"4489","String 4488",4488,14099.467829311,NA -"4490","String 4489",4489,14102.6094219646,NA -"4491","String 4490",4490,14105.7510146182,NA -"4492","String 4491",4491,14108.8926072718,NA -"4493","String 4492",4492,14112.0341999254,NA -"4494","String 4493",4493,14115.1757925789,NA -"4495","String 4494",4494,14118.3173852325,NA -"4496","String 4495",4495,14121.4589778861,NA -"4497","String 4496",4496,14124.6005705397,NA -"4498","String 4497",4497,14127.7421631933,NA -"4499","String 4498",4498,14130.8837558469,NA -"4500","String 4499",4499,14134.0253485005,NA -"4501","String 4500",4500,14137.1669411541,NA -"4502","String 4501",4501,14140.3085338077,NA -"4503","String 4502",4502,14143.4501264612,NA -"4504","String 4503",4503,14146.5917191148,NA -"4505","String 4504",4504,14149.7333117684,NA -"4506","String 4505",4505,14152.874904422,NA -"4507","String 4506",4506,14156.0164970756,NA -"4508","String 4507",4507,14159.1580897292,NA -"4509","String 4508",4508,14162.2996823828,NA -"4510","String 4509",4509,14165.4412750364,NA -"4511","String 4510",4510,14168.58286769,NA -"4512","String 4511",4511,14171.7244603436,NA -"4513","String 4512",4512,14174.8660529971,NA -"4514","String 4513",4513,14178.0076456507,NA -"4515","String 4514",4514,14181.1492383043,NA -"4516","String 4515",4515,14184.2908309579,NA -"4517","String 4516",4516,14187.4324236115,NA -"4518","String 4517",4517,14190.5740162651,NA -"4519","String 4518",4518,14193.7156089187,NA -"4520","String 4519",4519,14196.8572015723,NA -"4521","String 4520",4520,14199.9987942259,NA -"4522","String 4521",4521,14203.1403868795,NA -"4523","String 4522",4522,14206.281979533,NA -"4524","String 4523",4523,14209.4235721866,NA -"4525","String 4524",4524,14212.5651648402,NA -"4526","String 4525",4525,14215.7067574938,NA -"4527","String 4526",4526,14218.8483501474,NA -"4528","String 4527",4527,14221.989942801,NA -"4529","String 4528",4528,14225.1315354546,NA -"4530","String 4529",4529,14228.2731281082,NA -"4531","String 4530",4530,14231.4147207618,NA -"4532","String 4531",4531,14234.5563134154,NA -"4533","String 4532",4532,14237.6979060689,NA -"4534","String 4533",4533,14240.8394987225,NA -"4535","String 4534",4534,14243.9810913761,NA -"4536","String 4535",4535,14247.1226840297,NA -"4537","String 4536",4536,14250.2642766833,NA -"4538","String 4537",4537,14253.4058693369,NA -"4539","String 4538",4538,14256.5474619905,NA -"4540","String 4539",4539,14259.6890546441,NA -"4541","String 4540",4540,14262.8306472977,NA -"4542","String 4541",4541,14265.9722399513,NA -"4543","String 4542",4542,14269.1138326048,NA -"4544","String 4543",4543,14272.2554252584,NA -"4545","String 4544",4544,14275.397017912,NA -"4546","String 4545",4545,14278.5386105656,NA -"4547","String 4546",4546,14281.6802032192,NA -"4548","String 4547",4547,14284.8217958728,NA -"4549","String 4548",4548,14287.9633885264,NA -"4550","String 4549",4549,14291.10498118,NA -"4551","String 4550",4550,14294.2465738336,NA -"4552","String 4551",4551,14297.3881664871,NA -"4553","String 4552",4552,14300.5297591407,NA -"4554","String 4553",4553,14303.6713517943,NA -"4555","String 4554",4554,14306.8129444479,NA -"4556","String 4555",4555,14309.9545371015,NA -"4557","String 4556",4556,14313.0961297551,NA -"4558","String 4557",4557,14316.2377224087,NA -"4559","String 4558",4558,14319.3793150623,NA -"4560","String 4559",4559,14322.5209077159,NA -"4561","String 4560",4560,14325.6625003695,NA -"4562","String 4561",4561,14328.804093023,NA -"4563","String 4562",4562,14331.9456856766,NA -"4564","String 4563",4563,14335.0872783302,NA -"4565","String 4564",4564,14338.2288709838,NA -"4566","String 4565",4565,14341.3704636374,NA -"4567","String 4566",4566,14344.512056291,NA -"4568","String 4567",4567,14347.6536489446,NA -"4569","String 4568",4568,14350.7952415982,NA -"4570","String 4569",4569,14353.9368342518,NA -"4571","String 4570",4570,14357.0784269054,NA -"4572","String 4571",4571,14360.2200195589,NA -"4573","String 4572",4572,14363.3616122125,NA -"4574","String 4573",4573,14366.5032048661,NA -"4575","String 4574",4574,14369.6447975197,NA -"4576","String 4575",4575,14372.7863901733,NA -"4577","String 4576",4576,14375.9279828269,NA -"4578","String 4577",4577,14379.0695754805,NA -"4579","String 4578",4578,14382.2111681341,NA -"4580","String 4579",4579,14385.3527607877,NA -"4581","String 4580",4580,14388.4943534413,NA -"4582","String 4581",4581,14391.6359460948,NA -"4583","String 4582",4582,14394.7775387484,NA -"4584","String 4583",4583,14397.919131402,NA -"4585","String 4584",4584,14401.0607240556,NA -"4586","String 4585",4585,14404.2023167092,NA -"4587","String 4586",4586,14407.3439093628,NA -"4588","String 4587",4587,14410.4855020164,NA -"4589","String 4588",4588,14413.62709467,NA -"4590","String 4589",4589,14416.7686873236,NA -"4591","String 4590",4590,14419.9102799771,NA -"4592","String 4591",4591,14423.0518726307,NA -"4593","String 4592",4592,14426.1934652843,NA -"4594","String 4593",4593,14429.3350579379,NA -"4595","String 4594",4594,14432.4766505915,NA -"4596","String 4595",4595,14435.6182432451,NA -"4597","String 4596",4596,14438.7598358987,NA -"4598","String 4597",4597,14441.9014285523,NA -"4599","String 4598",4598,14445.0430212059,NA -"4600","String 4599",4599,14448.1846138595,NA -"4601","String 4600",4600,14451.326206513,NA -"4602","String 4601",4601,14454.4677991666,NA -"4603","String 4602",4602,14457.6093918202,NA -"4604","String 4603",4603,14460.7509844738,NA -"4605","String 4604",4604,14463.8925771274,NA -"4606","String 4605",4605,14467.034169781,NA -"4607","String 4606",4606,14470.1757624346,NA -"4608","String 4607",4607,14473.3173550882,NA -"4609","String 4608",4608,14476.4589477418,NA -"4610","String 4609",4609,14479.6005403954,NA -"4611","String 4610",4610,14482.7421330489,NA -"4612","String 4611",4611,14485.8837257025,NA -"4613","String 4612",4612,14489.0253183561,NA -"4614","String 4613",4613,14492.1669110097,NA -"4615","String 4614",4614,14495.3085036633,NA -"4616","String 4615",4615,14498.4500963169,NA -"4617","String 4616",4616,14501.5916889705,NA -"4618","String 4617",4617,14504.7332816241,NA -"4619","String 4618",4618,14507.8748742777,NA -"4620","String 4619",4619,14511.0164669313,NA -"4621","String 4620",4620,14514.1580595848,NA -"4622","String 4621",4621,14517.2996522384,NA -"4623","String 4622",4622,14520.441244892,NA -"4624","String 4623",4623,14523.5828375456,NA -"4625","String 4624",4624,14526.7244301992,NA -"4626","String 4625",4625,14529.8660228528,NA -"4627","String 4626",4626,14533.0076155064,NA -"4628","String 4627",4627,14536.14920816,NA -"4629","String 4628",4628,14539.2908008136,NA -"4630","String 4629",4629,14542.4323934672,NA -"4631","String 4630",4630,14545.5739861207,NA -"4632","String 4631",4631,14548.7155787743,NA -"4633","String 4632",4632,14551.8571714279,NA -"4634","String 4633",4633,14554.9987640815,NA -"4635","String 4634",4634,14558.1403567351,NA -"4636","String 4635",4635,14561.2819493887,NA -"4637","String 4636",4636,14564.4235420423,NA -"4638","String 4637",4637,14567.5651346959,NA -"4639","String 4638",4638,14570.7067273495,NA -"4640","String 4639",4639,14573.848320003,NA -"4641","String 4640",4640,14576.9899126566,NA -"4642","String 4641",4641,14580.1315053102,NA -"4643","String 4642",4642,14583.2730979638,NA -"4644","String 4643",4643,14586.4146906174,NA -"4645","String 4644",4644,14589.556283271,NA -"4646","String 4645",4645,14592.6978759246,NA -"4647","String 4646",4646,14595.8394685782,NA -"4648","String 4647",4647,14598.9810612318,NA -"4649","String 4648",4648,14602.1226538854,NA -"4650","String 4649",4649,14605.2642465389,NA -"4651","String 4650",4650,14608.4058391925,NA -"4652","String 4651",4651,14611.5474318461,NA -"4653","String 4652",4652,14614.6890244997,NA -"4654","String 4653",4653,14617.8306171533,NA -"4655","String 4654",4654,14620.9722098069,NA -"4656","String 4655",4655,14624.1138024605,NA -"4657","String 4656",4656,14627.2553951141,NA -"4658","String 4657",4657,14630.3969877677,NA -"4659","String 4658",4658,14633.5385804213,NA -"4660","String 4659",4659,14636.6801730748,NA -"4661","String 4660",4660,14639.8217657284,NA -"4662","String 4661",4661,14642.963358382,NA -"4663","String 4662",4662,14646.1049510356,NA -"4664","String 4663",4663,14649.2465436892,NA -"4665","String 4664",4664,14652.3881363428,NA -"4666","String 4665",4665,14655.5297289964,NA -"4667","String 4666",4666,14658.67132165,NA -"4668","String 4667",4667,14661.8129143036,NA -"4669","String 4668",4668,14664.9545069572,NA -"4670","String 4669",4669,14668.0960996107,NA -"4671","String 4670",4670,14671.2376922643,NA -"4672","String 4671",4671,14674.3792849179,NA -"4673","String 4672",4672,14677.5208775715,NA -"4674","String 4673",4673,14680.6624702251,NA -"4675","String 4674",4674,14683.8040628787,NA -"4676","String 4675",4675,14686.9456555323,NA -"4677","String 4676",4676,14690.0872481859,NA -"4678","String 4677",4677,14693.2288408395,NA -"4679","String 4678",4678,14696.3704334931,NA -"4680","String 4679",4679,14699.5120261466,NA -"4681","String 4680",4680,14702.6536188002,NA -"4682","String 4681",4681,14705.7952114538,NA -"4683","String 4682",4682,14708.9368041074,NA -"4684","String 4683",4683,14712.078396761,NA -"4685","String 4684",4684,14715.2199894146,NA -"4686","String 4685",4685,14718.3615820682,NA -"4687","String 4686",4686,14721.5031747218,NA -"4688","String 4687",4687,14724.6447673754,NA -"4689","String 4688",4688,14727.7863600289,NA -"4690","String 4689",4689,14730.9279526825,NA -"4691","String 4690",4690,14734.0695453361,NA -"4692","String 4691",4691,14737.2111379897,NA -"4693","String 4692",4692,14740.3527306433,NA -"4694","String 4693",4693,14743.4943232969,NA -"4695","String 4694",4694,14746.6359159505,NA -"4696","String 4695",4695,14749.7775086041,NA -"4697","String 4696",4696,14752.9191012577,NA -"4698","String 4697",4697,14756.0606939113,NA -"4699","String 4698",4698,14759.2022865648,NA -"4700","String 4699",4699,14762.3438792184,NA -"4701","String 4700",4700,14765.485471872,NA -"4702","String 4701",4701,14768.6270645256,NA -"4703","String 4702",4702,14771.7686571792,NA -"4704","String 4703",4703,14774.9102498328,NA -"4705","String 4704",4704,14778.0518424864,NA -"4706","String 4705",4705,14781.19343514,NA -"4707","String 4706",4706,14784.3350277936,NA -"4708","String 4707",4707,14787.4766204472,NA -"4709","String 4708",4708,14790.6182131007,NA -"4710","String 4709",4709,14793.7598057543,NA -"4711","String 4710",4710,14796.9013984079,NA -"4712","String 4711",4711,14800.0429910615,NA -"4713","String 4712",4712,14803.1845837151,NA -"4714","String 4713",4713,14806.3261763687,NA -"4715","String 4714",4714,14809.4677690223,NA -"4716","String 4715",4715,14812.6093616759,NA -"4717","String 4716",4716,14815.7509543295,NA -"4718","String 4717",4717,14818.8925469831,NA -"4719","String 4718",4718,14822.0341396366,NA -"4720","String 4719",4719,14825.1757322902,NA -"4721","String 4720",4720,14828.3173249438,NA -"4722","String 4721",4721,14831.4589175974,NA -"4723","String 4722",4722,14834.600510251,NA -"4724","String 4723",4723,14837.7421029046,NA -"4725","String 4724",4724,14840.8836955582,NA -"4726","String 4725",4725,14844.0252882118,NA -"4727","String 4726",4726,14847.1668808654,NA -"4728","String 4727",4727,14850.308473519,NA -"4729","String 4728",4728,14853.4500661725,NA -"4730","String 4729",4729,14856.5916588261,NA -"4731","String 4730",4730,14859.7332514797,NA -"4732","String 4731",4731,14862.8748441333,NA -"4733","String 4732",4732,14866.0164367869,NA -"4734","String 4733",4733,14869.1580294405,NA -"4735","String 4734",4734,14872.2996220941,NA -"4736","String 4735",4735,14875.4412147477,NA -"4737","String 4736",4736,14878.5828074013,NA -"4738","String 4737",4737,14881.7244000549,NA -"4739","String 4738",4738,14884.8659927084,NA -"4740","String 4739",4739,14888.007585362,NA -"4741","String 4740",4740,14891.1491780156,NA -"4742","String 4741",4741,14894.2907706692,NA -"4743","String 4742",4742,14897.4323633228,NA -"4744","String 4743",4743,14900.5739559764,NA -"4745","String 4744",4744,14903.71554863,NA -"4746","String 4745",4745,14906.8571412836,NA -"4747","String 4746",4746,14909.9987339372,NA -"4748","String 4747",4747,14913.1403265907,NA -"4749","String 4748",4748,14916.2819192443,NA -"4750","String 4749",4749,14919.4235118979,NA -"4751","String 4750",4750,14922.5651045515,NA -"4752","String 4751",4751,14925.7066972051,NA -"4753","String 4752",4752,14928.8482898587,NA -"4754","String 4753",4753,14931.9898825123,NA -"4755","String 4754",4754,14935.1314751659,NA -"4756","String 4755",4755,14938.2730678195,NA -"4757","String 4756",4756,14941.4146604731,NA -"4758","String 4757",4757,14944.5562531266,NA -"4759","String 4758",4758,14947.6978457802,NA -"4760","String 4759",4759,14950.8394384338,NA -"4761","String 4760",4760,14953.9810310874,NA -"4762","String 4761",4761,14957.122623741,NA -"4763","String 4762",4762,14960.2642163946,NA -"4764","String 4763",4763,14963.4058090482,NA -"4765","String 4764",4764,14966.5474017018,NA -"4766","String 4765",4765,14969.6889943554,NA -"4767","String 4766",4766,14972.830587009,NA -"4768","String 4767",4767,14975.9721796625,NA -"4769","String 4768",4768,14979.1137723161,NA -"4770","String 4769",4769,14982.2553649697,NA -"4771","String 4770",4770,14985.3969576233,NA -"4772","String 4771",4771,14988.5385502769,NA -"4773","String 4772",4772,14991.6801429305,NA -"4774","String 4773",4773,14994.8217355841,NA -"4775","String 4774",4774,14997.9633282377,NA -"4776","String 4775",4775,15001.1049208913,NA -"4777","String 4776",4776,15004.2465135449,NA -"4778","String 4777",4777,15007.3881061984,NA -"4779","String 4778",4778,15010.529698852,NA -"4780","String 4779",4779,15013.6712915056,NA -"4781","String 4780",4780,15016.8128841592,NA -"4782","String 4781",4781,15019.9544768128,NA -"4783","String 4782",4782,15023.0960694664,NA -"4784","String 4783",4783,15026.23766212,NA -"4785","String 4784",4784,15029.3792547736,NA -"4786","String 4785",4785,15032.5208474272,NA -"4787","String 4786",4786,15035.6624400808,NA -"4788","String 4787",4787,15038.8040327343,NA -"4789","String 4791",4791,15051.3704033487,NA -"4790","String 4788",4788,15041.9456253879,NA -"4791","String 4790",4790,15048.2288106951,NA -"4792","String 4792",4792,15054.5119960023,NA -"4793","String 4789",4789,15045.0872180415,NA -"4794","String 4793",4793,15057.6535886559,NA -"4795","String 4794",4794,15060.7951813095,NA -"4796","String 4795",4795,15063.9367739631,NA -"4797","String 4796",4796,15067.0783666166,NA -"4798","String 4797",4797,15070.2199592702,NA -"4799","String 4798",4798,15073.3615519238,NA -"4800","String 4799",4799,15076.5031445774,NA -"4801","String 4800",4800,15079.644737231,NA -"4802","String 4801",4801,15082.7863298846,NA -"4803","String 4802",4802,15085.9279225382,NA -"4804","String 4803",4803,15089.0695151918,NA -"4805","String 4804",4804,15092.2111078454,NA -"4806","String 4805",4805,15095.352700499,NA -"4807","String 4806",4806,15098.4942931525,NA -"4808","String 4807",4807,15101.6358858061,NA -"4809","String 4808",4808,15104.7774784597,NA -"4810","String 4809",4809,15107.9190711133,NA -"4811","String 4810",4810,15111.0606637669,NA -"4812","String 4811",4811,15114.2022564205,NA -"4813","String 4812",4812,15117.3438490741,NA -"4814","String 4813",4813,15120.4854417277,NA -"4815","String 4814",4814,15123.6270343813,NA -"4816","String 4815",4815,15126.7686270349,NA -"4817","String 4816",4816,15129.9102196884,NA -"4818","String 4817",4817,15133.051812342,NA -"4819","String 4818",4818,15136.1934049956,NA -"4820","String 4819",4819,15139.3349976492,NA -"4821","String 4820",4820,15142.4765903028,NA -"4822","String 4821",4821,15145.6181829564,NA -"4823","String 4822",4822,15148.75977561,NA -"4824","String 4823",4823,15151.9013682636,NA -"4825","String 4824",4824,15155.0429609172,NA -"4826","String 4825",4825,15158.1845535708,NA -"4827","String 4826",4826,15161.3261462243,NA -"4828","String 4827",4827,15164.4677388779,NA -"4829","String 4828",4828,15167.6093315315,NA -"4830","String 4829",4829,15170.7509241851,NA -"4831","String 4830",4830,15173.8925168387,NA -"4832","String 4831",4831,15177.0341094923,NA -"4833","String 4832",4832,15180.1757021459,NA -"4834","String 4833",4833,15183.3172947995,NA -"4835","String 4834",4834,15186.4588874531,NA -"4836","String 4835",4835,15189.6004801067,NA -"4837","String 4836",4836,15192.7420727602,NA -"4838","String 4837",4837,15195.8836654138,NA -"4839","String 4838",4838,15199.0252580674,NA -"4840","String 4839",4839,15202.166850721,NA -"4841","String 4840",4840,15205.3084433746,NA -"4842","String 4841",4841,15208.4500360282,NA -"4843","String 4842",4842,15211.5916286818,NA -"4844","String 4843",4843,15214.7332213354,NA -"4845","String 4844",4844,15217.874813989,NA -"4846","String 4845",4845,15221.0164066425,NA -"4847","String 4846",4846,15224.1579992961,NA -"4848","String 4847",4847,15227.2995919497,NA -"4849","String 4848",4848,15230.4411846033,NA -"4850","String 4849",4849,15233.5827772569,NA -"4851","String 4850",4850,15236.7243699105,NA -"4852","String 4851",4851,15239.8659625641,NA -"4853","String 4852",4852,15243.0075552177,NA -"4854","String 4853",4853,15246.1491478713,NA -"4855","String 4854",4854,15249.2907405249,NA -"4856","String 4855",4855,15252.4323331784,NA -"4857","String 4856",4856,15255.573925832,NA -"4858","String 4857",4857,15258.7155184856,NA -"4859","String 4858",4858,15261.8571111392,NA -"4860","String 4859",4859,15264.9987037928,NA -"4861","String 4860",4860,15268.1402964464,NA -"4862","String 4861",4861,15271.2818891,NA -"4863","String 4862",4862,15274.4234817536,NA -"4864","String 4863",4863,15277.5650744072,NA -"4865","String 4864",4864,15280.7066670608,NA -"4866","String 4865",4865,15283.8482597143,NA -"4867","String 4866",4866,15286.9898523679,NA -"4868","String 4867",4867,15290.1314450215,NA -"4869","String 4868",4868,15293.2730376751,NA -"4870","String 4869",4869,15296.4146303287,NA -"4871","String 4870",4870,15299.5562229823,NA -"4872","String 4871",4871,15302.6978156359,NA -"4873","String 4872",4872,15305.8394082895,NA -"4874","String 4873",4873,15308.9810009431,NA -"4875","String 4874",4874,15312.1225935967,NA -"4876","String 4875",4875,15315.2641862502,NA -"4877","String 4876",4876,15318.4057789038,NA -"4878","String 4877",4877,15321.5473715574,NA -"4879","String 4878",4878,15324.688964211,NA -"4880","String 4879",4879,15327.8305568646,NA -"4881","String 4880",4880,15330.9721495182,NA -"4882","String 4881",4881,15334.1137421718,NA -"4883","String 4882",4882,15337.2553348254,NA -"4884","String 4883",4883,15340.396927479,NA -"4885","String 4884",4884,15343.5385201325,NA -"4886","String 4885",4885,15346.6801127861,NA -"4887","String 4886",4886,15349.8217054397,NA -"4888","String 4887",4887,15352.9632980933,NA -"4889","String 4888",4888,15356.1048907469,NA -"4890","String 4889",4889,15359.2464834005,NA -"4891","String 4890",4890,15362.3880760541,NA -"4892","String 4891",4891,15365.5296687077,NA -"4893","String 4892",4892,15368.6712613613,NA -"4894","String 4893",4893,15371.8128540149,NA -"4895","String 4894",4894,15374.9544466684,NA -"4896","String 4895",4895,15378.096039322,NA -"4897","String 4896",4896,15381.2376319756,NA -"4898","String 4897",4897,15384.3792246292,NA -"4899","String 4898",4898,15387.5208172828,NA -"4900","String 4899",4899,15390.6624099364,NA -"4901","String 4900",4900,15393.80400259,NA -"4902","String 4901",4901,15396.9455952436,NA -"4903","String 4902",4902,15400.0871878972,NA -"4904","String 4903",4903,15403.2287805508,NA -"4905","String 4904",4904,15406.3703732043,NA -"4906","String 4905",4905,15409.5119658579,NA -"4907","String 4906",4906,15412.6535585115,NA -"4908","String 4907",4907,15415.7951511651,NA -"4909","String 4908",4908,15418.9367438187,NA -"4910","String 4909",4909,15422.0783364723,NA -"4911","String 4910",4910,15425.2199291259,NA -"4912","String 4911",4911,15428.3615217795,NA -"4913","String 4912",4912,15431.5031144331,NA -"4914","String 4913",4913,15434.6447070867,NA -"4915","String 4914",4914,15437.7862997402,NA -"4916","String 4915",4915,15440.9278923938,NA -"4917","String 4916",4916,15444.0694850474,NA -"4918","String 4917",4917,15447.211077701,NA -"4919","String 4918",4918,15450.3526703546,NA -"4920","String 4919",4919,15453.4942630082,NA -"4921","String 4920",4920,15456.6358556618,NA -"4922","String 4921",4921,15459.7774483154,NA -"4923","String 4922",4922,15462.919040969,NA -"4924","String 4923",4923,15466.0606336226,NA -"4925","String 4924",4924,15469.2022262761,NA -"4926","String 4925",4925,15472.3438189297,NA -"4927","String 4926",4926,15475.4854115833,NA -"4928","String 4927",4927,15478.6270042369,NA -"4929","String 4928",4928,15481.7685968905,NA -"4930","String 4929",4929,15484.9101895441,NA -"4931","String 4930",4930,15488.0517821977,NA -"4932","String 4931",4931,15491.1933748513,NA -"4933","String 4932",4932,15494.3349675049,NA -"4934","String 4933",4933,15497.4765601584,NA -"4935","String 4934",4934,15500.618152812,NA -"4936","String 4935",4935,15503.7597454656,NA -"4937","String 4936",4936,15506.9013381192,NA -"4938","String 4937",4937,15510.0429307728,NA -"4939","String 4938",4938,15513.1845234264,NA -"4940","String 4939",4939,15516.32611608,NA -"4941","String 4940",4940,15519.4677087336,NA -"4942","String 4941",4941,15522.6093013872,NA -"4943","String 4942",4942,15525.7508940408,NA -"4944","String 4943",4943,15528.8924866943,NA -"4945","String 4944",4944,15532.0340793479,NA -"4946","String 4945",4945,15535.1756720015,NA -"4947","String 4946",4946,15538.3172646551,NA -"4948","String 4947",4947,15541.4588573087,NA -"4949","String 4948",4948,15544.6004499623,NA -"4950","String 4949",4949,15547.7420426159,NA -"4951","String 4950",4950,15550.8836352695,NA -"4952","String 4951",4951,15554.0252279231,NA -"4953","String 4952",4952,15557.1668205767,NA -"4954","String 4953",4953,15560.3084132302,NA -"4955","String 4954",4954,15563.4500058838,NA -"4956","String 4955",4955,15566.5915985374,NA -"4957","String 4956",4956,15569.733191191,NA -"4958","String 4957",4957,15572.8747838446,NA -"4959","String 4958",4958,15576.0163764982,NA -"4960","String 4959",4959,15579.1579691518,NA -"4961","String 4960",4960,15582.2995618054,NA -"4962","String 4961",4961,15585.441154459,NA -"4963","String 4962",4962,15588.5827471126,NA -"4964","String 4963",4963,15591.7243397661,NA -"4965","String 4964",4964,15594.8659324197,NA -"4966","String 4965",4965,15598.0075250733,NA -"4967","String 4966",4966,15601.1491177269,NA -"4968","String 4967",4967,15604.2907103805,NA -"4969","String 4968",4968,15607.4323030341,NA -"4970","String 4969",4969,15610.5738956877,NA -"4971","String 4970",4970,15613.7154883413,NA -"4972","String 4971",4971,15616.8570809949,NA -"4973","String 4972",4972,15619.9986736485,NA -"4974","String 4973",4973,15623.140266302,NA -"4975","String 4974",4974,15626.2818589556,NA -"4976","String 4975",4975,15629.4234516092,NA -"4977","String 4976",4976,15632.5650442628,NA -"4978","String 4977",4977,15635.7066369164,NA -"4979","String 4978",4978,15638.84822957,NA -"4980","String 4979",4979,15641.9898222236,NA -"4981","String 4980",4980,15645.1314148772,NA -"4982","String 4981",4981,15648.2730075308,NA -"4983","String 4982",4982,15651.4146001843,NA -"4984","String 4983",4983,15654.5561928379,NA -"4985","String 4984",4984,15657.6977854915,NA -"4986","String 4985",4985,15660.8393781451,NA -"4987","String 4986",4986,15663.9809707987,NA -"4988","String 4987",4987,15667.1225634523,NA -"4989","String 4988",4988,15670.2641561059,NA -"4990","String 4989",4989,15673.4057487595,NA -"4991","String 4990",4990,15676.5473414131,NA -"4992","String 4991",4991,15679.6889340667,NA -"4993","String 4992",4992,15682.8305267202,NA -"4994","String 4993",4993,15685.9721193738,NA -"4995","String 4994",4994,15689.1137120274,NA -"4996","String 4995",4995,15692.255304681,NA -"4997","String 4996",4996,15695.3968973346,NA -"4998","String 4997",4997,15698.5384899882,NA -"4999","String 4998",4998,15701.6800826418,NA -"5000","String 4999",4999,15704.8216752954,NA diff --git a/test/support/script.sql b/test/support/script.sql deleted file mode 100644 index b1bce14e..00000000 --- a/test/support/script.sql +++ /dev/null @@ -1,70 +0,0 @@ -CREATE TABLE IF NOT EXISTS map ( - zoom_level INTEGER, - tile_column INTEGER, - tile_row INTEGER, - tile_id TEXT, - grid_id TEXT -); - -CREATE TABLE IF NOT EXISTS grid_key ( - grid_id TEXT, - key_name TEXT -); - -CREATE TABLE IF NOT EXISTS keymap ( - key_name TEXT, - key_json TEXT -); - -CREATE TABLE IF NOT EXISTS grid_utfgrid ( - grid_id TEXT, - grid_utfgrid TEXT -); - -CREATE TABLE IF NOT EXISTS images ( - tile_data blob, - tile_id text -); - -CREATE TABLE IF NOT EXISTS metadata ( - name text, - value text -); - - --- CREATE UNIQUE INDEX IF NOT EXISTS map_index ON map (zoom_level, tile_column, tile_row); --- CREATE UNIQUE INDEX IF NOT EXISTS grid_key_lookup ON grid_key (grid_id, key_name); --- CREATE UNIQUE INDEX IF NOT EXISTS keymap_lookup ON keymap (key_name); --- CREATE UNIQUE INDEX IF NOT EXISTS grid_utfgrid_lookup ON grid_utfgrid (grid_id); --- CREATE UNIQUE INDEX IF NOT EXISTS images_id ON images (tile_id); --- CREATE UNIQUE INDEX IF NOT EXISTS name ON metadata (name); - - -CREATE OR REPLACE VIEW tiles AS - SELECT - map.zoom_level AS zoom_level, - map.tile_column AS tile_column, - map.tile_row AS tile_row, - images.tile_data AS tile_data - FROM map - JOIN images ON images.tile_id = map.tile_id; - -CREATE OR REPLACE VIEW grids AS - SELECT - map.zoom_level AS zoom_level, - map.tile_column AS tile_column, - map.tile_row AS tile_row, - grid_utfgrid.grid_utfgrid AS grid - FROM map - JOIN grid_utfgrid ON grid_utfgrid.grid_id = map.grid_id; - -CREATE OR REPLACE VIEW grid_data AS - SELECT - map.zoom_level AS zoom_level, - map.tile_column AS tile_column, - map.tile_row AS tile_row, - keymap.key_name AS key_name, - keymap.key_json AS key_json - FROM map - JOIN grid_key ON map.grid_id = grid_key.grid_id - JOIN keymap ON grid_key.key_name = keymap.key_name; diff --git a/test/syntax_error.test.ts b/test/syntax_error.test.ts deleted file mode 100644 index 8267d29d..00000000 --- a/test/syntax_error.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import * as duckdb from '..'; -import * as assert from 'assert'; - -describe('exec', function() { - let db: duckdb.Database; - before(function(done) { - db = new duckdb.Database(':memory:', done); - }); - - it("doesn't crash on a syntax error", function(done) { - db.exec("syntax error", function(err: null | duckdb.DuckDbError) { - assert.notEqual(err, null, "Expected an error") - assert.equal(err?.errorType, 'Parser'); - assert.ok(err?.message.startsWith('Parser Error: syntax error at or near "syntax"')) - done(); - }); - }); -}); diff --git a/test/test_all_types.test.ts b/test/test_all_types.test.ts deleted file mode 100644 index f13a8831..00000000 --- a/test/test_all_types.test.ts +++ /dev/null @@ -1,235 +0,0 @@ -import { expect } from "chai"; -import duckdb, { DuckDbError, TableData } from ".."; - -function get_all_types(): Promise { - return new Promise((resolve, reject) => { - const conn = new duckdb.Database(":memory:"); - conn.all( - "describe select * from test_all_types()", - (error: DuckDbError | null, data: TableData) => { - if (error) reject(error); - resolve(data.map((row) => row.column_name)); - } - ); - }); -} - -function timedelta(obj: { days: number; micros: number; months: number }) { - return obj; -} - -// We replace these values since the extreme ranges are not supported in native-node. -const replacement_values: Record = { - timestamp: - "'1990-01-01 00:00:00'::TIMESTAMP, '9999-12-31 23:59:59'::TIMESTAMP, NULL::TIMESTAMP", - timestamp_s: - "'1990-01-01 00:00:00'::TIMESTAMP_S, '9999-12-31 23:59:59'::TIMESTAMP_S, NULL::TIMESTAMP_S", - // note: timestamp_ns does not support extreme values - timestamp_ns: "'1990-01-01 00:00:00'::TIMESTAMP_NS, NULL::TIMESTAMP_NS", - timestamp_ms: - "'1990-01-01 00:00:00'::TIMESTAMP_MS, '9999-12-31 23:59:59'::TIMESTAMP_MS, NULL::TIMESTAMP_MS", - timestamp_tz: - "'1990-01-01 00:00:00Z'::TIMESTAMPTZ, '9999-12-31 23:59:59.999999Z'::TIMESTAMPTZ, NULL::TIMESTAMPTZ", - date: "'1990-01-01'::DATE, '9999-12-31'::DATE, NULL::DATE", - date_array: - "[], ['1970-01-01'::DATE, NULL, '0001-01-01'::DATE, '9999-12-31'::DATE,], [NULL::DATE,]", - timestamp_array: - "[], ['1970-01-01'::TIMESTAMP, NULL, '0001-01-01'::TIMESTAMP, '9999-12-31 23:59:59.999999'::TIMESTAMP,], [NULL::TIMESTAMP,]", - timestamptz_array: - "[], ['1970-01-01 00:00:00Z'::TIMESTAMPTZ, NULL, '0001-01-01 00:00:00Z'::TIMESTAMPTZ, '9999-12-31 23:59:59.999999Z'::TIMESTAMPTZ,], [NULL::TIMESTAMPTZ,]", -}; - -const correct_answer_map: Record = { - bool: [false, true, null], - - tinyint: [-128, 127, null], - smallint: [-32768, 32767, null], - - int: [-2147483648, 2147483647, null], - bigint: [BigInt("-9223372036854775808"), BigInt("9223372036854775807"), null], - - hugeint: [ - BigInt("-170141183460469231731687303715884105727"), - BigInt("170141183460469231731687303715884105727"), - null, - ], - - utinyint: [0, 255, null], - usmallint: [0, 65535, null], - - uint: [0, 4294967295, null], - ubigint: [BigInt(0), BigInt("18446744073709551615"), null], - - time: ["00:00:00", "23:59:59.999999", null], - - float: [-3.4028234663852886e38, 3.4028234663852886e38, null], - double: [-1.7976931348623157e308, 1.7976931348623157e308, null], - - dec_4_1: [-999.9, 999.9, null], - dec_9_4: [-99999.9999, 99999.9999, null], - dec_18_6: ["-999999999999.999999", "999999999999.999999", null], - dec38_10: [ - "-9999999999999999999999999999.9999999999", - "9999999999999999999999999999.9999999999", - null, - ], - uuid: [ - "00000000-0000-0000-0000-000000000001", - "ffffffff-ffff-ffff-ffff-ffffffffffff", - null, - ], - varchar: ["🦆🦆🦆🦆🦆🦆", "goo\0se", null], - json: ["🦆🦆🦆🦆🦆🦆", "goose", null], - blob: [ - Buffer.from("thisisalongblob\x00withnullbytes"), - Buffer.from("\x00\x00\x00a"), - null, - ], - bit: ["0010001001011100010101011010111", "10101", null], - small_enum: ["DUCK_DUCK_ENUM", "GOOSE", null], - medium_enum: ["enum_0", "enum_299", null], - large_enum: ["enum_0", "enum_69999", null], - date_array: [ - [], - [ - new Date(Date.UTC(1970, 0, 1)), - null, - new Date("0001-01-01T00:00:00.000Z"), - new Date("9999-12-31T00:00:00.000Z"), - ], - [null], - ], - timestamp_array: [ - [], - [ - new Date(Date.UTC(1970, 0, 1)), - null, - new Date("0001-01-01T00:00:00.000Z"), - new Date("9999-12-31T23:59:59.999Z"), - ], - [null], - ], - - timestamptz_array: [ - [], - [ - new Date(Date.UTC(1970, 0, 1)), - null, - new Date("0001-01-01T00:00:00.000Z"), - new Date("9999-12-31T23:59:59.999Z"), - ], - [null], - ], - - int_array: [[], [42, 999, null, null, -42], null], - varchar_array: [[], ["🦆🦆🦆🦆🦆🦆", "goose", null, ""], null], - - double_array: [ - [], - [ - 42.0, - Number.NaN, - Number.POSITIVE_INFINITY, - Number.NEGATIVE_INFINITY, - null, - -42.0, - ], - null, - ], - - nested_int_array: [ - [], - [[], [42, 999, null, null, -42], null, [], [42, 999, null, null, -42]], - null, - ], - struct: [{ a: null, b: null }, { a: 42, b: "🦆🦆🦆🦆🦆🦆" }, null], - - struct_of_arrays: [ - { a: null, b: null }, - { - a: [42, 999, null, null, -42], - b: ["🦆🦆🦆🦆🦆🦆", "goose", null, ""], - }, - null, - ], - - array_of_structs: [ - [], - [{ a: null, b: null }, { a: 42, b: "🦆🦆🦆🦆🦆🦆" }, null], - null, - ], - map: ["{}", "{key1=🦆🦆🦆🦆🦆🦆, key2=goose}", null], - union: ["Frank", "5", null], - - time_tz: ["00:00:00-1559", "23:59:59.999999+1559", null], - interval: [ - timedelta({ - days: 0, - months: 0, - micros: 0, - }), - timedelta({ days: 999, months: 999, micros: 999999999 }), - null, - ], - - timestamp: [ - new Date(Date.UTC(1990, 0, 1)), - new Date("9999-12-31T23:59:59.000Z"), - null, - ], - date: [new Date("1990-01-01"), new Date("9999-12-31"), null], - timestamp_s: [ - new Date(Date.UTC(1990, 0, 1)), - new Date("9999-12-31T23:59:59.000Z"), - null, - ], - timestamp_ns: [new Date(Date.UTC(1990, 0, 1)), null], - timestamp_ms: [ - new Date(Date.UTC(1990, 0, 1)), - new Date("9999-12-31T23:59:59.000Z"), - null, - ], - timestamp_tz: [ - new Date("1990-01-01T00:00:00.000Z"), - new Date("9999-12-31T23:59:59.999Z"), - null, - ], -}; - -const suite = describe("test_all_types", () => { - before(async function () { - const all_types = await get_all_types(); - - for (const cur_type of all_types) { - // FIXME: these currently have too high a precision to be tested - if (["dec_18_6", "dec38_10"].includes(cur_type)) continue; - - suite.addTest( - it(cur_type, async () => { - const conn = new duckdb.Database(":memory:"); - - let query: string; - if (cur_type in replacement_values) { - query = `select UNNEST([${replacement_values[cur_type]}]) AS ${cur_type}`; - } else { - query = `select "${cur_type}" from test_all_types()`; - } - - let result = await new Promise((resolve, reject) => - conn.all(query, (err: DuckDbError | null, data: TableData) => - err ? reject(err) : resolve(data) - ) - ); - - result = result.map((row) => row[cur_type]); // pluck values - - const correct_result = correct_answer_map[cur_type]; - - expect(result).deep.eq(correct_result); - }) - ); - } - }); - - it("dummy", () => {}); -}); diff --git a/test/tokenize.test.ts b/test/tokenize.test.ts deleted file mode 100644 index 8bd8f4bf..00000000 --- a/test/tokenize.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as assert from 'assert'; -import * as duckdb from '..'; - -describe('tokenize', function () { - it('should return correct tokens for a single statement', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize('select 1;'); - assert.deepStrictEqual(output, { - offsets: [0, 7, 8], - types: [duckdb.TokenType.KEYWORD, duckdb.TokenType.NUMERIC_CONSTANT, duckdb.TokenType.OPERATOR] - }); - }); - it('should return correct tokens for a multiple statements', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize('select 1; select 2;'); - assert.deepStrictEqual(output, { - offsets: [0, 7, 8, 10, 17, 18], - types: [ - duckdb.TokenType.KEYWORD, duckdb.TokenType.NUMERIC_CONSTANT, duckdb.TokenType.OPERATOR, - duckdb.TokenType.KEYWORD, duckdb.TokenType.NUMERIC_CONSTANT, duckdb.TokenType.OPERATOR - ] - }); - }); - it('should return no tokens for an empty string', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize(''); - assert.deepStrictEqual(output, { - offsets: [], - types: [] - }); - }); - it('should handle quoted semicolons in string constants', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize(`select ';';`); - assert.deepStrictEqual(output, { - offsets: [0, 7, 10], - types: [duckdb.TokenType.KEYWORD, duckdb.TokenType.STRING_CONSTANT, duckdb.TokenType.OPERATOR] - }); - }); - it('should handle quoted semicolons in identifiers', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize(`from ";";`); - assert.deepStrictEqual(output, { - offsets: [0, 5, 8], - types: [duckdb.TokenType.KEYWORD, duckdb.TokenType.IDENTIFIER, duckdb.TokenType.OPERATOR] - }); - }); - it('should handle comments', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize(`select /* comment */ 1`); - // Note that the tokenizer doesn't return tokens for comments. - assert.deepStrictEqual(output, { - offsets: [0, 21], - types: [duckdb.TokenType.KEYWORD, duckdb.TokenType.NUMERIC_CONSTANT] - }); - }); - it('should handle invalid syntax', function () { - const db = new duckdb.Database(':memory:'); - const output = db.tokenize(`selec 1`); - // The misspelled keyword is scanned as an identifier. - assert.deepStrictEqual(output, { - offsets: [0, 6], - types: [duckdb.TokenType.IDENTIFIER, duckdb.TokenType.NUMERIC_CONSTANT] - }); - }); - it('should support inverse TokenType mapping', function () { - assert.equal(duckdb.TokenType[duckdb.TokenType.IDENTIFIER], "IDENTIFIER"); - assert.equal(duckdb.TokenType[duckdb.TokenType.NUMERIC_CONSTANT], "NUMERIC_CONSTANT"); - assert.equal(duckdb.TokenType[duckdb.TokenType.STRING_CONSTANT], "STRING_CONSTANT"); - assert.equal(duckdb.TokenType[duckdb.TokenType.OPERATOR], "OPERATOR"); - assert.equal(duckdb.TokenType[duckdb.TokenType.KEYWORD], "KEYWORD"); - assert.equal(duckdb.TokenType[duckdb.TokenType.COMMENT], "COMMENT"); - }); -}); diff --git a/test/typescript_decls.test.ts b/test/typescript_decls.test.ts deleted file mode 100644 index ffdb6125..00000000 --- a/test/typescript_decls.test.ts +++ /dev/null @@ -1,231 +0,0 @@ -import * as duckdb from ".."; -import assert from "assert"; -import fs from "fs"; - -describe("TypeScript declarations", function () { - var db: duckdb.Database; - before(function (done) { - db = new duckdb.Database(":memory:", duckdb.OPEN_READWRITE, done); - }); - - it("typescript: Database constructor no callback", (done) => { - const tdb0 = new duckdb.Database(":memory:"); // no callback argument - done(); - }); - - it("Database.create -- read only flag", (done) => { - const roDb = new duckdb.Database( - ":memory:", - duckdb.OPEN_READONLY, - (err: duckdb.DuckDbError | null, res: any) => { - assert.equal(err?.code, "DUCKDB_NODEJS_ERROR"); - assert.equal(err?.errno, -1); - const errMessage: string = err?.message ?? ""; - assert( - errMessage.includes( - "Cannot launch in-memory database in read-only mode" - ) - ); - done(); - } - ); - }); - - it("typescript: Database constructor path error", (done) => { - const tdb0 = new duckdb.Database( - "./bogusPath.db", - duckdb.OPEN_READWRITE, - (err, res) => { - // Issue: I'm a little surprised that specifying an invalid file path - // doesn't seem to immediately signal an error here, but it doesn't. - tdb0.all( - "PRAGMA show_tables", - (err: duckdb.DuckDbError | null, res: any) => { - done(); - } - ); - } - ); - }); - - it("typescript: query with error", (done) => { - // query with an error: - db.all( - "SELECT * FROM sometable", - (err: duckdb.DuckDbError | null, res: any) => { - assert.equal(err?.code, "DUCKDB_NODEJS_ERROR"); - assert.equal(err?.errno, -1); - done(); - } - ); - }); - - it("typescript: Database#exec", function (done) { - var sql = fs.readFileSync("test/support/script.sql", "utf8"); - db.exec(sql, function (err: duckdb.DuckDbError | null) { - if (err) throw err; - done(); - }); - }); - - it("typescript: retrieve database structure", function (done) { - db.all( - "SELECT type, name FROM sqlite_master ORDER BY type, name", - function (err: duckdb.DuckDbError | null, rows: duckdb.TableData) { - if (err) throw err; - assert.deepEqual(rows, [ - { type: "table", name: "grid_key" }, - { type: "table", name: "grid_utfgrid" }, - { type: "table", name: "images" }, - { type: "table", name: "keymap" }, - { type: "table", name: "map" }, - { type: "table", name: "metadata" }, - { type: "view", name: "grid_data" }, - { type: "view", name: "grids" }, - { type: "view", name: "tiles" }, - ]); - done(); - } - ); - }); - - it("typescript: database#all with no callback", (done) => { - db.all("select 42 as x"); - done(); - }); - - it("typescript: database#connect", (done) => { - const conn = db.connect(); - assert(conn instanceof duckdb.Connection); - done(); - }); - - it("typescript: ensure empty results work ok", (done) => { - db.all( - "create table test_table as select 42 as x", - (err: duckdb.DuckDbError | null, res: duckdb.TableData) => { - db.all( - "drop table test_table", - (err: duckdb.DuckDbError | null, res: duckdb.TableData) => { - console.log("drop table results: ", err, res); - assert.deepEqual(res, []); - done(); - } - ); - } - ); - }); - - it("typescript: ternary int udf", function (done) { - db.register_udf( - "udf", - "integer", - (x: number, y: number, z: number) => x + y + z - ); - db.all( - "select udf(21, 20, 1) v", - function (err: duckdb.DuckDbError | null, rows: duckdb.TableData) { - if (err) throw err; - assert.equal(rows[0].v, 42); - } - ); - db.unregister_udf("udf", done); - }); - it("typescript: retrieve 100,000 rows with Statement#each", function (done) { - var total = 100000; - var retrieved = 0; - - db.each( - "SELECT * FROM range(0, ?)", - total, - function (err: duckdb.DuckDbError | null, row: any) { - if (err) throw err; - retrieved++; - - if (retrieved === total) { - assert.equal( - retrieved, - total, - "Only retrieved " + retrieved + " out of " + total + " rows." - ); - done(); - } - } - ); - }); -}); - -describe("typescript: simple prepared statement", function () { - var db: duckdb.Database; - before(function (done) { - db = new duckdb.Database(":memory:", duckdb.OPEN_READWRITE, done); - }); - - it("should prepare, run and finalize the statement", function (done) { - db.prepare("CREATE TABLE foo (bar text)").run().finalize(done); - }); - - after(function (done) { - db.close(done); - }); -}); - -describe("typescript: prepared statements", function () { - var db: duckdb.Database; - before(function (done) { - db = new duckdb.Database(":memory:", duckdb.OPEN_READWRITE, done); - }); - - var inserted = 0; - var retrieved = 0; - - // We insert and retrieve that many rows. - var count = 1000; - - it("typescript: should create the table", function (done) { - db.prepare("CREATE TABLE foo (txt text, num int, flt double, blb blob)") - .run() - .finalize(done); - }); - - it("typescript: should insert " + count + " rows", function (done) { - for (var i = 0; i < count; i++) { - db.prepare("INSERT INTO foo VALUES(?, ?, ?, ?)") - .run( - "String " + i, - i, - i * Math.PI, - null, - function (err: duckdb.DuckDbError | null) { - if (err) throw err; - inserted++; - } - ) - .finalize(function (err) { - if (err) throw err; - if (inserted == count) done(); - }); - } - }); -}); - -describe("typescript: stream and QueryResult", function () { - const total = 1000; - - let db: duckdb.Database; - let conn: duckdb.Connection; - before((done) => { - db = new duckdb.Database(":memory:", duckdb.OPEN_READWRITE, () => { - conn = new duckdb.Connection(db, done); - }); - }); - - it("streams results", async () => { - let retrieved = 0; - const stream = conn.stream("SELECT * FROM range(0, ?)", total); - for await (const row of stream) { - retrieved++; - } - assert.equal(total, retrieved); - }); -}); diff --git a/test/udf.test.ts b/test/udf.test.ts deleted file mode 100644 index 902f4298..00000000 --- a/test/udf.test.ts +++ /dev/null @@ -1,233 +0,0 @@ -import * as duckdb from ".."; -import {TableData} from ".."; -import * as assert from 'assert'; - -describe('UDFs', function() { - describe('arity', function() { - let db: duckdb.Database; - before(function(done) { - db = new duckdb.Database(':memory:', done); - }); - - it('0ary int', function(done) { - db.register_udf("udf", "integer", () => 42); - db.all("select udf() v", function(err: Error | null, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 42); - }); - db.unregister_udf("udf", done); - }); - - it('0ary double', function(done) { - db.register_udf("udf", "double", () => 4.2); - db.all("select udf() v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 4.2); - }); - db.unregister_udf("udf", done); - }); - - it('0ary string', function(done) { - db.register_udf("udf", "varchar", () => 'hello'); - db.all("select udf() v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 'hello'); - }); - db.unregister_udf("udf", done); - }); - - it('0ary non-inlined string', function(done) { - db.register_udf("udf", "varchar", () => 'this string is over 12 bytes'); - db.all("select udf() v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 'this string is over 12 bytes'); - }); - db.unregister_udf("udf", done); - }); - - it('0ary int null', function(done) { - db.register_udf("udf", "integer", () => undefined); - db.all("select udf() v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, undefined); - }); - db.unregister_udf("udf", done); - }); - - - it('0ary string null', function(done) { - db.register_udf("udf", "varchar", () => undefined); - db.all("select udf() v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, undefined); - }); - db.unregister_udf("udf", done); - }); - - - it('unary int', function(done) { - db.register_udf("udf", "integer", (x) => x+1); - db.all("select udf(42) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 43); - }); - db.unregister_udf("udf", done); - }); - - it('unary double', function(done) { - db.register_udf("udf", "double", (x) => x); - db.all("select udf(4.2::double) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 4.2); - }); - db.unregister_udf("udf", done); - }); - - it('unary int null', function(done) { - db.register_udf("udf", "integer", (x) => undefined); - db.all("select udf(42) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, undefined); - }); - db.unregister_udf("udf", done); - }); - - - it('unary double null', function(done) { - db.register_udf("udf", "double", (x) => undefined); - db.all("select udf(4.2::double) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, undefined); - }); - db.unregister_udf("udf", done); - }); - - - it('unary string', function(done) { - db.register_udf("udf", "varchar", (x) => 'hello ' + x); - db.all("select udf('world') v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 'hello world'); - }); - db.unregister_udf("udf", done); - }); - - it('unary string null', function(done) { - db.register_udf("udf", "varchar", (x) => undefined); - db.all("select udf('world') v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, undefined); - }); - db.unregister_udf("udf", done); - }); - - it('binary int', function(done) { - db.register_udf("udf", "integer", (x, y) => x + y); - db.all("select udf(40, 2) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 42); - }); - db.unregister_udf("udf", done); - }); - - it('binary string', function(done) { - db.register_udf("udf", "varchar", (x, y) => x + ' ' + y); - db.all("select udf('hello', 'world') v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 'hello world'); - }); - db.unregister_udf("udf", done); - }); - - it('ternary int', function(done) { - db.register_udf("udf", "integer", (x, y, z) => x + y + z); - db.all("select udf(21, 20, 1) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 42); - }); - db.unregister_udf("udf", done); - }); - - it('unary larger series', function(done) { - db.register_udf("udf", "integer", (x) => 1); - db.all("select sum(udf(range::double)) v from range(10000)", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 10000); - }); - db.unregister_udf("udf", done); - }); - }); - - describe('types', function() { - var db: duckdb.Database; - before(function(done) { - db = new duckdb.Database(':memory:', done); - }); - - it('tinyint', function(done) { - db.register_udf("udf", "integer", (x) => x+1); - db.all("select udf(42::tinyint) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 43); - }); - db.unregister_udf("udf", done); - }); - - it('smallint', function(done) { - db.register_udf("udf", "integer", (x) => x+1); - db.all("select udf(42::smallint) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 43); - }); - db.unregister_udf("udf", done); - }); - - it('int', function(done) { - db.register_udf("udf", "integer", (x) => x+1); - db.all("select udf(42::integer) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, 43); - }); - db.unregister_udf("udf", done); - }); - - it('timestamp', function(done) { - db.register_udf("udf", "timestamp", (x) => x); - db.all("select udf(timestamp '1992-09-20 11:30:00') v", function(err: null | Error, rows: TableData) { - if (err) throw err; - }); - db.unregister_udf("udf", done); - }); - - it('struct', function(done) { - db.register_udf("udf", "integer", a => { - return (a.x == null ? -100 : a.x); - }); - db.all("SELECT min(udf({'x': (case when v % 2 = 0 then v else null end)::INTEGER, 'y': 42}))::INTEGER as foo FROM generate_series(1, 10000) as t(v)", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].foo, -100); - }); - db.unregister_udf("udf", done); - }); - - it('structnestednull', function(done) { - db.register_udf("udf", "integer", a => { - return (a.x == null ? -100 : a.x.y); - }); - db.all("SELECT min(udf({'x': (case when v % 2 = 0 then {'y': v::INTEGER } else null end), 'z': 42}))::INTEGER as foo FROM generate_series(1, 10000) as t(v)", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].foo, -100); - }); - db.unregister_udf("udf", done); - }); - - it('blob', function(done) { - db.register_udf("udf", "varchar", (buf: Buffer) => buf.toString("hex")); - db.all("select udf('\\xAA\\xAB\\xAC'::BLOB) v", function(err: null | Error, rows: TableData) { - if (err) throw err; - assert.equal(rows[0].v, "aaabac"); - }); - db.unregister_udf("udf", done); - }); - }); -}); diff --git a/test/unicode.test.ts b/test/unicode.test.ts deleted file mode 100644 index 9a920520..00000000 --- a/test/unicode.test.ts +++ /dev/null @@ -1,114 +0,0 @@ -import * as sqlite3 from '..'; -import {TableData} from ".."; -import * as assert from 'assert'; - -describe('unicode', function() { - let i; - let first_values: number[] = [], - trailing_values: number[] = [], - subranges = new Array(2), - len = subranges.length, - db: sqlite3.Database; - - before(function(done) { db = new sqlite3.Database(':memory:', done); }); - - for (i = 0x20; i < 0x80; i++) { - first_values.push(i); - } - - for (i = 0xc2; i < 0xf0; i++) { - first_values.push(i); - } - - for (i = 0x80; i < 0xc0; i++) { - trailing_values.push(i); - } - - for (i = 0; i < len; i++) { - subranges[i] = []; - } - - for (i = 0xa0; i < 0xc0; i++) { - subranges[0].push(i); - } - - for (i = 0x80; i < 0xa0; i++) { - subranges[1].push(i); - } - - function random_choice(arr: number[]) { - return arr[Math.random() * arr.length | 0]; - } - - function random_utf8() { - const first = random_choice(first_values); - - if (first < 0x80) { - return String.fromCharCode(first); - } else if (first < 0xe0) { - return String.fromCharCode((first & 0x1f) << 0x6 | random_choice(trailing_values) & 0x3f); - } else if (first == 0xe0) { - return String.fromCharCode(((first & 0xf) << 0xc) | ((random_choice(subranges[0]) & 0x3f) << 6) | random_choice(trailing_values) & 0x3f); - } else if (first == 0xed) { - return String.fromCharCode(((first & 0xf) << 0xc) | ((random_choice(subranges[1]) & 0x3f) << 6) | random_choice(trailing_values) & 0x3f); - } else if (first < 0xf0) { - return String.fromCharCode(((first & 0xf) << 0xc) | ((random_choice(trailing_values) & 0x3f) << 6) | random_choice(trailing_values) & 0x3f); - } - } - - function randomString() { - let str = '', - i; - - for (i = Math.random() * 300; i > 0; i--) { - str += random_utf8(); - } - - return str; - } - - - // Generate random data. - const data: string[] = []; - const length = Math.floor(Math.random() * 1000) + 200; - for (i = 0; i < length; i++) { - data.push(randomString()); - } - - let inserted = 0; - let retrieved = 0; - - it('should create the table', function(done) { - db.run("CREATE TABLE foo (id int, txt text)", done); - }); - - it('should insert all values', function(done) { - const stmt = db.prepare("INSERT INTO foo VALUES(?, ?)"); - for (let i = 0; i < data.length; i++) { - stmt.run(i, data[i], function(err: null | Error) { - if (err) throw err; - inserted++; - }); - } - stmt.finalize(done); - }); - - it('should retrieve all values', function(done) { - db.all("SELECT txt FROM foo ORDER BY id", function(err: null | Error, rows: TableData) { - if (err) throw err; - - for (let i = 0; i < rows.length; i++) { - assert.equal(rows[i].txt, data[i]); - retrieved++; - } - done(); - }); - }); - - it('should have inserted and retrieved the correct amount', function() { - assert.equal(inserted, length); - assert.equal(retrieved, length); - }); - - after(function(done) { db.close(done); }); -}); diff --git a/test/userdata1.parquet b/test/userdata1.parquet deleted file mode 100644 index 2ae23dac..00000000 Binary files a/test/userdata1.parquet and /dev/null differ diff --git a/test/worker.js b/test/worker.js deleted file mode 100644 index 782f6534..00000000 --- a/test/worker.js +++ /dev/null @@ -1,7 +0,0 @@ -const { parentPort, workerData } = require('worker_threads'); - -const duckdb = require('..'); // The presence of this line alone causes the issue - -new duckdb.Database(":memory:").all("SELECT 42 AS answer", function (err, res) { - parentPort.postMessage(JSON.stringify({workerData, pid: process.pid, err, res})); -}); diff --git a/test_enum.ts b/test_enum.ts deleted file mode 100644 index 5f5a0a2d..00000000 --- a/test_enum.ts +++ /dev/null @@ -1,79 +0,0 @@ -import * as ddb from '.'; - -async function test() { - try { - const db = new ddb.duckdb_database; - const open_state = await ddb.duckdb_open(':memory:', db); - if (open_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to open'); - } - console.log('open successful'); - - const con = new ddb.duckdb_connection; - const connect_state = await ddb.duckdb_connect(db, con); - if (connect_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to connect'); - } - console.log('connect succesful'); - - // const sql = `from test_all_types() select small_enum`; - const sql = `from test_all_types() select medium_enum`; - // const sql = `from test_all_types() select large_enum`; - - const select_result = new ddb.duckdb_result; - const select_query_state = await ddb.duckdb_query(con, sql, select_result); - if (select_query_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to query: ' + ddb.duckdb_result_error(select_result)); - } - console.log('select successful'); - - console.log('column count:', ddb.duckdb_column_count(select_result)); - console.log('column 0 name:', ddb.duckdb_column_name(select_result, 0)); - const rowCount = ddb.duckdb_row_count(select_result); - console.log('row count:', rowCount); - - const chunk = ddb.duckdb_result_get_chunk(select_result, 0); - console.log('chunk column count:', ddb.duckdb_data_chunk_get_column_count(chunk)); - const row_count = ddb.duckdb_data_chunk_get_size(chunk); - console.log('chunk size (row count):', row_count); - - const col0_vec = ddb.duckdb_data_chunk_get_vector(chunk, 0); - - const col0_log_type = ddb.duckdb_vector_get_column_type(col0_vec); - console.log('col 0 type id:', ddb.duckdb_get_type_id(col0_log_type)); // 24 = ENUM - - const enum_int_type = ddb.duckdb_enum_internal_type(col0_log_type); - console.log('enum internal type id:', enum_int_type); // 6 = UTINYINT, 7 = USMALLINT - let bytes_per_value: number | undefined; - switch (enum_int_type) { - case 6: // UTINYINT - bytes_per_value = 1; - break; - case 7: // USMALLINT - bytes_per_value = 2; - break; - case 8: // UINTEGER - bytes_per_value = 4; - break; - } - - const enum_dict_size = ddb.duckdb_enum_dictionary_size(col0_log_type); // number of possible values of enum - console.log('enum dict size:', enum_dict_size); - const enum_dict_value_0 = ddb.duckdb_enum_dictionary_value(col0_log_type, 0); - console.log('enum dict value 0:', enum_dict_value_0); - - const col0_vec_data = ddb.duckdb_vector_get_data(col0_vec); - if (bytes_per_value) { - const col0_vec_buffer = ddb.copy_buffer(col0_vec_data, row_count * bytes_per_value); - console.log('buffer:', col0_vec_buffer); - if (col0_vec_buffer) { - const dataView = new DataView(col0_vec_buffer.buffer, col0_vec_buffer.byteOffset, col0_vec_buffer.byteLength); - } - } - - } catch (e) { - console.error(e); - } -} - -test(); diff --git a/test_list.ts b/test_list.ts deleted file mode 100644 index 3e94fec3..00000000 --- a/test_list.ts +++ /dev/null @@ -1,135 +0,0 @@ -import * as ddb from '.'; - -async function test() { - try { - const db = new ddb.duckdb_database; - const open_state = await ddb.duckdb_open(':memory:', db); - if (open_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to open'); - } - console.log('open successful'); - - const con = new ddb.duckdb_connection; - const connect_state = await ddb.duckdb_connect(db, con); - if (connect_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to connect'); - } - console.log('connect succesful'); - - const sql = 'select * from (values ([[100,101,102],[200,201,202,203,204]], 42), ([[300,301],NULL,[500]], 17), (NULL, NULL), ([NULL,[NULL]], -123)) as t(lst,num)'; - console.log('query:', sql); - - const result = new ddb.duckdb_result; - const query_state = await ddb.duckdb_query(con, sql, result); - if (query_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to query'); - } - console.log('query successful'); - - console.log('column count:', ddb.duckdb_column_count(result)); - console.log('column 0 name:', ddb.duckdb_column_name(result, 0)); - console.log('column 1 name:', ddb.duckdb_column_name(result, 1)); - const rowCount = ddb.duckdb_row_count(result); - console.log('row count:', rowCount); - - const chunk0 = ddb.duckdb_result_get_chunk(result, 0); - console.log('chunk column count:', ddb.duckdb_data_chunk_get_column_count(chunk0)); - console.log('chunk size:', ddb.duckdb_data_chunk_get_size(chunk0)); // chunk size = row count - - const vector0_0 = ddb.duckdb_data_chunk_get_vector(chunk0, 0); - - const logical_type_0_0 = ddb.duckdb_vector_get_column_type(vector0_0); - console.log('type id chunk 0, vector 0:', ddb.duckdb_get_type_id(logical_type_0_0)); // 24 = LIST - const root_list_child_type = ddb.duckdb_list_type_child_type(logical_type_0_0); - console.log('root list child type id:', ddb.duckdb_get_type_id(root_list_child_type)); // 24 = LIST - const nested_list_child_type = ddb.duckdb_list_type_child_type(root_list_child_type); - console.log('nested list child type id:', ddb.duckdb_get_type_id(nested_list_child_type)); // 4 = INTEGER - - const vector0_1 = ddb.duckdb_data_chunk_get_vector(chunk0, 1); - - const logical_type_0_1 = ddb.duckdb_vector_get_column_type(vector0_1); - console.log('type id chunk 0, vector 1:', ddb.duckdb_get_type_id(logical_type_0_1)); // 4 = INTEGER - - const vector0_0_data_pointer = ddb.duckdb_vector_get_data(vector0_0); - const vector0_0_data = ddb.copy_buffer(vector0_0_data_pointer, rowCount * 64 * 2); - if (!vector0_0_data) { - throw new Error('vector0_0_data is null'); - } - const root_list_entry_array = new BigUint64Array(vector0_0_data.buffer, vector0_0_data.byteOffset, rowCount * 2); - console.log('root list entry array: ', root_list_entry_array); - - const root_list_validity_pointer = ddb.duckdb_vector_get_validity(vector0_0); - const root_list_validity_data = ddb.copy_buffer(root_list_validity_pointer, Math.ceil(rowCount / 64) * 8); - if (!root_list_validity_data) { - console.log('root list validity is NULL'); - } else { - console.log('root list validity:', root_list_validity_data); - } - for (let i = 0; i < rowCount; i++) { - console.log('root list item valid (duckdb_validity_row_is_valid):', i, ddb.duckdb_validity_row_is_valid(root_list_validity_pointer, i)); - if (root_list_validity_data) { - console.log('root list item valid (js bit math):', i, !!(root_list_validity_data[Math.floor(i >> 3)] & (1 << (i % 8)))) - } - } - - const root_list_child_vector = ddb.duckdb_list_vector_get_child(vector0_0); - const root_list_child_vector_size = ddb.duckdb_list_vector_get_size(vector0_0); - console.log('child vector size:', root_list_child_vector_size); - - const child_vector_data_pointer = ddb.duckdb_vector_get_data(root_list_child_vector); - const child_vector_data = ddb.copy_buffer(child_vector_data_pointer, root_list_child_vector_size * 64 * 2); - if (!child_vector_data) { - throw new Error('child_vector_data is null'); - } - // console.log('child vector data:', child_vector_data); - const child_list_entry_array = new BigUint64Array(child_vector_data.buffer, child_vector_data.byteOffset, root_list_child_vector_size * 2); - console.log('child vector entry array:', child_list_entry_array); - - const child_vector_validity_pointer = ddb.duckdb_vector_get_validity(root_list_child_vector); - const child_vector_validity_data = ddb.copy_buffer(child_vector_validity_pointer, Math.ceil(root_list_child_vector_size / 64) * 8); - if (!child_vector_validity_data) { - console.log('child vector validity is NULL'); - } else { - console.log('child vector validity:', child_vector_validity_data); - } - for (let i = 0; i < root_list_child_vector_size; i++) { - console.log('child vector item valid (duckdb_validity_row_is_valid):', i, ddb.duckdb_validity_row_is_valid(child_vector_validity_pointer, i)); - if (child_vector_validity_data) { - console.log('child vector item valid (js bit math):', i, !!(child_vector_validity_data[Math.floor(i >> 3)] & (1 << (i % 8)))) - } - } - - const child_vector_child_vector = ddb.duckdb_list_vector_get_child(root_list_child_vector); - const child_vector_child_vector_size = ddb.duckdb_list_vector_get_size(root_list_child_vector); - console.log('child vector child vector size:', child_vector_child_vector_size); - - const child_vector_child_vector_data_pointer = ddb.duckdb_vector_get_data(child_vector_child_vector); - const child_vector_child_vector_data = ddb.copy_buffer(child_vector_child_vector_data_pointer, child_vector_child_vector_size * 4); - if (!child_vector_child_vector_data) { - throw new Error('child_vector_child_vector_data is null'); - } - // console.log('child vector child vector data:', child_vector_child_vector_data); - const child_vector_child_vector_integers = new Int32Array(child_vector_child_vector_data.buffer, child_vector_child_vector_data.byteOffset, child_vector_child_vector_size); - console.log('child vector child vector integers:', child_vector_child_vector_integers); - - const child_vector_child_vector_validity_pointer = ddb.duckdb_vector_get_validity(child_vector_child_vector); - const child_vector_child_vector_validity_data = ddb.copy_buffer(child_vector_child_vector_validity_pointer, Math.ceil(child_vector_child_vector_size / 64) * 8); - if (!child_vector_child_vector_validity_data) { - console.log('child vector child vector validity is NULL'); - } else { - console.log('child vector child vector validity:', child_vector_child_vector_validity_data); - } - for (let i = 0; i < child_vector_child_vector_size; i++) { - console.log('child vector child vector item valid (duckdb_validity_row_is_valid):', i, ddb.duckdb_validity_row_is_valid(child_vector_child_vector_validity_pointer, i)); - if (child_vector_child_vector_validity_data) { - console.log('child vector child vector item valid (js bit math):', i, !!(child_vector_child_vector_validity_data[Math.floor(i >> 3)] & (1 << (i % 8)))) - } - } - - - } catch (e) { - console.error(e); - } -} - -test(); diff --git a/test_union.ts b/test_union.ts deleted file mode 100644 index f1bb36ee..00000000 --- a/test_union.ts +++ /dev/null @@ -1,78 +0,0 @@ -import * as ddb from '.'; - -async function test() { - try { - const db = new ddb.duckdb_database; - const open_state = await ddb.duckdb_open(':memory:', db); - if (open_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to open'); - } - console.log('open successful'); - - const con = new ddb.duckdb_connection; - const connect_state = await ddb.duckdb_connect(db, con); - if (connect_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to connect'); - } - console.log('connect succesful'); - - const create_result = new ddb.duckdb_result; - const create_query_state = await ddb.duckdb_query(con, `create table tbl1(u union(num int, flt float, str varchar))`, create_result); - if (create_query_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to create: ' + ddb.duckdb_result_error(create_result)); - } - console.log('create successful'); - - const insert_result = new ddb.duckdb_result; - const insert_query_state = await ddb.duckdb_query(con, `insert into tbl1 values ('abc'), (123), (3.14)`, insert_result); - if (insert_query_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to insert: ' + ddb.duckdb_result_error(insert_result)); - } - console.log('insert successful'); - - const select_result = new ddb.duckdb_result; - const select_query_state = await ddb.duckdb_query(con, `select * from tbl1`, select_result); - if (select_query_state != ddb.duckdb_state.DuckDBSuccess) { - throw new Error('Failed to query: ' + ddb.duckdb_result_error(select_result)); - } - console.log('select successful'); - - console.log('column count:', ddb.duckdb_column_count(select_result)); - console.log('column 0 name:', ddb.duckdb_column_name(select_result, 0)); - const rowCount = ddb.duckdb_row_count(select_result); - console.log('row count:', rowCount); - - const chunk0 = ddb.duckdb_result_get_chunk(select_result, 0); - console.log('chunk column count:', ddb.duckdb_data_chunk_get_column_count(chunk0)); - console.log('chunk size:', ddb.duckdb_data_chunk_get_size(chunk0)); // chunk size = row count - - const vector0_0 = ddb.duckdb_data_chunk_get_vector(chunk0, 0); - const logical_type_vector0 = ddb.duckdb_vector_get_column_type(vector0_0); - console.log('type id vector 0 0:', ddb.duckdb_get_type_id(logical_type_vector0)); // 28 = UNION - const logical_type_vector0_count = ddb.duckdb_struct_type_child_count(logical_type_vector0); - console.log('vector 0 0 struct type child count:', logical_type_vector0_count); - for (let i = 0; i < logical_type_vector0_count; i++) { - const child_name = ddb.duckdb_struct_type_child_name(logical_type_vector0, i); - console.log('vector 0 0 struct type child name:', i, child_name); - const child_type = ddb.duckdb_struct_type_child_type(logical_type_vector0, i); - console.log('vector 0 0 struct type child type id:', i, ddb.duckdb_get_type_id(child_type)); // 0: 6 = UTINYINT - } - - for (let i = 0; i < logical_type_vector0_count; i++) { - const child = ddb.duckdb_struct_vector_get_child(vector0_0, i); - const logical_type_child = ddb.duckdb_vector_get_column_type(child); - console.log('type id child:', i, ddb.duckdb_get_type_id(logical_type_child)); // 0: 6 = UTINYINT - } - const tag_data_pointer = ddb.duckdb_vector_get_data(ddb.duckdb_struct_vector_get_child(vector0_0, 0)); - const tag_data = ddb.copy_buffer(tag_data_pointer, 3); - console.log('tag data:', tag_data); - // type id 4 = INTEGER - // type id 10 = FLOAT - // type id 17 = VARCHAR - - } catch (e) { - console.error(e); - } -} - -test(); diff --git a/vendor b/vendor deleted file mode 100755 index 1e835715..00000000 --- a/vendor +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -set -e -set -x - -cd `dirname $0` - -python3 vendor.py $@ diff --git a/vendor.py b/vendor.py deleted file mode 100644 index cb5758c3..00000000 --- a/vendor.py +++ /dev/null @@ -1,147 +0,0 @@ -import os -import sys -import json -import pickle -import argparse - -parser = argparse.ArgumentParser(description='Inlines DuckDB Sources') - -parser.add_argument('--duckdb', action='store', - help='Path to the DuckDB Version to be vendored in', required=True, type=str) - - - -args = parser.parse_args() - - -# list of extensions to bundle -extensions = ['parquet', 'icu', 'json'] - -# path to target -basedir = os.getcwd() -target_dir = os.path.join(basedir, 'src', 'duckdb') -gyp_in = os.path.join(basedir, 'binding.gyp.in') -gyp_out = os.path.join(basedir, 'binding.gyp') -cache_file = os.path.join(basedir, 'filelist.cache') - -# path to package_build.py -os.chdir(os.path.join(args.duckdb)) -scripts_dir = 'scripts' - -sys.path.append(scripts_dir) -import package_build - -defines = ['DUCKDB_EXTENSION_{}_LINKED'.format(ext.upper()) for ext in extensions] - -# Autoloading is on by default for node distributions -defines.extend(['DUCKDB_EXTENSION_AUTOLOAD_DEFAULT=1', 'DUCKDB_EXTENSION_AUTOINSTALL_DEFAULT=1']) - -if os.environ.get('DUCKDB_NODE_BUILD_CACHE') == '1' and os.path.isfile(cache_file): - with open(cache_file, 'rb') as f: - cache = pickle.load(f) - source_list = cache['source_list'] - include_list = cache['include_list'] - libraries = cache['libraries'] - windows_options = cache['windows_options'] - cflags = cache['cflags'] -elif 'DUCKDB_NODE_BINDIR' in os.environ: - - def find_library_path(libdir, libname): - flist = os.listdir(libdir) - for fname in flist: - fpath = os.path.join(libdir, fname) - if os.path.isfile(fpath) and package_build.file_is_lib(fname, libname): - return fpath - raise Exception(f"Failed to find library {libname} in {libdir}") - - # existing build - existing_duckdb_dir = os.environ['DUCKDB_NODE_BINDIR'] - cflags = os.environ['DUCKDB_NODE_CFLAGS'] - libraries = os.environ['DUCKDB_NODE_LIBS'].split(' ') - - include_directories = [os.path.join('..', '..', include) for include in package_build.third_party_includes()] - include_list = package_build.includes(extensions) - - result_libraries = package_build.get_libraries(existing_duckdb_dir, libraries, extensions) - libraries = [] - for libdir, libname in result_libraries: - if libdir is None: - continue - libraries.append(find_library_path(libdir, libname)) - - source_list = [] - cflags = [] - windows_options = [] - if os.name == 'nt': - windows_options = [x for x in os.environ['DUCKDB_NODE_CFLAGS'].split(' ') if x.startswith('/')] - else: - if '-g' in os.environ['DUCKDB_NODE_CFLAGS']: - cflags += ['-g'] - if '-O0' in os.environ['DUCKDB_NODE_CFLAGS']: - cflags += ['-O0'] - if '-DNDEBUG' in os.environ['DUCKDB_NODE_CFLAGS']: - defines += ['NDEBUG'] - - if 'DUCKDB_NODE_BUILD_CACHE' in os.environ: - cache = { - 'source_list': source_list, - 'include_list': include_list, - 'libraries': libraries, - 'cflags': cflags, - 'windows_options': windows_options, - } - with open(cache_file, 'wb+') as f: - pickle.dump(cache, f) -else: - # fresh build - copy over all of the files - (source_list, include_list, original_sources) = package_build.build_package(target_dir, extensions, False) - - # # the list of all source files (.cpp files) that have been copied into the `duckdb_source_copy` directory - # print(source_list) - # # the list of all include files - # print(include_list) - source_list = [os.path.relpath(x, basedir) if os.path.isabs(x) else os.path.join('src', x) for x in source_list] - include_list = [os.path.join('src', 'duckdb', x) for x in include_list] - libraries = [] - windows_options = ['/GR'] - cflags = ['-frtti'] - - -def sanitize_path(x): - return x.replace('\\', '/') - - -source_list = [sanitize_path(x) for x in source_list] -include_list = [sanitize_path(x) for x in include_list] -libraries = [sanitize_path(x) for x in libraries] - -with open(gyp_in, 'r') as f: - input_json = json.load(f) - - -def replace_entries(node, replacement_map): - if type(node) == type([]): - for key in replacement_map.keys(): - if key in node: - node.remove(key) - node += replacement_map[key] - for entry in node: - if type(entry) == type([]) or type(entry) == type({}): - replace_entries(entry, replacement_map) - if type(node) == type({}): - for key in node.keys(): - replace_entries(node[key], replacement_map) - - -replacement_map = {} -replacement_map['${SOURCE_FILES}'] = source_list -replacement_map['${INCLUDE_FILES}'] = include_list -replacement_map['${DEFINES}'] = defines -replacement_map['${LIBRARY_FILES}'] = libraries -replacement_map['${CFLAGS}'] = cflags -replacement_map['${WINDOWS_OPTIONS}'] = windows_options - -replace_entries(input_json, replacement_map) - -with open(gyp_out, 'w+') as f: - json.dump(input_json, f, indent=4, separators=(", ", ": "))