shithub: aacdec

Download patch

ref: 927eb0f39c35def488f0577df684a2edac2f6cc0
parent: 6ca72a90fc5ab19a40f74b544e153bf62e95f7a3
author: menno <menno>
date: Sun Oct 19 14:11:20 EDT 2003

New mp4 file format library
several updates

diff: cannot open b/common/mp4ff//null: file does not exist: 'b/common/mp4ff//null'
--- /dev/null
+++ b/common/mp4ff/README_ORIGINAL
@@ -1,0 +1,42 @@
+Quicktime for Linux
+
+Author: Adam Williams    quicktime@altavista.net
+Homepage: heroinewarrior.com/quicktime
+Requires: libpthread
+------------------------------------------------------------------------
+
+***** 
+
+This is a Quicktime library for UNIX in a freely redistributable,
+statically linkable library.  You can statically link it in a program
+and charge money for the program.  The only condition is that if you
+use it in a program, you must put the author's name and email
+somewhere.  If you improve the library itself or add a free codec to
+it, you should release your improvements.  If you redistribute the
+code, you must also redistribute the author information and
+documentation.  At this time it's very popular to license stuff under
+the GPL.  You are free to include this library in a derived work and
+license the derived work under GPL.
+
+*****
+
+Building:
+type "make" in the quicktime/quicktime directory.
+type "make util" to get some Small Utilities.
+
+Configuration:
+
+The file "config.h" defines the size of a 16 bit word and what the
+maximum file size is.
+
+/*******************************************************
+ * References:
+ *********************************/
+
+Apple's quicktime file format information:
+
+http://developer.apple.com/techpubs/quicktime/qtdevdocs/REF/refQTFileFormat.htm
+
+Color space conversions:
+
+http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html
--- /dev/null
+++ b/common/mp4ff/atom.c
@@ -1,0 +1,140 @@
+#include "mp4ff.h"
+
+
+int mp4ff_atom_reset(mp4ff_atom_t *atom)
+{
+	atom->end = 0;
+	atom->type[0] = atom->type[1] = atom->type[2] = atom->type[3] = 0;
+	return 0;
+}
+
+int mp4ff_atom_read_header(mp4ff_t *file, mp4ff_atom_t *atom)
+{
+	char header[10];
+	int result;
+
+	atom->start = mp4ff_position(file);
+
+	mp4ff_atom_reset(atom);
+
+	if(!mp4ff_read_data(file, header, HEADER_LENGTH)) return 1;
+	result = mp4ff_atom_read_type(header, atom->type);
+	atom->size = mp4ff_atom_read_size(header);
+	if (atom->size == 0) {
+		atom->size = file->total_length - atom->start;
+	}
+	atom->end = atom->start + atom->size;
+
+/* Skip placeholder atom */
+	if(mp4ff_match_32(atom->type, "wide"))
+	{
+		atom->start = mp4ff_position(file);
+		mp4ff_atom_reset(atom);
+		if(!mp4ff_read_data(file, header, HEADER_LENGTH)) 
+			return 1;
+		result = mp4ff_atom_read_type(header, atom->type);
+		atom->size -= 8;
+		if(!atom->size)
+		{
+/* Wrapper ended.  Get new atom size */
+			atom->size = mp4ff_atom_read_size(header);
+			if (atom->size == 0) {
+				atom->size = file->total_length - atom->start;
+			}
+		}
+		atom->end = atom->start + atom->size;
+	}
+	else
+/* Get extended size */
+	if(atom->size == 1)
+	{
+		if(!mp4ff_read_data(file, header, HEADER_LENGTH)) return 1;
+		atom->size = mp4ff_atom_read_size64(header);
+	}
+
+
+#ifdef DEBUG
+	printf("Reading atom %.4s length %u\n", atom->type, atom->size);
+#endif
+	return result;
+}
+
+int mp4ff_atom_write_header(mp4ff_t *file, mp4ff_atom_t *atom, char *text)
+{
+	atom->start = mp4ff_position(file);
+	mp4ff_write_int32(file, 0);
+	mp4ff_write_char32(file, text);
+}
+
+int mp4ff_atom_write_footer(mp4ff_t *file, mp4ff_atom_t *atom)
+{
+	atom->end = mp4ff_position(file);
+	mp4ff_set_position(file, atom->start);
+	mp4ff_write_int32(file, atom->end - atom->start);
+	mp4ff_set_position(file, atom->end);
+}
+
+int mp4ff_atom_is(mp4ff_atom_t *atom, char *type)
+{
+	if(atom->type[0] == type[0] &&
+		atom->type[1] == type[1] &&
+		atom->type[2] == type[2] &&
+		atom->type[3] == type[3])
+	return 1;
+	else
+	return 0;
+}
+
+long mp4ff_atom_read_size(char *data)
+{
+	unsigned long result;
+	unsigned long a, b, c, d;
+	
+	a = (unsigned char)data[0];
+	b = (unsigned char)data[1];
+	c = (unsigned char)data[2];
+	d = (unsigned char)data[3];
+
+	result = (a<<24) | (b<<16) | (c<<8) | d;
+	if(result > 0 && result < HEADER_LENGTH) result = HEADER_LENGTH;
+	return (long)result;
+}
+
+unsigned __int64 mp4ff_atom_read_size64(char *data)
+{
+	unsigned __int64 result = 0;
+	int i;
+
+	for (i = 0; i < 8; i++) {
+		result |= data[i];
+		if (i < 7) {
+			result <<= 8;
+		}
+	}
+
+	if(result < HEADER_LENGTH) 
+		result = HEADER_LENGTH;
+	return result;
+}
+
+int mp4ff_atom_read_type(char *data, char *type)
+{
+	type[0] = data[4];
+	type[1] = data[5];
+	type[2] = data[6];
+	type[3] = data[7];
+
+/*printf("%c%c%c%c ", type[0], type[1], type[2], type[3]); */
+/* need this for mp4ff_check_sig */
+	if(isalpha(type[0]) && isalpha(type[1]) && isalpha(type[2]) && isalpha(type[3]))
+	return 0;
+	else
+	return 1;
+}
+
+int mp4ff_atom_skip(mp4ff_t *file, mp4ff_atom_t *atom)
+{
+	/* printf("skipping atom %.4s, size %u\n", atom->type, atom->size); */
+	return mp4ff_set_position(file, atom->end);
+}
+
--- /dev/null
+++ b/common/mp4ff/ctts.c
@@ -1,0 +1,130 @@
+/*
+ * The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ * 
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ * 
+ * The Original Code is MPEG4IP.
+ * 
+ * The Initial Developer of the Original Code is Cisco Systems Inc.
+ * Portions created by Cisco Systems Inc. are
+ * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
+ * 
+ * Contributor(s): 
+ *		Dave Mackie		dmackie@cisco.com
+ */
+
+#include "mp4ff.h"
+
+
+int mp4ff_ctts_init(mp4ff_ctts_t *ctts)
+{
+	ctts->version = 0;
+	ctts->flags = 0;
+	ctts->total_entries = 0;
+	ctts->entries_allocated = 0;
+}
+
+int mp4ff_ctts_init_table(mp4ff_ctts_t *ctts)
+{
+	if (!ctts->entries_allocated) {
+		ctts->entries_allocated = 1;
+		ctts->table = (mp4ff_ctts_table_t*)
+			malloc(sizeof(mp4ff_ctts_table_t) * ctts->entries_allocated);
+		ctts->total_entries = 1;
+	}
+}
+
+int mp4ff_ctts_init_common(mp4ff_t *file, mp4ff_ctts_t *ctts)
+{
+	mp4ff_ctts_table_t *table;
+	mp4ff_ctts_init_table(ctts);
+	table = &(ctts->table[0]);
+
+	table->sample_count = 0;      /* need to set this when closing */
+	table->sample_offset = 0;
+}
+
+int mp4ff_ctts_delete(mp4ff_ctts_t *ctts)
+{
+	if (ctts->total_entries) {
+		free(ctts->table);
+	}
+	ctts->total_entries = 0;
+}
+
+int mp4ff_ctts_dump(mp4ff_ctts_t *ctts)
+{
+	int i;
+	printf("     composition time to sample\n");
+	printf("      version %d\n", ctts->version);
+	printf("      flags %d\n", ctts->flags);
+	printf("      total_entries %d\n", ctts->total_entries);
+	for(i = 0; i < ctts->total_entries; i++) {
+		printf("       count %ld offset %ld\n", 
+			ctts->table[i].sample_count,
+			ctts->table[i].sample_offset);
+	}
+}
+
+int mp4ff_read_ctts(mp4ff_t *file, mp4ff_ctts_t *ctts)
+{
+	int i;
+	ctts->version = mp4ff_read_char(file);
+	ctts->flags = mp4ff_read_int24(file);
+	ctts->total_entries = mp4ff_read_int32(file);
+
+	ctts->table = (mp4ff_ctts_table_t*)
+		malloc(sizeof(mp4ff_ctts_table_t) * ctts->total_entries);
+
+	for (i = 0; i < ctts->total_entries; i++) {
+		ctts->table[i].sample_count = mp4ff_read_int32(file);
+		ctts->table[i].sample_offset = mp4ff_read_int32(file);
+	}
+}
+
+int mp4ff_write_ctts(mp4ff_t *file, mp4ff_ctts_t *ctts)
+{
+	int i;
+	mp4ff_atom_t atom;
+
+	if (ctts->total_entries == 1 && ctts->table[0].sample_offset == 0) {
+		return;
+	}
+
+	mp4ff_atom_write_header(file, &atom, "ctts");
+
+	mp4ff_write_char(file, ctts->version);
+	mp4ff_write_int24(file, ctts->flags);
+	mp4ff_write_int32(file, ctts->total_entries);
+	for(i = 0; i < ctts->total_entries; i++) {
+		mp4ff_write_int32(file, ctts->table[i].sample_count);
+		mp4ff_write_int32(file, ctts->table[i].sample_offset);
+	}
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_ctts(mp4ff_ctts_t *ctts, long sample_offset)
+{
+	if (sample_offset == ctts->table[ctts->total_entries-1].sample_offset) {
+		ctts->table[ctts->total_entries-1].sample_count++;
+	} else {
+		/* need a new entry in the table */
+
+		/* allocate more entries if necessary */
+		if (ctts->total_entries >= ctts->entries_allocated) {
+			ctts->entries_allocated *= 2;
+			ctts->table = (mp4ff_ctts_table_t*)realloc(ctts->table,
+				sizeof(mp4ff_ctts_table_t) * ctts->entries_allocated);
+		}
+	
+		ctts->table[ctts->total_entries].sample_count = 1;
+		ctts->table[ctts->total_entries].sample_offset = sample_offset;
+		ctts->total_entries++;
+	}
+}
--- /dev/null
+++ b/common/mp4ff/dinf.c
@@ -1,0 +1,44 @@
+#include "mp4ff.h"
+
+int mp4ff_dinf_init(mp4ff_dinf_t *dinf)
+{
+	mp4ff_dref_init(&(dinf->dref));
+}
+
+int mp4ff_dinf_delete(mp4ff_dinf_t *dinf)
+{
+	mp4ff_dref_delete(&(dinf->dref));
+}
+
+int mp4ff_dinf_init_all(mp4ff_dinf_t *dinf)
+{
+	mp4ff_dref_init_all(&(dinf->dref));
+}
+
+int mp4ff_dinf_dump(mp4ff_dinf_t *dinf)
+{
+	printf("    data information (dinf)\n");
+	mp4ff_dref_dump(&(dinf->dref));
+}
+
+int mp4ff_read_dinf(mp4ff_t *file, mp4ff_dinf_t *dinf, mp4ff_atom_t *dinf_atom)
+{
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+		if(mp4ff_atom_is(&leaf_atom, "dref"))
+			{ mp4ff_read_dref(file, &(dinf->dref)); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < dinf_atom->end);
+}
+
+int mp4ff_write_dinf(mp4ff_t *file, mp4ff_dinf_t *dinf)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "dinf");
+	mp4ff_write_dref(file, &(dinf->dref));
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/dref.c
@@ -1,0 +1,130 @@
+#include "mp4ff.h"
+
+int mp4ff_dref_table_init(mp4ff_dref_table_t *table)
+{
+	table->size = 0;
+	table->type[0] = 'a';
+	table->type[1] = 'l';
+	table->type[2] = 'i';
+	table->type[3] = 's';
+	table->version = 0;
+	table->flags = 0x0001;
+	table->data_reference = malloc(256);
+	table->data_reference[0] = 0;
+}
+
+int mp4ff_dref_table_delete(mp4ff_dref_table_t *table)
+{
+	if(table->data_reference) free(table->data_reference);
+	table->data_reference = 0;
+}
+
+int mp4ff_read_dref_table(mp4ff_t *file, mp4ff_dref_table_t *table)
+{
+	table->size = mp4ff_read_int32(file);
+	mp4ff_read_char32(file, table->type);
+	table->version = mp4ff_read_char(file);
+	table->flags = mp4ff_read_int24(file);
+	if(table->data_reference) free(table->data_reference);
+
+	table->data_reference = malloc(table->size);
+	if(table->size > 12)
+		mp4ff_read_data(file, table->data_reference, table->size - 12);
+	table->data_reference[table->size - 12] = 0;
+}
+
+int mp4ff_write_dref_table(mp4ff_t *file, mp4ff_dref_table_t *table)
+{
+	int len = strlen(table->data_reference);
+	mp4ff_write_int32(file, 12 + len);
+	mp4ff_write_char32(file, table->type);
+	mp4ff_write_char(file, table->version);
+	mp4ff_write_int24(file, table->flags);
+	if(len)
+		mp4ff_write_data(file, table->data_reference, len);
+}
+
+int mp4ff_dref_table_dump(mp4ff_dref_table_t *table)
+{
+	printf("      data reference table (dref)\n");
+	printf("       type %c%c%c%c\n", table->type[0], table->type[1], table->type[2], table->type[3]);
+	printf("       version %d\n", table->version);
+	printf("       flags %d\n", table->flags);
+	printf("       data %s\n", table->data_reference);
+}
+
+
+int mp4ff_dref_init(mp4ff_dref_t *dref)
+{
+	dref->version = 0;
+	dref->flags = 0;
+	dref->total_entries = 0;
+	dref->table = 0;
+}
+
+int mp4ff_dref_init_all(mp4ff_dref_t *dref)
+{
+	if(!dref->total_entries)
+	{
+		dref->total_entries = 1;
+		dref->table = (mp4ff_dref_table_t *)malloc(sizeof(mp4ff_dref_table_t) * dref->total_entries);
+		mp4ff_dref_table_init(&(dref->table[0]));
+	}
+}
+
+int mp4ff_dref_delete(mp4ff_dref_t *dref)
+{
+	if(dref->table)
+	{
+		int i;
+		for(i = 0; i < dref->total_entries; i++)
+			mp4ff_dref_table_delete(&(dref->table[i]));
+		free(dref->table);
+	}
+	dref->total_entries = 0;
+}
+
+int mp4ff_dref_dump(mp4ff_dref_t *dref)
+{
+	int i;
+	
+	printf("     data reference (dref)\n");
+	printf("      version %d\n", dref->version);
+	printf("      flags %d\n", dref->flags);
+	for(i = 0; i < dref->total_entries; i++)
+	{
+		mp4ff_dref_table_dump(&(dref->table[i]));
+	}
+}
+
+int mp4ff_read_dref(mp4ff_t *file, mp4ff_dref_t *dref)
+{
+	int i;
+
+	dref->version = mp4ff_read_char(file);
+	dref->flags = mp4ff_read_int24(file);
+	dref->total_entries = mp4ff_read_int32(file);
+	dref->table = (mp4ff_dref_table_t*)malloc(sizeof(mp4ff_dref_table_t) * dref->total_entries);
+	for(i = 0; i < dref->total_entries; i++)
+	{
+		mp4ff_dref_table_init(&(dref->table[i]));
+		mp4ff_read_dref_table(file, &(dref->table[i]));
+	}
+}
+
+int mp4ff_write_dref(mp4ff_t *file, mp4ff_dref_t *dref)
+{
+	int i;
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "dref");
+
+	mp4ff_write_char(file, dref->version);
+	mp4ff_write_int24(file, dref->flags);
+	mp4ff_write_int32(file, dref->total_entries);
+
+	for(i = 0; i < dref->total_entries; i++)
+	{
+		mp4ff_write_dref_table(file, &(dref->table[i]));
+	}
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/edts.c
@@ -1,0 +1,44 @@
+#include "mp4ff.h"
+
+int mp4ff_edts_init(mp4ff_edts_t *edts)
+{
+	mp4ff_elst_init(&(edts->elst));
+}
+
+int mp4ff_edts_delete(mp4ff_edts_t *edts)
+{
+	mp4ff_elst_delete(&(edts->elst));
+}
+
+int mp4ff_edts_init_table(mp4ff_edts_t *edts)
+{
+	mp4ff_elst_init_all(&(edts->elst));
+}
+
+int mp4ff_read_edts(mp4ff_t *file, mp4ff_edts_t *edts, mp4ff_atom_t *edts_atom)
+{
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+		if(mp4ff_atom_is(&leaf_atom, "elst"))
+			{ mp4ff_read_elst(file, &(edts->elst)); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < edts_atom->end);
+}
+
+int mp4ff_edts_dump(mp4ff_edts_t *edts)
+{
+	printf("  edit atom (edts)\n");
+	mp4ff_elst_dump(&(edts->elst));
+}
+
+int mp4ff_write_edts(mp4ff_t *file, mp4ff_edts_t *edts, long duration)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "edts");
+	mp4ff_write_elst(file, &(edts->elst), duration);
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/elst.c
@@ -1,0 +1,112 @@
+#include "mp4ff.h"
+
+
+int mp4ff_elst_table_init(mp4ff_elst_table_t *table)
+{
+	table->duration = 0;
+	table->time = 0;
+	table->rate = 1;
+}
+
+int mp4ff_elst_table_delete(mp4ff_elst_table_t *table)
+{
+}
+
+int mp4ff_read_elst_table(mp4ff_t *file, mp4ff_elst_table_t *table)
+{
+	table->duration = mp4ff_read_int32(file);
+	table->time = mp4ff_read_int32(file);
+	table->rate = mp4ff_read_fixed32(file);
+}
+
+int mp4ff_write_elst_table(mp4ff_t *file, mp4ff_elst_table_t *table, long duration)
+{
+	table->duration = duration;
+	mp4ff_write_int32(file, table->duration);
+	mp4ff_write_int32(file, table->time);
+	mp4ff_write_fixed32(file, table->rate);
+}
+
+int mp4ff_elst_table_dump(mp4ff_elst_table_t *table)
+{
+	printf("    edit list table\n");
+	printf("     duration %ld\n", table->duration);
+	printf("     time %ld\n", table->time);
+	printf("     rate %f\n", table->rate);
+}
+
+int mp4ff_elst_init(mp4ff_elst_t *elst)
+{
+	elst->version = 0;
+	elst->flags = 0;
+	elst->total_entries = 0;
+	elst->table = 0;
+}
+
+int mp4ff_elst_init_all(mp4ff_elst_t *elst)
+{
+	if(!elst->total_entries)
+	{
+		elst->total_entries = 1;
+		elst->table = (mp4ff_elst_table_t*)malloc(sizeof(mp4ff_elst_table_t) * elst->total_entries);
+		mp4ff_elst_table_init(&(elst->table[0]));
+	}
+}
+
+int mp4ff_elst_delete(mp4ff_elst_t *elst)
+{
+	int i;
+	if(elst->total_entries)
+	{
+		for(i = 0; i < elst->total_entries; i++)
+			mp4ff_elst_table_delete(&(elst->table[i]));
+		free(elst->table);
+	}
+	elst->total_entries = 0;
+}
+
+int mp4ff_elst_dump(mp4ff_elst_t *elst)
+{
+	int i;
+	printf("   edit list (elst)\n");
+	printf("    version %d\n", elst->version);
+	printf("    flags %d\n", elst->flags);
+	printf("    total_entries %d\n", elst->total_entries);
+
+	for(i = 0; i < elst->total_entries; i++)
+	{
+		mp4ff_elst_table_dump(&(elst->table[i]));
+	}
+}
+
+int mp4ff_read_elst(mp4ff_t *file, mp4ff_elst_t *elst)
+{
+	int i;
+
+	elst->version = mp4ff_read_char(file);
+	elst->flags = mp4ff_read_int24(file);
+	elst->total_entries = mp4ff_read_int32(file);
+	elst->table = (mp4ff_elst_table_t*)malloc(sizeof(mp4ff_elst_table_t) * elst->total_entries);
+	for(i = 0; i < elst->total_entries; i++)
+	{
+		mp4ff_elst_table_init(&(elst->table[i]));
+		mp4ff_read_elst_table(file, &(elst->table[i]));
+	}
+}
+
+int mp4ff_write_elst(mp4ff_t *file, mp4ff_elst_t *elst, long duration)
+{
+	mp4ff_atom_t atom;
+	int i;
+	mp4ff_atom_write_header(file, &atom, "elst");
+
+	mp4ff_write_char(file, elst->version);
+	mp4ff_write_int24(file, elst->flags);
+	mp4ff_write_int32(file, elst->total_entries);
+	for(i = 0; i < elst->total_entries; i++)
+	{
+		mp4ff_write_elst_table(file, elst->table, duration);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/esds.c
@@ -1,0 +1,194 @@
+/*
+ * The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ * 
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ * 
+ * The Original Code is MPEG4IP.
+ * 
+ * The Initial Developer of the Original Code is Cisco Systems Inc.
+ * Portions created by Cisco Systems Inc. are
+ * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
+ * 
+ * Contributor(s): 
+ *		Dave Mackie		dmackie@cisco.com
+ */
+
+#include "mp4ff.h"
+
+
+int mp4ff_esds_init(mp4ff_esds_t *esds)
+{
+	esds->version = 0;
+	esds->flags = 0;
+	esds->decoderConfigLen = 0;
+	esds->decoderConfig = NULL;
+	return 0;
+}
+
+int mp4ff_esds_get_decoder_config(mp4ff_esds_t* esds, unsigned char** ppBuf, int* pBufSize)
+{
+	if (esds->decoderConfig == NULL || esds->decoderConfigLen == 0) {
+		*ppBuf = NULL;
+		*pBufSize = 0;
+	} else {
+		*ppBuf = malloc(esds->decoderConfigLen);
+		if (*ppBuf == NULL) {
+			*pBufSize = 0;
+			return 1;
+		}
+		memcpy(*ppBuf, esds->decoderConfig, esds->decoderConfigLen);
+		*pBufSize = esds->decoderConfigLen;
+	}
+	return 0;
+}
+
+int mp4ff_esds_set_decoder_config(mp4ff_esds_t* esds, unsigned char* pBuf, int bufSize)
+{
+	free(esds->decoderConfig);
+	esds->decoderConfig = malloc(bufSize);
+	if (esds->decoderConfig) {
+		memcpy(esds->decoderConfig, pBuf, bufSize);
+		esds->decoderConfigLen = bufSize;
+		return 0;
+	}
+	return 1;
+}
+
+int mp4ff_esds_delete(mp4ff_esds_t *esds)
+{
+	free(esds->decoderConfig);
+	return 0;
+}
+
+int mp4ff_esds_dump(mp4ff_esds_t *esds)
+{
+	int i;
+
+	printf("       elementary stream descriptor\n");
+	printf("        version %d\n", esds->version);
+	printf("        flags %ld\n", esds->flags);
+	printf("        decoder config ");
+	for (i = 0; i < esds->decoderConfigLen; i++) {	
+		printf("%02x ", esds->decoderConfig[i]);
+	}
+	printf("\n");
+}
+
+int mp4ff_read_esds(mp4ff_t *file, mp4ff_esds_t *esds)
+{
+	unsigned __int8 tag;
+
+	esds->version = mp4ff_read_char(file);
+	esds->flags = mp4ff_read_int24(file);
+
+	/* get and verify ES_DescrTag */
+	tag = mp4ff_read_char(file);
+	if (tag == 0x03) {
+		/* read length */
+		if (mp4ff_read_mp4_descr_length(file) < 5 + 15) {
+			return 1;
+		}
+		/* skip 3 bytes */
+		mp4ff_set_position(file, mp4ff_position(file) + 3);
+	} else {
+		/* skip 2 bytes */
+		mp4ff_set_position(file, mp4ff_position(file) + 2);
+	}
+
+	/* get and verify DecoderConfigDescrTab */
+	if (mp4ff_read_char(file) != 0x04) {
+		return 1;
+	}
+
+	/* read length */
+	if (mp4ff_read_mp4_descr_length(file) < 15) {
+		return 1;
+	}
+
+	/* skip 13 bytes */
+	mp4ff_set_position(file, mp4ff_position(file) + 13);
+
+	/* get and verify DecSpecificInfoTag */
+	if (mp4ff_read_char(file) != 0x05) {
+		return 1;
+	}
+
+	/* read length */
+	esds->decoderConfigLen = mp4ff_read_mp4_descr_length(file); 
+
+	free(esds->decoderConfig);
+	esds->decoderConfig = malloc(esds->decoderConfigLen);
+	if (esds->decoderConfig) {
+		mp4ff_read_data(file, esds->decoderConfig, esds->decoderConfigLen);
+	} else {
+		esds->decoderConfigLen = 0;
+	}
+
+	/* will skip the remainder of the atom */
+	return 0;
+}
+
+int mp4ff_write_esds_common(mp4ff_t *file, mp4ff_esds_t *esds, int esid, unsigned int objectType, unsigned int streamType)
+{
+	mp4ff_atom_t atom;
+
+	mp4ff_atom_write_header(file, &atom, "esds");
+
+	mp4ff_write_char(file, esds->version);
+	mp4ff_write_int24(file, esds->flags);
+
+	mp4ff_write_char(file, 0x03);	/* ES_DescrTag */
+	mp4ff_write_mp4_descr_length(file, 
+		3 + (5 + (13 + (5 + esds->decoderConfigLen))) + 3, FALSE);
+
+	mp4ff_write_int16(file, esid);
+	mp4ff_write_char(file, 0x10);	/* streamPriorty = 16 (0-31) */
+
+	/* DecoderConfigDescriptor */
+	mp4ff_write_char(file, 0x04);	/* DecoderConfigDescrTag */
+	mp4ff_write_mp4_descr_length(file, 
+		13 + (5 + esds->decoderConfigLen), FALSE);
+
+	mp4ff_write_char(file, objectType); /* objectTypeIndication */
+	mp4ff_write_char(file, streamType); /* streamType */
+
+	mp4ff_write_int24(file, 0);		/* buffer size */
+	mp4ff_write_int32(file, 0);		/* max bitrate */
+	mp4ff_write_int32(file, 0);		/* average bitrate */
+
+	mp4ff_write_char(file, 0x05);	/* DecSpecificInfoTag */
+	mp4ff_write_mp4_descr_length(file, esds->decoderConfigLen, FALSE);
+	mp4ff_write_data(file, esds->decoderConfig, esds->decoderConfigLen);
+
+	/* SLConfigDescriptor */
+	mp4ff_write_char(file, 0x06);	/* SLConfigDescrTag */
+	mp4ff_write_char(file, 0x01);	/* length */
+	mp4ff_write_char(file, 0x02);	/* constant in mp4 files */
+
+	/* no IPI_DescrPointer */
+	/* no IP_IdentificationDataSet */
+	/* no IPMP_DescriptorPointer */
+	/* no LanguageDescriptor */
+	/* no QoS_Descriptor */
+	/* no RegistrationDescriptor */
+	/* no ExtensionDescriptor */
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_write_esds_audio(mp4ff_t *file, mp4ff_esds_t *esds, int esid)
+{
+	return mp4ff_write_esds_common(file, esds, esid, (unsigned int)0x40, (unsigned int)0x05);
+}
+
+int mp4ff_write_esds_video(mp4ff_t *file, mp4ff_esds_t *esds, int esid)
+{
+	return mp4ff_write_esds_common(file, esds, esid, (unsigned int)0x20, (unsigned int)0x04);
+}
+
--- /dev/null
+++ b/common/mp4ff/funcprotos.h
@@ -1,0 +1,156 @@
+#ifndef FUNCPROTOS_H
+#define FUNCPROTOS_H
+
+/* atom handling routines */
+long mp4ff_atom_read_size(char *data);
+unsigned __int64 mp4ff_atom_read_size64(char *data);
+int mp4ff_atom_write_header(mp4ff_t *file, mp4ff_atom_t *atom, char *text);
+int mp4ff_atom_read_header(mp4ff_t *file, mp4ff_atom_t *atom);
+int mp4ff_atom_write_footer(mp4ff_t *file, mp4ff_atom_t *atom);
+
+mp4ff_trak_t* mp4ff_add_track(mp4ff_moov_t *moov);
+mp4ff_trak_t* mp4ff_find_track_by_id(mp4ff_moov_t *moov, int trackId);
+
+
+/* initializers for every atom */
+int mp4ff_matrix_init(mp4ff_matrix_t *matrix);
+int mp4ff_edts_init_table(mp4ff_edts_t *edts);
+int mp4ff_edts_init(mp4ff_edts_t *edts);
+int mp4ff_elst_init(mp4ff_elst_t *elst);
+int mp4ff_elst_init_all(mp4ff_elst_t *elst);
+int mp4ff_elst_table_init(mp4ff_elst_table_t *table); /* initialize a table */
+int mp4ff_tkhd_init(mp4ff_tkhd_t *tkhd);
+int mp4ff_tkhd_init_video(mp4ff_t *file, mp4ff_tkhd_t *tkhd, int frame_w, int frame_h);
+int mp4ff_stsd_table_init(mp4ff_stsd_table_t *table);
+int mp4ff_stsd_init(mp4ff_stsd_t *stsd);
+int mp4ff_stsd_init_table(mp4ff_stsd_t *stsd);
+int mp4ff_stsd_init_video(mp4ff_t *file, mp4ff_stsd_t *stsd, int frame_w, int frame_h, float frame_rate, char *compression);
+int mp4ff_stsd_init_audio(mp4ff_t *file, mp4ff_stsd_t *stsd, int channels, int sample_rate, int bits, char *compressor);
+int mp4ff_stts_init(mp4ff_stts_t *stts);
+int mp4ff_stts_init_table(mp4ff_stts_t *stts);
+int mp4ff_stts_init_video(mp4ff_t *file, mp4ff_stts_t *stts, int time_scale, float frame_rate);
+int mp4ff_stts_init_audio(mp4ff_t *file, mp4ff_stts_t *stts, int time_scale, int sample_duration);
+int mp4ff_stss_init(mp4ff_stss_t *stss);
+int mp4ff_stss_init_common(mp4ff_t *file, mp4ff_stss_t *stss);
+int mp4ff_stsc_init(mp4ff_stsc_t *stsc);
+int mp4ff_stsc_init_video(mp4ff_t *file, mp4ff_stsc_t *stsc);
+int mp4ff_stsc_init_audio(mp4ff_t *file, mp4ff_stsc_t *stsc);
+int mp4ff_stsz_init(mp4ff_stsz_t *stsz);
+int mp4ff_stsz_init_video(mp4ff_t *file, mp4ff_stsz_t *stsz);
+int mp4ff_stsz_init_audio(mp4ff_t *file, mp4ff_stsz_t *stsz, int sample_size);
+int mp4ff_stco_init(mp4ff_stco_t *stco);
+int mp4ff_stco_init_common(mp4ff_t *file, mp4ff_stco_t *stco);
+int mp4ff_stbl_init(mp4ff_stbl_t *tkhd);
+int mp4ff_stbl_init_video(mp4ff_t *file, mp4ff_stbl_t *stbl, int frame_w, int frame_h, int time_scale, float frame_rate, char *compressor);
+int mp4ff_stbl_init_audio(mp4ff_t *file, mp4ff_stbl_t *stbl, int channels, int sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor);
+int mp4ff_vmhd_init(mp4ff_vmhd_t *vmhd);
+int mp4ff_vmhd_init_video(mp4ff_t *file, mp4ff_vmhd_t *vmhd, int frame_w, int frame_h, float frame_rate);
+int mp4ff_smhd_init(mp4ff_smhd_t *smhd);
+int mp4ff_dref_table_init(mp4ff_dref_table_t *table);
+int mp4ff_dref_init_all(mp4ff_dref_t *dref);
+int mp4ff_dref_init(mp4ff_dref_t *dref);
+int mp4ff_dinf_init_all(mp4ff_dinf_t *dinf);
+int mp4ff_dinf_init(mp4ff_dinf_t *dinf);
+int mp4ff_minf_init(mp4ff_minf_t *minf);
+int mp4ff_minf_init_video(mp4ff_t *file, mp4ff_minf_t *minf, int frame_w, int frame_h, int time_scale, float frame_rate, char *compressor);
+int mp4ff_minf_init_audio(mp4ff_t *file, mp4ff_minf_t *minf, int channels, int sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor);
+int mp4ff_mdhd_init(mp4ff_mdhd_t *mdhd);
+int mp4ff_mdhd_init_video(mp4ff_t *file, mp4ff_mdhd_t *mdhd, int time_scale);
+int mp4ff_mdhd_init_audio(mp4ff_t *file, mp4ff_mdhd_t *mdhd, int time_scale);
+int mp4ff_mdia_init(mp4ff_mdia_t *mdia);
+int mp4ff_mdia_init_video(mp4ff_t *file, mp4ff_mdia_t *mdia, int frame_w, int frame_h, float frame_rate, int time_scale, char *compressor);
+int mp4ff_mdia_init_audio(mp4ff_t *file, mp4ff_mdia_t *mdia, int channels, int sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor);
+int mp4ff_trak_init(mp4ff_trak_t *trak);
+int mp4ff_trak_init_video(mp4ff_t *file, mp4ff_trak_t *trak, int frame_w, int frame_h, float frame_rate, int time_scale, char *compressor);
+int mp4ff_trak_init_audio(mp4ff_t *file, mp4ff_trak_t *trak, int channels, int sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor);
+int mp4ff_udta_init(mp4ff_udta_t *udta);
+int mp4ff_mvhd_init(mp4ff_mvhd_t *mvhd);
+int mp4ff_moov_init(mp4ff_moov_t *moov);
+int mp4ff_mdat_init(mp4ff_mdat_t *mdat);
+int mp4ff_init(mp4ff_t *file);
+int mp4ff_hdlr_init(mp4ff_hdlr_t *hdlr);
+int mp4ff_hdlr_init_video(mp4ff_hdlr_t *hdlr);
+int mp4ff_hdlr_init_audio(mp4ff_hdlr_t *hdlr);
+int mp4ff_hdlr_init_data(mp4ff_hdlr_t *hdlr);
+
+/* utilities for reading data types */
+int mp4ff_read_data(mp4ff_t *file, char *data, int size);
+int mp4ff_write_data(mp4ff_t *file, char *data, int size);
+int mp4ff_read_pascal(mp4ff_t *file, char *data);
+int mp4ff_write_pascal(mp4ff_t *file, char *data);
+float mp4ff_read_fixed32(mp4ff_t *file);
+int mp4ff_write_fixed32(mp4ff_t *file, float number);
+float mp4ff_read_fixed16(mp4ff_t *file);
+int mp4ff_write_fixed16(mp4ff_t *file, float number);
+unsigned __int64 mp4ff_read_int64(mp4ff_t *file);
+int mp4ff_write_int64(mp4ff_t *file, unsigned __int64 number);
+long mp4ff_read_int32(mp4ff_t *file);
+int mp4ff_write_int32(mp4ff_t *file, long number);
+long mp4ff_read_int24(mp4ff_t *file);
+int mp4ff_write_int24(mp4ff_t *file, long number);
+int mp4ff_read_int16(mp4ff_t *file);
+int mp4ff_write_int16(mp4ff_t *file, int number);
+int mp4ff_read_char(mp4ff_t *file);
+int mp4ff_write_char(mp4ff_t *file, char x);
+int mp4ff_read_char32(mp4ff_t *file, char *string);
+int mp4ff_write_char32(mp4ff_t *file, char *string);
+int mp4ff_copy_char32(char *output, char *input);
+long mp4ff_position(mp4ff_t *file);
+int mp4ff_read_mp4_descr_length(mp4ff_t *file);
+int mp4ff_write_mp4_descr_length(mp4ff_t *file, int length, unsigned char compact);
+
+/* Most codecs don't specify the actual number of bits on disk in the stbl. */
+/* Convert the samples to the number of bytes for reading depending on the codec. */
+long mp4ff_samples_to_bytes(mp4ff_trak_t *track, long samples);
+
+
+/* chunks always start on 1 */
+/* samples start on 0 */
+
+/* queries for every atom */
+/* the starting sample in the given chunk */
+long mp4ff_sample_of_chunk(mp4ff_trak_t *trak, long chunk);
+
+/* number of samples in the chunk */
+long mp4ff_chunk_samples(mp4ff_trak_t *trak, long chunk);
+
+/* the byte offset from mdat start of the chunk */
+long mp4ff_chunk_to_offset(mp4ff_trak_t *trak, long chunk);
+
+/* the chunk of any offset from mdat start */
+long mp4ff_offset_to_chunk(long *chunk_offset, mp4ff_trak_t *trak, long offset);
+
+/* the total number of samples in the track depending on the access mode */
+long mp4ff_track_samples(mp4ff_t *file, mp4ff_trak_t *trak);
+
+/* total bytes between the two samples */
+long mp4ff_sample_range_size(mp4ff_trak_t *trak, long chunk_sample, long sample);
+
+/* update the position pointers in all the tracks after a set_position */
+int mp4ff_update_positions(mp4ff_t *file);
+
+/* converting between mdat offsets to samples */
+long mp4ff_sample_to_offset(mp4ff_trak_t *trak, long sample);
+long mp4ff_offset_to_sample(mp4ff_trak_t *trak, long offset);
+
+mp4ff_trak_t* mp4ff_add_trak(mp4ff_moov_t *moov);
+int mp4ff_delete_trak(mp4ff_moov_t *moov, mp4ff_trak_t *trak);
+int mp4ff_get_timescale(float frame_rate);
+
+/* update all the tables after writing a buffer */
+/* set sample_size to 0 if no sample size should be set */
+int mp4ff_update_tables(mp4ff_t *file, 
+							mp4ff_trak_t *trak, 
+							long offset, 
+							long chunk, 
+							long sample, 
+							long samples, 
+							long sample_size,
+							long sample_duration,
+							unsigned char isSyncSample,
+							long renderingOffset);
+unsigned long mp4ff_current_time();
+
+void mp4ff_print_chars(char *desc, char *input, int len);
+
+#endif
--- /dev/null
+++ b/common/mp4ff/hdlr.c
@@ -1,0 +1,98 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_hdlr_init(mp4ff_hdlr_t *hdlr)
+{
+	hdlr->version = 0;
+	hdlr->flags = 0;
+	hdlr->component_type[0] = 'm';
+	hdlr->component_type[1] = 'h';
+	hdlr->component_type[2] = 'l';
+	hdlr->component_type[3] = 'r';
+	hdlr->component_subtype[0] = 'v';
+	hdlr->component_subtype[1] = 'i';
+	hdlr->component_subtype[2] = 'd';
+	hdlr->component_subtype[3] = 'e';
+	hdlr->component_manufacturer = 0;
+	hdlr->component_flags = 0;
+	hdlr->component_flag_mask = 0;
+	strcpy(hdlr->component_name, "Linux Media Handler");
+}
+
+int mp4ff_hdlr_init_video(mp4ff_hdlr_t *hdlr)
+{
+	hdlr->component_subtype[0] = 'v';
+	hdlr->component_subtype[1] = 'i';
+	hdlr->component_subtype[2] = 'd';
+	hdlr->component_subtype[3] = 'e';
+	strcpy(hdlr->component_name, "Linux Video Media Handler");
+}
+
+int mp4ff_hdlr_init_audio(mp4ff_hdlr_t *hdlr)
+{
+	hdlr->component_subtype[0] = 's';
+	hdlr->component_subtype[1] = 'o';
+	hdlr->component_subtype[2] = 'u';
+	hdlr->component_subtype[3] = 'n';
+	strcpy(hdlr->component_name, "Linux Sound Media Handler");
+}
+
+int mp4ff_hdlr_init_data(mp4ff_hdlr_t *hdlr)
+{
+	hdlr->component_type[0] = 'd';
+	hdlr->component_type[1] = 'h';
+	hdlr->component_type[2] = 'l';
+	hdlr->component_type[3] = 'r';
+	hdlr->component_subtype[0] = 'a';
+	hdlr->component_subtype[1] = 'l';
+	hdlr->component_subtype[2] = 'i';
+	hdlr->component_subtype[3] = 's';
+	strcpy(hdlr->component_name, "Linux Alias Data Handler");
+}
+
+int mp4ff_hdlr_delete(mp4ff_hdlr_t *hdlr)
+{
+}
+
+int mp4ff_hdlr_dump(mp4ff_hdlr_t *hdlr)
+{
+	printf("   handler reference (hdlr)\n");
+	printf("    version %d\n", hdlr->version);
+	printf("    flags %d\n", hdlr->flags);
+	printf("    component_type %c%c%c%c\n", hdlr->component_type[0], hdlr->component_type[1], hdlr->component_type[2], hdlr->component_type[3]);
+	printf("    component_subtype %c%c%c%c\n", hdlr->component_subtype[0], hdlr->component_subtype[1], hdlr->component_subtype[2], hdlr->component_subtype[3]);
+	printf("    component_name %s\n", hdlr->component_name);
+}
+
+int mp4ff_read_hdlr(mp4ff_t *file, mp4ff_hdlr_t *hdlr)
+{
+	hdlr->version = mp4ff_read_char(file);
+	hdlr->flags = mp4ff_read_int24(file);
+	mp4ff_read_char32(file, hdlr->component_type);
+	mp4ff_read_char32(file, hdlr->component_subtype);
+	hdlr->component_manufacturer = mp4ff_read_int32(file);
+	hdlr->component_flags = mp4ff_read_int32(file);
+	hdlr->component_flag_mask = mp4ff_read_int32(file);
+    // TBD read null terminated string
+}
+
+int mp4ff_write_hdlr(mp4ff_t *file, mp4ff_hdlr_t *hdlr)
+{
+	int i;
+
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "hdlr");
+
+	mp4ff_write_char(file, hdlr->version);
+	mp4ff_write_int24(file, hdlr->flags);
+
+	mp4ff_write_int32(file, 0x00000000);
+	mp4ff_write_char32(file, hdlr->component_subtype);
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	mp4ff_write_data(file, hdlr->component_name, strlen(hdlr->component_name) + 1);
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/iods.c
@@ -1,0 +1,102 @@
+/*
+ * The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ * 
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ * 
+ * The Original Code is MPEG4IP.
+ * 
+ * The Initial Developer of the Original Code is Cisco Systems Inc.
+ * Portions created by Cisco Systems Inc. are
+ * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
+ * 
+ * Contributor(s): 
+ *		Dave Mackie		dmackie@cisco.com
+ */
+
+#include "mp4ff.h"
+
+
+int mp4ff_iods_init(mp4ff_iods_t *iods)
+{
+	iods->version = 0;
+	iods->flags = 0;
+	iods->audioProfileId = 0xFF;
+	iods->videoProfileId = 0xFF;
+	return 0;
+}
+
+int mp4ff_iods_set_audio_profile(mp4ff_iods_t* iods, int id)
+{
+	iods->audioProfileId = id;
+}
+
+int mp4ff_iods_set_video_profile(mp4ff_iods_t* iods, int id)
+{
+	iods->videoProfileId = id;
+}
+
+int mp4ff_iods_delete(mp4ff_iods_t *iods)
+{
+	return 0;
+}
+
+int mp4ff_iods_dump(mp4ff_iods_t *iods)
+{
+	printf(" initial object descriptor\n");
+	printf("  version %d\n", iods->version);
+	printf("  flags %ld\n", iods->flags);
+	printf("  audioProfileId %u\n", iods->audioProfileId);
+	printf("  videoProfileId %u\n", iods->videoProfileId);
+}
+
+int mp4ff_read_iods(mp4ff_t *file, mp4ff_iods_t *iods)
+{
+	iods->version = mp4ff_read_char(file);
+	iods->flags = mp4ff_read_int24(file);
+	mp4ff_read_char(file); /* skip tag */
+	mp4ff_read_mp4_descr_length(file);	/* skip length */
+	/* skip ODID, ODProfile, sceneProfile */
+	mp4ff_set_position(file, mp4ff_position(file) + 4);
+	iods->audioProfileId = mp4ff_read_char(file);
+	iods->videoProfileId = mp4ff_read_char(file);
+	/* will skip the remainder of the atom */
+}
+
+int mp4ff_write_iods(mp4ff_t *file, mp4ff_iods_t *iods)
+{
+	mp4ff_atom_t atom;
+	int i;
+
+	mp4ff_atom_write_header(file, &atom, "iods");
+
+	mp4ff_write_char(file, iods->version);
+	mp4ff_write_int24(file, iods->flags);
+
+	mp4ff_write_char(file, 0x10);	/* MP4_IOD_Tag */
+	mp4ff_write_char(file, 7 + (file->moov.total_tracks * (1+1+4)));	/* length */
+	mp4ff_write_int16(file, 0x004F); /* ObjectDescriptorID = 1 */
+	mp4ff_write_char(file, 0xFF);	/* ODProfileLevel */
+	mp4ff_write_char(file, 0xFF);	/* sceneProfileLevel */
+	mp4ff_write_char(file, iods->audioProfileId);	/* audioProfileLevel */
+	mp4ff_write_char(file, iods->videoProfileId);	/* videoProfileLevel */
+	mp4ff_write_char(file, 0xFF);	/* graphicsProfileLevel */
+
+	for (i = 0; i < file->moov.total_tracks; i++) {
+		mp4ff_write_char(file, 0x0E);	/* ES_ID_IncTag */
+		mp4ff_write_char(file, 0x04);	/* length */
+		mp4ff_write_int32(file, file->moov.trak[i]->tkhd.track_id);	
+	}
+
+	/* no OCI_Descriptors */
+	/* no IPMP_DescriptorPointers */
+	/* no Extenstion_Descriptors */
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
--- /dev/null
+++ b/common/mp4ff/matrix.c
@@ -1,0 +1,42 @@
+#include "mp4ff.h"
+
+
+
+
+int mp4ff_matrix_init(mp4ff_matrix_t *matrix)
+{
+	int i;
+	for(i = 0; i < 9; i++) matrix->values[i] = 0;
+	matrix->values[0] = matrix->values[4] = 1;
+	matrix->values[8] = 16384;
+}
+
+int mp4ff_matrix_delete(mp4ff_matrix_t *matrix)
+{
+}
+
+int mp4ff_read_matrix(mp4ff_t *file, mp4ff_matrix_t *matrix)
+{
+	int i = 0;
+	for(i = 0; i < 9; i++)
+	{
+		matrix->values[i] = mp4ff_read_fixed32(file);
+	}
+}
+
+int mp4ff_matrix_dump(mp4ff_matrix_t *matrix)
+{
+	int i;
+	printf("   matrix");
+	for(i = 0; i < 9; i++) printf(" %f", matrix->values[i]);
+	printf("\n");
+}
+
+int mp4ff_write_matrix(mp4ff_t *file, mp4ff_matrix_t *matrix)
+{
+	int i;
+	for(i = 0; i < 9; i++)
+	{
+		mp4ff_write_fixed32(file, matrix->values[i]);
+	}
+}
--- /dev/null
+++ b/common/mp4ff/mdat.c
@@ -1,0 +1,43 @@
+#include "mp4ff.h"
+
+int mp4ff_mdat_init(mp4ff_mdat_t *mdat)
+{
+	mdat->size = 8;
+	mdat->start = 0;
+}
+
+int mp4ff_mdat_delete(mp4ff_mdat_t *mdat)
+{
+}
+
+int mp4ff_read_mdat(mp4ff_t *file, mp4ff_mdat_t *mdat, mp4ff_atom_t *parent_atom)
+{
+	mdat->size = parent_atom->size;
+	mdat->start = parent_atom->start;
+	mp4ff_atom_skip(file, parent_atom);
+}
+
+int mp4ff_write_mdat(mp4ff_t *file, mp4ff_mdat_t *mdat)
+{
+	long position, size = 0, new_size = 0;
+	int i, j;
+	
+	for(i = 0; i < file->total_atracks; i++)
+	{
+		new_size = mp4ff_track_end(file->atracks[i].track);
+		if(new_size > size) 
+			size = new_size;
+	}
+
+	for(i = 0; i < file->total_vtracks; i++)
+	{
+		new_size = mp4ff_track_end(file->vtracks[i].track);
+		if(new_size > size) 
+			size = new_size;
+	}
+	
+	mdat->size = size;
+	mp4ff_set_position(file, mdat->start);
+	mp4ff_write_int32(file, mdat->size);
+	mp4ff_set_position(file, mdat->start + mdat->size);
+}
--- /dev/null
+++ b/common/mp4ff/mdhd.c
@@ -1,0 +1,76 @@
+#include "mp4ff.h"
+
+int mp4ff_mdhd_init(mp4ff_mdhd_t *mdhd)
+{
+	mdhd->version = 0;
+	mdhd->flags = 0;
+	mdhd->creation_time = mp4ff_current_time();
+	mdhd->modification_time = mp4ff_current_time();
+	mdhd->time_scale = 0;
+	mdhd->duration = 0;
+	mdhd->language = 0;
+	mdhd->quality = 0;
+}
+
+int mp4ff_mdhd_init_video(mp4ff_t *file, 
+							mp4ff_mdhd_t *mdhd,
+							int time_scale)
+{
+	mdhd->time_scale = time_scale;
+	mdhd->duration = 0;      /* set this when closing */
+}
+
+int mp4ff_mdhd_init_audio(mp4ff_t *file, 
+							mp4ff_mdhd_t *mdhd, 
+							int time_scale)
+{
+	mdhd->time_scale = time_scale;
+	mdhd->duration = 0;      /* set this when closing */
+}
+
+mp4ff_mdhd_delete(mp4ff_mdhd_t *mdhd)
+{
+}
+
+int mp4ff_read_mdhd(mp4ff_t *file, mp4ff_mdhd_t *mdhd)
+{
+	mdhd->version = mp4ff_read_char(file);
+	mdhd->flags = mp4ff_read_int24(file);
+	mdhd->creation_time = mp4ff_read_int32(file);
+	mdhd->modification_time = mp4ff_read_int32(file);
+	mdhd->time_scale = mp4ff_read_int32(file);
+	mdhd->duration = mp4ff_read_int32(file);
+	mdhd->language = mp4ff_read_int16(file);
+	mdhd->quality = mp4ff_read_int16(file);
+}
+
+int mp4ff_mdhd_dump(mp4ff_mdhd_t *mdhd)
+{
+	printf("   media header\n");
+	printf("    version %d\n", mdhd->version);
+	printf("    flags %d\n", mdhd->flags);
+	printf("    creation_time %u\n", mdhd->creation_time);
+	printf("    modification_time %u\n", mdhd->modification_time);
+	printf("    time_scale %d\n", mdhd->time_scale);
+	printf("    duration %d\n", mdhd->duration);
+	printf("    language %d\n", mdhd->language);
+	printf("    quality %d\n", mdhd->quality);
+}
+
+int mp4ff_write_mdhd(mp4ff_t *file, mp4ff_mdhd_t *mdhd)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "mdhd");
+
+	mp4ff_write_char(file, mdhd->version);
+	mp4ff_write_int24(file, mdhd->flags);
+	mp4ff_write_int32(file, mdhd->creation_time);
+	mp4ff_write_int32(file, mdhd->modification_time);
+	mp4ff_write_int32(file, mdhd->time_scale);
+	mp4ff_write_int32(file, mdhd->duration);
+	mp4ff_write_int16(file, mdhd->language);
+	mp4ff_write_int16(file, 0x0000);	
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
--- /dev/null
+++ b/common/mp4ff/mdia.c
@@ -1,0 +1,93 @@
+#include "mp4ff.h"
+
+
+int mp4ff_mdia_init(mp4ff_mdia_t *mdia)
+{
+	mp4ff_mdhd_init(&(mdia->mdhd));
+	mp4ff_hdlr_init(&(mdia->hdlr));
+	mp4ff_minf_init(&(mdia->minf));
+}
+
+int mp4ff_mdia_init_video(mp4ff_t *file, 
+								mp4ff_mdia_t *mdia,
+								int frame_w,
+								int frame_h, 
+								float frame_rate,
+								int time_scale,
+								char *compressor)
+{
+	mp4ff_mdhd_init_video(file, &(mdia->mdhd), time_scale);
+	mp4ff_minf_init_video(file, &(mdia->minf), frame_w, frame_h, mdia->mdhd.time_scale, frame_rate, compressor);
+	mp4ff_hdlr_init_video(&(mdia->hdlr));
+}
+
+int mp4ff_mdia_init_audio(mp4ff_t *file, 
+							mp4ff_mdia_t *mdia, 
+							int channels,
+							int sample_rate, 
+							int bits, 
+							int sample_size,
+							int time_scale,
+							int sample_duration,
+							char *compressor)
+{
+	mp4ff_mdhd_init_audio(file, &(mdia->mdhd), time_scale);
+	mp4ff_minf_init_audio(file, &(mdia->minf), channels, sample_rate, bits, sample_size, time_scale, sample_duration, compressor);
+	mp4ff_hdlr_init_audio(&(mdia->hdlr));
+}
+
+int mp4ff_mdia_delete(mp4ff_mdia_t *mdia)
+{
+	mp4ff_mdhd_delete(&(mdia->mdhd));
+	mp4ff_hdlr_delete(&(mdia->hdlr));
+	mp4ff_minf_delete(&(mdia->minf));
+}
+
+int mp4ff_mdia_dump(mp4ff_mdia_t *mdia)
+{
+	printf("  media\n");
+	mp4ff_mdhd_dump(&(mdia->mdhd));
+	mp4ff_hdlr_dump(&(mdia->hdlr));
+	mp4ff_minf_dump(&(mdia->minf));
+}
+
+int mp4ff_read_mdia(mp4ff_t *file, mp4ff_mdia_t *mdia, mp4ff_atom_t *trak_atom)
+{
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+/* mandatory */
+		if(mp4ff_atom_is(&leaf_atom, "mdhd"))
+			{ mp4ff_read_mdhd(file, &(mdia->mdhd)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "hdlr"))
+			{
+				mp4ff_read_hdlr(file, &(mdia->hdlr)); 
+/* Main Actor doesn't write component name */
+				mp4ff_atom_skip(file, &leaf_atom);
+/*printf("mp4ff_read_mdia %ld\n", mp4ff_position(file)); */
+			}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "minf"))
+			{ mp4ff_read_minf(file, &(mdia->minf), &leaf_atom); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < trak_atom->end);
+
+	return 0;
+}
+
+int mp4ff_write_mdia(mp4ff_t *file, mp4ff_mdia_t *mdia)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "mdia");
+
+	mp4ff_write_mdhd(file, &(mdia->mdhd));
+	mp4ff_write_hdlr(file, &(mdia->hdlr));
+	mp4ff_write_minf(file, &(mdia->minf));
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/minf.c
@@ -1,0 +1,124 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_minf_init(mp4ff_minf_t *minf)
+{
+	minf->is_video = minf->is_audio = 0;
+	mp4ff_vmhd_init(&(minf->vmhd));
+	mp4ff_smhd_init(&(minf->smhd));
+	mp4ff_hdlr_init(&(minf->hdlr));
+	mp4ff_dinf_init(&(minf->dinf));
+	mp4ff_stbl_init(&(minf->stbl));
+}
+
+int mp4ff_minf_init_video(mp4ff_t *file, 
+								mp4ff_minf_t *minf, 
+								int frame_w,
+								int frame_h, 
+								int time_scale, 
+								float frame_rate,
+								char *compressor)
+{
+	minf->is_video = 1;
+	mp4ff_vmhd_init_video(file, &(minf->vmhd), frame_w, frame_h, frame_rate);
+	mp4ff_stbl_init_video(file, &(minf->stbl), frame_w, frame_h, time_scale, frame_rate, compressor);
+	mp4ff_hdlr_init_data(&(minf->hdlr));
+	mp4ff_dinf_init_all(&(minf->dinf));
+}
+
+int mp4ff_minf_init_audio(mp4ff_t *file, 
+							mp4ff_minf_t *minf, 
+							int channels, 
+							int sample_rate, 
+							int bits,
+							int sample_size,
+							int time_scale,
+							int sample_duration,
+							char *compressor)
+{
+	minf->is_audio = 1;
+/* smhd doesn't store anything worth initializing */
+	mp4ff_stbl_init_audio(file, &(minf->stbl), channels, sample_rate, bits, sample_size, time_scale, sample_duration, compressor);
+	mp4ff_hdlr_init_data(&(minf->hdlr));
+	mp4ff_dinf_init_all(&(minf->dinf));
+}
+
+int mp4ff_minf_delete(mp4ff_minf_t *minf)
+{
+	mp4ff_vmhd_delete(&(minf->vmhd));
+	mp4ff_smhd_delete(&(minf->smhd));
+	mp4ff_dinf_delete(&(minf->dinf));
+	mp4ff_stbl_delete(&(minf->stbl));
+	mp4ff_hdlr_delete(&(minf->hdlr));
+}
+
+int mp4ff_minf_dump(mp4ff_minf_t *minf)
+{
+	printf("   media info\n");
+	printf("    is_audio %d\n", minf->is_audio);
+	printf("    is_video %d\n", minf->is_video);
+	if(minf->is_audio) mp4ff_smhd_dump(&(minf->smhd));
+	if(minf->is_video) mp4ff_vmhd_dump(&(minf->vmhd));
+	mp4ff_hdlr_dump(&(minf->hdlr));
+	mp4ff_dinf_dump(&(minf->dinf));
+	mp4ff_stbl_dump(minf, &(minf->stbl));
+}
+
+int mp4ff_read_minf(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_atom_t *parent_atom)
+{
+	mp4ff_atom_t leaf_atom;
+	long pos = mp4ff_position(file);
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+/* mandatory */
+		if(mp4ff_atom_is(&leaf_atom, "vmhd"))
+			{ minf->is_video = 1; mp4ff_read_vmhd(file, &(minf->vmhd)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "smhd"))
+			{ minf->is_audio = 1; mp4ff_read_smhd(file, &(minf->smhd)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "hdlr"))
+			{ 
+				mp4ff_read_hdlr(file, &(minf->hdlr)); 
+/* Main Actor doesn't write component name */
+				mp4ff_atom_skip(file, &leaf_atom);
+			}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "dinf"))
+			{ mp4ff_read_dinf(file, &(minf->dinf), &leaf_atom); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < parent_atom->end);
+
+	mp4ff_set_position(file, pos);
+
+	do {
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+		if(mp4ff_atom_is(&leaf_atom, "stbl")) {
+			mp4ff_read_stbl(file, minf, &(minf->stbl), &leaf_atom);
+		} else {
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+	} while(mp4ff_position(file) < parent_atom->end);
+
+	return 0;
+}
+
+int mp4ff_write_minf(mp4ff_t *file, mp4ff_minf_t *minf)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "minf");
+
+	if(minf->is_video) mp4ff_write_vmhd(file, &(minf->vmhd));
+	if(minf->is_audio) mp4ff_write_smhd(file, &(minf->smhd));
+	mp4ff_write_hdlr(file, &(minf->hdlr));
+	mp4ff_write_dinf(file, &(minf->dinf));
+	mp4ff_write_stbl(file, minf, &(minf->stbl));
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/moov.c
@@ -1,0 +1,130 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_moov_init(mp4ff_moov_t *moov)
+{
+	int i;
+
+	moov->total_tracks = 0;
+	for(i = 0 ; i < MAXTRACKS; i++) moov->trak[i] = 0;
+	mp4ff_mvhd_init(&(moov->mvhd));
+	mp4ff_iods_init(&(moov->iods));
+	mp4ff_udta_init(&(moov->udta));
+	return 0;
+}
+
+int mp4ff_moov_delete(mp4ff_moov_t *moov)
+{
+	int i;
+	while(moov->total_tracks) {
+		mp4ff_delete_trak(moov, moov->trak[moov->total_tracks - 1]);
+	}
+	mp4ff_mvhd_delete(&(moov->mvhd));
+	mp4ff_iods_delete(&(moov->iods));
+	mp4ff_udta_delete(&(moov->udta));
+	return 0;
+}
+
+int mp4ff_moov_dump(mp4ff_moov_t *moov)
+{
+	int i;
+	printf("movie\n");
+	mp4ff_mvhd_dump(&(moov->mvhd));
+	mp4ff_iods_dump(&(moov->iods));
+	mp4ff_udta_dump(&(moov->udta));
+	for(i = 0; i < moov->total_tracks; i++)
+		mp4ff_trak_dump(moov->trak[i]);
+}
+
+
+int mp4ff_read_moov(mp4ff_t *file, mp4ff_moov_t *moov, mp4ff_atom_t *parent_atom)
+{
+/* mandatory mvhd */
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+		
+		if(mp4ff_atom_is(&leaf_atom, "mvhd"))
+		{
+			mp4ff_read_mvhd(file, &(moov->mvhd));
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "iods"))
+		{
+			mp4ff_read_iods(file, &(moov->iods));
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "trak"))
+		{
+			mp4ff_trak_t *trak = mp4ff_add_trak(moov);
+			mp4ff_read_trak(file, trak, &leaf_atom);
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "udta"))
+		{
+			mp4ff_read_udta(file, &(moov->udta), &leaf_atom);
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+		else
+		{
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+	}while(mp4ff_position(file) < parent_atom->end);
+	
+	return 0;
+}
+
+int mp4ff_write_moov(mp4ff_t *file, mp4ff_moov_t *moov)
+{
+	mp4ff_atom_t atom;
+	int i;
+	long longest_duration = 0;
+	long duration, timescale;
+	mp4ff_atom_write_header(file, &atom, "moov");
+
+/* get the duration from the longest track in the mvhd's timescale */
+	for(i = 0; i < moov->total_tracks; i++)
+	{
+		mp4ff_trak_fix_counts(file, moov->trak[i]);
+		mp4ff_trak_duration(moov->trak[i], &duration, &timescale);
+
+		duration = (long)((float)duration / timescale * moov->mvhd.time_scale);
+
+		if(duration > longest_duration)
+		{
+			longest_duration = duration;
+		}
+	}
+	moov->mvhd.duration = longest_duration;
+	moov->mvhd.selection_duration = longest_duration;
+
+	mp4ff_write_mvhd(file, &(moov->mvhd));
+	mp4ff_write_iods(file, &(moov->iods));
+	mp4ff_write_udta(file, &(moov->udta));
+
+	for(i = 0; i < moov->total_tracks; i++)
+	{
+		mp4ff_write_trak(file, moov->trak[i], moov->mvhd.time_scale);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_durations(mp4ff_moov_t *moov)
+{
+	
+}
+
+int mp4ff_shift_offsets(mp4ff_moov_t *moov, long offset)
+{
+	int i;
+	for(i = 0; i < moov->total_tracks; i++)
+	{
+		mp4ff_trak_shift_offsets(moov->trak[i], offset);
+	}
+	return 0;
+}
--- /dev/null
+++ b/common/mp4ff/mp4ff.c
@@ -1,0 +1,1256 @@
+#include "mp4ff.h"
+
+#if 0
+int mp4ff_make_streamable(mp4_callback_t *in_path, mp4_callback_t *out_path)
+{
+	mp4ff_t file, *old_file, new_file;
+	int moov_exists = 0, mdat_exists = 0, result, atoms = 1;
+	long mdat_start, mdat_size;
+	mp4ff_atom_t leaf_atom;
+	long moov_length;
+
+	mp4ff_init(&file);
+
+/* find the moov atom in the old file */
+	
+	if(!(file.stream = FOPEN(in_path, _T("rb"))))
+	{
+		//perror("mp4ff_make_streamable");
+		return 1;
+	}
+
+	file.total_length = file.stream->get_length();
+
+/* get the locations of moov and mdat atoms */
+	do
+	{
+/*printf("%x\n", mp4ff_position(&file)); */
+		result = mp4ff_atom_read_header(&file, &leaf_atom);
+
+		if(!result)
+		{
+			if(mp4ff_atom_is(&leaf_atom, "moov"))
+			{
+				moov_exists = atoms;
+				moov_length = leaf_atom.size;
+			}
+			else
+			if(mp4ff_atom_is(&leaf_atom, "mdat"))
+			{
+				mdat_start = mp4ff_position(&file) - HEADER_LENGTH;
+				mdat_size = leaf_atom.size;
+				mdat_exists = atoms;
+			}
+
+			mp4ff_atom_skip(&file, &leaf_atom);
+
+			atoms++;
+		}
+	}while(!result && mp4ff_position(&file) < file.total_length);
+
+	if(!moov_exists)
+	{
+		printf("mp4ff_make_streamable: no moov atom\n");
+		return 1;
+	}
+
+	if(!mdat_exists)
+	{
+		printf("mp4ff_make_streamable: no mdat atom\n");
+		return 1;
+	}
+
+/* copy the old file to the new file */
+	if(moov_exists && mdat_exists)
+	{
+/* moov wasn't the first atom */
+		if(moov_exists > 1)
+		{
+			char *buffer;
+			long buf_size = 1000000;
+
+			result = 0;
+
+/* read the header proper */
+			if(!(old_file = mp4ff_open(in_path, 1, 0, 0)))
+			{
+				return 1;
+			}
+
+			mp4ff_shift_offsets(&(old_file->moov), moov_length);
+
+/* open the output file */
+			if(!(new_file.stream = FOPEN(out_path, _T("wb"))))
+			{
+				//perror("mp4ff_make_streamable");
+				result =  1;
+			}
+			else
+			{
+/* set up some flags */
+				new_file.wr = 1;
+				new_file.rd = 0;
+				mp4ff_write_moov(&new_file, &(old_file->moov));
+
+				mp4ff_set_position(old_file, mdat_start);
+
+				if(!(buffer = calloc(1, buf_size)))
+				{
+					result = 1;
+					printf("mp4ff_make_streamable: out of memory\n");
+				}
+				else
+				{
+					while(mp4ff_position(old_file) < mdat_start + mdat_size && !result)
+					{
+						if(mp4ff_position(old_file) + buf_size > mdat_start + mdat_size)
+							buf_size = mdat_start + mdat_size - mp4ff_position(old_file);
+
+						if(!mp4ff_read_data(old_file, buffer, buf_size)) result = 1;
+						if(!result)
+						{
+							if(!mp4ff_write_data(&new_file, buffer, buf_size)) result = 1;
+						}
+					}
+					free(buffer);
+				}
+				fclose(new_file.stream);
+			}
+			mp4ff_close(old_file);
+		}
+		else
+		{
+			printf("mp4ff_make_streamable: header already at 0 offset\n");
+			return 0;
+		}
+	}
+	
+	return 0;
+}
+#endif
+
+int mp4ff_set_time_scale(mp4ff_t *file, int time_scale)
+{
+	file->moov.mvhd.time_scale = time_scale;
+}
+
+int mp4ff_set_copyright(mp4ff_t *file, char *string)
+{
+	mp4ff_set_udta_string(&(file->moov.udta.copyright), &(file->moov.udta.copyright_len), string);
+}
+
+int mp4ff_set_name(mp4ff_t *file, char *string)
+{
+	mp4ff_set_udta_string(&(file->moov.udta.name), &(file->moov.udta.name_len), string);
+}
+
+int mp4ff_set_info(mp4ff_t *file, char *string)
+{
+	mp4ff_set_udta_string(&(file->moov.udta.info), &(file->moov.udta.info_len), string);
+}
+
+int mp4ff_get_time_scale(mp4ff_t *file)
+{
+	return file->moov.mvhd.time_scale;
+}
+
+char* mp4ff_get_copyright(mp4ff_t *file)
+{
+	return file->moov.udta.copyright;
+}
+
+char* mp4ff_get_name(mp4ff_t *file)
+{
+	return file->moov.udta.name;
+}
+
+char* mp4ff_get_info(mp4ff_t *file)
+{
+	return file->moov.udta.info;
+}
+
+int mp4ff_get_iod_audio_profile_level(mp4ff_t *file)
+{
+	return file->moov.iods.audioProfileId;
+}
+
+int mp4ff_set_iod_audio_profile_level(mp4ff_t *file, int id)
+{
+	mp4ff_iods_set_audio_profile(&file->moov.iods, id);
+}
+
+int mp4ff_get_iod_video_profile_level(mp4ff_t *file)
+{
+	return file->moov.iods.videoProfileId;
+}
+
+int mp4ff_set_iod_video_profile_level(mp4ff_t *file, int id)
+{
+	mp4ff_iods_set_video_profile(&file->moov.iods, id);
+}
+
+int mp4ff_video_tracks(mp4ff_t *file)
+{
+	int i, result = 0;
+	for(i = 0; i < file->moov.total_tracks; i++)
+	{
+		if(file->moov.trak[i]->mdia.minf.is_video) result++;
+	}
+	return result;
+}
+
+int mp4ff_audio_tracks(mp4ff_t *file)
+{
+	int i, result = 0;
+	mp4ff_minf_t *minf;
+	for(i = 0; i < file->moov.total_tracks; i++)
+	{
+		minf = &(file->moov.trak[i]->mdia.minf);
+		if(minf->is_audio)
+			result++;
+	}
+	return result;
+}
+
+int mp4ff_set_audio(mp4ff_t *file, 
+						int channels,
+						long sample_rate,
+						int bits,
+						int sample_size,
+						int time_scale,
+						int sample_duration,	
+						char *compressor)
+{
+	int i, j;
+	mp4ff_trak_t *trak;
+
+	/* delete any existing tracks */
+	for(i = 0; i < file->total_atracks; i++) {
+		mp4ff_delete_audio_map(&(file->atracks[i]));
+		mp4ff_delete_trak(&(file->moov), file->atracks[i].track);
+	}
+	free(file->atracks);
+	file->atracks = NULL;	
+	file->total_atracks = 0;
+
+	if(channels) {
+#if 0
+		/* Fake the bits parameter for some formats. */
+		if(mp4ff_match_32(compressor, mp4ff_ULAW) ||
+			mp4ff_match_32(compressor, mp4ff_IMA4)) bits = 16;
+#endif
+
+		file->atracks = (mp4ff_audio_map_t*)
+			calloc(1, sizeof(mp4ff_audio_map_t));
+		trak = mp4ff_add_track(&(file->moov));
+		mp4ff_trak_init_audio(file, trak, channels, sample_rate, bits, 
+			sample_size, time_scale, sample_duration, compressor);
+		mp4ff_init_audio_map(&(file->atracks[0]), trak);
+		file->atracks[file->total_atracks].track = trak;
+		file->atracks[file->total_atracks].channels = channels;
+		file->atracks[file->total_atracks].current_position = 0;
+		file->atracks[file->total_atracks].current_chunk = 1;
+		file->total_atracks++;
+	}
+	return 1;   /* Return the number of tracks created */
+}
+
+int mp4ff_set_video(mp4ff_t *file, 
+						int tracks, 
+						int frame_w, 
+						int frame_h,
+						float frame_rate,
+						int time_scale,
+						char *compressor)
+{
+	int i, j;
+	mp4ff_trak_t *trak;
+
+	/* delete any existing tracks */
+	for(i = 0; i < file->total_vtracks; i++) {
+		mp4ff_delete_video_map(&(file->vtracks[i]));
+		mp4ff_delete_trak(&(file->moov), file->vtracks[i].track);
+	}
+	free(file->vtracks);
+	file->vtracks = NULL;	
+	file->total_vtracks = 0;
+
+	if (tracks > 0) {
+		file->total_vtracks = tracks;
+		file->vtracks = (mp4ff_video_map_t*)calloc(1, sizeof(mp4ff_video_map_t) * file->total_vtracks);
+		for(i = 0; i < tracks; i++)
+		{
+			trak = mp4ff_add_track(&(file->moov));
+			mp4ff_trak_init_video(file, trak, frame_w, frame_h, frame_rate,
+				time_scale, compressor);
+			mp4ff_init_video_map(&(file->vtracks[i]), trak);
+		}
+	}
+	return 0;
+}
+
+int mp4ff_set_framerate(mp4ff_t *file, float framerate)
+{
+	int i;
+	int new_time_scale, new_sample_duration;
+	new_time_scale = mp4ff_get_timescale(framerate);
+	new_sample_duration = (int)((float)new_time_scale / framerate + 0.5);
+
+	for(i = 0; i < file->total_vtracks; i++)
+	{
+		file->vtracks[i].track->mdia.mdhd.time_scale = new_time_scale;
+		file->vtracks[i].track->mdia.minf.stbl.stts.table[0].sample_duration = new_sample_duration;
+	}
+}
+
+mp4ff_trak_t* mp4ff_add_track(mp4ff_moov_t *moov)
+{
+	mp4ff_trak_t *trak;
+	trak = moov->trak[moov->total_tracks] = calloc(1, sizeof(mp4ff_trak_t));
+	mp4ff_trak_init(trak);
+	trak->tkhd.track_id = moov->mvhd.next_track_id;
+	moov->mvhd.next_track_id++;
+	moov->total_tracks++;
+	return trak;
+}
+
+/* ============================= Initialization functions */
+
+int mp4ff_init(mp4ff_t *file)
+{
+	memset(file, 0, sizeof(mp4ff_t));
+	mp4ff_mdat_init(&(file->mdat));
+	mp4ff_moov_init(&(file->moov));
+	return 0;
+}
+
+int mp4ff_delete(mp4ff_t *file)
+{
+	int i;
+	if(file->total_atracks) 
+	{
+		for(i = 0; i < file->total_atracks; i++)
+			mp4ff_delete_audio_map(&(file->atracks[i]));
+		free(file->atracks);
+	}
+	if(file->total_vtracks)
+	{
+		for(i = 0; i < file->total_vtracks; i++)
+			mp4ff_delete_video_map(&(file->vtracks[i]));
+		free(file->vtracks);
+	}
+	file->total_atracks = 0;
+	file->total_vtracks = 0;
+	mp4ff_moov_delete(&(file->moov));
+	mp4ff_mdat_delete(&(file->mdat));
+	return 0;
+}
+
+/* =============================== Optimization functions */
+
+int mp4ff_get_timescale(float frame_rate)
+{
+	int timescale = 600;
+/* Encode the 29.97, 23.976, 59.94 framerates as per DV freaks */
+	if(frame_rate - (int)frame_rate != 0) timescale = (int)(frame_rate * 1001 + 0.5);
+	else
+	if((600 / frame_rate) - (int)(600 / frame_rate) != 0) timescale = (int)(frame_rate * 100 + 0.5);
+	return timescale;
+}
+
+int mp4ff_seek_end(mp4ff_t *file)
+{
+	mp4ff_set_position(file, file->mdat.size + file->mdat.start);
+/*printf("mp4ff_seek_end %ld\n", file->mdat.size + file->mdat.start); */
+	mp4ff_update_positions(file);
+	return 0;
+}
+
+int mp4ff_seek_start(mp4ff_t *file)
+{
+	mp4ff_set_position(file, file->mdat.start + HEADER_LENGTH);
+	mp4ff_update_positions(file);
+	return 0;
+}
+
+long mp4ff_audio_length(mp4ff_t *file, int track)
+{
+	if(file->total_atracks > 0) 
+		return mp4ff_track_samples(file, file->atracks[track].track);
+
+	return 0;
+}
+
+long mp4ff_video_length(mp4ff_t *file, int track)
+{
+/*printf("mp4ff_video_length %d %d\n", mp4ff_track_samples(file, file->vtracks[track].track), track); */
+	if(file->total_vtracks > 0)
+		return mp4ff_track_samples(file, file->vtracks[track].track);
+	return 0;
+}
+
+long mp4ff_audio_position(mp4ff_t *file, int track)
+{
+	return file->atracks[track].current_position;
+}
+
+long mp4ff_video_position(mp4ff_t *file, int track)
+{
+	return file->vtracks[track].current_position;
+}
+
+int mp4ff_update_positions(mp4ff_t *file)
+{
+/* Used for routines that change the positions of all tracks, like */
+/* seek_end and seek_start but not for routines that reposition one track, like */
+/* set_audio_position. */
+
+	long mdat_offset = mp4ff_position(file) - file->mdat.start;
+	long sample, chunk, chunk_offset;
+	int i;
+
+	if(file->total_atracks)
+	{
+		sample = mp4ff_offset_to_sample(file->atracks[0].track, mdat_offset);
+		chunk = mp4ff_offset_to_chunk(&chunk_offset, file->atracks[0].track, mdat_offset);
+		for(i = 0; i < file->total_atracks; i++)
+		{
+			file->atracks[i].current_position = sample;
+			file->atracks[i].current_chunk = chunk;
+		}
+	}
+
+	if(file->total_vtracks)
+	{
+		sample = mp4ff_offset_to_sample(file->vtracks[0].track, mdat_offset);
+		chunk = mp4ff_offset_to_chunk(&chunk_offset, file->vtracks[0].track, mdat_offset);
+		for(i = 0; i < file->total_vtracks; i++)
+		{
+			file->vtracks[i].current_position = sample;
+			file->vtracks[i].current_chunk = chunk;
+		}
+	}
+	return 0;
+}
+
+int mp4ff_set_audio_position(mp4ff_t *file, long sample, int track)
+{
+	long offset, chunk_sample, chunk;
+	mp4ff_trak_t *trak;
+
+	if(file->total_atracks)
+	{
+		trak = file->atracks[track].track;
+		file->atracks[track].current_position = sample;
+		mp4ff_chunk_of_sample(&chunk_sample, &chunk, trak, sample);
+		file->atracks[track].current_chunk = chunk;
+		offset = mp4ff_sample_to_offset(trak, sample);
+		mp4ff_set_position(file, offset);
+		/*mp4ff_update_positions(file); */
+	}
+
+	return 0;
+}
+
+int mp4ff_set_video_position(mp4ff_t *file, long frame, int track)
+{
+	long offset, chunk_sample, chunk;
+	mp4ff_trak_t *trak;
+
+	if(file->total_vtracks)
+	{
+		trak = file->vtracks[track].track;
+		file->vtracks[track].current_position = frame;
+		mp4ff_chunk_of_sample(&chunk_sample, &chunk, trak, frame);
+		file->vtracks[track].current_chunk = chunk;
+		offset = mp4ff_sample_to_offset(trak, frame);
+		mp4ff_set_position(file, offset);
+		/*mp4ff_update_positions(file); */
+	}
+	return 0;
+}
+
+int mp4ff_has_audio(mp4ff_t *file)
+{
+	if(mp4ff_audio_tracks(file)) return 1;
+	return 0;
+}
+
+long mp4ff_audio_sample_rate(mp4ff_t *file, int track)
+{
+	if(file->total_atracks)
+		return file->atracks[track].track->mdia.minf.stbl.stsd.table[0].sample_rate;
+	return 0;
+}
+
+int mp4ff_audio_bits(mp4ff_t *file, int track)
+{
+	if(file->total_atracks)
+		return file->atracks[track].track->mdia.minf.stbl.stsd.table[0].sample_size;
+
+	return 0;
+}
+
+int mp4ff_audio_time_scale(mp4ff_t *file, int track)
+{
+	if(file->total_atracks) {
+		return file->atracks[track].track->mdia.mdhd.time_scale;
+	}
+	return 0;
+}
+
+int mp4ff_audio_sample_duration(mp4ff_t *file, int track)
+{
+	if(file->total_atracks) {
+		return file->atracks[track].track->mdia.minf.stbl.stts.table[0].sample_duration;
+	}
+	return 0;
+}
+
+char* mp4ff_audio_compressor(mp4ff_t *file, int track)
+{
+  if (file->atracks[track].track == NULL)
+    return (NULL);
+	return file->atracks[track].track->mdia.minf.stbl.stsd.table[0].format;
+}
+
+int mp4ff_track_channels(mp4ff_t *file, int track)
+{
+	if(track < file->total_atracks)
+		return file->atracks[track].channels;
+
+	return 0;
+}
+
+int mp4ff_channel_location(mp4ff_t *file, int *mp4ff_track, int *mp4ff_channel, int channel)
+{
+	int current_channel = 0, current_track = 0;
+	*mp4ff_channel = 0;
+	*mp4ff_track = 0;
+	for(current_channel = 0, current_track = 0; current_track < file->total_atracks; )
+	{
+		if(channel >= current_channel)
+		{
+			*mp4ff_channel = channel - current_channel;
+			*mp4ff_track = current_track;
+		}
+
+		current_channel += file->atracks[current_track].channels;
+		current_track++;
+	}
+	return 0;
+}
+
+int mp4ff_has_video(mp4ff_t *file)
+{
+	if(mp4ff_video_tracks(file)) return 1;
+	return 0;
+}
+
+int mp4ff_video_width(mp4ff_t *file, int track)
+{
+	if(file->total_vtracks) {
+		int width = 
+			file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].width;
+		if (width) {
+			return width;
+		}
+		return file->vtracks[track].track->tkhd.track_width;
+	}
+	return 0;
+}
+
+int mp4ff_video_height(mp4ff_t *file, int track)
+{
+	if(file->total_vtracks) {
+		int height = file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].height;
+		if (height) {
+			return height;
+		}
+		return file->vtracks[track].track->tkhd.track_height;
+	}
+	return 0;
+}
+
+int mp4ff_video_depth(mp4ff_t *file, int track)
+{
+	if(file->total_vtracks)
+		return file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].depth;
+	return 0;
+}
+
+int mp4ff_set_depth(mp4ff_t *file, int depth, int track)
+{
+	int i;
+
+	for(i = 0; i < file->total_vtracks; i++)
+	{
+		file->vtracks[i].track->mdia.minf.stbl.stsd.table[0].depth = depth;
+	}
+}
+
+float mp4ff_video_frame_rate(mp4ff_t *file, int track)
+{
+  float ret = 0;
+  int num = 0;
+  
+  if(file->total_vtracks) {
+    ret = file->vtracks[track].track->mdia.mdhd.time_scale;
+    if (file->vtracks[track].track->mdia.minf.stbl.stts.table[0].sample_duration == 0)
+      num = 1;
+    ret /= 
+	file->vtracks[track].track->mdia.minf.stbl.stts.table[num].sample_duration;
+  }
+  return ret;
+}
+
+char* mp4ff_video_compressor(mp4ff_t *file, int track)
+{
+  if (file->vtracks[track].track == NULL)
+    return (NULL);
+  
+	return file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].format;
+}
+
+int mp4ff_video_time_scale(mp4ff_t *file, int track)
+{
+	if(file->total_vtracks) {
+		return file->vtracks[track].track->mdia.mdhd.time_scale;
+	}
+	return 0;
+}
+
+int mp4ff_video_frame_time(mp4ff_t *file, int track, long frame,
+	long *start, int *duration)
+{
+	mp4ff_stts_t *stts;
+	int i;
+	long f;
+
+	if (file->total_vtracks == 0) {
+		return 0;
+	}
+	stts = &(file->vtracks[track].track->mdia.minf.stbl.stts);
+
+	if (frame < file->last_frame) {
+		/* we need to reset our cached values */
+		file->last_frame = 0;
+		file->last_start = 0;
+		file->last_stts_index = 0;
+	}
+
+	i = file->last_stts_index;
+	f = file->last_frame;
+	*start = file->last_start;
+
+	while (i < stts->total_entries) {
+		if (f + stts->table[i].sample_count <= frame) {
+			*start += stts->table[i].sample_duration 
+				* stts->table[i].sample_count;
+			f += stts->table[i].sample_count;
+			i++;
+
+		} else {
+			/* cache the results for future use */
+			file->last_stts_index = i;
+			file->last_frame = f;
+			file->last_start = *start;
+
+			*start += stts->table[i].sample_duration * (frame - f);
+			*duration = stts->table[i].sample_duration;
+
+			return 1;
+		}
+	}
+
+	/* error */
+	return 0;
+}
+
+int mp4ff_get_mp4_video_decoder_config(mp4ff_t *file, int track, unsigned char** ppBuf, int* pBufSize)
+{
+	mp4ff_esds_t* esds;
+
+	if (!file->total_vtracks) {
+		return 0;
+	}
+	esds = &file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].esds;
+	return mp4ff_esds_get_decoder_config(esds, ppBuf, pBufSize);
+}
+
+int mp4ff_set_mp4_video_decoder_config(mp4ff_t *file, int track, unsigned char* pBuf, int bufSize)
+{
+	mp4ff_esds_t* esds;
+
+	if (!file->total_vtracks) {
+		return 0;
+	}
+	esds = &file->vtracks[track].track->mdia.minf.stbl.stsd.table[0].esds;
+	return mp4ff_esds_set_decoder_config(esds, pBuf, bufSize);
+}
+
+int mp4ff_get_mp4_audio_decoder_config(mp4ff_t *file, int track, unsigned char** ppBuf, int* pBufSize)
+{
+	mp4ff_esds_t* esds;
+
+	if (!file->total_atracks) {
+		return 0;
+	}
+	esds = &file->atracks[track].track->mdia.minf.stbl.stsd.table[0].esds;
+	return mp4ff_esds_get_decoder_config(esds, ppBuf, pBufSize);
+}
+
+int mp4ff_set_mp4_audio_decoder_config(mp4ff_t *file, int track, unsigned char* pBuf, int bufSize)
+{
+	mp4ff_esds_t* esds;
+
+	if (!file->total_atracks) {
+		return 0;
+	}
+	esds = &file->atracks[track].track->mdia.minf.stbl.stsd.table[0].esds;
+	return mp4ff_esds_set_decoder_config(esds, pBuf, bufSize);
+}
+
+long mp4ff_samples_to_bytes(mp4ff_trak_t *track, long samples)
+{
+	return samples
+		* track->mdia.minf.stbl.stsd.table[0].channels
+		* track->mdia.minf.stbl.stsd.table[0].sample_size / 8;
+}
+
+int mp4ff_write_audio(mp4ff_t *file, char *audio_buffer, long samples, int track)
+{
+	long offset;
+	int result;
+	long bytes;
+
+/* Defeat 32 bit file size limit. */
+	if(mp4ff_test_position(file)) return 1;
+
+/* write chunk for 1 track */
+	bytes = samples * mp4ff_audio_bits(file, track) / 8 * file->atracks[track].channels;
+	offset = mp4ff_position(file);
+	result = mp4ff_write_data(file, audio_buffer, bytes);
+
+	if(result) result = 0; else result = 1; /* defeat fwrite's return */
+	mp4ff_update_tables(file, 
+						file->atracks[track].track, 
+						offset, 
+						file->atracks[track].current_chunk, 
+						file->atracks[track].current_position, 
+						samples, 
+						0,
+						0,
+						0,
+						0);
+	file->atracks[track].current_position += samples;
+	file->atracks[track].current_chunk++;
+	return result;
+}
+
+int mp4ff_write_audio_frame(mp4ff_t *file, unsigned char *audio_buffer, long bytes, int track)
+{
+	long offset = mp4ff_position(file);
+	int result = 0;
+
+	/* Defeat 32 bit file size limit. */
+	if(mp4ff_test_position(file)) return 1;
+
+	result = mp4ff_write_data(file, audio_buffer, bytes);
+	if(result) result = 0; else result = 1;
+
+	mp4ff_update_tables(file,
+						file->atracks[track].track,
+						offset,
+						file->atracks[track].current_chunk,
+						file->atracks[track].current_position,
+						1, 
+						bytes,
+						0,
+						0,
+						0);
+	file->atracks[track].current_position += 1;
+	file->atracks[track].current_chunk++;
+	return result;
+}
+
+int mp4ff_write_video_frame(mp4ff_t *file, 
+								unsigned char *video_buffer, 
+								long bytes, 
+								int track, 
+								unsigned char isKeyFrame,
+								long duration,
+								long renderingOffset)
+{
+	long offset = mp4ff_position(file);
+	int result = 0;
+
+	/* Defeat 32 bit file size limit. */
+	if(mp4ff_test_position(file)) return 1;
+
+	result = mp4ff_write_data(file, video_buffer, bytes);
+	if(result) result = 0; else result = 1;
+
+	mp4ff_update_tables(file,
+						file->vtracks[track].track,
+						offset,
+						file->vtracks[track].current_chunk,
+						file->vtracks[track].current_position,
+						1,
+						bytes,
+						duration,
+						isKeyFrame,
+						renderingOffset);
+	file->vtracks[track].current_position += 1;
+	file->vtracks[track].current_chunk++;
+	return result;
+}
+
+mp4_callback_t* mp4ff_get_fd(mp4ff_t *file)
+{
+    if (file->stream->get_position() != file->file_position)
+        file->stream->seek(file->file_position);
+    return file->stream;
+}
+
+int mp4ff_write_frame_init(mp4ff_t *file, int track)
+{
+    if(file->stream->get_position() != file->file_position)
+        file->stream->seek(file->file_position);
+    file->offset = mp4ff_position(file);
+    return 0;
+}
+
+int mp4ff_write_frame_end(mp4ff_t *file, int track)
+{
+	long bytes;
+	file->file_position = file->stream->get_position();
+	bytes = mp4ff_position(file) - file->offset;
+	mp4ff_update_tables(file,
+						file->vtracks[track].track,
+						file->offset,
+						file->vtracks[track].current_chunk,
+						file->vtracks[track].current_position,
+						1,
+						bytes,
+						0,
+						0,
+						0);
+	file->vtracks[track].current_position += 1;
+	file->vtracks[track].current_chunk++;
+	return 0;
+}
+
+int mp4ff_write_audio_init(mp4ff_t *file, int track)
+{
+	return mp4ff_write_frame_init(file, track);
+}
+
+int mp4ff_write_audio_end(mp4ff_t *file, int track, long samples)
+{
+	long bytes;
+	file->file_position = file->stream->get_position();
+	bytes = mp4ff_position(file) - file->offset;
+	mp4ff_update_tables(file, 
+						file->atracks[track].track,
+						file->offset,
+						file->atracks[track].current_chunk,
+						file->atracks[track].current_position,
+						samples,
+						bytes, 
+						0,
+						0,
+						0);
+	file->atracks[track].current_position += samples;
+	file->atracks[track].current_chunk++;
+	return 0;
+}
+
+
+long mp4ff_read_audio(mp4ff_t *file, char *audio_buffer, long samples, int track)
+{
+	long chunk_sample, chunk;
+	int result = 1, track_num;
+	mp4ff_trak_t *trak = file->atracks[track].track;
+	long fragment_len, chunk_end;
+	long position = file->atracks[track].current_position;
+	long start = position, end = position + samples;
+	long bytes, total_bytes = 0;
+	long buffer_offset;
+
+	mp4ff_chunk_of_sample(&chunk_sample, &chunk, trak, position);
+	buffer_offset = 0;
+
+	while(position < end && result)
+	{
+		mp4ff_set_audio_position(file, position, track);
+		fragment_len = mp4ff_chunk_samples(trak, chunk);
+		chunk_end = chunk_sample + fragment_len;
+		fragment_len -= position - chunk_sample;
+		if(position + fragment_len > chunk_end) fragment_len = chunk_end - position;
+		if(position + fragment_len > end) fragment_len = end - position;
+
+		bytes = mp4ff_samples_to_bytes(trak, fragment_len);
+		result = mp4ff_read_data(file, &audio_buffer[buffer_offset], bytes);
+
+		total_bytes += bytes;
+		position += fragment_len;
+		chunk_sample = position;
+		buffer_offset += bytes;
+		chunk++;
+	}
+
+	file->atracks[track].current_position = position;
+	if(!result) return 0;
+	return total_bytes;
+}
+
+int mp4ff_read_chunk(mp4ff_t *file, char *output, int track, long chunk, long byte_start, long byte_len)
+{
+	mp4ff_set_position(file, mp4ff_chunk_to_offset(file->atracks[track].track, chunk) + byte_start);
+	if(mp4ff_read_data(file, output, byte_len)) return 0;
+	else
+	return 1;
+}
+
+long mp4ff_frame_size(mp4ff_t *file, long frame, int track)
+{
+	int bytes;
+	mp4ff_trak_t *trak = file->vtracks[track].track;
+
+	if(trak->mdia.minf.stbl.stsz.sample_size)
+	{
+		bytes = trak->mdia.minf.stbl.stsz.sample_size;
+	}
+	else
+	{
+		bytes = trak->mdia.minf.stbl.stsz.table[frame].size;
+	}
+
+	return bytes;
+}
+
+long mp4ff_get_sample_duration(mp4ff_t *file, long frame, int track)
+{
+    int i, ci = 0, co = 0;
+    mp4ff_trak_t *trak = file->atracks[track].track;
+
+    for (i = 0; i < trak->mdia.minf.stbl.stts.total_entries; i++)
+    {
+        int j;
+        for (j = 0; j < trak->mdia.minf.stbl.stts.table[i].sample_count; j++)
+        {
+            if (co == frame)
+                return trak->mdia.minf.stbl.stts.table[ci].sample_duration;
+            co++;
+        }
+        ci++;
+    }
+}
+
+long mp4ff_audio_frame_size(mp4ff_t *file, long frame, int track)
+{
+    int bytes;
+    mp4ff_trak_t *trak = file->atracks[track].track;
+
+    if(trak->mdia.minf.stbl.stsz.sample_size)
+    {
+        bytes = trak->mdia.minf.stbl.stsz.sample_size;
+    } else {
+        bytes = trak->mdia.minf.stbl.stsz.table[frame].size;
+    }
+
+    return bytes;
+}
+
+long mp4ff_read_audio_frame(mp4ff_t *file, unsigned char *audio_buffer,  int maxBytes, int track)
+{
+	long bytes;
+	int result = 0;
+	mp4ff_trak_t *trak = file->atracks[track].track;
+
+	bytes = mp4ff_audio_frame_size(file, 
+		file->atracks[track].current_position, track);
+
+	if (bytes > maxBytes) {
+		return -bytes;
+	}
+
+	mp4ff_set_audio_position(file, 
+		file->atracks[track].current_position, track);
+
+	result = mp4ff_read_data(file, audio_buffer, bytes);
+
+	file->atracks[track].current_position++;
+
+	if (!result)
+		return 0;
+	return bytes;
+}
+
+long mp4ff_read_frame(mp4ff_t *file, unsigned char *video_buffer, int track)
+{
+	long bytes;
+	int result = 0;
+
+	mp4ff_trak_t *trak = file->vtracks[track].track;
+	bytes = mp4ff_frame_size(file, file->vtracks[track].current_position, track);
+
+	if(!file->vtracks[track].frames_cached)
+	{
+		mp4ff_set_video_position(file, file->vtracks[track].current_position, track);
+		result = mp4ff_read_data(file, video_buffer, bytes);
+	}
+	else
+	{
+		int i;
+		unsigned char *cached_frame;
+
+		if(file->vtracks[track].current_position >= file->vtracks[track].frames_cached) result = 1;
+		if(!result)
+		{
+			cached_frame = file->vtracks[track].frame_cache[file->vtracks[track].current_position];
+
+			for(i = 0; i < bytes; i++)
+				video_buffer[i] = cached_frame[i];
+		}
+	}
+	file->vtracks[track].current_position++;
+
+	if(!result) return 0;
+	return bytes;
+}
+
+int mp4ff_read_frame_init(mp4ff_t *file, int track)
+{
+	mp4ff_trak_t *trak = file->vtracks[track].track;
+	mp4ff_set_video_position(file, file->vtracks[track].current_position, track);
+	if(file->stream->get_position() != file->file_position)
+        file->stream->seek(file->file_position);
+	return 0;
+}
+
+int mp4ff_read_frame_end(mp4ff_t *file, int track)
+{
+	file->file_position = file->stream->get_position();
+	file->vtracks[track].current_position++;
+	return 0;
+}
+
+int mp4ff_init_video_map(mp4ff_video_map_t *vtrack, mp4ff_trak_t *trak)
+{
+	vtrack->track = trak;
+	vtrack->current_position = 0;
+	vtrack->current_chunk = 1;
+	vtrack->frame_cache = 0;
+	vtrack->frames_cached = 0;
+	return 0;
+}
+
+int mp4ff_delete_video_map(mp4ff_video_map_t *vtrack)
+{
+	int i;
+	if(vtrack->frames_cached)
+	{
+		for(i = 0; i < vtrack->frames_cached; i++)
+		{
+			free(vtrack->frame_cache[i]);
+		}
+		free(vtrack->frame_cache);
+		vtrack->frames_cached = 0;
+	}
+	return 0;
+}
+
+int mp4ff_init_audio_map(mp4ff_audio_map_t *atrack, mp4ff_trak_t *trak)
+{
+	atrack->track = trak;
+	atrack->channels = trak->mdia.minf.stbl.stsd.table[0].channels;
+	atrack->current_position = 0;
+	atrack->current_chunk = 1;
+	return 0;
+}
+
+int mp4ff_delete_audio_map(mp4ff_audio_map_t *atrack)
+{
+	int i;
+	return 0;
+}
+
+int mp4ff_read_info(mp4ff_t *file)
+{
+	int result = 0, found_moov = 0;
+	int i, j, k, m, channel, trak_channel, track;
+	long start_position = mp4ff_position(file);
+	mp4ff_atom_t leaf_atom;
+	mp4ff_trak_t *trak;
+
+	mp4ff_set_position(file, 0);
+
+	do
+	{
+		result = mp4ff_atom_read_header(file, &leaf_atom);
+		if(!result)
+		{
+			if(mp4ff_atom_is(&leaf_atom, "mdat")) {
+				mp4ff_read_mdat(file, &(file->mdat), &leaf_atom);
+			} else if(mp4ff_atom_is(&leaf_atom, "moov")) {
+				mp4ff_read_moov(file, &(file->moov), &leaf_atom);
+				found_moov = 1;
+			} else {
+				mp4ff_atom_skip(file, &leaf_atom);
+			}
+		}
+	}while(!result && mp4ff_position(file) < file->total_length);
+
+/* go back to the original position */
+	mp4ff_set_position(file, start_position);
+
+	if(found_moov) {
+
+		/* get tables for all the different tracks */
+		file->total_atracks = mp4ff_audio_tracks(file);
+		file->atracks = (mp4ff_audio_map_t*)calloc(1, 
+			sizeof(mp4ff_audio_map_t) * file->total_atracks);
+
+		for(i = 0, track = 0; i < file->total_atracks; i++) {
+			while(!file->moov.trak[track]->mdia.minf.is_audio)
+				track++;
+			mp4ff_init_audio_map(&(file->atracks[i]), file->moov.trak[track]);
+		}
+
+		file->total_vtracks = mp4ff_video_tracks(file);
+		file->vtracks = (mp4ff_video_map_t*)calloc(1, sizeof(mp4ff_video_map_t) * file->total_vtracks);
+
+		for(track = 0, i = 0; i < file->total_vtracks; i++)
+		{
+			while(!file->moov.trak[track]->mdia.minf.is_video)
+				track++;
+
+			mp4ff_init_video_map(&(file->vtracks[i]), file->moov.trak[track]);
+		}
+	}
+
+	if(found_moov) 
+		return 0; 
+	else 
+		return 1;
+}
+
+
+int mp4ff_dump(mp4ff_t *file)
+{
+	printf("mp4ff_dump\n");
+	printf("movie data\n");
+	printf(" size %ld\n", file->mdat.size);
+	printf(" start %ld\n", file->mdat.start);
+	mp4ff_moov_dump(&(file->moov));
+	return 0;
+}
+
+
+/* ================================== Entry points ========================== */
+
+int mp4ff_check_sig(mp4_callback_t *path)
+{
+	mp4ff_t file;
+	mp4ff_atom_t leaf_atom;
+	int result1 = 0, result2 = 0;
+
+	mp4ff_init(&file);
+    file.stream = path;
+
+	file.total_length = file.stream->get_length();
+
+	do
+	{
+		result1 = mp4ff_atom_read_header(&file, &leaf_atom);
+
+		if(!result1)
+		{
+/* just want the "moov" atom */
+			if(mp4ff_atom_is(&leaf_atom, "moov"))
+			{
+				result2 = 1;
+			}
+			else
+				mp4ff_atom_skip(&file, &leaf_atom);
+		}
+	}while(!result1 && !result2 && mp4ff_position(&file) < file.total_length);
+
+	mp4ff_delete(&file);
+	return result2;
+}
+
+mp4ff_t* mp4ff_open(mp4_callback_t *callbacks, int rd, int wr, int append)
+{
+    mp4ff_t *new_file = malloc(sizeof(mp4ff_t));
+    int exists = 0;
+
+    mp4ff_init(new_file);
+    new_file->stream = callbacks;
+    new_file->wr = wr;
+    new_file->rd = rd;
+    new_file->mdat.start = 0;
+
+    if(rd /*&& exists*/)
+    {
+        new_file->total_length = new_file->stream->get_length();
+
+        if(mp4ff_read_info(new_file))
+        {
+            mp4ff_close(new_file);
+            new_file = 0;
+        }
+    }
+
+    if(wr)
+    {
+        if(!exists || !append)
+        {
+            /* start the data atom */
+            mp4ff_write_int32(new_file, 0);
+            mp4ff_write_char32(new_file, "mdat");
+        } else {
+            mp4ff_set_position(new_file,
+                new_file->mdat.start + new_file->mdat.size);
+            new_file->stream->seek(new_file->mdat.start + new_file->mdat.size);
+        }
+    }
+    return new_file;
+}
+
+int mp4ff_write(mp4ff_t *file)
+{
+	int result = -1;
+
+	if(!file->wr) {
+		return result;
+	}
+
+	mp4ff_write_mdat(file, &(file->mdat));
+	mp4ff_write_moov(file, &(file->moov));
+
+	return result;
+}
+
+int mp4ff_destroy(mp4ff_t *file)
+{
+	mp4ff_delete(file);
+	free(file);
+	return 0;
+}
+
+int mp4ff_close(mp4ff_t *file)
+{
+	int result = 0;
+	if(file->wr)
+	{
+		mp4ff_write_mdat(file, &(file->mdat));
+		mp4ff_write_moov(file, &(file->moov));
+	}
+
+	mp4ff_delete(file);
+	free(file);
+	return result;
+}
--- /dev/null
+++ b/common/mp4ff/mp4ff.dsp
@@ -1,0 +1,232 @@
+# Microsoft Developer Studio Project File - Name="mp4ff" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=mp4ff - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "mp4ff.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "mp4ff.mak" CFG="mp4ff - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "mp4ff - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "mp4ff - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=xicl6.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "mp4ff - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+MTL=midl.exe
+F90=df.exe
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE RSC /l 0x413 /d "NDEBUG"
+# ADD RSC /l 0x413 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF  "$(CFG)" == "mp4ff - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+MTL=midl.exe
+F90=df.exe
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x413 /d "_DEBUG"
+# ADD RSC /l 0x413 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF 
+
+# Begin Target
+
+# Name "mp4ff - Win32 Release"
+# Name "mp4ff - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\atom.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\ctts.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\dinf.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\dref.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\edts.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\elst.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\esds.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hdlr.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\iods.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\matrix.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mdat.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mdhd.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mdia.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\minf.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\moov.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mp4ff.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\mvhd.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\smhd.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stbl.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stco.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stsc.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stsd.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stsdtable.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stss.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stsz.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\stts.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\tkhd.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\trak.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\udta.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\util.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\vmhd.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\funcprotos.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\mp4ff.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\private.h
+# End Source File
+# End Group
+# End Target
+# End Project
--- /dev/null
+++ b/common/mp4ff/mp4ff.h
@@ -1,0 +1,169 @@
+#ifndef MP4FF_H
+#define MP4FF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <windows.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+#include "private.h"
+#include "funcprotos.h"
+
+
+
+/* This is the reference for all your library entry points. */
+
+
+/* =========================== public interface ========================= // */
+
+/* return 1 if the file is a quicktime file */
+int mp4ff_check_sig(mp4_callback_t *path);
+
+/* call this first to open the file and create all the objects */
+mp4ff_t* mp4ff_open(mp4_callback_t *callbacks, int rd, int wr, int append);
+
+/* make the quicktime file streamable */
+int mp4ff_make_streamable(mp4_callback_t *in_path, mp4_callback_t *out_path);
+
+/* Set various options in the file. */
+int mp4ff_set_time_scale(mp4ff_t *file, int time_scale);
+int mp4ff_set_copyright(mp4ff_t *file, char *string);
+int mp4ff_set_name(mp4ff_t *file, char *string);
+int mp4ff_set_info(mp4ff_t *file, char *string);
+int mp4ff_get_time_scale(mp4ff_t *file);
+char* mp4ff_get_copyright(mp4ff_t *file);
+char* mp4ff_get_name(mp4ff_t *file);
+char* mp4ff_get_info(mp4ff_t *file);
+
+/* Read all the information about the file. */
+/* Requires a MOOV atom be present in the file. */
+/* If no MOOV atom exists return 1 else return 0. */
+int mp4ff_read_info(mp4ff_t *file);
+
+/* set up tracks in a new file after opening and before writing */
+/* returns the number of quicktime tracks allocated */
+/* audio is stored two channels per quicktime track */
+int mp4ff_set_audio(mp4ff_t *file, int channels, long sample_rate, int bits, int sample_size, int time_scale, int sample_duration, char *compressor);
+
+/* Samplerate can be set after file is created */
+int mp4ff_set_framerate(mp4ff_t *file, float framerate);
+
+/* video is stored one layer per quicktime track */
+int mp4ff_set_video(mp4ff_t *file, int tracks, int frame_w, int frame_h, float frame_rate, int time_scale, char *compressor);
+
+/* routines for setting various video parameters */
+
+/* Set the depth of the track. */
+int mp4ff_set_depth(mp4ff_t *file, int depth, int track);
+
+/* close the file and delete all the objects */
+int mp4ff_write(mp4ff_t *file);
+int mp4ff_destroy(mp4ff_t *file);
+int mp4ff_close(mp4ff_t *file);
+
+/* get length information */
+/* channel numbers start on 1 for audio and video */
+long mp4ff_audio_length(mp4ff_t *file, int track);
+long mp4ff_video_length(mp4ff_t *file, int track);
+
+/* get position information */
+long mp4ff_audio_position(mp4ff_t *file, int track);
+long mp4ff_video_position(mp4ff_t *file, int track);
+
+/* get file information */
+int mp4ff_video_tracks(mp4ff_t *file);
+int mp4ff_audio_tracks(mp4ff_t *file);
+
+int mp4ff_has_audio(mp4ff_t *file);
+long mp4ff_audio_sample_rate(mp4ff_t *file, int track);
+int mp4ff_audio_bits(mp4ff_t *file, int track);
+int mp4ff_track_channels(mp4ff_t *file, int track);
+int mp4ff_audio_time_scale(mp4ff_t *file, int track);
+int mp4ff_audio_sample_duration(mp4ff_t *file, int track);
+char* mp4ff_audio_compressor(mp4ff_t *file, int track);
+
+int mp4ff_has_video(mp4ff_t *file);
+int mp4ff_video_width(mp4ff_t *file, int track);
+int mp4ff_video_height(mp4ff_t *file, int track);
+int mp4ff_video_depth(mp4ff_t *file, int track);
+float mp4ff_video_frame_rate(mp4ff_t *file, int track);
+char* mp4ff_video_compressor(mp4ff_t *file, int track);
+int mp4ff_video_time_scale(mp4ff_t *file, int track);
+
+int mp4ff_video_frame_time(mp4ff_t *file, int track, long frame,
+    long *start_time, int *duration);
+
+int mp4ff_get_iod_audio_profile_level(mp4ff_t *file);
+int mp4ff_set_iod_audio_profile_level(mp4ff_t *file, int id);
+int mp4ff_get_iod_video_profile_level(mp4ff_t *file);
+int mp4ff_set_iod_video_profile_level(mp4ff_t *file, int id);
+
+int mp4ff_get_mp4_video_decoder_config(mp4ff_t *file, int track, unsigned char** ppBuf, int* pBufSize);
+int mp4ff_set_mp4_video_decoder_config(mp4ff_t *file, int track, unsigned char* pBuf, int bufSize);
+int mp4ff_get_mp4_audio_decoder_config(mp4ff_t *file, int track, unsigned char** ppBuf, int* pBufSize);
+int mp4ff_set_mp4_audio_decoder_config(mp4ff_t *file, int track, unsigned char* pBuf, int bufSize);
+
+/* number of bytes of raw data in this frame */
+long mp4ff_frame_size(mp4ff_t *file, long frame, int track);
+long mp4ff_audio_frame_size(mp4ff_t *file, long frame, int track);
+
+/* get the quicktime track and channel that the audio channel belongs to */
+/* channels and tracks start on 0 */
+int mp4ff_channel_location(mp4ff_t *file, int *mp4ff_track, int *mp4ff_channel, int channel);
+
+/* file positioning */
+int mp4ff_seek_end(mp4ff_t *file);
+int mp4ff_seek_start(mp4ff_t *file);
+
+/* set position of file descriptor relative to a track */
+int mp4ff_set_audio_position(mp4ff_t *file, long sample, int track);
+int mp4ff_set_video_position(mp4ff_t *file, long frame, int track);
+
+/* ========================== Access to raw data follows. */
+/* write data for one quicktime track */
+/* the user must handle conversion to the channels in this track */
+int mp4ff_write_audio(mp4ff_t *file, char *audio_buffer, long samples, int track);
+int mp4ff_write_audio_frame(mp4ff_t *file, unsigned char *audio_buffer, long bytes, int track);
+
+int mp4ff_write_video_frame(mp4ff_t *file, unsigned char *video_buffer, long bytes, int track, unsigned char isKeyFrame, long duration, long renderingOffset);
+
+/* for writing a frame using a library that needs a file descriptor */
+int mp4ff_write_frame_init(mp4ff_t *file, int track); /* call before fwrite */
+mp4_callback_t* mp4ff_get_fd(mp4ff_t *file);     /* return a file descriptor */
+int mp4ff_write_frame_end(mp4ff_t *file, int track); /* call after fwrite */
+
+/* For reading and writing audio to a file descriptor. */
+int mp4ff_write_audio_end(mp4ff_t *file, int track, long samples); /* call after fwrite */
+
+/* Read an entire chunk. */
+/* read the number of bytes starting at the byte_start in the specified chunk */
+/* You must provide enough space to store the chunk. */
+int mp4ff_read_chunk(mp4ff_t *file, char *output, int track, long chunk, long byte_start, long byte_len);
+
+/* read raw data */
+long mp4ff_read_audio(mp4ff_t *file, char *audio_buffer, long samples, int track);
+long mp4ff_read_audio_frame(mp4ff_t *file, unsigned char *audio_buffer, int maxBytes, int track);
+long mp4ff_read_frame(mp4ff_t *file, unsigned char *video_buffer, int track);
+long mp4ff_get_sample_duration(mp4ff_t *file, long frame, int track);
+
+/* for reading frame using a library that needs a file descriptor */
+/* Frame caching doesn't work here. */
+int mp4ff_read_frame_init(mp4ff_t *file, int track);
+int mp4ff_read_frame_end(mp4ff_t *file, int track);
+
+/* Dump the file structures for the currently opened file. */
+int mp4ff_dump(mp4ff_t *file);
+
+/* Test the 32 bit overflow */
+int mp4ff_test_position(mp4ff_t *file);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/common/mp4ff/mvhd.c
@@ -1,0 +1,111 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_mvhd_init(mp4ff_mvhd_t *mvhd)
+{
+	int i;
+	mvhd->version = 0;
+	mvhd->flags = 0;
+	mvhd->creation_time = mp4ff_current_time();
+	mvhd->modification_time = mp4ff_current_time();
+	mvhd->time_scale = 90000;
+	mvhd->duration = 0;
+	mvhd->preferred_rate = 1.0;
+	mvhd->preferred_volume = 0.996094;
+	for(i = 0; i < 10; i++) mvhd->reserved[i] = 0;
+	mp4ff_matrix_init(&(mvhd->matrix));
+	mvhd->preview_time = 0;
+	mvhd->preview_duration = 0;
+	mvhd->poster_time = 0;
+	mvhd->selection_time = 0;
+	mvhd->selection_duration = 0;
+	mvhd->current_time = 0;
+	mvhd->next_track_id = 1;
+	return 0;
+}
+
+int mp4ff_mvhd_delete(mp4ff_mvhd_t *mvhd)
+{
+	return 0;
+}
+
+int mp4ff_mvhd_dump(mp4ff_mvhd_t *mvhd)
+{
+	printf(" movie header\n");
+	printf("  version %d\n", mvhd->version);
+	printf("  flags %ld\n", mvhd->flags);
+	printf("  creation_time %u\n", mvhd->creation_time);
+	printf("  modification_time %u\n", mvhd->modification_time);
+	printf("  time_scale %ld\n", mvhd->time_scale);
+	printf("  duration %ld\n", mvhd->duration);
+	printf("  preferred_rate %f\n", mvhd->preferred_rate);
+	printf("  preferred_volume %f\n", mvhd->preferred_volume);
+	mp4ff_print_chars("  reserved ", mvhd->reserved, 10);
+	mp4ff_matrix_dump(&(mvhd->matrix));
+	printf("  preview_time %ld\n", mvhd->preview_time);
+	printf("  preview_duration %ld\n", mvhd->preview_duration);
+	printf("  poster_time %ld\n", mvhd->poster_time);
+	printf("  selection_time %ld\n", mvhd->selection_time);
+	printf("  selection_duration %ld\n", mvhd->selection_duration);
+	printf("  current_time %ld\n", mvhd->current_time);
+	printf("  next_track_id %ld\n", mvhd->next_track_id);
+}
+
+int mp4ff_read_mvhd(mp4ff_t *file, mp4ff_mvhd_t *mvhd)
+{
+	mvhd->version = mp4ff_read_char(file);
+	mvhd->flags = mp4ff_read_int24(file);
+	mvhd->creation_time = mp4ff_read_int32(file);
+	mvhd->modification_time = mp4ff_read_int32(file);
+	mvhd->time_scale = mp4ff_read_int32(file);
+	mvhd->duration = mp4ff_read_int32(file);
+	mvhd->preferred_rate = mp4ff_read_fixed32(file);
+	mvhd->preferred_volume = mp4ff_read_fixed16(file);
+	mp4ff_read_data(file, mvhd->reserved, 10);
+	mp4ff_read_matrix(file, &(mvhd->matrix));
+	mvhd->preview_time = mp4ff_read_int32(file);
+	mvhd->preview_duration = mp4ff_read_int32(file);
+	mvhd->poster_time = mp4ff_read_int32(file);
+	mvhd->selection_time = mp4ff_read_int32(file);
+	mvhd->selection_duration = mp4ff_read_int32(file);
+	mvhd->current_time = mp4ff_read_int32(file);
+	mvhd->next_track_id = mp4ff_read_int32(file);
+}
+
+int mp4ff_write_mvhd(mp4ff_t *file, mp4ff_mvhd_t *mvhd)
+{
+	int i;
+
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "mvhd");
+
+	mp4ff_write_char(file, mvhd->version);
+	mp4ff_write_int24(file, mvhd->flags);
+	mp4ff_write_int32(file, mvhd->creation_time);
+	mp4ff_write_int32(file, mvhd->modification_time);
+	mp4ff_write_int32(file, mvhd->time_scale);
+	mp4ff_write_int32(file, mvhd->duration);
+
+	mp4ff_write_int32(file, 0x00010000);
+	mp4ff_write_int16(file, 0x0100);
+	mp4ff_write_int16(file, 0x0000);
+	mp4ff_write_int32(file, 0x00000000);
+	mp4ff_write_int32(file, 0x00000000);
+	mp4ff_write_int32(file, 0x00010000);
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	mp4ff_write_int32(file, 0x00010000);
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	mp4ff_write_int32(file, 0x40000000);
+	for (i = 0; i < 6; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+
+	mp4ff_write_int32(file, mvhd->next_track_id);
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/private.h
@@ -1,0 +1,483 @@
+#ifndef PRIVATE_H
+#define PRIVATE_H
+
+/* ================================= structures */
+
+#define HEADER_LENGTH 8
+#define MAXTRACKS 1024
+
+typedef struct
+{
+	float values[9];
+} mp4ff_matrix_t;
+
+
+typedef struct
+{
+	int version;
+	long flags;
+	unsigned long creation_time;
+	unsigned long modification_time;
+	int track_id;
+	long reserved1;
+	long duration;
+	char reserved2[8];
+	int layer;
+	int alternate_group;
+	float volume;
+	long reserved3;
+	mp4ff_matrix_t matrix;
+	float track_width;
+	float track_height;
+	int is_video;
+	int is_audio;
+} mp4ff_tkhd_t;
+
+
+
+
+/* ===================== sample table ======================== // */
+
+
+
+/* sample description */
+
+typedef struct
+{
+	int version;
+	long flags;
+	int decoderConfigLen;
+	unsigned char* decoderConfig;
+} mp4ff_esds_t;
+
+typedef struct
+{
+	char format[4];
+	char reserved[6];
+	int data_reference;
+
+/* common to audio and video */
+	int version;
+	int revision;
+	char vendor[4];
+
+/* video description */
+	long temporal_quality;
+	long spatial_quality;
+	int width;
+	int height;
+	float dpi_horizontal;
+	float dpi_vertical;
+	long data_size;
+	int frames_per_sample;
+	char compressor_name[32];
+	int depth;
+	float gamma;
+	int fields;    /* 0, 1, or 2 */
+	int field_dominance;   /* 0 - unknown     1 - top first     2 - bottom first */
+
+/* audio description */
+	int channels;
+	int sample_size;
+	int compression_id;
+	int packet_size;
+	float sample_rate;
+
+/* MP4 elementary stream descriptor */
+	mp4ff_esds_t esds;
+
+} mp4ff_stsd_table_t;
+
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	mp4ff_stsd_table_t *table;
+} mp4ff_stsd_t;
+
+
+/* time to sample */
+typedef struct
+{
+	long sample_count;
+	long sample_duration;
+} mp4ff_stts_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	long entries_allocated;
+	mp4ff_stts_table_t *table;
+} mp4ff_stts_t;
+
+
+/* sync sample */
+typedef struct
+{
+	long sample;
+} mp4ff_stss_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	long entries_allocated;
+	mp4ff_stss_table_t *table;
+} mp4ff_stss_t;
+
+
+/* sample to chunk */
+typedef struct
+{
+	long chunk;
+	long samples;
+	long id;
+} mp4ff_stsc_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	
+	long entries_allocated;
+	mp4ff_stsc_table_t *table;
+} mp4ff_stsc_t;
+
+
+/* sample size */
+typedef struct
+{
+	long size;
+} mp4ff_stsz_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long sample_size;
+	long total_entries;
+
+	long entries_allocated;    /* used by the library for allocating a table */
+	mp4ff_stsz_table_t *table;
+} mp4ff_stsz_t;
+
+
+/* chunk offset */
+typedef struct
+{
+	long offset;
+} mp4ff_stco_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	
+	long entries_allocated;    /* used by the library for allocating a table */
+	mp4ff_stco_table_t *table;
+} mp4ff_stco_t;
+
+/* composition time to sample */
+typedef struct
+{
+	long sample_count;
+	long sample_offset;
+} mp4ff_ctts_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	long entries_allocated;
+	mp4ff_ctts_table_t *table;
+} mp4ff_ctts_t;
+
+
+/* sample table */
+typedef struct
+{
+	int version;
+	long flags;
+	mp4ff_stsd_t stsd;
+	mp4ff_stts_t stts;
+	mp4ff_stss_t stss;
+	mp4ff_stsc_t stsc;
+	mp4ff_stsz_t stsz;
+	mp4ff_stco_t stco;
+	mp4ff_ctts_t ctts;
+} mp4ff_stbl_t;
+
+/* data reference */
+
+typedef struct
+{
+	long size;
+	char type[4];
+	int version;
+	long flags;
+	char *data_reference;
+} mp4ff_dref_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+	mp4ff_dref_table_t *table;
+} mp4ff_dref_t;
+
+/* data information */
+
+typedef struct
+{
+	mp4ff_dref_t dref;
+} mp4ff_dinf_t;
+
+/* video media header */
+
+typedef struct
+{
+	int version;
+	long flags;
+	int graphics_mode;
+	int opcolor[3];
+} mp4ff_vmhd_t;
+
+
+/* sound media header */
+
+typedef struct
+{
+	int version;
+	long flags;
+	int balance;
+	int reserved;
+} mp4ff_smhd_t;
+
+/* handler reference */
+
+typedef struct
+{
+	int version;
+	long flags;
+	char component_type[4];
+	char component_subtype[4];
+	long component_manufacturer;
+	long component_flags;
+	long component_flag_mask;
+	char component_name[256];
+} mp4ff_hdlr_t;
+
+/* media information */
+
+typedef struct
+{
+	int is_video;
+	int is_audio;
+	mp4ff_vmhd_t vmhd;
+	mp4ff_smhd_t smhd;
+	mp4ff_stbl_t stbl;
+	mp4ff_hdlr_t hdlr;
+	mp4ff_dinf_t dinf;
+} mp4ff_minf_t;
+
+
+/* media header */
+
+typedef struct
+{
+	int version;
+	long flags;
+	unsigned long creation_time;
+	unsigned long modification_time;
+	long time_scale;
+	long duration;
+	int language;
+	int quality;
+} mp4ff_mdhd_t;
+
+
+/* media */
+
+typedef struct
+{
+	mp4ff_mdhd_t mdhd;
+	mp4ff_minf_t minf;
+	mp4ff_hdlr_t hdlr;
+} mp4ff_mdia_t;
+
+/* edit list */
+typedef struct
+{
+	long duration;
+	long time;
+	float rate;
+} mp4ff_elst_table_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	long total_entries;
+
+	mp4ff_elst_table_t *table;
+} mp4ff_elst_t;
+
+typedef struct
+{
+	mp4ff_elst_t elst;
+} mp4ff_edts_t;
+
+typedef struct
+{
+	mp4ff_tkhd_t tkhd;
+	mp4ff_mdia_t mdia;
+	mp4ff_edts_t edts;
+} mp4ff_trak_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	int audioProfileId;
+	int videoProfileId;
+} mp4ff_iods_t;
+
+typedef struct
+{
+	int version;
+	long flags;
+	unsigned long creation_time;
+	unsigned long modification_time;
+	long time_scale;
+	long duration;
+	float preferred_rate;
+	float preferred_volume;
+	char reserved[10];
+	mp4ff_matrix_t matrix;
+	long preview_time;
+	long preview_duration;
+	long poster_time;
+	long selection_time;
+	long selection_duration;
+	long current_time;
+	long next_track_id;
+} mp4ff_mvhd_t;
+
+typedef struct
+{
+	char *copyright;
+	int copyright_len;
+	char *name;
+	int name_len;
+	char *info;
+	int info_len;
+} mp4ff_udta_t;
+
+
+typedef struct
+{
+	int total_tracks;
+
+	mp4ff_mvhd_t mvhd;
+	mp4ff_iods_t iods;
+	mp4ff_trak_t *trak[MAXTRACKS];
+	mp4ff_udta_t udta;
+} mp4ff_moov_t;
+
+typedef struct
+{
+	long start;
+	long size;
+} mp4ff_mdat_t;
+
+
+typedef struct
+{
+	long start;      /* byte start in file */
+	long end;        /* byte endpoint in file */
+	long size;       /* byte size for writing */
+	char type[4];
+} mp4ff_atom_t;
+
+/* table of pointers to every track */
+typedef struct
+{
+	mp4ff_trak_t *track; /* real quicktime track corresponding to this table */
+	int channels;            /* number of audio channels in the track */
+	long current_position;   /* current sample in output file */
+	long current_chunk;      /* current chunk in output file */
+
+	void *codec;
+} mp4ff_audio_map_t;
+
+typedef struct
+{
+	mp4ff_trak_t *track;
+	long current_position;
+	long current_chunk;
+
+/* Array of pointers to frames of raw data when caching frames. */
+	unsigned char **frame_cache;
+	long frames_cached;
+
+	void *codec;
+} mp4ff_video_map_t;
+
+/* file descriptor passed to all routines */
+
+typedef struct
+{
+    size_t (*read)(void *buffer, size_t length);
+    size_t (*write)(void *buffer, size_t length);
+    __int64 (*get_position)();
+    __int64 (*get_length)();
+    int (*seek)(__int64 position);
+} mp4_callback_t;
+
+typedef struct
+{
+	mp4_callback_t *stream;
+	long total_length;
+	mp4ff_mdat_t mdat;
+	mp4ff_moov_t moov;
+	int rd;
+	int wr;
+
+/* mapping of audio channels to movie tracks */
+/* one audio map entry exists for each channel */
+	int total_atracks;
+	mp4ff_audio_map_t *atracks;
+
+/* mapping of video tracks to movie tracks */
+	int total_vtracks;
+	mp4ff_video_map_t *vtracks;
+
+/* for begining and ending frame writes where the user wants to write the  */
+/* file descriptor directly */
+	long offset;
+
+/* I/O */
+	long file_position;      /* Current position of file descriptor */
+
+/* Parameters for frame currently being decoded */
+	int do_scaling;
+	int in_x, in_y, in_w, in_h, out_w, out_h;
+	int color_model;
+
+/* Cached value for mp4ff_video_frame */
+	long last_frame;
+	long last_start;
+	int last_stts_index;
+
+} mp4ff_t;
+
+#endif
--- /dev/null
+++ b/common/mp4ff/smhd.c
@@ -1,0 +1,46 @@
+#include "mp4ff.h"
+
+
+
+
+int mp4ff_smhd_init(mp4ff_smhd_t *smhd)
+{
+	smhd->version = 0;
+	smhd->flags = 0;
+	smhd->balance = 0;
+	smhd->reserved = 0;
+}
+
+int mp4ff_smhd_delete(mp4ff_smhd_t *smhd)
+{
+}
+
+int mp4ff_smhd_dump(mp4ff_smhd_t *smhd)
+{
+	printf("    sound media header\n");
+	printf("     version %d\n", smhd->version);
+	printf("     flags %d\n", smhd->flags);
+	printf("     balance %d\n", smhd->balance);
+	printf("     reserved %d\n", smhd->reserved);
+}
+
+int mp4ff_read_smhd(mp4ff_t *file, mp4ff_smhd_t *smhd)
+{
+	smhd->version = mp4ff_read_char(file);
+	smhd->flags = mp4ff_read_int24(file);
+	smhd->balance = mp4ff_read_int16(file);
+	smhd->reserved = mp4ff_read_int16(file);
+}
+
+int mp4ff_write_smhd(mp4ff_t *file, mp4ff_smhd_t *smhd)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "smhd");
+
+	mp4ff_write_char(file, smhd->version);
+	mp4ff_write_int24(file, smhd->flags);
+
+	mp4ff_write_int32(file, 0x00000000);
+
+	mp4ff_atom_write_footer(file, &atom);
+}
--- /dev/null
+++ b/common/mp4ff/stbl.c
@@ -1,0 +1,132 @@
+#include "mp4ff.h"
+
+int mp4ff_stbl_init(mp4ff_stbl_t *stbl)
+{
+	stbl->version = 0;
+	stbl->flags = 0;
+	mp4ff_stsd_init(&(stbl->stsd));
+	mp4ff_stts_init(&(stbl->stts));
+	mp4ff_stss_init(&(stbl->stss));
+	mp4ff_stsc_init(&(stbl->stsc));
+	mp4ff_stsz_init(&(stbl->stsz));
+	mp4ff_stco_init(&(stbl->stco));
+	mp4ff_ctts_init(&(stbl->ctts));
+}
+
+int mp4ff_stbl_init_video(mp4ff_t *file, 
+							mp4ff_stbl_t *stbl, 
+							int frame_w,
+							int frame_h, 
+							int time_scale, 
+							float frame_rate,
+							char *compressor)
+{
+	mp4ff_stsd_init_video(file, &(stbl->stsd), frame_w, frame_h, frame_rate, compressor);
+	mp4ff_stts_init_video(file, &(stbl->stts), time_scale, frame_rate);
+	mp4ff_stss_init_common(file, &(stbl->stss));
+	mp4ff_stsc_init_video(file, &(stbl->stsc));
+	mp4ff_stsz_init_video(file, &(stbl->stsz));
+	mp4ff_stco_init_common(file, &(stbl->stco));
+	mp4ff_ctts_init_common(file, &(stbl->ctts));
+}
+
+
+int mp4ff_stbl_init_audio(mp4ff_t *file, 
+							mp4ff_stbl_t *stbl, 
+							int channels, 
+							int sample_rate, 
+							int bits, 
+							int sample_size,
+							int time_scale,
+							int sample_duration,
+							char *compressor)
+{
+	mp4ff_stsd_init_audio(file, &(stbl->stsd), channels, sample_rate, bits, compressor);
+	mp4ff_stts_init_audio(file, &(stbl->stts), time_scale, sample_duration);
+	mp4ff_stss_init_common(file, &(stbl->stss));
+	mp4ff_stsc_init_audio(file, &(stbl->stsc));
+	mp4ff_stsz_init_audio(file, &(stbl->stsz), sample_size);
+	mp4ff_stco_init_common(file, &(stbl->stco));
+	mp4ff_ctts_init_common(file, &(stbl->ctts));
+}
+
+int mp4ff_stbl_delete(mp4ff_stbl_t *stbl)
+{
+	mp4ff_stsd_delete(&(stbl->stsd));
+	mp4ff_stts_delete(&(stbl->stts));
+	mp4ff_stss_delete(&(stbl->stss));
+	mp4ff_stsc_delete(&(stbl->stsc));
+	mp4ff_stsz_delete(&(stbl->stsz));
+	mp4ff_stco_delete(&(stbl->stco));
+	mp4ff_ctts_delete(&(stbl->ctts));
+}
+
+int mp4ff_stbl_dump(void *minf_ptr, mp4ff_stbl_t *stbl)
+{
+	printf("    sample table\n");
+	mp4ff_stsd_dump(minf_ptr, &(stbl->stsd));
+	mp4ff_stts_dump(&(stbl->stts));
+	mp4ff_stss_dump(&(stbl->stss));
+	mp4ff_stsc_dump(&(stbl->stsc));
+	mp4ff_stsz_dump(&(stbl->stsz));
+	mp4ff_stco_dump(&(stbl->stco));
+	mp4ff_ctts_dump(&(stbl->ctts));
+}
+
+int mp4ff_read_stbl(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stbl_t *stbl, mp4ff_atom_t *parent_atom)
+{
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+/* mandatory */
+		if(mp4ff_atom_is(&leaf_atom, "stsd"))
+			{ 
+				mp4ff_read_stsd(file, minf, &(stbl->stsd)); 
+/* Some codecs store extra information at the end of this */
+				mp4ff_atom_skip(file, &leaf_atom);
+			}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "stts"))
+			{ mp4ff_read_stts(file, &(stbl->stts)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "stss"))
+			{ mp4ff_read_stss(file, &(stbl->stss)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "stsc"))
+			{ mp4ff_read_stsc(file, &(stbl->stsc)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "stsz"))
+			{ mp4ff_read_stsz(file, &(stbl->stsz)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "stco"))
+			{ mp4ff_read_stco(file, &(stbl->stco)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "ctts"))
+			{ mp4ff_read_ctts(file, &(stbl->ctts)); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < parent_atom->end);
+
+	return 0;
+}
+
+int mp4ff_write_stbl(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stbl_t *stbl)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "stbl");
+
+	mp4ff_write_stsd(file, minf, &(stbl->stsd));
+	mp4ff_write_stts(file, &(stbl->stts));
+	mp4ff_write_stss(file, &(stbl->stss));
+	mp4ff_write_stsc(file, &(stbl->stsc));
+	mp4ff_write_stsz(file, &(stbl->stsz));
+	mp4ff_write_stco(file, &(stbl->stco));
+	mp4ff_write_ctts(file, &(stbl->ctts));
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+
--- /dev/null
+++ b/common/mp4ff/stco.c
@@ -1,0 +1,92 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_stco_init(mp4ff_stco_t *stco)
+{
+	stco->version = 0;
+	stco->flags = 0;
+	stco->total_entries = 0;
+	stco->entries_allocated = 0;
+}
+
+int mp4ff_stco_delete(mp4ff_stco_t *stco)
+{
+	if(stco->total_entries) free(stco->table);
+	stco->total_entries = 0;
+	stco->entries_allocated = 0;
+}
+
+int mp4ff_stco_init_common(mp4ff_t *file, mp4ff_stco_t *stco)
+{
+	if(!stco->entries_allocated)
+	{
+		stco->entries_allocated = 2000;
+		stco->total_entries = 0;
+		stco->table = (mp4ff_stco_table_t*)malloc(sizeof(mp4ff_stco_table_t) * stco->entries_allocated);
+/*printf("mp4ff_stco_init_common %x\n", stco->table); */
+	}
+}
+
+int mp4ff_stco_dump(mp4ff_stco_t *stco)
+{
+	int i;
+	printf("     chunk offset\n");
+	printf("      version %d\n", stco->version);
+	printf("      flags %d\n", stco->flags);
+	printf("      total_entries %d\n", stco->total_entries);
+	for(i = 0; i < stco->total_entries; i++)
+	{
+		printf("       offset %d %x\n", i, stco->table[i].offset);
+	}
+}
+
+int mp4ff_read_stco(mp4ff_t *file, mp4ff_stco_t *stco)
+{
+	int i;
+	stco->version = mp4ff_read_char(file);
+	stco->flags = mp4ff_read_int24(file);
+	stco->total_entries = mp4ff_read_int32(file);
+/*printf("stco->total_entries %d %x\n", stco->total_entries, stco); */
+	stco->entries_allocated = stco->total_entries;
+	stco->table = (mp4ff_stco_table_t*)malloc(sizeof(mp4ff_stco_table_t) * stco->entries_allocated);
+	for(i = 0; i < stco->total_entries; i++)
+	{
+		stco->table[i].offset = mp4ff_read_int32(file);
+	}
+}
+
+int mp4ff_write_stco(mp4ff_t *file, mp4ff_stco_t *stco)
+{
+	int i;
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "stco");
+
+	mp4ff_write_char(file, stco->version);
+	mp4ff_write_int24(file, stco->flags);
+	mp4ff_write_int32(file, stco->total_entries);
+	for(i = 0; i < stco->total_entries; i++)
+	{
+		mp4ff_write_int32(file, stco->table[i].offset);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_stco(mp4ff_stco_t *stco, long chunk, long offset)
+{
+	mp4ff_stco_table_t *new_table;
+	long i;
+
+	if(chunk > stco->entries_allocated)
+	{
+		stco->entries_allocated = chunk * 2;
+		stco->table = (mp4ff_stco_table_t*)realloc(stco->table,
+			sizeof(mp4ff_stco_table_t) * stco->entries_allocated);
+	}
+	
+	stco->table[chunk - 1].offset = offset;
+	if(chunk > stco->total_entries) 
+		stco->total_entries = chunk;
+}
+
--- /dev/null
+++ b/common/mp4ff/stsc.c
@@ -1,0 +1,146 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_stsc_init(mp4ff_stsc_t *stsc)
+{
+	stsc->version = 0;
+	stsc->flags = 0;
+	stsc->total_entries = 0;
+	stsc->entries_allocated = 0;
+}
+
+int mp4ff_stsc_init_table(mp4ff_t *file, mp4ff_stsc_t *stsc)
+{
+	if(!stsc->total_entries)
+	{
+		stsc->total_entries = 1;
+		stsc->entries_allocated = 1;
+		stsc->table = (mp4ff_stsc_table_t*)malloc(sizeof(mp4ff_stsc_table_t) * stsc->entries_allocated);
+	}
+}
+
+int mp4ff_stsc_init_video(mp4ff_t *file, mp4ff_stsc_t *stsc)
+{
+	mp4ff_stsc_table_t *table;
+	mp4ff_stsc_init_table(file, stsc);
+	table = &(stsc->table[0]);
+	table->chunk = 1;
+	table->samples = 1;
+	table->id = 1;
+}
+
+int mp4ff_stsc_init_audio(mp4ff_t *file, mp4ff_stsc_t *stsc)
+{
+	mp4ff_stsc_table_t *table;
+	mp4ff_stsc_init_table(file, stsc);
+	table = &(stsc->table[0]);
+	table->chunk = 1;
+	table->samples = 0;         /* set this after completion or after every audio chunk is written */
+	table->id = 1;
+}
+
+int mp4ff_stsc_delete(mp4ff_stsc_t *stsc)
+{
+	if(stsc->total_entries) free(stsc->table);
+	stsc->total_entries = 0;
+}
+
+int mp4ff_stsc_dump(mp4ff_stsc_t *stsc)
+{
+	int i;
+	printf("     sample to chunk\n");
+	printf("      version %d\n", stsc->version);
+	printf("      flags %d\n", stsc->flags);
+	printf("      total_entries %d\n", stsc->total_entries);
+	for(i = 0; i < stsc->total_entries; i++)
+	{
+		printf("       chunk %d samples %d id %d\n", 
+			stsc->table[i].chunk, stsc->table[i].samples, stsc->table[i].id);
+	}
+}
+
+int mp4ff_read_stsc(mp4ff_t *file, mp4ff_stsc_t *stsc)
+{
+	int i;
+	stsc->version = mp4ff_read_char(file);
+	stsc->flags = mp4ff_read_int24(file);
+	stsc->total_entries = mp4ff_read_int32(file);
+	
+	stsc->entries_allocated = stsc->total_entries;
+	stsc->table = (mp4ff_stsc_table_t*)malloc(sizeof(mp4ff_stsc_table_t) * stsc->total_entries);
+	for(i = 0; i < stsc->total_entries; i++)
+	{
+		stsc->table[i].chunk = mp4ff_read_int32(file);
+		stsc->table[i].samples = mp4ff_read_int32(file);
+		stsc->table[i].id = mp4ff_read_int32(file);
+	}
+}
+
+
+int mp4ff_write_stsc(mp4ff_t *file, mp4ff_stsc_t *stsc)
+{
+	int i, last_same;
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "stsc");
+
+	for(i = 1, last_same = 0; i < stsc->total_entries; i++)
+	{
+		if(stsc->table[i].samples != stsc->table[last_same].samples)
+		{
+/* An entry has a different sample count. */
+			last_same++;
+			if(last_same < i)
+			{
+/* Move it up the list. */
+				stsc->table[last_same] = stsc->table[i];
+			}
+		}
+	}
+	last_same++;
+	stsc->total_entries = last_same;
+
+
+	mp4ff_write_char(file, stsc->version);
+	mp4ff_write_int24(file, stsc->flags);
+	mp4ff_write_int32(file, stsc->total_entries);
+	for(i = 0; i < stsc->total_entries; i++)
+	{
+		mp4ff_write_int32(file, stsc->table[i].chunk);
+		mp4ff_write_int32(file, stsc->table[i].samples);
+		mp4ff_write_int32(file, stsc->table[i].id);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_stsc(mp4ff_stsc_t *stsc, long chunk, long samples)
+{
+/*	mp4ff_stsc_table_t *table = stsc->table; */
+	mp4ff_stsc_table_t *new_table;
+	long i;
+
+	if(chunk > stsc->entries_allocated)
+	{
+		stsc->entries_allocated = chunk * 2;
+		new_table = (mp4ff_stsc_table_t*)malloc(sizeof(mp4ff_stsc_table_t) * stsc->entries_allocated);
+		for(i = 0; i < stsc->total_entries; i++) new_table[i] = stsc->table[i];
+		free(stsc->table);
+		stsc->table = new_table;
+	}
+
+	stsc->table[chunk - 1].samples = samples;
+	stsc->table[chunk - 1].chunk = chunk;
+	stsc->table[chunk - 1].id = 1;
+	if(chunk > stsc->total_entries) stsc->total_entries = chunk;
+	return 0;
+}
+
+/* Optimizing while writing doesn't allow seeks during recording so */
+/* entries are created for every chunk and only optimized during */
+/* writeout.  Unfortunately there's no way to keep audio synchronized */
+/* after overwriting  a recording as the fractional audio chunk in the */
+/* middle always overwrites the previous location of a larger chunk.  On */
+/* writing, the table must be optimized.  RealProducer requires an  */
+/* optimized table. */
+
--- /dev/null
+++ b/common/mp4ff/stsd.c
@@ -1,0 +1,117 @@
+#include "mp4ff.h"
+
+
+int mp4ff_stsd_init(mp4ff_stsd_t *stsd)
+{
+	stsd->version = 0;
+	stsd->flags = 0;
+	stsd->total_entries = 0;
+}
+
+int mp4ff_stsd_init_table(mp4ff_stsd_t *stsd)
+{
+	if(!stsd->total_entries)
+	{
+		stsd->total_entries = 1;
+		stsd->table = (mp4ff_stsd_table_t*)malloc(sizeof(mp4ff_stsd_table_t) * stsd->total_entries);
+		mp4ff_stsd_table_init(&(stsd->table[0]));
+	}
+}
+
+int mp4ff_stsd_init_video(mp4ff_t *file, 
+								mp4ff_stsd_t *stsd, 
+								int frame_w,
+								int frame_h, 
+								float frame_rate,
+								char *compression)
+{
+	mp4ff_stsd_table_t *table;
+	mp4ff_stsd_init_table(stsd);
+	table = &(stsd->table[0]);
+
+	mp4ff_copy_char32(table->format, compression);
+	table->width = frame_w;
+	table->height = frame_h;
+	table->frames_per_sample = 1;
+	table->depth = 24;
+}
+
+int mp4ff_stsd_init_audio(mp4ff_t *file, 
+							mp4ff_stsd_t *stsd, 
+							int channels,
+							int sample_rate, 
+							int bits, 
+							char *compressor)
+{
+	mp4ff_stsd_table_t *table;
+	mp4ff_stsd_init_table(stsd);
+	table = &(stsd->table[0]);
+
+	mp4ff_copy_char32(table->format, compressor);
+	table->channels = channels;
+	table->sample_size = bits;
+	table->sample_rate = sample_rate;
+}
+
+int mp4ff_stsd_delete(mp4ff_stsd_t *stsd)
+{
+	int i;
+	if(stsd->total_entries)
+	{
+		for(i = 0; i < stsd->total_entries; i++)
+			mp4ff_stsd_table_delete(&(stsd->table[i]));
+		free(stsd->table);
+	}
+
+	stsd->total_entries = 0;
+}
+
+int mp4ff_stsd_dump(void *minf_ptr, mp4ff_stsd_t *stsd)
+{
+	int i;
+	printf("     sample description\n");
+	printf("      version %d\n", stsd->version);
+	printf("      flags %d\n", stsd->flags);
+	printf("      total_entries %d\n", stsd->total_entries);
+	
+	for(i = 0; i < stsd->total_entries; i++)
+	{
+		mp4ff_stsd_table_dump(minf_ptr, &(stsd->table[i]));
+	}
+}
+
+int mp4ff_read_stsd(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stsd_t *stsd)
+{
+	int i;
+	mp4ff_atom_t leaf_atom;
+
+	stsd->version = mp4ff_read_char(file);
+	stsd->flags = mp4ff_read_int24(file);
+	stsd->total_entries = mp4ff_read_int32(file);
+	stsd->table = (mp4ff_stsd_table_t*)malloc(sizeof(mp4ff_stsd_table_t) * stsd->total_entries);
+	for(i = 0; i < stsd->total_entries; i++)
+	{
+		mp4ff_stsd_table_init(&(stsd->table[i]));
+		mp4ff_read_stsd_table(file, minf, &(stsd->table[i]));
+	}
+}
+
+int mp4ff_write_stsd(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stsd_t *stsd)
+{
+	mp4ff_atom_t atom;
+	int i;
+	mp4ff_atom_write_header(file, &atom, "stsd");
+
+	mp4ff_write_char(file, stsd->version);
+	mp4ff_write_int24(file, stsd->flags);
+	mp4ff_write_int32(file, stsd->total_entries);
+	for(i = 0; i < stsd->total_entries; i++)
+	{
+		mp4ff_write_stsd_table(file, minf, stsd->table);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+
+
--- /dev/null
+++ b/common/mp4ff/stsdtable.c
@@ -1,0 +1,253 @@
+#include "mp4ff.h"
+
+
+int mp4ff_stsd_table_init(mp4ff_stsd_table_t *table)
+{
+	int i;
+	table->format[0] = 'y';
+	table->format[1] = 'u';
+	table->format[2] = 'v';
+	table->format[3] = '2';
+	for(i = 0; i < 6; i++) table->reserved[i] = 0;
+	table->data_reference = 1;
+
+	table->version = 0;
+	table->revision = 0;
+ 	table->vendor[0] = 'l';
+ 	table->vendor[1] = 'n';
+ 	table->vendor[2] = 'u';
+ 	table->vendor[3] = 'x';
+
+	table->temporal_quality = 0;
+	table->spatial_quality = 258;
+	table->width = 0;
+	table->height = 0;
+	table->dpi_horizontal = 72;
+	table->dpi_vertical = 72;
+	table->data_size = 0;
+	table->frames_per_sample = 1;
+	for(i = 0; i < 32; i++) table->compressor_name[i] = 0;
+	sprintf(table->compressor_name, "Quicktime for Linux");
+	table->depth = 24;
+	table->gamma = 0;
+	table->fields = 0;
+	table->field_dominance = 1;
+	
+	table->channels = 0;
+	table->sample_size = 0;
+	table->compression_id = 0;
+	table->packet_size = 0;
+	table->sample_rate = 0;
+
+	mp4ff_esds_init(&(table->esds));
+}
+
+int mp4ff_stsd_table_delete(mp4ff_stsd_table_t *table)
+{
+	mp4ff_esds_delete(&(table->esds));
+}
+
+int mp4ff_stsd_table_dump(void *minf_ptr, mp4ff_stsd_table_t *table)
+{
+	mp4ff_minf_t *minf = minf_ptr;
+	printf("       format %c%c%c%c\n", table->format[0], table->format[1], table->format[2], table->format[3]);
+	mp4ff_print_chars("       reserved ", table->reserved, 6);
+	printf("       data_reference %d\n", table->data_reference);
+
+	if(minf->is_audio) mp4ff_stsd_audio_dump(table);
+	if(minf->is_video) mp4ff_stsd_video_dump(table);
+}
+
+int mp4ff_stsd_audio_dump(mp4ff_stsd_table_t *table)
+{
+	printf("       version %d\n", table->version);
+	printf("       revision %d\n", table->revision);
+	printf("       vendor %c%c%c%c\n", table->vendor[0], table->vendor[1], table->vendor[2], table->vendor[3]);
+	printf("       channels %d\n", table->channels);
+	printf("       sample_size %d\n", table->sample_size);
+	printf("       compression_id %d\n", table->compression_id);
+	printf("       packet_size %d\n", table->packet_size);
+	printf("       sample_rate %f\n", table->sample_rate);
+
+	mp4ff_esds_dump(&(table->esds));
+}
+
+int mp4ff_stsd_video_dump(mp4ff_stsd_table_t *table)
+{
+	printf("       version %d\n", table->version);
+	printf("       revision %d\n", table->revision);
+	printf("       vendor %c%c%c%c\n", table->vendor[0], table->vendor[1], table->vendor[2], table->vendor[3]);
+	printf("       temporal_quality %ld\n", table->temporal_quality);
+	printf("       spatial_quality %ld\n", table->spatial_quality);
+	printf("       width %d\n", table->width);
+	printf("       height %d\n", table->height);
+	printf("       dpi_horizontal %f\n", table->dpi_horizontal);
+	printf("       dpi_vertical %f\n", table->dpi_vertical);
+	printf("       data_size %ld\n", table->data_size);
+	printf("       frames_per_sample %d\n", table->frames_per_sample);
+	printf("       compressor_name %s\n", table->compressor_name);
+	printf("       depth %d\n", table->depth);
+	printf("       gamma %f\n", table->gamma);
+	if(table->fields)
+	{
+		printf("       fields %d\n", table->fields);
+		printf("       field dominance %d\n", table->field_dominance);
+	}
+	mp4ff_esds_dump(&(table->esds));
+}
+
+int mp4ff_read_stsd_table(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stsd_table_t *table)
+{
+	mp4ff_atom_t leaf_atom;
+
+	mp4ff_atom_read_header(file, &leaf_atom);
+	
+	table->format[0] = leaf_atom.type[0];
+	table->format[1] = leaf_atom.type[1];
+	table->format[2] = leaf_atom.type[2];
+	table->format[3] = leaf_atom.type[3];
+	mp4ff_read_data(file, table->reserved, 6);
+	table->data_reference = mp4ff_read_int16(file);
+
+	if(minf->is_audio) mp4ff_read_stsd_audio(file, table, &leaf_atom);
+	if(minf->is_video) mp4ff_read_stsd_video(file, table, &leaf_atom);
+}
+
+int mp4ff_write_stsd_table(mp4ff_t *file, mp4ff_minf_t *minf, mp4ff_stsd_table_t *table)
+{
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, table->format);
+/*printf("mp4ff_write_stsd_table %c%c%c%c\n", table->format[0], table->format[1], table->format[2], table->format[3]); */
+	mp4ff_write_data(file, table->reserved, 6);
+	mp4ff_write_int16(file, table->data_reference);
+	
+	if(minf->is_audio) mp4ff_write_stsd_audio(file, table);
+	if(minf->is_video) mp4ff_write_stsd_video(file, table);
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_read_stsd_audio(mp4ff_t *file, mp4ff_stsd_table_t *table, mp4ff_atom_t *parent_atom)
+{
+	table->version = mp4ff_read_int16(file);
+	table->revision = mp4ff_read_int16(file);
+	mp4ff_read_data(file, table->vendor, 4);
+	table->channels = mp4ff_read_int16(file);
+	table->sample_size = mp4ff_read_int16(file);
+	table->compression_id = mp4ff_read_int16(file);
+	table->packet_size = mp4ff_read_int16(file);
+	table->sample_rate = mp4ff_read_fixed32(file);
+
+	while (mp4ff_position(file) < parent_atom->end) {
+		mp4ff_atom_t leaf_atom;
+
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+		if(mp4ff_atom_is(&leaf_atom, "esds")) {
+			mp4ff_read_esds(file, &(table->esds));
+			mp4ff_atom_skip(file, &leaf_atom);
+		} else {
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+	}
+}
+
+int mp4ff_write_stsd_audio(mp4ff_t *file, mp4ff_stsd_table_t *table)
+{
+	mp4ff_write_int32(file, 0);
+	mp4ff_write_int32(file, 0);
+	mp4ff_write_int16(file, 2);
+	mp4ff_write_int16(file, 16);
+	mp4ff_write_int32(file, 0);
+	mp4ff_write_int16(file, table->sample_rate);
+	mp4ff_write_int16(file, 0);
+	mp4ff_write_esds_audio(file, &(table->esds), file->atracks[0].track->tkhd.track_id);
+}
+
+int mp4ff_read_stsd_video(mp4ff_t *file, mp4ff_stsd_table_t *table, mp4ff_atom_t *parent_atom)
+{
+	mp4ff_atom_t leaf_atom;
+	int len;
+	
+	table->version = mp4ff_read_int16(file);
+	table->revision = mp4ff_read_int16(file);
+	mp4ff_read_data(file, table->vendor, 4);
+	table->temporal_quality = mp4ff_read_int32(file);
+	table->spatial_quality = mp4ff_read_int32(file);
+	table->width = mp4ff_read_int16(file);
+	table->height = mp4ff_read_int16(file);
+	table->dpi_horizontal = mp4ff_read_fixed32(file);
+	table->dpi_vertical = mp4ff_read_fixed32(file);
+	table->data_size = mp4ff_read_int32(file);
+	table->frames_per_sample = mp4ff_read_int16(file);
+	len = mp4ff_read_char(file);
+	mp4ff_read_data(file, table->compressor_name, 31);
+	table->depth = mp4ff_read_int16(file);
+		
+	while(mp4ff_position(file) < parent_atom->end)
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+		
+		if(mp4ff_atom_is(&leaf_atom, "gama"))
+		{
+			table->gamma= mp4ff_read_fixed32(file);
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "fiel"))
+		{
+			table->fields = mp4ff_read_char(file);
+			table->field_dominance = mp4ff_read_char(file);
+		}
+		else
+/* 		if(mp4ff_atom_is(&leaf_atom, "mjqt")) */
+/* 		{ */
+/* 			mp4ff_read_mjqt(file, &(table->mjqt)); */
+/* 		} */
+/* 		else */
+/* 		if(mp4ff_atom_is(&leaf_atom, "mjht")) */
+/* 		{ */
+/* 			mp4ff_read_mjht(file, &(table->mjht)); */
+/* 		} */
+/* 		else */
+		if(mp4ff_atom_is(&leaf_atom, "esds"))
+		{
+			mp4ff_read_esds(file, &(table->esds));
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+		else
+		{
+			mp4ff_atom_skip(file, &leaf_atom);
+		}
+	}
+}
+
+int mp4ff_write_stsd_video(mp4ff_t *file, mp4ff_stsd_table_t *table)
+{
+	int i;
+
+	for (i = 0; i < 4; i++) {
+		mp4ff_write_int32(file, 0);
+	}
+	mp4ff_write_int16(file, table->width);
+	mp4ff_write_int16(file, table->height);
+	mp4ff_write_int32(file, 0x00480000);
+	mp4ff_write_int32(file, 0x00480000);
+	mp4ff_write_int32(file, 0);
+	mp4ff_write_int16(file, 1);
+	for (i = 0; i < 32; i++) {
+		mp4ff_write_char(file, 0);
+	}
+	mp4ff_write_int16(file, 24);
+	mp4ff_write_int16(file, -1);
+	mp4ff_write_esds_video(file, &(table->esds), file->vtracks[0].track->tkhd.track_id);
+
+	if(table->fields)
+	{
+		mp4ff_atom_t atom;
+
+		mp4ff_atom_write_header(file, &atom, "fiel");
+		mp4ff_write_char(file, table->fields);
+		mp4ff_write_char(file, table->field_dominance);
+		mp4ff_atom_write_footer(file, &atom);
+	}
+}
--- /dev/null
+++ b/common/mp4ff/stss.c
@@ -1,0 +1,87 @@
+#include "mp4ff.h"
+
+
+int mp4ff_stss_init(mp4ff_stss_t *stss)
+{
+	stss->version = 0;
+	stss->flags = 0;
+	stss->total_entries = 0;
+	stss->entries_allocated = 0;
+}
+
+int mp4ff_stss_init_common(mp4ff_t *file, mp4ff_stss_t *stss)
+{
+	if (stss->entries_allocated == 0) {
+		stss->entries_allocated = 100;
+		stss->table = (mp4ff_stss_table_t*)
+			malloc(sizeof(mp4ff_stss_table_t) * stss->entries_allocated);
+	}
+}
+
+int mp4ff_stss_delete(mp4ff_stss_t *stss)
+{
+	if(stss->total_entries) 
+		free(stss->table);
+	stss->total_entries = 0;
+}
+
+int mp4ff_stss_dump(mp4ff_stss_t *stss)
+{
+	int i;
+	printf("     sync sample\n");
+	printf("      version %d\n", stss->version);
+	printf("      flags %d\n", stss->flags);
+	printf("      total_entries %d\n", stss->total_entries);
+	for(i = 0; i < stss->total_entries; i++)
+	{
+		printf("       sample %u\n", stss->table[i].sample);
+	}
+}
+
+int mp4ff_read_stss(mp4ff_t *file, mp4ff_stss_t *stss)
+{
+	int i;
+	stss->version = mp4ff_read_char(file);
+	stss->flags = mp4ff_read_int24(file);
+	stss->total_entries = mp4ff_read_int32(file);
+	
+	stss->table = (mp4ff_stss_table_t*)malloc(sizeof(mp4ff_stss_table_t) * stss->total_entries);
+	for(i = 0; i < stss->total_entries; i++)
+	{
+		stss->table[i].sample = mp4ff_read_int32(file);
+	}
+}
+
+
+int mp4ff_write_stss(mp4ff_t *file, mp4ff_stss_t *stss)
+{
+	int i;
+	mp4ff_atom_t atom;
+
+	if(stss->total_entries)
+	{
+		mp4ff_atom_write_header(file, &atom, "stss");
+
+		mp4ff_write_char(file, stss->version);
+		mp4ff_write_int24(file, stss->flags);
+		mp4ff_write_int32(file, stss->total_entries);
+		for(i = 0; i < stss->total_entries; i++)
+		{
+			mp4ff_write_int32(file, stss->table[i].sample);
+		}
+
+		mp4ff_atom_write_footer(file, &atom);
+	}
+}
+
+int mp4ff_update_stss(mp4ff_stss_t *stss, long sample)
+{
+	if (stss->total_entries >= stss->entries_allocated) {
+		stss->entries_allocated *= 2;
+		stss->table = (mp4ff_stss_table_t*)realloc(stss->table,
+			sizeof(mp4ff_stss_table_t) * stss->entries_allocated);
+	}
+	
+	stss->table[stss->total_entries++].sample = sample;
+}
+
--- /dev/null
+++ b/common/mp4ff/stsz.c
@@ -1,0 +1,137 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_stsz_init(mp4ff_stsz_t *stsz)
+{
+	stsz->version = 0;
+	stsz->flags = 0;
+	stsz->sample_size = 0;
+	stsz->total_entries = 0;
+	stsz->entries_allocated = 0;
+}
+
+int mp4ff_stsz_init_video(mp4ff_t *file, mp4ff_stsz_t *stsz)
+{
+	stsz->sample_size = 0;
+	if(!stsz->entries_allocated)
+	{
+		stsz->entries_allocated = 2000;
+		stsz->total_entries = 0;
+		stsz->table = (mp4ff_stsz_table_t*)malloc(sizeof(mp4ff_stsz_table_t) * stsz->entries_allocated);
+	}
+}
+
+int mp4ff_stsz_init_audio(mp4ff_t *file, mp4ff_stsz_t *stsz, int sample_size)
+{
+	stsz->sample_size = sample_size;	/* if == 0, then use table */
+	stsz->total_entries = 0;   /* set this when closing */
+	stsz->entries_allocated = 0;
+}
+
+int mp4ff_stsz_delete(mp4ff_stsz_t *stsz)
+{
+	if(!stsz->sample_size && stsz->total_entries) 
+		free(stsz->table);
+	stsz->total_entries = 0;
+	stsz->entries_allocated = 0;
+}
+
+int mp4ff_stsz_dump(mp4ff_stsz_t *stsz)
+{
+	int i;
+	printf("     sample size\n");
+	printf("      version %d\n", stsz->version);
+	printf("      flags %d\n", stsz->flags);
+	printf("      sample_size %d\n", stsz->sample_size);
+	printf("      total_entries %d\n", stsz->total_entries);
+	
+	if(!stsz->sample_size)
+	{
+		for(i = 0; i < stsz->total_entries; i++)
+		{
+			printf("       sample_size %d\n", stsz->table[i].size);
+		}
+	}
+}
+
+int mp4ff_read_stsz(mp4ff_t *file, mp4ff_stsz_t *stsz)
+{
+	int i;
+	stsz->version = mp4ff_read_char(file);
+	stsz->flags = mp4ff_read_int24(file);
+	stsz->sample_size = mp4ff_read_int32(file);
+	stsz->total_entries = mp4ff_read_int32(file);
+	stsz->entries_allocated = stsz->total_entries;
+	if(!stsz->sample_size)
+	{
+		stsz->table = (mp4ff_stsz_table_t*)malloc(sizeof(mp4ff_stsz_table_t) * stsz->entries_allocated);
+		for(i = 0; i < stsz->total_entries; i++)
+		{
+			stsz->table[i].size = mp4ff_read_int32(file);
+		}
+	}
+}
+
+int mp4ff_write_stsz(mp4ff_t *file, mp4ff_stsz_t *stsz)
+{
+	int i, result;
+	mp4ff_atom_t atom;
+
+	mp4ff_atom_write_header(file, &atom, "stsz");
+
+/* optimize if possible */
+/* Xanim requires an unoptimized table for video. */
+/* 	if(!stsz->sample_size) */
+/* 	{ */
+/* 		for(i = 0, result = 0; i < stsz->total_entries && !result; i++) */
+/* 		{ */
+/* 			if(stsz->table[i].size != stsz->table[0].size) result = 1; */
+/* 		} */
+/* 		 */
+/* 		if(!result) */
+/* 		{ */
+/* 			stsz->sample_size = stsz->table[0].size; */
+/* 			stsz->total_entries = 0; */
+/* 			free(stsz->table); */
+/* 		} */
+/* 	} */
+
+	mp4ff_write_char(file, stsz->version);
+	mp4ff_write_int24(file, stsz->flags);
+	mp4ff_write_int32(file, stsz->sample_size);
+	if(stsz->sample_size)
+	{
+		mp4ff_write_int32(file, stsz->total_entries);
+	}
+	else
+	{
+		mp4ff_write_int32(file, stsz->total_entries);
+		for(i = 0; i < stsz->total_entries; i++)
+		{
+			mp4ff_write_int32(file, stsz->table[i].size);
+		}
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_stsz(mp4ff_stsz_t *stsz, long sample, long sample_size)
+{
+	mp4ff_stsz_table_t *new_table;
+	int i;
+
+	if(!stsz->sample_size)
+	{
+		if(sample >= stsz->entries_allocated)
+		{
+			stsz->entries_allocated = sample * 2;
+			stsz->table = (mp4ff_stsz_table_t *)realloc(stsz->table,
+				sizeof(mp4ff_stsz_table_t) * stsz->entries_allocated);
+		}
+
+		stsz->table[sample].size = sample_size;
+		if(sample >= stsz->total_entries) 
+			stsz->total_entries = sample + 1;
+	}
+}
--- /dev/null
+++ b/common/mp4ff/stts.c
@@ -1,0 +1,113 @@
+#include "mp4ff.h"
+
+
+
+int mp4ff_stts_init(mp4ff_stts_t *stts)
+{
+	stts->version = 0;
+	stts->flags = 0;
+	stts->total_entries = 0;
+	stts->entries_allocated = 0;
+}
+
+int mp4ff_stts_init_table(mp4ff_stts_t *stts)
+{
+	if(!stts->entries_allocated)
+	{
+		stts->entries_allocated = 1;
+		stts->table = (mp4ff_stts_table_t*)
+			malloc(sizeof(mp4ff_stts_table_t) * stts->entries_allocated);
+		stts->total_entries = 1;
+	}
+}
+
+int mp4ff_stts_init_video(mp4ff_t *file, mp4ff_stts_t *stts, int time_scale, float frame_rate)
+{
+	mp4ff_stts_table_t *table;
+	mp4ff_stts_init_table(stts);
+	table = &(stts->table[0]);
+
+	table->sample_count = 0;      /* need to set this when closing */
+	table->sample_duration = time_scale / frame_rate;
+}
+
+int mp4ff_stts_init_audio(mp4ff_t *file, mp4ff_stts_t *stts, int time_scale, int sample_duration)
+{
+	mp4ff_stts_table_t *table;
+	mp4ff_stts_init_table(stts);
+	table = &(stts->table[0]);
+
+	table->sample_count = 0;     /* need to set this when closing or via update function */
+	table->sample_duration = sample_duration;
+}
+
+int mp4ff_stts_delete(mp4ff_stts_t *stts)
+{
+	if(stts->total_entries) free(stts->table);
+	stts->total_entries = 0;
+}
+
+int mp4ff_stts_dump(mp4ff_stts_t *stts)
+{
+	int i;
+	printf("     time to sample\n");
+	printf("      version %d\n", stts->version);
+	printf("      flags %d\n", stts->flags);
+	printf("      total_entries %d\n", stts->total_entries);
+	for(i = 0; i < stts->total_entries; i++)
+	{
+		printf("       count %ld duration %ld\n", stts->table[i].sample_count, stts->table[i].sample_duration);
+	}
+}
+
+int mp4ff_read_stts(mp4ff_t *file, mp4ff_stts_t *stts)
+{
+	int i;
+	stts->version = mp4ff_read_char(file);
+	stts->flags = mp4ff_read_int24(file);
+	stts->total_entries = mp4ff_read_int32(file);
+
+	stts->table = (mp4ff_stts_table_t*)malloc(sizeof(mp4ff_stts_table_t) * stts->total_entries);
+	for(i = 0; i < stts->total_entries; i++)
+	{
+		stts->table[i].sample_count = mp4ff_read_int32(file);
+		stts->table[i].sample_duration = mp4ff_read_int32(file);
+	}
+}
+
+int mp4ff_write_stts(mp4ff_t *file, mp4ff_stts_t *stts)
+{
+	int i;
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "stts");
+
+	mp4ff_write_char(file, stts->version);
+	mp4ff_write_int24(file, stts->flags);
+	mp4ff_write_int32(file, stts->total_entries);
+	for(i = 0; i < stts->total_entries; i++)
+	{
+		mp4ff_write_int32(file, stts->table[i].sample_count);
+		mp4ff_write_int32(file, stts->table[i].sample_duration);
+	}
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+int mp4ff_update_stts(mp4ff_stts_t *stts, long sample_duration)
+{
+	if (sample_duration == stts->table[stts->total_entries-1].sample_duration) {
+		stts->table[stts->total_entries-1].sample_count++;
+	} else {
+		/* need a new entry in the table */
+
+		/* allocate more entries if necessary */
+		if (stts->total_entries >= stts->entries_allocated) {
+			stts->entries_allocated *= 2;
+			stts->table = (mp4ff_stts_table_t*)realloc(stts->table,
+				sizeof(mp4ff_stts_table_t) * stts->entries_allocated);
+		}
+	
+		stts->table[stts->total_entries].sample_count = 1;
+		stts->table[stts->total_entries].sample_duration = sample_duration;
+		stts->total_entries++;
+	}
+}
--- /dev/null
+++ b/common/mp4ff/tkhd.c
@@ -1,0 +1,136 @@
+#include "mp4ff.h"
+
+
+int mp4ff_tkhd_init(mp4ff_tkhd_t *tkhd)
+{
+	int i;
+	tkhd->version = 0;
+	tkhd->flags = 15;
+	tkhd->creation_time = mp4ff_current_time();
+	tkhd->modification_time = mp4ff_current_time();
+	tkhd->track_id;
+	tkhd->reserved1 = 0;
+	tkhd->duration = 0;      /* need to set this when closing */
+	for(i = 0; i < 8; i++) tkhd->reserved2[i] = 0;
+	tkhd->layer = 0;
+	tkhd->alternate_group = 0;
+	tkhd->volume = 0.996094;
+	tkhd->reserved3 = 0;
+	mp4ff_matrix_init(&(tkhd->matrix));
+	tkhd->track_width = 0;
+	tkhd->track_height = 0;
+	tkhd->is_audio = FALSE;
+	tkhd->is_video = FALSE;
+	return 0;
+}
+
+int mp4ff_tkhd_init_audio(mp4ff_t *file, 
+								mp4ff_tkhd_t *tkhd)
+{
+	tkhd->is_audio = TRUE;
+}
+
+int mp4ff_tkhd_init_video(mp4ff_t *file, 
+								mp4ff_tkhd_t *tkhd, 
+								int frame_w, 
+								int frame_h)
+{
+	tkhd->is_video = TRUE;
+	tkhd->track_width = frame_w;
+	tkhd->track_height = frame_h;
+	tkhd->volume = 0;
+}
+
+int mp4ff_tkhd_delete(mp4ff_tkhd_t *tkhd)
+{
+	return 0;
+}
+
+int mp4ff_tkhd_dump(mp4ff_tkhd_t *tkhd)
+{
+	printf("  track header\n");
+	printf("   version %d\n", tkhd->version);
+	printf("   flags %ld\n", tkhd->flags);
+	printf("   creation_time %u\n", tkhd->creation_time);
+	printf("   modification_time %u\n", tkhd->modification_time);
+	printf("   track_id %d\n", tkhd->track_id);
+	printf("   reserved1 %ld\n", tkhd->reserved1);
+	printf("   duration %ld\n", tkhd->duration);
+	mp4ff_print_chars("   reserved2 ", tkhd->reserved2, 8);
+	printf("   layer %d\n", tkhd->layer);
+	printf("   alternate_group %d\n", tkhd->alternate_group);
+	printf("   volume %f\n", tkhd->volume);
+	printf("   reserved3 %d\n", tkhd->reserved3);
+	mp4ff_matrix_dump(&(tkhd->matrix));
+	printf("   track_width %f\n", tkhd->track_width);
+	printf("   track_height %f\n", tkhd->track_height);
+}
+
+int mp4ff_read_tkhd(mp4ff_t *file, mp4ff_tkhd_t *tkhd)
+{
+	tkhd->version = mp4ff_read_char(file);
+	tkhd->flags = mp4ff_read_int24(file);
+	tkhd->creation_time = mp4ff_read_int32(file);
+	tkhd->modification_time = mp4ff_read_int32(file);
+	tkhd->track_id = mp4ff_read_int32(file);
+	tkhd->reserved1 = mp4ff_read_int32(file);
+	tkhd->duration = mp4ff_read_int32(file);
+	mp4ff_read_data(file, tkhd->reserved2, 8);
+	tkhd->layer = mp4ff_read_int16(file);
+	tkhd->alternate_group = mp4ff_read_int16(file);
+	tkhd->volume = mp4ff_read_fixed16(file);
+	tkhd->reserved3 = mp4ff_read_int16(file);
+	mp4ff_read_matrix(file, &(tkhd->matrix));
+	tkhd->track_width = mp4ff_read_fixed32(file);
+	tkhd->track_height = mp4ff_read_fixed32(file);
+}
+
+int mp4ff_write_tkhd(mp4ff_t *file, mp4ff_tkhd_t *tkhd)
+{
+	int i;
+
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "tkhd");
+
+	mp4ff_write_char(file, tkhd->version);
+	if (tkhd->flags != 0) {
+		mp4ff_write_int24(file, 1);
+	} else {
+		mp4ff_write_int24(file, tkhd->flags);
+	}
+	mp4ff_write_int32(file, tkhd->creation_time);
+	mp4ff_write_int32(file, tkhd->modification_time);
+	mp4ff_write_int32(file, tkhd->track_id);
+	mp4ff_write_int32(file, tkhd->reserved1);
+	mp4ff_write_int32(file, tkhd->duration);
+
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	if (tkhd->is_audio) {
+		mp4ff_write_int16(file, 0x0100);
+	} else {
+		mp4ff_write_int16(file, 0x0000);
+	}
+	mp4ff_write_int16(file, 0x0000);
+	mp4ff_write_int32(file, 0x00010000);
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	mp4ff_write_int32(file, 0x00010000);
+	for (i = 0; i < 3; i++) {
+		mp4ff_write_int32(file, 0x00000000);
+	}
+	mp4ff_write_int32(file, 0x40000000);
+	if (tkhd->is_video) {
+		mp4ff_write_int32(file, 0x01400000);
+		mp4ff_write_int32(file, 0x00F00000);
+	} else {
+		mp4ff_write_int32(file, 0x00000000);
+		mp4ff_write_int32(file, 0x00000000);
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
+
--- /dev/null
+++ b/common/mp4ff/trak.c
@@ -1,0 +1,503 @@
+#include "mp4ff.h"
+
+
+
+
+int mp4ff_trak_init(mp4ff_trak_t *trak)
+{
+	mp4ff_tkhd_init(&(trak->tkhd));
+	mp4ff_edts_init(&(trak->edts));
+	mp4ff_mdia_init(&(trak->mdia));
+	return 0;
+}
+
+int mp4ff_trak_init_video(mp4ff_t *file, 
+							mp4ff_trak_t *trak, 
+							int frame_w, 
+							int frame_h, 
+							float frame_rate,
+							int time_scale,
+							char *compressor)
+{
+	mp4ff_tkhd_init_video(file, &(trak->tkhd), frame_w, frame_h);
+	mp4ff_mdia_init_video(file, &(trak->mdia), frame_w, frame_h, 
+		frame_rate, time_scale, compressor);
+	mp4ff_edts_init_table(&(trak->edts));
+
+	return 0;
+}
+
+int mp4ff_trak_init_audio(mp4ff_t *file, 
+							mp4ff_trak_t *trak, 
+							int channels, 
+							int sample_rate, 
+							int bits, 
+							int sample_size,
+							int time_scale,
+							int sample_duration,
+							char *compressor)
+{
+	mp4ff_mdia_init_audio(file, &(trak->mdia), channels, sample_rate, bits,
+		sample_size, time_scale, sample_duration, compressor);
+	mp4ff_edts_init_table(&(trak->edts));
+
+	return 0;
+}
+
+int mp4ff_trak_delete(mp4ff_trak_t *trak)
+{
+	mp4ff_tkhd_delete(&(trak->tkhd));
+	return 0;
+}
+
+
+int mp4ff_trak_dump(mp4ff_trak_t *trak)
+{
+	printf(" track\n");
+	mp4ff_tkhd_dump(&(trak->tkhd));
+	mp4ff_edts_dump(&(trak->edts));
+	mp4ff_mdia_dump(&(trak->mdia));
+
+	return 0;
+}
+
+
+mp4ff_trak_t* mp4ff_add_trak(mp4ff_moov_t *moov)
+{
+	if(moov->total_tracks < MAXTRACKS)
+	{
+		moov->trak[moov->total_tracks] = malloc(sizeof(mp4ff_trak_t));
+		mp4ff_trak_init(moov->trak[moov->total_tracks]);
+		moov->total_tracks++;
+	}
+	return moov->trak[moov->total_tracks - 1];
+}
+
+mp4ff_trak_t* mp4ff_find_track_by_id(mp4ff_moov_t *moov, int trackId)
+{
+	int i;
+
+	for (i = 0; i < moov->total_tracks; i++) {
+		if (moov->trak[i]->tkhd.track_id == trackId) {
+			return moov->trak[i];
+		}
+	}
+	
+	return NULL;
+}
+
+int mp4ff_delete_trak(mp4ff_moov_t *moov, mp4ff_trak_t *trak)
+{
+	int i, j;
+
+	for (i = 0; i < moov->total_tracks; i++) {
+		if (moov->trak[i] == trak) {
+			mp4ff_trak_delete(trak);
+			free(trak);
+			moov->trak[i] = NULL;
+			for (j = i + 1; j < moov->total_tracks; j++, i++) {
+				moov->trak[i] = moov->trak[j];
+			}
+			moov->trak[j] = NULL;
+			moov->total_tracks--;
+			return 0;
+		}
+	}
+	return -1;
+}
+
+
+int mp4ff_read_trak(mp4ff_t *file, mp4ff_trak_t *trak, mp4ff_atom_t *trak_atom)
+{
+	mp4ff_atom_t leaf_atom;
+
+	do
+	{
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+/* mandatory */
+		if(mp4ff_atom_is(&leaf_atom, "tkhd"))
+			{ mp4ff_read_tkhd(file, &(trak->tkhd)); }
+		else
+		if(mp4ff_atom_is(&leaf_atom, "mdia"))
+			{ mp4ff_read_mdia(file, &(trak->mdia), &leaf_atom); }
+		else
+/* optional */
+		if(mp4ff_atom_is(&leaf_atom, "edts"))
+			{ mp4ff_read_edts(file, &(trak->edts), &leaf_atom); }
+		else
+			mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < trak_atom->end);
+
+	return 0;
+}
+
+int mp4ff_write_trak(mp4ff_t *file, mp4ff_trak_t *trak, long moov_time_scale)
+{
+	long duration;
+	long timescale;
+	mp4ff_atom_t atom;
+	mp4ff_atom_write_header(file, &atom, "trak");
+	mp4ff_trak_duration(trak, &duration, &timescale);
+
+	/* printf("mp4ff_write_trak duration %d\n", duration); */
+
+	/* get duration in movie's units */
+	if (timescale) {
+		trak->tkhd.duration = 
+			(long)((float)duration / timescale * moov_time_scale);
+	} else {
+		trak->tkhd.duration = 0;
+	}
+	trak->mdia.mdhd.duration = duration;
+	trak->mdia.mdhd.time_scale = timescale;
+
+	mp4ff_write_tkhd(file, &(trak->tkhd));
+	mp4ff_write_edts(file, &(trak->edts), trak->tkhd.duration);
+	mp4ff_write_mdia(file, &(trak->mdia));
+
+	mp4ff_atom_write_footer(file, &atom);
+
+	return 0;
+}
+
+long mp4ff_track_end(mp4ff_trak_t *trak)
+{
+/* get the byte endpoint of the track in the file */
+	long size = 0;
+	long chunk, chunk_offset, chunk_samples, sample;
+	mp4ff_stsz_t *stsz = &(trak->mdia.minf.stbl.stsz);
+	mp4ff_stsz_table_t *table = stsz->table;
+	mp4ff_stsc_t *stsc = &(trak->mdia.minf.stbl.stsc);
+	mp4ff_stco_t *stco;
+
+/* get the last chunk offset */
+/* the chunk offsets contain the HEADER_LENGTH themselves */
+	stco = &(trak->mdia.minf.stbl.stco);
+	chunk = stco->total_entries;
+	size = chunk_offset = stco->table[chunk - 1].offset;
+
+/* get the number of samples in the last chunk */
+	chunk_samples = stsc->table[stsc->total_entries - 1].samples;
+
+/* get the size of last samples */
+#ifdef NOTDEF
+	if(stsz->sample_size)
+	{
+/* assume audio so calculate the sample size */
+		size += chunk_samples * stsz->sample_size
+			* trak->mdia.minf.stbl.stsd.table[0].channels 
+			* trak->mdia.minf.stbl.stsd.table[0].sample_size / 8;
+	}
+	else
+	{
+/* assume video */
+#endif
+		for(sample = stsz->total_entries - chunk_samples; 
+			sample >= 0 && sample < stsz->total_entries; sample++)
+		{
+			size += stsz->table[sample].size;
+		}
+#ifdef NOTDEF
+	}
+#endif
+
+	return size;
+}
+
+long mp4ff_track_samples(mp4ff_t *file, mp4ff_trak_t *trak)
+{
+/*printf("file->rd %d file->wr %d\n", file->rd, file->wr); */
+	if(file->wr)
+	{
+/* get the sample count when creating a new file */
+ 		mp4ff_stsc_table_t *table = trak->mdia.minf.stbl.stsc.table;
+		long total_entries = trak->mdia.minf.stbl.stsc.total_entries;
+		long chunk = trak->mdia.minf.stbl.stco.total_entries;
+		long sample;
+
+		if(chunk)
+		{
+			sample = mp4ff_sample_of_chunk(trak, chunk);
+			sample += table[total_entries - 1].samples;
+		}
+		else 
+			sample = 0;
+		
+		return sample;
+	}
+	else
+	{
+/* get the sample count when reading only */
+		mp4ff_stts_t *stts = &(trak->mdia.minf.stbl.stts);
+		int i;
+		long total = 0;
+
+		for(i = 0; i < stts->total_entries; i++)
+		{
+			total += stts->table[i].sample_count;
+		}
+		return total;
+	}
+}
+
+long mp4ff_sample_of_chunk(mp4ff_trak_t *trak, long chunk)
+{
+	mp4ff_stsc_table_t *table = trak->mdia.minf.stbl.stsc.table;
+	long total_entries = trak->mdia.minf.stbl.stsc.total_entries;
+	long chunk1entry, chunk2entry;
+	long chunk1, chunk2, chunks, total = 0;
+
+	for(chunk1entry = total_entries - 1, chunk2entry = total_entries; 
+		chunk1entry >= 0; 
+		chunk1entry--, chunk2entry--)
+	{
+		chunk1 = table[chunk1entry].chunk;
+
+		if(chunk > chunk1)
+		{
+			if(chunk2entry < total_entries)
+			{
+				chunk2 = table[chunk2entry].chunk;
+
+				if(chunk < chunk2) chunk2 = chunk;
+			}
+			else
+				chunk2 = chunk;
+
+			chunks = chunk2 - chunk1;
+
+			total += chunks * table[chunk1entry].samples;
+		}
+	}
+
+	return total;
+}
+
+int mp4ff_chunk_of_sample(long *chunk_sample, long *chunk, mp4ff_trak_t *trak, long sample)
+{
+	mp4ff_stsc_table_t *table = NULL;
+	long total_entries = 0;
+	long chunk2entry;
+	long chunk1, chunk2, chunk1samples, range_samples, total = 0;
+
+	if (trak == NULL) {
+		return -1;
+	}
+ 	table = trak->mdia.minf.stbl.stsc.table;
+	total_entries = trak->mdia.minf.stbl.stsc.total_entries;
+
+	chunk1 = 1;
+	chunk1samples = 0;
+	chunk2entry = 0;
+
+	do
+	{
+		chunk2 = table[chunk2entry].chunk;
+		*chunk = chunk2 - chunk1;
+		range_samples = *chunk * chunk1samples;
+
+		if(sample < total + range_samples) break;
+
+		chunk1samples = table[chunk2entry].samples;
+		chunk1 = chunk2;
+
+		if(chunk2entry < total_entries)
+		{
+			chunk2entry++;
+			total += range_samples;
+		}
+	}while(chunk2entry < total_entries);
+
+	if(chunk1samples)
+		*chunk = (sample - total) / chunk1samples + chunk1;
+	else
+		*chunk = 1;
+
+	*chunk_sample = total + (*chunk - chunk1) * chunk1samples;
+	return 0;
+}
+
+long mp4ff_chunk_to_offset(mp4ff_trak_t *trak, long chunk)
+{
+	mp4ff_stco_table_t *table = NULL;
+
+	if (trak == NULL) {
+		return -1;
+	}
+	table = trak->mdia.minf.stbl.stco.table;
+
+	if(trak->mdia.minf.stbl.stco.total_entries && chunk > trak->mdia.minf.stbl.stco.total_entries)
+		return table[trak->mdia.minf.stbl.stco.total_entries - 1].offset;
+	else
+	if(trak->mdia.minf.stbl.stco.total_entries)
+		return table[chunk - 1].offset;
+	else
+		return HEADER_LENGTH;
+	
+	return 0;
+}
+
+long mp4ff_offset_to_chunk(long *chunk_offset, mp4ff_trak_t *trak, long offset)
+{
+	mp4ff_stco_table_t *table = trak->mdia.minf.stbl.stco.table;
+	int i;
+
+	for(i = trak->mdia.minf.stbl.stco.total_entries - 1; i >= 0; i--)
+	{
+		if(table[i].offset <= offset)
+		{
+			*chunk_offset = table[i].offset;
+			return i + 1;
+		}
+	}
+	*chunk_offset = HEADER_LENGTH;
+	return 1;
+}
+
+long mp4ff_sample_range_size(mp4ff_trak_t *trak, long chunk_sample, long sample)
+{
+	mp4ff_stsz_table_t *table = trak->mdia.minf.stbl.stsz.table;
+	long i, total;
+
+	if(trak->mdia.minf.stbl.stsz.sample_size)
+	{
+/* assume audio */
+		return mp4ff_samples_to_bytes(trak, sample - chunk_sample);
+	}
+	else
+	{
+/* probably video */
+		for(i = chunk_sample, total = 0; i < sample; i++)
+		{
+			total += trak->mdia.minf.stbl.stsz.table[i].size;
+		}
+	}
+	return total;
+}
+
+long mp4ff_sample_to_offset(mp4ff_trak_t *trak, long sample)
+{
+	long chunk, chunk_sample, chunk_offset1, chunk_offset2;
+
+	if (trak == NULL) {
+		return -1;
+	}
+
+	mp4ff_chunk_of_sample(&chunk_sample, &chunk, trak, sample);
+	chunk_offset1 = mp4ff_chunk_to_offset(trak, chunk);
+	chunk_offset2 = chunk_offset1 + mp4ff_sample_range_size(trak, chunk_sample, sample);
+/*printf("mp4ff_sample_to_offset chunk %d sample %d chunk_offset %d chunk_sample %d chunk_offset + samples %d\n", */
+/*	 chunk, sample, chunk_offset1, chunk_sample, chunk_offset2); */
+	return chunk_offset2;
+}
+
+long mp4ff_offset_to_sample(mp4ff_trak_t *trak, long offset)
+{
+	long chunk_offset;
+	long chunk = mp4ff_offset_to_chunk(&chunk_offset, trak, offset);
+	long chunk_sample = mp4ff_sample_of_chunk(trak, chunk);
+	long sample, sample_offset;
+	mp4ff_stsz_table_t *table = trak->mdia.minf.stbl.stsz.table;
+	long total_samples = trak->mdia.minf.stbl.stsz.total_entries;
+
+	if(trak->mdia.minf.stbl.stsz.sample_size)
+	{
+		sample = chunk_sample + (offset - chunk_offset) / 
+			trak->mdia.minf.stbl.stsz.sample_size;
+	}
+	else
+	for(sample = chunk_sample, sample_offset = chunk_offset; 
+		sample_offset < offset && sample < total_samples; )
+	{
+		sample_offset += table[sample].size;
+		if(sample_offset < offset) sample++;
+	}
+	
+	return sample;
+}
+
+int mp4ff_update_tables(mp4ff_t *file, 
+							mp4ff_trak_t *trak, 
+							long offset, 
+							long chunk, 
+							long sample, 
+							long samples, 
+							long sample_size,
+							long sample_duration,
+							unsigned char isSyncSample,
+							long renderingOffset)
+{
+	if (offset + sample_size > file->mdat.size) {
+		file->mdat.size = offset + sample_size;
+	}
+	mp4ff_update_stco(&(trak->mdia.minf.stbl.stco), chunk, offset);
+	if (sample_size) {
+		mp4ff_update_stsz(&(trak->mdia.minf.stbl.stsz), sample, sample_size);
+	}
+	mp4ff_update_stsc(&(trak->mdia.minf.stbl.stsc), chunk, samples);
+	if (sample_duration) {
+		mp4ff_update_stts(&(trak->mdia.minf.stbl.stts), sample_duration);
+	}
+	if (isSyncSample) {
+		mp4ff_update_stss(&(trak->mdia.minf.stbl.stss), sample);
+	}
+	mp4ff_update_ctts(&(trak->mdia.minf.stbl.ctts), renderingOffset);
+	return 0;
+}
+
+int mp4ff_trak_duration(mp4ff_trak_t *trak, long *duration, long *timescale)
+{
+	mp4ff_stts_t *stts = &(trak->mdia.minf.stbl.stts);
+	int i;
+	*duration = 0;
+
+	for(i = 0; i < stts->total_entries; i++) {
+		*duration += stts->table[i].sample_duration * stts->table[i].sample_count;
+	}
+
+	*timescale = trak->mdia.mdhd.time_scale;
+	return 0;
+}
+
+int mp4ff_trak_fix_counts(mp4ff_t *file, mp4ff_trak_t *trak)
+{
+	long samples = mp4ff_track_samples(file, trak);
+
+	if (trak->mdia.minf.stbl.stts.total_entries == 1) {
+		trak->mdia.minf.stbl.stts.table[0].sample_count = samples;
+	}
+
+	if(trak->mdia.minf.stbl.stsz.sample_size)
+		trak->mdia.minf.stbl.stsz.total_entries = samples;
+
+	return 0;
+}
+
+long mp4ff_chunk_samples(mp4ff_trak_t *trak, long chunk)
+{
+	long result, current_chunk;
+	mp4ff_stsc_t *stsc = &(trak->mdia.minf.stbl.stsc);
+	long i = stsc->total_entries - 1;
+
+	do
+	{
+		current_chunk = stsc->table[i].chunk;
+		result = stsc->table[i].samples;
+		i--;
+	}while(i >= 0 && current_chunk > chunk);
+
+	return result;
+}
+
+int mp4ff_trak_shift_offsets(mp4ff_trak_t *trak, long offset)
+{
+	mp4ff_stco_t *stco = &(trak->mdia.minf.stbl.stco);
+	int i;
+
+	for(i = 0; i < stco->total_entries; i++)
+	{
+		stco->table[i].offset += offset;
+	}
+	return 0;
+}
--- /dev/null
+++ b/common/mp4ff/udta.c
@@ -1,0 +1,164 @@
+#include "mp4ff.h"
+
+#define DEFAULT_INFO "Made with Quicktime for Linux"
+
+int mp4ff_udta_init(mp4ff_udta_t *udta)
+{
+	udta->copyright = 0;
+	udta->copyright_len = 0;
+	udta->name = 0;
+	udta->name_len = 0;
+
+	udta->info = malloc(strlen(DEFAULT_INFO) + 1);
+	udta->info_len = strlen(DEFAULT_INFO);
+	sprintf(udta->info, DEFAULT_INFO);
+
+	return 0;
+}
+
+int mp4ff_udta_delete(mp4ff_udta_t *udta)
+{
+	if(udta->copyright_len)
+	{
+		free(udta->copyright);
+	}
+	if(udta->name_len)
+	{
+		free(udta->name);
+	}
+	if(udta->info_len)
+	{
+		free(udta->info);
+	}
+
+	mp4ff_udta_init(udta);
+	return 0;
+}
+
+int mp4ff_udta_dump(mp4ff_udta_t *udta)
+{
+	printf(" user data (udta)\n");
+	if(udta->copyright_len) printf("  copyright -> %s\n", udta->copyright);
+	if(udta->name_len) printf("  name -> %s\n", udta->name);
+	if(udta->info_len) printf("  info -> %s\n", udta->info);
+}
+
+int mp4ff_read_udta(mp4ff_t *file, mp4ff_udta_t *udta, mp4ff_atom_t *udta_atom)
+{
+	mp4ff_atom_t leaf_atom;
+	int result = 0;
+
+	do
+	{
+		/* udta atoms can be terminated by a 4 byte zero */
+		if (udta_atom->end - mp4ff_position(file) < HEADER_LENGTH) {
+			unsigned char trash[HEADER_LENGTH];
+			int remainder = udta_atom->end - mp4ff_position(file);
+			mp4ff_read_data(file, trash, remainder);
+			break;
+		}
+
+		mp4ff_atom_read_header(file, &leaf_atom);
+
+#if 0
+		if(mp4ff_atom_is(&leaf_atom, "�cpy"))
+		{
+			result += mp4ff_read_udta_string(file, &(udta->copyright), &(udta->copyright_len));
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "�nam"))
+		{
+			result += mp4ff_read_udta_string(file, &(udta->name), &(udta->name_len));
+		}
+		else
+		if(mp4ff_atom_is(&leaf_atom, "�inf"))
+		{
+			result += mp4ff_read_udta_string(file, &(udta->info), &(udta->info_len));
+		}
+		else
+#endif
+		mp4ff_atom_skip(file, &leaf_atom);
+	}while(mp4ff_position(file) < udta_atom->end);
+
+	return result;
+}
+
+int mp4ff_write_udta(mp4ff_t *file, mp4ff_udta_t *udta)
+{
+	mp4ff_atom_t atom, subatom;
+
+	/*
+	 * Empty udta atom makes Darwin Streaming Server unhappy
+	 * so avoid it
+	 */
+#if 1
+    return;
+#else
+	if (udta->copyright_len == 0 && udta->hnti.rtp.string == NULL) {
+        return;
+    }
+
+	mp4ff_atom_write_header(file, &atom, "udta");
+
+	if(udta->copyright_len)
+	{
+		mp4ff_atom_write_header(file, &subatom, "�cpy");
+		mp4ff_write_udta_string(file, udta->copyright, udta->copyright_len);
+		mp4ff_atom_write_footer(file, &subatom);
+	}
+
+#if 0
+	if(udta->name_len && !file->use_mp4)
+	{
+		mp4ff_atom_write_header(file, &subatom, "�nam");
+		mp4ff_write_udta_string(file, udta->name, udta->name_len);
+		mp4ff_atom_write_footer(file, &subatom);
+	}
+
+	if(udta->info_len && !file->use_mp4)
+	{
+		mp4ff_atom_write_header(file, &subatom, "�inf");
+		mp4ff_write_udta_string(file, udta->info, udta->info_len);
+		mp4ff_atom_write_footer(file, &subatom);
+	}
+#endif
+	if (udta->hnti.rtp.string != NULL) {
+		mp4ff_write_hnti(file, &(udta->hnti));
+	}
+
+	mp4ff_atom_write_footer(file, &atom);
+#endif
+}
+
+int mp4ff_read_udta_string(mp4ff_t *file, char **string, int *size)
+{
+	int result;
+
+	if(*size) free(*string);
+	*size = mp4ff_read_int16(file);  /* Size of string */
+	mp4ff_read_int16(file);  /* Discard language code */
+	*string = malloc(*size + 1);
+	result = mp4ff_read_data(file, *string, *size);
+	(*string)[*size] = 0;
+	return !result;
+}
+
+int mp4ff_write_udta_string(mp4ff_t *file, char *string, int size)
+{
+	int new_size = strlen(string);
+	int result;
+
+	mp4ff_write_int16(file, new_size);    /* String size */
+	mp4ff_write_int16(file, 0);    /* Language code */
+	result = mp4ff_write_data(file, string, new_size);
+	return !result;
+}
+
+int mp4ff_set_udta_string(char **string, int *size, char *new_string)
+{
+	if(*size) free(*string);
+	*size = strlen(new_string + 1);
+	*string = malloc(*size + 1);
+	strcpy(*string, new_string);
+	return 0;
+}
--- /dev/null
+++ b/common/mp4ff/util.c
@@ -1,0 +1,356 @@
+#include <time.h>
+#include "mp4ff.h"
+
+/* Disk I/O */
+
+
+int mp4ff_read_data(mp4ff_t *file, char *data, int size)
+{
+    int result = 1;
+
+    if (file->stream->get_position() != file->file_position)
+        file->stream->seek(file->file_position);
+    result = file->stream->read(data, size);
+
+    file->file_position += size;
+
+    return result;
+}
+
+int mp4ff_write_data(mp4ff_t *file, char *data, int size)
+{
+    int result;
+
+    if (file->stream->get_position() != file->file_position)
+        file->stream->seek(file->file_position);
+    result = file->stream->write(data, size);
+
+    file->file_position += size;
+
+    return result;
+}
+
+int mp4ff_test_position(mp4ff_t *file)
+{
+	if (mp4ff_position(file) < 0)
+	{
+		printf("mp4ff_test_position: 32 bit overflow\n");
+		return 1;
+	}
+	else
+	return 0;
+}
+
+int mp4ff_read_pascal(mp4ff_t *file, char *data)
+{
+	char len = mp4ff_read_char(file);
+	mp4ff_read_data(file, data, len);
+	data[len] = 0;
+}
+
+int mp4ff_write_pascal(mp4ff_t *file, char *data)
+{
+	char len = strlen(data);
+	mp4ff_write_data(file, &len, 1);
+	mp4ff_write_data(file, data, len);
+}
+
+float mp4ff_read_fixed32(mp4ff_t *file)
+{
+	unsigned long a, b, c, d;
+	unsigned char data[4];
+
+	mp4ff_read_data(file, data, 4);
+/*	fread(data, 4, 1, file->stream); */
+	a = data[0];
+	b = data[1];
+	c = data[2];
+	d = data[3];
+	
+	a = (a << 8) + b;
+	b = (c << 8) + d;
+
+	return (float)a + (float)b / 65536;
+}
+
+int mp4ff_write_fixed32(mp4ff_t *file, float number)
+{
+	unsigned char data[4];
+	int a, b;
+
+	a = number;
+	b = (number - a) * 65536;
+	data[0] = a >> 8;
+	data[1] = a & 0xff;
+	data[2] = b >> 8;
+	data[3] = b & 0xff;
+
+	return mp4ff_write_data(file, data, 4);
+}
+
+int mp4ff_write_int64(mp4ff_t *file, unsigned __int64 value)
+{
+	unsigned char data[8];
+	int i;
+
+	for (i = 7; i >= 0; i--) {
+		data[i] = value & 0xff;
+		value >>= 8;
+	}
+
+	return mp4ff_write_data(file, data, 8);
+}
+
+int mp4ff_write_int32(mp4ff_t *file, long value)
+{
+	unsigned char data[4];
+
+	data[0] = (value & 0xff000000) >> 24;
+	data[1] = (value & 0xff0000) >> 16;
+	data[2] = (value & 0xff00) >> 8;
+	data[3] = value & 0xff;
+
+	return mp4ff_write_data(file, data, 4);
+}
+
+int mp4ff_write_char32(mp4ff_t *file, char *string)
+{
+	return mp4ff_write_data(file, string, 4);
+}
+
+
+float mp4ff_read_fixed16(mp4ff_t *file)
+{
+	unsigned char data[2];
+	
+	mp4ff_read_data(file, data, 2);
+	return (float)data[0] + (float)data[1] / 256;
+}
+
+int mp4ff_write_fixed16(mp4ff_t *file, float number)
+{
+	unsigned char data[2];
+	int a, b;
+
+	a = number;
+	b = (number - a) * 256;
+	data[0] = a;
+	data[1] = b;
+	
+	return mp4ff_write_data(file, data, 2);
+}
+
+unsigned __int64 mp4ff_read_int64(mp4ff_t *file)
+{
+	unsigned char data[8];
+	unsigned __int64 result = 0;
+	int i;
+
+	mp4ff_read_data(file, data, 8);
+
+	for (i = 0; i < 8; i++) {
+		result |= ((unsigned __int64)data[i]) << ((7 - i) * 8);
+	}
+
+	return result;
+}
+
+long mp4ff_read_int32(mp4ff_t *file)
+{
+	unsigned long result;
+	unsigned long a, b, c, d;
+	char data[4];
+	
+	mp4ff_read_data(file, data, 4);
+	a = (unsigned char)data[0];
+	b = (unsigned char)data[1];
+	c = (unsigned char)data[2];
+	d = (unsigned char)data[3];
+
+	result = (a<<24) | (b<<16) | (c<<8) | d;
+	return (long)result;
+}
+
+
+long mp4ff_read_int24(mp4ff_t *file)
+{
+	unsigned long result;
+	unsigned long a, b, c;
+	char data[4];
+	
+	mp4ff_read_data(file, data, 3);
+/*	fread(data, 3, 1, file->stream); */
+	a = (unsigned char)data[0];
+	b = (unsigned char)data[1];
+	c = (unsigned char)data[2];
+
+	result = (a<<16) | (b<<8) | c;
+	return (long)result;
+}
+
+int mp4ff_write_int24(mp4ff_t *file, long number)
+{
+	unsigned char data[3];
+	data[0] = (number & 0xff0000) >> 16;
+	data[1] = (number & 0xff00) >> 8;
+	data[2] = (number & 0xff);
+	
+	return mp4ff_write_data(file, data, 3);
+/*	return fwrite(data, 3, 1, file->stream); */
+}
+
+int mp4ff_read_int16(mp4ff_t *file)
+{
+	unsigned long result;
+	unsigned long a, b;
+	char data[2];
+	
+	mp4ff_read_data(file, data, 2);
+/*	fread(data, 2, 1, file->stream); */
+	a = (unsigned char)data[0];
+	b = (unsigned char)data[1];
+
+	result = (a<<8) | b;
+	return (int)result;
+}
+
+int mp4ff_write_int16(mp4ff_t *file, int number)
+{
+	unsigned char data[2];
+	data[0] = (number & 0xff00) >> 8;
+	data[1] = (number & 0xff);
+	
+	return mp4ff_write_data(file, data, 2);
+/*	return fwrite(data, 2, 1, file->stream); */
+}
+
+int mp4ff_read_char(mp4ff_t *file)
+{
+	char output;
+	mp4ff_read_data(file, &output, 1);
+	return output;
+}
+
+int mp4ff_write_char(mp4ff_t *file, char x)
+{
+	return mp4ff_write_data(file, &x, 1);
+}
+
+int mp4ff_read_char32(mp4ff_t *file, char *string)
+{
+	mp4ff_read_data(file, string, 4);
+/*	fread(string, 4, 1, file->stream); */
+}
+
+long mp4ff_position(mp4ff_t *file) 
+{ 
+	return file->file_position; 
+}
+
+int mp4ff_set_position(mp4ff_t *file, long position) 
+{
+	file->file_position = position;
+	return 0;
+/*	fseek(file->stream, position, SEEK_SET);  */
+}
+
+int mp4ff_copy_char32(char *output, char *input)
+{
+	*output++ = *input++;
+	*output++ = *input++;
+	*output++ = *input++;
+	*output = *input;
+}
+
+
+void mp4ff_print_chars(char *desc, char *input, int len)
+{
+	int i;
+
+    printf("%s", desc);
+    for(i = 0; i < len; i++)
+        printf("%c", input[i]);
+	printf("\n");
+}
+
+unsigned long mp4ff_current_time()
+{
+	time_t t = 0;
+	//time(&t);
+	return (t+(66*31536000)+1468800);
+}
+
+int mp4ff_match_32(char *input, char *output)
+{
+	if(input[0] == output[0] &&
+		input[1] == output[1] &&
+		input[2] == output[2] &&
+		input[3] == output[3])
+		return 1;
+	else 
+		return 0;
+}
+
+int mp4ff_read_mp4_descr_length(mp4ff_t *file)
+{
+	unsigned __int8 b;
+	unsigned __int8 numBytes = 0;
+	unsigned __int32 length = 0;
+
+	do {
+		b = mp4ff_read_char(file);
+		numBytes++;
+		length = (length << 7) | (b & 0x7F);
+	} while ((b & 0x80) && numBytes < 4);
+
+	return length;
+}
+
+int mp4ff_write_mp4_descr_length(mp4ff_t *file, int length, unsigned char compact)
+{
+	unsigned __int8 b;
+	__int8 i;
+	__int8 numBytes;
+
+	if (compact) {
+		if (length <= 0x7F) {
+			numBytes = 1;
+		} else if (length <= 0x3FFF) {
+			numBytes = 2;
+		} else if (length <= 0x1FFFFF) {
+			numBytes = 3;
+		} else {
+			numBytes = 4;
+		}
+	} else {
+		numBytes = 4;
+	}
+
+	for (i = numBytes-1; i >= 0; i--) {
+		b = (length >> (i * 7)) & 0x7F;
+		if (i != 0) {
+			b |= 0x80;
+		}
+		mp4ff_write_char(file, b);
+	}
+
+	return numBytes; 
+}
+
+void mp4ff_atom_hexdump(mp4ff_t* file, mp4ff_atom_t* atom)
+{
+	int i;
+	int oldPos;
+
+	oldPos = mp4ff_position(file);
+	mp4ff_set_position(file, atom->start);
+	printf("atom hex dump:\n");
+	for (i = 0; i < atom->size; i++) {
+		printf("%02x ", (unsigned __int8)mp4ff_read_char(file));
+		if ((i % 16) == 0 && i > 0) {
+			printf("\n");
+		}
+	}
+	printf("\n");
+	mp4ff_set_position(file, oldPos);
+}
--- /dev/null
+++ b/common/mp4ff/vmhd.c
@@ -1,0 +1,58 @@
+#include "mp4ff.h"
+
+
+int mp4ff_vmhd_init(mp4ff_vmhd_t *vmhd)
+{
+	vmhd->version = 0;
+	vmhd->flags = 1;
+	vmhd->graphics_mode = 64;
+	vmhd->opcolor[0] = 32768;
+	vmhd->opcolor[1] = 32768;
+	vmhd->opcolor[2] = 32768;
+}
+
+int mp4ff_vmhd_init_video(mp4ff_t *file, 
+								mp4ff_vmhd_t *vmhd, 
+								int frame_w,
+								int frame_h, 
+								float frame_rate)
+{
+}
+
+int mp4ff_vmhd_delete(mp4ff_vmhd_t *vmhd)
+{
+}
+
+int mp4ff_vmhd_dump(mp4ff_vmhd_t *vmhd)
+{
+	printf("    video media header\n");
+	printf("     version %d\n", vmhd->version);
+	printf("     flags %d\n", vmhd->flags);
+	printf("     graphics_mode %d\n", vmhd->graphics_mode);
+	printf("     opcolor %d %d %d\n", vmhd->opcolor[0], vmhd->opcolor[1], vmhd->opcolor[2]);
+}
+
+int mp4ff_read_vmhd(mp4ff_t *file, mp4ff_vmhd_t *vmhd)
+{
+	int i;
+	vmhd->version = mp4ff_read_char(file);
+	vmhd->flags = mp4ff_read_int24(file);
+	vmhd->graphics_mode = mp4ff_read_int16(file);
+	for(i = 0; i < 3; i++)
+		vmhd->opcolor[i] = mp4ff_read_int16(file);
+}
+
+int mp4ff_write_vmhd(mp4ff_t *file, mp4ff_vmhd_t *vmhd)
+{
+	mp4ff_atom_t atom;
+
+    mp4ff_atom_write_header(file, &atom, "vmhd");
+
+	mp4ff_write_char(file, vmhd->version);
+	mp4ff_write_int24(file, vmhd->flags);
+
+	mp4ff_write_int64(file, (unsigned __int64)0);
+
+	mp4ff_atom_write_footer(file, &atom);
+}
+
--- a/frontend/faad.dsp
+++ b/frontend/faad.dsp
@@ -42,8 +42,7 @@
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /I "../include" /I "../common/mp4v2" /I "../common/faad" /I "../common/libsndfile/src" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# SUBTRACT CPP /O<none>
+# ADD CPP /nologo /MD /W3 /GX /I "../include" /I "../common/mp4ff" /I "../common/faad" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
 # ADD BASE RSC /l 0x413 /d "NDEBUG"
 # ADD RSC /l 0x413 /d "NDEBUG"
 BSC32=bscmake.exe
@@ -67,7 +66,7 @@
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../include" /I "../common/mp4v2" /I "../common/faad" /I "../common/libsndfile/src" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../include" /I "../common/mp4ff" /I "../common/faad" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
 # ADD BASE RSC /l 0x413 /d "_DEBUG"
 # ADD RSC /l 0x413 /d "_DEBUG"
 BSC32=bscmake.exe
--- a/frontend/faad.dsw
+++ b/frontend/faad.dsw
@@ -15,7 +15,7 @@
     Project_Dep_Name libfaad
     End Project Dependency
     Begin Project Dependency
-    Project_Dep_Name libmp4v2_st
+    Project_Dep_Name mp4ff
     End Project Dependency
 }}}
 
@@ -33,7 +33,7 @@
 
 ###############################################################################
 
-Project: "libmp4v2_st"=..\common\mp4v2\libmp4v2_st60.dsp - Package Owner=<4>
+Project: "mp4ff"=..\common\mp4ff\mp4ff.dsp - Package Owner=<4>
 
 Package=<5>
 {{{
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: main.c,v 1.52 2003/10/17 17:05:34 ca5e Exp $
+** $Id: main.c,v 1.53 2003/10/19 18:11:19 menno Exp $
 **/
 
 #ifdef _WIN32
@@ -32,12 +32,13 @@
 #include <time.h>
 #endif
 
+#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <getopt.h>
 
 #include <faad.h>
-#include <mp4.h>
+#include <mp4ff.h>
 
 #include "audio.h"
 
@@ -162,6 +163,39 @@
     return 1;
 }
 
+
+FILE *g_mp4File = NULL;
+
+size_t read_callback(void *buffer, size_t length)
+{
+    return fread(buffer, length, 1, g_mp4File);
+}
+
+size_t write_callback(void *buffer, size_t length)
+{
+    return 0;
+}
+
+__int64 get_position_callback()
+{
+    return ftell(g_mp4File);
+}
+
+__int64 get_length_callback()
+{
+    __int64 oldpos, size = 0;
+    oldpos = ftell(g_mp4File);
+    fseek(g_mp4File, 0, SEEK_END);
+    size = ftell(g_mp4File);
+    fseek(g_mp4File, oldpos, SEEK_SET);
+    return size;
+}
+
+int seek_callback(__int64 position)
+{
+    return fseek(g_mp4File, position, SEEK_SET);
+}
+
 /* MicroSoft channel definitions */
 #define SPEAKER_FRONT_LEFT             0x1
 #define SPEAKER_FRONT_RIGHT            0x2
@@ -634,25 +668,25 @@
     return frameInfo.error;
 }
 
-int GetAACTrack(MP4FileHandle infile)
+int GetAACTrack(mp4ff_t *infile)
 {
     /* find AAC track */
-    unsigned short i;
-    int rc;
-    int numTracks = MP4GetNumberOfTracks(infile, NULL, /* subType */ 0);
+    int i, rc;
+    int numTracks = mp4ff_audio_tracks(infile);
 
     for (i = 0; i < numTracks; i++)
     {
-        MP4TrackId trackId = MP4FindTrackId(infile, i, NULL, /* subType */ 0);
-        const char* trackType = MP4GetTrackType(infile, trackId);
+        //const char* trackType = mp4ff_audio_compressor(infile, i);
 
-        if (!strcmp(trackType, MP4_AUDIO_TRACK_TYPE))
+        //if (!strcmp(trackType, "soun"))
         {
             unsigned char *buff = NULL;
             int buff_size = 0;
             mp4AudioSpecificConfig mp4ASC;
-            MP4GetTrackESConfiguration(infile, trackId, &buff, &buff_size);
 
+            //MP4GetTrackESConfiguration(infile, trackId, &buff, &buff_size);
+            mp4ff_get_mp4_audio_decoder_config(infile, i, &buff, &buff_size);
+
             if (buff)
             {
                 rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
@@ -660,7 +694,7 @@
 
                 if (rc < 0)
                     return -1;
-                return trackId;
+                return i;
             }
         }
     }
@@ -684,8 +718,8 @@
     unsigned char channels;
     void *sample_buffer;
 
-    MP4FileHandle infile;
-    MP4SampleId sampleId, numSamples;
+    mp4ff_t *infile;
+    long sampleId, numSamples;
 
     audio_file *aufile;
 
@@ -707,10 +741,21 @@
 
     /* for gapless decoding */
     unsigned int useAacLength = 1;
-    unsigned int framesize;
     unsigned int initial = 1;
+    unsigned int framesize;
     unsigned long timescale;
 
+
+    /* initialise the callback structure */
+    mp4_callback_t *mp4cb = malloc(sizeof(mp4_callback_t));
+    g_mp4File = fopen(mp4file, "rb");
+    mp4cb->get_length = get_length_callback;
+    mp4cb->get_position = get_position_callback;
+    mp4cb->read = read_callback;
+    mp4cb->seek = seek_callback;
+    mp4cb->write = write_callback;
+
+
     hDecoder = faacDecOpen();
 
     /* Set configuration */
@@ -729,7 +774,7 @@
         }
     }
 
-    infile = MP4Read(mp4file, 0);
+    infile = mp4ff_open(mp4cb, 1, 0, 0);
     if (!infile)
     {
         /* unable to open file */
@@ -737,6 +782,7 @@
         return 1;
     }
 
+#if 0
     /* print some mp4 file info */
     fprintf(stderr, "%s file info:\n", mp4file);
     {
@@ -744,11 +790,14 @@
         fprintf(stderr, "%s\n", file_info);
         free(file_info);
     }
+#endif
 
     if (infoOnly)
     {
         faacDecClose(hDecoder);
-        MP4Close(infile);
+        mp4ff_close(infile);
+        free(mp4cb);
+        fclose(g_mp4File);
         return 0;
     }
 
@@ -756,13 +805,15 @@
     {
         fprintf(stderr, "Unable to find correct AAC sound track in the MP4 file.\n");
         faacDecClose(hDecoder);
-        MP4Close(infile);
+        mp4ff_close(infile);
+        free(mp4cb);
+        fclose(g_mp4File);
         return 1;
     }
 
     buffer = NULL;
     buffer_size = 0;
-    MP4GetTrackESConfiguration(infile, track, &buffer, &buffer_size);
+    mp4ff_get_mp4_audio_decoder_config(infile, track, &buffer, &buffer_size);
 
     if(faacDecInit2(hDecoder, buffer, buffer_size,
                     &samplerate, &channels) < 0)
@@ -770,7 +821,9 @@
         /* If some error initializing occured, skip the file */
         fprintf(stderr, "Error initializing decoder library.\n");
         faacDecClose(hDecoder);
-        MP4Close(infile);
+        mp4ff_close(infile);
+        free(mp4cb);
+        fclose(g_mp4File);
         return 1;
     }
 
@@ -778,7 +831,7 @@
     {
         mp4AudioSpecificConfig mp4ASC;
 
-        timescale = MP4GetTrackTimeScale(infile, track);
+        timescale = mp4ff_audio_time_scale(infile, track);
         framesize = 1024;
         useAacLength = 0;
 
@@ -794,12 +847,12 @@
 
     if (buffer) free(buffer);
 
-    numSamples = MP4GetTrackNumberOfSamples(infile, track);
+    numSamples = mp4ff_audio_length(infile, track);
 
-    for (sampleId = 1; sampleId <= numSamples; sampleId++)
+    for (sampleId = 0; sampleId < numSamples; sampleId++)
     {
         int rc;
-        MP4Duration dur;
+        long dur;
         unsigned int sample_count;
         unsigned int delay = 0;
 
@@ -807,13 +860,18 @@
         buffer = NULL;
         buffer_size = 0;
 
-        rc = MP4ReadSample(infile, track, sampleId, &buffer, &buffer_size,
-            NULL, &dur, NULL, NULL);
+        mp4ff_set_audio_position(infile, sampleId, track);
+        dur = mp4ff_get_sample_duration(infile, sampleId, track);
+        buffer_size = mp4ff_audio_frame_size(infile, sampleId, track);
+        buffer = (unsigned char*)malloc(buffer_size*sizeof(unsigned char));
+        rc = mp4ff_read_audio_frame(infile, buffer, buffer_size, track);
         if (rc == 0)
         {
             fprintf(stderr, "Reading from MP4 file failed.\n");
             faacDecClose(hDecoder);
-            MP4Close(infile);
+            mp4ff_close(infile);
+            free(mp4cb);
+            fclose(g_mp4File);
             return 1;
         }
 
@@ -850,9 +908,7 @@
 
             if (initial && (sample_count < framesize*frameInfo.channels) && (frameInfo.samples > sample_count))
                 delay = frameInfo.samples - sample_count;
-        }
-        else
-        {
+        } else {
             sample_count = frameInfo.samples;
         }
 
@@ -879,7 +935,9 @@
                 if (aufile == NULL)
                 {
                     faacDecClose(hDecoder);
-                    MP4Close(infile);
+                    mp4ff_close(infile);
+                    free(mp4cb);
+                    fclose(g_mp4File);
                     return 0;
                 }
             }
@@ -919,11 +977,14 @@
         fclose(adtsFile);
     }
 
-    MP4Close(infile);
+    mp4ff_close(infile);
 
     if (!first_time && !adts_out)
         close_audio_file(aufile);
 
+    free(mp4cb);
+    fclose(g_mp4File);
+
     return frameInfo.error;
 }
 
@@ -947,7 +1008,8 @@
     char aacFileName[255];
     char audioFileName[255];
     char adtsFileName[255];
-    MP4FileHandle infile;
+    mp4_callback_t *mp4cb = malloc(sizeof(mp4_callback_t));
+    //MP4FileHandle infile;
 
 /* System dependant types */
 #ifdef _WIN32
@@ -1124,12 +1186,24 @@
         strcat(audioFileName, file_ext[format]);
     }
 
-    mp4file = 1;
-    infile = MP4Read(aacFileName, 0);
-    if (!infile)
-        mp4file = 0;
-    if (infile) MP4Close(infile);
+    //mp4file = 1;
+    //infile = MP4Read(aacFileName, 0);
+    //if (!infile)
+    //    mp4file = 0;
+    //if (infile) MP4Close(infile);
 
+    /* initialise the callback structure */
+    g_mp4File = fopen(aacFileName, "rb");
+    mp4cb->get_length = get_length_callback;
+    mp4cb->get_position = get_position_callback;
+    mp4cb->read = read_callback;
+    mp4cb->seek = seek_callback;
+    mp4cb->write = write_callback;
+
+    mp4file = mp4ff_check_sig(mp4cb);
+    free(mp4cb);
+    fclose(g_mp4File);
+
     if (mp4file)
     {
         result = decodeMP4file(aacFileName, audioFileName, adtsFileName, writeToStdio,
@@ -1139,7 +1213,6 @@
             def_srate, object_type, outputFormat, format, downMatrix, infoOnly, adts_out,
             old_format);
     }
-
 
     if (!result && !infoOnly)
     {
--- a/libfaad/bits.c
+++ b/libfaad/bits.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: bits.c,v 1.24 2003/10/09 20:04:24 menno Exp $
+** $Id: bits.c,v 1.27 2003/11/04 21:43:30 menno Exp $
 **/
 
 #include "common.h"
@@ -33,7 +33,7 @@
 #include "bits.h"
 
 /* initialize buffer, call once before first getbits or showbits */
-void faad_initbits(bitfile *ld, void *_buffer, uint32_t buffer_size)
+void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size)
 {
     uint32_t tmp;
 
--- a/libfaad/bits.h
+++ b/libfaad/bits.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: bits.h,v 1.23 2003/10/09 20:04:24 menno Exp $
+** $Id: bits.h,v 1.26 2003/11/04 21:43:30 menno Exp $
 **/
 
 #ifndef __BITS_H__
@@ -73,7 +73,7 @@
     0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF
 };
 
-void faad_initbits(bitfile *ld, void *buffer, uint32_t buffer_size);
+void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size);
 void faad_endbits(bitfile *ld);
 void faad_initbits_rev(bitfile *ld, void *buffer,
                        uint32_t bits_in_buffer);
--- a/libfaad/cfft.c
+++ b/libfaad/cfft.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: cfft.c,v 1.14 2003/10/09 20:04:24 menno Exp $
+** $Id: cfft.c,v 1.15 2003/10/19 18:11:19 menno Exp $
 **/
 
 /*
@@ -52,8 +52,8 @@
    passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd.
   ----------------------------------------------------------------------*/
 
-static void passf2(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa, int8_t isign)
+static void passf2(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa, const int8_t isign)
 {
     uint16_t i, k, ah, ac;
 
@@ -93,8 +93,9 @@
 }
 
 
-static void passf3(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, int8_t isign)
+static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa1, const complex_t *wa2,
+                   const int8_t isign)
 {
     static real_t taur = COEF_CONST(-0.5);
     static real_t taui = COEF_CONST(0.866025403784439);
@@ -157,9 +158,9 @@
     }
 }
 
-
-static void passf4(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, complex_t *wa3, int8_t isign)
+static void passf4(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa1, const complex_t *wa2,
+                   const complex_t *wa3, const int8_t isign)
 {
     uint16_t i, k, ac, ah;
 
@@ -235,10 +236,9 @@
     }
 }
 
-
-static void passf5(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, complex_t *wa3, complex_t *wa4,
-                   int8_t isign)
+static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3,
+                   const complex_t *wa4, const int8_t isign)
 {
     static real_t tr11 = COEF_CONST(0.309016994374947);
     static real_t ti11 = COEF_CONST(0.951056516295154);
--- a/libfaad/cfft.h
+++ b/libfaad/cfft.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: cfft.h,v 1.8 2003/10/09 20:04:24 menno Exp $
+** $Id: cfft.h,v 1.11 2003/11/04 21:43:30 menno Exp $
 **/
 
 #ifndef __CFFT_H__
@@ -47,15 +47,16 @@
 void cfftu(cfft_info *cfft);
 
 
-static void passf2(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa, int8_t isign);
-static void passf3(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, int8_t isign);
-static void passf4(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, complex_t *wa3, int8_t isign);
-static void passf5(uint16_t ido, uint16_t l1, complex_t *cc, complex_t *ch,
-                   complex_t *wa1, complex_t *wa2, complex_t *wa3, complex_t *wa4,
-                   int8_t isign);
+static void passf2(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa, const int8_t isign);
+static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc,
+                   complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign);
+static void passf4(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch,
+                   const complex_t *wa1, const complex_t *wa2, const complex_t *wa3,
+                   const int8_t isign);
+static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch,
+                   const complex_t *wa1, const complex_t *wa2, const complex_t *wa3,
+                   const complex_t *wa4, const int8_t isign);
 INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch,
                    uint16_t *ifac, complex_t *wa, int8_t isign);
 static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac);
--- a/libfaad/common.c
+++ b/libfaad/common.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: common.c,v 1.8 2003/10/09 20:04:24 menno Exp $
+** $Id: common.c,v 1.10 2003/11/02 20:24:03 menno Exp $
 **/
 
 /* just some common functions that could be used anywhere */
--- a/libfaad/common.h
+++ b/libfaad/common.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: common.h,v 1.32 2003/10/09 20:04:24 menno Exp $
+** $Id: common.h,v 1.33 2003/10/19 18:11:19 menno Exp $
 **/
 
 #ifndef __COMMON_H__
@@ -76,6 +76,9 @@
 #define LTP_DEC
 #endif
 #endif
+
+// Define SMALL_IQ_TAB for smaller lookup table (also bigger error)
+//#define SMALL_IQ_TAB
 
 
 #define SBR_DEC
--- a/libfaad/decoder.c
+++ b/libfaad/decoder.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: decoder.c,v 1.74 2003/10/09 20:04:24 menno Exp $
+** $Id: decoder.c,v 1.75 2003/10/19 18:11:19 menno Exp $
 **/
 
 #include "common.h"
@@ -847,6 +847,8 @@
 
         hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index);
         hDecoder->sbr[0]->sample_rate *= 2;
+
+        hDecoder->sbr[0]->id_aac = hDecoder->element_id[0];
     }
 #endif
 #endif
--- a/libfaad/decoder.h
+++ b/libfaad/decoder.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: decoder.h,v 1.29 2003/10/09 20:04:24 menno Exp $
+** $Id: decoder.h,v 1.30 2003/10/19 18:11:19 menno Exp $
 **/
 
 #ifndef __DECODER_H__
--- a/libfaad/filtbank.c
+++ b/libfaad/filtbank.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: filtbank.c,v 1.28 2003/10/09 20:04:24 menno Exp $
+** $Id: filtbank.c,v 1.29 2003/10/19 18:11:19 menno Exp $
 **/
 
 #include "common.h"
@@ -157,7 +157,7 @@
                   real_t *time_out, uint8_t object_type, uint16_t frame_len)
 {
     int16_t i;
-    real_t *transf_buf;
+    real_t transf_buf[2*1024] = {0};
 
     real_t *window_long;
     real_t *window_long_prev;
@@ -170,8 +170,6 @@
 
     uint16_t nflat_ls = (nlong-nshort)/2;
 
-    transf_buf = (real_t*)malloc(2*nlong*sizeof(real_t));
-
 #ifdef LD_DEC
     if (object_type == LD)
     {
@@ -266,8 +264,6 @@
             time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]);
 		break;
     }
-
-    free(transf_buf);
 }
 
 #ifdef LTP_DEC
@@ -277,7 +273,7 @@
                      uint8_t object_type, uint16_t frame_len)
 {
     int16_t i;
-    real_t *windowed_buf;
+    real_t windowed_buf[2*1024] = {0};
 
     real_t *window_long;
     real_t *window_long_prev;
@@ -290,8 +286,6 @@
 
     assert(window_sequence != EIGHT_SHORT_SEQUENCE);
 
-    windowed_buf = (real_t*)malloc(nlong*2*sizeof(real_t));
-
 #ifdef LD_DEC
     if (object_type == LD)
     {
@@ -342,7 +336,5 @@
         mdct(fb, windowed_buf, out_mdct, 2*nlong);
         break;
     }
-
-    free(windowed_buf);
 }
 #endif
--- a/libfaad/fixed.h
+++ b/libfaad/fixed.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: fixed.h,v 1.11 2003/10/09 20:04:24 menno Exp $
+** $Id: fixed.h,v 1.14 2003/11/04 21:43:30 menno Exp $
 **/
 
 #ifndef __FIXED_H__
@@ -98,7 +98,7 @@
 #elif 0 //defined(_WIN32_WCE) && defined(ARM)
 
 /* multiply real with real */
-static INLINE MUL(real_t A, real_t B)
+static MUL(real_t A, real_t B)
 {
     __emit(0xe0c23190); // smull  r3, r2, r0, r1
     __emit(0xe1b03723); // movs   r3, r3, lsr #14
@@ -105,7 +105,7 @@
     __emit(0xe0a30902); // adc    r0, r3, r2, lsl #18
 }
 /* multiply coef with coef */
-static INLINE MUL_C_C(real_t A, real_t B)
+static MUL_C_C(real_t A, real_t B)
 {
     __emit(0xe0c23190); // smull  r3, r2, r0, r1
     __emit(0xe1b03e23); // movs   r3, r3, lsr #28
@@ -112,7 +112,7 @@
     __emit(0xe0a30202); // adc    r0, r3, r2, lsl #4
 }
 /* multiply real with coef */
-static INLINE MUL_R_C(real_t A, real_t B)
+static MUL_R_C(real_t A, real_t B)
 {
     __emit(0xe0c23190); // smull  r3, r2, r0, r1
     __emit(0xe1b03e23); // movs   r3, r3, lsr #28
--- a/libfaad/iq_table.h
+++ b/libfaad/iq_table.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: iq_table.h,v 1.6 2003/10/09 20:04:24 menno Exp $
+** $Id: iq_table.h,v 1.9 2003/11/04 21:43:30 menno Exp $
 **/
 
 #ifndef IQ_TABLE_H__
@@ -33,6 +33,14 @@
 #endif
 
 
+/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */
+#ifdef SMALL_IQ_TAB
+#define IQ_TABLE_SIZE  304
+#else
+#define IQ_TABLE_SIZE  1026
+#endif
+
+
 #ifndef FIXED_POINT
 
 #ifdef _MSC_VER
@@ -40,10 +48,7 @@
 #pragma warning(disable:4244)
 #endif
 
-/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */
-#define IQ_TABLE_SIZE  1026
-
-static real_t iq_table[] =
+static real_t iq_table[IQ_TABLE_SIZE] =
 {
     0.0000000000,
     1.0000000000,
@@ -348,8 +353,9 @@
     2008.2988502465,
     2017.2295780088,
     2026.1702013285,
-    2035.1206983489,
-    2044.0810473338,
+    2035.1206983489
+#ifndef SMALL_IQ_TAB
+    ,2044.0810473338,
     2053.0512266659,
     2062.0312148464,
     2071.0209904936,
@@ -1071,14 +1077,12 @@
     10307.8362707111,
     10321.2732407388,
     10334.7145854928
+#endif
 };
 
 #else
 
-/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */
-#define IQ_TABLE_SIZE  8192
-
-static real_t iq_table[] =
+static real_t iq_table[IQ_TABLE_SIZE] =
 {
     REAL_CONST(0.000000/8.0),
     REAL_CONST(1.000000/8.0),
@@ -1382,8 +1386,9 @@
     REAL_CONST(1999.378040/8.0),
     REAL_CONST(2008.298850/8.0),
     REAL_CONST(2017.229578/8.0),
-    REAL_CONST(2026.170201/8.0),
-    REAL_CONST(2035.120698/8.0),
+    REAL_CONST(2026.170201/8.0)
+#ifndef SMALL_IQ_TAB
+    ,REAL_CONST(2035.120698/8.0),
     REAL_CONST(2044.081047/8.0),
     REAL_CONST(2053.051227/8.0),
     REAL_CONST(2062.031215/8.0),
@@ -2105,7173 +2110,8 @@
     REAL_CONST(10294.403678/8.0),
     REAL_CONST(10307.836271/8.0),
     REAL_CONST(10321.273241/8.0),
-    REAL_CONST(10334.714585/8.0),
-    REAL_CONST(10348.160302/8.0),
-    REAL_CONST(10361.610388/8.0),
-    REAL_CONST(10375.064840/8.0),
-    REAL_CONST(10388.523655/8.0),
-    REAL_CONST(10401.986831/8.0),
-    REAL_CONST(10415.454364/8.0),
-    REAL_CONST(10428.926253/8.0),
-    REAL_CONST(10442.402493/8.0),
-    REAL_CONST(10455.883083/8.0),
-    REAL_CONST(10469.368019/8.0),
-    REAL_CONST(10482.857299/8.0),
-    REAL_CONST(10496.350920/8.0),
-    REAL_CONST(10509.848879/8.0),
-    REAL_CONST(10523.351173/8.0),
-    REAL_CONST(10536.857800/8.0),
-    REAL_CONST(10550.368756/8.0),
-    REAL_CONST(10563.884040/8.0),
-    REAL_CONST(10577.403647/8.0),
-    REAL_CONST(10590.927576/8.0),
-    REAL_CONST(10604.455824/8.0),
-    REAL_CONST(10617.988388/8.0),
-    REAL_CONST(10631.525265/8.0),
-    REAL_CONST(10645.066452/8.0),
-    REAL_CONST(10658.611947/8.0),
-    REAL_CONST(10672.161747/8.0),
-    REAL_CONST(10685.715849/8.0),
-    REAL_CONST(10699.274250/8.0),
-    REAL_CONST(10712.836948/8.0),
-    REAL_CONST(10726.403941/8.0),
-    REAL_CONST(10739.975224/8.0),
-    REAL_CONST(10753.550797/8.0),
-    REAL_CONST(10767.130655/8.0),
-    REAL_CONST(10780.714796/8.0),
-    REAL_CONST(10794.303218/8.0),
-    REAL_CONST(10807.895918/8.0),
-    REAL_CONST(10821.492892/8.0),
-    REAL_CONST(10835.094140/8.0),
-    REAL_CONST(10848.699656/8.0),
-    REAL_CONST(10862.309440/8.0),
-    REAL_CONST(10875.923489/8.0),
-    REAL_CONST(10889.541799/8.0),
-    REAL_CONST(10903.164368/8.0),
-    REAL_CONST(10916.791193/8.0),
-    REAL_CONST(10930.422273/8.0),
-    REAL_CONST(10944.057603/8.0),
-    REAL_CONST(10957.697182/8.0),
-    REAL_CONST(10971.341006/8.0),
-    REAL_CONST(10984.989074/8.0),
-    REAL_CONST(10998.641382/8.0),
-    REAL_CONST(11012.297928/8.0),
-    REAL_CONST(11025.958709/8.0),
-    REAL_CONST(11039.623723/8.0),
-    REAL_CONST(11053.292967/8.0),
-    REAL_CONST(11066.966438/8.0),
-    REAL_CONST(11080.644134/8.0),
-    REAL_CONST(11094.326053/8.0),
-    REAL_CONST(11108.012190/8.0),
-    REAL_CONST(11121.702545/8.0),
-    REAL_CONST(11135.397114/8.0),
-    REAL_CONST(11149.095895/8.0),
-    REAL_CONST(11162.798885/8.0),
-    REAL_CONST(11176.506082/8.0),
-    REAL_CONST(11190.217483/8.0),
-    REAL_CONST(11203.933085/8.0),
-    REAL_CONST(11217.652886/8.0),
-    REAL_CONST(11231.376883/8.0),
-    REAL_CONST(11245.105074/8.0),
-    REAL_CONST(11258.837456/8.0),
-    REAL_CONST(11272.574027/8.0),
-    REAL_CONST(11286.314784/8.0),
-    REAL_CONST(11300.059724/8.0),
-    REAL_CONST(11313.808846/8.0),
-    REAL_CONST(11327.562145/8.0),
-    REAL_CONST(11341.319621/8.0),
-    REAL_CONST(11355.081270/8.0),
-    REAL_CONST(11368.847090/8.0),
-    REAL_CONST(11382.617078/8.0),
-    REAL_CONST(11396.391232/8.0),
-    REAL_CONST(11410.169549/8.0),
-    REAL_CONST(11423.952027/8.0),
-    REAL_CONST(11437.738663/8.0),
-    REAL_CONST(11451.529455/8.0),
-    REAL_CONST(11465.324400/8.0),
-    REAL_CONST(11479.123496/8.0),
-    REAL_CONST(11492.926740/8.0),
-    REAL_CONST(11506.734130/8.0),
-    REAL_CONST(11520.545663/8.0),
-    REAL_CONST(11534.361337/8.0),
-    REAL_CONST(11548.181150/8.0),
-    REAL_CONST(11562.005097/8.0),
-    REAL_CONST(11575.833179/8.0),
-    REAL_CONST(11589.665391/8.0),
-    REAL_CONST(11603.501732/8.0),
-    REAL_CONST(11617.342198/8.0),
-    REAL_CONST(11631.186788/8.0),
-    REAL_CONST(11645.035499/8.0),
-    REAL_CONST(11658.888329/8.0),
-    REAL_CONST(11672.745275/8.0),
-    REAL_CONST(11686.606334/8.0),
-    REAL_CONST(11700.471505/8.0),
-    REAL_CONST(11714.340784/8.0),
-    REAL_CONST(11728.214170/8.0),
-    REAL_CONST(11742.091660/8.0),
-    REAL_CONST(11755.973251/8.0),
-    REAL_CONST(11769.858942/8.0),
-    REAL_CONST(11783.748729/8.0),
-    REAL_CONST(11797.642610/8.0),
-    REAL_CONST(11811.540583/8.0),
-    REAL_CONST(11825.442646/8.0),
-    REAL_CONST(11839.348796/8.0),
-    REAL_CONST(11853.259030/8.0),
-    REAL_CONST(11867.173347/8.0),
-    REAL_CONST(11881.091743/8.0),
-    REAL_CONST(11895.014217/8.0),
-    REAL_CONST(11908.940766/8.0),
-    REAL_CONST(11922.871387/8.0),
-    REAL_CONST(11936.806079/8.0),
-    REAL_CONST(11950.744839/8.0),
-    REAL_CONST(11964.687665/8.0),
-    REAL_CONST(11978.634553/8.0),
-    REAL_CONST(11992.585503/8.0),
-    REAL_CONST(12006.540511/8.0),
-    REAL_CONST(12020.499575/8.0),
-    REAL_CONST(12034.462692/8.0),
-    REAL_CONST(12048.429861/8.0),
-    REAL_CONST(12062.401080/8.0),
-    REAL_CONST(12076.376345/8.0),
-    REAL_CONST(12090.355654/8.0),
-    REAL_CONST(12104.339005/8.0),
-    REAL_CONST(12118.326396/8.0),
-    REAL_CONST(12132.317824/8.0),
-    REAL_CONST(12146.313287/8.0),
-    REAL_CONST(12160.312783/8.0),
-    REAL_CONST(12174.316310/8.0),
-    REAL_CONST(12188.323864/8.0),
-    REAL_CONST(12202.335444/8.0),
-    REAL_CONST(12216.351048/8.0),
-    REAL_CONST(12230.370673/8.0),
-    REAL_CONST(12244.394316/8.0),
-    REAL_CONST(12258.421976/8.0),
-    REAL_CONST(12272.453650/8.0),
-    REAL_CONST(12286.489336/8.0),
-    REAL_CONST(12300.529032/8.0),
-    REAL_CONST(12314.572735/8.0),
-    REAL_CONST(12328.620443/8.0),
-    REAL_CONST(12342.672154/8.0),
-    REAL_CONST(12356.727866/8.0),
-    REAL_CONST(12370.787575/8.0),
-    REAL_CONST(12384.851281/8.0),
-    REAL_CONST(12398.918980/8.0),
-    REAL_CONST(12412.990671/8.0),
-    REAL_CONST(12427.066351/8.0),
-    REAL_CONST(12441.146017/8.0),
-    REAL_CONST(12455.229668/8.0),
-    REAL_CONST(12469.317302/8.0),
-    REAL_CONST(12483.408916/8.0),
-    REAL_CONST(12497.504507/8.0),
-    REAL_CONST(12511.604075/8.0),
-    REAL_CONST(12525.707615/8.0),
-    REAL_CONST(12539.815127/8.0),
-    REAL_CONST(12553.926608/8.0),
-    REAL_CONST(12568.042055/8.0),
-    REAL_CONST(12582.161467/8.0),
-    REAL_CONST(12596.284841/8.0),
-    REAL_CONST(12610.412175/8.0),
-    REAL_CONST(12624.543467/8.0),
-    REAL_CONST(12638.678715/8.0),
-    REAL_CONST(12652.817915/8.0),
-    REAL_CONST(12666.961067/8.0),
-    REAL_CONST(12681.108168/8.0),
-    REAL_CONST(12695.259216/8.0),
-    REAL_CONST(12709.414208/8.0),
-    REAL_CONST(12723.573143/8.0),
-    REAL_CONST(12737.736018/8.0),
-    REAL_CONST(12751.902830/8.0),
-    REAL_CONST(12766.073579/8.0),
-    REAL_CONST(12780.248261/8.0),
-    REAL_CONST(12794.426874/8.0),
-    REAL_CONST(12808.609417/8.0),
-    REAL_CONST(12822.795886/8.0),
-    REAL_CONST(12836.986281/8.0),
-    REAL_CONST(12851.180598/8.0),
-    REAL_CONST(12865.378836/8.0),
-    REAL_CONST(12879.580992/8.0),
-    REAL_CONST(12893.787065/8.0),
-    REAL_CONST(12907.997051/8.0),
-    REAL_CONST(12922.210950/8.0),
-    REAL_CONST(12936.428758/8.0),
-    REAL_CONST(12950.650474/8.0),
-    REAL_CONST(12964.876095/8.0),
-    REAL_CONST(12979.105619/8.0),
-    REAL_CONST(12993.339045/8.0),
-    REAL_CONST(13007.576370/8.0),
-    REAL_CONST(13021.817591/8.0),
-    REAL_CONST(13036.062708/8.0),
-    REAL_CONST(13050.311717/8.0),
-    REAL_CONST(13064.564616/8.0),
-    REAL_CONST(13078.821404/8.0),
-    REAL_CONST(13093.082079/8.0),
-    REAL_CONST(13107.346637/8.0),
-    REAL_CONST(13121.615077/8.0),
-    REAL_CONST(13135.887398/8.0),
-    REAL_CONST(13150.163596/8.0),
-    REAL_CONST(13164.443670/8.0),
-    REAL_CONST(13178.727617/8.0),
-    REAL_CONST(13193.015436/8.0),
-    REAL_CONST(13207.307125/8.0),
-    REAL_CONST(13221.602680/8.0),
-    REAL_CONST(13235.902101/8.0),
-    REAL_CONST(13250.205385/8.0),
-    REAL_CONST(13264.512531/8.0),
-    REAL_CONST(13278.823535/8.0),
-    REAL_CONST(13293.138396/8.0),
-    REAL_CONST(13307.457112/8.0),
-    REAL_CONST(13321.779680/8.0),
-    REAL_CONST(13336.106100/8.0),
-    REAL_CONST(13350.436367/8.0),
-    REAL_CONST(13364.770482/8.0),
-    REAL_CONST(13379.108441/8.0),
-    REAL_CONST(13393.450242/8.0),
-    REAL_CONST(13407.795884/8.0),
-    REAL_CONST(13422.145364/8.0),
-    REAL_CONST(13436.498680/8.0),
-    REAL_CONST(13450.855830/8.0),
-    REAL_CONST(13465.216813/8.0),
-    REAL_CONST(13479.581625/8.0),
-    REAL_CONST(13493.950266/8.0),
-    REAL_CONST(13508.322733/8.0),
-    REAL_CONST(13522.699024/8.0),
-    REAL_CONST(13537.079136/8.0),
-    REAL_CONST(13551.463069/8.0),
-    REAL_CONST(13565.850819/8.0),
-    REAL_CONST(13580.242386/8.0),
-    REAL_CONST(13594.637766/8.0),
-    REAL_CONST(13609.036958/8.0),
-    REAL_CONST(13623.439960/8.0),
-    REAL_CONST(13637.846770/8.0),
-    REAL_CONST(13652.257385/8.0),
-    REAL_CONST(13666.671804/8.0),
-    REAL_CONST(13681.090025/8.0),
-    REAL_CONST(13695.512046/8.0),
-    REAL_CONST(13709.937865/8.0),
-    REAL_CONST(13724.367479/8.0),
-    REAL_CONST(13738.800887/8.0),
-    REAL_CONST(13753.238087/8.0),
-    REAL_CONST(13767.679077/8.0),
-    REAL_CONST(13782.123854/8.0),
-    REAL_CONST(13796.572417/8.0),
-    REAL_CONST(13811.024765/8.0),
-    REAL_CONST(13825.480893/8.0),
-    REAL_CONST(13839.940802/8.0),
-    REAL_CONST(13854.404489/8.0),
-    REAL_CONST(13868.871952/8.0),
-    REAL_CONST(13883.343188/8.0),
-    REAL_CONST(13897.818197/8.0),
-    REAL_CONST(13912.296976/8.0),
-    REAL_CONST(13926.779522/8.0),
-    REAL_CONST(13941.265835/8.0),
-    REAL_CONST(13955.755912/8.0),
-    REAL_CONST(13970.249751/8.0),
-    REAL_CONST(13984.747351/8.0),
-    REAL_CONST(13999.248708/8.0),
-    REAL_CONST(14013.753822/8.0),
-    REAL_CONST(14028.262691/8.0),
-    REAL_CONST(14042.775312/8.0),
-    REAL_CONST(14057.291683/8.0),
-    REAL_CONST(14071.811803/8.0),
-    REAL_CONST(14086.335669/8.0),
-    REAL_CONST(14100.863281/8.0),
-    REAL_CONST(14115.394635/8.0),
-    REAL_CONST(14129.929730/8.0),
-    REAL_CONST(14144.468564/8.0),
-    REAL_CONST(14159.011135/8.0),
-    REAL_CONST(14173.557441/8.0),
-    REAL_CONST(14188.107480/8.0),
-    REAL_CONST(14202.661250/8.0),
-    REAL_CONST(14217.218750/8.0),
-    REAL_CONST(14231.779977/8.0),
-    REAL_CONST(14246.344930/8.0),
-    REAL_CONST(14260.913606/8.0),
-    REAL_CONST(14275.486004/8.0),
-    REAL_CONST(14290.062122/8.0),
-    REAL_CONST(14304.641958/8.0),
-    REAL_CONST(14319.225510/8.0),
-    REAL_CONST(14333.812776/8.0),
-    REAL_CONST(14348.403754/8.0),
-    REAL_CONST(14362.998443/8.0),
-    REAL_CONST(14377.596840/8.0),
-    REAL_CONST(14392.198943/8.0),
-    REAL_CONST(14406.804752/8.0),
-    REAL_CONST(14421.414263/8.0),
-    REAL_CONST(14436.027475/8.0),
-    REAL_CONST(14450.644386/8.0),
-    REAL_CONST(14465.264995/8.0),
-    REAL_CONST(14479.889298/8.0),
-    REAL_CONST(14494.517296/8.0),
-    REAL_CONST(14509.148984/8.0),
-    REAL_CONST(14523.784363/8.0),
-    REAL_CONST(14538.423430/8.0),
-    REAL_CONST(14553.066182/8.0),
-    REAL_CONST(14567.712619/8.0),
-    REAL_CONST(14582.362738/8.0),
-    REAL_CONST(14597.016537/8.0),
-    REAL_CONST(14611.674015/8.0),
-    REAL_CONST(14626.335170/8.0),
-    REAL_CONST(14641.000000/8.0),
-    REAL_CONST(14655.668503/8.0),
-    REAL_CONST(14670.340677/8.0),
-    REAL_CONST(14685.016521/8.0),
-    REAL_CONST(14699.696032/8.0),
-    REAL_CONST(14714.379209/8.0),
-    REAL_CONST(14729.066050/8.0),
-    REAL_CONST(14743.756553/8.0),
-    REAL_CONST(14758.450716/8.0),
-    REAL_CONST(14773.148537/8.0),
-    REAL_CONST(14787.850016/8.0),
-    REAL_CONST(14802.555149/8.0),
-    REAL_CONST(14817.263935/8.0),
-    REAL_CONST(14831.976372/8.0),
-    REAL_CONST(14846.692459/8.0),
-    REAL_CONST(14861.412193/8.0),
-    REAL_CONST(14876.135573/8.0),
-    REAL_CONST(14890.862597/8.0),
-    REAL_CONST(14905.593263/8.0),
-    REAL_CONST(14920.327569/8.0),
-    REAL_CONST(14935.065514/8.0),
-    REAL_CONST(14949.807096/8.0),
-    REAL_CONST(14964.552313/8.0),
-    REAL_CONST(14979.301163/8.0),
-    REAL_CONST(14994.053644/8.0),
-    REAL_CONST(15008.809755/8.0),
-    REAL_CONST(15023.569493/8.0),
-    REAL_CONST(15038.332858/8.0),
-    REAL_CONST(15053.099847/8.0),
-    REAL_CONST(15067.870458/8.0),
-    REAL_CONST(15082.644690/8.0),
-    REAL_CONST(15097.422541/8.0),
-    REAL_CONST(15112.204010/8.0),
-    REAL_CONST(15126.989093/8.0),
-    REAL_CONST(15141.777790/8.0),
-    REAL_CONST(15156.570099/8.0),
-    REAL_CONST(15171.366018/8.0),
-    REAL_CONST(15186.165546/8.0),
-    REAL_CONST(15200.968679/8.0),
-    REAL_CONST(15215.775418/8.0),
-    REAL_CONST(15230.585760/8.0),
-    REAL_CONST(15245.399703/8.0),
-    REAL_CONST(15260.217246/8.0),
-    REAL_CONST(15275.038386/8.0),
-    REAL_CONST(15289.863123/8.0),
-    REAL_CONST(15304.691453/8.0),
-    REAL_CONST(15319.523377/8.0),
-    REAL_CONST(15334.358891/8.0),
-    REAL_CONST(15349.197994/8.0),
-    REAL_CONST(15364.040685/8.0),
-    REAL_CONST(15378.886961/8.0),
-    REAL_CONST(15393.736821/8.0),
-    REAL_CONST(15408.590264/8.0),
-    REAL_CONST(15423.447287/8.0),
-    REAL_CONST(15438.307888/8.0),
-    REAL_CONST(15453.172066/8.0),
-    REAL_CONST(15468.039820/8.0),
-    REAL_CONST(15482.911148/8.0),
-    REAL_CONST(15497.786047/8.0),
-    REAL_CONST(15512.664516/8.0),
-    REAL_CONST(15527.546554/8.0),
-    REAL_CONST(15542.432158/8.0),
-    REAL_CONST(15557.321327/8.0),
-    REAL_CONST(15572.214060/8.0),
-    REAL_CONST(15587.110354/8.0),
-    REAL_CONST(15602.010208/8.0),
-    REAL_CONST(15616.913620/8.0),
-    REAL_CONST(15631.820589/8.0),
-    REAL_CONST(15646.731113/8.0),
-    REAL_CONST(15661.645189/8.0),
-    REAL_CONST(15676.562817/8.0),
-    REAL_CONST(15691.483995/8.0),
-    REAL_CONST(15706.408720/8.0),
-    REAL_CONST(15721.336993/8.0),
-    REAL_CONST(15736.268809/8.0),
-    REAL_CONST(15751.204169/8.0),
-    REAL_CONST(15766.143070/8.0),
-    REAL_CONST(15781.085510/8.0),
-    REAL_CONST(15796.031489/8.0),
-    REAL_CONST(15810.981003/8.0),
-    REAL_CONST(15825.934053/8.0),
-    REAL_CONST(15840.890635/8.0),
-    REAL_CONST(15855.850748/8.0),
-    REAL_CONST(15870.814391/8.0),
-    REAL_CONST(15885.781562/8.0),
-    REAL_CONST(15900.752259/8.0),
-    REAL_CONST(15915.726481/8.0),
-    REAL_CONST(15930.704226/8.0),
-    REAL_CONST(15945.685492/8.0),
-    REAL_CONST(15960.670278/8.0),
-    REAL_CONST(15975.658581/8.0),
-    REAL_CONST(15990.650401/8.0),
-    REAL_CONST(16005.645736/8.0),
-    REAL_CONST(16020.644583/8.0),
-    REAL_CONST(16035.646942/8.0),
-    REAL_CONST(16050.652811/8.0),
-    REAL_CONST(16065.662188/8.0),
-    REAL_CONST(16080.675071/8.0),
-    REAL_CONST(16095.691459/8.0),
-    REAL_CONST(16110.711350/8.0),
-    REAL_CONST(16125.734743/8.0),
-    REAL_CONST(16140.761636/8.0),
-    REAL_CONST(16155.792027/8.0),
-    REAL_CONST(16170.825914/8.0),
-    REAL_CONST(16185.863297/8.0),
-    REAL_CONST(16200.904173/8.0),
-    REAL_CONST(16215.948541/8.0),
-    REAL_CONST(16230.996399/8.0),
-    REAL_CONST(16246.047746/8.0),
-    REAL_CONST(16261.102579/8.0),
-    REAL_CONST(16276.160898/8.0),
-    REAL_CONST(16291.222700/8.0),
-    REAL_CONST(16306.287985/8.0),
-    REAL_CONST(16321.356750/8.0),
-    REAL_CONST(16336.428994/8.0),
-    REAL_CONST(16351.504716/8.0),
-    REAL_CONST(16366.583913/8.0),
-    REAL_CONST(16381.666584/8.0),
-    REAL_CONST(16396.752727/8.0),
-    REAL_CONST(16411.842341/8.0),
-    REAL_CONST(16426.935425/8.0),
-    REAL_CONST(16442.031976/8.0),
-    REAL_CONST(16457.131994/8.0),
-    REAL_CONST(16472.235476/8.0),
-    REAL_CONST(16487.342421/8.0),
-    REAL_CONST(16502.452827/8.0),
-    REAL_CONST(16517.566693/8.0),
-    REAL_CONST(16532.684017/8.0),
-    REAL_CONST(16547.804797/8.0),
-    REAL_CONST(16562.929033/8.0),
-    REAL_CONST(16578.056722/8.0),
-    REAL_CONST(16593.187863/8.0),
-    REAL_CONST(16608.322454/8.0),
-    REAL_CONST(16623.460494/8.0),
-    REAL_CONST(16638.601981/8.0),
-    REAL_CONST(16653.746913/8.0),
-    REAL_CONST(16668.895290/8.0),
-    REAL_CONST(16684.047109/8.0),
-    REAL_CONST(16699.202368/8.0),
-    REAL_CONST(16714.361068/8.0),
-    REAL_CONST(16729.523204/8.0),
-    REAL_CONST(16744.688777/8.0),
-    REAL_CONST(16759.857785/8.0),
-    REAL_CONST(16775.030226/8.0),
-    REAL_CONST(16790.206098/8.0),
-    REAL_CONST(16805.385400/8.0),
-    REAL_CONST(16820.568131/8.0),
-    REAL_CONST(16835.754288/8.0),
-    REAL_CONST(16850.943871/8.0),
-    REAL_CONST(16866.136877/8.0),
-    REAL_CONST(16881.333306/8.0),
-    REAL_CONST(16896.533156/8.0),
-    REAL_CONST(16911.736424/8.0),
-    REAL_CONST(16926.943110/8.0),
-    REAL_CONST(16942.153213/8.0),
-    REAL_CONST(16957.366730/8.0),
-    REAL_CONST(16972.583659/8.0),
-    REAL_CONST(16987.804001/8.0),
-    REAL_CONST(17003.027752/8.0),
-    REAL_CONST(17018.254912/8.0),
-    REAL_CONST(17033.485479/8.0),
-    REAL_CONST(17048.719451/8.0),
-    REAL_CONST(17063.956826/8.0),
-    REAL_CONST(17079.197605/8.0),
-    REAL_CONST(17094.441784/8.0),
-    REAL_CONST(17109.689362/8.0),
-    REAL_CONST(17124.940338/8.0),
-    REAL_CONST(17140.194711/8.0),
-    REAL_CONST(17155.452478/8.0),
-    REAL_CONST(17170.713638/8.0),
-    REAL_CONST(17185.978190/8.0),
-    REAL_CONST(17201.246133/8.0),
-    REAL_CONST(17216.517464/8.0),
-    REAL_CONST(17231.792182/8.0),
-    REAL_CONST(17247.070287/8.0),
-    REAL_CONST(17262.351775/8.0),
-    REAL_CONST(17277.636646/8.0),
-    REAL_CONST(17292.924898/8.0),
-    REAL_CONST(17308.216530/8.0),
-    REAL_CONST(17323.511541/8.0),
-    REAL_CONST(17338.809928/8.0),
-    REAL_CONST(17354.111690/8.0),
-    REAL_CONST(17369.416826/8.0),
-    REAL_CONST(17384.725335/8.0),
-    REAL_CONST(17400.037214/8.0),
-    REAL_CONST(17415.352462/8.0),
-    REAL_CONST(17430.671079/8.0),
-    REAL_CONST(17445.993061/8.0),
-    REAL_CONST(17461.318409/8.0),
-    REAL_CONST(17476.647120/8.0),
-    REAL_CONST(17491.979193/8.0),
-    REAL_CONST(17507.314626/8.0),
-    REAL_CONST(17522.653419/8.0),
-    REAL_CONST(17537.995569/8.0),
-    REAL_CONST(17553.341074/8.0),
-    REAL_CONST(17568.689935/8.0),
-    REAL_CONST(17584.042149/8.0),
-    REAL_CONST(17599.397714/8.0),
-    REAL_CONST(17614.756629/8.0),
-    REAL_CONST(17630.118893/8.0),
-    REAL_CONST(17645.484505/8.0),
-    REAL_CONST(17660.853462/8.0),
-    REAL_CONST(17676.225764/8.0),
-    REAL_CONST(17691.601408/8.0),
-    REAL_CONST(17706.980394/8.0),
-    REAL_CONST(17722.362720/8.0),
-    REAL_CONST(17737.748384/8.0),
-    REAL_CONST(17753.137386/8.0),
-    REAL_CONST(17768.529723/8.0),
-    REAL_CONST(17783.925394/8.0),
-    REAL_CONST(17799.324399/8.0),
-    REAL_CONST(17814.726734/8.0),
-    REAL_CONST(17830.132399/8.0),
-    REAL_CONST(17845.541393/8.0),
-    REAL_CONST(17860.953714/8.0),
-    REAL_CONST(17876.369360/8.0),
-    REAL_CONST(17891.788331/8.0),
-    REAL_CONST(17907.210624/8.0),
-    REAL_CONST(17922.636238/8.0),
-    REAL_CONST(17938.065173/8.0),
-    REAL_CONST(17953.497425/8.0),
-    REAL_CONST(17968.932995/8.0),
-    REAL_CONST(17984.371880/8.0),
-    REAL_CONST(17999.814079/8.0),
-    REAL_CONST(18015.259591/8.0),
-    REAL_CONST(18030.708415/8.0),
-    REAL_CONST(18046.160548/8.0),
-    REAL_CONST(18061.615990/8.0),
-    REAL_CONST(18077.074738/8.0),
-    REAL_CONST(18092.536793/8.0),
-    REAL_CONST(18108.002151/8.0),
-    REAL_CONST(18123.470813/8.0),
-    REAL_CONST(18138.942775/8.0),
-    REAL_CONST(18154.418038/8.0),
-    REAL_CONST(18169.896599/8.0),
-    REAL_CONST(18185.378458/8.0),
-    REAL_CONST(18200.863612/8.0),
-    REAL_CONST(18216.352060/8.0),
-    REAL_CONST(18231.843802/8.0),
-    REAL_CONST(18247.338835/8.0),
-    REAL_CONST(18262.837158/8.0),
-    REAL_CONST(18278.338770/8.0),
-    REAL_CONST(18293.843670/8.0),
-    REAL_CONST(18309.351855/8.0),
-    REAL_CONST(18324.863325/8.0),
-    REAL_CONST(18340.378078/8.0),
-    REAL_CONST(18355.896113/8.0),
-    REAL_CONST(18371.417429/8.0),
-    REAL_CONST(18386.942023/8.0),
-    REAL_CONST(18402.469895/8.0),
-    REAL_CONST(18418.001044/8.0),
-    REAL_CONST(18433.535467/8.0),
-    REAL_CONST(18449.073164/8.0),
-    REAL_CONST(18464.614133/8.0),
-    REAL_CONST(18480.158372/8.0),
-    REAL_CONST(18495.705881/8.0),
-    REAL_CONST(18511.256658/8.0),
-    REAL_CONST(18526.810702/8.0),
-    REAL_CONST(18542.368011/8.0),
-    REAL_CONST(18557.928583/8.0),
-    REAL_CONST(18573.492419/8.0),
-    REAL_CONST(18589.059515/8.0),
-    REAL_CONST(18604.629871/8.0),
-    REAL_CONST(18620.203486/8.0),
-    REAL_CONST(18635.780358/8.0),
-    REAL_CONST(18651.360485/8.0),
-    REAL_CONST(18666.943867/8.0),
-    REAL_CONST(18682.530502/8.0),
-    REAL_CONST(18698.120388/8.0),
-    REAL_CONST(18713.713525/8.0),
-    REAL_CONST(18729.309910/8.0),
-    REAL_CONST(18744.909543/8.0),
-    REAL_CONST(18760.512422/8.0),
-    REAL_CONST(18776.118546/8.0),
-    REAL_CONST(18791.727914/8.0),
-    REAL_CONST(18807.340524/8.0),
-    REAL_CONST(18822.956374/8.0),
-    REAL_CONST(18838.575465/8.0),
-    REAL_CONST(18854.197793/8.0),
-    REAL_CONST(18869.823358/8.0),
-    REAL_CONST(18885.452158/8.0),
-    REAL_CONST(18901.084193/8.0),
-    REAL_CONST(18916.719460/8.0),
-    REAL_CONST(18932.357959/8.0),
-    REAL_CONST(18947.999687/8.0),
-    REAL_CONST(18963.644645/8.0),
-    REAL_CONST(18979.292830/8.0),
-    REAL_CONST(18994.944241/8.0),
-    REAL_CONST(19010.598877/8.0),
-    REAL_CONST(19026.256736/8.0),
-    REAL_CONST(19041.917817/8.0),
-    REAL_CONST(19057.582120/8.0),
-    REAL_CONST(19073.249641/8.0),
-    REAL_CONST(19088.920381/8.0),
-    REAL_CONST(19104.594338/8.0),
-    REAL_CONST(19120.271510/8.0),
-    REAL_CONST(19135.951896/8.0),
-    REAL_CONST(19151.635495/8.0),
-    REAL_CONST(19167.322306/8.0),
-    REAL_CONST(19183.012327/8.0),
-    REAL_CONST(19198.705557/8.0),
-    REAL_CONST(19214.401994/8.0),
-    REAL_CONST(19230.101638/8.0),
-    REAL_CONST(19245.804487/8.0),
-    REAL_CONST(19261.510539/8.0),
-    REAL_CONST(19277.219794/8.0),
-    REAL_CONST(19292.932250/8.0),
-    REAL_CONST(19308.647906/8.0),
-    REAL_CONST(19324.366760/8.0),
-    REAL_CONST(19340.088811/8.0),
-    REAL_CONST(19355.814058/8.0),
-    REAL_CONST(19371.542500/8.0),
-    REAL_CONST(19387.274135/8.0),
-    REAL_CONST(19403.008962/8.0),
-    REAL_CONST(19418.746980/8.0),
-    REAL_CONST(19434.488187/8.0),
-    REAL_CONST(19450.232582/8.0),
-    REAL_CONST(19465.980164/8.0),
-    REAL_CONST(19481.730931/8.0),
-    REAL_CONST(19497.484883/8.0),
-    REAL_CONST(19513.242017/8.0),
-    REAL_CONST(19529.002334/8.0),
-    REAL_CONST(19544.765830/8.0),
-    REAL_CONST(19560.532506/8.0),
-    REAL_CONST(19576.302359/8.0),
-    REAL_CONST(19592.075389/8.0),
-    REAL_CONST(19607.851595/8.0),
-    REAL_CONST(19623.630974/8.0),
-    REAL_CONST(19639.413526/8.0),
-    REAL_CONST(19655.199249/8.0),
-    REAL_CONST(19670.988143/8.0),
-    REAL_CONST(19686.780205/8.0),
-    REAL_CONST(19702.575435/8.0),
-    REAL_CONST(19718.373831/8.0),
-    REAL_CONST(19734.175393/8.0),
-    REAL_CONST(19749.980118/8.0),
-    REAL_CONST(19765.788005/8.0),
-    REAL_CONST(19781.599054/8.0),
-    REAL_CONST(19797.413263/8.0),
-    REAL_CONST(19813.230631/8.0),
-    REAL_CONST(19829.051156/8.0),
-    REAL_CONST(19844.874837/8.0),
-    REAL_CONST(19860.701674/8.0),
-    REAL_CONST(19876.531664/8.0),
-    REAL_CONST(19892.364806/8.0),
-    REAL_CONST(19908.201100/8.0),
-    REAL_CONST(19924.040543/8.0),
-    REAL_CONST(19939.883136/8.0),
-    REAL_CONST(19955.728875/8.0),
-    REAL_CONST(19971.577761/8.0),
-    REAL_CONST(19987.429792/8.0),
-    REAL_CONST(20003.284967/8.0),
-    REAL_CONST(20019.143283/8.0),
-    REAL_CONST(20035.004742/8.0),
-    REAL_CONST(20050.869340/8.0),
-    REAL_CONST(20066.737076/8.0),
-    REAL_CONST(20082.607951/8.0),
-    REAL_CONST(20098.481961/8.0),
-    REAL_CONST(20114.359107/8.0),
-    REAL_CONST(20130.239386/8.0),
-    REAL_CONST(20146.122798/8.0),
-    REAL_CONST(20162.009341/8.0),
-    REAL_CONST(20177.899014/8.0),
-    REAL_CONST(20193.791815/8.0),
-    REAL_CONST(20209.687745/8.0),
-    REAL_CONST(20225.586801/8.0),
-    REAL_CONST(20241.488982/8.0),
-    REAL_CONST(20257.394286/8.0),
-    REAL_CONST(20273.302714/8.0),
-    REAL_CONST(20289.214263/8.0),
-    REAL_CONST(20305.128932/8.0),
-    REAL_CONST(20321.046720/8.0),
-    REAL_CONST(20336.967626/8.0),
-    REAL_CONST(20352.891648/8.0),
-    REAL_CONST(20368.818786/8.0),
-    REAL_CONST(20384.749038/8.0),
-    REAL_CONST(20400.682403/8.0),
-    REAL_CONST(20416.618879/8.0),
-    REAL_CONST(20432.558466/8.0),
-    REAL_CONST(20448.501162/8.0),
-    REAL_CONST(20464.446967/8.0),
-    REAL_CONST(20480.395878/8.0),
-    REAL_CONST(20496.347894/8.0),
-    REAL_CONST(20512.303016/8.0),
-    REAL_CONST(20528.261240/8.0),
-    REAL_CONST(20544.222566/8.0),
-    REAL_CONST(20560.186993/8.0),
-    REAL_CONST(20576.154520/8.0),
-    REAL_CONST(20592.125145/8.0),
-    REAL_CONST(20608.098867/8.0),
-    REAL_CONST(20624.075685/8.0),
-    REAL_CONST(20640.055598/8.0),
-    REAL_CONST(20656.038605/8.0),
-    REAL_CONST(20672.024704/8.0),
-    REAL_CONST(20688.013894/8.0),
-    REAL_CONST(20704.006174/8.0),
-    REAL_CONST(20720.001543/8.0),
-    REAL_CONST(20736.000000/8.0),
-    REAL_CONST(20752.001543/8.0),
-    REAL_CONST(20768.006171/8.0),
-    REAL_CONST(20784.013884/8.0),
-    REAL_CONST(20800.024679/8.0),
-    REAL_CONST(20816.038555/8.0),
-    REAL_CONST(20832.055513/8.0),
-    REAL_CONST(20848.075549/8.0),
-    REAL_CONST(20864.098664/8.0),
-    REAL_CONST(20880.124856/8.0),
-    REAL_CONST(20896.154123/8.0),
-    REAL_CONST(20912.186465/8.0),
-    REAL_CONST(20928.221880/8.0),
-    REAL_CONST(20944.260368/8.0),
-    REAL_CONST(20960.301926/8.0),
-    REAL_CONST(20976.346555/8.0),
-    REAL_CONST(20992.394252/8.0),
-    REAL_CONST(21008.445017/8.0),
-    REAL_CONST(21024.498848/8.0),
-    REAL_CONST(21040.555744/8.0),
-    REAL_CONST(21056.615704/8.0),
-    REAL_CONST(21072.678727/8.0),
-    REAL_CONST(21088.744812/8.0),
-    REAL_CONST(21104.813957/8.0),
-    REAL_CONST(21120.886161/8.0),
-    REAL_CONST(21136.961424/8.0),
-    REAL_CONST(21153.039743/8.0),
-    REAL_CONST(21169.121119/8.0),
-    REAL_CONST(21185.205549/8.0),
-    REAL_CONST(21201.293033/8.0),
-    REAL_CONST(21217.383569/8.0),
-    REAL_CONST(21233.477156/8.0),
-    REAL_CONST(21249.573794/8.0),
-    REAL_CONST(21265.673480/8.0),
-    REAL_CONST(21281.776214/8.0),
-    REAL_CONST(21297.881994/8.0),
-    REAL_CONST(21313.990820/8.0),
-    REAL_CONST(21330.102690/8.0),
-    REAL_CONST(21346.217604/8.0),
-    REAL_CONST(21362.335559/8.0),
-    REAL_CONST(21378.456556/8.0),
-    REAL_CONST(21394.580591/8.0),
-    REAL_CONST(21410.707666/8.0),
-    REAL_CONST(21426.837778/8.0),
-    REAL_CONST(21442.970926/8.0),
-    REAL_CONST(21459.107109/8.0),
-    REAL_CONST(21475.246326/8.0),
-    REAL_CONST(21491.388576/8.0),
-    REAL_CONST(21507.533858/8.0),
-    REAL_CONST(21523.682170/8.0),
-    REAL_CONST(21539.833512/8.0),
-    REAL_CONST(21555.987882/8.0),
-    REAL_CONST(21572.145279/8.0),
-    REAL_CONST(21588.305702/8.0),
-    REAL_CONST(21604.469150/8.0),
-    REAL_CONST(21620.635622/8.0),
-    REAL_CONST(21636.805116/8.0),
-    REAL_CONST(21652.977632/8.0),
-    REAL_CONST(21669.153169/8.0),
-    REAL_CONST(21685.331724/8.0),
-    REAL_CONST(21701.513298/8.0),
-    REAL_CONST(21717.697888/8.0),
-    REAL_CONST(21733.885495/8.0),
-    REAL_CONST(21750.076116/8.0),
-    REAL_CONST(21766.269750/8.0),
-    REAL_CONST(21782.466398/8.0),
-    REAL_CONST(21798.666056/8.0),
-    REAL_CONST(21814.868725/8.0),
-    REAL_CONST(21831.074403/8.0),
-    REAL_CONST(21847.283089/8.0),
-    REAL_CONST(21863.494782/8.0),
-    REAL_CONST(21879.709481/8.0),
-    REAL_CONST(21895.927184/8.0),
-    REAL_CONST(21912.147891/8.0),
-    REAL_CONST(21928.371600/8.0),
-    REAL_CONST(21944.598311/8.0),
-    REAL_CONST(21960.828022/8.0),
-    REAL_CONST(21977.060732/8.0),
-    REAL_CONST(21993.296440/8.0),
-    REAL_CONST(22009.535145/8.0),
-    REAL_CONST(22025.776846/8.0),
-    REAL_CONST(22042.021541/8.0),
-    REAL_CONST(22058.269230/8.0),
-    REAL_CONST(22074.519912/8.0),
-    REAL_CONST(22090.773585/8.0),
-    REAL_CONST(22107.030248/8.0),
-    REAL_CONST(22123.289900/8.0),
-    REAL_CONST(22139.552540/8.0),
-    REAL_CONST(22155.818168/8.0),
-    REAL_CONST(22172.086781/8.0),
-    REAL_CONST(22188.358379/8.0),
-    REAL_CONST(22204.632961/8.0),
-    REAL_CONST(22220.910525/8.0),
-    REAL_CONST(22237.191071/8.0),
-    REAL_CONST(22253.474598/8.0),
-    REAL_CONST(22269.761103/8.0),
-    REAL_CONST(22286.050587/8.0),
-    REAL_CONST(22302.343048/8.0),
-    REAL_CONST(22318.638485/8.0),
-    REAL_CONST(22334.936897/8.0),
-    REAL_CONST(22351.238283/8.0),
-    REAL_CONST(22367.542642/8.0),
-    REAL_CONST(22383.849973/8.0),
-    REAL_CONST(22400.160274/8.0),
-    REAL_CONST(22416.473545/8.0),
-    REAL_CONST(22432.789784/8.0),
-    REAL_CONST(22449.108990/8.0),
-    REAL_CONST(22465.431163/8.0),
-    REAL_CONST(22481.756301/8.0),
-    REAL_CONST(22498.084404/8.0),
-    REAL_CONST(22514.415469/8.0),
-    REAL_CONST(22530.749496/8.0),
-    REAL_CONST(22547.086485/8.0),
-    REAL_CONST(22563.426433/8.0),
-    REAL_CONST(22579.769340/8.0),
-    REAL_CONST(22596.115205/8.0),
-    REAL_CONST(22612.464026/8.0),
-    REAL_CONST(22628.815803/8.0),
-    REAL_CONST(22645.170535/8.0),
-    REAL_CONST(22661.528220/8.0),
-    REAL_CONST(22677.888857/8.0),
-    REAL_CONST(22694.252446/8.0),
-    REAL_CONST(22710.618985/8.0),
-    REAL_CONST(22726.988473/8.0),
-    REAL_CONST(22743.360909/8.0),
-    REAL_CONST(22759.736292/8.0),
-    REAL_CONST(22776.114621/8.0),
-    REAL_CONST(22792.495896/8.0),
-    REAL_CONST(22808.880114/8.0),
-    REAL_CONST(22825.267275/8.0),
-    REAL_CONST(22841.657378/8.0),
-    REAL_CONST(22858.050421/8.0),
-    REAL_CONST(22874.446404/8.0),
-    REAL_CONST(22890.845326/8.0),
-    REAL_CONST(22907.247185/8.0),
-    REAL_CONST(22923.651981/8.0),
-    REAL_CONST(22940.059712/8.0),
-    REAL_CONST(22956.470378/8.0),
-    REAL_CONST(22972.883977/8.0),
-    REAL_CONST(22989.300508/8.0),
-    REAL_CONST(23005.719971/8.0),
-    REAL_CONST(23022.142364/8.0),
-    REAL_CONST(23038.567686/8.0),
-    REAL_CONST(23054.995936/8.0),
-    REAL_CONST(23071.427113/8.0),
-    REAL_CONST(23087.861216/8.0),
-    REAL_CONST(23104.298245/8.0),
-    REAL_CONST(23120.738197/8.0),
-    REAL_CONST(23137.181072/8.0),
-    REAL_CONST(23153.626869/8.0),
-    REAL_CONST(23170.075587/8.0),
-    REAL_CONST(23186.527224/8.0),
-    REAL_CONST(23202.981781/8.0),
-    REAL_CONST(23219.439255/8.0),
-    REAL_CONST(23235.899646/8.0),
-    REAL_CONST(23252.362952/8.0),
-    REAL_CONST(23268.829173/8.0),
-    REAL_CONST(23285.298308/8.0),
-    REAL_CONST(23301.770356/8.0),
-    REAL_CONST(23318.245314/8.0),
-    REAL_CONST(23334.723184/8.0),
-    REAL_CONST(23351.203963/8.0),
-    REAL_CONST(23367.687650/8.0),
-    REAL_CONST(23384.174245/8.0),
-    REAL_CONST(23400.663746/8.0),
-    REAL_CONST(23417.156152/8.0),
-    REAL_CONST(23433.651463/8.0),
-    REAL_CONST(23450.149677/8.0),
-    REAL_CONST(23466.650794/8.0),
-    REAL_CONST(23483.154812/8.0),
-    REAL_CONST(23499.661730/8.0),
-    REAL_CONST(23516.171547/8.0),
-    REAL_CONST(23532.684263/8.0),
-    REAL_CONST(23549.199876/8.0),
-    REAL_CONST(23565.718385/8.0),
-    REAL_CONST(23582.239789/8.0),
-    REAL_CONST(23598.764087/8.0),
-    REAL_CONST(23615.291279/8.0),
-    REAL_CONST(23631.821363/8.0),
-    REAL_CONST(23648.354338/8.0),
-    REAL_CONST(23664.890203/8.0),
-    REAL_CONST(23681.428957/8.0),
-    REAL_CONST(23697.970599/8.0),
-    REAL_CONST(23714.515128/8.0),
-    REAL_CONST(23731.062544/8.0),
-    REAL_CONST(23747.612844/8.0),
-    REAL_CONST(23764.166029/8.0),
-    REAL_CONST(23780.722096/8.0),
-    REAL_CONST(23797.281046/8.0),
-    REAL_CONST(23813.842877/8.0),
-    REAL_CONST(23830.407588/8.0),
-    REAL_CONST(23846.975178/8.0),
-    REAL_CONST(23863.545646/8.0),
-    REAL_CONST(23880.118991/8.0),
-    REAL_CONST(23896.695212/8.0),
-    REAL_CONST(23913.274308/8.0),
-    REAL_CONST(23929.856278/8.0),
-    REAL_CONST(23946.441122/8.0),
-    REAL_CONST(23963.028837/8.0),
-    REAL_CONST(23979.619424/8.0),
-    REAL_CONST(23996.212880/8.0),
-    REAL_CONST(24012.809206/8.0),
-    REAL_CONST(24029.408400/8.0),
-    REAL_CONST(24046.010461/8.0),
-    REAL_CONST(24062.615388/8.0),
-    REAL_CONST(24079.223180/8.0),
-    REAL_CONST(24095.833837/8.0),
-    REAL_CONST(24112.447356/8.0),
-    REAL_CONST(24129.063738/8.0),
-    REAL_CONST(24145.682981/8.0),
-    REAL_CONST(24162.305084/8.0),
-    REAL_CONST(24178.930046/8.0),
-    REAL_CONST(24195.557867/8.0),
-    REAL_CONST(24212.188545/8.0),
-    REAL_CONST(24228.822079/8.0),
-    REAL_CONST(24245.458468/8.0),
-    REAL_CONST(24262.097712/8.0),
-    REAL_CONST(24278.739809/8.0),
-    REAL_CONST(24295.384759/8.0),
-    REAL_CONST(24312.032559/8.0),
-    REAL_CONST(24328.683211/8.0),
-    REAL_CONST(24345.336711/8.0),
-    REAL_CONST(24361.993060/8.0),
-    REAL_CONST(24378.652257/8.0),
-    REAL_CONST(24395.314300/8.0),
-    REAL_CONST(24411.979189/8.0),
-    REAL_CONST(24428.646922/8.0),
-    REAL_CONST(24445.317499/8.0),
-    REAL_CONST(24461.990918/8.0),
-    REAL_CONST(24478.667179/8.0),
-    REAL_CONST(24495.346281/8.0),
-    REAL_CONST(24512.028223/8.0),
-    REAL_CONST(24528.713003/8.0),
-    REAL_CONST(24545.400621/8.0),
-    REAL_CONST(24562.091076/8.0),
-    REAL_CONST(24578.784367/8.0),
-    REAL_CONST(24595.480492/8.0),
-    REAL_CONST(24612.179452/8.0),
-    REAL_CONST(24628.881244/8.0),
-    REAL_CONST(24645.585869/8.0),
-    REAL_CONST(24662.293325/8.0),
-    REAL_CONST(24679.003610/8.0),
-    REAL_CONST(24695.716725/8.0),
-    REAL_CONST(24712.432668/8.0),
-    REAL_CONST(24729.151438/8.0),
-    REAL_CONST(24745.873035/8.0),
-    REAL_CONST(24762.597457/8.0),
-    REAL_CONST(24779.324703/8.0),
-    REAL_CONST(24796.054772/8.0),
-    REAL_CONST(24812.787665/8.0),
-    REAL_CONST(24829.523378/8.0),
-    REAL_CONST(24846.261912/8.0),
-    REAL_CONST(24863.003266/8.0),
-    REAL_CONST(24879.747438/8.0),
-    REAL_CONST(24896.494428/8.0),
-    REAL_CONST(24913.244235/8.0),
-    REAL_CONST(24929.996857/8.0),
-    REAL_CONST(24946.752295/8.0),
-    REAL_CONST(24963.510546/8.0),
-    REAL_CONST(24980.271610/8.0),
-    REAL_CONST(24997.035487/8.0),
-    REAL_CONST(25013.802174/8.0),
-    REAL_CONST(25030.571672/8.0),
-    REAL_CONST(25047.343978/8.0),
-    REAL_CONST(25064.119093/8.0),
-    REAL_CONST(25080.897016/8.0),
-    REAL_CONST(25097.677744/8.0),
-    REAL_CONST(25114.461279/8.0),
-    REAL_CONST(25131.247617/8.0),
-    REAL_CONST(25148.036759/8.0),
-    REAL_CONST(25164.828704/8.0),
-    REAL_CONST(25181.623451/8.0),
-    REAL_CONST(25198.420998/8.0),
-    REAL_CONST(25215.221345/8.0),
-    REAL_CONST(25232.024491/8.0),
-    REAL_CONST(25248.830435/8.0),
-    REAL_CONST(25265.639176/8.0),
-    REAL_CONST(25282.450713/8.0),
-    REAL_CONST(25299.265045/8.0),
-    REAL_CONST(25316.082172/8.0),
-    REAL_CONST(25332.902091/8.0),
-    REAL_CONST(25349.724804/8.0),
-    REAL_CONST(25366.550307/8.0),
-    REAL_CONST(25383.378601/8.0),
-    REAL_CONST(25400.209685/8.0),
-    REAL_CONST(25417.043558/8.0),
-    REAL_CONST(25433.880218/8.0),
-    REAL_CONST(25450.719665/8.0),
-    REAL_CONST(25467.561898/8.0),
-    REAL_CONST(25484.406916/8.0),
-    REAL_CONST(25501.254718/8.0),
-    REAL_CONST(25518.105303/8.0),
-    REAL_CONST(25534.958670/8.0),
-    REAL_CONST(25551.814819/8.0),
-    REAL_CONST(25568.673748/8.0),
-    REAL_CONST(25585.535457/8.0),
-    REAL_CONST(25602.399944/8.0),
-    REAL_CONST(25619.267209/8.0),
-    REAL_CONST(25636.137250/8.0),
-    REAL_CONST(25653.010067/8.0),
-    REAL_CONST(25669.885660/8.0),
-    REAL_CONST(25686.764026/8.0),
-    REAL_CONST(25703.645165/8.0),
-    REAL_CONST(25720.529077/8.0),
-    REAL_CONST(25737.415759/8.0),
-    REAL_CONST(25754.305213/8.0),
-    REAL_CONST(25771.197435/8.0),
-    REAL_CONST(25788.092426/8.0),
-    REAL_CONST(25804.990185/8.0),
-    REAL_CONST(25821.890710/8.0),
-    REAL_CONST(25838.794002/8.0),
-    REAL_CONST(25855.700058/8.0),
-    REAL_CONST(25872.608878/8.0),
-    REAL_CONST(25889.520461/8.0),
-    REAL_CONST(25906.434807/8.0),
-    REAL_CONST(25923.351914/8.0),
-    REAL_CONST(25940.271781/8.0),
-    REAL_CONST(25957.194407/8.0),
-    REAL_CONST(25974.119793/8.0),
-    REAL_CONST(25991.047936/8.0),
-    REAL_CONST(26007.978835/8.0),
-    REAL_CONST(26024.912491/8.0),
-    REAL_CONST(26041.848902/8.0),
-    REAL_CONST(26058.788067/8.0),
-    REAL_CONST(26075.729985/8.0),
-    REAL_CONST(26092.674655/8.0),
-    REAL_CONST(26109.622077/8.0),
-    REAL_CONST(26126.572249/8.0),
-    REAL_CONST(26143.525171/8.0),
-    REAL_CONST(26160.480842/8.0),
-    REAL_CONST(26177.439260/8.0),
-    REAL_CONST(26194.400426/8.0),
-    REAL_CONST(26211.364337/8.0),
-    REAL_CONST(26228.330994/8.0),
-    REAL_CONST(26245.300395/8.0),
-    REAL_CONST(26262.272540/8.0),
-    REAL_CONST(26279.247427/8.0),
-    REAL_CONST(26296.225056/8.0),
-    REAL_CONST(26313.205425/8.0),
-    REAL_CONST(26330.188534/8.0),
-    REAL_CONST(26347.174383/8.0),
-    REAL_CONST(26364.162969/8.0),
-    REAL_CONST(26381.154293/8.0),
-    REAL_CONST(26398.148353/8.0),
-    REAL_CONST(26415.145148/8.0),
-    REAL_CONST(26432.144678/8.0),
-    REAL_CONST(26449.146942/8.0),
-    REAL_CONST(26466.151939/8.0),
-    REAL_CONST(26483.159667/8.0),
-    REAL_CONST(26500.170127/8.0),
-    REAL_CONST(26517.183317/8.0),
-    REAL_CONST(26534.199236/8.0),
-    REAL_CONST(26551.217883/8.0),
-    REAL_CONST(26568.239258/8.0),
-    REAL_CONST(26585.263360/8.0),
-    REAL_CONST(26602.290188/8.0),
-    REAL_CONST(26619.319740/8.0),
-    REAL_CONST(26636.352017/8.0),
-    REAL_CONST(26653.387017/8.0),
-    REAL_CONST(26670.424739/8.0),
-    REAL_CONST(26687.465183/8.0),
-    REAL_CONST(26704.508347/8.0),
-    REAL_CONST(26721.554231/8.0),
-    REAL_CONST(26738.602834/8.0),
-    REAL_CONST(26755.654154/8.0),
-    REAL_CONST(26772.708192/8.0),
-    REAL_CONST(26789.764947/8.0),
-    REAL_CONST(26806.824416/8.0),
-    REAL_CONST(26823.886600/8.0),
-    REAL_CONST(26840.951498/8.0),
-    REAL_CONST(26858.019109/8.0),
-    REAL_CONST(26875.089431/8.0),
-    REAL_CONST(26892.162465/8.0),
-    REAL_CONST(26909.238209/8.0),
-    REAL_CONST(26926.316662/8.0),
-    REAL_CONST(26943.397823/8.0),
-    REAL_CONST(26960.481693/8.0),
-    REAL_CONST(26977.568269/8.0),
-    REAL_CONST(26994.657551/8.0),
-    REAL_CONST(27011.749538/8.0),
-    REAL_CONST(27028.844229/8.0),
-    REAL_CONST(27045.941624/8.0),
-    REAL_CONST(27063.041721/8.0),
-    REAL_CONST(27080.144520/8.0),
-    REAL_CONST(27097.250020/8.0),
-    REAL_CONST(27114.358219/8.0),
-    REAL_CONST(27131.469118/8.0),
-    REAL_CONST(27148.582715/8.0),
-    REAL_CONST(27165.699009/8.0),
-    REAL_CONST(27182.818000/8.0),
-    REAL_CONST(27199.939687/8.0),
-    REAL_CONST(27217.064068/8.0),
-    REAL_CONST(27234.191144/8.0),
-    REAL_CONST(27251.320912/8.0),
-    REAL_CONST(27268.453373/8.0),
-    REAL_CONST(27285.588525/8.0),
-    REAL_CONST(27302.726368/8.0),
-    REAL_CONST(27319.866901/8.0),
-    REAL_CONST(27337.010122/8.0),
-    REAL_CONST(27354.156032/8.0),
-    REAL_CONST(27371.304629/8.0),
-    REAL_CONST(27388.455912/8.0),
-    REAL_CONST(27405.609881/8.0),
-    REAL_CONST(27422.766535/8.0),
-    REAL_CONST(27439.925872/8.0),
-    REAL_CONST(27457.087893/8.0),
-    REAL_CONST(27474.252595/8.0),
-    REAL_CONST(27491.419979/8.0),
-    REAL_CONST(27508.590044/8.0),
-    REAL_CONST(27525.762788/8.0),
-    REAL_CONST(27542.938211/8.0),
-    REAL_CONST(27560.116312/8.0),
-    REAL_CONST(27577.297090/8.0),
-    REAL_CONST(27594.480545/8.0),
-    REAL_CONST(27611.666675/8.0),
-    REAL_CONST(27628.855480/8.0),
-    REAL_CONST(27646.046959/8.0),
-    REAL_CONST(27663.241110/8.0),
-    REAL_CONST(27680.437934/8.0),
-    REAL_CONST(27697.637429/8.0),
-    REAL_CONST(27714.839595/8.0),
-    REAL_CONST(27732.044430/8.0),
-    REAL_CONST(27749.251934/8.0),
-    REAL_CONST(27766.462107/8.0),
-    REAL_CONST(27783.674946/8.0),
-    REAL_CONST(27800.890452/8.0),
-    REAL_CONST(27818.108624/8.0),
-    REAL_CONST(27835.329460/8.0),
-    REAL_CONST(27852.552960/8.0),
-    REAL_CONST(27869.779123/8.0),
-    REAL_CONST(27887.007948/8.0),
-    REAL_CONST(27904.239435/8.0),
-    REAL_CONST(27921.473583/8.0),
-    REAL_CONST(27938.710390/8.0),
-    REAL_CONST(27955.949856/8.0),
-    REAL_CONST(27973.191981/8.0),
-    REAL_CONST(27990.436763/8.0),
-    REAL_CONST(28007.684201/8.0),
-    REAL_CONST(28024.934295/8.0),
-    REAL_CONST(28042.187044/8.0),
-    REAL_CONST(28059.442447/8.0),
-    REAL_CONST(28076.700503/8.0),
-    REAL_CONST(28093.961211/8.0),
-    REAL_CONST(28111.224571/8.0),
-    REAL_CONST(28128.490582/8.0),
-    REAL_CONST(28145.759243/8.0),
-    REAL_CONST(28163.030554/8.0),
-    REAL_CONST(28180.304512/8.0),
-    REAL_CONST(28197.581118/8.0),
-    REAL_CONST(28214.860371/8.0),
-    REAL_CONST(28232.142270/8.0),
-    REAL_CONST(28249.426814/8.0),
-    REAL_CONST(28266.714002/8.0),
-    REAL_CONST(28284.003834/8.0),
-    REAL_CONST(28301.296308/8.0),
-    REAL_CONST(28318.591424/8.0),
-    REAL_CONST(28335.889182/8.0),
-    REAL_CONST(28353.189579/8.0),
-    REAL_CONST(28370.492617/8.0),
-    REAL_CONST(28387.798292/8.0),
-    REAL_CONST(28405.106606/8.0),
-    REAL_CONST(28422.417557/8.0),
-    REAL_CONST(28439.731144/8.0),
-    REAL_CONST(28457.047366/8.0),
-    REAL_CONST(28474.366223/8.0),
-    REAL_CONST(28491.687714/8.0),
-    REAL_CONST(28509.011838/8.0),
-    REAL_CONST(28526.338594/8.0),
-    REAL_CONST(28543.667982/8.0),
-    REAL_CONST(28561.000000/8.0),
-    REAL_CONST(28578.334648/8.0),
-    REAL_CONST(28595.671925/8.0),
-    REAL_CONST(28613.011831/8.0),
-    REAL_CONST(28630.354364/8.0),
-    REAL_CONST(28647.699523/8.0),
-    REAL_CONST(28665.047309/8.0),
-    REAL_CONST(28682.397719/8.0),
-    REAL_CONST(28699.750754/8.0),
-    REAL_CONST(28717.106412/8.0),
-    REAL_CONST(28734.464693/8.0),
-    REAL_CONST(28751.825596/8.0),
-    REAL_CONST(28769.189120/8.0),
-    REAL_CONST(28786.555264/8.0),
-    REAL_CONST(28803.924028/8.0),
-    REAL_CONST(28821.295410/8.0),
-    REAL_CONST(28838.669411/8.0),
-    REAL_CONST(28856.046028/8.0),
-    REAL_CONST(28873.425262/8.0),
-    REAL_CONST(28890.807112/8.0),
-    REAL_CONST(28908.191576/8.0),
-    REAL_CONST(28925.578655/8.0),
-    REAL_CONST(28942.968346/8.0),
-    REAL_CONST(28960.360650/8.0),
-    REAL_CONST(28977.755566/8.0),
-    REAL_CONST(28995.153093/8.0),
-    REAL_CONST(29012.553229/8.0),
-    REAL_CONST(29029.955975/8.0),
-    REAL_CONST(29047.361330/8.0),
-    REAL_CONST(29064.769292/8.0),
-    REAL_CONST(29082.179861/8.0),
-    REAL_CONST(29099.593037/8.0),
-    REAL_CONST(29117.008817/8.0),
-    REAL_CONST(29134.427203/8.0),
-    REAL_CONST(29151.848192/8.0),
-    REAL_CONST(29169.271784/8.0),
-    REAL_CONST(29186.697979/8.0),
-    REAL_CONST(29204.126775/8.0),
-    REAL_CONST(29221.558172/8.0),
-    REAL_CONST(29238.992168/8.0),
-    REAL_CONST(29256.428764/8.0),
-    REAL_CONST(29273.867959/8.0),
-    REAL_CONST(29291.309750/8.0),
-    REAL_CONST(29308.754139/8.0),
-    REAL_CONST(29326.201124/8.0),
-    REAL_CONST(29343.650704/8.0),
-    REAL_CONST(29361.102879/8.0),
-    REAL_CONST(29378.557648/8.0),
-    REAL_CONST(29396.015009/8.0),
-    REAL_CONST(29413.474963/8.0),
-    REAL_CONST(29430.937508/8.0),
-    REAL_CONST(29448.402644/8.0),
-    REAL_CONST(29465.870370/8.0),
-    REAL_CONST(29483.340685/8.0),
-    REAL_CONST(29500.813588/8.0),
-    REAL_CONST(29518.289079/8.0),
-    REAL_CONST(29535.767157/8.0),
-    REAL_CONST(29553.247821/8.0),
-    REAL_CONST(29570.731070/8.0),
-    REAL_CONST(29588.216904/8.0),
-    REAL_CONST(29605.705322/8.0),
-    REAL_CONST(29623.196322/8.0),
-    REAL_CONST(29640.689905/8.0),
-    REAL_CONST(29658.186070/8.0),
-    REAL_CONST(29675.684815/8.0),
-    REAL_CONST(29693.186140/8.0),
-    REAL_CONST(29710.690044/8.0),
-    REAL_CONST(29728.196527/8.0),
-    REAL_CONST(29745.705588/8.0),
-    REAL_CONST(29763.217225/8.0),
-    REAL_CONST(29780.731439/8.0),
-    REAL_CONST(29798.248228/8.0),
-    REAL_CONST(29815.767592/8.0),
-    REAL_CONST(29833.289529/8.0),
-    REAL_CONST(29850.814040/8.0),
-    REAL_CONST(29868.341123/8.0),
-    REAL_CONST(29885.870778/8.0),
-    REAL_CONST(29903.403004/8.0),
-    REAL_CONST(29920.937800/8.0),
-    REAL_CONST(29938.475165/8.0),
-    REAL_CONST(29956.015099/8.0),
-    REAL_CONST(29973.557601/8.0),
-    REAL_CONST(29991.102670/8.0),
-    REAL_CONST(30008.650306/8.0),
-    REAL_CONST(30026.200506/8.0),
-    REAL_CONST(30043.753272/8.0),
-    REAL_CONST(30061.308602/8.0),
-    REAL_CONST(30078.866496/8.0),
-    REAL_CONST(30096.426952/8.0),
-    REAL_CONST(30113.989970/8.0),
-    REAL_CONST(30131.555549/8.0),
-    REAL_CONST(30149.123688/8.0),
-    REAL_CONST(30166.694387/8.0),
-    REAL_CONST(30184.267645/8.0),
-    REAL_CONST(30201.843461/8.0),
-    REAL_CONST(30219.421835/8.0),
-    REAL_CONST(30237.002765/8.0),
-    REAL_CONST(30254.586251/8.0),
-    REAL_CONST(30272.172293/8.0),
-    REAL_CONST(30289.760889/8.0),
-    REAL_CONST(30307.352038/8.0),
-    REAL_CONST(30324.945741/8.0),
-    REAL_CONST(30342.541995/8.0),
-    REAL_CONST(30360.140801/8.0),
-    REAL_CONST(30377.742158/8.0),
-    REAL_CONST(30395.346065/8.0),
-    REAL_CONST(30412.952521/8.0),
-    REAL_CONST(30430.561526/8.0),
-    REAL_CONST(30448.173078/8.0),
-    REAL_CONST(30465.787178/8.0),
-    REAL_CONST(30483.403824/8.0),
-    REAL_CONST(30501.023015/8.0),
-    REAL_CONST(30518.644751/8.0),
-    REAL_CONST(30536.269031/8.0),
-    REAL_CONST(30553.895855/8.0),
-    REAL_CONST(30571.525221/8.0),
-    REAL_CONST(30589.157130/8.0),
-    REAL_CONST(30606.791579/8.0),
-    REAL_CONST(30624.428569/8.0),
-    REAL_CONST(30642.068098/8.0),
-    REAL_CONST(30659.710167/8.0),
-    REAL_CONST(30677.354774/8.0),
-    REAL_CONST(30695.001918/8.0),
-    REAL_CONST(30712.651599/8.0),
-    REAL_CONST(30730.303816/8.0),
-    REAL_CONST(30747.958568/8.0),
-    REAL_CONST(30765.615855/8.0),
-    REAL_CONST(30783.275676/8.0),
-    REAL_CONST(30800.938030/8.0),
-    REAL_CONST(30818.602917/8.0),
-    REAL_CONST(30836.270335/8.0),
-    REAL_CONST(30853.940284/8.0),
-    REAL_CONST(30871.612763/8.0),
-    REAL_CONST(30889.287772/8.0),
-    REAL_CONST(30906.965310/8.0),
-    REAL_CONST(30924.645376/8.0),
-    REAL_CONST(30942.327969/8.0),
-    REAL_CONST(30960.013089/8.0),
-    REAL_CONST(30977.700734/8.0),
-    REAL_CONST(30995.390905/8.0),
-    REAL_CONST(31013.083600/8.0),
-    REAL_CONST(31030.778819/8.0),
-    REAL_CONST(31048.476561/8.0),
-    REAL_CONST(31066.176826/8.0),
-    REAL_CONST(31083.879612/8.0),
-    REAL_CONST(31101.584918/8.0),
-    REAL_CONST(31119.292745/8.0),
-    REAL_CONST(31137.003092/8.0),
-    REAL_CONST(31154.715957/8.0),
-    REAL_CONST(31172.431340/8.0),
-    REAL_CONST(31190.149240/8.0),
-    REAL_CONST(31207.869657/8.0),
-    REAL_CONST(31225.592590/8.0),
-    REAL_CONST(31243.318038/8.0),
-    REAL_CONST(31261.046000/8.0),
-    REAL_CONST(31278.776476/8.0),
-    REAL_CONST(31296.509466/8.0),
-    REAL_CONST(31314.244967/8.0),
-    REAL_CONST(31331.982980/8.0),
-    REAL_CONST(31349.723504/8.0),
-    REAL_CONST(31367.466538/8.0),
-    REAL_CONST(31385.212081/8.0),
-    REAL_CONST(31402.960133/8.0),
-    REAL_CONST(31420.710693/8.0),
-    REAL_CONST(31438.463761/8.0),
-    REAL_CONST(31456.219335/8.0),
-    REAL_CONST(31473.977415/8.0),
-    REAL_CONST(31491.738000/8.0),
-    REAL_CONST(31509.501090/8.0),
-    REAL_CONST(31527.266683/8.0),
-    REAL_CONST(31545.034780/8.0),
-    REAL_CONST(31562.805379/8.0),
-    REAL_CONST(31580.578479/8.0),
-    REAL_CONST(31598.354081/8.0),
-    REAL_CONST(31616.132183/8.0),
-    REAL_CONST(31633.912784/8.0),
-    REAL_CONST(31651.695884/8.0),
-    REAL_CONST(31669.481483/8.0),
-    REAL_CONST(31687.269579/8.0),
-    REAL_CONST(31705.060171/8.0),
-    REAL_CONST(31722.853260/8.0),
-    REAL_CONST(31740.648844/8.0),
-    REAL_CONST(31758.446922/8.0),
-    REAL_CONST(31776.247495/8.0),
-    REAL_CONST(31794.050561/8.0),
-    REAL_CONST(31811.856119/8.0),
-    REAL_CONST(31829.664169/8.0),
-    REAL_CONST(31847.474711/8.0),
-    REAL_CONST(31865.287743/8.0),
-    REAL_CONST(31883.103264/8.0),
-    REAL_CONST(31900.921275/8.0),
-    REAL_CONST(31918.741774/8.0),
-    REAL_CONST(31936.564761/8.0),
-    REAL_CONST(31954.390235/8.0),
-    REAL_CONST(31972.218195/8.0),
-    REAL_CONST(31990.048640/8.0),
-    REAL_CONST(32007.881571/8.0),
-    REAL_CONST(32025.716986/8.0),
-    REAL_CONST(32043.554884/8.0),
-    REAL_CONST(32061.395265/8.0),
-    REAL_CONST(32079.238128/8.0),
-    REAL_CONST(32097.083473/8.0),
-    REAL_CONST(32114.931298/8.0),
-    REAL_CONST(32132.781604/8.0),
-    REAL_CONST(32150.634389/8.0),
-    REAL_CONST(32168.489652/8.0),
-    REAL_CONST(32186.347394/8.0),
-    REAL_CONST(32204.207613/8.0),
-    REAL_CONST(32222.070309/8.0),
-    REAL_CONST(32239.935480/8.0),
-    REAL_CONST(32257.803127/8.0),
-    REAL_CONST(32275.673248/8.0),
-    REAL_CONST(32293.545843/8.0),
-    REAL_CONST(32311.420912/8.0),
-    REAL_CONST(32329.298453/8.0),
-    REAL_CONST(32347.178465/8.0),
-    REAL_CONST(32365.060949/8.0),
-    REAL_CONST(32382.945904/8.0),
-    REAL_CONST(32400.833328/8.0),
-    REAL_CONST(32418.723221/8.0),
-    REAL_CONST(32436.615583/8.0),
-    REAL_CONST(32454.510412/8.0),
-    REAL_CONST(32472.407709/8.0),
-    REAL_CONST(32490.307472/8.0),
-    REAL_CONST(32508.209700/8.0),
-    REAL_CONST(32526.114394/8.0),
-    REAL_CONST(32544.021552/8.0),
-    REAL_CONST(32561.931174/8.0),
-    REAL_CONST(32579.843258/8.0),
-    REAL_CONST(32597.757805/8.0),
-    REAL_CONST(32615.674814/8.0),
-    REAL_CONST(32633.594283/8.0),
-    REAL_CONST(32651.516213/8.0),
-    REAL_CONST(32669.440602/8.0),
-    REAL_CONST(32687.367451/8.0),
-    REAL_CONST(32705.296757/8.0),
-    REAL_CONST(32723.228522/8.0),
-    REAL_CONST(32741.162743/8.0),
-    REAL_CONST(32759.099420/8.0),
-    REAL_CONST(32777.038553/8.0),
-    REAL_CONST(32794.980141/8.0),
-    REAL_CONST(32812.924183/8.0),
-    REAL_CONST(32830.870678/8.0),
-    REAL_CONST(32848.819627/8.0),
-    REAL_CONST(32866.771027/8.0),
-    REAL_CONST(32884.724879/8.0),
-    REAL_CONST(32902.681183/8.0),
-    REAL_CONST(32920.639936/8.0),
-    REAL_CONST(32938.601139/8.0),
-    REAL_CONST(32956.564790/8.0),
-    REAL_CONST(32974.530890/8.0),
-    REAL_CONST(32992.499438/8.0),
-    REAL_CONST(33010.470432/8.0),
-    REAL_CONST(33028.443872/8.0),
-    REAL_CONST(33046.419758/8.0),
-    REAL_CONST(33064.398089/8.0),
-    REAL_CONST(33082.378864/8.0),
-    REAL_CONST(33100.362083/8.0),
-    REAL_CONST(33118.347744/8.0),
-    REAL_CONST(33136.335848/8.0),
-    REAL_CONST(33154.326393/8.0),
-    REAL_CONST(33172.319379/8.0),
-    REAL_CONST(33190.314806/8.0),
-    REAL_CONST(33208.312671/8.0),
-    REAL_CONST(33226.312976/8.0),
-    REAL_CONST(33244.315719/8.0),
-    REAL_CONST(33262.320900/8.0),
-    REAL_CONST(33280.328517/8.0),
-    REAL_CONST(33298.338571/8.0),
-    REAL_CONST(33316.351061/8.0),
-    REAL_CONST(33334.365985/8.0),
-    REAL_CONST(33352.383344/8.0),
-    REAL_CONST(33370.403136/8.0),
-    REAL_CONST(33388.425361/8.0),
-    REAL_CONST(33406.450019/8.0),
-    REAL_CONST(33424.477108/8.0),
-    REAL_CONST(33442.506628/8.0),
-    REAL_CONST(33460.538579/8.0),
-    REAL_CONST(33478.572959/8.0),
-    REAL_CONST(33496.609768/8.0),
-    REAL_CONST(33514.649006/8.0),
-    REAL_CONST(33532.690671/8.0),
-    REAL_CONST(33550.734764/8.0),
-    REAL_CONST(33568.781282/8.0),
-    REAL_CONST(33586.830227/8.0),
-    REAL_CONST(33604.881597/8.0),
-    REAL_CONST(33622.935391/8.0),
-    REAL_CONST(33640.991609/8.0),
-    REAL_CONST(33659.050250/8.0),
-    REAL_CONST(33677.111314/8.0),
-    REAL_CONST(33695.174800/8.0),
-    REAL_CONST(33713.240707/8.0),
-    REAL_CONST(33731.309034/8.0),
-    REAL_CONST(33749.379781/8.0),
-    REAL_CONST(33767.452948/8.0),
-    REAL_CONST(33785.528533/8.0),
-    REAL_CONST(33803.606536/8.0),
-    REAL_CONST(33821.686957/8.0),
-    REAL_CONST(33839.769794/8.0),
-    REAL_CONST(33857.855047/8.0),
-    REAL_CONST(33875.942716/8.0),
-    REAL_CONST(33894.032799/8.0),
-    REAL_CONST(33912.125297/8.0),
-    REAL_CONST(33930.220207/8.0),
-    REAL_CONST(33948.317531/8.0),
-    REAL_CONST(33966.417267/8.0),
-    REAL_CONST(33984.519415/8.0),
-    REAL_CONST(34002.623973/8.0),
-    REAL_CONST(34020.730941/8.0),
-    REAL_CONST(34038.840320/8.0),
-    REAL_CONST(34056.952107/8.0),
-    REAL_CONST(34075.066302/8.0),
-    REAL_CONST(34093.182905/8.0),
-    REAL_CONST(34111.301916/8.0),
-    REAL_CONST(34129.423332/8.0),
-    REAL_CONST(34147.547155/8.0),
-    REAL_CONST(34165.673382/8.0),
-    REAL_CONST(34183.802014/8.0),
-    REAL_CONST(34201.933050/8.0),
-    REAL_CONST(34220.066489/8.0),
-    REAL_CONST(34238.202330/8.0),
-    REAL_CONST(34256.340574/8.0),
-    REAL_CONST(34274.481219/8.0),
-    REAL_CONST(34292.624264/8.0),
-    REAL_CONST(34310.769710/8.0),
-    REAL_CONST(34328.917555/8.0),
-    REAL_CONST(34347.067799/8.0),
-    REAL_CONST(34365.220440/8.0),
-    REAL_CONST(34383.375480/8.0),
-    REAL_CONST(34401.532916/8.0),
-    REAL_CONST(34419.692748/8.0),
-    REAL_CONST(34437.854976/8.0),
-    REAL_CONST(34456.019599/8.0),
-    REAL_CONST(34474.186617/8.0),
-    REAL_CONST(34492.356028/8.0),
-    REAL_CONST(34510.527832/8.0),
-    REAL_CONST(34528.702029/8.0),
-    REAL_CONST(34546.878617/8.0),
-    REAL_CONST(34565.057596/8.0),
-    REAL_CONST(34583.238967/8.0),
-    REAL_CONST(34601.422727/8.0),
-    REAL_CONST(34619.608876/8.0),
-    REAL_CONST(34637.797414/8.0),
-    REAL_CONST(34655.988340/8.0),
-    REAL_CONST(34674.181653/8.0),
-    REAL_CONST(34692.377354/8.0),
-    REAL_CONST(34710.575440/8.0),
-    REAL_CONST(34728.775912/8.0),
-    REAL_CONST(34746.978769/8.0),
-    REAL_CONST(34765.184010/8.0),
-    REAL_CONST(34783.391635/8.0),
-    REAL_CONST(34801.601643/8.0),
-    REAL_CONST(34819.814033/8.0),
-    REAL_CONST(34838.028805/8.0),
-    REAL_CONST(34856.245958/8.0),
-    REAL_CONST(34874.465492/8.0),
-    REAL_CONST(34892.687406/8.0),
-    REAL_CONST(34910.911699/8.0),
-    REAL_CONST(34929.138371/8.0),
-    REAL_CONST(34947.367421/8.0),
-    REAL_CONST(34965.598848/8.0),
-    REAL_CONST(34983.832652/8.0),
-    REAL_CONST(35002.068832/8.0),
-    REAL_CONST(35020.307388/8.0),
-    REAL_CONST(35038.548319/8.0),
-    REAL_CONST(35056.791624/8.0),
-    REAL_CONST(35075.037303/8.0),
-    REAL_CONST(35093.285355/8.0),
-    REAL_CONST(35111.535779/8.0),
-    REAL_CONST(35129.788576/8.0),
-    REAL_CONST(35148.043743/8.0),
-    REAL_CONST(35166.301282/8.0),
-    REAL_CONST(35184.561190/8.0),
-    REAL_CONST(35202.823468/8.0),
-    REAL_CONST(35221.088114/8.0),
-    REAL_CONST(35239.355129/8.0),
-    REAL_CONST(35257.624511/8.0),
-    REAL_CONST(35275.896260/8.0),
-    REAL_CONST(35294.170376/8.0),
-    REAL_CONST(35312.446857/8.0),
-    REAL_CONST(35330.725704/8.0),
-    REAL_CONST(35349.006915/8.0),
-    REAL_CONST(35367.290490/8.0),
-    REAL_CONST(35385.576428/8.0),
-    REAL_CONST(35403.864729/8.0),
-    REAL_CONST(35422.155392/8.0),
-    REAL_CONST(35440.448416/8.0),
-    REAL_CONST(35458.743801/8.0),
-    REAL_CONST(35477.041547/8.0),
-    REAL_CONST(35495.341652/8.0),
-    REAL_CONST(35513.644116/8.0),
-    REAL_CONST(35531.948938/8.0),
-    REAL_CONST(35550.256119/8.0),
-    REAL_CONST(35568.565656/8.0),
-    REAL_CONST(35586.877550/8.0),
-    REAL_CONST(35605.191800/8.0),
-    REAL_CONST(35623.508406/8.0),
-    REAL_CONST(35641.827366/8.0),
-    REAL_CONST(35660.148681/8.0),
-    REAL_CONST(35678.472348/8.0),
-    REAL_CONST(35696.798369/8.0),
-    REAL_CONST(35715.126743/8.0),
-    REAL_CONST(35733.457468/8.0),
-    REAL_CONST(35751.790544/8.0),
-    REAL_CONST(35770.125971/8.0),
-    REAL_CONST(35788.463747/8.0),
-    REAL_CONST(35806.803873/8.0),
-    REAL_CONST(35825.146348/8.0),
-    REAL_CONST(35843.491171/8.0),
-    REAL_CONST(35861.838341/8.0),
-    REAL_CONST(35880.187859/8.0),
-    REAL_CONST(35898.539722/8.0),
-    REAL_CONST(35916.893932/8.0),
-    REAL_CONST(35935.250487/8.0),
-    REAL_CONST(35953.609386/8.0),
-    REAL_CONST(35971.970629/8.0),
-    REAL_CONST(35990.334215/8.0),
-    REAL_CONST(36008.700144/8.0),
-    REAL_CONST(36027.068415/8.0),
-    REAL_CONST(36045.439028/8.0),
-    REAL_CONST(36063.811982/8.0),
-    REAL_CONST(36082.187276/8.0),
-    REAL_CONST(36100.564910/8.0),
-    REAL_CONST(36118.944883/8.0),
-    REAL_CONST(36137.327195/8.0),
-    REAL_CONST(36155.711844/8.0),
-    REAL_CONST(36174.098831/8.0),
-    REAL_CONST(36192.488155/8.0),
-    REAL_CONST(36210.879815/8.0),
-    REAL_CONST(36229.273811/8.0),
-    REAL_CONST(36247.670141/8.0),
-    REAL_CONST(36266.068806/8.0),
-    REAL_CONST(36284.469805/8.0),
-    REAL_CONST(36302.873137/8.0),
-    REAL_CONST(36321.278801/8.0),
-    REAL_CONST(36339.686798/8.0),
-    REAL_CONST(36358.097126/8.0),
-    REAL_CONST(36376.509785/8.0),
-    REAL_CONST(36394.924775/8.0),
-    REAL_CONST(36413.342094/8.0),
-    REAL_CONST(36431.761742/8.0),
-    REAL_CONST(36450.183718/8.0),
-    REAL_CONST(36468.608023/8.0),
-    REAL_CONST(36487.034654/8.0),
-    REAL_CONST(36505.463613/8.0),
-    REAL_CONST(36523.894898/8.0),
-    REAL_CONST(36542.328508/8.0),
-    REAL_CONST(36560.764443/8.0),
-    REAL_CONST(36579.202703/8.0),
-    REAL_CONST(36597.643286/8.0),
-    REAL_CONST(36616.086193/8.0),
-    REAL_CONST(36634.531422/8.0),
-    REAL_CONST(36652.978974/8.0),
-    REAL_CONST(36671.428847/8.0),
-    REAL_CONST(36689.881040/8.0),
-    REAL_CONST(36708.335554/8.0),
-    REAL_CONST(36726.792388/8.0),
-    REAL_CONST(36745.251541/8.0),
-    REAL_CONST(36763.713012/8.0),
-    REAL_CONST(36782.176802/8.0),
-    REAL_CONST(36800.642909/8.0),
-    REAL_CONST(36819.111332/8.0),
-    REAL_CONST(36837.582072/8.0),
-    REAL_CONST(36856.055127/8.0),
-    REAL_CONST(36874.530498/8.0),
-    REAL_CONST(36893.008183/8.0),
-    REAL_CONST(36911.488182/8.0),
-    REAL_CONST(36929.970494/8.0),
-    REAL_CONST(36948.455119/8.0),
-    REAL_CONST(36966.942056/8.0),
-    REAL_CONST(36985.431305/8.0),
-    REAL_CONST(37003.922865/8.0),
-    REAL_CONST(37022.416735/8.0),
-    REAL_CONST(37040.912915/8.0),
-    REAL_CONST(37059.411404/8.0),
-    REAL_CONST(37077.912202/8.0),
-    REAL_CONST(37096.415309/8.0),
-    REAL_CONST(37114.920722/8.0),
-    REAL_CONST(37133.428443/8.0),
-    REAL_CONST(37151.938470/8.0),
-    REAL_CONST(37170.450803/8.0),
-    REAL_CONST(37188.965441/8.0),
-    REAL_CONST(37207.482384/8.0),
-    REAL_CONST(37226.001631/8.0),
-    REAL_CONST(37244.523182/8.0),
-    REAL_CONST(37263.047035/8.0),
-    REAL_CONST(37281.573191/8.0),
-    REAL_CONST(37300.101648/8.0),
-    REAL_CONST(37318.632407/8.0),
-    REAL_CONST(37337.165467/8.0),
-    REAL_CONST(37355.700827/8.0),
-    REAL_CONST(37374.238486/8.0),
-    REAL_CONST(37392.778444/8.0),
-    REAL_CONST(37411.320701/8.0),
-    REAL_CONST(37429.865255/8.0),
-    REAL_CONST(37448.412107/8.0),
-    REAL_CONST(37466.961255/8.0),
-    REAL_CONST(37485.512699/8.0),
-    REAL_CONST(37504.066439/8.0),
-    REAL_CONST(37522.622474/8.0),
-    REAL_CONST(37541.180803/8.0),
-    REAL_CONST(37559.741427/8.0),
-    REAL_CONST(37578.304343/8.0),
-    REAL_CONST(37596.869552/8.0),
-    REAL_CONST(37615.437054/8.0),
-    REAL_CONST(37634.006846/8.0),
-    REAL_CONST(37652.578930/8.0),
-    REAL_CONST(37671.153305/8.0),
-    REAL_CONST(37689.729969/8.0),
-    REAL_CONST(37708.308922/8.0),
-    REAL_CONST(37726.890165/8.0),
-    REAL_CONST(37745.473695/8.0),
-    REAL_CONST(37764.059513/8.0),
-    REAL_CONST(37782.647619/8.0),
-    REAL_CONST(37801.238010/8.0),
-    REAL_CONST(37819.830688/8.0),
-    REAL_CONST(37838.425651/8.0),
-    REAL_CONST(37857.022899/8.0),
-    REAL_CONST(37875.622431/8.0),
-    REAL_CONST(37894.224246/8.0),
-    REAL_CONST(37912.828345/8.0),
-    REAL_CONST(37931.434727/8.0),
-    REAL_CONST(37950.043390/8.0),
-    REAL_CONST(37968.654335/8.0),
-    REAL_CONST(37987.267561/8.0),
-    REAL_CONST(38005.883067/8.0),
-    REAL_CONST(38024.500853/8.0),
-    REAL_CONST(38043.120918/8.0),
-    REAL_CONST(38061.743262/8.0),
-    REAL_CONST(38080.367884/8.0),
-    REAL_CONST(38098.994783/8.0),
-    REAL_CONST(38117.623960/8.0),
-    REAL_CONST(38136.255413/8.0),
-    REAL_CONST(38154.889141/8.0),
-    REAL_CONST(38173.525145/8.0),
-    REAL_CONST(38192.163424/8.0),
-    REAL_CONST(38210.803977/8.0),
-    REAL_CONST(38229.446804/8.0),
-    REAL_CONST(38248.091904/8.0),
-    REAL_CONST(38266.739276/8.0),
-    REAL_CONST(38285.388920/8.0),
-    REAL_CONST(38304.040836/8.0),
-    REAL_CONST(38322.695023/8.0),
-    REAL_CONST(38341.351480/8.0),
-    REAL_CONST(38360.010207/8.0),
-    REAL_CONST(38378.671203/8.0),
-    REAL_CONST(38397.334467/8.0),
-    REAL_CONST(38416.000000/8.0),
-    REAL_CONST(38434.667800/8.0),
-    REAL_CONST(38453.337868/8.0),
-    REAL_CONST(38472.010202/8.0),
-    REAL_CONST(38490.684801/8.0),
-    REAL_CONST(38509.361667/8.0),
-    REAL_CONST(38528.040797/8.0),
-    REAL_CONST(38546.722191/8.0),
-    REAL_CONST(38565.405849/8.0),
-    REAL_CONST(38584.091770/8.0),
-    REAL_CONST(38602.779954/8.0),
-    REAL_CONST(38621.470400/8.0),
-    REAL_CONST(38640.163107/8.0),
-    REAL_CONST(38658.858075/8.0),
-    REAL_CONST(38677.555304/8.0),
-    REAL_CONST(38696.254793/8.0),
-    REAL_CONST(38714.956541/8.0),
-    REAL_CONST(38733.660548/8.0),
-    REAL_CONST(38752.366813/8.0),
-    REAL_CONST(38771.075336/8.0),
-    REAL_CONST(38789.786116/8.0),
-    REAL_CONST(38808.499152/8.0),
-    REAL_CONST(38827.214445/8.0),
-    REAL_CONST(38845.931993/8.0),
-    REAL_CONST(38864.651797/8.0),
-    REAL_CONST(38883.373854/8.0),
-    REAL_CONST(38902.098166/8.0),
-    REAL_CONST(38920.824731/8.0),
-    REAL_CONST(38939.553548/8.0),
-    REAL_CONST(38958.284618/8.0),
-    REAL_CONST(38977.017940/8.0),
-    REAL_CONST(38995.753513/8.0),
-    REAL_CONST(39014.491337/8.0),
-    REAL_CONST(39033.231411/8.0),
-    REAL_CONST(39051.973734/8.0),
-    REAL_CONST(39070.718306/8.0),
-    REAL_CONST(39089.465127/8.0),
-    REAL_CONST(39108.214196/8.0),
-    REAL_CONST(39126.965512/8.0),
-    REAL_CONST(39145.719075/8.0),
-    REAL_CONST(39164.474885/8.0),
-    REAL_CONST(39183.232940/8.0),
-    REAL_CONST(39201.993240/8.0),
-    REAL_CONST(39220.755786/8.0),
-    REAL_CONST(39239.520575/8.0),
-    REAL_CONST(39258.287608/8.0),
-    REAL_CONST(39277.056884/8.0),
-    REAL_CONST(39295.828403/8.0),
-    REAL_CONST(39314.602164/8.0),
-    REAL_CONST(39333.378166/8.0),
-    REAL_CONST(39352.156409/8.0),
-    REAL_CONST(39370.936893/8.0),
-    REAL_CONST(39389.719617/8.0),
-    REAL_CONST(39408.504580/8.0),
-    REAL_CONST(39427.291782/8.0),
-    REAL_CONST(39446.081222/8.0),
-    REAL_CONST(39464.872900/8.0),
-    REAL_CONST(39483.666815/8.0),
-    REAL_CONST(39502.462967/8.0),
-    REAL_CONST(39521.261355/8.0),
-    REAL_CONST(39540.061978/8.0),
-    REAL_CONST(39558.864837/8.0),
-    REAL_CONST(39577.669930/8.0),
-    REAL_CONST(39596.477258/8.0),
-    REAL_CONST(39615.286819/8.0),
-    REAL_CONST(39634.098613/8.0),
-    REAL_CONST(39652.912639/8.0),
-    REAL_CONST(39671.728897/8.0),
-    REAL_CONST(39690.547387/8.0),
-    REAL_CONST(39709.368108/8.0),
-    REAL_CONST(39728.191058/8.0),
-    REAL_CONST(39747.016239/8.0),
-    REAL_CONST(39765.843649/8.0),
-    REAL_CONST(39784.673288/8.0),
-    REAL_CONST(39803.505155/8.0),
-    REAL_CONST(39822.339250/8.0),
-    REAL_CONST(39841.175571/8.0),
-    REAL_CONST(39860.014120/8.0),
-    REAL_CONST(39878.854894/8.0),
-    REAL_CONST(39897.697895/8.0),
-    REAL_CONST(39916.543120/8.0),
-    REAL_CONST(39935.390570/8.0),
-    REAL_CONST(39954.240244/8.0),
-    REAL_CONST(39973.092141/8.0),
-    REAL_CONST(39991.946261/8.0),
-    REAL_CONST(40010.802604/8.0),
-    REAL_CONST(40029.661169/8.0),
-    REAL_CONST(40048.521955/8.0),
-    REAL_CONST(40067.384962/8.0),
-    REAL_CONST(40086.250189/8.0),
-    REAL_CONST(40105.117636/8.0),
-    REAL_CONST(40123.987303/8.0),
-    REAL_CONST(40142.859188/8.0),
-    REAL_CONST(40161.733291/8.0),
-    REAL_CONST(40180.609613/8.0),
-    REAL_CONST(40199.488151/8.0),
-    REAL_CONST(40218.368906/8.0),
-    REAL_CONST(40237.251878/8.0),
-    REAL_CONST(40256.137065/8.0),
-    REAL_CONST(40275.024467/8.0),
-    REAL_CONST(40293.914083/8.0),
-    REAL_CONST(40312.805914/8.0),
-    REAL_CONST(40331.699959/8.0),
-    REAL_CONST(40350.596216/8.0),
-    REAL_CONST(40369.494686/8.0),
-    REAL_CONST(40388.395368/8.0),
-    REAL_CONST(40407.298262/8.0),
-    REAL_CONST(40426.203367/8.0),
-    REAL_CONST(40445.110682/8.0),
-    REAL_CONST(40464.020207/8.0),
-    REAL_CONST(40482.931941/8.0),
-    REAL_CONST(40501.845885/8.0),
-    REAL_CONST(40520.762036/8.0),
-    REAL_CONST(40539.680396/8.0),
-    REAL_CONST(40558.600963/8.0),
-    REAL_CONST(40577.523737/8.0),
-    REAL_CONST(40596.448718/8.0),
-    REAL_CONST(40615.375904/8.0),
-    REAL_CONST(40634.305295/8.0),
-    REAL_CONST(40653.236891/8.0),
-    REAL_CONST(40672.170692/8.0),
-    REAL_CONST(40691.106696/8.0),
-    REAL_CONST(40710.044904/8.0),
-    REAL_CONST(40728.985314/8.0),
-    REAL_CONST(40747.927927/8.0),
-    REAL_CONST(40766.872741/8.0),
-    REAL_CONST(40785.819757/8.0),
-    REAL_CONST(40804.768973/8.0),
-    REAL_CONST(40823.720390/8.0),
-    REAL_CONST(40842.674006/8.0),
-    REAL_CONST(40861.629821/8.0),
-    REAL_CONST(40880.587835/8.0),
-    REAL_CONST(40899.548048/8.0),
-    REAL_CONST(40918.510457/8.0),
-    REAL_CONST(40937.475064/8.0),
-    REAL_CONST(40956.441868/8.0),
-    REAL_CONST(40975.410868/8.0),
-    REAL_CONST(40994.382063/8.0),
-    REAL_CONST(41013.355454/8.0),
-    REAL_CONST(41032.331039/8.0),
-    REAL_CONST(41051.308818/8.0),
-    REAL_CONST(41070.288790/8.0),
-    REAL_CONST(41089.270956/8.0),
-    REAL_CONST(41108.255315/8.0),
-    REAL_CONST(41127.241865/8.0),
-    REAL_CONST(41146.230607/8.0),
-    REAL_CONST(41165.221540/8.0),
-    REAL_CONST(41184.214664/8.0),
-    REAL_CONST(41203.209977/8.0),
-    REAL_CONST(41222.207480/8.0),
-    REAL_CONST(41241.207173/8.0),
-    REAL_CONST(41260.209053/8.0),
-    REAL_CONST(41279.213122/8.0),
-    REAL_CONST(41298.219378/8.0),
-    REAL_CONST(41317.227822/8.0),
-    REAL_CONST(41336.238451/8.0),
-    REAL_CONST(41355.251267/8.0),
-    REAL_CONST(41374.266268/8.0),
-    REAL_CONST(41393.283455/8.0),
-    REAL_CONST(41412.302826/8.0),
-    REAL_CONST(41431.324380/8.0),
-    REAL_CONST(41450.348119/8.0),
-    REAL_CONST(41469.374040/8.0),
-    REAL_CONST(41488.402144/8.0),
-    REAL_CONST(41507.432430/8.0),
-    REAL_CONST(41526.464897/8.0),
-    REAL_CONST(41545.499545/8.0),
-    REAL_CONST(41564.536374/8.0),
-    REAL_CONST(41583.575383/8.0),
-    REAL_CONST(41602.616571/8.0),
-    REAL_CONST(41621.659938/8.0),
-    REAL_CONST(41640.705484/8.0),
-    REAL_CONST(41659.753208/8.0),
-    REAL_CONST(41678.803109/8.0),
-    REAL_CONST(41697.855187/8.0),
-    REAL_CONST(41716.909442/8.0),
-    REAL_CONST(41735.965873/8.0),
-    REAL_CONST(41755.024479/8.0),
-    REAL_CONST(41774.085261/8.0),
-    REAL_CONST(41793.148217/8.0),
-    REAL_CONST(41812.213347/8.0),
-    REAL_CONST(41831.280650/8.0),
-    REAL_CONST(41850.350126/8.0),
-    REAL_CONST(41869.421775/8.0),
-    REAL_CONST(41888.495597/8.0),
-    REAL_CONST(41907.571589/8.0),
-    REAL_CONST(41926.649753/8.0),
-    REAL_CONST(41945.730087/8.0),
-    REAL_CONST(41964.812591/8.0),
-    REAL_CONST(41983.897265/8.0),
-    REAL_CONST(42002.984108/8.0),
-    REAL_CONST(42022.073120/8.0),
-    REAL_CONST(42041.164299/8.0),
-    REAL_CONST(42060.257647/8.0),
-    REAL_CONST(42079.353161/8.0),
-    REAL_CONST(42098.450842/8.0),
-    REAL_CONST(42117.550689/8.0),
-    REAL_CONST(42136.652702/8.0),
-    REAL_CONST(42155.756880/8.0),
-    REAL_CONST(42174.863222/8.0),
-    REAL_CONST(42193.971729/8.0),
-    REAL_CONST(42213.082399/8.0),
-    REAL_CONST(42232.195233/8.0),
-    REAL_CONST(42251.310229/8.0),
-    REAL_CONST(42270.427388/8.0),
-    REAL_CONST(42289.546708/8.0),
-    REAL_CONST(42308.668190/8.0),
-    REAL_CONST(42327.791832/8.0),
-    REAL_CONST(42346.917634/8.0),
-    REAL_CONST(42366.045596/8.0),
-    REAL_CONST(42385.175718/8.0),
-    REAL_CONST(42404.307998/8.0),
-    REAL_CONST(42423.442437/8.0),
-    REAL_CONST(42442.579033/8.0),
-    REAL_CONST(42461.717787/8.0),
-    REAL_CONST(42480.858697/8.0),
-    REAL_CONST(42500.001764/8.0),
-    REAL_CONST(42519.146987/8.0),
-    REAL_CONST(42538.294365/8.0),
-    REAL_CONST(42557.443898/8.0),
-    REAL_CONST(42576.595586/8.0),
-    REAL_CONST(42595.749427/8.0),
-    REAL_CONST(42614.905422/8.0),
-    REAL_CONST(42634.063570/8.0),
-    REAL_CONST(42653.223870/8.0),
-    REAL_CONST(42672.386323/8.0),
-    REAL_CONST(42691.550926/8.0),
-    REAL_CONST(42710.717681/8.0),
-    REAL_CONST(42729.886587/8.0),
-    REAL_CONST(42749.057642/8.0),
-    REAL_CONST(42768.230847/8.0),
-    REAL_CONST(42787.406201/8.0),
-    REAL_CONST(42806.583704/8.0),
-    REAL_CONST(42825.763355/8.0),
-    REAL_CONST(42844.945154/8.0),
-    REAL_CONST(42864.129099/8.0),
-    REAL_CONST(42883.315192/8.0),
-    REAL_CONST(42902.503431/8.0),
-    REAL_CONST(42921.693815/8.0),
-    REAL_CONST(42940.886345/8.0),
-    REAL_CONST(42960.081019/8.0),
-    REAL_CONST(42979.277838/8.0),
-    REAL_CONST(42998.476800/8.0),
-    REAL_CONST(43017.677906/8.0),
-    REAL_CONST(43036.881155/8.0),
-    REAL_CONST(43056.086546/8.0),
-    REAL_CONST(43075.294079/8.0),
-    REAL_CONST(43094.503754/8.0),
-    REAL_CONST(43113.715569/8.0),
-    REAL_CONST(43132.929525/8.0),
-    REAL_CONST(43152.145621/8.0),
-    REAL_CONST(43171.363856/8.0),
-    REAL_CONST(43190.584231/8.0),
-    REAL_CONST(43209.806744/8.0),
-    REAL_CONST(43229.031395/8.0),
-    REAL_CONST(43248.258183/8.0),
-    REAL_CONST(43267.487109/8.0),
-    REAL_CONST(43286.718172/8.0),
-    REAL_CONST(43305.951370/8.0),
-    REAL_CONST(43325.186705/8.0),
-    REAL_CONST(43344.424175/8.0),
-    REAL_CONST(43363.663779/8.0),
-    REAL_CONST(43382.905518/8.0),
-    REAL_CONST(43402.149390/8.0),
-    REAL_CONST(43421.395396/8.0),
-    REAL_CONST(43440.643535/8.0),
-    REAL_CONST(43459.893806/8.0),
-    REAL_CONST(43479.146209/8.0),
-    REAL_CONST(43498.400744/8.0),
-    REAL_CONST(43517.657409/8.0),
-    REAL_CONST(43536.916206/8.0),
-    REAL_CONST(43556.177132/8.0),
-    REAL_CONST(43575.440187/8.0),
-    REAL_CONST(43594.705372/8.0),
-    REAL_CONST(43613.972686/8.0),
-    REAL_CONST(43633.242127/8.0),
-    REAL_CONST(43652.513697/8.0),
-    REAL_CONST(43671.787393/8.0),
-    REAL_CONST(43691.063216/8.0),
-    REAL_CONST(43710.341166/8.0),
-    REAL_CONST(43729.621241/8.0),
-    REAL_CONST(43748.903442/8.0),
-    REAL_CONST(43768.187767/8.0),
-    REAL_CONST(43787.474217/8.0),
-    REAL_CONST(43806.762791/8.0),
-    REAL_CONST(43826.053489/8.0),
-    REAL_CONST(43845.346309/8.0),
-    REAL_CONST(43864.641252/8.0),
-    REAL_CONST(43883.938317/8.0),
-    REAL_CONST(43903.237504/8.0),
-    REAL_CONST(43922.538812/8.0),
-    REAL_CONST(43941.842240/8.0),
-    REAL_CONST(43961.147789/8.0),
-    REAL_CONST(43980.455457/8.0),
-    REAL_CONST(43999.765245/8.0),
-    REAL_CONST(44019.077151/8.0),
-    REAL_CONST(44038.391176/8.0),
-    REAL_CONST(44057.707319/8.0),
-    REAL_CONST(44077.025579/8.0),
-    REAL_CONST(44096.345956/8.0),
-    REAL_CONST(44115.668450/8.0),
-    REAL_CONST(44134.993059/8.0),
-    REAL_CONST(44154.319784/8.0),
-    REAL_CONST(44173.648625/8.0),
-    REAL_CONST(44192.979580/8.0),
-    REAL_CONST(44212.312649/8.0),
-    REAL_CONST(44231.647831/8.0),
-    REAL_CONST(44250.985127/8.0),
-    REAL_CONST(44270.324536/8.0),
-    REAL_CONST(44289.666057/8.0),
-    REAL_CONST(44309.009690/8.0),
-    REAL_CONST(44328.355435/8.0),
-    REAL_CONST(44347.703290/8.0),
-    REAL_CONST(44367.053256/8.0),
-    REAL_CONST(44386.405332/8.0),
-    REAL_CONST(44405.759517/8.0),
-    REAL_CONST(44425.115812/8.0),
-    REAL_CONST(44444.474215/8.0),
-    REAL_CONST(44463.834726/8.0),
-    REAL_CONST(44483.197346/8.0),
-    REAL_CONST(44502.562072/8.0),
-    REAL_CONST(44521.928905/8.0),
-    REAL_CONST(44541.297845/8.0),
-    REAL_CONST(44560.668890/8.0),
-    REAL_CONST(44580.042041/8.0),
-    REAL_CONST(44599.417297/8.0),
-    REAL_CONST(44618.794657/8.0),
-    REAL_CONST(44638.174121/8.0),
-    REAL_CONST(44657.555689/8.0),
-    REAL_CONST(44676.939361/8.0),
-    REAL_CONST(44696.325134/8.0),
-    REAL_CONST(44715.713011/8.0),
-    REAL_CONST(44735.102988/8.0),
-    REAL_CONST(44754.495068/8.0),
-    REAL_CONST(44773.889248/8.0),
-    REAL_CONST(44793.285528/8.0),
-    REAL_CONST(44812.683909/8.0),
-    REAL_CONST(44832.084388/8.0),
-    REAL_CONST(44851.486967/8.0),
-    REAL_CONST(44870.891645/8.0),
-    REAL_CONST(44890.298421/8.0),
-    REAL_CONST(44909.707294/8.0),
-    REAL_CONST(44929.118265/8.0),
-    REAL_CONST(44948.531332/8.0),
-    REAL_CONST(44967.946496/8.0),
-    REAL_CONST(44987.363756/8.0),
-    REAL_CONST(45006.783111/8.0),
-    REAL_CONST(45026.204561/8.0),
-    REAL_CONST(45045.628105/8.0),
-    REAL_CONST(45065.053744/8.0),
-    REAL_CONST(45084.481476/8.0),
-    REAL_CONST(45103.911302/8.0),
-    REAL_CONST(45123.343220/8.0),
-    REAL_CONST(45142.777230/8.0),
-    REAL_CONST(45162.213333/8.0),
-    REAL_CONST(45181.651526/8.0),
-    REAL_CONST(45201.091811/8.0),
-    REAL_CONST(45220.534186/8.0),
-    REAL_CONST(45239.978651/8.0),
-    REAL_CONST(45259.425205/8.0),
-    REAL_CONST(45278.873849/8.0),
-    REAL_CONST(45298.324581/8.0),
-    REAL_CONST(45317.777402/8.0),
-    REAL_CONST(45337.232310/8.0),
-    REAL_CONST(45356.689306/8.0),
-    REAL_CONST(45376.148388/8.0),
-    REAL_CONST(45395.609557/8.0),
-    REAL_CONST(45415.072812/8.0),
-    REAL_CONST(45434.538153/8.0),
-    REAL_CONST(45454.005578/8.0),
-    REAL_CONST(45473.475088/8.0),
-    REAL_CONST(45492.946683/8.0),
-    REAL_CONST(45512.420361/8.0),
-    REAL_CONST(45531.896122/8.0),
-    REAL_CONST(45551.373967/8.0),
-    REAL_CONST(45570.853893/8.0),
-    REAL_CONST(45590.335902/8.0),
-    REAL_CONST(45609.819992/8.0),
-    REAL_CONST(45629.306164/8.0),
-    REAL_CONST(45648.794416/8.0),
-    REAL_CONST(45668.284748/8.0),
-    REAL_CONST(45687.777160/8.0),
-    REAL_CONST(45707.271651/8.0),
-    REAL_CONST(45726.768221/8.0),
-    REAL_CONST(45746.266869/8.0),
-    REAL_CONST(45765.767596/8.0),
-    REAL_CONST(45785.270400/8.0),
-    REAL_CONST(45804.775281/8.0),
-    REAL_CONST(45824.282238/8.0),
-    REAL_CONST(45843.791272/8.0),
-    REAL_CONST(45863.302382/8.0),
-    REAL_CONST(45882.815567/8.0),
-    REAL_CONST(45902.330827/8.0),
-    REAL_CONST(45921.848161/8.0),
-    REAL_CONST(45941.367569/8.0),
-    REAL_CONST(45960.889051/8.0),
-    REAL_CONST(45980.412606/8.0),
-    REAL_CONST(45999.938233/8.0),
-    REAL_CONST(46019.465933/8.0),
-    REAL_CONST(46038.995705/8.0),
-    REAL_CONST(46058.527548/8.0),
-    REAL_CONST(46078.061462/8.0),
-    REAL_CONST(46097.597446/8.0),
-    REAL_CONST(46117.135501/8.0),
-    REAL_CONST(46136.675625/8.0),
-    REAL_CONST(46156.217818/8.0),
-    REAL_CONST(46175.762080/8.0),
-    REAL_CONST(46195.308410/8.0),
-    REAL_CONST(46214.856808/8.0),
-    REAL_CONST(46234.407273/8.0),
-    REAL_CONST(46253.959806/8.0),
-    REAL_CONST(46273.514405/8.0),
-    REAL_CONST(46293.071070/8.0),
-    REAL_CONST(46312.629800/8.0),
-    REAL_CONST(46332.190596/8.0),
-    REAL_CONST(46351.753457/8.0),
-    REAL_CONST(46371.318382/8.0),
-    REAL_CONST(46390.885371/8.0),
-    REAL_CONST(46410.454424/8.0),
-    REAL_CONST(46430.025539/8.0),
-    REAL_CONST(46449.598717/8.0),
-    REAL_CONST(46469.173958/8.0),
-    REAL_CONST(46488.751260/8.0),
-    REAL_CONST(46508.330623/8.0),
-    REAL_CONST(46527.912048/8.0),
-    REAL_CONST(46547.495532/8.0),
-    REAL_CONST(46567.081077/8.0),
-    REAL_CONST(46586.668681/8.0),
-    REAL_CONST(46606.258345/8.0),
-    REAL_CONST(46625.850067/8.0),
-    REAL_CONST(46645.443847/8.0),
-    REAL_CONST(46665.039686/8.0),
-    REAL_CONST(46684.637581/8.0),
-    REAL_CONST(46704.237534/8.0),
-    REAL_CONST(46723.839543/8.0),
-    REAL_CONST(46743.443609/8.0),
-    REAL_CONST(46763.049730/8.0),
-    REAL_CONST(46782.657906/8.0),
-    REAL_CONST(46802.268137/8.0),
-    REAL_CONST(46821.880423/8.0),
-    REAL_CONST(46841.494762/8.0),
-    REAL_CONST(46861.111155/8.0),
-    REAL_CONST(46880.729601/8.0),
-    REAL_CONST(46900.350100/8.0),
-    REAL_CONST(46919.972651/8.0),
-    REAL_CONST(46939.597254/8.0),
-    REAL_CONST(46959.223908/8.0),
-    REAL_CONST(46978.852613/8.0),
-    REAL_CONST(46998.483369/8.0),
-    REAL_CONST(47018.116175/8.0),
-    REAL_CONST(47037.751030/8.0),
-    REAL_CONST(47057.387935/8.0),
-    REAL_CONST(47077.026889/8.0),
-    REAL_CONST(47096.667891/8.0),
-    REAL_CONST(47116.310941/8.0),
-    REAL_CONST(47135.956038/8.0),
-    REAL_CONST(47155.603183/8.0),
-    REAL_CONST(47175.252374/8.0),
-    REAL_CONST(47194.903611/8.0),
-    REAL_CONST(47214.556895/8.0),
-    REAL_CONST(47234.212223/8.0),
-    REAL_CONST(47253.869597/8.0),
-    REAL_CONST(47273.529016/8.0),
-    REAL_CONST(47293.190478/8.0),
-    REAL_CONST(47312.853984/8.0),
-    REAL_CONST(47332.519533/8.0),
-    REAL_CONST(47352.187126/8.0),
-    REAL_CONST(47371.856760/8.0),
-    REAL_CONST(47391.528437/8.0),
-    REAL_CONST(47411.202155/8.0),
-    REAL_CONST(47430.877915/8.0),
-    REAL_CONST(47450.555715/8.0),
-    REAL_CONST(47470.235556/8.0),
-    REAL_CONST(47489.917436/8.0),
-    REAL_CONST(47509.601356/8.0),
-    REAL_CONST(47529.287315/8.0),
-    REAL_CONST(47548.975312/8.0),
-    REAL_CONST(47568.665348/8.0),
-    REAL_CONST(47588.357421/8.0),
-    REAL_CONST(47608.051532/8.0),
-    REAL_CONST(47627.747680/8.0),
-    REAL_CONST(47647.445864/8.0),
-    REAL_CONST(47667.146085/8.0),
-    REAL_CONST(47686.848341/8.0),
-    REAL_CONST(47706.552632/8.0),
-    REAL_CONST(47726.258958/8.0),
-    REAL_CONST(47745.967319/8.0),
-    REAL_CONST(47765.677714/8.0),
-    REAL_CONST(47785.390142/8.0),
-    REAL_CONST(47805.104603/8.0),
-    REAL_CONST(47824.821097/8.0),
-    REAL_CONST(47844.539623/8.0),
-    REAL_CONST(47864.260181/8.0),
-    REAL_CONST(47883.982771/8.0),
-    REAL_CONST(47903.707392/8.0),
-    REAL_CONST(47923.434043/8.0),
-    REAL_CONST(47943.162725/8.0),
-    REAL_CONST(47962.893436/8.0),
-    REAL_CONST(47982.626177/8.0),
-    REAL_CONST(48002.360947/8.0),
-    REAL_CONST(48022.097745/8.0),
-    REAL_CONST(48041.836572/8.0),
-    REAL_CONST(48061.577426/8.0),
-    REAL_CONST(48081.320307/8.0),
-    REAL_CONST(48101.065216/8.0),
-    REAL_CONST(48120.812151/8.0),
-    REAL_CONST(48140.561112/8.0),
-    REAL_CONST(48160.312098/8.0),
-    REAL_CONST(48180.065110/8.0),
-    REAL_CONST(48199.820146/8.0),
-    REAL_CONST(48219.577207/8.0),
-    REAL_CONST(48239.336292/8.0),
-    REAL_CONST(48259.097401/8.0),
-    REAL_CONST(48278.860533/8.0),
-    REAL_CONST(48298.625687/8.0),
-    REAL_CONST(48318.392864/8.0),
-    REAL_CONST(48338.162062/8.0),
-    REAL_CONST(48357.933282/8.0),
-    REAL_CONST(48377.706524/8.0),
-    REAL_CONST(48397.481785/8.0),
-    REAL_CONST(48417.259068/8.0),
-    REAL_CONST(48437.038369/8.0),
-    REAL_CONST(48456.819691/8.0),
-    REAL_CONST(48476.603031/8.0),
-    REAL_CONST(48496.388390/8.0),
-    REAL_CONST(48516.175767/8.0),
-    REAL_CONST(48535.965162/8.0),
-    REAL_CONST(48555.756575/8.0),
-    REAL_CONST(48575.550004/8.0),
-    REAL_CONST(48595.345450/8.0),
-    REAL_CONST(48615.142912/8.0),
-    REAL_CONST(48634.942390/8.0),
-    REAL_CONST(48654.743883/8.0),
-    REAL_CONST(48674.547391/8.0),
-    REAL_CONST(48694.352913/8.0),
-    REAL_CONST(48714.160450/8.0),
-    REAL_CONST(48733.970000/8.0),
-    REAL_CONST(48753.781563/8.0),
-    REAL_CONST(48773.595140/8.0),
-    REAL_CONST(48793.410728/8.0),
-    REAL_CONST(48813.228329/8.0),
-    REAL_CONST(48833.047942/8.0),
-    REAL_CONST(48852.869565/8.0),
-    REAL_CONST(48872.693200/8.0),
-    REAL_CONST(48892.518845/8.0),
-    REAL_CONST(48912.346500/8.0),
-    REAL_CONST(48932.176164/8.0),
-    REAL_CONST(48952.007838/8.0),
-    REAL_CONST(48971.841520/8.0),
-    REAL_CONST(48991.677211/8.0),
-    REAL_CONST(49011.514910/8.0),
-    REAL_CONST(49031.354616/8.0),
-    REAL_CONST(49051.196330/8.0),
-    REAL_CONST(49071.040050/8.0),
-    REAL_CONST(49090.885777/8.0),
-    REAL_CONST(49110.733509/8.0),
-    REAL_CONST(49130.583247/8.0),
-    REAL_CONST(49150.434991/8.0),
-    REAL_CONST(49170.288739/8.0),
-    REAL_CONST(49190.144491/8.0),
-    REAL_CONST(49210.002247/8.0),
-    REAL_CONST(49229.862007/8.0),
-    REAL_CONST(49249.723769/8.0),
-    REAL_CONST(49269.587535/8.0),
-    REAL_CONST(49289.453303/8.0),
-    REAL_CONST(49309.321072/8.0),
-    REAL_CONST(49329.190843/8.0),
-    REAL_CONST(49349.062616/8.0),
-    REAL_CONST(49368.936388/8.0),
-    REAL_CONST(49388.812162/8.0),
-    REAL_CONST(49408.689935/8.0),
-    REAL_CONST(49428.569707/8.0),
-    REAL_CONST(49448.451479/8.0),
-    REAL_CONST(49468.335249/8.0),
-    REAL_CONST(49488.221018/8.0),
-    REAL_CONST(49508.108784/8.0),
-    REAL_CONST(49527.998548/8.0),
-    REAL_CONST(49547.890309/8.0),
-    REAL_CONST(49567.784066/8.0),
-    REAL_CONST(49587.679820/8.0),
-    REAL_CONST(49607.577570/8.0),
-    REAL_CONST(49627.477315/8.0),
-    REAL_CONST(49647.379055/8.0),
-    REAL_CONST(49667.282790/8.0),
-    REAL_CONST(49687.188520/8.0),
-    REAL_CONST(49707.096243/8.0),
-    REAL_CONST(49727.005959/8.0),
-    REAL_CONST(49746.917669/8.0),
-    REAL_CONST(49766.831371/8.0),
-    REAL_CONST(49786.747065/8.0),
-    REAL_CONST(49806.664752/8.0),
-    REAL_CONST(49826.584430/8.0),
-    REAL_CONST(49846.506098/8.0),
-    REAL_CONST(49866.429758/8.0),
-    REAL_CONST(49886.355408/8.0),
-    REAL_CONST(49906.283048/8.0),
-    REAL_CONST(49926.212677/8.0),
-    REAL_CONST(49946.144295/8.0),
-    REAL_CONST(49966.077902/8.0),
-    REAL_CONST(49986.013497/8.0),
-    REAL_CONST(50005.951081/8.0),
-    REAL_CONST(50025.890651/8.0),
-    REAL_CONST(50045.832209/8.0),
-    REAL_CONST(50065.775753/8.0),
-    REAL_CONST(50085.721284/8.0),
-    REAL_CONST(50105.668801/8.0),
-    REAL_CONST(50125.618303/8.0),
-    REAL_CONST(50145.569791/8.0),
-    REAL_CONST(50165.523263/8.0),
-    REAL_CONST(50185.478719/8.0),
-    REAL_CONST(50205.436159/8.0),
-    REAL_CONST(50225.395583/8.0),
-    REAL_CONST(50245.356990/8.0),
-    REAL_CONST(50265.320380/8.0),
-    REAL_CONST(50285.285752/8.0),
-    REAL_CONST(50305.253106/8.0),
-    REAL_CONST(50325.222442/8.0),
-    REAL_CONST(50345.193759/8.0),
-    REAL_CONST(50365.167057/8.0),
-    REAL_CONST(50385.142335/8.0),
-    REAL_CONST(50405.119593/8.0),
-    REAL_CONST(50425.098831/8.0),
-    REAL_CONST(50445.080047/8.0),
-    REAL_CONST(50465.063243/8.0),
-    REAL_CONST(50485.048417/8.0),
-    REAL_CONST(50505.035570/8.0),
-    REAL_CONST(50525.024699/8.0),
-    REAL_CONST(50545.015807/8.0),
-    REAL_CONST(50565.008891/8.0),
-    REAL_CONST(50585.003951/8.0),
-    REAL_CONST(50605.000988/8.0),
-    REAL_CONST(50625.000000/8.0),
-    REAL_CONST(50645.000988/8.0),
-    REAL_CONST(50665.003950/8.0),
-    REAL_CONST(50685.008887/8.0),
-    REAL_CONST(50705.015798/8.0),
-    REAL_CONST(50725.024683/8.0),
-    REAL_CONST(50745.035542/8.0),
-    REAL_CONST(50765.048373/8.0),
-    REAL_CONST(50785.063177/8.0),
-    REAL_CONST(50805.079953/8.0),
-    REAL_CONST(50825.098700/8.0),
-    REAL_CONST(50845.119420/8.0),
-    REAL_CONST(50865.142110/8.0),
-    REAL_CONST(50885.166771/8.0),
-    REAL_CONST(50905.193402/8.0),
-    REAL_CONST(50925.222003/8.0),
-    REAL_CONST(50945.252574/8.0),
-    REAL_CONST(50965.285113/8.0),
-    REAL_CONST(50985.319622/8.0),
-    REAL_CONST(51005.356098/8.0),
-    REAL_CONST(51025.394543/8.0),
-    REAL_CONST(51045.434955/8.0),
-    REAL_CONST(51065.477334/8.0),
-    REAL_CONST(51085.521680/8.0),
-    REAL_CONST(51105.567993/8.0),
-    REAL_CONST(51125.616271/8.0),
-    REAL_CONST(51145.666515/8.0),
-    REAL_CONST(51165.718724/8.0),
-    REAL_CONST(51185.772898/8.0),
-    REAL_CONST(51205.829037/8.0),
-    REAL_CONST(51225.887140/8.0),
-    REAL_CONST(51245.947206/8.0),
-    REAL_CONST(51266.009235/8.0),
-    REAL_CONST(51286.073228/8.0),
-    REAL_CONST(51306.139183/8.0),
-    REAL_CONST(51326.207100/8.0),
-    REAL_CONST(51346.276979/8.0),
-    REAL_CONST(51366.348820/8.0),
-    REAL_CONST(51386.422621/8.0),
-    REAL_CONST(51406.498383/8.0),
-    REAL_CONST(51426.576105/8.0),
-    REAL_CONST(51446.655787/8.0),
-    REAL_CONST(51466.737429/8.0),
-    REAL_CONST(51486.821030/8.0),
-    REAL_CONST(51506.906589/8.0),
-    REAL_CONST(51526.994107/8.0),
-    REAL_CONST(51547.083582/8.0),
-    REAL_CONST(51567.175016/8.0),
-    REAL_CONST(51587.268406/8.0),
-    REAL_CONST(51607.363753/8.0),
-    REAL_CONST(51627.461057/8.0),
-    REAL_CONST(51647.560316/8.0),
-    REAL_CONST(51667.661532/8.0),
-    REAL_CONST(51687.764702/8.0),
-    REAL_CONST(51707.869828/8.0),
-    REAL_CONST(51727.976908/8.0),
-    REAL_CONST(51748.085942/8.0),
-    REAL_CONST(51768.196930/8.0),
-    REAL_CONST(51788.309871/8.0),
-    REAL_CONST(51808.424765/8.0),
-    REAL_CONST(51828.541612/8.0),
-    REAL_CONST(51848.660411/8.0),
-    REAL_CONST(51868.781162/8.0),
-    REAL_CONST(51888.903864/8.0),
-    REAL_CONST(51909.028518/8.0),
-    REAL_CONST(51929.155122/8.0),
-    REAL_CONST(51949.283677/8.0),
-    REAL_CONST(51969.414181/8.0),
-    REAL_CONST(51989.546636/8.0),
-    REAL_CONST(52009.681039/8.0),
-    REAL_CONST(52029.817391/8.0),
-    REAL_CONST(52049.955692/8.0),
-    REAL_CONST(52070.095941/8.0),
-    REAL_CONST(52090.238137/8.0),
-    REAL_CONST(52110.382281/8.0),
-    REAL_CONST(52130.528372/8.0),
-    REAL_CONST(52150.676409/8.0),
-    REAL_CONST(52170.826393/8.0),
-    REAL_CONST(52190.978322/8.0),
-    REAL_CONST(52211.132197/8.0),
-    REAL_CONST(52231.288017/8.0),
-    REAL_CONST(52251.445781/8.0),
-    REAL_CONST(52271.605490/8.0),
-    REAL_CONST(52291.767143/8.0),
-    REAL_CONST(52311.930739/8.0),
-    REAL_CONST(52332.096279/8.0),
-    REAL_CONST(52352.263761/8.0),
-    REAL_CONST(52372.433186/8.0),
-    REAL_CONST(52392.604553/8.0),
-    REAL_CONST(52412.777862/8.0),
-    REAL_CONST(52432.953112/8.0),
-    REAL_CONST(52453.130303/8.0),
-    REAL_CONST(52473.309434/8.0),
-    REAL_CONST(52493.490506/8.0),
-    REAL_CONST(52513.673518/8.0),
-    REAL_CONST(52533.858469/8.0),
-    REAL_CONST(52554.045359/8.0),
-    REAL_CONST(52574.234188/8.0),
-    REAL_CONST(52594.424955/8.0),
-    REAL_CONST(52614.617660/8.0),
-    REAL_CONST(52634.812303/8.0),
-    REAL_CONST(52655.008883/8.0),
-    REAL_CONST(52675.207400/8.0),
-    REAL_CONST(52695.407853/8.0),
-    REAL_CONST(52715.610242/8.0),
-    REAL_CONST(52735.814568/8.0),
-    REAL_CONST(52756.020828/8.0),
-    REAL_CONST(52776.229024/8.0),
-    REAL_CONST(52796.439154/8.0),
-    REAL_CONST(52816.651218/8.0),
-    REAL_CONST(52836.865217/8.0),
-    REAL_CONST(52857.081149/8.0),
-    REAL_CONST(52877.299014/8.0),
-    REAL_CONST(52897.518811/8.0),
-    REAL_CONST(52917.740542/8.0),
-    REAL_CONST(52937.964204/8.0),
-    REAL_CONST(52958.189798/8.0),
-    REAL_CONST(52978.417323/8.0),
-    REAL_CONST(52998.646779/8.0),
-    REAL_CONST(53018.878166/8.0),
-    REAL_CONST(53039.111483/8.0),
-    REAL_CONST(53059.346730/8.0),
-    REAL_CONST(53079.583906/8.0),
-    REAL_CONST(53099.823011/8.0),
-    REAL_CONST(53120.064045/8.0),
-    REAL_CONST(53140.307008/8.0),
-    REAL_CONST(53160.551898/8.0),
-    REAL_CONST(53180.798716/8.0),
-    REAL_CONST(53201.047462/8.0),
-    REAL_CONST(53221.298134/8.0),
-    REAL_CONST(53241.550732/8.0),
-    REAL_CONST(53261.805257/8.0),
-    REAL_CONST(53282.061708/8.0),
-    REAL_CONST(53302.320084/8.0),
-    REAL_CONST(53322.580385/8.0),
-    REAL_CONST(53342.842611/8.0),
-    REAL_CONST(53363.106761/8.0),
-    REAL_CONST(53383.372835/8.0),
-    REAL_CONST(53403.640833/8.0),
-    REAL_CONST(53423.910754/8.0),
-    REAL_CONST(53444.182598/8.0),
-    REAL_CONST(53464.456364/8.0),
-    REAL_CONST(53484.732053/8.0),
-    REAL_CONST(53505.009663/8.0),
-    REAL_CONST(53525.289195/8.0),
-    REAL_CONST(53545.570648/8.0),
-    REAL_CONST(53565.854021/8.0),
-    REAL_CONST(53586.139315/8.0),
-    REAL_CONST(53606.426528/8.0),
-    REAL_CONST(53626.715662/8.0),
-    REAL_CONST(53647.006714/8.0),
-    REAL_CONST(53667.299685/8.0),
-    REAL_CONST(53687.594575/8.0),
-    REAL_CONST(53707.891383/8.0),
-    REAL_CONST(53728.190109/8.0),
-    REAL_CONST(53748.490752/8.0),
-    REAL_CONST(53768.793313/8.0),
-    REAL_CONST(53789.097790/8.0),
-    REAL_CONST(53809.404183/8.0),
-    REAL_CONST(53829.712492/8.0),
-    REAL_CONST(53850.022717/8.0),
-    REAL_CONST(53870.334857/8.0),
-    REAL_CONST(53890.648912/8.0),
-    REAL_CONST(53910.964882/8.0),
-    REAL_CONST(53931.282765/8.0),
-    REAL_CONST(53951.602563/8.0),
-    REAL_CONST(53971.924274/8.0),
-    REAL_CONST(53992.247898/8.0),
-    REAL_CONST(54012.573434/8.0),
-    REAL_CONST(54032.900883/8.0),
-    REAL_CONST(54053.230245/8.0),
-    REAL_CONST(54073.561517/8.0),
-    REAL_CONST(54093.894701/8.0),
-    REAL_CONST(54114.229796/8.0),
-    REAL_CONST(54134.566802/8.0),
-    REAL_CONST(54154.905717/8.0),
-    REAL_CONST(54175.246543/8.0),
-    REAL_CONST(54195.589278/8.0),
-    REAL_CONST(54215.933922/8.0),
-    REAL_CONST(54236.280475/8.0),
-    REAL_CONST(54256.628937/8.0),
-    REAL_CONST(54276.979306/8.0),
-    REAL_CONST(54297.331583/8.0),
-    REAL_CONST(54317.685768/8.0),
-    REAL_CONST(54338.041859/8.0),
-    REAL_CONST(54358.399857/8.0),
-    REAL_CONST(54378.759761/8.0),
-    REAL_CONST(54399.121572/8.0),
-    REAL_CONST(54419.485287/8.0),
-    REAL_CONST(54439.850908/8.0),
-    REAL_CONST(54460.218434/8.0),
-    REAL_CONST(54480.587865/8.0),
-    REAL_CONST(54500.959199/8.0),
-    REAL_CONST(54521.332437/8.0),
-    REAL_CONST(54541.707579/8.0),
-    REAL_CONST(54562.084624/8.0),
-    REAL_CONST(54582.463571/8.0),
-    REAL_CONST(54602.844421/8.0),
-    REAL_CONST(54623.227173/8.0),
-    REAL_CONST(54643.611826/8.0),
-    REAL_CONST(54663.998381/8.0),
-    REAL_CONST(54684.386836/8.0),
-    REAL_CONST(54704.777193/8.0),
-    REAL_CONST(54725.169449/8.0),
-    REAL_CONST(54745.563605/8.0),
-    REAL_CONST(54765.959661/8.0),
-    REAL_CONST(54786.357616/8.0),
-    REAL_CONST(54806.757470/8.0),
-    REAL_CONST(54827.159222/8.0),
-    REAL_CONST(54847.562872/8.0),
-    REAL_CONST(54867.968421/8.0),
-    REAL_CONST(54888.375866/8.0),
-    REAL_CONST(54908.785209/8.0),
-    REAL_CONST(54929.196448/8.0),
-    REAL_CONST(54949.609583/8.0),
-    REAL_CONST(54970.024615/8.0),
-    REAL_CONST(54990.441542/8.0),
-    REAL_CONST(55010.860365/8.0),
-    REAL_CONST(55031.281082/8.0),
-    REAL_CONST(55051.703694/8.0),
-    REAL_CONST(55072.128200/8.0),
-    REAL_CONST(55092.554600/8.0),
-    REAL_CONST(55112.982894/8.0),
-    REAL_CONST(55133.413081/8.0),
-    REAL_CONST(55153.845160/8.0),
-    REAL_CONST(55174.279132/8.0),
-    REAL_CONST(55194.714997/8.0),
-    REAL_CONST(55215.152753/8.0),
-    REAL_CONST(55235.592400/8.0),
-    REAL_CONST(55256.033938/8.0),
-    REAL_CONST(55276.477368/8.0),
-    REAL_CONST(55296.922687/8.0),
-    REAL_CONST(55317.369897/8.0),
-    REAL_CONST(55337.818996/8.0),
-    REAL_CONST(55358.269985/8.0),
-    REAL_CONST(55378.722862/8.0),
-    REAL_CONST(55399.177628/8.0),
-    REAL_CONST(55419.634283/8.0),
-    REAL_CONST(55440.092825/8.0),
-    REAL_CONST(55460.553255/8.0),
-    REAL_CONST(55481.015572/8.0),
-    REAL_CONST(55501.479776/8.0),
-    REAL_CONST(55521.945867/8.0),
-    REAL_CONST(55542.413844/8.0),
-    REAL_CONST(55562.883706/8.0),
-    REAL_CONST(55583.355455/8.0),
-    REAL_CONST(55603.829088/8.0),
-    REAL_CONST(55624.304606/8.0),
-    REAL_CONST(55644.782009/8.0),
-    REAL_CONST(55665.261295/8.0),
-    REAL_CONST(55685.742466/8.0),
-    REAL_CONST(55706.225519/8.0),
-    REAL_CONST(55726.710456/8.0),
-    REAL_CONST(55747.197276/8.0),
-    REAL_CONST(55767.685978/8.0),
-    REAL_CONST(55788.176562/8.0),
-    REAL_CONST(55808.669028/8.0),
-    REAL_CONST(55829.163375/8.0),
-    REAL_CONST(55849.659603/8.0),
-    REAL_CONST(55870.157711/8.0),
-    REAL_CONST(55890.657700/8.0),
-    REAL_CONST(55911.159569/8.0),
-    REAL_CONST(55931.663318/8.0),
-    REAL_CONST(55952.168946/8.0),
-    REAL_CONST(55972.676452/8.0),
-    REAL_CONST(55993.185838/8.0),
-    REAL_CONST(56013.697101/8.0),
-    REAL_CONST(56034.210243/8.0),
-    REAL_CONST(56054.725262/8.0),
-    REAL_CONST(56075.242158/8.0),
-    REAL_CONST(56095.760931/8.0),
-    REAL_CONST(56116.281580/8.0),
-    REAL_CONST(56136.804106/8.0),
-    REAL_CONST(56157.328508/8.0),
-    REAL_CONST(56177.854785/8.0),
-    REAL_CONST(56198.382937/8.0),
-    REAL_CONST(56218.912964/8.0),
-    REAL_CONST(56239.444865/8.0),
-    REAL_CONST(56259.978641/8.0),
-    REAL_CONST(56280.514290/8.0),
-    REAL_CONST(56301.051813/8.0),
-    REAL_CONST(56321.591209/8.0),
-    REAL_CONST(56342.132478/8.0),
-    REAL_CONST(56362.675619/8.0),
-    REAL_CONST(56383.220632/8.0),
-    REAL_CONST(56403.767517/8.0),
-    REAL_CONST(56424.316273/8.0),
-    REAL_CONST(56444.866900/8.0),
-    REAL_CONST(56465.419398/8.0),
-    REAL_CONST(56485.973766/8.0),
-    REAL_CONST(56506.530005/8.0),
-    REAL_CONST(56527.088113/8.0),
-    REAL_CONST(56547.648090/8.0),
-    REAL_CONST(56568.209937/8.0),
-    REAL_CONST(56588.773652/8.0),
-    REAL_CONST(56609.339235/8.0),
-    REAL_CONST(56629.906686/8.0),
-    REAL_CONST(56650.476005/8.0),
-    REAL_CONST(56671.047192/8.0),
-    REAL_CONST(56691.620245/8.0),
-    REAL_CONST(56712.195165/8.0),
-    REAL_CONST(56732.771951/8.0),
-    REAL_CONST(56753.350603/8.0),
-    REAL_CONST(56773.931121/8.0),
-    REAL_CONST(56794.513504/8.0),
-    REAL_CONST(56815.097752/8.0),
-    REAL_CONST(56835.683865/8.0),
-    REAL_CONST(56856.271842/8.0),
-    REAL_CONST(56876.861682/8.0),
-    REAL_CONST(56897.453387/8.0),
-    REAL_CONST(56918.046954/8.0),
-    REAL_CONST(56938.642385/8.0),
-    REAL_CONST(56959.239678/8.0),
-    REAL_CONST(56979.838833/8.0),
-    REAL_CONST(57000.439850/8.0),
-    REAL_CONST(57021.042729/8.0),
-    REAL_CONST(57041.647469/8.0),
-    REAL_CONST(57062.254070/8.0),
-    REAL_CONST(57082.862532/8.0),
-    REAL_CONST(57103.472853/8.0),
-    REAL_CONST(57124.085035/8.0),
-    REAL_CONST(57144.699076/8.0),
-    REAL_CONST(57165.314977/8.0),
-    REAL_CONST(57185.932736/8.0),
-    REAL_CONST(57206.552354/8.0),
-    REAL_CONST(57227.173830/8.0),
-    REAL_CONST(57247.797163/8.0),
-    REAL_CONST(57268.422355/8.0),
-    REAL_CONST(57289.049403/8.0),
-    REAL_CONST(57309.678309/8.0),
-    REAL_CONST(57330.309071/8.0),
-    REAL_CONST(57350.941689/8.0),
-    REAL_CONST(57371.576163/8.0),
-    REAL_CONST(57392.212493/8.0),
-    REAL_CONST(57412.850678/8.0),
-    REAL_CONST(57433.490717/8.0),
-    REAL_CONST(57454.132612/8.0),
-    REAL_CONST(57474.776360/8.0),
-    REAL_CONST(57495.421962/8.0),
-    REAL_CONST(57516.069418/8.0),
-    REAL_CONST(57536.718727/8.0),
-    REAL_CONST(57557.369889/8.0),
-    REAL_CONST(57578.022904/8.0),
-    REAL_CONST(57598.677770/8.0),
-    REAL_CONST(57619.334489/8.0),
-    REAL_CONST(57639.993059/8.0),
-    REAL_CONST(57660.653480/8.0),
-    REAL_CONST(57681.315752/8.0),
-    REAL_CONST(57701.979875/8.0),
-    REAL_CONST(57722.645848/8.0),
-    REAL_CONST(57743.313671/8.0),
-    REAL_CONST(57763.983343/8.0),
-    REAL_CONST(57784.654864/8.0),
-    REAL_CONST(57805.328235/8.0),
-    REAL_CONST(57826.003454/8.0),
-    REAL_CONST(57846.680521/8.0),
-    REAL_CONST(57867.359436/8.0),
-    REAL_CONST(57888.040199/8.0),
-    REAL_CONST(57908.722809/8.0),
-    REAL_CONST(57929.407266/8.0),
-    REAL_CONST(57950.093569/8.0),
-    REAL_CONST(57970.781719/8.0),
-    REAL_CONST(57991.471715/8.0),
-    REAL_CONST(58012.163556/8.0),
-    REAL_CONST(58032.857242/8.0),
-    REAL_CONST(58053.552774/8.0),
-    REAL_CONST(58074.250150/8.0),
-    REAL_CONST(58094.949370/8.0),
-    REAL_CONST(58115.650434/8.0),
-    REAL_CONST(58136.353342/8.0),
-    REAL_CONST(58157.058093/8.0),
-    REAL_CONST(58177.764687/8.0),
-    REAL_CONST(58198.473124/8.0),
-    REAL_CONST(58219.183403/8.0),
-    REAL_CONST(58239.895524/8.0),
-    REAL_CONST(58260.609487/8.0),
-    REAL_CONST(58281.325291/8.0),
-    REAL_CONST(58302.042936/8.0),
-    REAL_CONST(58322.762421/8.0),
-    REAL_CONST(58343.483747/8.0),
-    REAL_CONST(58364.206913/8.0),
-    REAL_CONST(58384.931919/8.0),
-    REAL_CONST(58405.658764/8.0),
-    REAL_CONST(58426.387448/8.0),
-    REAL_CONST(58447.117971/8.0),
-    REAL_CONST(58467.850332/8.0),
-    REAL_CONST(58488.584531/8.0),
-    REAL_CONST(58509.320568/8.0),
-    REAL_CONST(58530.058443/8.0),
-    REAL_CONST(58550.798154/8.0),
-    REAL_CONST(58571.539702/8.0),
-    REAL_CONST(58592.283087/8.0),
-    REAL_CONST(58613.028308/8.0),
-    REAL_CONST(58633.775364/8.0),
-    REAL_CONST(58654.524256/8.0),
-    REAL_CONST(58675.274983/8.0),
-    REAL_CONST(58696.027545/8.0),
-    REAL_CONST(58716.781941/8.0),
-    REAL_CONST(58737.538172/8.0),
-    REAL_CONST(58758.296236/8.0),
-    REAL_CONST(58779.056134/8.0),
-    REAL_CONST(58799.817865/8.0),
-    REAL_CONST(58820.581429/8.0),
-    REAL_CONST(58841.346826/8.0),
-    REAL_CONST(58862.114054/8.0),
-    REAL_CONST(58882.883115/8.0),
-    REAL_CONST(58903.654007/8.0),
-    REAL_CONST(58924.426731/8.0),
-    REAL_CONST(58945.201285/8.0),
-    REAL_CONST(58965.977670/8.0),
-    REAL_CONST(58986.755885/8.0),
-    REAL_CONST(59007.535930/8.0),
-    REAL_CONST(59028.317805/8.0),
-    REAL_CONST(59049.101509/8.0),
-    REAL_CONST(59069.887042/8.0),
-    REAL_CONST(59090.674404/8.0),
-    REAL_CONST(59111.463594/8.0),
-    REAL_CONST(59132.254612/8.0),
-    REAL_CONST(59153.047458/8.0),
-    REAL_CONST(59173.842131/8.0),
-    REAL_CONST(59194.638631/8.0),
-    REAL_CONST(59215.436958/8.0),
-    REAL_CONST(59236.237111/8.0),
-    REAL_CONST(59257.039091/8.0),
-    REAL_CONST(59277.842896/8.0),
-    REAL_CONST(59298.648527/8.0),
-    REAL_CONST(59319.455983/8.0),
-    REAL_CONST(59340.265263/8.0),
-    REAL_CONST(59361.076369/8.0),
-    REAL_CONST(59381.889298/8.0),
-    REAL_CONST(59402.704051/8.0),
-    REAL_CONST(59423.520628/8.0),
-    REAL_CONST(59444.339028/8.0),
-    REAL_CONST(59465.159251/8.0),
-    REAL_CONST(59485.981296/8.0),
-    REAL_CONST(59506.805164/8.0),
-    REAL_CONST(59527.630853/8.0),
-    REAL_CONST(59548.458365/8.0),
-    REAL_CONST(59569.287697/8.0),
-    REAL_CONST(59590.118851/8.0),
-    REAL_CONST(59610.951825/8.0),
-    REAL_CONST(59631.786620/8.0),
-    REAL_CONST(59652.623234/8.0),
-    REAL_CONST(59673.461668/8.0),
-    REAL_CONST(59694.301922/8.0),
-    REAL_CONST(59715.143995/8.0),
-    REAL_CONST(59735.987886/8.0),
-    REAL_CONST(59756.833596/8.0),
-    REAL_CONST(59777.681124/8.0),
-    REAL_CONST(59798.530470/8.0),
-    REAL_CONST(59819.381634/8.0),
-    REAL_CONST(59840.234614/8.0),
-    REAL_CONST(59861.089412/8.0),
-    REAL_CONST(59881.946026/8.0),
-    REAL_CONST(59902.804456/8.0),
-    REAL_CONST(59923.664702/8.0),
-    REAL_CONST(59944.526764/8.0),
-    REAL_CONST(59965.390641/8.0),
-    REAL_CONST(59986.256333/8.0),
-    REAL_CONST(60007.123839/8.0),
-    REAL_CONST(60027.993160/8.0),
-    REAL_CONST(60048.864295/8.0),
-    REAL_CONST(60069.737243/8.0),
-    REAL_CONST(60090.612005/8.0),
-    REAL_CONST(60111.488581/8.0),
-    REAL_CONST(60132.366968/8.0),
-    REAL_CONST(60153.247169/8.0),
-    REAL_CONST(60174.129181/8.0),
-    REAL_CONST(60195.013005/8.0),
-    REAL_CONST(60215.898641/8.0),
-    REAL_CONST(60236.786088/8.0),
-    REAL_CONST(60257.675345/8.0),
-    REAL_CONST(60278.566414/8.0),
-    REAL_CONST(60299.459292/8.0),
-    REAL_CONST(60320.353981/8.0),
-    REAL_CONST(60341.250479/8.0),
-    REAL_CONST(60362.148786/8.0),
-    REAL_CONST(60383.048902/8.0),
-    REAL_CONST(60403.950827/8.0),
-    REAL_CONST(60424.854561/8.0),
-    REAL_CONST(60445.760102/8.0),
-    REAL_CONST(60466.667451/8.0),
-    REAL_CONST(60487.576608/8.0),
-    REAL_CONST(60508.487572/8.0),
-    REAL_CONST(60529.400342/8.0),
-    REAL_CONST(60550.314919/8.0),
-    REAL_CONST(60571.231302/8.0),
-    REAL_CONST(60592.149491/8.0),
-    REAL_CONST(60613.069486/8.0),
-    REAL_CONST(60633.991286/8.0),
-    REAL_CONST(60654.914890/8.0),
-    REAL_CONST(60675.840300/8.0),
-    REAL_CONST(60696.767513/8.0),
-    REAL_CONST(60717.696531/8.0),
-    REAL_CONST(60738.627352/8.0),
-    REAL_CONST(60759.559977/8.0),
-    REAL_CONST(60780.494405/8.0),
-    REAL_CONST(60801.430635/8.0),
-    REAL_CONST(60822.368668/8.0),
-    REAL_CONST(60843.308503/8.0),
-    REAL_CONST(60864.250140/8.0),
-    REAL_CONST(60885.193578/8.0),
-    REAL_CONST(60906.138818/8.0),
-    REAL_CONST(60927.085859/8.0),
-    REAL_CONST(60948.034700/8.0),
-    REAL_CONST(60968.985341/8.0),
-    REAL_CONST(60989.937782/8.0),
-    REAL_CONST(61010.892023/8.0),
-    REAL_CONST(61031.848063/8.0),
-    REAL_CONST(61052.805903/8.0),
-    REAL_CONST(61073.765541/8.0),
-    REAL_CONST(61094.726977/8.0),
-    REAL_CONST(61115.690212/8.0),
-    REAL_CONST(61136.655244/8.0),
-    REAL_CONST(61157.622074/8.0),
-    REAL_CONST(61178.590701/8.0),
-    REAL_CONST(61199.561125/8.0),
-    REAL_CONST(61220.533345/8.0),
-    REAL_CONST(61241.507362/8.0),
-    REAL_CONST(61262.483175/8.0),
-    REAL_CONST(61283.460783/8.0),
-    REAL_CONST(61304.440187/8.0),
-    REAL_CONST(61325.421385/8.0),
-    REAL_CONST(61346.404379/8.0),
-    REAL_CONST(61367.389167/8.0),
-    REAL_CONST(61388.375749/8.0),
-    REAL_CONST(61409.364124/8.0),
-    REAL_CONST(61430.354294/8.0),
-    REAL_CONST(61451.346256/8.0),
-    REAL_CONST(61472.340011/8.0),
-    REAL_CONST(61493.335559/8.0),
-    REAL_CONST(61514.332899/8.0),
-    REAL_CONST(61535.332031/8.0),
-    REAL_CONST(61556.332955/8.0),
-    REAL_CONST(61577.335670/8.0),
-    REAL_CONST(61598.340177/8.0),
-    REAL_CONST(61619.346473/8.0),
-    REAL_CONST(61640.354561/8.0),
-    REAL_CONST(61661.364438/8.0),
-    REAL_CONST(61682.376106/8.0),
-    REAL_CONST(61703.389562/8.0),
-    REAL_CONST(61724.404808/8.0),
-    REAL_CONST(61745.421843/8.0),
-    REAL_CONST(61766.440667/8.0),
-    REAL_CONST(61787.461279/8.0),
-    REAL_CONST(61808.483679/8.0),
-    REAL_CONST(61829.507866/8.0),
-    REAL_CONST(61850.533841/8.0),
-    REAL_CONST(61871.561603/8.0),
-    REAL_CONST(61892.591152/8.0),
-    REAL_CONST(61913.622487/8.0),
-    REAL_CONST(61934.655609/8.0),
-    REAL_CONST(61955.690516/8.0),
-    REAL_CONST(61976.727209/8.0),
-    REAL_CONST(61997.765687/8.0),
-    REAL_CONST(62018.805951/8.0),
-    REAL_CONST(62039.847998/8.0),
-    REAL_CONST(62060.891831/8.0),
-    REAL_CONST(62081.937447/8.0),
-    REAL_CONST(62102.984847/8.0),
-    REAL_CONST(62124.034030/8.0),
-    REAL_CONST(62145.084997/8.0),
-    REAL_CONST(62166.137746/8.0),
-    REAL_CONST(62187.192278/8.0),
-    REAL_CONST(62208.248592/8.0),
-    REAL_CONST(62229.306689/8.0),
-    REAL_CONST(62250.366566/8.0),
-    REAL_CONST(62271.428226/8.0),
-    REAL_CONST(62292.491666/8.0),
-    REAL_CONST(62313.556887/8.0),
-    REAL_CONST(62334.623888/8.0),
-    REAL_CONST(62355.692669/8.0),
-    REAL_CONST(62376.763231/8.0),
-    REAL_CONST(62397.835572/8.0),
-    REAL_CONST(62418.909692/8.0),
-    REAL_CONST(62439.985591/8.0),
-    REAL_CONST(62461.063268/8.0),
-    REAL_CONST(62482.142724/8.0),
-    REAL_CONST(62503.223958/8.0),
-    REAL_CONST(62524.306970/8.0),
-    REAL_CONST(62545.391759/8.0),
-    REAL_CONST(62566.478326/8.0),
-    REAL_CONST(62587.566669/8.0),
-    REAL_CONST(62608.656788/8.0),
-    REAL_CONST(62629.748684/8.0),
-    REAL_CONST(62650.842356/8.0),
-    REAL_CONST(62671.937804/8.0),
-    REAL_CONST(62693.035027/8.0),
-    REAL_CONST(62714.134024/8.0),
-    REAL_CONST(62735.234797/8.0),
-    REAL_CONST(62756.337344/8.0),
-    REAL_CONST(62777.441665/8.0),
-    REAL_CONST(62798.547760/8.0),
-    REAL_CONST(62819.655629/8.0),
-    REAL_CONST(62840.765271/8.0),
-    REAL_CONST(62861.876685/8.0),
-    REAL_CONST(62882.989873/8.0),
-    REAL_CONST(62904.104833/8.0),
-    REAL_CONST(62925.221565/8.0),
-    REAL_CONST(62946.340068/8.0),
-    REAL_CONST(62967.460343/8.0),
-    REAL_CONST(62988.582389/8.0),
-    REAL_CONST(63009.706207/8.0),
-    REAL_CONST(63030.831794/8.0),
-    REAL_CONST(63051.959152/8.0),
-    REAL_CONST(63073.088280/8.0),
-    REAL_CONST(63094.219178/8.0),
-    REAL_CONST(63115.351845/8.0),
-    REAL_CONST(63136.486281/8.0),
-    REAL_CONST(63157.622486/8.0),
-    REAL_CONST(63178.760459/8.0),
-    REAL_CONST(63199.900201/8.0),
-    REAL_CONST(63221.041710/8.0),
-    REAL_CONST(63242.184987/8.0),
-    REAL_CONST(63263.330032/8.0),
-    REAL_CONST(63284.476843/8.0),
-    REAL_CONST(63305.625421/8.0),
-    REAL_CONST(63326.775766/8.0),
-    REAL_CONST(63347.927877/8.0),
-    REAL_CONST(63369.081753/8.0),
-    REAL_CONST(63390.237395/8.0),
-    REAL_CONST(63411.394803/8.0),
-    REAL_CONST(63432.553975/8.0),
-    REAL_CONST(63453.714912/8.0),
-    REAL_CONST(63474.877613/8.0),
-    REAL_CONST(63496.042079/8.0),
-    REAL_CONST(63517.208308/8.0),
-    REAL_CONST(63538.376301/8.0),
-    REAL_CONST(63559.546056/8.0),
-    REAL_CONST(63580.717575/8.0),
-    REAL_CONST(63601.890857/8.0),
-    REAL_CONST(63623.065900/8.0),
-    REAL_CONST(63644.242706/8.0),
-    REAL_CONST(63665.421273/8.0),
-    REAL_CONST(63686.601602/8.0),
-    REAL_CONST(63707.783692/8.0),
-    REAL_CONST(63728.967543/8.0),
-    REAL_CONST(63750.153155/8.0),
-    REAL_CONST(63771.340526/8.0),
-    REAL_CONST(63792.529658/8.0),
-    REAL_CONST(63813.720549/8.0),
-    REAL_CONST(63834.913200/8.0),
-    REAL_CONST(63856.107610/8.0),
-    REAL_CONST(63877.303778/8.0),
-    REAL_CONST(63898.501705/8.0),
-    REAL_CONST(63919.701391/8.0),
-    REAL_CONST(63940.902834/8.0),
-    REAL_CONST(63962.106035/8.0),
-    REAL_CONST(63983.310993/8.0),
-    REAL_CONST(64004.517708/8.0),
-    REAL_CONST(64025.726180/8.0),
-    REAL_CONST(64046.936409/8.0),
-    REAL_CONST(64068.148393/8.0),
-    REAL_CONST(64089.362134/8.0),
-    REAL_CONST(64110.577630/8.0),
-    REAL_CONST(64131.794881/8.0),
-    REAL_CONST(64153.013888/8.0),
-    REAL_CONST(64174.234649/8.0),
-    REAL_CONST(64195.457165/8.0),
-    REAL_CONST(64216.681434/8.0),
-    REAL_CONST(64237.907458/8.0),
-    REAL_CONST(64259.135235/8.0),
-    REAL_CONST(64280.364766/8.0),
-    REAL_CONST(64301.596049/8.0),
-    REAL_CONST(64322.829085/8.0),
-    REAL_CONST(64344.063874/8.0),
-    REAL_CONST(64365.300414/8.0),
-    REAL_CONST(64386.538707/8.0),
-    REAL_CONST(64407.778751/8.0),
-    REAL_CONST(64429.020546/8.0),
-    REAL_CONST(64450.264092/8.0),
-    REAL_CONST(64471.509389/8.0),
-    REAL_CONST(64492.756437/8.0),
-    REAL_CONST(64514.005234/8.0),
-    REAL_CONST(64535.255781/8.0),
-    REAL_CONST(64556.508078/8.0),
-    REAL_CONST(64577.762124/8.0),
-    REAL_CONST(64599.017919/8.0),
-    REAL_CONST(64620.275462/8.0),
-    REAL_CONST(64641.534754/8.0),
-    REAL_CONST(64662.795794/8.0),
-    REAL_CONST(64684.058582/8.0),
-    REAL_CONST(64705.323117/8.0),
-    REAL_CONST(64726.589400/8.0),
-    REAL_CONST(64747.857429/8.0),
-    REAL_CONST(64769.127205/8.0),
-    REAL_CONST(64790.398728/8.0),
-    REAL_CONST(64811.671996/8.0),
-    REAL_CONST(64832.947011/8.0),
-    REAL_CONST(64854.223770/8.0),
-    REAL_CONST(64875.502276/8.0),
-    REAL_CONST(64896.782525/8.0),
-    REAL_CONST(64918.064520/8.0),
-    REAL_CONST(64939.348259/8.0),
-    REAL_CONST(64960.633742/8.0),
-    REAL_CONST(64981.920969/8.0),
-    REAL_CONST(65003.209939/8.0),
-    REAL_CONST(65024.500653/8.0),
-    REAL_CONST(65045.793109/8.0),
-    REAL_CONST(65067.087308/8.0),
-    REAL_CONST(65088.383250/8.0),
-    REAL_CONST(65109.680933/8.0),
-    REAL_CONST(65130.980358/8.0),
-    REAL_CONST(65152.281525/8.0),
-    REAL_CONST(65173.584433/8.0),
-    REAL_CONST(65194.889082/8.0),
-    REAL_CONST(65216.195472/8.0),
-    REAL_CONST(65237.503602/8.0),
-    REAL_CONST(65258.813472/8.0),
-    REAL_CONST(65280.125081/8.0),
-    REAL_CONST(65301.438431/8.0),
-    REAL_CONST(65322.753519/8.0),
-    REAL_CONST(65344.070347/8.0),
-    REAL_CONST(65365.388913/8.0),
-    REAL_CONST(65386.709218/8.0),
-    REAL_CONST(65408.031260/8.0),
-    REAL_CONST(65429.355041/8.0),
-    REAL_CONST(65450.680559/8.0),
-    REAL_CONST(65472.007814/8.0),
-    REAL_CONST(65493.336806/8.0),
-    REAL_CONST(65514.667535/8.0),
-    REAL_CONST(65536.000000/8.0),
-    REAL_CONST(65557.334201/8.0),
-    REAL_CONST(65578.670139/8.0),
-    REAL_CONST(65600.007811/8.0),
-    REAL_CONST(65621.347219/8.0),
-    REAL_CONST(65642.688362/8.0),
-    REAL_CONST(65664.031240/8.0),
-    REAL_CONST(65685.375852/8.0),
-    REAL_CONST(65706.722198/8.0),
-    REAL_CONST(65728.070278/8.0),
-    REAL_CONST(65749.420092/8.0),
-    REAL_CONST(65770.771639/8.0),
-    REAL_CONST(65792.124919/8.0),
-    REAL_CONST(65813.479931/8.0),
-    REAL_CONST(65834.836677/8.0),
-    REAL_CONST(65856.195154/8.0),
-    REAL_CONST(65877.555363/8.0),
-    REAL_CONST(65898.917304/8.0),
-    REAL_CONST(65920.280976/8.0),
-    REAL_CONST(65941.646379/8.0),
-    REAL_CONST(65963.013513/8.0),
-    REAL_CONST(65984.382377/8.0),
-    REAL_CONST(66005.752972/8.0),
-    REAL_CONST(66027.125296/8.0),
-    REAL_CONST(66048.499351/8.0),
-    REAL_CONST(66069.875134/8.0),
-    REAL_CONST(66091.252647/8.0),
-    REAL_CONST(66112.631888/8.0),
-    REAL_CONST(66134.012858/8.0),
-    REAL_CONST(66155.395556/8.0),
-    REAL_CONST(66176.779982/8.0),
-    REAL_CONST(66198.166136/8.0),
-    REAL_CONST(66219.554017/8.0),
-    REAL_CONST(66240.943626/8.0),
-    REAL_CONST(66262.334961/8.0),
-    REAL_CONST(66283.728023/8.0),
-    REAL_CONST(66305.122811/8.0),
-    REAL_CONST(66326.519325/8.0),
-    REAL_CONST(66347.917565/8.0),
-    REAL_CONST(66369.317530/8.0),
-    REAL_CONST(66390.719220/8.0),
-    REAL_CONST(66412.122636/8.0),
-    REAL_CONST(66433.527776/8.0),
-    REAL_CONST(66454.934640/8.0),
-    REAL_CONST(66476.343228/8.0),
-    REAL_CONST(66497.753540/8.0),
-    REAL_CONST(66519.165576/8.0),
-    REAL_CONST(66540.579335/8.0),
-    REAL_CONST(66561.994817/8.0),
-    REAL_CONST(66583.412021/8.0),
-    REAL_CONST(66604.830948/8.0),
-    REAL_CONST(66626.251597/8.0),
-    REAL_CONST(66647.673968/8.0),
-    REAL_CONST(66669.098061/8.0),
-    REAL_CONST(66690.523875/8.0),
-    REAL_CONST(66711.951409/8.0),
-    REAL_CONST(66733.380665/8.0),
-    REAL_CONST(66754.811641/8.0),
-    REAL_CONST(66776.244337/8.0),
-    REAL_CONST(66797.678753/8.0),
-    REAL_CONST(66819.114889/8.0),
-    REAL_CONST(66840.552744/8.0),
-    REAL_CONST(66861.992318/8.0),
-    REAL_CONST(66883.433611/8.0),
-    REAL_CONST(66904.876623/8.0),
-    REAL_CONST(66926.321353/8.0),
-    REAL_CONST(66947.767800/8.0),
-    REAL_CONST(66969.215966/8.0),
-    REAL_CONST(66990.665849/8.0),
-    REAL_CONST(67012.117449/8.0),
-    REAL_CONST(67033.570766/8.0),
-    REAL_CONST(67055.025800/8.0),
-    REAL_CONST(67076.482549/8.0),
-    REAL_CONST(67097.941015/8.0),
-    REAL_CONST(67119.401197/8.0),
-    REAL_CONST(67140.863094/8.0),
-    REAL_CONST(67162.326707/8.0),
-    REAL_CONST(67183.792034/8.0),
-    REAL_CONST(67205.259077/8.0),
-    REAL_CONST(67226.727833/8.0),
-    REAL_CONST(67248.198304/8.0),
-    REAL_CONST(67269.670488/8.0),
-    REAL_CONST(67291.144387/8.0),
-    REAL_CONST(67312.619998/8.0),
-    REAL_CONST(67334.097323/8.0),
-    REAL_CONST(67355.576360/8.0),
-    REAL_CONST(67377.057110/8.0),
-    REAL_CONST(67398.539572/8.0),
-    REAL_CONST(67420.023746/8.0),
-    REAL_CONST(67441.509631/8.0),
-    REAL_CONST(67462.997228/8.0),
-    REAL_CONST(67484.486537/8.0),
-    REAL_CONST(67505.977556/8.0),
-    REAL_CONST(67527.470285/8.0),
-    REAL_CONST(67548.964725/8.0),
-    REAL_CONST(67570.460875/8.0),
-    REAL_CONST(67591.958735/8.0),
-    REAL_CONST(67613.458305/8.0),
-    REAL_CONST(67634.959583/8.0),
-    REAL_CONST(67656.462571/8.0),
-    REAL_CONST(67677.967267/8.0),
-    REAL_CONST(67699.473671/8.0),
-    REAL_CONST(67720.981784/8.0),
-    REAL_CONST(67742.491605/8.0),
-    REAL_CONST(67764.003133/8.0),
-    REAL_CONST(67785.516369/8.0),
-    REAL_CONST(67807.031311/8.0),
-    REAL_CONST(67828.547961/8.0),
-    REAL_CONST(67850.066317/8.0),
-    REAL_CONST(67871.586379/8.0),
-    REAL_CONST(67893.108147/8.0),
-    REAL_CONST(67914.631621/8.0),
-    REAL_CONST(67936.156800/8.0),
-    REAL_CONST(67957.683685/8.0),
-    REAL_CONST(67979.212274/8.0),
-    REAL_CONST(68000.742568/8.0),
-    REAL_CONST(68022.274566/8.0),
-    REAL_CONST(68043.808269/8.0),
-    REAL_CONST(68065.343675/8.0),
-    REAL_CONST(68086.880785/8.0),
-    REAL_CONST(68108.419598/8.0),
-    REAL_CONST(68129.960114/8.0),
-    REAL_CONST(68151.502333/8.0),
-    REAL_CONST(68173.046254/8.0),
-    REAL_CONST(68194.591878/8.0),
-    REAL_CONST(68216.139203/8.0),
-    REAL_CONST(68237.688230/8.0),
-    REAL_CONST(68259.238959/8.0),
-    REAL_CONST(68280.791388/8.0),
-    REAL_CONST(68302.345519/8.0),
-    REAL_CONST(68323.901350/8.0),
-    REAL_CONST(68345.458881/8.0),
-    REAL_CONST(68367.018113/8.0),
-    REAL_CONST(68388.579044/8.0),
-    REAL_CONST(68410.141675/8.0),
-    REAL_CONST(68431.706005/8.0),
-    REAL_CONST(68453.272034/8.0),
-    REAL_CONST(68474.839762/8.0),
-    REAL_CONST(68496.409188/8.0),
-    REAL_CONST(68517.980312/8.0),
-    REAL_CONST(68539.553134/8.0),
-    REAL_CONST(68561.127654/8.0),
-    REAL_CONST(68582.703872/8.0),
-    REAL_CONST(68604.281786/8.0),
-    REAL_CONST(68625.861397/8.0),
-    REAL_CONST(68647.442705/8.0),
-    REAL_CONST(68669.025709/8.0),
-    REAL_CONST(68690.610409/8.0),
-    REAL_CONST(68712.196805/8.0),
-    REAL_CONST(68733.784897/8.0),
-    REAL_CONST(68755.374683/8.0),
-    REAL_CONST(68776.966165/8.0),
-    REAL_CONST(68798.559341/8.0),
-    REAL_CONST(68820.154212/8.0),
-    REAL_CONST(68841.750777/8.0),
-    REAL_CONST(68863.349036/8.0),
-    REAL_CONST(68884.948989/8.0),
-    REAL_CONST(68906.550635/8.0),
-    REAL_CONST(68928.153974/8.0),
-    REAL_CONST(68949.759006/8.0),
-    REAL_CONST(68971.365730/8.0),
-    REAL_CONST(68992.974147/8.0),
-    REAL_CONST(69014.584256/8.0),
-    REAL_CONST(69036.196057/8.0),
-    REAL_CONST(69057.809549/8.0),
-    REAL_CONST(69079.424732/8.0),
-    REAL_CONST(69101.041607/8.0),
-    REAL_CONST(69122.660172/8.0),
-    REAL_CONST(69144.280428/8.0),
-    REAL_CONST(69165.902373/8.0),
-    REAL_CONST(69187.526009/8.0),
-    REAL_CONST(69209.151335/8.0),
-    REAL_CONST(69230.778350/8.0),
-    REAL_CONST(69252.407054/8.0),
-    REAL_CONST(69274.037447/8.0),
-    REAL_CONST(69295.669528/8.0),
-    REAL_CONST(69317.303298/8.0),
-    REAL_CONST(69338.938756/8.0),
-    REAL_CONST(69360.575902/8.0),
-    REAL_CONST(69382.214735/8.0),
-    REAL_CONST(69403.855256/8.0),
-    REAL_CONST(69425.497464/8.0),
-    REAL_CONST(69447.141358/8.0),
-    REAL_CONST(69468.786939/8.0),
-    REAL_CONST(69490.434207/8.0),
-    REAL_CONST(69512.083160/8.0),
-    REAL_CONST(69533.733799/8.0),
-    REAL_CONST(69555.386124/8.0),
-    REAL_CONST(69577.040133/8.0),
-    REAL_CONST(69598.695828/8.0),
-    REAL_CONST(69620.353207/8.0),
-    REAL_CONST(69642.012271/8.0),
-    REAL_CONST(69663.673019/8.0),
-    REAL_CONST(69685.335451/8.0),
-    REAL_CONST(69706.999566/8.0),
-    REAL_CONST(69728.665365/8.0),
-    REAL_CONST(69750.332847/8.0),
-    REAL_CONST(69772.002011/8.0),
-    REAL_CONST(69793.672859/8.0),
-    REAL_CONST(69815.345388/8.0),
-    REAL_CONST(69837.019600/8.0),
-    REAL_CONST(69858.695494/8.0),
-    REAL_CONST(69880.373069/8.0),
-    REAL_CONST(69902.052325/8.0),
-    REAL_CONST(69923.733262/8.0),
-    REAL_CONST(69945.415880/8.0),
-    REAL_CONST(69967.100179/8.0),
-    REAL_CONST(69988.786158/8.0),
-    REAL_CONST(70010.473817/8.0),
-    REAL_CONST(70032.163155/8.0),
-    REAL_CONST(70053.854173/8.0),
-    REAL_CONST(70075.546870/8.0),
-    REAL_CONST(70097.241246/8.0),
-    REAL_CONST(70118.937301/8.0),
-    REAL_CONST(70140.635034/8.0),
-    REAL_CONST(70162.334446/8.0),
-    REAL_CONST(70184.035535/8.0),
-    REAL_CONST(70205.738302/8.0),
-    REAL_CONST(70227.442746/8.0),
-    REAL_CONST(70249.148867/8.0),
-    REAL_CONST(70270.856666/8.0),
-    REAL_CONST(70292.566141/8.0),
-    REAL_CONST(70314.277292/8.0),
-    REAL_CONST(70335.990119/8.0),
-    REAL_CONST(70357.704622/8.0),
-    REAL_CONST(70379.420801/8.0),
-    REAL_CONST(70401.138655/8.0),
-    REAL_CONST(70422.858184/8.0),
-    REAL_CONST(70444.579388/8.0),
-    REAL_CONST(70466.302266/8.0),
-    REAL_CONST(70488.026819/8.0),
-    REAL_CONST(70509.753045/8.0),
-    REAL_CONST(70531.480946/8.0),
-    REAL_CONST(70553.210520/8.0),
-    REAL_CONST(70574.941767/8.0),
-    REAL_CONST(70596.674687/8.0),
-    REAL_CONST(70618.409280/8.0),
-    REAL_CONST(70640.145545/8.0),
-    REAL_CONST(70661.883483/8.0),
-    REAL_CONST(70683.623092/8.0),
-    REAL_CONST(70705.364373/8.0),
-    REAL_CONST(70727.107326/8.0),
-    REAL_CONST(70748.851950/8.0),
-    REAL_CONST(70770.598245/8.0),
-    REAL_CONST(70792.346210/8.0),
-    REAL_CONST(70814.095846/8.0),
-    REAL_CONST(70835.847152/8.0),
-    REAL_CONST(70857.600128/8.0),
-    REAL_CONST(70879.354773/8.0),
-    REAL_CONST(70901.111088/8.0),
-    REAL_CONST(70922.869072/8.0),
-    REAL_CONST(70944.628725/8.0),
-    REAL_CONST(70966.390047/8.0),
-    REAL_CONST(70988.153037/8.0),
-    REAL_CONST(71009.917695/8.0),
-    REAL_CONST(71031.684021/8.0),
-    REAL_CONST(71053.452014/8.0),
-    REAL_CONST(71075.221675/8.0),
-    REAL_CONST(71096.993003/8.0),
-    REAL_CONST(71118.765998/8.0),
-    REAL_CONST(71140.540659/8.0),
-    REAL_CONST(71162.316987/8.0),
-    REAL_CONST(71184.094980/8.0),
-    REAL_CONST(71205.874640/8.0),
-    REAL_CONST(71227.655965/8.0),
-    REAL_CONST(71249.438955/8.0),
-    REAL_CONST(71271.223611/8.0),
-    REAL_CONST(71293.009931/8.0),
-    REAL_CONST(71314.797916/8.0),
-    REAL_CONST(71336.587565/8.0),
-    REAL_CONST(71358.378878/8.0),
-    REAL_CONST(71380.171855/8.0),
-    REAL_CONST(71401.966495/8.0),
-    REAL_CONST(71423.762799/8.0),
-    REAL_CONST(71445.560766/8.0),
-    REAL_CONST(71467.360395/8.0),
-    REAL_CONST(71489.161687/8.0),
-    REAL_CONST(71510.964641/8.0),
-    REAL_CONST(71532.769257/8.0),
-    REAL_CONST(71554.575535/8.0),
-    REAL_CONST(71576.383475/8.0),
-    REAL_CONST(71598.193075/8.0),
-    REAL_CONST(71620.004337/8.0),
-    REAL_CONST(71641.817260/8.0),
-    REAL_CONST(71663.631842/8.0),
-    REAL_CONST(71685.448086/8.0),
-    REAL_CONST(71707.265989/8.0),
-    REAL_CONST(71729.085551/8.0),
-    REAL_CONST(71750.906774/8.0),
-    REAL_CONST(71772.729655/8.0),
-    REAL_CONST(71794.554196/8.0),
-    REAL_CONST(71816.380395/8.0),
-    REAL_CONST(71838.208253/8.0),
-    REAL_CONST(71860.037768/8.0),
-    REAL_CONST(71881.868942/8.0),
-    REAL_CONST(71903.701774/8.0),
-    REAL_CONST(71925.536263/8.0),
-    REAL_CONST(71947.372409/8.0),
-    REAL_CONST(71969.210212/8.0),
-    REAL_CONST(71991.049672/8.0),
-    REAL_CONST(72012.890788/8.0),
-    REAL_CONST(72034.733561/8.0),
-    REAL_CONST(72056.577989/8.0),
-    REAL_CONST(72078.424073/8.0),
-    REAL_CONST(72100.271813/8.0),
-    REAL_CONST(72122.121208/8.0),
-    REAL_CONST(72143.972257/8.0),
-    REAL_CONST(72165.824962/8.0),
-    REAL_CONST(72187.679321/8.0),
-    REAL_CONST(72209.535334/8.0),
-    REAL_CONST(72231.393001/8.0),
-    REAL_CONST(72253.252321/8.0),
-    REAL_CONST(72275.113295/8.0),
-    REAL_CONST(72296.975923/8.0),
-    REAL_CONST(72318.840203/8.0),
-    REAL_CONST(72340.706136/8.0),
-    REAL_CONST(72362.573721/8.0),
-    REAL_CONST(72384.442959/8.0),
-    REAL_CONST(72406.313848/8.0),
-    REAL_CONST(72428.186390/8.0),
-    REAL_CONST(72450.060582/8.0),
-    REAL_CONST(72471.936426/8.0),
-    REAL_CONST(72493.813921/8.0),
-    REAL_CONST(72515.693066/8.0),
-    REAL_CONST(72537.573862/8.0),
-    REAL_CONST(72559.456308/8.0),
-    REAL_CONST(72581.340405/8.0),
-    REAL_CONST(72603.226150/8.0),
-    REAL_CONST(72625.113546/8.0),
-    REAL_CONST(72647.002590/8.0),
-    REAL_CONST(72668.893283/8.0),
-    REAL_CONST(72690.785625/8.0),
-    REAL_CONST(72712.679616/8.0),
-    REAL_CONST(72734.575255/8.0),
-    REAL_CONST(72756.472542/8.0),
-    REAL_CONST(72778.371476/8.0),
-    REAL_CONST(72800.272058/8.0),
-    REAL_CONST(72822.174287/8.0),
-    REAL_CONST(72844.078163/8.0),
-    REAL_CONST(72865.983686/8.0),
-    REAL_CONST(72887.890855/8.0),
-    REAL_CONST(72909.799671/8.0),
-    REAL_CONST(72931.710132/8.0),
-    REAL_CONST(72953.622239/8.0),
-    REAL_CONST(72975.535992/8.0),
-    REAL_CONST(72997.451390/8.0),
-    REAL_CONST(73019.368433/8.0),
-    REAL_CONST(73041.287121/8.0),
-    REAL_CONST(73063.207453/8.0),
-    REAL_CONST(73085.129429/8.0),
-    REAL_CONST(73107.053050/8.0),
-    REAL_CONST(73128.978314/8.0),
-    REAL_CONST(73150.905222/8.0),
-    REAL_CONST(73172.833773/8.0),
-    REAL_CONST(73194.763967/8.0),
-    REAL_CONST(73216.695803/8.0),
-    REAL_CONST(73238.629283/8.0),
-    REAL_CONST(73260.564404/8.0),
-    REAL_CONST(73282.501168/8.0),
-    REAL_CONST(73304.439573/8.0),
-    REAL_CONST(73326.379620/8.0),
-    REAL_CONST(73348.321308/8.0),
-    REAL_CONST(73370.264638/8.0),
-    REAL_CONST(73392.209608/8.0),
-    REAL_CONST(73414.156218/8.0),
-    REAL_CONST(73436.104469/8.0),
-    REAL_CONST(73458.054361/8.0),
-    REAL_CONST(73480.005891/8.0),
-    REAL_CONST(73501.959062/8.0),
-    REAL_CONST(73523.913872/8.0),
-    REAL_CONST(73545.870321/8.0),
-    REAL_CONST(73567.828408/8.0),
-    REAL_CONST(73589.788135/8.0),
-    REAL_CONST(73611.749499/8.0),
-    REAL_CONST(73633.712502/8.0),
-    REAL_CONST(73655.677143/8.0),
-    REAL_CONST(73677.643421/8.0),
-    REAL_CONST(73699.611337/8.0),
-    REAL_CONST(73721.580889/8.0),
-    REAL_CONST(73743.552079/8.0),
-    REAL_CONST(73765.524906/8.0),
-    REAL_CONST(73787.499368/8.0),
-    REAL_CONST(73809.475467/8.0),
-    REAL_CONST(73831.453202/8.0),
-    REAL_CONST(73853.432573/8.0),
-    REAL_CONST(73875.413579/8.0),
-    REAL_CONST(73897.396220/8.0),
-    REAL_CONST(73919.380496/8.0),
-    REAL_CONST(73941.366406/8.0),
-    REAL_CONST(73963.353952/8.0),
-    REAL_CONST(73985.343131/8.0),
-    REAL_CONST(74007.333945/8.0),
-    REAL_CONST(74029.326392/8.0),
-    REAL_CONST(74051.320472/8.0),
-    REAL_CONST(74073.316186/8.0),
-    REAL_CONST(74095.313533/8.0),
-    REAL_CONST(74117.312513/8.0),
-    REAL_CONST(74139.313125/8.0),
-    REAL_CONST(74161.315369/8.0),
-    REAL_CONST(74183.319246/8.0),
-    REAL_CONST(74205.324754/8.0),
-    REAL_CONST(74227.331894/8.0),
-    REAL_CONST(74249.340665/8.0),
-    REAL_CONST(74271.351067/8.0),
-    REAL_CONST(74293.363100/8.0),
-    REAL_CONST(74315.376764/8.0),
-    REAL_CONST(74337.392058/8.0),
-    REAL_CONST(74359.408982/8.0),
-    REAL_CONST(74381.427536/8.0),
-    REAL_CONST(74403.447719/8.0),
-    REAL_CONST(74425.469532/8.0),
-    REAL_CONST(74447.492974/8.0),
-    REAL_CONST(74469.518045/8.0),
-    REAL_CONST(74491.544744/8.0),
-    REAL_CONST(74513.573072/8.0),
-    REAL_CONST(74535.603028/8.0),
-    REAL_CONST(74557.634612/8.0),
-    REAL_CONST(74579.667824/8.0),
-    REAL_CONST(74601.702663/8.0),
-    REAL_CONST(74623.739130/8.0),
-    REAL_CONST(74645.777223/8.0),
-    REAL_CONST(74667.816943/8.0),
-    REAL_CONST(74689.858290/8.0),
-    REAL_CONST(74711.901263/8.0),
-    REAL_CONST(74733.945861/8.0),
-    REAL_CONST(74755.992086/8.0),
-    REAL_CONST(74778.039936/8.0),
-    REAL_CONST(74800.089412/8.0),
-    REAL_CONST(74822.140512/8.0),
-    REAL_CONST(74844.193237/8.0),
-    REAL_CONST(74866.247587/8.0),
-    REAL_CONST(74888.303561/8.0),
-    REAL_CONST(74910.361160/8.0),
-    REAL_CONST(74932.420382/8.0),
-    REAL_CONST(74954.481227/8.0),
-    REAL_CONST(74976.543697/8.0),
-    REAL_CONST(74998.607789/8.0),
-    REAL_CONST(75020.673504/8.0),
-    REAL_CONST(75042.740842/8.0),
-    REAL_CONST(75064.809802/8.0),
-    REAL_CONST(75086.880384/8.0),
-    REAL_CONST(75108.952589/8.0),
-    REAL_CONST(75131.026415/8.0),
-    REAL_CONST(75153.101862/8.0),
-    REAL_CONST(75175.178931/8.0),
-    REAL_CONST(75197.257621/8.0),
-    REAL_CONST(75219.337931/8.0),
-    REAL_CONST(75241.419862/8.0),
-    REAL_CONST(75263.503414/8.0),
-    REAL_CONST(75285.588585/8.0),
-    REAL_CONST(75307.675376/8.0),
-    REAL_CONST(75329.763787/8.0),
-    REAL_CONST(75351.853817/8.0),
-    REAL_CONST(75373.945466/8.0),
-    REAL_CONST(75396.038734/8.0),
-    REAL_CONST(75418.133620/8.0),
-    REAL_CONST(75440.230125/8.0),
-    REAL_CONST(75462.328248/8.0),
-    REAL_CONST(75484.427989/8.0),
-    REAL_CONST(75506.529348/8.0),
-    REAL_CONST(75528.632324/8.0),
-    REAL_CONST(75550.736917/8.0),
-    REAL_CONST(75572.843127/8.0),
-    REAL_CONST(75594.950954/8.0),
-    REAL_CONST(75617.060398/8.0),
-    REAL_CONST(75639.171457/8.0),
-    REAL_CONST(75661.284133/8.0),
-    REAL_CONST(75683.398424/8.0),
-    REAL_CONST(75705.514331/8.0),
-    REAL_CONST(75727.631854/8.0),
-    REAL_CONST(75749.750991/8.0),
-    REAL_CONST(75771.871743/8.0),
-    REAL_CONST(75793.994110/8.0),
-    REAL_CONST(75816.118091/8.0),
-    REAL_CONST(75838.243686/8.0),
-    REAL_CONST(75860.370896/8.0),
-    REAL_CONST(75882.499718/8.0),
-    REAL_CONST(75904.630155/8.0),
-    REAL_CONST(75926.762204/8.0),
-    REAL_CONST(75948.895866/8.0),
-    REAL_CONST(75971.031141/8.0),
-    REAL_CONST(75993.168029/8.0),
-    REAL_CONST(76015.306529/8.0),
-    REAL_CONST(76037.446640/8.0),
-    REAL_CONST(76059.588364/8.0),
-    REAL_CONST(76081.731699/8.0),
-    REAL_CONST(76103.876646/8.0),
-    REAL_CONST(76126.023203/8.0),
-    REAL_CONST(76148.171371/8.0),
-    REAL_CONST(76170.321150/8.0),
-    REAL_CONST(76192.472539/8.0),
-    REAL_CONST(76214.625539/8.0),
-    REAL_CONST(76236.780148/8.0),
-    REAL_CONST(76258.936367/8.0),
-    REAL_CONST(76281.094196/8.0),
-    REAL_CONST(76303.253633/8.0),
-    REAL_CONST(76325.414680/8.0),
-    REAL_CONST(76347.577335/8.0),
-    REAL_CONST(76369.741599/8.0),
-    REAL_CONST(76391.907471/8.0),
-    REAL_CONST(76414.074951/8.0),
-    REAL_CONST(76436.244039/8.0),
-    REAL_CONST(76458.414734/8.0),
-    REAL_CONST(76480.587037/8.0),
-    REAL_CONST(76502.760947/8.0),
-    REAL_CONST(76524.936463/8.0),
-    REAL_CONST(76547.113587/8.0),
-    REAL_CONST(76569.292316/8.0),
-    REAL_CONST(76591.472652/8.0),
-    REAL_CONST(76613.654594/8.0),
-    REAL_CONST(76635.838142/8.0),
-    REAL_CONST(76658.023295/8.0),
-    REAL_CONST(76680.210053/8.0),
-    REAL_CONST(76702.398416/8.0),
-    REAL_CONST(76724.588384/8.0),
-    REAL_CONST(76746.779957/8.0),
-    REAL_CONST(76768.973134/8.0),
-    REAL_CONST(76791.167915/8.0),
-    REAL_CONST(76813.364299/8.0),
-    REAL_CONST(76835.562288/8.0),
-    REAL_CONST(76857.761880/8.0),
-    REAL_CONST(76879.963074/8.0),
-    REAL_CONST(76902.165872/8.0),
-    REAL_CONST(76924.370273/8.0),
-    REAL_CONST(76946.576276/8.0),
-    REAL_CONST(76968.783881/8.0),
-    REAL_CONST(76990.993088/8.0),
-    REAL_CONST(77013.203897/8.0),
-    REAL_CONST(77035.416308/8.0),
-    REAL_CONST(77057.630319/8.0),
-    REAL_CONST(77079.845932/8.0),
-    REAL_CONST(77102.063146/8.0),
-    REAL_CONST(77124.281960/8.0),
-    REAL_CONST(77146.502375/8.0),
-    REAL_CONST(77168.724390/8.0),
-    REAL_CONST(77190.948004/8.0),
-    REAL_CONST(77213.173219/8.0),
-    REAL_CONST(77235.400033/8.0),
-    REAL_CONST(77257.628446/8.0),
-    REAL_CONST(77279.858458/8.0),
-    REAL_CONST(77302.090069/8.0),
-    REAL_CONST(77324.323278/8.0),
-    REAL_CONST(77346.558086/8.0),
-    REAL_CONST(77368.794491/8.0),
-    REAL_CONST(77391.032495/8.0),
-    REAL_CONST(77413.272096/8.0),
-    REAL_CONST(77435.513295/8.0),
-    REAL_CONST(77457.756090/8.0),
-    REAL_CONST(77480.000483/8.0),
-    REAL_CONST(77502.246473/8.0),
-    REAL_CONST(77524.494058/8.0),
-    REAL_CONST(77546.743240/8.0),
-    REAL_CONST(77568.994019/8.0),
-    REAL_CONST(77591.246392/8.0),
-    REAL_CONST(77613.500362/8.0),
-    REAL_CONST(77635.755927/8.0),
-    REAL_CONST(77658.013086/8.0),
-    REAL_CONST(77680.271841/8.0),
-    REAL_CONST(77702.532191/8.0),
-    REAL_CONST(77724.794134/8.0),
-    REAL_CONST(77747.057672/8.0),
-    REAL_CONST(77769.322804/8.0),
-    REAL_CONST(77791.589530/8.0),
-    REAL_CONST(77813.857849/8.0),
-    REAL_CONST(77836.127761/8.0),
-    REAL_CONST(77858.399267/8.0),
-    REAL_CONST(77880.672365/8.0),
-    REAL_CONST(77902.947056/8.0),
-    REAL_CONST(77925.223339/8.0),
-    REAL_CONST(77947.501214/8.0),
-    REAL_CONST(77969.780681/8.0),
-    REAL_CONST(77992.061740/8.0),
-    REAL_CONST(78014.344391/8.0),
-    REAL_CONST(78036.628632/8.0),
-    REAL_CONST(78058.914465/8.0),
-    REAL_CONST(78081.201888/8.0),
-    REAL_CONST(78103.490902/8.0),
-    REAL_CONST(78125.781506/8.0),
-    REAL_CONST(78148.073700/8.0),
-    REAL_CONST(78170.367484/8.0),
-    REAL_CONST(78192.662858/8.0),
-    REAL_CONST(78214.959821/8.0),
-    REAL_CONST(78237.258374/8.0),
-    REAL_CONST(78259.558515/8.0),
-    REAL_CONST(78281.860245/8.0),
-    REAL_CONST(78304.163563/8.0),
-    REAL_CONST(78326.468470/8.0),
-    REAL_CONST(78348.774965/8.0),
-    REAL_CONST(78371.083048/8.0),
-    REAL_CONST(78393.392718/8.0),
-    REAL_CONST(78415.703976/8.0),
-    REAL_CONST(78438.016820/8.0),
-    REAL_CONST(78460.331252/8.0),
-    REAL_CONST(78482.647270/8.0),
-    REAL_CONST(78504.964875/8.0),
-    REAL_CONST(78527.284066/8.0),
-    REAL_CONST(78549.604843/8.0),
-    REAL_CONST(78571.927206/8.0),
-    REAL_CONST(78594.251155/8.0),
-    REAL_CONST(78616.576688/8.0),
-    REAL_CONST(78638.903807/8.0),
-    REAL_CONST(78661.232511/8.0),
-    REAL_CONST(78683.562799/8.0),
-    REAL_CONST(78705.894672/8.0),
-    REAL_CONST(78728.228129/8.0),
-    REAL_CONST(78750.563170/8.0),
-    REAL_CONST(78772.899795/8.0),
-    REAL_CONST(78795.238004/8.0),
-    REAL_CONST(78817.577795/8.0),
-    REAL_CONST(78839.919170/8.0),
-    REAL_CONST(78862.262128/8.0),
-    REAL_CONST(78884.606668/8.0),
-    REAL_CONST(78906.952791/8.0),
-    REAL_CONST(78929.300496/8.0),
-    REAL_CONST(78951.649783/8.0),
-    REAL_CONST(78974.000651/8.0),
-    REAL_CONST(78996.353101/8.0),
-    REAL_CONST(79018.707133/8.0),
-    REAL_CONST(79041.062745/8.0),
-    REAL_CONST(79063.419939/8.0),
-    REAL_CONST(79085.778713/8.0),
-    REAL_CONST(79108.139067/8.0),
-    REAL_CONST(79130.501002/8.0),
-    REAL_CONST(79152.864516/8.0),
-    REAL_CONST(79175.229610/8.0),
-    REAL_CONST(79197.596284/8.0),
-    REAL_CONST(79219.964537/8.0),
-    REAL_CONST(79242.334369/8.0),
-    REAL_CONST(79264.705780/8.0),
-    REAL_CONST(79287.078770/8.0),
-    REAL_CONST(79309.453338/8.0),
-    REAL_CONST(79331.829484/8.0),
-    REAL_CONST(79354.207208/8.0),
-    REAL_CONST(79376.586510/8.0),
-    REAL_CONST(79398.967390/8.0),
-    REAL_CONST(79421.349846/8.0),
-    REAL_CONST(79443.733880/8.0),
-    REAL_CONST(79466.119490/8.0),
-    REAL_CONST(79488.506678/8.0),
-    REAL_CONST(79510.895441/8.0),
-    REAL_CONST(79533.285781/8.0),
-    REAL_CONST(79555.677697/8.0),
-    REAL_CONST(79578.071188/8.0),
-    REAL_CONST(79600.466255/8.0),
-    REAL_CONST(79622.862897/8.0),
-    REAL_CONST(79645.261114/8.0),
-    REAL_CONST(79667.660907/8.0),
-    REAL_CONST(79690.062273/8.0),
-    REAL_CONST(79712.465215/8.0),
-    REAL_CONST(79734.869730/8.0),
-    REAL_CONST(79757.275819/8.0),
-    REAL_CONST(79779.683482/8.0),
-    REAL_CONST(79802.092719/8.0),
-    REAL_CONST(79824.503529/8.0),
-    REAL_CONST(79846.915911/8.0),
-    REAL_CONST(79869.329867/8.0),
-    REAL_CONST(79891.745396/8.0),
-    REAL_CONST(79914.162496/8.0),
-    REAL_CONST(79936.581169/8.0),
-    REAL_CONST(79959.001414/8.0),
-    REAL_CONST(79981.423231/8.0),
-    REAL_CONST(80003.846619/8.0),
-    REAL_CONST(80026.271579/8.0),
-    REAL_CONST(80048.698110/8.0),
-    REAL_CONST(80071.126211/8.0),
-    REAL_CONST(80093.555883/8.0),
-    REAL_CONST(80115.987126/8.0),
-    REAL_CONST(80138.419939/8.0),
-    REAL_CONST(80160.854322/8.0),
-    REAL_CONST(80183.290274/8.0),
-    REAL_CONST(80205.727796/8.0),
-    REAL_CONST(80228.166888/8.0),
-    REAL_CONST(80250.607548/8.0),
-    REAL_CONST(80273.049778/8.0),
-    REAL_CONST(80295.493576/8.0),
-    REAL_CONST(80317.938943/8.0),
-    REAL_CONST(80340.385877/8.0),
-    REAL_CONST(80362.834380/8.0),
-    REAL_CONST(80385.284451/8.0),
-    REAL_CONST(80407.736089/8.0),
-    REAL_CONST(80430.189295/8.0),
-    REAL_CONST(80452.644068/8.0),
-    REAL_CONST(80475.100407/8.0),
-    REAL_CONST(80497.558314/8.0),
-    REAL_CONST(80520.017786/8.0),
-    REAL_CONST(80542.478825/8.0),
-    REAL_CONST(80564.941431/8.0),
-    REAL_CONST(80587.405602/8.0),
-    REAL_CONST(80609.871338/8.0),
-    REAL_CONST(80632.338640/8.0),
-    REAL_CONST(80654.807507/8.0),
-    REAL_CONST(80677.277939/8.0),
-    REAL_CONST(80699.749936/8.0),
-    REAL_CONST(80722.223498/8.0),
-    REAL_CONST(80744.698623/8.0),
-    REAL_CONST(80767.175313/8.0),
-    REAL_CONST(80789.653567/8.0),
-    REAL_CONST(80812.133384/8.0),
-    REAL_CONST(80834.614765/8.0),
-    REAL_CONST(80857.097709/8.0),
-    REAL_CONST(80879.582216/8.0),
-    REAL_CONST(80902.068285/8.0),
-    REAL_CONST(80924.555918/8.0),
-    REAL_CONST(80947.045112/8.0),
-    REAL_CONST(80969.535869/8.0),
-    REAL_CONST(80992.028188/8.0),
-    REAL_CONST(81014.522068/8.0),
-    REAL_CONST(81037.017510/8.0),
-    REAL_CONST(81059.514513/8.0),
-    REAL_CONST(81082.013077/8.0),
-    REAL_CONST(81104.513202/8.0),
-    REAL_CONST(81127.014888/8.0),
-    REAL_CONST(81149.518134/8.0),
-    REAL_CONST(81172.022940/8.0),
-    REAL_CONST(81194.529306/8.0),
-    REAL_CONST(81217.037232/8.0),
-    REAL_CONST(81239.546717/8.0),
-    REAL_CONST(81262.057762/8.0),
-    REAL_CONST(81284.570366/8.0),
-    REAL_CONST(81307.084528/8.0),
-    REAL_CONST(81329.600250/8.0),
-    REAL_CONST(81352.117530/8.0),
-    REAL_CONST(81374.636368/8.0),
-    REAL_CONST(81397.156764/8.0),
-    REAL_CONST(81419.678718/8.0),
-    REAL_CONST(81442.202229/8.0),
-    REAL_CONST(81464.727298/8.0),
-    REAL_CONST(81487.253924/8.0),
-    REAL_CONST(81509.782107/8.0),
-    REAL_CONST(81532.311846/8.0),
-    REAL_CONST(81554.843143/8.0),
-    REAL_CONST(81577.375995/8.0),
-    REAL_CONST(81599.910404/8.0),
-    REAL_CONST(81622.446368/8.0),
-    REAL_CONST(81644.983888/8.0),
-    REAL_CONST(81667.522964/8.0),
-    REAL_CONST(81690.063594/8.0),
-    REAL_CONST(81712.605780/8.0),
-    REAL_CONST(81735.149521/8.0),
-    REAL_CONST(81757.694816/8.0),
-    REAL_CONST(81780.241665/8.0),
-    REAL_CONST(81802.790069/8.0),
-    REAL_CONST(81825.340026/8.0),
-    REAL_CONST(81847.891538/8.0),
-    REAL_CONST(81870.444603/8.0),
-    REAL_CONST(81892.999221/8.0),
-    REAL_CONST(81915.555392/8.0),
-    REAL_CONST(81938.113116/8.0),
-    REAL_CONST(81960.672393/8.0),
-    REAL_CONST(81983.233222/8.0),
-    REAL_CONST(82005.795603/8.0),
-    REAL_CONST(82028.359536/8.0),
-    REAL_CONST(82050.925022/8.0),
-    REAL_CONST(82073.492058/8.0),
-    REAL_CONST(82096.060647/8.0),
-    REAL_CONST(82118.630786/8.0),
-    REAL_CONST(82141.202476/8.0),
-    REAL_CONST(82163.775717/8.0),
-    REAL_CONST(82186.350509/8.0),
-    REAL_CONST(82208.926850/8.0),
-    REAL_CONST(82231.504742/8.0),
-    REAL_CONST(82254.084184/8.0),
-    REAL_CONST(82276.665175/8.0),
-    REAL_CONST(82299.247716/8.0),
-    REAL_CONST(82321.831807/8.0),
-    REAL_CONST(82344.417446/8.0),
-    REAL_CONST(82367.004634/8.0),
-    REAL_CONST(82389.593370/8.0),
-    REAL_CONST(82412.183655/8.0),
-    REAL_CONST(82434.775488/8.0),
-    REAL_CONST(82457.368870/8.0),
-    REAL_CONST(82479.963798/8.0),
-    REAL_CONST(82502.560275/8.0),
-    REAL_CONST(82525.158299/8.0),
-    REAL_CONST(82547.757870/8.0),
-    REAL_CONST(82570.358987/8.0),
-    REAL_CONST(82592.961652/8.0),
-    REAL_CONST(82615.565863/8.0),
-    REAL_CONST(82638.171620/8.0),
-    REAL_CONST(82660.778923/8.0),
-    REAL_CONST(82683.387773/8.0),
-    REAL_CONST(82705.998167/8.0),
-    REAL_CONST(82728.610108/8.0),
-    REAL_CONST(82751.223593/8.0),
-    REAL_CONST(82773.838624/8.0),
-    REAL_CONST(82796.455199/8.0),
-    REAL_CONST(82819.073319/8.0),
-    REAL_CONST(82841.692983/8.0),
-    REAL_CONST(82864.314191/8.0),
-    REAL_CONST(82886.936944/8.0),
-    REAL_CONST(82909.561240/8.0),
-    REAL_CONST(82932.187079/8.0),
-    REAL_CONST(82954.814462/8.0),
-    REAL_CONST(82977.443388/8.0),
-    REAL_CONST(83000.073857/8.0),
-    REAL_CONST(83022.705869/8.0),
-    REAL_CONST(83045.339423/8.0),
-    REAL_CONST(83067.974519/8.0),
-    REAL_CONST(83090.611158/8.0),
-    REAL_CONST(83113.249338/8.0),
-    REAL_CONST(83135.889060/8.0),
-    REAL_CONST(83158.530323/8.0),
-    REAL_CONST(83181.173128/8.0),
-    REAL_CONST(83203.817473/8.0),
-    REAL_CONST(83226.463360/8.0),
-    REAL_CONST(83249.110787/8.0),
-    REAL_CONST(83271.759754/8.0),
-    REAL_CONST(83294.410262/8.0),
-    REAL_CONST(83317.062309/8.0),
-    REAL_CONST(83339.715896/8.0),
-    REAL_CONST(83362.371023/8.0),
-    REAL_CONST(83385.027689/8.0),
-    REAL_CONST(83407.685894/8.0),
-    REAL_CONST(83430.345639/8.0),
-    REAL_CONST(83453.006921/8.0),
-    REAL_CONST(83475.669743/8.0),
-    REAL_CONST(83498.334102/8.0),
-    REAL_CONST(83521.000000/8.0),
-    REAL_CONST(83543.667436/8.0),
-    REAL_CONST(83566.336409/8.0),
-    REAL_CONST(83589.006919/8.0),
-    REAL_CONST(83611.678967/8.0),
-    REAL_CONST(83634.352552/8.0),
-    REAL_CONST(83657.027674/8.0),
-    REAL_CONST(83679.704333/8.0),
-    REAL_CONST(83702.382527/8.0),
-    REAL_CONST(83725.062258/8.0),
-    REAL_CONST(83747.743525/8.0),
-    REAL_CONST(83770.426328/8.0),
-    REAL_CONST(83793.110667/8.0),
-    REAL_CONST(83815.796540/8.0),
-    REAL_CONST(83838.483949/8.0),
-    REAL_CONST(83861.172893/8.0),
-    REAL_CONST(83883.863372/8.0),
-    REAL_CONST(83906.555385/8.0),
-    REAL_CONST(83929.248932/8.0),
-    REAL_CONST(83951.944014/8.0),
-    REAL_CONST(83974.640630/8.0),
-    REAL_CONST(83997.338779/8.0),
-    REAL_CONST(84020.038462/8.0),
-    REAL_CONST(84042.739678/8.0),
-    REAL_CONST(84065.442427/8.0),
-    REAL_CONST(84088.146709/8.0),
-    REAL_CONST(84110.852523/8.0),
-    REAL_CONST(84133.559871/8.0),
-    REAL_CONST(84156.268750/8.0),
-    REAL_CONST(84178.979162/8.0),
-    REAL_CONST(84201.691105/8.0),
-    REAL_CONST(84224.404580/8.0),
-    REAL_CONST(84247.119586/8.0),
-    REAL_CONST(84269.836124/8.0),
-    REAL_CONST(84292.554192/8.0),
-    REAL_CONST(84315.273792/8.0),
-    REAL_CONST(84337.994922/8.0),
-    REAL_CONST(84360.717583/8.0),
-    REAL_CONST(84383.441773/8.0),
-    REAL_CONST(84406.167494/8.0),
-    REAL_CONST(84428.894744/8.0),
-    REAL_CONST(84451.623524/8.0),
-    REAL_CONST(84474.353834/8.0),
-    REAL_CONST(84497.085672/8.0),
-    REAL_CONST(84519.819040/8.0),
-    REAL_CONST(84542.553936/8.0),
-    REAL_CONST(84565.290361/8.0),
-    REAL_CONST(84588.028314/8.0),
-    REAL_CONST(84610.767795/8.0),
-    REAL_CONST(84633.508805/8.0),
-    REAL_CONST(84656.251342/8.0),
-    REAL_CONST(84678.995406/8.0),
-    REAL_CONST(84701.740998/8.0),
-    REAL_CONST(84724.488117/8.0),
-    REAL_CONST(84747.236763/8.0),
-    REAL_CONST(84769.986935/8.0),
-    REAL_CONST(84792.738634/8.0),
-    REAL_CONST(84815.491860/8.0),
-    REAL_CONST(84838.246611/8.0),
-    REAL_CONST(84861.002889/8.0),
-    REAL_CONST(84883.760692/8.0),
-    REAL_CONST(84906.520020/8.0),
-    REAL_CONST(84929.280874/8.0),
-    REAL_CONST(84952.043253/8.0),
-    REAL_CONST(84974.807156/8.0),
-    REAL_CONST(84997.572585/8.0),
-    REAL_CONST(85020.339537/8.0),
-    REAL_CONST(85043.108014/8.0),
-    REAL_CONST(85065.878016/8.0),
-    REAL_CONST(85088.649540/8.0),
-    REAL_CONST(85111.422589/8.0),
-    REAL_CONST(85134.197161/8.0),
-    REAL_CONST(85156.973256/8.0),
-    REAL_CONST(85179.750874/8.0),
-    REAL_CONST(85202.530016/8.0),
-    REAL_CONST(85225.310679/8.0),
-    REAL_CONST(85248.092865/8.0),
-    REAL_CONST(85270.876574/8.0),
-    REAL_CONST(85293.661804/8.0),
-    REAL_CONST(85316.448556/8.0),
-    REAL_CONST(85339.236830/8.0),
-    REAL_CONST(85362.026625/8.0),
-    REAL_CONST(85384.817941/8.0),
-    REAL_CONST(85407.610779/8.0),
-    REAL_CONST(85430.405137/8.0),
-    REAL_CONST(85453.201015/8.0),
-    REAL_CONST(85475.998415/8.0),
-    REAL_CONST(85498.797334/8.0),
-    REAL_CONST(85521.597773/8.0),
-    REAL_CONST(85544.399732/8.0),
-    REAL_CONST(85567.203211/8.0),
-    REAL_CONST(85590.008209/8.0),
-    REAL_CONST(85612.814726/8.0),
-    REAL_CONST(85635.622762/8.0),
-    REAL_CONST(85658.432317/8.0),
-    REAL_CONST(85681.243390/8.0),
-    REAL_CONST(85704.055982/8.0),
-    REAL_CONST(85726.870092/8.0),
-    REAL_CONST(85749.685720/8.0),
-    REAL_CONST(85772.502865/8.0),
-    REAL_CONST(85795.321529/8.0),
-    REAL_CONST(85818.141709/8.0),
-    REAL_CONST(85840.963407/8.0),
-    REAL_CONST(85863.786622/8.0),
-    REAL_CONST(85886.611353/8.0),
-    REAL_CONST(85909.437601/8.0),
-    REAL_CONST(85932.265365/8.0),
-    REAL_CONST(85955.094646/8.0),
-    REAL_CONST(85977.925442/8.0),
-    REAL_CONST(86000.757754/8.0),
-    REAL_CONST(86023.591582/8.0),
-    REAL_CONST(86046.426925/8.0),
-    REAL_CONST(86069.263783/8.0),
-    REAL_CONST(86092.102156/8.0),
-    REAL_CONST(86114.942043/8.0),
-    REAL_CONST(86137.783446/8.0),
-    REAL_CONST(86160.626362/8.0),
-    REAL_CONST(86183.470793/8.0),
-    REAL_CONST(86206.316738/8.0),
-    REAL_CONST(86229.164196/8.0),
-    REAL_CONST(86252.013168/8.0),
-    REAL_CONST(86274.863653/8.0),
-    REAL_CONST(86297.715652/8.0),
-    REAL_CONST(86320.569163/8.0),
-    REAL_CONST(86343.424187/8.0),
-    REAL_CONST(86366.280724/8.0),
-    REAL_CONST(86389.138773/8.0),
-    REAL_CONST(86411.998334/8.0),
-    REAL_CONST(86434.859407/8.0),
-    REAL_CONST(86457.721991/8.0),
-    REAL_CONST(86480.586088/8.0),
-    REAL_CONST(86503.451695/8.0),
-    REAL_CONST(86526.318814/8.0),
-    REAL_CONST(86549.187443/8.0),
-    REAL_CONST(86572.057584/8.0),
-    REAL_CONST(86594.929234/8.0),
-    REAL_CONST(86617.802396/8.0),
-    REAL_CONST(86640.677067/8.0),
-    REAL_CONST(86663.553248/8.0),
-    REAL_CONST(86686.430939/8.0),
-    REAL_CONST(86709.310140/8.0),
-    REAL_CONST(86732.190849/8.0),
-    REAL_CONST(86755.073068/8.0),
-    REAL_CONST(86777.956796/8.0),
-    REAL_CONST(86800.842033/8.0),
-    REAL_CONST(86823.728778/8.0),
-    REAL_CONST(86846.617031/8.0),
-    REAL_CONST(86869.506793/8.0),
-    REAL_CONST(86892.398063/8.0),
-    REAL_CONST(86915.290840/8.0),
-    REAL_CONST(86938.185125/8.0),
-    REAL_CONST(86961.080917/8.0),
-    REAL_CONST(86983.978216/8.0),
-    REAL_CONST(87006.877023/8.0),
-    REAL_CONST(87029.777336/8.0),
-    REAL_CONST(87052.679155/8.0),
-    REAL_CONST(87075.582481/8.0),
-    REAL_CONST(87098.487313/8.0),
-    REAL_CONST(87121.393651/8.0),
-    REAL_CONST(87144.301495/8.0),
-    REAL_CONST(87167.210844/8.0),
-    REAL_CONST(87190.121699/8.0),
-    REAL_CONST(87213.034059/8.0),
-    REAL_CONST(87235.947924/8.0),
-    REAL_CONST(87258.863293/8.0),
-    REAL_CONST(87281.780168/8.0),
-    REAL_CONST(87304.698546/8.0),
-    REAL_CONST(87327.618429/8.0),
-    REAL_CONST(87350.539816/8.0),
-    REAL_CONST(87373.462706/8.0),
-    REAL_CONST(87396.387100/8.0),
-    REAL_CONST(87419.312998/8.0),
-    REAL_CONST(87442.240398/8.0),
-    REAL_CONST(87465.169302/8.0),
-    REAL_CONST(87488.099708/8.0),
-    REAL_CONST(87511.031617/8.0),
-    REAL_CONST(87533.965029/8.0),
-    REAL_CONST(87556.899943/8.0),
-    REAL_CONST(87579.836358/8.0),
-    REAL_CONST(87602.774276/8.0),
-    REAL_CONST(87625.713695/8.0),
-    REAL_CONST(87648.654615/8.0),
-    REAL_CONST(87671.597037/8.0),
-    REAL_CONST(87694.540960/8.0),
-    REAL_CONST(87717.486383/8.0),
-    REAL_CONST(87740.433308/8.0),
-    REAL_CONST(87763.381732/8.0),
-    REAL_CONST(87786.331657/8.0),
-    REAL_CONST(87809.283082/8.0),
-    REAL_CONST(87832.236007/8.0),
-    REAL_CONST(87855.190431/8.0),
-    REAL_CONST(87878.146355/8.0),
-    REAL_CONST(87901.103778/8.0),
-    REAL_CONST(87924.062700/8.0),
-    REAL_CONST(87947.023122/8.0),
-    REAL_CONST(87969.985041/8.0),
-    REAL_CONST(87992.948460/8.0),
-    REAL_CONST(88015.913376/8.0),
-    REAL_CONST(88038.879791/8.0),
-    REAL_CONST(88061.847703/8.0),
-    REAL_CONST(88084.817113/8.0),
-    REAL_CONST(88107.788021/8.0),
-    REAL_CONST(88130.760426/8.0),
-    REAL_CONST(88153.734328/8.0),
-    REAL_CONST(88176.709727/8.0),
-    REAL_CONST(88199.686623/8.0),
-    REAL_CONST(88222.665015/8.0),
-    REAL_CONST(88245.644904/8.0),
-    REAL_CONST(88268.626288/8.0),
-    REAL_CONST(88291.609169/8.0),
-    REAL_CONST(88314.593546/8.0),
-    REAL_CONST(88337.579417/8.0),
-    REAL_CONST(88360.566785/8.0),
-    REAL_CONST(88383.555647/8.0),
-    REAL_CONST(88406.546005/8.0),
-    REAL_CONST(88429.537857/8.0),
-    REAL_CONST(88452.531204/8.0),
-    REAL_CONST(88475.526045/8.0),
-    REAL_CONST(88498.522380/8.0),
-    REAL_CONST(88521.520210/8.0),
-    REAL_CONST(88544.519533/8.0),
-    REAL_CONST(88567.520350/8.0),
-    REAL_CONST(88590.522660/8.0),
-    REAL_CONST(88613.526463/8.0),
-    REAL_CONST(88636.531760/8.0),
-    REAL_CONST(88659.538549/8.0),
-    REAL_CONST(88682.546831/8.0),
-    REAL_CONST(88705.556605/8.0),
-    REAL_CONST(88728.567872/8.0),
-    REAL_CONST(88751.580631/8.0),
-    REAL_CONST(88774.594881/8.0),
-    REAL_CONST(88797.610623/8.0),
-    REAL_CONST(88820.627857/8.0),
-    REAL_CONST(88843.646582/8.0),
-    REAL_CONST(88866.666798/8.0),
-    REAL_CONST(88889.688505/8.0),
-    REAL_CONST(88912.711703/8.0),
-    REAL_CONST(88935.736391/8.0),
-    REAL_CONST(88958.762569/8.0),
-    REAL_CONST(88981.790238/8.0),
-    REAL_CONST(89004.819397/8.0),
-    REAL_CONST(89027.850045/8.0),
-    REAL_CONST(89050.882183/8.0),
-    REAL_CONST(89073.915810/8.0),
-    REAL_CONST(89096.950926/8.0),
-    REAL_CONST(89119.987532/8.0),
-    REAL_CONST(89143.025626/8.0),
-    REAL_CONST(89166.065208/8.0),
-    REAL_CONST(89189.106279/8.0),
-    REAL_CONST(89212.148839/8.0),
-    REAL_CONST(89235.192886/8.0),
-    REAL_CONST(89258.238421/8.0),
-    REAL_CONST(89281.285444/8.0),
-    REAL_CONST(89304.333954/8.0),
-    REAL_CONST(89327.383952/8.0),
-    REAL_CONST(89350.435436/8.0),
-    REAL_CONST(89373.488407/8.0),
-    REAL_CONST(89396.542865/8.0),
-    REAL_CONST(89419.598810/8.0),
-    REAL_CONST(89442.656240/8.0),
-    REAL_CONST(89465.715157/8.0),
-    REAL_CONST(89488.775560/8.0),
-    REAL_CONST(89511.837448/8.0),
-    REAL_CONST(89534.900822/8.0),
-    REAL_CONST(89557.965682/8.0),
-    REAL_CONST(89581.032026/8.0),
-    REAL_CONST(89604.099855/8.0),
-    REAL_CONST(89627.169170/8.0),
-    REAL_CONST(89650.239968/8.0),
-    REAL_CONST(89673.312251/8.0),
-    REAL_CONST(89696.386018/8.0),
-    REAL_CONST(89719.461270/8.0),
-    REAL_CONST(89742.538005/8.0),
-    REAL_CONST(89765.616223/8.0),
-    REAL_CONST(89788.695925/8.0),
-    REAL_CONST(89811.777111/8.0),
-    REAL_CONST(89834.859779/8.0),
-    REAL_CONST(89857.943930/8.0),
-    REAL_CONST(89881.029564/8.0),
-    REAL_CONST(89904.116680/8.0),
-    REAL_CONST(89927.205278/8.0),
-    REAL_CONST(89950.295359/8.0),
-    REAL_CONST(89973.386921/8.0),
-    REAL_CONST(89996.479966/8.0),
-    REAL_CONST(90019.574491/8.0),
-    REAL_CONST(90042.670498/8.0),
-    REAL_CONST(90065.767986/8.0),
-    REAL_CONST(90088.866955/8.0),
-    REAL_CONST(90111.967405/8.0),
-    REAL_CONST(90135.069336/8.0),
-    REAL_CONST(90158.172746/8.0),
-    REAL_CONST(90181.277637/8.0),
-    REAL_CONST(90204.384008/8.0),
-    REAL_CONST(90227.491859/8.0),
-    REAL_CONST(90250.601189/8.0),
-    REAL_CONST(90273.711999/8.0),
-    REAL_CONST(90296.824288/8.0),
-    REAL_CONST(90319.938056/8.0),
-    REAL_CONST(90343.053303/8.0),
-    REAL_CONST(90366.170029/8.0),
-    REAL_CONST(90389.288233/8.0),
-    REAL_CONST(90412.407915/8.0),
-    REAL_CONST(90435.529075/8.0),
-    REAL_CONST(90458.651714/8.0),
-    REAL_CONST(90481.775830/8.0),
-    REAL_CONST(90504.901423/8.0),
-    REAL_CONST(90528.028494/8.0),
-    REAL_CONST(90551.157042/8.0),
-    REAL_CONST(90574.287067/8.0),
-    REAL_CONST(90597.418569/8.0),
-    REAL_CONST(90620.551548/8.0),
-    REAL_CONST(90643.686002/8.0),
-    REAL_CONST(90666.821934/8.0),
-    REAL_CONST(90689.959341/8.0),
-    REAL_CONST(90713.098223/8.0),
-    REAL_CONST(90736.238582/8.0),
-    REAL_CONST(90759.380416/8.0),
-    REAL_CONST(90782.523725/8.0),
-    REAL_CONST(90805.668510/8.0),
-    REAL_CONST(90828.814769/8.0),
-    REAL_CONST(90851.962503/8.0),
-    REAL_CONST(90875.111711/8.0),
-    REAL_CONST(90898.262394/8.0),
-    REAL_CONST(90921.414551/8.0),
-    REAL_CONST(90944.568182/8.0),
-    REAL_CONST(90967.723287/8.0),
-    REAL_CONST(90990.879865/8.0),
-    REAL_CONST(91014.037916/8.0),
-    REAL_CONST(91037.197441/8.0),
-    REAL_CONST(91060.358439/8.0),
-    REAL_CONST(91083.520910/8.0),
-    REAL_CONST(91106.684853/8.0),
-    REAL_CONST(91129.850269/8.0),
-    REAL_CONST(91153.017157/8.0),
-    REAL_CONST(91176.185517/8.0),
-    REAL_CONST(91199.355349/8.0),
-    REAL_CONST(91222.526653/8.0),
-    REAL_CONST(91245.699428/8.0),
-    REAL_CONST(91268.873675/8.0),
-    REAL_CONST(91292.049393/8.0),
-    REAL_CONST(91315.226581/8.0),
-    REAL_CONST(91338.405241/8.0),
-    REAL_CONST(91361.585371/8.0),
-    REAL_CONST(91384.766971/8.0),
-    REAL_CONST(91407.950042/8.0),
-    REAL_CONST(91431.134583/8.0),
-    REAL_CONST(91454.320593/8.0),
-    REAL_CONST(91477.508074/8.0),
-    REAL_CONST(91500.697023/8.0),
-    REAL_CONST(91523.887442/8.0),
-    REAL_CONST(91547.079330/8.0),
-    REAL_CONST(91570.272687/8.0),
-    REAL_CONST(91593.467513/8.0),
-    REAL_CONST(91616.663807/8.0),
-    REAL_CONST(91639.861570/8.0),
-    REAL_CONST(91663.060800/8.0),
-    REAL_CONST(91686.261499/8.0),
-    REAL_CONST(91709.463666/8.0),
-    REAL_CONST(91732.667300/8.0),
-    REAL_CONST(91755.872401/8.0),
-    REAL_CONST(91779.078970/8.0),
-    REAL_CONST(91802.287006/8.0),
-    REAL_CONST(91825.496509/8.0),
-    REAL_CONST(91848.707478/8.0),
-    REAL_CONST(91871.919914/8.0),
-    REAL_CONST(91895.133816/8.0),
-    REAL_CONST(91918.349185/8.0),
-    REAL_CONST(91941.566019/8.0),
-    REAL_CONST(91964.784319/8.0),
-    REAL_CONST(91988.004084/8.0),
-    REAL_CONST(92011.225315/8.0),
-    REAL_CONST(92034.448012/8.0),
-    REAL_CONST(92057.672173/8.0),
-    REAL_CONST(92080.897799/8.0),
-    REAL_CONST(92104.124889/8.0),
-    REAL_CONST(92127.353445/8.0),
-    REAL_CONST(92150.583464/8.0),
-    REAL_CONST(92173.814948/8.0),
-    REAL_CONST(92197.047895/8.0),
-    REAL_CONST(92220.282306/8.0),
-    REAL_CONST(92243.518181/8.0),
-    REAL_CONST(92266.755519/8.0),
-    REAL_CONST(92289.994320/8.0),
-    REAL_CONST(92313.234584/8.0),
-    REAL_CONST(92336.476311/8.0),
-    REAL_CONST(92359.719501/8.0),
-    REAL_CONST(92382.964153/8.0),
-    REAL_CONST(92406.210267/8.0),
-    REAL_CONST(92429.457843/8.0),
-    REAL_CONST(92452.706882/8.0),
-    REAL_CONST(92475.957382/8.0),
-    REAL_CONST(92499.209343/8.0),
-    REAL_CONST(92522.462766/8.0),
-    REAL_CONST(92545.717650/8.0),
-    REAL_CONST(92568.973995/8.0),
-    REAL_CONST(92592.231800/8.0),
-    REAL_CONST(92615.491067/8.0),
-    REAL_CONST(92638.751793/8.0),
-    REAL_CONST(92662.013980/8.0),
-    REAL_CONST(92685.277627/8.0),
-    REAL_CONST(92708.542734/8.0),
-    REAL_CONST(92731.809300/8.0),
-    REAL_CONST(92755.077326/8.0),
-    REAL_CONST(92778.346812/8.0),
-    REAL_CONST(92801.617756/8.0),
-    REAL_CONST(92824.890160/8.0),
-    REAL_CONST(92848.164022/8.0),
-    REAL_CONST(92871.439342/8.0),
-    REAL_CONST(92894.716122/8.0),
-    REAL_CONST(92917.994359/8.0),
-    REAL_CONST(92941.274054/8.0),
-    REAL_CONST(92964.555207/8.0),
-    REAL_CONST(92987.837818/8.0),
-    REAL_CONST(93011.121887/8.0),
-    REAL_CONST(93034.407412/8.0),
-    REAL_CONST(93057.694395/8.0),
-    REAL_CONST(93080.982835/8.0),
-    REAL_CONST(93104.272732/8.0),
-    REAL_CONST(93127.564085/8.0),
-    REAL_CONST(93150.856894/8.0),
-    REAL_CONST(93174.151160/8.0),
-    REAL_CONST(93197.446881/8.0),
-    REAL_CONST(93220.744059/8.0),
-    REAL_CONST(93244.042692/8.0),
-    REAL_CONST(93267.342781/8.0),
-    REAL_CONST(93290.644325/8.0),
-    REAL_CONST(93313.947324/8.0),
-    REAL_CONST(93337.251778/8.0),
-    REAL_CONST(93360.557687/8.0),
-    REAL_CONST(93383.865050/8.0),
-    REAL_CONST(93407.173868/8.0),
-    REAL_CONST(93430.484140/8.0),
-    REAL_CONST(93453.795866/8.0),
-    REAL_CONST(93477.109046/8.0),
-    REAL_CONST(93500.423680/8.0),
-    REAL_CONST(93523.739767/8.0),
-    REAL_CONST(93547.057307/8.0),
-    REAL_CONST(93570.376300/8.0),
-    REAL_CONST(93593.696747/8.0),
-    REAL_CONST(93617.018646/8.0),
-    REAL_CONST(93640.341998/8.0),
-    REAL_CONST(93663.666802/8.0),
-    REAL_CONST(93686.993058/8.0),
-    REAL_CONST(93710.320766/8.0),
-    REAL_CONST(93733.649927/8.0),
-    REAL_CONST(93756.980539/8.0),
-    REAL_CONST(93780.312602/8.0),
-    REAL_CONST(93803.646117/8.0),
-    REAL_CONST(93826.981083/8.0),
-    REAL_CONST(93850.317499/8.0),
-    REAL_CONST(93873.655367/8.0),
-    REAL_CONST(93896.994685/8.0),
-    REAL_CONST(93920.335454/8.0),
-    REAL_CONST(93943.677673/8.0),
-    REAL_CONST(93967.021342/8.0),
-    REAL_CONST(93990.366460/8.0),
-    REAL_CONST(94013.713029/8.0),
-    REAL_CONST(94037.061047/8.0),
-    REAL_CONST(94060.410514/8.0),
-    REAL_CONST(94083.761430/8.0),
-    REAL_CONST(94107.113796/8.0),
-    REAL_CONST(94130.467610/8.0),
-    REAL_CONST(94153.822873/8.0),
-    REAL_CONST(94177.179584/8.0),
-    REAL_CONST(94200.537744/8.0),
-    REAL_CONST(94223.897351/8.0),
-    REAL_CONST(94247.258407/8.0),
-    REAL_CONST(94270.620910/8.0),
-    REAL_CONST(94293.984861/8.0),
-    REAL_CONST(94317.350259/8.0),
-    REAL_CONST(94340.717104/8.0),
-    REAL_CONST(94364.085396/8.0),
-    REAL_CONST(94387.455135/8.0),
-    REAL_CONST(94410.826321/8.0),
-    REAL_CONST(94434.198953/8.0),
-    REAL_CONST(94457.573032/8.0),
-    REAL_CONST(94480.948556/8.0),
-    REAL_CONST(94504.325527/8.0),
-    REAL_CONST(94527.703943/8.0),
-    REAL_CONST(94551.083805/8.0),
-    REAL_CONST(94574.465112/8.0),
-    REAL_CONST(94597.847864/8.0),
-    REAL_CONST(94621.232062/8.0),
-    REAL_CONST(94644.617704/8.0),
-    REAL_CONST(94668.004791/8.0),
-    REAL_CONST(94691.393322/8.0),
-    REAL_CONST(94714.783298/8.0),
-    REAL_CONST(94738.174718/8.0),
-    REAL_CONST(94761.567582/8.0),
-    REAL_CONST(94784.961890/8.0),
-    REAL_CONST(94808.357641/8.0),
-    REAL_CONST(94831.754835/8.0),
-    REAL_CONST(94855.153473/8.0),
-    REAL_CONST(94878.553554/8.0),
-    REAL_CONST(94901.955078/8.0),
-    REAL_CONST(94925.358045/8.0),
-    REAL_CONST(94948.762454/8.0),
-    REAL_CONST(94972.168305/8.0),
-    REAL_CONST(94995.575599/8.0),
-    REAL_CONST(95018.984335/8.0),
-    REAL_CONST(95042.394512/8.0),
-    REAL_CONST(95065.806131/8.0),
-    REAL_CONST(95089.219192/8.0),
-    REAL_CONST(95112.633694/8.0),
-    REAL_CONST(95136.049637/8.0),
-    REAL_CONST(95159.467021/8.0),
-    REAL_CONST(95182.885845/8.0),
-    REAL_CONST(95206.306111/8.0),
-    REAL_CONST(95229.727816/8.0),
-    REAL_CONST(95253.150962/8.0),
-    REAL_CONST(95276.575548/8.0),
-    REAL_CONST(95300.001574/8.0),
-    REAL_CONST(95323.429040/8.0),
-    REAL_CONST(95346.857945/8.0),
-    REAL_CONST(95370.288289/8.0),
-    REAL_CONST(95393.720073/8.0),
-    REAL_CONST(95417.153295/8.0),
-    REAL_CONST(95440.587957/8.0),
-    REAL_CONST(95464.024057/8.0),
-    REAL_CONST(95487.461595/8.0),
-    REAL_CONST(95510.900572/8.0),
-    REAL_CONST(95534.340987/8.0),
-    REAL_CONST(95557.782839/8.0),
-    REAL_CONST(95581.226130/8.0),
-    REAL_CONST(95604.670858/8.0),
-    REAL_CONST(95628.117024/8.0),
-    REAL_CONST(95651.564626/8.0),
-    REAL_CONST(95675.013666/8.0),
-    REAL_CONST(95698.464143/8.0),
-    REAL_CONST(95721.916056/8.0),
-    REAL_CONST(95745.369406/8.0),
-    REAL_CONST(95768.824192/8.0),
-    REAL_CONST(95792.280415/8.0),
-    REAL_CONST(95815.738073/8.0),
-    REAL_CONST(95839.197167/8.0),
-    REAL_CONST(95862.657697/8.0),
-    REAL_CONST(95886.119662/8.0),
-    REAL_CONST(95909.583063/8.0),
-    REAL_CONST(95933.047899/8.0),
-    REAL_CONST(95956.514169/8.0),
-    REAL_CONST(95979.981875/8.0),
-    REAL_CONST(96003.451015/8.0),
-    REAL_CONST(96026.921589/8.0),
-    REAL_CONST(96050.393598/8.0),
-    REAL_CONST(96073.867041/8.0),
-    REAL_CONST(96097.341917/8.0),
-    REAL_CONST(96120.818227/8.0),
-    REAL_CONST(96144.295971/8.0),
-    REAL_CONST(96167.775148/8.0),
-    REAL_CONST(96191.255759/8.0),
-    REAL_CONST(96214.737802/8.0),
-    REAL_CONST(96238.221279/8.0),
-    REAL_CONST(96261.706187/8.0),
-    REAL_CONST(96285.192529/8.0),
-    REAL_CONST(96308.680302/8.0),
-    REAL_CONST(96332.169508/8.0),
-    REAL_CONST(96355.660146/8.0),
-    REAL_CONST(96379.152216/8.0),
-    REAL_CONST(96402.645717/8.0),
-    REAL_CONST(96426.140650/8.0),
-    REAL_CONST(96449.637013/8.0),
-    REAL_CONST(96473.134808/8.0),
-    REAL_CONST(96496.634034/8.0),
-    REAL_CONST(96520.134691/8.0),
-    REAL_CONST(96543.636778/8.0),
-    REAL_CONST(96567.140296/8.0),
-    REAL_CONST(96590.645244/8.0),
-    REAL_CONST(96614.151622/8.0),
-    REAL_CONST(96637.659429/8.0),
-    REAL_CONST(96661.168667/8.0),
-    REAL_CONST(96684.679334/8.0),
-    REAL_CONST(96708.191430/8.0),
-    REAL_CONST(96731.704956/8.0),
-    REAL_CONST(96755.219910/8.0),
-    REAL_CONST(96778.736294/8.0),
-    REAL_CONST(96802.254106/8.0),
-    REAL_CONST(96825.773346/8.0),
-    REAL_CONST(96849.294015/8.0),
-    REAL_CONST(96872.816112/8.0),
-    REAL_CONST(96896.339637/8.0),
-    REAL_CONST(96919.864589/8.0),
-    REAL_CONST(96943.390970/8.0),
-    REAL_CONST(96966.918777/8.0),
-    REAL_CONST(96990.448012/8.0),
-    REAL_CONST(97013.978674/8.0),
-    REAL_CONST(97037.510763/8.0),
-    REAL_CONST(97061.044279/8.0),
-    REAL_CONST(97084.579221/8.0),
-    REAL_CONST(97108.115590/8.0),
-    REAL_CONST(97131.653385/8.0),
-    REAL_CONST(97155.192606/8.0),
-    REAL_CONST(97178.733253/8.0),
-    REAL_CONST(97202.275326/8.0),
-    REAL_CONST(97225.818824/8.0),
-    REAL_CONST(97249.363747/8.0),
-    REAL_CONST(97272.910096/8.0),
-    REAL_CONST(97296.457870/8.0),
-    REAL_CONST(97320.007069/8.0),
-    REAL_CONST(97343.557692/8.0),
-    REAL_CONST(97367.109740/8.0),
-    REAL_CONST(97390.663212/8.0),
-    REAL_CONST(97414.218108/8.0),
-    REAL_CONST(97437.774428/8.0),
-    REAL_CONST(97461.332172/8.0),
-    REAL_CONST(97484.891340/8.0),
-    REAL_CONST(97508.451931/8.0),
-    REAL_CONST(97532.013946/8.0),
-    REAL_CONST(97555.577383/8.0),
-    REAL_CONST(97579.142244/8.0),
-    REAL_CONST(97602.708527/8.0),
-    REAL_CONST(97626.276233/8.0),
-    REAL_CONST(97649.845362/8.0),
-    REAL_CONST(97673.415912/8.0),
-    REAL_CONST(97696.987885/8.0),
-    REAL_CONST(97720.561280/8.0),
-    REAL_CONST(97744.136096/8.0),
-    REAL_CONST(97767.712334/8.0),
-    REAL_CONST(97791.289994/8.0),
-    REAL_CONST(97814.869074/8.0),
-    REAL_CONST(97838.449576/8.0),
-    REAL_CONST(97862.031499/8.0),
-    REAL_CONST(97885.614842/8.0),
-    REAL_CONST(97909.199606/8.0),
-    REAL_CONST(97932.785791/8.0),
-    REAL_CONST(97956.373395/8.0),
-    REAL_CONST(97979.962420/8.0),
-    REAL_CONST(98003.552864/8.0),
-    REAL_CONST(98027.144728/8.0),
-    REAL_CONST(98050.738012/8.0),
-    REAL_CONST(98074.332715/8.0),
-    REAL_CONST(98097.928837/8.0),
-    REAL_CONST(98121.526378/8.0),
-    REAL_CONST(98145.125339/8.0),
-    REAL_CONST(98168.725717/8.0),
-    REAL_CONST(98192.327515/8.0),
-    REAL_CONST(98215.930730/8.0),
-    REAL_CONST(98239.535364/8.0),
-    REAL_CONST(98263.141416/8.0),
-    REAL_CONST(98286.748885/8.0),
-    REAL_CONST(98310.357772/8.0),
-    REAL_CONST(98333.968077/8.0),
-    REAL_CONST(98357.579799/8.0),
-    REAL_CONST(98381.192938/8.0),
-    REAL_CONST(98404.807495/8.0),
-    REAL_CONST(98428.423468/8.0),
-    REAL_CONST(98452.040857/8.0),
-    REAL_CONST(98475.659663/8.0),
-    REAL_CONST(98499.279885/8.0),
-    REAL_CONST(98522.901524/8.0),
-    REAL_CONST(98546.524578/8.0),
-    REAL_CONST(98570.149049/8.0),
-    REAL_CONST(98593.774934/8.0),
-    REAL_CONST(98617.402236/8.0),
-    REAL_CONST(98641.030952/8.0),
-    REAL_CONST(98664.661084/8.0),
-    REAL_CONST(98688.292630/8.0),
-    REAL_CONST(98711.925592/8.0),
-    REAL_CONST(98735.559968/8.0),
-    REAL_CONST(98759.195758/8.0),
-    REAL_CONST(98782.832963/8.0),
-    REAL_CONST(98806.471581/8.0),
-    REAL_CONST(98830.111614/8.0),
-    REAL_CONST(98853.753060/8.0),
-    REAL_CONST(98877.395920/8.0),
-    REAL_CONST(98901.040194/8.0),
-    REAL_CONST(98924.685880/8.0),
-    REAL_CONST(98948.332980/8.0),
-    REAL_CONST(98971.981493/8.0),
-    REAL_CONST(98995.631418/8.0),
-    REAL_CONST(99019.282756/8.0),
-    REAL_CONST(99042.935506/8.0),
-    REAL_CONST(99066.589669/8.0),
-    REAL_CONST(99090.245243/8.0),
-    REAL_CONST(99113.902230/8.0),
-    REAL_CONST(99137.560628/8.0),
-    REAL_CONST(99161.220438/8.0),
-    REAL_CONST(99184.881659/8.0),
-    REAL_CONST(99208.544291/8.0),
-    REAL_CONST(99232.208335/8.0),
-    REAL_CONST(99255.873789/8.0),
-    REAL_CONST(99279.540654/8.0),
-    REAL_CONST(99303.208930/8.0),
-    REAL_CONST(99326.878616/8.0),
-    REAL_CONST(99350.549712/8.0),
-    REAL_CONST(99374.222218/8.0),
-    REAL_CONST(99397.896134/8.0),
-    REAL_CONST(99421.571460/8.0),
-    REAL_CONST(99445.248195/8.0),
-    REAL_CONST(99468.926340/8.0),
-    REAL_CONST(99492.605894/8.0),
-    REAL_CONST(99516.286857/8.0),
-    REAL_CONST(99539.969229/8.0),
-    REAL_CONST(99563.653009/8.0),
-    REAL_CONST(99587.338198/8.0),
-    REAL_CONST(99611.024796/8.0),
-    REAL_CONST(99634.712801/8.0),
-    REAL_CONST(99658.402215/8.0),
-    REAL_CONST(99682.093036/8.0),
-    REAL_CONST(99705.785265/8.0),
-    REAL_CONST(99729.478902/8.0),
-    REAL_CONST(99753.173946/8.0),
-    REAL_CONST(99776.870398/8.0),
-    REAL_CONST(99800.568256/8.0),
-    REAL_CONST(99824.267521/8.0),
-    REAL_CONST(99847.968193/8.0),
-    REAL_CONST(99871.670271/8.0),
-    REAL_CONST(99895.373756/8.0),
-    REAL_CONST(99919.078647/8.0),
-    REAL_CONST(99942.784944/8.0),
-    REAL_CONST(99966.492647/8.0),
-    REAL_CONST(99990.201755/8.0),
-    REAL_CONST(100013.912269/8.0),
-    REAL_CONST(100037.624189/8.0),
-    REAL_CONST(100061.337513/8.0),
-    REAL_CONST(100085.052243/8.0),
-    REAL_CONST(100108.768377/8.0),
-    REAL_CONST(100132.485917/8.0),
-    REAL_CONST(100156.204860/8.0),
-    REAL_CONST(100179.925208/8.0),
-    REAL_CONST(100203.646961/8.0),
-    REAL_CONST(100227.370117/8.0),
-    REAL_CONST(100251.094677/8.0),
-    REAL_CONST(100274.820641/8.0),
-    REAL_CONST(100298.548008/8.0),
-    REAL_CONST(100322.276779/8.0),
-    REAL_CONST(100346.006953/8.0),
-    REAL_CONST(100369.738530/8.0),
-    REAL_CONST(100393.471510/8.0),
-    REAL_CONST(100417.205892/8.0),
-    REAL_CONST(100440.941677/8.0),
-    REAL_CONST(100464.678865/8.0),
-    REAL_CONST(100488.417454/8.0),
-    REAL_CONST(100512.157446/8.0),
-    REAL_CONST(100535.898840/8.0),
-    REAL_CONST(100559.641635/8.0),
-    REAL_CONST(100583.385832/8.0),
-    REAL_CONST(100607.131430/8.0),
-    REAL_CONST(100630.878429/8.0),
-    REAL_CONST(100654.626830/8.0),
-    REAL_CONST(100678.376631/8.0),
-    REAL_CONST(100702.127833/8.0),
-    REAL_CONST(100725.880436/8.0),
-    REAL_CONST(100749.634438/8.0),
-    REAL_CONST(100773.389842/8.0),
-    REAL_CONST(100797.146645/8.0),
-    REAL_CONST(100820.904848/8.0),
-    REAL_CONST(100844.664451/8.0),
-    REAL_CONST(100868.425453/8.0),
-    REAL_CONST(100892.187855/8.0),
-    REAL_CONST(100915.951656/8.0),
-    REAL_CONST(100939.716856/8.0),
-    REAL_CONST(100963.483455/8.0),
-    REAL_CONST(100987.251453/8.0),
-    REAL_CONST(101011.020849/8.0),
-    REAL_CONST(101034.791644/8.0),
-    REAL_CONST(101058.563837/8.0),
-    REAL_CONST(101082.337428/8.0),
-    REAL_CONST(101106.112417/8.0),
-    REAL_CONST(101129.888803/8.0),
-    REAL_CONST(101153.666587/8.0),
-    REAL_CONST(101177.445769/8.0),
-    REAL_CONST(101201.226348/8.0),
-    REAL_CONST(101225.008324/8.0),
-    REAL_CONST(101248.791697/8.0),
-    REAL_CONST(101272.576467/8.0),
-    REAL_CONST(101296.362633/8.0),
-    REAL_CONST(101320.150196/8.0),
-    REAL_CONST(101343.939155/8.0),
-    REAL_CONST(101367.729510/8.0),
-    REAL_CONST(101391.521261/8.0),
-    REAL_CONST(101415.314408/8.0),
-    REAL_CONST(101439.108950/8.0),
-    REAL_CONST(101462.904888/8.0),
-    REAL_CONST(101486.702221/8.0),
-    REAL_CONST(101510.500949/8.0),
-    REAL_CONST(101534.301073/8.0),
-    REAL_CONST(101558.102591/8.0),
-    REAL_CONST(101581.905503/8.0),
-    REAL_CONST(101605.709811/8.0),
-    REAL_CONST(101629.515512/8.0),
-    REAL_CONST(101653.322608/8.0),
-    REAL_CONST(101677.131097/8.0),
-    REAL_CONST(101700.940981/8.0),
-    REAL_CONST(101724.752258/8.0),
-    REAL_CONST(101748.564928/8.0),
-    REAL_CONST(101772.378992/8.0),
-    REAL_CONST(101796.194449/8.0),
-    REAL_CONST(101820.011299/8.0),
-    REAL_CONST(101843.829542/8.0),
-    REAL_CONST(101867.649178/8.0),
-    REAL_CONST(101891.470206/8.0),
-    REAL_CONST(101915.292626/8.0),
-    REAL_CONST(101939.116439/8.0),
-    REAL_CONST(101962.941644/8.0),
-    REAL_CONST(101986.768240/8.0),
-    REAL_CONST(102010.596228/8.0),
-    REAL_CONST(102034.425608/8.0),
-    REAL_CONST(102058.256379/8.0),
-    REAL_CONST(102082.088542/8.0),
-    REAL_CONST(102105.922095/8.0),
-    REAL_CONST(102129.757039/8.0),
-    REAL_CONST(102153.593374/8.0),
-    REAL_CONST(102177.431100/8.0),
-    REAL_CONST(102201.270216/8.0),
-    REAL_CONST(102225.110722/8.0),
-    REAL_CONST(102248.952618/8.0),
-    REAL_CONST(102272.795904/8.0),
-    REAL_CONST(102296.640580/8.0),
-    REAL_CONST(102320.486646/8.0),
-    REAL_CONST(102344.334101/8.0),
-    REAL_CONST(102368.182945/8.0),
-    REAL_CONST(102392.033178/8.0),
-    REAL_CONST(102415.884801/8.0),
-    REAL_CONST(102439.737812/8.0),
-    REAL_CONST(102463.592211/8.0),
-    REAL_CONST(102487.448000/8.0),
-    REAL_CONST(102511.305176/8.0),
-    REAL_CONST(102535.163741/8.0),
-    REAL_CONST(102559.023693/8.0),
-    REAL_CONST(102582.885033/8.0),
-    REAL_CONST(102606.747761/8.0),
-    REAL_CONST(102630.611877/8.0),
-    REAL_CONST(102654.477380/8.0),
-    REAL_CONST(102678.344270/8.0),
-    REAL_CONST(102702.212547/8.0),
-    REAL_CONST(102726.082211/8.0),
-    REAL_CONST(102749.953261/8.0),
-    REAL_CONST(102773.825698/8.0),
-    REAL_CONST(102797.699521/8.0),
-    REAL_CONST(102821.574731/8.0),
-    REAL_CONST(102845.451327/8.0),
-    REAL_CONST(102869.329308/8.0),
-    REAL_CONST(102893.208675/8.0),
-    REAL_CONST(102917.089428/8.0),
-    REAL_CONST(102940.971566/8.0),
-    REAL_CONST(102964.855090/8.0),
-    REAL_CONST(102988.739998/8.0),
-    REAL_CONST(103012.626292/8.0),
-    REAL_CONST(103036.513970/8.0),
-    REAL_CONST(103060.403033/8.0),
-    REAL_CONST(103084.293480/8.0),
-    REAL_CONST(103108.185311/8.0),
-    REAL_CONST(103132.078527/8.0),
-    REAL_CONST(103155.973126/8.0),
-    REAL_CONST(103179.869110/8.0),
-    REAL_CONST(103203.766477/8.0),
-    REAL_CONST(103227.665227/8.0),
-    REAL_CONST(103251.565361/8.0),
-    REAL_CONST(103275.466878/8.0),
-    REAL_CONST(103299.369777/8.0),
-    REAL_CONST(103323.274060/8.0),
-    REAL_CONST(103347.179725/8.0),
-    REAL_CONST(103371.086773/8.0),
-    REAL_CONST(103394.995203/8.0),
-    REAL_CONST(103418.905016/8.0),
-    REAL_CONST(103442.816210/8.0),
-    REAL_CONST(103466.728787/8.0),
-    REAL_CONST(103490.642745/8.0),
-    REAL_CONST(103514.558084/8.0),
-    REAL_CONST(103538.474805/8.0),
-    REAL_CONST(103562.392907/8.0),
-    REAL_CONST(103586.312391/8.0),
-    REAL_CONST(103610.233255/8.0),
-    REAL_CONST(103634.155500/8.0),
-    REAL_CONST(103658.079125/8.0),
-    REAL_CONST(103682.004131/8.0),
-    REAL_CONST(103705.930517/8.0),
-    REAL_CONST(103729.858284/8.0),
-    REAL_CONST(103753.787430/8.0),
-    REAL_CONST(103777.717956/8.0),
-    REAL_CONST(103801.649862/8.0),
-    REAL_CONST(103825.583147/8.0),
-    REAL_CONST(103849.517812/8.0),
-    REAL_CONST(103873.453855/8.0),
-    REAL_CONST(103897.391278/8.0),
-    REAL_CONST(103921.330080/8.0),
-    REAL_CONST(103945.270260/8.0),
-    REAL_CONST(103969.211819/8.0),
-    REAL_CONST(103993.154756/8.0),
-    REAL_CONST(104017.099071/8.0),
-    REAL_CONST(104041.044764/8.0),
-    REAL_CONST(104064.991836/8.0),
-    REAL_CONST(104088.940285/8.0),
-    REAL_CONST(104112.890111/8.0),
-    REAL_CONST(104136.841315/8.0),
-    REAL_CONST(104160.793897/8.0),
-    REAL_CONST(104184.747855/8.0),
-    REAL_CONST(104208.703190/8.0),
-    REAL_CONST(104232.659902/8.0),
-    REAL_CONST(104256.617991/8.0),
-    REAL_CONST(104280.577456/8.0),
-    REAL_CONST(104304.538298/8.0),
-    REAL_CONST(104328.500515/8.0),
-    REAL_CONST(104352.464109/8.0),
-    REAL_CONST(104376.429078/8.0),
-    REAL_CONST(104400.395424/8.0),
-    REAL_CONST(104424.363144/8.0),
-    REAL_CONST(104448.332240/8.0),
-    REAL_CONST(104472.302712/8.0),
-    REAL_CONST(104496.274558/8.0),
-    REAL_CONST(104520.247779/8.0),
-    REAL_CONST(104544.222375/8.0),
-    REAL_CONST(104568.198345/8.0),
-    REAL_CONST(104592.175690/8.0),
-    REAL_CONST(104616.154409/8.0),
-    REAL_CONST(104640.134503/8.0),
-    REAL_CONST(104664.115970/8.0),
-    REAL_CONST(104688.098811/8.0),
-    REAL_CONST(104712.083025/8.0),
-    REAL_CONST(104736.068613/8.0),
-    REAL_CONST(104760.055575/8.0),
-    REAL_CONST(104784.043909/8.0),
-    REAL_CONST(104808.033617/8.0),
-    REAL_CONST(104832.024697/8.0),
-    REAL_CONST(104856.017150/8.0),
-    REAL_CONST(104880.010976/8.0),
-    REAL_CONST(104904.006174/8.0),
-    REAL_CONST(104928.002744/8.0),
-    REAL_CONST(104952.000686/8.0),
-    REAL_CONST(104976.000000/8.0),
-    REAL_CONST(105000.000686/8.0),
-    REAL_CONST(105024.002743/8.0),
-    REAL_CONST(105048.006172/8.0),
-    REAL_CONST(105072.010972/8.0),
-    REAL_CONST(105096.017144/8.0),
-    REAL_CONST(105120.024686/8.0),
-    REAL_CONST(105144.033599/8.0),
-    REAL_CONST(105168.043882/8.0),
-    REAL_CONST(105192.055537/8.0),
-    REAL_CONST(105216.068561/8.0),
-    REAL_CONST(105240.082956/8.0),
-    REAL_CONST(105264.098720/8.0),
-    REAL_CONST(105288.115855/8.0),
-    REAL_CONST(105312.134359/8.0),
-    REAL_CONST(105336.154233/8.0),
-    REAL_CONST(105360.175476/8.0),
-    REAL_CONST(105384.198088/8.0),
-    REAL_CONST(105408.222070/8.0),
-    REAL_CONST(105432.247420/8.0),
-    REAL_CONST(105456.274140/8.0),
-    REAL_CONST(105480.302227/8.0),
-    REAL_CONST(105504.331684/8.0),
-    REAL_CONST(105528.362508/8.0),
-    REAL_CONST(105552.394701/8.0),
-    REAL_CONST(105576.428262/8.0),
-    REAL_CONST(105600.463190/8.0),
-    REAL_CONST(105624.499487/8.0),
-    REAL_CONST(105648.537150/8.0),
-    REAL_CONST(105672.576181/8.0),
-    REAL_CONST(105696.616580/8.0),
-    REAL_CONST(105720.658345/8.0),
-    REAL_CONST(105744.701478/8.0),
-    REAL_CONST(105768.745977/8.0),
-    REAL_CONST(105792.791842/8.0),
-    REAL_CONST(105816.839074/8.0),
-    REAL_CONST(105840.887673/8.0),
-    REAL_CONST(105864.937637/8.0),
-    REAL_CONST(105888.988968/8.0),
-    REAL_CONST(105913.041664/8.0),
-    REAL_CONST(105937.095726/8.0),
-    REAL_CONST(105961.151153/8.0),
-    REAL_CONST(105985.207946/8.0),
-    REAL_CONST(106009.266104/8.0),
-    REAL_CONST(106033.325627/8.0),
-    REAL_CONST(106057.386515/8.0),
-    REAL_CONST(106081.448768/8.0),
-    REAL_CONST(106105.512385/8.0),
-    REAL_CONST(106129.577367/8.0),
-    REAL_CONST(106153.643712/8.0),
-    REAL_CONST(106177.711422/8.0),
-    REAL_CONST(106201.780496/8.0),
-    REAL_CONST(106225.850934/8.0),
-    REAL_CONST(106249.922736/8.0),
-    REAL_CONST(106273.995901/8.0),
-    REAL_CONST(106298.070429/8.0),
-    REAL_CONST(106322.146320/8.0),
-    REAL_CONST(106346.223575/8.0),
-    REAL_CONST(106370.302192/8.0),
-    REAL_CONST(106394.382172/8.0),
-    REAL_CONST(106418.463515/8.0),
-    REAL_CONST(106442.546220/8.0),
-    REAL_CONST(106466.630287/8.0),
-    REAL_CONST(106490.715717/8.0),
-    REAL_CONST(106514.802508/8.0),
-    REAL_CONST(106538.890661/8.0),
-    REAL_CONST(106562.980176/8.0),
-    REAL_CONST(106587.071052/8.0),
-    REAL_CONST(106611.163290/8.0),
-    REAL_CONST(106635.256889/8.0),
-    REAL_CONST(106659.351849/8.0),
-    REAL_CONST(106683.448169/8.0),
-    REAL_CONST(106707.545851/8.0),
-    REAL_CONST(106731.644893/8.0),
-    REAL_CONST(106755.745295/8.0),
-    REAL_CONST(106779.847058/8.0),
-    REAL_CONST(106803.950181/8.0),
-    REAL_CONST(106828.054663/8.0),
-    REAL_CONST(106852.160506/8.0),
-    REAL_CONST(106876.267708/8.0),
-    REAL_CONST(106900.376270/8.0),
-    REAL_CONST(106924.486191/8.0),
-    REAL_CONST(106948.597471/8.0),
-    REAL_CONST(106972.710110/8.0),
-    REAL_CONST(106996.824108/8.0),
-    REAL_CONST(107020.939465/8.0),
-    REAL_CONST(107045.056181/8.0),
-    REAL_CONST(107069.174255/8.0),
-    REAL_CONST(107093.293687/8.0),
-    REAL_CONST(107117.414477/8.0),
-    REAL_CONST(107141.536625/8.0),
-    REAL_CONST(107165.660131/8.0),
-    REAL_CONST(107189.784995/8.0),
-    REAL_CONST(107213.911216/8.0),
-    REAL_CONST(107238.038794/8.0),
-    REAL_CONST(107262.167730/8.0),
-    REAL_CONST(107286.298023/8.0),
-    REAL_CONST(107310.429672/8.0),
-    REAL_CONST(107334.562679/8.0),
-    REAL_CONST(107358.697042/8.0),
-    REAL_CONST(107382.832761/8.0),
-    REAL_CONST(107406.969837/8.0),
-    REAL_CONST(107431.108269/8.0),
-    REAL_CONST(107455.248056/8.0),
-    REAL_CONST(107479.389200/8.0),
-    REAL_CONST(107503.531699/8.0),
-    REAL_CONST(107527.675554/8.0),
-    REAL_CONST(107551.820764/8.0),
-    REAL_CONST(107575.967330/8.0),
-    REAL_CONST(107600.115250/8.0),
-    REAL_CONST(107624.264526/8.0),
-    REAL_CONST(107648.415156/8.0),
-    REAL_CONST(107672.567140/8.0),
-    REAL_CONST(107696.720480/8.0),
-    REAL_CONST(107720.875173/8.0),
-    REAL_CONST(107745.031221/8.0),
-    REAL_CONST(107769.188622/8.0),
-    REAL_CONST(107793.347378/8.0),
-    REAL_CONST(107817.507487/8.0),
-    REAL_CONST(107841.668950/8.0),
-    REAL_CONST(107865.831766/8.0),
-    REAL_CONST(107889.995935/8.0),
-    REAL_CONST(107914.161458/8.0),
-    REAL_CONST(107938.328333/8.0),
-    REAL_CONST(107962.496561/8.0),
-    REAL_CONST(107986.666142/8.0),
-    REAL_CONST(108010.837076/8.0),
-    REAL_CONST(108035.009361/8.0),
-    REAL_CONST(108059.182999/8.0),
-    REAL_CONST(108083.357989/8.0),
-    REAL_CONST(108107.534331/8.0),
-    REAL_CONST(108131.712024/8.0),
-    REAL_CONST(108155.891069/8.0),
-    REAL_CONST(108180.071466/8.0),
-    REAL_CONST(108204.253213/8.0),
-    REAL_CONST(108228.436312/8.0),
-    REAL_CONST(108252.620762/8.0),
-    REAL_CONST(108276.806563/8.0),
-    REAL_CONST(108300.993714/8.0),
-    REAL_CONST(108325.182216/8.0),
-    REAL_CONST(108349.372068/8.0),
-    REAL_CONST(108373.563271/8.0),
-    REAL_CONST(108397.755823/8.0),
-    REAL_CONST(108421.949726/8.0),
-    REAL_CONST(108446.144978/8.0),
-    REAL_CONST(108470.341580/8.0),
-    REAL_CONST(108494.539531/8.0),
-    REAL_CONST(108518.738831/8.0),
-    REAL_CONST(108542.939481/8.0),
-    REAL_CONST(108567.141480/8.0),
-    REAL_CONST(108591.344828/8.0),
-    REAL_CONST(108615.549524/8.0),
-    REAL_CONST(108639.755569/8.0),
-    REAL_CONST(108663.962962/8.0),
-    REAL_CONST(108688.171704/8.0),
-    REAL_CONST(108712.381794/8.0),
-    REAL_CONST(108736.593231/8.0),
-    REAL_CONST(108760.806017/8.0),
-    REAL_CONST(108785.020150/8.0),
-    REAL_CONST(108809.235631/8.0),
-    REAL_CONST(108833.452459/8.0),
-    REAL_CONST(108857.670634/8.0),
-    REAL_CONST(108881.890156/8.0),
-    REAL_CONST(108906.111025/8.0),
-    REAL_CONST(108930.333241/8.0),
-    REAL_CONST(108954.556804/8.0),
-    REAL_CONST(108978.781713/8.0),
-    REAL_CONST(109003.007968/8.0),
-    REAL_CONST(109027.235570/8.0),
-    REAL_CONST(109051.464517/8.0),
-    REAL_CONST(109075.694811/8.0),
-    REAL_CONST(109099.926450/8.0),
-    REAL_CONST(109124.159435/8.0),
-    REAL_CONST(109148.393765/8.0),
-    REAL_CONST(109172.629440/8.0),
-    REAL_CONST(109196.866461/8.0),
-    REAL_CONST(109221.104826/8.0),
-    REAL_CONST(109245.344537/8.0),
-    REAL_CONST(109269.585591/8.0),
-    REAL_CONST(109293.827991/8.0),
-    REAL_CONST(109318.071735/8.0),
-    REAL_CONST(109342.316823/8.0),
-    REAL_CONST(109366.563255/8.0),
-    REAL_CONST(109390.811031/8.0),
-    REAL_CONST(109415.060151/8.0),
-    REAL_CONST(109439.310615/8.0),
-    REAL_CONST(109463.562421/8.0),
-    REAL_CONST(109487.815572/8.0),
-    REAL_CONST(109512.070065/8.0),
-    REAL_CONST(109536.325902/8.0),
-    REAL_CONST(109560.583081/8.0),
-    REAL_CONST(109584.841603/8.0),
-    REAL_CONST(109609.101468/8.0),
-    REAL_CONST(109633.362675/8.0),
-    REAL_CONST(109657.625225/8.0),
-    REAL_CONST(109681.889116/8.0),
-    REAL_CONST(109706.154350/8.0),
-    REAL_CONST(109730.420925/8.0),
-    REAL_CONST(109754.688842/8.0),
-    REAL_CONST(109778.958101/8.0),
-    REAL_CONST(109803.228701/8.0),
-    REAL_CONST(109827.500642/8.0),
-    REAL_CONST(109851.773925/8.0),
-    REAL_CONST(109876.048548/8.0),
-    REAL_CONST(109900.324512/8.0),
-    REAL_CONST(109924.601817/8.0),
-    REAL_CONST(109948.880462/8.0),
-    REAL_CONST(109973.160448/8.0),
-    REAL_CONST(109997.441774/8.0),
-    REAL_CONST(110021.724440/8.0),
-    REAL_CONST(110046.008446/8.0),
-    REAL_CONST(110070.293792/8.0),
-    REAL_CONST(110094.580477/8.0),
-    REAL_CONST(110118.868502/8.0),
-    REAL_CONST(110143.157866/8.0),
-    REAL_CONST(110167.448569/8.0),
-    REAL_CONST(110191.740611/8.0),
-    REAL_CONST(110216.033993/8.0),
-    REAL_CONST(110240.328713/8.0),
-    REAL_CONST(110264.624771/8.0),
-    REAL_CONST(110288.922168/8.0),
-    REAL_CONST(110313.220903/8.0),
-    REAL_CONST(110337.520977/8.0),
-    REAL_CONST(110361.822388/8.0),
-    REAL_CONST(110386.125137/8.0),
-    REAL_CONST(110410.429224/8.0),
-    REAL_CONST(110434.734649/8.0),
-    REAL_CONST(110459.041411/8.0),
-    REAL_CONST(110483.349510/8.0),
-    REAL_CONST(110507.658946/8.0),
-    REAL_CONST(110531.969719/8.0),
-    REAL_CONST(110556.281830/8.0),
-    REAL_CONST(110580.595276/8.0),
-    REAL_CONST(110604.910060/8.0),
-    REAL_CONST(110629.226179/8.0),
-    REAL_CONST(110653.543635/8.0),
-    REAL_CONST(110677.862427/8.0),
-    REAL_CONST(110702.182555/8.0),
-    REAL_CONST(110726.504019/8.0),
-    REAL_CONST(110750.826818/8.0),
-    REAL_CONST(110775.150953/8.0),
-    REAL_CONST(110799.476423/8.0),
-    REAL_CONST(110823.803229/8.0),
-    REAL_CONST(110848.131369/8.0),
-    REAL_CONST(110872.460845/8.0),
-    REAL_CONST(110896.791655/8.0),
-    REAL_CONST(110921.123800/8.0),
-    REAL_CONST(110945.457279/8.0),
-    REAL_CONST(110969.792093/8.0),
-    REAL_CONST(110994.128240/8.0),
-    REAL_CONST(111018.465722/8.0),
-    REAL_CONST(111042.804538/8.0),
-    REAL_CONST(111067.144687/8.0),
-    REAL_CONST(111091.486170/8.0),
-    REAL_CONST(111115.828987/8.0),
-    REAL_CONST(111140.173137/8.0),
-    REAL_CONST(111164.518620/8.0),
-    REAL_CONST(111188.865436/8.0),
-    REAL_CONST(111213.213585/8.0),
-    REAL_CONST(111237.563066/8.0),
-    REAL_CONST(111261.913880/8.0),
-    REAL_CONST(111286.266027/8.0),
-    REAL_CONST(111310.619506/8.0),
-    REAL_CONST(111334.974317/8.0),
-    REAL_CONST(111359.330460/8.0),
-    REAL_CONST(111383.687935/8.0),
-    REAL_CONST(111408.046741/8.0),
-    REAL_CONST(111432.406879/8.0),
-    REAL_CONST(111456.768349/8.0),
-    REAL_CONST(111481.131149/8.0),
-    REAL_CONST(111505.495281/8.0),
-    REAL_CONST(111529.860744/8.0),
-    REAL_CONST(111554.227538/8.0),
-    REAL_CONST(111578.595662/8.0),
-    REAL_CONST(111602.965117/8.0),
-    REAL_CONST(111627.335902/8.0),
-    REAL_CONST(111651.708018/8.0),
-    REAL_CONST(111676.081464/8.0),
-    REAL_CONST(111700.456239/8.0),
-    REAL_CONST(111724.832345/8.0),
-    REAL_CONST(111749.209780/8.0),
-    REAL_CONST(111773.588544/8.0),
-    REAL_CONST(111797.968638/8.0),
-    REAL_CONST(111822.350062/8.0),
-    REAL_CONST(111846.732814/8.0),
-    REAL_CONST(111871.116895/8.0),
-    REAL_CONST(111895.502305/8.0),
-    REAL_CONST(111919.889044/8.0),
-    REAL_CONST(111944.277111/8.0),
-    REAL_CONST(111968.666507/8.0),
-    REAL_CONST(111993.057230/8.0),
-    REAL_CONST(112017.449282/8.0),
-    REAL_CONST(112041.842662/8.0),
-    REAL_CONST(112066.237369/8.0),
-    REAL_CONST(112090.633405/8.0),
-    REAL_CONST(112115.030767/8.0),
-    REAL_CONST(112139.429457/8.0),
-    REAL_CONST(112163.829475/8.0),
-    REAL_CONST(112188.230819/8.0),
-    REAL_CONST(112212.633490/8.0),
-    REAL_CONST(112237.037488/8.0),
-    REAL_CONST(112261.442813/8.0),
-    REAL_CONST(112285.849464/8.0),
-    REAL_CONST(112310.257441/8.0),
-    REAL_CONST(112334.666745/8.0),
-    REAL_CONST(112359.077375/8.0),
-    REAL_CONST(112383.489330/8.0),
-    REAL_CONST(112407.902612/8.0),
-    REAL_CONST(112432.317219/8.0),
-    REAL_CONST(112456.733151/8.0),
-    REAL_CONST(112481.150409/8.0),
-    REAL_CONST(112505.568992/8.0),
-    REAL_CONST(112529.988900/8.0),
-    REAL_CONST(112554.410133/8.0),
-    REAL_CONST(112578.832691/8.0),
-    REAL_CONST(112603.256573/8.0),
-    REAL_CONST(112627.681780/8.0),
-    REAL_CONST(112652.108311/8.0),
-    REAL_CONST(112676.536166/8.0),
-    REAL_CONST(112700.965345/8.0),
-    REAL_CONST(112725.395849/8.0),
-    REAL_CONST(112749.827676/8.0),
-    REAL_CONST(112774.260826/8.0),
-    REAL_CONST(112798.695300/8.0),
-    REAL_CONST(112823.131098/8.0),
-    REAL_CONST(112847.568218/8.0),
-    REAL_CONST(112872.006662/8.0),
-    REAL_CONST(112896.446428/8.0),
-    REAL_CONST(112920.887517/8.0),
-    REAL_CONST(112945.329929/8.0),
-    REAL_CONST(112969.773663/8.0),
-    REAL_CONST(112994.218720/8.0),
-    REAL_CONST(113018.665099/8.0),
-    REAL_CONST(113043.112800/8.0),
-    REAL_CONST(113067.561822/8.0),
-    REAL_CONST(113092.012167/8.0),
-    REAL_CONST(113116.463833/8.0),
-    REAL_CONST(113140.916820/8.0),
-    REAL_CONST(113165.371129/8.0),
-    REAL_CONST(113189.826759/8.0),
-    REAL_CONST(113214.283710/8.0),
-    REAL_CONST(113238.741982/8.0),
-    REAL_CONST(113263.201575/8.0),
-    REAL_CONST(113287.662488/8.0),
-    REAL_CONST(113312.124722/8.0),
-    REAL_CONST(113336.588276/8.0),
-    REAL_CONST(113361.053150/8.0),
-    REAL_CONST(113385.519345/8.0),
-    REAL_CONST(113409.986859/8.0),
-    REAL_CONST(113434.455693/8.0),
-    REAL_CONST(113458.925846/8.0),
-    REAL_CONST(113483.397319/8.0),
-    REAL_CONST(113507.870112/8.0),
-    REAL_CONST(113532.344223/8.0),
-    REAL_CONST(113556.819654/8.0),
-    REAL_CONST(113581.296403/8.0),
-    REAL_CONST(113605.774471/8.0),
-    REAL_CONST(113630.253858/8.0),
-    REAL_CONST(113654.734563/8.0),
-    REAL_CONST(113679.216587/8.0),
-    REAL_CONST(113703.699929/8.0),
-    REAL_CONST(113728.184589/8.0),
-    REAL_CONST(113752.670566/8.0),
-    REAL_CONST(113777.157862/8.0),
-    REAL_CONST(113801.646475/8.0),
-    REAL_CONST(113826.136406/8.0),
-    REAL_CONST(113850.627654/8.0),
-    REAL_CONST(113875.120219/8.0),
-    REAL_CONST(113899.614101/8.0),
-    REAL_CONST(113924.109300/8.0),
-    REAL_CONST(113948.605816/8.0),
-    REAL_CONST(113973.103648/8.0),
-    REAL_CONST(113997.602797/8.0),
-    REAL_CONST(114022.103263/8.0),
-    REAL_CONST(114046.605044/8.0),
-    REAL_CONST(114071.108142/8.0),
-    REAL_CONST(114095.612555/8.0),
-    REAL_CONST(114120.118285/8.0),
-    REAL_CONST(114144.625330/8.0),
-    REAL_CONST(114169.133690/8.0),
-    REAL_CONST(114193.643366/8.0),
-    REAL_CONST(114218.154357/8.0),
-    REAL_CONST(114242.666663/8.0),
-    REAL_CONST(114267.180284/8.0),
-    REAL_CONST(114291.695220/8.0),
-    REAL_CONST(114316.211470/8.0),
-    REAL_CONST(114340.729035/8.0),
-    REAL_CONST(114365.247914/8.0),
-    REAL_CONST(114389.768108/8.0),
-    REAL_CONST(114414.289615/8.0),
-    REAL_CONST(114438.812437/8.0),
-    REAL_CONST(114463.336572/8.0),
-    REAL_CONST(114487.862021/8.0),
-    REAL_CONST(114512.388784/8.0),
-    REAL_CONST(114536.916860/8.0),
-    REAL_CONST(114561.446249/8.0),
-    REAL_CONST(114585.976951/8.0),
-    REAL_CONST(114610.508967/8.0),
-    REAL_CONST(114635.042295/8.0),
-    REAL_CONST(114659.576936/8.0),
-    REAL_CONST(114684.112889/8.0),
-    REAL_CONST(114708.650155/8.0),
-    REAL_CONST(114733.188733/8.0),
-    REAL_CONST(114757.728623/8.0),
-    REAL_CONST(114782.269825/8.0),
-    REAL_CONST(114806.812339/8.0),
-    REAL_CONST(114831.356164/8.0),
-    REAL_CONST(114855.901301/8.0),
-    REAL_CONST(114880.447750/8.0),
-    REAL_CONST(114904.995510/8.0),
-    REAL_CONST(114929.544581/8.0),
-    REAL_CONST(114954.094963/8.0),
-    REAL_CONST(114978.646655/8.0),
-    REAL_CONST(115003.199659/8.0),
-    REAL_CONST(115027.753973/8.0),
-    REAL_CONST(115052.309598/8.0),
-    REAL_CONST(115076.866532/8.0),
-    REAL_CONST(115101.424777/8.0),
-    REAL_CONST(115125.984333/8.0),
-    REAL_CONST(115150.545197/8.0),
-    REAL_CONST(115175.107372/8.0),
-    REAL_CONST(115199.670856/8.0),
-    REAL_CONST(115224.235650/8.0),
-    REAL_CONST(115248.801753/8.0),
-    REAL_CONST(115273.369165/8.0),
-    REAL_CONST(115297.937886/8.0),
-    REAL_CONST(115322.507917/8.0),
-    REAL_CONST(115347.079256/8.0),
-    REAL_CONST(115371.651903/8.0),
-    REAL_CONST(115396.225859/8.0),
-    REAL_CONST(115420.801123/8.0),
-    REAL_CONST(115445.377696/8.0),
-    REAL_CONST(115469.955577/8.0),
-    REAL_CONST(115494.534765/8.0),
-    REAL_CONST(115519.115261/8.0),
-    REAL_CONST(115543.697065/8.0),
-    REAL_CONST(115568.280177/8.0),
-    REAL_CONST(115592.864596/8.0),
-    REAL_CONST(115617.450322/8.0),
-    REAL_CONST(115642.037355/8.0),
-    REAL_CONST(115666.625695/8.0),
-    REAL_CONST(115691.215342/8.0),
-    REAL_CONST(115715.806296/8.0),
-    REAL_CONST(115740.398556/8.0),
-    REAL_CONST(115764.992122/8.0),
-    REAL_CONST(115789.586995/8.0),
-    REAL_CONST(115814.183174/8.0),
-    REAL_CONST(115838.780659/8.0),
-    REAL_CONST(115863.379450/8.0),
-    REAL_CONST(115887.979546/8.0),
-    REAL_CONST(115912.580948/8.0),
-    REAL_CONST(115937.183656/8.0),
-    REAL_CONST(115961.787668/8.0),
-    REAL_CONST(115986.392986/8.0),
-    REAL_CONST(116010.999609/8.0),
-    REAL_CONST(116035.607537/8.0),
-    REAL_CONST(116060.216769/8.0),
-    REAL_CONST(116084.827307/8.0),
-    REAL_CONST(116109.439148/8.0),
-    REAL_CONST(116134.052294/8.0),
-    REAL_CONST(116158.666744/8.0),
-    REAL_CONST(116183.282498/8.0),
-    REAL_CONST(116207.899556/8.0),
-    REAL_CONST(116232.517918/8.0),
-    REAL_CONST(116257.137583/8.0),
-    REAL_CONST(116281.758552/8.0),
-    REAL_CONST(116306.380824/8.0),
-    REAL_CONST(116331.004400/8.0),
-    REAL_CONST(116355.629278/8.0),
-    REAL_CONST(116380.255460/8.0),
-    REAL_CONST(116404.882944/8.0),
-    REAL_CONST(116429.511731/8.0),
-    REAL_CONST(116454.141820/8.0),
-    REAL_CONST(116478.773212/8.0),
-    REAL_CONST(116503.405906/8.0),
-    REAL_CONST(116528.039902/8.0),
-    REAL_CONST(116552.675201/8.0),
-    REAL_CONST(116577.311801/8.0),
-    REAL_CONST(116601.949702/8.0),
-    REAL_CONST(116626.588905/8.0),
-    REAL_CONST(116651.229410/8.0),
-    REAL_CONST(116675.871216/8.0),
-    REAL_CONST(116700.514323/8.0),
-    REAL_CONST(116725.158731/8.0),
-    REAL_CONST(116749.804440/8.0),
-    REAL_CONST(116774.451450/8.0),
-    REAL_CONST(116799.099760/8.0),
-    REAL_CONST(116823.749371/8.0),
-    REAL_CONST(116848.400282/8.0),
-    REAL_CONST(116873.052494/8.0),
-    REAL_CONST(116897.706005/8.0),
-    REAL_CONST(116922.360816/8.0),
-    REAL_CONST(116947.016927/8.0),
-    REAL_CONST(116971.674338/8.0),
-    REAL_CONST(116996.333048/8.0),
-    REAL_CONST(117020.993058/8.0),
-    REAL_CONST(117045.654367/8.0),
-    REAL_CONST(117070.316974/8.0),
-    REAL_CONST(117094.980881/8.0),
-    REAL_CONST(117119.646087/8.0),
-    REAL_CONST(117144.312591/8.0),
-    REAL_CONST(117168.980394/8.0),
-    REAL_CONST(117193.649495/8.0),
-    REAL_CONST(117218.319895/8.0),
-    REAL_CONST(117242.991593/8.0),
-    REAL_CONST(117267.664588/8.0),
-    REAL_CONST(117292.338882/8.0),
-    REAL_CONST(117317.014473/8.0),
-    REAL_CONST(117341.691362/8.0),
-    REAL_CONST(117366.369548/8.0),
-    REAL_CONST(117391.049032/8.0),
-    REAL_CONST(117415.729813/8.0),
-    REAL_CONST(117440.411891/8.0),
-    REAL_CONST(117465.095266/8.0),
-    REAL_CONST(117489.779937/8.0),
-    REAL_CONST(117514.465905/8.0),
-    REAL_CONST(117539.153170/8.0),
-    REAL_CONST(117563.841731/8.0),
-    REAL_CONST(117588.531588/8.0),
-    REAL_CONST(117613.222741/8.0),
-    REAL_CONST(117637.915191/8.0),
-    REAL_CONST(117662.608936/8.0),
-    REAL_CONST(117687.303977/8.0),
-    REAL_CONST(117712.000313/8.0),
-    REAL_CONST(117736.697945/8.0),
-    REAL_CONST(117761.396872/8.0),
-    REAL_CONST(117786.097094/8.0),
-    REAL_CONST(117810.798611/8.0),
-    REAL_CONST(117835.501423/8.0),
-    REAL_CONST(117860.205530/8.0),
-    REAL_CONST(117884.910931/8.0),
-    REAL_CONST(117909.617627/8.0),
-    REAL_CONST(117934.325617/8.0),
-    REAL_CONST(117959.034902/8.0),
-    REAL_CONST(117983.745480/8.0),
-    REAL_CONST(118008.457352/8.0),
-    REAL_CONST(118033.170518/8.0),
-    REAL_CONST(118057.884978/8.0),
-    REAL_CONST(118082.600731/8.0),
-    REAL_CONST(118107.317778/8.0),
-    REAL_CONST(118132.036118/8.0),
-    REAL_CONST(118156.755751/8.0),
-    REAL_CONST(118181.476677/8.0),
-    REAL_CONST(118206.198895/8.0),
-    REAL_CONST(118230.922407/8.0),
-    REAL_CONST(118255.647211/8.0),
-    REAL_CONST(118280.373307/8.0),
-    REAL_CONST(118305.100696/8.0),
-    REAL_CONST(118329.829377/8.0),
-    REAL_CONST(118354.559350/8.0),
-    REAL_CONST(118379.290615/8.0),
-    REAL_CONST(118404.023171/8.0),
-    REAL_CONST(118428.757019/8.0),
-    REAL_CONST(118453.492159/8.0),
-    REAL_CONST(118478.228590/8.0),
-    REAL_CONST(118502.966312/8.0),
-    REAL_CONST(118527.705326/8.0),
-    REAL_CONST(118552.445630/8.0),
-    REAL_CONST(118577.187225/8.0),
-    REAL_CONST(118601.930111/8.0),
-    REAL_CONST(118626.674287/8.0),
-    REAL_CONST(118651.419754/8.0),
-    REAL_CONST(118676.166511/8.0),
-    REAL_CONST(118700.914558/8.0),
-    REAL_CONST(118725.663895/8.0),
-    REAL_CONST(118750.414522/8.0),
-    REAL_CONST(118775.166438/8.0),
-    REAL_CONST(118799.919645/8.0),
-    REAL_CONST(118824.674140/8.0),
-    REAL_CONST(118849.429926/8.0),
-    REAL_CONST(118874.187000/8.0),
-    REAL_CONST(118898.945363/8.0),
-    REAL_CONST(118923.705015/8.0),
-    REAL_CONST(118948.465957/8.0),
-    REAL_CONST(118973.228186/8.0),
-    REAL_CONST(118997.991705/8.0),
-    REAL_CONST(119022.756511/8.0),
-    REAL_CONST(119047.522606/8.0),
-    REAL_CONST(119072.289989/8.0),
-    REAL_CONST(119097.058660/8.0),
-    REAL_CONST(119121.828619/8.0),
-    REAL_CONST(119146.599866/8.0),
-    REAL_CONST(119171.372400/8.0),
-    REAL_CONST(119196.146221/8.0),
-    REAL_CONST(119220.921330/8.0),
-    REAL_CONST(119245.697726/8.0),
-    REAL_CONST(119270.475410/8.0),
-    REAL_CONST(119295.254380/8.0),
-    REAL_CONST(119320.034637/8.0),
-    REAL_CONST(119344.816180/8.0),
-    REAL_CONST(119369.599010/8.0),
-    REAL_CONST(119394.383127/8.0),
-    REAL_CONST(119419.168529/8.0),
-    REAL_CONST(119443.955218/8.0),
-    REAL_CONST(119468.743193/8.0),
-    REAL_CONST(119493.532454/8.0),
-    REAL_CONST(119518.323000/8.0),
-    REAL_CONST(119543.114832/8.0),
-    REAL_CONST(119567.907949/8.0),
-    REAL_CONST(119592.702352/8.0),
-    REAL_CONST(119617.498040/8.0),
-    REAL_CONST(119642.295013/8.0),
-    REAL_CONST(119667.093271/8.0),
-    REAL_CONST(119691.892813/8.0),
-    REAL_CONST(119716.693641/8.0),
-    REAL_CONST(119741.495752/8.0),
-    REAL_CONST(119766.299149/8.0),
-    REAL_CONST(119791.103829/8.0),
-    REAL_CONST(119815.909794/8.0),
-    REAL_CONST(119840.717042/8.0),
-    REAL_CONST(119865.525575/8.0),
-    REAL_CONST(119890.335391/8.0),
-    REAL_CONST(119915.146490/8.0),
-    REAL_CONST(119939.958874/8.0),
-    REAL_CONST(119964.772540/8.0),
-    REAL_CONST(119989.587490/8.0),
-    REAL_CONST(120014.403723/8.0),
-    REAL_CONST(120039.221238/8.0),
-    REAL_CONST(120064.040037/8.0),
-    REAL_CONST(120088.860118/8.0),
-    REAL_CONST(120113.681481/8.0),
-    REAL_CONST(120138.504127/8.0),
-    REAL_CONST(120163.328056/8.0),
-    REAL_CONST(120188.153266/8.0),
-    REAL_CONST(120212.979759/8.0),
-    REAL_CONST(120237.807533/8.0),
-    REAL_CONST(120262.636589/8.0),
-    REAL_CONST(120287.466926/8.0),
-    REAL_CONST(120312.298545/8.0),
-    REAL_CONST(120337.131446/8.0),
-    REAL_CONST(120361.965627/8.0),
-    REAL_CONST(120386.801090/8.0),
-    REAL_CONST(120411.637834/8.0),
-    REAL_CONST(120436.475858/8.0),
-    REAL_CONST(120461.315163/8.0),
-    REAL_CONST(120486.155749/8.0),
-    REAL_CONST(120510.997615/8.0),
-    REAL_CONST(120535.840761/8.0),
-    REAL_CONST(120560.685188/8.0),
-    REAL_CONST(120585.530894/8.0),
-    REAL_CONST(120610.377881/8.0),
-    REAL_CONST(120635.226147/8.0),
-    REAL_CONST(120660.075692/8.0),
-    REAL_CONST(120684.926518/8.0),
-    REAL_CONST(120709.778622/8.0),
-    REAL_CONST(120734.632006/8.0),
-    REAL_CONST(120759.486669/8.0),
-    REAL_CONST(120784.342611/8.0),
-    REAL_CONST(120809.199831/8.0),
-    REAL_CONST(120834.058331/8.0),
-    REAL_CONST(120858.918109/8.0),
-    REAL_CONST(120883.779165/8.0),
-    REAL_CONST(120908.641500/8.0),
-    REAL_CONST(120933.505113/8.0),
-    REAL_CONST(120958.370004/8.0),
-    REAL_CONST(120983.236172/8.0),
-    REAL_CONST(121008.103619/8.0),
-    REAL_CONST(121032.972343/8.0),
-    REAL_CONST(121057.842345/8.0),
-    REAL_CONST(121082.713624/8.0),
-    REAL_CONST(121107.586180/8.0),
-    REAL_CONST(121132.460014/8.0),
-    REAL_CONST(121157.335124/8.0),
-    REAL_CONST(121182.211512/8.0),
-    REAL_CONST(121207.089176/8.0),
-    REAL_CONST(121231.968116/8.0),
-    REAL_CONST(121256.848333/8.0),
-    REAL_CONST(121281.729827/8.0),
-    REAL_CONST(121306.612597/8.0),
-    REAL_CONST(121331.496642/8.0),
-    REAL_CONST(121356.381964/8.0),
-    REAL_CONST(121381.268561/8.0),
-    REAL_CONST(121406.156435/8.0),
-    REAL_CONST(121431.045583/8.0),
-    REAL_CONST(121455.936007/8.0),
-    REAL_CONST(121480.827707/8.0),
-    REAL_CONST(121505.720681/8.0),
-    REAL_CONST(121530.614931/8.0),
-    REAL_CONST(121555.510455/8.0),
-    REAL_CONST(121580.407255/8.0),
-    REAL_CONST(121605.305329/8.0),
-    REAL_CONST(121630.204677/8.0),
-    REAL_CONST(121655.105300/8.0),
-    REAL_CONST(121680.007197/8.0),
-    REAL_CONST(121704.910368/8.0),
-    REAL_CONST(121729.814813/8.0),
-    REAL_CONST(121754.720532/8.0),
-    REAL_CONST(121779.627525/8.0),
-    REAL_CONST(121804.535791/8.0),
-    REAL_CONST(121829.445331/8.0),
-    REAL_CONST(121854.356144/8.0),
-    REAL_CONST(121879.268230/8.0),
-    REAL_CONST(121904.181589/8.0),
-    REAL_CONST(121929.096222/8.0),
-    REAL_CONST(121954.012127/8.0),
-    REAL_CONST(121978.929304/8.0),
-    REAL_CONST(122003.847755/8.0),
-    REAL_CONST(122028.767478/8.0),
-    REAL_CONST(122053.688473/8.0),
-    REAL_CONST(122078.610740/8.0),
-    REAL_CONST(122103.534279/8.0),
-    REAL_CONST(122128.459090/8.0),
-    REAL_CONST(122153.385173/8.0),
-    REAL_CONST(122178.312528/8.0),
-    REAL_CONST(122203.241154/8.0),
-    REAL_CONST(122228.171051/8.0),
-    REAL_CONST(122253.102220/8.0),
-    REAL_CONST(122278.034660/8.0),
-    REAL_CONST(122302.968370/8.0),
-    REAL_CONST(122327.903352/8.0),
-    REAL_CONST(122352.839604/8.0),
-    REAL_CONST(122377.777127/8.0),
-    REAL_CONST(122402.715921/8.0),
-    REAL_CONST(122427.655985/8.0),
-    REAL_CONST(122452.597319/8.0),
-    REAL_CONST(122477.539923/8.0),
-    REAL_CONST(122502.483797/8.0),
-    REAL_CONST(122527.428941/8.0),
-    REAL_CONST(122552.375354/8.0),
-    REAL_CONST(122577.323038/8.0),
-    REAL_CONST(122602.271990/8.0),
-    REAL_CONST(122627.222212/8.0),
-    REAL_CONST(122652.173703/8.0),
-    REAL_CONST(122677.126463/8.0),
-    REAL_CONST(122702.080493/8.0),
-    REAL_CONST(122727.035790/8.0),
-    REAL_CONST(122751.992357/8.0),
-    REAL_CONST(122776.950192/8.0),
-    REAL_CONST(122801.909296/8.0),
-    REAL_CONST(122826.869667/8.0),
-    REAL_CONST(122851.831307/8.0),
-    REAL_CONST(122876.794215/8.0),
-    REAL_CONST(122901.758391/8.0),
-    REAL_CONST(122926.723835/8.0),
-    REAL_CONST(122951.690546/8.0),
-    REAL_CONST(122976.658525/8.0),
-    REAL_CONST(123001.627771/8.0),
-    REAL_CONST(123026.598284/8.0),
-    REAL_CONST(123051.570065/8.0),
-    REAL_CONST(123076.543112/8.0),
-    REAL_CONST(123101.517427/8.0),
-    REAL_CONST(123126.493008/8.0),
-    REAL_CONST(123151.469855/8.0),
-    REAL_CONST(123176.447970/8.0),
-    REAL_CONST(123201.427350/8.0),
-    REAL_CONST(123226.407997/8.0),
-    REAL_CONST(123251.389910/8.0),
-    REAL_CONST(123276.373088/8.0),
-    REAL_CONST(123301.357533/8.0),
-    REAL_CONST(123326.343243/8.0),
-    REAL_CONST(123351.330219/8.0),
-    REAL_CONST(123376.318461/8.0),
-    REAL_CONST(123401.307967/8.0),
-    REAL_CONST(123426.298739/8.0),
-    REAL_CONST(123451.290776/8.0),
-    REAL_CONST(123476.284078/8.0),
-    REAL_CONST(123501.278645/8.0),
-    REAL_CONST(123526.274476/8.0),
-    REAL_CONST(123551.271572/8.0),
-    REAL_CONST(123576.269933/8.0),
-    REAL_CONST(123601.269557/8.0),
-    REAL_CONST(123626.270446/8.0),
-    REAL_CONST(123651.272599/8.0),
-    REAL_CONST(123676.276016/8.0),
-    REAL_CONST(123701.280696/8.0),
-    REAL_CONST(123726.286641/8.0),
-    REAL_CONST(123751.293849/8.0),
-    REAL_CONST(123776.302320/8.0),
-    REAL_CONST(123801.312054/8.0),
-    REAL_CONST(123826.323052/8.0),
-    REAL_CONST(123851.335312/8.0),
-    REAL_CONST(123876.348836/8.0),
-    REAL_CONST(123901.363622/8.0),
-    REAL_CONST(123926.379671/8.0),
-    REAL_CONST(123951.396983/8.0),
-    REAL_CONST(123976.415557/8.0),
-    REAL_CONST(124001.435393/8.0),
-    REAL_CONST(124026.456491/8.0),
-    REAL_CONST(124051.478851/8.0),
-    REAL_CONST(124076.502473/8.0),
-    REAL_CONST(124101.527357/8.0),
-    REAL_CONST(124126.553503/8.0),
-    REAL_CONST(124151.580910/8.0),
-    REAL_CONST(124176.609578/8.0),
-    REAL_CONST(124201.639508/8.0),
-    REAL_CONST(124226.670698/8.0),
-    REAL_CONST(124251.703150/8.0),
-    REAL_CONST(124276.736862/8.0),
-    REAL_CONST(124301.771836/8.0),
-    REAL_CONST(124326.808070/8.0),
-    REAL_CONST(124351.845564/8.0),
-    REAL_CONST(124376.884319/8.0),
-    REAL_CONST(124401.924334/8.0),
-    REAL_CONST(124426.965609/8.0),
-    REAL_CONST(124452.008144/8.0),
-    REAL_CONST(124477.051938/8.0),
-    REAL_CONST(124502.096993/8.0),
-    REAL_CONST(124527.143307/8.0),
-    REAL_CONST(124552.190881/8.0),
-    REAL_CONST(124577.239714/8.0),
-    REAL_CONST(124602.289806/8.0),
-    REAL_CONST(124627.341157/8.0),
-    REAL_CONST(124652.393767/8.0),
-    REAL_CONST(124677.447636/8.0),
-    REAL_CONST(124702.502764/8.0),
-    REAL_CONST(124727.559150/8.0),
-    REAL_CONST(124752.616795/8.0),
-    REAL_CONST(124777.675698/8.0),
-    REAL_CONST(124802.735859/8.0),
-    REAL_CONST(124827.797279/8.0),
-    REAL_CONST(124852.859956/8.0),
-    REAL_CONST(124877.923891/8.0),
-    REAL_CONST(124902.989084/8.0),
-    REAL_CONST(124928.055534/8.0),
-    REAL_CONST(124953.123242/8.0),
-    REAL_CONST(124978.192207/8.0),
-    REAL_CONST(125003.262430/8.0),
-    REAL_CONST(125028.333909/8.0),
-    REAL_CONST(125053.406645/8.0),
-    REAL_CONST(125078.480638/8.0),
-    REAL_CONST(125103.555888/8.0),
-    REAL_CONST(125128.632395/8.0),
-    REAL_CONST(125153.710157/8.0),
-    REAL_CONST(125178.789176/8.0),
-    REAL_CONST(125203.869452/8.0),
-    REAL_CONST(125228.950983/8.0),
-    REAL_CONST(125254.033770/8.0),
-    REAL_CONST(125279.117813/8.0),
-    REAL_CONST(125304.203112/8.0),
-    REAL_CONST(125329.289666/8.0),
-    REAL_CONST(125354.377476/8.0),
-    REAL_CONST(125379.466541/8.0),
-    REAL_CONST(125404.556861/8.0),
-    REAL_CONST(125429.648437/8.0),
-    REAL_CONST(125454.741267/8.0),
-    REAL_CONST(125479.835352/8.0),
-    REAL_CONST(125504.930692/8.0),
-    REAL_CONST(125530.027286/8.0),
-    REAL_CONST(125555.125134/8.0),
-    REAL_CONST(125580.224237/8.0),
-    REAL_CONST(125605.324594/8.0),
-    REAL_CONST(125630.426205/8.0),
-    REAL_CONST(125655.529071/8.0),
-    REAL_CONST(125680.633189/8.0),
-    REAL_CONST(125705.738562/8.0),
-    REAL_CONST(125730.845188/8.0),
-    REAL_CONST(125755.953067/8.0),
-    REAL_CONST(125781.062200/8.0),
-    REAL_CONST(125806.172586/8.0),
-    REAL_CONST(125831.284225/8.0),
-    REAL_CONST(125856.397117/8.0),
-    REAL_CONST(125881.511262/8.0),
-    REAL_CONST(125906.626659/8.0),
-    REAL_CONST(125931.743309/8.0),
-    REAL_CONST(125956.861211/8.0),
-    REAL_CONST(125981.980366/8.0),
-    REAL_CONST(126007.100773/8.0),
-    REAL_CONST(126032.222432/8.0),
-    REAL_CONST(126057.345343/8.0),
-    REAL_CONST(126082.469505/8.0),
-    REAL_CONST(126107.594919/8.0),
-    REAL_CONST(126132.721585/8.0),
-    REAL_CONST(126157.849502/8.0),
-    REAL_CONST(126182.978671/8.0),
-    REAL_CONST(126208.109090/8.0),
-    REAL_CONST(126233.240761/8.0),
-    REAL_CONST(126258.373683/8.0),
-    REAL_CONST(126283.507855/8.0),
-    REAL_CONST(126308.643278/8.0),
-    REAL_CONST(126333.779952/8.0),
-    REAL_CONST(126358.917876/8.0),
-    REAL_CONST(126384.057051/8.0),
-    REAL_CONST(126409.197475/8.0),
-    REAL_CONST(126434.339150/8.0),
-    REAL_CONST(126459.482074/8.0),
-    REAL_CONST(126484.626249/8.0),
-    REAL_CONST(126509.771673/8.0),
-    REAL_CONST(126534.918346/8.0),
-    REAL_CONST(126560.066269/8.0),
-    REAL_CONST(126585.215442/8.0),
-    REAL_CONST(126610.365863/8.0),
-    REAL_CONST(126635.517534/8.0),
-    REAL_CONST(126660.670453/8.0),
-    REAL_CONST(126685.824622/8.0),
-    REAL_CONST(126710.980039/8.0),
-    REAL_CONST(126736.136704/8.0),
-    REAL_CONST(126761.294618/8.0),
-    REAL_CONST(126786.453780/8.0),
-    REAL_CONST(126811.614191/8.0),
-    REAL_CONST(126836.775849/8.0),
-    REAL_CONST(126861.938756/8.0),
-    REAL_CONST(126887.102910/8.0),
-    REAL_CONST(126912.268312/8.0),
-    REAL_CONST(126937.434962/8.0),
-    REAL_CONST(126962.602859/8.0),
-    REAL_CONST(126987.772003/8.0),
-    REAL_CONST(127012.942395/8.0),
-    REAL_CONST(127038.114034/8.0),
-    REAL_CONST(127063.286919/8.0),
-    REAL_CONST(127088.461052/8.0),
-    REAL_CONST(127113.636431/8.0),
-    REAL_CONST(127138.813057/8.0),
-    REAL_CONST(127163.990929/8.0),
-    REAL_CONST(127189.170047/8.0),
-    REAL_CONST(127214.350412/8.0),
-    REAL_CONST(127239.532023/8.0),
-    REAL_CONST(127264.714880/8.0),
-    REAL_CONST(127289.898982/8.0),
-    REAL_CONST(127315.084331/8.0),
-    REAL_CONST(127340.270925/8.0),
-    REAL_CONST(127365.458764/8.0),
-    REAL_CONST(127390.647849/8.0),
-    REAL_CONST(127415.838179/8.0),
-    REAL_CONST(127441.029754/8.0),
-    REAL_CONST(127466.222574/8.0),
-    REAL_CONST(127491.416639/8.0),
-    REAL_CONST(127516.611949/8.0),
-    REAL_CONST(127541.808503/8.0),
-    REAL_CONST(127567.006302/8.0),
-    REAL_CONST(127592.205345/8.0),
-    REAL_CONST(127617.405632/8.0),
-    REAL_CONST(127642.607164/8.0),
-    REAL_CONST(127667.809939/8.0),
-    REAL_CONST(127693.013959/8.0),
-    REAL_CONST(127718.219222/8.0),
-    REAL_CONST(127743.425729/8.0),
-    REAL_CONST(127768.633479/8.0),
-    REAL_CONST(127793.842473/8.0),
-    REAL_CONST(127819.052710/8.0),
-    REAL_CONST(127844.264190/8.0),
-    REAL_CONST(127869.476913/8.0),
-    REAL_CONST(127894.690879/8.0),
-    REAL_CONST(127919.906088/8.0),
-    REAL_CONST(127945.122539/8.0),
-    REAL_CONST(127970.340233/8.0),
-    REAL_CONST(127995.559169/8.0),
-    REAL_CONST(128020.779348/8.0),
-    REAL_CONST(128046.000769/8.0),
-    REAL_CONST(128071.223431/8.0),
-    REAL_CONST(128096.447336/8.0),
-    REAL_CONST(128121.672483/8.0),
-    REAL_CONST(128146.898871/8.0),
-    REAL_CONST(128172.126501/8.0),
-    REAL_CONST(128197.355372/8.0),
-    REAL_CONST(128222.585484/8.0),
-    REAL_CONST(128247.816838/8.0),
-    REAL_CONST(128273.049433/8.0),
-    REAL_CONST(128298.283268/8.0),
-    REAL_CONST(128323.518345/8.0),
-    REAL_CONST(128348.754662/8.0),
-    REAL_CONST(128373.992220/8.0),
-    REAL_CONST(128399.231018/8.0),
-    REAL_CONST(128424.471056/8.0),
-    REAL_CONST(128449.712335/8.0),
-    REAL_CONST(128474.954854/8.0),
-    REAL_CONST(128500.198612/8.0),
-    REAL_CONST(128525.443611/8.0),
-    REAL_CONST(128550.689849/8.0),
-    REAL_CONST(128575.937327/8.0),
-    REAL_CONST(128601.186045/8.0),
-    REAL_CONST(128626.436001/8.0),
-    REAL_CONST(128651.687197/8.0),
-    REAL_CONST(128676.939632/8.0),
-    REAL_CONST(128702.193306/8.0),
-    REAL_CONST(128727.448219/8.0),
-    REAL_CONST(128752.704371/8.0),
-    REAL_CONST(128777.961761/8.0),
-    REAL_CONST(128803.220390/8.0),
-    REAL_CONST(128828.480257/8.0),
-    REAL_CONST(128853.741363/8.0),
-    REAL_CONST(128879.003706/8.0),
-    REAL_CONST(128904.267288/8.0),
-    REAL_CONST(128929.532107/8.0),
-    REAL_CONST(128954.798165/8.0),
-    REAL_CONST(128980.065460/8.0),
-    REAL_CONST(129005.333992/8.0),
-    REAL_CONST(129030.603762/8.0),
-    REAL_CONST(129055.874769/8.0),
-    REAL_CONST(129081.147013/8.0),
-    REAL_CONST(129106.420495/8.0),
-    REAL_CONST(129131.695213/8.0),
-    REAL_CONST(129156.971168/8.0),
-    REAL_CONST(129182.248360/8.0),
-    REAL_CONST(129207.526788/8.0),
-    REAL_CONST(129232.806453/8.0),
-    REAL_CONST(129258.087354/8.0),
-    REAL_CONST(129283.369491/8.0),
-    REAL_CONST(129308.652865/8.0),
-    REAL_CONST(129333.937474/8.0),
-    REAL_CONST(129359.223319/8.0),
-    REAL_CONST(129384.510400/8.0),
-    REAL_CONST(129409.798716/8.0),
-    REAL_CONST(129435.088268/8.0),
-    REAL_CONST(129460.379056/8.0),
-    REAL_CONST(129485.671078/8.0),
-    REAL_CONST(129510.964336/8.0),
-    REAL_CONST(129536.258829/8.0),
-    REAL_CONST(129561.554556/8.0),
-    REAL_CONST(129586.851518/8.0),
-    REAL_CONST(129612.149715/8.0),
-    REAL_CONST(129637.449147/8.0),
-    REAL_CONST(129662.749812/8.0),
-    REAL_CONST(129688.051713/8.0),
-    REAL_CONST(129713.354847/8.0),
-    REAL_CONST(129738.659215/8.0),
-    REAL_CONST(129763.964817/8.0),
-    REAL_CONST(129789.271653/8.0),
-    REAL_CONST(129814.579723/8.0),
-    REAL_CONST(129839.889026/8.0),
-    REAL_CONST(129865.199562/8.0),
-    REAL_CONST(129890.511332/8.0),
-    REAL_CONST(129915.824335/8.0),
-    REAL_CONST(129941.138572/8.0),
-    REAL_CONST(129966.454041/8.0),
-    REAL_CONST(129991.770743/8.0),
-    REAL_CONST(130017.088677/8.0),
-    REAL_CONST(130042.407844/8.0),
-    REAL_CONST(130067.728244/8.0),
-    REAL_CONST(130093.049876/8.0),
-    REAL_CONST(130118.372740/8.0),
-    REAL_CONST(130143.696837/8.0),
-    REAL_CONST(130169.022165/8.0),
-    REAL_CONST(130194.348725/8.0),
-    REAL_CONST(130219.676517/8.0),
-    REAL_CONST(130245.005541/8.0),
-    REAL_CONST(130270.335796/8.0),
-    REAL_CONST(130295.667282/8.0),
-    REAL_CONST(130321.000000/8.0),
-    REAL_CONST(130346.333949/8.0),
-    REAL_CONST(130371.669129/8.0),
-    REAL_CONST(130397.005540/8.0),
-    REAL_CONST(130422.343181/8.0),
-    REAL_CONST(130447.682054/8.0),
-    REAL_CONST(130473.022156/8.0),
-    REAL_CONST(130498.363490/8.0),
-    REAL_CONST(130523.706053/8.0),
-    REAL_CONST(130549.049847/8.0),
-    REAL_CONST(130574.394871/8.0),
-    REAL_CONST(130599.741125/8.0),
-    REAL_CONST(130625.088608/8.0),
-    REAL_CONST(130650.437322/8.0),
-    REAL_CONST(130675.787264/8.0),
-    REAL_CONST(130701.138437/8.0),
-    REAL_CONST(130726.490839/8.0),
-    REAL_CONST(130751.844470/8.0),
-    REAL_CONST(130777.199330/8.0),
-    REAL_CONST(130802.555419/8.0),
-    REAL_CONST(130827.912737/8.0),
-    REAL_CONST(130853.271284/8.0),
-    REAL_CONST(130878.631059/8.0),
-    REAL_CONST(130903.992063/8.0),
-    REAL_CONST(130929.354295/8.0),
-    REAL_CONST(130954.717756/8.0),
-    REAL_CONST(130980.082445/8.0),
-    REAL_CONST(131005.448362/8.0),
-    REAL_CONST(131030.815506/8.0),
-    REAL_CONST(131056.183879/8.0),
-    REAL_CONST(131081.553479/8.0),
-    REAL_CONST(131106.924307/8.0),
-    REAL_CONST(131132.296362/8.0),
-    REAL_CONST(131157.669645/8.0),
-    REAL_CONST(131183.044155/8.0),
-    REAL_CONST(131208.419892/8.0),
-    REAL_CONST(131233.796855/8.0),
-    REAL_CONST(131259.175046/8.0),
-    REAL_CONST(131284.554464/8.0),
-    REAL_CONST(131309.935108/8.0),
-    REAL_CONST(131335.316978/8.0),
-    REAL_CONST(131360.700075/8.0),
-    REAL_CONST(131386.084399/8.0),
-    REAL_CONST(131411.469948/8.0),
-    REAL_CONST(131436.856724/8.0),
-    REAL_CONST(131462.244725/8.0),
-    REAL_CONST(131487.633952/8.0),
-    REAL_CONST(131513.024405/8.0),
-    REAL_CONST(131538.416083/8.0),
-    REAL_CONST(131563.808987/8.0),
-    REAL_CONST(131589.203116/8.0),
-    REAL_CONST(131614.598471/8.0),
-    REAL_CONST(131639.995050/8.0),
-    REAL_CONST(131665.392854/8.0),
-    REAL_CONST(131690.791884/8.0),
-    REAL_CONST(131716.192138/8.0),
-    REAL_CONST(131741.593616/8.0),
-    REAL_CONST(131766.996319/8.0),
-    REAL_CONST(131792.400247/8.0),
-    REAL_CONST(131817.805398/8.0),
-    REAL_CONST(131843.211774/8.0),
-    REAL_CONST(131868.619374/8.0),
-    REAL_CONST(131894.028198/8.0),
-    REAL_CONST(131919.438245/8.0),
-    REAL_CONST(131944.849517/8.0),
-    REAL_CONST(131970.262011/8.0),
-    REAL_CONST(131995.675730/8.0),
-    REAL_CONST(132021.090671/8.0),
-    REAL_CONST(132046.506836/8.0),
-    REAL_CONST(132071.924224/8.0),
-    REAL_CONST(132097.342834/8.0),
-    REAL_CONST(132122.762668/8.0),
-    REAL_CONST(132148.183724/8.0),
-    REAL_CONST(132173.606003/8.0),
-    REAL_CONST(132199.029504/8.0),
-    REAL_CONST(132224.454228/8.0),
-    REAL_CONST(132249.880174/8.0),
-    REAL_CONST(132275.307342/8.0),
-    REAL_CONST(132300.735733/8.0),
-    REAL_CONST(132326.165345/8.0),
-    REAL_CONST(132351.596179/8.0),
-    REAL_CONST(132377.028234/8.0),
-    REAL_CONST(132402.461511/8.0),
-    REAL_CONST(132427.896010/8.0),
-    REAL_CONST(132453.331729/8.0),
-    REAL_CONST(132478.768671/8.0),
-    REAL_CONST(132504.206833/8.0),
-    REAL_CONST(132529.646216/8.0),
-    REAL_CONST(132555.086820/8.0),
-    REAL_CONST(132580.528644/8.0),
-    REAL_CONST(132605.971690/8.0),
-    REAL_CONST(132631.415955/8.0),
-    REAL_CONST(132656.861441/8.0),
-    REAL_CONST(132682.308148/8.0),
-    REAL_CONST(132707.756074/8.0),
-    REAL_CONST(132733.205221/8.0),
-    REAL_CONST(132758.655587/8.0),
-    REAL_CONST(132784.107174/8.0),
-    REAL_CONST(132809.559980/8.0),
-    REAL_CONST(132835.014005/8.0),
-    REAL_CONST(132860.469250/8.0),
-    REAL_CONST(132885.925714/8.0),
-    REAL_CONST(132911.383398/8.0),
-    REAL_CONST(132936.842300/8.0),
-    REAL_CONST(132962.302422/8.0),
-    REAL_CONST(132987.763762/8.0),
-    REAL_CONST(133013.226321/8.0),
-    REAL_CONST(133038.690099/8.0),
-    REAL_CONST(133064.155095/8.0),
-    REAL_CONST(133089.621310/8.0),
-    REAL_CONST(133115.088743/8.0),
-    REAL_CONST(133140.557394/8.0),
-    REAL_CONST(133166.027263/8.0),
-    REAL_CONST(133191.498350/8.0),
-    REAL_CONST(133216.970655/8.0),
-    REAL_CONST(133242.444178/8.0),
-    REAL_CONST(133267.918918/8.0),
-    REAL_CONST(133293.394876/8.0),
-    REAL_CONST(133318.872051/8.0),
-    REAL_CONST(133344.350443/8.0),
-    REAL_CONST(133369.830052/8.0),
-    REAL_CONST(133395.310878/8.0),
-    REAL_CONST(133420.792921/8.0),
-    REAL_CONST(133446.276181/8.0),
-    REAL_CONST(133471.760658/8.0),
-    REAL_CONST(133497.246351/8.0),
-    REAL_CONST(133522.733261/8.0),
-    REAL_CONST(133548.221386/8.0),
-    REAL_CONST(133573.710728/8.0),
-    REAL_CONST(133599.201286/8.0),
-    REAL_CONST(133624.693060/8.0),
-    REAL_CONST(133650.186050/8.0),
-    REAL_CONST(133675.680256/8.0),
-    REAL_CONST(133701.175677/8.0),
-    REAL_CONST(133726.672314/8.0),
-    REAL_CONST(133752.170166/8.0),
-    REAL_CONST(133777.669233/8.0),
-    REAL_CONST(133803.169515/8.0),
-    REAL_CONST(133828.671013/8.0),
-    REAL_CONST(133854.173725/8.0),
-    REAL_CONST(133879.677652/8.0),
-    REAL_CONST(133905.182794/8.0),
-    REAL_CONST(133930.689150/8.0),
-    REAL_CONST(133956.196721/8.0),
-    REAL_CONST(133981.705506/8.0),
-    REAL_CONST(134007.215506/8.0),
-    REAL_CONST(134032.726719/8.0),
-    REAL_CONST(134058.239147/8.0),
-    REAL_CONST(134083.752788/8.0),
-    REAL_CONST(134109.267643/8.0),
-    REAL_CONST(134134.783712/8.0),
-    REAL_CONST(134160.300994/8.0),
-    REAL_CONST(134185.819489/8.0),
-    REAL_CONST(134211.339198/8.0),
-    REAL_CONST(134236.860120/8.0),
-    REAL_CONST(134262.382255/8.0),
-    REAL_CONST(134287.905604/8.0),
-    REAL_CONST(134313.430164/8.0),
-    REAL_CONST(134338.955938/8.0),
-    REAL_CONST(134364.482924/8.0),
-    REAL_CONST(134390.011123/8.0),
-    REAL_CONST(134415.540534/8.0),
-    REAL_CONST(134441.071157/8.0),
-    REAL_CONST(134466.602993/8.0),
-    REAL_CONST(134492.136040/8.0),
-    REAL_CONST(134517.670300/8.0),
-    REAL_CONST(134543.205771/8.0),
-    REAL_CONST(134568.742454/8.0),
-    REAL_CONST(134594.280348/8.0),
-    REAL_CONST(134619.819454/8.0),
-    REAL_CONST(134645.359771/8.0),
-    REAL_CONST(134670.901299/8.0),
-    REAL_CONST(134696.444039/8.0),
-    REAL_CONST(134721.987989/8.0),
-    REAL_CONST(134747.533151/8.0),
-    REAL_CONST(134773.079523/8.0),
-    REAL_CONST(134798.627106/8.0),
-    REAL_CONST(134824.175899/8.0),
-    REAL_CONST(134849.725902/8.0),
-    REAL_CONST(134875.277116/8.0),
-    REAL_CONST(134900.829541/8.0),
-    REAL_CONST(134926.383175/8.0),
-    REAL_CONST(134951.938019/8.0),
-    REAL_CONST(134977.494073/8.0),
-    REAL_CONST(135003.051337/8.0),
-    REAL_CONST(135028.609810/8.0),
-    REAL_CONST(135054.169493/8.0),
-    REAL_CONST(135079.730385/8.0),
-    REAL_CONST(135105.292487/8.0),
-    REAL_CONST(135130.855798/8.0),
-    REAL_CONST(135156.420317/8.0),
-    REAL_CONST(135181.986046/8.0),
-    REAL_CONST(135207.552983/8.0),
-    REAL_CONST(135233.121129/8.0),
-    REAL_CONST(135258.690484/8.0),
-    REAL_CONST(135284.261047/8.0),
-    REAL_CONST(135309.832819/8.0),
-    REAL_CONST(135335.405799/8.0),
-    REAL_CONST(135360.979987/8.0),
-    REAL_CONST(135386.555383/8.0),
-    REAL_CONST(135412.131986/8.0),
-    REAL_CONST(135437.709798/8.0),
-    REAL_CONST(135463.288817/8.0),
-    REAL_CONST(135488.869044/8.0),
-    REAL_CONST(135514.450478/8.0),
-    REAL_CONST(135540.033120/8.0),
-    REAL_CONST(135565.616969/8.0),
-    REAL_CONST(135591.202025/8.0),
-    REAL_CONST(135616.788287/8.0),
-    REAL_CONST(135642.375757/8.0),
-    REAL_CONST(135667.964434/8.0),
-    REAL_CONST(135693.554317/8.0),
-    REAL_CONST(135719.145407/8.0),
-    REAL_CONST(135744.737703/8.0),
-    REAL_CONST(135770.331205/8.0),
-    REAL_CONST(135795.925914/8.0),
-    REAL_CONST(135821.521828/8.0),
-    REAL_CONST(135847.118949/8.0),
-    REAL_CONST(135872.717275/8.0),
-    REAL_CONST(135898.316808/8.0),
-    REAL_CONST(135923.917545/8.0),
-    REAL_CONST(135949.519489/8.0),
-    REAL_CONST(135975.122637/8.0),
-    REAL_CONST(136000.726991/8.0),
-    REAL_CONST(136026.332551/8.0),
-    REAL_CONST(136051.939315/8.0),
-    REAL_CONST(136077.547284/8.0),
-    REAL_CONST(136103.156458/8.0),
-    REAL_CONST(136128.766837/8.0),
-    REAL_CONST(136154.378420/8.0),
-    REAL_CONST(136179.991208/8.0),
-    REAL_CONST(136205.605200/8.0),
-    REAL_CONST(136231.220396/8.0),
-    REAL_CONST(136256.836797/8.0),
-    REAL_CONST(136282.454401/8.0),
-    REAL_CONST(136308.073210/8.0),
-    REAL_CONST(136333.693222/8.0),
-    REAL_CONST(136359.314438/8.0),
-    REAL_CONST(136384.936858/8.0),
-    REAL_CONST(136410.560481/8.0),
-    REAL_CONST(136436.185307/8.0),
-    REAL_CONST(136461.811337/8.0),
-    REAL_CONST(136487.438570/8.0),
-    REAL_CONST(136513.067006/8.0),
-    REAL_CONST(136538.696644/8.0),
-    REAL_CONST(136564.327486/8.0),
-    REAL_CONST(136589.959530/8.0),
-    REAL_CONST(136615.592777/8.0),
-    REAL_CONST(136641.227226/8.0),
-    REAL_CONST(136666.862877/8.0),
-    REAL_CONST(136692.499731/8.0),
-    REAL_CONST(136718.137787/8.0),
-    REAL_CONST(136743.777045/8.0),
-    REAL_CONST(136769.417505/8.0),
-    REAL_CONST(136795.059166/8.0),
-    REAL_CONST(136820.702029/8.0),
-    REAL_CONST(136846.346094/8.0),
-    REAL_CONST(136871.991360/8.0),
-    REAL_CONST(136897.637828/8.0),
-    REAL_CONST(136923.285496/8.0),
-    REAL_CONST(136948.934366/8.0),
-    REAL_CONST(136974.584437/8.0),
-    REAL_CONST(137000.235709/8.0),
-    REAL_CONST(137025.888181/8.0),
-    REAL_CONST(137051.541854/8.0),
-    REAL_CONST(137077.196728/8.0),
-    REAL_CONST(137102.852802/8.0),
-    REAL_CONST(137128.510076/8.0),
-    REAL_CONST(137154.168551/8.0),
-    REAL_CONST(137179.828225/8.0),
-    REAL_CONST(137205.489100/8.0),
-    REAL_CONST(137231.151174/8.0),
-    REAL_CONST(137256.814449/8.0),
-    REAL_CONST(137282.478922/8.0),
-    REAL_CONST(137308.144596/8.0),
-    REAL_CONST(137333.811469/8.0),
-    REAL_CONST(137359.479541/8.0),
-    REAL_CONST(137385.148812/8.0),
-    REAL_CONST(137410.819282/8.0),
-    REAL_CONST(137436.490952/8.0),
-    REAL_CONST(137462.163820/8.0),
-    REAL_CONST(137487.837887/8.0),
-    REAL_CONST(137513.513152/8.0),
-    REAL_CONST(137539.189617/8.0),
-    REAL_CONST(137564.867279/8.0),
-    REAL_CONST(137590.546140/8.0),
-    REAL_CONST(137616.226199/8.0),
-    REAL_CONST(137641.907456/8.0),
-    REAL_CONST(137667.589911/8.0),
-    REAL_CONST(137693.273564/8.0),
-    REAL_CONST(137718.958414/8.0),
-    REAL_CONST(137744.644462/8.0),
-    REAL_CONST(137770.331708/8.0),
-    REAL_CONST(137796.020151/8.0),
-    REAL_CONST(137821.709792/8.0),
-    REAL_CONST(137847.400629/8.0),
-    REAL_CONST(137873.092664/8.0),
-    REAL_CONST(137898.785896/8.0),
-    REAL_CONST(137924.480324/8.0),
-    REAL_CONST(137950.175949/8.0),
-    REAL_CONST(137975.872771/8.0),
-    REAL_CONST(138001.570789/8.0),
-    REAL_CONST(138027.270004/8.0),
-    REAL_CONST(138052.970415/8.0),
-    REAL_CONST(138078.672022/8.0),
-    REAL_CONST(138104.374826/8.0),
-    REAL_CONST(138130.078825/8.0),
-    REAL_CONST(138155.784020/8.0),
-    REAL_CONST(138181.490410/8.0),
-    REAL_CONST(138207.197997/8.0),
-    REAL_CONST(138232.906779/8.0),
-    REAL_CONST(138258.616756/8.0),
-    REAL_CONST(138284.327929/8.0),
-    REAL_CONST(138310.040296/8.0),
-    REAL_CONST(138335.753859/8.0),
-    REAL_CONST(138361.468617/8.0),
-    REAL_CONST(138387.184569/8.0),
-    REAL_CONST(138412.901717/8.0),
-    REAL_CONST(138438.620059/8.0),
-    REAL_CONST(138464.339595/8.0),
-    REAL_CONST(138490.060326/8.0),
-    REAL_CONST(138515.782251/8.0),
-    REAL_CONST(138541.505370/8.0),
-    REAL_CONST(138567.229684/8.0),
-    REAL_CONST(138592.955191/8.0),
-    REAL_CONST(138618.681892/8.0),
-    REAL_CONST(138644.409787/8.0),
-    REAL_CONST(138670.138876/8.0),
-    REAL_CONST(138695.869158/8.0),
-    REAL_CONST(138721.600633/8.0),
-    REAL_CONST(138747.333302/8.0),
-    REAL_CONST(138773.067164/8.0),
-    REAL_CONST(138798.802219/8.0),
-    REAL_CONST(138824.538467/8.0),
-    REAL_CONST(138850.275907/8.0),
-    REAL_CONST(138876.014541/8.0),
-    REAL_CONST(138901.754367/8.0),
-    REAL_CONST(138927.495386/8.0),
-    REAL_CONST(138953.237597/8.0),
-    REAL_CONST(138978.981000/8.0),
-    REAL_CONST(139004.725596/8.0),
-    REAL_CONST(139030.471383/8.0),
-    REAL_CONST(139056.218363/8.0),
-    REAL_CONST(139081.966534/8.0),
-    REAL_CONST(139107.715897/8.0),
-    REAL_CONST(139133.466452/8.0),
-    REAL_CONST(139159.218198/8.0),
-    REAL_CONST(139184.971136/8.0),
-    REAL_CONST(139210.725265/8.0),
-    REAL_CONST(139236.480585/8.0),
-    REAL_CONST(139262.237097/8.0),
-    REAL_CONST(139287.994799/8.0),
-    REAL_CONST(139313.753692/8.0),
-    REAL_CONST(139339.513776/8.0),
-    REAL_CONST(139365.275050/8.0),
-    REAL_CONST(139391.037515/8.0),
-    REAL_CONST(139416.801171/8.0),
-    REAL_CONST(139442.566017/8.0),
-    REAL_CONST(139468.332052/8.0),
-    REAL_CONST(139494.099279/8.0),
-    REAL_CONST(139519.867695/8.0),
-    REAL_CONST(139545.637300/8.0),
-    REAL_CONST(139571.408096/8.0),
-    REAL_CONST(139597.180081/8.0),
-    REAL_CONST(139622.953256/8.0),
-    REAL_CONST(139648.727621/8.0),
-    REAL_CONST(139674.503174/8.0),
-    REAL_CONST(139700.279917/8.0),
-    REAL_CONST(139726.057849/8.0),
-    REAL_CONST(139751.836970/8.0),
-    REAL_CONST(139777.617280/8.0),
-    REAL_CONST(139803.398778/8.0),
-    REAL_CONST(139829.181465/8.0),
-    REAL_CONST(139854.965341/8.0),
-    REAL_CONST(139880.750405/8.0),
-    REAL_CONST(139906.536658/8.0),
-    REAL_CONST(139932.324099/8.0),
-    REAL_CONST(139958.112728/8.0),
-    REAL_CONST(139983.902544/8.0),
-    REAL_CONST(140009.693549/8.0),
-    REAL_CONST(140035.485742/8.0),
-    REAL_CONST(140061.279122/8.0),
-    REAL_CONST(140087.073690/8.0),
-    REAL_CONST(140112.869445/8.0),
-    REAL_CONST(140138.666388/8.0),
-    REAL_CONST(140164.464518/8.0),
-    REAL_CONST(140190.263835/8.0),
-    REAL_CONST(140216.064339/8.0),
-    REAL_CONST(140241.866030/8.0),
-    REAL_CONST(140267.668907/8.0),
-    REAL_CONST(140293.472972/8.0),
-    REAL_CONST(140319.278223/8.0),
-    REAL_CONST(140345.084660/8.0),
-    REAL_CONST(140370.892284/8.0),
-    REAL_CONST(140396.701094/8.0),
-    REAL_CONST(140422.511090/8.0),
-    REAL_CONST(140448.322273/8.0),
-    REAL_CONST(140474.134641/8.0),
-    REAL_CONST(140499.948195/8.0),
-    REAL_CONST(140525.762935/8.0),
-    REAL_CONST(140551.578860/8.0),
-    REAL_CONST(140577.395971/8.0),
-    REAL_CONST(140603.214267/8.0),
-    REAL_CONST(140629.033749/8.0),
-    REAL_CONST(140654.854416/8.0),
-    REAL_CONST(140680.676267/8.0),
-    REAL_CONST(140706.499304/8.0),
-    REAL_CONST(140732.323526/8.0),
-    REAL_CONST(140758.148932/8.0),
-    REAL_CONST(140783.975523/8.0),
-    REAL_CONST(140809.803298/8.0),
-    REAL_CONST(140835.632258/8.0),
-    REAL_CONST(140861.462402/8.0),
-    REAL_CONST(140887.293730/8.0),
-    REAL_CONST(140913.126243/8.0),
-    REAL_CONST(140938.959939/8.0),
-    REAL_CONST(140964.794819/8.0),
-    REAL_CONST(140990.630883/8.0),
-    REAL_CONST(141016.468131/8.0),
-    REAL_CONST(141042.306562/8.0),
-    REAL_CONST(141068.146177/8.0),
-    REAL_CONST(141093.986975/8.0),
-    REAL_CONST(141119.828956/8.0),
-    REAL_CONST(141145.672120/8.0),
-    REAL_CONST(141171.516467/8.0),
-    REAL_CONST(141197.361998/8.0),
-    REAL_CONST(141223.208710/8.0),
-    REAL_CONST(141249.056606/8.0),
-    REAL_CONST(141274.905684/8.0),
-    REAL_CONST(141300.755945/8.0),
-    REAL_CONST(141326.607388/8.0),
-    REAL_CONST(141352.460013/8.0),
-    REAL_CONST(141378.313820/8.0),
-    REAL_CONST(141404.168810/8.0),
-    REAL_CONST(141430.024981/8.0),
-    REAL_CONST(141455.882334/8.0),
-    REAL_CONST(141481.740869/8.0),
-    REAL_CONST(141507.600585/8.0),
-    REAL_CONST(141533.461483/8.0),
-    REAL_CONST(141559.323562/8.0),
-    REAL_CONST(141585.186823/8.0),
-    REAL_CONST(141611.051264/8.0),
-    REAL_CONST(141636.916887/8.0),
-    REAL_CONST(141662.783691/8.0),
-    REAL_CONST(141688.651675/8.0),
-    REAL_CONST(141714.520840/8.0),
-    REAL_CONST(141740.391186/8.0),
-    REAL_CONST(141766.262713/8.0),
-    REAL_CONST(141792.135419/8.0),
-    REAL_CONST(141818.009306/8.0),
-    REAL_CONST(141843.884374/8.0),
-    REAL_CONST(141869.760621/8.0),
-    REAL_CONST(141895.638048/8.0),
-    REAL_CONST(141921.516655/8.0),
-    REAL_CONST(141947.396442/8.0),
-    REAL_CONST(141973.277409/8.0),
-    REAL_CONST(141999.159555/8.0),
-    REAL_CONST(142025.042881/8.0),
-    REAL_CONST(142050.927385/8.0),
-    REAL_CONST(142076.813070/8.0),
-    REAL_CONST(142102.699933/8.0),
-    REAL_CONST(142128.587975/8.0),
-    REAL_CONST(142154.477196/8.0),
-    REAL_CONST(142180.367596/8.0),
-    REAL_CONST(142206.259175/8.0),
-    REAL_CONST(142232.151932/8.0),
-    REAL_CONST(142258.045867/8.0),
-    REAL_CONST(142283.940981/8.0),
-    REAL_CONST(142309.837274/8.0),
-    REAL_CONST(142335.734744/8.0),
-    REAL_CONST(142361.633393/8.0),
-    REAL_CONST(142387.533219/8.0),
-    REAL_CONST(142413.434223/8.0),
-    REAL_CONST(142439.336405/8.0),
-    REAL_CONST(142465.239765/8.0),
-    REAL_CONST(142491.144302/8.0),
-    REAL_CONST(142517.050016/8.0),
-    REAL_CONST(142542.956908/8.0),
-    REAL_CONST(142568.864977/8.0),
-    REAL_CONST(142594.774223/8.0),
-    REAL_CONST(142620.684646/8.0),
-    REAL_CONST(142646.596246/8.0),
-    REAL_CONST(142672.509022/8.0),
-    REAL_CONST(142698.422975/8.0),
-    REAL_CONST(142724.338105/8.0),
-    REAL_CONST(142750.254411/8.0),
-    REAL_CONST(142776.171894/8.0),
-    REAL_CONST(142802.090553/8.0),
-    REAL_CONST(142828.010388/8.0),
-    REAL_CONST(142853.931399/8.0),
-    REAL_CONST(142879.853585/8.0),
-    REAL_CONST(142905.776948/8.0),
-    REAL_CONST(142931.701486/8.0),
-    REAL_CONST(142957.627200/8.0),
-    REAL_CONST(142983.554090/8.0),
-    REAL_CONST(143009.482154/8.0),
-    REAL_CONST(143035.411394/8.0),
-    REAL_CONST(143061.341809/8.0),
-    REAL_CONST(143087.273400/8.0),
-    REAL_CONST(143113.206165/8.0),
-    REAL_CONST(143139.140105/8.0),
-    REAL_CONST(143165.075219/8.0),
-    REAL_CONST(143191.011509/8.0),
-    REAL_CONST(143216.948973/8.0),
-    REAL_CONST(143242.887611/8.0),
-    REAL_CONST(143268.827423/8.0),
-    REAL_CONST(143294.768410/8.0),
-    REAL_CONST(143320.710571/8.0),
-    REAL_CONST(143346.653906/8.0),
-    REAL_CONST(143372.598415/8.0),
-    REAL_CONST(143398.544097/8.0),
-    REAL_CONST(143424.490953/8.0),
-    REAL_CONST(143450.438983/8.0),
-    REAL_CONST(143476.388186/8.0),
-    REAL_CONST(143502.338563/8.0),
-    REAL_CONST(143528.290112/8.0),
-    REAL_CONST(143554.242835/8.0),
-    REAL_CONST(143580.196731/8.0),
-    REAL_CONST(143606.151800/8.0),
-    REAL_CONST(143632.108042/8.0),
-    REAL_CONST(143658.065456/8.0),
-    REAL_CONST(143684.024043/8.0),
-    REAL_CONST(143709.983803/8.0),
-    REAL_CONST(143735.944735/8.0),
-    REAL_CONST(143761.906839/8.0),
-    REAL_CONST(143787.870115/8.0),
-    REAL_CONST(143813.834564/8.0),
-    REAL_CONST(143839.800184/8.0),
-    REAL_CONST(143865.766976/8.0),
-    REAL_CONST(143891.734940/8.0),
-    REAL_CONST(143917.704076/8.0),
-    REAL_CONST(143943.674383/8.0),
-    REAL_CONST(143969.645862/8.0),
-    REAL_CONST(143995.618512/8.0),
-    REAL_CONST(144021.592333/8.0),
-    REAL_CONST(144047.567326/8.0),
-    REAL_CONST(144073.543489/8.0),
-    REAL_CONST(144099.520823/8.0),
-    REAL_CONST(144125.499329/8.0),
-    REAL_CONST(144151.479004/8.0),
-    REAL_CONST(144177.459851/8.0),
-    REAL_CONST(144203.441868/8.0),
-    REAL_CONST(144229.425055/8.0),
-    REAL_CONST(144255.409413/8.0),
-    REAL_CONST(144281.394940/8.0),
-    REAL_CONST(144307.381638/8.0),
-    REAL_CONST(144333.369506/8.0),
-    REAL_CONST(144359.358544/8.0),
-    REAL_CONST(144385.348751/8.0),
-    REAL_CONST(144411.340128/8.0),
-    REAL_CONST(144437.332675/8.0),
-    REAL_CONST(144463.326391/8.0),
-    REAL_CONST(144489.321276/8.0),
-    REAL_CONST(144515.317331/8.0),
-    REAL_CONST(144541.314555/8.0),
-    REAL_CONST(144567.312947/8.0),
-    REAL_CONST(144593.312509/8.0),
-    REAL_CONST(144619.313240/8.0),
-    REAL_CONST(144645.315139/8.0),
-    REAL_CONST(144671.318207/8.0),
-    REAL_CONST(144697.322443/8.0),
-    REAL_CONST(144723.327848/8.0),
-    REAL_CONST(144749.334421/8.0),
-    REAL_CONST(144775.342162/8.0),
-    REAL_CONST(144801.351071/8.0),
-    REAL_CONST(144827.361148/8.0),
-    REAL_CONST(144853.372393/8.0),
-    REAL_CONST(144879.384806/8.0),
-    REAL_CONST(144905.398386/8.0),
-    REAL_CONST(144931.413134/8.0),
-    REAL_CONST(144957.429050/8.0),
-    REAL_CONST(144983.446133/8.0),
-    REAL_CONST(145009.464383/8.0),
-    REAL_CONST(145035.483800/8.0),
-    REAL_CONST(145061.504384/8.0),
-    REAL_CONST(145087.526135/8.0),
-    REAL_CONST(145113.549053/8.0),
-    REAL_CONST(145139.573138/8.0),
-    REAL_CONST(145165.598389/8.0),
-    REAL_CONST(145191.624807/8.0),
-    REAL_CONST(145217.652391/8.0),
-    REAL_CONST(145243.681141/8.0),
-    REAL_CONST(145269.711058/8.0),
-    REAL_CONST(145295.742140/8.0),
-    REAL_CONST(145321.774389/8.0),
-    REAL_CONST(145347.807804/8.0),
-    REAL_CONST(145373.842384/8.0),
-    REAL_CONST(145399.878130/8.0),
-    REAL_CONST(145425.915041/8.0),
-    REAL_CONST(145451.953119/8.0),
-    REAL_CONST(145477.992361/8.0),
-    REAL_CONST(145504.032768/8.0),
-    REAL_CONST(145530.074341/8.0),
-    REAL_CONST(145556.117079/8.0),
-    REAL_CONST(145582.160982/8.0),
-    REAL_CONST(145608.206049/8.0),
-    REAL_CONST(145634.252282/8.0),
-    REAL_CONST(145660.299679/8.0),
-    REAL_CONST(145686.348240/8.0),
-    REAL_CONST(145712.397966/8.0),
-    REAL_CONST(145738.448856/8.0),
-    REAL_CONST(145764.500910/8.0),
-    REAL_CONST(145790.554129/8.0),
-    REAL_CONST(145816.608511/8.0),
-    REAL_CONST(145842.664058/8.0),
-    REAL_CONST(145868.720768/8.0),
-    REAL_CONST(145894.778642/8.0),
-    REAL_CONST(145920.837679/8.0),
-    REAL_CONST(145946.897880/8.0),
-    REAL_CONST(145972.959244/8.0),
-    REAL_CONST(145999.021772/8.0),
-    REAL_CONST(146025.085463/8.0),
-    REAL_CONST(146051.150317/8.0),
-    REAL_CONST(146077.216333/8.0),
-    REAL_CONST(146103.283513/8.0),
-    REAL_CONST(146129.351855/8.0),
-    REAL_CONST(146155.421360/8.0),
-    REAL_CONST(146181.492028/8.0),
-    REAL_CONST(146207.563858/8.0),
-    REAL_CONST(146233.636850/8.0),
-    REAL_CONST(146259.711005/8.0),
-    REAL_CONST(146285.786321/8.0),
-    REAL_CONST(146311.862800/8.0),
-    REAL_CONST(146337.940441/8.0),
-    REAL_CONST(146364.019243/8.0),
-    REAL_CONST(146390.099208/8.0),
-    REAL_CONST(146416.180333/8.0),
-    REAL_CONST(146442.262621/8.0),
-    REAL_CONST(146468.346069/8.0),
-    REAL_CONST(146494.430679/8.0),
-    REAL_CONST(146520.516451/8.0),
-    REAL_CONST(146546.603383/8.0),
-    REAL_CONST(146572.691476/8.0),
-    REAL_CONST(146598.780731/8.0),
-    REAL_CONST(146624.871146/8.0),
-    REAL_CONST(146650.962721/8.0),
-    REAL_CONST(146677.055457/8.0),
-    REAL_CONST(146703.149354/8.0),
-    REAL_CONST(146729.244411/8.0),
-    REAL_CONST(146755.340629/8.0),
-    REAL_CONST(146781.438006/8.0),
-    REAL_CONST(146807.536544/8.0),
-    REAL_CONST(146833.636241/8.0),
-    REAL_CONST(146859.737099/8.0),
-    REAL_CONST(146885.839116/8.0),
-    REAL_CONST(146911.942293/8.0),
-    REAL_CONST(146938.046629/8.0),
-    REAL_CONST(146964.152125/8.0),
-    REAL_CONST(146990.258780/8.0),
-    REAL_CONST(147016.366595/8.0),
-    REAL_CONST(147042.475568/8.0),
-    REAL_CONST(147068.585701/8.0),
-    REAL_CONST(147094.696992/8.0),
-    REAL_CONST(147120.809443/8.0),
-    REAL_CONST(147146.923052/8.0),
-    REAL_CONST(147173.037819/8.0),
-    REAL_CONST(147199.153746/8.0),
-    REAL_CONST(147225.270830/8.0),
-    REAL_CONST(147251.389073/8.0),
-    REAL_CONST(147277.508474/8.0),
-    REAL_CONST(147303.629034/8.0),
-    REAL_CONST(147329.750751/8.0),
-    REAL_CONST(147355.873626/8.0),
-    REAL_CONST(147381.997659/8.0),
-    REAL_CONST(147408.122850/8.0),
-    REAL_CONST(147434.249198/8.0),
-    REAL_CONST(147460.376704/8.0),
-    REAL_CONST(147486.505367/8.0),
-    REAL_CONST(147512.635187/8.0),
-    REAL_CONST(147538.766165/8.0),
-    REAL_CONST(147564.898300/8.0),
-    REAL_CONST(147591.031591/8.0),
-    REAL_CONST(147617.166040/8.0),
-    REAL_CONST(147643.301645/8.0),
-    REAL_CONST(147669.438407/8.0),
-    REAL_CONST(147695.576326/8.0),
-    REAL_CONST(147721.715401/8.0),
-    REAL_CONST(147747.855632/8.0),
-    REAL_CONST(147773.997020/8.0),
-    REAL_CONST(147800.139564/8.0),
-    REAL_CONST(147826.283264/8.0),
-    REAL_CONST(147852.428119/8.0),
-    REAL_CONST(147878.574131/8.0),
-    REAL_CONST(147904.721299/8.0),
-    REAL_CONST(147930.869622/8.0),
-    REAL_CONST(147957.019100/8.0),
-    REAL_CONST(147983.169734/8.0),
-    REAL_CONST(148009.321524/8.0),
-    REAL_CONST(148035.474469/8.0),
-    REAL_CONST(148061.628568/8.0),
-    REAL_CONST(148087.783823/8.0),
-    REAL_CONST(148113.940233/8.0),
-    REAL_CONST(148140.097798/8.0),
-    REAL_CONST(148166.256517/8.0),
-    REAL_CONST(148192.416391/8.0),
-    REAL_CONST(148218.577420/8.0),
-    REAL_CONST(148244.739603/8.0),
-    REAL_CONST(148270.902940/8.0),
-    REAL_CONST(148297.067431/8.0),
-    REAL_CONST(148323.233077/8.0),
-    REAL_CONST(148349.399877/8.0),
-    REAL_CONST(148375.567830/8.0),
-    REAL_CONST(148401.736938/8.0),
-    REAL_CONST(148427.907199/8.0),
-    REAL_CONST(148454.078613/8.0),
-    REAL_CONST(148480.251182/8.0),
-    REAL_CONST(148506.424903/8.0),
-    REAL_CONST(148532.599778/8.0),
-    REAL_CONST(148558.775806/8.0),
-    REAL_CONST(148584.952987/8.0),
-    REAL_CONST(148611.131322/8.0),
-    REAL_CONST(148637.310809/8.0),
-    REAL_CONST(148663.491449/8.0),
-    REAL_CONST(148689.673241/8.0),
-    REAL_CONST(148715.856187/8.0),
-    REAL_CONST(148742.040284/8.0),
-    REAL_CONST(148768.225534/8.0),
-    REAL_CONST(148794.411937/8.0),
-    REAL_CONST(148820.599491/8.0),
-    REAL_CONST(148846.788198/8.0),
-    REAL_CONST(148872.978057/8.0),
-    REAL_CONST(148899.169067/8.0),
-    REAL_CONST(148925.361230/8.0),
-    REAL_CONST(148951.554544/8.0),
-    REAL_CONST(148977.749009/8.0),
-    REAL_CONST(149003.944626/8.0),
-    REAL_CONST(149030.141395/8.0),
-    REAL_CONST(149056.339315/8.0),
-    REAL_CONST(149082.538386/8.0),
-    REAL_CONST(149108.738608/8.0),
-    REAL_CONST(149134.939981/8.0),
-    REAL_CONST(149161.142504/8.0),
-    REAL_CONST(149187.346179/8.0),
-    REAL_CONST(149213.551004/8.0),
-    REAL_CONST(149239.756980/8.0),
-    REAL_CONST(149265.964106/8.0),
-    REAL_CONST(149292.172383/8.0),
-    REAL_CONST(149318.381810/8.0),
-    REAL_CONST(149344.592387/8.0),
-    REAL_CONST(149370.804115/8.0),
-    REAL_CONST(149397.016992/8.0),
-    REAL_CONST(149423.231019/8.0),
-    REAL_CONST(149449.446196/8.0),
-    REAL_CONST(149475.662522/8.0),
-    REAL_CONST(149501.879998/8.0),
-    REAL_CONST(149528.098623/8.0),
-    REAL_CONST(149554.318398/8.0),
-    REAL_CONST(149580.539322/8.0),
-    REAL_CONST(149606.761396/8.0),
-    REAL_CONST(149632.984618/8.0),
-    REAL_CONST(149659.208989/8.0),
-    REAL_CONST(149685.434509/8.0),
-    REAL_CONST(149711.661178/8.0),
-    REAL_CONST(149737.888996/8.0),
-    REAL_CONST(149764.117962/8.0),
-    REAL_CONST(149790.348076/8.0),
-    REAL_CONST(149816.579339/8.0),
-    REAL_CONST(149842.811751/8.0),
-    REAL_CONST(149869.045310/8.0),
-    REAL_CONST(149895.280017/8.0),
-    REAL_CONST(149921.515873/8.0),
-    REAL_CONST(149947.752876/8.0),
-    REAL_CONST(149973.991027/8.0),
-    REAL_CONST(150000.230325/8.0),
-    REAL_CONST(150026.470771/8.0),
-    REAL_CONST(150052.712365/8.0),
-    REAL_CONST(150078.955106/8.0),
-    REAL_CONST(150105.198994/8.0),
-    REAL_CONST(150131.444029/8.0),
-    REAL_CONST(150157.690212/8.0),
-    REAL_CONST(150183.937541/8.0),
-    REAL_CONST(150210.186017/8.0),
-    REAL_CONST(150236.435640/8.0),
-    REAL_CONST(150262.686410/8.0),
-    REAL_CONST(150288.938326/8.0),
-    REAL_CONST(150315.191388/8.0),
-    REAL_CONST(150341.445597/8.0),
-    REAL_CONST(150367.700952/8.0),
-    REAL_CONST(150393.957453/8.0),
-    REAL_CONST(150420.215101/8.0),
-    REAL_CONST(150446.473894/8.0),
-    REAL_CONST(150472.733833/8.0),
-    REAL_CONST(150498.994918/8.0),
-    REAL_CONST(150525.257149/8.0),
-    REAL_CONST(150551.520525/8.0),
-    REAL_CONST(150577.785046/8.0),
-    REAL_CONST(150604.050713/8.0),
-    REAL_CONST(150630.317525/8.0),
-    REAL_CONST(150656.585482/8.0),
-    REAL_CONST(150682.854585/8.0),
-    REAL_CONST(150709.124832/8.0),
-    REAL_CONST(150735.396224/8.0),
-    REAL_CONST(150761.668761/8.0),
-    REAL_CONST(150787.942442/8.0),
-    REAL_CONST(150814.217268/8.0),
-    REAL_CONST(150840.493239/8.0),
-    REAL_CONST(150866.770354/8.0),
-    REAL_CONST(150893.048613/8.0),
-    REAL_CONST(150919.328016/8.0),
-    REAL_CONST(150945.608563/8.0),
-    REAL_CONST(150971.890255/8.0),
-    REAL_CONST(150998.173090/8.0),
-    REAL_CONST(151024.457068/8.0),
-    REAL_CONST(151050.742191/8.0),
-    REAL_CONST(151077.028457/8.0),
-    REAL_CONST(151103.315866/8.0),
-    REAL_CONST(151129.604419/8.0),
-    REAL_CONST(151155.894115/8.0),
-    REAL_CONST(151182.184955/8.0),
-    REAL_CONST(151208.476937/8.0),
-    REAL_CONST(151234.770062/8.0),
-    REAL_CONST(151261.064330/8.0),
-    REAL_CONST(151287.359741/8.0),
-    REAL_CONST(151313.656295/8.0),
-    REAL_CONST(151339.953991/8.0),
-    REAL_CONST(151366.252829/8.0),
-    REAL_CONST(151392.552810/8.0),
-    REAL_CONST(151418.853934/8.0),
-    REAL_CONST(151445.156199/8.0),
-    REAL_CONST(151471.459606/8.0),
-    REAL_CONST(151497.764156/8.0),
-    REAL_CONST(151524.069847/8.0),
-    REAL_CONST(151550.376680/8.0),
-    REAL_CONST(151576.684655/8.0),
-    REAL_CONST(151602.993771/8.0),
-    REAL_CONST(151629.304028/8.0),
-    REAL_CONST(151655.615427/8.0),
-    REAL_CONST(151681.927968/8.0),
-    REAL_CONST(151708.241649/8.0),
-    REAL_CONST(151734.556472/8.0),
-    REAL_CONST(151760.872435/8.0),
-    REAL_CONST(151787.189540/8.0),
-    REAL_CONST(151813.507785/8.0),
-    REAL_CONST(151839.827171/8.0),
-    REAL_CONST(151866.147697/8.0),
-    REAL_CONST(151892.469364/8.0),
-    REAL_CONST(151918.792172/8.0),
-    REAL_CONST(151945.116119/8.0),
-    REAL_CONST(151971.441207/8.0),
-    REAL_CONST(151997.767435/8.0),
-    REAL_CONST(152024.094803/8.0),
-    REAL_CONST(152050.423310/8.0),
-    REAL_CONST(152076.752958/8.0),
-    REAL_CONST(152103.083745/8.0),
-    REAL_CONST(152129.415672/8.0),
-    REAL_CONST(152155.748738/8.0),
-    REAL_CONST(152182.082944/8.0),
-    REAL_CONST(152208.418289/8.0),
-    REAL_CONST(152234.754773/8.0),
-    REAL_CONST(152261.092396/8.0),
-    REAL_CONST(152287.431158/8.0),
-    REAL_CONST(152313.771060/8.0),
-    REAL_CONST(152340.112100/8.0),
-    REAL_CONST(152366.454278/8.0),
-    REAL_CONST(152392.797595/8.0),
-    REAL_CONST(152419.142051/8.0),
-    REAL_CONST(152445.487645/8.0),
-    REAL_CONST(152471.834378/8.0),
-    REAL_CONST(152498.182249/8.0),
-    REAL_CONST(152524.531257/8.0),
-    REAL_CONST(152550.881404/8.0),
-    REAL_CONST(152577.232689/8.0),
-    REAL_CONST(152603.585111/8.0),
-    REAL_CONST(152629.938672/8.0),
-    REAL_CONST(152656.293370/8.0),
-    REAL_CONST(152682.649205/8.0),
-    REAL_CONST(152709.006178/8.0),
-    REAL_CONST(152735.364288/8.0),
-    REAL_CONST(152761.723535/8.0),
-    REAL_CONST(152788.083920/8.0),
-    REAL_CONST(152814.445442/8.0),
-    REAL_CONST(152840.808100/8.0),
-    REAL_CONST(152867.171895/8.0),
-    REAL_CONST(152893.536827/8.0),
-    REAL_CONST(152919.902896/8.0),
-    REAL_CONST(152946.270101/8.0),
-    REAL_CONST(152972.638443/8.0),
-    REAL_CONST(152999.007921/8.0),
-    REAL_CONST(153025.378535/8.0),
-    REAL_CONST(153051.750286/8.0),
-    REAL_CONST(153078.123172/8.0),
-    REAL_CONST(153104.497195/8.0),
-    REAL_CONST(153130.872353/8.0),
-    REAL_CONST(153157.248647/8.0),
-    REAL_CONST(153183.626077/8.0),
-    REAL_CONST(153210.004642/8.0),
-    REAL_CONST(153236.384343/8.0),
-    REAL_CONST(153262.765179/8.0),
-    REAL_CONST(153289.147150/8.0),
-    REAL_CONST(153315.530257/8.0),
-    REAL_CONST(153341.914499/8.0),
-    REAL_CONST(153368.299875/8.0),
-    REAL_CONST(153394.686387/8.0),
-    REAL_CONST(153421.074033/8.0),
-    REAL_CONST(153447.462814/8.0),
-    REAL_CONST(153473.852729/8.0),
-    REAL_CONST(153500.243779/8.0),
-    REAL_CONST(153526.635964/8.0),
-    REAL_CONST(153553.029283/8.0),
-    REAL_CONST(153579.423735/8.0),
-    REAL_CONST(153605.819322/8.0),
-    REAL_CONST(153632.216043/8.0),
-    REAL_CONST(153658.613898/8.0),
-    REAL_CONST(153685.012887/8.0),
-    REAL_CONST(153711.413010/8.0),
-    REAL_CONST(153737.814266/8.0),
-    REAL_CONST(153764.216655/8.0),
-    REAL_CONST(153790.620178/8.0),
-    REAL_CONST(153817.024834/8.0),
-    REAL_CONST(153843.430624/8.0),
-    REAL_CONST(153869.837547/8.0),
-    REAL_CONST(153896.245602/8.0),
-    REAL_CONST(153922.654791/8.0),
-    REAL_CONST(153949.065112/8.0),
-    REAL_CONST(153975.476566/8.0),
-    REAL_CONST(154001.889153/8.0),
-    REAL_CONST(154028.302873/8.0),
-    REAL_CONST(154054.717724/8.0),
-    REAL_CONST(154081.133709/8.0),
-    REAL_CONST(154107.550825/8.0),
-    REAL_CONST(154133.969074/8.0),
-    REAL_CONST(154160.388454/8.0),
-    REAL_CONST(154186.808967/8.0),
-    REAL_CONST(154213.230611/8.0),
-    REAL_CONST(154239.653387/8.0),
-    REAL_CONST(154266.077295/8.0),
-    REAL_CONST(154292.502335/8.0),
-    REAL_CONST(154318.928506/8.0),
-    REAL_CONST(154345.355808/8.0),
-    REAL_CONST(154371.784241/8.0),
-    REAL_CONST(154398.213806/8.0),
-    REAL_CONST(154424.644502/8.0),
-    REAL_CONST(154451.076329/8.0),
-    REAL_CONST(154477.509287/8.0),
-    REAL_CONST(154503.943375/8.0),
-    REAL_CONST(154530.378594/8.0),
-    REAL_CONST(154556.814944/8.0),
-    REAL_CONST(154583.252425/8.0),
-    REAL_CONST(154609.691035/8.0),
-    REAL_CONST(154636.130776/8.0),
-    REAL_CONST(154662.571648/8.0),
-    REAL_CONST(154689.013649/8.0),
-    REAL_CONST(154715.456781/8.0),
-    REAL_CONST(154741.901042/8.0),
-    REAL_CONST(154768.346433/8.0),
-    REAL_CONST(154794.792954/8.0),
-    REAL_CONST(154821.240605/8.0),
-    REAL_CONST(154847.689385/8.0),
-    REAL_CONST(154874.139294/8.0),
-    REAL_CONST(154900.590333/8.0),
-    REAL_CONST(154927.042501/8.0),
-    REAL_CONST(154953.495799/8.0),
-    REAL_CONST(154979.950225/8.0),
-    REAL_CONST(155006.405780/8.0),
-    REAL_CONST(155032.862464/8.0),
-    REAL_CONST(155059.320277/8.0),
-    REAL_CONST(155085.779219/8.0),
-    REAL_CONST(155112.239289/8.0),
-    REAL_CONST(155138.700488/8.0),
-    REAL_CONST(155165.162815/8.0),
-    REAL_CONST(155191.626270/8.0),
-    REAL_CONST(155218.090854/8.0),
-    REAL_CONST(155244.556566/8.0),
-    REAL_CONST(155271.023405/8.0),
-    REAL_CONST(155297.491373/8.0),
-    REAL_CONST(155323.960468/8.0),
-    REAL_CONST(155350.430691/8.0),
-    REAL_CONST(155376.902042/8.0),
-    REAL_CONST(155403.374520/8.0),
-    REAL_CONST(155429.848126/8.0),
-    REAL_CONST(155456.322859/8.0),
-    REAL_CONST(155482.798719/8.0),
-    REAL_CONST(155509.275706/8.0),
-    REAL_CONST(155535.753821/8.0),
-    REAL_CONST(155562.233062/8.0),
-    REAL_CONST(155588.713430/8.0),
-    REAL_CONST(155615.194925/8.0),
-    REAL_CONST(155641.677547/8.0),
-    REAL_CONST(155668.161295/8.0),
-    REAL_CONST(155694.646170/8.0),
-    REAL_CONST(155721.132171/8.0),
-    REAL_CONST(155747.619298/8.0),
-    REAL_CONST(155774.107551/8.0),
-    REAL_CONST(155800.596931/8.0),
-    REAL_CONST(155827.087436/8.0),
-    REAL_CONST(155853.579068/8.0),
-    REAL_CONST(155880.071825/8.0),
-    REAL_CONST(155906.565708/8.0),
-    REAL_CONST(155933.060716/8.0),
-    REAL_CONST(155959.556850/8.0),
-    REAL_CONST(155986.054110/8.0),
-    REAL_CONST(156012.552494/8.0),
-    REAL_CONST(156039.052004/8.0),
-    REAL_CONST(156065.552639/8.0),
-    REAL_CONST(156092.054399/8.0),
-    REAL_CONST(156118.557284/8.0),
-    REAL_CONST(156145.061294/8.0),
-    REAL_CONST(156171.566429/8.0),
-    REAL_CONST(156198.072688/8.0),
-    REAL_CONST(156224.580072/8.0),
-    REAL_CONST(156251.088580/8.0),
-    REAL_CONST(156277.598213/8.0),
-    REAL_CONST(156304.108970/8.0),
-    REAL_CONST(156330.620851/8.0),
-    REAL_CONST(156357.133856/8.0),
-    REAL_CONST(156383.647985/8.0),
-    REAL_CONST(156410.163238/8.0),
-    REAL_CONST(156436.679615/8.0),
-    REAL_CONST(156463.197115/8.0),
-    REAL_CONST(156489.715740/8.0),
-    REAL_CONST(156516.235487/8.0),
-    REAL_CONST(156542.756358/8.0),
-    REAL_CONST(156569.278352/8.0),
-    REAL_CONST(156595.801470/8.0),
-    REAL_CONST(156622.325711/8.0),
-    REAL_CONST(156648.851074/8.0),
-    REAL_CONST(156675.377561/8.0),
-    REAL_CONST(156701.905170/8.0),
-    REAL_CONST(156728.433903/8.0),
-    REAL_CONST(156754.963757/8.0),
-    REAL_CONST(156781.494735/8.0),
-    REAL_CONST(156808.026835/8.0),
-    REAL_CONST(156834.560057/8.0),
-    REAL_CONST(156861.094401/8.0),
-    REAL_CONST(156887.629868/8.0),
-    REAL_CONST(156914.166457/8.0),
-    REAL_CONST(156940.704168/8.0),
-    REAL_CONST(156967.243000/8.0),
-    REAL_CONST(156993.782955/8.0),
-    REAL_CONST(157020.324031/8.0),
-    REAL_CONST(157046.866228/8.0),
-    REAL_CONST(157073.409548/8.0),
-    REAL_CONST(157099.953988/8.0),
-    REAL_CONST(157126.499550/8.0),
-    REAL_CONST(157153.046233/8.0),
-    REAL_CONST(157179.594038/8.0),
-    REAL_CONST(157206.142963/8.0),
-    REAL_CONST(157232.693009/8.0),
-    REAL_CONST(157259.244176/8.0),
-    REAL_CONST(157285.796464/8.0),
-    REAL_CONST(157312.349873/8.0),
-    REAL_CONST(157338.904402/8.0),
-    REAL_CONST(157365.460051/8.0),
-    REAL_CONST(157392.016821/8.0),
-    REAL_CONST(157418.574712/8.0),
-    REAL_CONST(157445.133722/8.0),
-    REAL_CONST(157471.693853/8.0),
-    REAL_CONST(157498.255103/8.0),
-    REAL_CONST(157524.817473/8.0),
-    REAL_CONST(157551.380964/8.0),
-    REAL_CONST(157577.945574/8.0),
-    REAL_CONST(157604.511303/8.0),
-    REAL_CONST(157631.078152/8.0),
-    REAL_CONST(157657.646121/8.0),
-    REAL_CONST(157684.215208/8.0),
-    REAL_CONST(157710.785415/8.0),
-    REAL_CONST(157737.356742/8.0),
-    REAL_CONST(157763.929187/8.0),
-    REAL_CONST(157790.502751/8.0),
-    REAL_CONST(157817.077434/8.0),
-    REAL_CONST(157843.653236/8.0),
-    REAL_CONST(157870.230157/8.0),
-    REAL_CONST(157896.808196/8.0),
-    REAL_CONST(157923.387353/8.0),
-    REAL_CONST(157949.967629/8.0),
-    REAL_CONST(157976.549023/8.0),
-    REAL_CONST(158003.131536/8.0),
-    REAL_CONST(158029.715167/8.0),
-    REAL_CONST(158056.299915/8.0),
-    REAL_CONST(158082.885782/8.0),
-    REAL_CONST(158109.472766/8.0),
-    REAL_CONST(158136.060868/8.0),
-    REAL_CONST(158162.650088/8.0),
-    REAL_CONST(158189.240425/8.0),
-    REAL_CONST(158215.831880/8.0),
-    REAL_CONST(158242.424452/8.0),
-    REAL_CONST(158269.018141/8.0),
-    REAL_CONST(158295.612948/8.0),
-    REAL_CONST(158322.208871/8.0),
-    REAL_CONST(158348.805912/8.0),
-    REAL_CONST(158375.404070/8.0),
-    REAL_CONST(158402.003344/8.0),
-    REAL_CONST(158428.603735/8.0),
-    REAL_CONST(158455.205242/8.0),
-    REAL_CONST(158481.807866/8.0),
-    REAL_CONST(158508.411607/8.0),
-    REAL_CONST(158535.016464/8.0),
-    REAL_CONST(158561.622437/8.0),
-    REAL_CONST(158588.229526/8.0),
-    REAL_CONST(158614.837731/8.0),
-    REAL_CONST(158641.447053/8.0),
-    REAL_CONST(158668.057490/8.0),
-    REAL_CONST(158694.669042/8.0),
-    REAL_CONST(158721.281711/8.0),
-    REAL_CONST(158747.895495/8.0),
-    REAL_CONST(158774.510395/8.0),
-    REAL_CONST(158801.126410/8.0),
-    REAL_CONST(158827.743540/8.0),
-    REAL_CONST(158854.361785/8.0),
-    REAL_CONST(158880.981146/8.0),
-    REAL_CONST(158907.601621/8.0),
-    REAL_CONST(158934.223212/8.0),
-    REAL_CONST(158960.845917/8.0),
-    REAL_CONST(158987.469737/8.0),
-    REAL_CONST(159014.094672/8.0),
-    REAL_CONST(159040.720721/8.0),
-    REAL_CONST(159067.347885/8.0),
-    REAL_CONST(159093.976163/8.0),
-    REAL_CONST(159120.605556/8.0),
-    REAL_CONST(159147.236062/8.0),
-    REAL_CONST(159173.867683/8.0),
-    REAL_CONST(159200.500417/8.0),
-    REAL_CONST(159227.134266/8.0),
-    REAL_CONST(159253.769228/8.0),
-    REAL_CONST(159280.405304/8.0),
-    REAL_CONST(159307.042494/8.0),
-    REAL_CONST(159333.680797/8.0),
-    REAL_CONST(159360.320214/8.0),
-    REAL_CONST(159386.960744/8.0),
-    REAL_CONST(159413.602387/8.0),
-    REAL_CONST(159440.245143/8.0),
-    REAL_CONST(159466.889012/8.0),
-    REAL_CONST(159493.533995/8.0),
-    REAL_CONST(159520.180090/8.0),
-    REAL_CONST(159546.827298/8.0),
-    REAL_CONST(159573.475619/8.0),
-    REAL_CONST(159600.125052/8.0),
-    REAL_CONST(159626.775598/8.0),
-    REAL_CONST(159653.427256/8.0),
-    REAL_CONST(159680.080027/8.0),
-    REAL_CONST(159706.733909/8.0),
-    REAL_CONST(159733.388904/8.0),
-    REAL_CONST(159760.045011/8.0),
-    REAL_CONST(159786.702230/8.0),
-    REAL_CONST(159813.360561/8.0),
-    REAL_CONST(159840.020003/8.0),
-    REAL_CONST(159866.680557/8.0),
-    REAL_CONST(159893.342223/8.0),
-    REAL_CONST(159920.005000/8.0),
-    REAL_CONST(159946.668889/8.0),
-    REAL_CONST(159973.333889/8.0),
-    REAL_CONST(160000.000000/8.0),
-    REAL_CONST(160026.667222/8.0),
-    REAL_CONST(160053.335555/8.0),
-    REAL_CONST(160080.005000/8.0),
-    REAL_CONST(160106.675555/8.0),
-    REAL_CONST(160133.347220/8.0),
-    REAL_CONST(160160.019997/8.0),
-    REAL_CONST(160186.693884/8.0),
-    REAL_CONST(160213.368881/8.0),
-    REAL_CONST(160240.044989/8.0),
-    REAL_CONST(160266.722207/8.0),
-    REAL_CONST(160293.400535/8.0),
-    REAL_CONST(160320.079973/8.0),
-    REAL_CONST(160346.760522/8.0),
-    REAL_CONST(160373.442180/8.0),
-    REAL_CONST(160400.124948/8.0),
-    REAL_CONST(160426.808826/8.0),
-    REAL_CONST(160453.493813/8.0),
-    REAL_CONST(160480.179910/8.0),
-    REAL_CONST(160506.867116/8.0),
-    REAL_CONST(160533.555432/8.0),
-    REAL_CONST(160560.244857/8.0),
-    REAL_CONST(160586.935391/8.0),
-    REAL_CONST(160613.627035/8.0),
-    REAL_CONST(160640.319787/8.0),
-    REAL_CONST(160667.013648/8.0),
-    REAL_CONST(160693.708618/8.0),
-    REAL_CONST(160720.404697/8.0),
-    REAL_CONST(160747.101884/8.0),
-    REAL_CONST(160773.800180/8.0),
-    REAL_CONST(160800.499584/8.0),
-    REAL_CONST(160827.200097/8.0),
-    REAL_CONST(160853.901717/8.0),
-    REAL_CONST(160880.604446/8.0),
-    REAL_CONST(160907.308283/8.0),
-    REAL_CONST(160934.013228/8.0),
-    REAL_CONST(160960.719281/8.0),
-    REAL_CONST(160987.426442/8.0),
-    REAL_CONST(161014.134710/8.0),
-    REAL_CONST(161040.844086/8.0),
-    REAL_CONST(161067.554570/8.0),
-    REAL_CONST(161094.266161/8.0),
-    REAL_CONST(161120.978859/8.0),
-    REAL_CONST(161147.692665/8.0),
-    REAL_CONST(161174.407577/8.0),
-    REAL_CONST(161201.123597/8.0),
-    REAL_CONST(161227.840724/8.0),
-    REAL_CONST(161254.558957/8.0),
-    REAL_CONST(161281.278298/8.0),
-    REAL_CONST(161307.998745/8.0),
-    REAL_CONST(161334.720298/8.0),
-    REAL_CONST(161361.442958/8.0),
-    REAL_CONST(161388.166725/8.0),
-    REAL_CONST(161414.891598/8.0),
-    REAL_CONST(161441.617577/8.0),
-    REAL_CONST(161468.344662/8.0),
-    REAL_CONST(161495.072853/8.0),
-    REAL_CONST(161521.802151/8.0),
-    REAL_CONST(161548.532554/8.0),
-    REAL_CONST(161575.264062/8.0),
-    REAL_CONST(161601.996677/8.0),
-    REAL_CONST(161628.730397/8.0),
-    REAL_CONST(161655.465223/8.0),
-    REAL_CONST(161682.201154/8.0),
-    REAL_CONST(161708.938190/8.0),
-    REAL_CONST(161735.676332/8.0),
-    REAL_CONST(161762.415579/8.0),
-    REAL_CONST(161789.155930/8.0),
-    REAL_CONST(161815.897387/8.0),
-    REAL_CONST(161842.639949/8.0),
-    REAL_CONST(161869.383615/8.0),
-    REAL_CONST(161896.128386/8.0),
-    REAL_CONST(161922.874261/8.0),
-    REAL_CONST(161949.621242/8.0),
-    REAL_CONST(161976.369326/8.0),
-    REAL_CONST(162003.118515/8.0),
-    REAL_CONST(162029.868808/8.0),
-    REAL_CONST(162056.620205/8.0),
-    REAL_CONST(162083.372706/8.0),
-    REAL_CONST(162110.126311/8.0),
-    REAL_CONST(162136.881020/8.0),
-    REAL_CONST(162163.636833/8.0),
-    REAL_CONST(162190.393750/8.0),
-    REAL_CONST(162217.151770/8.0),
-    REAL_CONST(162243.910893/8.0),
-    REAL_CONST(162270.671120/8.0),
-    REAL_CONST(162297.432450/8.0),
-    REAL_CONST(162324.194884/8.0),
-    REAL_CONST(162350.958420/8.0),
-    REAL_CONST(162377.723060/8.0),
-    REAL_CONST(162404.488802/8.0),
-    REAL_CONST(162431.255648/8.0),
-    REAL_CONST(162458.023596/8.0),
-    REAL_CONST(162484.792647/8.0),
-    REAL_CONST(162511.562800/8.0),
-    REAL_CONST(162538.334056/8.0),
-    REAL_CONST(162565.106414/8.0),
-    REAL_CONST(162591.879875/8.0),
-    REAL_CONST(162618.654438/8.0),
-    REAL_CONST(162645.430103/8.0),
-    REAL_CONST(162672.206870/8.0),
-    REAL_CONST(162698.984739/8.0),
-    REAL_CONST(162725.763710/8.0),
-    REAL_CONST(162752.543782/8.0),
-    REAL_CONST(162779.324957/8.0),
-    REAL_CONST(162806.107232/8.0),
-    REAL_CONST(162832.890610/8.0),
-    REAL_CONST(162859.675089/8.0),
-    REAL_CONST(162886.460669/8.0),
-    REAL_CONST(162913.247350/8.0),
-    REAL_CONST(162940.035132/8.0),
-    REAL_CONST(162966.824016/8.0),
-    REAL_CONST(162993.614000/8.0),
-    REAL_CONST(163020.405085/8.0),
-    REAL_CONST(163047.197271/8.0),
-    REAL_CONST(163073.990558/8.0),
-    REAL_CONST(163100.784945/8.0),
-    REAL_CONST(163127.580433/8.0),
-    REAL_CONST(163154.377021/8.0),
-    REAL_CONST(163181.174710/8.0),
-    REAL_CONST(163207.973499/8.0),
-    REAL_CONST(163234.773388/8.0),
-    REAL_CONST(163261.574377/8.0),
-    REAL_CONST(163288.376465/8.0),
-    REAL_CONST(163315.179654/8.0),
-    REAL_CONST(163341.983943/8.0),
-    REAL_CONST(163368.789331/8.0),
-    REAL_CONST(163395.595819/8.0),
-    REAL_CONST(163422.403406/8.0),
-    REAL_CONST(163449.212093/8.0),
-    REAL_CONST(163476.021879/8.0),
-    REAL_CONST(163502.832764/8.0),
-    REAL_CONST(163529.644749/8.0),
-    REAL_CONST(163556.457832/8.0),
-    REAL_CONST(163583.272015/8.0),
-    REAL_CONST(163610.087296/8.0),
-    REAL_CONST(163636.903676/8.0),
-    REAL_CONST(163663.721155/8.0),
-    REAL_CONST(163690.539732/8.0),
-    REAL_CONST(163717.359408/8.0),
-    REAL_CONST(163744.180182/8.0),
-    REAL_CONST(163771.002055/8.0),
-    REAL_CONST(163797.825026/8.0),
-    REAL_CONST(163824.649095/8.0),
-    REAL_CONST(163851.474262/8.0),
-    REAL_CONST(163878.300527/8.0),
-    REAL_CONST(163905.127890/8.0),
-    REAL_CONST(163931.956351/8.0),
-    REAL_CONST(163958.785910/8.0),
-    REAL_CONST(163985.616566/8.0),
-    REAL_CONST(164012.448320/8.0),
-    REAL_CONST(164039.281171/8.0),
-    REAL_CONST(164066.115119/8.0),
-    REAL_CONST(164092.950165/8.0),
-    REAL_CONST(164119.786308/8.0),
-    REAL_CONST(164146.623548/8.0),
-    REAL_CONST(164173.461884/8.0),
-    REAL_CONST(164200.301318/8.0),
-    REAL_CONST(164227.141849/8.0),
-    REAL_CONST(164253.983476/8.0),
-    REAL_CONST(164280.826200/8.0),
-    REAL_CONST(164307.670021/8.0),
-    REAL_CONST(164334.514938/8.0),
-    REAL_CONST(164361.360951/8.0),
-    REAL_CONST(164388.208061/8.0),
-    REAL_CONST(164415.056266/8.0),
-    REAL_CONST(164441.905568/8.0),
-    REAL_CONST(164468.755966/8.0),
-    REAL_CONST(164495.607460/8.0),
-    REAL_CONST(164522.460049/8.0),
-    REAL_CONST(164549.313735/8.0),
-    REAL_CONST(164576.168516/8.0),
-    REAL_CONST(164603.024392/8.0),
-    REAL_CONST(164629.881364/8.0),
-    REAL_CONST(164656.739432/8.0),
-    REAL_CONST(164683.598594/8.0),
-    REAL_CONST(164710.458852/8.0),
-    REAL_CONST(164737.320205/8.0),
-    REAL_CONST(164764.182653/8.0),
-    REAL_CONST(164791.046196/8.0),
-    REAL_CONST(164817.910834/8.0),
-    REAL_CONST(164844.776566/8.0),
-    REAL_CONST(164871.643393/8.0),
-    REAL_CONST(164898.511315/8.0),
-    REAL_CONST(164925.380331/8.0),
-    REAL_CONST(164952.250442/8.0),
-    REAL_CONST(164979.121647/8.0),
-    REAL_CONST(165005.993946/8.0),
-    REAL_CONST(165032.867339/8.0),
-    REAL_CONST(165059.741827/8.0),
-    REAL_CONST(165086.617408/8.0),
-    REAL_CONST(165113.494083/8.0)
+    REAL_CONST(10334.714585/8.0)
+#endif
 };
 
 #endif
--- a/libfaad/libfaad2_dll.dsp
+++ b/libfaad/libfaad2_dll.dsp
@@ -90,145 +90,141 @@
 # Begin Group "Source Files"
 
 # PROP Default_Filter ""
-# Begin Group "codebook"
-
-# PROP Default_Filter ""
 # Begin Source File
 
-SOURCE=.\codebook\hcb_1.c
+SOURCE=.\bits.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_10.c
+SOURCE=.\cfft.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_11.c
+SOURCE=.\common.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_2.c
+SOURCE=.\decoder.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_3.c
+SOURCE=.\dither.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_4.c
+SOURCE=.\drc.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_5.c
+SOURCE=.\error.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_6.c
+SOURCE=.\filtbank.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_7.c
+SOURCE=.\hcr.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_8.c
+SOURCE=.\huffman.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_9.c
+SOURCE=.\ic_predict.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\codebook\hcb_sf.c
+SOURCE=.\is.c
 # End Source File
-# End Group
 # Begin Source File
 
-SOURCE=.\bits.c
+SOURCE=.\lt_predict.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\cfft.c
+SOURCE=.\mdct.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\common.c
+SOURCE=.\mp4.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\data.c
+SOURCE=.\ms.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\decoder.c
+SOURCE=.\output.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\dither.c
+SOURCE=.\pns.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\drc.c
+SOURCE=.\pulse.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\error.c
+SOURCE=.\rvlc.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\filtbank.c
+SOURCE=.\sbr_dct.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\hcr.c
+SOURCE=.\sbr_dec.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\ic_predict.c
+SOURCE=.\sbr_e_nf.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\is.c
+SOURCE=.\sbr_fbt.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\lt_predict.c
+SOURCE=.\sbr_hfadj.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\mdct.c
+SOURCE=.\sbr_hfgen.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\mp4.c
+SOURCE=.\sbr_huff.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\ms.c
+SOURCE=.\sbr_qmf.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\output.c
+SOURCE=.\sbr_syntax.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\pns.c
+SOURCE=.\sbr_tf_grid.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\pulse.c
+SOURCE=.\specrec.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\rvlc.c
+SOURCE=.\ssr.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\specrec.c
+SOURCE=.\ssr_fb.c
 # End Source File
 # Begin Source File
 
-SOURCE=.\ssr.c
+SOURCE=.\ssr_ipqf.c
 # End Source File
 # Begin Source File
 
--- a/libfaad/lt_predict.c
+++ b/libfaad/lt_predict.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: lt_predict.c,v 1.13 2003/10/09 20:04:24 menno Exp $
+** $Id: lt_predict.c,v 1.15 2003/11/02 20:24:04 menno Exp $
 **/
 
 
--- a/libfaad/lt_predict.h
+++ b/libfaad/lt_predict.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: lt_predict.h,v 1.7 2003/10/09 20:04:24 menno Exp $
+** $Id: lt_predict.h,v 1.9 2003/11/02 20:24:04 menno Exp $
 **/
 
 #ifdef LTP_DEC
--- a/libfaad/mdct.c
+++ b/libfaad/mdct.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: mdct.c,v 1.29 2003/10/09 20:04:24 menno Exp $
+** $Id: mdct.c,v 1.30 2003/10/19 18:11:20 menno Exp $
 **/
 
 /*
@@ -144,7 +144,6 @@
 
     mdct->N = N;
     mdct->sincos = (complex_t*)malloc(N/4*sizeof(complex_t));
-    mdct->Z1 = (complex_t*)malloc(N/4*sizeof(complex_t));
 
     N_idx = map_N_to_idx(N);
 
@@ -185,7 +184,6 @@
     {
         cfftu(mdct->cfft);
 
-        if (mdct->Z1) free(mdct->Z1);
         if (mdct->sincos) free(mdct->sincos);
 
         free(mdct);
@@ -197,7 +195,7 @@
     uint16_t k;
 
     complex_t x;
-    complex_t *Z1 = mdct->Z1;
+    complex_t Z1[512];
     complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
@@ -223,6 +221,22 @@
 
         RE(Z1[k]) = MUL_R_C(RE(x), RE(sincos[k])) - MUL_R_C(IM(x), IM(sincos[k]));
         IM(Z1[k]) = MUL_R_C(IM(x), RE(sincos[k])) + MUL_R_C(RE(x), IM(sincos[k]));
+#if (REAL_BITS == 16)
+        if (abs(RE(Z1[k])) > REAL_CONST(16383.5))
+        {
+            if (RE(Z1[k]) > 0) RE(Z1[k]) = REAL_CONST(32767.0);
+            else RE(Z1[k]) = REAL_CONST(-32767.0);
+        } else {
+            RE(Z1[k]) *= 2;
+        }
+        if (abs(IM(Z1[k])) > REAL_CONST(16383.5))
+        {
+            if (IM(Z1[k]) > 0) IM(Z1[k]) = REAL_CONST(32767.0);
+            else IM(Z1[k]) = REAL_CONST(-32767.0);
+        } else {
+            IM(Z1[k]) *= 2;
+        }
+#endif
     }
 
     /* reordering */
@@ -237,6 +251,19 @@
         X_out[N2 + N4 +     2*k] = -IM(Z1[         k]);
         X_out[N2 + N4 + 1 + 2*k] =  RE(Z1[N4 - 1 - k]);
     }
+
+#if 0
+    {
+        float max_fp = 0;
+        for (k = 0; k < N; k++)
+        {
+            if (fabs(X_out[k]/(float)(REAL_PRECISION)) > max_fp)
+                max_fp = fabs(X_out[k]/(float)(REAL_PRECISION));
+        }
+        if (max_fp > 32767>>1)
+            printf("m: %f\n", max_fp);
+    }
+#endif
 }
 
 #ifdef LTP_DEC
@@ -245,7 +272,7 @@
     uint16_t k;
 
     complex_t x;
-    complex_t *Z1 = mdct->Z1;
+    complex_t Z1[512];
     complex_t *sincos = mdct->sincos;
 
     uint16_t N  = mdct->N;
--- a/libfaad/output.c
+++ b/libfaad/output.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: output.c,v 1.22 2003/10/09 20:04:25 menno Exp $
+** $Id: output.c,v 1.23 2003/10/19 18:11:20 menno Exp $
 **/
 
 #include "common.h"
--- a/libfaad/specrec.c
+++ b/libfaad/specrec.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: specrec.c,v 1.28 2003/10/09 20:04:25 menno Exp $
+** $Id: specrec.c,v 1.30 2003/11/02 20:24:05 menno Exp $
 **/
 
 /*
@@ -475,6 +475,24 @@
 
 static INLINE real_t iquant(int16_t q, real_t *tab)
 {
+#ifdef SMALL_IQ_TAB
+    static const real_t errcorr[] = {
+        REAL_CONST(0), REAL_CONST(1.0/27.1), REAL_CONST(2.0/27.1), REAL_CONST(3.0/27.096),
+        REAL_CONST(4.0/27.093),  REAL_CONST(5.0/27.089), REAL_CONST(6.0/27.085), REAL_CONST(7.0/27.081),
+        REAL_CONST(8.0/27.077),  REAL_CONST(9.0/27.073), REAL_CONST(10.0/27.069), REAL_CONST(11.0/27.065),
+        REAL_CONST(12.0/27.061),  REAL_CONST(13.0/27.056), REAL_CONST(14.0/27.052), REAL_CONST(15.0/27.048),
+        REAL_CONST(16.0/27.044),  REAL_CONST(17.0/27.04), REAL_CONST(18.0/27.036), REAL_CONST(19.0/27.032),
+        REAL_CONST(20.0/27.028),  REAL_CONST(21.0/27.024), REAL_CONST(22.0/27.02), REAL_CONST(23.0/27.015),
+        REAL_CONST(24.0/27.011),  REAL_CONST(25.0/27.007), REAL_CONST(26.0/27.003), REAL_CONST(0)
+    };
+#else
+    static const real_t errcorr[] = {
+        REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0),
+        REAL_CONST(4.0/8.0),  REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0),
+        REAL_CONST(0)
+    };
+#endif
+    real_t x1, x2;
 #ifdef FIXED_POINT
     int16_t sgn = 1;
 
@@ -486,9 +504,18 @@
 
     if (q < IQ_TABLE_SIZE)
         return sgn * tab[q];
-    
-    return 0; /* sgn * tab[q>>3] * 16; */
+
+    /* linear interpolation */
+#ifndef SMALL_IQ_TAB
+    x1 = tab[q>>3];
+    x2 = tab[(q>>3) + 1];
+    return sgn * 16 * (MUL(errcorr[q&7],(x2-x1)) + x1);
 #else
+    x1 = tab[q/27];
+    x2 = tab[(q/27) + 1];
+    return sgn * 81 * (MUL(errcorr[q%27],(x2-x1)) + x1);
+#endif
+#else
     real_t sgn = REAL_CONST(1.0);
 
     if (q < 0)
@@ -500,8 +527,17 @@
     if (q < IQ_TABLE_SIZE)
         return sgn * tab[q];
 
-    return sgn * pow(q, 4./3.);
+    /* linear interpolation */
+#ifndef SMALL_IQ_TAB
+    x1 = tab[q>>3];
+    x2 = tab[(q>>3) + 1];
+    return sgn * 16.0 * (errcorr[q&7] * (x2-x1) + x1);
+#else
+    x1 = tab[q/27];
+    x2 = tab[(q/27) + 1];
+    return sgn * 81.0 * (errcorr[q%27] * (x2-x1) + x1);
 #endif
+#endif
 }
 
 static void inverse_quantization(real_t *x_invquant, int16_t *x_quant, uint16_t frame_len)
@@ -552,10 +588,6 @@
     uint8_t groups = 0;
     uint16_t nshort = frame_len/8;
 
-    static real_t max_fp = 0;
-    static real_t max_exp = 0;
-    static real_t max_frac = 0;
-
     for (g = 0; g < ics->num_window_groups; g++)
     {
         uint16_t k = 0;
@@ -584,6 +616,9 @@
                 else
                     exp -= 7 /*10*/;
             }
+#if (REAL_BITS == 16)
+            exp--;
+#endif
 #endif
 
             /* minimum size of a sf band is 4 and always a multiple of 4 */
--- a/libfaad/specrec.h
+++ b/libfaad/specrec.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: specrec.h,v 1.16 2003/10/09 20:04:25 menno Exp $
+** $Id: specrec.h,v 1.20 2003/11/12 20:47:59 menno Exp $
 **/
 
 #ifndef __SPECREC_H__
--- a/libfaad/ssr.c
+++ b/libfaad/ssr.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: ssr.c,v 1.6 2003/10/09 20:04:25 menno Exp $
+** $Id: ssr.c,v 1.9 2003/11/04 21:43:30 menno Exp $
 **/
 
 #include "common.h"
--- a/libfaad/structs.h
+++ b/libfaad/structs.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: structs.h,v 1.17 2003/10/09 20:04:25 menno Exp $
+** $Id: structs.h,v 1.19 2003/11/02 20:24:05 menno Exp $
 **/
 
 #ifndef __STRUCTS_H__
@@ -55,7 +55,6 @@
     uint16_t N;
     cfft_info *cfft;
     complex_t *sincos;
-    complex_t *Z1;
 } mdct_info;
 
 typedef struct
--- a/libfaad/syntax.c
+++ b/libfaad/syntax.c
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: syntax.c,v 1.57 2003/10/09 20:04:25 menno Exp $
+** $Id: syntax.c,v 1.58 2003/10/19 18:11:20 menno Exp $
 **/
 
 /*
--- a/libfaad/syntax.h
+++ b/libfaad/syntax.h
@@ -22,7 +22,7 @@
 ** Commercial non-GPL licensing of this software is possible.
 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 **
-** $Id: syntax.h,v 1.38 2003/10/09 20:04:25 menno Exp $
+** $Id: syntax.h,v 1.41 2003/11/04 21:43:30 menno Exp $
 **/
 
 #ifndef __SYNTAX_H__